diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java index 2035ced9..8bfeaf2d 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java @@ -84,15 +84,15 @@ public class QmsPdiStatusItemController extends BaseController { if (status == 0) { // 动态检测 templateName = "动态监测标准模版"; - headers = Arrays.asList("部件描述", "*检查核实内容", "检测示例图", "排序"); + headers = Arrays.asList("部件描述", "*检查核实内容", "检测示例图", "排序(可选)"); } else if (status == 1) { // 静态检测 templateName = "静态检测标准模版"; - headers = Arrays.asList("部件描述", "*检查核实内容", "检测示例图", "排序"); + headers = Arrays.asList("部件描述", "*检查核实内容", "检测示例图", "排序(可选)"); } else if (status == 2) { // 特殊检测(整件)- 不需要部件描述字段 templateName = "整件检测标准模版"; - headers = Arrays.asList("*检查核实内容", "检测示例图", "排序"); + headers = Arrays.asList("*检查核实内容", "检测示例图", "排序(可选)"); } else { throw new IllegalArgumentException("状态参数错误,只能为0、1或2"); } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java index 04360581..ac6f367e 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java @@ -39,6 +39,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -79,15 +80,6 @@ public class QmsPdiStatusItemControllerService { .map(QmsPdiDetectionRulesStatusItem::getSort) .orElse(0); - // 将已有数据的sort全部+1 - if (maxSort > 0) { - statusItemService.lambdaUpdate() - .eq(QmsPdiDetectionRulesStatusItem::getDetectionRulesId, request.getDetectionRulesId()) - .eq(QmsPdiDetectionRulesStatusItem::getStatus, request.getStatus()) - .setSql("sort = sort + 1") - .update(); - } - String operator = UserUtil.getUserName(); LocalDateTime now = LocalDateTime.now(); QmsPdiDetectionRulesStatusItem entity = new QmsPdiDetectionRulesStatusItem() @@ -96,7 +88,7 @@ public class QmsPdiStatusItemControllerService { .setInspectionContent(request.getInspectionContent()) .setInspectionImage(request.getInspectionImage()) .setStatus(request.getStatus()) - .setSort(1) // 新数据sort=1 + .setSort(maxSort + 1) // 追加到最后 .setCreateBy(operator) .setCreateTime(now); statusItemService.save(entity); @@ -200,7 +192,7 @@ public class QmsPdiStatusItemControllerService { List data = EecExcelUtil.readTo(new java.io.ByteArrayInputStream(fileBytes), QmsPdiStatusItemImportDTO.class); if (CollectionUtil.isEmpty(data)) { - throw new NflgException(STATE.BusinessError, "导入文件内容为空"); + throw new NflgException(STATE.BusinessError, "导入文件无数据"); } // 读取 Excel 里的所有图片 @@ -230,30 +222,68 @@ public class QmsPdiStatusItemControllerService { } } - String operator = UserUtil.getUserName(); - LocalDateTime now = LocalDateTime.now(); - List entities = data.stream() + // 过滤掉检查核实内容为空的数据 + List validData = data.stream() .filter(dto -> StrUtil.isNotBlank(dto.getInspectionContent())) - .map(dto -> { - // 状态为0或1时,部件描述不能为空 - if ((Objects.equals(status, 0) || Objects.equals(status, 1)) - && StrUtil.isBlank(dto.getComponentsDes())) { - throw new NflgException(STATE.BusinessError, "静态/动态检测项的部件描述不能为空"); - } - return new QmsPdiDetectionRulesStatusItem() - .setDetectionRulesId(detectionRulesId) - .setComponentsDes(dto.getComponentsDes()) - .setInspectionContent(dto.getInspectionContent()) - .setInspectionImage(dto.getInspectionImage()) - .setSort(dto.getSort()) - .setStatus(status) - .setCreateBy(operator) - .setCreateTime(now); - }) .collect(Collectors.toList()); - if (CollectionUtil.isEmpty(entities)) { + + if (CollectionUtil.isEmpty(validData)) { throw new NflgException(STATE.BusinessError, "导入数据中必填字段(检查核实内容)为空,请检查文件"); } + + // 校验:状态为0或1时,部件描述不能为空 + for (QmsPdiStatusItemImportDTO dto : validData) { + if ((Objects.equals(status, 0) || Objects.equals(status, 1)) + && StrUtil.isBlank(dto.getComponentsDes())) { + throw new NflgException(STATE.BusinessError, "静态/动态检测项的部件描述不能为空"); + } + } + + // 查询数据库中该检测规则+状态的最大sort值 + Integer maxSort = statusItemService.lambdaQuery() + .eq(QmsPdiDetectionRulesStatusItem::getDetectionRulesId, detectionRulesId) + .eq(QmsPdiDetectionRulesStatusItem::getStatus, status) + .orderByDesc(QmsPdiDetectionRulesStatusItem::getSort) + .last("LIMIT 1") + .oneOpt() + .map(QmsPdiDetectionRulesStatusItem::getSort) + .orElse(0); + + // 判断导入数据中是否有空的sort值 + boolean hasEmptySort = validData.stream().anyMatch(dto -> dto.getSort() == null); + + // 计算起始sort值 + int startSort = maxSort + 1; + + // 处理排序逻辑 + if (hasEmptySort) { + // 情况A:存在空值 - 按Excel顺序从起始值递增 + for (int i = 0; i < validData.size(); i++) { + validData.get(i).setSort(startSort + i); + } + } else { + // 情况B:全部有值 - 先按sort排序,再从起始值递增 + validData.sort(Comparator.comparingInt(QmsPdiStatusItemImportDTO::getSort)); + for (int i = 0; i < validData.size(); i++) { + validData.get(i).setSort(startSort + i); + } + } + + // 转换为实体并保存 + String operator = UserUtil.getUserName(); + LocalDateTime now = LocalDateTime.now(); + List entities = validData.stream() + .map(dto -> new QmsPdiDetectionRulesStatusItem() + .setDetectionRulesId(detectionRulesId) + .setComponentsDes(dto.getComponentsDes()) + .setInspectionContent(dto.getInspectionContent()) + .setInspectionImage(dto.getInspectionImage()) + .setSort(dto.getSort()) + .setStatus(status) + .setCreateBy(operator) + .setCreateTime(now)) + .collect(Collectors.toList()); + statusItemService.saveBatch(entities); markMaintained(detectionRulesId); } @@ -265,18 +295,21 @@ public class QmsPdiStatusItemControllerService { */ public PageData search(QmsPdiStatusItemSearchQO request) { return buildStatusItemPage(request.getDetectionRulesId(), request.getStatus(), - request.getPage(), request.getPageSize()); + request.getPage(), request.getPageSize(), request.getIsAsc()); } /** * 按状态构建检测项分页数据 */ private PageData buildStatusItemPage( - Long detectionRulesId, int status, int pageNum, int pageSize) { + Long detectionRulesId, int status, int pageNum, int pageSize, Boolean isAsc) { + // 获取排序方向(默认降序) + boolean ascending = isAsc != null && isAsc; + Page page = statusItemService.lambdaQuery() .eq(QmsPdiDetectionRulesStatusItem::getDetectionRulesId, detectionRulesId) .eq(QmsPdiDetectionRulesStatusItem::getStatus, status) - .orderByAsc(QmsPdiDetectionRulesStatusItem::getSort) + .orderBy(true, ascending, QmsPdiDetectionRulesStatusItem::getSort) .page(new Page<>(pageNum, pageSize)); List voList = page.getRecords().stream() diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemImportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemImportDTO.java index 8328e394..e8a2aec0 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemImportDTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemImportDTO.java @@ -30,9 +30,9 @@ public class QmsPdiStatusItemImportDTO { private String inspectionImage; /** - * 排序 + * 排序(可选) */ - @ExcelColumn("排序") + @ExcelColumn("排序(可选)") private Integer sort; /** diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemSearchQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemSearchQO.java index 4b6ba765..0a72f782 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemSearchQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemSearchQO.java @@ -30,4 +30,9 @@ public class QmsPdiStatusItemSearchQO { */ @NotNull(message = "PDI检测项类型不能为空") private Integer status; + + /** + * 是否升序:true=升序,false=降序(默认降序) + */ + private Boolean isAsc = false; }