From 49561a125e6c7436d765a7aa08194f5ded784aaa Mon Sep 17 00:00:00 2001 From: wangyu <823267011@qq.com> Date: Thu, 14 May 2026 15:12:30 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E9=85=B8=E8=BD=A7=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=EF=BC=8C=E8=BD=A7=E8=BE=8A=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BA=A7=E7=BA=BF=E6=96=B0=E5=A2=9E=E5=90=84=E7=A7=8D=E4=BA=A7?= =?UTF-8?q?=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/migration/V14__mes_roll_multi_line.sql | 20 + .../controller/MesRollChangeController.java | 16 +- .../controller/MesRollInfoController.java | 18 +- .../controller/MesRollStandbyController.java | 16 +- .../klp/mes/roll/domain/MesRollChange.java | 6 +- .../com/klp/mes/roll/domain/MesRollGrind.java | 3 + .../com/klp/mes/roll/domain/MesRollInfo.java | 3 + .../klp/mes/roll/domain/MesRollStandby.java | 3 + .../mes/roll/domain/bo/MesRollChangeBo.java | 3 + .../mes/roll/domain/bo/MesRollGrindBo.java | 3 + .../klp/mes/roll/domain/bo/MesRollInfoBo.java | 3 + .../mes/roll/domain/bo/MesRollStandbyBo.java | 3 + .../mes/roll/domain/vo/MesRollChangeVo.java | 2 + .../klp/mes/roll/domain/vo/MesRollInfoVo.java | 6 + .../mes/roll/domain/vo/MesRollStandbyVo.java | 2 + .../mes/roll/mapper/MesRollChangeMapper.java | 17 +- .../mes/roll/mapper/MesRollInfoMapper.java | 10 +- .../mes/roll/mapper/MesRollStandbyMapper.java | 8 +- .../roll/service/IMesRollChangeService.java | 8 +- .../mes/roll/service/IMesRollInfoService.java | 16 +- .../roll/service/IMesRollStandbyService.java | 8 +- .../impl/MesRollChangeServiceImpl.java | 24 +- .../service/impl/MesRollInfoServiceImpl.java | 13 +- .../impl/MesRollStandbyServiceImpl.java | 10 +- .../mapper/roll/MesRollChangeMapper.xml | 29 +- .../mapper/roll/MesRollInfoMapper.xml | 2 + .../mapper/roll/MesRollStandbyMapper.xml | 8 +- klp-ui/src/api/mes/roll/rollChange.js | 15 +- klp-ui/src/api/mes/roll/rollInfo.js | 20 +- klp-ui/src/api/mes/roll/rollStandby.js | 12 +- klp-ui/src/views/mes/roll/grind/index.vue | 115 ++- klp-ui/src/views/mes/roll/overview/index.vue | 28 +- klp-ui/src/views/mes/roll/rollLineMixin.js | 22 + .../views/mes/roll/working-single/index.vue | 707 ++++++++++++++++++ klp-ui/src/views/mes/roll/working/index.vue | 39 +- klp-ui/src/views/wms/coil/do/acid-merge.vue | 247 ++++++ klp-ui/src/views/wms/coil/do/acid-normal.vue | 237 ++++++ klp-ui/src/views/wms/coil/do/acid-split.vue | 280 +++++++ .../views/wms/coil/panels/L2MatchPanel.vue | 188 +++++ klp-ui/src/views/wms/coil/typing.vue | 189 +---- script/sql/mysql/mill.sql | 14 +- 41 files changed, 2054 insertions(+), 319 deletions(-) create mode 100644 klp-admin/src/main/resources/db/migration/V14__mes_roll_multi_line.sql create mode 100644 klp-ui/src/views/mes/roll/rollLineMixin.js create mode 100644 klp-ui/src/views/mes/roll/working-single/index.vue create mode 100644 klp-ui/src/views/wms/coil/do/acid-merge.vue create mode 100644 klp-ui/src/views/wms/coil/do/acid-normal.vue create mode 100644 klp-ui/src/views/wms/coil/do/acid-split.vue create mode 100644 klp-ui/src/views/wms/coil/panels/L2MatchPanel.vue diff --git a/klp-admin/src/main/resources/db/migration/V14__mes_roll_multi_line.sql b/klp-admin/src/main/resources/db/migration/V14__mes_roll_multi_line.sql new file mode 100644 index 00000000..e89b7ee4 --- /dev/null +++ b/klp-admin/src/main/resources/db/migration/V14__mes_roll_multi_line.sql @@ -0,0 +1,20 @@ +-- ===================================================================== +-- 轧辊管理多产线支持:为 4 张轧辊表添加 line_id 外键列 +-- 存量数据默认为 NULL,业务侧按需补填或忽略(NULL 表示未归属产线) +-- ===================================================================== + +ALTER TABLE mes_roll_info + ADD COLUMN line_id BIGINT NULL COMMENT '产线ID(关联 wms_production_line.line_id)' AFTER roll_id, + ADD KEY idx_line_id (line_id); + +ALTER TABLE mes_roll_change + ADD COLUMN line_id BIGINT NULL COMMENT '产线ID(关联 wms_production_line.line_id)' AFTER change_id, + ADD KEY idx_line_stand (line_id, stand_no); + +ALTER TABLE mes_roll_standby + ADD COLUMN line_id BIGINT NULL COMMENT '产线ID(关联 wms_production_line.line_id)' AFTER standby_id, + ADD KEY idx_line_stand (line_id, stand_no); + +ALTER TABLE mes_roll_grind + ADD COLUMN line_id BIGINT NULL COMMENT '产线ID(关联 wms_production_line.line_id)' AFTER grind_id, + ADD KEY idx_line_id (line_id); diff --git a/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollChangeController.java b/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollChangeController.java index c9a5ec60..bfa41fc5 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollChangeController.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollChangeController.java @@ -38,21 +38,21 @@ public class MesRollChangeController extends BaseController { } /** - * 查询指定机架当前在机轧辊(最近一次换辊记录) - * GET /mes/rollChange/current?standNo=1%23 + * 查询指定产线+机架当前在机轧辊(最近一次换辊记录) + * GET /mes/rollChange/current?lineId=xxx&standNo=1%23 */ @GetMapping("/current") - public R current(@RequestParam String standNo) { - return R.ok(iMesRollChangeService.queryCurrentByStand(standNo)); + public R current(Long lineId, @RequestParam String standNo) { + return R.ok(iMesRollChangeService.queryCurrentByStand(lineId, standNo)); } /** - * 查询各机架各辊位实时工作绩效(工作长度/卷数/重量) - * GET /mes/rollChange/performance + * 查询指定产线各机架各辊位实时工作绩效(工作长度/卷数/重量) + * GET /mes/rollChange/performance?lineId=xxx */ @GetMapping("/performance") - public R>> performance() { - return R.ok(iMesRollChangeService.queryRollPerformance()); + public R>> performance(Long lineId) { + return R.ok(iMesRollChangeService.queryRollPerformance(lineId)); } /** 详情 */ diff --git a/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollInfoController.java b/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollInfoController.java index ce4cbbd8..613b8d1a 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollInfoController.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollInfoController.java @@ -41,16 +41,16 @@ public class MesRollInfoController extends BaseController { return iMesRollInfoService.queryPageList(bo, pageQuery); } - /** 状态统计卡片数据 */ + /** 状态统计卡片数据(lineId 为空时统计全部产线) */ @GetMapping("/stats") - public R> stats() { - return R.ok(iMesRollInfoService.queryStatusStats()); + public R> stats(Long lineId) { + return R.ok(iMesRollInfoService.queryStatusStats(lineId)); } - /** 轧辊编号下拉列表(按辊型 + 状态过滤,均可为空) */ + /** 轧辊编号下拉列表(lineId / rollType / status 均可为空) */ @GetMapping("/options") - public R> options(String rollType, String status) { - return R.ok(iMesRollInfoService.queryRollNoList(rollType, status)); + public R> options(Long lineId, String rollType, String status) { + return R.ok(iMesRollInfoService.queryRollNoList(lineId, rollType, status)); } /** 详情 */ @@ -90,13 +90,13 @@ public class MesRollInfoController extends BaseController { } /** - * 从换辊记录同步在线状态 + * 从换辊记录同步在线状态(lineId 为空时同步全部产线) * 将当前各机架在机轧辊的状态强制修正为 Online,解决状态数据不一致问题 */ @Log(title = "轧辊库-状态同步", businessType = BusinessType.UPDATE) @PostMapping("/syncStatus") - public R syncStatus() { - iMesRollInfoService.syncStatusFromChange(); + public R syncStatus(Long lineId) { + iMesRollInfoService.syncStatusFromChange(lineId); return R.ok(); } diff --git a/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollStandbyController.java b/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollStandbyController.java index 65cbd75c..13e62176 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollStandbyController.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollStandbyController.java @@ -28,12 +28,12 @@ public class MesRollStandbyController extends BaseController { private final IMesRollStandbyService iMesRollStandbyService; /** - * 查询指定机架的下批轧辊列表 - * GET /mes/rollStandby/list?standNo=1%23 + * 查询指定产线+机架的下批轧辊列表 + * GET /mes/rollStandby/list?lineId=xxx&standNo=1%23 */ @GetMapping("/list") - public R> list(@RequestParam String standNo) { - return R.ok(iMesRollStandbyService.queryByStand(standNo)); + public R> list(Long lineId, @RequestParam String standNo) { + return R.ok(iMesRollStandbyService.queryByStand(lineId, standNo)); } /** 详情 */ @@ -66,12 +66,12 @@ public class MesRollStandbyController extends BaseController { } /** - * 清空指定机架的全部下批轧辊 - * DELETE /mes/rollStandby/clear?standNo=1%23 + * 清空指定产线+机架的全部下批轧辊 + * DELETE /mes/rollStandby/clear?lineId=xxx&standNo=1%23 */ @Log(title = "下批轧辊", businessType = BusinessType.DELETE) @DeleteMapping("/clear") - public R clear(@RequestParam String standNo) { - return toAjax(iMesRollStandbyService.clearByStand(standNo)); + public R clear(Long lineId, @RequestParam String standNo) { + return toAjax(iMesRollStandbyService.clearByStand(lineId, standNo)); } } diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollChange.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollChange.java index baad23d1..73e75680 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollChange.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollChange.java @@ -12,8 +12,7 @@ import java.util.Date; /** * 换辊记录 mes_roll_change - * 四辊轧机,双机架(1# / 2#) - * 每次换辊记录 4 支辊:上工作辊、下工作辊、上支撑辊、下支撑辊 + * 四辊轧机,支持多产线,每次换辊记录 4 支辊:上工作辊、下工作辊、上支撑辊、下支撑辊 */ @Data @EqualsAndHashCode(callSuper = true) @@ -25,6 +24,9 @@ public class MesRollChange extends BaseEntity { @TableId(value = "change_id") private Long changeId; + /** 产线ID */ + private Long lineId; + /** 换辊编号 */ private String changeNo; diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollGrind.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollGrind.java index aeed6715..208ec779 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollGrind.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollGrind.java @@ -46,6 +46,9 @@ public class MesRollGrind extends BaseEntity { @TableId(value = "grind_id") private Long grindId; + /** 产线ID */ + private Long lineId; + /** 轧辊ID */ private Long rollId; diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollInfo.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollInfo.java index e82b3c25..58602b1c 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollInfo.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollInfo.java @@ -23,6 +23,9 @@ public class MesRollInfo extends BaseEntity { @TableId(value = "roll_id") private Long rollId; + /** 产线ID */ + private Long lineId; + /** 轧辊编号 */ private String rollNo; diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollStandby.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollStandby.java index 1978e823..db5685f8 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollStandby.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollStandby.java @@ -30,6 +30,9 @@ public class MesRollStandby extends BaseEntity { @TableId(value = "standby_id") private Long standbyId; + /** 产线ID */ + private Long lineId; + /** 机架号:1# / 2# */ private String standNo; diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollChangeBo.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollChangeBo.java index 7f88b8c2..be8046cd 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollChangeBo.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollChangeBo.java @@ -18,6 +18,9 @@ public class MesRollChangeBo extends BaseEntity { private Long changeId; + /** 产线ID(查询过滤 / 新增归属) */ + private Long lineId; + private String changeNo; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollGrindBo.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollGrindBo.java index 37c4a9c6..d4fad19e 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollGrindBo.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollGrindBo.java @@ -18,6 +18,9 @@ public class MesRollGrindBo extends BaseEntity { private Long grindId; + /** 产线ID(查询过滤用) */ + private Long lineId; + @NotNull(message = "轧辊ID不能为空") private Long rollId; diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollInfoBo.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollInfoBo.java index f4100675..a637abb6 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollInfoBo.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollInfoBo.java @@ -22,6 +22,9 @@ public class MesRollInfoBo extends BaseEntity { @NotNull(message = "轧辊ID不能为空", groups = EditGroup.class) private Long rollId; + /** 产线ID(查询过滤 / 新增归属) */ + private Long lineId; + @NotBlank(message = "轧辊编号不能为空", groups = {AddGroup.class, EditGroup.class}) private String rollNo; diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollStandbyBo.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollStandbyBo.java index c9a26a4e..5bb097dd 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollStandbyBo.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollStandbyBo.java @@ -19,6 +19,9 @@ public class MesRollStandbyBo extends BaseEntity { private Long standbyId; + /** 产线ID(查询过滤 / 新增归属) */ + private Long lineId; + /** 机架号:1# / 2# */ @NotBlank(message = "机架号不能为空", groups = AddGroup.class) private String standNo; diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollChangeVo.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollChangeVo.java index f4f4d656..b93e7aa2 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollChangeVo.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollChangeVo.java @@ -17,6 +17,8 @@ public class MesRollChangeVo { private Long changeId; + private Long lineId; + private String changeNo; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollInfoVo.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollInfoVo.java index a0b39696..5b2d45c3 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollInfoVo.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollInfoVo.java @@ -19,6 +19,12 @@ public class MesRollInfoVo { @ExcelProperty("轧辊ID") private Long rollId; + @ExcelProperty("产线ID") + private Long lineId; + + @ExcelProperty("产线名称") + private String lineName; + @ExcelProperty("轧辊编号") private String rollNo; diff --git a/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollStandbyVo.java b/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollStandbyVo.java index e6afbb52..c55165e9 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollStandbyVo.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollStandbyVo.java @@ -16,6 +16,8 @@ public class MesRollStandbyVo { private Long standbyId; + private Long lineId; + /** 机架号:1# / 2# */ private String standNo; diff --git a/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollChangeMapper.java b/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollChangeMapper.java index e6dbdd32..c0d03dc8 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollChangeMapper.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollChangeMapper.java @@ -13,27 +13,30 @@ import java.util.Map; */ public interface MesRollChangeMapper extends BaseMapperPlus { - /** 查询指定机架最新一次换辊记录(当前在机轧辊) */ - MesRollChangeVo selectLatestByStand(@Param("standNo") String standNo); + /** 查询指定产线+机架最新一次换辊记录(当前在机轧辊) */ + MesRollChangeVo selectLatestByStand(@Param("lineId") Long lineId, @Param("standNo") String standNo); /** * 按辊位查询该位置最新一次有记录的换辊(支持部分换辊) * posType: upperWr / lowerWr / upperBr / lowerBr */ - MesRollChangeVo selectLatestByStandAndPosition(@Param("standNo") String standNo, + MesRollChangeVo selectLatestByStandAndPosition(@Param("lineId") Long lineId, + @Param("standNo") String standNo, @Param("posType") String posType); /** - * 组合查询机架各辊位当前实际在机状态(每个位置独立取最新非空记录) + * 组合查询指定产线+机架各辊位当前实际在机状态(每个位置独立取最新非空记录) * 返回 map,key 同 MesRollChangeVo 字段名(camelCase) */ - Map selectCurrentStateByStand(@Param("standNo") String standNo); + Map selectCurrentStateByStand(@Param("lineId") Long lineId, @Param("standNo") String standNo); /** - * 查询同机架下一次换辊时间(任意辊位有换辊即触发) + * 查询同产线+机架下一次换辊时间(任意辊位有换辊即触发) * 返回 null 表示该辊仍在机 */ - Date selectNextChangeTime(@Param("standNo") String standNo, @Param("changeTime") Date changeTime); + Date selectNextChangeTime(@Param("lineId") Long lineId, + @Param("standNo") String standNo, + @Param("changeTime") Date changeTime); /** * 统计指定时间区间内的卷料生产统计: diff --git a/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollInfoMapper.java b/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollInfoMapper.java index 31a57a50..e4b1d679 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollInfoMapper.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollInfoMapper.java @@ -15,13 +15,17 @@ public interface MesRollInfoMapper extends BaseMapperPlus> selectStatusStats(); + List> selectStatusStats(@Param("lineId") Long lineId); /** - * 查询轧辊编号列表(用于下拉选择,可按辊型和状态过滤) + * 查询轧辊编号列表(用于下拉选择,可按产线、辊型、状态过滤) + * lineId 为 null 时不过滤产线 */ - List selectRollNoList(@Param("rollType") String rollType, @Param("status") String status); + List selectRollNoList(@Param("lineId") Long lineId, + @Param("rollType") String rollType, + @Param("status") String status); /** * 按轧辊编号查询(用于换辊时同步状态) diff --git a/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollStandbyMapper.java b/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollStandbyMapper.java index 407b7df3..e3a50b3a 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollStandbyMapper.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollStandbyMapper.java @@ -12,9 +12,9 @@ import java.util.List; */ public interface MesRollStandbyMapper extends BaseMapperPlus { - /** 按机架查询下批轧辊列表 */ - List selectByStand(@Param("standNo") String standNo); + /** 按产线+机架查询下批轧辊列表 */ + List selectByStand(@Param("lineId") Long lineId, @Param("standNo") String standNo); - /** 清空某机架的下批轧辊 */ - int clearByStand(@Param("standNo") String standNo); + /** 清空指定产线+机架的下批轧辊 */ + int clearByStand(@Param("lineId") Long lineId, @Param("standNo") String standNo); } diff --git a/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollChangeService.java b/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollChangeService.java index d55a223e..e0b6cdd7 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollChangeService.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollChangeService.java @@ -15,8 +15,8 @@ public interface IMesRollChangeService { MesRollChangeVo queryById(Long changeId); - /** 查询指定机架当前在机轧辊(最新一次换辊记录) */ - MesRollChangeVo queryCurrentByStand(String standNo); + /** 查询指定产线+机架当前在机轧辊(最新一次换辊记录) */ + MesRollChangeVo queryCurrentByStand(Long lineId, String standNo); TableDataInfo queryPageList(MesRollChangeBo bo, PageQuery pageQuery); @@ -28,9 +28,9 @@ public interface IMesRollChangeService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); /** - * 查询各机架各辊位的实时工作绩效(工作长度/卷数/重量) + * 查询指定产线各机架各辊位的实时工作绩效(工作长度/卷数/重量) * 返回结构: { posType -> { standNo -> { rollNo, workLength, coilCount, totalWeight } } } * posType: upperBr / upperWr / lowerWr / lowerBr */ - Map> queryRollPerformance(); + Map> queryRollPerformance(Long lineId); } diff --git a/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollInfoService.java b/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollInfoService.java index 665143a3..3ec8b61a 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollInfoService.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollInfoService.java @@ -20,11 +20,16 @@ public interface IMesRollInfoService { List queryList(MesRollInfoBo bo); - /** 按状态统计(总览卡片) */ - Map queryStatusStats(); + /** + * 按状态统计(总览卡片) + * lineId 为 null 时统计全部产线 + */ + Map queryStatusStats(Long lineId); - /** 轧辊编号下拉列表(status 为 null 时不过滤状态) */ - List queryRollNoList(String rollType, String status); + /** + * 轧辊编号下拉列表(lineId / rollType / status 均可为 null,不过滤对应维度) + */ + List queryRollNoList(Long lineId, String rollType, String status); Long insertByBo(MesRollInfoBo bo); @@ -40,6 +45,7 @@ public interface IMesRollInfoService { * 每个机架最新一次换辊记录中的 4 支辊 → Online; * 下批辊列表中的辊 → Standby(已由 addStandby 维护,此处不重复处理); * 其余不变,仅修正当前在机辊的状态数据不一致问题。 + * lineId 为 null 时同步全部产线;指定 lineId 时仅同步该产线。 */ - void syncStatusFromChange(); + void syncStatusFromChange(Long lineId); } diff --git a/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollStandbyService.java b/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollStandbyService.java index 035fc1e3..fa52549d 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollStandbyService.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollStandbyService.java @@ -12,8 +12,8 @@ public interface IMesRollStandbyService { MesRollStandbyVo queryById(Long standbyId); - /** 查询指定机架的下批轧辊列表 */ - List queryByStand(String standNo); + /** 查询指定产线+机架的下批轧辊列表 */ + List queryByStand(Long lineId, String standNo); /** 新增下批轧辊,同步将该辊状态更新为 Standby */ Long addStandby(MesRollStandbyBo bo); @@ -24,6 +24,6 @@ public interface IMesRollStandbyService { /** 删除某条下批轧辊,同步将该辊状态恢复为 Offline */ Boolean deleteById(Long standbyId); - /** 清空指定机架的全部下批轧辊,并将对应辊状态恢复为 Offline */ - Boolean clearByStand(String standNo); + /** 清空指定产线+机架的全部下批轧辊,并将对应辊状态恢复为 Offline */ + Boolean clearByStand(Long lineId, String standNo); } diff --git a/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollChangeServiceImpl.java b/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollChangeServiceImpl.java index a5050c94..da5c3086 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollChangeServiceImpl.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollChangeServiceImpl.java @@ -44,11 +44,12 @@ public class MesRollChangeServiceImpl implements IMesRollChangeService { } @Override - public MesRollChangeVo queryCurrentByStand(String standNo) { + public MesRollChangeVo queryCurrentByStand(Long lineId, String standNo) { // 组合各辊位最新状态,转换为 VO - Map state = baseMapper.selectCurrentStateByStand(standNo); + Map state = baseMapper.selectCurrentStateByStand(lineId, standNo); if (state == null) return null; MesRollChangeVo vo = new MesRollChangeVo(); + vo.setLineId(lineId); vo.setStandNo(standNo); vo.setUpperWrNo(str(state.get("upperWrNo"))); vo.setUpperWrDia(decimal(state.get("upperWrDia"))); @@ -70,7 +71,7 @@ public class MesRollChangeServiceImpl implements IMesRollChangeService { Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); // 为每条换辊记录计算:工作长度、卷数、重量 for (MesRollChangeVo vo : result.getRecords()) { - Date endTime = baseMapper.selectNextChangeTime(vo.getStandNo(), vo.getChangeTime()); + Date endTime = baseMapper.selectNextChangeTime(vo.getLineId(), vo.getStandNo(), vo.getChangeTime()); Map stats = baseMapper.selectCoilStats(vo.getChangeTime(), endTime); fillStatsToVo(vo, stats); } @@ -81,12 +82,12 @@ public class MesRollChangeServiceImpl implements IMesRollChangeService { private static final List STANDS = Arrays.asList("1#", "2#"); @Override - public Map> queryRollPerformance() { + public Map> queryRollPerformance(Long lineId) { Map> result = new HashMap<>(4); for (String posType : POS_TYPES) { Map byStand = new HashMap<>(2); for (String standNo : STANDS) { - MesRollChangeVo rec = baseMapper.selectLatestByStandAndPosition(standNo, posType); + MesRollChangeVo rec = baseMapper.selectLatestByStandAndPosition(lineId, standNo, posType); Map cell = new HashMap<>(6); if (rec != null) { cell.put("rollNo", getRollNoByPos(rec, posType)); @@ -106,9 +107,9 @@ public class MesRollChangeServiceImpl implements IMesRollChangeService { } /** 若该辊位要换新辊,则把当前在机的旧辊下线 */ - private void offlineIfReplaced(String standNo, String posType, String newRollNo) { + private void offlineIfReplaced(Long lineId, String standNo, String posType, String newRollNo) { if (StringUtils.isBlank(newRollNo)) return; - MesRollChangeVo cur = baseMapper.selectLatestByStandAndPosition(standNo, posType); + MesRollChangeVo cur = baseMapper.selectLatestByStandAndPosition(lineId, standNo, posType); if (cur != null) { String oldRollNo = getRollNoByPos(cur, posType); if (StringUtils.isNotBlank(oldRollNo)) { @@ -158,6 +159,7 @@ public class MesRollChangeServiceImpl implements IMesRollChangeService { private LambdaQueryWrapper buildQueryWrapper(MesRollChangeBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getLineId() != null, MesRollChange::getLineId, bo.getLineId()); lqw.eq(StringUtils.isNotBlank(bo.getStandNo()), MesRollChange::getStandNo, bo.getStandNo()); lqw.eq(StringUtils.isNotBlank(bo.getChangeType()), MesRollChange::getChangeType, bo.getChangeType()); lqw.eq(StringUtils.isNotBlank(bo.getChangeStatus()), MesRollChange::getChangeStatus, bo.getChangeStatus()); @@ -184,10 +186,10 @@ public class MesRollChangeServiceImpl implements IMesRollChangeService { add.setChangeType("三级换辊"); } // 按辊位独立换辊:只下线被替换的那个位置的旧辊 - offlineIfReplaced(add.getStandNo(), "upperWr", add.getUpperWrNo()); - offlineIfReplaced(add.getStandNo(), "lowerWr", add.getLowerWrNo()); - offlineIfReplaced(add.getStandNo(), "upperBr", add.getUpperBrNo()); - offlineIfReplaced(add.getStandNo(), "lowerBr", add.getLowerBrNo()); + offlineIfReplaced(add.getLineId(), add.getStandNo(), "upperWr", add.getUpperWrNo()); + offlineIfReplaced(add.getLineId(), add.getStandNo(), "lowerWr", add.getLowerWrNo()); + offlineIfReplaced(add.getLineId(), add.getStandNo(), "upperBr", add.getUpperBrNo()); + offlineIfReplaced(add.getLineId(), add.getStandNo(), "lowerBr", add.getLowerBrNo()); baseMapper.insert(add); diff --git a/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollInfoServiceImpl.java b/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollInfoServiceImpl.java index 46d535b3..fe31b1c0 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollInfoServiceImpl.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollInfoServiceImpl.java @@ -52,8 +52,8 @@ public class MesRollInfoServiceImpl implements IMesRollInfoService { } @Override - public Map queryStatusStats() { - List> rows = baseMapper.selectStatusStats(); + public Map queryStatusStats(Long lineId) { + List> rows = baseMapper.selectStatusStats(lineId); Map result = new HashMap(8); int total = 0; for (Map row : rows) { @@ -67,12 +67,13 @@ public class MesRollInfoServiceImpl implements IMesRollInfoService { } @Override - public List queryRollNoList(String rollType, String status) { - return baseMapper.selectRollNoList(rollType, status); + public List queryRollNoList(Long lineId, String rollType, String status) { + return baseMapper.selectRollNoList(lineId, rollType, status); } private LambdaQueryWrapper buildQueryWrapper(MesRollInfoBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getLineId() != null, MesRollInfo::getLineId, bo.getLineId()); lqw.like(StringUtils.isNotBlank(bo.getRollNo()), MesRollInfo::getRollNo, bo.getRollNo()); lqw.eq(StringUtils.isNotBlank(bo.getRollType()), MesRollInfo::getRollType, bo.getRollType()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), MesRollInfo::getStatus, bo.getStatus()); @@ -120,11 +121,11 @@ public class MesRollInfoServiceImpl implements IMesRollInfoService { } @Override - public void syncStatusFromChange() { + public void syncStatusFromChange(Long lineId) { // 按辊位独立取最新在机辊,确保各位置状态正确 for (String standNo : Arrays.asList("1#", "2#")) { for (String posType : Arrays.asList("upperWr", "lowerWr", "upperBr", "lowerBr")) { - MesRollChangeVo rec = rollChangeMapper.selectLatestByStandAndPosition(standNo, posType); + MesRollChangeVo rec = rollChangeMapper.selectLatestByStandAndPosition(lineId, standNo, posType); if (rec == null) continue; String rollNo = getRollNoByPos(rec, posType); if (StringUtils.isNotBlank(rollNo)) { diff --git a/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollStandbyServiceImpl.java b/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollStandbyServiceImpl.java index 46f66e5c..0c8bb867 100644 --- a/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollStandbyServiceImpl.java +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollStandbyServiceImpl.java @@ -31,8 +31,8 @@ public class MesRollStandbyServiceImpl implements IMesRollStandbyService { } @Override - public List queryByStand(String standNo) { - return baseMapper.selectByStand(standNo); + public List queryByStand(Long lineId, String standNo) { + return baseMapper.selectByStand(lineId, standNo); } @Override @@ -70,10 +70,10 @@ public class MesRollStandbyServiceImpl implements IMesRollStandbyService { @Override @Transactional(rollbackFor = Exception.class) - public Boolean clearByStand(String standNo) { + public Boolean clearByStand(Long lineId, String standNo) { // 先查出所有辊号再清空 - List list = baseMapper.selectByStand(standNo); - int rows = baseMapper.clearByStand(standNo); + List list = baseMapper.selectByStand(lineId, standNo); + int rows = baseMapper.clearByStand(lineId, standNo); for (MesRollStandbyVo vo : list) { if (StringUtils.isNotBlank(vo.getRollNo())) { // 只有仍处于 Standby 状态时才回退为 Offline(换辊后已变 Online 的不动) diff --git a/klp-mes/src/main/resources/mapper/roll/MesRollChangeMapper.xml b/klp-mes/src/main/resources/mapper/roll/MesRollChangeMapper.xml index 33f7abf8..1ae6fa5e 100644 --- a/klp-mes/src/main/resources/mapper/roll/MesRollChangeMapper.xml +++ b/klp-mes/src/main/resources/mapper/roll/MesRollChangeMapper.xml @@ -2,26 +2,28 @@ - + SELECT - (SELECT upper_wr_no FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND upper_wr_no IS NOT NULL AND upper_wr_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS upperWrNo, - (SELECT upper_wr_dia FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND upper_wr_no IS NOT NULL AND upper_wr_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS upperWrDia, - (SELECT lower_wr_no FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND lower_wr_no IS NOT NULL AND lower_wr_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS lowerWrNo, - (SELECT lower_wr_dia FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND lower_wr_no IS NOT NULL AND lower_wr_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS lowerWrDia, - (SELECT upper_br_no FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND upper_br_no IS NOT NULL AND upper_br_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS upperBrNo, - (SELECT upper_br_dia FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND upper_br_no IS NOT NULL AND upper_br_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS upperBrDia, - (SELECT lower_br_no FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND lower_br_no IS NOT NULL AND lower_br_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS lowerBrNo, - (SELECT lower_br_dia FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND lower_br_no IS NOT NULL AND lower_br_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS lowerBrDia, - (SELECT MAX(change_time) FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0) AS changeTime + (SELECT upper_wr_no FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND line_id = #{lineId} AND upper_wr_no IS NOT NULL AND upper_wr_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS upperWrNo, + (SELECT upper_wr_dia FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND line_id = #{lineId} AND upper_wr_no IS NOT NULL AND upper_wr_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS upperWrDia, + (SELECT lower_wr_no FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND line_id = #{lineId} AND lower_wr_no IS NOT NULL AND lower_wr_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS lowerWrNo, + (SELECT lower_wr_dia FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND line_id = #{lineId} AND lower_wr_no IS NOT NULL AND lower_wr_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS lowerWrDia, + (SELECT upper_br_no FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND line_id = #{lineId} AND upper_br_no IS NOT NULL AND upper_br_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS upperBrNo, + (SELECT upper_br_dia FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND line_id = #{lineId} AND upper_br_no IS NOT NULL AND upper_br_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS upperBrDia, + (SELECT lower_br_no FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND line_id = #{lineId} AND lower_br_no IS NOT NULL AND lower_br_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS lowerBrNo, + (SELECT lower_br_dia FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND line_id = #{lineId} AND lower_br_no IS NOT NULL AND lower_br_no != '' ORDER BY change_time DESC, change_id DESC LIMIT 1) AS lowerBrDia, + (SELECT MAX(change_time) FROM mes_roll_change WHERE stand_no = #{standNo} AND del_flag = 0 AND line_id = #{lineId}) AS changeTime - + + - + UPDATE mes_roll_standby SET del_flag = 1 WHERE del_flag = 0 AND stand_no = #{standNo} + AND line_id = #{lineId} diff --git a/klp-ui/src/api/mes/roll/rollChange.js b/klp-ui/src/api/mes/roll/rollChange.js index 68f1d541..8bcf5a7d 100644 --- a/klp-ui/src/api/mes/roll/rollChange.js +++ b/klp-ui/src/api/mes/roll/rollChange.js @@ -1,6 +1,6 @@ import request from '@/utils/request' -// 查询换辊记录分页列表(支持按机架、类型、时间筛选) +// 查询换辊记录分页列表(支持按产线、机架、类型、时间筛选) export function listRollChange(query) { return request({ url: '/mes/rollChange/list', @@ -9,20 +9,21 @@ export function listRollChange(query) { }) } -// 查询指定机架当前在机轧辊(最近一次换辊记录) -export function getCurrentRolls(standNo) { +// 查询指定产线+机架当前在机轧辊(最近一次换辊记录) +export function getCurrentRolls(lineId, standNo) { return request({ url: '/mes/rollChange/current', method: 'get', - params: { standNo } + params: { lineId, standNo } }) } -// 查询各机架各辊位实时工作绩效(workLength/coilCount/totalWeight) -export function getRollPerformance() { +// 查询指定产线各机架各辊位实时工作绩效(workLength/coilCount/totalWeight) +export function getRollPerformance(lineId) { return request({ url: '/mes/rollChange/performance', - method: 'get' + method: 'get', + params: { lineId } }) } diff --git a/klp-ui/src/api/mes/roll/rollInfo.js b/klp-ui/src/api/mes/roll/rollInfo.js index b2295cdd..4393ef04 100644 --- a/klp-ui/src/api/mes/roll/rollInfo.js +++ b/klp-ui/src/api/mes/roll/rollInfo.js @@ -9,20 +9,21 @@ export function listRollInfo(query) { }) } -// 查询状态统计卡片 -export function getRollStats() { +// 查询状态统计卡片(lineId 为空时统计全部产线) +export function getRollStats(lineId) { return request({ url: '/mes/rollInfo/stats', - method: 'get' + method: 'get', + params: { lineId } }) } -// 查询轧辊编号下拉(rollType/status 均可为空,不传则不过滤) -export function listRollOptions(rollType, status) { +// 查询轧辊编号下拉(lineId/rollType/status 均可为空,不传则不过滤) +export function listRollOptions(lineId, rollType, status) { return request({ url: '/mes/rollInfo/options', method: 'get', - params: { rollType, status } + params: { lineId, rollType, status } }) } @@ -68,11 +69,12 @@ export function scrapRollInfo(rollId) { }) } -// 从换辊记录同步在线状态 -export function syncRollStatus() { +// 从换辊记录同步在线状态(lineId 为空时同步全部产线) +export function syncRollStatus(lineId) { return request({ url: '/mes/rollInfo/syncStatus', - method: 'post' + method: 'post', + params: { lineId } }) } diff --git a/klp-ui/src/api/mes/roll/rollStandby.js b/klp-ui/src/api/mes/roll/rollStandby.js index 05a0dc41..5e028436 100644 --- a/klp-ui/src/api/mes/roll/rollStandby.js +++ b/klp-ui/src/api/mes/roll/rollStandby.js @@ -1,11 +1,11 @@ import request from '@/utils/request' -// 查询指定机架下批轧辊列表 -export function listRollStandby(standNo) { +// 查询指定产线+机架下批轧辊列表 +export function listRollStandby(lineId, standNo) { return request({ url: '/mes/rollStandby/list', method: 'get', - params: { standNo } + params: { lineId, standNo } }) } @@ -43,11 +43,11 @@ export function delRollStandby(standbyId) { }) } -// 清空指定机架全部下批轧辊 -export function clearRollStandby(standNo) { +// 清空指定产线+机架全部下批轧辊 +export function clearRollStandby(lineId, standNo) { return request({ url: '/mes/rollStandby/clear', method: 'delete', - params: { standNo } + params: { lineId, standNo } }) } diff --git a/klp-ui/src/views/mes/roll/grind/index.vue b/klp-ui/src/views/mes/roll/grind/index.vue index 37807924..7a952ec0 100644 --- a/klp-ui/src/views/mes/roll/grind/index.vue +++ b/klp-ui/src/views/mes/roll/grind/index.vue @@ -2,7 +2,21 @@
- + +
+
全部
+
{{ l.lineName }}
+
+ +
@@ -11,12 +25,6 @@
- - - - - @@ -39,6 +47,7 @@ {{ statusLabel(r.status) }} φ{{ r.currentDia != null ? r.currentDia : r.initialDia }}
+
{{ r.lineName }}
暂无数据
@@ -229,13 +238,18 @@ + + + + diff --git a/klp-ui/src/views/mes/roll/working/index.vue b/klp-ui/src/views/mes/roll/working/index.vue index 41a8d0b9..ecab7da2 100644 --- a/klp-ui/src/views/mes/roll/working/index.vue +++ b/klp-ui/src/views/mes/roll/working/index.vue @@ -381,6 +381,7 @@ import { getCurrentRolls, listRollChange, addRollChange, updateRollChange, delRollChange, getRollPerformance } from '@/api/mes/roll/rollChange' import { listRollStandby, addRollStandby, delRollStandby, clearRollStandby } from '@/api/mes/roll/rollStandby' import { listRollOptions, listRollInfo } from '@/api/mes/roll/rollInfo' +import rollLineMixin from '../rollLineMixin' const ParamCell = { name: 'ParamCell', @@ -409,6 +410,7 @@ const PerfCell = { export default { name: 'WorkingRoll', components: { ParamCell, PerfCell }, + mixins: [rollLineMixin], data() { return { current: { '1#': {}, '2#': {} }, @@ -576,11 +578,7 @@ export default { } }, - created() { - this.loadAll() - this.loadRollOptions() - this.loadRollInfoMap() - }, + created() {}, mounted() { this.$nextTick(this.syncAsideHeight) @@ -592,6 +590,12 @@ export default { }, methods: { + onLineResolved() { + this.loadAll() + this.loadRollOptions() + this.loadRollInfoMap() + }, + getDefaultChangeForm(standNo) { return { standNo: standNo || undefined, @@ -631,14 +635,14 @@ export default { loadRollPerformance() { this.perfLoading = true - getRollPerformance().then(res => { + getRollPerformance(this.lineId).then(res => { this.perfData = res.data || {} }).finally(() => { this.perfLoading = false }) }, loadCurrent(standNo) { this.$set(this.loadingCurrent, standNo, true) - getCurrentRolls(standNo).then(res => { + getCurrentRolls(this.lineId, standNo).then(res => { this.$set(this.current, standNo, res.data || {}) this.$set(this.loadingCurrent, standNo, false) this.$nextTick(this.syncAsideHeight) @@ -647,7 +651,7 @@ export default { loadStandby(standNo) { this.$set(this.loadingStandby, standNo, true) - listRollStandby(standNo).then(res => { + listRollStandby(this.lineId, standNo).then(res => { this.$set(this.standbyList, standNo, res.data || []) this.$set(this.loadingStandby, standNo, false) }).catch(() => { this.$set(this.loadingStandby, standNo, false) }) @@ -655,7 +659,7 @@ export default { loadHistory() { this.historyLoading = true - listRollChange(this.historyQuery).then(res => { + listRollChange({ ...this.historyQuery, lineId: this.lineId }).then(res => { this.historyList = res.rows || [] this.historyTotal = res.total || 0 this.historyLoading = false @@ -663,13 +667,13 @@ export default { }, loadRollOptions() { - // 下批辊选择只显示离线(Offline)状态的轧辊 - listRollOptions('WR', 'Offline').then(res => { this.wrOptions = res.data || [] }) - listRollOptions('BR', 'Offline').then(res => { this.brOptions = res.data || [] }) + // 下批辊选择只显示离线(Offline)状态的轧辊,限定当前产线 + listRollOptions(this.lineId, 'WR', 'Offline').then(res => { this.wrOptions = res.data || [] }) + listRollOptions(this.lineId, 'BR', 'Offline').then(res => { this.brOptions = res.data || [] }) }, loadRollInfoMap() { - listRollInfo({ pageNum: 1, pageSize: 500 }).then(res => { + listRollInfo({ lineId: this.lineId, pageNum: 1, pageSize: 500 }).then(res => { const map = {} ;(res.rows || []).forEach(r => { map[r.rollNo] = r }) this.rollInfoMap = map @@ -708,6 +712,7 @@ export default { this.changeForm = { ...this.getDefaultChangeForm(standNo), + lineId: this.lineId, upperWrNo: uwr.no, upperWrDia: uwr.dia, lowerWrNo: lwr.no, lowerWrDia: lwr.dia, upperBrNo: ubr.no, upperBrDia: ubr.dia, @@ -722,7 +727,7 @@ export default { addRollChange(this.changeForm).then(() => { this.$modal.msgSuccess('换辊成功') this.changeOpen = false - clearRollStandby(standNo).finally(() => { + clearRollStandby(this.lineId, standNo).finally(() => { this.loadCurrent(standNo) this.loadStandby(standNo) this.loadHistory() @@ -761,7 +766,7 @@ export default { submitStandby() { this.$refs.standbyForm.validate(valid => { if (!valid) return - addRollStandby(this.standbyForm).then(() => { + addRollStandby({ ...this.standbyForm, lineId: this.lineId }).then(() => { this.$modal.msgSuccess('已添加到下批轧辊') this.standbyOpen = false this.loadStandby(this.standbyForm.standNo) @@ -787,7 +792,7 @@ export default { }, handleClearStandby(standNo) { this.$modal.confirm('确认清空 ' + standNo + ' 机架的全部下批轧辊?').then(() => { - return clearRollStandby(standNo) + return clearRollStandby(this.lineId, standNo) }).then(() => { this.$modal.msgSuccess('已清空') this.loadStandby(standNo) @@ -818,7 +823,7 @@ export default { // ── 可用离线辊列表 ──────────────────────────────────────── loadOfflineRolls() { this.offlineLoading = true - listRollInfo({ status: 'Offline', pageNum: 1, pageSize: 30 }).then(res => { + listRollInfo({ lineId: this.lineId, status: 'Offline', pageNum: 1, pageSize: 30 }).then(res => { this.offlineRolls = res.rows || [] }).finally(() => { this.offlineLoading = false diff --git a/klp-ui/src/views/wms/coil/do/acid-merge.vue b/klp-ui/src/views/wms/coil/do/acid-merge.vue new file mode 100644 index 00000000..8ba74328 --- /dev/null +++ b/klp-ui/src/views/wms/coil/do/acid-merge.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/klp-ui/src/views/wms/coil/do/acid-normal.vue b/klp-ui/src/views/wms/coil/do/acid-normal.vue new file mode 100644 index 00000000..ee7d51d4 --- /dev/null +++ b/klp-ui/src/views/wms/coil/do/acid-normal.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/klp-ui/src/views/wms/coil/do/acid-split.vue b/klp-ui/src/views/wms/coil/do/acid-split.vue new file mode 100644 index 00000000..7928f9a4 --- /dev/null +++ b/klp-ui/src/views/wms/coil/do/acid-split.vue @@ -0,0 +1,280 @@ + + + + + diff --git a/klp-ui/src/views/wms/coil/panels/L2MatchPanel.vue b/klp-ui/src/views/wms/coil/panels/L2MatchPanel.vue new file mode 100644 index 00000000..b93659d9 --- /dev/null +++ b/klp-ui/src/views/wms/coil/panels/L2MatchPanel.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/klp-ui/src/views/wms/coil/typing.vue b/klp-ui/src/views/wms/coil/typing.vue index 936ddd23..34c30e14 100644 --- a/klp-ui/src/views/wms/coil/typing.vue +++ b/klp-ui/src/views/wms/coil/typing.vue @@ -26,25 +26,9 @@
- +
- - -
- 酸连轧最近记录 -
- - - - - - - - - -
+
@@ -138,35 +122,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -361,8 +316,6 @@ + + diff --git a/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java b/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java index b29bf53f..031c9177 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsMaterialCoilController.java @@ -318,7 +318,9 @@ public class WmsMaterialCoilController extends BaseController { /** * 钢卷溯源查询 - * 根据钢卷ID查询二维码,解析content中的steps,然后根据steps中的钢卷号反向查询数据库 + * 根据钢卷ID查询二维码,解析content中的steps,然后根据steps中的钢卷号反向查询数据库。 + * 返回 data.steps 为按二维码存储顺序排列的全量步骤(合卷场景下勿依赖原 step 序号排序,已带 display_step); + * data.traceLayout 为前端展示结构:linear(单时间线)与 merge_join(合卷前多列并排 + 合卷汇聚)交替。 * * @param coilId 钢卷ID * @param currentCoilNo 当前钢卷号(可选参数,用于查询特定子钢卷) diff --git a/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java b/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java index 4f9a8ec6..d6856913 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsMaterialCoilService.java @@ -99,7 +99,7 @@ public interface IWmsMaterialCoilService { * * @param coilId 钢卷ID * @param currentCoilNo 当前钢卷号(可选,用于查询特定子钢卷) - * @return 溯源结果(包含二维码信息和数据库记录) + * @return 溯源结果(包含二维码信息、按存储顺序排列的 steps、traceLayout 并排展示结构、数据库记录) */ Map queryTrace(Long coilId, String currentCoilNo); diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java index 28cc1b09..567104ef 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java @@ -2095,10 +2095,12 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { // 合并所有参与合卷的原始钢卷的历史steps List> steps = new ArrayList<>(); - // 从参与合卷的原始钢卷中获取二维码信息并合并 + // 从参与合卷的原始钢卷中获取二维码信息并合并,并记录每个父卷携带的历史步数(用于溯源并排展示) + List parentHistStepCounts = new ArrayList<>(); if (originalCoils != null && !originalCoils.isEmpty()) { for (WmsMaterialCoilBo originalCoilBo : originalCoils) { if (originalCoilBo.getCoilId() != null) { + int sizeBefore = steps.size(); // 查询原始钢卷的二维码信息 WmsMaterialCoil originalCoil = baseMapper.selectById(originalCoilBo.getCoilId()); if (originalCoil != null && originalCoil.getQrcodeRecordId() != null) { @@ -2114,6 +2116,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { } } } + parentHistStepCounts.add(steps.size() - sizeBefore); } } } @@ -2139,6 +2142,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { } mergeStep.put("parent_coil_nos", String.join(",", originalCoilNos)); mergeStep.put("parent_coil_ids", String.join(",", originalCoilIds)); + mergeStep.put("parent_hist_step_counts", parentHistStepCounts); mergeStep.put("new_current_coil_no", mergedCoilBo.getCurrentCoilNo()); mergeStep.put("operator", LoginHelper.getUsername()); // 操作者 steps.add(mergeStep); @@ -2468,11 +2472,14 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { @SuppressWarnings("unchecked") List> steps = (List>) contentMap.get("steps"); + // 合卷会把多条产线的 steps 顺序拼接,各线局部 step 均为 1..n,存在重复序号;必须保留 JSON 数组顺序,不能按 step 字段排序 + List> orderedSteps = steps != null ? new ArrayList<>(steps) : new ArrayList<>(); + Set allCoilNos = new HashSet<>(); Set operatorUsernames = new HashSet<>(); - if (steps != null) { - for (Map step : steps) { + if (!orderedSteps.isEmpty()) { + for (Map step : orderedSteps) { extractCoilNo(step, "current_coil_no", allCoilNos); extractCoilNo(step, "new_current_coil_no", allCoilNos); extractCoilNo(step, "old_current_coil_no", allCoilNos); @@ -2493,19 +2500,12 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { Map operatorNicknameMap = getOperatorNicknames(operatorUsernames); - List> allSteps = new ArrayList<>(steps != null ? steps : new ArrayList<>()); - - allSteps.sort((a, b) -> { - Integer stepA = (Integer) a.get("step"); - Integer stepB = (Integer) b.get("step"); - if (stepA == null) stepA = 0; - if (stepB == null) stepB = 0; - return stepA.compareTo(stepB); - }); + List> allSteps = orderedSteps; for (int i = 0; i < allSteps.size(); i++) { allSteps.get(i).put("display_step", i + 1); allSteps.get(i).put("original_step", allSteps.get(i).get("step")); + allSteps.get(i).put("storage_index", i); allSteps.get(i).put("qrcode_serial", qrRecord.getSerialNumber()); allSteps.get(i).put("qrcode_id", qrRecord.getRecordId()); @@ -2517,6 +2517,8 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { } } + List> traceLayout = buildTraceLayout(allSteps); + Set filteredCoilNos = allCoilNos; if (currentCoilNo != null && !currentCoilNo.trim().isEmpty()) { final String filterValue = currentCoilNo; @@ -2567,6 +2569,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { Map resultMap = new HashMap<>(); resultMap.put("qrcode", qrRecord); resultMap.put("steps", allSteps); + resultMap.put("traceLayout", traceLayout); resultMap.put("records", result); return resultMap; @@ -2643,6 +2646,181 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { } } + private static int stepNumberValue(Map step) { + Object s = step.get("step"); + if (s == null) { + return 0; + } + if (s instanceof Number) { + return ((Number) s).intValue(); + } + try { + return Integer.parseInt(s.toString().trim()); + } catch (NumberFormatException e) { + return 0; + } + } + + private static boolean isMergeTraceStep(Map step) { + Object op = step.get("operation"); + return op != null && "合卷".equals(op.toString()); + } + + private static List splitCommaTokens(Object value) { + if (value == null) { + return Collections.emptyList(); + } + return Arrays.stream(value.toString().split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .collect(Collectors.toList()); + } + + @SuppressWarnings("unchecked") + private static List readParentHistStepCounts(Map mergeStep) { + Object raw = mergeStep.get("parent_hist_step_counts"); + if (!(raw instanceof List)) { + return null; + } + List list = (List) raw; + List out = new ArrayList<>(); + for (Object o : list) { + if (o instanceof Number) { + out.add(((Number) o).intValue()); + } else if (o != null) { + try { + out.add(Integer.parseInt(o.toString().trim())); + } catch (NumberFormatException e) { + return null; + } + } else { + out.add(0); + } + } + return out.isEmpty() ? null : out; + } + + private static List inferLaneSizesByStepReset(List> buffer) { + if (buffer == null || buffer.isEmpty()) { + return Collections.emptyList(); + } + List lengths = new ArrayList<>(); + int runStart = 0; + Integer prev = null; + for (int i = 0; i < buffer.size(); i++) { + int cur = stepNumberValue(buffer.get(i)); + if (prev != null && (cur < prev || (cur == 1 && prev > 1))) { + lengths.add(i - runStart); + runStart = i; + } + prev = cur; + } + lengths.add(buffer.size() - runStart); + return lengths; + } + + private static List distributeEvenly(int total, int parts) { + if (parts <= 0) { + return Collections.emptyList(); + } + List r = new ArrayList<>(); + int base = total / parts; + int rem = total % parts; + for (int i = 0; i < parts; i++) { + r.add(base + (i < rem ? 1 : 0)); + } + return r; + } + + private List>> sliceBufferIntoMergeLanes(List> buffer, + Map mergeStep) { + List parentIds = splitCommaTokens(mergeStep.get("parent_coil_ids")); + List parentNos = splitCommaTokens(mergeStep.get("parent_coil_nos")); + int n = Math.max(parentIds.size(), parentNos.size()); + if (n <= 0) { + n = 1; + } + if (buffer == null) { + buffer = Collections.emptyList(); + } + int total = buffer.size(); + List counts = readParentHistStepCounts(mergeStep); + if (counts == null || counts.size() != n || counts.stream().mapToInt(Integer::intValue).sum() != total) { + List inferred = inferLaneSizesByStepReset(buffer); + if (inferred.size() == n) { + counts = inferred; + } else { + counts = distributeEvenly(total, n); + } + } + List>> lanes = new ArrayList<>(); + int offset = 0; + for (int i = 0; i < n; i++) { + int len = i < counts.size() ? Math.max(0, counts.get(i)) : 0; + int end = Math.min(offset + len, total); + lanes.add(new ArrayList<>(buffer.subList(offset, end))); + offset = end; + } + if (offset < total) { + if (!lanes.isEmpty()) { + lanes.get(lanes.size() - 1).addAll(buffer.subList(offset, total)); + } else { + lanes.add(new ArrayList<>(buffer.subList(0, total))); + } + } + return lanes; + } + + private static List buildMergeLaneLabels(Map mergeStep, int laneCount) { + List nos = splitCommaTokens(mergeStep.get("parent_coil_nos")); + List ids = splitCommaTokens(mergeStep.get("parent_coil_ids")); + List labels = new ArrayList<>(); + for (int i = 0; i < laneCount; i++) { + String no = i < nos.size() ? nos.get(i) : null; + String id = i < ids.size() ? ids.get(i) : null; + if (StringUtils.isNotBlank(no)) { + labels.add(no); + } else if (StringUtils.isNotBlank(id)) { + labels.add("ID:" + id); + } else { + labels.add("来源 " + (i + 1)); + } + } + return labels; + } + + /** + * 将按存储顺序排列的 steps 拆成「线性段 + 合卷并排段」,供前端展示。 + */ + private List> buildTraceLayout(List> orderedSteps) { + List> layout = new ArrayList<>(); + if (orderedSteps == null || orderedSteps.isEmpty()) { + return layout; + } + List> buffer = new ArrayList<>(); + for (Map s : orderedSteps) { + if (isMergeTraceStep(s)) { + Map panel = new HashMap<>(); + panel.put("type", "merge_join"); + List>> lanes = sliceBufferIntoMergeLanes(new ArrayList<>(buffer), s); + panel.put("lanes", lanes); + panel.put("laneLabels", buildMergeLaneLabels(s, lanes.size())); + panel.put("mergeStep", s); + layout.add(panel); + buffer.clear(); + } else { + buffer.add(s); + } + } + if (!buffer.isEmpty()) { + Map linear = new HashMap<>(); + linear.put("type", "linear"); + linear.put("steps", new ArrayList<>(buffer)); + layout.add(linear); + } + return layout; + } + /** * 查询各个库区中不同类型的钢卷分布情况 * 按库区分组,统计每种物品类型和物品ID的钢卷数量和重量