From 6ea9da90a4a28b2fc519b3d264ef56f333f29b9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Mon, 22 Dec 2025 17:36:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(ticket):=20=E4=BF=AE=E5=A4=8D=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E5=9B=BE=E7=89=87=E9=80=89=E6=8B=A9=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=8F=8A=E7=9B=B8=E5=85=B3=E7=8A=B6=E6=80=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化工单解决方案中图片选择权限控制,新增canSelectImage字段 - 调整图片获取逻辑,区分被驳回工单与正常工单的图片筛选方式 - 清理及设置图片标签,避免标签残留影响展示 - 在保存解决方案措施时同步更新Redis缓存并设置禁选图片标识 - 驳回工单时移除禁选图片缓存,确保图片选择状态正确 - 修正工单审核时重复审核的判断与清理逻辑 - 更新派单撤销与审批操作时的消息状态同步处理 --- .../common/pojo/vo/TicketInfoVO.java | 6 ++++ .../gongfu/controller/DispatchController.java | 12 +++++++ .../gongfu/controller/TicketController.java | 33 ++++++++++++------- .../impl/TicketSolutionAuditServiceImpl.java | 4 +++ .../impl/TicketSolutionServiceImpl.java | 5 +++ 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketInfoVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketInfoVO.java index ea84c91f..592c3758 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketInfoVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketInfoVO.java @@ -161,6 +161,12 @@ public class TicketInfoVO { @JsonProperty("hasRejected") private Boolean hasRejected; + /** + * 是否可选择图片 + */ + @JsonProperty("canSelectImage") + private boolean canSelectImage; + /** * 产量 */ diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/DispatchController.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/DispatchController.java index 3b647fd5..eef6ba3c 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/DispatchController.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/DispatchController.java @@ -266,6 +266,11 @@ public class DispatchController extends ControllerBase { VUtils.trueThrowBusinessError(!Objects.equals(applyfor.getCreateById(), AdminUserUtil.getUserId())) .throwMessage("你无权撤销申请"); dispatchApplyforService.removeById(id); + adminMessageService.lambdaUpdate() + .eq(AdminMessage::getSource, 2) + .eq(AdminMessage::getSourceId, id) + .eq(AdminMessage::getSubType, MessageSubType.DispatchApplyforAudit.getState()) + .remove(); return ApiResult.success(); } @@ -316,6 +321,13 @@ public class DispatchController extends ControllerBase { dispatch.setState(dispatch.getPlanStartDate().compareTo(now) >= 0 ? 1 : 0); dispatchService.updateById(dispatch); } + adminMessageService.lambdaUpdate() + .set(AdminMessage::getIsRead, true) + .eq(AdminMessage::getSource, 2) + .eq(AdminMessage::getSourceId, request.getId()) + .eq(AdminMessage::getUserId, applyfor.getCreateById()) + .eq(AdminMessage::getSubType, MessageSubType.DispatchApplyforAudit.getState()) + .update(); adminMessageService.add( new AdminMessage() .setNo(dispatch.getCode()) diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java index a5f61c53..85a0b04c 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java @@ -467,6 +467,7 @@ public class TicketController extends ControllerBase { ssePushService.sendTicketMessageToAdmin(id, message); ssePushService.sendTicketMessageToApp(id, message); uniPushService.sendTodoMessageFromAdmin(String.valueOf(ticket.getId()), 1, Constant.FROM_ADMIN, StrUtil.splitToInt(ticket.getHandle(), ",")[0], "工单被驳回"); + stringRedisTemplate.opsForHash().delete("ticket:disbale:SelectImage", id.toString()); } return ApiResult.success(); } @@ -678,6 +679,7 @@ public class TicketController extends ControllerBase { .setType(1) .setThroughput(ticket.getThroughput()) .setHasRejected(stringRedisTemplate.hasKey(StrUtil.format(Constant.REDIS_KEY_TICKET_REJECT_RECORD, id))) + .setCanSelectImage(ticket.getState() < 3 && !stringRedisTemplate.opsForHash().hasKey("ticket:disbale:SelectImage", id.toString())) .setCustomerName(ticket.getCustomerName()); return ApiResult.success(vo); } @@ -861,6 +863,8 @@ public class TicketController extends ControllerBase { @ApiMark(moduleName = "工单管理", apiName = "保存工单解决方案措施") public ApiResult saveSolutionMeasures(@Valid @RequestBody SolutionMeasuresSaveRequest request) { ticketSolutionService.saveSolutionMeasures1(request); + stringRedisTemplate.delete(StrUtil.format(Constant.REDIS_KEY_TICKET_REJECT_RECORD, request.getTicketId())); + stringRedisTemplate.opsForHash().put("ticket:disbale:SelectImage", request.getTicketId().toString(), "1"); return ApiResult.success(); } @@ -886,6 +890,7 @@ public class TicketController extends ControllerBase { .setCreateTime(LocalDateTime.now()) ); stringRedisTemplate.opsForValue().set(StrUtil.format(Constant.REDIS_KEY_TICKET_REJECT_RECORD, ticket.getId()), DateTimeUtil.format(LocalDateTime.now())); + stringRedisTemplate.opsForHash().delete("ticket:disbale:SelectImage", request.getTicketId().toString()); } return ApiResult.success(); } @@ -912,6 +917,8 @@ public class TicketController extends ControllerBase { //推送消息 ssePushService.sendTicketMessageToAdmin(ticket.getId(), message); ssePushService.sendTicketMessageToApp(ticket.getId(), message); + stringRedisTemplate.delete(StrUtil.format(Constant.REDIS_KEY_TICKET_REJECT_RECORD, ticketId)); + stringRedisTemplate.opsForHash().delete("ticket:disbale:SelectImage", ticketId.toString()); } return ApiResult.success(); } @@ -1445,32 +1452,36 @@ public class TicketController extends ControllerBase { */ @GetMapping("getSolutionImages") public ApiResult> getSolutionImages(@RequestParam Long id) { - List images = fileUploadRecordService.lambdaQuery() + List selecteds = fileUploadRecordService.lambdaQuery() .eq(FileUploadRecord::getSource, (byte) 0) .eq(FileUploadRecord::getSourceId, id) .eq(FileUploadRecord::getTag, "案例照片") .list(); - if (CollectionUtil.isNotEmpty(images)) { - return ApiResult.success(images.stream() - .map(image -> Convert.convert(SolutionImageVO.class, image)) - .collect(Collectors.toList()) - ); + if (CollectionUtil.isNotEmpty(selecteds)) { + if (!stringRedisTemplate.hasKey(StrUtil.format(Constant.REDIS_KEY_TICKET_REJECT_RECORD, id))) { + return ApiResult.success(selecteds.stream() + .map(image -> Convert.convert(SolutionImageVO.class, image)) + .collect(Collectors.toList()) + ); + } } GongfuTicket ticket = ticketService.getById(id); VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); - images = fileUploadRecordService.lambdaQuery() + List all = fileUploadRecordService.lambdaQuery() .eq(FileUploadRecord::getSource, (byte) 0) .eq(FileUploadRecord::getSourceId, id) .in(FileUploadRecord::getFileType, List.of(".jpg", ".png", ".heic", ".jpeg", ".webp")) .list(); - if (CollectionUtil.isEmpty(images)) { + if (CollectionUtil.isEmpty(all)) { return ApiResult.success(Collections.emptyList()); } - int[] mids = StrUtil.splitToInt(ticket.getImages(), ","); + Collection mids = stringRedisTemplate.hasKey(StrUtil.format(Constant.REDIS_KEY_TICKET_REJECT_RECORD, id)) + ? selecteds.stream().map(FileUploadRecord::getId).collect(Collectors.toList()) + : Arrays.stream(StrUtil.splitToInt(ticket.getImages(), ",")).boxed().collect(Collectors.toList()); return ApiResult.success( - images.stream().map(image -> { + all.stream().map(image -> { SolutionImageVO vo = Convert.convert(SolutionImageVO.class, image); - vo.setSelected(Arrays.stream(mids).anyMatch(mid -> mid == image.getId())); + vo.setSelected(mids.stream().anyMatch(mid -> Objects.equals(mid, image.getId()))); return vo; }).collect(Collectors.toList()) ); diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketSolutionAuditServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketSolutionAuditServiceImpl.java index ea58cf96..e42453ba 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketSolutionAuditServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketSolutionAuditServiceImpl.java @@ -251,9 +251,13 @@ public class TicketSolutionAuditServiceImpl extends ServiceImpl