From a5280923e1cb7447c7a655245491e7740c9c78fb Mon Sep 17 00:00:00 2001 From: wangyu <823267011@qq.com> Date: Thu, 7 May 2026 11:19:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=8C=E6=9C=BA=E6=9E=B6=E8=BD=A7=E8=BE=8A?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MesRollChangeController.java | 86 ++ .../controller/MesRollInfoController.java | 110 +++ .../controller/MesRollStandbyController.java | 77 ++ .../klp/mes/roll/domain/MesRollChange.java | 64 ++ .../com/klp/mes/roll/domain/MesRollInfo.java | 70 ++ .../klp/mes/roll/domain/MesRollStandby.java | 59 ++ .../mes/roll/domain/bo/MesRollChangeBo.java | 53 ++ .../klp/mes/roll/domain/bo/MesRollInfoBo.java | 57 ++ .../mes/roll/domain/bo/MesRollStandbyBo.java | 48 + .../mes/roll/domain/vo/MesRollChangeVo.java | 57 ++ .../klp/mes/roll/domain/vo/MesRollInfoVo.java | 70 ++ .../mes/roll/domain/vo/MesRollStandbyVo.java | 47 + .../mes/roll/mapper/MesRollChangeMapper.java | 30 + .../mes/roll/mapper/MesRollInfoMapper.java | 42 + .../mes/roll/mapper/MesRollStandbyMapper.java | 20 + .../roll/service/IMesRollChangeService.java | 35 + .../mes/roll/service/IMesRollInfoService.java | 45 + .../roll/service/IMesRollStandbyService.java | 29 + .../impl/MesRollChangeServiceImpl.java | 140 +++ .../service/impl/MesRollInfoServiceImpl.java | 137 +++ .../impl/MesRollStandbyServiceImpl.java | 85 ++ .../mapper/roll/MesRollChangeMapper.xml | 47 + .../mapper/roll/MesRollInfoMapper.xml | 45 + .../mapper/roll/MesRollStandbyMapper.xml | 33 + klp-ui/src/api/mes/roll/rollChange.js | 62 ++ klp-ui/src/api/mes/roll/rollInfo.js | 87 ++ klp-ui/src/api/mes/roll/rollStandby.js | 53 ++ .../src/components/KLPUI/KLPTable/index.vue | 11 +- klp-ui/src/components/Pagination/index.vue | 4 +- klp-ui/src/views/mes/roll/overview/index.vue | 469 ++++++++++ klp-ui/src/views/mes/roll/working/index.vue | 852 ++++++++++++++++++ script/sql/mysql/mill.sql | 68 ++ 32 files changed, 3088 insertions(+), 4 deletions(-) create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollChangeController.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollInfoController.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollStandbyController.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollChange.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollInfo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollStandby.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollChangeBo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollInfoBo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollStandbyBo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollChangeVo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollInfoVo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollStandbyVo.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollChangeMapper.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollInfoMapper.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollStandbyMapper.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollChangeService.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollInfoService.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollStandbyService.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollChangeServiceImpl.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollInfoServiceImpl.java create mode 100644 klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollStandbyServiceImpl.java create mode 100644 klp-mes/src/main/resources/mapper/roll/MesRollChangeMapper.xml create mode 100644 klp-mes/src/main/resources/mapper/roll/MesRollInfoMapper.xml create mode 100644 klp-mes/src/main/resources/mapper/roll/MesRollStandbyMapper.xml create mode 100644 klp-ui/src/api/mes/roll/rollChange.js create mode 100644 klp-ui/src/api/mes/roll/rollInfo.js create mode 100644 klp-ui/src/api/mes/roll/rollStandby.js create mode 100644 klp-ui/src/views/mes/roll/overview/index.vue create mode 100644 klp-ui/src/views/mes/roll/working/index.vue create mode 100644 script/sql/mysql/mill.sql 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 new file mode 100644 index 00000000..7241b5f6 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollChangeController.java @@ -0,0 +1,86 @@ +package com.klp.mes.roll.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; + +import java.math.BigDecimal; +import com.klp.common.enums.BusinessType; +import com.klp.mes.roll.domain.bo.MesRollChangeBo; +import com.klp.mes.roll.domain.vo.MesRollChangeVo; +import com.klp.mes.roll.service.IMesRollChangeService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; + +/** + * 换辊记录 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/mes/rollChange") +public class MesRollChangeController extends BaseController { + + private final IMesRollChangeService iMesRollChangeService; + + /** 分页列表(支持按机架、换辊类型、时间筛选) */ + @GetMapping("/list") + public TableDataInfo list(MesRollChangeBo bo, PageQuery pageQuery) { + return iMesRollChangeService.queryPageList(bo, pageQuery); + } + + /** + * 查询指定机架当前在机轧辊(最近一次换辊记录) + * GET /mes/rollChange/current?standNo=1%23 + */ + @GetMapping("/current") + public R current(@RequestParam String standNo) { + return R.ok(iMesRollChangeService.queryCurrentByStand(standNo)); + } + + /** + * 查询指定机架当前轧辊的实时工作长度(m) + * GET /mes/rollChange/workLength?standNo=1%23 + */ + @GetMapping("/workLength") + public R workLength(@RequestParam String standNo) { + return R.ok(iMesRollChangeService.queryRealtimeWorkLength(standNo)); + } + + /** 详情 */ + @GetMapping("/{changeId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long changeId) { + return R.ok(iMesRollChangeService.queryById(changeId)); + } + + /** 新增换辊记录 */ + @Log(title = "换辊记录", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated @RequestBody MesRollChangeBo bo) { + return R.ok(iMesRollChangeService.addChange(bo)); + } + + /** 修改换辊记录 */ + @Log(title = "换辊记录", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated @RequestBody MesRollChangeBo bo) { + return toAjax(iMesRollChangeService.updateByBo(bo)); + } + + /** 删除换辊记录 */ + @Log(title = "换辊记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{changeIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] changeIds) { + return toAjax(iMesRollChangeService.deleteWithValidByIds(Arrays.asList(changeIds), true)); + } +} 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 new file mode 100644 index 00000000..ce4cbbd8 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollInfoController.java @@ -0,0 +1,110 @@ +package com.klp.mes.roll.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.domain.R; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import com.klp.common.enums.BusinessType; +import com.klp.common.utils.poi.ExcelUtil; +import com.klp.mes.roll.domain.bo.MesRollInfoBo; +import com.klp.mes.roll.domain.vo.MesRollInfoVo; +import com.klp.mes.roll.service.IMesRollInfoService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 轧辊库(轧辊总览页) + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/mes/rollInfo") +public class MesRollInfoController extends BaseController { + + private final IMesRollInfoService iMesRollInfoService; + + /** 分页列表 */ + @GetMapping("/list") + public TableDataInfo list(MesRollInfoBo bo, PageQuery pageQuery) { + return iMesRollInfoService.queryPageList(bo, pageQuery); + } + + /** 状态统计卡片数据 */ + @GetMapping("/stats") + public R> stats() { + return R.ok(iMesRollInfoService.queryStatusStats()); + } + + /** 轧辊编号下拉列表(按辊型 + 状态过滤,均可为空) */ + @GetMapping("/options") + public R> options(String rollType, String status) { + return R.ok(iMesRollInfoService.queryRollNoList(rollType, status)); + } + + /** 详情 */ + @GetMapping("/{rollId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long rollId) { + return R.ok(iMesRollInfoService.queryById(rollId)); + } + + /** 新增 */ + @Log(title = "轧辊库", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody MesRollInfoBo bo) { + return R.ok(iMesRollInfoService.insertByBo(bo)); + } + + /** 修改 */ + @Log(title = "轧辊库", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody MesRollInfoBo bo) { + return toAjax(iMesRollInfoService.updateByBo(bo)); + } + + /** 删除 */ + @Log(title = "轧辊库", businessType = BusinessType.DELETE) + @DeleteMapping("/{rollIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] rollIds) { + return toAjax(iMesRollInfoService.deleteWithValidByIds(Arrays.asList(rollIds), true)); + } + + /** 封闭轧辊(状态改为 Scrapped / 报废) */ + @Log(title = "轧辊库-封闭", businessType = BusinessType.UPDATE) + @PutMapping("/{rollId}/scrap") + public R scrap(@NotNull(message = "主键不能为空") @PathVariable Long rollId) { + return toAjax(iMesRollInfoService.scrapRoll(rollId)); + } + + /** + * 从换辊记录同步在线状态 + * 将当前各机架在机轧辊的状态强制修正为 Online,解决状态数据不一致问题 + */ + @Log(title = "轧辊库-状态同步", businessType = BusinessType.UPDATE) + @PostMapping("/syncStatus") + public R syncStatus() { + iMesRollInfoService.syncStatusFromChange(); + return R.ok(); + } + + /** 导出 */ + @Log(title = "轧辊库", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(MesRollInfoBo bo, HttpServletResponse response) { + List list = iMesRollInfoService.queryList(bo); + ExcelUtil.exportExcel(list, "轧辊数据", MesRollInfoVo.class, response); + } +} 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 new file mode 100644 index 00000000..65cbd75c --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/controller/MesRollStandbyController.java @@ -0,0 +1,77 @@ +package com.klp.mes.roll.controller; + +import com.klp.common.annotation.Log; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.core.controller.BaseController; +import com.klp.common.core.domain.R; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.enums.BusinessType; +import com.klp.mes.roll.domain.bo.MesRollStandbyBo; +import com.klp.mes.roll.domain.vo.MesRollStandbyVo; +import com.klp.mes.roll.service.IMesRollStandbyService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 下批轧辊(备用辊) + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/mes/rollStandby") +public class MesRollStandbyController extends BaseController { + + private final IMesRollStandbyService iMesRollStandbyService; + + /** + * 查询指定机架的下批轧辊列表 + * GET /mes/rollStandby/list?standNo=1%23 + */ + @GetMapping("/list") + public R> list(@RequestParam String standNo) { + return R.ok(iMesRollStandbyService.queryByStand(standNo)); + } + + /** 详情 */ + @GetMapping("/{standbyId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long standbyId) { + return R.ok(iMesRollStandbyService.queryById(standbyId)); + } + + /** 新增下批轧辊 */ + @Log(title = "下批轧辊", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody MesRollStandbyBo bo) { + return R.ok(iMesRollStandbyService.addStandby(bo)); + } + + /** 修改下批轧辊 */ + @Log(title = "下批轧辊", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated @RequestBody MesRollStandbyBo bo) { + return toAjax(iMesRollStandbyService.updateByBo(bo)); + } + + /** 删除单条下批轧辊,同时将辊状态恢复为 Offline */ + @Log(title = "下批轧辊", businessType = BusinessType.DELETE) + @DeleteMapping("/{standbyId}") + public R remove(@NotNull(message = "主键不能为空") @PathVariable Long standbyId) { + return toAjax(iMesRollStandbyService.deleteById(standbyId)); + } + + /** + * 清空指定机架的全部下批轧辊 + * DELETE /mes/rollStandby/clear?standNo=1%23 + */ + @Log(title = "下批轧辊", businessType = BusinessType.DELETE) + @DeleteMapping("/clear") + public R clear(@RequestParam String standNo) { + return toAjax(iMesRollStandbyService.clearByStand(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 new file mode 100644 index 00000000..baad23d1 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollChange.java @@ -0,0 +1,64 @@ +package com.klp.mes.roll.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 换辊记录 mes_roll_change + * 四辊轧机,双机架(1# / 2#) + * 每次换辊记录 4 支辊:上工作辊、下工作辊、上支撑辊、下支撑辊 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mes_roll_change") +public class MesRollChange extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "change_id") + private Long changeId; + + /** 换辊编号 */ + private String changeNo; + + /** 换辊时间 */ + private Date changeTime; + + /** 机架号:1# / 2# */ + private String standNo; + + /** 换辊类型: 计划换辊 / 紧急换辊 */ + private String changeType; + + /** 换辊状态 */ + private String changeStatus; + + /** 操作人 */ + private String operator; + + /** 上工作辊 */ + private String upperWrNo; + private BigDecimal upperWrDia; + + /** 下工作辊 */ + private String lowerWrNo; + private BigDecimal lowerWrDia; + + /** 上支撑辊 */ + private String upperBrNo; + private BigDecimal upperBrDia; + + /** 下支撑辊 */ + private String lowerBrNo; + private BigDecimal lowerBrDia; + + @TableLogic + private Integer delFlag; +} 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 new file mode 100644 index 00000000..e82b3c25 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollInfo.java @@ -0,0 +1,70 @@ +package com.klp.mes.roll.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 轧辊库 mes_roll_info + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mes_roll_info") +public class MesRollInfo extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "roll_id") + private Long rollId; + + /** 轧辊编号 */ + private String rollNo; + + /** 辊型: WR=工作辊 / IR=中间辊 / BR=支撑辊 */ + private String rollType; + + /** 状态: Offline / Standby / Online / Scrapped */ + private String status; + + /** 初始辊径(mm) */ + private BigDecimal initialDia; + + /** 当前辊径(mm) */ + private BigDecimal currentDia; + + /** 最小可用辊径(mm) */ + private BigDecimal minDia; + + /** 粗糙度 Ra(μm) */ + private BigDecimal roughness; + + /** 凸度(mm) */ + private BigDecimal crown; + + /** 材质 */ + private String material; + + /** 磨削次数 */ + private Integer grindCount; + + /** 累计轧制重量(t) */ + private BigDecimal totalRolledWeight; + + /** 累计轧制长度(m) */ + private BigDecimal totalRolledLength; + + /** 累计轧制卷数 */ + private Integer totalRolledCount; + + /** 制造日期 */ + private Date manufactureDate; + + @TableLogic + private Integer delFlag; +} 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 new file mode 100644 index 00000000..1978e823 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/MesRollStandby.java @@ -0,0 +1,59 @@ +package com.klp.mes.roll.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 下批轧辊(备用辊,等待换上) mes_roll_standby + * + * 每条记录代表一个具体辊位的备用辊,例如: + * 机架 1#、上工作辊位、辊号 WR-020 + * + * 辊型(rollType):WR = 工作辊,BR = 支撑辊 + * 辊位(position):UP = 上,DOWN = 下 + * 机架(standNo):1# / 2# + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("mes_roll_standby") +public class MesRollStandby extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "standby_id") + private Long standbyId; + + /** 机架号:1# / 2# */ + private String standNo; + + /** 轧辊编号(关联 mes_roll_info.roll_no) */ + private String rollNo; + + /** 辊型:WR(工作辊)/ BR(支撑辊) */ + private String rollType; + + /** 辊位:UP(上)/ DOWN(下) */ + private String position; + + /** 当前直径 */ + private BigDecimal diameter; + + /** 粗糙度 */ + private BigDecimal roughness; + + /** 凸度 */ + private BigDecimal crown; + + /** 备用就绪时间 */ + private Date readyTime; + + @TableLogic + private Integer delFlag; +} 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 new file mode 100644 index 00000000..7f88b8c2 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollChangeBo.java @@ -0,0 +1,53 @@ +package com.klp.mes.roll.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 换辊记录 业务对象 + * 四辊轧机,双机架(1# / 2#) + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MesRollChangeBo extends BaseEntity { + + private Long changeId; + + private String changeNo; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date changeTime; + + /** 机架号:1# / 2#,列表筛选用 */ + private String standNo; + + /** 换辊类型(列表筛选用) */ + private String changeType; + + private String changeStatus; + + private String operator; + + /** 上工作辊 */ + private String upperWrNo; + private BigDecimal upperWrDia; + + /** 下工作辊 */ + private String lowerWrNo; + private BigDecimal lowerWrDia; + + /** 上支撑辊 */ + private String upperBrNo; + private BigDecimal upperBrDia; + + /** 下支撑辊 */ + private String lowerBrNo; + private BigDecimal lowerBrDia; + + private String remark; +} 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 new file mode 100644 index 00000000..f4100675 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollInfoBo.java @@ -0,0 +1,57 @@ +package com.klp.mes.roll.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import com.klp.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 轧辊库 业务对象 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MesRollInfoBo extends BaseEntity { + + @NotNull(message = "轧辊ID不能为空", groups = EditGroup.class) + private Long rollId; + + @NotBlank(message = "轧辊编号不能为空", groups = {AddGroup.class, EditGroup.class}) + private String rollNo; + + @NotBlank(message = "辊型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String rollType; + + private String status; + + private BigDecimal initialDia; + + private BigDecimal currentDia; + + private BigDecimal minDia; + + private BigDecimal roughness; + + private BigDecimal crown; + + private String material; + + private Integer grindCount; + + private BigDecimal totalRolledWeight; + + private BigDecimal totalRolledLength; + + private Integer totalRolledCount; + + @JsonFormat(pattern = "yyyy-MM-dd") + private Date manufactureDate; + + private String remark; +} 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 new file mode 100644 index 00000000..c9a26a4e --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/bo/MesRollStandbyBo.java @@ -0,0 +1,48 @@ +package com.klp.mes.roll.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.klp.common.core.domain.BaseEntity; +import com.klp.common.core.validate.AddGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 下批轧辊 业务对象 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class MesRollStandbyBo extends BaseEntity { + + private Long standbyId; + + /** 机架号:1# / 2# */ + @NotBlank(message = "机架号不能为空", groups = AddGroup.class) + private String standNo; + + /** 轧辊编号 */ + @NotBlank(message = "轧辊编号不能为空", groups = AddGroup.class) + private String rollNo; + + /** 辊型:WR / BR */ + @NotBlank(message = "辊型不能为空", groups = AddGroup.class) + private String rollType; + + /** 辊位:UP / DOWN */ + @NotBlank(message = "辊位不能为空", groups = AddGroup.class) + private String position; + + private BigDecimal diameter; + + private BigDecimal roughness; + + private BigDecimal crown; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date readyTime; + + private String remark; +} 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 new file mode 100644 index 00000000..d6ff93d3 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollChangeVo.java @@ -0,0 +1,57 @@ +package com.klp.mes.roll.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 换辊记录 视图对象 + * 四辊轧机,双机架(1# / 2#) + */ +@Data +public class MesRollChangeVo { + + private static final long serialVersionUID = 1L; + + private Long changeId; + + private String changeNo; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date changeTime; + + /** 机架号:1# / 2# */ + private String standNo; + + private String changeType; + + private String changeStatus; + + private String operator; + + /** 上工作辊 */ + private String upperWrNo; + private BigDecimal upperWrDia; + + /** 下工作辊 */ + private String lowerWrNo; + private BigDecimal lowerWrDia; + + /** 上支撑辊 */ + private String upperBrNo; + private BigDecimal upperBrDia; + + /** 下支撑辊 */ + private String lowerBrNo; + private BigDecimal lowerBrDia; + + private String remark; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** 本次换辊方案的累计工作长度(m),由 WMS 卷料数据计算得出 */ + private BigDecimal workLength; +} 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 new file mode 100644 index 00000000..a0b39696 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollInfoVo.java @@ -0,0 +1,70 @@ +package com.klp.mes.roll.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 轧辊库 视图对象 + */ +@Data +@ExcelIgnoreUnannotated +public class MesRollInfoVo { + + private static final long serialVersionUID = 1L; + + @ExcelProperty("轧辊ID") + private Long rollId; + + @ExcelProperty("轧辊编号") + private String rollNo; + + @ExcelProperty("辊型") + private String rollType; + + @ExcelProperty("状态") + private String status; + + @ExcelProperty("初始辊径(mm)") + private BigDecimal initialDia; + + @ExcelProperty("当前辊径(mm)") + private BigDecimal currentDia; + + @ExcelProperty("最小辊径(mm)") + private BigDecimal minDia; + + @ExcelProperty("粗糙度") + private BigDecimal roughness; + + @ExcelProperty("凸度(mm)") + private BigDecimal crown; + + @ExcelProperty("材质") + private String material; + + @ExcelProperty("磨削次数") + private Integer grindCount; + + @ExcelProperty("累计重量(t)") + private BigDecimal totalRolledWeight; + + @ExcelProperty("累计长度(m)") + private BigDecimal totalRolledLength; + + @ExcelProperty("累计卷数") + private Integer totalRolledCount; + + @ExcelProperty("制造日期") + private Date manufactureDate; + + @ExcelProperty("备注") + private String remark; + + private Date createTime; + + private Date updateTime; +} 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 new file mode 100644 index 00000000..e6afbb52 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/domain/vo/MesRollStandbyVo.java @@ -0,0 +1,47 @@ +package com.klp.mes.roll.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 下批轧辊 视图对象 + */ +@Data +public class MesRollStandbyVo { + + private static final long serialVersionUID = 1L; + + private Long standbyId; + + /** 机架号:1# / 2# */ + private String standNo; + + /** 轧辊编号 */ + private String rollNo; + + /** 辊型:WR(工作辊)/ BR(支撑辊) */ + private String rollType; + + /** 辊位:UP(上)/ DOWN(下) */ + private String position; + + /** 辊位中文展示:上工作辊 / 下工作辊 / 上支撑辊 / 下支撑辊 */ + private String positionLabel; + + private BigDecimal diameter; + + private BigDecimal roughness; + + private BigDecimal crown; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date readyTime; + + private String remark; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; +} 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 new file mode 100644 index 00000000..f276ad34 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollChangeMapper.java @@ -0,0 +1,30 @@ +package com.klp.mes.roll.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.mes.roll.domain.MesRollChange; +import com.klp.mes.roll.domain.vo.MesRollChangeVo; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 换辊记录 Mapper + */ +public interface MesRollChangeMapper extends BaseMapperPlus { + + /** 查询指定机架最新一次换辊记录(当前在机轧辊) */ + MesRollChangeVo selectLatestByStand(@Param("standNo") String standNo); + + /** + * 查询同机架下一次换辊时间(用于确定本次换辊的服务结束时刻) + * 返回 null 表示该辊仍在机 + */ + Date selectNextChangeTime(@Param("standNo") String standNo, @Param("changeTime") Date changeTime); + + /** + * 统计指定时间区间内的卷料实测长度之和(mm→调用方除以1000转m) + * endTime 为 null 时统计到当前时刻 + */ + BigDecimal selectWorkLength(@Param("startTime") Date startTime, @Param("endTime") Date endTime); +} 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 new file mode 100644 index 00000000..94630552 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollInfoMapper.java @@ -0,0 +1,42 @@ +package com.klp.mes.roll.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.mes.roll.domain.MesRollInfo; +import com.klp.mes.roll.domain.vo.MesRollInfoVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 轧辊库 Mapper + */ +public interface MesRollInfoMapper extends BaseMapperPlus { + + /** + * 按状态统计数量(用于总览卡片) + */ + List> selectStatusStats(); + + /** + * 查询轧辊编号列表(用于下拉选择,可按辊型和状态过滤) + */ + List selectRollNoList(@Param("rollType") String rollType, @Param("status") String status); + + /** + * 按轧辊编号查询(用于换辊时同步状态) + */ + MesRollInfo selectByRollNo(@Param("rollNo") String rollNo); + + /** + * 更新轧辊状态 + */ + int updateStatusByRollNo(@Param("rollNo") String rollNo, @Param("status") String status); + + /** + * 条件更新:仅当辊当前状态等于 onlyIfStatus 时才更新(用于避免误覆盖已 Online 的辊) + */ + int updateStatusByRollNoIfStatus(@Param("rollNo") String rollNo, + @Param("status") String status, + @Param("onlyIfStatus") String onlyIfStatus); +} 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 new file mode 100644 index 00000000..407b7df3 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/mapper/MesRollStandbyMapper.java @@ -0,0 +1,20 @@ +package com.klp.mes.roll.mapper; + +import com.klp.common.core.mapper.BaseMapperPlus; +import com.klp.mes.roll.domain.MesRollStandby; +import com.klp.mes.roll.domain.vo.MesRollStandbyVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 下批轧辊 Mapper + */ +public interface MesRollStandbyMapper extends BaseMapperPlus { + + /** 按机架查询下批轧辊列表 */ + List selectByStand(@Param("standNo") String standNo); + + /** 清空某机架的下批轧辊 */ + int clearByStand(@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 new file mode 100644 index 00000000..52939af9 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollChangeService.java @@ -0,0 +1,35 @@ +package com.klp.mes.roll.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.mes.roll.domain.bo.MesRollChangeBo; +import com.klp.mes.roll.domain.vo.MesRollChangeVo; + +import java.math.BigDecimal; +import java.util.Collection; + +/** + * 换辊记录 Service 接口 + */ +public interface IMesRollChangeService { + + MesRollChangeVo queryById(Long changeId); + + /** 查询指定机架当前在机轧辊(最新一次换辊记录) */ + MesRollChangeVo queryCurrentByStand(String standNo); + + TableDataInfo queryPageList(MesRollChangeBo bo, PageQuery pageQuery); + + /** 新增换辊记录,同步将涉及的轧辊状态更新为 Online */ + Long addChange(MesRollChangeBo bo); + + Boolean updateByBo(MesRollChangeBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 查询指定机架当前在机轧辊的实时工作长度(m) + * 从最近一次换辊时间到现在,统计 WMS 卷料实测长度之和 + */ + BigDecimal queryRealtimeWorkLength(String standNo); +} 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 new file mode 100644 index 00000000..665143a3 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollInfoService.java @@ -0,0 +1,45 @@ +package com.klp.mes.roll.service; + +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.mes.roll.domain.bo.MesRollInfoBo; +import com.klp.mes.roll.domain.vo.MesRollInfoVo; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 轧辊库 Service 接口 + */ +public interface IMesRollInfoService { + + MesRollInfoVo queryById(Long rollId); + + TableDataInfo queryPageList(MesRollInfoBo bo, PageQuery pageQuery); + + List queryList(MesRollInfoBo bo); + + /** 按状态统计(总览卡片) */ + Map queryStatusStats(); + + /** 轧辊编号下拉列表(status 为 null 时不过滤状态) */ + List queryRollNoList(String rollType, String status); + + Long insertByBo(MesRollInfoBo bo); + + Boolean updateByBo(MesRollInfoBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** 封闭轧辊:状态设为 Scrapped */ + Boolean scrapRoll(Long rollId); + + /** + * 从换辊记录同步在线状态: + * 每个机架最新一次换辊记录中的 4 支辊 → Online; + * 下批辊列表中的辊 → Standby(已由 addStandby 维护,此处不重复处理); + * 其余不变,仅修正当前在机辊的状态数据不一致问题。 + */ + void syncStatusFromChange(); +} 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 new file mode 100644 index 00000000..035fc1e3 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/IMesRollStandbyService.java @@ -0,0 +1,29 @@ +package com.klp.mes.roll.service; + +import com.klp.mes.roll.domain.bo.MesRollStandbyBo; +import com.klp.mes.roll.domain.vo.MesRollStandbyVo; + +import java.util.List; + +/** + * 下批轧辊 Service 接口 + */ +public interface IMesRollStandbyService { + + MesRollStandbyVo queryById(Long standbyId); + + /** 查询指定机架的下批轧辊列表 */ + List queryByStand(String standNo); + + /** 新增下批轧辊,同步将该辊状态更新为 Standby */ + Long addStandby(MesRollStandbyBo bo); + + /** 修改下批轧辊 */ + Boolean updateByBo(MesRollStandbyBo bo); + + /** 删除某条下批轧辊,同步将该辊状态恢复为 Offline */ + Boolean deleteById(Long standbyId); + + /** 清空指定机架的全部下批轧辊,并将对应辊状态恢复为 Offline */ + Boolean clearByStand(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 new file mode 100644 index 00000000..3db0bfd7 --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollChangeServiceImpl.java @@ -0,0 +1,140 @@ +package com.klp.mes.roll.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.helper.LoginHelper; +import com.klp.common.utils.StringUtils; +import com.klp.mes.roll.domain.MesRollChange; +import com.klp.mes.roll.domain.bo.MesRollChangeBo; +import com.klp.mes.roll.domain.vo.MesRollChangeVo; +import com.klp.mes.roll.mapper.MesRollChangeMapper; +import com.klp.mes.roll.mapper.MesRollInfoMapper; +import com.klp.mes.roll.service.IMesRollChangeService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * 换辊记录 Service 实现 + */ +@RequiredArgsConstructor +@Service +public class MesRollChangeServiceImpl implements IMesRollChangeService { + + private final MesRollChangeMapper baseMapper; + private final MesRollInfoMapper rollInfoMapper; + + @Override + public MesRollChangeVo queryById(Long changeId) { + return baseMapper.selectVoById(changeId); + } + + @Override + public MesRollChangeVo queryCurrentByStand(String standNo) { + return baseMapper.selectLatestByStand(standNo); + } + + @Override + public TableDataInfo queryPageList(MesRollChangeBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + // 为每条换辊记录计算工作长度(上辊时间 → 下辊时间,下辊时间为 null 时统计到 NOW()) + for (MesRollChangeVo vo : result.getRecords()) { + Date endTime = baseMapper.selectNextChangeTime(vo.getStandNo(), vo.getChangeTime()); + BigDecimal lengthMm = baseMapper.selectWorkLength(vo.getChangeTime(), endTime); + // mm 转 m,保留 2 位小数 + vo.setWorkLength(lengthMm == null ? BigDecimal.ZERO + : lengthMm.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP)); + } + return TableDataInfo.build(result); + } + + @Override + public BigDecimal queryRealtimeWorkLength(String standNo) { + MesRollChangeVo latest = baseMapper.selectLatestByStand(standNo); + if (latest == null || latest.getChangeTime() == null) { + return BigDecimal.ZERO; + } + BigDecimal lengthMm = baseMapper.selectWorkLength(latest.getChangeTime(), null); + return lengthMm == null ? BigDecimal.ZERO + : lengthMm.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP); + } + + private LambdaQueryWrapper buildQueryWrapper(MesRollChangeBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + 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()); + if (bo.getChangeTime() != null) { + lqw.ge(MesRollChange::getChangeTime, bo.getChangeTime()); + } + lqw.orderByDesc(MesRollChange::getChangeTime, MesRollChange::getChangeId); + return lqw; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long addChange(MesRollChangeBo bo) { + MesRollChange add = BeanUtil.toBean(bo, MesRollChange.class); + if (StringUtils.isBlank(add.getChangeNo())) { + add.setChangeNo("RC" + IdUtil.fastSimpleUUID().substring(0, 8).toUpperCase()); + } + // 换辊时间强制使用服务器当前时间 + add.setChangeTime(new Date()); + // 操作人取当前登录用户昵称 + add.setOperator(LoginHelper.getNickName()); + // 换辊类型固定为"计划换辊"(通过页面触发) + if (StringUtils.isBlank(add.getChangeType())) { + add.setChangeType("三级换辊"); + } + // 换辊前:将上一批在机轧辊状态改为 Offline + MesRollChangeVo prev = baseMapper.selectLatestByStand(add.getStandNo()); + if (prev != null) { + for (String rollNo : Arrays.asList( + prev.getUpperWrNo(), prev.getLowerWrNo(), + prev.getUpperBrNo(), prev.getLowerBrNo())) { + if (StringUtils.isNotBlank(rollNo)) { + rollInfoMapper.updateStatusByRollNo(rollNo, "Offline"); + } + } + } + + baseMapper.insert(add); + + // 将本次换上的 4 支辊状态同步为 Online + List rollNos = Arrays.asList( + add.getUpperWrNo(), add.getLowerWrNo(), + add.getUpperBrNo(), add.getLowerBrNo() + ); + for (String rollNo : rollNos) { + if (StringUtils.isNotBlank(rollNo)) { + rollInfoMapper.updateStatusByRollNo(rollNo, "Online"); + } + } + + return add.getChangeId(); + } + + @Override + public Boolean updateByBo(MesRollChangeBo bo) { + MesRollChange update = BeanUtil.toBean(bo, MesRollChange.class); + return baseMapper.updateById(update) > 0; + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteBatchIds(ids) > 0; + } +} 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 new file mode 100644 index 00000000..427e932d --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollInfoServiceImpl.java @@ -0,0 +1,137 @@ +package com.klp.mes.roll.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.utils.StringUtils; +import com.klp.mes.roll.domain.MesRollInfo; +import com.klp.mes.roll.domain.bo.MesRollInfoBo; +import com.klp.mes.roll.domain.vo.MesRollInfoVo; +import com.klp.mes.roll.domain.vo.MesRollChangeVo; +import com.klp.mes.roll.mapper.MesRollChangeMapper; +import com.klp.mes.roll.mapper.MesRollInfoMapper; +import com.klp.mes.roll.service.IMesRollInfoService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 轧辊库 Service 实现 + */ +@RequiredArgsConstructor +@Service +public class MesRollInfoServiceImpl implements IMesRollInfoService { + + private final MesRollInfoMapper baseMapper; + private final MesRollChangeMapper rollChangeMapper; + + @Override + public MesRollInfoVo queryById(Long rollId) { + return baseMapper.selectVoById(rollId); + } + + @Override + public TableDataInfo queryPageList(MesRollInfoBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(MesRollInfoBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + @Override + public Map queryStatusStats() { + List> rows = baseMapper.selectStatusStats(); + Map result = new HashMap(8); + int total = 0; + for (Map row : rows) { + String status = (String) row.get("status"); + Number cnt = (Number) row.get("cnt"); + result.put(status, cnt.intValue()); + total += cnt.intValue(); + } + result.put("total", total); + return result; + } + + @Override + public List queryRollNoList(String rollType, String status) { + return baseMapper.selectRollNoList(rollType, status); + } + + private LambdaQueryWrapper buildQueryWrapper(MesRollInfoBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + 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()); + lqw.orderByAsc(MesRollInfo::getRollType, MesRollInfo::getRollId); + return lqw; + } + + @Override + public Long insertByBo(MesRollInfoBo bo) { + MesRollInfo add = BeanUtil.toBean(bo, MesRollInfo.class); + if (StringUtils.isBlank(add.getStatus())) { + add.setStatus("Offline"); + } + if (add.getGrindCount() == null) { + add.setGrindCount(0); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setRollId(add.getRollId()); + } + return add.getRollId(); + } + + @Override + public Boolean updateByBo(MesRollInfoBo bo) { + MesRollInfo update = BeanUtil.toBean(bo, MesRollInfo.class); + return baseMapper.updateById(update) > 0; + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean scrapRoll(Long rollId) { + MesRollInfo current = baseMapper.selectById(rollId); + if (current == null || !"Offline".equals(current.getStatus())) { + throw new RuntimeException("只有离线状态的轧辊才可封闭"); + } + MesRollInfo update = new MesRollInfo(); + update.setRollId(rollId); + update.setStatus("Scrapped"); + return baseMapper.updateById(update) > 0; + } + + @Override + public void syncStatusFromChange() { + // 从每个机架最新换辊记录中取出在机辊号,更新为 Online + for (String standNo : Arrays.asList("1#", "2#")) { + MesRollChangeVo latest = rollChangeMapper.selectLatestByStand(standNo); + if (latest == null) continue; + for (String rollNo : Arrays.asList( + latest.getUpperWrNo(), latest.getLowerWrNo(), + latest.getUpperBrNo(), latest.getLowerBrNo())) { + if (StringUtils.isNotBlank(rollNo)) { + baseMapper.updateStatusByRollNo(rollNo, "Online"); + } + } + } + } +} 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 new file mode 100644 index 00000000..46f66e5c --- /dev/null +++ b/klp-mes/src/main/java/com/klp/mes/roll/service/impl/MesRollStandbyServiceImpl.java @@ -0,0 +1,85 @@ +package com.klp.mes.roll.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.klp.common.utils.StringUtils; +import com.klp.mes.roll.domain.MesRollStandby; +import com.klp.mes.roll.domain.bo.MesRollStandbyBo; +import com.klp.mes.roll.domain.vo.MesRollStandbyVo; +import com.klp.mes.roll.mapper.MesRollInfoMapper; +import com.klp.mes.roll.mapper.MesRollStandbyMapper; +import com.klp.mes.roll.service.IMesRollStandbyService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; + +/** + * 下批轧辊 Service 实现 + */ +@RequiredArgsConstructor +@Service +public class MesRollStandbyServiceImpl implements IMesRollStandbyService { + + private final MesRollStandbyMapper baseMapper; + private final MesRollInfoMapper rollInfoMapper; + + @Override + public MesRollStandbyVo queryById(Long standbyId) { + return baseMapper.selectVoById(standbyId); + } + + @Override + public List queryByStand(String standNo) { + return baseMapper.selectByStand(standNo); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Long addStandby(MesRollStandbyBo bo) { + MesRollStandby add = BeanUtil.toBean(bo, MesRollStandby.class); + if (add.getReadyTime() == null) { + add.setReadyTime(new Date()); + } + baseMapper.insert(add); + // 将该辊状态更新为 Standby(下批待用) + if (StringUtils.isNotBlank(add.getRollNo())) { + rollInfoMapper.updateStatusByRollNo(add.getRollNo(), "Standby"); + } + return add.getStandbyId(); + } + + @Override + public Boolean updateByBo(MesRollStandbyBo bo) { + MesRollStandby update = BeanUtil.toBean(bo, MesRollStandby.class); + return baseMapper.updateById(update) > 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteById(Long standbyId) { + MesRollStandbyVo vo = baseMapper.selectVoById(standbyId); + boolean ok = baseMapper.deleteById(standbyId) > 0; + // 只有仍处于 Standby 状态时才回退为 Offline(若已换上变 Online 则不干涉) + if (ok && vo != null && StringUtils.isNotBlank(vo.getRollNo())) { + rollInfoMapper.updateStatusByRollNoIfStatus(vo.getRollNo(), "Offline", "Standby"); + } + return ok; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean clearByStand(String standNo) { + // 先查出所有辊号再清空 + List list = baseMapper.selectByStand(standNo); + int rows = baseMapper.clearByStand(standNo); + for (MesRollStandbyVo vo : list) { + if (StringUtils.isNotBlank(vo.getRollNo())) { + // 只有仍处于 Standby 状态时才回退为 Offline(换辊后已变 Online 的不动) + rollInfoMapper.updateStatusByRollNoIfStatus(vo.getRollNo(), "Offline", "Standby"); + } + } + return rows > 0; + } +} diff --git a/klp-mes/src/main/resources/mapper/roll/MesRollChangeMapper.xml b/klp-mes/src/main/resources/mapper/roll/MesRollChangeMapper.xml new file mode 100644 index 00000000..851f3784 --- /dev/null +++ b/klp-mes/src/main/resources/mapper/roll/MesRollChangeMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + diff --git a/klp-mes/src/main/resources/mapper/roll/MesRollInfoMapper.xml b/klp-mes/src/main/resources/mapper/roll/MesRollInfoMapper.xml new file mode 100644 index 00000000..c2b0e2f1 --- /dev/null +++ b/klp-mes/src/main/resources/mapper/roll/MesRollInfoMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + UPDATE mes_roll_info + SET status = #{status}, update_time = NOW() + WHERE del_flag = 0 AND roll_no = #{rollNo} + + + + UPDATE mes_roll_info + SET status = #{status}, update_time = NOW() + WHERE del_flag = 0 AND roll_no = #{rollNo} AND status = #{onlyIfStatus} + + + diff --git a/klp-mes/src/main/resources/mapper/roll/MesRollStandbyMapper.xml b/klp-mes/src/main/resources/mapper/roll/MesRollStandbyMapper.xml new file mode 100644 index 00000000..7d974f7b --- /dev/null +++ b/klp-mes/src/main/resources/mapper/roll/MesRollStandbyMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + UPDATE mes_roll_standby + SET del_flag = 1 + WHERE del_flag = 0 + AND stand_no = #{standNo} + + + diff --git a/klp-ui/src/api/mes/roll/rollChange.js b/klp-ui/src/api/mes/roll/rollChange.js new file mode 100644 index 00000000..0e0a5eb1 --- /dev/null +++ b/klp-ui/src/api/mes/roll/rollChange.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 查询换辊记录分页列表(支持按机架、类型、时间筛选) +export function listRollChange(query) { + return request({ + url: '/mes/rollChange/list', + method: 'get', + params: query + }) +} + +// 查询指定机架当前在机轧辊(最近一次换辊记录) +export function getCurrentRolls(standNo) { + return request({ + url: '/mes/rollChange/current', + method: 'get', + params: { standNo } + }) +} + +// 查询指定机架当前轧辊实时工作长度(m) +export function getWorkLength(standNo) { + return request({ + url: '/mes/rollChange/workLength', + method: 'get', + params: { standNo } + }) +} + +// 查询换辊记录详细 +export function getRollChange(changeId) { + return request({ + url: '/mes/rollChange/' + changeId, + method: 'get' + }) +} + +// 新增换辊记录(自动同步辊状态为 Online) +export function addRollChange(data) { + return request({ + url: '/mes/rollChange', + method: 'post', + data: data + }) +} + +// 修改换辊记录 +export function updateRollChange(data) { + return request({ + url: '/mes/rollChange', + method: 'put', + data: data + }) +} + +// 删除换辊记录 +export function delRollChange(changeIds) { + return request({ + url: '/mes/rollChange/' + changeIds, + method: 'delete' + }) +} diff --git a/klp-ui/src/api/mes/roll/rollInfo.js b/klp-ui/src/api/mes/roll/rollInfo.js new file mode 100644 index 00000000..b2295cdd --- /dev/null +++ b/klp-ui/src/api/mes/roll/rollInfo.js @@ -0,0 +1,87 @@ +import request from '@/utils/request' + +// 查询轧辊库分页列表 +export function listRollInfo(query) { + return request({ + url: '/mes/rollInfo/list', + method: 'get', + params: query + }) +} + +// 查询状态统计卡片 +export function getRollStats() { + return request({ + url: '/mes/rollInfo/stats', + method: 'get' + }) +} + +// 查询轧辊编号下拉(rollType/status 均可为空,不传则不过滤) +export function listRollOptions(rollType, status) { + return request({ + url: '/mes/rollInfo/options', + method: 'get', + params: { rollType, status } + }) +} + +// 查询轧辊详细 +export function getRollInfo(rollId) { + return request({ + url: '/mes/rollInfo/' + rollId, + method: 'get' + }) +} + +// 新增轧辊 +export function addRollInfo(data) { + return request({ + url: '/mes/rollInfo', + method: 'post', + data: data + }) +} + +// 修改轧辊 +export function updateRollInfo(data) { + return request({ + url: '/mes/rollInfo', + method: 'put', + data: data + }) +} + +// 删除轧辊(仅报废状态可删) +export function delRollInfo(rollIds) { + return request({ + url: '/mes/rollInfo/' + rollIds, + method: 'delete' + }) +} + +// 封闭轧辊(→报废) +export function scrapRollInfo(rollId) { + return request({ + url: '/mes/rollInfo/' + rollId + '/scrap', + method: 'put' + }) +} + +// 从换辊记录同步在线状态 +export function syncRollStatus() { + return request({ + url: '/mes/rollInfo/syncStatus', + method: 'post' + }) +} + +// 导出轧辊 +export function exportRollInfo(query) { + return request({ + url: '/mes/rollInfo/export', + method: 'post', + params: query, + responseType: 'blob' + }) +} diff --git a/klp-ui/src/api/mes/roll/rollStandby.js b/klp-ui/src/api/mes/roll/rollStandby.js new file mode 100644 index 00000000..05a0dc41 --- /dev/null +++ b/klp-ui/src/api/mes/roll/rollStandby.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +// 查询指定机架下批轧辊列表 +export function listRollStandby(standNo) { + return request({ + url: '/mes/rollStandby/list', + method: 'get', + params: { standNo } + }) +} + +// 查询下批轧辊详细 +export function getRollStandby(standbyId) { + return request({ + url: '/mes/rollStandby/' + standbyId, + method: 'get' + }) +} + +// 新增下批轧辊(自动同步辊状态为 Standby) +export function addRollStandby(data) { + return request({ + url: '/mes/rollStandby', + method: 'post', + data: data + }) +} + +// 修改下批轧辊 +export function updateRollStandby(data) { + return request({ + url: '/mes/rollStandby', + method: 'put', + data: data + }) +} + +// 删除单条下批轧辊(自动恢复辊状态为 Offline) +export function delRollStandby(standbyId) { + return request({ + url: '/mes/rollStandby/' + standbyId, + method: 'delete' + }) +} + +// 清空指定机架全部下批轧辊 +export function clearRollStandby(standNo) { + return request({ + url: '/mes/rollStandby/clear', + method: 'delete', + params: { standNo } + }) +} diff --git a/klp-ui/src/components/KLPUI/KLPTable/index.vue b/klp-ui/src/components/KLPUI/KLPTable/index.vue index c2e8d59d..cd952337 100644 --- a/klp-ui/src/components/KLPUI/KLPTable/index.vue +++ b/klp-ui/src/components/KLPUI/KLPTable/index.vue @@ -8,8 +8,8 @@
- +