From 782fd5a0e5ddd89596ccc74fa717a01e2c894dd2 Mon Sep 17 00:00:00 2001 From: wangw <1594593906@qq.com> Date: Mon, 26 Jan 2026 15:54:25 +0800 Subject: [PATCH] =?UTF-8?q?=E9=93=B6=E6=94=B6=E5=AE=A2=20=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E6=B6=88=E6=81=AF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 2 +- .../impl/ConsStockFlowServiceImpl.java | 31 +---- .../impl/ProductStockFlowServiceImpl.java | 8 +- .../service/product/util/WxAccountUtil.java | 120 ++++++++---------- 4 files changed, 61 insertions(+), 100 deletions(-) diff --git a/cash-api/product-server/src/main/resources/application.yml b/cash-api/product-server/src/main/resources/application.yml index 1fce90b04..44f33b8ae 100644 --- a/cash-api/product-server/src/main/resources/application.yml +++ b/cash-api/product-server/src/main/resources/application.yml @@ -21,7 +21,7 @@ wx: appId: wx212769170d2c6b2a secrete: 8492a7e8d55bbb1b57f5c8276ea1add0 operationMsgTmpId: wFdoUG-dUT7bDRHq8bMJD9CF5TjyH9x_uJQgQByZqHg - warnMsgTmpId: C08OUr80x6wGmUN1zpFhSQ3Sv7VF5vksdZigiEx2pD0 + warnMsgTmpId: C08OUr80x6wGmUN1zpFhSZyFA2G6b9_jiZgEppzLB70 diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java index 810521a0c..e6022211e 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ConsStockFlowServiceImpl.java @@ -53,18 +53,6 @@ public class ConsStockFlowServiceImpl extends ServiceImpl entityList = BeanUtil.copyToList(param.getBodyList(), ConsStockFlow.class); List insertList = new ArrayList<>(); List updateStockList = new ArrayList<>(); for (ConsInOutStockBodyParam entity : param.getBodyList()) { @@ -251,15 +238,7 @@ public class ConsStockFlowServiceImpl extends ServiceImpl { - openIdList.parallelStream().forEach(openId -> { - wxAccountUtil.sendStockMsg(finalShopName, conName, afterNumber, openId); - }); - }); + ThreadUtil.execAsync(() -> openIdList.parallelStream().forEach(openId -> + wxAccountUtil.sendStockMsg("耗材库存预警", shopName, conName, afterNumber, openId))); } } } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductStockFlowServiceImpl.java b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductStockFlowServiceImpl.java index b2960d2bf..83a42ae40 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductStockFlowServiceImpl.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/service/impl/ProductStockFlowServiceImpl.java @@ -53,12 +53,8 @@ public class ProductStockFlowServiceImpl extends ServiceImpl { - openIdList.parallelStream().forEach(openId -> { - wxAccountUtil.sendStockMsg(finalShopName, conName, afterNumber, openId); - }); - }); + ThreadUtil.execAsync(() -> openIdList.parallelStream().forEach(openId -> + wxAccountUtil.sendStockMsg("商品库存预警", shopName, conName, afterNumber, openId))); } } } diff --git a/cash-service/product-service/src/main/java/com/czg/service/product/util/WxAccountUtil.java b/cash-service/product-service/src/main/java/com/czg/service/product/util/WxAccountUtil.java index 6e8f2b9f7..589fc6e36 100644 --- a/cash-service/product-service/src/main/java/com/czg/service/product/util/WxAccountUtil.java +++ b/cash-service/product-service/src/main/java/com/czg/service/product/util/WxAccountUtil.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; +import com.czg.exception.CzgException; import com.czg.service.RedisService; import jakarta.annotation.Resource; import lombok.Data; @@ -16,7 +17,6 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import java.math.BigDecimal; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -32,6 +32,7 @@ import java.util.Map; @Component public class WxAccountUtil { + //银收客公众号推送 @Value("${wx.ysk.appId}") private String appId = "wx212769170d2c6b2a"; @Value("${wx.ysk.secrete}") @@ -59,84 +60,73 @@ public class WxAccountUtil { linkedHashMap.put("47003", "参数错误"); } - public String getAccessToken() { - String accessToken = Convert.toStr(redisService.get("accessToken")); - if (StrUtil.isNotEmpty(accessToken)) { - return accessToken; - } - String resp = HttpUtil.get(StrUtil.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}", appId, secrete)); - JSONObject respInfo = JSONObject.parseObject(resp); - if (!respInfo.containsKey("access_token")) { - log.warn("公众号获取token失败, 响应内容: {}", resp); - throw new RuntimeException(resp); - } - accessToken = respInfo.getString("access_token"); - int expiresIn = respInfo.getInteger("expires_in"); - redisService.set("accessToken", accessToken, expiresIn - 10); - return accessToken; - } - - public JSONObject sendTemplateMsg(String templateId, String toUserOpenId, Map data) { - log.info("开始发送微信模板消息, 接收用户openId: {}, 消息数据: {}", toUserOpenId, data); - String accessToken = getAccessToken(); - - JSONObject object1 = new JSONObject(); - - object1.put("template_id", templateId); - object1.put("touser", toUserOpenId); - object1.put("data", data); - - String response = HttpRequest.post("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".concat(accessToken)).body(object1.toString()).execute().body(); - log.info("微信模板消息发送成功,响应内容:{}", response); - JSONObject resObj = JSONObject.parseObject(response); - if (ObjectUtil.isNotEmpty(resObj) && ObjectUtil.isNotNull(resObj) && "0".equals(resObj.get("errcode") + "")) { - return resObj; - } - - throw new RuntimeException(linkedHashMap.getOrDefault(resObj.get("errcode") + "", "未知错误")); - } - public void sendOperationMsg(List openIdList, String userName, String operationDesc) { openIdList.forEach(openId -> { - Map data = new HashMap() {{ - put("thing19", new HashMap() {{ - put("value", userName); - }}); - put("thing8", new HashMap() {{ - put("value", StrUtil.sub(operationDesc,0,20)); - }}); - put("time21", new HashMap() {{ - put("value", DateUtil.format(DateUtil.date(), "yyyy-MM-dd HH:mm:ss")); - }}); - }}; - log.info("开始发送敏感操作消息, 接收用户openId: {}, 操作用户: {}, 操作描述: {}", openId, userName, operationDesc); + Map data = Map.of( + "thing19", Map.of("value", userName), + "thing8", Map.of("value", StrUtil.sub(operationDesc, 0, 20)), + "time21", Map.of("value", DateUtil.format(DateUtil.date(), "yyyy-MM-dd HH:mm:ss")) + ); try { - sendTemplateMsg(operationMsgTmpId, openId, data); + sendTemplateMsg("敏感操作", operationMsgTmpId, openId, data); } catch (Exception e) { log.error("发送失败, openId: {}, 响应: {}", openId, e.getMessage()); } }); } - public void sendStockMsg(String shopName, String productName, BigDecimal stockNum, String openId) { + public void sendStockMsg(String typeName, String shopName, String productName, BigDecimal stockNum, String openId) { String stockNumStr = stockNum.toPlainString(); - Map data = new HashMap() {{ - put("thing22", new HashMap() {{ - put("value", shopName); - }}); - put("thing4", new HashMap() {{ - put("value", productName); - }}); - put("number5", new HashMap() {{ - put("value", stockNumStr); - }}); - }}; - log.info("开始发送库存预警消息, 接收用户openId: {}, 消息数据: {}", openId, data); + Map data = Map.of( + //品名 + "thing34", Map.of("value", typeName), + //商品名称 + "thing4", Map.of("value", productName), + //商品数量 + "number5", Map.of("value", stockNumStr), + //商家名称 + "thing22", Map.of("value", shopName) + ); try { - sendTemplateMsg(warnMsgTmpId, openId, data); + sendTemplateMsg("库存预警", warnMsgTmpId, openId, data); } catch (Exception e) { log.error("发送失败, openId:{}, msg: {}", openId, e.getMessage()); } } + public String getAccessToken() { + synchronized (this) { + String accessToken = Convert.toStr(redisService.get("accessToken")); + if (StrUtil.isNotEmpty(accessToken)) { + return accessToken; + } + String resp = HttpUtil.get(StrUtil.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={}&secret={}", appId, secrete)); + JSONObject respInfo = JSONObject.parseObject(resp); + if (!respInfo.containsKey("access_token")) { + log.warn("公众号获取token失败, 响应内容: {}", resp); + throw new RuntimeException(resp); + } + accessToken = respInfo.getString("access_token"); + int expiresIn = respInfo.getInteger("expires_in"); + redisService.set("accessToken", accessToken, expiresIn - 10); + return accessToken; + } + } + + public JSONObject sendTemplateMsg(String detail, String templateId, String toUserOpenId, Map data) { + log.info("银收客公众号消息推送,消息类型:{} 接收用户openId: {}, 消息数据: {}", detail, toUserOpenId, data); + String accessToken = getAccessToken(); + JSONObject object1 = new JSONObject(); + object1.put("template_id", templateId); + object1.put("touser", toUserOpenId); + object1.put("data", data); + + String response = HttpRequest.post("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".concat(accessToken)).body(object1.toString()).execute().body(); + log.info("银收客公众号消息推送,响应内容:{}", response); + JSONObject resObj = JSONObject.parseObject(response); + if (ObjectUtil.isNotEmpty(resObj) && ObjectUtil.isNotNull(resObj) && "0".equals(resObj.get("errcode") + "")) { + return resObj; + } + throw new CzgException(linkedHashMap.getOrDefault(resObj.get("errcode") + "", "未知错误")); + } }