| | |
| | | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| | | import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; |
| | | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| | | import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketEscalateReqVO; |
| | | import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketHandleReqVO; |
| | | import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketLogRespVO; |
| | | import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketPageReqVO; |
| | | import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketRespVO; |
| | | import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketSaveReqVO; |
| | | import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketSignInReqVO; |
| | | import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketStatisticsRespVO; |
| | | import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketTransferReqVO; |
| | | import cn.iocoder.yudao.module.aftersales.dal.dataobject.ticket.AfterSaleTicketDO; |
| | | import cn.iocoder.yudao.module.aftersales.dal.dataobject.ticket.AfterSaleTicketItemDO; |
| | | import cn.iocoder.yudao.module.aftersales.dal.dataobject.ticket.AfterSaleTicketLogDO; |
| | | import cn.iocoder.yudao.module.aftersales.enums.AfterSaleTicketLogActionEnum; |
| | | import cn.iocoder.yudao.module.aftersales.service.ticket.AfterSaleTicketService; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.crm.api.customer.dto.CrmCustomerRespDTO; |
| | |
| | | @PreAuthorize("@ss.hasPermission('aftersales:ticket:update')") |
| | | public CommonResult<Boolean> assignTicket(@RequestParam("id") Long id, |
| | | @RequestParam("handlerUserId") Long handlerUserId) { |
| | | ticketService.assignTicket(id, handlerUserId); |
| | | ticketService.assignTicket(id, handlerUserId, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | |
| | | @RequestParam("issueType") Integer issueType, |
| | | @RequestParam(value = "issueCategory", required = false) String issueCategory, |
| | | @RequestParam(value = "severityLevel", required = false) Integer severityLevel) { |
| | | ticketService.classifyTicket(id, issueType, issueCategory, severityLevel); |
| | | ticketService.classifyTicket(id, issueType, issueCategory, severityLevel, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | |
| | | @Operation(summary = "完结工单") |
| | | @PreAuthorize("@ss.hasPermission('aftersales:ticket:update')") |
| | | public CommonResult<Boolean> resolveTicket(@RequestParam("id") Long id) { |
| | | ticketService.resolveTicket(id); |
| | | ticketService.resolveTicket(id, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | |
| | | @Operation(summary = "关闭工单") |
| | | @PreAuthorize("@ss.hasPermission('aftersales:ticket:update')") |
| | | public CommonResult<Boolean> closeTicket(@RequestParam("id") Long id) { |
| | | ticketService.closeTicket(id); |
| | | ticketService.closeTicket(id, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | |
| | | @Operation(summary = "取消工单") |
| | | @PreAuthorize("@ss.hasPermission('aftersales:ticket:update')") |
| | | public CommonResult<Boolean> cancelTicket(@RequestParam("id") Long id) { |
| | | ticketService.cancelTicket(id); |
| | | ticketService.cancelTicket(id, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/sign-in") |
| | | @Operation(summary = "现场签到") |
| | | @PreAuthorize("@ss.hasPermission('aftersales:ticket:update')") |
| | | public CommonResult<Boolean> signInTicket(@Valid @RequestBody AfterSaleTicketSignInReqVO reqVO) { |
| | | ticketService.signInTicket(reqVO, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/transfer") |
| | | @Operation(summary = "转派工单") |
| | | @PreAuthorize("@ss.hasPermission('aftersales:ticket:update')") |
| | | public CommonResult<Boolean> transferTicket(@Valid @RequestBody AfterSaleTicketTransferReqVO reqVO) { |
| | | ticketService.transferTicket(reqVO, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/escalate") |
| | | @Operation(summary = "升级工单") |
| | | @PreAuthorize("@ss.hasPermission('aftersales:ticket:update')") |
| | | public CommonResult<Boolean> escalateTicket(@Valid @RequestBody AfterSaleTicketEscalateReqVO reqVO) { |
| | | ticketService.escalateTicket(reqVO, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @PostMapping("/handle") |
| | | @Operation(summary = "新增处理记录") |
| | | @PreAuthorize("@ss.hasPermission('aftersales:ticket:update')") |
| | | public CommonResult<Boolean> addHandleRecord(@Valid @RequestBody AfterSaleTicketHandleReqVO reqVO) { |
| | | ticketService.addHandleRecord(reqVO, getLoginUserId()); |
| | | return success(true); |
| | | } |
| | | |
| | | @GetMapping("/log-list") |
| | | @Operation(summary = "获得工单操作/进度记录列表") |
| | | @Parameter(name = "ticketId", description = "工单编号", required = true, example = "1") |
| | | public CommonResult<List<AfterSaleTicketLogRespVO>> getTicketLogList(@RequestParam("ticketId") Long ticketId) { |
| | | return success(buildLogRespList(ticketService.getTicketLogList(ticketId))); |
| | | } |
| | | |
| | | @GetMapping("/statistics") |
| | | @Operation(summary = "获得工单助手统计") |
| | | @Parameter(name = "sceneType", description = "场景类型: 1-我负责的 2-我参与的 3-下属负责的 4-全部", example = "4") |
| | | public CommonResult<AfterSaleTicketStatisticsRespVO> getTicketStatistics( |
| | | @RequestParam(value = "sceneType", required = false) Integer sceneType) { |
| | | return success(ticketService.getTicketStatistics(sceneType, getLoginUserId())); |
| | | } |
| | | |
| | | // ========== 内部方法:拼装进度记录 ========== |
| | | |
| | | private List<AfterSaleTicketLogRespVO> buildLogRespList(List<AfterSaleTicketLogDO> logList) { |
| | | if (CollUtil.isEmpty(logList)) { |
| | | return Collections.emptyList(); |
| | | } |
| | | Set<Long> userIds = convertSet(logList, AfterSaleTicketLogDO::getOperatorUserId); |
| | | Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds); |
| | | return BeanUtils.toBean(logList, AfterSaleTicketLogRespVO.class, vo -> { |
| | | vo.setActionName(AfterSaleTicketLogActionEnum.getName(vo.getActionType())); |
| | | AdminUserRespDTO user = userMap.get(vo.getOperatorUserId()); |
| | | if (user != null) { |
| | | vo.setOperatorUserName(user.getNickname()); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | // ========== 内部方法:批量拼装关联名称 ========== |
| | | |
| | | private List<AfterSaleTicketRespVO> buildTicketDetailList(List<AfterSaleTicketDO> ticketList) { |