Merge remote-tracking branch '惠信/qms/develop' into qms/develop

This commit is contained in:
曹鹏飞 2026-06-15 21:50:11 +08:00
commit 243690b61a
5 changed files with 91 additions and 52 deletions

View File

@ -70,9 +70,6 @@ public class QmsIssueTicketControllerService {
@Resource
private IQmsPdiInspectionResultsService pdiInspectionResultsService;
@Resource
private IQmsPdiInspectionResultsLoadingImageService pdiInspectionResultsLoadingImageService;
@Resource
private IQmsPdiDetectionRulesStatusItemService pdiStatusItemService;
@ -2056,11 +2053,15 @@ public class QmsIssueTicketControllerService {
.eq(QmsIssueTicketProcess::getIssueTicketId, id)
.list();
} else {
// 非创建者返回自己作为处理人的记录
processes = issueTicketProcessService.lambdaQuery()
// 非创建者返回自己作为处理人/审批人/直属领导相关处理记录
List<QmsIssueTicketProcess> allProcesses = issueTicketProcessService.lambdaQuery()
.eq(QmsIssueTicketProcess::getIssueTicketId, id)
.eq(QmsIssueTicketProcess::getHandlerUserId, currentUserId)
.list();
processes = allProcesses.stream()
.filter(p -> currentUserId.equals(p.getHandlerUserId())
|| currentUserId.equals(p.getApprovalUserId())
|| isCurrentUserLeaderOfProcess(p, currentUserId))
.collect(Collectors.toList());
}
// 构建返回VO - 工单基本信息
@ -3148,10 +3149,37 @@ public class QmsIssueTicketControllerService {
.filter(p -> p.getApprovalStatus() == null || p.getApprovalStatus() != 1)
.collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(validProcesses)) {
Long currentUserId = UserUtil.getUserId();
Short status = ticket.getStatus();
boolean isCreator = currentUserId.equals(ticket.getCreateUserId());
boolean isCompletedStatus = status != null && status == 2;
boolean isClosedStatus = status != null && status == 3;
boolean isVisibleLeader = validProcesses.stream()
.anyMatch(p -> isCurrentUserLeaderOfProcess(p, currentUserId));
boolean isVisibleHandler = validProcesses.stream()
.anyMatch(p -> currentUserId.equals(p.getHandlerUserId()) || currentUserId.equals(p.getApprovalUserId()));
List<QmsIssueTicketProcess> visibleProcesses;
if (isClosedStatus || (isCompletedStatus && isCreator)) {
visibleProcesses = validProcesses;
} else if (isVisibleLeader) {
visibleProcesses = validProcesses.stream()
.filter(p -> isCurrentUserLeaderOfProcess(p, currentUserId))
.collect(Collectors.toList());
} else if (isVisibleHandler) {
visibleProcesses = validProcesses.stream()
.filter(p -> currentUserId.equals(p.getHandlerUserId()) || currentUserId.equals(p.getApprovalUserId()))
.collect(Collectors.toList());
} else if (isCreator) {
visibleProcesses = validProcesses;
} else {
visibleProcesses = List.of();
}
if (CollectionUtil.isNotEmpty(visibleProcesses)) {
// 组装处理人列表按部门合并
Map<String, List<String>> handlersByDept = new LinkedHashMap<>();
for (QmsIssueTicketProcess process : validProcesses) {
for (QmsIssueTicketProcess process : visibleProcesses) {
if (StrUtil.isBlank(process.getHandlerUserName())) {
continue;
}
@ -3180,7 +3208,7 @@ public class QmsIssueTicketControllerService {
// 组装领导列表仅处理人已提交领导已审批时才展示
Map<String, List<String>> leadersByDept = new LinkedHashMap<>();
for (QmsIssueTicketProcess process : validProcesses) {
for (QmsIssueTicketProcess process : visibleProcesses) {
// 领导审批状态为 null 表示处理人尚未提交不展示
if (process.getLeaderApprovalResult() == null || StrUtil.isBlank(process.getLeaderUserName())) {
continue;
@ -3216,10 +3244,17 @@ public class QmsIssueTicketControllerService {
}
vo.setLeaders(leaders);
// 填充根本原因取第一条处理记录
QmsIssueTicketProcess firstProcess = validProcesses.get(0);
if (StrUtil.isNotBlank(firstProcess.getRootCause())) {
vo.setRootCause(firstProcess.getRootCause());
// 填充当前用户可见的根本原因
List<QmsIssueTicketProcess> rootCauseProcesses = visibleProcesses.stream()
.filter(p -> StrUtil.isNotBlank(p.getRootCause()))
.collect(Collectors.toList());
if (rootCauseProcesses.size() == 1) {
vo.setRootCause(rootCauseProcesses.get(0).getRootCause());
} else if (rootCauseProcesses.size() > 1) {
String rootCause = rootCauseProcesses.stream()
.map(QmsIssueTicketProcess::getRootCause)
.collect(Collectors.joining("\n"));
vo.setRootCause(rootCause);
}
// 查询纠正措施
@ -3229,7 +3264,7 @@ public class QmsIssueTicketControllerService {
List<QmsInspectionTicketDetailVO.MeasureVO> temporaryMeasures = new ArrayList<>();
List<QmsInspectionTicketDetailVO.MeasureVO> permanentMeasures = new ArrayList<>();
for (QmsIssueTicketProcess p : validProcesses) {
for (QmsIssueTicketProcess p : visibleProcesses) {
List<QmsIssueTicketProcessMeasure> measures = issueTicketProcessMeasureService.lambdaQuery()
.eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, p.getId())
.list();
@ -3267,13 +3302,8 @@ public class QmsIssueTicketControllerService {
}
// === 权限判断isReview / isDispatch / isEdit ===
Long currentUserId = UserUtil.getUserId();
// 获取该工单全部处理记录权限判断用全部记录不过滤
List<QmsIssueTicketProcess> allProcesses = issueTicketProcessService.lambdaQuery()
.eq(QmsIssueTicketProcess::getIssueTicketId, id)
.list();
Short status = ticket.getStatus();
List<QmsIssueTicketProcess> allProcesses = processes;
// 判断当前用户是否为负责人工单表的 approvalUserId
boolean isResponsiblePerson = currentUserId.equals(ticket.getApprovalUserId());
@ -3305,9 +3335,7 @@ public class QmsIssueTicketControllerService {
}
// 负责人权限工单状态为处理中时有审批和分配权限有了审批状态后失去审批权限
boolean isCreator = currentUserId.equals(ticket.getCreateUserId());
boolean isProcessingStatus = status != null && (status == 0 || status == 1);
boolean isCompletedStatus = status != null && status == 2;
boolean responsibleCanReview = isResponsiblePerson
&& status != null
@ -3368,17 +3396,22 @@ public class QmsIssueTicketControllerService {
.set(QmsIssueTicket::getUpdateTime, now)
.update();
issueTicketToDoService.lambdaUpdate()
.eq(QmsIssueTicketToDo::getTicketId, ticket.getId())
.eq(QmsIssueTicketToDo::getHasProcessed, false)
.set(QmsIssueTicketToDo::getHasProcessed, true)
.update();
if (Objects.equals(ticket.getSourceType(), (short) 1)) {
issueTicketToDoService.processed(ticket.getId());
} else {
issueTicketToDoService.lambdaUpdate()
.eq(QmsIssueTicketToDo::getTicketId, ticket.getId())
.eq(QmsIssueTicketToDo::getHasProcessed, false)
.set(QmsIssueTicketToDo::getHasProcessed, true)
.update();
}
// PDI工单关闭时创建新任务单复制内容不合格项改为合格
if (ticket.getSourceType() != null && ticket.getSourceType() == 1 && ticket.getSourceId() != null) {
QmsPdiTaskRecord originalTask = createPdiRepairTask(ticket.getSourceId(), now);
if (originalTask != null) {
callbackPdiInspectionTask(originalTask, true);
// 业务确认暂时关闭PDI回调WMS
// callbackPdiInspectionTask(originalTask, true);
}
}
@ -3419,6 +3452,10 @@ public class QmsIssueTicketControllerService {
.set(QmsIssueTicket::getUpdateTime, now)
.update();
if (Objects.equals(ticket.getSourceType(), (short) 1)) {
issueTicketToDoService.processed(ticket.getId());
}
// 推送待办给被驳回的处理人
for (Long userId : rejectUserIds) {
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
@ -3532,21 +3569,6 @@ public class QmsIssueTicketControllerService {
pdiInspectionResultsService.saveBatch(newResults);
}
// 4. 复制装车前图片
List<QmsPdiInspectionResultsLoadingImage> oldImages = pdiInspectionResultsLoadingImageService.lambdaQuery()
.eq(QmsPdiInspectionResultsLoadingImage::getTaskId, originalTaskId)
.list();
if (!oldImages.isEmpty()) {
List<QmsPdiInspectionResultsLoadingImage> newImages = new ArrayList<>();
for (QmsPdiInspectionResultsLoadingImage old : oldImages) {
QmsPdiInspectionResultsLoadingImage newImage = new QmsPdiInspectionResultsLoadingImage()
.setTaskId(newTask.getId())
.setLoadingImage(old.getLoadingImage());
newImages.add(newImage);
}
pdiInspectionResultsLoadingImageService.saveBatch(newImages);
}
return originalTask;
}
}

View File

@ -162,7 +162,7 @@ public class QmsIssueTicketProcessMeasureControllerService {
// 处理人处理保存根本原因审批状态和措施
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, processId)
.set(request.getRootCause() != null, QmsIssueTicketProcess::getRootCause, mergedRootCause)
.set(request.getRootCause() != null, QmsIssueTicketProcess::getRootCause, request.getRootCause())
.set(request.getApprovalStatus() != null, QmsIssueTicketProcess::getApprovalStatus, request.getApprovalStatus())
.set(request.getApprovalOpinion() != null, QmsIssueTicketProcess::getApprovalOpinion, request.getApprovalOpinion())
.set(QmsIssueTicketProcess::getApprovalUserId, currentUserId)

View File

@ -202,10 +202,22 @@ public class QmsPdiInspectionResultsControllerService {
.update();
});
// 2. 检查 type=0/1/3 是否都有结果
Set<Long> deliveryItemIds = deliveryItemService.lambdaQuery()
.eq(QmsPdiDetectionRulesDeliveryItem::getDetectionRulesId, taskRecord.getDetectionRulesId())
.list()
.stream()
.map(QmsPdiDetectionRulesDeliveryItem::getId)
.collect(Collectors.toSet());
request.getLoadingItems().stream()
.map(item -> item.getId())
.filter(Objects::nonNull)
.forEach(deliveryItemIds::add);
// 2. 检查 type=0/1/3 是否都有结果装车前检查项不参与检测项结果校验
long unfilledResults = inspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, request.getTaskId())
.ne(QmsPdiInspectionResults::getInspectionItemType, 2)
.in(QmsPdiInspectionResults::getInspectionItemType, Arrays.asList(0, 1, 3))
.notIn(!deliveryItemIds.isEmpty(), QmsPdiInspectionResults::getInspectionItemId, deliveryItemIds)
.isNull(QmsPdiInspectionResults::getInspectionItemResults)
.count();
if (unfilledResults > 0) {
@ -225,15 +237,13 @@ public class QmsPdiInspectionResultsControllerService {
// 4. 查询不合格检测项type=0/1/3装车前不计入
List<QmsPdiInspectionResults> failedItems = inspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, request.getTaskId())
.ne(QmsPdiInspectionResults::getInspectionItemType, 2)
.in(QmsPdiInspectionResults::getInspectionItemType, Arrays.asList(0, 1, 3))
.notIn(!deliveryItemIds.isEmpty(), QmsPdiInspectionResults::getInspectionItemId, deliveryItemIds)
.eq(QmsPdiInspectionResults::getInspectionItemResults, false)
.list();
// 5. 校验如果所有检测项都合格总体判定不能为不合格
// 5. 装车前整体检测结果不参与普通检测项判定
boolean hasDefect = !failedItems.isEmpty();
if (!hasDefect && !request.getOverallResult()) {
throw new NflgException(STATE.BusinessError, "所有检测项均为合格,总体判定不能为不合格");
}
// 6. 将整体判定结果存入 task_record
boolean overallResult = request.getOverallResult() != null && request.getOverallResult();
@ -262,7 +272,8 @@ public class QmsPdiInspectionResultsControllerService {
.setDetectionCompletionTime(now)
.setOverdue(overdueValue)
.setInspectionEnable(hasDefect ? 3 : 2);
wmsPdiInspectionTaskCallbackService.callBack(taskRecord, overallResult);
// 业务确认暂时关闭PDI回调WMS
// wmsPdiInspectionTaskCallbackService.callBack(taskRecord, overallResult);
// 8. 返回不合格项转换为VO图片改为List格式
return buildInspectionResultVOList(failedItems);

View File

@ -517,6 +517,7 @@ public class QmsPdiTaskRecordControllerService {
vo.setOrderNo(record.getOrderNo());
vo.setDeviceNo(record.getDeviceNo());
vo.setFactoryNo(record.getFactoryNo());
vo.setInspectionEnable(record.getInspectionEnable());
vo.setInspectionInspection(record.getInspectionInspection());
vo.setDetectionCompletionTime(record.getDetectionCompletionTime());
vo.setInspectionRuleId(record.getDetectionRulesId());

View File

@ -158,6 +158,11 @@ public class QmsPdiTaskRecordDetailVO {
*/
private Integer inspectionType;
/**
* 质检状态0为待检查1为检验中2为已完成3为待流转
*/
private Integer inspectionEnable;
/**
* 检测结果true=合格false=不合格
*/