Merge branch 'qms/develop' into qms/zhangke

This commit is contained in:
zhangke 2026-06-15 17:04:31 +08:00
commit 12332aa04f
5 changed files with 105 additions and 49 deletions

View File

@ -652,7 +652,7 @@ public class QmsIssueTicketControllerService {
.setIncidentDescription(incidentDescription) .setIncidentDescription(incidentDescription)
.setRemark(request.getRemark()) .setRemark(request.getRemark())
.setUnqualifiedQty(unqualifiedDetails.size()) .setUnqualifiedQty(unqualifiedDetails.size())
.setStatus((short) 1) .setStatus((short) 0)
.setCreateUserId(userId) .setCreateUserId(userId)
.setCreateUserName(userName) .setCreateUserName(userName)
.setCreateTime(now) .setCreateTime(now)
@ -661,6 +661,13 @@ public class QmsIssueTicketControllerService {
.setUpdateTime(now); .setUpdateTime(now);
issueTicketService.save(entity); issueTicketService.save(entity);
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(entity.getId())
.setHandlerUserId(userId)
.setHasProcessed(false)
.setIsRead(false);
issueTicketToDoService.save(todoItem);
Set<Long> fileIds = new HashSet<>(); Set<Long> fileIds = new HashSet<>();
Set<Long> itemIds = unqualifiedDetails.stream() Set<Long> itemIds = unqualifiedDetails.stream()
.map(QmsPqcTaskRecordDetails::getInspectionPointItemId) .map(QmsPqcTaskRecordDetails::getInspectionPointItemId)

View File

@ -15,6 +15,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -86,12 +87,31 @@ public class QmsIssueTicketProcessControllerService {
Collectors.mapping(QmsIssueTicketProcessAddQO.HandlerItem::getTaskResultId, Collectors.toList()) Collectors.mapping(QmsIssueTicketProcessAddQO.HandlerItem::getTaskResultId, Collectors.toList())
)); ));
List<Long> handlerUserIds = new ArrayList<>();
// 为每个处理人创建处理记录 // 为每个处理人创建处理记录
for (Map.Entry<Long, List<Long>> entry : handlerToResultsMap.entrySet()) { for (Map.Entry<Long, List<Long>> entry : handlerToResultsMap.entrySet()) {
doAdd(request.getIssueTicketId(), entry.getKey(), entry.getValue()); doAdd(request.getIssueTicketId(), entry.getKey(), entry.getValue());
handlerUserIds.add(entry.getKey());
} }
if (Objects.equals(ticket.getSourceType(), (short) 3) && !Objects.equals(ticket.getStatus(), (short) 1)) { if (Objects.equals(ticket.getSourceType(), (short) 3)) {
issueTicketToDoService.lambdaUpdate()
.eq(QmsIssueTicketToDo::getTicketId, ticket.getId())
.eq(QmsIssueTicketToDo::getHasProcessed, false)
.set(QmsIssueTicketToDo::getHasProcessed, true)
.update();
for (Long handlerUserId : handlerUserIds) {
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(ticket.getId())
.setHandlerUserId(handlerUserId)
.setHasProcessed(false)
.setIsRead(false);
issueTicketToDoService.save(todoItem);
}
if (!Objects.equals(ticket.getStatus(), (short) 1)) {
issueTicketService.lambdaUpdate() issueTicketService.lambdaUpdate()
.eq(QmsIssueTicket::getId, ticket.getId()) .eq(QmsIssueTicket::getId, ticket.getId())
.set(QmsIssueTicket::getStatus, (short) 1) .set(QmsIssueTicket::getStatus, (short) 1)
@ -101,6 +121,7 @@ public class QmsIssueTicketProcessControllerService {
.update(); .update();
} }
} }
}
/** /**
* 同步新增工单处理并推送待办供内部服务调用 * 同步新增工单处理并推送待办供内部服务调用
@ -293,43 +314,44 @@ public class QmsIssueTicketProcessControllerService {
VUtil.trueThrowBusinessError(Objects.isNull(request.getApprovalStatus())) VUtil.trueThrowBusinessError(Objects.isNull(request.getApprovalStatus()))
.throwMessage("提交时审批状态不能为空"); .throwMessage("提交时审批状态不能为空");
// 2. 驳回时校验handlers和审批意见不能为空 // 2. 驳回时校验审批意见不能为空
if (request.getApprovalStatus() == 1) { if (request.getApprovalStatus() == 1) {
VUtil.trueThrowBusinessError(request.getHandlers() == null || request.getHandlers().isEmpty())
.throwMessage("驳回时处理人列表不能为空");
VUtil.trueThrowBusinessError(StrUtil.isBlank(request.getApprovalOpinion())) VUtil.trueThrowBusinessError(StrUtil.isBlank(request.getApprovalOpinion()))
.throwMessage("驳回时审批意见不能为空"); .throwMessage("驳回时审批意见不能为空");
} }
Long processId = process.getId(); Long processId = process.getId();
// 3. 保存数据前端传入approvalStatus/approvalOpinion数据库填入leaderApprovalResult/leaderApprovalOpinion
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, processId)
.set(request.getApprovalOpinion() != null,
QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getApprovalOpinion())
.set(request.getApprovalStatus() != null,
QmsIssueTicketProcess::getLeaderApprovalResult, request.getApprovalStatus())
.set(QmsIssueTicketProcess::getLeaderUserId, currentUserId)
.set(QmsIssueTicketProcess::getLeaderUserName, UserUtil.getUserName())
.set(QmsIssueTicketProcess::getLeaderApprovalTime, now)
.update();
issueTicketToDoService.processed(ticket.getId()); issueTicketToDoService.processed(ticket.getId());
Short leaderApprovalResult = request.getApprovalStatus(); Short leaderApprovalResult = request.getApprovalStatus();
if (leaderApprovalResult == 1) { if (leaderApprovalResult == 1) {
// 驳回只驳回传入的handlers对应的处理记录 // 驳回自动驳回当前领导部门下属的待审批处理记录
Long issueTicketId = ticket.getId(); Long issueTicketId = ticket.getId();
List<Long> rejectUserIds = request.getHandlers().stream() List<QmsIssueTicketProcess> rejectProcesses = issueTicketProcessService.lambdaQuery()
.map(QmsIssueTicketProcessDraftQO.RejectHandlerItem::getHandlerUserId) .eq(QmsIssueTicketProcess::getIssueTicketId, issueTicketId)
.eq(QmsIssueTicketProcess::getApprovalStatus, (short) 0)
.isNull(QmsIssueTicketProcess::getLeaderApprovalResult)
.list()
.stream()
.filter(p -> isCurrentUserHeadOfHandlerDept(p.getHandlerUserId(), currentUserId))
.collect(Collectors.toList());
VUtil.trueThrowBusinessError(rejectProcesses.isEmpty())
.throwMessage("未找到当前领导可驳回的下属处理记录");
List<Long> rejectProcessIds = rejectProcesses.stream()
.map(QmsIssueTicketProcess::getId)
.collect(Collectors.toList());
List<Long> rejectUserIds = rejectProcesses.stream()
.map(QmsIssueTicketProcess::getHandlerUserId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList()); .collect(Collectors.toList());
// 更新指定处理人的记录重置审批状态 // 更新指定处理人的记录重置审批状态
issueTicketProcessService.lambdaUpdate() issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getIssueTicketId, issueTicketId) .in(QmsIssueTicketProcess::getId, rejectProcessIds)
.in(QmsIssueTicketProcess::getHandlerUserId, rejectUserIds)
.set(QmsIssueTicketProcess::getApprovalStatus, null) .set(QmsIssueTicketProcess::getApprovalStatus, null)
.set(QmsIssueTicketProcess::getApprovalTime, null) .set(QmsIssueTicketProcess::getApprovalTime, null)
.set(QmsIssueTicketProcess::getLeaderApprovalResult, null) .set(QmsIssueTicketProcess::getLeaderApprovalResult, null)
@ -352,10 +374,23 @@ public class QmsIssueTicketProcessControllerService {
for (Long userId : rejectUserIds) { for (Long userId : rejectUserIds) {
QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo()
.setTicketId(issueTicketId) .setTicketId(issueTicketId)
.setHandlerUserId(userId); .setHandlerUserId(userId)
.setHasProcessed(false)
.setIsRead(false);
issueTicketToDoService.save(todoItem); issueTicketToDoService.save(todoItem);
} }
} else if (leaderApprovalResult == 0) { } else if (leaderApprovalResult == 0) {
// 同意保存领导审批结果
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, processId)
.set(request.getApprovalOpinion() != null,
QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getApprovalOpinion())
.set(QmsIssueTicketProcess::getLeaderApprovalResult, request.getApprovalStatus())
.set(QmsIssueTicketProcess::getLeaderUserId, currentUserId)
.set(QmsIssueTicketProcess::getLeaderUserName, UserUtil.getUserName())
.set(QmsIssueTicketProcess::getLeaderApprovalTime, now)
.update();
// 同意检查同一工单下所有处理记录是否都已完成 // 同意检查同一工单下所有处理记录是否都已完成
Long issueTicketId = process.getIssueTicketId(); Long issueTicketId = process.getIssueTicketId();
@ -444,6 +479,20 @@ public class QmsIssueTicketProcessControllerService {
} }
} }
private boolean isCurrentUserHeadOfHandlerDept(Long handlerUserId, Long currentUserId) {
if (handlerUserId == null || currentUserId == null) {
return false;
}
UserInterior handlerInterior = userInteriorService.lambdaQuery()
.eq(UserInterior::getUserId, handlerUserId)
.one();
if (handlerInterior == null || handlerInterior.getDeptId() == null) {
return false;
}
Department department = departmentService.getById(handlerInterior.getDeptId());
return department != null && currentUserId.equals(department.getHeadUserId());
}
/** /**
* PQC工单处理人提交 * PQC工单处理人提交
*/ */
@ -480,9 +529,10 @@ public class QmsIssueTicketProcessControllerService {
public void submitPqcHandler(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket, public void submitPqcHandler(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket,
QmsIssueTicketProcess process, LocalDateTime now, QmsIssueTicketProcess process, LocalDateTime now,
Long currentUserId, String currentUserName) { Long currentUserId, String currentUserName) {
QmsIssueTicketProcess latestProcess = issueTicketProcessService.getById(process.getId());
Short approvalStatus = request.getApprovalStatus() != null Short approvalStatus = request.getApprovalStatus() != null
? request.getApprovalStatus() ? request.getApprovalStatus()
: process.getApprovalStatus(); : latestProcess.getApprovalStatus();
VUtil.trueThrowBusinessError(approvalStatus == null).throwMessage("提交时审批状态不能为空"); VUtil.trueThrowBusinessError(approvalStatus == null).throwMessage("提交时审批状态不能为空");
VUtil.trueThrowBusinessError(approvalStatus != 0 && approvalStatus != 1) VUtil.trueThrowBusinessError(approvalStatus != 0 && approvalStatus != 1)
.throwMessage("不支持的审批状态"); .throwMessage("不支持的审批状态");

View File

@ -187,6 +187,18 @@ public class QmsIssueTicketProcessMeasureControllerService {
} else if (sourceType == 3) { } else if (sourceType == 3) {
// PQC工单无领导审批 // PQC工单无领导审批
if (isHandler) { if (isHandler) {
if (Objects.equals(request.getApprovalStatus(), (short) 1)) {
issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, processId)
.set(QmsIssueTicketProcess::getApprovalStatus, request.getApprovalStatus())
.set(request.getApprovalOpinion() != null,
QmsIssueTicketProcess::getApprovalOpinion, request.getApprovalOpinion())
.set(QmsIssueTicketProcess::getApprovalUserId, currentUserId)
.set(QmsIssueTicketProcess::getApprovalUserName, UserUtil.getUserName())
.update();
return;
}
// 处理人处理保存根本原因审批状态和措施 // 处理人处理保存根本原因审批状态和措施
issueTicketProcessService.lambdaUpdate() issueTicketProcessService.lambdaUpdate()
.eq(QmsIssueTicketProcess::getId, processId) .eq(QmsIssueTicketProcess::getId, processId)

View File

@ -623,19 +623,6 @@ public class QmsCoaReviewServiceImpl extends ServiceImpl<QmsCoaReviewMapper, Qms
} }
// 有已发送的COA任务才需要检查COA报告 // 有已发送的COA任务才需要检查COA报告
// 判断是否存在COA报告未删除
boolean hasReport = lambdaQuery()
.eq(QmsCoaReview::getSupplierId, supplier.getId())
.eq(QmsCoaReview::getMaterialId, material.getId())
.eq(QmsCoaReview::getPurchaseNo, qo.getPurchaseNo())
.eq(QmsCoaReview::getDeleted, false)
.exists();
// 没有COA报告放行
if (!hasReport) {
return true;
}
// 有COA报告时检查是否存在已审核通过status=2且未删除的COA报告
return lambdaQuery() return lambdaQuery()
.eq(QmsCoaReview::getSupplierId, supplier.getId()) .eq(QmsCoaReview::getSupplierId, supplier.getId())
.eq(QmsCoaReview::getMaterialId, material.getId()) .eq(QmsCoaReview::getMaterialId, material.getId())

View File

@ -133,13 +133,13 @@
WHERE qi.inspection_type=#{request.inspectionType} AND imi.inspector_id = ( WHERE qi.inspection_type=#{request.inspectionType} AND imi.inspector_id = (
SELECT id FROM qms_quality_inspector WHERE user_id = #{userId} LIMIT 1 SELECT id FROM qms_quality_inspector WHERE user_id = #{userId} LIMIT 1
) )
<if test="materialNo != null and materialNo != ''"> <if test="request.materialNo != null and request.materialNo != ''">
AND m.material_no = #{request.materialNo} AND m.material_no = #{request.materialNo}
</if> </if>
<if test="materialCategoryCode != null and materialCategoryCode != ''"> <if test="request.materialCategoryCode != null and request.materialCategoryCode != ''">
AND m.material_category_code LIKE CONCAT(#{request.materialCategoryCode}, '%') AND m.material_category_code LIKE CONCAT(#{request.materialCategoryCode}, '%')
</if> </if>
<if test="materialDesc != null and materialDesc != ''"> <if test="request.materialDesc != null and request.materialDesc != ''">
AND m.material_desc LIKE CONCAT('%', #{request.materialDesc}, '%') AND m.material_desc LIKE CONCAT('%', #{request.materialDesc}, '%')
</if> </if>
UNION ALL UNION ALL
@ -163,13 +163,13 @@
WHERE qi.inspection_type=#{request.inspectionType} AND imci.inspector_id = ( WHERE qi.inspection_type=#{request.inspectionType} AND imci.inspector_id = (
SELECT id FROM qms_quality_inspector WHERE user_id = #{userId} LIMIT 1 SELECT id FROM qms_quality_inspector WHERE user_id = #{userId} LIMIT 1
) )
<if test="materialNo != null and materialNo != ''"> <if test="request.materialNo != null and request.materialNo != ''">
AND m.material_no = #{request.materialNo} AND m.material_no = #{request.materialNo}
</if> </if>
<if test="materialCategoryCode != null and materialCategoryCode != ''"> <if test="request.materialCategoryCode != null and request.materialCategoryCode != ''">
AND m.material_category_code LIKE CONCAT(#{request.materialCategoryCode}, '%') AND m.material_category_code LIKE CONCAT(#{request.materialCategoryCode}, '%')
</if> </if>
<if test="materialDesc != null and materialDesc != ''"> <if test="request.materialDesc != null and request.materialDesc != ''">
AND m.material_desc LIKE CONCAT('%', #{request.materialDesc}, '%') AND m.material_desc LIKE CONCAT('%', #{request.materialDesc}, '%')
</if> </if>
ORDER BY material_id ASC ORDER BY material_id ASC