# 工单分批报工修复 ## 问题描述 报工一次后(完成数量未达计划数量): 1. 工单「实际结束时间」被自动填充; 2. 工单列表返回 `hasUnreportedMachine=true`,前端「报工」按钮被禁用,导致无法继续分批报工直至完成。 ## 修复内容(纯后端行为 + 前端一行改动,无新增/修改接口) ### 1. 实际结束时间仅在完成后填充 `ProductionProductMainServiceImpl.addProductMain`: - 原逻辑:每次报工无条件设置工单 `actualEndTime` / `endProductTime` 为报工结束时间; - 修改后:仅当 `completeQuantity >= planQuantity` 时填充;未完成时显式清空 `actualEndTime`/`endProductTime`(自愈历史脏数据,`updateById` 默认忽略 null 字段,故用 `UpdateWrapper` 显式置空)。 ### 2. 分批报工核算按每次报工独立生成 `ProductionProductMainServiceImpl.nextAddProductMain`: - 原逻辑:生产核算在「未报工的上机记录」循环内生成,第一次报工后上机记录 `report_status=true`,第二次报工被 `continue` 跳过,**不会生成核算**; - 修改后:报工传了班组人员明细 `personList` 时,**每次报工独立按人生成一条核算**(`finished_num` 按各人毛产量占比分摊净值,`work_hour` 取录入时长),不再受上机记录报工状态影响;设备取报工单 `deviceId`,未填写时回退取该工单任一台机。 - 未传 `personList`(旧数据)时仍回退按未报工的机台上机操作员生成核算,原逻辑保留。 ### 3. 前端报工按钮不再受上机记录报工状态限制 `src/views/productionManagement/workOrder/index.vue`: ```js // 修改前 disabled: row => row.completeQuantity >= row.planQuantity || !canCurrentUserReport(row) || row.hasUnreportedMachine, // 修改后 disabled: row => row.completeQuantity >= row.planQuantity || !canCurrentUserReport(row), ``` 「报工」按钮仅在「完成数量 >= 计划数量」或「当前用户不在工单/工序报工人中」时禁用,允许分批报工直至完成。 ## 数据库行为验证 以工单 `DC26081690001`(计划 16037)为例,报工 100 后: - `actual_end_time` 不再填充(`completeQuantity=100 < 16037`); - 工单列表 `has_unreported_machine` 仍会计算返回(前端已不再用于禁用报工按钮); - 继续报工时,第二次报工也会正常生成生产核算。 ## 涉及文件 - `src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java` - `src/views/productionManagement/workOrder/index.vue`