From d468ff4afaed47caec1217d72763fdc679e7bddc Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期三, 24 六月 2026 16:42:27 +0800
Subject: [PATCH] feat: 新增售后消息推送、售后数量自定义

---
 src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java                    |    3 +
 doc/after_sales_service_add_column.sql                                                   |    1 
 src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceNewDto.java               |    3 +
 src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java |   44 +++++++++++++++++++++-
 src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java    |    6 ++
 src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java            |   20 +++++-----
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                               |    3 +
 src/main/java/com/ruoyi/project/system/service/impl/UnipushService.java                  |   20 ++++++++++
 src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesProductDto.java                  |   10 +++++
 9 files changed, 96 insertions(+), 14 deletions(-)

diff --git a/doc/after_sales_service_add_column.sql b/doc/after_sales_service_add_column.sql
new file mode 100644
index 0000000..74acc2c
--- /dev/null
+++ b/doc/after_sales_service_add_column.sql
@@ -0,0 +1 @@
+ALTER TABLE `after_sales_service` ADD COLUMN `after_sales_products` text COMMENT '鍞悗浜у搧璇︽儏';
diff --git a/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java b/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java
index 95e9999..2da2be7 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java
+++ b/src/main/java/com/ruoyi/aftersalesservice/controller/AfterSalesServiceController.java
@@ -1,5 +1,6 @@
 package com.ruoyi.aftersalesservice.controller;
 
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.aftersalesservice.dto.AfterSalesServiceExeclDto;
@@ -97,12 +98,15 @@
     @ApiOperation("鍞悗鏈嶅姟-淇敼")
     @Log(title = "鍞悗鏈嶅姟-淇敼", businessType = BusinessType.UPDATE)
     public AjaxResult update(@RequestBody AfterSalesServiceNewDto afterSalesServiceNewDto) {
-        if (afterSalesServiceNewDto.getProductModelIdList() != null && afterSalesServiceNewDto.getProductModelIdList().isEmpty() ) {
+        if (afterSalesServiceNewDto.getProductModelIdList() != null && !afterSalesServiceNewDto.getProductModelIdList().isEmpty() ) {
             String productModelIds = afterSalesServiceNewDto.getProductModelIdList().stream()
                     .map(String::valueOf)
                     .collect(Collectors.joining(","));
             afterSalesServiceNewDto.setProductModelIds(productModelIds);
         }
+        if (afterSalesServiceNewDto.getAfterSalesProductList() != null && !afterSalesServiceNewDto.getAfterSalesProductList().isEmpty()) {
+            afterSalesServiceNewDto.setAfterSalesProducts(JSON.toJSONString(afterSalesServiceNewDto.getAfterSalesProductList()));
+        }
         boolean update = afterSalesServiceService.updateById(afterSalesServiceNewDto);
         return update ? AjaxResult.success() : AjaxResult.error();
     }
diff --git a/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesProductDto.java b/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesProductDto.java
new file mode 100644
index 0000000..6358eb6
--- /dev/null
+++ b/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesProductDto.java
@@ -0,0 +1,10 @@
+package com.ruoyi.aftersalesservice.dto;
+
+import lombok.Data;
+import java.math.BigDecimal;
+
+@Data
+public class AfterSalesProductDto {
+    private Long id;
+    private BigDecimal afterSalesQuantity;
+}
diff --git a/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceNewDto.java b/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceNewDto.java
index ab7bc80..5ef0538 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceNewDto.java
+++ b/src/main/java/com/ruoyi/aftersalesservice/dto/AfterSalesServiceNewDto.java
@@ -17,6 +17,9 @@
     @ApiModelProperty("浜у搧鍨嬪彿ID鏁扮粍")
     private List<Long> productModelIdList;
 
+    @ApiModelProperty("鍞悗浜у搧璇︽儏鍒楄〃")
+    private List<AfterSalesProductDto> afterSalesProductList;
+
     private SalesLedgerDto salesLedgerDto;
 
     private String salesContractNo;
diff --git a/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java b/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java
index e11722e..7d2dc0e 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java
+++ b/src/main/java/com/ruoyi/aftersalesservice/pojo/AfterSalesService.java
@@ -158,6 +158,7 @@
     @ApiModelProperty("浜у搧鍨嬪彿IDs")
     private String productModelIds;
 
-
+    @ApiModelProperty("鍞悗浜у搧璇︽儏")
+    private String afterSalesProducts;
 
 }
