PDI部件管理优化
This commit is contained in:
parent
71a55b7534
commit
d9da88e351
|
|
@ -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.QmsPdiTaskRecordDefectPageVO;
|
||||||
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO;
|
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO;
|
||||||
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordPageVO;
|
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordPageVO;
|
||||||
|
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordStatusItemGroupVO;
|
||||||
import com.nflg.wms.starter.BaseController;
|
import com.nflg.wms.starter.BaseController;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
@ -65,10 +66,10 @@ public class QmsPdiTaskRecordController extends BaseController {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 静态/动态/特殊检测项详情(分页)
|
* 静态/动态/特殊检测项详情(分页,按部件分组)
|
||||||
*/
|
*/
|
||||||
@PostMapping("statusItemDetail")
|
@PostMapping("statusItemDetail")
|
||||||
public ApiResult<PageData<QmsPdiTaskRecordDetailVO.StatusItemVO>> statusItemDetail(
|
public ApiResult<PageData<QmsPdiTaskRecordStatusItemGroupVO>> statusItemDetail(
|
||||||
@Valid @RequestBody QmsPdiTaskRecordStatusItemDetailQO request) {
|
@Valid @RequestBody QmsPdiTaskRecordStatusItemDetailQO request) {
|
||||||
return ApiResult.success(taskRecordControllerService.statusItemDetail(request));
|
return ApiResult.success(taskRecordControllerService.statusItemDetail(request));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -71,25 +71,33 @@ public class QmsPdiStatusItemControllerService {
|
||||||
throw new NflgException(STATE.BusinessError, "静态/动态检测项的部件描述不能为空");
|
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();
|
String operator = UserUtil.getUserName();
|
||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
Long componentsId = null;
|
Long componentsId = null;
|
||||||
|
|
||||||
// 处理部件
|
// 处理部件
|
||||||
if (StrUtil.isNotBlank(request.getComponentsDes())) {
|
if (StrUtil.isNotBlank(request.getComponentsDes())) {
|
||||||
// 检查部件是否已存在
|
// 检查部件是否已存在(按检测规则ID + 名称 + 状态查询)
|
||||||
QmsPdiComponentAnagement existingComponent = componentAnagementService.lambdaQuery()
|
QmsPdiComponentAnagement existingComponent = componentAnagementService.lambdaQuery()
|
||||||
.eq(QmsPdiComponentAnagement::getComponentName, request.getComponentsDes())
|
.eq(QmsPdiComponentAnagement::getComponentName, request.getComponentsDes())
|
||||||
.eq(QmsPdiComponentAnagement::getDetectionRulesId, request.getDetectionRulesId())
|
.eq(QmsPdiComponentAnagement::getDetectionRulesId, request.getDetectionRulesId())
|
||||||
|
.eq(QmsPdiComponentAnagement::getStatus, request.getComponentStatus())
|
||||||
.one();
|
.one();
|
||||||
|
|
||||||
if (existingComponent != null) {
|
if (existingComponent != null) {
|
||||||
// 部件已存在,直接使用
|
// 部件已存在,直接使用
|
||||||
componentsId = existingComponent.getId();
|
componentsId = existingComponent.getId();
|
||||||
} else {
|
} else {
|
||||||
// 新部件,插入到部件表
|
// 新部件,插入到部件表(sort按检测规则ID + 状态独立计算)
|
||||||
Integer maxComponentSort = componentAnagementService.lambdaQuery()
|
Integer maxComponentSort = componentAnagementService.lambdaQuery()
|
||||||
.eq(QmsPdiComponentAnagement::getDetectionRulesId, request.getDetectionRulesId())
|
.eq(QmsPdiComponentAnagement::getDetectionRulesId, request.getDetectionRulesId())
|
||||||
|
.eq(QmsPdiComponentAnagement::getStatus, request.getComponentStatus())
|
||||||
.orderByDesc(QmsPdiComponentAnagement::getSort)
|
.orderByDesc(QmsPdiComponentAnagement::getSort)
|
||||||
.last("LIMIT 1")
|
.last("LIMIT 1")
|
||||||
.oneOpt()
|
.oneOpt()
|
||||||
|
|
@ -99,6 +107,7 @@ public class QmsPdiStatusItemControllerService {
|
||||||
QmsPdiComponentAnagement component = new QmsPdiComponentAnagement();
|
QmsPdiComponentAnagement component = new QmsPdiComponentAnagement();
|
||||||
component.setComponentName(request.getComponentsDes());
|
component.setComponentName(request.getComponentsDes());
|
||||||
component.setDetectionRulesId(request.getDetectionRulesId());
|
component.setDetectionRulesId(request.getDetectionRulesId());
|
||||||
|
component.setStatus(request.getComponentStatus());
|
||||||
component.setSort(maxComponentSort + 1);
|
component.setSort(maxComponentSort + 1);
|
||||||
component.setCreateBy(operator);
|
component.setCreateBy(operator);
|
||||||
component.setCreateTime(now);
|
component.setCreateTime(now);
|
||||||
|
|
@ -314,9 +323,10 @@ public class QmsPdiStatusItemControllerService {
|
||||||
String operator = UserUtil.getUserName();
|
String operator = UserUtil.getUserName();
|
||||||
LocalDateTime now = LocalDateTime.now();
|
LocalDateTime now = LocalDateTime.now();
|
||||||
|
|
||||||
// 查询部件表最大sort
|
// 查询部件表最大sort(按检测规则ID + 状态独立计算)
|
||||||
Integer maxComponentSort = componentAnagementService.lambdaQuery()
|
Integer maxComponentSort = componentAnagementService.lambdaQuery()
|
||||||
.eq(QmsPdiComponentAnagement::getDetectionRulesId, detectionRulesId)
|
.eq(QmsPdiComponentAnagement::getDetectionRulesId, detectionRulesId)
|
||||||
|
.eq(QmsPdiComponentAnagement::getStatus, status)
|
||||||
.orderByDesc(QmsPdiComponentAnagement::getSort)
|
.orderByDesc(QmsPdiComponentAnagement::getSort)
|
||||||
.last("LIMIT 1")
|
.last("LIMIT 1")
|
||||||
.oneOpt()
|
.oneOpt()
|
||||||
|
|
@ -347,6 +357,7 @@ public class QmsPdiStatusItemControllerService {
|
||||||
QmsPdiComponentAnagement component = new QmsPdiComponentAnagement();
|
QmsPdiComponentAnagement component = new QmsPdiComponentAnagement();
|
||||||
component.setComponentName(componentName);
|
component.setComponentName(componentName);
|
||||||
component.setDetectionRulesId(detectionRulesId);
|
component.setDetectionRulesId(detectionRulesId);
|
||||||
|
component.setStatus(status != null ? status.shortValue() : null);
|
||||||
component.setSort(currentComponentSort);
|
component.setSort(currentComponentSort);
|
||||||
component.setCreateBy(operator);
|
component.setCreateBy(operator);
|
||||||
component.setCreateTime(now);
|
component.setCreateTime(now);
|
||||||
|
|
|
||||||
|
|
@ -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.QmsPdiTaskRecordDetailVO;
|
||||||
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDefectPageVO;
|
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDefectPageVO;
|
||||||
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordPageVO;
|
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.pojo.vo.QmsPdiTaskRecordSummaryVO;
|
||||||
import com.nflg.wms.common.util.UserUtil;
|
import com.nflg.wms.common.util.UserUtil;
|
||||||
import com.nflg.wms.repository.entity.QmsPdiComponentAnagement;
|
import com.nflg.wms.repository.entity.QmsPdiComponentAnagement;
|
||||||
|
|
@ -34,6 +35,8 @@ import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
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());
|
QmsPdiTaskRecord record = taskRecordService.getById(request.getId());
|
||||||
if (Objects.isNull(record)) {
|
if (Objects.isNull(record)) {
|
||||||
throw new NflgException(STATE.BusinessError, "检测任务记录不存在");
|
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) {
|
Long taskId, int itemType, int pageNum, int pageSize) {
|
||||||
Page<QmsPdiInspectionResults> resultPage = inspectionResultsService.lambdaQuery()
|
// 查询全部检测项(不分页,因为要按部件分组后再分页)
|
||||||
|
List<QmsPdiInspectionResults> allRecords = inspectionResultsService.lambdaQuery()
|
||||||
.eq(QmsPdiInspectionResults::getTaskId, taskId)
|
.eq(QmsPdiInspectionResults::getTaskId, taskId)
|
||||||
.eq(QmsPdiInspectionResults::getInspectionItemType, itemType)
|
.eq(QmsPdiInspectionResults::getInspectionItemType, itemType)
|
||||||
.page(new Page<>(pageNum, pageSize));
|
.list();
|
||||||
|
|
||||||
List<QmsPdiInspectionResults> records = resultPage.getRecords();
|
if (allRecords.isEmpty()) {
|
||||||
if (records.isEmpty()) {
|
PageData<QmsPdiTaskRecordStatusItemGroupVO> pd = new PageData<>();
|
||||||
PageData<QmsPdiTaskRecordDetailVO.StatusItemVO> pd = new PageData<>();
|
|
||||||
pd.setPage(pageNum);
|
pd.setPage(pageNum);
|
||||||
pd.setPageSize(pageSize);
|
pd.setPageSize(pageSize);
|
||||||
pd.setItems(List.of());
|
pd.setItems(List.of());
|
||||||
|
|
@ -166,7 +169,7 @@ public class QmsPdiTaskRecordControllerService {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 批量查关联的 status_item
|
// 批量查关联的 status_item
|
||||||
Set<Long> statusItemIds = records.stream()
|
Set<Long> statusItemIds = allRecords.stream()
|
||||||
.map(QmsPdiInspectionResults::getInspectionItemId)
|
.map(QmsPdiInspectionResults::getInspectionItemId)
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
|
|
@ -190,17 +193,31 @@ public class QmsPdiTaskRecordControllerService {
|
||||||
.collect(Collectors.toMap(FileUploadRecord::getId, FileUploadRecord::getUrl, (a, b) -> a));
|
.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, QmsPdiDetectionRulesStatusItem> finalStatusMap = statusItemMap;
|
||||||
Map<Long, String> finalImageUrlMap = imageUrlMap;
|
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();
|
QmsPdiTaskRecordDetailVO.StatusItemVO vo = new QmsPdiTaskRecordDetailVO.StatusItemVO();
|
||||||
vo.setId(r.getId());
|
vo.setId(r.getId());
|
||||||
QmsPdiDetectionRulesStatusItem si = finalStatusMap.get(r.getInspectionItemId());
|
QmsPdiDetectionRulesStatusItem si = finalStatusMap.get(r.getInspectionItemId());
|
||||||
if (si != null) {
|
if (si != null) {
|
||||||
// 通过componentsId查询部件名称
|
// 设置部件信息
|
||||||
if (si.getComponentsId() != null) {
|
if (si.getComponentsId() != null) {
|
||||||
QmsPdiComponentAnagement component = componentAnagementService.getById(si.getComponentsId());
|
QmsPdiComponentAnagement component = finalComponentMap.get(si.getComponentsId());
|
||||||
if (component != null) {
|
if (component != null) {
|
||||||
vo.setComponentsDes(component.getComponentName());
|
vo.setComponentsDes(component.getComponentName());
|
||||||
}
|
}
|
||||||
|
|
@ -219,7 +236,6 @@ public class QmsPdiTaskRecordControllerService {
|
||||||
}
|
}
|
||||||
vo.setInspectionImage(inspectionImageUrl);
|
vo.setInspectionImage(inspectionImageUrl);
|
||||||
}
|
}
|
||||||
// 现场图已经是List<FileDetailVO>,无需转换(在下一步处理)
|
|
||||||
vo.setInspectionItemImage(convertImageIdsToVO(r.getInspectionItemImage()));
|
vo.setInspectionItemImage(convertImageIdsToVO(r.getInspectionItemImage()));
|
||||||
vo.setInspectionBy(r.getInspectionBy());
|
vo.setInspectionBy(r.getInspectionBy());
|
||||||
vo.setInspectionTime(r.getInspectionTime());
|
vo.setInspectionTime(r.getInspectionTime());
|
||||||
|
|
@ -228,11 +244,55 @@ public class QmsPdiTaskRecordControllerService {
|
||||||
return vo;
|
return vo;
|
||||||
}).collect(Collectors.toList());
|
}).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作为分组 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<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.setPage(pageNum);
|
||||||
pd.setPageSize(pageSize);
|
pd.setPageSize(pageSize);
|
||||||
pd.setItems(voList);
|
pd.setItems(pagedList);
|
||||||
pd.setTotal((int) resultPage.getTotal());
|
pd.setTotal(total);
|
||||||
return pd;
|
return pd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,11 @@ public class QmsPdiStatusItemAddQO {
|
||||||
*/
|
*/
|
||||||
private String componentsDes;
|
private String componentsDes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部件状态:0为静态,1为动态(当status为0或1时需要传)
|
||||||
|
*/
|
||||||
|
private Short componentStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查核实内容(必传)
|
* 检查核实内容(必传)
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -41,6 +41,11 @@ public class QmsPdiComponentAnagement implements Serializable {
|
||||||
*/
|
*/
|
||||||
private Integer sort;
|
private Integer sort;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 状态:0为静态,1为动态
|
||||||
|
*/
|
||||||
|
private Short status;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建人
|
* 创建人
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue