feat(inspection): 丰富质检结果及工单详情的检测项信息和示例图展示

- 新增 IQmsPdiDetectionRulesStatusItemService 资源,支持检测项状态信息查询
- 在 QmsPdiInspectionResultsControllerService 中补充检测项部件描述、核实内容及示例图URL
- 在 QmsIssueTicketControllerService 中完善不合格项详情填充检测项信息及示例图展示
- 新增处理时间字段 processTime,使用审批时间赋值以明确工单处理时点
- 扩展质检结果相关 VO 类,加入检测项描述、核实内容及示例图字段支持
- 修改数据库 Mapper,增加 overdue 字段支持质检任务超期标识
- 完善文件上传记录查询逻辑,增强示例图文件的关联与映射处理
This commit is contained in:
funny 2026-05-08 14:06:31 +08:00
parent d81aaea6e6
commit 858726758d
7 changed files with 187 additions and 6 deletions

View File

@ -66,6 +66,9 @@ public class QmsIssueTicketControllerService {
@Resource
private IQmsPdiInspectionResultsService pdiInspectionResultsService;
@Resource
private IQmsPdiDetectionRulesStatusItemService pdiStatusItemService;
@Resource
private WmsIncomingInspectionTaskCallbackService wmsIncomingInspectionTaskCallbackService;
@ -525,6 +528,7 @@ public class QmsIssueTicketControllerService {
processVO.setApprovalUserId(process.getApprovalUserId());
processVO.setApprovalUserName(process.getApprovalUserName());
processVO.setApprovalTime(process.getApprovalTime());
processVO.setProcessTime(process.getApprovalTime());
processVO.setLeaderApprovalResult(process.getLeaderApprovalResult());
processVO.setLeaderApprovalOpinion(process.getLeaderApprovalOpinion());
processVO.setLeaderUserId(process.getLeaderUserId());
@ -541,6 +545,45 @@ public class QmsIssueTicketControllerService {
.eq(QmsPdiInspectionResults::getInspectionItemResults, false)
.list();
// 收集检测项ID仅type=0/1/3
Set<Long> statusItemIds = unqualifiedResults.stream()
.filter(r -> r.getInspectionItemType() != null && r.getInspectionItemType() != 2)
.map(QmsPdiInspectionResults::getInspectionItemId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
// 查询检测项信息
Map<Long, QmsPdiDetectionRulesStatusItem> statusItemMap = new HashMap<>();
if (!statusItemIds.isEmpty()) {
List<QmsPdiDetectionRulesStatusItem> statusItems = pdiStatusItemService.lambdaQuery()
.in(QmsPdiDetectionRulesStatusItem::getId, statusItemIds)
.list();
statusItemMap = statusItems.stream()
.collect(Collectors.toMap(QmsPdiDetectionRulesStatusItem::getId, s -> s, (a, b) -> a));
}
// 收集示例图ID
Set<Long> exampleImageIds = statusItemMap.values().stream()
.map(QmsPdiDetectionRulesStatusItem::getInspectionImage)
.filter(StrUtil::isNotBlank)
.flatMap(imageStr -> Arrays.stream(imageStr.split(",")))
.filter(StrUtil::isNotBlank)
.map(Long::valueOf)
.collect(Collectors.toSet());
// 查询示例图
Map<Long, FileUploadRecord> exampleImageMap = new HashMap<>();
if (!exampleImageIds.isEmpty()) {
List<FileUploadRecord> records = fileUploadRecordService.lambdaQuery()
.in(FileUploadRecord::getId, exampleImageIds)
.list();
exampleImageMap = records.stream()
.collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a));
}
final Map<Long, QmsPdiDetectionRulesStatusItem> finalStatusItemMap = statusItemMap;
final Map<Long, FileUploadRecord> finalExampleImageMap = exampleImageMap;
for (QmsPdiInspectionResults result : unqualifiedResults) {
QmsPdiTicketDetailVO.UnqualifiedItemVO itemVO = new QmsPdiTicketDetailVO.UnqualifiedItemVO();
itemVO.setId(result.getId());
@ -551,6 +594,29 @@ public class QmsIssueTicketControllerService {
itemVO.setInspectorId(result.getInspectorId());
itemVO.setInspectionTime(result.getInspectionTime());
itemVO.setInspectionBy(result.getInspectionBy());
// 填充检测项信息仅type=0/1/3
if (result.getInspectionItemType() != null && result.getInspectionItemType() != 2) {
QmsPdiDetectionRulesStatusItem statusItem = finalStatusItemMap.get(result.getInspectionItemId());
if (statusItem != null) {
itemVO.setComponentsDes(statusItem.getComponentsDes());
itemVO.setInspectionContent(statusItem.getInspectionContent());
// 解析示例图URL
if (StrUtil.isNotBlank(statusItem.getInspectionImage())) {
String exampleUrl = Arrays.stream(statusItem.getInspectionImage().split(","))
.filter(StrUtil::isNotBlank)
.map(String::trim)
.map(Long::valueOf)
.map(finalExampleImageMap::get)
.filter(Objects::nonNull)
.map(FileUploadRecord::getUrl)
.findFirst()
.orElse(null);
itemVO.setInspectionExampleImage(exampleUrl);
}
}
}
unqualifiedItems.add(itemVO);
}
}
@ -626,6 +692,8 @@ public class QmsIssueTicketControllerService {
List<QmsPdiTicketMyDetailVO.ProcessVO> processVOList = processes.stream().map(process -> {
QmsPdiTicketMyDetailVO.ProcessVO processVO = new QmsPdiTicketMyDetailVO.ProcessVO();
BeanUtil.copyProperties(process, processVO);
// 设置处理时间使用审批时间
processVO.setProcessTime(process.getApprovalTime());
// 查询该处理记录下的措施列表
List<QmsIssueTicketProcessMeasure> measures = issueTicketProcessMeasureService.lambdaQuery()

View File

@ -19,11 +19,13 @@ import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.FileUploadRecord;
import com.nflg.wms.repository.entity.QmsPdiDetectionRules;
import com.nflg.wms.repository.entity.QmsPdiDetectionRulesDeliveryItem;
import com.nflg.wms.repository.entity.QmsPdiDetectionRulesStatusItem;
import com.nflg.wms.repository.entity.QmsPdiInspectionResults;
import com.nflg.wms.repository.entity.QmsPdiTaskRecord;
import com.nflg.wms.repository.service.IFileUploadRecordService;
import com.nflg.wms.repository.service.IQmsPdiDetectionRulesDeliveryItemService;
import com.nflg.wms.repository.service.IQmsPdiDetectionRulesService;
import com.nflg.wms.repository.service.IQmsPdiDetectionRulesStatusItemService;
import com.nflg.wms.repository.service.IQmsPdiInspectionResultsService;
import com.nflg.wms.repository.service.IQmsPdiTaskRecordService;
import jakarta.annotation.Resource;
@ -59,6 +61,9 @@ public class QmsPdiInspectionResultsControllerService {
@Resource
private IQmsPdiDetectionRulesDeliveryItemService deliveryItemService;
@Resource
private IQmsPdiDetectionRulesStatusItemService statusItemService;
@Resource
private QmsPdiTaskRecordControllerService taskRecordControllerService;
@ -238,14 +243,14 @@ public class QmsPdiInspectionResultsControllerService {
}
/**
* QmsPdiInspectionResults 列表转换为 QmsPdiInspectionResultVO 列表图片转为List格式
* QmsPdiInspectionResults 列表转换为 QmsPdiInspectionResultVO 列表图片转为List格式补充检测项信息
*/
private List<QmsPdiInspectionResultVO> buildInspectionResultVOList(List<QmsPdiInspectionResults> items) {
if (items == null || items.isEmpty()) {
return null;
}
// 收集所有图片ID
// 收集所有现场图片ID
Set<Long> imageIds = items.stream()
.map(QmsPdiInspectionResults::getInspectionItemImage)
.filter(cn.hutool.core.util.StrUtil::isNotBlank)
@ -254,7 +259,7 @@ public class QmsPdiInspectionResultsControllerService {
.map(Long::valueOf)
.collect(Collectors.toSet());
// 查询图片文件信息
// 查询现场图片文件信息
Map<Long, FileUploadRecord> imageMap = new HashMap<>();
if (!imageIds.isEmpty()) {
List<FileUploadRecord> records = fileUploadRecordService.lambdaQuery()
@ -264,8 +269,47 @@ public class QmsPdiInspectionResultsControllerService {
.collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a));
}
// 收集所有检测项ID仅type=0/1/3需要查询status_item
Set<Long> statusItemIds = items.stream()
.filter(item -> item.getInspectionItemType() != null && item.getInspectionItemType() != 2)
.map(QmsPdiInspectionResults::getInspectionItemId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
// 查询检测项信息
Map<Long, QmsPdiDetectionRulesStatusItem> statusItemMap = new HashMap<>();
if (!statusItemIds.isEmpty()) {
List<QmsPdiDetectionRulesStatusItem> statusItems = statusItemService.lambdaQuery()
.in(QmsPdiDetectionRulesStatusItem::getId, statusItemIds)
.list();
statusItemMap = statusItems.stream()
.collect(Collectors.toMap(QmsPdiDetectionRulesStatusItem::getId, s -> s, (a, b) -> a));
}
// 收集所有示例图ID
Set<Long> exampleImageIds = statusItemMap.values().stream()
.map(QmsPdiDetectionRulesStatusItem::getInspectionImage)
.filter(cn.hutool.core.util.StrUtil::isNotBlank)
.flatMap(imageStr -> Arrays.stream(imageStr.split(",")))
.filter(cn.hutool.core.util.StrUtil::isNotBlank)
.map(Long::valueOf)
.collect(Collectors.toSet());
// 查询示例图文件信息
Map<Long, FileUploadRecord> exampleImageMap = new HashMap<>();
if (!exampleImageIds.isEmpty()) {
List<FileUploadRecord> records = fileUploadRecordService.lambdaQuery()
.in(FileUploadRecord::getId, exampleImageIds)
.list();
exampleImageMap = records.stream()
.collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a));
}
// 构建返回值
final Map<Long, FileUploadRecord> finalImageMap = imageMap;
final Map<Long, QmsPdiDetectionRulesStatusItem> finalStatusItemMap = statusItemMap;
final Map<Long, FileUploadRecord> finalExampleImageMap = exampleImageMap;
return items.stream().map(item -> {
QmsPdiInspectionResultVO vo = new QmsPdiInspectionResultVO();
vo.setId(item.getId());
@ -279,7 +323,29 @@ public class QmsPdiInspectionResultsControllerService {
vo.setInspectionTime(item.getInspectionTime());
vo.setInspectionBy(item.getInspectionBy());
// 解析图片为 FileDetailVO 列表
// 填充检测项信息仅type=0/1/3
if (item.getInspectionItemType() != null && item.getInspectionItemType() != 2) {
QmsPdiDetectionRulesStatusItem statusItem = finalStatusItemMap.get(item.getInspectionItemId());
if (statusItem != null) {
vo.setComponentsDes(statusItem.getComponentsDes());
vo.setInspectionContent(statusItem.getInspectionContent());
// 解析示例图URL
if (cn.hutool.core.util.StrUtil.isNotBlank(statusItem.getInspectionImage())) {
String exampleUrl = Arrays.stream(statusItem.getInspectionImage().split(","))
.filter(cn.hutool.core.util.StrUtil::isNotBlank)
.map(String::trim)
.map(Long::valueOf)
.map(finalExampleImageMap::get)
.filter(Objects::nonNull)
.map(FileUploadRecord::getUrl)
.findFirst()
.orElse(null);
vo.setInspectionExampleImage(exampleUrl);
}
}
}
// 解析现场图片为 FileDetailVO 列表
if (cn.hutool.core.util.StrUtil.isNotBlank(item.getInspectionItemImage())) {
List<QmsPdiTaskRecordDetailVO.FileDetailVO> imageList = Arrays.stream(item.getInspectionItemImage().split(","))
.filter(cn.hutool.core.util.StrUtil::isNotBlank)

View File

@ -36,6 +36,21 @@ public class QmsPdiInspectionResultVO {
*/
private Integer inspectionItemType;
/**
* 部件描述仅type=0/1/3有
*/
private String componentsDes;
/**
* 检查核实内容仅type=0/1/3有
*/
private String inspectionContent;
/**
* 检测示例图URL仅type=0/1/3有
*/
private String inspectionExampleImage;
/**
* 检验现场图片详情列表
*/

View File

@ -54,4 +54,9 @@ public class QmsPdiInspectionResultsPageVO {
* 质检状态0=待检查1=检验中2=已完成3=待流转
*/
private Integer inspectionEnable;
/**
* 是否超期
*/
private Boolean overdue;
}

View File

@ -55,6 +55,21 @@ public class QmsPdiTicketDetailVO {
*/
private Integer inspectionItemType;
/**
* 部件描述仅type=0/1/3有
*/
private String componentsDes;
/**
* 检查核实内容仅type=0/1/3有
*/
private String inspectionContent;
/**
* 检测示例图URL仅type=0/1/3有
*/
private String inspectionExampleImage;
/**
* 检验现场图片详情列表
*/
@ -144,6 +159,11 @@ public class QmsPdiTicketDetailVO {
*/
private LocalDateTime approvalTime;
/**
* 处理时间使用审批时间
*/
private LocalDateTime processTime;
/**
* 上级领导审批结果0=驳回1=同意
*/

View File

@ -188,6 +188,11 @@ public class QmsPdiTicketMyDetailVO {
*/
private LocalDateTime approvalTime;
/**
* 处理时间使用审批时间
*/
private LocalDateTime processTime;
/**
* 上级领导审批结果0=驳回1=同意
*/

View File

@ -13,7 +13,8 @@
r.inspection_version AS inspectionVersion,
t.submission_time AS submissionTime,
t.required_completion_time AS requiredCompletionTime,
t.inspection_enable AS inspectionEnable
t.inspection_enable AS inspectionEnable,
t.overdue
FROM qms_pdi_task_record t
LEFT JOIN qms_pdi_detection_rules r ON r.id = t.detection_rules_id
<where>
@ -48,7 +49,8 @@
r.inspection_version AS inspectionVersion,
t.submission_time AS submissionTime,
t.required_completion_time AS requiredCompletionTime,
t.inspection_enable AS inspectionEnable
t.inspection_enable AS inspectionEnable,
t.overdue
FROM qms_pdi_task_record t
LEFT JOIN qms_pdi_detection_rules r ON r.id = t.detection_rules_id
<where>