工单措施提交接口、查询明细接口修改

This commit is contained in:
funny 2026-05-13 17:15:23 +08:00
parent f6605651c5
commit 23d6d553c5
4 changed files with 185 additions and 89 deletions

View File

@ -154,6 +154,12 @@ public class QmsIssueTicketControllerService {
.set(QmsIssueTicket::getUpdateUserName, UserUtil.getUserName())
.set(QmsIssueTicket::getUpdateTime, LocalDateTime.now())
.update();
// 7. 推送待办消息给负责人
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(request.getId())
.setHandlerUserId(request.getHandlerUserId());
issueTicketToDoService.save(todoItem);
}
/**
@ -169,11 +175,6 @@ public class QmsIssueTicketControllerService {
String currentUserName = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
// 校验不能分配给自己
if (request.getHandlerUserIds().contains(currentUserId)) {
throw new NflgException(STATE.BusinessError, "不能将工单分配给自己");
}
// 1. 校验工单存在
QmsIssueTicket ticket = issueTicketService.getById(request.getId());
VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
@ -183,61 +184,78 @@ public class QmsIssueTicketControllerService {
throw new NflgException(STATE.BusinessError, "只能分派巡检工单");
}
// 3. 查询消息类型ID
Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "InspectionTaskWorkOrder");
VUtil.trueThrowBusinessError(Objects.isNull(sourceTypeId)).throwMessage("消息类型配置不存在");
// 4. 批量查询并校验所有处理人
List<User> handlerUsers = userService.listByIds(request.getHandlerUserIds());
if (handlerUsers.size() != request.getHandlerUserIds().size()) {
throw new NflgException(STATE.BusinessError, "部分处理人不存在");
}
// 构建处理人ID到用户的映射
Map<Long, User> handlerUserMap = handlerUsers.stream()
.collect(Collectors.toMap(User::getId, user -> user));
// 5. 为每个处理人创建处理记录并推送待办
List<QmsIssueTicketProcess> processes = new ArrayList<>();
List<QmsIssueTicketToDo> todoItems = new ArrayList<>();
for (Long handlerUserId : request.getHandlerUserIds()) {
User handlerUser = handlerUserMap.get(handlerUserId);
// 创建处理记录
QmsIssueTicketProcess process = new QmsIssueTicketProcess()
.setIssueTicketId(ticket.getId())
.setHandlerUserId(handlerUserId)
.setHandlerUserName(handlerUser.getUserName());
processes.add(process);
// 创建待办消息
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(ticket.getId())
.setHandlerUserId(handlerUserId);
todoItems.add(todoItem);
}
// 6. 批量保存处理记录
issueTicketProcessService.saveBatch(processes);
// 7. 更新处理记录中的sourceId因为saveBatch后才有ID
// for (int i = 0; i < processes.size(); i++) {
// todoItems.get(i).setSourceId(processes.get(i).getId());
// }
// 8. 批量推送待办消息
issueTicketToDoService.saveBatch(todoItems);
// 9. 如果工单状态是待流转(0)更新为处理中(1)
if (ticket.getStatus() != null && ticket.getStatus() == 0) {
// 3. 根据审批状态分支处理
if (request.getApprovalStatus() == 1) {
// 驳回不创建处理记录工单改为已完成推送消息给创建人
issueTicketService.lambdaUpdate()
.eq(QmsIssueTicket::getId, ticket.getId())
.set(QmsIssueTicket::getStatus, (short) 1)
.set(QmsIssueTicket::getStatus, (short) 2)
.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());
issueTicketToDoService.save(todoItem);
} else {
// 通过按现有流程处理
// 校验不能分配给自己
if (request.getHandlerUserIds().contains(currentUserId)) {
throw new NflgException(STATE.BusinessError, "不能将工单分配给自己");
}
// 批量查询并校验所有处理人
List<User> handlerUsers = userService.listByIds(request.getHandlerUserIds());
if (handlerUsers.size() != request.getHandlerUserIds().size()) {
throw new NflgException(STATE.BusinessError, "部分处理人不存在");
}
// 构建处理人ID到用户的映射
Map<Long, User> handlerUserMap = handlerUsers.stream()
.collect(Collectors.toMap(User::getId, user -> user));
// 为每个处理人创建处理记录并推送待办
List<QmsIssueTicketProcess> processes = new ArrayList<>();
List<QmsIssueTicketToDo> todoItems = new ArrayList<>();
for (Long handlerUserId : request.getHandlerUserIds()) {
User handlerUser = handlerUserMap.get(handlerUserId);
// 创建处理记录
QmsIssueTicketProcess process = new QmsIssueTicketProcess()
.setIssueTicketId(ticket.getId())
.setHandlerUserId(handlerUserId)
.setHandlerUserName(handlerUser.getUserName());
processes.add(process);
// 创建待办消息
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(ticket.getId())
.setHandlerUserId(handlerUserId);
todoItems.add(todoItem);
}
// 批量保存处理记录
issueTicketProcessService.saveBatch(processes);
// 批量推送待办消息
issueTicketToDoService.saveBatch(todoItems);
// 如果工单状态是待流转(0)更新为处理中(1)
if (ticket.getStatus() != null && ticket.getStatus() == 0) {
issueTicketService.lambdaUpdate()
.eq(QmsIssueTicket::getId, ticket.getId())
.set(QmsIssueTicket::getStatus, (short) 1)
.set(QmsIssueTicket::getUpdateUserId, currentUserId)
.set(QmsIssueTicket::getUpdateUserName, currentUserName)
.set(QmsIssueTicket::getUpdateTime, now)
.update();
}
}
}
@ -715,6 +733,12 @@ public class QmsIssueTicketControllerService {
.setUpdateTime(now);
issueTicketService.save(entity);
// 6. 推送待办消息给负责人
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(entity.getId())
.setHandlerUserId(request.getHandlerUserId());
issueTicketToDoService.save(todoItem);
}
/**
@ -1906,6 +1930,10 @@ public class QmsIssueTicketControllerService {
vo.setIncidentReason(ticket.getIncidentReason());
vo.setIncidentConsequence(ticket.getIncidentConsequence());
// 填充负责人审批状态和意见来自工单表
vo.setResponsiblePersonApprovalStatus(ticket.getApprovalStatus());
vo.setResponsiblePersonApprovalComments(ticket.getApprovalOpinion());
// 解析图片列表
if (StrUtil.isNotBlank(ticket.getImageIds())) {
List<Long> imageIds = Arrays.stream(ticket.getImageIds().split(","))
@ -1948,10 +1976,15 @@ public class QmsIssueTicketControllerService {
.eq(QmsIssueTicketProcess::getIssueTicketId, id)
.list();
if (CollectionUtil.isNotEmpty(processes)) {
// 过滤掉审批状态为驳回1的处理记录不返回
List<QmsIssueTicketProcess> validProcesses = processes.stream()
.filter(p -> p.getApprovalStatus() == null || p.getApprovalStatus() != 1)
.collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(validProcesses)) {
// 组装处理人列表按部门合并
Map<String, List<String>> handlersByDept = new LinkedHashMap<>();
for (QmsIssueTicketProcess process : processes) {
for (QmsIssueTicketProcess process : validProcesses) {
if (StrUtil.isBlank(process.getHandlerUserName())) {
continue;
}
@ -1980,7 +2013,7 @@ public class QmsIssueTicketControllerService {
// 组装领导列表仅处理人已提交领导已审批时才展示
Map<String, List<String>> leadersByDept = new LinkedHashMap<>();
for (QmsIssueTicketProcess process : processes) {
for (QmsIssueTicketProcess process : validProcesses) {
// 领导审批状态为 null 表示处理人尚未提交不展示
if (process.getLeaderApprovalResult() == null || StrUtil.isBlank(process.getLeaderUserName())) {
continue;
@ -2017,7 +2050,7 @@ public class QmsIssueTicketControllerService {
vo.setLeaders(leaders);
// 填充根本原因取第一条处理记录
QmsIssueTicketProcess firstProcess = processes.get(0);
QmsIssueTicketProcess firstProcess = validProcesses.get(0);
if (StrUtil.isNotBlank(firstProcess.getRootCause())) {
vo.setRootCause(firstProcess.getRootCause());
}
@ -2029,7 +2062,7 @@ public class QmsIssueTicketControllerService {
List<QmsInspectionTicketDetailVO.MeasureVO> temporaryMeasures = new ArrayList<>();
List<QmsInspectionTicketDetailVO.MeasureVO> permanentMeasures = new ArrayList<>();
for (QmsIssueTicketProcess p : processes) {
for (QmsIssueTicketProcess p : validProcesses) {
List<QmsIssueTicketProcessMeasure> measures = issueTicketProcessMeasureService.lambdaQuery()
.eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, p.getId())
.list();
@ -2066,16 +2099,27 @@ public class QmsIssueTicketControllerService {
// === 权限判断isReview / isDispatch / isEdit ===
Long currentUserId = UserUtil.getUserId();
// 获取该工单全部处理记录
// 获取该工单全部处理记录权限判断用全部记录不过滤
List<QmsIssueTicketProcess> allProcesses = issueTicketProcessService.lambdaQuery()
.eq(QmsIssueTicketProcess::getIssueTicketId, id)
.list();
Short status = ticket.getStatus();
// 判断当前用户是否为负责人工单表的 approvalUserId
boolean isResponsiblePerson = currentUserId.equals(ticket.getApprovalUserId());
// 判断当前用户是否为处理人
QmsIssueTicketProcess myProcess = allProcesses.stream()
.filter(p -> currentUserId.equals(p.getHandlerUserId()))
.findFirst()
.orElse(null);
boolean isHandler = myProcess != null;
// 判断是否为领导1.已在process表记录了leaderUserId 2.或当前用户是处理人的部门负责人
boolean isLeader = allProcesses.stream()
.anyMatch(p -> currentUserId.equals(p.getLeaderUserId()));
if (!isLeader) {
// 检查当前用户是否为任一处理人的部门负责人
for (QmsIssueTicketProcess p : allProcesses) {
if (p.getHandlerUserId() == null) continue;
UserInterior handlerInterior = userInteriorService.lambdaQuery()
@ -2091,25 +2135,47 @@ public class QmsIssueTicketControllerService {
}
}
// isEdit仅处理人为true领导只有审核权限
boolean isHandler = allProcesses.stream()
.anyMatch(p -> currentUserId.equals(p.getHandlerUserId()));
vo.setIsEdit(isHandler);
// isReview领导始终有审核权限
vo.setIsReview(isLeader);
// isDispatch
Short status = ticket.getStatus();
if (currentUserId.equals(ticket.getCreateUserId())) {
// 创建人isDispatch仅在待流转状态
vo.setIsDispatch(status != null && status == 0);
} else if (currentUserId.equals(ticket.getApprovalUserId())) {
// 工单表审批人isDispatch在处理中状态
// 负责人权限工单状态为处理中时有审批和分配权限有了审批状态后失去审批权限
if (isResponsiblePerson) {
vo.setIsReview(status != null && status == 1 && ticket.getApprovalStatus() == null);
vo.setIsDispatch(status != null && status == 1);
} else {
vo.setIsEdit(false);
}
// 处理人权限拿到工单时有编辑和审批权限有了审批状态后失去审批权限驳回时失去编辑权限
else if (isHandler) {
Short handlerApprovalStatus = myProcess.getApprovalStatus();
vo.setIsReview(handlerApprovalStatus == null);
if (handlerApprovalStatus != null && handlerApprovalStatus == 1) {
// 驳回失去编辑权限
vo.setIsEdit(false);
} else if (handlerApprovalStatus != null && handlerApprovalStatus == 0) {
// 通过按之前逻辑领导未审批时可编辑
boolean leaderNotApproved = myProcess.getLeaderApprovalResult() == null;
vo.setIsEdit(leaderNotApproved);
} else {
// 未提交有编辑权限
vo.setIsEdit(true);
}
vo.setIsDispatch(false);
}
// 领导权限只有审核权限
else if (isLeader) {
vo.setIsReview(true);
vo.setIsEdit(false);
vo.setIsDispatch(false);
}
// 创建人权限
else if (currentUserId.equals(ticket.getCreateUserId())) {
vo.setIsReview(false);
vo.setIsDispatch(status != null && status == 0);
vo.setIsEdit(false);
}
// 其他
else {
vo.setIsReview(false);
vo.setIsDispatch(false);
vo.setIsEdit(false);
}
return vo;
}

View File

@ -165,7 +165,7 @@ public class QmsIssueTicketProcessControllerService {
} else if (sourceType == 2) {
// 巡检任务
if (isHandler) {
// 处理人处理保存根本原因和措施写入审批时间
// 处理人提交保存根本原因审批状态和措施
issueTicketProcessMeasureControllerService.draftUnified(request);
// 写入审批时间
@ -174,18 +174,27 @@ public class QmsIssueTicketProcessControllerService {
.set(QmsIssueTicketProcess::getApprovalTime, now)
.update();
// 推送给领导处理人所在部门负责人
UserInterior userInterior = userInteriorService.lambdaQuery()
.eq(UserInterior::getUserId, currentUserId)
.one();
// 根据审批状态推送待办
if (request.getApprovalStatus() != null && request.getApprovalStatus() == 1) {
// 驳回推送待办给负责人工单表的 approvalUserId
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(ticket.getId())
.setHandlerUserId(ticket.getApprovalUserId());
issueTicketToDoService.save(todoItem);
} else if (request.getApprovalStatus() != null && request.getApprovalStatus() == 0) {
// 通过推送给处理人所在部门负责人
UserInterior userInterior = userInteriorService.lambdaQuery()
.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 (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 {

View File

@ -23,4 +23,15 @@ public class QmsIssueTicketDispatchMultipleQO {
*/
@NotEmpty(message = "处理人列表不能为空")
private List<Long> handlerUserIds;
/**
* 审批状态0=通过1=驳回
*/
@NotNull(message = "审批状态不能为空")
private Short approvalStatus;
/**
* 审批意见
*/
private String approvalOpinion;
}

View File

@ -132,6 +132,16 @@ public class QmsInspectionTicketDetailVO {
*/
private String rootCause;
/**
* 负责人审批状态qms_issue_ticket表
*/
private Short responsiblePersonApprovalStatus;
/**
* 负责人审批意见qms_issue_ticket表
*/
private String responsiblePersonApprovalComments;
/**
* 文件详情
*/