ERP系统功能简介

高质量源码直接出售

采购管理

采购计划自定义审批流程,采购人员责职分配、采购计划汇总、采购订单、资金审批表、采购提货单、采购价目表
分配采购任务

销售管理

销售订单、销售发货通知、返利单据
应收款单据、销售价目表、最佳库存、成品销售查询、生产订单出库查询

物料仓库

查询物料库存批次(区分赠品)、查询物料库存批次、查询物料库存汇总(区分赠品)、查询-采购计划列表、仓库物料台账、出入库汇总、呆滞物料分析、物料保质期预警、物料最低库存预警、物料最佳库存预警、物料最大库存预警、物料盘点查询、化工呆滞品

成品仓库

所有出入库条码支持、销售出库打印、销售发货通知、加工领料申请、产品库存、成品库存台账、成品入库、成品出库、产品调拨、外购成品入库、产品盘点、成品呆滞品查询、废料管理

生产计划

生产计划制作、机台计划、加工领料情况、生产计划分配、产出情况、生产任务分配情况、各工序计划

质检管理

生产结果的产品质量检验,合格证的打印、不同行业流程不同,按需定制

客户管理

客户信息、客户分类、地址、联系人、银行账户、国家、城市、地区、客户性质

供应商管理

供应商信息、供应商分类、地址、联系人、银行账户、国家、城市、地区、供应商性质

企业架构

支持集团型业务、总公司、多家分公司、业务数据分离、系统统一、区分部门、可以按部门、分公司配置公用权限

员工管理

按部门进行管理、职位管理、员工信息管理、与权限系统对接。

审批流程配置

支持灵活的审批流程运行时配置

计量单位转换

支持对计量单位方案化配置,任意单位互相转换

货币支持

支持任意货币、汇率转换

生产加工

管理工厂自行生产加工过程

外协加工

管理企业委外进行加工

受托加工

管理工厂受委托的产品加工


概述生产制造型企业通常会管理两种类型的仓库,一种是成品仓库,另一种是物料仓库。成品仓库是存储生产结果的产品,物料仓库通常是除了产品以外的原材料、机械备品备件、维修工具器材、办公用品等,本文系统仅讨论物料仓库部分。物料仓库通常存储的物料数量多,分类杂。在该客户在用的ERP系统中,使用过的物料数量庞大,按规格型号可达几万至几十万种,所以管好物料仓库是企业中很重要的工作。


本文系统是为客户重新开发定制的ERP,需求参照客户原有ERP,并考虑从原来单一公司到集团型组织架构的变化及业务上多年积累变化。包含了采购物料及后期的与物料仓库发生往来的业务环节。



系统开发工具及开发环境
本系统基于.Net Framework 开发,版本要求4.6.1以上。开发环境为VS2019+版本。开发语言为C# 7.0+版本。数据库为SqlServer 2012+,源代码管理使用SVN。
系统除了使用上述较为常见的开发环境外,最重要的是使用了第三方商业框架,DevExpress Application Framework,下文中简称为XAF,使用17.1.1及以上版本。



XAF框架简介
XAF是微软合作伙伴DevExpress在2006年发布第一个版本,至2021年已经有15年历史。XAF对ERP类以数据库为中心的业务系统提供了大量的支持,使开发人员可以关注业务逻辑而非技术问题,从而及大提开了开发效率。除了XAF产品外,DevExpress公司还得供各种平台的控件产品,从早期的Delphi控件到.Net Framework Windows Form控件、WPF、WebForm、Javascript等大量的控件产品。也有数据库访问层的ORM工具XPO,XAF就是集成了这些产品,并内置了诸多企业级应用中常用的模块。
框架选型依据
(1)内置大量模块:拿来即用,ERP类的项目非常庞大,不宜造轮子。
(2)开发人员仅需关注业务:企业级ERP业务原本就很复杂,开发人员需要把精力放在研究业务上。
(3)架构理念先进:技术架构已经由技术团队设计,并在全球范围内进行了验证。其中的面象对象技术的运用、AOP技术的应用都令人赞叹。
(4)快速高效高质量开发:框架根据开发人员的输入自动推导出以前需要开发人员手动操作的工作,程序自动运行的总比人为准确快速。
(5)一个框架涵盖大部分功能:从零开始搭建的系统,通常需要很多的第三方库才能最终完成项目,在后续的维护上,学习成本上,都会带来不必要的麻烦。
(6)熟练应用技术:作者使用该技术已有10年以上,熟练掌握该技术。

