From 46287520465b5664a1ddb0256537857cfd1cfc15 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期一, 14 九月 2026 17:52:04 +0800
Subject: [PATCH] feat(aftersales): 售后新增回访、问题归档与问题库

---
 yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/ticket/AfterSaleTicketServiceImpl.java |   38 ++++++++++++++++++++++++++++++++++----
 1 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/ticket/AfterSaleTicketServiceImpl.java b/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/ticket/AfterSaleTicketServiceImpl.java
index a076b58..bc01293 100644
--- a/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/ticket/AfterSaleTicketServiceImpl.java
+++ b/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/ticket/AfterSaleTicketServiceImpl.java
@@ -5,6 +5,7 @@
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 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.problem.AfterSaleProblemDO;
 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.mysql.ticket.AfterSaleTicketItemMapper;
@@ -12,9 +13,12 @@
 import cn.iocoder.yudao.module.aftersales.dal.redis.no.AfterSaleNoRedisDAO;
 import cn.iocoder.yudao.module.aftersales.enums.AfterSaleBizTypeEnum;
 import cn.iocoder.yudao.module.aftersales.enums.AfterSaleTicketStatusEnum;
+import cn.iocoder.yudao.module.aftersales.enums.AfterSaleVisitStatusEnum;
 import cn.iocoder.yudao.module.aftersales.enums.permission.AfterSalePermissionLevelEnum;
 import cn.iocoder.yudao.module.aftersales.service.permission.AfterSalePermissionService;
 import cn.iocoder.yudao.module.aftersales.service.permission.bo.AfterSalePermissionCreateReqBO;
+import cn.iocoder.yudao.module.aftersales.service.problem.AfterSaleProblemService;
+import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -47,6 +51,12 @@
     @Resource
     private AfterSalePermissionService permissionService;
 
+    @Resource
+    private AfterSaleProblemService problemService;
+
+    @Resource
+    private StorageAttachmentApi storageAttachmentApi;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createTicket(AfterSaleTicketSaveReqVO createReqVO, Long userId) {
@@ -72,7 +82,11 @@
             });
         }
 
-        // 4. 鍒涘缓鏁版嵁鏉冮檺锛堣礋璐d汉锛�
+        // 4. 缁戝畾闄勪欢
+        storageAttachmentApi.bindAttachments("file", "aftersales_after_sale_ticket",
+                ticket.getId(), createReqVO.getBlobIds());
+
+        // 5. 鍒涘缓鏁版嵁鏉冮檺锛堣礋璐d汉锛�
         AfterSalePermissionCreateReqBO permBO = new AfterSalePermissionCreateReqBO();
         permBO.setBizType(AfterSaleBizTypeEnum.AFTER_SALE_TICKET.getType());
         permBO.setBizId(ticket.getId());
@@ -103,6 +117,9 @@
                 ticketItemMapper.insert(itemDO);
             });
         }
+
+        // 4. 鏇存柊闄勪欢
+        storageAttachmentApi.updateAttachments("file", "aftersales_after_sale_ticket", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     @Override
@@ -113,6 +130,7 @@
         // 杞垹闄�
         ticketMapper.deleteById(id);
         ticketItemMapper.deleteByTicketId(id);
+        storageAttachmentApi.deleteAttachmentsByRecord("aftersales_after_sale_ticket", id);
         permissionService.deletePermission(AfterSaleBizTypeEnum.AFTER_SALE_TICKET.getType(), id);
     }
 
@@ -134,7 +152,7 @@
         return ticketMapper.selectPage(pageReqVO, userId, pageReqVO.getSceneType(),
                 pageReqVO.getNo(), pageReqVO.getName(),
                 pageReqVO.getCustomerId(), pageReqVO.getSaleOrderId(),
-                pageReqVO.getStatus(), pageReqVO.getIssueType());
+                pageReqVO.getStatus(), pageReqVO.getIssueType(), pageReqVO.getVisitStatus());
     }
 
     @Override
@@ -166,19 +184,31 @@
         AfterSaleTicketDO ticket = validateTicketExists(id);
         validateTicketStatus(ticket, AfterSaleTicketStatusEnum.PROCESSING,
                 AfterSaleTicketStatusEnum.WAITING_RETURN, AfterSaleTicketStatusEnum.WAITING_REFUND);
+        // 瀹岀粨鍚庤繘鍏ュ緟鍥炶锛岄渶鐧昏婊℃剰鐨勫洖璁垮悗鏂瑰彲褰掓。
         ticketMapper.updateById(new AfterSaleTicketDO().setId(id)
                 .setStatus(AfterSaleTicketStatusEnum.COMPLETED.getStatus())
-                .setResolvedTime(LocalDateTime.now()));
+                .setResolvedTime(LocalDateTime.now())
+                .setVisitStatus(AfterSaleVisitStatusEnum.WAITING.getStatus()));
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void closeTicket(Long id) {
+        // 1. 鏍¢獙宸ュ崟瀛樺湪涓斿浜庡凡瀹岀粨鐘舵��
         AfterSaleTicketDO ticket = validateTicketExists(id);
         validateTicketStatus(ticket, AfterSaleTicketStatusEnum.COMPLETED);
+        // 2. 鏍¢獙宸插洖璁块�氳繃锛屾湭鍥炶閫氳繃涓嶅厑璁稿綊妗�
+        if (!AfterSaleVisitStatusEnum.PASSED.getStatus().equals(ticket.getVisitStatus())) {
+            throw exception(TICKET_ARCHIVE_FAIL_NOT_VISITED);
+        }
+        // 3. 鑷姩娌夋穩闂(骞傜瓑锛氬悓涓�宸ュ崟浠呮矇娣�涓�鏉�)锛岃繑鍥炶崏绋挎�侀棶棰�
+        AfterSaleProblemDO problem = problemService.createProblemFromTicket(ticket);
+        // 4. 缃綊妗g粓鎬�(鍙)
         ticketMapper.updateById(new AfterSaleTicketDO().setId(id)
                 .setStatus(AfterSaleTicketStatusEnum.CLOSED.getStatus())
-                .setClosedTime(LocalDateTime.now()));
+                .setClosedTime(LocalDateTime.now())
+                .setProblemId(problem.getId())
+                .setProblemNo(problem.getNo()));
     }
 
     @Override

--
Gitblit v1.9.3