111
k94314517
2025-03-05 97f0349543ba83e6cdf69d99328f811bee40102e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package com.doumee.core.dingding;
 
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponse;
import com.aliyun.tea.TeaException;
import com.doumee.core.constants.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.business.model.BikeRepair;
import com.doumee.dao.business.model.Sites;
import com.doumee.dao.business.web.request.RepairRequest;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
 
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
 
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2022/12/7 11:16
 */
public class DingDingNotice {
 
 
    /**
     * 钉钉机器人 加签
     * @param timestamp
     * @param secret
     * @return
     * @throws Exception
     */
    public static String getSign(Long timestamp, String secret)  throws Exception{
        String stringToSign = timestamp + "\n" + secret;
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
        String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
        return sign;
    }
 
 
    /**
     * 钉钉通知 - 车辆异常上报
     * @param repairRequest
     * @param ddUrl
     * @throws Exception
     */
    public static void bikeRepair(RepairRequest repairRequest, String ddUrl , String secret)  throws Exception{
        Long timestamp = System.currentTimeMillis();
        Map<String,Object> content = new HashMap<>();
        content.put("msgtype","text");
        Map<String,String> text = new HashMap<>();
        text.put("content","【故障上报】车辆编号:"+repairRequest.getBikeCode()+",位置:"+repairRequest.getAddr()+",联系电话:"+repairRequest.getLinkphone()+",请及时查看处理。");
        content.put("text",text);
        HttpsUtil.post(ddUrl+"&timestamp="+timestamp+"&sign="+getSign(timestamp,secret), JSONObject.toJSONString(content),"application/json",false);
    }
    /**
     * 钉钉通知 - 站点通信异常上报
     * @throws Exception
     */
    public static void siteNoLink(List<Sites> siteList,String token,String robotCode,String chatToken)  throws Exception{
 
        Long timestamp = System.currentTimeMillis();
        Map<String,Object> content = new HashMap<>();
        String  desc = "";
        if(siteList.size() == 1){
            desc = "【站点异常上报】站点【"+siteList.get(0).getId()+"】,自【"+ DateUtil.getPlusTime2(siteList.get(0).getLastLinkDate())+"】后未收到通讯请求,请及时查看处理\n";
        }else{
            desc = "【站点异常上报】 以下站点通讯发生异常,请及时查看处理:\n";
            for (Sites site : siteList){
                desc += "站点【"+site.getId()+"】,自【"+ DateUtil.getPlusTime2(site.getLastLinkDate())+"】后未收到通讯请求\n";
            }
        }
 
  /*       //停用旧版本通知
        Map<String,String> text = new HashMap<>();
        text.put("content",desc);
        content.put("msgtype","text");
 
        content.put("text",text);
        HttpsUtil.post(ddUrl+"&timestamp="+timestamp+"&sign="+getSign(timestamp,secret), JSONObject.toJSONString(content),"application/json",false);
     */   //使用新版本通知
 
        sendNoticeNew(desc,token,robotCode,chatToken);
    }
 
 
    public static void lowVoltageNotice(String bikeCode,String place,String siteName,String token,String robotCode,String chatToken)throws Exception{
        String desc = "【低电量提醒】车辆编号:{车辆编号},当前位置:{定位位置},当前站点:{站点名称}。";
        if(StringUtils.isBlank(bikeCode)){
            return;
        }
        desc=  desc.replace("{车辆编号}",bikeCode);
        desc= desc.replace("{定位位置}",StringUtils.defaultString(place,"未知"));
        desc= desc.replace("{站点名称}",StringUtils.defaultString(siteName,"未知"));
        sendNoticeNew(desc,token,robotCode,chatToken);
    }
 
 
    /**
     * 钉钉通知 - 站点储车告警
     * @param siteName
     * @param type 0=超出 1=低于
     * @param warnVal 报警值
     * @throws Exception
     */
    public static void reservesNotice(String siteName, Integer type, BigDecimal warnVal,String token,String robotCode,String chatToken)  throws Exception{
        Long timestamp = System.currentTimeMillis();
        String desc ="【站点储车告警】"+siteName+",储车量"+(type.equals(Constants.ZERO)?"超出":"低于")+warnVal+"%,请及时进行车辆调配";
        sendNoticeNew(desc,token,robotCode,chatToken);
    }
 
 
    public static void sendNoticeNew( String notice,String token,String robotCode,String chatToken) throws Exception {
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.protocol = "https";
        config.regionId = "central";
        com.aliyun.dingtalkrobot_1_0.Client client = new com.aliyun.dingtalkrobot_1_0.Client(config);
        com.aliyun.dingtalkrobot_1_0.models.OrgGroupSendHeaders orgGroupSendHeaders = new com.aliyun.dingtalkrobot_1_0.models.OrgGroupSendHeaders();
        orgGroupSendHeaders.xAcsDingtalkAccessToken = token;
        com.aliyun.dingtalkrobot_1_0.models.OrgGroupSendRequest orgGroupSendRequest = new com.aliyun.dingtalkrobot_1_0.models.OrgGroupSendRequest()
                .setMsgParam("{\"content\":\""+notice+"\"}")
                .setMsgKey("sampleText")
                .setRobotCode(robotCode)
                .setToken(chatToken);
        try {
            client.orgGroupSendWithOptions(orgGroupSendRequest, orgGroupSendHeaders, new com.aliyun.teautil.models.RuntimeOptions());
        } catch (TeaException err) {
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
            }
 
        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
            }
 
        }
    }
 
    public static String getToken(String appKey,String appSecret) throws Exception {
 
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
        config.protocol = "https";
        config.regionId = "central";
        com.aliyun.dingtalkoauth2_1_0.Client client = new com.aliyun.dingtalkoauth2_1_0.Client(config);
        com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest getAccessTokenRequest = new com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest();
        getAccessTokenRequest.setAppKey(appKey);
        getAccessTokenRequest.setAppSecret(appSecret);
        try {
            GetAccessTokenResponse response =  client.getAccessToken(getAccessTokenRequest);
            return response.getBody().getAccessToken();
        } catch (TeaException err) {
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
            }
        } catch (Exception _err) {
            TeaException err = new TeaException(_err.getMessage(), _err);
            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
                // err 中含有 code 和 message 属性,可帮助开发定位问题
            }
 
        }
        return  null;
    }
 
    public static void main(String[] args) throws Exception {
 
        String token = "ddedf254eb76334184ab7c98d8bde50a";
 
    }
}