From de7ec604dd4a42bec161d2b4df13a5bd5b99cc7f Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Sat, 6 Jun 2026 15:23:50 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(wms):=20=E4=BF=AE=E5=A4=8D=E7=90=86?= =?UTF-8?q?=E8=AE=BA=E9=95=BF=E5=BA=A6=E8=AE=A1=E7=AE=97=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除实际宽度比较条件,简化理论厚度计算判断逻辑 - 保持体积计算公式不变,仅调整条件判断流程 - 确保在缺少理论厚度且有实际长度时能正确计算厚度值 --- .../java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java index 0a21c5b8..f886c130 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java @@ -1117,7 +1117,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { BigDecimal volume = weight.multiply(new BigDecimal("1000")).divide(new BigDecimal("7.85"), 10, RoundingMode.HALF_UP); // 计算理论厚度(需要实测长度) - if (bo.getTheoreticalThickness() == null && bo.getActualLength() != null && bo.getActualWidth().compareTo(BigDecimal.ZERO) > 0) { + if (bo.getTheoreticalThickness() == null && bo.getActualLength() != null) { BigDecimal length = new BigDecimal(bo.getActualLength()); BigDecimal theoreticalThickness = volume.divide(length, 10, RoundingMode.HALF_UP).divide(width, 10, RoundingMode.HALF_UP).multiply(new BigDecimal("1000")); bo.setTheoreticalThickness(theoreticalThickness); From cbebd5b6d6be1c3e46d0205271dc3e3c3685edf7 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Sat, 6 Jun 2026 15:52:29 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E9=92=A2?= =?UTF-8?q?=E5=8D=B7=E9=80=9A=E7=94=A8=E5=91=8A=E8=AD=A6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建 WmsMaterialWarning 实体类定义告警数据结构 - 实现 IWmsMaterialWarningService 接口提供告警业务方法 - 开发 WmsMaterialWarningController 控制器支持增删改查操作 - 设计 WmsMaterialWarningBo 和 WmsMaterialWarningVo 数据传输对象 - 配置 WmsMaterialWarningMapper 数据访问层和 XML 映射文件 - 实现 WmsMaterialWarningServiceImpl 业务逻辑处理类 - 添加告警类型、级别、状态等字段支持长度/厚度/宽度维度监控 - 集成 Excel 导出功能便于告警数据统计分析 --- .../WmsMaterialWarningController.java | 99 ++++++++++++++ .../com/klp/domain/WmsMaterialWarning.java | 92 +++++++++++++ .../klp/domain/bo/WmsMaterialWarningBo.java | 99 ++++++++++++++ .../klp/domain/vo/WmsMaterialWarningVo.java | 116 +++++++++++++++++ .../klp/mapper/WmsMaterialWarningMapper.java | 15 +++ .../service/IWmsMaterialWarningService.java | 49 +++++++ .../impl/WmsMaterialWarningServiceImpl.java | 121 ++++++++++++++++++ .../mapper/klp/WmsMaterialWarningMapper.xml | 31 +++++ 8 files changed, 622 insertions(+) create mode 100644 klp-wms/src/main/java/com/klp/controller/WmsMaterialWarningController.java create mode 100644 klp-wms/src/main/java/com/klp/domain/WmsMaterialWarning.java create mode 100644 klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialWarningBo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/WmsMaterialWarningVo.java create mode 100644 klp-wms/src/main/java/com/klp/mapper/WmsMaterialWarningMapper.java create mode 100644 klp-wms/src/main/java/com/klp/service/IWmsMaterialWarningService.java create mode 100644 klp-wms/src/main/java/com/klp/service/impl/WmsMaterialWarningServiceImpl.java create mode 100644 klp-wms/src/main/resources/mapper/klp/WmsMaterialWarningMapper.xml diff --git a/klp-wms/src/main/java/com/klp/controller/WmsMaterialWarningController.java b/klp-wms/src/main/java/com/klp/controller/WmsMaterialWarningController.java new file mode 100644 index 00000000..ea8721d8 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/controller/WmsMaterialWarningController.java @@ -0,0 +1,99 @@ +package com.klp.controller; + +import java.util.List; +import java.util.Arrays; + +import lombok.RequiredArgsConstructor; +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.*; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import com.klp.common.annotation.RepeatSubmit; +import com.klp.common.annotation.Log; +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.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.domain.vo.WmsMaterialWarningVo; +import com.klp.domain.bo.WmsMaterialWarningBo; +import com.klp.service.IWmsMaterialWarningService; +import com.klp.common.core.page.TableDataInfo; + +/** + * 钢卷通用维度告警(长度/厚度/宽度) + * + * @author klp + * @date 2026-06-06 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/wms/materialWarning") +public class WmsMaterialWarningController extends BaseController { + + private final IWmsMaterialWarningService iWmsMaterialWarningService; + + /** + * 查询钢卷通用维度告警(长度/厚度/宽度)列表 + */ + @GetMapping("/list") + public TableDataInfo list(WmsMaterialWarningBo bo, PageQuery pageQuery) { + return iWmsMaterialWarningService.queryPageList(bo, pageQuery); + } + + /** + * 导出钢卷通用维度告警(长度/厚度/宽度)列表 + */ + @Log(title = "钢卷通用维度告警(长度/厚度/宽度)", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(WmsMaterialWarningBo bo, HttpServletResponse response) { + List list = iWmsMaterialWarningService.queryList(bo); + ExcelUtil.exportExcel(list, "钢卷通用维度告警(长度/厚度/宽度)", WmsMaterialWarningVo.class, response); + } + + /** + * 获取钢卷通用维度告警(长度/厚度/宽度)详细信息 + * + * @param warningId 主键 + */ + @GetMapping("/{warningId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long warningId) { + return R.ok(iWmsMaterialWarningService.queryById(warningId)); + } + + /** + * 新增钢卷通用维度告警(长度/厚度/宽度) + */ + @Log(title = "钢卷通用维度告警(长度/厚度/宽度)", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody WmsMaterialWarningBo bo) { + return toAjax(iWmsMaterialWarningService.insertByBo(bo)); + } + + /** + * 修改钢卷通用维度告警(长度/厚度/宽度) + */ + @Log(title = "钢卷通用维度告警(长度/厚度/宽度)", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody WmsMaterialWarningBo bo) { + return toAjax(iWmsMaterialWarningService.updateByBo(bo)); + } + + /** + * 删除钢卷通用维度告警(长度/厚度/宽度) + * + * @param warningIds 主键串 + */ + @Log(title = "钢卷通用维度告警(长度/厚度/宽度)", businessType = BusinessType.DELETE) + @DeleteMapping("/{warningIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] warningIds) { + return toAjax(iWmsMaterialWarningService.deleteWithValidByIds(Arrays.asList(warningIds), true)); + } +} diff --git a/klp-wms/src/main/java/com/klp/domain/WmsMaterialWarning.java b/klp-wms/src/main/java/com/klp/domain/WmsMaterialWarning.java new file mode 100644 index 00000000..eb1e15f0 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/WmsMaterialWarning.java @@ -0,0 +1,92 @@ +package com.klp.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 钢卷通用维度告警(长度/厚度/宽度)对象 wms_material_warning + * + * @author klp + * @date 2026-06-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("wms_material_warning") +public class WmsMaterialWarning extends BaseEntity { + + private static final long serialVersionUID=1L; + + /** + * 告警ID + */ + @TableId(value = "warning_id") + private Long warningId; + /** + * 钢卷ID + */ + private Long coilId; + /** + * 告警类型(LENGTH=长度, THICKNESS=厚度, WIDTH=宽度) + */ + private String warningType; + /** + * 理论值 + */ + private BigDecimal theoreticalVal; + /** + * 实测值 + */ + private BigDecimal actualVal; + /** + * 允许偏差(数值/百分比) + */ + private BigDecimal allowDeviation; + /** + * 实际偏差值 + */ + private BigDecimal deviationValue; + /** + * 偏差率(%) + */ + private BigDecimal deviationRate; + /** + * 告警级别(WARNING/ERROR/CRITICAL) + */ + private String warningLevel; + /** + * 告警说明 + */ + private String warningMsg; + /** + * 告警状态(0=未处理,1=已处理,2=已忽略) + */ + private Integer warningStatus; + /** + * 处理人 + */ + private String handleBy; + /** + * 处理时间 + */ + private Date handleTime; + /** + * 处理备注 + */ + private String handleRemark; + /** + * 删除标志(0=正常,1=已删除) + */ + @TableLogic + private Integer delFlag; + /** + * 备注 + */ + private String remark; + +} diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialWarningBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialWarningBo.java new file mode 100644 index 00000000..2a8edff8 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialWarningBo.java @@ -0,0 +1,99 @@ +package com.klp.domain.bo; + +import com.klp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.*; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 钢卷通用维度告警(长度/厚度/宽度)业务对象 wms_material_warning + * + * @author klp + * @date 2026-06-06 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +public class WmsMaterialWarningBo extends BaseEntity { + + /** + * 告警ID + */ + private Long warningId; + + /** + * 钢卷ID + */ + private Long coilId; + + /** + * 告警类型(LENGTH=长度, THICKNESS=厚度, WIDTH=宽度) + */ + private String warningType; + + /** + * 理论值 + */ + private BigDecimal theoreticalVal; + + /** + * 实测值 + */ + private BigDecimal actualVal; + + /** + * 允许偏差(数值/百分比) + */ + private BigDecimal allowDeviation; + + /** + * 实际偏差值 + */ + private BigDecimal deviationValue; + + /** + * 偏差率(%) + */ + private BigDecimal deviationRate; + + /** + * 告警级别(WARNING/ERROR/CRITICAL) + */ + private String warningLevel; + + /** + * 告警说明 + */ + private String warningMsg; + + /** + * 告警状态(0=未处理,1=已处理,2=已忽略) + */ + private Integer warningStatus; + + /** + * 处理人 + */ + private String handleBy; + + /** + * 处理时间 + */ + private Date handleTime; + + /** + * 处理备注 + */ + private String handleRemark; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsMaterialWarningVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsMaterialWarningVo.java new file mode 100644 index 00000000..7f6437d5 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsMaterialWarningVo.java @@ -0,0 +1,116 @@ +package com.klp.domain.vo; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.klp.common.annotation.ExcelDictFormat; +import com.klp.common.convert.ExcelDictConvert; +import lombok.Data; + + +/** + * 钢卷通用维度告警(长度/厚度/宽度)视图对象 wms_material_warning + * + * @author klp + * @date 2026-06-06 + */ +@Data +@ExcelIgnoreUnannotated +public class WmsMaterialWarningVo { + + private static final long serialVersionUID = 1L; + + /** + * 告警ID + */ + @ExcelProperty(value = "告警ID") + private Long warningId; + + /** + * 钢卷ID + */ + @ExcelProperty(value = "钢卷ID") + private Long coilId; + + /** + * 告警类型(LENGTH=长度, THICKNESS=厚度, WIDTH=宽度) + */ + @ExcelProperty(value = "告警类型(LENGTH=长度, THICKNESS=厚度, WIDTH=宽度)") + private String warningType; + + /** + * 理论值 + */ + @ExcelProperty(value = "理论值") + private BigDecimal theoreticalVal; + + /** + * 实测值 + */ + @ExcelProperty(value = "实测值") + private BigDecimal actualVal; + + /** + * 允许偏差(数值/百分比) + */ + @ExcelProperty(value = "允许偏差(数值/百分比)") + private BigDecimal allowDeviation; + + /** + * 实际偏差值 + */ + @ExcelProperty(value = "实际偏差值") + private BigDecimal deviationValue; + + /** + * 偏差率(%) + */ + @ExcelProperty(value = "偏差率(%)") + private BigDecimal deviationRate; + + /** + * 告警级别(WARNING/ERROR/CRITICAL) + */ + @ExcelProperty(value = "告警级别(WARNING/ERROR/CRITICAL)") + private String warningLevel; + + /** + * 告警说明 + */ + @ExcelProperty(value = "告警说明") + private String warningMsg; + + /** + * 告警状态(0=未处理,1=已处理,2=已忽略) + */ + @ExcelProperty(value = "告警状态(0=未处理,1=已处理,2=已忽略)") + private Integer warningStatus; + + /** + * 处理人 + */ + @ExcelProperty(value = "处理人") + private String handleBy; + + /** + * 处理时间 + */ + @ExcelProperty(value = "处理时间") + private Date handleTime; + + /** + * 处理备注 + */ + @ExcelProperty(value = "处理备注") + private String handleRemark; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + +} diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsMaterialWarningMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsMaterialWarningMapper.java new file mode 100644 index 00000000..e24d1821 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/mapper/WmsMaterialWarningMapper.java @@ -0,0 +1,15 @@ +package com.klp.mapper; + +import com.klp.domain.WmsMaterialWarning; +import com.klp.domain.vo.WmsMaterialWarningVo; +import com.klp.common.core.mapper.BaseMapperPlus; + +/** + * 钢卷通用维度告警(长度/厚度/宽度)Mapper接口 + * + * @author klp + * @date 2026-06-06 + */ +public interface WmsMaterialWarningMapper extends BaseMapperPlus { + +} diff --git a/klp-wms/src/main/java/com/klp/service/IWmsMaterialWarningService.java b/klp-wms/src/main/java/com/klp/service/IWmsMaterialWarningService.java new file mode 100644 index 00000000..cce0f4b1 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/IWmsMaterialWarningService.java @@ -0,0 +1,49 @@ +package com.klp.service; + +import com.klp.domain.WmsMaterialWarning; +import com.klp.domain.vo.WmsMaterialWarningVo; +import com.klp.domain.bo.WmsMaterialWarningBo; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 钢卷通用维度告警(长度/厚度/宽度)Service接口 + * + * @author klp + * @date 2026-06-06 + */ +public interface IWmsMaterialWarningService { + + /** + * 查询钢卷通用维度告警(长度/厚度/宽度) + */ + WmsMaterialWarningVo queryById(Long warningId); + + /** + * 查询钢卷通用维度告警(长度/厚度/宽度)列表 + */ + TableDataInfo queryPageList(WmsMaterialWarningBo bo, PageQuery pageQuery); + + /** + * 查询钢卷通用维度告警(长度/厚度/宽度)列表 + */ + List queryList(WmsMaterialWarningBo bo); + + /** + * 新增钢卷通用维度告警(长度/厚度/宽度) + */ + Boolean insertByBo(WmsMaterialWarningBo bo); + + /** + * 修改钢卷通用维度告警(长度/厚度/宽度) + */ + Boolean updateByBo(WmsMaterialWarningBo bo); + + /** + * 校验并批量删除钢卷通用维度告警(长度/厚度/宽度)信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialWarningServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialWarningServiceImpl.java new file mode 100644 index 00000000..bd54d7a1 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialWarningServiceImpl.java @@ -0,0 +1,121 @@ +package com.klp.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.klp.common.core.page.TableDataInfo; +import com.klp.common.core.domain.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.klp.common.utils.StringUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import com.klp.domain.bo.WmsMaterialWarningBo; +import com.klp.domain.vo.WmsMaterialWarningVo; +import com.klp.domain.WmsMaterialWarning; +import com.klp.mapper.WmsMaterialWarningMapper; +import com.klp.service.IWmsMaterialWarningService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 钢卷通用维度告警(长度/厚度/宽度)Service业务层处理 + * + * @author klp + * @date 2026-06-06 + */ +@RequiredArgsConstructor +@Service +public class WmsMaterialWarningServiceImpl implements IWmsMaterialWarningService { + + private final WmsMaterialWarningMapper baseMapper; + + /** + * 查询钢卷通用维度告警(长度/厚度/宽度) + */ + @Override + public WmsMaterialWarningVo queryById(Long warningId){ + return baseMapper.selectVoById(warningId); + } + + /** + * 查询钢卷通用维度告警(长度/厚度/宽度)列表 + */ + @Override + public TableDataInfo queryPageList(WmsMaterialWarningBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询钢卷通用维度告警(长度/厚度/宽度)列表 + */ + @Override + public List queryList(WmsMaterialWarningBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(WmsMaterialWarningBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getCoilId() != null, WmsMaterialWarning::getCoilId, bo.getCoilId()); + lqw.eq(StringUtils.isNotBlank(bo.getWarningType()), WmsMaterialWarning::getWarningType, bo.getWarningType()); + lqw.eq(bo.getTheoreticalVal() != null, WmsMaterialWarning::getTheoreticalVal, bo.getTheoreticalVal()); + lqw.eq(bo.getActualVal() != null, WmsMaterialWarning::getActualVal, bo.getActualVal()); + lqw.eq(bo.getAllowDeviation() != null, WmsMaterialWarning::getAllowDeviation, bo.getAllowDeviation()); + lqw.eq(bo.getDeviationValue() != null, WmsMaterialWarning::getDeviationValue, bo.getDeviationValue()); + lqw.eq(bo.getDeviationRate() != null, WmsMaterialWarning::getDeviationRate, bo.getDeviationRate()); + lqw.eq(StringUtils.isNotBlank(bo.getWarningLevel()), WmsMaterialWarning::getWarningLevel, bo.getWarningLevel()); + lqw.eq(StringUtils.isNotBlank(bo.getWarningMsg()), WmsMaterialWarning::getWarningMsg, bo.getWarningMsg()); + lqw.eq(bo.getWarningStatus() != null, WmsMaterialWarning::getWarningStatus, bo.getWarningStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getHandleBy()), WmsMaterialWarning::getHandleBy, bo.getHandleBy()); + lqw.eq(bo.getHandleTime() != null, WmsMaterialWarning::getHandleTime, bo.getHandleTime()); + lqw.eq(StringUtils.isNotBlank(bo.getHandleRemark()), WmsMaterialWarning::getHandleRemark, bo.getHandleRemark()); + return lqw; + } + + /** + * 新增钢卷通用维度告警(长度/厚度/宽度) + */ + @Override + public Boolean insertByBo(WmsMaterialWarningBo bo) { + WmsMaterialWarning add = BeanUtil.toBean(bo, WmsMaterialWarning.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setWarningId(add.getWarningId()); + } + return flag; + } + + /** + * 修改钢卷通用维度告警(长度/厚度/宽度) + */ + @Override + public Boolean updateByBo(WmsMaterialWarningBo bo) { + WmsMaterialWarning update = BeanUtil.toBean(bo, WmsMaterialWarning.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(WmsMaterialWarning entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除钢卷通用维度告警(长度/厚度/宽度) + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/klp-wms/src/main/resources/mapper/klp/WmsMaterialWarningMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsMaterialWarningMapper.xml new file mode 100644 index 00000000..739b52ab --- /dev/null +++ b/klp-wms/src/main/resources/mapper/klp/WmsMaterialWarningMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7aaa59cee1a0ba45f18a1d2fe3bcd3819abb80d5 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Sat, 6 Jun 2026 16:24:35 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat(wms):=20=E6=B7=BB=E5=8A=A0=E9=92=A2?= =?UTF-8?q?=E5=8D=B7=E9=95=BF=E5=BA=A6=E5=8E=9A=E5=BA=A6=E5=81=8F=E5=B7=AE?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=91=8A=E8=AD=A6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在IWmsMaterialWarningService接口中新增checkAndInsertWarnings方法定义 - 在WmsMaterialCoilServiceImpl中注入materialWarningService依赖 - 在钢卷新增、更新、拆分等操作后自动触发偏差检查和告警插入 - 实现doCheckAndInsertWarnings方法进行长度和厚度偏差计算 - 添加checkLength方法验证长度偏差是否超过10% - 添加checkThickness方法验证厚度偏差包括偏薄ERROR和偏厚WARNING - 实现批量插入告警记录并添加异常处理和日志记录 --- .../service/IWmsMaterialWarningService.java | 9 ++ .../impl/WmsMaterialCoilServiceImpl.java | 22 +++ .../impl/WmsMaterialWarningServiceImpl.java | 145 ++++++++++++++++++ 3 files changed, 176 insertions(+) diff --git a/klp-wms/src/main/java/com/klp/service/IWmsMaterialWarningService.java b/klp-wms/src/main/java/com/klp/service/IWmsMaterialWarningService.java index cce0f4b1..be80f90d 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsMaterialWarningService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsMaterialWarningService.java @@ -1,5 +1,6 @@ package com.klp.service; +import com.klp.domain.WmsMaterialCoil; import com.klp.domain.WmsMaterialWarning; import com.klp.domain.vo.WmsMaterialWarningVo; import com.klp.domain.bo.WmsMaterialWarningBo; @@ -46,4 +47,12 @@ public interface IWmsMaterialWarningService { * 校验并批量删除钢卷通用维度告警(长度/厚度/宽度)信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 检查钢卷长度/厚度偏差并批量插入告警记录 + * 在 calculateTheoretical 计算出理论长度和理论厚度后调用 + * + * @param coil 钢卷实体(需已填充 theoreticalLength/theoreticalThickness/actualLength/actualThickness/coilId) + */ + void checkAndInsertWarnings(WmsMaterialCoil coil); } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java index f886c130..c4f7106d 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java @@ -78,6 +78,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { // private final WmsDeliveryPlanMapper deliveryPlanMapper; private final WmsProductMapper productMapper; private final WmsRawMaterialMapper rawMaterialMapper; + private final IWmsMaterialWarningService materialWarningService; private final WmsDeliveryWaybillDetailMapper deliveryWaybillDetailMapper; private final WmsCoilWarehouseOperationLogMapper wmsCoilWarehouseOperationLogMapper; private final IWmsCoilAbnormalService coilAbnormalService; @@ -1521,6 +1522,9 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { throw new RuntimeException("新增钢卷失败"); } + // 检查长度/厚度偏差并插入告警 + materialWarningService.checkAndInsertWarnings(add); + // 设置返回用的ID并更新二维码内容中的coilId bo.setCoilId(add.getCoilId()); updateQrcodeCoilId(qrcodeRecordId, add.getCoilId()); @@ -1732,6 +1736,10 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { updateWrapper.set(WmsMaterialCoil::getSaleId, (Long)null); baseMapper.update(null, updateWrapper); } + + // 检查长度/厚度偏差并插入告警 + materialWarningService.checkAndInsertWarnings(updateCoil); + // 如果实际库区id为-1或状态为1,则清空钢卷上的实际库区绑定 if ((bo.getActualWarehouseId() != null && bo.getActualWarehouseId().equals(-1L)) || (bo.getStatus() != null && bo.getStatus().equals(1))) { @@ -1839,6 +1847,9 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { throw new RuntimeException("创建新钢卷失败"); } + // 检查长度/厚度偏差并插入告警 + materialWarningService.checkAndInsertWarnings(newCoil); + // 如果实际库区id为-1,则清空钢卷上的实际库区绑定 if (bo.getActualWarehouseId() != null && bo.getActualWarehouseId().equals(-1L)) { clearActualWarehouseBinding(newCoil.getActualWarehouseId(), newCoil.getCoilId()); @@ -2096,6 +2107,10 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { // 把老记录的coilId赋值给新纪录的parentCoilId newCoil.setParentCoilId(String.valueOf(oldCoil.getCoilId())); baseMapper.insert(newCoil); + + // 检查长度/厚度偏差并插入告警 + materialWarningService.checkAndInsertWarnings(newCoil); + newCoils.add(newCoil); // 更新二维码内容中的coilId @@ -2234,6 +2249,10 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { newCoil.setParentCoilId(parentCoilIdsStr); baseMapper.insert(newCoil); + + // 检查长度/厚度偏差并插入告警 + materialWarningService.checkAndInsertWarnings(newCoil); + newCoils.add(newCoil); // 更新二维码内容中的coilId @@ -5085,6 +5104,9 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { childCoil.setParentCoilId(String.valueOf(parentCoilId)); baseMapper.insert(childCoil); + // 检查长度/厚度偏差并插入告警 + materialWarningService.checkAndInsertWarnings(childCoil); + // 插入子钢卷的异常信息 if (childCoilBo.getAbnormals() != null && !childCoilBo.getAbnormals().isEmpty()) { for (WmsCoilAbnormalBo abnormalBo : childCoilBo.getAbnormals()) { diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialWarningServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialWarningServiceImpl.java index bd54d7a1..1278d7b0 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialWarningServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialWarningServiceImpl.java @@ -8,13 +8,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.klp.common.utils.StringUtils; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import com.klp.domain.bo.WmsMaterialWarningBo; import com.klp.domain.vo.WmsMaterialWarningVo; +import com.klp.domain.WmsMaterialCoil; import com.klp.domain.WmsMaterialWarning; import com.klp.mapper.WmsMaterialWarningMapper; import com.klp.service.IWmsMaterialWarningService; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Collection; @@ -25,6 +30,7 @@ import java.util.Collection; * @author klp * @date 2026-06-06 */ +@Slf4j @RequiredArgsConstructor @Service public class WmsMaterialWarningServiceImpl implements IWmsMaterialWarningService { @@ -118,4 +124,143 @@ public class WmsMaterialWarningServiceImpl implements IWmsMaterialWarningService } return baseMapper.deleteBatchIds(ids) > 0; } + + /** + * 检查钢卷长度/厚度偏差并批量插入告警记录 + * + * 长度规则:ABS((实测长度 - 理论长度) / 理论长度) > 0.1 → 告警 + * 厚度规则: + * 1. 实测厚度 < 理论厚度 → 偏薄告警(ERROR) + * 2. (实测厚度 - 理论厚度) / 理论厚度 > 0.1 → 偏厚告警(WARNING) + */ + @Override + public void checkAndInsertWarnings(WmsMaterialCoil coil) { + try { + doCheckAndInsertWarnings(coil); + } catch (Exception e) { + log.error("钢卷告警检查异常, coilId={}, 不影响原流程", coil != null ? coil.getCoilId() : null, e); + } + } + + private void doCheckAndInsertWarnings(WmsMaterialCoil coil) { + if (coil == null || coil.getCoilId() == null) { + return; + } + + List warnings = new ArrayList<>(); + + // ========== 长度检查 ========== + checkLength(coil, warnings); + + // ========== 厚度检查 ========== + checkThickness(coil, warnings); + + // 批量插入 + if (!warnings.isEmpty()) { + try { + baseMapper.insertBatch(warnings); + log.info("批量插入钢卷告警记录成功, coilId={}, 告警数={}", coil.getCoilId(), warnings.size()); + } catch (Exception e) { + log.error("批量插入钢卷告警记录失败, coilId={}", coil.getCoilId(), e); + } + } + } + + /** + * 长度偏差检查 + * ABS((actualLength - theoreticalLength) / theoreticalLength) > 0.1 → WARNING + */ + private void checkLength(WmsMaterialCoil coil, List warnings) { + Long actualLength = coil.getActualLength(); + BigDecimal theoreticalLength = coil.getTheoreticalLength(); + + if (actualLength == null || theoreticalLength == null + || theoreticalLength.compareTo(BigDecimal.ZERO) == 0) { + return; + } + + BigDecimal actual = new BigDecimal(actualLength); + BigDecimal diff = actual.subtract(theoreticalLength).abs(); + BigDecimal rate = diff.divide(theoreticalLength, 10, RoundingMode.HALF_UP); + + // 偏差率 > 0.1(即超过10%) + BigDecimal threshold = new BigDecimal("0.1"); + if (rate.compareTo(threshold) > 0) { + WmsMaterialWarning warning = new WmsMaterialWarning(); + warning.setCoilId(coil.getCoilId()); + warning.setWarningType("LENGTH"); + warning.setTheoreticalVal(theoreticalLength); + warning.setActualVal(actual); + warning.setAllowDeviation(threshold); + warning.setDeviationValue(actual.subtract(theoreticalLength)); + warning.setDeviationRate(rate.multiply(new BigDecimal("100")).setScale(4, RoundingMode.HALF_UP)); + warning.setWarningLevel("WARNING"); + warning.setWarningMsg("钢卷长度偏差超过10%,理论长度=" + theoreticalLength + "m,实测长度=" + actualLength + "mm"); + warning.setWarningStatus(0); + warnings.add(warning); + } + } + + /** + * 厚度偏差检查 + * 1. 实测厚度 < 理论厚度 → ERROR(不能比原来薄) + * 2. (实测厚度 - 理论厚度) / 理论厚度 > 0.1 → WARNING(不能厚太多) + */ + private void checkThickness(WmsMaterialCoil coil, List warnings) { + String actualThicknessStr = coil.getActualThickness(); + BigDecimal theoreticalThickness = coil.getTheoreticalThickness(); + + if (actualThicknessStr == null || theoreticalThickness == null + || theoreticalThickness.compareTo(BigDecimal.ZERO) == 0) { + return; + } + + BigDecimal actualThickness; + try { + actualThickness = new BigDecimal(actualThicknessStr.trim()); + } catch (NumberFormatException e) { + log.warn("实测厚度无法解析为数值, coilId={}, actualThickness={}", coil.getCoilId(), actualThicknessStr); + return; + } + + BigDecimal threshold = new BigDecimal("0.1"); + + // 规则1:实测厚度 < 理论厚度 → 偏薄 ERROR + if (actualThickness.compareTo(theoreticalThickness) < 0) { + WmsMaterialWarning warning = new WmsMaterialWarning(); + warning.setCoilId(coil.getCoilId()); + warning.setWarningType("THICKNESS"); + warning.setTheoreticalVal(theoreticalThickness); + warning.setActualVal(actualThickness); + warning.setAllowDeviation(BigDecimal.ZERO); + warning.setDeviationValue(actualThickness.subtract(theoreticalThickness)); + BigDecimal rate = theoreticalThickness.subtract(actualThickness) + .divide(theoreticalThickness, 10, RoundingMode.HALF_UP) + .multiply(new BigDecimal("100")).setScale(4, RoundingMode.HALF_UP); + warning.setDeviationRate(rate); + warning.setWarningLevel("ERROR"); + warning.setWarningMsg("钢卷实测厚度偏薄,理论厚度=" + theoreticalThickness + "mm,实测厚度=" + actualThickness + "mm"); + warning.setWarningStatus(0); + warnings.add(warning); + return; // 偏薄已经足够严重,不再重复判断偏厚 + } + + // 规则2:(实测厚度 - 理论厚度) / 理论厚度 > 0.1 → 偏厚超10% + BigDecimal diff = actualThickness.subtract(theoreticalThickness); + BigDecimal rate = diff.divide(theoreticalThickness, 10, RoundingMode.HALF_UP); + if (rate.compareTo(threshold) > 0) { + WmsMaterialWarning warning = new WmsMaterialWarning(); + warning.setCoilId(coil.getCoilId()); + warning.setWarningType("THICKNESS"); + warning.setTheoreticalVal(theoreticalThickness); + warning.setActualVal(actualThickness); + warning.setAllowDeviation(threshold); + warning.setDeviationValue(diff); + warning.setDeviationRate(rate.multiply(new BigDecimal("100")).setScale(4, RoundingMode.HALF_UP)); + warning.setWarningLevel("WARNING"); + warning.setWarningMsg("钢卷实测厚度偏厚超过10%,理论厚度=" + theoreticalThickness + "mm,实测厚度=" + actualThickness + "mm"); + warning.setWarningStatus(0); + warnings.add(warning); + } + } }