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