diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java index 0c22152d..2ba8a0bb 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java @@ -169,105 +169,8 @@ public class BsAssignController extends BladeController { @ApiLog("分派规则维护修改") @Operation(summary = "修改", description = "传入bsAssign") public R update(@Valid @RequestBody BsAssignEntity bsAssign) { - - List list = bsAssignService.list(); - List traversedList = new ArrayList<>(); - - // 获取当前数据的单面积上限 - BigDecimal currentUpperArea = bsAssign.getUpArea(); - // 获取当前数据的单面积下限 - BigDecimal currentLowArea = bsAssign.getLowArea(); - //单批面积上限 - BigDecimal singleUpArea = bsAssign.getSingleUpArea(); - //单批面积下限 - BigDecimal singleLowArea = bsAssign.getSingleDownArea(); - - Long currentCraftId = bsAssign.getCraftAbilityId(); - - - for(BsAssignEntity entity:list){ - if(entity.getId() == bsAssign.getId()){ - continue; - } - - - // 检查当前数据的上限是否在已遍历数据的任意区间内 - 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("单批面积上下限已存在,请检查数据"); - } - } - - - -// if(singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0){ -// return R.fail("单批面积上限已存在,请检查数据"); -// } - } - // 未匹配,将当前数据加入已遍历集合,继续下一条 - traversedList.add(entity); - System.out.println("未匹配到已遍历区间,将当前数据加入已遍历集合"); - } - - return R.status(bsAssignService.updateById(bsAssign)); + bsAssignService.update(bsAssign); + return R.success(); } /** diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java index 6f62795c..3455b101 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java @@ -88,4 +88,12 @@ public interface IBsAssignService extends BaseService { */ BsAssignEntity getByPartCode(Long abilityId, String partCode); + /** + * 更新分派规则(带校验) + * + * @param bsAssign 待更新的实体 + * @return 更新结果 + */ + void update(BsAssignEntity bsAssign); + } 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 d346f9e2..4c61e834 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 @@ -80,51 +80,82 @@ public class BsAssignServiceImpl extends BaseServiceImpl addList) { - Map> existingGroupByCraft = list().stream() - .collect(Collectors.groupingBy(BsAssignEntity::getCraftAbilityId)); - - // 校验是否与同工艺能力的已有数据存在区间重叠 - for (BsAssignEntity newEntity : addList) { - // 校验单面积区间合理性:上限必须 >= 下限 - if (newEntity.getUpArea().compareTo(newEntity.getLowArea()) < 0) { - return R.fail("单面积上限不能小于单面积下限"); - } - // 校验单批面积区间合理性:上限必须 >= 下限 - if (newEntity.getSingleUpArea().compareTo(newEntity.getSingleDownArea()) < 0) { - return R.fail("单批面积上限不能小于单批面积下限"); + /** + * 校验新数据是否与同工艺能力的已有数据存在完全重复 + */ + private String validateDuplicateWithSameCraft(BsAssignEntity newEntity, Map> existingGroupByCraft) { + 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 "单面积上下限已存在,请检查数据"; + } + + // 校验单批面积区间是否完全重复(左右边界都相等) + boolean hasDuplicateBatchArea = sameCraftEntities.stream() + .anyMatch(existing -> + newEntity.getSingleDownArea().compareTo(existing.getSingleDownArea()) == 0 && + newEntity.getSingleUpArea().compareTo(existing.getSingleUpArea()) == 0 + ); + + if (hasDuplicateBatchArea) { + return "单批面积上下限已存在,请检查数据"; + } + + return null; + } + + /** + * 校验 + */ + private R validateBeforeSave(List entities, Long excludeId) { + // 查询所有已有数据(排除当前更新的记录) + List allExisting = list().stream() + .filter(e -> excludeId == null || !e.getId().equals(excludeId)) + .toList(); + + // 按工艺能力分组 + Map> existingGroupByCraft = allExisting.stream() + .collect(Collectors.groupingBy(BsAssignEntity::getCraftAbilityId)); + + for (BsAssignEntity entity : entities) { + // 单面积区间 + if (entity.getUpArea().compareTo(entity.getLowArea()) < 0) { + R.fail("单面积上限不能小于单面积下限") ; } - // 拼接质量等级名称 - 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("单面积上下限已存在,请检查数据"); + // 单批面积区间 + if (entity.getSingleUpArea().compareTo(entity.getSingleDownArea()) < 0) { + R.fail("单批面积上限不能小于单批面积下限"); } - // 校验单批面积区间是否完全重复(左右边界都相等) - boolean hasDuplicateBatchArea = sameCraftEntities.stream() - .anyMatch(existing -> - newEntity.getSingleDownArea().compareTo(existing.getSingleDownArea()) == 0 && - newEntity.getSingleUpArea().compareTo(existing.getSingleUpArea()) == 0 - ); + // 拼接质量等级名称 + String prodMarkNames = parseProdMarkNames(entity.getProdMarkId()); + entity.setProdMark(prodMarkNames); - if (hasDuplicateBatchArea) { - return R.fail("单批面积上下限已存在,请检查数据"); + // 校验是否与同工艺能力的已有数据完全重复 + String duplicateError = validateDuplicateWithSameCraft(entity, existingGroupByCraft); + if (duplicateError != null) { + return R.fail(duplicateError); } + } + + return null; + } + @Override + public R saveBat(List addList) { + // 通用校验 + R validationResult = validateBeforeSave(addList, null); + if (validationResult != null) { + return validationResult; } // 保存 return R.status(saveBatch(addList)); @@ -160,24 +191,9 @@ public class BsAssignServiceImpl extends BaseServiceImpl listexcel) { List noticeList = new ArrayList<>(); - for (BsAssignExcel current : listexcel) { - // 获取当前数据的单面积上限 - BigDecimal currentUpperArea = current.getUpArea(); - // 获取当前数据的单面积下限 - BigDecimal currentLowArea = current.getLowArea(); - //单批面积上限 - BigDecimal singleUpArea = current.getSingleUpArea(); - //单批面积下限 - BigDecimal singleLowArea = current.getSingleDownArea(); - if(currentUpperArea.compareTo(currentLowArea) < 0){ - return R.fail("单面积上限不能小于单面积下限"); - } - if(singleUpArea.compareTo(singleLowArea) < 0){ - return R.fail("单批面积上限不能小于单批面积下限"); - } - } - listexcel.forEach(noticeExcel -> { + // 先转换Excel数据为实体对象 + for (BsAssignExcel noticeExcel : listexcel) { BsAssignEntity notice = BeanUtil.copy(noticeExcel, BsAssignEntity.class); //工艺能力 @@ -205,16 +221,20 @@ public class BsAssignServiceImpl extends BaseServiceImpl strs = Arrays.asList(prodmark.split(",")); - List ids = new ArrayList<>(); - for(String str : strs){ - R entity = iWorkOrderClient.getByName(str); - ids.add(entity.getData().getId().toString()); + if (prodmark != null && !prodmark.isEmpty()) { + List strs = Arrays.asList(prodmark.split(",")); + List ids = new ArrayList<>(); + for (String str : strs) { + R entity = iWorkOrderClient.getByName(str.trim()); + if (entity.getData() != null) { + ids.add(entity.getData().getId().toString()); + } + } + String str = ids.stream().collect(Collectors.joining(",")); + notice.setProdMarkId(str); } - String str = ids.stream().collect(Collectors.joining(",")); - - notice.setProdMarkId(str); //指定类型 String category = DictCache.getKey("AssignPoint", noticeExcel.getPointTypeName()); @@ -222,114 +242,18 @@ public class BsAssignServiceImpl extends BaseServiceImpl all = new ArrayList<>(); - - List list = this.list(); - all.addAll(list); - all.addAll(noticeList); - 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("单批面积上下限已存在,请检查数据"); - } - } - - - -// if(singleUpArea.compareTo(traversedSingleLowArea)>=0 && singleUpArea.compareTo(traversedSingleUpArea)<=0){ -// return R.fail("单批面积上限已存在,请检查数据"); -// } - } - // 未匹配,将当前数据加入已遍历集合,继续下一条 - traversedList.add(current); - System.out.println("未匹配到已遍历区间,将当前数据加入已遍历集合"); + noticeList.add(notice); } - // 4. 遍历完成后的结果提示 - if (!foundMatch) { - System.out.println("\n遍历完成,未发现任何数据的上限落在之前遍历数据的上下限区间内"); - return R.data(saveBatch(noticeList)); + // 通用校验 + R validationResult = validateBeforeSave(noticeList, null); + if (validationResult != null) { + return validationResult; } - - - return R.data(null); + // 保存 + return R.data(saveBatch(noticeList)); } @@ -373,4 +297,13 @@ public class BsAssignServiceImpl extends BaseServiceImpl