云
2026-10-25 daf9f8dbb7ba36eb283221d2c6022039aefaf97d
yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/ticket/AfterSaleTicketServiceImpl.java
@@ -6,6 +6,9 @@
import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketPageReqVO;
import cn.iocoder.yudao.module.aftersales.controller.admin.ticket.vo.ticket.AfterSaleTicketSaveReqVO;
import cn.iocoder.yudao.module.aftersales.dal.dataobject.ticket.AfterSaleTicketDO;
import cn.iocoder.yudao.module.aftersales.dal.dataobject.returnobj.AfterSaleReturnDO;
import cn.iocoder.yudao.module.aftersales.dal.mysql.returnobj.AfterSaleReturnMapper;
import cn.iocoder.yudao.module.aftersales.enums.AfterSaleReturnStatusEnum;
import cn.iocoder.yudao.module.aftersales.dal.dataobject.ticket.AfterSaleTicketItemDO;
import cn.iocoder.yudao.module.aftersales.dal.mysql.ticket.AfterSaleTicketItemMapper;
import cn.iocoder.yudao.module.aftersales.dal.mysql.ticket.AfterSaleTicketMapper;
@@ -41,6 +44,8 @@
    private AfterSaleTicketMapper ticketMapper;
    @Resource
    private AfterSaleTicketItemMapper ticketItemMapper;
    @Resource
    private AfterSaleReturnMapper returnMapper;
    @Resource
    private AfterSaleNoRedisDAO noRedisDAO;
@@ -60,10 +65,12 @@
            throw exception(TICKET_NO_EXISTS);
        }
        // 2. 插入工单
        // 2. 插入工单(填了处理人即视为已指派,直接进入处理中)
        AfterSaleTicketDO ticket = BeanUtils.toBean(createReqVO, AfterSaleTicketDO.class)
                .setNo(no)
                .setStatus(AfterSaleTicketStatusEnum.DRAFT.getStatus())
                .setStatus(createReqVO.getHandlerUserId() != null
                        ? AfterSaleTicketStatusEnum.PROCESSING.getStatus()
                        : AfterSaleTicketStatusEnum.DRAFT.getStatus())
                .setOwnerUserId(userId);
        ticketMapper.insert(ticket);
@@ -98,8 +105,12 @@
        AfterSaleTicketDO ticket = validateTicketExists(updateReqVO.getId());
        validateTicketStatus(ticket, AfterSaleTicketStatusEnum.DRAFT);
        // 2. 更新工单
        // 2. 更新工单(草稿单填了处理人即视为指派,进入处理中)
        AfterSaleTicketDO updateObj = BeanUtils.toBean(updateReqVO, AfterSaleTicketDO.class);
        if (AfterSaleTicketStatusEnum.DRAFT.getStatus().equals(ticket.getStatus())
                && updateReqVO.getHandlerUserId() != null) {
            updateObj.setStatus(AfterSaleTicketStatusEnum.PROCESSING.getStatus());
        }
        ticketMapper.updateById(updateObj);
        // 3. 更新明细行(先删后增)
@@ -178,6 +189,12 @@
        AfterSaleTicketDO ticket = validateTicketExists(id);
        validateTicketStatus(ticket, AfterSaleTicketStatusEnum.PROCESSING,
                AfterSaleTicketStatusEnum.WAITING_RETURN, AfterSaleTicketStatusEnum.WAITING_REFUND);
        if (ticket.getReturnId() != null) {
            AfterSaleReturnDO returnDO = returnMapper.selectById(ticket.getReturnId());
            if (returnDO == null || !AfterSaleReturnStatusEnum.REFUNDED.getStatus().equals(returnDO.getStatus())) {
                throw exception(RETURN_TICKET_NOT_FINISHED);
            }
        }
        ticketMapper.updateById(new AfterSaleTicketDO().setId(id)
                .setStatus(AfterSaleTicketStatusEnum.COMPLETED.getStatus())
                .setResolvedTime(LocalDateTime.now()));
@@ -188,6 +205,14 @@
    public void closeTicket(Long id) {
        AfterSaleTicketDO ticket = validateTicketExists(id);
        validateTicketStatus(ticket, AfterSaleTicketStatusEnum.COMPLETED);
        if (ticket.getReturnId() != null) {
            AfterSaleReturnDO returnDO = returnMapper.selectById(ticket.getReturnId());
            if (returnDO == null || !AfterSaleReturnStatusEnum.REFUNDED.getStatus().equals(returnDO.getStatus())) {
                throw exception(RETURN_TICKET_NOT_FINISHED);
            }
            returnMapper.updateById(new AfterSaleReturnDO().setId(returnDO.getId())
                    .setStatus(AfterSaleReturnStatusEnum.CLOSED.getStatus()));
        }
        ticketMapper.updateById(new AfterSaleTicketDO().setId(id)
                .setStatus(AfterSaleTicketStatusEnum.CLOSED.getStatus())
                .setClosedTime(LocalDateTime.now()));