解析大型.NET ERP系统 业务逻辑设计与实现
根据近几年的制造业软件开发经验,以我开发人员的理解角度,简要说明功能(Feature)是如何设计与实现的,供参考。
因架构的不同,技术实现上会有所差异,我的经验仅限定于Windows Form程序。
总体功能
1 系统支持多用户。
创建一个单实例(Singleton)的会话管理器SessionManager,用.NET Remoting部署在服务器端时,用DataTable保存登入的用户会话(Session:Login Id,User Id,Name,Login Time)。客户端登入时,会先检查DataTable中是否有记录,有则表示已经登入。ERP 客户端退出时,要通知.NET Remting服务器端删除会话信息(DataTable)。
2 系统支持多公司。
设计一个帐套表,帐套表的数据库定义比较简单,参考下面的Company表定义。
CREATE TABLE [dbo].[Company] ( [CompanyCode] [nvarchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [CompanyName] [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL , [Suspended] [nvarchar] (1) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [DatabaseServer] [nvarchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [DatabaseName] [nvarchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [DatabaseLogin] [nvarchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, [DatabasePassword] [nvarchar] (20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, ) ON [PRIMARY] GO ALTER TABLE [dbo].[Company] ADD CONSTRAINT [PK_Company] PRIMARY KEY CLUSTERED ([CompanyCode]) ON [PRIMARY] GO
帐套表记录了数据库的连接信息,还可记录帐套的行业信息以方便系统特定功能只针对的帐套设定的行业。
3 系统支持多库存组织。
库存组织用于跟踪库存交易,维护库存余额,可以建立多个库存组织,每个库存组织有一个帐簿集,记录物料进出事务。
库存组织是建立在经营单位之下的,可以细分为不同的子仓库。
4 系统支持多货币。
系统的帐套参数中有一个本位币设定,业务单据中没有指定货币的,以本位币为记帐货币,业务单据中有记录货币字段的,金额值以单据中设定的货币字段的值为记帐依据。业务单据中一般会用Amount和AmountLocal来分别记录两种货币计算的金额值,汇率以当前业务单据的货币和本位币的汇率为换算依据。
多货币要考虑单据间流转时不同的货币转换。比如用HKD港币下采购订单,在付款时用USD美金支付。
5 系统支持线上审批。
以.NET WF为工作流引擎,需要自定义活动(审批,传送消息,发送报表),定义工作流类型(批核,日记帐修改,计划任务),定义工作流服务,设置数据库解决工作流数据库持久化。
6 系统支持批号和序号管理。
批号和序号是解决特定细分行业而增加的特色功能。比如药品,食品,要跟踪到每一批产品的有效期。序号管理用于电子类产品,用于售后服务。
销售模块
7 系统支持税金,定金,折扣,其它费用。
税金和折扣会改变单价和金额的计算公式,定金会影响应收款,相当于预先收取客户一定的合同保证金。其它费用,比如送货费用,包装费用会影响销售单的总金额。
销售订单总金额= 总物料金额 + 增加项(送货,包装费用,利润率) - 扣减项(折扣)
8 系统支持多次送货。
销售货物的发出要产生总帐凭证,凭证记帐如下:
借:应收帐 $5,000
贷:销售 $5,000
9 系统支持报价单转销售单。
当发出给客户的报价单Quotation,客户接受之后,可由报价单直接生成销售订单Sales Order,相关的货币付款条款,物料明细被带出销售订单中。
10 系统支持销售单产生采购单或工作单。
对贸易型公司,只做物料的买入和卖出操作,不实际生产,可直接由销售订单产生送货单,对库存不足的销售订单中的物料直接产生采购订单。对生产型企业,比如销售1000部电脑,由销售订单1000部电脑,直接产生制造1000部电脑的工作单(生产任务单Job Order/Work Order),然后再发出物料,做完工收货。
11 系统支持销售包装,支持多种包装规格。
主要解决包装数量的分配和标签打印。销售订单物料销售A销售100个数量单位,每箱装8个数量单位,计算之后一共要9箱。箱子的四边需要打印一些标签,值由用户自定义,并可以带一些销售订单和物料的值到标签中。
采购模块
12 系统支持供应商价格与批量维护。
维护一个供应商供应物料价目表,供应商每次的供货价格都有记录可追查,这样也方便下次录入采购单时,直接带出上次采购单相同批量情况下的价格。批量管理则适用于不同的采购批量,有折扣或优惠的价格。
13 系统支持税金,定金,折扣,其它费用。
与销售模块相同,税金,定金,折扣,其它费用会影响订单总金额。比如从国外购买物品需要支持保险费。
13 系统支持采购验货,支持MIL-105E验货标准。
IQC用于对供应商来料进行检测,跟踪供应商供货质量。AQL是国际通用的验货标准,系统支持抽查验货。
14 系统支持由物料需求计划自动生成采购单。
MRP产生的物料需求有两种处理方法:采购属性的原材料,生成采购订单,生产制造的半成品则发放为生产任务单。
仓库模块
15 系统支持物料预留(销售单,工作单)。
物料预留(Reserved)适用于这样的场景,对于销售或是生产比较重要的客户或交期很严格的订单,必须有足够的物料及时开展生产或发出货物,这样在仓库物料不充足的情况下,必须提前将这一部分由发货单或生产单需求的物料留住(On-Hold),不允许发出或其它用途,相当于扣减了可用库存量,但实际库存却没有变化。
16 系统支持标准成本和实际成本,实际成本支持先进先出(FIFO),平均成本。
FIFO(先进先出)适用于食品药品等与保质期有关的行业。
生产制造模块
17 系统支持大量工程更改。
物料清单的两大要素是物料列出和工序标准。大量工程更改支持批量的修改物料清单,比如给一组物料清单增加一个新物料,或是由于工序改善,可以节省一道工序,从物料清单中删减工序。
18 系统支持主生产计划(MPS)和物料需求计划(MRP)。
MRP和MPS计划的对象不同,计算方法一致,前者计算对象是成品,后者是原材料。
19 物料需求计划生成的计划订单在订单发布前仍可以修改。
由MRP计算跟踪物料提前期,计划收货和现有库存量,物料阶层码等信息计算出物料需求,由物料需求转化为计划订单,计划订单在发放为采购单或工作单前,仍旧可以修改参数以适应实际需要。
20 系统支持物料损耗,耗用,退回及发散料。
PMC控制物料的需求和使用,车间生产过程中会出现一些偏差。物料损耗,耗用,退回等情况适用于处理生产过程中的异常。比如由工作单产生的物料需求,发料到车间后因为操作不当或其它原因,需要重新发料,这时采取发散料(Spare Issue)的方式处理。
21 系统支持外发加工。
外发加工分为工序外发和原材料外发。外发加工涉及到成本相关的核算,与采购业务的性质相似,相当于购买生产服务。有的ERP系统直接用采购订单作为外发加工单的单据,再增加少量特性。
总帐模块
22 系统支持批次过帐由业务模块传递而来的凭证,与进销存,仓库和制造模块紧密集成。
企业的生产经营活动过程中的资金流,实现方法就是由各业务模块生成总帐凭证。比如工作单物料发出产生以下记帐:
借:在进行工作 $2,000
贷:仓库 $2,000
再比如销售退货,产生如下记帐凭证:
借:销售退货 $250
贷:应收帐 $250
23 系统支持周期凭证。
对于企业一些日常性的有规律的经营支出,比如房租,固定资产折旧,这些可以做成周期性凭证,每月做期末处理月结时由系统自动生产记帐凭证。
24 系统支持帐户调整。
总帐模块包含三套帐,记帐凭证(Voucher)为记帐的原始依据(相对于ERP系统,会计实际记帐的原始依据是收款凭证,付款凭证和转帐凭证),根据记帐凭证生成流水帐(Journal),总帐(General Ledger),货币分类帐(Currency Ledger)。因为后面三笔数据的依据是记帐凭证,所以帐户调整是产生新的帐户调整凭证,过帐后更新后面三个帐。