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. 219
      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 地址
*/
//String NACOS_DEV_ADDR = "192.168.249.27:8848";
String NACOS_DEV_ADDR = "127.0.0.1:8848";
String NACOS_DEV_ADDR = "192.168.249.27:8848";
// String NACOS_DEV_ADDR = "127.0.0.1:8848";
/**R
* nacos prod 地址

@ -169,8 +169,105 @@ public class BsAssignController extends BladeController {
@ApiLog("分派规则维护修改")
@Operation(summary = "修改", description = "传入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 *
FROM BS_BAT_CONFIG
FROM BA_BAT_CONFIG
WHERE is_deleted = 0
</select>
<select id="exportBatConfig" resultType="org.springblade.desk.basic.excel.BatConfigExcel">
SELECT *
FROM BS_BAT_CONFIG ${ew.customSqlSegment}
FROM BA_BAT_CONFIG ${ew.customSqlSegment}
</select>
</mapper>

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

@ -80,15 +80,30 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
return page.setRecords(baseMapper.selectBsAssignPage(page, bsAssign));
}
/**
* 校验新数据是否与同工艺能力的已有数据存在完全重复
*/
private String validateDuplicateWithSameCraft(BsAssignEntity newEntity, Map<Long, List<BsAssignEntity>> existingGroupByCraft) {
@Override
public R saveBat(List<BsAssignEntity> addList) {
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 (newEntity.getSingleUpArea().compareTo(newEntity.getSingleDownArea()) < 0) {
return R.fail("单批面积上限不能小于单批面积下限");
}
// 拼接质量等级名称
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 &&
@ -96,7 +111,7 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
);
if (hasDuplicateSingleArea) {
return "单面积上下限已存在,请检查数据";
return R.fail("单面积上下限已存在,请检查数据");
}
// 校验单批面积区间是否完全重复(左右边界都相等)
@ -107,55 +122,9 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
);
if (hasDuplicateBatchArea) {
return "单批面积上下限已存在,请检查数据";
}
return null;
return R.fail("单批面积上下限已存在,请检查数据");
}
/**
* 校验
*/
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) {
R.fail("单批面积上限不能小于单批面积下限");
}
// 拼接质量等级名称
String prodMarkNames = parseProdMarkNames(entity.getProdMarkId());
entity.setProdMark(prodMarkNames);
// 校验是否与同工艺能力的已有数据完全重复
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));
@ -191,9 +160,24 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
@Override
public R importExcel(List<BsAssignExcel> listexcel) {
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);
//工艺能力
@ -221,20 +205,16 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
notice.setCenterId(oems.get(0).getId());
}
// 质量等级处理
String prodmark = noticeExcel.getProdMark();
if (prodmark != null && !prodmark.isEmpty()) {
List<String> strs = Arrays.asList(prodmark.split(","));
List<String> ids = new ArrayList<>();
for(String str : strs){
R<QualityGradeEntity> entity = iWorkOrderClient.getByName(str.trim());
if (entity.getData() != null) {
R<QualityGradeEntity> entity = iWorkOrderClient.getByName(str);
ids.add(entity.getData().getId().toString());
}
}
String str = ids.stream().collect(Collectors.joining(","));
notice.setProdMarkId(str);
}
//指定类型
String category = DictCache.getKey("AssignPoint", noticeExcel.getPointTypeName());
@ -242,21 +222,117 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
//限制类型
String categorylimit = DictCache.getKey("AssignLimit", noticeExcel.getLimitTypeName());
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("单面积上下限已存在,请检查数据");
}
// 通用校验
R validationResult = validateBeforeSave(noticeList, null);
if (validationResult != null) {
return validationResult;
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. 遍历完成后的结果提示
if (!foundMatch) {
System.out.println("\n遍历完成,未发现任何数据的上限落在之前遍历数据的上下限区间内");
return R.data(saveBatch(noticeList));
}
return R.data(null);
}
@Override
public List<BsAssignExcel> exportBsAssign(Wrapper<BsAssignEntity> queryWrapper) {
List<BsAssignExcel> bsAssignList = baseMapper.exportBsAssign(queryWrapper);
@ -297,13 +373,4 @@ public class BsAssignServiceImpl extends BaseServiceImpl<BsAssignMapper, BsAssig
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)
@ExcelProperty("巡检点位置")
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)
@ExcelProperty("巡检周期(h)")
@ExcelProperty("巡检周期")
private Long insCycle;
/**
* 上次巡检日期
*/
@ColumnWidth(20)
@ExcelProperty("上次检验日期")
private Date lastInsCycle;
/**
* 备注
*/
@ColumnWidth(20)
@ExcelProperty("备注")
private String memo;
}

Loading…
Cancel
Save