Compare commits

..

No commits in common. 'master' and 'liweidong' have entirely different histories.

  1. 4
      blade-common/src/main/java/org/springblade/common/constant/LauncherConstant.java
  2. 101
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/controller/BsAssignController.java
  3. 4
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/mapper/BatConfigMapper.xml
  4. 8
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/IBsAssignService.java
  5. 267
      blade-service/blade-desk/src/main/java/org/springblade/desk/basic/service/impl/BsAssignServiceImpl.java
  6. 30
      blade-service/blade-desk/src/main/java/org/springblade/desk/energy/excel/BsEpciuInspectionPointExcel.java
  7. BIN
      blade-service/blade-desk/src/main/resources/Excel/QA/环保巡检点配置导入模板.xls

@ -31,8 +31,8 @@ public interface LauncherConstant {
/** /**
* nacos dev 地址 * nacos dev 地址
*/ */
//String NACOS_DEV_ADDR = "192.168.249.27:8848"; String NACOS_DEV_ADDR = "192.168.249.27:8848";
String NACOS_DEV_ADDR = "127.0.0.1:8848"; // String NACOS_DEV_ADDR = "127.0.0.1:8848";
/**R /**R
* nacos prod 地址 * nacos prod 地址

@ -169,8 +169,105 @@ public class BsAssignController extends BladeController {
@ApiLog("分派规则维护修改") @ApiLog("分派规则维护修改")
@Operation(summary = "修改", description = "传入bsAssign") @Operation(summary = "修改", description = "传入bsAssign")
public R update(@Valid @RequestBody BsAssignEntity bsAssign) { public R update(@Valid @RequestBody BsAssignEntity bsAssign) {
bsAssignService.update(bsAssign);
return R.success(); List<BsAssignEntity> list = bsAssignService.list();
List<BsAssignEntity> 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));
} }
/** /**

@ -20,12 +20,12 @@
<select id="selectBatConfigPage" resultMap="batConfigResultMap"> <select id="selectBatConfigPage" resultMap="batConfigResultMap">
SELECT * SELECT *
FROM BS_BAT_CONFIG FROM BA_BAT_CONFIG
WHERE is_deleted = 0 WHERE is_deleted = 0
</select> </select>
<select id="exportBatConfig" resultType="org.springblade.desk.basic.excel.BatConfigExcel"> <select id="exportBatConfig" resultType="org.springblade.desk.basic.excel.BatConfigExcel">
SELECT * SELECT *
FROM BS_BAT_CONFIG ${ew.customSqlSegment} FROM BA_BAT_CONFIG ${ew.customSqlSegment}
</select> </select>
</mapper> </mapper>

@ -88,12 +88,4 @@ public interface IBsAssignService extends BaseService<BsAssignEntity> {
*/ */
BsAssignEntity getByPartCode(Long abilityId, String partCode); BsAssignEntity getByPartCode(Long abilityId, String partCode);
/**
* 更新分派规则带校验
*
* @param bsAssign 待更新的实体
* @return 更新结果
*/
void update(BsAssignEntity bsAssign);
} }

