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")
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()))
.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())

View File

@ -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<Void> 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<List<SolutionImageVO>> getSolutionImages(@RequestParam Long id) {
List<FileUploadRecord> images = fileUploadRecordService.lambdaQuery()
List<FileUploadRecord> 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<FileUploadRecord> 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<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(
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())
);

View File

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

View File

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