双机架轧辊管理

This commit is contained in:
2026-05-07 11:19:32 +08:00
parent d71b1c4959
commit a5280923e1
32 changed files with 3088 additions and 4 deletions

View File

@@ -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<MesRollChangeVo> list(MesRollChangeBo bo, PageQuery pageQuery) {
return iMesRollChangeService.queryPageList(bo, pageQuery);
}
/**
* 查询指定机架当前在机轧辊(最近一次换辊记录)
* GET /mes/rollChange/current?standNo=1%23
*/
@GetMapping("/current")
public R<MesRollChangeVo> current(@RequestParam String standNo) {
return R.ok(iMesRollChangeService.queryCurrentByStand(standNo));
}
/**
* 查询指定机架当前轧辊的实时工作长度m
* GET /mes/rollChange/workLength?standNo=1%23
*/
@GetMapping("/workLength")
public R<BigDecimal> workLength(@RequestParam String standNo) {
return R.ok(iMesRollChangeService.queryRealtimeWorkLength(standNo));
}
/** 详情 */
@GetMapping("/{changeId}")
public R<MesRollChangeVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long changeId) {
return R.ok(iMesRollChangeService.queryById(changeId));
}
/** 新增换辊记录 */
@Log(title = "换辊记录", businessType = BusinessType.INSERT)
@RepeatSubmit
@PostMapping
public R<Long> add(@Validated @RequestBody MesRollChangeBo bo) {
return R.ok(iMesRollChangeService.addChange(bo));
}
/** 修改换辊记录 */
@Log(title = "换辊记录", businessType = BusinessType.UPDATE)
@RepeatSubmit
@PutMapping
public R<Void> edit(@Validated @RequestBody MesRollChangeBo bo) {
return toAjax(iMesRollChangeService.updateByBo(bo));
}
/** 删除换辊记录 */
@Log(title = "换辊记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{changeIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] changeIds) {
return toAjax(iMesRollChangeService.deleteWithValidByIds(Arrays.asList(changeIds), true));
}
}

View File

@@ -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<MesRollInfoVo> list(MesRollInfoBo bo, PageQuery pageQuery) {
return iMesRollInfoService.queryPageList(bo, pageQuery);
}
/** 状态统计卡片数据 */
@GetMapping("/stats")
public R<Map<String, Object>> stats() {
return R.ok(iMesRollInfoService.queryStatusStats());
}
/** 轧辊编号下拉列表(按辊型 + 状态过滤,均可为空) */
@GetMapping("/options")
public R<List<String>> options(String rollType, String status) {
return R.ok(iMesRollInfoService.queryRollNoList(rollType, status));
}
/** 详情 */
@GetMapping("/{rollId}")
public R<MesRollInfoVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long rollId) {
return R.ok(iMesRollInfoService.queryById(rollId));
}
/** 新增 */
@Log(title = "轧辊库", businessType = BusinessType.INSERT)
@RepeatSubmit
@PostMapping
public R<Long> add(@Validated(AddGroup.class) @RequestBody MesRollInfoBo bo) {
return R.ok(iMesRollInfoService.insertByBo(bo));
}
/** 修改 */
@Log(title = "轧辊库", businessType = BusinessType.UPDATE)
@RepeatSubmit
@PutMapping
public R<Void> edit(@Validated(EditGroup.class) @RequestBody MesRollInfoBo bo) {
return toAjax(iMesRollInfoService.updateByBo(bo));
}
/** 删除 */
@Log(title = "轧辊库", businessType = BusinessType.DELETE)
@DeleteMapping("/{rollIds}")
public R<Void> 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<Void> scrap(@NotNull(message = "主键不能为空") @PathVariable Long rollId) {
return toAjax(iMesRollInfoService.scrapRoll(rollId));
}
/**
* 从换辊记录同步在线状态
* 将当前各机架在机轧辊的状态强制修正为 Online解决状态数据不一致问题
*/
@Log(title = "轧辊库-状态同步", businessType = BusinessType.UPDATE)
@PostMapping("/syncStatus")
public R<Void> syncStatus() {
iMesRollInfoService.syncStatusFromChange();
return R.ok();
}
/** 导出 */
@Log(title = "轧辊库", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(MesRollInfoBo bo, HttpServletResponse response) {
List<MesRollInfoVo> list = iMesRollInfoService.queryList(bo);
ExcelUtil.exportExcel(list, "轧辊数据", MesRollInfoVo.class, response);
}
}

View File

