From d8d3136a718a5efb35d998db5640e994c148d9bb Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Mon, 12 Jan 2026 16:29:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(material):=20=E8=A7=A3=E5=86=B3=E5=85=A5?= =?UTF-8?q?=E5=9C=BA=E9=92=A2=E5=8D=B7=E5=8F=B7=E6=9F=A5=E8=AF=A2=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E7=AC=A6=E4=B8=B2=E6=8E=92=E5=BA=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为WmsMaterialCoilBo的materialType字段添加@NotBlank验证注解 - 重构getMaxEnterCoilNoByPrefix方法,将字符串排序改为数值排序 - 添加边界校验和前缀长度验证(必须为4位) - 优化查询逻辑,先查询所有匹配记录再手动筛选数值最大值 - 增加详细的日志记录和异常处理机制 - 提升代码性能,使用固定容量HashMap和字段选择优化 --- .../com/klp/domain/bo/WmsMaterialCoilBo.java | 1 + .../impl/WmsMaterialCoilServiceImpl.java | 97 +++++++++++++------ 2 files changed, 71 insertions(+), 27 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java index 9846537f..c052d8df 100644 --- a/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java @@ -133,6 +133,7 @@ public class WmsMaterialCoilBo extends BaseEntity { private Long actualWarehouseId; //材料类型 + @NotBlank(message = "物料类型不能为空") private String materialType; 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 15954133..7df1991c 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 @@ -2259,10 +2259,10 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { @Override public Map checkCoilNoDuplicate(String enterCoilNo, String currentCoilNo) { Map result = new HashMap<>(); - + boolean enterCoilNoDuplicate = false; boolean currentCoilNoDuplicate = false; - + // 检查入场钢卷号是否重复 if (StringUtils.isNotBlank(enterCoilNo)) { LambdaQueryWrapper enterWrapper = Wrappers.lambdaQuery(); @@ -2271,7 +2271,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { long enterCount = baseMapper.selectCount(enterWrapper); enterCoilNoDuplicate = enterCount > 0; } - + // 检查当前钢卷号是否重复 if (StringUtils.isNotBlank(currentCoilNo)) { LambdaQueryWrapper currentWrapper = Wrappers.lambdaQuery(); @@ -2280,7 +2280,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { long currentCount = baseMapper.selectCount(currentWrapper); currentCoilNoDuplicate = currentCount > 0; } - + // 判断重复类型 String duplicateType; if (enterCoilNoDuplicate && currentCoilNoDuplicate) { @@ -2292,45 +2292,88 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { } else { duplicateType = "none"; } - + result.put("duplicateType", duplicateType); result.put("enterCoilNoDuplicate", enterCoilNoDuplicate); result.put("currentCoilNoDuplicate", currentCoilNoDuplicate); - + return result; } /** * 根据入场钢卷号前缀查询最大的入场钢卷号 - * 前端传入入场钢卷号的前四位,查询所有符合的入场钢卷号,返回最大值 + * 前端传入入场钢卷号的前四位,查询所有符合的入场钢卷号,返回数值上的最大值 + * + * @param enterCoilNoPrefix 入场钢卷号前缀(建议为4位) + * @return 包含最大钢卷号和前缀的Map,key分别为maxEnterCoilNo、prefix */ @Override public Map getMaxEnterCoilNoByPrefix(String enterCoilNoPrefix) { - Map result = new HashMap<>(); - + Map result = new HashMap<>(2); // 初始化固定容量,提升性能 + result.put("prefix", enterCoilNoPrefix); // 先赋值前缀,避免重复代码 + + // 1. 边界校验:前缀为空/空白字符串,直接返回null if (StringUtils.isBlank(enterCoilNoPrefix)) { + log.warn("查询最大入场钢卷号失败:前缀为空"); result.put("maxEnterCoilNo", null); - result.put("prefix", enterCoilNoPrefix); return result; } - - // 查询所有以该前缀开头的入场钢卷号 - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - wrapper.likeRight(WmsMaterialCoil::getEnterCoilNo, enterCoilNoPrefix) - .eq(WmsMaterialCoil::getDelFlag, 0) - .orderByDesc(WmsMaterialCoil::getEnterCoilNo) - .last("LIMIT 1"); - - WmsMaterialCoil maxCoil = baseMapper.selectOne(wrapper); - - String maxEnterCoilNo = null; - if (maxCoil != null && StringUtils.isNotBlank(maxCoil.getEnterCoilNo())) { - maxEnterCoilNo = maxCoil.getEnterCoilNo(); + + // 2. 前缀长度校验(可选,根据业务要求,比如强制4位) + if (enterCoilNoPrefix.length() != 4) { + log.warn("查询最大入场钢卷号失败:前缀长度不符合要求(需4位),当前前缀:{}", enterCoilNoPrefix); + result.put("maxEnterCoilNo", null); + return result; } - - result.put("maxEnterCoilNo", maxEnterCoilNo); - result.put("prefix", enterCoilNoPrefix); - + + try { + // 3. 构建查询条件:匹配前缀 + 未删除 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.likeRight(WmsMaterialCoil::getEnterCoilNo, enterCoilNoPrefix) + .eq(WmsMaterialCoil::getDelFlag, 0) + .select(WmsMaterialCoil::getEnterCoilNo); // 仅查询需要的字段,提升性能 + + // 4. 查询所有匹配的钢卷记录 + List coilList = baseMapper.selectList(wrapper); + log.info("根据前缀{}查询到匹配的钢卷记录数:{}", enterCoilNoPrefix, coilList.size()); + + // 5. 手动筛选数值最大的钢卷号(解决字符串排序问题) + String maxEnterCoilNo = null; + long maxNum = -1; + for (WmsMaterialCoil coil : coilList) { + String coilNo = coil.getEnterCoilNo(); + // 跳过空值、非纯数字的钢卷号 + if (StringUtils.isBlank(coilNo) || !coilNo.matches("^\\d+$")) { + log.debug("跳过无效钢卷号:{}(空值或非纯数字)", coilNo); + continue; + } + + // 处理大数溢出风险(如果钢卷号超过Long范围,可改用BigDecimal) + long currentNum; + try { + currentNum = Long.parseLong(coilNo); + } catch (NumberFormatException e) { + log.warn("钢卷号{}转换为数字失败:{}", coilNo, e.getMessage()); + continue; + } + + // 更新最大值 + if (currentNum > maxNum) { + maxNum = currentNum; + maxEnterCoilNo = coilNo; + } + } + + // 6. 结果赋值 + 日志记录 + result.put("maxEnterCoilNo", maxEnterCoilNo); + log.info("前缀{}对应的最大入场钢卷号:{}", enterCoilNoPrefix, maxEnterCoilNo == null ? "无匹配记录" : maxEnterCoilNo); + + } catch (Exception e) { + // 7. 全局异常捕获,避免接口报错 + log.error("查询最大入场钢卷号失败,前缀:{}", enterCoilNoPrefix, e); + result.put("maxEnterCoilNo", null); + } + return result; }