From d9da88e351ee488188a8eb165b2d0f7b19a98bc4 Mon Sep 17 00:00:00 2001 From: funny <834502597@qq.com> Date: Wed, 27 May 2026 17:22:01 +0800 Subject: [PATCH] =?UTF-8?q?PDI=E9=83=A8=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QmsPdiTaskRecordController.java | 5 +- .../QmsPdiStatusItemControllerService.java | 17 +++- .../QmsPdiTaskRecordControllerService.java | 94 +++++++++++++++---- .../common/pojo/qo/QmsPdiStatusItemAddQO.java | 5 + .../vo/QmsPdiTaskRecordStatusItemGroupVO.java | 28 ++++++ .../entity/QmsPdiComponentAnagement.java | 5 + 6 files changed, 132 insertions(+), 22 deletions(-) create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordStatusItemGroupVO.java diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiTaskRecordController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiTaskRecordController.java index b7d6b348..5b9168c6 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiTaskRecordController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiTaskRecordController.java @@ -10,6 +10,7 @@ import com.nflg.wms.common.pojo.qo.QmsPdiTaskRecordTransferQO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDefectPageVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordPageVO; +import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordStatusItemGroupVO; import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; import jakarta.validation.Valid; @@ -65,10 +66,10 @@ public class QmsPdiTaskRecordController extends BaseController { } /** - * 静态/动态/特殊检测项详情(分页) + * 静态/动态/特殊检测项详情(分页,按部件分组) */ @PostMapping("statusItemDetail") - public ApiResult> statusItemDetail( + public ApiResult> statusItemDetail( @Valid @RequestBody QmsPdiTaskRecordStatusItemDetailQO request) { return ApiResult.success(taskRecordControllerService.statusItemDetail(request)); } 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 779d7d8c..51df13f1 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 @@ -71,25 +71,33 @@ public class QmsPdiStatusItemControllerService { throw new NflgException(STATE.BusinessError, "静态/动态检测项的部件描述不能为空"); } + // 状态为0或1时,部件状态不能为空 + if ((Objects.equals(request.getStatus(), 0) || Objects.equals(request.getStatus(), 1)) + && request.getComponentStatus() == null) { + throw new NflgException(STATE.BusinessError, "静态/动态检测项的部件状态不能为空"); + } + String operator = UserUtil.getUserName(); LocalDateTime now = LocalDateTime.now(); Long componentsId = null; // 处理部件 if (StrUtil.isNotBlank(request.getComponentsDes())) { - // 检查部件是否已存在 + // 检查部件是否已存在(按检测规则ID + 名称 + 状态查询) QmsPdiComponentAnagement existingComponent = componentAnagementService.lambdaQuery() .eq(QmsPdiComponentAnagement::getComponentName, request.getComponentsDes()) .eq(QmsPdiComponentAnagement::getDetectionRulesId, request.getDetectionRulesId()) + .eq(QmsPdiComponentAnagement::getStatus, request.getComponentStatus()) .one(); if (existingComponent != null) { // 部件已存在,直接使用 componentsId = existingComponent.getId(); } else { - // 新部件,插入到部件表 + // 新部件,插入到部件表(sort按检测规则ID + 状态独立计算) Integer maxComponentSort = componentAnagementService.lambdaQuery() .eq(QmsPdiComponentAnagement::getDetectionRulesId, request.getDetectionRulesId()) + .eq(QmsPdiComponentAnagement::getStatus, request.getComponentStatus()) .orderByDesc(QmsPdiComponentAnagement::getSort) .last("LIMIT 1") .oneOpt() @@ -99,6 +107,7 @@ public class QmsPdiStatusItemControllerService { QmsPdiComponentAnagement component = new QmsPdiComponentAnagement(); component.setComponentName(request.getComponentsDes()); component.setDetectionRulesId(request.getDetectionRulesId()); + component.setStatus(request.getComponentStatus()); component.setSort(maxComponentSort + 1); component.setCreateBy(operator); component.setCreateTime(now); @@ -314,9 +323,10 @@ public class QmsPdiStatusItemControllerService { String operator = UserUtil.getUserName(); LocalDateTime now = LocalDateTime.now(); - // 查询部件表最大sort + // 查询部件表最大sort(按检测规则ID + 状态独立计算) Integer maxComponentSort = componentAnagementService.lambdaQuery() .eq(QmsPdiComponentAnagement::getDetectionRulesId, detectionRulesId) + .eq(QmsPdiComponentAnagement::getStatus, status) .orderByDesc(QmsPdiComponentAnagement::getSort) .last("LIMIT 1") .oneOpt() @@ -347,6 +357,7 @@ public class QmsPdiStatusItemControllerService { QmsPdiComponentAnagement component = new QmsPdiComponentAnagement(); component.setComponentName(componentName); component.setDetectionRulesId(detectionRulesId); + component.setStatus(status != null ? status.shortValue() : null); component.setSort(currentComponentSort); component.setCreateBy(operator); component.setCreateTime(now); diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java index f21b5682..aa48f1c3 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java @@ -11,6 +11,7 @@ import com.nflg.wms.common.pojo.qo.QmsPdiTaskRecordTransferQO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDefectPageVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordPageVO; +import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordStatusItemGroupVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordSummaryVO; import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.repository.entity.QmsPdiComponentAnagement; @@ -34,6 +35,8 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -136,7 +139,7 @@ public class QmsPdiTaskRecordControllerService { /** * 查询静态/动态/特殊检测项详情(分页,按类型查询) */ - public PageData statusItemDetail(QmsPdiTaskRecordStatusItemDetailQO request) { + public PageData statusItemDetail(QmsPdiTaskRecordStatusItemDetailQO request) { QmsPdiTaskRecord record = taskRecordService.getById(request.getId()); if (Objects.isNull(record)) { throw new NflgException(STATE.BusinessError, "检测任务记录不存在"); @@ -146,18 +149,18 @@ public class QmsPdiTaskRecordControllerService { } /** - * 构建静态/动态/特殊检测项分页数据 + * 构建静态/动态/特殊检测项分页数据(按部件分组) */ - private PageData buildStatusItemPage( + private PageData buildStatusItemPage( Long taskId, int itemType, int pageNum, int pageSize) { - Page resultPage = inspectionResultsService.lambdaQuery() + // 查询全部检测项(不分页,因为要按部件分组后再分页) + List allRecords = inspectionResultsService.lambdaQuery() .eq(QmsPdiInspectionResults::getTaskId, taskId) .eq(QmsPdiInspectionResults::getInspectionItemType, itemType) - .page(new Page<>(pageNum, pageSize)); + .list(); - List records = resultPage.getRecords(); - if (records.isEmpty()) { - PageData pd = new PageData<>(); + if (allRecords.isEmpty()) { + PageData pd = new PageData<>(); pd.setPage(pageNum); pd.setPageSize(pageSize); pd.setItems(List.of()); @@ -166,7 +169,7 @@ public class QmsPdiTaskRecordControllerService { } // 批量查关联的 status_item - Set statusItemIds = records.stream() + Set statusItemIds = allRecords.stream() .map(QmsPdiInspectionResults::getInspectionItemId) .filter(Objects::nonNull) .collect(Collectors.toSet()); @@ -190,17 +193,31 @@ public class QmsPdiTaskRecordControllerService { .collect(Collectors.toMap(FileUploadRecord::getId, FileUploadRecord::getUrl, (a, b) -> a)); } - // 映射 + // 收集所有部件ID,批量查询部件名称 + Set componentIds = statusItemMap.values().stream() + .map(QmsPdiDetectionRulesStatusItem::getComponentsId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + Map componentMap = Map.of(); + if (!componentIds.isEmpty()) { + List components = componentAnagementService.listByIds(componentIds); + componentMap = components.stream() + .collect(Collectors.toMap(QmsPdiComponentAnagement::getId, c -> c, (a, b) -> a)); + } + + // 映射成 StatusItemVO 列表 Map finalStatusMap = statusItemMap; Map finalImageUrlMap = imageUrlMap; - List voList = records.stream().map(r -> { + Map finalComponentMap = componentMap; + + List voList = allRecords.stream().map(r -> { QmsPdiTaskRecordDetailVO.StatusItemVO vo = new QmsPdiTaskRecordDetailVO.StatusItemVO(); vo.setId(r.getId()); QmsPdiDetectionRulesStatusItem si = finalStatusMap.get(r.getInspectionItemId()); if (si != null) { - // 通过componentsId查询部件名称 + // 设置部件信息 if (si.getComponentsId() != null) { - QmsPdiComponentAnagement component = componentAnagementService.getById(si.getComponentsId()); + QmsPdiComponentAnagement component = finalComponentMap.get(si.getComponentsId()); if (component != null) { vo.setComponentsDes(component.getComponentName()); } @@ -219,7 +236,6 @@ public class QmsPdiTaskRecordControllerService { } vo.setInspectionImage(inspectionImageUrl); } - // 现场图已经是List,无需转换(在下一步处理) vo.setInspectionItemImage(convertImageIdsToVO(r.getInspectionItemImage())); vo.setInspectionBy(r.getInspectionBy()); vo.setInspectionTime(r.getInspectionTime()); @@ -228,11 +244,55 @@ public class QmsPdiTaskRecordControllerService { return vo; }).collect(Collectors.toList()); - PageData pd = new PageData<>(); + // 按部件分组(componentsDes 相同的放一组,null 为特殊类型无部件) + Map> groupedByComponent = new LinkedHashMap<>(); + Map componentNameToId = new HashMap<>(); + + for (int i = 0; i < allRecords.size(); i++) { + QmsPdiInspectionResults r = allRecords.get(i); + QmsPdiTaskRecordDetailVO.StatusItemVO vo = voList.get(i); + QmsPdiDetectionRulesStatusItem si = finalStatusMap.get(r.getInspectionItemId()); + + Long compId = (si != null) ? si.getComponentsId() : null; + String compName = vo.getComponentsDes(); // 可能是 null + + // 用部件ID作为分组 key(null 表示无部件) + String groupKey = compId != null ? String.valueOf(compId) : "__null__"; + + groupedByComponent.computeIfAbsent(groupKey, k -> new ArrayList<>()).add(vo); + if (compId != null && compName != null) { + componentNameToId.putIfAbsent(groupKey, compId); + } + } + + // 转成分组 VO 列表 + List groupList = new ArrayList<>(); + for (Map.Entry> entry : groupedByComponent.entrySet()) { + QmsPdiTaskRecordStatusItemGroupVO groupVO = new QmsPdiTaskRecordStatusItemGroupVO(); + String key = entry.getKey(); + if (!"__null__".equals(key)) { + Long compId = componentNameToId.get(key); + groupVO.setComponentsId(compId); + QmsPdiComponentAnagement comp = finalComponentMap.get(compId); + groupVO.setComponentName(comp != null ? comp.getComponentName() : null); + } + groupVO.setItems(entry.getValue()); + groupList.add(groupVO); + } + + // 对分组后的列表进行分页 + int total = groupList.size(); + int fromIndex = (pageNum - 1) * pageSize; + int toIndex = Math.min(fromIndex + pageSize, total); + List pagedList = (fromIndex >= total) + ? List.of() + : groupList.subList(fromIndex, toIndex); + + PageData pd = new PageData<>(); pd.setPage(pageNum); pd.setPageSize(pageSize); - pd.setItems(voList); - pd.setTotal((int) resultPage.getTotal()); + pd.setItems(pagedList); + pd.setTotal(total); return pd; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java index 9caa7c22..4d117585 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java @@ -21,6 +21,11 @@ public class QmsPdiStatusItemAddQO { */ private String componentsDes; + /** + * 部件状态:0为静态,1为动态(当status为0或1时需要传) + */ + private Short componentStatus; + /** * 检查核实内容(必传) */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordStatusItemGroupVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordStatusItemGroupVO.java new file mode 100644 index 00000000..f7afca33 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordStatusItemGroupVO.java @@ -0,0 +1,28 @@ +package com.nflg.wms.common.pojo.vo; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * PDI任务详情检测项分页返回VO(按部件分组) + */ +@Data +public class QmsPdiTaskRecordStatusItemGroupVO { + + /** + * 部件ID(特殊类型无部件时为null) + */ + private Long componentsId; + + /** + * 部件名称(特殊类型无部件时为null) + */ + private String componentName; + + /** + * 该部件下的检测项列表 + */ + private List items; +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiComponentAnagement.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiComponentAnagement.java index 2c4a84f5..161fdf3f 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiComponentAnagement.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiComponentAnagement.java @@ -41,6 +41,11 @@ public class QmsPdiComponentAnagement implements Serializable { */ private Integer sort; + /** + * 状态:0为静态,1为动态 + */ + private Short status; + /** * 创建人 */