用户如果决定重新开发系统时,一定是时间紧迫的,笔者从未遇到过不着急的用户:D。
开发公司需要考虑开发时间成本、人员成本,也希望快速高质量的完成项目。综上所述XAF框架是一个合适的选择。
框架内置功能简介
(1)安全模块:基于角色的用户安全模块,实现了业务无关的权限管理。
(2)报表及数据分析模块:报表设计器、Dashboard设计器,实现了平台无关(Windows+web平台)、业务无关的报表设计器和Dashboard设计器。
(3)主系统模块:使用XPO、Entity Framework实现了业务模型构建,无需编码实现对数据的创建、删除、修改、查询功能。
(4)平台无关的通用的数据验证
(5)业务系统界默认界面生成,含列表视图、详细编辑视图、查询视图。
(6)外观控制 :界面UI与业务逻辑抽象支持,实现根据业务逻辑控制可见、可改、颜色控制等。
(7)多平台支持:一次开发与定义,自动生成两种平台程序。
(8)支持Windows桌面UI
(9)支持Web UI,ASP.NET Blazor UI,自适应界面可以在手机、平板、桌面上使用。
多国语言支持:XAF提供简单的方法对系统中使用的字符资源翻译处理。



系统运行环境
服务器端:
操作系统:Windows Server 2012+.
数据库:SqlServer 2012+。
Web服务器:IIS 7.0以上。
客户端:
操作系统:Windows桌面平台,Win7及以上版本均可运行。客户端需安装.Net Framework 4.6.1及以上版本。

整体业务流程
系统主要处理了采购、外协加工、内部零件加工、材料销售、调拨、盘点、正常消耗领用等与物料仓库有关出入库操作及库存的查看。下图中,箭头方向代表物料的流动方向。

1 采购管理
采购管理模块是本系统的一个重要模块,客户需要集团总公司统一为分公司进行采购需求审批、汇总、询价、下单、验货、收货操作。
客户共有9家分公司,对于采购需求的审批,不同的分公司、不同的部门、不同的物料,经过哪些审批节点都有可能不同,需要可以灵活配置。
系统需要管理除简单采购过程中涉及到的供应商、物料规格型、价格、数量外,还需要注意:
(1)考虑各部门所使用的计量单位不一致的情况,如,采购时供应商是按“吨”出售钢材,需求方领用时按“米”。
(2)采购订单的下单数量与到货数量可能并不一致,有时供应商会赠送赠品,财务、仓库管理都需要区分出来。
(3)车间要使用的某些零件并没有成品可以购买,需要外协加工处理,此过程也做为采购流程处理。
(4)需要考虑使用外币币种及结算的汇率问题。
(5)需要考虑发票的税率问题。
2 物料往来
(1)正常的生产过程和对设备维修养护等操作对原材料的领用、使用剩余需要退还。
(2)工厂内部的设备零件可能是自己加工出来,需要与消耗类的区别记录。
(3)物料可以出售给友商或退回。
3 仓库管理
(1)仓库管理人员需要定期核查实物与账目是否一致(盘点)。
(2)各仓库间可以向其他仓库调拨物料,以备使用(调拨)。
3 库存查询
可以查询实时库存,显示的内容包含物料编码、物料分类、规格型号、数量、单位、所在仓库、所属公司,并可以对任意一个属性进行过滤。
4 权限管理
所有部门:
(1)可以新建采购申请,提交申请,查看审批进度,查看采购员的负责人。
(2)可以新建领用申请、材料退库申请
采购部:
(3)可以对采购申请进行汇总,并生成采购订单
(4)可以对对已下单的采购订单进行生成收货通知单
仓储部:
(5)可以从收货通知单生成采购入库单,并进行确认入库操作。
对所有出库类单据做确认出库操作,对入库类单据做确认入库操作。

系统整体上分为客户端和服务端两部分,由于是windows桌面程序,所以业务主要在客户端。服务端的数据库主要存储业务数据,IIS仅用于clickonce部署客户端程序时使用。
客户端使用Windows桌面程序,客户端安装.Net Framework4.6.1及以上框架,使用XAF框架,提供了权限、报表、ORM、等一系列内置模块。逻辑上,系统由两部分组成,一是基础信息,此部分定义了物料、仓库、公司等现实世界的概念在系统中的表数据结构映射和描述。二是业务单据,系统把每个现实业务按不同粒度抽象成一种单据,一个完整的业务通常是由N张单据组合而成的。
更详细的对功能进行划分,通常称为模块,每个模块通常都是由业务模型、控制器、视图三部分组成。


