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

This commit is contained in:
曹鹏飞 2026-06-14 21:28:39 +08:00
commit 7d6747606a
5 changed files with 100 additions and 34 deletions

View File

@ -382,6 +382,9 @@ public class QmsIssueTicketControllerService {
issueTicketToDoService.save(todoItem); issueTicketToDoService.save(todoItem);
} else { } else {
// 通过按现有流程处理 // 通过按现有流程处理
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(request.getHandlerUserIds()))
.throwMessage("处理人列表不能为空");
// 校验不能分配给自己 // 校验不能分配给自己
if (request.getHandlerUserIds().contains(currentUserId)) { if (request.getHandlerUserIds().contains(currentUserId)) {
throw new NflgException(STATE.BusinessError, "不能将工单分配给自己"); throw new NflgException(STATE.BusinessError, "不能将工单分配给自己");

View File

@ -149,6 +149,13 @@ public class QmsIssueTicketProcessControllerService {
QmsIssueTicket ticket = issueTicketService.getById(request.getId()); QmsIssueTicket ticket = issueTicketService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
if (Objects.equals(ticket.getSourceType(), (short) 2)
&& Objects.equals(ticket.getApprovalUserId(), currentUserId)
&& Objects.equals(request.getApprovalStatus(), (short) 1)) {
rejectInspectionByResponsible(request, ticket, now, currentUserId, currentUserName);
return;
}
// 2. 通过工单ID + 当前登录人查找处理记录 // 2. 通过工单ID + 当前登录人查找处理记录
QmsIssueTicketProcess process = issueTicketProcessService.lambdaQuery() QmsIssueTicketProcess process = issueTicketProcessService.lambdaQuery()
.eq(QmsIssueTicketProcess::getIssueTicketId, request.getId()) .eq(QmsIssueTicketProcess::getIssueTicketId, request.getId())
@ -222,19 +229,7 @@ public class QmsIssueTicketProcessControllerService {
issueTicketToDoService.save(todoItem); issueTicketToDoService.save(todoItem);
} else if (request.getApprovalStatus() != null && request.getApprovalStatus() == 0) { } else if (request.getApprovalStatus() != null && request.getApprovalStatus() == 0) {
// 通过推送给处理人所在部门负责人 // 通过推送给处理人所在部门负责人
UserInterior userInterior = userInteriorService.lambdaQuery() pushLeaderTicketTodo(ticket.getId(), process.getId(), currentUserId);
.eq(UserInterior::getUserId, currentUserId)
.one();
if (userInterior != null && userInterior.getDeptId() != null) {
Department department = departmentService.getById(userInterior.getDeptId());
if (department != null && department.getHeadUserId() != null) {
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(ticket.getId())
.setHandlerUserId(department.getHeadUserId());
issueTicketToDoService.save(todoItem);
}
}
} }
} else { } else {
// 领导审批 // 领导审批
@ -256,6 +251,29 @@ public class QmsIssueTicketProcessControllerService {
/** /**
* 领导审批统一处理PDI和巡检共用 * 领导审批统一处理PDI和巡检共用
*/ */
private void rejectInspectionByResponsible(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket,
LocalDateTime now, Long currentUserId, String currentUserName) {
issueTicketToDoService.processed(ticket.getId());
issueTicketService.lambdaUpdate()
.eq(QmsIssueTicket::getId, ticket.getId())
.set(QmsIssueTicket::getStatus, (short) 2)
.set(QmsIssueTicket::getApprovalStatus, request.getApprovalStatus())
.set(request.getApprovalOpinion() != null,
QmsIssueTicket::getApprovalOpinion, request.getApprovalOpinion())
.set(QmsIssueTicket::getUpdateUserId, currentUserId)
.set(QmsIssueTicket::getUpdateUserName, currentUserName)
.set(QmsIssueTicket::getUpdateTime, now)
.update();
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(ticket.getId())
.setHandlerUserId(ticket.getCreateUserId())
.setHasProcessed(false)
.setIsRead(false);
issueTicketToDoService.save(todoItem);
}
private void leaderSubmitUnified(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket, private void leaderSubmitUnified(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket,
QmsIssueTicketProcess process, LocalDateTime now, QmsIssueTicketProcess process, LocalDateTime now,
Long currentUserId, String currentUserName) { Long currentUserId, String currentUserName) {
@ -402,18 +420,7 @@ public class QmsIssueTicketProcessControllerService {
} else if (request.getApprovalStatus() == 0) { } else if (request.getApprovalStatus() == 0) {
// 通过推送给当前用户所在部门负责人 // 通过推送给当前用户所在部门负责人
Long currentUserId = UserUtil.getUserId(); Long currentUserId = UserUtil.getUserId();
UserInterior userInterior = userInteriorService.lambdaQuery() pushLeaderTicketTodo(ticket.getId(), processId, currentUserId);
.eq(UserInterior::getUserId, currentUserId)
.one();
if (userInterior != null && userInterior.getDeptId() != null) {
Department department = departmentService.getById(userInterior.getDeptId());
if (department != null && department.getHeadUserId() != null) {
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(ticket.getId())
.setHandlerUserId(department.getHeadUserId());
issueTicketToDoService.save(todoItem);
}
}
// 推送消息给工单创建人 // 推送消息给工单创建人
if (ticket.getCreateUserId() != null) { if (ticket.getCreateUserId() != null) {
@ -428,6 +435,35 @@ public class QmsIssueTicketProcessControllerService {
/** /**
* PQC工单处理人提交 * PQC工单处理人提交
*/ */
private void pushLeaderTicketTodo(Long ticketId, Long processId, Long handlerUserId) {
UserInterior userInterior = userInteriorService.lambdaQuery()
.eq(UserInterior::getUserId, handlerUserId)
.one();
if (userInterior == null || userInterior.getDeptId() == null) {
return;
}
Department department = departmentService.getById(userInterior.getDeptId());
if (department == null || department.getHeadUserId() == null) {
return;
}
User leaderUser = userService.getById(department.getHeadUserId());
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, processId)
.set(QmsIssueTicketProcess::getLeaderUserId, department.getHeadUserId())
.set(leaderUser != null, QmsIssueTicketProcess::getLeaderUserName,
leaderUser == null ? null : leaderUser.getUserName())
.update();
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(ticketId)
.setHandlerUserId(department.getHeadUserId())
.setHasProcessed(false)
.setIsRead(false);
issueTicketToDoService.save(todoItem);
}
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void submitPqcHandler(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket, public void submitPqcHandler(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket,
QmsIssueTicketProcess process, LocalDateTime now, QmsIssueTicketProcess process, LocalDateTime now,
@ -458,12 +494,13 @@ public class QmsIssueTicketProcessControllerService {
} }
// 判断是否是最后一个处理人 // 判断是否是最后一个处理人
boolean isLastHandler = isLastPqcHandler(ticket.getId()); boolean isLastHandler = isLastPqcHandler(ticket.getId(), currentUserId);
if (isLastHandler) { if (isLastHandler) {
// 最后一个处理人提交工单状态改为2已完成 // 最后一个处理人提交工单状态改为2已完成
issueTicketService.lambdaUpdate() issueTicketService.lambdaUpdate()
.eq(QmsIssueTicket::getId, ticket.getId()) .eq(QmsIssueTicket::getId, ticket.getId())
.set(QmsIssueTicket::getStatus, (short) 2) .set(QmsIssueTicket::getStatus, (short) 2)
.set(QmsIssueTicket::getCompleteTime, now)
.set(QmsIssueTicket::getUpdateUserId, currentUserId) .set(QmsIssueTicket::getUpdateUserId, currentUserId)
.set(QmsIssueTicket::getUpdateUserName, currentUserName) .set(QmsIssueTicket::getUpdateUserName, currentUserName)
.set(QmsIssueTicket::getUpdateTime, now) .set(QmsIssueTicket::getUpdateTime, now)
@ -511,14 +548,26 @@ public class QmsIssueTicketProcessControllerService {
* 判断是否是PQC工单最后一个处理人 * 判断是否是PQC工单最后一个处理人
* @return true=是最后一个false=不是 * @return true=是最后一个false=不是
*/ */
private boolean isLastPqcHandler(Long ticketId) { private boolean isLastPqcHandler(Long ticketId, Long currentUserId) {
// 查询该工单所有处理记录 // 查询该工单所有处理记录
List<QmsIssueTicketProcess> processes = issueTicketProcessService.lambdaQuery() List<QmsIssueTicketProcess> processes = issueTicketProcessService.lambdaQuery()
.eq(QmsIssueTicketProcess::getIssueTicketId, ticketId) .eq(QmsIssueTicketProcess::getIssueTicketId, ticketId)
.list(); .list();
// 检查是否所有人的approval_time都不为空 Map<Long, List<QmsIssueTicketProcess>> processMap = processes.stream()
.filter(p -> p.getHandlerUserId() != null)
.collect(Collectors.groupingBy(QmsIssueTicketProcess::getHandlerUserId));
if (processMap.isEmpty()) {
return false;
}
// 按处理人去重判断避免同一个处理人存在重复处理记录时一直卡在处理中
return processes.stream() return processes.stream()
.allMatch(p -> p.getApprovalTime() != null); .filter(p -> p.getHandlerUserId() != null)
.collect(Collectors.groupingBy(QmsIssueTicketProcess::getHandlerUserId))
.values()
.stream()
.allMatch(list -> list.stream()
.anyMatch(p -> p.getApprovalTime() != null || currentUserId.equals(p.getHandlerUserId())));
} }
} }

View File

@ -126,14 +126,20 @@ public class QmsIssueTicketProcessMeasureControllerService {
public void draftUnified(@Valid QmsIssueTicketProcessDraftQO request) { public void draftUnified(@Valid QmsIssueTicketProcessDraftQO request) {
Long currentUserId = UserUtil.getUserId(); Long currentUserId = UserUtil.getUserId();
QmsIssueTicket ticket = issueTicketService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
if (Objects.equals(ticket.getSourceType(), (short) 2)
&& Objects.equals(ticket.getApprovalUserId(), currentUserId)
&& Objects.equals(request.getApprovalStatus(), (short) 1)) {
return;
}
// 1. 通过工单ID + 当前登录人查找处理记录 // 1. 通过工单ID + 当前登录人查找处理记录
QmsIssueTicketProcess process = findProcessByTicketAndUser(request.getId(), currentUserId); QmsIssueTicketProcess process = findProcessByTicketAndUser(request.getId(), currentUserId);
Long processId = process.getId(); Long processId = process.getId();
// 2. 查询工单获取source_type // 2. 查询工单获取source_type
QmsIssueTicket ticket = issueTicketService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
Short sourceType = ticket.getSourceType(); Short sourceType = ticket.getSourceType();
Long handlerUserId = process.getHandlerUserId(); Long handlerUserId = process.getHandlerUserId();
String mergedRootCause = mergeRootCause(process.getRootCause(), request.getRootCause()); String mergedRootCause = mergeRootCause(process.getRootCause(), request.getRootCause());

View File

@ -64,6 +64,9 @@ public class QmsPqcTaskRecordControllerService {
@Resource @Resource
private IQmsIssueTicketToDoService issueTicketToDoService; private IQmsIssueTicketToDoService issueTicketToDoService;
@Resource
private IQmsIssueTicketProcessService issueTicketProcessService;
@Resource @Resource
private IUserService userService; private IUserService userService;
@ -1552,6 +1555,7 @@ public class QmsPqcTaskRecordControllerService {
QmsPqcInspectionPoint point = pqcInspectionPointService.getById(taskRecord.getInspectionPointId()); QmsPqcInspectionPoint point = pqcInspectionPointService.getById(taskRecord.getInspectionPointId());
String stepName = point != null ? point.getStepName() : ""; String stepName = point != null ? point.getStepName() : "";
String inspectionPointName = point != null ? point.getInspectionPointName() : ""; String inspectionPointName = point != null ? point.getInspectionPointName() : "";
VUtil.trueThrowBusinessError(taskRecord.getReviewerId() == null).throwMessage("PQC工单处理人不能为空");
QmsIssueTicket ticket = new QmsIssueTicket() QmsIssueTicket ticket = new QmsIssueTicket()
.setSourceType((short) 3) // PQC .setSourceType((short) 3) // PQC
@ -1566,6 +1570,12 @@ public class QmsPqcTaskRecordControllerService {
issueTicketService.save(ticket); issueTicketService.save(ticket);
QmsIssueTicketProcess ticketProcess = new QmsIssueTicketProcess()
.setIssueTicketId(ticket.getId())
.setHandlerUserId(taskRecord.getReviewerId())
.setHandlerUserName(taskRecord.getReviewerName());
issueTicketProcessService.save(ticketProcess);
QmsIssueTicketToDo ticketTodo = new QmsIssueTicketToDo() QmsIssueTicketToDo ticketTodo = new QmsIssueTicketToDo()
.setTicketId(ticket.getId()) .setTicketId(ticket.getId())
.setHandlerUserId(taskRecord.getReviewerId()) .setHandlerUserId(taskRecord.getReviewerId())

View File

@ -1,6 +1,5 @@
package com.nflg.wms.common.pojo.qo; package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
@ -21,7 +20,6 @@ public class QmsIssueTicketDispatchMultipleQO {
/** /**
* 处理人ID列表 * 处理人ID列表
*/ */
@NotEmpty(message = "处理人列表不能为空")
private List<Long> handlerUserIds; private List<Long> handlerUserIds;
/** /**