diff --git a/src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java b/src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java
index 68dfa7f..d744ece 100644
--- a/src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java
+++ b/src/main/java/com/ruoyi/aftersalesservice/service/impl/AfterSalesServiceServiceImpl.java
@@ -1,5 +1,6 @@
 package com.ruoyi.aftersalesservice.service.impl;
 
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -16,6 +17,7 @@
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.project.system.service.ISysNoticeService;
 import com.ruoyi.sales.dto.SalesLedgerDto;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -27,6 +29,7 @@
 import org.springframework.stereotype.Service;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -50,6 +53,8 @@
     private ISalesLedgerProductService salesLedgerProductService;
     @Autowired
     private ISalesLedgerService salesLedgerService;
+    @Autowired
+    private ISysNoticeService sysNoticeService;
 
     @Override
     public IPage<AfterSalesServiceNewDto> listPage(Page page, AfterSalesServiceNewDto afterSalesService) {
@@ -65,11 +70,14 @@
     @Override
     public boolean addAfterSalesServiceDto(AfterSalesServiceNewDto afterSalesServiceNewDto) {
         afterSalesServiceNewDto.setStatus(1);
-        if (afterSalesServiceNewDto.getProductModelIdList() != null && afterSalesServiceNewDto.getProductModelIdList().isEmpty() ) {
+        if (afterSalesServiceNewDto.getProductModelIdList() != null && !afterSalesServiceNewDto.getProductModelIdList().isEmpty() ) {
             String productModelIds = afterSalesServiceNewDto.getProductModelIdList().stream()
                     .map(String::valueOf)
                     .collect(Collectors.joining(","));
             afterSalesServiceNewDto.setProductModelIds(productModelIds);
+        }
+        if (afterSalesServiceNewDto.getAfterSalesProductList() != null && !afterSalesServiceNewDto.getAfterSalesProductList().isEmpty()) {
+            afterSalesServiceNewDto.setAfterSalesProducts(JSON.toJSONString(afterSalesServiceNewDto.getAfterSalesProductList()));
         }
         SysUser sysUser = sysUserMapper.selectUserById(afterSalesServiceNewDto.getCheckUserId());
         if(sysUser == null) throw new RuntimeException("瀹℃牳浜轰笉瀛樺湪");
@@ -78,7 +86,26 @@
             String string = OrderUtils.countAfterServiceTodayByCreateTime(afterSalesServiceMapper, "SH_");
             afterSalesServiceNewDto.setAfterSalesServiceNo(string);
         }
-        return this.save(afterSalesServiceNewDto);
+        boolean saved = this.save(afterSalesServiceNewDto);
+        
+        if (saved && afterSalesServiceNewDto.getSalesLedgerId() != null) {
+            try {
+                SalesLedger salesLedger = salesLedgerService.getById(afterSalesServiceNewDto.getSalesLedgerId());
+                if (salesLedger != null && StringUtils.isNotEmpty(salesLedger.getEntryPerson())) {
+                    Long entryUserId = Long.parseLong(salesLedger.getEntryPerson());
+                    String webPath = "/customerService/afterSalesHandling?afterSalesServiceNo=" + afterSalesServiceNewDto.getAfterSalesServiceNo();
+                    sysNoticeService.simpleNoticeByUser(
+                        "鏂板鍞悗鍗曢�氱煡",
+                        "鎮ㄥ綍鍏ョ殑閿�鍞鍗曟湁涓�鏉℃柊鐨勫敭鍚庤褰曪紝鍞悗鍗曞彿锛�" + afterSalesServiceNewDto.getAfterSalesServiceNo(),
+                        Collections.singletonList(entryUserId),
+                        webPath
+                    );
+                }
+            } catch (Exception e) {
+                log.error("鍙戦�佸敭鍚庢柊澧為�氱煡澶辫触: ", e);
+            }
+        }
+        return saved;
     }
 
     @Override
@@ -87,6 +114,19 @@
         SalesLedger byId = salesLedgerService.getById(afterSalesService.getSalesLedgerId());
         List<Long> collect = Arrays.stream(afterSalesService.getProductModelIds().split(",")).map(Long::valueOf).collect(Collectors.toList());
         List<SalesLedgerProduct> list = salesLedgerProductService.list(new QueryWrapper<SalesLedgerProduct>().lambda().in(SalesLedgerProduct::getId, collect));
+        
+        if (StringUtils.isNotEmpty(afterSalesService.getAfterSalesProducts())) {
+            List<com.ruoyi.aftersalesservice.dto.AfterSalesProductDto> afterSalesProductList = com.alibaba.fastjson2.JSON.parseArray(afterSalesService.getAfterSalesProducts(), com.ruoyi.aftersalesservice.dto.AfterSalesProductDto.class);
+            for (SalesLedgerProduct product : list) {
+                for (com.ruoyi.aftersalesservice.dto.AfterSalesProductDto productDto : afterSalesProductList) {
+                    if (product.getId().equals(productDto.getId())) {
+                        product.setAfterSalesQuantity(productDto.getAfterSalesQuantity());
+                        break;
+                    }
+                }
+            }
+        }
+
         AfterSalesServiceNewDto afterSalesServiceNewDto = new AfterSalesServiceNewDto();
         BeanUtils.copyProperties(afterSalesService, afterSalesServiceNewDto);
         SalesLedgerDto salesLedgerDto = new SalesLedgerDto();
diff --git a/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java b/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java
index c8a2f54..28ec77c 100644
--- a/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java
+++ b/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java
@@ -152,11 +152,11 @@
                 .map(it -> convertSysNotice(title, message, it, tenantId, jumpPath, unipushService.convertWebPathToAppPath(jumpPath), userId))
                 .collect(Collectors.toList());
         sysNoticeService.saveBatch(sysNotices);
-//        try {
-//            unipushService.sendClientMessage(sysNotices);
-//        } catch (Exception e) {
-//            log.error("APP鎺ㄩ�侀�氱煡澶辫触锛屽師鍥�: {}", e);
-//        }
+        try {
+            unipushService.sendClientMessage(sysNotices);
+        } catch (Exception e) {
+            log.error("APP鎺ㄩ�侀�氱煡澶辫触锛屽師鍥�: {}", e);
+        }
     }
 
     @Override
