From 4f2925f1974844b66225ac70ae35065b8262b315 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期四, 04 十二月 2025 13:26:11 +0800
Subject: [PATCH] feat:增加微信token缓存

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatTaskNotifyServiceImpl.java |   80 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 76 insertions(+), 4 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatTaskNotifyServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatTaskNotifyServiceImpl.java
index 48833d3..6b91981 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatTaskNotifyServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/WechatTaskNotifyServiceImpl.java
@@ -5,12 +5,17 @@
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.WechatUtils;
-import com.ruoyi.system.domain.SysTask;
-import com.ruoyi.system.domain.SysTaskEmergency;
+import com.ruoyi.system.domain.SysConfig;
+import com.ruoyi.system.mapper.SysConfigMapper;
 import com.ruoyi.system.mapper.SysTaskEmergencyMapper;
 import com.ruoyi.system.mapper.SysTaskMapper;
+import com.ruoyi.system.domain.SysTask;
+import com.ruoyi.system.domain.SysTaskEmergency;
 import com.ruoyi.system.mapper.SysUserMapper;
 import com.ruoyi.system.service.IWechatTaskNotifyService;
+import com.ruoyi.system.service.ISysConfigService;
+import com.ruoyi.system.mapper.SysConfigMapper;
+import com.ruoyi.system.domain.SysConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,6 +49,73 @@
     @Autowired
     private WechatConfig wechatConfig;
     
+    @Autowired
+    private ISysConfigService configService;
+    
+    @Autowired
+    private SysConfigMapper configMapper;
+    
+    
+    /**
+     * 鑾峰彇搴旂敤绾у井淇ccessToken锛堝甫缂撳瓨锛�
+     * 浼樺厛浠巗ys_config璇诲彇骞跺垽鏂湁鏁堟湡锛涜繃鏈熷垯閲嶆柊鑾峰彇骞跺啓鍥瀞ys_config
+     */
+    private String getAppAccessToken() {
+        try {
+            String appId = wechatConfig.getAppId();
+            String tokenKey = "weixin.access_token." + appId;
+            String expireKey = "weixin.access_token_expires." + appId;
+            
+            String cachedToken = configService.selectConfigByKey(tokenKey);
+            String cachedExpireStr = configService.selectConfigByKey(expireKey);
+            long now = System.currentTimeMillis();
+            long expireTs = 0L;
+            if (StringUtils.isNotEmpty(cachedExpireStr)) {
+                try {
+                    expireTs = Long.parseLong(cachedExpireStr);
+                } catch (NumberFormatException e) {
+                    expireTs = 0L;
+                }
+            }
+            
+            // 缂撳瓨鏈夋晥涓旀湭杩囨湡锛堥鐣�60绉掑畨鍏ㄨ竟鐣岋級
+            if (StringUtils.isNotEmpty(cachedToken) && expireTs > now + 60000L) {
+                return cachedToken;
+            }
+            
+            // 閲嶆柊鑾峰彇锛屽苟鍐欏叆sys_config
+            String newToken = WechatUtils.getAccessToken(wechatConfig.getAppId(), wechatConfig.getAppSecret());
+            if (StringUtils.isEmpty(newToken)) {
+                return null;
+            }
+            long newExpireTs = now + 7200L * 1000L; // 7200绉�
+            upsertConfig(tokenKey, newToken);
+            upsertConfig(expireKey, String.valueOf(newExpireTs));
+            return newToken;
+        } catch (Exception e) {
+            log.error("鑾峰彇搴旂敤绾у井淇ccessToken澶辫触", e);
+            return null;
+        }
+    }
+    
+    /**
+     * 鏍规嵁configKey鍐欏叆鎴栨洿鏂皊ys_config
+     */
+    private void upsertConfig(String key, String value) {
+        SysConfig exist = configMapper.checkConfigKeyUnique(key);
+        if (exist != null && exist.getConfigId() != null) {
+            exist.setConfigValue(value);
+            configMapper.updateConfig(exist);
+        } else {
+            SysConfig cfg = new SysConfig();
+            cfg.setConfigKey(key);
+            cfg.setConfigName(key);
+            cfg.setConfigValue(value);
+            cfg.setConfigType("Y"); // 鍐呯疆鍙傛暟
+            configMapper.insertConfig(cfg);
+        }
+    }
+    
     /**
      * 鍙戦�佷换鍔¢�氱煡娑堟伅缁欐寚瀹氱敤鎴峰垪琛�
      * 
@@ -69,8 +141,8 @@
         // 鏌ヨ鎬ユ晳淇℃伅
         SysTaskEmergency emergency = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(taskId);
         
-        // 鑾峰彇寰俊AccessToken
-        String accessToken = WechatUtils.getAccessToken(wechatConfig.getAppId(), wechatConfig.getAppSecret());
+        // 鑾峰彇寰俊AccessToken锛堣蛋搴旂敤绾х紦瀛橈級
+        String accessToken = getAppAccessToken();
         if (StringUtils.isEmpty(accessToken)) {
             log.error("鑾峰彇寰俊AccessToken澶辫触锛屾棤娉曞彂閫佷换鍔¢�氱煡");
             return 0;

--
Gitblit v1.9.1