From c7de80b9cf33bb04dedf0773f2ee8ea2a72865c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Fri, 28 Mar 2025 20:14:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(ticket):=20=E6=B7=BB=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E6=95=85=E7=AD=89=E7=BA=A7=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=A7=A3=E5=86=B3=E6=96=B9=E6=A1=88=E6=8E=AA=E6=96=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 Ticket 和 AdminTicketVO 中添加事故等级字段 - 新增 TicketAccidentLevel 枚举类 - 修改 SolutionMeasures 相关的 VO 和 Request 类 - 优化 TicketController 中的解决方案措施获取和审核逻辑 - 更新 TicketServiceImpl 中的工单创建和完成逻辑 -改进 TicketSolutionAuditServiceImpl 中的审核功能 - 重构 TicketSolutionServiceImpl 中的解决方案措施获取和保存逻辑 --- .../admin/controller/TicketController.java | 56 ++++---- .../common/constant/TicketAccidentLevel.java | 25 ++++ .../pojo/request/AssignmentTicketRequest.java | 19 +-- .../request/SolutionMeasuresSaveRequest.java | 14 +- .../common/pojo/vo/AdminTicketVO.java | 16 +++ .../pojo/vo/SolutionMeasuresDataItemVO.java | 50 ++++++++ .../pojo/vo/SolutionMeasuresItemVO.java | 37 ++---- .../common/pojo/vo/SolutionMeasuresVO.java | 18 +-- .../pojo/vo/SolutionReviewDepartmentVO.java | 12 ++ .../common/pojo/vo/TicketInfoVO.java | 5 + .../common/pojo/vo/TicketPdfVO.java | 2 +- .../repository/entity/Ticket.java | 5 + .../repository/entity/TicketSolution.java | 2 +- .../service/ITicketSolutionAuditService.java | 5 +- .../service/ITicketSolutionService.java | 4 +- .../service/impl/TicketServiceImpl.java | 9 +- .../impl/TicketSolutionAuditServiceImpl.java | 21 ++- .../impl/TicketSolutionServiceImpl.java | 120 +++++++++++------- .../mapper/TicketSolutionAuditMapper.xml | 13 +- 19 files changed, 298 insertions(+), 135 deletions(-) create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/TicketAccidentLevel.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresDataItemVO.java diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java index c955f95b..0689597a 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java @@ -6,6 +6,8 @@ import com.itextpdf.text.pdf.BaseFont; import com.nflg.mobilebroken.admin.annotation.ApiMark; import com.nflg.mobilebroken.admin.publisher.TicketEventPublisher; import com.nflg.mobilebroken.admin.service.SsePushService; +import com.nflg.mobilebroken.common.constant.MessageSubType; +import com.nflg.mobilebroken.common.constant.MessageType; import com.nflg.mobilebroken.common.constant.STATE; import com.nflg.mobilebroken.common.constant.TicketState; import com.nflg.mobilebroken.common.exception.NflgException; @@ -40,6 +42,7 @@ import java.io.OutputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.Instant; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -105,6 +108,12 @@ public class TicketController extends ControllerBase { @Resource private ITicketSolutionAuditService ticketSolutionAuditService; + @Resource + private IAdminMessageService adminMessageService; + + @Resource + private ITBaseDeviceTypeService deviceTypeService; + /** * 获取问题类型 * @return 问题类型列表 @@ -476,24 +485,6 @@ public class TicketController extends ControllerBase { images.add(new FileInfo(item.substring(item.lastIndexOf("/")+1),item)); }); } - //加上聊天中的图片和文件 - List messageVOS=ticketChatService.getMessages(ticket.getId()); - messageVOS.forEach(messageVO -> { - if (CollectionUtil.isNotEmpty(messageVO.getImages())){ - messageVO.getImages().forEach(image -> { - images.add(new FileInfo(image.substring(image.lastIndexOf("/")+1),image)); - }); - } - if (CollectionUtil.isNotEmpty(messageVO.getAttachments())){ - messageVO.getAttachments().forEach(attachment -> { - if (attachment.endsWith(".jpg") || attachment.endsWith(".png") || attachment.endsWith(".jpeg")) { - images.add(new FileInfo(attachment.substring(attachment.lastIndexOf("/")+1),urlEncode(attachment))); - } else { - files.add(new FileInfo(attachment.substring(attachment.lastIndexOf("/")+1),urlEncode(attachment))); - } - }); - } - }); TicketPdfVO vo = new TicketPdfVO() .setNo(ticket.getNo()) .setTitle(ticket.getTitle()) @@ -513,7 +504,7 @@ public class TicketController extends ControllerBase { .setDeviceAddress(ticket.getDeviceAddress()) .setImages(images) .setFiles(files) - .setMeasures(ticketSolutionService.getSolutionMeasures(ticket.getId())); + .setMeasures(ticketSolutionService.getSolutionMeasures(ticket.getId()).getMeasures()); Map variables = new HashMap<>(); variables.put("ticket", vo); // 渲染HTML @@ -610,6 +601,7 @@ public class TicketController extends ControllerBase { .setCompanyName(device.getCustomerName()) .setHandle(handle) .setSolution(ticket.getReason()) + .setAccidentLevel(ticket.getAccidentLevel()) .setEvaluate(getTicketEvaluate(ticket.getId())); return ApiResult.success(vo); } @@ -740,7 +732,7 @@ public class TicketController extends ControllerBase { **/ @GetMapping("getSolutionMeasures") @ApiMark(moduleName = "工单管理", apiName = "获取工单解决方案措施") - public ApiResult> getSolutionMeasures(@Valid @RequestParam @NotNull Integer ticketId){ + public ApiResult getSolutionMeasures(@Valid @RequestParam @NotNull Integer ticketId){ return ApiResult.success(ticketSolutionService.getSolutionMeasures(ticketId)); } @@ -783,8 +775,28 @@ public class TicketController extends ControllerBase { **/ @GetMapping("rejectSolution") @ApiMark(moduleName = "工单管理", apiName = "驳回工单解决方案") - public ApiResult rejectSolution(@Valid @RequestBody SolutionRejectRequest request){ - ticketSolutionAuditService.reject(request); + public ApiResult rejectSolution(@Valid @RequestBody SolutionRejectRequest request) { + Ticket ticket = ticketSolutionAuditService.reject(request); + if (Objects.nonNull(ticket)) { + TicketSolutionAudit audit = ticketSolutionAuditService.lambdaQuery() + .eq(TicketSolutionAudit::getTicketId, ticket.getId()) + .eq(TicketSolutionAudit::getUserId, AdminUserUtil.getUserId()) + .one(); + List cqms = deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo()); + cqms.forEach(cqm -> { + adminMessageService.add( + new AdminMessage() + .setNo(ticket.getNo()) + .setTitle(ticket.getTitle() + "工单解决方案报告," + audit.getDeptName() + "部门主管不同意,请更正解决方案") + .setUserId(cqm) + .setSourceId(ticket.getId()) + .setSource(0) + .setType(MessageType.WorkOrderAssignment.getState()) + .setSubType(MessageSubType.TicketSolutionAudit.getState()) + .setIsRead(false) + .setCreateTime(LocalDateTime.now())); + }); + } return ApiResult.success(); } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/TicketAccidentLevel.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/TicketAccidentLevel.java new file mode 100644 index 00000000..0613ff37 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/TicketAccidentLevel.java @@ -0,0 +1,25 @@ +package com.nflg.mobilebroken.common.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum TicketAccidentLevel { + + General((byte) 0, "一般"), + MoreSerious((byte) 1, "较严重"), + Serious((byte) 2, "严重"); + + private final Byte state; + private final String description; + + public static TicketAccidentLevel findByValue(Byte value) { + for (TicketAccidentLevel valueEnum : TicketAccidentLevel.values()) { + if (valueEnum.getState().equals(value)) { + return valueEnum; + } + } + return null; + } +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AssignmentTicketRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AssignmentTicketRequest.java index da038f46..5502ce1f 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AssignmentTicketRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/AssignmentTicketRequest.java @@ -2,8 +2,7 @@ package com.nflg.mobilebroken.common.pojo.request; import lombok.Data; -import javax.validation.constraints.NotEmpty; -import javax.validation.constraints.NotNull; +import javax.validation.constraints.*; import java.util.List; @Data @@ -13,13 +12,15 @@ public class AssignmentTicketRequest { @NotNull private Integer ticketId; -// //紧急程度,0:非紧急;1:普通;2:紧急 -// @NotNull -// private Byte urgency; -// -// //问题类型 -// @NotBlank -// private String question; + //紧急程度,0:非紧急;1:普通;2:紧急 + @NotNull + @Min(value = 0) + @Max(value = 2) + private Byte urgency; + + //问题类型 + @NotBlank + private String question; //备注 private String remark; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SolutionMeasuresSaveRequest.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SolutionMeasuresSaveRequest.java index e7ac7d11..e97c62bb 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SolutionMeasuresSaveRequest.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/request/SolutionMeasuresSaveRequest.java @@ -1,6 +1,6 @@ package com.nflg.mobilebroken.common.pojo.request; -import com.nflg.mobilebroken.common.pojo.vo.SolutionMeasuresVO; +import com.nflg.mobilebroken.common.pojo.vo.SolutionMeasuresItemVO; import lombok.Data; import javax.validation.Valid; @@ -18,13 +18,11 @@ public class SolutionMeasuresSaveRequest { @NotNull private Integer ticketId; - //紧急程度,0:非紧急;1:普通;2:紧急 + /** + * 事故等级,0:一般;1:较严重;2:严重 + */ @NotNull - private Byte urgency; - - //问题类型 - @NotBlank - private String question; + private Byte accidentLevel; /** * 根本原因 @@ -37,5 +35,5 @@ public class SolutionMeasuresSaveRequest { */ @Valid @NotEmpty - private List solutionMeasures; + private List solutionMeasures; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java index 750bd954..1be5c8f1 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java @@ -2,6 +2,7 @@ package com.nflg.mobilebroken.common.pojo.vo; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.nflg.mobilebroken.common.constant.TicketAccidentLevel; import com.nflg.mobilebroken.common.constant.TicketState; import com.nflg.mobilebroken.common.constant.TicketUrgency; import lombok.Data; @@ -153,6 +154,21 @@ public class AdminTicketVO { @ExcelColumn("关闭时间") private LocalDateTime closeTime; + //事故等级,0:一般;1:较严重;2:严重 + @IgnoreExport + private Byte accidentLevel; + + //事故等级 + @ExcelColumn("事故等级") + private String accidentLevelDesc; + + public String getAccidentLevelDesc() { + if (Objects.isNull(accidentLevel)) { + return ""; + } + return TicketAccidentLevel.findByValue(accidentLevel).getDescription(); + } + //是否已关注 @IgnoreExport private boolean followed; diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresDataItemVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresDataItemVO.java new file mode 100644 index 00000000..fc151477 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresDataItemVO.java @@ -0,0 +1,50 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; + +@Data +@Accessors(chain = true) +public class SolutionMeasuresDataItemVO { + + /** + * 措施id + */ + private Integer id; + + /** + * 措施 + */ + @NotBlank + private String name; + + /** + * 负责人 + */ + @NotBlank + private String superintendent; + + /** + * 计划日期 + */ + @NotBlank + private String scheduleDate; + + /** + * 确认日期 + */ + @NotBlank + private String confirmedDate; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人id + */ + private Integer createUserId; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresItemVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresItemVO.java index 0651ff78..aef309fe 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresItemVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresItemVO.java @@ -3,45 +3,30 @@ package com.nflg.mobilebroken.common.pojo.vo; import lombok.Data; import lombok.experimental.Accessors; +import javax.validation.Valid; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; @Data @Accessors(chain = true) public class SolutionMeasuresItemVO { + /** + * 措施分类id + */ + @NotNull private Integer id; /** - * 措施 + * 措施分类名称 */ @NotBlank private String name; /** - * 负责人 + * 具体的措施 */ - @NotBlank - private String superintendent; - - /** - * 计划日期 - */ - @NotBlank - private String scheduleDate; - - /** - * 确认日期 - */ - @NotBlank - private String confirmedDate; - - /** - * 备注 - */ - private String remark; - - /** - * 创建人id - */ - private Integer createUserId; + @Valid + private List items; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresVO.java index 8e9f09d0..311d9c73 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionMeasuresVO.java @@ -3,21 +3,21 @@ package com.nflg.mobilebroken.common.pojo.vo; import lombok.Data; import lombok.experimental.Accessors; -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; import java.util.List; @Data @Accessors(chain = true) public class SolutionMeasuresVO { - @NotNull - private Integer id; + // 解决方案措施 + private List measures; - @NotBlank - private String name; +// //是否已结案 +// private boolean locked; - @Valid - private List items; + //是否是审核人 + private boolean inAudit=false; + + // 是否已审核 + private boolean audited=false; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionReviewDepartmentVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionReviewDepartmentVO.java index b27ec13d..7f8435ff 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionReviewDepartmentVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/SolutionReviewDepartmentVO.java @@ -21,6 +21,18 @@ public class SolutionReviewDepartmentVO { //用户名称 private String userName; + //用户部门名称 + private String userDeptName; + + //用户职位名称 + private String userTitle; + + //用户编号 + private String userCode; + //审核状态,0:不通过;1:通过, null:未审核 private Integer state; + + //审核不通过原因 + private String reason; } 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 a1d3c6b0..6f27c106 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 @@ -107,4 +107,9 @@ public class TicketInfoVO { * 设备地址 */ private String deviceAddress; + + /** + * 事故等级,0:一般;1:较严重;2:严重 + */ + private Byte accidentLevel; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketPdfVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketPdfVO.java index 464e11ca..88b8b2cc 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketPdfVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketPdfVO.java @@ -77,5 +77,5 @@ public class TicketPdfVO { //设备地址 private String deviceAddress; - private List measures; + private List measures; } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Ticket.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Ticket.java index 6314db0b..3df68a18 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Ticket.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/Ticket.java @@ -112,6 +112,11 @@ public class Ticket implements Serializable { */ private String question; + /** + * 事故等级 + */ + private Byte accidentLevel; + /** * 备注 */ diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketSolution.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketSolution.java index c538a09e..833539d9 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketSolution.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/entity/TicketSolution.java @@ -72,7 +72,7 @@ public class TicketSolution implements Serializable { /** * 创建人id */ - private Integer createUserid; + private Integer createUserId; /** * 创建时间 diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketSolutionAuditService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketSolutionAuditService.java index e1f02ddb..cc39f1de 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketSolutionAuditService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/ITicketSolutionAuditService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.nflg.mobilebroken.common.pojo.request.SolutionRejectRequest; import com.nflg.mobilebroken.common.pojo.request.SolutionReviewDepartmentSaveRequest; import com.nflg.mobilebroken.common.pojo.vo.SolutionReviewDepartmentVO; +import com.nflg.mobilebroken.repository.entity.Ticket; import com.nflg.mobilebroken.repository.entity.TicketSolutionAudit; import java.util.List; @@ -22,7 +23,9 @@ public interface ITicketSolutionAuditService extends IService * 服务类 @@ -17,7 +15,7 @@ import java.util.List; */ public interface ITicketSolutionService extends IService { - List getSolutionMeasures(Integer ticketId); + SolutionMeasuresVO getSolutionMeasures(Integer ticketId); void saveSolutionMeasures(SolutionMeasuresSaveRequest request); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java index 45bab86d..8af48dbd 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/TicketServiceImpl.java @@ -52,6 +52,9 @@ public class TicketServiceImpl extends ServiceImpl impleme @Resource private ITicketSolutionAuditService ticketSolutionAuditService; + @Resource + private ITicketSolutionService ticketSolutionService; + @Override public Ticket add(TicketAddRequest request, Integer userId) { Ticket lastTicket=lambdaQuery() @@ -144,8 +147,8 @@ public class TicketServiceImpl extends ServiceImpl impleme List tickerMangagers = adminUserService.getTickerMangagers(); VUtils.trueThrowBusinessError(tickerMangagers.stream().noneMatch(uid -> Objects.equals(uid, AdminUserUtil.getUserId()))) .throwMessage("你无权分派工单"); -// ticket.setUrgency(TicketUrgency.findByValue(request.getUrgency()).getState()); -// ticket.setQuestion(request.getQuestion()); + ticket.setUrgency(request.getUrgency()); + ticket.setQuestion(request.getQuestion()); ticket.setState(TicketState.Processing.getState()); ticket.setRemark(request.getRemark()); ticket.setHandle(StrUtil.join(",", request.getUserIds())); @@ -198,6 +201,8 @@ public class TicketServiceImpl extends ServiceImpl impleme tickerMangagers.addAll(Arrays.stream(ticket.getHandle().split(",")).map(Integer::parseInt).collect(Collectors.toList())); VUtils.trueThrowBusinessError(tickerMangagers.stream().noneMatch(uid -> Objects.equals(uid, AdminUserUtil.getUserId()))) .throwMessage("你无权完成工单"); + VUtils.trueThrowBusinessError(!ticketSolutionService.lambdaQuery().eq(TicketSolution::getTicketId, id).exists()) + .throwMessage("工单“" + ticket.getTitle() + "”还未填写解决方案"); ticket.setState(TicketState.ProcessingCompleted.getState()); ticket.setCurrentHandle(AdminUserUtil.getUserId()); ticket.setUpdateTime(LocalDateTime.now()); 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 a5f2fa87..f3cc0d7b 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 @@ -68,6 +68,8 @@ public class TicketSolutionAuditServiceImpl extends ServiceImpl users=request.getDepartments().stream().map(SolutionReviewDepartmentVO::getUserId).collect(Collectors.toList()); + VUtils.trueThrowBusinessError(!Objects.equals((long)users.size(),users.stream().distinct().count())).throwMessage("不同部门不能设置为同一个人"); remove(new LambdaQueryWrapper() .eq(TicketSolutionAudit::getTicketId,request.getTicketId()) .notIn(TicketSolutionAudit::getDeptName,request.getDepartments().stream().map(SolutionReviewDepartmentVO::getDeptName).collect(Collectors.toList()))); @@ -115,7 +117,7 @@ public class TicketSolutionAuditServiceImpl extends ServiceImpl getSolutionMeasures(Integer ticketId) { + public SolutionMeasuresVO getSolutionMeasures(Integer ticketId) { Ticket ticket = ticketService.getById(ticketId); VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); - List initialNames= new ArrayList<>(); - if (Objects.equals(ticket.getState(), TicketState.Processing.getState())) { - List items = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_SOLUTION_MEASURES); - initialNames=items.stream().map(DictionaryItem::getValue).collect(Collectors.toList()); + List initial= new ArrayList<>(); + if (Objects.equals(ticket.getState(), TicketState.Processing.getState()) || Objects.equals(ticket.getState(), TicketState.ProcessingCompleted.getState())) { + initial = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_SOLUTION_MEASURES); } List solutions = lambdaQuery().eq(TicketSolution::getTicketId, ticketId).orderByAsc(TicketSolution::getId).list(); Map> groupedSolutions = solutions.stream().collect(Collectors.groupingBy(TicketSolution::getDictionaryItemName, LinkedHashMap::new, Collectors.toList())); + SolutionMeasuresVO vo=new SolutionMeasuresVO(); + TicketSolutionAudit audit =ticketSolutionAuditService.getByTicketAndUser(ticketId,AdminUserUtil.getUserId()); + if (Objects.nonNull(audit)){ + vo.setInAudit(true); + vo.setAudited(Objects.equals(audit.getState(),1)); + } + List items = new ArrayList<>(); if (CollectionUtil.isEmpty(groupedSolutions)) { - return initialNames.stream().map(ticketSolutions -> new SolutionMeasuresVO() - .setName(ticketSolutions) + items= initial.stream().map(it -> new SolutionMeasuresItemVO() + .setId(it.getId()) + .setName(it.getName()) .setItems(Collections.emptyList())) .collect(Collectors.toList()); - } else if (CollectionUtil.isEmpty(initialNames)) { - return groupedSolutions.entrySet().stream().map(ks -> new SolutionMeasuresVO() + } else if (CollectionUtil.isEmpty(initial)) { + items= groupedSolutions.entrySet().stream().map(ks -> new SolutionMeasuresItemVO() .setName(ks.getKey()) - .setItems(ks.getValue().stream().map(v -> new SolutionMeasuresItemVO() + .setItems(ks.getValue().stream().map(v -> new SolutionMeasuresDataItemVO() + .setId(v.getId()) .setName(v.getDescription()) .setSuperintendent(v.getSuperintendent()) .setScheduleDate(v.getScheduleDate()) .setConfirmedDate(v.getConfirmedDate()) .setRemark(v.getRemark()) - .setCreateUserId(v.getCreateUserid())).collect(Collectors.toList()) + .setCreateUserId(v.getCreateUserId())).collect(Collectors.toList()) )).collect(Collectors.toList()); } else { - List vos = new ArrayList<>(); - initialNames.forEach(name -> { - List values = groupedSolutions.get(name); + for (DictionaryItem it : initial){ + List values = groupedSolutions.get(it.getName()); if (CollectionUtil.isEmpty(values)) { - vos.add(new SolutionMeasuresVO().setName(name).setItems(Collections.emptyList())); + items.add(new SolutionMeasuresItemVO().setId(it.getId()).setName(it.getName()).setItems(Collections.emptyList())); } else { - vos.add(new SolutionMeasuresVO() - .setName(name) - .setItems(values.stream().map(v -> new SolutionMeasuresItemVO() + items.add(new SolutionMeasuresItemVO() + .setId(it.getId()) + .setName(it.getName()) + .setItems(values.stream().map(v -> new SolutionMeasuresDataItemVO() + .setId(v.getId()) .setName(v.getDescription()) .setSuperintendent(v.getSuperintendent()) .setScheduleDate(v.getScheduleDate()) .setConfirmedDate(v.getConfirmedDate()) .setRemark(v.getRemark()) - .setCreateUserId(v.getCreateUserid())).collect(Collectors.toList()) + .setCreateUserId(v.getCreateUserId())).collect(Collectors.toList()) ) ); } - }); - return vos; + } } + vo.setMeasures(items); + return vo; } @Transactional @@ -105,42 +117,54 @@ public class TicketSolutionServiceImpl extends ServiceImpl cqmIds=adminUserService.getCQMIds(); - cqmIds.addAll(Arrays.stream(ticket.getHandle().split(",")).map(Integer::parseInt).collect(Collectors.toList())); - VUtils.trueThrowBusinessError(cqmIds.stream().noneMatch(uid -> Objects.equals(uid, AdminUserUtil.getUserId()))) + List handleIds=Arrays.stream(ticket.getHandle().split(",")).map(Integer::parseInt).collect(Collectors.toList()); + VUtils.trueThrowBusinessError(cqmIds.stream().noneMatch(uid -> Objects.equals(uid, userId)) + && handleIds.stream().noneMatch(uid -> Objects.equals(uid, userId))) .throwMessage("无权修改解决方案"); - ticketService.lambdaUpdate() - .set(Ticket::getReason, request.getReason()) - .set(Ticket::getUrgency, request.getUrgency()) - .set(Ticket::getQuestion, request.getQuestion()) - .eq(Ticket::getId, request.getTicketId()) - .update(); - baseMapper.delete(new LambdaQueryWrapper() - .eq(TicketSolution::getTicketId,request.getTicketId()) - .notIn(TicketSolution::getId, request.getSolutionMeasures().stream().flatMap(s -> s.getItems().stream()).map(SolutionMeasuresItemVO::getId).collect(Collectors.toList())) - ); List forAdd=new ArrayList<>(); List forUpdate=new ArrayList<>(); - for (SolutionMeasuresVO solutionMeasuresVO : request.getSolutionMeasures()) { - for (SolutionMeasuresItemVO solutionMeasuresItemVO : solutionMeasuresVO.getItems()){ + for (SolutionMeasuresItemVO solutionMeasuresItemVO : request.getSolutionMeasures()) { + for (SolutionMeasuresDataItemVO solutionMeasuresDataItemVO : solutionMeasuresItemVO.getItems()){ TicketSolution solution=new TicketSolution() .setTicketId(request.getTicketId()) - .setDictionaryItemId(solutionMeasuresVO.getId()) - .setDictionaryItemName(solutionMeasuresVO.getName()) - .setDescription(solutionMeasuresItemVO.getName()) - .setSuperintendent(solutionMeasuresItemVO.getSuperintendent()) - .setScheduleDate(solutionMeasuresItemVO.getScheduleDate()) - .setConfirmedDate(solutionMeasuresItemVO.getConfirmedDate()); - if (Objects.isNull(solutionMeasuresItemVO.getId())){ - solution.setCreateUserid(AdminUserUtil.getUserId()) + .setDictionaryItemId(solutionMeasuresItemVO.getId()) + .setDictionaryItemName(solutionMeasuresItemVO.getName()) + .setDescription(solutionMeasuresDataItemVO.getName()) + .setSuperintendent(solutionMeasuresDataItemVO.getSuperintendent()) + .setScheduleDate(solutionMeasuresDataItemVO.getScheduleDate()) + .setConfirmedDate(solutionMeasuresDataItemVO.getConfirmedDate()); + if (Objects.isNull(solutionMeasuresDataItemVO.getId())){ + solution.setCreateUserId(userId) .setCreateTime(LocalDateTime.now()); forAdd.add(solution); }else { - solution.setId(solutionMeasuresItemVO.getId()); + solution.setId(solutionMeasuresDataItemVO.getId()); forUpdate.add(solution); } } } + List idForReserve=forUpdate.stream().map(TicketSolution::getId).collect(Collectors.toList()); + List solutions=lambdaQuery().eq(TicketSolution::getTicketId, request.getTicketId()).orderByAsc(TicketSolution::getId).list(); + if (!cqmIds.contains(userId)){ + List solutions1=solutions.stream().filter(s->idForReserve.contains(s.getId())).collect(Collectors.toList()); + solutions.removeAll(solutions1); + VUtils.trueThrowBusinessError(solutions.stream().anyMatch(s->!Objects.equals(s.getCreateUserId(), userId))) + .throwMessage("不能删除他人创建的措施"); + solutions1.removeIf(s->Objects.equals(s.getCreateUserId(), userId)); + List ts=forUpdate.stream().filter(s->!Objects.equals(s.getCreateUserId(), userId)).collect(Collectors.toList()); + VUtils.trueThrowBusinessError(!ts.equals(solutions1)).throwMessage("不能修改他人创建的措施"); + } + ticketService.lambdaUpdate() + .set(Ticket::getReason, request.getReason()) + .set(Ticket::getAccidentLevel, request.getAccidentLevel()) + .eq(Ticket::getId, request.getTicketId()) + .update(); + baseMapper.delete(new LambdaQueryWrapper() + .eq(TicketSolution::getTicketId,request.getTicketId()) + .notIn(TicketSolution::getId, idForReserve) + ); if (CollectionUtil.isNotEmpty(forAdd)){ saveBatch(forAdd); } diff --git a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketSolutionAuditMapper.xml b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketSolutionAuditMapper.xml index b9d85714..cf48b6bb 100644 --- a/nflg-mobilebroken-repository/src/main/resources/mapper/TicketSolutionAuditMapper.xml +++ b/nflg-mobilebroken-repository/src/main/resources/mapper/TicketSolutionAuditMapper.xml @@ -1,11 +1,20 @@ -