分派规则维护新增 , 只校验是否存在相同的工艺能力且重复的上下限区间

liweidong
张乾翔 1 day ago
parent ffbd0ed20e
commit 388c467192
  1. 185
      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<BsAssignMapper, BsAssig
@Override
public R saveBat(List<BsAssignEntity> 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<Long, List<BsAssignEntity>> 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<String> names = new ArrayList<>();
List<String> prodMarkIds = Arrays.asList(prodMarkId.split(","));
for (String prodMarkId1 : prodMarkIds){
R<QualityGradeEntity> entity = iWorkOrderClient.getById(Long.parseLong(prodMarkId1));
names.add(entity.getData().getQualityGrade());
// 拼接质量等级名称
String prodMarkNames = parseProdMarkNames(newEntity.getProdMarkId());
newEntity.setProdMark(prodMarkNames);
Long craftId = newEntity.getCraftAbilityId();
// 获取相同工艺能力下的所有已有规则
List<BsAssignEntity> 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<BsAssignEntity> all = new ArrayList<>();
List<BsAssignEntity> list = this.list();
all.addAll(list);
all.addAll(addList);
boolean foundMatch = false;
// 2. 存储已遍历过的数据(用于区间匹配)
List<BsAssignEntity> 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<QualityGradeEntity> 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

Loading…
Cancel
Save