feat(qms): 新增PQC工单分派及详情查看功能

- 增加接口支持发起PQC工单,更新工单状态为处理中并分配处理人推送待办
- 实现按处理人分组合并不合格项并创建处理记录及待办消息
- 新增查询本人相关PQC工单详情接口,仅返回本人相关处理记录和措施
- 完善PQC工单处理流程,支持处理人提交审批及措施填写校验
- 添加PQC工单结束处理判断,最后一人提交时更新工单状态为已完成
- 新增文件及措施信息的解析和转换辅助方法,丰富详情数据展示
- 新增PQC任务及任务详情相关实体、接口及实现,支持任务管理功能
- 新增PQC任务相关Controller接口,包括查询、暂存和提交功能
- 优化PQC工单流程中的权限校验和异常处理,保障业务流程合理性
This commit is contained in:
funny 2026-05-22 15:48:34 +08:00
parent 3b782f471f
commit e69f212359
4 changed files with 89 additions and 29 deletions

View File

@ -244,11 +244,10 @@ public class QmsIssueTicketControllerService {
// 创建处理记录
QmsIssueTicketProcess process = new QmsIssueTicketProcess()
.setTicketId(ticket.getId())
.setIssueTicketId(ticket.getId())
.setHandlerUserId(userId)
.setHandlerUserName(user.getUserName())
.setTaskResultIds(taskResultIdsStr)
.setCreateTime(now);
.setTaskResultIds(taskResultIdsStr);
issueTicketProcessService.save(process);
// 推送待办消息
@ -375,10 +374,6 @@ public class QmsIssueTicketControllerService {
}
}
}
@Resource
private IQmsIssueTicketProcessService issueTicketProcessService;
@Resource
private IQmsIssueTicketProcessMeasureService issueTicketProcessMeasureService;
@ -2036,11 +2031,11 @@ public class QmsIssueTicketControllerService {
vo.setCreateUserName(ticket.getCreateUserName());
// 5. 解析工单图片
if (StrUtil.isNotBlank(ticket.getImages())) {
List<Long> imageIds = Arrays.stream(ticket.getImages().split(","))
if (StrUtil.isNotBlank(ticket.getImageIds())) {
List<Long> imageIds = Arrays.stream(ticket.getImageIds().split(","))
.filter(StrUtil::isNotBlank)
.map(String::trim)
.map(Long::valueOf)
.map(s -> Long.valueOf(s))
.distinct()
.collect(Collectors.toList());
List<FileUploadRecord> fileRecords = fileUploadRecordService.lambdaQuery()
@ -2150,7 +2145,7 @@ public class QmsIssueTicketControllerService {
QmsPqcInspectionPointItems item = itemMap.get(detail.getInspectionPointItemId());
if (item != null) {
issueVO.setInspectionContent(item.getInspectionContent());
issueVO.setInspectionLevel(item.getInspectionLevel());
issueVO.setInspectionLevel(item.getInspectionLevel() != null ? item.getInspectionLevel().shortValue() : null);
issueVO.setInspectionExampleImage(item.getInspectionImgUrl());
}

View File

@ -472,7 +472,7 @@ public class QmsIssueTicketProcessControllerService {
long temporaryCount = 0;
if (temporaryTypeId != null) {
temporaryCount = issueTicketProcessMeasureService.lambdaQuery()
.eq(QmsIssueTicketProcessMeasure::getProcessId, processId)
.eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, processId)
.eq(QmsIssueTicketProcessMeasure::getMeasureTypeId, temporaryTypeId)
.count();
}
@ -482,7 +482,7 @@ public class QmsIssueTicketProcessControllerService {
long permanentCount = 0;
if (permanentTypeId != null) {
permanentCount = issueTicketProcessMeasureService.lambdaQuery()
.eq(QmsIssueTicketProcessMeasure::getProcessId, processId)
.eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, processId)
.eq(QmsIssueTicketProcessMeasure::getMeasureTypeId, permanentTypeId)
.count();
}

View File

@ -85,7 +85,7 @@ public class QmsPqcTaskRecordControllerService {
.throwMessage("未找到机型[" + modelNo + "]的检验规则");
// 2. 生成任务编号单号生成ID=42
String taskNo = basdeSerialNumberControllerService.getSerialNumber(42L);
String taskNo = basdeSerialNumberControllerService.generateSerialNumber(42);
// 3. 创建任务记录
QmsPqcTaskRecord taskRecord = new QmsPqcTaskRecord()
@ -235,7 +235,12 @@ public class QmsPqcTaskRecordControllerService {
}
}
return PageData.restPage(page.getCurrent(), page.getSize(), page.getTotal(), voList);
PageData<QmsPqcTaskRecordPageVO> pageData = new PageData<>();
pageData.setPage((int) page.getCurrent());
pageData.setPageSize((int) page.getSize());
pageData.setTotal((int) page.getTotal());
pageData.setItems(voList);
return pageData;
}
// 其他5个功能将在后续实现...
@ -283,7 +288,8 @@ public class QmsPqcTaskRecordControllerService {
QmsPqcTaskRecordDetailVO.MaterialCollectionVO materialVO = new QmsPqcTaskRecordDetailVO.MaterialCollectionVO();
materialVO.setSerialNo(detail.getSelfTestData());
materialVO.setBatchNo(detail.getReviewData());
materialVO.setFiles(parseFileList(detail.getSelfTestAttachments()));
materialVO.setFiles(convertToFileVO(parseFileList(detail.getSelfTestAttachments()),
QmsPqcTaskRecordDetailVO.FileDetailVO.class));
materialVO.setCollector(taskRecord.getSelfTesterName());
materialVO.setCollectionTime(detail.getSelfTestUploadTime());
materialCollections.add(materialVO);
@ -297,8 +303,10 @@ public class QmsPqcTaskRecordControllerService {
processVO.setSelfTestData(detail.getSelfTestData());
processVO.setReviewData(detail.getReviewData());
processVO.setEnable(detail.getReviewEnable());
processVO.setSelfTestFiles(parseFileList(detail.getSelfTestAttachments()));
processVO.setReviewFiles(parseFileList(detail.getReviewAttachments()));
processVO.setSelfTestFiles(convertToFileVO(parseFileList(detail.getSelfTestAttachments()),
QmsPqcTaskRecordDetailVO.FileDetailVO.class));
processVO.setReviewFiles(convertToFileVO(parseFileList(detail.getReviewAttachments()),
QmsPqcTaskRecordDetailVO.FileDetailVO.class));
processVO.setReviewOpinion(detail.getReviewOpinion());
processInspections.add(processVO);
}
@ -374,7 +382,8 @@ public class QmsPqcTaskRecordControllerService {
QmsPqcTaskRecordRepairSelfVO.MaterialCollectionVO materialVO = new QmsPqcTaskRecordRepairSelfVO.MaterialCollectionVO();
materialVO.setSerialNo(detail.getSelfTestData());
materialVO.setBatchNo(detail.getReviewData());
materialVO.setFiles(parseFileList(detail.getSelfTestAttachments()));
materialVO.setFiles(convertToFileVO(parseFileList(detail.getSelfTestAttachments()),
QmsPqcTaskRecordRepairSelfVO.FileDetailVO.class));
materialVO.setCollector(taskRecord.getSelfTesterName());
materialVO.setCollectionTime(detail.getSelfTestUploadTime());
materialCollections.add(materialVO);
@ -386,7 +395,8 @@ public class QmsPqcTaskRecordControllerService {
processVO.setInspectionLevel(item.getInspectionLevel());
processVO.setInspectionExampleImage(item.getInspectionImgUrl());
processVO.setSelfTestData(detail.getSelfTestData());
processVO.setSelfTestFiles(parseFileList(detail.getSelfTestAttachments()));
processVO.setSelfTestFiles(convertToFileVO(parseFileList(detail.getSelfTestAttachments()),
QmsPqcTaskRecordRepairSelfVO.FileDetailVO.class));
processInspections.add(processVO);
}
}
@ -462,7 +472,8 @@ public class QmsPqcTaskRecordControllerService {
QmsPqcTaskRecordReviewVO.MaterialCollectionVO materialVO = new QmsPqcTaskRecordReviewVO.MaterialCollectionVO();
materialVO.setSerialNo(detail.getSelfTestData());
materialVO.setBatchNo(detail.getReviewData());
materialVO.setFiles(parseFileList(detail.getSelfTestAttachments()));
materialVO.setFiles(convertToFileVO(parseFileList(detail.getSelfTestAttachments()),
QmsPqcTaskRecordReviewVO.FileDetailVO.class));
materialVO.setCollector(taskRecord.getSelfTesterName());
materialVO.setCollectionTime(detail.getSelfTestUploadTime());
materialCollections.add(materialVO);
@ -478,8 +489,10 @@ public class QmsPqcTaskRecordControllerService {
processVO.setSelfTestData(detail.getSelfTestData());
processVO.setReviewData(detail.getReviewData());
processVO.setEnable(detail.getReviewEnable());
processVO.setSelfTestFiles(parseFileList(detail.getSelfTestAttachments()));
processVO.setReviewFiles(parseFileList(detail.getReviewAttachments()));
processVO.setSelfTestFiles(convertToFileVO(parseFileList(detail.getSelfTestAttachments()),
QmsPqcTaskRecordReviewVO.FileDetailVO.class));
processVO.setReviewFiles(convertToFileVO(parseFileList(detail.getReviewAttachments()),
QmsPqcTaskRecordReviewVO.FileDetailVO.class));
processVO.setReviewOpinion(detail.getReviewOpinion());
processInspections.add(processVO);
} else if (item.getInspectionLevel() != null && item.getInspectionLevel() == 3) {
@ -491,7 +504,8 @@ public class QmsPqcTaskRecordControllerService {
processVO.setInspectionExampleImage(item.getInspectionImgUrl());
processVO.setQcTestData(detail.getQcTestData());
processVO.setEnable(detail.getReviewEnable());
processVO.setQcTestFiles(parseFileList(detail.getQcTestAttachments()));
processVO.setQcTestFiles(convertToFileVO(parseFileList(detail.getQcTestAttachments()),
QmsPqcTaskRecordReviewVO.FileDetailVO.class));
processInspectionsLevel3.add(processVO);
}
}
@ -518,7 +532,7 @@ public class QmsPqcTaskRecordControllerService {
/**
* 解析文件列表
*/
private List<QmsPqcTaskRecordDetailVO.FileDetailVO> parseFileList(String fileIdsStr) {
private List<CommonFileDetailVO> parseFileList(String fileIdsStr) {
if (StrUtil.isBlank(fileIdsStr)) {
return new ArrayList<>();
}
@ -526,7 +540,7 @@ public class QmsPqcTaskRecordControllerService {
Set<Long> fileIds = Arrays.stream(fileIdsStr.split(","))
.filter(StrUtil::isNotBlank)
.map(String::trim)
.map(Long::valueOf)
.map(s -> Long.valueOf(s))
.collect(Collectors.toSet());
if (fileIds.isEmpty()) {
@ -543,11 +557,11 @@ public class QmsPqcTaskRecordControllerService {
return Arrays.stream(fileIdsStr.split(","))
.filter(StrUtil::isNotBlank)
.map(String::trim)
.map(Long::valueOf)
.map(s -> Long.valueOf(s))
.map(fileMap::get)
.filter(Objects::nonNull)
.map(record -> {
QmsPqcTaskRecordDetailVO.FileDetailVO fileVO = new QmsPqcTaskRecordDetailVO.FileDetailVO();
CommonFileDetailVO fileVO = new CommonFileDetailVO();
fileVO.setId(record.getId());
fileVO.setFileName(record.getFileName());
fileVO.setFileType(record.getFileType());
@ -557,6 +571,28 @@ public class QmsPqcTaskRecordControllerService {
.collect(Collectors.toList());
}
/**
* 转换文件列表到指定VO类型
*/
private <T> List<T> convertToFileVO(List<CommonFileDetailVO> sourceList, Class<T> targetClass) {
if (sourceList == null || sourceList.isEmpty()) {
return new ArrayList<>();
}
return sourceList.stream()
.map(source -> {
try {
T target = targetClass.getDeclaredConstructor().newInstance();
org.springframework.beans.BeanUtils.copyProperties(source, target);
return target;
} catch (Exception e) {
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
/**
* 6. 暂存
*/
@ -830,7 +866,7 @@ public class QmsPqcTaskRecordControllerService {
private String handleUnqualifiedTask(QmsPqcTaskRecord taskRecord, QmsPqcTaskRecordDraftQO request,
Long currentUserId, String currentUserName, LocalDateTime now) {
// 1. 生成工单状态为0待流转
String ticketNo = basdeSerialNumberControllerService.getSerialNumber(41L);
String ticketNo = basdeSerialNumberControllerService.generateSerialNumber(41);
QmsPqcInspectionPoint point = pqcInspectionPointService.getById(taskRecord.getInspectionPointId());
String stepName = point != null ? point.getStepName() : "";
String inspectionPointName = point != null ? point.getInspectionPointName() : "";

View File

@ -0,0 +1,29 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
/**
* 通用文件详情VO
*/
@Data
public class CommonFileDetailVO {
/**
* 上传的id
*/
private Long id;
/**
* 文件名
*/
private String fileName;
/**
* 文件类型
*/
private String fileType;
/**
* URL
*/
private String url;
}