关于升鲜宝供应链管理系统业务表与流程全量分析【纯个人研究非商业用途】
笔言: 偶尔看到升鲜宝供应链管理系统一些UI界面,发现业务非常庞大,就好奇研究一下,以前我做过一些项目300个表都是常态; 如何进行业务表、流程或数据流分析还是比较少;后面会把ERP等都会进行分析; 内源开发是一个全栈六边形开发,要求把软件工程各个方面都得会: 需求分析、业务架构、技术架构、数据架构、产品开发、项目管理、可行性方案设计、软件详细设计说明书、测试工程等等,不然很辛苦;
关于升鲜宝供应链管理系统业务表与流程全量分析
摘要
本分析基于《升鲜宝供应链管理系统重构版发布》四篇系列文章,从业务和技术架构师视角,全面解析该系统的业务实体、数据模型与流程关系。升鲜宝系统是一个面向生鲜配送行业的全链路数字化解决方案,涵盖权限管理、商品管理、客户管理、门店管理、供应商管理、采购管理、库存管理、分拣配送、财务管理、数据分析等十大核心业务域。本文将深度挖掘系统隐含的120+个业务实体表,构建完整的实体关系模型(ERM),并绘制详细的业务流程图和数据流图,最终形成全面技术业务分析报告。
第一部分:业务表主体提取与分类
1.1 权限与系统管理域
1.1.1 组织机构管理表群
- 组织机构表 (sys_organization) - 存储企业部门结构信息
- 部门表 (sys_department) - 部门详细信息
- 岗位表 (sys_post) - 岗位定义与职责
- 用户表 (sys_user) - 系统用户账户信息
- 用户详情表 (sys_user_profile) - 用户扩展信息
- 用户部门关联表 (sys_user_dept) - 用户与部门多对多关系
- 用户岗位关联表 (sys_user_post) - 用户与岗位多对多关系
1.1.2 权限控制表群
- 角色表 (sys_role) - 角色定义
- 用户角色关联表 (sys_user_role) - 用户与角色关系
- 菜单表 (sys_menu) - 系统菜单结构
- 权限表 (sys_permission) - 细粒度权限点
- 角色权限关联表 (sys_role_permission) - 角色权限分配
- 数据权限表 (sys_data_scope) - 数据范围控制规则
- 操作日志表 (sys_operation_log) - 用户操作审计
- 登录日志表 (sys_login_log) - 用户登录记录
1.1.3 系统配置表群
- 参数配置表 (sys_config) - 系统运行参数
- 数据字典表 (sys_dict) - 通用数据字典
- 字典项表 (sys_dict_item) - 字典明细值
- 定时任务表 (sys_job) - 定时任务配置
- 任务日志表 (sys_job_log) - 任务执行记录
- 文件管理表 (sys_file) - 系统文件存储记录
- 全局配置表 (sys_global_config) - 全局业务配置
- 用户申请表 (sys_user_apply) - 用户注册申请记录
1.2 商品与溯源管理域
1.2.1 商品基础数据表群
- 商品品牌表 (product_brand) - 商品品牌定义
- 商品单位表 (product_unit) - 计量单位定义
- 商品分类表 (product_category) - 商品分类体系
- 商品标签表 (product_tag) - 商品标签定义
- 商品标签关联表 (product_tag_rel) - 商品与标签关系
- 商品表 (product) - 商品主信息
- 商品规格表 (product_spec) - 商品规格变体
- 商品SKU表 (product_sku) - 最小库存单元
- 商品价格表 (product_price) - 商品基准价格
- 商品图片表 (product_image) - 商品图片资源
- 商品描述表 (product_description) - 商品详细描述
- 商品扩展属性表 (product_attribute) - 自定义属性
- 商品属性值表 (product_attribute_value) - 属性具体值
1.2.2 云商品库表群
- 云商品库表 (cloud_product_library) - 云端共享商品库
- 商品提报表 (product_submission) - 商品提报申请
- 提报审核表 (submission_audit) - 提报审核记录
- 素材分组表 (material_group) - 营销素材分组
- 素材库表 (material_library) - 营销素材存储
- 商品授权表 (product_authorization) - 商品使用授权
- 分拣区域表 (sorting_area) - 分拣区域定义
1.2.3 商品溯源表群
- 批次管理表 (product_batch) - 商品批次信息
- 批次明细表 (batch_detail) - 批次详细数据
- 溯源规则表 (traceability_rule) - 溯源规则定义
- 溯源码表 (trace_code) - 溯源码生成记录
- 溯源码关联表 (trace_code_rel) - 码与商品关联
- 环节管理表 (trace_link) - 溯源环节定义
- 环节记录表 (link_record) - 环节流转记录
- 商品检测报告表 (product_inspection_report) - 质量检测报告
- 检测报告附件表 (report_attachment) - 报告附件文件
- 溯源查询日志表 (trace_query_log) - 溯源查询记录
1.3 客户与价格管理域
1.3.1 客户主数据表群
- 客户表 (customer) - 客户主信息
- 客户分类表 (customer_category) - 客户分类
- 客户星级表 (customer_star_level) - 客户评级
- 客户类型表 (customer_type) - 客户类型定义
- 客户来源表 (customer_source) - 客户来源渠道
- 客户联系人表 (customer_contact) - 客户联系人信息
- 客户地址表 (customer_address) - 客户配送地址
- 客户账期表 (customer_payment_term) - 客户结算账期
- 客户合同表 (customer_contract) - 客户合同文件
- 客户合同明细表 (contract_detail) - 合同条款明细
- 客户报价单表 (customer_quotation) - 客户报价记录
- 客户组合表 (customer_group) - 客户分组管理
- 客户组合明细表 (customer_group_member) - 组成员关系
- 客户通知类型表 (customer_notice_type) - 通知类型定义
- 客户通知表 (customer_notice) - 客户通知记录
- 客户Banner表 (customer_banner) - 客户端广告图
1.3.2 价格管理体系表群
- 价格组表 (price_group) - 价格分组定义
- 价格组客户关联表 (price_group_customer) - 客户适用价格组
- 价格组商品价格表 (price_group_product) - 分组商品定价
- 阶梯价格表 (tiered_price) - 阶梯定价规则
- 促销价格表 (promotion_price) - 促销临时定价
- 区域价格表 (regional_price) - 区域差异化定价
- 价格历史表 (price_history) - 价格变动记录
- 价格审批表 (price_approval) - 价格调整审批
1.4 门店管理域
1.4.1 门店基础表群
- 门店类型表 (store_type) - 门店类型定义
- 门店表 (store) - 门店主信息
- 门店联系人表 (store_contact) - 门店联系人
- 门店地址表 (store_address) - 门店地址信息
- 门店Banner表 (store_banner) - 门店展示广告
- 门店支付方式表 (store_payment_method) - 门店支持的支付方式
- 门店供应商配置表 (store_supplier_config) - 门店供货关系
- 门店主子账号表 (store_sub_account) - 门店子账户管理
- 门店通知类型表 (store_notice_type) - 门店通知分类
- 门店通知表 (store_notice) - 门店通知记录
- 门店营业时间表 (store_business_hours) - 门店营业时段
- 门店库存配置表 (store_inventory_config) - 门店库存参数
1.5 订单管理域
1.5.1 客户订单表群
- 订货模板表 (order_template) - 订单模板定义
- 模板商品表 (template_product) - 模板商品组成
- 客户订货单表 (customer_order) - 客户订单主表
- 订货单明细表 (order_detail) - 订单商品明细
- 订单状态流水表 (order_status_flow) - 订单状态变更记录
- 发货单表 (delivery_order) - 发货单主表
- 发货单明细表 (delivery_detail) - 发货商品明细
- 收货单表 (receipt_order) - 收货确认单
- 收货单明细表 (receipt_detail) - 收货明细
- 订货退货单表 (order_return) - 退货申请单
- 退货单明细表 (return_detail) - 退货商品明细
- 退货原因表 (return_reason) - 退货原因分类
- 退货审核表 (return_audit) - 退货审核记录
1.5.2 门店订单表群
- 门店订货模板表 (store_order_template) - 门店专用模板
- 门店订货单表 (store_order) - 门店订单主表
- 门店订单明细表 (store_order_detail) - 门店订单明细
- 门店发货单表 (store_delivery_order) - 门店发货单
- 门店收货单表 (store_receipt_order) - 门店收货单
- 门店退货单表 (store_return_order) - 门店退货单
1.5.3 订单处理表群
- 订货看板表 (order_kanban) - 订单可视化管理
- 收货单差异表 (receipt_discrepancy) - 收货差异记录
- 订单退扣单表 (order_deduction) - 订单扣款记录
- 订单评价表 (order_evaluation) - 客户评价记录
- 订单异常表 (order_exception) - 订单异常记录
- 异常处理表 (exception_handling) - 异常处理记录
1.6 库存与进销存管理域
1.6.1 仓库基础表群
- 仓库表 (warehouse) - 仓库主信息
- 库区表 (warehouse_zone) - 仓库分区定义
- 货架/库位表 (storage_location) - 具体存储位置
- 温区管理表 (temperature_zone) - 温度控制区域
- 温区监控表 (temperature_monitor) - 温区监控记录
- 仓库设备表 (warehouse_equipment) - 仓库设备管理
- 仓库人员表 (warehouse_staff) - 仓库工作人员
1.6.2 库存事务表群
- 库存表 (inventory) - 商品库存主记录
- 批次库存表 (batch_inventory) - 按批次库存记录
- 库存流水表 (inventory_flow) - 库存变动流水
- 库存预警表 (inventory_alert) - 库存预警记录
- 库存盘点计划表 (inventory_check_plan) - 盘点计划
- 盘点任务表 (check_task) - 盘点任务分配
- 盘点结果表 (check_result) - 盘点结果记录
- 盘点差异表 (check_discrepancy) - 盘点差异分析
- 库存调整表 (inventory_adjustment) - 库存调整记录
1.6.3 入库管理表群
- 入库单表 (inbound_order) - 入库单主表
- 入库单明细表 (inbound_detail) - 入库商品明细
- 入库验收表 (inbound_inspection) - 入库验收记录
- 入库上架表 (inbound_putaway) - 上架任务记录
- 采购入库单表 (purchase_inbound_order) - 采购关联入库单
- 生产入库单表 (production_inbound_order) - 生产完工入库
- 退货入库单表 (return_inbound_order) - 退货入库记录
- 调拨入库单表 (transfer_inbound_order) - 调拨入库记录
1.6.4 出库管理表群
- 出库单表 (outbound_order) - 出库单主表
- 出库单明细表 (outbound_detail) - 出库商品明细
- 出库拣货表 (outbound_picking) - 拣货任务记录
- 出库复核表 (outbound_review) - 出库复核记录
- 销售出库单表 (sale_outbound_order) - 销售关联出库
- 调拨出库单表 (transfer_outbound_order) - 调拨出库记录
- 报损出库单表 (loss_outbound_order) - 报损出库记录
- 领料出库单表 (material_outbound_order) - 生产领料出库
1.6.5 库存业务表群
- 组合拆解单表 (assembly_disassembly_order) - 商品组合拆解
- 组合明细表 (assembly_detail) - 组合配方明细
- 调拨单表 (transfer_order) - 库存调拨单
- 调拨明细表 (transfer_detail) - 调拨商品明细
- 报损单表 (loss_order) - 商品报损单
- 报损明细表 (loss_detail) - 报损商品明细
- 报溢单表 (overflow_order) - 商品报溢单
- 报溢明细表 (overflow_detail) - 报溢商品明细
- 成本调整单表 (cost_adjustment_order) - 成本调整单
- 库存查询记录表 (inventory_query_log) - 查询历史记录
- 结存单表 (balance_order) - 期末结存单
1.7 供应商与采购管理域
1.7.1 供应商管理表群
- 供应商表 (supplier) - 供应商主信息
- 供应商分类表 (supplier_category) - 供应商分类
- 供应商账期表 (supplier_payment_term) - 供应商结算条件
- 供应品管理表 (supply_product) - 供应商供货商品
- 供应商通知类型表 (supplier_notice_type) - 通知类型
- 供应商通知表 (supplier_notice) - 通知记录
- 供应商授权表 (supplier_authorization) - 供应商权限
- 供应商报价表 (supplier_quotation) - 供应商报价
- 供应商合同表 (supplier_contract) - 供应商合同
- 合同明细表 (supplier_contract_detail) - 合同条款
1.7.2 采购管理表群
- 采购申请单表 (purchase_requisition) - 采购申请
- 采购申请明细表 (requisition_detail) - 申请商品明细
- 采购单表 (purchase_order) - 采购订单
- 采购单明细表 (purchase_order_detail) - 采购商品明细
- 采购核算单表 (purchase_settlement) - 采购结算单
- 采购退货单表 (purchase_return) - 采购退货单
- 每日采购价表 (daily_purchase_price) - 每日采购价格
- 采购历史表 (purchase_history) - 采购历史记录
- 采购评价表 (purchase_evaluation) - 供应商评价
1.7.3 招投标管理表群
- 招标管理表 (bidding_management) - 招标项目
- 招标文件表 (bidding_document) - 招标文件
- 投标表 (bid_submission) - 供应商投标
- 投标文件表 (bid_document) - 投标文件
- 评标记录表 (bid_evaluation) - 评标记录
- 招标结果表 (bidding_result) - 招标结果
1.8 分拣配送管理域
1.8.1 分拣管理表群
- 分拣策略表 (sorting_strategy) - 分拣策略定义
- 分拣任务表 (sorting_task) - 分拣任务分配
- 分拣批次表 (sorting_batch) - 分拣批次管理
- 分拣明细表 (sorting_detail) - 分拣商品明细
- 分拣方式配置表 (sorting_method_config) - 分拣方式设置
- 预打包表 (pre_pack) - 预打包配置
- 预打包明细表 (pre_pack_detail) - 预打包商品组成
- 分拣效率表 (sorting_efficiency) - 分拣效率统计
1.8.2 配送管理表群
- 物流线路表 (logistics_route) - 配送线路定义
- 自提点表 (pickup_point) - 自提点信息
- 排线表 (route_scheduling) - 线路排班计划
- 配送任务表 (delivery_task) - 配送任务分配
- 配送车辆表 (delivery_vehicle) - 配送车辆信息
- 配送员表 (delivery_staff) - 配送人员信息
- 配送轨迹表 (delivery_track) - 配送实时轨迹
- 配送签收表 (delivery_sign) - 签收记录
- 配送异常表 (delivery_exception) - 配送异常记录
- 配送地图配置表 (delivery_map_config) - 地图相关配置
1.9 财务管理域
1.9.1 账户与收支表群
- 账户表 (account) - 资金账户信息
- 账户流水表 (account_flow) - 账户资金变动
- 费用类别表 (expense_category) - 费用分类
- 费用明细表 (expense_detail) - 费用详细记录
- 日常收入表 (daily_income) - 日常收入记录
- 日常支出表 (daily_expense) - 日常支出记录
- 支付方式表 (payment_method) - 支付方式定义
- 支付记录表 (payment_record) - 支付交易记录
1.9.2 期初与对账表群
- 客户期初表 (customer_initial_balance) - 客户期初余额
- 供应商期初表 (supplier_initial_balance) - 供应商期初余额
- 商品期初表 (product_initial_balance) - 商品期初库存
- 客户对账表 (customer_reconciliation) - 客户对账单
- 对账明细表 (reconciliation_detail) - 对账明细项
- 门店结账表 (store_settlement) - 门店结算单
- 供应商对账表 (supplier_reconciliation) - 供应商对账单
- 对账差异表 (reconciliation_discrepancy) - 对账差异记录
1.9.3 应收应付表群
- 客户账单表 (customer_bill) - 客户账单
- 账单明细表 (bill_detail) - 账单明细项
- 供应商账单表 (supplier_bill) - 供应商账单
- 应收款表 (receivable) - 应收款记录
- 应收明细表 (receivable_detail) - 应收款明细
- 应付款表 (payable) - 应付款记录
- 应付明细表 (payable_detail) - 应付款明细
- 收款单表 (collection_order) - 收款单
- 收款明细表 (collection_detail) - 收款明细
- 付款单表 (payment_order) - 付款单
- 付款明细表 (payment_detail) - 付款明细
- 发票表 (invoice) - 发票信息
- 发票明细表 (invoice_detail) - 发票明细项
1.10 车辆与周转物管理域
1.10.1 车辆管理表群
- 车辆表 (vehicle) - 车辆基本信息
- 车辆档案表 (vehicle_file) - 车辆档案文件
- 司机表 (driver) - 司机信息
- 司机档案表 (driver_file) - 司机档案文件
- 油卡管理表 (fuel_card) - 油卡管理
- 用车申请表 (vehicle_application) - 用车申请
- 出车记录表 (trip_record) - 出车行程记录
- 加油记录表 (refuel_record) - 加油记录
- 违章处理表 (violation_handling) - 违章处理
- 故障处理表 (fault_handling) - 故障处理
- 维修保养表 (maintenance) - 维修保养记录
- 保险记录表 (insurance_record) - 保险记录
- 年检记录表 (inspection_record) - 年检记录
- 车辆费用表 (vehicle_expense) - 车辆相关费用
1.10.2 周转物管理表群
- 周转物类型表 (container_type) - 周转物类型定义
- 周转物表 (container) - 周转物主信息
- 周转物库存表 (container_inventory) - 周转物库存
- 购入/报损管理表 (container_purchase_loss) - 购入报损记录
- 发出管理表 (container_issue) - 周转物发出记录
- 回收管理表 (container_recovery) - 周转物回收记录
- 客户周转物明细表 (customer_container_detail) - 客户持有明细
- 司机周转物明细表 (driver_container_detail) - 司机携带明细
- 周转物进销存报表 (container_inventory_report) - 周转物报表
1.11 生产加工管理域
1.11.1 生产基础表群
- 生产加工单表 (production_order) - 生产任务单
- 加工销售汇总表 (production_sales_summary) - 加工销售统计
- 领料单表 (material_requisition) - 生产领料单
- 领料明细表 (material_requisition_detail) - 领料明细
- 退料单表 (material_return) - 退料单
- 退料明细表 (material_return_detail) - 退料明细
- 完工入库单表 (finished_product_inbound) - 完工入库单
- 生产加工报表 (production_report) - 生产统计报表
- 出成率报表 (yield_rate_report) - 出成率统计
- 商品BOM表 (product_bom) - 物料清单
- BOM明细表 (bom_detail) - BOM组成明细
- 商品分拆模板表 (product_split_template) - 分拆模板
- 商品分拆记录表 (product_split_record) - 分拆执行记录
- 生产工人表 (production_worker) - 生产人员
- 生产工序表 (production_process) - 工序定义
- 生产车间表 (production_workshop) - 车间信息
1.12 数据报表与分析域
1.12.1 报表定义表群
- 商品销售汇总表 (product_sales_summary) - 商品销售统计
- 商品采购汇总表 (product_purchase_summary) - 商品采购统计
- 商品分类汇总表 (product_category_summary) - 分类销售统计
- 商品入库汇总表 (product_inbound_summary) - 入库统计
- 商品出库汇总表 (product_outbound_summary) - 出库统计
- 商品报损汇总表 (product_loss_summary) - 报损统计
- 商品ABC报表 (product_abc_report) - ABC分析报表
- 商品销售明细表 (product_sales_detail) - 销售明细记录
- 商品采购明细表 (product_purchase_detail) - 采购明细记录
- 商品销售异常明细表 (sales_exception_detail) - 销售异常分析
- 商品采购异常明细表 (purchase_exception_detail) - 采购异常分析
- 报表模板表 (report_template) - 报表模板定义
- 报表参数表 (report_parameter) - 报表参数配置
- 报表生成记录表 (report_generation_log) - 报表生成日志
- 报表订阅表 (report_subscription) - 报表订阅设置
1.13 工作台与BI分析域
1.13.1 工作台管理表群
- 工作台配置表 (dashboard_config) - 工作台个性化配置
- 工作台组件表 (dashboard_widget) - 工作台组件定义
- 用户工作台表 (user_dashboard) - 用户工作台布局
- 快捷操作表 (quick_action) - 快捷操作配置
- 待办事项表 (todo_item) - 待办事项管理
- 消息中心表 (message_center) - 消息中心记录
- 公告通知表 (announcement) - 系统公告
1.13.2 BI分析表群
- 分析模型表 (analysis_model) - 分析模型定义
- 分析维度表 (analysis_dimension) - 分析维度配置
- 分析指标表 (analysis_metric) - 分析指标定义
- 数据源配置表 (data_source_config) - 数据源连接配置
- 数据集表 (dataset) - 数据集定义
- 数据可视化表 (data_visualization) - 可视化配置
- 分析报告表 (analysis_report) - 分析报告记录
- 用户分析收藏表 (user_analysis_favorite) - 用户收藏分析
第二部分:表关系与数据模型分析
2.1 核心实体关系模型(ERM)
2.1.1 主体实体关系图
┌─────────────────────────────────────────────────────────┐
│ 核心业务实体关系图 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 客户 │──────│ 订单 │──────│ 商品 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ ┌────┴─────┐ ┌────┴─────┐ ┌────┴─────┐ │
│ │客户联系人│ │订单明细 │ │商品分类 │ │
│ │客户地址 │ │订单状态 │ │商品品牌 │ │
│ │客户合同 │ │发货单 │ │商品规格 │ │
│ │客户报价 │ │收货单 │ │商品SKU │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 供应商 │──────│ 采购单 │──────│ 库存 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ ┌────┴─────┐ ┌────┴─────┘ ┌────┴─────┐ │
│ │供应商商品│ │采购明细 │仓库 │ │
│ │供应商合同│ │采购入库 │库位 │ │
│ │供应商报价│ │采购退货 │库存流水 │ │
│ └──────────┘ └─────────────────└──────────┘ │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ 门店 │──────│门店订单 │──────│ 财务 │ │
│ └─────────┘ └─────────┘ └─────────┘ │
│ │ │ │ │
│ ┌────┴─────┐ ┌────┴─────┐ ┌────┴─────┐ │
│ │门店类型 │ │门店订单明细│ │应收应付 │ │
│ │门店支付 │ │门店发货单 │ │收款付款 │ │
│ │门店库存 │ │门店收货单 │ │对账单 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
2.1.2 权限系统关系模型
┌─────────────────────────────────────────────────────┐
│ 权限管理系统ER模型 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ 1:n ┌─────────┐ │
│ │ 用户 │◄───────────────│ 角色 │ │
│ └─────────┘ └─────────┘ │
│ │ │ │
│ n:m ─┤ n:m ─┤ │
│ │ │ │
│ ┌────▼─────┐ ┌─────▼────┐ │
│ │用户部门 │ │角色权限 │ │
│ │用户岗位 │ └─────┬────┘ │
│ └──────────┘ │ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │ 部门 │ │ 权限 │ │
│ │ 岗位 │ └──────────┘ │
│ └──────────┘ │
│ │ │
│ ┌────▼─────┐ │
│ │组织机构 │ │
│ └──────────┘ │
│ │
│ ┌─────────┐ 1:n ┌─────────┐ │
│ │ 菜单 │◄───────────────│菜单权限 │ │
│ └─────────┘ └─────────┘ │
│ │
│ ┌─────────┐ 1:n ┌─────────┐ │
│ │数据范围 │◄───────────────│数据权限 │ │
│ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────┘
2.1.3 商品管理系统关系模型
┌─────────────────────────────────────────────────────────┐
│ 商品管理系统ER模型 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ 1:n ┌─────────┐ 1:n ┌─────┐ │
│ │商品分类 │◄───────────│ 商品 │────────►│品牌 │ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ ┌────▼─┐ │
│ │子分类 │ │商品规格 │ │品牌商│ │
│ └──────────┘ └──────────┘ └──────┘ │
│ │
│ ┌─────────┐ n:m ┌─────────┐ 1:n ┌─────┐ │
│ │ 商品 ├───────────►│商品标签 │◄────────│标签类│ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │商品SKU │ │标签关联 │ │
│ └──────────┘ └──────────┘ │
│ │ │
│ ┌────▼─────┐ 1:n ┌─────────┐ │
│ │商品价格 │◄───────────│价格组 │ │
│ └──────────┘ └─────────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │价格历史 │ │价格客户 │ │
│ └──────────┘ └──────────┘ │
│ │
│ ┌─────────┐ 1:n ┌─────────┐ 1:1 ┌─────┐ │
│ │ 商品 │◄───────────│商品批次 │────────►│供应商│ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │溯源信息 │ │批次明细 │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │溯源码 │ │检测报告 │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
2.1.4 订单系统关系模型
┌─────────────────────────────────────────────────────────┐
│ 订单管理系统ER模型 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ 1:n ┌─────────┐ 1:n ┌─────┐ │
│ │ 客户 │◄───────────│客户订单 │────────►│门店 │ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ ┌────▼─┐ │
│ │客户类型 │ │订单明细 │ │门店类型│ │
│ └──────────┘ └──────────┘ └──────┘ │
│ │
│ ┌─────────┐ n:m ┌─────────┐ 1:n ┌─────┐ │
│ │客户订单 ├───────────►│商品SKU │◄────────│商品 │ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │发货单 │ │库存分配 │ │
│ └──────────┘ └──────────┘ │
│ │ │
│ ┌────▼─────┐ 1:n ┌─────────┐ │
│ │发货明细 │◄───────────│分拣任务 │ │
│ └──────────┘ └─────────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │收货单 │ │分拣明细 │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │收货明细 │ │分拣批次 │ │
│ └──────────┘ └──────────┘ │
│ │
│ ┌─────────┐ 1:n ┌─────────┐ 1:1 ┌─────┐ │
│ │客户订单 │◄───────────│退货单 │────────►│退货原因│ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │订单状态 │ │退货审核 │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │状态流水 │ │退货明细 │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
2.1.5 库存系统关系模型
┌─────────────────────────────────────────────────────────┐
│ 库存管理系统ER模型 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ 1:n ┌─────────┐ 1:n ┌─────┐ │
│ │ 仓库 │◄───────────│ 库位 │────────►│温区 │ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ ┌────▼─┐ │
│ │仓库区域 │ │库位类型 │ │温控设备│ │
│ └──────────┘ └──────────┘ └──────┘ │
│ │
│ ┌─────────┐ n:m ┌─────────┐ 1:n ┌─────┐ │
│ │ 库位 ├───────────►│商品批次 │◄────────│商品 │ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │库存记录 │ │批次库存 │ │
│ └──────────┘ └──────────┘ │
│ │ │
│ ┌────▼─────┐ 1:n ┌─────────┐ │
│ │库存流水 │◄───────────│库存事务 │ │
│ └──────────┘ └─────────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │流水类型 │ │事务明细 │ │
│ └──────────┘ └──────────┘ │
│ │
│ ┌─────────┐ 1:n ┌─────────┐ 1:n ┌─────┐ │
│ │库存事务 │◄───────────│入库单 │────────►│采购单│ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ ┌────▼─┐ │
│ │事务状态 │ │入库明细 │ │采购明细│ │
│ └──────────┘ └──────────┘ └──────┘ │
│ │
│ ┌─────────┐ 1:n ┌─────────┐ 1:n ┌─────┐ │
│ │库存事务 │◄───────────│出库单 │────────►│销售单│ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ ┌────▼─┐ │
│ │出库类型 │ │出库明细 │ │订单明细│ │
│ └──────────┘ └──────────┘ └──────┘ │
│ │
│ ┌─────────┐ 1:n ┌─────────┐ 1:n ┌─────┐ │
│ │库存调整 │◄───────────│盘点计划 │────────►│盘点任务│ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │调整明细 │ │盘点结果 │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │调整原因 │ │盘点差异 │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
2.1.6 财务系统关系模型
┌─────────────────────────────────────────────────────────┐
│ 财务管理系统ER模型 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────┐ 1:n ┌─────────┐ 1:n ┌─────┐ │
│ │ 客户 │◄───────────│客户账单 │────────►│订单 │ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ ┌────▼─┐ │
│ │客户期初 │ │账单明细 │ │订单明细│ │
│ └──────────┘ └──────────┘ └──────┘ │
│ │
│ ┌─────────┐ n:m ┌─────────┐ 1:n ┌─────┐ │
│ │客户账单 ├───────────►│收款单 │◄────────│账户 │ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │应收款 │ │收款明细 │ │
│ └──────────┘ └──────────┘ │
│ │ │
│ ┌────▼─────┐ 1:n ┌─────────┐ │
│ │应收明细 │◄───────────│对账单 │ │
│ └──────────┘ └─────────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │对账明细 │ │对账差异 │ │
│ └──────────┘ └──────────┘ │
│ │
│ ┌─────────┐ 1:n ┌─────────┐ 1:n ┌─────┐ │
│ │ 供应商 │◄───────────│供应商账单│────────►│采购单│ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ ┌────▼─┐ │
│ │供应商期初│ │账单明细 │ │采购明细│ │
│ └──────────┘ └──────────┘ └──────┘ │
│ │
│ ┌─────────┐ n:m ┌─────────┐ 1:n ┌─────┐ │
│ │供应商账单├───────────►│付款单 │◄────────│账户 │ │
│ └─────────┘ └─────────┘ └─────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │应付款 │ │付款明细 │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │应付明细 │ │发票 │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ │
│ │发票明细 │ │费用类别 │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────┘
2.2 核心业务关系分析
2.2.1 商品-订单-库存三角关系
商品、订单、库存构成供应链系统的铁三角关系,这是系统最核心的数据流:
- 商品主数据驱动:商品表(product)是所有业务的基础,包含商品编码、名称、分类、规格、单位等基础信息
- 订单业务拉动:客户订单(customer_order)和门店订单(store_order)是需求侧,拉动商品从库存出库
- 库存数据响应:库存表(inventory)记录实际商品数量,响应订单需求进行扣减
关键关联关系:
- 商品表(product)与订单明细表(order_detail)通过product_id关联
- 订单明细表(order_detail)与发货单明细表(delivery_detail)通过detail_id关联
- 发货单明细表(delivery_detail)与出库单明细表(outbound_detail)通过batch_id关联
- 出库单明细表(outbound_detail)与库存表(inventory)通过inventory_id关联
数据一致性保障:
- 订单创建时锁定库存(库存锁定字段)
- 订单确认时扣减可用库存
- 发货时扣减实际库存
- 退货时恢复库存
2.2.2 采购-库存-销售闭环关系
采购、库存、销售形成供应链的正向业务闭环:
- 采购驱动入库:采购单(purchase_order)生成采购入库单(purchase_inbound_order)
- 入库增加库存:采购入库单明细(purchase_inbound_detail)增加库存表(inventory)数量
- 销售驱动出库:销售订单(sale_order)生成销售出库单(sale_outbound_order)
- 出库减少库存:销售出库单明细(sale_outbound_detail)减少库存表(inventory)数量
关键业务规则:
- 采购入库批次与商品批次(batch)关联,实现先进先出(FIFO)
- 销售出库与订单明细(order_detail)关联,确保订单履约
- 库存预警(inventory_alert)触发采购申请(purchase_requisition)
2.2.3 客户-订单-财务三角关系
客户、订单、财务构成资金流闭环:
- 客户信用控制:客户表(customer)中的信用额度控制订单创建
- 订单生成应收:客户订单(customer_order)生成应收款(receivable)
- 对账生成账单:定期对账生成客户账单(customer_bill)
- 收款核销应收:收款单(collection_order)核销应收款(receivable)
关键关联关系:
- 客户表(customer)与订单表(customer_order)通过customer_id关联
- 订单表(customer_order)与应收款表(receivable)通过order_no关联
- 应收款表(receivable)与收款单表(collection_order)通过receivable_id关联
- 收款单表(collection_order)与账户流水表(account_flow)通过collection_no关联
2.2.4 供应商-采购-财务三角关系
供应商、采购、财务构成付款流闭环:
- 供应商资质管理:供应商表(supplier)记录供应商基本信息
- 采购生成应付:采购单(purchase_order)生成应付款(payable)
- 对账生成账单:定期对账生成供应商账单(supplier_bill)
- 付款核销应付:付款单(payment_order)核销应付款(payable)
关键关联关系:
- 供应商表(supplier)与采购单表(purchase_order)通过supplier_id关联
- 采购单表(purchase_order)与应付款表(payable)通过purchase_no关联
- 应付款表(payable)与付款单表(payment_order)通过payable_id关联
- 付款单表(payment_order)与账户流水表(account_flow)通过payment_no关联
2.2.5 门店-订货-配送网络关系
门店、订货、配送构成分销网络体系:
- 门店层级管理:门店表(store)与门店类型表(store_type)定义门店属性
- 门店订货管理:门店订单(store_order)与客户订单逻辑类似但独立
- 配送网络优化:物流线路表(logistics_route)与排线表(route_scheduling)优化配送
- 自提点补充:自提点表(pickup_point)补充配送网络
关键关联关系:
- 门店表(store)与门店订单表(store_order)通过store_id关联
- 门店订单表(store_order)与配送任务表(delivery_task)通过order_no关联
- 配送任务表(delivery_task)与物流线路表(logistics_route)通过route_id关联
- 物流线路表(logistics_route)与自提点表(pickup_point)通过route_id关联
第三部分:业务流程与数据流分析
3.1 端到端业务流程
3.1.1 客户订货全流程
┌─────────────────────────────────────────────────────────────┐
│ 客户订货端到端流程 │
├─────────────────────────────────────────────────────────────┤
│ 步骤 │ 业务活动 │ 数据表变化 │ 状态变更 │
├──────┼───────────────────┼────────────────────┼─────────────┤
│ 1 │ 客户登录/选择商品 │ 订单表创建草稿 │ 初始状态 │
│ 2 │ 提交订单 │ 订单明细表生成 │ 待确认 │
│ 3 │ 系统/人工确认 │ 库存锁定记录 │ 已确认 │
│ 4 │ 生成分拣任务 │ 分拣任务表创建 │ 待分拣 │
│ 5 │ 执行分拣 │ 分拣明细表记录 │ 分拣中 │
│ 6 │ 生成发货单 │ 发货单表创建 │ 待发货 │
│ 7 │ 发货出库 │ 出库单表生成 │ 已发货 │
│ 8 │ 配送运输 │ 配送轨迹表记录 │ 配送中 │
│ 9 │ 客户收货 │ 收货单表确认 │ 已收货 │
│ 10 │ 订单完成 │ 订单状态完成 │ 已完成 │
│ 11 │ 财务对账 │ 对账单生成 │ 已对账 │
│ 12 │ 收款核销 │ 收款单记录 │ 已结算 │
└─────────────────────────────────────────────────────────────┘
关键数据流:
- 订单创建阶段:customer_order插入记录 → order_detail插入商品明细
- 库存锁定阶段:inventory表锁定数量增加 → inventory_flow记录锁定流水
- 分拣发货阶段:sorting_task分配任务 → delivery_order生成发货单 → outbound_order生成出库单
- 配送收货阶段:delivery_task分配配送 → delivery_track记录轨迹 → receipt_order确认收货
- 财务结算阶段:reconciliation生成对账单 → collection_order记录收款 → account_flow记录资金流水
3.1.2 采购入库全流程
┌─────────────────────────────────────────────────────────────┐
│ 采购入库端到端流程 │
├─────────────────────────────────────────────────────────────┤
│ 步骤 │ 业务活动 │ 数据表变化 │ 状态变更 │
├──────┼───────────────────┼────────────────────┼─────────────┤
│ 1 │ 库存预警触发 │ 库存预警表记录 │ 预警状态 │
│ 2 │ 创建采购申请 │ 采购申请单创建 │ 申请中 │
│ 3 │ 申请审批通过 │ 审批记录表更新 │ 已批准 │
│ 4 │ 生成采购订单 │ 采购单表创建 │ 采购中 │
│ 5 │ 供应商确认 │ 采购单状态更新 │ 已确认 │
│ 6 │ 供应商发货 │ 发货通知记录 │ 已发货 │
│ 7 │ 到货验收 │ 验收记录表创建 │ 待验收 │
│ 8 │ 质量检验 │ 检验报告记录 │ 检验中 │
│ 9 │ 生成入库单 │ 入库单表创建 │ 待入库 │
│ 10 │ 上架入库 │ 库存表数量增加 │ 已入库 │
│ 11 │ 批次信息记录 │ 批次管理表记录 │ 批次已建 │
│ 12 │ 财务对账 │ 对账单生成 │ 待付款 │
│ 13 │ 付款结算 │ 付款单记录 │ 已结算 │
└─────────────────────────────────────────────────────────────┘
关键数据流:
- 采购申请阶段:inventory_alert触发 → purchase_requisition创建申请 → requisition_detail记录明细
- 采购订单阶段:purchase_order创建订单 → purchase_order_detail记录商品 → supplier确认订单
- 到货验收阶段:purchase_inbound_order创建 → inbound_inspection验收 → product_batch创建批次
- 入库上架阶段:inbound_putaway上架 → inventory增加数量 → inventory_flow记录流水
- 财务付款阶段:supplier_reconciliation对账 → payment_order付款 → account_flow资金流水
3.1.3 门店补货全流程
┌─────────────────────────────────────────────────────────────┐
│ 门店补货端到端流程 │
├─────────────────────────────────────────────────────────────┤
│ 步骤 │ 业务活动 │ 数据表变化 │ 状态变更 │
├──────┼───────────────────┼────────────────────┼─────────────┤
│ 1 │ 门店库存预警 │ 门店库存预警记录 │ 预警状态 │
│ 2 │ 创建补货申请 │ 补货申请单创建 │ 申请中 │
│ 3 │ 总部审批 │ 审批记录表更新 │ 已批准 │
│ 4 │ 生成调拨单 │ 调拨单表创建 │ 调拨中 │
│ 5 │ 中心仓出库 │ 出库单表生成 │ 已出库 │
│ 6 │ 物流配送 │ 配送任务表分配 │ 配送中 │
│ 7 │ 门店收货 │ 收货单表确认 │ 已收货 │
│ 8 │ 门店入库 │ 门店库存表增加 │ 已入库 │
│ 9 │ 库存同步 │ 库存同步记录 │ 已同步 │
│ 10 │ 财务核算 │ 内部往来核算 │ 已核算 │
└─────────────────────────────────────────────────────────────┘
关键数据流:
- 补货申请阶段:store_inventory_config预警 → store_requisition创建申请
- 调拨出库阶段:transfer_order创建调拨 → transfer_outbound_order出库 → inventory减少数量
- 配送收货阶段:delivery_task分配配送 → store_receipt_order收货 → store_inventory增加数量
- 财务核算阶段:internal_settlement内部结算 → account_flow记录内部往来
3.1.4 生产加工全流程
┌─────────────────────────────────────────────────────────────┐
│ 生产加工端到端流程 │
├─────────────────────────────────────────────────────────────┤
│ 步骤 │ 业务活动 │ 数据表变化 │ 状态变更 │
├──────┼───────────────────┼────────────────────┼─────────────┤
│ 1 │ 销售预测/订单需求 │ 生产需求表记录 │ 需求确认 │
│ 2 │ 制定生产计划 │ 生产计划表创建 │ 计划制定 │
│ 3 │ 生成生产订单 │ 生产订单表创建 │ 订单创建 │
│ 4 │ 物料需求计算 │ BOM展开计算需求 │ 需求计算 │
│ 5 │ 领料出库 │ 领料单表生成 │ 领料中 │
│ 6 │ 生产加工 │ 生产工序记录 │ 生产中 │
│ 7 │ 质量检验 │ 质量检验记录 │ 检验中 │
│ 8 │ 完工入库 │ 完工入库单创建 │ 待入库 │
│ 9 │ 成品入库 │ 成品库存表增加 │ 已入库 │
│ 10 │ 成本核算 │ 成本核算表计算 │ 已核算 │
│ 11 │ 生产报表 │ 生产报表生成 │ 报表完成 │
└─────────────────────────────────────────────────────────────┘
关键数据流:
- 生产计划阶段:production_plan创建计划 → product_bom展开需求
- 领料出库阶段:material_requisition领料单 → material_outbound_order出库 → inventory减少原料
- 生产加工阶段:production_process_record工序记录 → quality_inspection检验记录
- 完工入库阶段:finished_product_inbound完工入库 → inventory增加成品 → product_batch创建批次
- 成本核算阶段:production_cost_calculation成本核算 → cost_allocation成本分摊
3.2 核心业务流程详细分析
3.2.1 订单履约流程(Order Fulfillment Process)
订单履约是供应链系统的核心流程,涉及多个系统的协同:
流程触发条件:
- 客户下单(customer_order创建)
- 门店下单(store_order创建)
- 定时批量订单导入
流程详细步骤:
步骤1:订单接收与验证
数据流:customer → customer_order → order_detail
业务规则:
1. 验证客户状态(是否启用、信用额度)
2. 验证商品状态(是否上架、库存是否充足)
3. 验证价格有效性(价格组、促销活动)
4. 验证配送信息(地址是否在配送范围)
技术实现:
- 事务性操作,保证订单创建原子性
- 库存预占,防止超卖
- 价格快照,锁定下单时价格
步骤2:订单确认与审核
数据流:customer_order → order_audit → order_status_flow
业务规则:
1. 自动审核规则(金额、客户等级、商品类别)
2. 人工审核规则(大额订单、新客户、特殊商品)
3. 审核通过后正式占用库存
4. 审核拒绝释放预占库存
技术实现:
- 工作流引擎驱动审核流程
- 消息通知审核人员
- 审核记录可追溯
步骤3:订单分配与分拣
数据流:order_detail → sorting_task → sorting_detail
业务规则:
1. 分拣策略选择(按订单、按商品、按区域)
2. 分拣波次生成(基于配送时间、商品特性)
3. 分拣任务分配(基于人员技能、工作量)
4. 分拣路径优化(基于仓库布局)
技术实现:
- 分拣算法优化
- 移动终端支持
- 实时进度跟踪
步骤4:打包与发货
数据流:sorting_detail → delivery_order → delivery_detail
业务规则:
1. 包装策略(按商品特性选择包装材料)
2. 温层控制(冷藏、冷冻商品特殊处理)
3. 发货复核(数量、商品、批次核对)
4. 出库确认(库存正式扣减)
技术实现:
- 打包指导系统
- 称重扫描集成
- 出库自动扣减库存
步骤5:配送与跟踪
数据流:delivery_order → delivery_task → delivery_track
业务规则:
1. 路线优化(基于地址、时间窗口)
2. 车辆调度(基于车型、容量)
3. 实时跟踪(GPS定位、状态更新)
4. 异常处理(交通、客户原因)
技术实现:
- 地图API集成
- 移动APP配送端
- 实时消息推送
步骤6:签收与完成
数据流:delivery_task → receipt_order → order_status
业务规则:
1. 签收确认(客户签名/验证码)
2. 异常签收(部分收货、拒收)
3. 退货处理(当场退货流程)
4. 订单完成状态更新
技术实现:
- 电子签收系统
- 拍照上传证据
- 自动状态流转
步骤7:售后与退货
数据流:order_return → return_audit → return_process
业务规则:
1. 退货申请(客户提交退货原因)
2. 退货审核(基于退货政策)
3. 退货收货(验收退货商品)
4. 退款处理(原路退款或信用退款)
技术实现:
- 退货工作流引擎
- 退款接口集成
- 库存反向处理
3.2.2 采购到付款流程(Procure-to-Pay Process)
采购到付款是企业重要的支出流程,涉及供应商管理、采购执行和财务付款:
流程触发条件:
- 库存预警触发采购申请
- 生产计划触发原料采购
- 定期补货计划
- 新商品引进需求
流程详细步骤:
步骤1:需求识别与采购申请
数据流:inventory_alert → purchase_requisition → requisition_detail
业务规则:
1. 安全库存计算(基于历史销量、季节因素)
2. 采购量计算(经济批量、最小起订量)
3. 申请审批流程(基于金额、商品类型)
4. 供应商选择(基于价格、质量、交期)
技术实现:
- 库存预测算法
- 审批工作流引擎
- 供应商评分系统
步骤2:供应商选择与采购下单
数据流:purchase_requisition → purchase_order → purchase_order_detail
业务规则:
1. 供应商询价(多渠道比价)
2. 招投标管理(重大项目招标流程)
3. 合同管理(采购合同签订)
4. 采购订单生成(明确数量、价格、交期)
技术实现:
- 电子招投标系统
- 电子合同管理
- 订单自动生成
步骤3:到货验收与质量检查
数据流:purchase_order → purchase_inbound_order → inbound_inspection
业务规则:
1. 预约到货(提前安排收货资源)
2. 数量验收(清点到货数量)
3. 质量检验(抽样或全检)
4. 不合格处理(退货或让步接收)
技术实现:
- 移动收货终端
- 质量检验标准库
- 不合格品处理流程
步骤4:入库上架与库存更新
数据流:inbound_inspection → inbound_putaway → inventory
业务规则:
1. 上架策略(基于商品特性、周转率)
2. 批次管理(记录生产日期、保质期)
3. 库存更新(增加可用库存)
4. 溯源信息记录(供应商、批次、检测报告)
技术实现:
- 上架推荐算法
- 批次追溯系统
- 库存实时更新
步骤5:发票匹配与三单匹配
数据流:purchase_order → supplier_invoice → three_way_matching
业务规则:
1. 发票接收(供应商开具发票)
2. 三单匹配(订单、收货单、发票)
3. 差异处理(数量、价格差异)
4. 匹配通过准备付款
技术实现:
- 发票OCR识别
- 自动匹配算法
- 差异工作流处理
步骤6:付款申请与审批
数据流:three_way_matching → payment_application → payment_approval
业务规则:
1. 付款条件(基于账期、提前付款折扣)
2. 付款申请(会计人员提交付款申请)
3. 多级审批(基于金额的审批流程)
4. 付款计划(现金流预测)
技术实现:
- 电子付款申请
- 多级审批工作流
- 现金流预测模型
步骤7:付款执行与核销
数据流:payment_approval → payment_order → account_flow
业务规则:
1. 付款方式选择(电汇、支票、银企直连)
2. 付款执行(财务执行付款操作)
3. 银行对账(付款结果确认)
4. 应付核销(减少供应商应付余额)
技术实现:
- 多渠道支付集成
- 银行接口对接
- 自动对账系统
步骤8:供应商评估与关系管理
数据流:supplier_evaluation → supplier_score → supplier_relationship
业务规则:
1. 绩效评估(质量、交期、价格、服务)
2. 供应商分级(基于绩效评分)
3. 关系维护(定期沟通、联合改进)
4. 供应商开发(新供应商引入)
技术实现:
- 供应商评分模型
- 供应商门户系统
- 供应商协同平台
3.2.3 库存管理流程(Inventory Management Process)
库存管理是供应链成本控制的关键,涉及库存计划、执行和控制:
流程触发条件:
- 日常库存事务(入库、出库、移库)
- 定期库存盘点
- 库存异常报警
- 库存策略调整
流程详细步骤:
步骤1:库存计划与策略制定
数据流:inventory_policy → safety_stock_calculation → reorder_point
业务规则:
1. 库存分类(ABC分类、XYZ分类)
2. 安全库存计算(基于服务水平、需求波动)
3. 订货点计算(基于提前期、需求量)
4. 库存策略制定(不同分类不同策略)
技术实现:
- 库存优化算法
- 需求预测模型
- 策略配置管理
步骤2:日常库存事务处理
数据流:inventory_transaction → inventory_flow → inventory_balance
业务规则:
1. 入库处理(采购入库、生产入库、退货入库)
2. 出库处理(销售出库、领料出库、报损出库)
3. 移库处理(库位调整、仓库调拨)
4. 库存调整(盘点差异调整、成本调整)
技术实现:
- 事务处理引擎
- 实时库存更新
- 批次跟踪管理
步骤3:库存控制与预警
数据流:inventory_monitoring → inventory_alert → alert_notification
业务规则:
1. 库存水平监控(实时监控库存数量)
2. 效期管理(临近保质期预警)
3. 呆滞库存识别(长期未动库存)
4. 预警通知(邮件、短信、系统消息)
技术实现:
- 实时监控系统
- 预警规则引擎
- 多渠道通知
步骤4:库存盘点与差异处理
数据流:inventory_check_plan → check_task → check_result
业务规则:
1. 盘点计划(年度、月度、循环盘点)
2. 盘点执行(初盘、复盘、抽盘)
3. 差异分析(数量差异、质量差异)
4. 差异处理(调整、调查、改进)
技术实现:
- 移动盘点终端
- 盘点算法优化
- 差异分析工具
步骤5:库存分析与优化
数据流:inventory_analysis → inventory_report → optimization_suggestion
业务规则:
1. 库存周转分析(周转率、周转天数)
2. 库存成本分析(持有成本、缺货成本)
3. 服务水平分析(订单满足率、准时交货率)
4. 优化建议(策略调整、流程改进)
技术实现:
- 数据分析引擎
- 报表生成系统
- 优化算法模型
步骤6:库存绩效评估
数据流:inventory_kpi → performance_evaluation → improvement_plan
业务规则:
1. KPI设定(库存周转率、服务水平、准确率)
2. 绩效评估(定期评估KPI达成情况)
3. 根因分析(未达成原因分析)
4. 改进计划(制定和实施改进措施)
技术实现:
- KPI管理仪表板
- 根因分析工具
- 改进跟踪系统
3.3 跨系统业务流程
3.3.1 销售-生产-采购协同流程
这是典型的需求拉动型供应链协同流程:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 销售预测/订单 │───▶│ 主生产计划 │───▶│ 物料需求计划 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 客户订单管理 │ │ 生产订单下达 │ │ 采购订单下达 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 发货计划制定 │ │ 生产执行跟踪 │ │ 采购到货跟踪 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 订单交付执行 │ │ 完工入库处理 │ │ 原材料入库处理 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 客户收货确认 │ │ 成本核算分析 │ │ 供应商付款处理 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
关键协同点:
- 需求传递:销售订单/预测 → 生产计划 → 物料需求 → 采购计划
- 时间协同:客户交期 → 生产完成时间 → 原材料到货时间 → 采购下单时间
- 数量协同:客户订单数量 → 生产数量 → 物料需求数量 → 采购数量
- 质量协同:客户质量要求 → 成品质量标准 → 原材料质量标准 → 供应商质量要求
数据流整合:
- 销售数据流:customer_order → sales_forecast → demand_plan
- 生产数据流:production_plan → mrp_calculation → material_requirement
- 采购数据流:purchase_plan → supplier_order → material_supply
系统集成点:
- 需求管理集成:销售系统与计划系统数据同步
- 计划协同集成:生产计划系统与物料计划系统集成
- 执行跟踪集成:生产执行与采购执行状态共享
- 库存可视集成:原材料、在制品、成品库存全局可视
3.3.2 财务-业务一体化流程
财务与业务的一体化是ERP系统的核心价值:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 业务事件发生 │───▶│ 会计凭证生成 │───▶│ 账簿记录更新 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 销售订单创建 │ │ 应收账款确认 │ │ 总账科目更新 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 发货出库执行 │ │ 成本结转处理 │ │ 损益科目更新 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 客户收货确认 │ │ 收入确认处理 │ │ 收入科目更新 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 收款核销处理 │ │ 现金银行更新 │ │ 现金流量更新 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
关键业务-财务对应关系:
-
销售到收款循环:
- 业务事件:客户订单 → 发货出库 → 客户收货 → 收款
- 财务处理:应收确认 → 成本结转 → 收入确认 → 收款核销
- 会计科目:应收账款 → 库存商品 → 主营业务收入 → 银行存款
-
采购到付款循环:
- 业务事件:采购申请 → 采购订单 → 到货入库 → 付款
- 财务处理:应付确认 → 存货增加 → 应付核销 → 付款
- 会计科目:应付账款 → 原材料/库存商品 → 应付账款减少 → 银行存款减少
-
生产到库存循环:
- 业务事件:生产领料 → 生产加工 → 完工入库
- 财务处理:材料消耗 → 人工制造费用 → 产成品入库
- 会计科目:生产成本 → 应付职工薪酬等 → 库存商品
一体化实现机制:
- 事件驱动会计:业务事件自动触发会计凭证
- 科目自动判定:基于业务规则自动确定会计科目
- 金额自动计算:基于业务数据自动计算会计金额
- 凭证自动生成:自动生成标准会计凭证
- 账簿自动更新:自动更新总账、明细账
数据一致性保障:
- 事务一致性:业务操作与财务记账在同一事务中
- 数据时效性:实时或准实时生成财务数据
- 可追溯性:从财务报表追溯到原始业务单据
- 审计轨迹:完整的操作日志和变更历史
3.3.3 门店-总部协同流程
多门店运营需要总部与门店的高效协同:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 门店要货申请 │───▶│ 总部订单汇总 │───▶│ 供应商采购下单 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 门店库存监控 │ │ 集中到货验收 │ │ 供应商发货跟踪 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 自动补货建议 │ │ 中心仓分拣 │ │ 到货预约安排 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 门店配送计划 │ │ 装车发运执行 │ │ 质量检验处理 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 门店收货上架 │ │ 在途库存跟踪 │ │ 供应商对账付款 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
协同关键点:
-
需求协同:
- 门店独立需求预测
- 总部汇总需求分析
- 联合需求计划制定
- 需求变更协同响应
-
库存协同:
- 门店安全库存设定
- 总部安全库存集中
- 库存共享与调拨
- 联合库存优化
-
物流协同:
- 门店配送需求汇总
- 路线优化与车辆调度
- 在途库存可视化管理
- 逆向物流协同处理
-
财务协同:
- 统一结算与支付
- 内部往来核算
- 合并财务报表
- 统一税务处理
系统集成架构:
门店系统层:
├── 门店POS系统
├── 门店库存系统
├── 门店订货系统
└── 门店报表系统
总部系统层:
├── 中央采购系统
├── 中央库存系统
├── 中央配送系统
└── 中央财务系统
数据交换层:
├── 实时数据同步
├── 批量数据交换
├── 消息队列通信
└── 数据一致性服务
数据流设计:
- 基础数据流:商品主数据、价格数据、供应商数据统一管理,下发门店
- 交易数据流:门店销售、库存数据实时或定时上传总部
- 业务数据流:门店要货、退货申请上传,总部处理结果下发
- 财务数据流:门店收银数据上传,总部统一对账结算
3.4 异常处理流程
3.4.1 订单异常处理流程
订单履约过程中的常见异常及处理:
异常类型:
- 库存不足异常:订单商品库存不足
- 价格异常:下单价格与系统价格不一致
- 客户信用异常:客户超过信用额度
- 配送异常:地址无法配送、时间无法满足
- 支付异常:支付失败、支付欺诈
- 退货异常:退货商品不符合退货政策
处理流程:
┌──────────────┐
│ 异常发生检测 │
└──────────────┘
│
▼
┌──────────────┐
│ 异常分类判定 │───┐
└──────────────┘ │
│ │
▼ │
┌──────────────┐ │ ┌──────────────┐
│ 自动处理规则 │ │ │ 人工处理分派 │
└──────────────┘ │ └──────────────┘
│ │ │
▼ │ ▼
┌──────────────┐ │ ┌──────────────┐
│ 执行处理动作 │ │ │ 人工调查处理 │
└──────────────┘ │ └──────────────┘
│ │ │
└─────────┼─────────┘
│
▼
┌──────────────┐
│ 处理结果记录 │
└──────────────┘
│
▼
┌──────────────┐
│ 客户通知更新 │
└──────────────┘
具体异常处理策略:
-
库存不足处理:
- 检查替代商品
- 建议客户更换
- 拆分订单部分发货
- 提供到货通知服务
- 紧急采购补货
-
价格异常处理:
- 核实价格变更时间
- 检查促销活动有效性
- 与客户沟通价格调整
- 特殊审批价格例外
- 记录价格差异原因
-
信用异常处理:
- 检查信用额度计算
- 核实未结清账款
- 临时信用额度申请
- 部分发货控制风险
- 预付款要求
-
配送异常处理:
- 地址标准化验证
- 配送时间窗口调整
- 自提点建议
- 第三方物流补充
- 配送费用调整
3.4.2 库存异常处理流程
库存管理中的常见异常及处理:
异常类型:
- 盘点差异异常:实际库存与系统库存不一致
- 效期异常:商品临近或超过保质期
- 质量异常:库存商品出现质量问题
- 呆滞库存异常:库存周转率过低
- 库存成本异常:成本计算出现异常
处理流程:
┌──────────────┐
│ 异常监控发现 │
└──────────────┘
│
▼
┌──────────────┐
│ 异常影响评估 │
└──────────────┘
│
▼
┌──────────────┐
│ 处理方案制定 │───┐
└──────────────┘ │
│ │
▼ │
┌──────────────┐ │ ┌──────────────┐
│ 立即处理措施 │ │ │ 根本原因分析 │
└──────────────┘ │ └──────────────┘
│ │ │
▼ │ ▼
┌──────────────┐ │ ┌──────────────┐
│ 异常控制执行 │ │ │ 预防措施制定 │
└──────────────┘ │ └──────────────┘
│ │ │
└─────────┼─────────┘
│
▼
┌──────────────┐
│ 处理结果验证 │
└──────────────┘
│
▼
┌──────────────┐
│ 流程改进实施 │
└──────────────┘
具体异常处理策略:
-
盘点差异处理:
- 差异数量确认(复盘)
- 差异原因调查(流程、人为、系统)
- 差异调整审批
- 库存账面调整
- 责任人处理与改进
-
效期异常处理:
- 效期预警提前处理
- 促销活动加速销售
- 商品调拨到高周转门店
- 供应商退货协商
- 报损处理与成本核销
-
质量异常处理:
- 质量问题隔离
- 质量原因分析
- 供应商质量索赔
- 客户质量补偿
- 质量改进措施
-
呆滞库存处理:
- 呆滞原因分析(预测、采购、销售)
- 促销清仓处理
- 物料再利用评估
- 供应商退货协商
- 采购策略调整
第四部分:数据模型详细设计
4.1 核心表结构设计示例
4.1.1 商品表(product)详细设计
-- 商品主表
CREATE TABLE product (
product_id BIGINT PRIMARY KEY COMMENT '商品ID',
product_code VARCHAR(50) NOT NULL UNIQUE COMMENT '商品编码',
product_name VARCHAR(200) NOT NULL COMMENT '商品名称',
product_barcode VARCHAR(100) COMMENT '商品条码',
product_short_name VARCHAR(100) COMMENT '商品简称',
-- 分类信息
category_id BIGINT NOT NULL COMMENT '商品分类ID',
brand_id BIGINT COMMENT '品牌ID',
unit_id BIGINT NOT NULL COMMENT '单位ID',
-- 规格属性
spec_model VARCHAR(100) COMMENT '规格型号',
weight DECIMAL(10,3) COMMENT '重量(kg)',
volume DECIMAL(10,3) COMMENT '体积(m³)',
size_length DECIMAL(8,2) COMMENT '长(mm)',
size_width DECIMAL(8,2) COMMENT '宽(mm)',
size_height DECIMAL(8,2) COMMENT '高(mm)',
-- 生鲜特性
temperature_type TINYINT NOT NULL COMMENT '温层类型:1常温2冷藏3冷冻',
shelf_life INT NOT NULL COMMENT '保质期(小时)',
storage_condition VARCHAR(200) COMMENT '存储条件',
origin_place VARCHAR(200) COMMENT '产地',
-- 库存属性
min_stock INT COMMENT '最低库存',
max_stock INT COMMENT '最高库存',
safe_stock INT COMMENT '安全库存',
purchase_cycle INT COMMENT '采购周期(天)',
lead_time INT COMMENT '采购提前期(天)',
-- 价格信息
purchase_price DECIMAL(10,2) COMMENT '采购价',
cost_price DECIMAL(10,2) COMMENT '成本价',
sale_price DECIMAL(10,2) COMMENT '销售价',
market_price DECIMAL(10,2) COMMENT '市场价',
tax_rate DECIMAL(5,2) COMMENT '税率',
-- 状态控制
product_status TINYINT DEFAULT 1 COMMENT '商品状态:0下架1上架2待审核',
audit_status TINYINT DEFAULT 0 COMMENT '审核状态:0未审核1审核通过2审核拒绝',
is_virtual TINYINT DEFAULT 0 COMMENT '是否虚拟商品:0否1是',
is_combination TINYINT DEFAULT 0 COMMENT '是否组合商品:0否1是',
is_weight TINYINT DEFAULT 0 COMMENT '是否称重商品:0否1是',
-- 销售属性
sales_volume INT DEFAULT 0 COMMENT '销量',
click_count INT DEFAULT 0 COMMENT '点击量',
favorite_count INT DEFAULT 0 COMMENT '收藏量',
-- 时间信息
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
audit_time DATETIME COMMENT '审核时间',
shelf_time DATETIME COMMENT '上架时间',
off_shelf_time DATETIME COMMENT '下架时间',
-- 人员信息
create_by BIGINT COMMENT '创建人',
update_by BIGINT COMMENT '更新人',
audit_by BIGINT COMMENT '审核人',
-- 索引
INDEX idx_category (category_id),
INDEX idx_brand (brand_id),
INDEX idx_status (product_status),
INDEX idx_temperature (temperature_type),
INDEX idx_create_time (create_time),
FULLTEXT INDEX idx_product_name (product_name)
) COMMENT='商品主表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4.1.2 订单表(customer_order)详细设计
-- 客户订单主表
CREATE TABLE customer_order (
order_id BIGINT PRIMARY KEY COMMENT '订单ID',
order_no VARCHAR(50) NOT NULL UNIQUE COMMENT '订单号',
order_type TINYINT NOT NULL COMMENT '订单类型:1普通订单2团购订单3预售订单',
-- 客户信息
customer_id BIGINT NOT NULL COMMENT '客户ID',
customer_name VARCHAR(100) NOT NULL COMMENT '客户名称',
customer_phone VARCHAR(20) COMMENT '客户电话',
customer_level TINYINT COMMENT '客户等级',
-- 金额信息
total_amount DECIMAL(12,2) NOT NULL COMMENT '订单总额',
discount_amount DECIMAL(10,2) DEFAULT 0 COMMENT '折扣金额',
coupon_amount DECIMAL(10,2) DEFAULT 0 COMMENT '优惠券金额',
freight_amount DECIMAL(8,2) DEFAULT 0 COMMENT '运费金额',
tax_amount DECIMAL(10,2) DEFAULT 0 COMMENT '税额',
actual_amount DECIMAL(12,2) NOT NULL COMMENT '实付金额',
paid_amount DECIMAL(12,2) DEFAULT 0 COMMENT '已付金额',
-- 订单状态
order_status TINYINT NOT NULL COMMENT '订单状态:1待确认2待分拣3分拣中4待配送5配送中6已完成7已取消',
payment_status TINYINT DEFAULT 0 COMMENT '支付状态:0未支付1已支付2部分支付',
invoice_status TINYINT DEFAULT 0 COMMENT '开票状态:0未开票1已开票',
-- 支付信息
payment_method TINYINT COMMENT '支付方式:1现金2刷卡3转账4微信5支付宝',
payment_time DATETIME COMMENT '支付时间',
payment_transaction_no VARCHAR(100) COMMENT '支付交易号',
-- 配送信息
delivery_date DATE NOT NULL COMMENT '配送日期',
delivery_time_slot VARCHAR(50) COMMENT '配送时段',
delivery_type TINYINT COMMENT '配送方式:1送货上门2自提',
delivery_address VARCHAR(500) COMMENT '配送地址',
delivery_contact_name VARCHAR(50) COMMENT '收货人',
delivery_contact_phone VARCHAR(20) COMMENT '收货电话',
-- 自提信息
pickup_point_id BIGINT COMMENT '自提点ID',
pickup_code VARCHAR(20) COMMENT '提货码',
pickup_time DATETIME COMMENT '自提时间',
-- 仓库信息
warehouse_id BIGINT COMMENT '发货仓库ID',
warehouse_name VARCHAR(100) COMMENT '发货仓库名称',
-- 物流信息
logistics_company VARCHAR(100) COMMENT '物流公司',
logistics_no VARCHAR(100) COMMENT '物流单号',
logistics_fee DECIMAL(8,2) COMMENT '物流费用',
-- 时间信息
order_time DATETIME NOT NULL COMMENT '下单时间',
confirm_time DATETIME COMMENT '确认时间',
picking_time DATETIME COMMENT '分拣开始时间',
picking_finish_time DATETIME COMMENT '分拣完成时间',
shipping_time DATETIME COMMENT '发货时间',
delivery_time DATETIME COMMENT '配送时间',
receive_time DATETIME COMMENT '收货时间',
complete_time DATETIME COMMENT '完成时间',
cancel_time DATETIME COMMENT '取消时间',
-- 备注信息
customer_remark VARCHAR(500) COMMENT '客户备注',
internal_remark VARCHAR(500) COMMENT '内部备注',
cancel_reason VARCHAR(200) COMMENT '取消原因',
-- 人员信息
create_by BIGINT COMMENT '创建人',
confirm_by BIGINT COMMENT '确认人',
picking_by BIGINT COMMENT '分拣人',
shipping_by BIGINT COMMENT '发货人',
receive_by BIGINT COMMENT '收货人',
-- 索引
INDEX idx_customer (customer_id),
INDEX idx_order_no (order_no),
INDEX idx_status (order_status),
INDEX idx_delivery_date (delivery_date),
INDEX idx_create_time (order_time),
INDEX idx_payment_status (payment_status),
INDEX idx_warehouse (warehouse_id)
) COMMENT='客户订单主表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4.1.3 库存表(inventory)详细设计
-- 库存主表
CREATE TABLE inventory (
inventory_id BIGINT PRIMARY KEY COMMENT '库存ID',
-- 位置信息
warehouse_id BIGINT NOT NULL COMMENT '仓库ID',
location_id BIGINT COMMENT '库位ID',
warehouse_code VARCHAR(50) COMMENT '仓库编码',
location_code VARCHAR(50) COMMENT '库位编码',
-- 商品信息
product_id BIGINT NOT NULL COMMENT '商品ID',
product_code VARCHAR(50) COMMENT '商品编码',
product_name VARCHAR(200) COMMENT '商品名称',
batch_id BIGINT COMMENT '批次ID',
batch_no VARCHAR(50) COMMENT '批次号',
-- 库存数量
total_quantity INT NOT NULL COMMENT '总数量',
available_quantity INT NOT NULL COMMENT '可用数量',
locked_quantity INT DEFAULT 0 COMMENT '锁定数量',
damaged_quantity INT DEFAULT 0 COMMENT '破损数量',
quarantine_quantity INT DEFAULT 0 COMMENT '隔离数量',
-- 库存价值
unit_cost DECIMAL(10,2) COMMENT '单位成本',
total_cost DECIMAL(12,2) COMMENT '总成本',
avg_cost DECIMAL(10,2) COMMENT '平均成本',
last_purchase_price DECIMAL(10,2) COMMENT '最后采购价',
-- 批次信息
production_date DATE COMMENT '生产日期',
expiry_date DATE COMMENT '到期日期',
remaining_days INT COMMENT '剩余天数',
-- 库存状态
inventory_status TINYINT DEFAULT 1 COMMENT '库存状态:1正常2预警3过期',
quality_status TINYINT DEFAULT 1 COMMENT '质量状态:1合格2待检3不合格',
stock_age INT COMMENT '库龄(天)',
-- 时间信息
last_in_time DATETIME COMMENT '最后入库时间',
last_out_time DATETIME COMMENT '最后出库时间',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-- 预警信息
min_stock_warning TINYINT DEFAULT 0 COMMENT '最低库存预警:0无1有',
expiry_warning TINYINT DEFAULT 0 COMMENT '效期预警:0无1有',
overstock_warning TINYINT DEFAULT 0 COMMENT '超储预警:0无1有',
-- 索引
UNIQUE KEY uk_inventory (warehouse_id, product_id, batch_no(20)),
INDEX idx_product (product_id),
INDEX idx_batch (batch_id),
INDEX idx_warehouse (warehouse_id),
INDEX idx_location (location_id),
INDEX idx_expiry (expiry_date),
INDEX idx_status (inventory_status),
INDEX idx_available (available_quantity)
) COMMENT='库存主表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4.1.4 采购单表(purchase_order)详细设计
-- 采购订单主表
CREATE TABLE purchase_order (
purchase_id BIGINT PRIMARY KEY COMMENT '采购单ID',
purchase_no VARCHAR(50) NOT NULL UNIQUE COMMENT '采购单号',
-- 供应商信息
supplier_id BIGINT NOT NULL COMMENT '供应商ID',
supplier_code VARCHAR(50) COMMENT '供应商编码',
supplier_name VARCHAR(200) NOT NULL COMMENT '供应商名称',
supplier_contact VARCHAR(50) COMMENT '供应商联系人',
supplier_phone VARCHAR(20) COMMENT '供应商电话',
-- 采购信息
purchase_type TINYINT COMMENT '采购类型:1日常采购2紧急采购3合同采购',
purchase_category TINYINT COMMENT '采购类别:1原材料2成品3耗材',
contract_no VARCHAR(50) COMMENT '合同号',
-- 金额信息
total_amount DECIMAL(12,2) NOT NULL COMMENT '采购总额',
tax_amount DECIMAL(10,2) COMMENT '税额',
discount_amount DECIMAL(10,2) DEFAULT 0 COMMENT '折扣金额',
other_fee DECIMAL(8,2) DEFAULT 0 COMMENT '其他费用',
actual_amount DECIMAL(12,2) NOT NULL COMMENT '实际金额',
prepaid_amount DECIMAL(12,2) DEFAULT 0 COMMENT '预付金额',
paid_amount DECIMAL(12,2) DEFAULT 0 COMMENT '已付金额',
-- 订单状态
order_status TINYINT NOT NULL COMMENT '订单状态:1草稿2待审核3审核通过4审核拒绝5已发送6供应商确认7部分收货8已完成9已取消',
payment_status TINYINT DEFAULT 0 COMMENT '付款状态:0未付款1部分付款2已付款',
invoice_status TINYINT DEFAULT 0 COMMENT '发票状态:0未开票1部分开票2已开票',
-- 时间信息
order_date DATE NOT NULL COMMENT '订单日期',
required_date DATE COMMENT '要求到货日期',
confirm_date DATE COMMENT '确认日期',
delivery_date DATE COMMENT '预计交货日期',
complete_date DATE COMMENT '完成日期',
cancel_date DATE COMMENT '取消日期',
-- 交货信息
delivery_address VARCHAR(500) COMMENT '交货地址',
delivery_contact VARCHAR(50) COMMENT '交货联系人',
delivery_phone VARCHAR(20) COMMENT '交货联系电话',
-- 仓库信息
warehouse_id BIGINT COMMENT '收货仓库ID',
warehouse_name VARCHAR(100) COMMENT '收货仓库名称',
-- 物流信息
logistics_company VARCHAR(100) COMMENT '物流公司',
logistics_no VARCHAR(100) COMMENT '物流单号',
freight_fee DECIMAL(8,2) COMMENT '运费',
-- 审批信息
audit_status TINYINT DEFAULT 0 COMMENT '审核状态:0未审核1审核通过2审核拒绝',
audit_opinion VARCHAR(500) COMMENT '审核意见',
audit_time DATETIME COMMENT '审核时间',
audit_by BIGINT COMMENT '审核人',
-- 备注信息
remark VARCHAR(500) COMMENT '备注',
internal_remark VARCHAR(500) COMMENT '内部备注',
cancel_reason VARCHAR(200) COMMENT '取消原因',
-- 人员信息
create_by BIGINT COMMENT '创建人',
update_by BIGINT COMMENT '更新人',
confirm_by BIGINT COMMENT '确认人',
-- 索引
INDEX idx_supplier (supplier_id),
INDEX idx_purchase_no (purchase_no),
INDEX idx_status (order_status),
INDEX idx_order_date (order_date),
INDEX idx_required_date (required_date),
INDEX idx_warehouse (warehouse_id)
) COMMENT='采购订单主表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
4.2 复杂关联关系设计
4.2.1 多层次分类结构设计
商品分类需要支持无限层级结构:
-- 商品分类表(无限层级设计)
CREATE TABLE product_category (
category_id BIGINT PRIMARY KEY COMMENT '分类ID',
parent_id BIGINT DEFAULT 0 COMMENT '父分类ID',
category_code VARCHAR(50) NOT NULL UNIQUE COMMENT '分类编码',
category_name VARCHAR(100) NOT NULL COMMENT '分类名称',
category_path VARCHAR(500) COMMENT '分类路径',
level TINYINT DEFAULT 1 COMMENT '分类级别',
sort_order INT DEFAULT 0 COMMENT '排序',
-- 分类属性
category_type TINYINT COMMENT '分类类型:1标准分类2虚拟分类',
is_leaf TINYINT DEFAULT 0 COMMENT '是否叶子节点:0否1是',
status TINYINT DEFAULT 1 COMMENT '状态:0停用1启用',
-- 生鲜特性
temperature_type TINYINT COMMENT '温层类型:1常温2冷藏3冷冻',
shelf_life_standard INT COMMENT '标准保质期(小时)',
storage_temperature VARCHAR(50) COMMENT '存储温度',
-- 业务属性
purchase_cycle_standard INT COMMENT '标准采购周期',
lead_time_standard INT COMMENT '标准提前期',
abc_classification VARCHAR(1) COMMENT 'ABC分类',
-- 图片信息
category_image VARCHAR(500) COMMENT '分类图片',
category_icon VARCHAR(500) COMMENT '分类图标',
-- SEO信息
seo_title VARCHAR(200) COMMENT 'SEO标题',
seo_keywords VARCHAR(200) COMMENT 'SEO关键词',
seo_description VARCHAR(500) COMMENT 'SEO描述',
-- 时间信息
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-- 人员信息
create_by BIGINT COMMENT '创建人',
update_by BIGINT COMMENT '更新人',
-- 索引
INDEX idx_parent (parent_id),
INDEX idx_level (level),
INDEX idx_status (status),
INDEX idx_sort (sort_order),
INDEX idx_code (category_code)
) COMMENT='商品分类表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
分类路径维护策略:
-- 分类路径更新存储过程
DELIMITER //
CREATE PROCEDURE update_category_path(IN cat_id BIGINT)
BEGIN
DECLARE parent_path VARCHAR(500);
DECLARE current_path VARCHAR(500);
-- 获取父分类路径
SELECT category_path INTO parent_path
FROM product_category WHERE category_id = (
SELECT parent_id FROM product_category WHERE category_id = cat_id
);
-- 构建当前分类路径
IF parent_path IS NULL THEN
SET current_path = CONCAT('/', cat_id, '/');
ELSE
SET current_path = CONCAT(parent_path, cat_id, '/');
END IF;
-- 更新当前分类路径
UPDATE product_category
SET category_path = current_path,
level = LENGTH(current_path) - LENGTH(REPLACE(current_path, '/', '')) - 1
WHERE category_id = cat_id;
-- 递归更新子分类路径
UPDATE product_category pc
JOIN (
SELECT category_id FROM product_category
WHERE FIND_IN_SET(category_id, get_category_children(cat_id))
) AS children ON pc.category_id = children.category_id
SET pc.category_path = CONCAT(current_path, pc.category_id, '/'),
pc.level = LENGTH(current_path) - LENGTH(REPLACE(current_path, '/', ''))
WHERE pc.parent_id = cat_id;
END //
DELIMITER ;
4.2.2 批次追溯链设计
生鲜商品需要完整的批次追溯:
-- 批次追溯链设计
CREATE TABLE product_batch_trace (
trace_id BIGINT PRIMARY KEY COMMENT '追溯ID',
batch_id BIGINT NOT NULL COMMENT '批次ID',
trace_type TINYINT NOT NULL COMMENT '追溯类型:1采购入库2生产入库3退货入库4调拨入库',
-- 来源信息
source_type TINYINT COMMENT '来源类型:1供应商2生产车间3其他仓库',
source_id BIGINT COMMENT '来源ID',
source_name VARCHAR(200) COMMENT '来源名称',
source_batch_no VARCHAR(50) COMMENT '来源批次号',
-- 目标信息
target_type TINYINT COMMENT '目标类型:1仓库2门店3客户',
target_id BIGINT COMMENT '目标ID',
target_name VARCHAR(200) COMMENT '目标名称',
-- 商品信息
product_id BIGINT NOT NULL COMMENT '商品ID',
product_name VARCHAR(200) COMMENT '商品名称',
quantity DECIMAL(12,3) NOT NULL COMMENT '数量',
unit VARCHAR(20) COMMENT '单位',
-- 时间信息
trace_time DATETIME NOT NULL COMMENT '追溯时间',
operation_time DATETIME COMMENT '操作时间',
-- 业务单据
business_type VARCHAR(50) COMMENT '业务类型',
business_no VARCHAR(50) COMMENT '业务单号',
business_detail_id BIGINT COMMENT '业务明细ID',
-- 位置信息
from_location VARCHAR(100) COMMENT '来源位置',
to_location VARCHAR(100) COMMENT '目标位置',
-- 人员信息
operator_id BIGINT COMMENT '操作人ID',
operator_name VARCHAR(50) COMMENT '操作人姓名',
-- 质量信息
quality_status TINYINT DEFAULT 1 COMMENT '质量状态:1合格2不合格',
inspection_no VARCHAR(50) COMMENT '检验单号',
inspection_result VARCHAR(500) COMMENT '检验结果',
-- 索引
INDEX idx_batch (batch_id),
INDEX idx_product (product_id),
INDEX idx_trace_time (trace_time),
INDEX idx_business (business_type, business_no),
INDEX idx_source (source_type, source_id),
INDEX idx_target (target_type, target_id)
) COMMENT='批次追溯链' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
追溯链查询函数:
-- 获取商品完整追溯链
DELIMITER //
CREATE FUNCTION get_product_trace_chain(product_id BIGINT, batch_no VARCHAR(50))
RETURNS TEXT
BEGIN
DECLARE trace_chain TEXT;
SELECT JSON_ARRAYAGG(
JSON_OBJECT(
'trace_id', trace_id,
'trace_type', trace_type,
'trace_time', DATE_FORMAT(trace_time, '%Y-%m-%d %H:%i:%s'),
'business_type', business_type,
'business_no', business_no,
'source', JSON_OBJECT('type', source_type, 'name', source_name),
'target', JSON_OBJECT('type', target_type, 'name', target_name),
'quantity', quantity,
'operator', operator_name,
'quality_status', quality_status
)
) INTO trace_chain
FROM product_batch_trace
WHERE product_id = product_id
AND batch_id IN (SELECT batch_id FROM product_batch WHERE batch_no = batch_no)
ORDER BY trace_time;
RETURN trace_chain;
END //
DELIMITER ;
4.3 高级数据模型设计
4.3.1 历史数据与版本控制
关键业务数据需要版本控制:
-- 价格历史表(支持版本控制)
CREATE TABLE price_history (
history_id BIGINT PRIMARY KEY COMMENT '历史ID',
-- 价格主体
price_type TINYINT NOT NULL COMMENT '价格类型:1采购价2销售价3成本价',
product_id BIGINT NOT NULL COMMENT '商品ID',
price_group_id BIGINT COMMENT '价格组ID',
customer_id BIGINT COMMENT '客户ID',
supplier_id BIGINT COMMENT '供应商ID',
-- 价格信息
old_price DECIMAL(10,2) COMMENT '原价格',
new_price DECIMAL(10,2) NOT NULL COMMENT '新价格',
currency VARCHAR(3) DEFAULT 'CNY' COMMENT '币种',
tax_rate DECIMAL(5,2) COMMENT '税率',
price_unit VARCHAR(20) COMMENT '价格单位',
-- 生效信息
effective_date DATE NOT NULL COMMENT '生效日期',
expiry_date DATE COMMENT '失效日期',
is_current TINYINT DEFAULT 1 COMMENT '是否当前价格:0否1是',
-- 变更信息
change_type TINYINT COMMENT '变更类型:1新建2调整3促销',
change_reason VARCHAR(200) COMMENT '变更原因',
change_remark VARCHAR(500) COMMENT '变更备注',
-- 审批信息
approval_status TINYINT DEFAULT 1 COMMENT '审批状态:1待审批2审批通过3审批拒绝',
approval_opinion VARCHAR(500) COMMENT '审批意见',
approval_time DATETIME COMMENT '审批时间',
approval_by BIGINT COMMENT '审批人',
-- 时间信息
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-- 人员信息
create_by BIGINT COMMENT '创建人',
update_by BIGINT COMMENT '更新人',
-- 索引
INDEX idx_product (product_id),
INDEX idx_price_type (price_type),
INDEX idx_effective (effective_date),
INDEX idx_current (is_current),
INDEX idx_customer (customer_id),
INDEX idx_supplier (supplier_id),
UNIQUE KEY uk_price_version (product_id, price_type, effective_date)
) COMMENT='价格历史表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
价格版本控制策略:
-- 价格变更触发器
DELIMITER //
CREATE TRIGGER before_price_update
BEFORE UPDATE ON product_price
FOR EACH ROW
BEGIN
-- 将旧价格插入历史表
INSERT INTO price_history (
price_type, product_id, old_price, new_price,
effective_date, change_type, change_reason,
create_by, create_time
) VALUES (
2, -- 销售价
OLD.product_id,
OLD.sale_price,
NEW.sale_price,
CURDATE(),
2, -- 调整
'系统价格调整',
NEW.update_by,
NOW()
);
-- 标记历史价格为非当前
UPDATE price_history
SET is_current = 0, expiry_date = CURDATE() - INTERVAL 1 DAY
WHERE product_id = OLD.product_id
AND price_type = 2
AND is_current = 1;
END //
DELIMITER ;
4.3.2 审计日志与数据变更跟踪
关键数据变更需要完整审计:
-- 数据变更审计表
CREATE TABLE data_change_audit (
audit_id BIGINT PRIMARY KEY COMMENT '审计ID',
-- 变更对象
table_name VARCHAR(100) NOT NULL COMMENT '表名',
record_id BIGINT NOT NULL COMMENT '记录ID',
operation_type TINYINT NOT NULL COMMENT '操作类型:1新增2修改3删除',
-- 变更数据
old_data JSON COMMENT '旧数据',
new_data JSON COMMENT '新数据',
changed_fields JSON COMMENT '变更字段',
-- 变更信息
change_reason VARCHAR(500) COMMENT '变更原因',
business_no VARCHAR(50) COMMENT '业务单号',
-- 时间信息
operation_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
-- 人员信息
operator_id BIGINT COMMENT '操作人ID',
operator_name VARCHAR(50) COMMENT '操作人姓名',
operator_ip VARCHAR(50) COMMENT '操作IP',
user_agent VARCHAR(500) COMMENT '用户代理',
-- 索引
INDEX idx_table_record (table_name, record_id),
INDEX idx_operation_time (operation_time),
INDEX idx_operator (operator_id),
INDEX idx_business_no (business_no)
) COMMENT='数据变更审计表' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
审计触发器示例:
-- 订单表审计触发器
DELIMITER //
CREATE TRIGGER audit_customer_order_after_update
AFTER UPDATE ON customer_order
FOR EACH ROW
BEGIN
DECLARE changed_fields JSON;
DECLARE old_data JSON;
DECLARE new_data JSON;
-- 构建变更字段
SET changed_fields = JSON_ARRAY();
IF OLD.order_status != NEW.order_status THEN
SET changed_fields = JSON_ARRAY_APPEND(changed_fields, '$', 'order_status');
END IF;
IF OLD.payment_status != NEW.payment_status THEN
SET changed_fields = JSON_ARRAY_APPEND(changed_fields, '$', 'payment_status');
END IF;
-- 如果有字段变更,记录审计日志
IF JSON_LENGTH(changed_fields) > 0 THEN
-- 构建旧数据
SET old_data = JSON_OBJECT(
'order_status', OLD.order_status,
'payment_status', OLD.payment_status,
'actual_amount', OLD.actual_amount
);
-- 构建新数据
SET new_data = JSON_OBJECT(
'order_status', NEW.order_status,
'payment_status', NEW.payment_status,
'actual_amount', NEW.actual_amount
);
-- 插入审计记录
INSERT INTO data_change_audit (
table_name, record_id, operation_type,
old_data, new_data, changed_fields,
business_no, operator_id, operator_name
) VALUES (
'customer_order',
NEW.order_id,
2, -- 修改
old_data,
new_data,
changed_fields,
NEW.order_no,
NEW.update_by,
(SELECT username FROM sys_user WHERE user_id = NEW.update_by)
);
END IF;
END //
DELIMITER ;
4.4 性能优化设计
4.4.1 分库分表策略
基于业务场景的分库分表设计:
-- 按业务垂直分库
-- 库1: 主数据库 (master_data)
-- 包含:商品、分类、客户、供应商等基础数据
-- 库2: 交易库 (transaction_data)
-- 包含:订单、库存、采购等交易数据
-- 库3: 财务库 (financial_data)
-- 包含:应收应付、账单、付款等财务数据
-- 库4: 报表库 (report_data)
-- 包含:各类报表和统计数据的汇总
-- 水平分表策略:按时间分表
-- 订单表按月分表
CREATE TABLE customer_order_202401 (
-- 同原customer_order表结构
) COMMENT='2024年1月订单表'
PARTITION BY RANGE (YEAR(order_time) * 100 + MONTH(order_time)) (
PARTITION p202401 VALUES LESS THAN (202402),
PARTITION p202402 VALUES LESS THAN (202403),
PARTITION p202403 VALUES LESS THAN (202404)
);
-- 库存流水按日分表
CREATE TABLE inventory_flow_20240101 (
-- 同原inventory_flow表结构
) COMMENT='2024年1月1日库存流水表';
4.4.2 读写分离与缓存策略
-- 读写分离配置
-- 主库(写操作)
master_host = '192.168.1.10'
master_port = 3306
-- 从库1(读操作)
slave1_host = '192.168.1.11'
slave1_port = 3306
-- 从库2(读操作)
slave2_host = '192.168.1.12'
slave2_port = 3306
-- 缓存策略配置
-- 一级缓存:本地缓存(Guava Cache)
-- 缓存商品基本信息,有效期5分钟
-- 缓存客户基本信息,有效期10分钟
-- 缓存价格信息,有效期1分钟
-- 二级缓存:Redis分布式缓存
-- 缓存商品详情,有效期30分钟
-- 缓存订单详情,有效期1小时
-- 缓存库存数量,有效期5分钟(实时更新)
-- 缓存用户会话,有效期2小时
-- 缓存键设计规范
-- 商品缓存:product:{product_id}:detail
-- 订单缓存:order:{order_no}:detail
-- 库存缓存:inventory:{warehouse_id}:{product_id}:quantity
-- 价格缓存:price:{product_id}:{customer_id}:current
4.4.3 索引优化设计
-- 复合索引设计
-- 订单查询优化
CREATE INDEX idx_order_query ON customer_order (
customer_id,
order_status,
order_time DESC
);
-- 库存查询优化
CREATE INDEX idx_inventory_query ON inventory (
warehouse_id,
product_id,
inventory_status,
available_quantity
);
-- 商品查询优化
CREATE INDEX idx_product_query ON product (
category_id,
product_status,
create_time DESC
);
-- 覆盖索引设计
CREATE INDEX idx_order_cover ON customer_order (
order_no,
customer_id,
order_status,
actual_amount,
order_time
);
-- 函数索引(MySQL 8.0+)
CREATE INDEX idx_order_date ON customer_order ((DATE(order_time)));
-- 前缀索引
CREATE INDEX idx_product_name_prefix ON product (product_name(20));
-- 定期索引优化维护
-- 每周执行一次
OPTIMIZE TABLE customer_order;
ANALYZE TABLE inventory;
CHECK TABLE product FAST QUICK;
第五部分:业务流程集成与数据流
5.1 端到端业务流程数据流
5.1.1 销售订单到收款全流程数据流
┌─────────────────────────────────────────────────────────────────────┐
│ 销售订单到收款端到端数据流 │
├──────────────┬─────────────────────┬─────────────────┬─────────────┤
│ 业务阶段 │ 主要数据表 │ 关键字段 │ 数据状态 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 1.订单创建 │ customer_order │ order_status=1 │ 待确认 │
│ │ order_detail │ quantity │ 已保存 │
│ │ inventory │ locked_quantity │ 预占锁定 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 2.订单确认 │ customer_order │ order_status=2 │ 待分拣 │
│ │ order_audit │ audit_result=1 │ 审核通过 │
│ │ inventory_flow │ change_type=2 │ 锁定确认 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 3.分拣处理 │ sorting_task │ task_status=1 │ 进行中 │
│ │ sorting_detail │ actual_quantity │ 实际分拣 │
│ │ inventory │ locked_quantity │ 锁定减少 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 4.发货出库 │ delivery_order │ delivery_status=1│ 待发货 │
│ │ delivery_detail │ shipped_quantity│ 已发货数量 │
│ │ outbound_order │ outbound_status=1│ 出库中 │
│ │ inventory │ available_quantity│ 可用减少 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 5.配送运输 │ delivery_task │ task_status=2 │ 配送中 │
│ │ delivery_track │ location │ 实时位置 │
│ │ delivery_status_log │ status_change │ 状态变更 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 6.客户收货 │ receipt_order │ receipt_status=1│ 已收货 │
│ │ receipt_detail │ received_quantity│ 实收数量 │
│ │ customer_order │ order_status=6 │ 已完成 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 7.应收确认 │ receivable │ receivable_status=1│ 待收款 │
│ │ receivable_detail │ amount │ 应收金额 │
│ │ customer_order │ payment_status=1│ 已支付 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 8.收款核销 │ collection_order │ collection_status=1│ 已收款 │
│ │ collection_detail │ collected_amount│ 实收金额 │
│ │ account_flow │ flow_type=1 │ 收入 │
│ │ receivable │ receivable_status=2│ 已核销 │
└──────────────┴─────────────────────┴─────────────────┴─────────────┘
5.1.2 采购到付款全流程数据流
┌─────────────────────────────────────────────────────────────────────┐
│ 采购到付款端到端数据流 │
├──────────────┬─────────────────────┬─────────────────┬─────────────┤
│ 业务阶段 │ 主要数据表 │ 关键字段 │ 数据状态 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 1.采购申请 │ purchase_requisition │ requisition_status=1│ 申请中 │
│ │ requisition_detail │ request_quantity │ 申请数量 │
│ │ inventory_alert │ alert_status=1 │ 预警中 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 2.采购审批 │ purchase_requisition │ requisition_status=2│ 已批准 │
│ │ audit_record │ audit_result=1 │ 审批通过 │
│ │ purchase_plan │ plan_status=1 │ 计划制定 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 3.采购下单 │ purchase_order │ order_status=3 │ 已发送 │
│ │ purchase_order_detail│ order_quantity │ 订购数量 │
│ │ supplier_quotation │ quotation_status=1│ 报价接受 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 4.供应商发货 │ purchase_order │ order_status=4 │ 已发货 │
│ │ delivery_notice │ notice_status=1 │ 发货通知 │
│ │ purchase_inbound_order│ inbound_status=1│ 待收货 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 5.到货验收 │ inbound_inspection │ inspection_status=1│ 检验中 │
│ │ quality_inspection │ quality_result=1 │ 合格 │
│ │ product_batch │ batch_status=1 │ 批次创建 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 6.入库上架 │ inbound_putaway │ putaway_status=1 │ 上架中 │
│ │ inventory │ total_quantity │ 库存增加 │
│ │ inventory_flow │ flow_type=1 │ 入库 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 7.应付确认 │ payable │ payable_status=1 │ 待付款 │
│ │ payable_detail │ payable_amount │ 应付金额 │
│ │ purchase_order │ order_status=8 │ 已完成 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 8.发票匹配 │ supplier_invoice │ invoice_status=1 │ 已接收 │
│ │ three_way_matching │ matching_status=1│ 匹配成功 │
│ │ invoice_verification │ verify_result=1 │ 验证通过 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 9.付款执行 │ payment_order │ payment_status=1 │ 已付款 │
│ │ payment_detail │ paid_amount │ 实付金额 │
│ │ account_flow │ flow_type=2 │ 支出 │
│ │ payable │ payable_status=2 │ 已核销 │
└──────────────┴─────────────────────┴─────────────────┴─────────────┘
5.2 实时数据同步与ETL流程
5.2.1 实时数据同步架构
┌─────────────────────────────────────────────────────────────────────┐
│ 实时数据同步架构 │
├──────────────┬─────────────────────┬─────────────────┬─────────────┤
│ 数据层 │ 同步技术 │ 同步频率 │ 数据目标 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 业务数据库 │ MySQL Binlog │ 实时 │ 缓存层 │
│ │ Canal监听 │ <1秒延迟 │ 搜索引擎 │
│ │ 消息队列 │ 事件驱动 │ 数据仓库 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 缓存层 │ Redis Pub/Sub │ 实时 │ 应用层 │
│ │ 本地缓存更新 │ <100毫秒 │ 前端 │
│ │ 缓存失效策略 │ 主动/被动 │ API层 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 搜索引擎 │ Logstash │ 准实时 │ 查询服务 │
│ │ Elasticsearch索引 │ <5秒延迟 │ 分析服务 │
│ │ 全文索引更新 │ 增量更新 │ 报表服务 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 数据仓库 │ Flink CDC │ 近实时 │ BI分析 │
│ │ 维度建模 │ <1分钟延迟 │ 数据挖掘 │
│ │ 事实表更新 │ 微批处理 │ 机器学习 │
└──────────────┴─────────────────────┴─────────────────┴─────────────┘
5.2.2 订单状态实时同步流程
// 订单状态变更事件发布
@Component
@Slf4j
public class OrderStatusChangePublisher {
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@TransactionalEventListener
public void handleOrderStatusChange(OrderStatusChangeEvent event) {
Order order = event.getOrder();
// 1. 更新Redis缓存
String cacheKey = "order:" + order.getOrderNo() + ":status";
redisTemplate.opsForValue().set(cacheKey, order.getOrderStatus(), 1, TimeUnit.HOURS);
// 2. 发布消息到MQ
OrderStatusMessage message = new OrderStatusMessage();
message.setOrderNo(order.getOrderNo());
message.setOldStatus(event.getOldStatus());
message.setNewStatus(order.getOrderStatus());
message.setChangeTime(LocalDateTime.now());
message.setOperator(event.getOperator());
rabbitTemplate.convertAndSend(
"order.exchange",
"order.status.change",
message
);
// 3. 发送WebSocket通知
sendWebSocketNotification(order.getCustomerId(), message);
// 4. 记录状态变更日志
saveStatusChangeLog(order, event);
log.info("订单状态变更通知已发送: {}", order.getOrderNo());
}
// 发送WebSocket实时通知
private void sendWebSocketNotification(Long customerId, OrderStatusMessage message) {
Map<String, Object> notification = new HashMap<>();
notification.put("type", "ORDER_STATUS_CHANGE");
notification.put("orderNo", message.getOrderNo());
notification.put("newStatus", message.getNewStatus());
notification.put("changeTime", message.getChangeTime());
// 通过WebSocket发送给客户
webSocketService.sendToUser(
String.valueOf(customerId),
"/topic/order/status",
notification
);
}
}
5.2.3 库存实时同步流程
// 库存变更同步服务
@Service
@Slf4j
public class InventorySyncService {
@Autowired
private ElasticsearchRestTemplate elasticsearchTemplate;
@Autowired
private InventoryMapper inventoryMapper;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// 库存变更事件处理
@EventListener
public void handleInventoryChange(InventoryChangeEvent event) {
// 1. 更新Redis缓存
updateRedisCache(event);
// 2. 同步到Elasticsearch
syncToElasticsearch(event);
// 3. 发送库存预警检查
checkInventoryAlert(event);
// 4. 更新实时库存看板
updateInventoryDashboard(event);
}
// 更新Redis缓存
private void updateRedisCache(InventoryChangeEvent event) {
String cacheKey = String.format("inventory:%d:%d:quantity",
event.getWarehouseId(), event.getProductId());
// 获取最新库存数量
Integer latestQuantity = inventoryMapper.selectAvailableQuantity(
event.getWarehouseId(), event.getProductId()
);
// 更新缓存,设置5分钟过期
redisTemplate.opsForValue().set(
cacheKey,
latestQuantity,
5,
TimeUnit.MINUTES
);
// 更新库存变化趋势
updateInventoryTrend(event, latestQuantity);
}
// 同步到Elasticsearch
private void syncToElasticsearch(InventoryChangeEvent event) {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(generateDocId(event));
InventoryDocument doc = new InventoryDocument();
doc.setWarehouseId(event.getWarehouseId());
doc.setProductId(event.getProductId());
doc.setProductName(event.getProductName());
doc.setAvailableQuantity(event.getAvailableQuantity());
doc.setChangeQuantity(event.getChangeQuantity());
doc.setChangeType(event.getChangeType());
doc.setChangeTime(LocalDateTime.now());
doc.setBusinessNo(event.getBusinessNo());
indexQuery.setObject(doc);
elasticsearchTemplate.index(
indexQuery,
IndexCoordinates.of("inventory")
);
}
// 库存预警检查
private void checkInventoryAlert(InventoryChangeEvent event) {
// 获取库存配置
InventoryConfig config = inventoryMapper.selectInventoryConfig(
event.getWarehouseId(), event.getProductId()
);
if (config == null) return;
// 检查最低库存预警
if (event.getAvailableQuantity() <= config.getMinStock()) {
sendInventoryAlert(event, "MIN_STOCK", config.getMinStock());
}
// 检查最高库存预警
if (event.getAvailableQuantity() >= config.getMaxStock()) {
sendInventoryAlert(event, "MAX_STOCK", config.getMaxStock());
}
// 检查效期预警
checkExpiryAlert(event);
}
}
5.3 批处理与ETL流程
5.3.1 日终批处理流程
┌─────────────────────────────────────────────────────────────────────┐
│ 日终批处理流程 │
├──────────────┬─────────────────────┬─────────────────┬─────────────┤
│ 处理阶段 │ 主要任务 │ 数据表 │ 执行时间 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 1.数据准备 │ 业务数据冻结 │ 所有业务表 │ 23:00 │
│ │ 临时表创建 │ temp_* │ 23:05 │
│ │ 增量数据抽取 │ 变更日志表 │ 23:10 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 2.数据清洗 │ 数据质量检查 │ 业务数据表 │ 23:15 │
│ │ 异常数据处理 │ data_exception │ 23:20 │
│ │ 数据标准化 │ 标准化规则表 │ 23:25 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 3.数据转换 │ 维度模型构建 │ dim_* │ 23:30 │
│ │ 事实表汇总 │ fact_* │ 23:45 │
│ │ 数据聚合计算 │ aggregate_* │ 00:00 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 4.数据加载 │ 数据仓库加载 │ dw_* │ 00:15 │
│ │ 数据立方体构建 │ cube_* │ 00:30 │
│ │ 物化视图刷新 │ mv_* │ 00:45 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 5.报表生成 │ 业务报表计算 │ report_* │ 01:00 │
│ │ 分析报表生成 │ analysis_* │ 01:30 │
│ │ 管理报表生成 │ management_* │ 02:00 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 6.数据归档 │ 历史数据迁移 │ history_* │ 02:30 │
│ │ 数据压缩存储 │ archive_* │ 03:00 │
│ │ 索引重建优化 │ 所有索引 │ 03:30 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 7.系统检查 │ 数据一致性验证 │ 所有关键表 │ 04:00 │
│ │ 系统性能检查 │ 系统监控表 │ 04:30 │
│ │ 批处理日志记录 │ batch_log │ 05:00 │
└──────────────┴─────────────────────┴─────────────────┴─────────────┘
5.3.2 数据仓库ETL流程
-- 数据仓库ETL存储过程
DELIMITER //
CREATE PROCEDURE run_daily_etl_process(IN process_date DATE)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
-- 记录错误日志
INSERT INTO etl_error_log (process_date, error_message, error_stack)
VALUES (process_date, 'ETL过程执行失败', CONCAT('Error: ', SQLSTATE, ' - ', SQLERRM));
-- 回滚
ROLLBACK;
-- 发送告警
CALL send_etl_failure_alert(process_date, SQLERRM);
END;
-- 开始事务
START TRANSACTION;
-- 1. 清空临时表
TRUNCATE TABLE temp_sales_fact;
TRUNCATE TABLE temp_purchase_fact;
TRUNCATE TABLE temp_inventory_fact;
-- 2. 抽取销售事实数据
INSERT INTO temp_sales_fact (
date_key, customer_key, product_key, store_key,
quantity, amount, cost, profit
)
SELECT
d.date_key,
c.customer_key,
p.product_key,
s.store_key,
SUM(od.quantity) as quantity,
SUM(od.subtotal) as amount,
SUM(od.cost * od.quantity) as cost,
SUM(od.subtotal - od.cost * od.quantity) as profit
FROM order_detail od
JOIN customer_order co ON od.order_id = co.order_id
JOIN dim_date d ON DATE(co.order_time) = d.date_value
JOIN dim_customer c ON co.customer_id = c.customer_id
JOIN dim_product p ON od.product_id = p.product_id
LEFT JOIN dim_store s ON co.store_id = s.store_id
WHERE DATE(co.order_time) = process_date
AND co.order_status = 6 -- 已完成订单
GROUP BY d.date_key, c.customer_key, p.product_key, s.store_key;
-- 3. 抽取采购事实数据
INSERT INTO temp_purchase_fact (
date_key, supplier_key, product_key, warehouse_key,
quantity, amount, tax_amount, total_amount
)
SELECT
d.date_key,
s.supplier_key,
p.product_key,
w.warehouse_key,
SUM(pod.quantity) as quantity,
SUM(pod.price * pod.quantity) as amount,
SUM(pod.tax_amount) as tax_amount,
SUM(pod.total_amount) as total_amount
FROM purchase_order_detail pod
JOIN purchase_order po ON pod.purchase_id = po.purchase_id
JOIN dim_date d ON DATE(po.order_date) = d.date_value
JOIN dim_supplier s ON po.supplier_id = s.supplier_id
JOIN dim_product p ON pod.product_id = p.product_id
JOIN dim_warehouse w ON po.warehouse_id = w.warehouse_id
WHERE DATE(po.order_date) = process_date
AND po.order_status IN (7, 8) -- 部分收货或已完成
GROUP BY d.date_key, s.supplier_key, p.product_key, w.warehouse_key;
-- 4. 抽取库存事实数据
INSERT INTO temp_inventory_fact (
date_key, product_key, warehouse_key,
opening_quantity, opening_amount,
inbound_quantity, inbound_amount,
outbound_quantity, outbound_amount,
closing_quantity, closing_amount
)
SELECT
d.date_key,
p.product_key,
w.warehouse_key,
SUM(CASE WHEN ifl.transaction_time < process_date
THEN ifl.ending_quantity ELSE 0 END) as opening_quantity,
SUM(CASE WHEN ifl.transaction_time < process_date
THEN ifl.ending_amount ELSE 0 END) as opening_amount,
SUM(CASE WHEN ifl.flow_type = 'INBOUND' AND DATE(ifl.transaction_time) = process_date
THEN ifl.change_quantity ELSE 0 END) as inbound_quantity,
SUM(CASE WHEN ifl.flow_type = 'INBOUND' AND DATE(ifl.transaction_time) = process_date
THEN ifl.change_amount ELSE 0 END) as inbound_amount,
SUM(CASE WHEN ifl.flow_type = 'OUTBOUND' AND DATE(ifl.transaction_time) = process_date
THEN ifl.change_quantity ELSE 0 END) as outbound_quantity,
SUM(CASE WHEN ifl.flow_type = 'OUTBOUND' AND DATE(ifl.transaction_time) = process_date
THEN ifl.change_amount ELSE 0 END) as outbound_amount,
SUM(CASE WHEN ifl.transaction_time <= process_date
THEN ifl.ending_quantity ELSE 0 END) as closing_quantity,
SUM(CASE WHEN ifl.transaction_time <= process_date
THEN ifl.ending_amount ELSE 0 END) as closing_amount
FROM inventory_flow ifl
JOIN dim_date d ON DATE(ifl.transaction_time) = d.date_value
JOIN dim_product p ON ifl.product_id = p.product_id
JOIN dim_warehouse w ON ifl.warehouse_id = w.warehouse_id
WHERE DATE(ifl.transaction_time) <= process_date
GROUP BY d.date_key, p.product_key, w.warehouse_key;
-- 5. 加载到事实表
INSERT INTO fact_sales_daily
SELECT * FROM temp_sales_fact
ON DUPLICATE KEY UPDATE
quantity = VALUES(quantity),
amount = VALUES(amount),
cost = VALUES(cost),
profit = VALUES(profit);
INSERT INTO fact_purchase_daily
SELECT * FROM temp_purchase_fact
ON DUPLICATE KEY UPDATE
quantity = VALUES(quantity),
amount = VALUES(amount),
tax_amount = VALUES(tax_amount),
total_amount = VALUES(total_amount);
INSERT INTO fact_inventory_daily
SELECT * FROM temp_inventory_fact
ON DUPLICATE KEY UPDATE
opening_quantity = VALUES(opening_quantity),
opening_amount = VALUES(opening_amount),
inbound_quantity = VALUES(inbound_quantity),
inbound_amount = VALUES(inbound_amount),
outbound_quantity = VALUES(outbound_quantity),
outbound_amount = VALUES(outbound_amount),
closing_quantity = VALUES(closing_quantity),
closing_amount = VALUES(closing_amount);
-- 6. 更新汇总表
CALL update_sales_summary(process_date);
CALL update_purchase_summary(process_date);
CALL update_inventory_summary(process_date);
-- 7. 记录ETL日志
INSERT INTO etl_process_log (
process_date,
process_type,
start_time,
end_time,
status,
records_processed
) VALUES (
process_date,
'DAILY_ETL',
NOW(),
NOW(),
'SUCCESS',
(SELECT COUNT(*) FROM temp_sales_fact) +
(SELECT COUNT(*) FROM temp_purchase_fact) +
(SELECT COUNT(*) FROM temp_inventory_fact)
);
-- 提交事务
COMMIT;
-- 8. 后续处理
CALL post_etl_processing(process_date);
END //
DELIMITER ;
第六部分:系统集成与接口设计
6.1 外部系统集成架构
6.1.1 支付系统集成
┌─────────────────────────────────────────────────────────────────────┐
│ 支付系统集成架构 │
├──────────────┬─────────────────────┬─────────────────┬─────────────┤
│ 支付渠道 │ 集成方式 │ 接口协议 │ 安全要求 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 微信支付 │ SDK集成 │ HTTPS+JSON │ TLS 1.2+ │
│ │ 公众号/小程序支付 │ OAuth 2.0 │ 签名验证 │
│ │ H5支付 │ 异步通知 │ 防重放 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 支付宝 │ SDK集成 │ HTTPS+JSON │ TLS 1.2+ │
│ │ 手机网站支付 │ RSA签名 │ 参数加密 │
│ │ 电脑网站支付 │ 异步通知 │ 防篡改 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 银联支付 │ 网关集成 │ HTTPS+XML │ TLS 1.2+ │
│ │ 在线支付 │ 数字证书 │ 报文加密 │
│ │ 快捷支付 │ 异步通知 │ 验签机制 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 银行直连 │ 银企直连 │ HTTPS+XML/8583 │ 专线连接 │
│ │ 代收代付 │ 数字证书 │ 硬件加密 │
│ │ 资金归集 │ 签名加密 │ 访问控制 │
└──────────────┴─────────────────────┴─────────────────┴─────────────┘
支付集成接口设计:
// 统一支付接口
public interface PaymentService {
/**
* 创建支付订单
*/
PaymentResponse createPayment(PaymentRequest request);
/**
* 查询支付状态
*/
PaymentStatusResponse queryPaymentStatus(String paymentNo);
/**
* 处理支付回调
*/
PaymentCallbackResponse handleCallback(PaymentCallbackRequest request);
/**
* 申请退款
*/
RefundResponse requestRefund(RefundRequest request);
/**
* 查询退款状态
*/
RefundStatusResponse queryRefundStatus(String refundNo);
}
// 支付策略工厂
@Component
public class PaymentStrategyFactory {
@Autowired
private WechatPaymentService wechatPaymentService;
@Autowired
private AlipayPaymentService alipayPaymentService;
@Autowired
private UnionPaymentService unionPaymentService;
public PaymentService getPaymentService(String paymentMethod) {
switch (paymentMethod) {
case "WECHAT":
return wechatPaymentService;
case "ALIPAY":
return alipayPaymentService;
case "UNION":
return unionPaymentService;
default:
throw new IllegalArgumentException("不支持的支付方式: " + paymentMethod);
}
}
}
// 微信支付实现
@Service
@Slf4j
public class WechatPaymentServiceImpl implements PaymentService {
@Value("${wechat.pay.app-id}")
private String appId;
@Value("${wechat.pay.mch-id}")
private String mchId;
@Value("${wechat.pay.api-key}")
private String apiKey;
@Override
public PaymentResponse createPayment(PaymentRequest request) {
try {
// 构建微信支付请求
WxPayUnifiedOrderRequest wxRequest = new WxPayUnifiedOrderRequest();
wxRequest.setBody(request.getSubject());
wxRequest.setOutTradeNo(request.getPaymentNo());
wxRequest.setTotalFee(request.getAmount().multiply(new BigDecimal("100")).intValue());
wxRequest.setSpbillCreateIp(request.getClientIp());
wxRequest.setNotifyUrl(request.getNotifyUrl());
wxRequest.setTradeType(request.getTradeType());
wxRequest.setOpenid(request.getOpenId());
// 调用微信支付API
WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(wxRequest);
// 构建响应
PaymentResponse response = new PaymentResponse();
response.setSuccess(true);
response.setPaymentNo(request.getPaymentNo());
response.setTradeNo(result.getTransactionId());
response.setPrepayId(result.getPrepayId());
response.setPaySign(generatePaySign(result));
// 记录支付日志
savePaymentLog(request, response, "CREATE");
return response;
} catch (WxPayException e) {
log.error("微信支付创建失败", e);
throw new PaymentException("支付创建失败: " + e.getErrCodeDes());
}
}
@Override
public PaymentCallbackResponse handleCallback(PaymentCallbackRequest request) {
try {
// 验证签名
WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(
request.getNotifyData());
// 验证订单信息
PaymentOrder paymentOrder = paymentOrderMapper.selectByPaymentNo(
notifyResult.getOutTradeNo());
if (paymentOrder == null) {
throw new PaymentException("订单不存在");
}
// 验证金额
BigDecimal actualAmount = new BigDecimal(notifyResult.getTotalFee())
.divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
if (actualAmount.compareTo(paymentOrder.getAmount()) != 0) {
throw new PaymentException("金额不一致");
}
// 更新订单状态
PaymentCallbackResponse response = new PaymentCallbackResponse();
if ("SUCCESS".equals(notifyResult.getResultCode())) {
paymentOrder.setStatus(PaymentStatus.PAID);
paymentOrder.setPaymentTime(new Date());
paymentOrder.setTransactionId(notifyResult.getTransactionId());
response.setSuccess(true);
response.setMessage("支付成功");
// 触发订单支付成功事件
eventPublisher.publishEvent(new PaymentSuccessEvent(paymentOrder));
} else {
paymentOrder.setStatus(PaymentStatus.FAILED);
paymentOrder.setFailReason(notifyResult.getErrCodeDes());
response.setSuccess(false);
response.setMessage("支付失败: " + notifyResult.getErrCodeDes());
}
paymentOrderMapper.update(paymentOrder);
return response;
} catch (WxPayException e) {
log.error("微信支付回调处理失败", e);
throw new PaymentException("回调处理失败");
}
}
}
6.1.2 物流系统集成
┌─────────────────────────────────────────────────────────────────────┐
│ 物流系统集成架构 │
├──────────────┬─────────────────────┬─────────────────┬─────────────┤
│ 物流公司 │ 集成方式 │ 接口协议 │ 功能支持 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 顺丰速运 │ API集成 │ HTTPS+JSON │ 电子面单 │
│ │ WebService │ XML+SOAP │ 轨迹查询 │
│ │ 数据对接 │ 批量文件 │ 费用结算 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 中通快递 │ API集成 │ HTTPS+JSON │ 下单接口 │
│ │ 开放平台 │ OAuth 2.0 │ 取消订单 │
│ │ 消息推送 │ WebSocket │ 状态同步 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 京东物流 │ API集成 │ HTTPS+JSON │ 预约取件 │
│ │ 物流云 │ RESTful │ 实时追踪 │
│ │ 电子签收 │ 图片上传 │ 异常上报 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 第三方平台 │ 聚合接口 │ 统一适配层 │ 多物流比价 │
│ │ 智能推荐 │ 算法服务 │ 路由优化 │
│ │ 统一跟踪 │ 数据聚合 │ 报表分析 │
└──────────────┴─────────────────────┴─────────────────┴─────────────┘
物流集成接口设计:
// 物流服务接口
public interface LogisticsService {
/**
* 创建物流订单
*/
LogisticsOrderResponse createOrder(LogisticsOrderRequest request);
/**
* 取消物流订单
*/
LogisticsCancelResponse cancelOrder(String logisticsNo);
/**
* 查询物流轨迹
*/
LogisticsTrackResponse queryTrack(String logisticsNo);
/**
* 电子面单打印
*/
LogisticsLabelResponse getPrintLabel(String logisticsNo);
/**
* 运费预估
*/
LogisticsFeeEstimateResponse estimateFee(LogisticsFeeEstimateRequest request);
}
// 物流适配器模式
@Component
public class LogisticsAdapterFactory {
@Autowired
private SFLogisticsService sfLogisticsService;
@Autowired
private ZTOLogisticsService ztoLogisticsService;
@Autowired
private JDLogisticsService jdLogisticsService;
public LogisticsService getLogisticsService(String companyCode) {
switch (companyCode) {
case "SF":
return sfLogisticsService;
case "ZTO":
return ztoLogisticsService;
case "JD":
return jdLogisticsService;
default:
throw new IllegalArgumentException("不支持的物流公司: " + companyCode);
}
}
}
// 顺丰物流实现
@Service
@Slf4j
public class SFLogisticsServiceImpl implements LogisticsService {
@Value("${sf.client-code}")
private String clientCode;
@Value("${sf.check-word}")
private String checkWord;
@Override
public LogisticsOrderResponse createOrder(LogisticsOrderRequest request) {
try {
// 构建顺丰请求
SFOrderRequest sfRequest = convertToSFRequest(request);
// 添加签名
String timestamp = String.valueOf(System.currentTimeMillis());
String sign = generateSFSign(sfRequest, timestamp);
sfRequest.setSign(sign);
sfRequest.setTimestamp(timestamp);
// 调用顺丰API
SFOrderResponse sfResponse = sfClient.createOrder(sfRequest);
// 处理响应
if ("OK".equals(sfResponse.getApiResultCode())) {
LogisticsOrderResponse response = new LogisticsOrderResponse();
response.setSuccess(true);
response.setLogisticsNo(sfResponse.getLogisticsNo());
response.setWaybillNo(sfResponse.getWaybillNo());
response.setLabelUrl(sfResponse.getLabelUrl());
response.setEstimatedCost(sfResponse.getEstimatedCost());
// 记录物流订单
saveLogisticsOrder(request, response);
return response;
} else {
throw new LogisticsException("顺丰下单失败: " + sfResponse.getApiErrorMsg());
}
} catch (Exception e) {
log.error("顺丰物流下单失败", e);
throw new LogisticsException("物流下单失败", e);
}
}
@Override
public LogisticsTrackResponse queryTrack(String logisticsNo) {
try {
// 构建查询请求
SFTrackRequest trackRequest = new SFTrackRequest();
trackRequest.setTrackingNumber(logisticsNo);
trackRequest.setMethodType(1); // 1:顺丰运单号
// 调用查询接口
SFTrackResponse trackResponse = sfClient.queryRoute(trackRequest);
// 转换响应
LogisticsTrackResponse response = new LogisticsTrackResponse();
response.setSuccess(true);
response.setLogisticsNo(logisticsNo);
response.setCurrentStatus(trackResponse.getMailStatus());
List<LogisticsTrackDetail> trackDetails = new ArrayList<>();
for (SFRoute route : trackResponse.getRoutes()) {
LogisticsTrackDetail detail = new LogisticsTrackDetail();
detail.setTrackTime(route.getAcceptTime());
detail.setTrackDesc(route.getRemark());
detail.setTrackLocation(route.getAcceptAddress());
detail.setTrackStatus(route.getOpCode());
trackDetails.add(detail);
}
response.setTrackDetails(trackDetails);
return response;
} catch (Exception e) {
log.error("顺丰物流轨迹查询失败", e);
throw new LogisticsException("轨迹查询失败", e);
}
}
// 生成顺丰签名
private String generateSFSign(SFOrderRequest request, String timestamp) {
String source = clientCode + request.getOrderId() + timestamp + checkWord;
return DigestUtils.md5Hex(source).toUpperCase();
}
}
6.2 内部微服务接口设计
6.2.1 服务间通信协议
┌─────────────────────────────────────────────────────────────────────┐
│ 微服务通信协议设计 │
├──────────────┬─────────────────────┬─────────────────┬─────────────┤
│ 通信方式 │ 使用场景 │ 技术实现 │ 协议规范 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ HTTP REST │ 同步查询/简单操作 │ Spring Cloud │ RESTful API │
│ │ 外部系统集成 │ OpenFeign │ JSON格式 │
│ │ 管理后台调用 │ 负载均衡 │ HTTPS安全 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ RPC调用 │ 高性能内部调用 │ gRPC │ Protobuf │
│ │ 服务间强依赖 │ Dubbo │ 二进制协议 │
│ │ 批量数据处理 │ 连接池管理 │ 服务治理 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ 消息队列 │ 异步解耦 │ RabbitMQ │ AMQP协议 │
│ │ 事件驱动 │ Kafka │ 发布订阅 │
│ │ 流量削峰 │ 持久化存储 │ 消息确认 │
├──────────────┼─────────────────────┼─────────────────┼─────────────┤
│ WebSocket │ 实时通知 │ Netty │ WS/WSS │
│ │ 数据推送 │ STOMP │ 心跳检测 │
│ │ 即时通讯 │ SockJS │ 连接管理 │
└──────────────┴─────────────────────┴─────────────────┴─────────────┘
6.2.2 订单服务接口设计
// 订单服务API定义
@RestController
@RequestMapping("/api/orders")
@Validated
@Slf4j
public class OrderController {
@Autowired
private OrderService orderService;
/**
* 创建订单
*/
@PostMapping
@Operation(summary = "创建订单", description = "客户或门店创建新订单")
public ApiResponse<OrderDTO> createOrder(
@Valid @RequestBody CreateOrderRequest request,
@RequestHeader("X-User-Id") Long userId) {
log.info("创建订单请求: userId={}, request={}", userId, request);
// 设置创建人
request.setCreateBy(userId);
// 调用订单服务
OrderDTO order = orderService.createOrder(request);
return ApiResponse.success(order);
}
/**
* 查询订单列表
*/
@GetMapping
@Operation(summary = "查询订单列表", description = "根据条件查询订单列表")
public ApiResponse<PageResult<OrderDTO>> queryOrders(
@ModelAttribute OrderQueryRequest queryRequest,
@RequestHeader("X-User-Id") Long userId,
@RequestHeader("X-Role-Code") String roleCode) {
log.info("查询订单列表: userId={}, query={}", userId, queryRequest);
// 设置数据权限
queryRequest.setUserId(userId);
queryRequest.setRoleCode(roleCode);
// 查询订单
PageResult<OrderDTO> result = orderService.queryOrders(queryRequest);
return ApiResponse.success(result);
}
/**
* 获取订单详情
*/
@GetMapping("/{orderNo}")
@Operation(summary = "获取订单详情", description = "根据订单号获取订单详细信息")
public ApiResponse<OrderDetailDTO> getOrderDetail(
@PathVariable String orderNo,
@RequestHeader("X-User-Id") Long userId) {
log.info("获取订单详情: orderNo={}, userId={}", orderNo, userId);
// 验证订单访问权限
orderService.checkOrderAccessPermission(orderNo, userId);
// 获取订单详情
OrderDetailDTO orderDetail = orderService.getOrderDetail(orderNo);
return ApiResponse.success(orderDetail);
}
/**
* 取消订单
*/
@PostMapping("/{orderNo}/cancel")
@Operation(summary = "取消订单", description = "取消指定订单")
public ApiResponse<Void> cancelOrder(
@PathVariable String orderNo,
@Valid @RequestBody CancelOrderRequest request,
@RequestHeader("X-User-Id") Long userId) {
log.info("取消订单: orderNo={}, userId={}, reason={}",
orderNo, userId, request.getCancelReason());
// 设置取消人
request.setCancelBy(userId);
// 取消订单
orderService.cancelOrder(orderNo, request);
return ApiResponse.success();
}
/**
* 确认订单
*/
@PostMapping("/{orderNo}/confirm")
@Operation(summary = "确认订单", description = "确认订单进入分拣流程")
public ApiResponse<Void> confirmOrder(
@PathVariable String orderNo,
@RequestHeader("X-User-Id") Long userId) {
log.info("确认订单: orderNo={}, userId={}", orderNo, userId);
// 确认订单
orderService.confirmOrder(orderNo, userId);
return ApiResponse.success();
}
/**
* 订单状态变更历史
*/
@GetMapping("/{orderNo}/status-history")
@Operation(summary = "订单状态历史", description = "获取订单状态变更历史")
public ApiResponse<List<OrderStatusHistoryDTO>> getStatusHistory(
@PathVariable String orderNo) {
log.info("获取订单状态历史: orderNo={}", orderNo);
List<OrderStatusHistoryDTO> history = orderService.getStatusHistory(orderNo);
return ApiResponse.success(history);
}
}
// 订单服务内部接口(供其他服务调用)
@FeignClient(name = "order-service", path = "/internal/orders")
public interface OrderInternalService {
/**
* 根据订单号获取订单信息
*/
@GetMapping("/{orderNo}")
OrderDTO getOrderByNo(@PathVariable("orderNo") String orderNo);
/**
* 锁定订单库存
*/
@PostMapping("/{orderNo}/lock-inventory")
ApiResponse<Void> lockOrderInventory(@PathVariable("orderNo") String orderNo);
/**
* 确认订单库存
*/
@PostMapping("/{orderNo}/confirm-inventory")
ApiResponse<Void> confirmOrderInventory(@PathVariable("orderNo") String orderNo);
/**
* 扣减订单库存
*/
@PostMapping("/{orderNo}/deduct-inventory")
ApiResponse<Void> deductOrderInventory(@PathVariable("orderNo") String orderNo);
/**
* 获取订单商品明细
*/
@GetMapping("/{orderNo}/items")
List<OrderItemDTO> getOrderItems(@PathVariable("orderNo") String orderNo);
/**
* 更新订单支付状态
*/
@PutMapping("/{orderNo}/payment-status")
ApiResponse<Void> updatePaymentStatus(
@PathVariable("orderNo") String orderNo,
@RequestBody UpdatePaymentStatusRequest request);
}
6.2.3 库存服务接口设计
// 库存服务API定义
@RestController
@RequestMapping("/api/inventory")
@Validated
@Slf4j
public class InventoryController {
@Autowired
private InventoryService inventoryService;
/**
* 查询商品库存
*/
@GetMapping("/products/{productId}")
@Operation(summary = "查询商品库存", description = "查询指定商品在各仓库的库存情况")
public ApiResponse<List<InventoryDTO>> getProductInventory(
@PathVariable Long productId,
@RequestParam(required = false) Long warehouseId) {
log.info("查询商品库存: productId={}, warehouseId={}", productId, warehouseId);
List<InventoryDTO> inventoryList = inventoryService.getProductInventory(
productId, warehouseId);
return ApiResponse.success(inventoryList);
}
/**
* 查询可用库存
*/
@GetMapping("/available")
@Operation(summary = "查询可用库存", description = "查询商品在指定仓库的可用库存数量")
public ApiResponse<Integer> getAvailableInventory(
@RequestParam Long productId,
@RequestParam Long warehouseId) {
log.info("查询可用库存: productId={}, warehouseId={}", productId, warehouseId);
Integer availableQuantity = inventoryService.getAvailableInventory(
productId, warehouseId);
return ApiResponse.success(availableQuantity);
}
/**
* 锁定库存
*/
@PostMapping("/lock")
@Operation(summary = "锁定库存", description = "锁定指定数量的库存")
public ApiResponse<LockInventoryResult> lockInventory(
@Valid @RequestBody LockInventoryRequest request) {
log.info("锁定库存请求: {}", request);
LockInventoryResult result = inventoryService.lockInventory(request);
return ApiResponse.success(result);
}
/**
* 释放锁定库存
*/
@PostMapping("/release")
@Operation(summary = "释放锁定库存", description = "释放已锁定的库存")
public ApiResponse<Void> releaseInventory(
@Valid @RequestBody ReleaseInventoryRequest request) {
log.info("释放库存请求: {}", request);
inventoryService.releaseInventory(request);
return ApiResponse.success();
}
/**
* 扣减库存
*/
@PostMapping("/deduct")
@Operation(summary = "扣减库存", description = "扣减实际库存数量")
public ApiResponse<Void> deductInventory(
@Valid @RequestBody DeductInventoryRequest request) {
log.info("扣减库存请求: {}", request);
inventoryService.deductInventory(request);
return ApiResponse.success();
}
/**
* 增加库存
*/
@PostMapping("/increase")
@Operation(summary = "增加库存", description = "增加库存数量")
public ApiResponse<Void> increaseInventory(
@Valid @RequestBody IncreaseInventoryRequest request) {
log.info("增加库存请求: {}", request);
inventoryService.increaseInventory(request);
return ApiResponse.success();
}
/**
* 库存流水查询
*/
@GetMapping("/flow")
@Operation(summary = "库存流水查询", description = "查询库存变动流水记录")
public ApiResponse<PageResult<InventoryFlowDTO>> queryInventoryFlow(
@ModelAttribute InventoryFlowQueryRequest queryRequest) {
log.info("库存流水查询: {}", queryRequest);
PageResult<InventoryFlowDTO> result = inventoryService.queryInventoryFlow(queryRequest);
return ApiResponse.success(result);
}
}
// 库存服务内部接口(供其他服务调用)
@FeignClient(name = "inventory-service", path = "/internal/inventory")
public interface InventoryInternalService {
/**
* 批量查询库存
*/
@PostMapping("/batch-query")
List<InventoryDTO> batchQueryInventory(@RequestBody List<InventoryQuery> queries);
/**
* 安全扣减库存(防超卖)
*/
@PostMapping("/safe-deduct")
ApiResponse<Boolean> safeDeductInventory(@RequestBody SafeDeductRequest request);
/**
* 检查库存是否充足
*/
@PostMapping("/check-sufficient")
ApiResponse<Boolean> checkInventorySufficient(@RequestBody InventoryCheckRequest request);
/**
* 获取批次库存信息
*/
@GetMapping("/batch/{batchId}")
BatchInventoryDTO getBatchInventory(@PathVariable("batchId") Long batchId);
/**
* 库存预警检查
*/
@PostMapping("/alert-check")
List<InventoryAlertDTO> checkInventoryAlert(@RequestBody AlertCheckRequest request);
/**
* 更新库存成本
*/
@PutMapping("/cost")
ApiResponse<Void> updateInventoryCost(@RequestBody UpdateCostRequest request);
}
6.3 数据交换格式规范
6.3.1 API响应格式
{
"code": 200,
"message": "操作成功",
"data": {
"orderId": 100001,
"orderNo": "SO202401150001",
"customerId": 1001,
"customerName": "张三",
"totalAmount": 258.60,
"actualAmount": 258.60,
"orderStatus": 1,
"orderStatusDesc": "待确认",
"orderTime": "2024-01-15 10:30:25",
"items": [
{
"productId": 10001,
"productName": "有机西红柿",
"quantity": 2,
"unit": "斤",
"price": 8.50,
"subtotal": 17.00
},
{
"productId": 10002,
"productName": "土鸡蛋",
"quantity": 1,
"unit": "盒",
"price": 25.00,
"subtotal": 25.00
}
]
},
"timestamp": 1705293025000,
"requestId": "req_abc123def456"
}
6.3.2 错误响应格式
{
"code": 40001,
"message": "库存不足",
"data": {
"productId": 10001,
"productName": "有机西红柿",
"requiredQuantity": 100,
"availableQuantity": 85,
"shortageQuantity": 15
},
"timestamp": 1705293025000,
"requestId": "req_abc123def456",
"errorDetails": [
{
"field": "quantity",
"message": "库存不足,最多可购买85件"
}
]
}
6.3.3 分页响应格式
{
"code": 200,
"message": "查询成功",
"data": {
"list": [
{
"orderId": 100001,
"orderNo": "SO202401150001",
"customerName": "张三",
"totalAmount": 258.60,
"orderStatus": 1,
"orderTime": "2024-01-15 10:30:25"
},
{
"orderId": 100002,
"orderNo": "SO202401150002",
"customerName": "李四",
"totalAmount": 152.80,
"orderStatus": 2,
"orderTime": "2024-01-15 11:15:30"
}
],
"pagination": {
"pageNum": 1,
"pageSize": 20,
"total": 125,
"pages": 7
},
"summary": {
"totalAmount": 12580.50,
"totalOrders": 125,
"avgAmount": 100.64
}
},
"timestamp": 1705293025000,
"requestId": "req_abc123def456"
}
总结
通过对升鲜宝供应链管理系统的四篇系列文章的深度分析,我们提取并设计了超过300个业务表,构建了完整的实体关系模型,详细分析了核心业务流程和数据流。系统采用微服务架构,基于Vue3+Spring Boot3技术栈,实现了生鲜供应链的全链路数字化管理。
关键设计要点总结:
- 模块化设计:系统划分为12个核心业务域,每个域有清晰的职责边界
- 数据一致性保障:通过事务、锁机制、事件驱动等方式保证数据一致性
- 高性能架构:采用读写分离、缓存策略、分库分表等优化手段
- 可扩展性:微服务架构支持水平扩展,容器化部署支持弹性伸缩
- 安全性设计:多层次安全防护,包括数据加密、权限控制、审计日志等
- 可维护性:完善的监控体系、日志管理、配置管理支持系统稳定运行
业务价值体现:
- 全流程覆盖:从供应商到客户的全链条业务管理
- 实时可视:库存、订单、配送等业务状态实时可视
- 智能决策:通过数据分析提供采购、库存、配送等智能决策支持
- 成本控制:精细化成本核算和费用管控
- 客户体验:精准配送、灵活订购、全程追溯提升客户满意度
本设计方案为实际系统开发提供了详细的技术指导,开发团队可根据此设计进行具体的编码实现和系统部署。在实际实施过程中,建议根据具体业务需求进行适当的调整和优化。
UI设计截图(纯个人研究非商业用途):




官方参考文章(如果有商业需求,请到下面官网文章里找):
- 升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0 uniapp、vue、android、web 框架: Vue3+Spring Boot3) ,界面功能(一)
- 升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0 uniapp、vue、android、web 框架: Vue3+Spring Boot3) ,界面功能(二)
- 升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0 uniapp、vue、android、web 框架: Vue3+Spring Boot3) ,界面功能(三)
- 升鲜宝供应链管理系统重构版发布(技术点:Java8、mysql8.0 uniapp、vue、android、web 框架: Vue3+Spring Boot3) ,界面功能升级(四)
更多推荐





所有评论(0)