diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java index ba0c03a4..d346f9e2 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java @@ -25,6 +25,7 @@ */ package org.springblade.desk.basic.service.impl; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -55,6 +56,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -80,140 +82,79 @@ public class BsAssignServiceImpl extends BaseServiceImpl addList) { - for (BsAssignEntity current : addList) { - // 获取当前数据的单面积上限 - BigDecimal currentUpperArea = current.getUpArea(); - // 获取当前数据的单面积下限 - BigDecimal currentLowArea = current.getLowArea(); - //单批面积上限 - BigDecimal singleUpArea = current.getSingleUpArea(); - //单批面积下限 - BigDecimal singleLowArea = current.getSingleDownArea(); - if(currentUpperArea.compareTo(currentLowArea) < 0){ + Map> existingGroupByCraft = list().stream() + .collect(Collectors.groupingBy(BsAssignEntity::getCraftAbilityId)); + + // 校验是否与同工艺能力的已有数据存在区间重叠 + for (BsAssignEntity newEntity : addList) { + // 校验单面积区间合理性:上限必须 >= 下限 + if (newEntity.getUpArea().compareTo(newEntity.getLowArea()) < 0) { return R.fail("单面积上限不能小于单面积下限"); } - if(singleUpArea.compareTo(singleLowArea) < 0){ + // 校验单批面积区间合理性:上限必须 >= 下限 + if (newEntity.getSingleUpArea().compareTo(newEntity.getSingleDownArea()) < 0) { return R.fail("单批面积上限不能小于单批面积下限"); } - - String prodMarkId = current.getProdMarkId(); - List names = new ArrayList<>(); - List prodMarkIds = Arrays.asList(prodMarkId.split(",")); - for (String prodMarkId1 : prodMarkIds){ - R entity = iWorkOrderClient.getById(Long.parseLong(prodMarkId1)); - names.add(entity.getData().getQualityGrade()); + // 拼接质量等级名称 + String prodMarkNames = parseProdMarkNames(newEntity.getProdMarkId()); + newEntity.setProdMark(prodMarkNames); + + Long craftId = newEntity.getCraftAbilityId(); + // 获取相同工艺能力下的所有已有规则 + List sameCraftEntities = existingGroupByCraft.getOrDefault(craftId, new ArrayList<>()); + + // 不校验区间是否重叠,校验单面积区间是否完全重复(左右边界都相等) + boolean hasDuplicateSingleArea = sameCraftEntities.stream() + .anyMatch(existing -> + newEntity.getLowArea().compareTo(existing.getLowArea()) == 0 && + newEntity.getUpArea().compareTo(existing.getUpArea()) == 0 + ); + + if (hasDuplicateSingleArea) { + return R.fail("单面积上下限已存在,请检查数据"); } - String str = names.stream().collect(Collectors.joining(",")); - current.setProdMark(str); - - } - - - List all = new ArrayList<>(); - - List list = this.list(); - all.addAll(list); - all.addAll(addList); - boolean foundMatch = false; - // 2. 存储已遍历过的数据(用于区间匹配) - List traversedList = new ArrayList<>(); - for (BsAssignEntity current : all) { - // 获取当前数据的单面积上限 - BigDecimal currentUpperArea = current.getUpArea(); - // 获取当前数据的单面积下限 - BigDecimal currentLowArea = current.getLowArea(); - //单批面积上限 - BigDecimal singleUpArea = current.getSingleUpArea(); - //单批面积下限 - BigDecimal singleLowArea = current.getSingleDownArea(); - Long currentCraftId = current.getCraftAbilityId(); - - // 检查当前数据的上限是否在已遍历数据的任意区间内 - for (BsAssignEntity traversed : traversedList) { - BigDecimal traversedLowerArea = traversed.getLowArea(); - BigDecimal traversedUpperArea = traversed.getUpArea(); - - //单批面积上限 - BigDecimal traversedSingleUpArea = traversed.getSingleUpArea(); - //单批面积下限 - BigDecimal traversedSingleLowArea = traversed.getSingleDownArea(); - - Long traversedCraftId = traversed.getCraftAbilityId(); - - if(currentCraftId.equals(traversedCraftId)){ - // 核心判断:当前上限 是否在 已遍历数据的[下限, 上限]区间内 - if((currentLowArea.compareTo(traversedLowerArea)==1 && currentLowArea.compareTo(traversedUpperArea)==-1) - || (currentUpperArea.compareTo(traversedLowerArea)==1 && currentUpperArea.compareTo(traversedUpperArea)==-1)){ - return R.fail("单面积上下限已存在,请检查数据"); - } - - if(currentLowArea.compareTo(traversedLowerArea)<=0 - && (currentUpperArea.compareTo(traversedLowerArea)>=0 && currentUpperArea.compareTo(traversedUpperArea)<=0)){ - return R.fail("单面积上下限已存在,请检查数据"); - } - - if((currentLowArea.compareTo(traversedLowerArea)>=0 && currentLowArea.compareTo(traversedUpperArea)<=0) - && currentUpperArea.compareTo(traversedUpperArea)>=0){ - return R.fail("单面积上下限已存在,请检查数据"); - } - - if(currentLowArea.compareTo(traversedLowerArea)<=0 - && currentUpperArea.compareTo(traversedUpperArea)>=0){ - return R.fail("单面积上下限已存在,请检查数据"); - } - - if(currentLowArea.compareTo(traversedLowerArea)==0 - && currentUpperArea.compareTo(traversedUpperArea)==0){ - return R.fail("单面积上下限已存在,请检查数据"); - } - - if((singleLowArea.compareTo(traversedSingleLowArea)==1 && singleLowArea.compareTo(traversedSingleUpArea)==-1) || - (singleUpArea.compareTo(traversedSingleLowArea)==1 && singleUpArea.compareTo(traversedSingleUpArea)==-1)){ - return R.fail("单批面积上下限已存在,请检查数据"); - } - - if(singleLowArea.compareTo(traversedSingleLowArea)<=0 - && (singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0)){ - return R.fail("单批面积上下限已存在,请检查数据"); - } - - if((singleLowArea.compareTo(traversedSingleLowArea)>=0 && currentLowArea.compareTo(traversedSingleUpArea)<=0) - && singleUpArea.compareTo(traversedSingleUpArea)>=0){ - return R.fail("单批面积上下限已存在,请检查数据"); - } - - if(singleLowArea.compareTo(traversedSingleLowArea)<=0 - && singleUpArea.compareTo(traversedSingleUpArea)>=0){ - return R.fail("单批面积上下限已存在,请检查数据"); - } - - if(singleLowArea.compareTo(traversedSingleLowArea)==0 && - singleUpArea.compareTo(traversedSingleUpArea)==0){ - return R.fail("单批面积上下限已存在,请检查数据"); - } - } + // 校验单批面积区间是否完全重复(左右边界都相等) + boolean hasDuplicateBatchArea = sameCraftEntities.stream() + .anyMatch(existing -> + newEntity.getSingleDownArea().compareTo(existing.getSingleDownArea()) == 0 && + newEntity.getSingleUpArea().compareTo(existing.getSingleUpArea()) == 0 + ); - -// if(singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0){ -// return R.fail("单批面积上限已存在,请检查数据"); -// } + if (hasDuplicateBatchArea) { + return R.fail("单批面积上下限已存在,请检查数据"); } - // 未匹配,将当前数据加入已遍历集合,继续下一条 - traversedList.add(current); - System.out.println("未匹配到已遍历区间,将当前数据加入已遍历集合"); + } + // 保存 + return R.status(saveBatch(addList)); + } - // 4. 遍历完成后的结果提示 - if (!foundMatch) { - System.out.println("\n遍历完成,未发现任何数据的上限落在之前遍历数据的上下限区间内"); - return R.status(saveBatch(addList)); + private String parseProdMarkNames(String prodMarkId) { + if (prodMarkId == null || prodMarkId.isEmpty()) { + return ""; } + return Arrays.stream(prodMarkId.split(",")) + .map(String::trim) + .filter(StrUtil::isNotEmpty) + .map(id -> { + try { + R result = iWorkOrderClient.getById(Long.parseLong(id)); + return result.getData() != null ? result.getData().getQualityGrade() : ""; + } catch (NumberFormatException e) { + //不抛出异常,,,, + return ""; + } + }) + .filter(name -> !name.isEmpty()) + .collect(Collectors.joining(",")); + } -// addList.forEach(one -> { -// one.setId(null); -// }); - return R.status(true); + /** + * @return true-存在重叠,false-不重叠 + */ + private boolean isIntervalOverlap(BigDecimal low1, BigDecimal up1, BigDecimal low2, BigDecimal up2) { + return up1.compareTo(low2) >= 0 && low1.compareTo(up2) <= 0; } @Override