From 4b2b0ec05306c285cff9f95064cf70b5e6e37516 Mon Sep 17 00:00:00 2001
From: sgj <1442489573@qq.com>
Date: 星期三, 15 四月 2026 11:14:52 +0800
Subject: [PATCH] 添加微信消息推送工具类

---
 fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/WxUtil.java             |  181 ++++++++++++++++++++++++++++++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/Template.java            |   41 ++++++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/data/TemplateParam.java       |   24 ++++
 fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapReplyService.java |   56 +++++++++
 4 files changed, 301 insertions(+), 1 deletions(-)

diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/Template.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/Template.java
new file mode 100644
index 0000000..61731c5
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/Template.java
@@ -0,0 +1,41 @@
+package com.fzzy.igds.data;
+
+
+import lombok.Data;
+
+import java.util.Map;
+
+/**
+ * 妯℃澘娑堟伅绫�
+ *
+ * @author chen
+ */
+@Data
+public class Template {
+
+    /**
+     * 鎺ユ敹鑰卭penid
+     */
+    private String touser;
+
+    /**
+     * 妯℃澘id
+     */
+    private String template_id;
+
+    /**
+     * 璇︽儏璺緞
+     */
+    private String url;
+
+    /**
+     * 鏍囬棰滆壊
+     */
+    private String topcolor;
+
+    /**
+     * 鏁版嵁
+     */
+    private Map<String, TemplateParam> data;
+
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/TemplateParam.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/TemplateParam.java
new file mode 100644
index 0000000..cf8d5b6
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/data/TemplateParam.java
@@ -0,0 +1,24 @@
+package com.fzzy.igds.data;
+
+
+import lombok.Data;
+
+/**
+ * 妯℃澘娑堟伅鏁版嵁绫�
+ * @author chen
+ */
+@Data
+public class TemplateParam {
+
+    private String value;
+
+    private String color;
+
+    public TemplateParam() {
+    }
+
+    public TemplateParam(String value, String color) {
+        this.value = value;
+        this.color = color;
+    }
+}
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapReplyService.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapReplyService.java
index bea91cd..7d134f6 100644
--- a/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapReplyService.java
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/service/SnapReplyService.java
@@ -8,6 +8,7 @@
 import com.fzzy.igds.domain.SnapReply;
 import com.fzzy.igds.mapper.SnapReplyMapper;
 import com.fzzy.igds.utils.ContextUtil;
+import com.fzzy.igds.utils.WxUtil;
 import com.ruoyi.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -22,6 +23,8 @@
 
     @Resource
     private SnapReplyMapper snapReplyMapper;
+    @Resource
+    private WxUtil weChatUtil;
 
 
     /**
@@ -53,7 +56,7 @@
     }
 
     public void listPageByListDept(Page<SnapReply> page, IgdsBaseParam param, List<String> listDept) {
-        if( listDept == null || listDept.isEmpty()){
+        if (listDept == null || listDept.isEmpty()) {
             return;
         }
 
@@ -166,4 +169,55 @@
         return snapReplyMapper.deleteById(snapReply) > 0 ? BaseResp.success() : BaseResp.error("鍒犻櫎澶辫触");
     }
 
+
+
+    /**
+     * 鍙戦�佽鍛婂埌寰俊
+     * @param deptId
+     */
+    public BaseResp sendNotice(String deptId){
+        //todo 鏈畬鎴�
+        if(StringUtils.isEmpty(deptId)){
+            return BaseResp.error("璇烽�夋嫨搴撳尯");
+        }
+
+
+//        //闇�瑕佹帹閫佺殑鐢ㄦ埛
+//        List<SysUser> users= new ArrayList<>();
+//        String res = "";
+//        //閬嶅巻鐢ㄦ埛锛屽彂閫佸井淇℃秷鎭�
+//        for (SysUser user : users) {
+//            if(StringUtils.isNotEmpty(user.getOpenId())){
+//                boolean b = weChatUtil.sendMessage(
+//                        user.getOpenId(),
+//                        snapReply.getId(),
+//                        snapReply.getCompanyId(),
+//                        "搴撳尯鍛婅鎵瑰娴嬭瘯鎺ㄩ��",
+//                        snapReply.getDeptId(),
+//                        snapReply.getContent(),
+//                        DateFormatUtils.format(snapReply.getCreateTime(),"yyyy-MM-dd HH:mm:ss"),
+//                        "",
+//                        "",
+//                        user.getUserName());
+//                if(!b){
+//                    res += user.getUserName() + "鐢ㄦ埛寰俊鎺ㄩ�佸け璐�,";
+//                    return BaseResp.error(res);
+//
+//                }
+//            }else{
+//                log.debug("------鐢ㄦ埛openid涓嶅瓨鍦紝涓嶈繘琛屾帹閫�------");
+//                res += user.getUserName() + "鐢ㄦ埛鏈粦瀹�,";
+//                return BaseResp.error(res);
+//
+//            }
+//        }
+//        if(StringUtils.isEmpty(res)){
+//            return BaseResp.success("寰俊:鎺ㄩ�佹垚鍔�;");
+//        }else{
+//            return BaseResp.error("寰俊:"+res+";");
+//        }
+        return BaseResp.success("寰俊:鎺ㄩ�佹垚鍔�;");
+
+    }
+
 }
