b6ecde11dd
refactor: warehouse/tree 移除临时打点日志,保留 O(N) build_tree 优化
2026-09-04 15:19:00 +08:00
7e3fc11bf5
chore: warehouse/tree 接口加 3 阶段耗时打点日志(查库/build_tree/序列化)
2026-09-04 15:16:20 +08:00
bc6e97ae97
perf: warehouse build_tree 改为 Map 分组内存组装,消除 O(N²) 递归全扫(tree TTFB 1.7s→0.08s)
2026-09-04 15:10:38 +08:00
3bd19c1ab5
feat: 借库审批支持手动完结——已通过(status=1)单可强制完结,库管/主管/超管可见
2026-09-04 14:52:31 +08:00
0daf50ac21
fix: 成品/半成品/维修列表第二层跨域判断补认 crossDomain(解决库管配跨域仍看不到双边)
2026-09-04 13:01:44 +08:00
1527d552d4
feat: 出库/借库记录记录并展示库位快照(DB加列+后端写入+记录页展示)
2026-09-04 11:42:44 +08:00
7cdc0bc3a1
perf: 库位选择器改为按需懒加载——新增 /warehouse/children 接口,WarehouseSelector 移除全量树依赖
2026-09-04 10:51:49 +08:00
e5c49c5177
fix: 入库 search-base 物料选择加公司隔离,恢复半成品批号按本公司历史自动递增
2026-09-04 09:42:49 +08:00
1b760f351e
fix: 出库/借库扫码查库存与 BOM 子件物料选择加行级公司隔离(超管/跨域不受限)
2026-09-04 09:40:00 +08:00
c68ffdca0f
fix: 入库成品/半成品/采购编辑其它字段时不再误清空图片——仅显式携带图片字段才更新
2026-09-03 14:14:24 +08:00
7fe861b4a7
fix: 基础信息修改其它字段时不再误清空 product_image(图片消失)——仅显式携带 generalImage 才更新图片
2026-09-03 14:12:15 +08:00
3cb9b0da98
chore: 添加 httpx 依赖(Track Webhook 通知);gitignore 忽略根目录 .env 防密钥入库
2026-09-02 18:39:17 +08:00
bf7b2cc6d3
feat: BOM 库存接口支持按版本查询,修复同一编号多版本下拉回显错乱
2026-09-02 18:39:17 +08:00
85130db6ea
perf: Docker 构建使用清华镜像源并启用 BuildKit pip 缓存挂载,大幅加速重复构建
2026-09-02 18:39:09 +08:00
ee22927660
fix: 解耦 Webhook 身份证与库存序列号,恢复批号入库纯净
...
- 前端:新增临时字段 form.track_id 存 16位身份证,Batch 时 form.serial_number 清空
- 前端:submitForm 不再把身份证补进 payload.serial_number,改为透传 payload.track_id
- 后端:StockSemi 仅存 serial_number(Batch 为空),notify_track 优先用 track_id
2026-09-01 16:44:48 +08:00
4e09860b36
feat: 采购申请完结功能移到批次主行,与出库审批一致
...
- 移除展开行内的单条完结按钮(需点开),改为主行'完结本批'直接可见
- 后端 batch-approve 支持 action=close(批次内已通过→已完结)
- 超管/库管在主行操作列即可看到并完结
2026-09-01 16:21:48 +08:00
fbb4160787
feat: 采购申请新增库管'完结'功能(仿出库审批)
...
- 后端:approve 接口支持 action=close(已通过→已完结 status 1→4),模型 status_text 支持已完结
- 前端:采购申请状态tab加'已完结',已通过单显示'完结'按钮(库管)
2026-09-01 16:15:48 +08:00
a2d3a2c43a
fix: 半成品列表字段权限过滤后补回 base_id,修复批号自增失效
...
- get_list 的 apply_strict_rbac 剥离 base_id,导致前端 checkHistoryAndSetMode 无法按物料匹配历史
- 过滤后补回 base_id,扫码/选物料联动时批号能按历史正确自增(如 000002 → 000003)
2026-09-01 16:08:27 +08:00
2c092c4c01
feat: MOM 出库联动 Track 标记已出库
...
- 发货出库时反查库存表 serial_number(Track 身份证),commit 后通知 Track mom-outbound
- notify_track 支持指定 webhook url(TRACK_OUTBOUND_WEBHOOK_URL)
2026-09-01 13:53:00 +08:00
bee037f925
feat: MOM 扫码入库对接 Track 产品身份证自动填充
...
- 半成品/成品入库弹窗顶部新增'扫码入库'按钮,打开扫码面板(扫码枪/摄像头)
- 扫码 Track 身份证后自动填充物料信息与序列号,不再二次搜索
- 后端新增 track_query_service(httpx 调 Track lookup)、track-lookup 接口
- 入库成功后 notify_track 通知 Track 闭环
2026-09-01 13:52:56 +08:00
893e7250db
fix(api): update-stocktake-quantity 按 session_id 隔离更新,防止跨会话误改
...
后端 update_stocktake_quantity 原只按 stock_id+source_table 查草稿,
不同盘点会话会相互覆盖实盘数。后端增加 session_id 过滤,
前端 handleQuantityChange 配套传入当前会话ID,API 类型同步补全。
2026-08-31 16:00:20 +08:00
eb017d881c
perf(api): draft/list 与 stocktake/all-items 改为数据库级分页,消除 N+1
...
- /draft/list: 废弃 query.all() + 逐条查库存/material_base 的 N+1,
改为原生 SQL 连表(草稿 JOIN 三张库存表 + material_base)+ LIMIT/OFFSET 分页
- /stocktake/all-items: 废弃三表 .all() + item.base 懒加载 + 内存切片,
改为 UNION ALL + LEFT JOIN + LIMIT/OFFSET,COUNT 聚合求总数
2026-08-31 16:00:13 +08:00
6ba20fa3db
fix(stocktake): 修复盘库重复记录 — 去重条件去掉 user_id
...
根因: draft/add 用 (user_id, uuid, session_id) 匹配去重,
同一盘点单多个用户(手机/平板不同账号)操作同一物料时,
每个用户各建一条 → 重复记录。
修复:
- 去重改为 (session_id, uuid) 唯一,不按 user_id 隔离
- 已存在则更新数量并记录最后操作用户
- 清理现有重复数据(保留每组最小id)
- 新增唯一索引 uq_stocktake_draft_session_uuid 防未来再重复
数据库需执行:
DELETE FROM stocktake_draft a USING stocktake_draft b
WHERE a.session_id=b.session_id AND a.uuid=b.uuid AND a.id>b.id;
CREATE UNIQUE INDEX IF NOT EXISTS uq_stocktake_draft_session_uuid
ON stocktake_draft(session_id, uuid);
2026-08-31 15:18:47 +08:00
7a3ffd8ba5
feat(stocktake): 重复扫码提示并确认是否修改
...
问题: 同一个码扫两遍输入两个数,后端 draft/add 直接覆盖,无任何提示
可能误改已盘数量
改进:
- 后端 draft/list 支持 uuid 过滤,可精确查某物料是否已盘
- 扫码弹输入框前,先精确查询该物料是否已盘
- 已盘过 → 弹窗提示『当前实盘为 X,是否修改?』
确认后预填旧值供修改,取消则不改变
2026-08-31 15:13:52 +08:00
c6e8c887ec
perf(stocktake): 应盘清单分页 + 扫码置顶高亮
...
性能修复(解决打开费劲):
- get_all_stocktake_items 改为分页返回 {items(当前页), total, total_scanned}
不再三次 .all() 全量加载 + 内存排序
- 前端 fetchAllStockItems 分页拉取(每页200),stats 用后端返回的 total
不依赖全量数组长度
体验优化:
- 扫码成功后将物品置顶到当前表格第一行并浅绿高亮3秒
库管无需翻页找刚扫的物品,'嘀'一下确认数量即可继续
- 主表格行高亮样式 .just-scanned-row
2026-08-31 14:59:22 +08:00
7e281cf285
fix(stocktake): 盘库扫码改为精确匹配,修复漏匹配与性能问题
...
问题:
1. 准确性 bug: 前端用 getStockList({pageSize:10, keyword}) 模糊搜索 + find()
当 SKU 前缀相同、目标不在前10条时,误报'未找到该物料库存'
2. 性能: 每次扫码全表 ilike %x% 搜索 3 张表,不走索引
修复:
- 后端 get_stock_info 改为精确匹配(==)优先,未命中再回退模糊搜索
- 新增 GET /inbound/stock/scan 扫码精确匹配接口,返回唯一命中
- 前端 onScanSuccess/handleManualInput 改用 scanStockByBarcode
一次请求直接命中,不再依赖 pageSize:10 + find()
2026-08-31 14:49:24 +08:00
1000deda2f
feat(purchase): 采购单号改为 批次-批内序号 格式,显式体现同批
...
按用户原始逻辑还原并扩展:
- 单号格式: PUR-日期-时间-批次-批内序号
例: PUR-20260831-1021-0001-0001(今日第1次采购的第1条)
- generate_request_no 支持 batch_seq 参数生成批次+批内序号
- 新增 GET /purchase/next-batch-seq 返回今日下一个批次号
- 前端提交时获取批次号,同批所有行共享,循环提交生成连续批内序号
- 批次识别: 单号去掉末尾 -批内序号 即为批次前缀
- 保留旧格式兼容(无 batch_seq 时回退 PUR-日期-时间-流水)
2026-08-31 13:54:03 +08:00
f499346f74
refactor(purchase): 批次概念改为基于 request_no 前缀推导,撤销数据库字段
...
按用户反馈:不需要新增数据库字段,现有 request_no (PUR-20260831-1021-0001)
本身就能推导批次——去掉末尾4位流水号即为批次前缀。
- 撤销 purchase_request.batch_no 字段(模型/数据库)
- 撤销 create 接口的 batch_no 参数与 generate_batch_no
- 批次标识 = request_no 去掉末尾 -XXXX 段
getBatchKey('PUR-20260831-1021-0001') = 'PUR-20260831-1021'
- 按批次查询/批量审批接口改用 batch_key (request_no LIKE 前缀)
- 前端列表批次号列、整批弹窗、一键审批本批均基于前缀推导
- 零数据库迁移,历史数据立即可用
2026-08-31 13:49:11 +08:00
664127ee30
feat(purchase): 采购批次号支持,同一批提交的记录可分组查看/统计
...
背景: 循环提交把一批物品生成多条独立申请,无法识别'哪些是同一批采购'
后端:
- purchase_request 模型新增 batch_no 字段(同一批提交共享)
- create 接口接收 batch_no,无则自动生成 BATCH-yyyyMMdd-HHmm-随机
- 新增 GET /purchase/batch/<batch_no> 按批次查询所有记录
- 批量审批接口支持按 batch_no 一键审批整批
前端:
- 提交时生成 batch_no 共享给所有行
- 列表新增批次号列(可点击)
- 新增'整批查看'弹窗:显示同批次所有记录 + 一键批量通过本批
- 操作列新增'整批'按钮
数据库需执行: ALTER TABLE purchase_request ADD COLUMN batch_no VARCHAR(100);
2026-08-31 13:46:46 +08:00
4b62c81baa
feat(purchase): 采购申请批量审批(解决循环提交需多次审批)
...
问题: 一次提交 10 个物品生成 10 条独立申请,审批人需操作 10 次
后端:
- 新增 POST /api/v1/purchase/batch-approve 批量审批接口
接收 ids + action,循环审批,成功/失败分别返回
前端:
- 待审批列表加多选列(仅 status=0 可勾选)
- 顶部批量操作栏:批量通过 / 批量驳回 / 取消选择
- 批量驳回弹窗统一填写驳回原因
2026-08-31 13:41:25 +08:00
3a07f1a272
fix(bom): BOM 详情查询改为 LEFT JOIN,子件物料被删后仍返回父件结构
...
- get_bom_detail 使用 outerjoin 替代 join
- 子件物料被删除后 child_name 显示 [已删除物料] 而非误报 BOM 不存在
- 修复按 BOM 出库时因子件删除导致 404 BOM 不存在
2026-08-31 10:28:22 +08:00
36e9f500aa
feat(borrow): 借库未归还直接报废功能(关联报废单流程)
...
后端:
- trans_service 新增 scrap_borrow 方法:未归还借用标记为 scrapped,
扣减总库存 stock_quantity(可用已在借出时冻结),生成 TransScrap 报废记录
- transactions.py 新增 POST /borrow/scrap 接口(复用 op_return:operation 权限,库管/主管可操作)
- scrap.py query_records 支持 trans_borrow 来源的物料名解析 + 行级隔离
前端:
- records.vue 未归还记录新增「报废」按钮(库管/主管可见)
- 报废弹窗:勾选明细 + 填报废原因 + 二次确认
- 状态显示新增「已报废」标签;整单所有明细报废时标记为 scrapped
2026-08-31 10:21:28 +08:00
39f3f8af45
feat(outbound): 审批单手动完结/作废功能
...
- 后端: outbound_service 新增 close_request 方法(状态 1-已通过 → 4-已完结)
- 后端: 新增 POST /api/v1/outbound/request/<id>/close 接口
- 模型: status_text 数组增加「已完结」
- 前端: create.vue 审批单选择区新增「强制完结此单」按钮
完结后刷新列表,该单从已通过下拉中移除
- 权限: 超级管理员/审批人/拥有 outbound_create:operation 的用户可完结(库管可操作)
2026-08-31 10:15:33 +08:00
2ff0f92f94
fix(stocktake): 修复盘点报告导出 500 错误
...
- 导出盘点报告时第1126行使用了 func.sum()/func.coalesce()
但文件未导入 sqlalchemy 的 func
- 改为 db.func.sum()/db.func.coalesce(),与文件内其他用法一致
2026-08-28 15:53:03 +08:00
7e4524ae42
fix(warning): 预警字段被 field_permissions Default Deny 规则错误过滤
...
- MaterialBase 映射中新增 warningStatus/warningEnabled/warningRed/warningYellow/warningRedEmails/warningYellowEmails 字段
- 新增 _permits() 函数支持通配符权限匹配 (material_list:* 覆盖所有 material_list:xxx)
- 修复 apply_strict_rbac 使用 _permits 替代直接 in 检查
根因: field_permissions.py 的 STOCK_FIELD_RBAC_MAPPING 中没有预警字段映射,
apply_strict_rbac 的 Default Deny 规则会删除所有不在映射中的字段,导致前端永远收不到预警数据。
2026-08-11 13:28:47 +08:00
22c7d352d6
refactor(import): API 层支持导入策略参数
...
- /preview 端点接收 mode 参数,update 模式下 DB 重复行不视为错误
- /execute 端点接收 mode 参数传递给 service 层
- execute 仅导入 status 为 success/update 的行,error 行不再被提交
2026-08-03 15:53:15 +08:00
95057dedf5
refactor(import): 导入服务核心逻辑改造
...
- 预览阶段增加 Excel 内部重复检测 + 空规格去重 + 字段长度校验
- 执行阶段支持 skip 模式(跳过重复行继续导入)+ update 模式(覆盖更新已有记录)
- update 模式空值保护:Excel 空单元格不覆盖已有数据
- DB commit 异常防御:字段超长等异常优雅返回而非 500
- 去重规则改为仅依据 spec_model(货号唯一键)
- BOM 导入物料查找同步改为 spec-only
2026-08-03 15:53:10 +08:00
65aba4b313
fix: token 刷新时缺少 company_name 导致多租户过滤返回空数据
2026-08-03 09:22:50 +08:00
63c36d1466
fix: 借库记录签名改回 null(始终可见),暂等 sys_element 补齐权限码
2026-07-21 09:59:14 +08:00
ca21294580
fix: transactions filter_item_by_permissions 只保留签名过滤,基础字段不再剥离
2026-07-21 09:56:34 +08:00
30f336779e
fix: outbound filter_item_by_permissions 只过滤敏感金额字段,基础明细字段不再剥离
2026-07-21 09:53:47 +08:00
d80edc961c
fix: 三个模块 update endpoint 统一 Default Deny + 权限码全量对齐 sys_element
2026-07-20 14:26:22 +08:00
3dca2b9254
fix: buy.py update field_to_perm 库位权限码 inbound_buy:warehouse_location → inbound_buy:warehouse_loc,对齐 sys_element
2026-07-20 14:21:22 +08:00
9bcd02c742
fix: update_buy perm_code=None 导致 NoneType 崩溃 + validateUnique 编辑时排除自身改用 Number() 防类型不一致
2026-07-17 16:57:46 +08:00
29de22b575
fix: crossDomain 重复收集 — 真实树中的 system_mgmt/crossDomain 与虚拟 global_privileges 冲突,从真实树中移除 crossDomain 避免双重收集
2026-07-17 16:22:59 +08:00
c45e7b5a52
debug: assign_permissions 加详细日志追踪 crossDomain 删除/插入/提交后状态
2026-07-17 16:18:05 +08:00
de2d13fa68
fix: 全局权限码 crossDomain/global:cross_company_op 强制存为 company_name='',防止按公司隔离失效
2026-07-17 15:50:06 +08:00
266a0e011f
fix: 防自锁 — 操作者修改自己角色时强制保留 system_permission + system_permission:operation
2026-07-17 15:42:31 +08:00
efe04c5d42
fix: assign_permissions 删除逻辑对齐 get_user_permissions 查询逻辑 — 公司定制+全局模板一起替换
2026-07-17 15:38:14 +08:00
f3c946d584
fix: 借库审批同样修复 — sys_element 补充 op_borrow_approval:operation,can_approve 增加 RBAC 权限判断
2026-07-17 15:22:54 +08:00