@ -80,82 +80,51 @@ 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()
private String validateDuplicateWithSameCraft(BsAssignEntity newEntity, Map<Long, List<BsAssignEntity>> existingGroupByCraft) { .collect(Collectors.groupingBy(BsAssignEntity::getCraftAbilityId));
Long craftId = newEntity.getCraftAbilityId();
// 获取相同工艺能力下的所有已有规则 // 校验是否与同工艺能力的已有数据存在区间重叠
List<BsAssignEntity> sameCraftEntities = existingGroupByCraft.getOrDefault(craftId, new ArrayList<>()); for (BsAssignEntity newEntity : addList) {
// 校验单面积区间合理性:上限必须 >= 下限
// 校验单面积区间是否完全重复(左右边界都相等) if (newEntity.getUpArea().compareTo(newEntity.getLowArea()) < 0) {
boolean hasDuplicateSingleArea = sameCraftEntities.stream() return R.fail("单面积上限不能小于单面积下限");
.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<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("单面积上限不能小于单面积下限") ;
} }
// 单批面积区间 // 校验单批面积区间合理性:上限必须 >= 下限
if (entity.getSingleUpArea().compareTo(entity.getSingleDownArea()) < 0) { if (newEntity.getSingleUpArea().compareTo(newEntity.getSingleDownArea()) < 0) {
R.fail("单批面积上限不能小于单批面积下限"); return R.fail("单批面积上限不能小于单批面积下限");
} }
// 拼接质量等级名称 // 拼接质量等级名称
String prodMarkNames = parseProdMarkNames(entity.getProdMarkId()); String prodMarkNames = parseProdMarkNames(newEntity.getProdMarkId());
entity.setProdMark(prodMarkNames); newEntity.setProdMark(prodMarkNames);
// 校验是否与同工艺能力的已有数据完全重复 Long craftId = newEntity.getCraftAbilityId();
String duplicateError = validateDuplicateWithSameCraft(entity, existingGroupByCraft); // 获取相同工艺能力下的所有已有规则
if (duplicateError != null) { List<BsAssignEntity> sameCraftEntities = existingGroupByCraft.getOrDefault(craftId, new ArrayList<>());
return R.fail(duplicateError);
// 不校验区间是否重叠,校验单面积区间是否完全重复(左右边界都相等)
boolean hasDuplicateSingleArea = sameCraftEntities.stream()
.anyMatch(existing ->
newEntity.getLowArea().compareTo(existing.getLowArea()) == 0 &&
newEntity.getUpArea().compareTo(existing.getUpArea()) == 0
);
if (hasDuplicateSingleArea) {
return R.fail("单面积上下限已存在,请检查数据");
} }
}
return null; // 校验单批面积区间是否完全重复(左右边界都相等)
} boolean hasDuplicateBatchArea = sameCraftEntities.stream()
.anyMatch(existing ->
newEntity.getSingleDownArea().compareTo(existing.getSingleDownArea()) == 0 &&
newEntity.getSingleUpArea().compareTo(existing.getSingleUpArea()) == 0
);
if (hasDuplicateBatchArea) {
return R.fail("单批面积上下限已存在,请检查数据");
}
@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));
@ -191,9 +160,24 @@ 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);
//工艺能力 //工艺能力
@ -221,20 +205,16 @@ 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();
if (prodmark != null && !prodmark.isEmpty()) { List<String> strs = Arrays.asList(prodmark.split(","));
List<String> strs = Arrays.asList(prodmark.split(",")); List<String> ids = new ArrayList<>();
List<String> ids = new ArrayList<>(); for(String str : strs){
for (String str : strs) { R<QualityGradeEntity> entity = iWorkOrderClient.getByName(str);
R<QualityGradeEntity> entity = iWorkOrderClient.getByName(str.trim()); ids.add(entity.getData().getId().toString());
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());
@ -242,18 +222,114 @@ 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); 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
&& (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. 遍历完成后的结果提示
R validationResult = validateBeforeSave(noticeList, null); if (!foundMatch) {
if (validationResult != null) { System.out.println("\n遍历完成,未发现任何数据的上限落在之前遍历数据的上下限区间内");
return validationResult; return R.data(saveBatch(noticeList));
} }
// 保存
return R.data(saveBatch(noticeList));
return R.data(null);
} }
@ -297,13 +373,4 @@ 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);
}
} }

@ -71,8 +71,18 @@ public class BsEpciuInspectionPointExcel implements Serializable {
@ColumnWidth(20) @ColumnWidth(20)
@ExcelProperty("巡检点位置") @ExcelProperty("巡检点位置")
private String insSite; private String insSite;
/**
* 上次巡检日期
*/
@ColumnWidth(20)
@ExcelProperty("上次检验日期")
private Date lastInsCycle;
/**
* 备注
*/
@ColumnWidth(20)
@ExcelProperty("备注")
private String memo;
/** /**
* 是否已删除 * 是否已删除
*/ */
@ -89,21 +99,7 @@ public class BsEpciuInspectionPointExcel implements Serializable {
* 巡检周期 * 巡检周期
*/ */
@ColumnWidth(20) @ColumnWidth(20)
@ExcelProperty("巡检周期(h)") @ExcelProperty("巡检周期")
private Long insCycle; private Long insCycle;
/**
* 上次巡检日期
*/
@ColumnWidth(20)
@ExcelProperty("上次检验日期")
private Date lastInsCycle;
/**
* 备注
*/
@ColumnWidth(20)
@ExcelProperty("备注")
private String memo;
} }

Loading…
Cancel
Save