diff --git a/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/WxUtil.java b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/WxUtil.java
new file mode 100644
index 0000000..2dbc4f5
--- /dev/null
+++ b/fzzy-igdss-core/src/main/java/com/fzzy/igds/utils/WxUtil.java
@@ -0,0 +1,181 @@
+package com.fzzy.igds.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fzzy.igds.data.ConfigData;
+import com.fzzy.igds.data.Template;
+import com.fzzy.igds.data.TemplateParam;
+import com.ruoyi.common.core.redis.RedisCache;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+
+@Slf4j
+@Component
+public class WxUtil {
+
+    /**
+     * 鍏紬鍙疯皟鐢ㄥ叏灞�鎺ュ彛鐨勬爣璇咥CCESS_TOKEN缂撳瓨key
+     */
+    public static final String ACCESS_TOKEN = "ACCESS_TOKEN";
+
+    /**
+     * 妯℃澘娑堟伅鍙戦�乽rl
+     */
+    public static final String TEMPLATE_URL =
+            "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
+
+    /**
+     * 鑾峰彇access_token鐨勬帴鍙e湴鍧�(GET , 2000娆�/澶�)
+     */
+    public static final String ACCESS_TOKEN_URL =
+            "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private ConfigData configData;
+
+    @Resource
+    private RedisCache redisCache;
+
+
+
+    /**
+     * 鍙戦�佹ā鏉挎秷鎭�
+     * @param openid    鐢ㄦ埛openid
+     * @param warnId    璀﹀憡id
+     * @param companyId 缁勭粐id
+     * @param title     璀﹀憡鏍囬
+     * @param keyword1  璀﹀憡瀵硅薄
+     * @param keyword2  璀﹀憡绫诲瀷
+     * @param keyword3  璀﹀憡鏃堕棿
+     * @param keyword4  璀﹀憡鍐呭
+     * @param remark    璀﹀憡璇︽儏
+     * @return
+     */
+    public boolean sendMessage(String openid, String warnId, String companyId, String title,
+                               String keyword1, String keyword2, String keyword3,
+                               String keyword4,String remark, String userName){
+
+        Template tem = new Template();
+        tem.setTemplate_id(configData.getWxTempId());
+        tem.setTopcolor("#FF0000");
+
+        tem.setTouser(openid);
+        tem.setUrl(configData.getWxServeUrl() + "/wx/view-gateway?state=warn-detail1&id=" + warnId + "&companyId=" + companyId + "&userName=" + userName);
+
+        Map<String, TemplateParam> params = new HashMap<>();
+        params.put("first",new TemplateParam(title,"#173177"));
+        //璀﹀憡瀵硅薄
+        params.put("keyword1",new TemplateParam( keyword1, "#173177"));
+        //璀﹀憡绫诲瀷
+        params.put("keyword2",new TemplateParam( keyword2, "#173177"));
+        //璀﹀憡鏃堕棿
+        params.put("keyword3",new TemplateParam( keyword3, "#173177"));
+        //璀﹀憡鍐呭
+        params.put("keyword4",new TemplateParam( keyword4, "#173177"));
+        params.put("remark",new TemplateParam( remark, "#173177"));
+
+        tem.setData(params);
+        log.debug("------寰俊閫氱煡寮�濮嬫帹閫�------");
+        //鎺ㄩ�佹秷鎭�
+        return sendTemplateMsg(tem);
+    }
+
+
+
+    /**
+     * 鎺ㄩ�佹ā鏉挎秷鎭�
+     *
+     * @param template
+     * @return
+     */
+    public boolean sendTemplateMsg(Template template) {
+        //鑾峰彇AccessToken
+        String accessToken = getAccessToken();
+        if(StringUtils.isEmpty(accessToken)){
+            log.debug("------鑾峰彇AccessToken澶辫触------");
+            return false;
+        }
+
+        boolean flag = false;
+        String url = WxUtil.TEMPLATE_URL.replace("ACCESS_TOKEN",accessToken);
+        String str = JSONObject.toJSONString(template);
+        JSONObject jsonObject = doPost(url, str);
+        if (jsonObject != null) {
+            int errorCode = jsonObject.getIntValue("errcode");
+            String errorMessage = jsonObject.getString("errmsg");
+            if (errorCode == 0) {
+                log.debug("鎺ㄩ�佸井淇℃秷鎭垚鍔燂細" + str);
+                flag = true;
+            } else {
+                log.info("妯℃澘娑堟伅鍙戦�佸け璐},{}", errorCode, errorMessage);
+                log.error("ACCESS_TOKEN:" + accessToken);
+                flag = false;
+            }
+        }
+
+        log.debug("鎺ㄩ�佸井淇℃秷鎭け璐ワ紒" );
+        return flag;
+    }
+
+    /**
+     * 鑾峰彇鍏ㄥ眬AccessToken
+     *
+     * @return
+     */
+    public String getAccessToken() {
+
+        //鍏堜粠缂撳瓨鑾峰彇锛岃嫢涓嶅瓨鍦ㄥ垯閫氳繃鎺ュ彛鑾峰彇
+        String accessToken = (String)redisCache.getCacheObject(WxUtil.ACCESS_TOKEN);
+        if(StringUtils.isNotEmpty(accessToken)){
+            return accessToken;
+        }
+
+        //璇锋眰鑾峰彇AccessToken鐨勫井淇℃帴鍙�
+        String resp = doGet(WxUtil.ACCESS_TOKEN_URL.replace("APPID",
+                configData.getWxAppId()).replace("APPSECRET", configData.getWxSecret()));
+        JSONObject json = JSONObject.parseObject(resp);
+        if (json != null) {
+            //鑾峰彇accessToken
+            accessToken = json.getString("access_token");
+            //鑾峰彇accessToken鏈夋晥鏃堕暱锛屼负7200s
+            int expiresIn = json.getIntValue("expires_in");
+            //灏哸ccessToken瀛樺叆缂撳瓨锛屾湁鏁堟椂闀夸负expiresIn锛屽嵆2灏忔椂
+            redisCache.setCacheObject(WxUtil.ACCESS_TOKEN, accessToken,expiresIn, TimeUnit.SECONDS);
+            return accessToken;
+        }
+        log.error("鑾峰彇access_token澶辫触");
+        return null;
+    }
+    /**
+     * post璇锋眰
+     * @param url
+     * @param data
+     * @return
+     */
+    public JSONObject doPost(String url, String data){
+        ResponseEntity<JSONObject> jsonObject = restTemplate.postForEntity(url, data, JSONObject.class);
+        return jsonObject.getBody();
+    }
+
+    /**
+     * get璇锋眰
+     *
+     * @param url
+     * @return
+     */
+    public String doGet(String url) {
+        return restTemplate.getForObject(url, String.class);
+    }
+}

--
Gitblit v1.9.3