fix(ticket): 修复工单图片选择逻辑及相关状态更新

- 优化工单解决方案中图片选择权限控制,新增canSelectImage字段
- 调整图片获取逻辑,区分被驳回工单与正常工单的图片筛选方式
- 清理及设置图片标签,避免标签残留影响展示
- 在保存解决方案措施时同步更新Redis缓存并设置禁选图片标识
- 驳回工单时移除禁选图片缓存,确保图片选择状态正确
- 修正工单审核时重复审核的判断与清理逻辑
- 更新派单撤销与审批操作时的消息状态同步处理
This commit is contained in:
曹鹏飞 2025-12-22 17:36:10 +08:00
parent 027f4a17ad
commit 6ea9da90a4
5 changed files with 49 additions and 11 deletions

View File

@ -161,6 +161,12 @@ public class TicketInfoVO {
@JsonProperty("hasRejected") @JsonProperty("hasRejected")
private Boolean hasRejected; private Boolean hasRejected;
/**
* 是否可选择图片
*/
@JsonProperty("canSelectImage")
private boolean canSelectImage;
/** /**
* 产量 * 产量
*/ */

View File

@ -266,6 +266,11 @@ public class DispatchController extends ControllerBase {
VUtils.trueThrowBusinessError(!Objects.equals(applyfor.getCreateById(), AdminUserUtil.getUserId())) VUtils.trueThrowBusinessError(!Objects.equals(applyfor.getCreateById(), AdminUserUtil.getUserId()))
.throwMessage("你无权撤销申请"); .throwMessage("你无权撤销申请");
dispatchApplyforService.removeById(id); dispatchApplyforService.removeById(id);
adminMessageService.lambdaUpdate()
.eq(AdminMessage::getSource, 2)
.eq(AdminMessage::getSourceId, id)
.eq(AdminMessage::getSubType, MessageSubType.DispatchApplyforAudit.getState())
.remove();
return ApiResult.success(); return ApiResult.success();
} }
@ -316,6 +321,13 @@ public class DispatchController extends ControllerBase {
dispatch.setState(dispatch.getPlanStartDate().compareTo(now) >= 0 ? 1 : 0); dispatch.setState(dispatch.getPlanStartDate().compareTo(now) >= 0 ? 1 : 0);
dispatchService.updateById(dispatch); 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( adminMessageService.add(
new AdminMessage() new AdminMessage()
.setNo(dispatch.getCode()) .setNo(dispatch.getCode())

View File

@ -467,6 +467,7 @@ public class TicketController extends ControllerBase {
ssePushService.sendTicketMessageToAdmin(id, message); ssePushService.sendTicketMessageToAdmin(id, message);
ssePushService.sendTicketMessageToApp(id, message); ssePushService.sendTicketMessageToApp(id, message);
uniPushService.sendTodoMessageFromAdmin(String.valueOf(ticket.getId()), 1, Constant.FROM_ADMIN, StrUtil.splitToInt(ticket.getHandle(), ",")[0], "工单被驳回"); 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(); return ApiResult.success();
} }
@ -678,6 +679,7 @@ public class TicketController extends ControllerBase {
.setType(1) .setType(1)
.setThroughput(ticket.getThroughput()) .setThroughput(ticket.getThroughput())
.setHasRejected(stringRedisTemplate.hasKey(StrUtil.format(Constant.REDIS_KEY_TICKET_REJECT_RECORD, id))) .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()); .setCustomerName(ticket.getCustomerName());
return ApiResult.success(vo); return ApiResult.success(vo);
} }
@ -861,6 +863,8 @@ public class TicketController extends ControllerBase {
@ApiMark(moduleName = "工单管理", apiName = "保存工单解决方案措施") @ApiMark(moduleName = "工单管理", apiName = "保存工单解决方案措施")
public ApiResult<Void> saveSolutionMeasures(@Valid @RequestBody SolutionMeasuresSaveRequest request) { public ApiResult<Void> saveSolutionMeasures(@Valid @RequestBody SolutionMeasuresSaveRequest request) {
ticketSolutionService.saveSolutionMeasures1(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(); return ApiResult.success();
} }
@ -886,6 +890,7 @@ public class TicketController extends ControllerBase {
.setCreateTime(LocalDateTime.now()) .setCreateTime(LocalDateTime.now())
); );
stringRedisTemplate.opsForValue().set(StrUtil.format(Constant.REDIS_KEY_TICKET_REJECT_RECORD, ticket.getId()), DateTimeUtil.format(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(); return ApiResult.success();
} }
@ -912,6 +917,8 @@ public class TicketController extends ControllerBase {
//推送消息 //推送消息
ssePushService.sendTicketMessageToAdmin(ticket.getId(), message); ssePushService.sendTicketMessageToAdmin(ticket.getId(), message);
ssePushService.sendTicketMessageToApp(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(); return ApiResult.success();
} }
@ -1445,32 +1452,36 @@ public class TicketController extends ControllerBase {
*/ */
@GetMapping("getSolutionImages") @GetMapping("getSolutionImages")
public ApiResult<List<SolutionImageVO>> getSolutionImages(@RequestParam Long id) { public ApiResult<List<SolutionImageVO>> getSolutionImages(@RequestParam Long id) {
List<FileUploadRecord> images = fileUploadRecordService.lambdaQuery() List<FileUploadRecord> selecteds = fileUploadRecordService.lambdaQuery()
.eq(FileUploadRecord::getSource, (byte) 0) .eq(FileUploadRecord::getSource, (byte) 0)
.eq(FileUploadRecord::getSourceId, id) .eq(FileUploadRecord::getSourceId, id)
.eq(FileUploadRecord::getTag, "案例照片") .eq(FileUploadRecord::getTag, "案例照片")
.list(); .list();
if (CollectionUtil.isNotEmpty(images)) { if (CollectionUtil.isNotEmpty(selecteds)) {
return ApiResult.success(images.stream() if (!stringRedisTemplate.hasKey(StrUtil.format(Constant.REDIS_KEY_TICKET_REJECT_RECORD, id))) {
.map(image -> Convert.convert(SolutionImageVO.class, image)) return ApiResult.success(selecteds.stream()
.collect(Collectors.toList()) .map(image -> Convert.convert(SolutionImageVO.class, image))
); .collect(Collectors.toList())
);
}
} }
GongfuTicket ticket = ticketService.getById(id); GongfuTicket ticket = ticketService.getById(id);
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在");
images = fileUploadRecordService.lambdaQuery() List<FileUploadRecord> all = fileUploadRecordService.lambdaQuery()
.eq(FileUploadRecord::getSource, (byte) 0) .eq(FileUploadRecord::getSource, (byte) 0)
.eq(FileUploadRecord::getSourceId, id) .eq(FileUploadRecord::getSourceId, id)
.in(FileUploadRecord::getFileType, List.of(".jpg", ".png", ".heic", ".jpeg", ".webp")) .in(FileUploadRecord::getFileType, List.of(".jpg", ".png", ".heic", ".jpeg", ".webp"))
.list(); .list();
if (CollectionUtil.isEmpty(images)) { if (CollectionUtil.isEmpty(all)) {
return ApiResult.success(Collections.emptyList()); return ApiResult.success(Collections.emptyList());
} }
int[] mids = StrUtil.splitToInt(ticket.getImages(), ","); Collection<Integer> 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( return ApiResult.success(
images.stream().map(image -> { all.stream().map(image -> {
SolutionImageVO vo = Convert.convert(SolutionImageVO.class, 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; return vo;
}).collect(Collectors.toList()) }).collect(Collectors.toList())
); );

View File

@ -251,9 +251,13 @@ public class TicketSolutionAuditServiceImpl extends ServiceImpl<TicketSolutionAu
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.ProcessingCompleted.getState())) VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.ProcessingCompleted.getState()))
.throwMessage("工单状态不正确"); .throwMessage("工单状态不正确");
VUtils.trueThrowBusinessError(lambdaQuery() VUtils.trueThrowBusinessError(lambdaQuery()
.eq(TicketSolutionAudit::getState, 1)
.eq(TicketSolutionAudit::getTicketId, ticketId) .eq(TicketSolutionAudit::getTicketId, ticketId)
.exists()) .exists())
.throwMessage("请勿重复审核"); .throwMessage("请勿重复审核");
lambdaUpdate()
.eq(TicketSolutionAudit::getTicketId, ticketId)
.remove();
save(new TicketSolutionAudit() save(new TicketSolutionAudit()
.setState(1) .setState(1)
.setDeptName("") .setDeptName("")

View File

@ -294,6 +294,11 @@ public class TicketSolutionServiceImpl extends ServiceImpl<TicketSolutionMapper,
ticketSolutionAuditService.lambdaUpdate() ticketSolutionAuditService.lambdaUpdate()
.eq(TicketSolutionAudit::getTicketId, request.getTicketId()) .eq(TicketSolutionAudit::getTicketId, request.getTicketId())
.remove(); .remove();
fileUploadRecordService.lambdaUpdate()
.set(FileUploadRecord::getTag, "")
.eq(FileUploadRecord::getSource, (byte) 0)
.eq(FileUploadRecord::getSourceId, request.getTicketId())
.update();
if (CollectionUtil.isNotEmpty(request.getImageIds())) { if (CollectionUtil.isNotEmpty(request.getImageIds())) {
fileUploadRecordService.lambdaUpdate() fileUploadRecordService.lambdaUpdate()
.set(FileUploadRecord::getTag, "案例照片") .set(FileUploadRecord::getTag, "案例照片")