feat(return): 逆向物流数据模型与迁移

新增原单退回与不良品在管的持久化结构。

- TransOutbound 增 returned_quantity(numeric(19,4),非 float):该值参与
  「return_qty <= quantity - returned_quantity」判等,浮点误差会让反复部分
  退回后出现「已退满却判定未退满」的错判
- 新增 TransReturn:退回流水,每次退回写一条而非覆盖式更新。刻意与
  trans_borrow 划清界限——后者部分归还时会覆盖 return_time/operator,
  导致归还历史永久丢失
- 新增 TransDefectiveGoods:不良品在管台账。坏件全程不入库存表,因为
  status 是行级属性而质量是件级属性,把坏件加回原行只能整行打不良
  (实测 stock_buy 单行最大 4789 件、中位 8 件,整行打不良会凭空损失良品)
- 状态机:待处理 → 处理中 → {已回库|已报废|已闭环}。终态由累计去向推导
  而非「最后一次动作」——一批坏件可能既回库过又报废过,按最后动作定状态
  会产生误导
- restocked_qty/scrapped_qty 两列:二期用 quantity-remaining_qty 反推回库量,
  三期加入报废出口后该反推失效
- 审计白名单与模型预加载同步登记(监听器绑定 18 → 20 个模型)

迁移脚本均为纯追加式 DDL,含预检、回滚段与执行后核对。首个脚本用
COALESCE 包裹数量列——库存表允许数量为 NULL,而「NULL 大于 0」求值为
NULL 而非真,裸写会让脏行在预览与诊断两次查询里凭空消失。
This commit is contained in:
yueli
2026-09-16 15:45:11 +08:00
parent fbc9296056
commit 69c38a1bf7
6 changed files with 447 additions and 2 deletions

View File

@ -41,6 +41,8 @@ WHITELIST_TABLES = {
'trans_borrow',
'trans_scrap',
'trans_repair',
'trans_return', # 原单退回流水(二期)
'trans_defective_goods', # 不良品在管台账(二期)
# --- 库存(三表 + 库存调整)---
'stock_buy',
'stock_semi',
@ -66,6 +68,8 @@ TABLE_LABELS = {
'trans_borrow': '借还流水',
'trans_scrap': '报废流水',
'trans_repair': '维修单',
'trans_return': '退回流水',
'trans_defective_goods': '不良品在管',
'stock_buy': '采购库存',
'stock_semi': '半成品库存',
'stock_product': '成品库存',
@ -185,6 +189,8 @@ def _get_module_name(mapper):
return '报废管理'
if tablename == 'trans_repair':
return '维修管理'
if tablename in ('trans_return', 'trans_defective_goods'):
return '退回管理'
if tablename in ('stock_buy', 'stock_semi', 'stock_product'):
return '库存管理'
if tablename == 'stock_adjustment':