商品管理页面业务逻辑与数据表关系分析
分析范围:供应链管理后台 /pms/pmsgoods 列表,以及从该列表进入的商品新增、修改、详情、展开卖法、导入导出和价格调整。依据当前工作区源码分析;运行中的 API 不一定包含工作区尚未部署的改动。以下关系是代码中的业务关联,不代表数据库均已建立物理外键。
核心关系
#mermaid-svg-bPZFzvkL7mmp1khS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bPZFzvkL7mmp1khS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bPZFzvkL7mmp1khS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bPZFzvkL7mmp1khS .error-icon{fill:#552222;}#mermaid-svg-bPZFzvkL7mmp1khS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bPZFzvkL7mmp1khS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bPZFzvkL7mmp1khS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bPZFzvkL7mmp1khS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bPZFzvkL7mmp1khS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bPZFzvkL7mmp1khS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bPZFzvkL7mmp1khS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bPZFzvkL7mmp1khS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bPZFzvkL7mmp1khS .marker.cross{stroke:#333333;}#mermaid-svg-bPZFzvkL7mmp1khS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bPZFzvkL7mmp1khS p{margin:0;}#mermaid-svg-bPZFzvkL7mmp1khS .entityBox{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-bPZFzvkL7mmp1khS .relationshipLabelBox{fill:hsl(80, 100%, 96.2745098039%);opacity:0.7;background-color:hsl(80, 100%, 96.2745098039%);}#mermaid-svg-bPZFzvkL7mmp1khS .relationshipLabelBox rect{opacity:0.5;}#mermaid-svg-bPZFzvkL7mmp1khS .labelBkg{background-color:rgba(248.6666666666, 255, 235.9999999999, 0.5);}#mermaid-svg-bPZFzvkL7mmp1khS .edgeLabel .label{fill:#9370DB;font-size:14px;}#mermaid-svg-bPZFzvkL7mmp1khS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bPZFzvkL7mmp1khS .edge-pattern-dashed{stroke-dasharray:8,8;}#mermaid-svg-bPZFzvkL7mmp1khS .node rect,#mermaid-svg-bPZFzvkL7mmp1khS .node circle,#mermaid-svg-bPZFzvkL7mmp1khS .node ellipse,#mermaid-svg-bPZFzvkL7mmp1khS .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bPZFzvkL7mmp1khS .relationshipLine{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-bPZFzvkL7mmp1khS .marker{fill:none!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-bPZFzvkL7mmp1khS .edgeLabel{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bPZFzvkL7mmp1khS .edgeLabel .label rect{fill:rgba(232,232,232, 0.8);}#mermaid-svg-bPZFzvkL7mmp1khS .edgeLabel .label text{fill:#333;}#mermaid-svg-bPZFzvkL7mmp1khS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} parent_id
category_id
brand_id
goods_id
goods_id
unit_id2(当前单位)
unit_id(最小单位)
product_sku_id
unit_id
goods_id
goods_id
goods_id
sku_unit_id
sku_unit_id
pms_goods_category
pms_goods
pms_brand
pms_goods_sku
pms_goods_unit_relation
pms_goods_unit
pms_goods_sku_unit
pms_goods_media
pms_goods_supplier
pms_goods_service
cus_customer_grade_price
cus_customer_grade_price_log
| 表 | 作用与关键关系 |
|---|---|
pms_goods |
商品主档,包含商品编码、名称、分类、品牌、启停、上下架、组织和版本。category_id 指向分类,brand_id 指向品牌。 |
pms_goods_category |
分类档案;parent_id 形成父子分类。商品应引用末级分类。当前实体仍有 level,列表查询和部分导入仍按两级展示,不能认为层级字段迁移已完成。 |
pms_goods_sku |
商品规格,goods_id 指向商品;维护规格名称、规格编码、条码及状态。一件商品可以有多个规格。 |
pms_goods_unit |
单位基础资料,维护单位名称和计量类型;代码定义 meter_type:0 计重、1 计件。 |
pms_goods_unit_relation |
某商品使用哪些单位及其换算和用途。goods_id 指向商品,unit_id2 是本行单位,unit_id 指向共同的最小单位;major 标记最小单位,unit_relation 是换算率,orderable、purchaseable、inv_type 分别控制销售、采购和库存用途。 |
pms_goods_sku_unit |
规格与销售单位形成的卖法。product_sku_id 指向规格,unit_id 指向销售单位;该表自身 id 即 sku_unit_id,是价格组价和其他业务引用的卖法标识。维护统一订货价、公开价、最低销售价、采购价、成本价、长宽高、体积、重量及加工属性等。 |
pms_goods_media |
商品主图、其他图片和视频,按 goods_id 关联;media_type 区分媒体类型,major 标识主图。 |
pms_brand |
品牌基础资料;商品通过 brand_id 引用。 |
pms_goods_supplier、sup_supplier |
商品与供应商关系及供应商资料,前者以 goods_id、supplier_id 关联。 |
pms_goods_service |
商品与服务保障的关联记录,以 goods_id、service_id 关联。 |
cus_customer_grade、cus_customer_grade_price、cus_customer_grade_price_log |
价格组、价格组对应卖法的价格及其变更记录。价格和日志按 customer_grade_id、sku_unit_id 关联;实体中的 productSkuId、unitId 不能直接当作该价格实体的持久化外键字段。 |
举例:商品"西红柿"有"小果""大果"两个规格;单位关系允许"斤、箱"销售,并规定 1 箱换算成多少斤。每个规格可以分别配置按斤和按箱的销售卖法;价格是针对具体卖法设置,而不是只存到商品名称上。
页面功能与数据流
- 列表和筛选 :
GET /pms/goods/page。分页 SQL 从pms_goods出发,连接分类及其上级、品牌、创建和修改用户,并汇总pms_goods_media主图;按商品名称/助记码、编码、产地、分类、品牌、采购类型、商品属性、上架和启用状态过滤。服务端应用当前用户机构范围;机构范围为空时不返回全表。当前列表分类筛选针对根分类及其直接子分类,不应当作任意深度树已完整支持。 - 展开商品 :
GET /pms/goods/{id}/unit-configuration,先校验商品数据范围,再读取商品详情中的单位关系、规格、卖法及价格组信息。列表摘要与展开明细分开加载。 - 新增和修改 :
POST /pms/goods、PUT /pms/goods/{id},通过聚合请求维护主档、规格卖法、单位关系、图片、供应商和服务等。校验分类、单位、规格、价格、机构权限;修改使用商品版本号防并发覆盖,聚合写入位于事务中。 - 价格维护 :展开行可修改卖法的统一订货价、最低销售价和公开价,也可查看价格组价格;各按钮分别校验权限,卖法价格由
sku_unit_id指向,修改携带商品版本。 - 上下架和启停 :单条及批量上下架使用
/pms/goods/{id}/shelves和/pms/goods/batch/shelves;启停使用/pms/goods/{id}/status。停用商品不能上架;上架要求有效规格和卖法,并检查价格及供应方式;上架中的商品须先下架才能停用。 - 删除 :
DELETE /pms/goods/{id},必须提供版本号;已上架商品先下架,且后端会检查订单、库存、客户价格及其他业务引用,不能只看页面按钮是否可点。数据表大量使用del_flag,实际清理须遵循业务引用校验。 - 导入导出:页面提供商品资料、库存策略、销售卖法三类导入;商品导入有预览校验和执行阶段,并可补建分类、单位。导出提交后台任务,页面检查任务进度并下载。不同模板的字段和覆盖范围应分别核对。
关键约束与值得关注的问题
- 商品至少一个单位关系,且只能有一个最小单位;最小单位自身换算率为 1,其他单位换算到同一最小单位。代码要求至少一个销售、采购、库存单位,卖法单位必须标记可销售,指定的库存单位必须标记可库存。
- 分类父子关系与
level并存;当前列表、分类维护和部分导入仍有两级假设。用户要求移除level的改造尚不能仅凭此页面视为完成。 - 本页分页 SQL 对分类使用内连接:商品分类不存在或已删除时,该商品不会出现在普通列表中,排查"商品丢失"应同时核对分类数据和机构权限。
- 在供应链其他业务选择器中,销售、采购、库存的用途应由对应单位关系属性控制。此前排查记录提示部分采购/库存查询仍从卖法表出发,不能把本页模型校验等同于全系统选择器均已正确。
- 商品删除检查覆盖多类业务引用,包括
oms_order_bill_info、采购明细、仓储库存及流水、生产 BOM、客户价格等;这些是下游业务表,并非列表分页 SQL 每次都会直接读取。完整引用范围以PmsGoodsDao.xml中countGoodsBusinessReferences为准。 - 此文描述源码与主要关系,并非每个外围表和所有历史数据的穷尽清单,也不代表逐按钮及端到端测试全部通过。
源码定位
- 前端列表:
wuhan-loveinway-admin-ui/loveinway-admin/src/views/pms/pmsgoods.vue - 页面 API:
wuhan-loveinway-admin-ui/loveinway-admin/src/views/pms/api/goods.ts - 后端入口:
wuhan-scm--admin--huazhi/loveinway-admin/src/main/java/com/loveinway/modules/pms/controller/PmsGoodsManageController.java - 查询及权限:
wuhan-scm--admin--huazhi/loveinway-admin/src/main/java/com/loveinway/modules/pms/service/PmsGoodsQueryService.java - 写入规则:
wuhan-scm--admin--huazhi/loveinway-admin/src/main/java/com/loveinway/modules/pms/service/PmsGoodsAggregateValidator.java、PmsGoodsCommandService.java - 列表 SQL 与引用:
wuhan-scm--admin--huazhi/loveinway-admin/src/main/resources/mapper/pms/PmsGoodsDao.xml