系统采用面向对象程序设计方法,首先将系统分为三种对象类型:
3.2.1 基础数据信息类
此类类型通常较为简单,如:用户、角色、仓库、计量单位等。多数是简单的属性描述即可。
3.2.2 库存统计
此类类型稍微特殊,需要考虑物料数量的计算,传统的仓库管理软件中通常会定义一个实体表,并在每个业务单据中对库存数量字段不断的进行加减操作。本系统中采用实体对象直接映射到数据库中的视图,在SQL中做计算,并在结转业务中将以前的物料数据保存为实体记录,这样即可以保证实时计算又可以保证系统性能。
3.2.3 单据类
此类类型较多,细化的分析用户需求后,将每张单据与实际业务中进行对应。所有的单据都是主子关系,主体部分是公用的信息,明细部分描述物料详细信息。主体、明细没有特殊情况时均提供增删改查功能。
首先,此处定义出常用的类型:
单据:制单人员+业务部门、公司+简单审核功能+业务正常完成支持+业务作废+删除支持
仓库单据:单据+仓库
入库单据:仓库单据+申请入库+确认入库+取消入库+状态支持
所有入库类单据均提供“确认入库”和“取消入库”按钮功能。
出库单据:仓库单据+确认出库+取消出库+状态支持
所有出库类单据均提供“确认出库”和“取消出库”按钮功能。
3.2.4 采购模块
(1)采购计划:描述需求人,采购计划明细:描述需求物料,型号,数量等。
提交审批:需求已经确定,自动根据审批流程设置启用审批过程。
生成采购订单:采购部员工查看收到的采购计划,生成采购订单,主要是从采购计划上复制物料需求信息。
(2)采购订单:描述供应商及双方联系人,收货地址、税、货币和物料要求。
生成收货通知单:使用选中的物料信息生成收货通知单,比较数量是否合理,不合理时只提醒,不影响流程。
(3)收货通知单:描述等待收货物料、对应的采购订单、需求人等信息。
生成入库单:使用收货通知单中的物料生成入库单,以影响库存数量。
(4)采购入库单:描述采购到货且通过验收的物料有经历流程的信息。
确认入库:记入库存。
3.2.5 物料领用模块
材料出库单:描述需求部门领用物料的过程。
材料退库单:描述了物料使用剩余时,退回仓库的过程。
3.2.6 仓库管理模块
本模块是用于仓库部门内部管理,分为两部分:
调拨管理:
当需求部门要使用的物料在其他仓库中有,或是由于仓库空间不够用时,暂存到其他仓库时,可以使用此功能。
调拨出库:从本仓库将物料移动到其他仓库中去。
调拨入库:从其他仓库将物料移动到李仓库中来。
盘点管理:
提代一张盘点单据,用于记录盘点过程,和处理盘点结果与实物不一致时的处理方法。
盘盈入库:用于描述多于实物的物料情况。
盘亏出库:用于描述少于实物的物料情况。
3.2.7 加工模块
本模块用于实现工厂内部加工一些设备零部件对物料的消耗、生产成果的记录。
加工出库:用于描述加工零件时,需要使用的物料。
加工入库:用于描述加工零件的结果,产出的零件。
3.2.8 物料销售模块
本模块用于记录对物料的销售过程的出入库记录。
材料销售出库:用于记录材料销售情况,含购买方,价格等。
销售退货入库:用于记录材料销售退货情况。
3.2.9 其他出入库
本模块用于记录未考虑到的出入库情况,包含其他入库、其他出库两种单据。
3.3 业务模型与对象关系图
简单的来说,在传统的ORM中是使用类型(class)与数据库的表(table)进行映射。数据库中的列的类型与CLR中的基础类型也有对应关系。在c#中编写的类使用继承时,在XPO中如果基类和派生类都是持久化的(即在数据库中生成表),则去库里读取数据时,是使用inner join 将两张表连接在一起返回的。在c#程序中将不同的字段放置在不同类的属性中。我们知道在c#中,类型却只能有一个基类,即单根继承机制。多数情况下,一个业务是由多个粒度较小的业务组合而成的,我们更需要类似于“多继承”的组合机制。XAF中提供了DomainComponent技术,可以使用接口定义为一个业务实体模型。这样可以使用C#中的接口进行描术业务,接口是允许多继承组合的,所以在语法上,配合Attribute的使用,我们似乎有了一种专用的领域对象语言。




4.1 基础信息维护
4.1.1 物料名称定义

图4-1 物料名称维护界面列表+详细界面

