gaoluyang
5 天以前 87d725aa16dcdcdd19f28cd3f3f162e950fd1d2f
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/ticket/AfterSaleTicketController.java
@@ -5,11 +5,19 @@
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;
@@ -73,7 +81,6 @@
    @GetMapping("/get")
    @Operation(summary = "获得售后工单")
    @Parameter(name = "id", description = "工单编号", required = true, example = "1")
    @PreAuthorize("@ss.hasPermission('aftersales:ticket:query')")
    public CommonResult<AfterSaleTicketRespVO> getTicket(@RequestParam("id") Long id) {
        AfterSaleTicketDO ticket = ticketService.getTicket(id);
        List<AfterSaleTicketItemDO> items = ticketService.getTicketItemListByTicketId(id);
@@ -87,7 +94,6 @@
    @GetMapping("/page")
    @Operation(summary = "获得售后工单分页")
    @PreAuthorize("@ss.hasPermission('aftersales:ticket:query')")
    public CommonResult<PageResult<AfterSaleTicketRespVO>> getTicketPage(@Valid AfterSaleTicketPageReqVO pageReqVO) {
        PageResult<AfterSaleTicketDO> pageResult = ticketService.getTicketPage(pageReqVO, getLoginUserId());
        List<AfterSaleTicketRespVO> list = buildTicketDetailList(pageResult.getList());
@@ -99,7 +105,7 @@
    @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);
    }
@@ -110,7 +116,7 @@
                                                @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);
    }
@@ -118,7 +124,7 @@
    @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);
    }
@@ -126,7 +132,7 @@
    @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);
    }
@@ -134,10 +140,74 @@
    @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) {