|
|
|
@ -80,51 +80,82 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig |
|
|
|
return page.setRecords(baseMapper.selectBsAssignPage(page, bsAssign)); |
|
|
|
return page.setRecords(baseMapper.selectBsAssignPage(page, bsAssign)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
/** |
|
|
|
public R saveBat(List<BsAssignEntity> addList) { |
|
|
|
* 校验新数据是否与同工艺能力的已有数据存在完全重复 |
|
|
|
Map<Long, List<BsAssignEntity>> existingGroupByCraft = list().stream() |
|
|
|
*/ |
|
|
|
.collect(Collectors.groupingBy(BsAssignEntity::getCraftAbilityId)); |
|
|
|
private String validateDuplicateWithSameCraft(BsAssignEntity newEntity, Map<Long, List<BsAssignEntity>> existingGroupByCraft) { |
|
|
|
|
|
|
|
Long craftId = newEntity.getCraftAbilityId(); |
|
|
|
// 校验是否与同工艺能力的已有数据存在区间重叠
|
|
|
|
// 获取相同工艺能力下的所有已有规则
|
|
|
|
for (BsAssignEntity newEntity : addList) { |
|
|
|
List<BsAssignEntity> sameCraftEntities = existingGroupByCraft.getOrDefault(craftId, new ArrayList<>()); |
|
|
|
// 校验单面积区间合理性:上限必须 >= 下限
|
|
|
|
|
|
|
|
if (newEntity.getUpArea().compareTo(newEntity.getLowArea()) < 0) { |
|
|
|
// 校验单面积区间是否完全重复(左右边界都相等)
|
|
|
|
return R.fail("单面积上限不能小于单面积下限"); |
|
|
|
boolean hasDuplicateSingleArea = sameCraftEntities.stream() |
|
|
|
} |
|
|
|
.anyMatch(existing -> |
|
|
|
// 校验单批面积区间合理性:上限必须 >= 下限
|
|
|
|
newEntity.getLowArea().compareTo(existing.getLowArea()) == 0 && |
|
|
|
if (newEntity.getSingleUpArea().compareTo(newEntity.getSingleDownArea()) < 0) { |
|
|
|
newEntity.getUpArea().compareTo(existing.getUpArea()) == 0 |
|
|
|
return R.fail("单批面积上限不能小于单批面积下限"); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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<BsAssignEntity> entities, Long excludeId) { |
|
|
|
|
|
|
|
// 查询所有已有数据(排除当前更新的记录)
|
|
|
|
|
|
|
|
List<BsAssignEntity> allExisting = list().stream() |
|
|
|
|
|
|
|
.filter(e -> excludeId == null || !e.getId().equals(excludeId)) |
|
|
|
|
|
|
|
.toList(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 按工艺能力分组
|
|
|
|
|
|
|
|
Map<Long, List<BsAssignEntity>> 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()); |
|
|
|
if (entity.getSingleUpArea().compareTo(entity.getSingleDownArea()) < 0) { |
|
|
|
newEntity.setProdMark(prodMarkNames); |
|
|
|
R.fail("单批面积上限不能小于单批面积下限"); |
|
|
|
|
|
|
|
|
|
|
|
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("单面积上下限已存在,请检查数据"); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 校验单批面积区间是否完全重复(左右边界都相等)
|
|
|
|
// 拼接质量等级名称
|
|
|
|
boolean hasDuplicateBatchArea = sameCraftEntities.stream() |
|
|
|
String prodMarkNames = parseProdMarkNames(entity.getProdMarkId()); |
|
|
|
.anyMatch(existing -> |
|
|
|
entity.setProdMark(prodMarkNames); |
|
|
|
newEntity.getSingleDownArea().compareTo(existing.getSingleDownArea()) == 0 && |
|
|
|
|
|
|
|
newEntity.getSingleUpArea().compareTo(existing.getSingleUpArea()) == 0 |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (hasDuplicateBatchArea) { |
|
|
|
// 校验是否与同工艺能力的已有数据完全重复
|
|
|
|
return R.fail("单批面积上下限已存在,请检查数据"); |
|
|
|
String duplicateError = validateDuplicateWithSameCraft(entity, existingGroupByCraft); |
|
|
|
|
|
|
|
if (duplicateError != null) { |
|
|
|
|
|
|
|
return R.fail(duplicateError); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public R saveBat(List<BsAssignEntity> addList) { |
|
|
|
|
|
|
|
// 通用校验
|
|
|
|
|
|
|
|
R validationResult = validateBeforeSave(addList, null); |
|
|
|
|
|
|
|
if (validationResult != null) { |
|
|
|
|
|
|
|
return validationResult; |
|
|
|
} |
|
|
|
} |
|
|
|
// 保存
|
|
|
|
// 保存
|
|
|
|
return R.status(saveBatch(addList)); |
|
|
|
return R.status(saveBatch(addList)); |
|
|
|
@ -160,24 +191,9 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig |
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public R importExcel(List<BsAssignExcel> listexcel) { |
|
|
|
public R importExcel(List<BsAssignExcel> listexcel) { |
|
|
|
List<BsAssignEntity> noticeList = new ArrayList<>(); |
|
|
|
List<BsAssignEntity> 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); |
|
|
|
BsAssignEntity notice = BeanUtil.copy(noticeExcel, BsAssignEntity.class); |
|
|
|
|
|
|
|
|
|
|
|
//工艺能力
|
|
|
|
//工艺能力
|
|
|
|
@ -205,16 +221,20 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig |
|
|
|
notice.setCenterId(oems.get(0).getId()); |
|
|
|
notice.setCenterId(oems.get(0).getId()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 质量等级处理
|
|
|
|
String prodmark = noticeExcel.getProdMark(); |
|
|
|
String prodmark = noticeExcel.getProdMark(); |
|
|
|
List<String> strs = Arrays.asList(prodmark.split(",")); |
|
|
|
if (prodmark != null && !prodmark.isEmpty()) { |
|
|
|
List<String> ids = new ArrayList<>(); |
|
|
|
List<String> strs = Arrays.asList(prodmark.split(",")); |
|
|
|
for(String str : strs){ |
|
|
|
List<String> ids = new ArrayList<>(); |
|
|
|
R<QualityGradeEntity> entity = iWorkOrderClient.getByName(str); |
|
|
|
for (String str : strs) { |
|
|
|
ids.add(entity.getData().getId().toString()); |
|
|
|
R<QualityGradeEntity> 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()); |
|
|
|
String category = DictCache.getKey("AssignPoint", noticeExcel.getPointTypeName()); |
|
|
|
@ -222,114 +242,18 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig |
|
|
|
//限制类型
|
|
|
|
//限制类型
|
|
|
|
String categorylimit = DictCache.getKey("AssignLimit", noticeExcel.getLimitTypeName()); |
|
|
|
String categorylimit = DictCache.getKey("AssignLimit", noticeExcel.getLimitTypeName()); |
|
|
|
notice.setLimitType(categorylimit); |
|
|
|
notice.setLimitType(categorylimit); |
|
|
|
noticeList.add(notice); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<BsAssignEntity> all = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<BsAssignEntity> list = this.list(); |
|
|
|
|
|
|
|
all.addAll(list); |
|
|
|
|
|
|
|
all.addAll(noticeList); |
|
|
|
|
|
|
|
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 |
|
|
|
noticeList.add(notice); |
|
|
|
&& (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("未匹配到已遍历区间,将当前数据加入已遍历集合"); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 4. 遍历完成后的结果提示
|
|
|
|
// 通用校验
|
|
|
|
if (!foundMatch) { |
|
|
|
R validationResult = validateBeforeSave(noticeList, null); |
|
|
|
System.out.println("\n遍历完成,未发现任何数据的上限落在之前遍历数据的上下限区间内"); |
|
|
|
if (validationResult != null) { |
|
|
|
return R.data(saveBatch(noticeList)); |
|
|
|
return validationResult; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 保存
|
|
|
|
|
|
|
|
return R.data(saveBatch(noticeList)); |
|
|
|
return R.data(null); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -373,4 +297,13 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig |
|
|
|
return baseMapper.selectOne(wrapper); |
|
|
|
return baseMapper.selectOne(wrapper); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public void update(BsAssignEntity bsAssign) { |
|
|
|
|
|
|
|
R validationResult = validateBeforeSave(List.of(bsAssign), bsAssign.getId()); |
|
|
|
|
|
|
|
if (validationResult != null) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
updateById(bsAssign); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|