PDI部件管理优化

This commit is contained in:
funny 2026-05-27 17:22:01 +08:00
parent 71a55b7534
commit d9da88e351
6 changed files with 132 additions and 22 deletions

View File

@ -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<PageData<QmsPdiTaskRecordDetailVO.StatusItemVO>> statusItemDetail(
public ApiResult<PageData<QmsPdiTaskRecordStatusItemGroupVO>> statusItemDetail(
@Valid @RequestBody QmsPdiTaskRecordStatusItemDetailQO request) {
return ApiResult.success(taskRecordControllerService.statusItemDetail(request));
}

View File

@ -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);

View File

@ -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<QmsPdiTaskRecordDetailVO.StatusItemVO> statusItemDetail(QmsPdiTaskRecordStatusItemDetailQO request) {
public PageData<QmsPdiTaskRecordStatusItemGroupVO> 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<QmsPdiTaskRecordDetailVO.StatusItemVO> buildStatusItemPage(
private PageData<QmsPdiTaskRecordStatusItemGroupVO> buildStatusItemPage(
Long taskId, int itemType, int pageNum, int pageSize) {
Page<QmsPdiInspectionResults> resultPage = inspectionResultsService.lambdaQuery()
// 查询全部检测项不分页因为要按部件分组后再分页
List<QmsPdiInspectionResults> allRecords = inspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, taskId)
.eq(QmsPdiInspectionResults::getInspectionItemType, itemType)
.page(new Page<>(pageNum, pageSize));
.list();
List<QmsPdiInspectionResults> records = resultPage.getRecords();
if (records.isEmpty()) {
PageData<QmsPdiTaskRecordDetailVO.StatusItemVO> pd = new PageData<>();
if (allRecords.isEmpty()) {
PageData<QmsPdiTaskRecordStatusItemGroupVO> pd = new PageData<>();
pd.setPage(pageNum);
pd.setPageSize(pageSize);
pd.setItems(List.of());
@ -166,7 +169,7 @@ public class QmsPdiTaskRecordControllerService {
}
// 批量查关联的 status_item
Set<Long> statusItemIds = records.stream()
Set<Long> 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<Long> componentIds = statusItemMap.values().stream()
.map(QmsPdiDetectionRulesStatusItem::getComponentsId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
Map<Long, QmsPdiComponentAnagement> componentMap = Map.of();
if (!componentIds.isEmpty()) {
List<QmsPdiComponentAnagement> components = componentAnagementService.listByIds(componentIds);
componentMap = components.stream()
.collect(Collectors.toMap(QmsPdiComponentAnagement::getId, c -> c, (a, b) -> a));
}
// 映射成 StatusItemVO 列表
Map<Long, QmsPdiDetectionRulesStatusItem> finalStatusMap = statusItemMap;
Map<Long, String> finalImageUrlMap = imageUrlMap;
List<QmsPdiTaskRecordDetailVO.StatusItemVO> voList = records.stream().map(r -> {
Map<Long, QmsPdiComponentAnagement> finalComponentMap = componentMap;
List<QmsPdiTaskRecordDetailVO.StatusItemVO> 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<FileDetailVO>无需转换在下一步处理
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<QmsPdiTaskRecordDetailVO.StatusItemVO> pd = new PageData<>();
// 按部件分组componentsDes 相同的放一组null 为特殊类型无部件
Map<String, List<QmsPdiTaskRecordDetailVO.StatusItemVO>> groupedByComponent = new LinkedHashMap<>();
Map<String, Long> 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作为分组 keynull 表示无部件
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<QmsPdiTaskRecordStatusItemGroupVO> groupList = new ArrayList<>();
for (Map.Entry<String, List<QmsPdiTaskRecordDetailVO.StatusItemVO>> 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<QmsPdiTaskRecordStatusItemGroupVO> pagedList = (fromIndex >= total)
? List.of()
: groupList.subList(fromIndex, toIndex);
PageData<QmsPdiTaskRecordStatusItemGroupVO> 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;
}

View File

@ -21,6 +21,11 @@ public class QmsPdiStatusItemAddQO {
*/
private String componentsDes;
/**
* 部件状态0为静态1为动态当status为0或1时需要传
*/
private Short componentStatus;
/**
* 检查核实内容必传
*/

View File

@ -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<QmsPdiTaskRecordDetailVO.StatusItemVO> items;
}

View File

@ -41,6 +41,11 @@ public class QmsPdiComponentAnagement implements Serializable {
*/
private Integer sort;
/**
* 状态0为静态1为动态
*/
private Short status;
/**
* 创建人
*/