|
|
e437b3cece
|
feat(records): 高级筛选引擎 + 出库记录接入
一、新增共享工具 app/utils/advanced_filter.py
系统内已有该模式(material/list.vue、stock/inbound/buy.vue),
沿用其既有约定:参数名 advancedFilters、值为 JSON 字符串、
操作符 eq/ne/contains/not_contains/ge/le。
· parse_advanced_filters() 解析并规整,坏输入退化为空列表不影响主查询
· build_predicate() 单条件 → SQLAlchemy 谓词,未登记字段返回 None 杜绝列注入
· build_material_name_select() 物料名三表联查(buy/semi/product JOIN material_base)
二、★ 父子关系处理(本次核心)
记录接口返回的是**按单号分组的订单**,而用户筛选字段多落在**明细行**上。
若直接 .filter(TransOutbound.sku.ilike(...)),会在 GROUP BY 前收窄明细范围,
展开行里的兄弟明细会凭空消失。正确做法是先求「含匹配明细的单号集合」
再让主查询按单号 IN 过滤。
实测对照(单 OUT-20260811-1519-0003,21 条明细):
按其中一条 SKU 筛选 → 子查询法保住全部 21 条;直接 filter 只剩 1 条。
三、★ 否定操作符语义(NOT IN)
子级字段的 ne / not_contains 不能直接用 SQL != / NOT LIKE —— 那表达的是
「本单存在某条不等于 X 的明细」,多明细单几乎必然成立,等于筛选失效。
用户意图是**整单排除**,故 apply_child_condition() 统一:
肯定 → order_no IN (含匹配明细的单号)
否定 → order_no NOT IN (含匹配明细的单号)
两者子查询完全一致(都用肯定形式谓词),仅外层取反。
父级字段(单号/操作人)仍走标准 SQL 谓词,语义无歧义。
四、出库记录接入(前端弹窗 + 后端接线)
验证:
eq 0000000002 → 1 单;material_name contains 白板 → 16 单
sku ne 0000000002 → 394 = 395-1,含该 SKU 的单被整体排除
material_name not_contains 白板 → 379 = 395-16
|
2026-09-10 13:05:59 +08:00 |
|
|
|
c35ec9a659
|
feat(records): 出库/借还记录统一高级搜索版式
三个记录页(出库/借还/报废)此前搜索区形态各异:出库用裸 div + 分散样式,
借还缺日期范围,报废只有 SKU 输入框。现统一为 el-form :inline="true" +
.filter-form 版式,并补齐缺失的过滤维度。
借还记录(新增日期范围能力):
· 后端 get_records 增加 start_date/end_date 参数,按「借出时间」过滤;
· 边界补全时分秒(YYYY-MM-DD → 当日 00:00:00 / 23:59:59),
与出库记录同口径,解决零点截断导致当天记录漏查的问题;
· API 层透传两个新参数。
出库记录:
· 版式统一为 inline 表单,日期选择器加 label;
· 新增「重置」按钮;
· 搜索类型切换由 500ms 防抖改为立即查询。
借还记录:
· 新增「重置」按钮;搜索类型/状态切换改为立即查询(取消防抖)。
实测(SUPER_ADMIN):
报废 全部/单号/SKU/操作人/物料名/日期 六类过滤均 200 且命中正确;
借还 无过滤 52 单 / 本月 18 单 / 空区间 0 单(日期过滤生效);
出库 无过滤 395 单 / SKU 277 / 姓名 7 / 物料名 16 / 单号 OUT-2026 命中 395。
|
2026-09-10 12:06:08 +08:00 |
|
|
|
23a7fc65f1
|
feat(scrap): 报废记录按单号分组 + 可展开明细 + 高级搜索
一、后端按「订单」分组(原为平铺明细列表)
有 scrap_request_no → 按单号分组;
无单号(历史直接报废)→ 按 操作时间(精确到分钟) + 操作人 虚拟分组,
生成 LEGACY-<yyyyMMddHHmm>-<操作人> 形式的虚拟单号,避免历史数据成为无主记录。
每单返回 items 明细数组、损失合计、报废总数、申请人(取自 ScrapApproval)。
二、物料解析改为批量预加载
原实现逐条记录 N+1 查询,且 5 条来源路径(stock_buy/semi/product、
trans_borrow、trans_repair)各自 query.get()。改为按 (source_table, stock_id)
收集 ID → 批量 joinedload 查询 → 内存拼装。
三、损失金额改为按权限可见
原 /records 无条件剥离 total_loss,导致持有 scrap_list:loss_amount 的角色
也看不到金额,与权限元素的存在相矛盾。改为对齐 outbound 的
filter_item_by_permissions:无权限置 None,前端 v-if 隐藏整列。
四、新增 keyword / search_type 高级搜索参数
(单号/SKU 在 SQL 层过滤,操作人/申请人/物料名在分组后过滤)
五、修复申请人显示
ScrapApproval._user_name() 返回 '杜邢宸/duxingchen' 全名,统一经
_display_name() 去掉 '/账号' 后缀。
前端 scrap/index.vue 重写为 el-table type=expand 嵌套表格,对齐出库记录版式,
搜索区改用统一 el-form inline 版式(含重置按钮)。
实测:3 单(1 张申请单 2 明细 + 1 组 legacy 合并 2 条),申请人/损失合计/
虚拟单号均正确。
|
2026-09-10 12:06:04 +08:00 |
|
|
|
3cadd42338
|
refactor(scrap): 报废管理子菜单按业务流排序
顺序调整为:报废申请 → 按单报废 → 报废记录 → 报废审批。
侧边栏由 layout/components/Sidebar/index.vue 的 v-for="child in
route.children" 直接按路由数组顺序渲染,无排序逻辑,故仅需调整数组元素。
原「按单报废执行」标题缩短为「按单报废」(四字,与同级菜单一致)。
注:父菜单 redirect 仍指向 /scrap/index(报废记录),与出库模块
redirect 指向「出库记录」的既有惯例保持一致,未改动。
|
2026-09-10 11:33:01 +08:00 |
|
|
|
1aa31334b1
|
fix(scrap): 报废申请页搜索/选择解耦,审批人常驻必填
一、搜索丢失已选(核心 bug)
主表格 :data="stockList" 同时充当搜索结果与选择容器。Element Plus 的
setData 在 reserveSelection 为假时走 clearSelection(),进而 emit
selection-change([]),故每次重新搜索都会清空选中态、「已选 N 条」归零。
(源码路径:table/src/store/index.mjs:34-52 → store/watcher.mjs:145-152)
改为「购物车 + 选择弹窗」结构,对齐出库选单页:
· 主表格数据源改为 cart(已选清单),删除复选列,改「移除」按钮;
· 新增「选择库存物品」弹窗,搜索框移入其中;
· 表格 row-key + :reserve-selection="true",跨搜索/翻页保留勾选;
· 点行勾选、改数量自动勾选、数字框 @click.stop 防冒泡反转勾选;
· 服务端搜索(350ms 防抖)+ 分页 20/50/100/200;
· uniqueKey 取 source_table_id(三表主键各自独立,必须带表名前缀)。
二、审批人字段不显示
原为 v-if="approvalVisible",仅库管代建或命中需审批物料时才渲染。
因全库仅 1 个物料标记 is_approval_required,该条件几乎从不成立。
现改为常驻,并用 el-form rules 声明 approver_id / remark 双必填;
打开弹窗即调用 checkScrapApproval 预检并展示提示文案。
三、顺带修复
库位列此前恒为空:三张库存表 to_dict 只输出 warehouse_loc,而模板绑定
warehouse_location。已在 loadStockList 中归一化。
SFC 编译与 vue-tsc 通过,无新增类型错误。
|
2026-09-10 11:32:56 +08:00 |
|
|
|
f589962e5c
|
feat(scrap): 新增报废专用库存查询端点,解耦出库选单权限
报废申请页原复用 /inbound/stock/list,该端点权限是 outbound_selection。
持有 scrap_apply 的角色目前恰好也都持有该权限,故能跑通,但属隐性耦合:
任一角色授权脱钩就会静默 403,被前端 catch 掩盖成「加载库存失败」。
照抄借库既有先例(transactions.py 的 /borrow/stock-list),新增:
GET /v1/scrap/stock-list @permission_required('scrap_apply')
★ 同步把 'scrap_apply' 登记进 stock.py 的 SELECTION_PREFIXES。
_make_price_stripper 仅当前缀为 None 或已在集合中时才剥离价格,
漏登记会导致价格/成本字段泄露给报废申请人(Fail-Closed 失效)。
实测:OUTBOUND/WAREHOUSE_MGR 均 200,无 token 401,
响应中 unit_price/total_price/sale_price 等价格字段零泄漏。
|
2026-09-10 11:32:44 +08:00 |
|
|
|
f556514e72
|
refactor(scrap): 扫码校验改用 SKU 主键,与后端同口径
前端 validateAgainstPlan 由 (source_table, stock_id) 改为 SKU 主键:
· normSku() 去首尾空白,与后端 _norm_sku 一致;
· matchKey() 与后端 _match_key 完全同构(sku: 前缀 / row: 回退);
· approvedQtyByKey() 聚合同一 SKU 的批准总量,兼容批准单同 SKU 多行;
· 扫码不在批准明细内、或该 SKU 累计量超批准量时,红色 toast + 震动阻断,
不入购物车;
· 购物车去重与 maxScrapFor 上限同步改为按 SKU 计算。
已通过 SFC 编译与 vue-tsc(无新增类型错误)。
|
2026-09-10 10:21:53 +08:00 |
|
|
|
af2d1c10c6
|
feat(scrap): 报废作业页重构为「按单扫码执行」,对齐出库版式
create.vue 由「直接报废」页(492 行)重写为按单执行页:
· 顶部选择已批准申请单(scope=executable, status=1);
· 载入 items_json 为待执行清单,逐项显示批准数量与已扫数量;
· 扫码头按 (source_table, stock_id) 匹配批准明细,
不在单内或超批准量时红色 toast + 震动阻断,禁止入车;
· 支持 ?requestId= 深链直达;提交实扫 payload 到 execute 接口。
审批页的「执行报废」由弹窗盲执行改为跳转本页(router.push + query.requestId),
移除 executeVisible/confirmExecute 等已失效代码;路由标题改为「按单报废执行」。
executeScrapByRequest 增加 items 参数。
|
2026-09-10 10:14:43 +08:00 |
|
|
|
1dbf74b7bc
|
feat(borrow): 借库审批补「完结」能力(对齐出库 status=4)
- mark_completed 改为 1→4 已完结(真正扫码借出完成仍为 status=3)
- 前端审批页新增「已完结」筛选项与状态映射;审批信息列对 3/4 显示审批人
|
2026-09-10 09:47:07 +08:00 |
|
|
|
da5357acb3
|
feat(scrap): 前端报废申请 / 报废审批页 + API(对齐出库版式)
- api/scrap.ts 新增 submitScrapRequest/checkScrapApproval/getScrapApprovals/approveScrapRequest/executeScrapByRequest
- apply: 选库存(带 source_table+stock_id)/报废数量/原因/按需审批人提交
- approval: 顶部审批状态筛选+刷新、展开明细、列名对齐出库、分页含 sizes、按单执行弹窗
- 路由挂载 /scrap/apply、/scrap/approval
|
2026-09-10 09:47:02 +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 |
|
|
|
815ad01a5b
|
V3.74,9.9推送
|
2026-09-09 13:19:49 +08:00 |
|
|
|
ffbf4689f1
|
fix(inbound/buy): 从采购申请导入时价格不受“是否可显示价格”权限拦截
- 价格填充不再包在 hasFormFieldPermission(unit_price) 里,库管(前端不显示价格)也能把采购单价格带入隐藏字段用于成本
- 前端价格列/输入框仍按字段权限对库管隐藏
|
2026-09-09 13:10:46 +08:00 |
|
|
|
e622697d7c
|
feat(borrow): 借库申请前端必填拦截与星标——申请原因、预计归还日期(长期借用除外)
- 提交前拦截:申请原因为空或(未勾长期借用且无归还日期)提示并 return
- 表单加必填星标:申请原因恒必填;预计归还日期仅在非长期借用时 required
|
2026-09-09 10:53:16 +08:00 |
|
|
|
4146f35010
|
feat(permission): “出库/借库需审批”开关权限化——仅主管/超管可见可改
- 新增权限码 material_list:isApprovalRequired,授予仅 SUPER_ADMIN/SUPERVISOR(收回其它角色)
- 物料列表该列仅持码角色可见;后端批量端点与字段脱敏均改按新码校验,其余角色看不到值也无法改
|
2026-09-09 10:47:36 +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 |
|
|
|
93f149739d
|
feat(material): 基础信息列表加“出库/借库需审批”开关列
- material_base.ts 新增 batchSetApprovalRequired
- material/list.vue:列配置/权限/表格 switch,单行拨动即保存(乐观更新)
|
2026-09-09 09:31:23 +08:00 |
|
|
|
6aba09880c
|
feat(borrow): 库管借库执行自动把申请单原因带入备注说明
- 选中已审批借库申请单时 form.remark 自动填充该单 remark(申请原因),无需重复手填,可再改
|
2026-09-09 09:31:06 +08:00 |
|
|
|
578c15dc95
|
fix(bom): 另存为版本自增基准改响应式,修复 V1.1→V1.2 未升级
- originalVersion/currentBomNo 为普通 let,computed 读不到变化;且 handleSaveAs 在赋值前就算版本候选,导致从 V1.1 另存得到 V1.1 覆盖原版本
- 新增响应式 upgradeBaseVersion/upgradeBaseBomNo,versionOptions 改读 ref;handleSaveAs 先锁定基准再计算
- 修复后:V1.1→V1.2、V1.9→V1.10、主版本→V2.0,占用号自动跳过
|
2026-09-08 18:19:28 +08:00 |
|
|
|
00dde3a896
|
fix(inbound/buy): 采购入库表单批号续号改用精准接口
- checkHistoryAndSetMode 改调 /inbound/buy/latest-record 续号,不再依赖 getBuyList 前1000条
- 采购单导入“仅有 base_id”分支也自动续批号并带历史库位
|
2026-09-08 18:16:08 +08:00 |
|
|
|
b4971f057e
|
fix(bom): 管理页启停/归档即时同步与界面健壮性大修
- 只读启停用后端权威 bom_no/version,修复改状态报 BOM不存在(400)
- 成功路径统一 await reloadCurrentGroups():先更新分组摘要,再静默覆盖已展开分类明细
- 本地秒移除 applyLocalRowState:按新状态+当前筛选把不符合行立即踢出缓存并强制 Map 换引用
- 接口层与界面层 try 分离:UI 刷新异常不再误报“状态更新失败”,避免红绿/黄提示同弹
- 遍历全部改为 Array.isArray/?.keys()/entries()/||[] 防御,杜绝 undefined 误报
- 兼容 el-collapse 手风琴(String)与多开(Array):新增 isCategoryActive/setActiveList,修复 activeCategories.filter is not a function
|
2026-09-08 13:58:48 +08:00 |
|
|
|
cb1d385e77
|
V3.73,9.8推送
|
2026-09-08 11:27:53 +08:00 |
|
|
|
9fc6ff00f9
|
feat(bom): 出库/借库清单头部 BOM 号后显示父件物料名
- selectedBomLabel 追加父件名(优先候选列表 parent_name,回退最近详情 parent_name)
- 主清单与欠料待补清单两处头部同时生效;取不到名称时退回原格式
|
2026-09-08 11:13:42 +08:00 |
|
|
|
02f74278df
|
feat(bom): 归档业务闭环——状态筛选+归档/取消归档入口
- get_bom_list/get_bom_summary 状态过滤支持 archived,enabled 语义改为“启用且未归档”
- get_bom_list 输出补 is_archived;新增 update_archived 与 POST /bom/archive(整组切换归档、清缓存、审计)
- “未指定版本自动取最新”硬化为仅认启用且未归档(get_bom_detail / get_bom_no_by_parent)
- 前端:状态按钮组加“归档”;列表状态列区分归档;操作列加“归档/取消归档”按钮
|
2026-09-08 11:13:38 +08:00 |
|
|
|
1daa60590c
|
feat(bom): BOM 管理页 UI——子件版本下拉、只读启停、状态按钮组、公司筛选、手风琴、详情 loading
- 自制件子件行内版本下拉(必选,默认最新启用,外购件不显示);保存/草稿带引用版本
- 查看/只读态“是否启用”开关解耦,切换走独立启停接口
- 状态筛选改 el-radio-group 按钮组(默认启用)
- 顶部接入 CompanySelector,父件/子件物料搜索联动公司并标注公司
- 分类手风琴(全部展开临时关手风琴)与详情弹窗 v-loading;列表默认只显示启用
|
2026-09-08 10:14:51 +08:00 |
|
|
|
424df231d5
|
feat(bom): 前端 BOM API——候选版本、独立启停、物料搜索支持公司
- bom.ts 新增 getChildBomVersions(候选版本) 与 updateBomStatus(独立启停)
- inbound/buy.ts searchMaterialBase 增加可选 company 参数(跨域按公司过滤)
|
2026-09-08 10:14:47 +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 |
|
|
|
d182af7d2a
|
feat: 采购申请支持整批修改重提——批次主行对有被驳回明细的批次一键载入全部被驳明细重提
|
2026-09-07 17:08:37 +08:00 |
|
|
|
d163a36117
|
feat: 采购申请被驳回单支持「修改重提」——预填原单内容改后重新提交
|
2026-09-07 17:02:04 +08:00 |
|
|
|
fd55b7adfe
|
perf: 摄像头扫码重构——动态 qrbox 聚焦框、720p、CODE_128/QR 白名单,提升平板扫码体验
|
2026-09-07 15:53:11 +08:00 |
|
|
|
220f73acbd
|
feat: 首页全局搜索支持按 SKU 查库位——采购/半成品/成品库存纳入搜索并显示库位
|
2026-09-07 15:47:25 +08:00 |
|
|
|
803e8a1532
|
fix: 出库申请的出库类型改为不默认、必填校验(不能为空提交)
|
2026-09-07 14:04:34 +08:00 |
|
|
|
859d783b5c
|
V3.72,9.7推送
|
2026-09-07 14:02:55 +08:00 |
|
|
|
478b90fe50
|
feat: 出库类型贯穿申请→扫码出库——申请单加 outbound_type,申请时选类型、扫码出库自动带出
|
2026-09-07 14:01:13 +08:00 |
|
|
|
eaafeaf24e
|
feat: 出库类型新增「维修出库(REPAIR)」下拉选项与记录类型/标签映射
|
2026-09-07 13:51:38 +08:00 |
|
|
|
3bd19c1ab5
|
feat: 借库审批支持手动完结——已通过(status=1)单可强制完结,库管/主管/超管可见
|
2026-09-04 14:52:31 +08:00 |
|
|
|
27fb34807d
|
V3.71,9.4推送
|
2026-09-04 12:02:43 +08:00 |
|
|
|
1527d552d4
|
feat: 出库/借库记录记录并展示库位快照(DB加列+后端写入+记录页展示)
|
2026-09-04 11:42:44 +08:00 |
|
|
|
8e561836eb
|
feat: 库位按物料公司白名单显示——WarehouseSelector 支持 allowedTopPrefixes,IRIS 仅显 Y、LICA 显 C/L
|
2026-09-04 11:02:03 +08:00 |
|
|
|
7cdc0bc3a1
|
perf: 库位选择器改为按需懒加载——新增 /warehouse/children 接口,WarehouseSelector 移除全量树依赖
|
2026-09-04 10:51:49 +08:00 |
|
|
|
0535cd8bd7
|
fix: 借库申请页预计归还日期禁止选择早于当日
|
2026-09-04 09:58:48 +08:00 |
|
|
|
2acbd00222
|
fix: 修正报废/库存调整/维修入库模块前端权限码与权限表不一致(scrap_list/stock_adjustment/维修统一 operation)
|
2026-09-04 09:27:55 +08:00 |
|
|
|
e61351b0ca
|
fix: 借库审批页按钮权限码改为 op_borrow_approval:operation(主管看不到审批按钮)
|
2026-09-04 09:23:33 +08:00 |
|
|
|
4f8d765bb3
|
V3.70,9.2推送
|
2026-09-02 18:39:36 +08:00 |
|
|
|
87919146de
|
fix: 基础信息参考价格可修改——脏检查白名单补全 referencePrice
|
2026-09-02 18:39:17 +08:00 |
|
|
|
129cb1119f
|
fix: 出库选单 BOM 下拉唯一值修复,打印模板补齐欠料待补区与借库对齐
|
2026-09-02 18:39:17 +08:00 |
|
|
|
ec9aafbe51
|
feat: 借库归还日期贯穿申请/审批/扫码借库;BOM 套餐添加与打印、缺货写入申请原因
|
2026-09-02 18:39:17 +08:00 |
|
|
|
bf7b2cc6d3
|
feat: BOM 库存接口支持按版本查询,修复同一编号多版本下拉回显错乱
|
2026-09-02 18:39:17 +08:00 |
|