|
|
|
|
@ -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 |
|
|
|
|
|