b998b00889
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 执行,核对段全部通过。
2026-09-17 09:17:51 +08:00
9eb4792d4a
feat(return): 退回流水看板接口与权限收口
...
新增只读台账接口:
- GET /api/v1/outbound/returns 退回流水(分页 + 关键词 + 类型 + 时间过滤)
返回 原出库单号 / 物料名称 / 规格 / SKU / 退回类型 / 退回数量 / 原因 /
操作人 / 退回时间 / 公司。出库单号经 trans_outbound 批量补齐,物料名按
多态来源批量解析,均为批量查询无 N+1。
权限收口(配合 db_migrations 里的三个权限码):
- return-from-outbound inventory_stocktake:operation -> outbound_return
- GET /stock/defective inventory_stocktake -> defective_list
- restock inventory_stocktake:operation -> defective_restock
- scrap inventory_stocktake:operation -> defective_scrap
- change-status inventory_stocktake:operation -> stock_change_status
原先这四个接口搭的是「盲盘作业」权限的便车,职责错配、审计不合规。
实测 SALES(销售)角色持有 inventory_stocktake,意味着销售人员能读整份
不良品台账——与业务对台账可见性的要求不符。全部改用无冒号专用码后,
实测「只授予 inventory_stocktake:operation」对四个接口均返回 403,便车已封。
trans_return 补 company_name 快照:
退回流水的隔离判定原先只能靠 join 链推,而库存行会被入库模块物理删除
(实测 1077 条出库记录中已有 7 条悬空),链路一断记录就会对普通用户
静默消失。改由退回时落快照,隔离不再依赖任何 join。
2026-09-16 16:45:52 +08:00
69c38a1bf7
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 而非真,裸写会让脏行在预览与诊断两次查询里凭空消失。
2026-09-16 15:45:22 +08:00
98e657e289
fix(scrap): TransScrap 补 scrap_request_no 列映射
...
报废执行写台账时以关键字传入 scrap_request_no,但该列只存在于 DB
(db_migrations/add_scrap_approval.sql)而未在 ORM 声明,执行报废必然抛
TypeError: 'scrap_request_no' is an invalid keyword argument for TransScrap,
被 500 捕获后连同库存扣减一起回滚,整条按单报废链路不可用。
2026-09-10 10:14:14 +08:00
b274ed1ed1
feat: TransBorrow 归还人 to_dict 自动把数字 user id 映射为用户名(历史记录不再显示数字,lru_cache 防 N+1)
2026-09-04 16:12:36 +08:00
1527d552d4
feat: 出库/借库记录记录并展示库位快照(DB加列+后端写入+记录页展示)
2026-09-04 11:42:44 +08:00
3085d9f447
feat(repair): decouple material base, sync global sku sequence and add scan/print features
2026-04-08 19:36:14 +08:00
ec468b266d
refactor(repair): upgrade TransRepair model with base_id, status, and SN for independent operation
2026-04-08 18:23:22 +08:00
79d4a365e0
feat: add partial return support with returned_quantity tracking
2026-03-18 10:41:19 +08:00
cd192624b9
fix: 统一系统生成时间为北京时间(UTC+8)并优化审计日志表格列展示
2026-03-10 17:33:14 +08:00
cc33108e88
feat: add TransBorrow.get_borrowed_quantity method
...
Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) <aider@aider.chat >
2026-02-28 11:43:10 +08:00
164988ab62
(no commit message provided)
...
Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) <aider@aider.chat >
2026-02-09 11:59:35 +08:00
b57e9f5bba
(no commit message provided)
...
Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) <aider@aider.chat >
2026-02-09 11:50:03 +08:00
c06b96f149
(no commit message provided)
...
Co-authored-by: aider (openai/DeepSeek-V3.2-Thinking) <aider@aider.chat >
2026-02-09 11:44:24 +08:00
04ee938cd1
借库逻辑实现
2026-02-06 17:11:47 +08:00
fd5600b65b
修改登录退出逻辑
2026-02-04 14:29:59 +08:00
13590b1fac
超级管理员登录设置
2026-02-04 13:30:07 +08:00
ee9f4aed3e
修正git管理关系
2026-01-26 13:47:53 +08:00