- 在main.go中添加定时任务每10分钟同步可生产数量到WMS系统 - 为BomItem实体添加relatedStandard字段及相关CRUD方法 - 为InspectionRecord实体添加reportNo、materialCode、materialName等字段 - 更新ent schema确保新字段的验证和默认值设置 - 添加必要的数据库迁移和字段映射逻辑
122 lines
13 KiB
Markdown
122 lines
13 KiB
Markdown
# bj_power 四视角综合审计(业务 / 行业规范 / 性能稳健 / 闭环复审)
|
||
|
||
- **日期**:2026-09-17
|
||
- **方法**:3 个只读审计 agent 分头核查 WMS(8890) / MES(8888) / 工位终端(8892) / 大屏,结论均对照磁盘真实代码(含行号)。最高严重度项(U1 静默吞错、U2 退库单)已在上轮由主代理亲自读代码核实,本轮 agent 独立复验一致。
|
||
- **说明**:P0-1~P0-5、P1-6~P1-10 已知项已交另一 AI 修复,本审计聚焦"其余问题 + 已知项是否真闭环"的复验。带 * 项为需向业务确认、agent 可能误读的点,不要直接当缺陷。
|
||
|
||
---
|
||
|
||
## 一、业务视角(反直觉 / 不贴合现场)
|
||
|
||
| 编号 | 文件:行 | 严重度 | 问题 |
|
||
|---|---|---|---|
|
||
| A1 | outbound.go:102/119/162 | P1 | **备料出库硬编码 `ManageMode=1` 且只查批次库存**,电气件(模式2)备料出库走不通或模式错。通用出库(:388)按 `len(SnList)` 自动切 1/2、入库按 `m.ManageMode` 切——此处未对齐。 |
|
||
| A2 | (核查通过) | — | 入库/通用出库"结构件批次↔电气件SN"自动切换已实现;半成品/成品靠 `association_trace` 落"用了哪些批次/哪些SN";工位拍照(`InspectPanel.vue`+`PhotoField.vue`→MES `station_ops.go` base64 落盘)有落库路径;检验三分(`category` INCOMING/PROCESS/FINAL + `inspectionNo` 贯穿)已落地。基本贴合现场。 |
|
||
| A3 | return_order.go:124 | P2 | 退库电气件即便新建行也被强制 `mode1`(与 U2 同源)。 |
|
||
|
||
**业务视角结论**:主线(配置→库存→排产→报工→追溯→流程卡)自洽;缺口集中在"备料出库的物料模式切换"与"退库单对电气件的处理"。
|
||
|
||
---
|
||
|
||
## 二、MES/WMS 行业规范(领域专家视角)
|
||
|
||
| 编号 | 文件:行 | 严重度 | 违反规范 / 问题 |
|
||
|---|---|---|---|
|
||
| S1 | outbound.go:439(批次)/:476(SN) | **P0 行业硬伤** | 通用出库"发货"分支**不校验 `quality_status`**,而备料出库已用 `QualityStatusNotIn("不合格","待退")` 拦截(:131/163)。→ 不合格/待退品可经通用出库流向客户。 |
|
||
| S2 | outbound.go:32-34 | P1 | **职责分离未落实**:operator/reviewer 为自由文本,无"审核人≠录入人"及独立审批流强制。 |
|
||
| S3 | event_log.go:27-37 | P2 | 审计留痕弱:仅 operator/time/desc/payload,无操作前后值快照;且 event_log 为普通可变表,无防篡改/追加锁。 |
|
||
| S4 | (全仓无对账命中) | P2 | 三端无对账/真源机制:WMS 库存为事实主源,但无 MES↔WMS 一致性校验任务。 |
|
||
| S5 | material.go:28 | P2 | 双单位缺失:仅单 `unit` 字段,无基本单位+辅助单位+换算率。 |
|
||
| S6* | inbound.go:239-243 | P2(待确认) | "电气件 SN 必手填,缺录报错"——**需确认是否业务要求**:供应商 SN 不可系统编造,自动生成会破坏追溯;记忆中的"成品SN兜底"针对成品而非入库电气件,二者不同,agent 可能误并。 |
|
||
| S7* | inventory.go:66-70 / stock.go:769 | P2(待确认) | 库位唯一约束待确认:zones 表已是货位主数据,但 shelf/layer/position 全 Optional 手填、无 DB 唯一约束;stock.go:769 注释"不引入货位"与 inventory.go"四级贯通"矛盾,需对齐口径。 |
|
||
| S8 | workpiece.go:313 | P2 | 完工降级绕过齐套:WMS 不可达时仅记日志不阻塞完工,可能未校验齐套即回流。 |
|
||
| S9 | outbound 扣减逻辑 | P2 | FIFO 未强制:按请求 batchNo 扣减,无先进先出规则(仅不违反)。 |
|
||
| S10 | 工位端 bind.go | P2 | 条码校验弱:扫入层无长度/格式/Checksum/重复扫码去抖。 |
|
||
| S11 | (WIP 跨系统) | P2 | 0/13 虚拟工位 WIP 依赖 MES workpiece 状态基本合规,建议补跨系统 WIP 对账。 |
|
||
|
||
**明确合规项(给信心)**:负库存原子拦截(:126/452 + `WHERE quantity>=qty`);SN 全局唯一(入库查重+部分唯一索引);RBAC 显式父子无 `startsWith` 推断;admin 锁死;齐套强校验(`workpiece_bind.go:187/236`);过程检 `needCheck` 服务端强校验;不良品隔离与处置(`inspection.go:543-586`);入库检必填检测单号;拧紧记录审核签字+留痕。
|
||
|
||
---
|
||
|
||
## 三、性能 / 并发 / 稳健性(工程质量视角)
|
||
|
||
| 编号 | 文件:行 | 严重度 | 问题 |
|
||
|---|---|---|---|
|
||
| R1 | wmsclient/client.go:149,152 | P0(会丢数据) | `post/putJSON` 只判 `StatusCode>=300`、**不解析 body.code**;而 `get`(:122) 判了。→ FinishedInbound/CreateReturnOrder 即便 WMS 业务拒绝也返回 nil,库存未入却误标完成(与 U1 同源)。 |
|
||
| R2 | return_order.go:96-135 | P0(会丢数据) | 退库收货确认多步写**无事务** + **无幂等/重复确认防护**:中间失败留孤儿记录;重复调用会重复加库存(超加)。 |
|
||
| R3 | workpiece.go:133-206 | P0(会丢数据) | `ReportProcess` **无事务**:applyBinds→Create→循环 writeStepData→Update,任一中间失败留脏数据;:198-199 `_, _ = ...Save(ctx)` **吞错**。 |
|
||
| R4 | inspection.go(多步写) | P0(会丢数据) | 质检多步写未发现事务包裹(仅 line.go 用 Tx),同理脏数据风险。 |
|
||
| R5 | outbound.go:324 / 导出581 | P1 | 出库列表 N+1:循环内 `OutboundDetail.Query()` 逐单查,大列表放大延迟。 |
|
||
| R6 | inbound.go:247 | P1 | SN 查重吞错 `exists, _ := ...Exist`:DB 异常时跳过去重,可能重复入库。 |
|
||
| R7 | auth.go:74 | P1 | 工位登出 `go func(){ _,_,_ = ctx.Mes.Post(logout) }` 错误丢弃 + 无 ctx 超时。 |
|
||
| R8 | outbound.go:254-255 等多处 | P1 | 分页参数未 clamp:`atoi` 仅给默认 20、无上限,超大 pageSize 有 OOM 风险。 |
|
||
| R9 | sse.go:19 | P2 | `closed map` 声明未用(死代码)。 |
|
||
| R10 | dashboardService.ts:188 / return_order.go:47 | P2 | 错误吞没:单条 SSE 事件解析失败静默;`dup, _ :=` 丢弃。 |
|
||
| R11 | jwt.go:116 | P2 | 注释误导"写死 token",实为 `ctx.Config.Internal.Token`(配置项,合规)。 |
|
||
| R12 | sse.go / dashboardService.ts:193/199 | P2 | SSE 无服务端心跳(`:comment`),代理 60s 空闲会断;客户端掉线只降级轮询、**不再重连 SSE**。 |
|
||
|
||
**明确干净项(给信心)**:WMS 入库/出库/质检/盘点/物料均用 `committed`+`defer Rollback` 正确事务;出库扣减 `Update().Where(ID,QuantityGTE(qty)).AddQuantity(-qty)` **原子防超卖**,设计良好;WS SQLite `busy_timeout(10000)`+`WAL`+`SetMaxOpenConns(1)` 规避 BUSY;所有 HTTP 客户端(agv 15s/mesclient 5-6s/ws mes 10s)均设 Timeout 并复用连接;Redis 走 go-zero 池;前端 fetch 用 `query.Encode()`/`url.QueryEscape` 编码;**WMS embed 无 0 字节文件**;WS store 启动 `migrateUsersRole/migrateTorqueStep` 自检补列缓解 ent 陷阱。
|
||
|
||
---
|
||
|
||
## 四、业务闭环复审查(对照《问题记录.md》《临时.md》)
|
||
|
||
- **B1(U1 同源)P0**:跨服务错误静默吞没 → MES→WMS 回流闭环静默断链,工件误标完成(workpiece.go:328 FinishedInbound)。
|
||
- **B2 P0**:工位终端 `mes.Client.do`(:71) 只查 HTTP 状态,非 JS 客户端调用会裸漏(report.go:111/168、workpiece.go:130/174 已用 `mesRespCode` 兜底,但 `do` 本身不解析)。
|
||
- **B3(U2 同源)P0**:退库单 `return_order.go` ManageMode 硬编码1、QualityStatus 硬编码"合格"、无 `order_material_ledger` 回写 → 电气件错存批次、质量态造假、台账不回减。
|
||
- **B4 P1**:看板 `dashboard.go:443-445` `Result=="NG"` 仍 `v.Status="alarm"` → 违反 D4"报喜不报忧"(前端已中性化,但 SSE 数据源仍下发 alarm 语义,根因未清)。
|
||
- **C1 P0(陷阱)**:ent `Schema.Create` 只建新表、不给存量表加列;现有 `applyColumnPatches` 幂等补列存在,但**任何新增 schema 字段若漏登记 → 运行 500**。建议加启动自检(schema 字段数 vs 实际列数)。
|
||
- **未落地方案项**:2026-09-16《临时.md》第十四节 A–O 中"出库整块/图号全链路/检验跳转入库带检测单号/批次号规则/四级联动+推荐/备料完成时间/半成品成品字段/过程完工检验/MES BOM/步骤附件/自动排产/跨天WIP/工单绩效/拧紧清理/三端help"在日志里仍是"方案"态,需确认另一 AI 是否已落地。
|
||
|
||
---
|
||
|
||
## 五、统一问题清单(去重 + 优先级)
|
||
|
||
> 去重后共 23 项(U 编号)。P0=业务断链/数据错乱/丢数据;P1=口径/显示/性能/稳健;P2=增强/卫生。
|
||
|
||
| U | 视角 | 文件:行 | 严重度 | 一句话问题 | 修复方向 |
|
||
|---|---|---|---|---|---|
|
||
| U1 | 闭环/稳健 | wmsclient/client.go:149,152 | **P0** | 跨服务错误只判HTTP状态不解析 body.code → 静默吞错、库存未入误标完成 | post/putJSON 解析 body.code≠0 即返错 |
|
||
| U2 | 业务/稳健 | return_order.go:96-135,116-129 | **P0** | 退库单无事务+无幂等+ManageMode/质量态硬编码+无台账回写 → 超加/错存/造假 | Tx包裹+状态校验+按物料模式分支+回写 ledger |
|
||
| U3 | 稳健 | workpiece.go:133-206 | **P0** | 报工无事务+`_,_=Save`吞错 → 脏数据/丢数据 | Tx 包裹+判错 |
|
||
| U4 | 稳健 | inspection.go | **P0** | 质检多步写无事务 → 脏数据 | 确认并加 Tx |
|
||
| U5 | 行业 | outbound.go:439/476 | **P0** | 通用出库"发货"不校验质量态 → 不合格品流向客户 | deliver 复用备料同等的 quality_status 拦截 |
|
||
| U6 | 业务 | outbound.go:102/119/162 | P1 | 备料出库硬编码 ManageMode=1 只查批次 → 电气件走不通 | 按物料 manage_mode 切 SN/批次分支 |
|
||
| U7 | 闭环 | dashboard.go:443-445 | P1 | 看板 NG 仍下发 alarm → 违反报喜不报忧 | SSE 不再下发 alarm,预警中心单独承载 |
|
||
| U8 | 稳健 | outbound.go:324/581 | P1 | 出库列表 N+1 → 大列表慢 | 一次性 WithDetails / 批量 IN |
|
||
| U9 | 稳健 | inbound.go:247 | P1 | SN 查重吞错 → 可能重复入库 | 判 err |
|
||
| U10 | 稳健 | auth.go:74 | P1 | 工位登出吞错+无超时 | 带 ctx 超时+记日志 |
|
||
| U11 | 稳健 | outbound.go:254-255 | P1 | 分页未 clamp → OOM 风险 | clamp(pageSize,1,200) |
|
||
| U12 | 行业 | outbound.go:32-34 | P1 | 职责分离未落实(reviewer 自由文本) | 服务端强制 reviewer≠operator 且具审核权限 |
|
||
| U13 | 陷阱 | applyColumnPatches | P0(陷阱) | 新增 schema 字段漏登记补列 → 500 | 加列必登记 + 启动自检字段/列数 |
|
||
| U14* | 行业 | inbound.go:239-243 | P2(待确认) | 电气件 SN 必手填——需确认是否业务要求(供应商SN不可编造) | 成品SN兜底已存在,勿误改电气件 |
|
||
| U15 | 行业 | material.go:28 | P2 | 双单位缺失 | 增 base_unit/aux_unit+换算率 |
|
||
| U16 | 行业 | event_log.go:27-37 | P2 | 审计留痕无前后值、可改 | 记 before/after + 不可改删策略 |
|
||
| U17 | 行业 | (无对账) | P2 | 三端无对账机制 | 明确 WMS 为主源 + 定期对账接口 |
|
||
| U18* | 行业 | inventory.go:66-70/stock.go:769 | P2(待确认) | 库位唯一约束/注释矛盾 | zones 已是货位主数据,补 DB 唯一约束并统一口径 |
|
||
| U19 | 行业 | workpiece.go:313 | P2 | 完工降级绕过齐套 | 降级置工单"待复核"挂起 |
|
||
| U20 | 行业 | outbound 扣减 | P2 | FIFO 未强制 | 默认按 production_date/批升序选批 |
|
||
| U21 | 行业 | 工位 bind.go | P2 | 条码校验弱 | 扫入层加正则+重复去抖 |
|
||
| U22 | 稳健 | sse.go/dashboardService.ts | P2 | SSE 无心跳/客户端不重连 | 服务端心跳+客户端退避重连 |
|
||
| U23 | 卫生 | sse.go:19/return_order.go:47/dashboardService.ts:188 | P2 | 死代码/吞错/注释误导 | 清理 |
|
||
| U24 | 稳健(遗留) | MES go:embed | P1(遗留待重验) | 此前 flagged:MES 116 资源 28 个 0 字节内嵌 → 页面空白风险;本轮 WMS embed 已确认干净,MES 端需重验当前构建产物 | 重新构建覆盖校验 0 字节 |
|
||
| U25 | 协调风险 | inbound_order 四级字段 | P1(协调) | 我此前已加 shelf/layer/position 并重生成 ent、改 inbound.go 落库,但前端联动未接 + 存量库未补列;若另一 AI 也在改同一处会冲突 | 与另一 AI 对齐归属,避免重复改动 |
|
||
|
||
---
|
||
|
||
## 六、已验证合规(信心项)
|
||
负库存原子拦截、SN 全局唯一、RBAC 显式父子+admin 锁死、齐套强校验、过程检 needCheck、不良品隔离、入库检必填检测单号、拧紧审核留痕、WMS 核心事务正确、出库扣减原子防超卖、WS SQLite WAL 抗 BUSY、HTTP 客户端均设超时、前端参数编码、WMS embed 无 0 字节。
|
||
|
||
---
|
||
|
||
## 七、建议执行顺序(按"会丢数据 > 业务断链 > 行业硬伤 > 性能稳健")
|
||
|
||
1. **U1 + U2 + U3 + U4**(4 个 P0,都"会丢数据/静默断链")→ 最高优先,且彼此独立可并行。
|
||
2. **U5**(不合格品流向客户,行业硬伤)+ **U13**(ent 补列自检,防上线 500)。
|
||
3. **U6/U7/U12**(业务口径+看板语义+职责分离)。
|
||
4. **U8~U11/U22**(性能稳健 N+1/分页/超时/SSE)。
|
||
5. **U14~U21/U23**(行业增强 + 待确认项先向业务对齐再动手)。
|
||
6. **U24/U25**(遗留构建风险 + 与另一 AI 的改动协调)。
|
||
|
||
> 结论:**客户的需求仍未全部改完**。最危险的是 U1(跨服务错误静默吞没)——系统显示成功、实际数据断链,客户验不出但账迟早对不上;其次是 U2(退库单错存/造假/超加)、U5(不合格品流向客户)、U3/U4(报工/质检无事务丢数据)。
|