diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketController.java index 50f875c9..a331f5c5 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketController.java @@ -9,6 +9,7 @@ import com.nflg.wms.common.pojo.qo.QmsIssueTicketPdiAddQO; import com.nflg.wms.common.pojo.qo.QmsIssueTicketSearchQO; import com.nflg.wms.common.pojo.vo.QmsIssueTicketDetailVO; import com.nflg.wms.common.pojo.vo.QmsIssueTicketVO; +import com.nflg.wms.common.pojo.vo.QmsPdiTicketDetailVO; import com.nflg.wms.repository.service.IQmsIssueTicketService; import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; @@ -64,6 +65,15 @@ public class QmsIssueTicketController extends BaseController { return ApiResult.success(); } + /** + * 查询PDI工单详情 + * 返回工单基本信息、处理记录及措施列表 + */ + @GetMapping("detail/pdi-ticket") + public ApiResult detailPdiTicket(@NotNull(message = "ID不能为空") Long id) { + return ApiResult.success(issueTicketControllerService.getPdiTicketDetail(id)); + } + /** * 查询来料检测任务质量问题工单详情 * 含来料检测任务详情及来料检验任务检验记录子项样本列表 diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiDetectionRulesController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiDetectionRulesController.java index 43c0285c..380598b9 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiDetectionRulesController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiDetectionRulesController.java @@ -34,7 +34,7 @@ public class QmsPdiDetectionRulesController extends BaseController { /** * 新增PDI检测规则 - * 参数:机型编号、质检负责人id、质检周期、质检类型、销售订单号(全部必传) + * 参数:机型编号、质检负责人id、质检周期、质检类型(必传),销售订单号(可选) * 自动生成规则编号和版本号,状态/发布状态/维护状态默认均为 false */ @Transactional diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java index 128e57cb..32add78a 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java @@ -69,6 +69,18 @@ public class QmsIssueTicketControllerService { @Resource private WmsIncomingInspectionTaskCallbackService wmsIncomingInspectionTaskCallbackService; + @Resource + private IQmsIssueTicketProcessService issueTicketProcessService; + + @Resource + private IQmsIssueTicketProcessMeasureService issueTicketProcessMeasureService; + + @Resource + private IUserInteriorService userInteriorService; + + @Resource + private IDepartmentService departmentService; + /** * 审核质量问题工单 * 更新审批状态、审批意见、审批人信息、事故类型,并更新工单状态 @@ -371,4 +383,109 @@ public class QmsIssueTicketControllerService { return vo; } + + /** + * 查询PDI工单详情 + * 返回工单基本信息及处理记录、措施列表 + */ + public QmsPdiTicketDetailVO getPdiTicketDetail(Long id) { + // 查询工单基本信息 + QmsIssueTicket ticket = issueTicketService.getById(id); + QmsPdiTicketDetailVO vo = new QmsPdiTicketDetailVO(); + vo.setTicketNo(ticket.getTicketNo()); + vo.setTicketTitle(ticket.getTicketTitle()); + vo.setStatus(ticket.getStatus()); + + // 查询处理记录列表 + List processes = issueTicketProcessService.lambdaQuery() + .eq(QmsIssueTicketProcess::getIssueTicketId, id) + .list(); + + // 收集所有不合格质检项 + List unqualifiedItems = new ArrayList<>(); + + List processVOList = processes.stream().map(process -> { + QmsPdiTicketDetailVO.ProcessVO processVO = new QmsPdiTicketDetailVO.ProcessVO(); + processVO.setId(process.getId()); + processVO.setHandlerUserId(process.getHandlerUserId()); + processVO.setHandlerUserName(process.getHandlerUserName()); + + // 查询处理人所属部门 + if (process.getHandlerUserId() != null) { + UserInterior userInterior = userInteriorService.lambdaQuery() + .eq(UserInterior::getUserId, process.getHandlerUserId()) + .one(); + if (userInterior != null && userInterior.getDeptId() != null) { + Department department = departmentService.getById(userInterior.getDeptId()); + if (department != null) { + processVO.setHandlerDeptId(department.getId()); + processVO.setHandlerDeptName(department.getName()); + } + } + } + + processVO.setRootCause(process.getRootCause()); + processVO.setTaskResultIds(process.getTaskResultIds()); + processVO.setApprovalStatus(process.getApprovalStatus()); + processVO.setApprovalOpinion(process.getApprovalOpinion()); + processVO.setApprovalUserId(process.getApprovalUserId()); + processVO.setApprovalUserName(process.getApprovalUserName()); + processVO.setApprovalTime(process.getApprovalTime()); + processVO.setLeaderApprovalResult(process.getLeaderApprovalResult()); + processVO.setLeaderApprovalOpinion(process.getLeaderApprovalOpinion()); + processVO.setLeaderUserId(process.getLeaderUserId()); + processVO.setLeaderUserName(process.getLeaderUserName()); + processVO.setLeaderApprovalTime(process.getLeaderApprovalTime()); + + // 查询不合格质检项(inspectionItemResults=false) + if (StrUtil.isNotBlank(process.getTaskResultIds())) { + String[] taskIds = process.getTaskResultIds().split(","); + for (String taskId : taskIds) { + if (StrUtil.isNotBlank(taskId)) { + List unqualifiedResults = pdiInspectionResultsService.lambdaQuery() + .eq(QmsPdiInspectionResults::getTaskId, Long.parseLong(taskId.trim())) + .eq(QmsPdiInspectionResults::getInspectionItemResults, false) + .list(); + + for (QmsPdiInspectionResults result : unqualifiedResults) { + QmsPdiTicketDetailVO.UnqualifiedItemVO itemVO = new QmsPdiTicketDetailVO.UnqualifiedItemVO(); + itemVO.setId(result.getId()); + itemVO.setInspectionItemId(result.getInspectionItemId()); + itemVO.setInspectionItemType(result.getInspectionItemType()); + itemVO.setInspectionItemImage(result.getInspectionItemImage()); + itemVO.setRemark(result.getRemark()); + itemVO.setInspectorId(result.getInspectorId()); + itemVO.setInspectionTime(result.getInspectionTime()); + itemVO.setInspectionBy(result.getInspectionBy()); + unqualifiedItems.add(itemVO); + } + } + } + } + + // 查询措施列表 + List measures = issueTicketProcessMeasureService.lambdaQuery() + .eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, process.getId()) + .list(); + + List measureVOList = measures.stream().map(measure -> { + QmsPdiTicketDetailVO.MeasureVO measureVO = new QmsPdiTicketDetailVO.MeasureVO(); + measureVO.setId(measure.getId()); + measureVO.setMeasureTypeId(measure.getMeasureTypeId()); + measureVO.setMeasureContent(measure.getMeasureContent()); + measureVO.setChargeUser(measure.getChargeUser()); + measureVO.setPlanDate(measure.getPlanDate()); + measureVO.setConfirmDate(measure.getConfirmDate()); + measureVO.setRemark(measure.getRemark()); + return measureVO; + }).toList(); + + processVO.setMeasures(measureVOList); + return processVO; + }).toList(); + + vo.setProcesses(processVOList); + vo.setUnqualifiedItems(unqualifiedItems); + return vo; + } } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessControllerService.java index ae3fe98c..e8f58ecf 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessControllerService.java @@ -5,15 +5,20 @@ import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessAddQO; import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessDraftQO; import com.nflg.wms.common.pojo.qo.QmsIssueTicketProcessLeaderDraftQO; +import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; +import com.nflg.wms.repository.entity.Department; import com.nflg.wms.repository.entity.QmsIssueTicket; import com.nflg.wms.repository.entity.QmsIssueTicketProcess; import com.nflg.wms.repository.entity.QmsTodoItem; import com.nflg.wms.repository.entity.User; +import com.nflg.wms.repository.entity.UserInterior; +import com.nflg.wms.repository.service.IDepartmentService; import com.nflg.wms.repository.service.IDictionaryItemService; import com.nflg.wms.repository.service.IQmsIssueTicketProcessService; import com.nflg.wms.repository.service.IQmsIssueTicketService; import com.nflg.wms.repository.service.IQmsTodoItemService; +import com.nflg.wms.repository.service.IUserInteriorService; import com.nflg.wms.repository.service.IUserService; import jakarta.annotation.Resource; import jakarta.validation.Valid; @@ -38,6 +43,9 @@ public class QmsIssueTicketProcessControllerService { @Resource private IUserService userService; + @Resource + private IUserInteriorService userInteriorService; + @Resource private QmsIssueTicketProcessMeasureControllerService issueTicketProcessMeasureControllerService; @@ -50,6 +58,9 @@ public class QmsIssueTicketProcessControllerService { @Resource private IDictionaryItemService dictionaryItemService; + @Resource + private IDepartmentService departmentService; + /** * 新增工单处理(同步,供 Controller 直接调用) */ @@ -112,7 +123,13 @@ public class QmsIssueTicketProcessControllerService { // 2. 保存数据 issueTicketProcessMeasureControllerService.draft(request); - // 3. 查询工单处理记录,获取关联的工单 + // 3. 写入审批时间 + issueTicketProcessService.lambdaUpdate() + .eq(QmsIssueTicketProcess::getId, request.getId()) + .set(QmsIssueTicketProcess::getApprovalTime, LocalDateTime.now()) + .update(); + + // 4. 查询工单处理记录,获取关联的工单 QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId()); QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId()); VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("关联的质量问题工单不存在"); @@ -134,7 +151,24 @@ public class QmsIssueTicketProcessControllerService { todoItemService.save(todoItem); } else if (request.getApprovalStatus() == 0) { // 通过:推送给当前用户所在部门负责人 - // TODO: Department 表暂无负责人字段,后续补充 + Long currentUserId = UserUtil.getUserId(); + 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) { + QmsTodoItem todoItem = new QmsTodoItem() + .setCode(ticket.getTicketNo()) + .setIsRead(false) + .setSourceTypeId(sourceTypeId) + .setSourceId(process.getId()) + .setCreateUserId(department.getHeadUserId()) + .setCreateUserName(department.getHeadUserName()) + .setCreateTime(now); + todoItemService.save(todoItem); + } + } } } @@ -151,15 +185,10 @@ public class QmsIssueTicketProcessControllerService { VUtil.trueThrowBusinessError(Objects.isNull(request.getLeaderApprovalResult())) .throwMessage("提交时领导审批结果不能为空"); - // 2. 保存数据 + // 2. 保存数据(leaderDraft 已写入领导信息 + 审批时间) issueTicketProcessMeasureControllerService.leaderDraft(request); - // 3. 写入领导审批时间 LocalDateTime now = LocalDateTime.now(); - issueTicketProcessService.lambdaUpdate() - .eq(QmsIssueTicketProcess::getId, request.getId()) - .set(QmsIssueTicketProcess::getLeaderApprovalTime, now) - .update(); if (request.getLeaderApprovalResult() == 0) { // 驳回:推送待办给处理人 diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessMeasureControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessMeasureControllerService.java index 78de40a8..534c2c36 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessMeasureControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessMeasureControllerService.java @@ -14,6 +14,7 @@ import jakarta.validation.Valid; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.Objects; /** @@ -43,13 +44,20 @@ public class QmsIssueTicketProcessMeasureControllerService { .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, UserUtil.getUserId()) + .set(QmsIssueTicketProcess::getApprovalUserName, UserUtil.getUserName()) .update(); // 有措施内容则新增一条措施记录 if (StrUtil.isNotBlank(request.getMeasureContent())) { QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure() .setIssueTicketProcessId(request.getId()) - .setMeasureContent(request.getMeasureContent()); + .setMeasureContent(request.getMeasureContent()) + .setMeasureTypeId(request.getMeasureTypeId()) + .setChargeUser(request.getChargeUser()) + .setPlanDate(request.getPlanDate()) + .setConfirmDate(request.getConfirmDate()) + .setRemark(request.getRemark()); issueTicketProcessMeasureService.save(measure); } } @@ -70,6 +78,7 @@ public class QmsIssueTicketProcessMeasureControllerService { QmsIssueTicketProcess::getLeaderApprovalResult, request.getLeaderApprovalResult()) .set(QmsIssueTicketProcess::getLeaderUserId, UserUtil.getUserId()) .set(QmsIssueTicketProcess::getLeaderUserName, UserUtil.getUserName()) + .set(QmsIssueTicketProcess::getLeaderApprovalTime, LocalDateTime.now()) .update(); } } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessDraftQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessDraftQO.java index 90fe5a91..6d6e113e 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessDraftQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessDraftQO.java @@ -3,6 +3,8 @@ package com.nflg.wms.common.pojo.qo; import jakarta.validation.constraints.NotNull; import lombok.Data; +import java.time.LocalDate; + /** * 质量问题工单处理 暂存/提交参数 */ @@ -34,4 +36,29 @@ public class QmsIssueTicketProcessDraftQO { * 措施内容(可选),有值则新增一条 QmsIssueTicketProcessMeasure 记录 */ private String measureContent; + + /** + * 措施类型ID(可选),关联字典项表 + */ + private Long measureTypeId; + + /** + * 负责人(可选) + */ + private String chargeUser; + + /** + * 计划日期(可选) + */ + private LocalDate planDate; + + /** + * 确认日期(可选) + */ + private LocalDate confirmDate; + + /** + * 备注(可选) + */ + private String remark; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiDetectionRulesAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiDetectionRulesAddQO.java index c400654c..a2e84619 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiDetectionRulesAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiDetectionRulesAddQO.java @@ -35,8 +35,7 @@ public class QmsPdiDetectionRulesAddQO { private Integer inspectionType; /** - * 销售订单号(必传) + * 销售订单号(可选) */ - @NotBlank(message = "销售订单号不能为空") private String orderNo; } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketDetailVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketDetailVO.java new file mode 100644 index 00000000..c36efedd --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketDetailVO.java @@ -0,0 +1,216 @@ +package com.nflg.wms.common.pojo.vo; + +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * PDI工单详情 + */ +@Data +public class QmsPdiTicketDetailVO { + + /** + * 工单编号 + */ + private String ticketNo; + + /** + * 工单标题 + */ + private String ticketTitle; + + /** + * 工单状态:0=待流转,1=处理中,2=已完成 + */ + private Short status; + + /** + * 不合格质检项列表 + */ + private List unqualifiedItems; + + /** + * 处理记录列表 + */ + private List processes; + + @Data + public static class UnqualifiedItemVO { + + /** + * 质检结果记录ID + */ + private Long id; + + /** + * 检验项ID + */ + private Long inspectionItemId; + + /** + * 检验项类型:0=静态检测项,1=动态检测项,2=装车前检测项,3=特殊检测项 + */ + private Integer inspectionItemType; + + /** + * 检验现场图片 + */ + private String inspectionItemImage; + + /** + * 备注 + */ + private String remark; + + /** + * 质检人ID + */ + private String inspectorId; + + /** + * 质检时间 + */ + private LocalDateTime inspectionTime; + + /** + * 质检人 + */ + private String inspectionBy; + } + + @Data + public static class ProcessVO { + + /** + * 处理记录ID + */ + private Long id; + + /** + * 处理人ID + */ + private Long handlerUserId; + + /** + * 处理人姓名 + */ + private String handlerUserName; + + /** + * 处理人所属部门ID + */ + private Long handlerDeptId; + + /** + * 处理人所属部门名称 + */ + private String handlerDeptName; + + /** + * 根本原因 + */ + private String rootCause; + + /** + * 任务结果ID,多个用逗号分隔 + */ + private String taskResultIds; + + /** + * 审批状态:0=通过,1=驳回 + */ + private Short approvalStatus; + + /** + * 审批意见 + */ + private String approvalOpinion; + + /** + * 审批人ID + */ + private Long approvalUserId; + + /** + * 审批人姓名 + */ + private String approvalUserName; + + /** + * 审批时间 + */ + private LocalDateTime approvalTime; + + /** + * 上级领导审批结果:0=驳回,1=同意 + */ + private Short leaderApprovalResult; + + /** + * 上级领导审批意见 + */ + private String leaderApprovalOpinion; + + /** + * 上级领导ID + */ + private Long leaderUserId; + + /** + * 上级领导姓名 + */ + private String leaderUserName; + + /** + * 上级领导审批时间 + */ + private LocalDateTime leaderApprovalTime; + + /** + * 措施列表 + */ + private List measures; + } + + @Data + public static class MeasureVO { + + /** + * 措施ID + */ + private Long id; + + /** + * 措施类型ID,关联字典项表 + */ + private Long measureTypeId; + + /** + * 措施内容 + */ + private String measureContent; + + /** + * 负责人 + */ + private String chargeUser; + + /** + * 计划日期 + */ + private LocalDate planDate; + + /** + * 确认日期 + */ + private LocalDate confirmDate; + + /** + * 备注 + */ + private String remark; + } +} diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/Department.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/Department.java index 96b7cd18..39084540 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/Department.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/Department.java @@ -53,7 +53,7 @@ public class Department implements Serializable { private Boolean enable; /** - * 部门负责人id + * 部门负责人ID */ private Long headUserId; diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsQualityInspectorServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsQualityInspectorServiceImpl.java index 4055622d..a794e139 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsQualityInspectorServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsQualityInspectorServiceImpl.java @@ -339,12 +339,14 @@ public class QmsQualityInspectorServiceImpl extends ServiceImpl