庫存管理系統(ERP)-體系结構文檔
1. 引言
1.1 编制目的
本报告详细完成对企业资源计划系统的概要设计,达到指导详细设计和开发的目的,同时实现和测试人员及用户的沟通。本报告面向开发人员、测试人员及最终用户而编写,是了解系统的导航。
1.2 词汇表
表1 词汇表
词汇名称 | 词汇含义 | 备注 |
---|---|---|
ERP | 企业资源计划系统 | 无 |
1.3 参考资料
用例文档
需求规格说明
2. 产品概述
一民营企业专业从事灯具开关行业,随着公司规模扩大,企业业务量、办公场所、员工数都发生增长,为适应新的环境,提高工作效率和用户满意度, 该公司需要该ERP系统辅助公司管理。该系统主要包括库存管理、销售管理、财务管理、人事管理和企业经营管理。
3. 逻辑视角
企业资源计划系统中,选择了分层体系结构风格,将系统分为3层(展示层、业务逻辑层、数据层)能够很好地示意整个高层抽象。展示层包含GUI页面的实现,业务逻辑层包含业务逻辑处理的实现,数据层负责数据的持久化和访问。分层体系结构的逻辑视角和逻辑设计方案如图1和图2所示。
图1 分层体系结构的逻辑视角
图2 分层体系结构的逻辑设计方案
4. 组合视角
4.1 开发包图
企业资源计划系统客户端开发包图如图3所示,服务器端开发包图如图4所示。
图3 企业资源计划系统客户端开发包图
图4 企业资源计划系统服务器端开发包图
4.2 运行时进程
在企业资源计划系统中,会有多个客户端进程和一个服务器进程,其进程图如图5所示。结合部署图,客户端进程是在客户端机器上运行,服务器端进程在服务器端机器上运行。
4.3 物理部署
企业资源计划系统中客户端构件是放在客户端机器上,服务器端构件是放在服务器端机器上,
图5 部署图
5. 接口视角
5.1 模块的职责
客户端模块和服务器端模块视图分别如图6和图7所示。客户端各层和服务器端各层的职责分别如表4和表5所示。
图6 客户端模块视图
图7 服务端模块视图
表4 客户端各层的职责
层 | 职责 |
---|---|
启动模块 | 负责初始化网络通信机制,启动用户界面 |
用户界面层 | 基于窗口的连锁商店客户端用户界面 |
客户端网络模块 | 通过HTTP连接后端服务 |
表5 服务器端各层的职责
层 | 职责 |
---|---|
启动模块 | 负责初始化网络通信机制,启动用户界面 |
业务逻辑层 | 对于用户界面的输入进行响应并进行业务处理逻辑 |
数据层 | 负责数据的持久化及数据访问接口 |
服务器端网络模块 | 通过HTTP连接前端页面 |
每一层只是使用下方直接接触的层。层与层之间仅仅是通过接口的调用来完成的。层之间调用的接口如表6所示。
表6 层之间调用的接口
接口 | 服务调用方 | 服务提供方 |
---|---|---|
network.commodity,network.auth, |
network.product,
network.purchase,
network.sale,
network.warehouse | 前端views | 后端Controller |
| service.CatogoryService
service.CustomerService
service.ProductService
service.PurchaseyService
service.SaleService
service.SaleReturnService
service.UserService
service.WarehouseService | 后端controller | 后端serviceImpl |
| dao.CategoryDao
dao.CustomerDao
dao.DiscountDao
dao.HumanResourceDao
dao.ProductDao
dao.PurchaseSheetDao
dao.PurchaseReturnsSheetDao
dao.SaleSheetDao
dao.SaleReturnsSheetDao
dao.UserDao
dao.WarehouseDao
dao.WarehouseInputSheetDao
dao.WarehouseOutputSheetDao | 后端serviceImpl | mybatis |
5.2各层面的分解
5.2 用户界面层的分解
根据要求,系统存在18个用户界面:登录界面、总经理主界面、库存管理员主界面、入库界面、出库界面、库存分析界面、销售员主界面、进货界面、销售界面、退货界面、财务人员主界面、单据管理界面、销售明细界面、人力资源界面、赠品管理界面、数据同步界面、调整产品界面、调整用户界面。界面跳转如图8所示。
图8 用户界面跳转
服务器端和客户端的用户界面设计接口是一致的,只是具体的页面不一样。用户界面类如表7所示。
5.2.1界面模块职责与需接口
表7 用户界面类
类名 | 职责 | 需接口 |
---|---|---|
auth.login | 用于获取用户的賬号、密碼、登录状态和对应角色 | network.auth |
auth.register | 用于注册新的用户 | network.auth |
humanResource.staffManagement | 用于总经理和人力资源管理帳号在調整用戶界面时向数据庫插入新创建的用戶的接口 | network.humanResource |
humanResource.checkIn | 用于员工的打卡 | network.humanResource |
humanResource.staffCheck | 用于人力资源人员查询所有员工的打卡情况 | network.humanResource |
humanResource.SalaryStrategy | 用于人力资源人员制定并获取工资单 | network.humanResource |
commodity.CommodityClassification | 用于实现商品分类管理 | network.commodity |
commodity.CommodityManagement | 用于管理商品并获取、控制数据库中的商品信息 | network.commodity |
discount.MakeDiscount | 用于总经理制定销售策略 | network.discount |
approval.Approval | 用于总经理审批单据 | network.approval |
5.2.2 用户界面模块设计原理
使用vue框架实现
5.3 业务逻辑层的分解
业务逻辑层包括多个针对界面的业务逻辑处理对象。例如,User对象负责处理登录界面的业务逻辑;Sales对象负责处理销售界面的业务逻辑。
5.3.1业务层模块的职责
业务逻辑层模块的职责如表11所示。
表11 业务逻辑层模块的职责
模块 | 职责 |
---|---|
BankServiceImpl | 负责银行账户相关服务 |
CategoryServiceImpl | 负责商品分类 |
CustomerServiceImpl | 负责客户服务 |
DiscountServiceImpl | 负责折扣策略相关服务 |
HumanresourceServiceImpl | 负责人力资源相关服务 |
PaymentServiceImpl | 负责付款服务 |
ProductServiceImpl | 负责商品管理服务 |
PurchaseReturnsServiceImpl | 负责进货退货服务 |
PurchaseServiceImpl | 负责进货服务 |
SalaryServiceImpl | 负责工资管理相关服务 |
SaleReturnsServiceImpl | 负责销售退货服务 |
SaleServiceImpl | 负责销售服务 |
SearchSheetServiceImpl | 负责查看表单服务 |
UserServiceImpl | 用户管理服务 |
WarehouseServiceImpl | 库存管理服务 |
5.3.2 业务逻辑层模块的接口规范与需接口
DiscountImpl、HumanresourceImpl和SearchSheetImpl模块的接口规范分别如下表所示。
表12 DiscountImpl模块的接口规范
提供的服务(供接口)
DiscountServiceImpl.setDiscount | 语法 | public void setDiscount(DiscountVO discountVO) |
---|---|---|
前置条件 | ||
后置条件 | 存储销售策略并能够在销售时使用 | |
DiscountServiceImpl.deleteDiscount | 语法 | public void deleteDiscount(Integer id) |
前置条件 | ||
后置条件 | 删除促销策略 | |
DiscountServiceImpl.findAll | 语法 | public List |
前置条件 | ||
后置条件 | 查找并显示所有促销策略 | |
DiscountServiceImpl.chooseDiscount | 语法 | public List |
前置条件 | 已经创建一个销售单 | |
后置条件 | 给出已有促销策略中折扣最大的促销策略 | |
DiscountStrategy1.makeDiscount | 语法 | public void makeDiscount(DiscountPO discountPO) |
前置条件 | ||
后置条件 | 能够在存储中获取以级别划分的促销策略 | |
DiscountStrategy2.makeDiscount | 语法 | public void makeDiscount(DiscountPO discountPO) |
前置条件 | 创建过组合包 | |
后置条件 | 能够在存储中获取以组合包划分的促销策略 | |
DiscountStrategy2.setBagContent | 语法 | void setBagContent(List |
前置条件 | ||
后置条件 | 能够在指定促销策略时获取组合包 |
需要的服务(需接口)
服务名 | 服务 |
---|---|
DiscountDao.getLatest() | 获取最近的促销策略 |
DiscountDao.createDiscount(DiscountPO discountPO) | 创建促销策略 |
DiscountDao.deleteDiscount(Integer id) | 删除指定促销策略 |
DiscountDao.getAll() | 获取所有促销策略信息 |
DiscountDao.getByLevel(Integer level) | 获取指定等级的折扣情况 |
DiscountDao.getLessL(Integer level) | 获取低于指定级别的折扣情况 |
DiscountDao.getLargerL(Integer level) | 获取高于指定级别的折扣情况 |
DiscountDao.updateByLevel(DiscountPO discountPO) | 按级别更新 |
DiscountDao.getBagId() | 获取所有组合包id |
DiscountDao.getBagInfo(Integer id) | 获取指定id下的组合包信息 |
DiscountDao.updateById(DiscountPO discountPO) | 按id更新 |
DiscountDao.addBagContent(Integer id, String pid) | 添加组合包内容 |
DiscountDao.getById(Integer id) | 获取指定id的促销策略情况 |
DiscountDao.getByAmount(BigDemical amount) | 获取某一价位的折扣情况 |
DiscountDao.getLessA(BigDemical amount) | 获取低于指定价位的折扣情况 |
DiscountDao.getLargerA(BigDemical amount) | 获取高于指定价位的折扣情况 |
DiscountDao.getMax(BigDemical amount) | 获取最大折扣 |
DiscountDao.updateByAmount(DiscountPO discountPO) | 按价位更新 |
表13 HumanresourceImpl模块的接口规范
提供的服务(供接口) | ||
---|---|---|
HumanresourceServiceImpl.createCheck | 语法 | public void createCheck(CheckVO checkVO) |
前置条件 | 员工进入系统 | |
后置条件 | 人力资源人员可以查看打卡信息 | |
HumanresourceServiceImpl.showDateChecks | 语法 | public List |
前置条件 | 存在员工 | |
后置条件 | 人力资源人员可以查看打卡天数 | |
HumanresourceServiceImpl.showDateUncheck | 语法 | public List |
前置条件 | 存在员工 | |
后置条件 | 人力资源人员可以查看未打卡天数 | |
HumanresourceServiceImpl.showDateRangeCheck | 语法 | public List |
前置条件 | 存在员工 | |
后置条件 | 人力资源人员可以查看指定时间段内的打卡情况 | |
HumanresourceServiceImpl.createWorker | 语法 | public void createWorker(WorkerVO workerVO) |
前置条件 | ||
后置条件 | 数据库中需要存储有新的员工信息 | |
HumanresourceServiceImpl.getAllWorkers | 语法 | public List |
前置条件 | 存在员工 | |
后置条件 | 人力资源人员可以查看所有员工信息 | |
HumanresourceServiceImpl.createPostInformance | 语法 | public void createPostInformance(PostInformanceVO postInformanceVO) |
前置条件 | 存在员工 | |
后置条件 | 创建后可以被查看到岗位信息 | |
HumanresourceServiceImpl.getAllPosts | 语法 | public List |
前置条件 | 已经创建过岗位信息 | |
后置条件 | 人力资源人员可以查看所有岗位信息 | |
HumanresourceServiceImpl.createSalaryList | 语法 | public void createSalaryList(SalaryListVO salaryListVO) |
前置条件 | 存在员工 | |
后置条件 | 创建后可以被查看到工资表 | |
HumanresourceServiceImpl.getSalaryList | 语法 | public SalaryListVO getSalaryList(String name,String role) |
前置条件 | 已经创建过工资表 | |
后置条件 | 人力资源人员可以查看工资表信息 | |
HumanresourceServiceImpl.getSalaryStrategy | 语法 | public List |
前置条件 | ||
后置条件 | 人力资源人员可以查看到薪资策略 | |
需要的服务(需接口) | ||
服务名 | 服务 | |
HumanresourceDao.createCheck(CheckVO checkVO) | 创建新的打卡 | |
HumanresourceDao.showDateChecks(String checktime) | 显示某一天的打卡信息 | |
HumanresourceDao.showDateUncheck(String checktime) | 显示某一天的未打卡信息 | |
HumanresourceDao.showDateRangeCheck(String beginDate, String endDate) | 显示某个时间段内的打卡信息 | |
HumanresourceDao.createWorker(WorkerVO workerVO) | 创建员工 | |
HumanresourceDao.getAllWorkers() | 获取所有员工信息 | |
HumanresourceDao.createPostInformance(PostInformanceVO postInformanceVO) | 创建岗位信息 | |
HumanresourceDao.getAllPosts() | 获取所有岗位信息 | |
HumanresourceDao.createSalaryList(SalaryListVO salaryListVO) | 创建薪资表 | |
HumanresourceDao.getSalaryList(String name, String role) | 获取薪资表 | |
HumanresourceDao.createSalaryStrategy(SalaryStrategyVO salaryStrategyVO) | 创建薪资计算方式 | |
HumanresourceDao.getSalaryStrategy(String role) | 获取某一职位的薪资计算方式 |
表14 SearchSheetImpl模块的接口规范
提供的服务(供接口) | ||
---|---|---|
SearchSheetServiceImpl.getAllSalesmen | 语法 | public List |
前置条件 | 存在销售员 | |
后置条件 | 可以查看所有销售员信息 | |
SearchSheetServiceImpl.getSalesDetails | 语法 | public List |
前置条件 | 存在销售单 | |
后置条件 | 可以查看销售单的详细信息 | |
SearchSheetServiceImpl.getSalesSheetReturn | 语法 | public List |
前置条件 | 存在销售退货单 | |
后置条件 | 可以查看销售退货单的详细信息 | |
SearchSheetServiceImpl.getPurchaseSheet | 语法 | public List |
前置条件 | 存在进货单 | |
后置条件 | 可以查看进货单的详细信息 | |
SearchSheetServiceImpl.getPurchaseSheetReturn | 语法 | public List |
前置条件 | 存在进货退货单 | |
后置条件 | 可以查看进货退货单的详细信息 | |
需要的服务(需接口) | 服务 | |
CollectionSheetDao.getLatest() | 获取最新表 | |
CollectionSheetDao.save(CollectionSheetPO tosave) | 保存表 | |
CollectionSheetDao.saveBatch(List |
保存一个批次的表 | |
CollectionSheetDao.findAll() | 查找所有表 | |
CollectionSheetDao.findAllByState(PaymentSheetState state) | 根据状态查找表 | |
CollectionSheetDao.findContentByCollectionSheetId(String collectionSheetId) | 根据id查找表的内容 | |
CollectionSheetDao.findOneById(String collectionSheetId) | 根据id查找到对应的表 | |
CollectionSheetDao.updateState(String collectionSheetId, PaymentSheetState state) | 更新表的状态 | |
SearchSheetDao.getAllSalesmen() | 获取所有销售员信息 | |
SearchSheetDao.getSalesDetails(Date beginTime, Date endTime, @Param(“productName”)List |
获取销售的详细信息 | |
SearchSheetDao.getPurchaseSheet(Date beginTime, Date endTime, @Param(“customer”) List |
获取进货表 | |
SearchSheetDao.getPurchaseSheetReturn(Date beginTime, Date endTime) | 获取进货退货表 |
5.4 数据层的分解
数据层主要给业务逻辑层提供数据访问服务,包括对于持久化数据的增、删、改、查。Sales业务逻辑需要的服务由SalesDataService接口提供。持久化数据的保存可能存在多种形式:Txt文件、序列化文件、数据库等
5.4.1 数据层模块的职责
数据层模块的职责如表15所示。
表15 销售模块数据层模块的职责
模块 | 职责 |
---|---|
BankDao | 管理账户数据 |
CategoryDao | 管理商品分类 |
CollectionSheetDao | 管理整体表单类数据 |
CustomerDao | 管理客户数据 |
DiscountDao | 管理折扣数据 |
HumanresourceDao | 管理人力资源数据 |
PaymentSheetDao | 管理付款单数据 |
ProductDao | 管理商品数据 |
PurchaseReturnsSheetDao | 管理进货退货数据 |
PurchaseSheetDao | 管理进货数据 |
SalarySheetDao | 管理工资单数据 |
SaleReturnsSheetDao | 管理销售退货数据 |
SaleSheetDao | 管理销售数据 |
UserDao | 管理用户数据 |
WarehouseDao | 管理库存数据 |
WarehouseInputSheetDao | 管理入库数据 |
WarehouseOutputSheetDao | 管理出库数据 |
5.4.2 数据层模块的接口规范
数据层模块的接口的增删查改职责较为类似,以销售单接口规范为例如表16所示。
表16 销售模块数据层模块的接口规范
提供的服务(供接口) | ||
---|---|---|
SaleSheetDao.getLatestSheet | 语法 | SaleSheetPO getLatestSheet() |
前置条件 | 无 | |
后置条件 | 获取最近一条销售单 | |
SaleSheetDao.saveSheet | 语法 | int saveSheet(SaleSheetPO toSave) |
前置条件 | 同样ID的po在Mapper中不存在 | |
后置条件 | 存入一条销售单记录 | |
SaleSheetDao.saveBatchSheetContent | 语法 | int saveBatchSheetContent(List |
前置条件 | 在数据库中不存在同样ID | |
后置条件 | 把销售单上的具体内容存入数据库 | |
SSaleSheetDao.findAllSheet | 语法 | List |
前置条件 | ||
后置条件 | 查找所有销售单 | |
SaleSheetDao.findAllByState | 语法 | List |
前置条件 | 无 | |
后置条件 | 根据狀態找銷售货單 | |
SaleSheetDao.findSheetById | 语法 | SaleSheetPO findSheetById(String id); |
前置条件 | 无 | |
后置条件 | 查找指定id的销售单 | |
SaleSheetDao.findContentBySheetId | 语法 | List |
前置条件 | 无 | |
后置条件 | 查找指定销售单下具体的商品内容 | |
SaleSheetDao.updateSheetState | 语法 | int updateSheetState(String sheetId, SaleSheetState state); |
前置条件 | 无 | |
后置条件 | 更新指定销售单的状态 | |
SaleSheetDao.updateSheetStateOnPrev | 语法 | int updateSheetStateOnPrev(String sheetId, SaleSheetState prev, SaleSheetState state); |
前置条件 | 无 | |
后置条件 | 根据当前状态更新销售单状态 | |
SaleSheetDao.getMaxAmountCustomerOfSalesmanByTime | 语法 | CustomerPurchaseAmountPO getMaxAmountCustomerOfSalesmanByTime(String salesman, Date beginTime,Date endTime); |
前置条件 | 无 | |
后置条件 | 获取某个销售人员某段时间内消费总金额最大的客户(不考虑退货情况,销售单不需要审批通过,如果这样的客户有多个,仅保留一个 |
表17 库存模块数据层模块的接口规范
6. 信息视角
6.1 数据持久化对象
BankPO:包含账户的编号、名称、账户号、金额
CategoryPO:包含商品分类的编号,分类名,父分类ID,是否为叶节点,商品数量,下一商品index
CheckPO:包含打卡信息,有员工姓名,员工职位,签到时间,
CollectionSheetContentPO:包含收款表的自增ID、收款单ID、银行账户、金额、备注
CollectionSheetPO:包含进货单单据编号,供应商ID,操作员,备注,总额合计、单据状态、创建时间
CustomerPO:包含客户编号、级别、分类、姓名、号码、地址、邮编、邮箱、应收应付、默认业务员
CustomerPurchaseAmountPO:包含客户付款数据的客户、总金额
DateRangeCheckPO:签到数据,包含员工姓名、员工职位、签到次数
DiscountPO:折扣数据,包含编号、策略类型、客户级别、总价、折扣、代金券总额、创建时间
PaymentSheetContentPO:付款单内容,包含自增ID,id,银行账户,金额,备注
PaymentSheetPO:付款单,单据编号、供应商id,操作员,备注,总额,单据状态,创建时间
PostInformancePO:工资信息,包含姓名、基本工资、岗位工资、职位、薪资计算方法、薪资发放方式、税收
ProductPO:商品数据,包含商品id,商品名,分类ID,商品型号,商品数量,进价,零售价,最近进价,最近零售价
PurchaseReturnsSheetContentPO:进货退货内容,包含自增id,单据id,商品id,数量,单价,总金额,备注
PurchaseReturnsSheetPO:进货退货单据,包含单据号,关联进货单、操作员、备注、总额、状态、创建时间
PurchaseSheetContentPO:进货单内容,包含包含自增id,单据id,商品id,数量,单价,总金额,备注
PurchaseSheetPO:进货单据,包含单据号、操作员、备注、总额、状态、创建时间
SalaryListPO:工资单,包含姓名、基本工资、岗位工资、职位、薪资计算方法、薪资发放方式、税收
SalarySheetContentPO:工资单内容,包含自增id,单据id,姓名,税前工资,个税,保险,公积金,实发工资、银行账户、备注
SalarySheetPO:工资单,包含单据号,操作员,备注,总额,单据状态,创建时间
SalaryStrategyPO:工资发放策略,包含职位,基本工资,岗位工资,回扣,回扣比率
SaleReturnsSheetContentPO:销售退货单内容,包含自增id,单据id,商品id,数量,单价,总额,备注
SaleReturnsSheetPO:销售退货单,包含单据编号,关联销售单,操作员,备注,折让,代金券总额,单据状态,创建时间
SaleSheetContentPO:销售单内容,包含自增id,单据id,商品id,数量,单价,总额,备注
SaleSheetPO:销售单,包含单据编号,操作员,备注,折让,代金券总额,单据状态,创建时间
Staff:员工,包含姓名,性别,生日,电话,职位,级别,工资卡
StaffWagelnfoPO:员工工资,包含id,姓名,工资,银行
UncheckPO:未签到人员,包含姓名,职位
User:用户,包含ID,姓名,密码,身份
WarehouselnputSheetContentPO:入库单内容,包含列表id,单据编号,商品id,商品数量,单价,出厂日期,备注
WarehouselnputSheetPO:入库单,包含单据编号,批次,操作员,操作时间,关联进货单据,单据状态
WarehouselODetailPO:出入库细节,包含操作类型,单据id,商品名,分类名,商品数量,单价,总价,创建时间
WarehouseOutputSheetContentPO:出库单内容,包含列表id,单据编号,商品id,商品数量,单价,出厂日期,备注
WarehouseOutputSheetPO:出库单,包含单据编号,批次,操作员,操作时间,关联进货单据,单据状态
WarehousePO:库存数据,包含id,商品编号,数量,进价,批次,出厂日期
6.2 Excel持久化格式
Excel数据保持格式以SaleSheetContent.xlsx例。每行分别对应商品名称、型号、数量、单价、总价、时间。如下所示:
小米手机 lalalala 400 2000 800000 2022-05-23T15:46:12.000+00:00
6.3 数据库表
数据库中包含的所有表