|
|
b313fefdfa
|
fix(web): 扫码页与备选库位带单据ID,按有效可用量限流
配合后端预占回加:扫码/借库/审批页面调用 /outbound/scan 与 /outbound/alternatives
时带上本单 id 与 biz_type,拿到的 available_quantity 即为「实时可用量 + 本单
预占」,本单锁定的行不会再因实时可用量为 0 而被拦住或从列表消失。
后端已在响应边界完成归一化,故前端模板与校验逻辑(:max、库存列展示、超量
警告、草稿存取)一律不动,只多传参数 —— 避免把同一语义散落到多个读写点。
- api/outbound.ts:getStockByBarcode / getStockAlternatives 加 requestId 与
bizType 参数,导出 ScanBizType,ScanResult 补 reserved_quantity 等字段
- api/transaction.ts:同名的历史副本同步签名(当前无调用方,加注释指向唯一来源)
- views/outbound/create.vue、views/transaction/borrow.vue:各 3 处调用点带上
单据 id;refreshStockFromDraft 改为显式透传 id,不依赖 computed 已解析
- views/borrow/approval/index.vue:审批页也带上本单 id,否则待审批单
(预占已生效)锁定的行会因实时可用量为 0 而从备选列表消失
借库侧 request_id 是 BorrowApproval.id,靠 biz_type='borrow' 与出库单区分 ——
两张表 ID 空间独立,不可省。
|
2026-09-11 10:34:23 +08:00 |
|
|
|
f8267c6ee2
|
style(borrow): 审批页物料明细数量前置,清单标题对齐出库
背景
----
借库审批页展开行的「计划数量」排在表格最右(库位之后),与扫码出库页
的前置做法不一致 —— 列多时容易被容器裁掉,工人看不到数量。
改动
----
· 计划数量从最右移到序号之后,橙色加粗 + 字号 15px;
· 清单标题由朴素文字改为与出库页同款的标题栏结构
(planned-header + planned-title + 绿色标签);
· 补上 .planned-header / .planned-title 样式定义(该页原先没有)。
注:本轮定位时曾误以为这是用户反馈的「扫码借库页」,实际扫码借库页是
views/transaction/borrow.vue(见下一提交)。此处是同类问题的另一处,
一并修正,非误改。
|
2026-09-10 16:17:42 +08:00 |
|
|
|
d69ec9f5ec
|
style(outbound,borrow): 库位格子整体可点击,图标放大
问题
----
备选库位浮层的触发区原先只有一个小图标(默认 1em),工人需要精准
点击才能弹出 —— 戴手套或在触屏上操作时命中率很低。
改动
----
· #reference 从「仅图标」改为「库位文字 + 图标」整体,
点格子任意位置都能弹出;
· 悬停时整格高亮(#ecf5ff),给出可点击的视觉反馈;
· 图标放大到 18px;
· 库位文字着蓝色(#409EFF),并加 title 提示;
· 无 base_id 时回退为纯文本(历史单据)——原先这种情况下会渲染空白。
出库执行页与借库审批页同款实现,一并同步。
注:编辑过程中曾因残留旧的 popover 闭合标签导致模板结构损坏
(SFC PARSE ERR),已通过编译检查发现并修复。
|
2026-09-10 15:57:26 +08:00 |
|
|
|
dc4a0ae7a0
|
style: 统一申请单状态配色(四个页面一致)
配色方案
--------
0 待审批 → 蓝(primary,待处理)
1 已通过 → 绿(success,正向结果)
2 已驳回 → 红(danger)
3 已完成 → 灰(info,终态、不再需要关注)
4 已撤回 → 黄(warning,需留意但非错误)
范围
----
「我的申请单」新页面按上述配色实现后,发现出库/借库/报废三个审批页
仍是旧配色(0:warning, 3:info, 4:info)—— 同一套状态码在两个页面
显示不同颜色,用户来回切换会困惑。故一并统一。
改动:my-requests/index.vue(新配色)+ 三个审批页的 statusTagType。
补充:el-tag 的 primary 类型已核实可用 —— Element Plus 2.13.1 的
tagProps 中 primary 为默认值,theme-chalk/el-tag.css 含 .el-tag--primary
的蓝色样式定义;vue-tsc 类型检查通过。
|
2026-09-10 15:47:07 +08:00 |
|
|
|
d1dd3dd404
|
feat(approval): 三端审批页「撤回」入口,明确告知会释放库存
后端已支持撤回时释放预占(见上一提交),前端同步:
一、文案与语义
按钮 完结 → 撤回,颜色 danger → warning(语义从「危险操作」变为
「可逆的库存释放」)。确认弹窗明确告知会释放多少项库存:
确定撤回申请单【APR-OUT-...】吗?
撤回后该单将被作废,其预占的 5 项物料库存会立即释放,
可供其它申请使用。此操作不可恢复。
用户看到的「1 件货」背后其实是一批被锁定的库存,不写清楚会让人
以为撤回只是「关掉一张单」。
二、报废新增撤回入口
报废审批页原先只有「执行报废」,没有撤回。补上按钮 + handleWithdraw(),
并新增 API 封装 withdrawScrapRequest()。
状态映射同步补充 4: '已撤回'(statusText / statusTagType)。
三、成功提示改为透传后端消息
后端会返回「申请单已撤回,释放 N 项预占库存」,比前端写死的文案
更有信息量,故改为 res?.msg 优先、前端文案兜底。
按钮可见性沿用 row.status === 1(已通过但未执行),与后端的执行守卫
(执行成功后 status 置 3)一致,故已执行或已撤回的单不会出现该按钮。
|
2026-09-10 15:08:43 +08:00 |
|
|
|
8c18586a94
|
feat(borrow): 借库审批页备选库位,与出库保持一致
借库的执行入口在审批页 —— 展开行即为工人查看/去扫码的物料明细。
申请单已把货预占在某库位,工人现场可能进不去,需要改扫同物料的其它
批次(后端执行端按 base_id 校验身份、允许换批次),但改造前系统不告诉
他还有哪些库位有货。
复用出库模块的 /api/v1/outbound/alternatives 端点(逻辑完全一致:
按 available_quantity > 0 过滤,只给真正能拿的库位,排除已被别单占满的行),
在明细表的库位列加图标 + popover:
[推荐] L5/1/2/1 可用 840 ← 本单锁定行
[备选] L2/1/2/1 可用 1
与出库页同款取舍:
· trigger="click" —— 车间用扫码枪/触摸屏,hover 在触屏不可用
· @show 时才发请求 —— 展开单据时不会打出一片并发查询
· 附提示文案「现场取不到推荐库位时可直接扫备选库位条码借用」
注:借库申请经预占改造后 items_json 已带 base_id/stock_id/source_table,
故推荐行可正确标注;改造前的历史单无这些字段,此时全部显示为「备选」。
|
2026-09-10 15:02:22 +08:00 |
|
|
|
0a70e5688a
|
refactor(bom): 前端改为消费后端分配结果,删除本地分配与跨页数据污染
一、删除前端分配算法
Selection.vue 与 borrow/apply/index.vue 原先各自维护一套
rowsByBaseId 归并 + 跨行分配循环(近 80 行),现全部移除。
改为:构造 requirements → 调用 bomMatchStock → 直接 push 返回的 items。
二、缺料提示
后端返回 shortages 时,用 ElMessageBox.alert 逐项列出
「物料名:需 X,实配 Y,缺 Z」,替代原先笼统的「跳过 N 种缺货物料」。
全部满足则不弹窗,仅提示添加成功。
三、API 封装支持双签名(api/outbound.ts)
bomMatchStock(requirements | { requirements })
同时兼容旧的 bomMatchStock(childIds),未改造的调用方不受影响。
四、清除 loadStockForBom(两个页面)
该方法会把 BOM 匹配结果整体写入 stockList.value,而 stockList 同时是
「手动选单弹窗」的数据源 —— 操作过 BOM 后再打开手动选单,看到的会是
BOM 匹配结果而非库存列表。BOM 流程不再触碰 stockList 后,该交叉污染
一并消除,方法随之删除。
注:借库选单页存在逐字相同的 .find() + Math.min 缺陷,本次一并修复,
使两个 BOM 入口行为一致。
SFC 编译通过;vue-tsc 无新增错误(残留 6 处告警为既有问题)。
|
2026-09-10 14:16:52 +08:00 |
|
|
|
1dbf74b7bc
|
feat(borrow): 借库审批补「完结」能力(对齐出库 status=4)
- mark_completed 改为 1→4 已完结(真正扫码借出完成仍为 status=3)
- 前端审批页新增「已完结」筛选项与状态映射;审批信息列对 3/4 显示审批人
|
2026-09-10 09:47:07 +08:00 |
|
|
|
a12fcea86d
|
fix(borrow,outbound): 库管弹窗必显审批人 + HTTP400去重toast
- 审批人 el-form-item 显隐加入 role==WAREHOUSE_MGR 判断
- 提交 catch 仅对无响应(网络)弹错,HTTP错误由全局拦截器按后端 data.msg 弹一次,避免重复
|
2026-09-09 16:19:45 +08:00 |
|
|
|
e622697d7c
|
feat(borrow): 借库申请前端必填拦截与星标——申请原因、预计归还日期(长期借用除外)
- 提交前拦截:申请原因为空或(未勾长期借用且无归还日期)提示并 return
- 表单加必填星标:申请原因恒必填;预计归还日期仅在非长期借用时 required
|
2026-09-09 10:53:16 +08:00 |
|
|
|
6bdc8a82f2
|
feat(borrow,outbound): 申请预检按需显示审批人——默认不显示,命中需审批才出现并必选
- 后端新增 /borrow/request/check-approval 与 /outbound/request/check-approval 预检接口
- 申请弹窗默认隐藏审批人;提交前预检:命中需审批→显示审批人并红字列物料、未选拦截;未命中→隐藏并直接提交(approver=null)
- 申请 items 补传 base_id 供后端 ID 精确判定
|
2026-09-09 10:47:29 +08:00 |
|
|
|
2abac8b3f9
|
feat(borrow,outbound): 申请页审批人改可选(默认免审批),提示语更新
- 出库/借库申请不再强制选审批人;命中需审批且未选人时由后端提示补选
- 成功提示改为:含需审批物料将进入审批,否则直接交库管执行
|
2026-09-09 09:31:28 +08:00 |
|
|
|
9fc6ff00f9
|
feat(bom): 出库/借库清单头部 BOM 号后显示父件物料名
- selectedBomLabel 追加父件名(优先候选列表 parent_name,回退最近详情 parent_name)
- 主清单与欠料待补清单两处头部同时生效;取不到名称时退回原格式
|
2026-09-08 11:13:42 +08:00 |
|
|
|
7d9828e403
|
feat: BOM套餐添加弹窗齐套清单显示自制件子件版本号
|
2026-09-07 18:03:43 +08:00 |
|
|
|
3dd8458de0
|
feat: BOM 子件展示自制件 BOM 版本号——子件列表与出库/借库 BOM 清单打印均显示
|
2026-09-07 18:01:16 +08:00 |
|
|
|
3bd19c1ab5
|
feat: 借库审批支持手动完结——已通过(status=1)单可强制完结,库管/主管/超管可见
|
2026-09-04 14:52:31 +08:00 |
|
|
|
0535cd8bd7
|
fix: 借库申请页预计归还日期禁止选择早于当日
|
2026-09-04 09:58:48 +08:00 |
|
|
|
e61351b0ca
|
fix: 借库审批页按钮权限码改为 op_borrow_approval:operation(主管看不到审批按钮)
|
2026-09-04 09:23:33 +08:00 |
|
|
|
ec9aafbe51
|
feat: 借库归还日期贯穿申请/审批/扫码借库;BOM 套餐添加与打印、缺货写入申请原因
|
2026-09-02 18:39:17 +08:00 |
|
|
|
329820117f
|
perf: 消除 outbound/borrow BOM 匹配的 while(true) 全量加载
## 后端
- outbound.py: 新增 POST /api/v1/outbound/bom-match-stock 端点
接收 child_ids[],服务端按 base_id IN 查询三表有库存记录并返回
## 前端
- outbound.ts: 新增 bomMatchStock(childIds) API 函数
- Selection.vue: loadAllStockForBom (while(true) 全量) → loadStockForBom (单次 API)
- borrow/apply/index.vue: 同上
## 效果
- BOM 匹配从 ~90 次 HTTP 请求降为 1 次
- 浏览器内存从 ~18000 条降为 ~8-50 条
|
2026-07-15 17:52:08 +08:00 |
|
|
|
2556b77530
|
perf: 系统级性能优化与并发安全修复
## 并发安全修复 (4处)
- scrap.py: 报废执行添加 SELECT FOR UPDATE 悲观锁,消除 TOCTOU 竞态
- stock.py (adjust_stock): 盘点调整添加 for_update=True 行锁
- outbound_service.py: 低库存预警 SMTP 调用移到 commit 之后,避免长事务
- trans_service.py: execute_dispatch 按 (source_table, id) 排序 items,消除死锁风险
## N+1 查询优化 (2处)
- inventory_task.py: _prefetch_inventory_map 单条 UNION ALL+GROUP BY 替代循环内逐条查询(N*4次→2次)
- stock.py (export_stocktake): get_borrowed_qty 批量 GROUP BY 替代逐条 TransBorrow 查询(~18000次→1次)
## BOM 列表性能重构
- bom_service.py: get_bom_list 单条 GROUP BY+string_agg+分页,消除 N+1 循环查询
- bom_service.py: 新增 get_bom_summary (轻量 GROUP BY category+COUNT)
- bom.py: 新增 /api/v1/bom/summary 路由,/list 支持 category 过滤
## Odoo 基础信息懒加载
- base_service.py: 新增 get_odoo_summary (GROUP BY category+COUNT)
- base.py: 新增 /api/v1/inbound/base/odoo-summary 路由
- buyOdoo.vue: 懒加载分组架构 (fetchOdooSummary + loadGroupItems)
- material_base.ts: 新增 getOdooSummary API
## 前端 Bug 修复
- BomManage.vue: 懒加载分组 (fetchBomSummary + loadGroupItems + collapse)
- BomManage.vue: 适配新 API 格式 (res.data.items 替代 res.data)
- buyOdoo.vue: 移除 "点击展开加载" 文字
- Selection.vue + borrow/apply/index.vue: openBomSelect 适配新 API 格式
|
2026-07-15 17:37:57 +08:00 |
|
|
|
0651eb07fa
|
fix: 彻底解耦出库/借库权限联动 + 路由去硬编码roles + 补API权限保护
根因: 借库选单页面14处硬编码outbound_selection:operation, 导致两模块权限联动
修复:
- borrow/apply: 14处outbound_selection:operation→op_borrow_apply:operation
- stock.py: 拆分_do_get_stock_list裸逻辑, 出库/借库各绑独立权限码
- transactions: 新增/borrow/stock-list端点(@permission(op_borrow_apply))
- transaction.ts: 新增getBorrowStockList前端API函数
- outbound.py: 出库审批4端点改用独立outbound_approval权限码
- transactions.py: 借库审批3端点补@permission(op_borrow_approval)
- purchase.py: 采购管理7端点补@permission(inbound_buy)
- audit.py: 审计日志补@permission(system_audit)
- router: 清除全部6处硬编码roles, 交由动态权限树控制
|
2026-07-15 14:33:11 +08:00 |
|
|
|
6a895347d0
|
V3.51
|
2026-06-25 15:44:31 +08:00 |
|
|
|
c1092407ad
|
V3.50
|
2026-06-25 15:21:43 +08:00 |
|
|
|
7ef22a3830
|
feat(借库审批流): 完整前后端实现
|
2026-06-12 14:08:19 +08:00 |
|
|
|
7ee6b0e02f
|
借库申请页面:恢复按 BOM 套餐添加功能
|
2026-06-12 13:19:01 +08:00 |
|