From d39e4f7d839167c16425086dfa2f8747bccfdff9 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 05 十一月 2026 17:39:01 +0800
Subject: [PATCH] feat: 打通销售采购财务闭环并完成累计业务优化

---
 yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/ticket/AfterSaleTicketController.java |   62 ++++++++++++++++++++++++++-----
 1 files changed, 52 insertions(+), 10 deletions(-)

diff --git a/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/ticket/AfterSaleTicketController.java b/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/ticket/AfterSaleTicketController.java
index 6600104..20eda4f 100644
--- a/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/ticket/AfterSaleTicketController.java
+++ b/yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/controller/admin/ticket/AfterSaleTicketController.java
@@ -5,11 +5,15 @@
 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.AfterSaleTicketFlowRespVO;
 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.dal.dataobject.ticket.AfterSaleTicketDO;
+import cn.iocoder.yudao.module.aftersales.dal.dataobject.ticket.AfterSaleTicketFlowDO;
 import cn.iocoder.yudao.module.aftersales.dal.dataobject.ticket.AfterSaleTicketItemDO;
+import cn.iocoder.yudao.module.aftersales.enums.AfterSaleTicketStatusEnum;
+import cn.iocoder.yudao.module.aftersales.service.ticket.AfterSaleTicketFlowService;
 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;
@@ -38,6 +42,8 @@
 
     @Resource
     private AfterSaleTicketService ticketService;
+    @Resource
+    private AfterSaleTicketFlowService ticketFlowService;
 
     @Resource
     private CrmCustomerApi customerApi;
@@ -80,8 +86,20 @@
         List<AfterSaleTicketRespVO> enrichedList = buildTicketDetailList(List.of(ticket));
         AfterSaleTicketRespVO respVO = enrichedList.get(0);
         respVO.setItems(BeanUtils.toBean(items, AfterSaleTicketRespVO.Item.class));
+        respVO.setFeedbackAttachmentList(
+                storageAttachmentApi.listAttachments("aftersales_after_sale_ticket_feedback", id));
+        respVO.setResultAttachmentList(
+                storageAttachmentApi.listAttachments("aftersales_after_sale_ticket_result", id));
         respVO.setAttachmentList(storageAttachmentApi.listAttachments("aftersales_after_sale_ticket", id));
+        respVO.setFlowList(buildFlowList(id));
         return success(respVO);
+    }
+
+    @GetMapping("/flow-list")
+    @Operation(summary = "鑾峰緱鍞悗宸ュ崟娴佽浆璁板綍")
+    @Parameter(name = "ticketId", description = "宸ュ崟缂栧彿", required = true, example = "1")
+    public CommonResult<List<AfterSaleTicketFlowRespVO>> getTicketFlowList(@RequestParam("ticketId") Long ticketId) {
+        return success(buildFlowList(ticketId));
     }
 
     @GetMapping("/page")
@@ -90,15 +108,6 @@
         PageResult<AfterSaleTicketDO> pageResult = ticketService.getTicketPage(pageReqVO, getLoginUserId());
         List<AfterSaleTicketRespVO> list = buildTicketDetailList(pageResult.getList());
         return success(new PageResult<>(list, pageResult.getTotal()));
-    }
-
-    @PostMapping("/assign")
-    @Operation(summary = "鍒嗛厤澶勭悊浜�")
-    @PreAuthorize("@ss.hasPermission('aftersales:ticket:update')")
-    public CommonResult<Boolean> assignTicket(@RequestParam("id") Long id,
-                                              @RequestParam("handlerUserId") Long handlerUserId) {
-        ticketService.assignTicket(id, handlerUserId);
-        return success(true);
     }
 
     @PostMapping("/classify")
@@ -136,7 +145,40 @@
         return success(true);
     }
 
-    // ========== 鍐呴儴鏂规硶锛氭壒閲忔嫾瑁呭叧鑱斿悕绉� ==========
+    // ========== 鍐呴儴鏂规硶锛氭祦杞褰� / 鎵归噺鎷艰鍏宠仈鍚嶇О ==========
+
+    private List<AfterSaleTicketFlowRespVO> buildFlowList(Long ticketId) {
+        List<AfterSaleTicketFlowDO> flowList = ticketFlowService.getFlowList(ticketId);
+        if (CollUtil.isEmpty(flowList)) {
+            return Collections.emptyList();
+        }
+        Set<Long> operatorIds = convertSet(flowList, AfterSaleTicketFlowDO::getOperatorId);
+        Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(operatorIds);
+        return BeanUtils.toBean(flowList, AfterSaleTicketFlowRespVO.class, vo -> {
+            vo.setFromStatusName(getStatusName(vo.getFromStatus()));
+            vo.setToStatusName(getStatusName(vo.getToStatus()));
+            AdminUserRespDTO operator = userMap.get(vo.getOperatorId());
+            if (operator != null) {
+                vo.setOperatorName(operator.getNickname());
+            } else if (vo.getOperatorId() != null) {
+                vo.setOperatorName("鐢ㄦ埛(ID=" + vo.getOperatorId() + ")");
+            } else {
+                vo.setOperatorName("绯荤粺");
+            }
+        });
+    }
+
+    private String getStatusName(Integer status) {
+        if (status == null) {
+            return null;
+        }
+        for (AfterSaleTicketStatusEnum item : AfterSaleTicketStatusEnum.values()) {
+            if (item.getStatus().equals(status)) {
+                return item.getName();
+            }
+        }
+        return "鏈煡鐘舵��(ID=" + status + ")";
+    }
 
     private List<AfterSaleTicketRespVO> buildTicketDetailList(List<AfterSaleTicketDO> ticketList) {
         if (CollUtil.isEmpty(ticketList)) {

--
Gitblit v1.9.3