From fdbc5af6474abb39120b771af87005aeb6186ae5 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期一, 14 九月 2026 15:28:28 +0800
Subject: [PATCH] feat: 售后工单按条绑定部门与原因类型;新增加班工资管理;员工附件留档

---
 yudao-module-aftersales/src/main/java/cn/iocoder/yudao/module/aftersales/service/ticket/AfterSaleTicketServiceImpl.java |   37 ++++++++++++++++++++++++++++---------
 1 files changed, 28 insertions(+), 9 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..294181a 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
@@ -15,6 +15,7 @@
 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.system.api.storage.StorageAttachmentApi;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -47,6 +48,9 @@
     @Resource
     private AfterSalePermissionService permissionService;
 
+    @Resource
+    private StorageAttachmentApi storageAttachmentApi;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createTicket(AfterSaleTicketSaveReqVO createReqVO, Long userId) {
@@ -63,16 +67,21 @@
                 .setOwnerUserId(userId);
         ticketMapper.insert(ticket);
 
-        // 3. 鎻掑叆鏄庣粏琛�
+        // 3. 鎻掑叆鏄庣粏琛岋紙姣忔潯鐢熸垚鐙珛鍞悗鍗曞彿锛氬伐鍗曞彿-搴忓彿锛�
         if (CollUtil.isNotEmpty(createReqVO.getItems())) {
-            createReqVO.getItems().forEach(item -> {
-                AfterSaleTicketItemDO itemDO = BeanUtils.toBean(item, AfterSaleTicketItemDO.class);
+            for (int i = 0; i < createReqVO.getItems().size(); i++) {
+                AfterSaleTicketItemDO itemDO = BeanUtils.toBean(createReqVO.getItems().get(i), AfterSaleTicketItemDO.class);
                 itemDO.setTicketId(ticket.getId());
+                itemDO.setItemNo(buildItemNo(no, i + 1));
                 ticketItemMapper.insert(itemDO);
-            });
+            }
         }
 
-        // 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());
@@ -94,15 +103,19 @@
         AfterSaleTicketDO updateObj = BeanUtils.toBean(updateReqVO, AfterSaleTicketDO.class);
         ticketMapper.updateById(updateObj);
 
-        // 3. 鏇存柊鏄庣粏琛岋紙鍏堝垹鍚庡锛�
+        // 3. 鏇存柊鏄庣粏琛岋紙鍏堝垹鍚庡锛屾瘡鏉$敓鎴愮嫭绔嬪敭鍚庡崟鍙凤細宸ュ崟鍙�-搴忓彿锛�
         ticketItemMapper.deleteByTicketId(ticket.getId());
         if (CollUtil.isNotEmpty(updateReqVO.getItems())) {
-            updateReqVO.getItems().forEach(item -> {
-                AfterSaleTicketItemDO itemDO = BeanUtils.toBean(item, AfterSaleTicketItemDO.class);
+            for (int i = 0; i < updateReqVO.getItems().size(); i++) {
+                AfterSaleTicketItemDO itemDO = BeanUtils.toBean(updateReqVO.getItems().get(i), AfterSaleTicketItemDO.class);
                 itemDO.setTicketId(ticket.getId());
+                itemDO.setItemNo(buildItemNo(ticket.getNo(), i + 1));
                 ticketItemMapper.insert(itemDO);
-            });
+            }
         }
+
+        // 4. 鏇存柊闄勪欢
+        storageAttachmentApi.updateAttachments("file", "aftersales_after_sale_ticket", updateReqVO.getId(), updateReqVO.getBlobIds());
     }
 
     @Override
@@ -113,6 +126,7 @@
         // 杞垹闄�
         ticketMapper.deleteById(id);
         ticketItemMapper.deleteByTicketId(id);
+        storageAttachmentApi.deleteAttachmentsByRecord("aftersales_after_sale_ticket", id);
         permissionService.deletePermission(AfterSaleBizTypeEnum.AFTER_SALE_TICKET.getType(), id);
     }
 
@@ -192,6 +206,11 @@
 
     // ========== 鍐呴儴鏂规硶 ==========
 
+    /** 鐢熸垚鏄庣粏鍞悗鍗曞彿锛氬伐鍗曞彿-涓や綅搴忓彿 */
+    private String buildItemNo(String ticketNo, int index) {
+        return ticketNo + "-" + String.format("%02d", index);
+    }
+
     private AfterSaleTicketDO validateTicketExists(Long id) {
         AfterSaleTicketDO ticket = ticketMapper.selectById(id);
         if (ticket == null) {

--
Gitblit v1.9.3