@@ -209,11 +209,11 @@
                 .collect(Collectors.toList());
 
         sysNoticeService.saveBatch(collect);
-//        try {
-//            unipushService.sendClientMessage(collect);
-//        } catch (Exception e) {
-//            log.error("APP鎺ㄩ�侀�氱煡澶辫触锛屽師鍥�: {}", e);
-//        }
+        try {
+            unipushService.sendClientMessage(collect);
+        } catch (Exception e) {
+            log.error("APP鎺ㄩ�侀�氱煡澶辫触锛屽師鍥�: {}", e);
+        }
     }
 
 
diff --git a/src/main/java/com/ruoyi/project/system/service/impl/UnipushService.java b/src/main/java/com/ruoyi/project/system/service/impl/UnipushService.java
index a6e97f4..01604ef 100644
--- a/src/main/java/com/ruoyi/project/system/service/impl/UnipushService.java
+++ b/src/main/java/com/ruoyi/project/system/service/impl/UnipushService.java
@@ -146,6 +146,26 @@
     }
 
     /**
+     * 鍙戦�佺洿鎺ヨ矾鐢辨帹閫侊紙涓嶇粡杩嘢ysNotice琛級
+     */
+    public void sendDirectRoutingPushToUser(Long userId, String title, String content, String webPath) {
+        SysUserClient client = userClientService.getById(userId);
+        if (client == null || StringUtils.isEmpty(client.getCid())) {
+            log.warn("鐢ㄦ埛 {} 鏈粦瀹氱Щ鍔ㄧ CID,璺宠繃鐩存帴鎺ㄩ��", userId);
+            return;
+        }
+        String appPath = convertWebPathToAppPath(webPath);
+        sendRoutingPush(
+                System.currentTimeMillis(),
+                client.getCid(),
+                title,
+                content,
+                appPath,
+                false
+        );
+    }
+
+    /**
      * 鍙戦�佸崟浜鸿矾鐢辨帹閫�
      */
     private void sendRoutingPush(Long noticeId, String cid, String title, String content, String targetPath) {
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 12b54a5..8dce06f 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -351,6 +351,9 @@
     @TableField(exist = false)
     private BigDecimal availableQuality;
 
+    @TableField(exist = false)
+    @ApiModelProperty("鍞悗鏁伴噺")
+    private BigDecimal afterSalesQuantity;
 
     public void fillRemainingQuantity() {
         BigDecimal q = this.quantity == null ? BigDecimal.ZERO : this.quantity;

--
Gitblit v1.9.3