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 c0597579..b7d0180f 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 @@ -50,6 +50,26 @@ public class QmsIssueTicketController extends BaseController { return ApiResult.success(); } + /** + * 巡检工单分派(支持多人) + * 为每个处理人创建处理记录,并推送待办消息 + */ + @PostMapping("dispatchMultiple") + public ApiResult dispatchMultiple(@Valid @RequestBody QmsIssueTicketDispatchMultipleQO request) { + issueTicketControllerService.dispatchMultiple(request); + return ApiResult.success(); + } + + /** + * 新增巡检工单并发布 + * 一步完成:创建工单 + 设置负责人 + 状态改为处理中 + */ + @PostMapping("addAndDispatch") + public ApiResult addAndDispatch(@Valid @RequestBody QmsIssueTicketAddAndDispatchQO request) { + issueTicketControllerService.addAndDispatch(request); + return ApiResult.success(); + } + /** * 新增PDI检测工单(平板使用) * 同步创建工单,异步创建工单处理记录 @@ -123,4 +143,22 @@ public class QmsIssueTicketController extends BaseController { public ApiResult> search(@Valid @RequestBody QmsIssueTicketSearchQO request) { return ApiResult.success(issueTicketService.search(request)); } + + /** + * 查询巡检任务列表(平板使用) + * 仅查询当前登录人创建的巡检工单 + */ + @PostMapping("searchTablet") + public ApiResult> searchTablet(@Valid @RequestBody QmsIssueTicketTabletSearchQO request) { + return ApiResult.success(issueTicketControllerService.searchTabletInspectionTickets(request)); + } + + /** + * 查询巡检工单详情 + * 返回工单基本信息、图片列表、处理人信息、纠正措施等 + */ + @GetMapping("detail/inspection-ticket") + public ApiResult detailInspectionTicket(@NotNull(message = "ID不能为空") Long id) { + return ApiResult.success(issueTicketControllerService.getInspectionTicketDetail(id)); + } } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketProcessController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketProcessController.java index 88cc218d..c3a02bef 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketProcessController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketProcessController.java @@ -5,7 +5,6 @@ import com.nflg.qms.admin.service.QmsIssueTicketProcessMeasureControllerService; import com.nflg.wms.common.pojo.ApiResult; 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.starter.BaseController; import jakarta.annotation.Resource; import jakarta.validation.Valid; @@ -38,37 +37,21 @@ public class QmsIssueTicketProcessController extends BaseController { /** * 暂存工单处理 + * 支持PDI检测任务和巡检任务的处理人/领导暂存 */ @PostMapping("draft") public ApiResult draft(@Valid @RequestBody QmsIssueTicketProcessDraftQO request) { - issueTicketProcessMeasureControllerService.draft(request); + issueTicketProcessMeasureControllerService.draftUnified(request); return ApiResult.success(); } /** * 提交工单处理 + * 支持PDI检测任务和巡检任务的处理人/领导提交 */ @PostMapping("submit") public ApiResult submit(@Valid @RequestBody QmsIssueTicketProcessDraftQO request) { - issueTicketProcessControllerService.submit(request); - return ApiResult.success(); - } - - /** - * 领导暂存工单处理 - */ - @PostMapping("leaderDraft") - public ApiResult leaderDraft(@Valid @RequestBody QmsIssueTicketProcessLeaderDraftQO request) { - issueTicketProcessMeasureControllerService.leaderDraft(request); - return ApiResult.success(); - } - - /** - * 领导提交工单处理 - */ - @PostMapping("leaderSubmit") - public ApiResult leaderSubmit(@Valid @RequestBody QmsIssueTicketProcessLeaderDraftQO request) { - issueTicketProcessControllerService.leaderSubmit(request); + issueTicketProcessControllerService.submitUnified(request); return ApiResult.success(); } } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiDeliveryItemController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiDeliveryItemController.java index 4180931d..d822de55 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiDeliveryItemController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiDeliveryItemController.java @@ -48,11 +48,11 @@ public class QmsPdiDeliveryItemController extends BaseController { } /** - * 删除检查项 + * 批量删除检查项 */ @PostMapping("/delete") - public ApiResult delete(@NotNull(message = "ID不能为空") @RequestParam Long id) { - deliveryItemControllerService.delete(id); + public ApiResult delete(@NotNull(message = "ID列表不能为空") @RequestBody List ids) { + deliveryItemControllerService.batchDelete(ids); return ApiResult.success(); } 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 380598b9..62f64ff5 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 @@ -68,15 +68,15 @@ public class QmsPdiDetectionRulesController extends BaseController { } /** - * 删除PDI检测规则 + * 批量删除PDI检测规则 * 已发布不可删除;未发布且已启用也不可删除 * - * @param id 规则ID + * @param ids 规则ID列表 */ @Transactional @PostMapping("delete") - public ApiResult delete(@NotNull(message = "ID不能为空") Long id) { - pdiDetectionRulesControllerService.delete(id); + public ApiResult delete(@NotNull(message = "ID列表不能为空") @RequestBody List ids) { + pdiDetectionRulesControllerService.batchDelete(ids); return ApiResult.success(); } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java index e0522d8b..2035ced9 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java @@ -51,11 +51,11 @@ public class QmsPdiStatusItemController extends BaseController { } /** - * 删除检测项 + * 批量删除检测项 */ @PostMapping("/delete") - public ApiResult delete(@NotNull(message = "ID不能为空") @RequestParam Long id) { - statusItemControllerService.delete(id); + public ApiResult delete(@NotNull(message = "ID列表不能为空") @RequestBody List ids) { + statusItemControllerService.batchDelete(ids); return ApiResult.success(); } @@ -72,14 +72,32 @@ public class QmsPdiStatusItemController extends BaseController { /** * 下载导入模板 - * 状态:0=静态,1=动态,2=特殊 + * 状态:0=动态,1=静态,2=特殊(整件) * 注意:静态/动态检测项的部件描述必填,特殊检测项的部件描述可为空 */ @GetMapping("/importTemplate") - public void importTemplate(HttpServletResponse response) throws IOException { - EecExcelUtil.export("PDI检测项导入模板", - Arrays.asList("部件描述", "*检查核实内容", "检测示例图", "排序"), - List.of(), response); + public void importTemplate(HttpServletResponse response, + @NotNull(message = "状态不能为空") @RequestParam Integer status) throws IOException { + String templateName; + List headers; + + if (status == 0) { + // 动态检测 + templateName = "动态监测标准模版"; + headers = Arrays.asList("部件描述", "*检查核实内容", "检测示例图", "排序"); + } else if (status == 1) { + // 静态检测 + templateName = "静态检测标准模版"; + headers = Arrays.asList("部件描述", "*检查核实内容", "检测示例图", "排序"); + } else if (status == 2) { + // 特殊检测(整件)- 不需要部件描述字段 + templateName = "整件检测标准模版"; + headers = Arrays.asList("*检查核实内容", "检测示例图", "排序"); + } else { + throw new IllegalArgumentException("状态参数错误,只能为0、1或2"); + } + + EecExcelUtil.export(templateName, headers, List.of(), response); } /** 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 666913a4..11b18a53 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 @@ -3,8 +3,11 @@ package com.nflg.qms.admin.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.exception.NflgException; +import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.qo.*; import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.common.util.UserUtil; @@ -106,6 +109,91 @@ public class QmsIssueTicketControllerService { .update(); } + /** + * 巡检工单分派(支持多人) + * 1. 校验工单存在且来源类型为巡检(sourceType=2) + * 2. 校验所有处理人存在 + * 3. 为每个处理人创建一条处理记录(qms_issue_ticket_process) + * 4. 推送待办消息给每个处理人 + */ + @Transactional(rollbackFor = Exception.class) + public void dispatchMultiple(@Valid QmsIssueTicketDispatchMultipleQO request) { + Long currentUserId = UserUtil.getUserId(); + String currentUserName = UserUtil.getUserName(); + LocalDateTime now = LocalDateTime.now(); + + // 1. 校验工单存在 + QmsIssueTicket ticket = issueTicketService.getById(request.getId()); + VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); + + // 2. 校验工单来源类型为巡检 + if (!Objects.equals(ticket.getSourceType(), (short) 2)) { + throw new NflgException(STATE.BusinessError, "只能分派巡检工单"); + } + + // 3. 查询消息类型ID + Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "InspectionTaskWorkOrder"); + VUtil.trueThrowBusinessError(Objects.isNull(sourceTypeId)).throwMessage("消息类型配置不存在"); + + // 4. 批量查询并校验所有处理人 + List handlerUsers = userService.listByIds(request.getHandlerUserIds()); + if (handlerUsers.size() != request.getHandlerUserIds().size()) { + throw new NflgException(STATE.BusinessError, "部分处理人不存在"); + } + + // 构建处理人ID到用户的映射 + Map handlerUserMap = handlerUsers.stream() + .collect(Collectors.toMap(User::getId, user -> user)); + + // 5. 为每个处理人创建处理记录并推送待办 + List processes = new ArrayList<>(); + List 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); + + // 创建待办消息 + QmsTodoItem todoItem = new QmsTodoItem() + .setCode(ticket.getTicketNo()) + .setIsRead(false) + .setSourceTypeId(sourceTypeId) + .setSourceId(process.getId()) // 使用处理记录的ID + .setCreateUserId(handlerUserId) + .setCreateUserName(handlerUser.getUserName()) + .setCreateTime(now); + 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. 批量推送待办消息 + todoItemService.saveBatch(todoItems); + + // 9. 如果工单状态是待流转(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(); + } + } + @Resource private IQmsIssueTicketProcessService issueTicketProcessService; @@ -459,6 +547,124 @@ public class QmsIssueTicketControllerService { issueTicketService.save(entity); } + /** + * 新增巡检工单并发布 + * 1. 创建工单(来源类型固定为2-巡检) + * 2. 直接设置为处理中状态(status=1) + * 3. 设置负责人为审批人 + */ + @Transactional(rollbackFor = Exception.class) + public void addAndDispatch(@Valid QmsIssueTicketAddAndDispatchQO request) { + Long userId = UserUtil.getUserId(); + String userName = UserUtil.getUserName(); + LocalDateTime now = LocalDateTime.now(); + + // 1. 校验负责人存在 + User handlerUser = userService.getById(request.getHandlerUserId()); + VUtil.trueThrowBusinessError(Objects.isNull(handlerUser)).throwMessage("负责人不存在"); + + // 2. 自动生成工单编号 + String ticketNo = basdeSerialNumberControllerService.generateSerialNumber(37); + + // 3. 创建工单实体(直接设置为处理中状态) + QmsIssueTicket entity = new QmsIssueTicket() + .setSourceType((short) 2) + .setTicketNo(ticketNo) + .setTicketTitle(request.getTicketTitle()) + .setProjectNo(request.getProjectNo()) + .setIncidentType(request.getIncidentType()) + .setExceptionCode(request.getExceptionCode()) + .setUnqualifiedQty(request.getUnqualifiedQty()) + .setImpactQuantity(request.getImpactQuantity()) + .setIncidentLocation(request.getIncidentLocation()) + .setIncidentDescription(request.getIncidentDescription()) + .setIncidentReason(request.getIncidentReason()) + .setIncidentConsequence(request.getIncidentConsequence()) + .setImageIds(request.getImages() == null + ? "" + : StrUtil.join(",", request.getImages().stream().map(FileUploadVO::getId).toList()) + ) + .setRemark(request.getRemark()) + .setStatus((short) 1) // 直接设置为处理中 + .setApprovalUserId(request.getHandlerUserId()) + .setApprovalUserName(handlerUser.getUserName()) + .setApprovalTime(now) + .setCreateUserId(userId) + .setCreateUserName(userName) + .setCreateTime(now) + .setUpdateUserId(userId) + .setUpdateUserName(userName) + .setUpdateTime(now); + + issueTicketService.save(entity); + } + + /** + * 平板端查询巡检工单列表 + * 仅查询当前登录人创建的巡检工单(sourceType=2) + */ + public PageData searchTabletInspectionTickets(@Valid QmsIssueTicketTabletSearchQO request) { + Long currentUserId = UserUtil.getUserId(); + + // 构建查询条件 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + // 固定条件:仅查询巡检工单(sourceType=2) + wrapper.eq(QmsIssueTicket::getSourceType, (short) 2); + + // 固定条件:仅查询当前登录人创建的工单 + wrapper.eq(QmsIssueTicket::getCreateUserId, currentUserId); + + // 可选条件:工单状态 + wrapper.eq(request.getStatus() != null, QmsIssueTicket::getStatus, request.getStatus()); + + // 可选条件:工单标题(模糊匹配) + wrapper.like(StrUtil.isNotBlank(request.getTicketTitle()), + QmsIssueTicket::getTicketTitle, request.getTicketTitle()); + + // 可选条件:工单编号(模糊匹配) + wrapper.like(StrUtil.isNotBlank(request.getTicketNo()), + QmsIssueTicket::getTicketNo, request.getTicketNo()); + + // 可选条件:提交人(模糊匹配) + wrapper.like(StrUtil.isNotBlank(request.getCreateUserName()), + QmsIssueTicket::getCreateUserName, request.getCreateUserName()); + + // 排序:按创建时间倒序 + wrapper.orderByDesc(QmsIssueTicket::getCreateTime); + + // 分页查询 + Page page = new Page<>(request.getPage(), request.getPageSize()); + Page resultPage = issueTicketService.page(page, wrapper); + + // 转换为VO + List voList = resultPage.getRecords().stream() + .map(ticket -> { + QmsIssueTicketVO vo = new QmsIssueTicketVO(); + vo.setId(ticket.getId()); + vo.setTicketNo(ticket.getTicketNo()); + vo.setTicketTitle(ticket.getTicketTitle()); + vo.setProjectNo(ticket.getProjectNo()); + vo.setIncidentType(ticket.getIncidentType()); + vo.setExceptionCode(ticket.getExceptionCode()); + vo.setSourceType(ticket.getSourceType()); + vo.setCreateUserName(ticket.getCreateUserName()); + vo.setCreateTime(ticket.getCreateTime()); + vo.setStatus(ticket.getStatus()); + return vo; + }) + .collect(Collectors.toList()); + + // 构建分页结果 + PageData pageData = new PageData<>(); + pageData.setItems(voList); + pageData.setTotal((int) resultPage.getTotal()); + pageData.setPage((int) resultPage.getCurrent()); + pageData.setPageSize((int) resultPage.getSize()); + + return pageData; + } + /** * 新增PDI检测工单 * 工单编号自动生成(序号38),来源类型固定为1(PDI检测任务),状态默认为0(待流转) @@ -1209,6 +1415,165 @@ public class QmsIssueTicketControllerService { return vo; } + /** + * 查询巡检工单详情 + * 返回工单基本信息、图片列表、处理人信息、纠正措施等 + */ + public QmsInspectionTicketDetailVO getInspectionTicketDetail(Long id) { + // 查询工单基本信息 + QmsIssueTicket ticket = issueTicketService.getById(id); + if (Objects.isNull(ticket)) { + throw new NflgException(STATE.BusinessError, "巡检工单不存在"); + } + + // 校验工单来源类型为巡检 + if (!Objects.equals(ticket.getSourceType(), (short) 2)) { + throw new NflgException(STATE.BusinessError, "该工单不是巡检工单"); + } + + QmsInspectionTicketDetailVO vo = new QmsInspectionTicketDetailVO(); + + // 填充工单基本信息 + vo.setTicketTitle(ticket.getTicketTitle()); + vo.setProjectNo(ticket.getProjectNo()); + vo.setIncidentType(ticket.getIncidentType()); + vo.setExceptionCode(ticket.getExceptionCode()); + vo.setCreateUserName(ticket.getCreateUserName()); + vo.setCreateTime(ticket.getCreateTime()); + vo.setUnqualifiedQty(ticket.getUnqualifiedQty()); + vo.setTicketType("巡检"); + vo.setIncidentLocation(ticket.getIncidentLocation()); + vo.setIncidentDescription(ticket.getIncidentDescription()); + vo.setIncidentReason(ticket.getIncidentReason()); + vo.setIncidentConsequence(ticket.getIncidentConsequence()); + + // 解析图片列表 + if (StrUtil.isNotBlank(ticket.getImageIds())) { + List imageIds = Arrays.stream(ticket.getImageIds().split(",")) + .filter(StrUtil::isNotBlank) + .map(String::trim) + .map(Long::valueOf) + .collect(Collectors.toList()); + + if (CollectionUtil.isNotEmpty(imageIds)) { + List records = fileUploadRecordService.lambdaQuery() + .in(FileUploadRecord::getId, imageIds) + .list(); + + Map imageMap = records.stream() + .collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a)); + + List imageList = imageIds.stream() + .map(imageMap::get) + .filter(Objects::nonNull) + .map(record -> { + QmsInspectionTicketDetailVO.FileDetailVO fileVO = new QmsInspectionTicketDetailVO.FileDetailVO(); + fileVO.setId(record.getId()); + fileVO.setFileName(record.getFileName()); + fileVO.setFileType(record.getFileType()); + fileVO.setUrl(record.getUrl()); + return fileVO; + }) + .collect(Collectors.toList()); + + vo.setImages(imageList); + } else { + vo.setImages(List.of()); + } + } else { + vo.setImages(List.of()); + } + + // 查询处理记录(取第一条) + List processes = issueTicketProcessService.lambdaQuery() + .eq(QmsIssueTicketProcess::getIssueTicketId, id) + .list(); + + if (CollectionUtil.isNotEmpty(processes)) { + QmsIssueTicketProcess process = processes.get(0); + + // 填充处理人信息 + vo.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) { + vo.setHandlerDeptName(department.getName()); + } + } + } + + // 填充根本原因 + if (StrUtil.isNotBlank(process.getRootCause())) { + vo.setRootCause(process.getRootCause()); + } + + // 填充上级领导信息 + if (StrUtil.isNotBlank(process.getLeaderUserName())) { + vo.setLeaderUserName(process.getLeaderUserName()); + + // 查询领导部门 + if (process.getLeaderUserId() != null) { + UserInterior leaderInterior = userInteriorService.lambdaQuery() + .eq(UserInterior::getUserId, process.getLeaderUserId()) + .one(); + if (leaderInterior != null && leaderInterior.getDeptId() != null) { + Department leaderDepartment = departmentService.getById(leaderInterior.getDeptId()); + if (leaderDepartment != null) { + vo.setLeaderDeptName(leaderDepartment.getName()); + } + } + } + } + + // 查询纠正措施 + Long temporaryTypeId = dictionaryItemService.getIdByCode("MeasureType", "TemporaryCorrectiveMeasures"); + Long permanentTypeId = dictionaryItemService.getIdByCode("MeasureType", "PermanentCorrectiveMeasures"); + + List temporaryMeasures = new ArrayList<>(); + List permanentMeasures = new ArrayList<>(); + + for (QmsIssueTicketProcess p : processes) { + List measures = issueTicketProcessMeasureService.lambdaQuery() + .eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, p.getId()) + .list(); + + for (QmsIssueTicketProcessMeasure measure : measures) { + QmsInspectionTicketDetailVO.MeasureVO measureVO = new QmsInspectionTicketDetailVO.MeasureVO(); + measureVO.setMeasureTypeId(measure.getMeasureTypeId()); + measureVO.setMeasureContent(measure.getMeasureContent()); + measureVO.setChargeUser(measure.getChargeUser()); + measureVO.setPlanDate(measure.getPlanDate()); + measureVO.setConfirmDate(measure.getConfirmDate()); + measureVO.setRemark(measure.getRemark()); + + // 根据measureTypeId区分临时措施和永久措施 + if (measure.getMeasureTypeId() != null) { + if (measure.getMeasureTypeId().equals(temporaryTypeId)) { + temporaryMeasures.add(measureVO); + } else if (measure.getMeasureTypeId().equals(permanentTypeId)) { + permanentMeasures.add(measureVO); + } + } + } + } + + vo.setTemporaryMeasures(temporaryMeasures); + vo.setPermanentMeasures(permanentMeasures); + } else { + // 如果没有处理记录,设置空列表 + vo.setTemporaryMeasures(List.of()); + vo.setPermanentMeasures(List.of()); + } + + return vo; + } + /** * 将逗号分隔的图片ID字符串转换为 FileDetailVO 列表 */ 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 4ccca85a..03f1f76c 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 @@ -4,7 +4,6 @@ import com.nflg.wms.common.constant.STATE; 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; @@ -130,14 +129,151 @@ public class QmsIssueTicketProcessControllerService { } /** - * 提交工单处理: - * 1. 校验 approvalStatus 必传 - * 2. 执行保存逻辑(复用 draft) - * 3. approvalStatus=1(驳回):推送待办给工单创建人 - * 4. approvalStatus=0(通过):推送给当前用户所在部门负责人(TODO: 部门负责人字段暂无,后续补充) + * 统一提交接口:根据source_type和提交人身份自动判断处理逻辑 */ @Transactional(rollbackFor = Exception.class) - public void submit(@Valid QmsIssueTicketProcessDraftQO request) { + public void submitUnified(@Valid QmsIssueTicketProcessDraftQO request) { + Long currentUserId = UserUtil.getUserId(); + String currentUserName = UserUtil.getUserName(); + LocalDateTime now = LocalDateTime.now(); + + // 1. 查询处理记录 + QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId()); + VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在"); + + // 2. 查询工单获取source_type + QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId()); + VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); + + Short sourceType = ticket.getSourceType(); + Long handlerUserId = process.getHandlerUserId(); + + // 3. 判断是否为处理人本人提交 + boolean isHandler = currentUserId.equals(handlerUserId); + + if (sourceType == 1) { + // PDI检测任务 + if (isHandler) { + // 处理人审批 + submitUnifiedForPDIHandler(request, ticket, process, now); + } else { + // 领导审批 + leaderSubmitUnified(request, ticket, process, now, currentUserId, currentUserName); + } + } else if (sourceType == 2) { + // 巡检任务 + if (isHandler) { + // 处理人处理:保存根本原因和措施,写入审批时间 + issueTicketProcessMeasureControllerService.draftUnified(request); + + // 写入审批时间 + issueTicketProcessService.lambdaUpdate() + .eq(QmsIssueTicketProcess::getId, request.getId()) + .set(QmsIssueTicketProcess::getApprovalTime, now) + .update(); + + // 推送给领导(处理人所在部门负责人) + 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) { + Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "InspectionTaskWorkOrder"); + 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); + } + } + } else { + // 领导审批 + leaderSubmitUnified(request, ticket, process, now, currentUserId, currentUserName); + } + } else { + throw new NflgException(STATE.BusinessError, "不支持的工单类型"); + } + } + + /** + * 领导审批统一处理(PDI和巡检共用) + */ + private void leaderSubmitUnified(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket, + QmsIssueTicketProcess process, LocalDateTime now, + Long currentUserId, String currentUserName) { + // 1. 校验审批状态必传 + VUtil.trueThrowBusinessError(Objects.isNull(request.getApprovalStatus())) + .throwMessage("提交时审批状态不能为空"); + + // 2. 保存数据:前端传入approvalStatus/approvalOpinion,数据库填入leaderApprovalResult/leaderApprovalOpinion + issueTicketProcessService.lambdaUpdate() + .eq(QmsIssueTicketProcess::getId, request.getId()) + .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(); + + Short leaderApprovalResult = request.getApprovalStatus(); + + if (leaderApprovalResult == 0) { + // 驳回:推送待办给处理人 + Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "InspectionTaskWorkOrder"); + User handler = userService.getById(process.getHandlerUserId()); + QmsTodoItem todoItem = new QmsTodoItem() + .setCode(ticket.getTicketNo()) + .setIsRead(false) + .setSourceTypeId(sourceTypeId) + .setSourceId(process.getId()) + .setCreateUserId(process.getHandlerUserId()) + .setCreateUserName(handler != null ? handler.getUserName() : null) + .setCreateTime(now); + todoItemService.save(todoItem); + } else if (leaderApprovalResult == 1) { + // 同意:检查同一工单下所有处理记录是否都已完成 + Long issueTicketId = process.getIssueTicketId(); + + // 查询同一工单下是否存在未完成的记录 + long notCompleted = issueTicketProcessService.lambdaQuery() + .eq(QmsIssueTicketProcess::getIssueTicketId, issueTicketId) + .and(w -> w + .ne(true, QmsIssueTicketProcess::getLeaderApprovalResult, (short) 1) + .or() + .isNull(QmsIssueTicketProcess::getLeaderApprovalResult)) + .and(w -> w + .ne(true, QmsIssueTicketProcess::getApprovalStatus, (short) 1) + .or() + .isNull(QmsIssueTicketProcess::getApprovalStatus)) + .count(); + + // 如果所有记录都已完成,更新工单状态为已完成 + if (notCompleted == 0) { + issueTicketService.lambdaUpdate() + .eq(QmsIssueTicket::getId, issueTicketId) + .set(QmsIssueTicket::getStatus, (short) 2) + .set(QmsIssueTicket::getCompleteTime, now) + .set(QmsIssueTicket::getUpdateUserId, currentUserId) + .set(QmsIssueTicket::getUpdateUserName, currentUserName) + .set(QmsIssueTicket::getUpdateTime, now) + .update(); + } + } + } + + /** + * PDI处理人提交(sourceType=1且isHandler=true) + */ + private void submitUnifiedForPDIHandler(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket, + QmsIssueTicketProcess process, LocalDateTime now) { // 1. 校验审批状态必传 VUtil.trueThrowBusinessError(Objects.isNull(request.getApprovalStatus())) .throwMessage("提交时审批状态不能为空"); @@ -148,19 +284,14 @@ public class QmsIssueTicketProcessControllerService { // 3. 写入审批时间 issueTicketProcessService.lambdaUpdate() .eq(QmsIssueTicketProcess::getId, request.getId()) - .set(QmsIssueTicketProcess::getApprovalTime, LocalDateTime.now()) + .set(QmsIssueTicketProcess::getApprovalTime, now) .update(); - // 4. 查询工单处理记录,获取关联的工单 - QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId()); - QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId()); - VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("关联的质量问题工单不存在"); - + // 4. 根据审批状态推送待办 Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "RejectedPDIDefectiveProductHandling"); - LocalDateTime now = LocalDateTime.now(); if (request.getApprovalStatus() == 1) { - // 驳回:推送待办给工单创建人(分配任务的user) + // 驳回:推送待办给工单创建人 User creator = userService.getById(ticket.getCreateUserId()); QmsTodoItem todoItem = new QmsTodoItem() .setCode(ticket.getTicketNo()) @@ -193,72 +324,4 @@ public class QmsIssueTicketProcessControllerService { } } } - - /** - * 领导提交工单处理: - * 1. 校验 leaderApprovalResult 必传 - * 2. 执行保存逻辑(复用 leaderDraft)+ 写入审批时间 - * 3. leaderApprovalResult=0(驳回):推送待办给处理人 - * 4. leaderApprovalResult=1(同意):结束流程 - */ - @Transactional(rollbackFor = Exception.class) - public void leaderSubmit(@Valid QmsIssueTicketProcessLeaderDraftQO request) { - // 1. 校验领导审批结果必传 - VUtil.trueThrowBusinessError(Objects.isNull(request.getLeaderApprovalResult())) - .throwMessage("提交时领导审批结果不能为空"); - - // 2. 保存数据(leaderDraft 已写入领导信息 + 审批时间) - issueTicketProcessMeasureControllerService.leaderDraft(request); - - LocalDateTime now = LocalDateTime.now(); - - if (request.getLeaderApprovalResult() == 0) { - // 驳回:推送待办给处理人 - QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId()); - QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId()); - VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("关联的质量问题工单不存在"); - - Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "RejectedPDIDefectiveProductHandling"); - User handler = userService.getById(process.getHandlerUserId()); - QmsTodoItem todoItem = new QmsTodoItem() - .setCode(ticket.getTicketNo()) - .setIsRead(false) - .setSourceTypeId(sourceTypeId) - .setSourceId(process.getId()) - .setCreateUserId(process.getHandlerUserId()) - .setCreateUserName(handler != null ? handler.getUserName() : null) - .setCreateTime(now); - todoItemService.save(todoItem); - } else if (request.getLeaderApprovalResult() == 1) { - // 同意:检查同一工单下所有处理记录是否都已完成 - QmsIssueTicketProcess current = issueTicketProcessService.getById(request.getId()); - Long issueTicketId = current.getIssueTicketId(); - - // 查询同一工单下是否存在未完成的记录 - // 完成条件:leaderApprovalResult=1 或(leaderApprovalResult为空 且 approvalStatus=1) - // 未完成:不满足以上任一条件的记录 - long notCompleted = issueTicketProcessService.lambdaQuery() - .eq(QmsIssueTicketProcess::getIssueTicketId, issueTicketId) - .and(w -> w - // 排除 leaderApprovalResult=1 的(已完成) - .ne(true, QmsIssueTicketProcess::getLeaderApprovalResult, (short) 1) - .or() - .isNull(QmsIssueTicketProcess::getLeaderApprovalResult)) - // 在 leaderApprovalResult 不为1的记录中,排除 approvalStatus=1 的(处理人驳回,也算完成) - .and(w -> w - .ne(true, QmsIssueTicketProcess::getApprovalStatus, (short) 1) - .or() - .isNull(QmsIssueTicketProcess::getApprovalStatus)) - .count(); - - if (notCompleted == 0) { - // 所有处理记录都已完成,更新工单状态为已完成(2) - issueTicketService.lambdaUpdate() - .eq(QmsIssueTicket::getId, issueTicketId) - .set(QmsIssueTicket::getStatus, (short) 2) - .set(QmsIssueTicket::getCompleteTime, now) // 设置完成时间 - .update(); - } - } - } } 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 67643c5b..4f708a9c 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 @@ -4,13 +4,14 @@ import cn.hutool.core.util.StrUtil; import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.exception.NflgException; 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.QmsIssueTicket; import com.nflg.wms.repository.entity.QmsIssueTicketProcess; import com.nflg.wms.repository.entity.QmsIssueTicketProcessMeasure; import com.nflg.wms.repository.service.IQmsIssueTicketProcessMeasureService; import com.nflg.wms.repository.service.IQmsIssueTicketProcessService; +import com.nflg.wms.repository.service.IQmsIssueTicketService; import jakarta.annotation.Resource; import jakarta.validation.Valid; import org.springframework.stereotype.Service; @@ -31,6 +32,9 @@ public class QmsIssueTicketProcessMeasureControllerService { @Resource private IQmsIssueTicketProcessService issueTicketProcessService; + @Resource + private IQmsIssueTicketService issueTicketService; + /** * 暂存工单处理:更新工单处理记录,有措施内容则新增一条措施记录 */ @@ -73,19 +77,91 @@ public class QmsIssueTicketProcessMeasureControllerService { * 领导暂存:更新领导审批意见、审批结果,写入领导信息 */ @Transactional(rollbackFor = Exception.class) - public void leaderDraft(@Valid QmsIssueTicketProcessLeaderDraftQO request) { + public void leaderDraft(@Valid QmsIssueTicketProcessDraftQO request) { QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId()); VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在"); + // 前端传入approvalOpinion/approvalStatus,数据库填入leaderApprovalOpinion/leaderApprovalResult issueTicketProcessService.lambdaUpdate() .eq(QmsIssueTicketProcess::getId, request.getId()) - .set(request.getLeaderApprovalOpinion() != null, - QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getLeaderApprovalOpinion()) - .set(request.getLeaderApprovalResult() != null, - QmsIssueTicketProcess::getLeaderApprovalResult, request.getLeaderApprovalResult()) + .set(request.getApprovalOpinion() != null, + QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getApprovalOpinion()) + .set(request.getApprovalStatus() != null, + QmsIssueTicketProcess::getLeaderApprovalResult, request.getApprovalStatus()) .set(QmsIssueTicketProcess::getLeaderUserId, UserUtil.getUserId()) .set(QmsIssueTicketProcess::getLeaderUserName, UserUtil.getUserName()) .set(QmsIssueTicketProcess::getLeaderApprovalTime, LocalDateTime.now()) .update(); } + + /** + * 统一暂存接口:根据source_type和提交人身份自动判断处理逻辑 + */ + @Transactional(rollbackFor = Exception.class) + public void draftUnified(@Valid QmsIssueTicketProcessDraftQO request) { + Long currentUserId = UserUtil.getUserId(); + + // 1. 查询处理记录 + QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId()); + VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在"); + + // 2. 查询工单获取source_type + QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId()); + VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); + + Short sourceType = ticket.getSourceType(); + Long handlerUserId = process.getHandlerUserId(); + + // 3. 判断是否为处理人本人提交 + boolean isHandler = currentUserId.equals(handlerUserId); + + if (sourceType == 1) { + // PDI检测任务 + if (isHandler) { + // 处理人审批 + draft(request); + } else { + // 领导审批 + leaderDraft(request); + } + } else if (sourceType == 2) { + // 巡检任务 + if (isHandler) { + // 处理人处理:只填根本原因和措施,不填审批状态 + issueTicketProcessService.lambdaUpdate() + .eq(QmsIssueTicketProcess::getId, request.getId()) + .set(request.getRootCause() != null, QmsIssueTicketProcess::getRootCause, request.getRootCause()) + .set(QmsIssueTicketProcess::getApprovalUserId, currentUserId) + .set(QmsIssueTicketProcess::getApprovalUserName, UserUtil.getUserName()) + .update(); + + // 有措施内容则新增 + if (StrUtil.isNotBlank(request.getMeasureContent())) { + QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure() + .setIssueTicketProcessId(request.getId()) + .setMeasureContent(request.getMeasureContent()) + .setMeasureTypeId(request.getMeasureTypeId()) + .setChargeUser(UserUtil.getUserName()) + .setPlanDate(request.getPlanDate()) + .setConfirmDate(request.getConfirmDate()) + .setRemark(request.getRemark()); + issueTicketProcessMeasureService.save(measure); + } + } else { + // 领导审批:前端传入approvalStatus/approvalOpinion,数据库填入leaderApprovalResult/leaderApprovalOpinion + issueTicketProcessService.lambdaUpdate() + .eq(QmsIssueTicketProcess::getId, request.getId()) + .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, LocalDateTime.now()) + .update(); + } + } else { + throw new NflgException(STATE.BusinessError, "不支持的工单类型"); + } + } } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiDeliveryItemControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiDeliveryItemControllerService.java index 1d494358..3c0136d5 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiDeliveryItemControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiDeliveryItemControllerService.java @@ -99,15 +99,14 @@ public class QmsPdiDeliveryItemControllerService { // ========================= 删除 ========================= /** - * 删除PDI发货前检查项 + * 批量删除PDI发货前检查项 */ @Transactional - public void delete(Long id) { - QmsPdiDetectionRulesDeliveryItem existing = deliveryItemService.getById(id); - if (Objects.isNull(existing)) { - throw new NflgException(STATE.BusinessError, "检查项不存在"); + public void batchDelete(List ids) { + if (CollectionUtil.isEmpty(ids)) { + throw new NflgException(STATE.BusinessError, "ID列表不能为空"); } - deliveryItemService.removeById(id); + deliveryItemService.removeByIds(ids); } // ========================= 导出 ========================= diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiDetectionRulesControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiDetectionRulesControllerService.java index dda6ad64..027da961 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiDetectionRulesControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiDetectionRulesControllerService.java @@ -270,31 +270,43 @@ public class QmsPdiDetectionRulesControllerService { // ========================= 删除 ========================= /** - * 删除PDI检测规则 + * 批量删除PDI检测规则 * 已发布不可删除,未发布且已启用不可删除 */ @Transactional - public void delete(Long id) { - QmsPdiDetectionRules existing = pdiDetectionRulesService.getById(id); - if (Objects.isNull(existing)) { - throw new NflgException(STATE.BusinessError, "PDI检测规则不存在"); + public void batchDelete(List ids) { + if (CollectionUtil.isEmpty(ids)) { + throw new NflgException(STATE.BusinessError, "ID列表不能为空"); } - if (Boolean.TRUE.equals(existing.getPublishEnable())) { - throw new NflgException(STATE.BusinessError, "已发布的规则不允许删除"); + + // 逐条校验 + for (Long id : ids) { + QmsPdiDetectionRules existing = pdiDetectionRulesService.getById(id); + if (Objects.isNull(existing)) { + throw new NflgException(STATE.BusinessError, "PDI检测规则【" + id + "】不存在"); + } + if (Boolean.TRUE.equals(existing.getPublishEnable())) { + throw new NflgException(STATE.BusinessError, "规则【" + existing.getRuleNo() + "】已发布,不允许删除"); + } + if (Boolean.TRUE.equals(existing.getEnable())) { + throw new NflgException(STATE.BusinessError, "规则【" + existing.getRuleNo() + "】已启用,不允许删除,请先禁用后再删除"); + } } - if (Boolean.TRUE.equals(existing.getEnable())) { - throw new NflgException(STATE.BusinessError, "未发布且已启用的规则不允许删除,请先禁用后再删除"); + + // 批量级联删除子表数据 + for (Long id : ids) { + // 级联删除动静态检测项 + statusItemService.lambdaUpdate() + .eq(QmsPdiDetectionRulesStatusItem::getDetectionRulesId, id) + .remove(); + // 级联删除发货前检查项 + deliveryItemService.lambdaUpdate() + .eq(QmsPdiDetectionRulesDeliveryItem::getDetectionRulesId, id) + .remove(); } - // 级联删除动静态检测项 - statusItemService.lambdaUpdate() - .eq(QmsPdiDetectionRulesStatusItem::getDetectionRulesId, id) - .remove(); - // 级联删除发货前检查项 - deliveryItemService.lambdaUpdate() - .eq(QmsPdiDetectionRulesDeliveryItem::getDetectionRulesId, id) - .remove(); - // 删除主表 - pdiDetectionRulesService.removeById(id); + + // 批量删除主表 + pdiDetectionRulesService.removeByIds(ids); } // ========================= 启用/禁用 ========================= diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java index 435c5398..04360581 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java @@ -137,15 +137,14 @@ public class QmsPdiStatusItemControllerService { // ========================= 删除 ========================= /** - * 删除PDI检测项 + * 批量删除PDI检测项 */ @Transactional - public void delete(Long id) { - QmsPdiDetectionRulesStatusItem existing = statusItemService.getById(id); - if (Objects.isNull(existing)) { - throw new NflgException(STATE.BusinessError, "检测项不存在"); + public void batchDelete(List ids) { + if (CollectionUtil.isEmpty(ids)) { + throw new NflgException(STATE.BusinessError, "ID列表不能为空"); } - statusItemService.removeById(id); + statusItemService.removeByIds(ids); } // ========================= 导出 ========================= @@ -298,7 +297,25 @@ public class QmsPdiStatusItemControllerService { vo.setDetectionRulesId(item.getDetectionRulesId()); vo.setComponentsDes(item.getComponentsDes()); vo.setInspectionContent(item.getInspectionContent()); - vo.setInspectionImage(item.getInspectionImage()); + + // 将inspectionImage从文件ID转换为URL + if (StrUtil.isNotBlank(item.getInspectionImage())) { + try { + Long fileId = Long.valueOf(item.getInspectionImage().trim()); + FileUploadRecord fileRecord = fileUploadRecordService.getById(fileId); + if (fileRecord != null && StrUtil.isNotBlank(fileRecord.getUrl())) { + vo.setInspectionImage(fileRecord.getUrl()); + } else { + vo.setInspectionImage(""); + } + } catch (NumberFormatException e) { + // 如果不是有效的数字ID,返回空字符串 + vo.setInspectionImage(""); + } + } else { + vo.setInspectionImage(""); + } + vo.setStatus(item.getStatus()); vo.setSort(item.getSort()); vo.setCreateBy(item.getCreateBy()); diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketAddAndDispatchQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketAddAndDispatchQO.java new file mode 100644 index 00000000..02e9b971 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketAddAndDispatchQO.java @@ -0,0 +1,83 @@ +package com.nflg.wms.common.pojo.qo; + +import com.nflg.wms.common.pojo.vo.FileUploadVO; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +/** + * 新增巡检工单并发布请求参数 + */ +@Data +public class QmsIssueTicketAddAndDispatchQO { + + /** + * 工单标题 + */ + @NotBlank(message = "工单标题不能为空") + private String ticketTitle; + + /** + * 工程编号 + */ + private String projectNo; + + /** + * 事故类型:0=一般,1=较严重,2=严重 + */ + @NotNull(message = "事故类型不能为空") + private Short incidentType; + + /** + * 异常代码 + */ + private String exceptionCode; + + /** + * 不合格数量 + */ + private Integer unqualifiedQty; + + /** + * 影响数量 + */ + private String impactQuantity; + + /** + * 事件地点 + */ + private String incidentLocation; + + /** + * 事件描述 + */ + private String incidentDescription; + + /** + * 事件原因 + */ + private String incidentReason; + + /** + * 事件后果 + */ + private String incidentConsequence; + + /** + * 图片列表 + */ + private List images; + + /** + * 备注 + */ + private String remark; + + /** + * 负责人ID(user表里的id) + */ + @NotNull(message = "负责人ID不能为空") + private Long handlerUserId; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketDispatchMultipleQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketDispatchMultipleQO.java new file mode 100644 index 00000000..2cb0c6ab --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketDispatchMultipleQO.java @@ -0,0 +1,26 @@ +package com.nflg.wms.common.pojo.qo; + +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +/** + * 巡检工单分派请求参数 + */ +@Data +public class QmsIssueTicketDispatchMultipleQO { + + /** + * 工单ID(qms_issue_ticket.id) + */ + @NotNull(message = "工单ID不能为空") + private Long id; + + /** + * 处理人ID列表 + */ + @NotEmpty(message = "处理人列表不能为空") + private List handlerUserIds; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketTabletSearchQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketTabletSearchQO.java new file mode 100644 index 00000000..119e0495 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketTabletSearchQO.java @@ -0,0 +1,32 @@ +package com.nflg.wms.common.pojo.qo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 平板端巡检工单列表查询参数 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class QmsIssueTicketTabletSearchQO extends PageQO { + + /** + * 工单状态:0=待流转,1=处理中,2=已完成(可选) + */ + private Short status; + + /** + * 工单标题(模糊匹配,可选) + */ + private String ticketTitle; + + /** + * 工单编号(模糊匹配,可选) + */ + private String ticketNo; + + /** + * 提交人姓名(模糊匹配,可选) + */ + private String createUserName; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java index b9e18751..9caa7c22 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java @@ -28,9 +28,8 @@ public class QmsPdiStatusItemAddQO { private String inspectionContent; /** - * 检测示例图(文件记录ID,必传) + * 检测示例图(文件记录ID,可选) */ - @NotNull(message = "检测示例图不能为空") private String inspectionImage; /** diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionTicketDetailVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionTicketDetailVO.java new file mode 100644 index 00000000..636b2c82 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionTicketDetailVO.java @@ -0,0 +1,178 @@ +package com.nflg.wms.common.pojo.vo; + +import lombok.Data; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 巡检工单详情 + */ +@Data +public class QmsInspectionTicketDetailVO { + + /** + * 工单标题 + */ + private String ticketTitle; + + /** + * 工程编号 + */ + private String projectNo; + + /** + * 事故类型:0=一般,1=较严重,2=严重 + */ + private Short incidentType; + + /** + * 异常代码 + */ + private String exceptionCode; + + /** + * 提交人(创建人) + */ + private String createUserName; + + /** + * 反馈时间(创建时间) + */ + private LocalDateTime createTime; + + /** + * 数量(不合格数量) + */ + private Integer unqualifiedQty; + + /** + * 工单类型(巡检) + */ + private String ticketType; + + /** + * 事件地点 + */ + private String incidentLocation; + + /** + * 事件描述 + */ + private String incidentDescription; + + /** + * 事件原因 + */ + private String incidentReason; + + /** + * 事件后果 + */ + private String incidentConsequence; + + /** + * 图片列表 + */ + private List images; + + /** + * 处理人姓名 + */ + private String handlerUserName; + + /** + * 处理人部门 + */ + private String handlerDeptName; + + /** + * 临时纠正措施列表 + */ + private List temporaryMeasures; + + /** + * 永久纠正措施列表 + */ + private List permanentMeasures; + + /** + * 根本原因 + */ + private String rootCause; + + /** + * 上级领导姓名 + */ + private String leaderUserName; + + /** + * 领导部门 + */ + private String leaderDeptName; + + /** + * 文件详情 + */ + @Data + public static class FileDetailVO { + + /** + * 文件记录ID + */ + private Long id; + + /** + * 文件名称 + */ + private String fileName; + + /** + * 文件类型 + */ + private String fileType; + + /** + * 访问地址 + */ + private String url; + } + + /** + * 纠正措施 + */ + @Data + public static class MeasureVO { + + /** + * 措施类型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/QmsIssueTicket.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsIssueTicket.java index bd65e931..a2b940e1 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsIssueTicket.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsIssueTicket.java @@ -179,9 +179,4 @@ public class QmsIssueTicket implements Serializable { * 关联检测任务单号 */ private String associationTaskNo; - - /** - * 完成时间 - */ - private LocalDateTime completeTime; }