@@ -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<MesRollStandbyVo>> list(@RequestParam String standNo) {
return R.ok(iMesRollStandbyService.queryByStand(standNo));
}
/** 详情 */
@GetMapping("/{standbyId}")
public R<MesRollStandbyVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long standbyId) {
return R.ok(iMesRollStandbyService.queryById(standbyId));
}
/** 新增下批轧辊 */
@Log(title = "下批轧辊", businessType = BusinessType.INSERT)
@RepeatSubmit
@PostMapping
public R<Long> add(@Validated(AddGroup.class) @RequestBody MesRollStandbyBo bo) {
return R.ok(iMesRollStandbyService.addStandby(bo));
}
/** 修改下批轧辊 */
@Log(title = "下批轧辊", businessType = BusinessType.UPDATE)
@RepeatSubmit
@PutMapping
public R<Void> edit(@Validated @RequestBody MesRollStandbyBo bo) {
return toAjax(iMesRollStandbyService.updateByBo(bo));
}
/** 删除单条下批轧辊,同时将辊状态恢复为 Offline */
@Log(title = "下批轧辊", businessType = BusinessType.DELETE)
@DeleteMapping("/{standbyId}")
public R<Void> 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<Void> clear(@RequestParam String standNo) {
return toAjax(iMesRollStandbyService.clearByStand(standNo));
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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
*
* 辊型rollTypeWR = 工作辊BR = 支撑辊
* 辊位positionUP = 上DOWN = 下
* 机架standNo1# / 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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<MesRollChangeMapper, MesRollChange, MesRollChangeVo> {
/** 查询指定机架最新一次换辊记录(当前在机轧辊) */
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);
}

View File

@@ -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<MesRollInfoMapper, MesRollInfo, MesRollInfoVo> {
/**
* 按状态统计数量(用于总览卡片)
*/
List<Map<String, Object>> selectStatusStats();
/**
* 查询轧辊编号列表(用于下拉选择,可按辊型和状态过滤)
*/
List<String> 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);
}

View File

@@ -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<MesRollStandbyMapper, MesRollStandby, MesRollStandbyVo> {
/** 按机架查询下批轧辊列表 */
List<MesRollStandbyVo> selectByStand(@Param("standNo") String standNo);
/** 清空某机架的下批轧辊 */
int clearByStand(@Param("standNo") String standNo);
}

View File

@@ -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<MesRollChangeVo> queryPageList(MesRollChangeBo bo, PageQuery pageQuery);
/** 新增换辊记录,同步将涉及的轧辊状态更新为 Online */
Long addChange(MesRollChangeBo bo);
Boolean updateByBo(MesRollChangeBo bo);
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 查询指定机架当前在机轧辊的实时工作长度m
* 从最近一次换辊时间到现在,统计 WMS 卷料实测长度之和
*/
BigDecimal queryRealtimeWorkLength(String standNo);
}

View File

@@ -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<MesRollInfoVo> queryPageList(MesRollInfoBo bo, PageQuery pageQuery);
List<MesRollInfoVo> queryList(MesRollInfoBo bo);
/** 按状态统计(总览卡片) */
Map<String, Object> queryStatusStats();
/** 轧辊编号下拉列表status 为 null 时不过滤状态) */
List<String> queryRollNoList(String rollType, String status);
Long insertByBo(MesRollInfoBo bo);
Boolean updateByBo(MesRollInfoBo bo);
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/** 封闭轧辊:状态设为 Scrapped */
Boolean scrapRoll(Long rollId);
/**
* 从换辊记录同步在线状态:
* 每个机架最新一次换辊记录中的 4 支辊 → Online
* 下批辊列表中的辊 → Standby已由 addStandby 维护,此处不重复处理);
* 其余不变,仅修正当前在机辊的状态数据不一致问题。
*/
void syncStatusFromChange();
}

View File

@@ -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<MesRollStandbyVo> queryByStand(String standNo);
/** 新增下批轧辊,同步将该辊状态更新为 Standby */
Long addStandby(MesRollStandbyBo bo);
/** 修改下批轧辊 */
Boolean updateByBo(MesRollStandbyBo bo);
/** 删除某条下批轧辊,同步将该辊状态恢复为 Offline */
Boolean deleteById(Long standbyId);
/** 清空指定机架的全部下批轧辊,并将对应辊状态恢复为 Offline */
Boolean clearByStand(String standNo);
}

View File

