feat(borrow): 借库转交一期数据层(迁移、转交/归还流水表、发货操作人列)

背景
----
原 trans_borrow 是单行记录模式,身份维度只有 borrower_name 一个字符串:
「谁借的」与「谁现在还拿着」是同一个字段,无法表达持有权变更;归还时
return_time/return_operator/return_signature 被逐次覆盖,部分归还下
「谁在什么时候还了多少」永久丢失。

本次改动(全部增量,无破坏性 DDL,可回滚)
----
1) trans_borrow 补列
   · borrower_id / current_holder_id / current_holder_name —— 身份锚点
   · dispatch_operator —— 执行借出的库管(operator_name 形参此前被接收却从未落库)
2) 新建 trans_borrow_transfer —— 转交流水,一行=一次转交,不做覆盖式更新
3) 新建 trans_borrow_return   —— 归还流水,逐次记录,根治部分归还失忆症
4) 历史回填(已执行):85 行中 84 行 borrower_id 唯一命中 sys_user;
   未归还的 32 行全部绑定 current_holder
5) 注册 borrow_transfer 权限码(无冒号形式,避免 _expand_operation_perms
   前缀桥接把权限放大给所有持有 op_borrow:operation 的角色)

设计取舍
----
· current_holder 只回填「未归还」行:已归还=物品已回库、无人持有,保持 NULL。
  这样「current_holder_id IS NOT NULL」本身就是「仍在某人手上」的有效信号,
  归还校验不会对已结清单据误触发。
· 三张表都不建外键:与 trans_return / trans_defective_goods 一致 ——
  库存行会被入库模块物理删除(实测已有悬空),台账必须能独立存活。
· dispatch_operator 不回填历史:执行人信息从未被采集,系统中不存在可回填的
  数据源;用申请人或借用人冒充实物交接人比留空更危险。

验证:迁移已对 inventory_db 执行,核对段全部通过。
This commit is contained in:
yueli
2026-09-17 09:17:51 +08:00
parent f4a01be951
commit b998b00889
4 changed files with 434 additions and 0 deletions

View File

@ -314,9 +314,12 @@ def create_app():
# 预加载:审计监听器按表名从 db.metadata 取模型,未预加载的表在
# create_app() 完成时尚未映射,会漏绑审计(虽然后续惰性补绑能兜底,
# 但预加载更可靠)。
# ★ TransBorrowTransfer / TransBorrowReturn 为一期借库转交新增,
# 同理必须预加载 —— 转交与归还都是责任链上的关键动作,审计绝不能漏。
from app.models.transaction import (
TransBorrow, TransRepair, TransScrap,
TransReturn, TransDefectiveGoods,
TransBorrowTransfer, TransBorrowReturn,
)
# ★ 审批单模型(原仅在函数体内延迟导入,会导致审计监听器漏绑)
from app.models.outbound import OutboundApproval