物料名称是物料信息的重要属性,在该企业用户上一个ERP版本中,物料名称是一个文本框,在库中找不到指定的物料时,即去申请购买。
这个流程看起来没什么问题,但在实际生产过程中,往往会发现仓库已经有的物料又被重复购买了,经过调研发现,是由于物料名称的称呼不同造成的。如,比较常用的“胶带”,有的人称它为“封箱带”或“透明胶”,总之,由于希望使用“胶带”的人很多,每个人对它的名称都有自己的想法,没有一个标准名称,导致都使用自己认为是标准的名称去查找、申请采购等一系列动作。最终导致了由于物料名称不同而重复购买,或报表中相同物料不能合并在一起统计。
与客户协商最终确定为物料名称不可以随意填写,只能选择,如果确实发现不存在,则由财务人员、仓库管理人员一起新建出名称并审核后再由物料需求方使用。



物料信息主要包含:物料编码、分类、是否禁用、代码、采购专员、检验方案、物料名称、规格型号、品牌、保质期、长、宽、高、比重、计量单位方案、默认计量单位、默认供应商、辅助计量单位、默认生产厂家、备注。
上图中,上半部分为列表(A+B),其中A区为物料分类树、B区为物料信息,A区选中对应的分类后,B区会根据选中的分类进行过滤,即仅显示“物料分类=选中的分类”的物料。C区为详细信息视图,D区为物料设置列表,点击新建,或查看现有物料设置时的界面。物料设置的作用是设置当前查看的物料在指定的仓库中,最高库存、最佳库存、最低库存量。在以后的业务中会用到。
4.1.3 物料分类
物料分类使用树形数据结构,以达到实现无限级别分类的目地。物料分类包含如下属性:编码、名称、默认计量单位(新建物料时使用此计量单位)、计量单位方案(一组计量单位的转换的计算方法)、辅助计量单位(用户希望以另一种单位来查看物料的计量方法,如一立方米燃气是多少公斤)、上级分类、采购专员(集团公司要采购的物料很多,不同的人采购专员负责采购不同的物料)、检验方案(物料采购到货时该进行哪些检验)。
除了详细视图中的属性外,还可以直接查看此分类下包含了哪些物料,公司仓库设置(对于一类物料进行统一设置,此分类在指定的分公司中由谁进行采购、默认放置到哪个仓库中去)

物料分类设置

物料库存设置

检验方案配置

仓库管理界面

角色与导航权限配置界面

系统权限基于角色进行配置,一个用户可以属于多个角色,一个角色可以包含多个用户。
上图为配置导航权限的界面,即菜单项目是否显示在左侧导航栏中。

系统中所有使用的业务对象都在类型权限中可进行配置,包含:导航、创建、删除、读取、写入权限,这个级别范围相对权限较大,如图所示:是指“物料”中的信息所有的数据的权限。

对象权限:是指一部分数据的权限,如图所示是指“物料”数据中的“名称”属性以0210开头的那些数据权限,同样能够指定导航、读取、写入、删除权限。

成员权限:以上图为例是指可以配置“物料”中指定的条件(或所有)的一部分属性的读取或写入权限。

员工信息即是可以登录系统的用户。其中有“有效”属性控制了是否登录。“登录时修改密码”被选中时,用户在下次登录时,输入正确的密码完成后,必须输入一个新密码,完成修改密码操作,同时,“登录时修改密码”被置为False。
如果用户忘记了自己的登录密码,可以与管理员联系,管理员选中一个用户后,可以点击重置密码按钮,管理输入一个简单密码如123456,并通知该用户。此时“登录时修改密码”又被置为True,用户输入123456后又被要求输入新密码,达到管理员也不知道用户的最终密码。

如图所示,上半部分为公司列表信息,即,系统使用方是一个集团公司,下属公司包含了若干个子公司,列表中列也了这些子公司。
双击打开一个公司信息后,显示了公司的详细信息,包含属性:编码、名称、简称、生产批次代码(仅用于产品生产时、本文暂不考虑)、国家(所属国家)、地区分类、省份、邮政编码、法人代表、注册资金、注册地址、创立日期、统一社会信用代码、公司类别、公司性质、公司网址、备注。
公司信息中还包含了三种关联信息,即联系人、地址、银行信息属性。
其中,联系人信息包含姓名、手机、职位、电子邮件、其他联系方式、备注属性。
地址信息包含:省份、城市、地址、备注属性。
银行信息名含:开户银行、银行账号、地址、备注属性

部门信息中包括了所有公司的部门,从上图中可以看到,上半部的列表信息中,有“公司”属性,标识了此部门属于哪个公司。此外,部门信息中还包含了:编码、部门名称、负责人、分管领导、备注、部门类型。
在详细界面中(下半部)包含了部门员工和子级部门、角色。
其中,角色是指给部门指定了多个角色后,此部门中的员工都具有这些角色的权限。