@@ -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<MesRollChangeVo> queryPageList(MesRollChangeBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<MesRollChange> lqw = buildQueryWrapper(bo);
Page<MesRollChangeVo> 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<MesRollChange> buildQueryWrapper(MesRollChangeBo bo) {
LambdaQueryWrapper<MesRollChange> 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<String> 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<Long> ids, Boolean isValid) {
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -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<MesRollInfoVo> queryPageList(MesRollInfoBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<MesRollInfo> lqw = buildQueryWrapper(bo);
Page<MesRollInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public List<MesRollInfoVo> queryList(MesRollInfoBo bo) {
LambdaQueryWrapper<MesRollInfo> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
@Override
public Map<String, Object> queryStatusStats() {
List<Map<String, Object>> rows = baseMapper.selectStatusStats();
Map<String, Object> result = new HashMap<String, Object>(8);
int total = 0;
for (Map<String, Object> 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<String> queryRollNoList(String rollType, String status) {
return baseMapper.selectRollNoList(rollType, status);
}
private LambdaQueryWrapper<MesRollInfo> buildQueryWrapper(MesRollInfoBo bo) {
LambdaQueryWrapper<MesRollInfo> 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<Long> 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");
}
}
}
}
}

View File

@@ -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<MesRollStandbyVo> 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<MesRollStandbyVo> 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;
}
}

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.klp.mes.roll.mapper.MesRollChangeMapper">
<!-- 查询指定机架最新一次换辊记录(即当前在机轧辊) -->
<select id="selectLatestByStand" resultType="com.klp.mes.roll.domain.vo.MesRollChangeVo">
SELECT change_id, change_no, change_time, stand_no, change_type, change_status, operator,
upper_wr_no, upper_wr_dia, lower_wr_no, lower_wr_dia,
upper_br_no, upper_br_dia, lower_br_no, lower_br_dia,
remark, create_time
FROM mes_roll_change
WHERE del_flag = 0
AND stand_no = #{standNo}
ORDER BY change_time DESC, change_id DESC
LIMIT 1
</select>
<!-- 查询同机架在本次换辊之后最近一次换辊的时间 -->
<select id="selectNextChangeTime" resultType="java.util.Date">
SELECT MIN(change_time)
FROM mes_roll_change
WHERE del_flag = 0
AND stand_no = #{standNo}
AND change_time > #{changeTime}
</select>
<!--
统计 [startTime, endTime) 时间段内,
符合条件的 wms_coil_pending_action 记录关联的卷料实测长度之和mm
endTime 为 null 时取 NOW() 作为上界。
processed_coil_ids 存储逗号分隔的 material_id 列表,使用 FIND_IN_SET 关联。
-->
<select id="selectWorkLength" resultType="java.math.BigDecimal">
SELECT IFNULL(SUM(mc.actual_length), 0)
FROM wms_coil_pending_action cpa
INNER JOIN wms_material_coil mc
ON FIND_IN_SET(mc.coil_id, cpa.processed_coil_ids) > 0
WHERE cpa.del_flag = 0
AND cpa.action_status = 2
AND cpa.action_type IN (205, 504, 524)
AND cpa.create_time &gt;= #{startTime}
AND cpa.create_time &lt; IFNULL(#{endTime}, NOW())
AND mc.create_time &gt;= #{startTime}
AND mc.create_time &lt; IFNULL(#{endTime}, NOW())
</select>
</mapper>

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.klp.mes.roll.mapper.MesRollInfoMapper">
<select id="selectStatusStats" resultType="map">
SELECT status, COUNT(*) AS cnt
FROM mes_roll_info
WHERE del_flag = 0
GROUP BY status
</select>
<select id="selectRollNoList" resultType="string">
SELECT roll_no FROM mes_roll_info
WHERE del_flag = 0
AND status != 'Scrapped'
<if test="rollType != null and rollType != ''">
AND roll_type = #{rollType}
</if>
<if test="status != null and status != ''">
AND status = #{status}
</if>
ORDER BY roll_no ASC
</select>
<select id="selectByRollNo" resultType="com.klp.mes.roll.domain.MesRollInfo">
SELECT * FROM mes_roll_info
WHERE del_flag = 0 AND roll_no = #{rollNo}
LIMIT 1
</select>
<update id="updateStatusByRollNo">
UPDATE mes_roll_info
SET status = #{status}, update_time = NOW()
WHERE del_flag = 0 AND roll_no = #{rollNo}
</update>
<update id="updateStatusByRollNoIfStatus">
UPDATE mes_roll_info
SET status = #{status}, update_time = NOW()
WHERE del_flag = 0 AND roll_no = #{rollNo} AND status = #{onlyIfStatus}
</update>
</mapper>

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.klp.mes.roll.mapper.MesRollStandbyMapper">
<!-- 按机架查询下批轧辊,附带辊位中文标签 -->
<select id="selectByStand" resultType="com.klp.mes.roll.domain.vo.MesRollStandbyVo">
SELECT
standby_id, stand_no, roll_no, roll_type, position,
CASE
WHEN roll_type = 'BR' AND position = 'UP' THEN '上支撑辊'
WHEN roll_type = 'WR' AND position = 'UP' THEN '上工作辊'
WHEN roll_type = 'WR' AND position = 'DOWN' THEN '下工作辊'
WHEN roll_type = 'BR' AND position = 'DOWN' THEN '下支撑辊'
ELSE CONCAT(position, roll_type)
END AS position_label,
diameter, roughness, crown, ready_time, remark, create_time
FROM mes_roll_standby
WHERE del_flag = 0
AND stand_no = #{standNo}
ORDER BY
FIELD(roll_type, 'BR', 'WR', 'WR', 'BR'),
FIELD(position, 'UP', 'UP', 'DOWN', 'DOWN')
</select>
<!-- 逻辑删除指定机架所有下批轧辊(清空) -->
<update id="clearByStand">
UPDATE mes_roll_standby
SET del_flag = 1
WHERE del_flag = 0
AND stand_no = #{standNo}
</update>
</mapper>