啊鑫
2024-11-18 f61d65290e3d7ba23432a9a017065af0e0636a1a
钉钉推送消息,发送到个人和发送到群聊
已添加14个文件
已修改5个文件
765 ■■■■■ 文件已修改
pom.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/config/DataAcquisitionConfiguration.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/dto/DingTalkMessage.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/dto/DingTalkResponse.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/dto/Result.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/entity/SendDingtalk.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/entity/SendMessage.java 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/mapper/SendDingtalkMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/mapper/SendMessageMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/service/SendDingtalkService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/service/SendMessageService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/service/SimpleExample.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/service/impl/SendDingtalkServiceImpl.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/service/impl/SendMessageServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/dingtalk/task/ScheduledTasks.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/SendDingtalkMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/SendMessageMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -67,6 +67,23 @@
            <version>4.9.3</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dingtalk</artifactId>
            <version>2.0.14</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.11</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
src/main/java/com/gs/dingtalk/config/DataAcquisitionConfiguration.java
@@ -3,9 +3,24 @@
public class DataAcquisitionConfiguration {
    public static final String APP_ID =
            "d18e3c5b-6c75-4383-a1e5-ab3ea126053a";
    /**
     * åº”用的 AgentId
     */
    public static final Long AGENT_ID = 3303296035L;
    /**
     * åº”用的 AppKey
     */
    public static final String APP_KEY = "dingyfqkfjecy4cjfyxa";
    /**
     * åº”用的 AppSecret
     */
    public static final String APP_SECRET = "nCwmyBw8K-EqAvkuhrhhqFonbLp455awtMa4D4Q-VRaY8U2EDEVsnYSYYfPvjiAX";
    public static final String PUBLIC_KEY =
            "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCWc1nZ3OlSTCI6RnLLe+UNtJS05rUUbz4KooGo 4FQpDSPkTJncHHb6dGWleCuWob2gwZo+xYDa7B5s2qmWsqvtbCeRRGsNwuDJku1Idh7S3cWPWYow 9upJGqYmnVv0QQ4AMc2VWerTHUa7ZJSSbZZj+rd+gcbMdjp8GUHZwRI69wIDAQAB";
    public static final String CORP_ID = "ding1dd72cd1d6adf70aa1320dcb25e91351";
    //群聊机器人相关
    public static final String CUSTOM_ROBOT_TOKEN = "c2849e46cb0d91b0721c377742938b8ac5ef57e3c9eeab918e2cd5dd9c3aad2a";
    public static final String SECRET = "SEC382027a5c81ea5152b71b687fb2c1ebf26acbde035355da6ab2fb37306454134";
}
src/main/java/com/gs/dingtalk/dto/DingTalkMessage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.gs.dingtalk.dto;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DingTalkMessage {
    @SerializedName("errcode")
    private int errcode;
    @SerializedName("task_id")
    private Long taskId;
    @SerializedName("request_id")
    private String requestId;
}
src/main/java/com/gs/dingtalk/dto/DingTalkResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.gs.dingtalk.dto;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DingTalkResponse {
    @SerializedName("errcode")
    private int errcode;
    @SerializedName("errmsg")
    private String errmsg;
    @SerializedName("result")
    private Result result;
}
src/main/java/com/gs/dingtalk/dto/Result.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.gs.dingtalk.dto;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import java.util.List;
@Data
public class Result {
    // Getters and Setters
    @SerializedName("exclusive_account_userid_list")
    private List<String> exclusiveAccountUseridList;
    private String userid;
}
src/main/java/com/gs/dingtalk/entity/SendDingtalk.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.gs.dingtalk.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
@Data
@TableName("send_dingtalk")
@KeySequence(value = "SEQ_SEND", dbType = DbType.ORACLE)
public class SendDingtalk implements Serializable {
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
    @TableId
    private Long id;        // ä¸»é”®
    /**
     * é’‰é’‰id
     */
    private String userId;
    /**
     * ç”¨æˆ·å
     */
    private String userName;
    /**
     * æ‰‹æœºå·
     */
    private String telephone;
    /**
     * æŽ¥æ”¶çš„æƒé™ 1:呼叫物料 2:呼叫班长 3:呼叫品质
     */
    private String purview;
    /**
     * äº”分钟该提醒的人  0表示不提醒  1 è¡¨ç¤ºæé†’
     */
    private Integer fiveMinuteReminder;
    /**
     * ä¸‰ååˆ†é’Ÿè¯¥æé†’的人 0表示不提醒  1 è¡¨ç¤ºæé†’
     */
    private Integer thirtyMinuteReminder;
}
src/main/java/com/gs/dingtalk/entity/SendMessage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
package com.gs.dingtalk.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("send_message")
public class SendMessage implements Serializable {
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @TableId(value = "ID")
    private Long id;
    /**
     * å‘送器序号
     */
    private String scallno;
    /**
     * å‘送器ID
     */
    private String snedvalues;
    /**
     * å¼‚常类型
     */
    private String errCode;
    /**
     * äº§çº¿ç¼–号
     */
    private String lineNo;
    /**
     * å·¥åºç¼–号
     */
    private String procNo;
    /**
     * å·¥ä½
     */
    private Integer procLine;
    /**
     * å¼€å§‹å¤„ç½®
     */
    private LocalDateTime recDate;
    /**
     * åˆ›å»ºäºº
     */
    private String createBy;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private LocalDateTime createDate;
    /**
     * æœ€åŽæ›´æ–°äºº
     */
    private String lastupdateBy;
    /**
     * æœ€åŽæ›´æ–°æ—¶é—´
     */
    private LocalDateTime lastupdateDate;
    /**
     * å¤‡æ³¨
     */
    private String memo;
    /**
     * çŠ¶æ€
     */
    private String fstatus;
    /**
     * å¤„理人员
     */
    private String excBy;
    /**
     * å¯¹ç­–完成
     */
    private LocalDateTime excDate;
    /**
     * å¼‚常描述
     */
    private String errMemo;
    /**
     * æŽ¥æ”¶äººå‘˜
     */
    private String recBy;
    /**
     * å¼‚常对策
     */
    private String errExc;
    /**
     * mid
     */
    private Long mid;
    /**
     * å‘送时间
     */
    @TableField("SENDDATE")
    private LocalDateTime sendDate;
    /**
     * äº§çº¿åç§°
     */
    private String lineName;
    /**
     * å·¥åºåç§°
     */
    private String procName;
    /**
     * å¤„理时长
     */
    private Integer timeLength;
    /**
     * (分钟)
     */
    private Integer rem;
}
src/main/java/com/gs/dingtalk/mapper/SendDingtalkMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.gs.dingtalk.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gs.dingtalk.entity.SendDingtalk;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SendDingtalkMapper extends BaseMapper<SendDingtalk> {
}
src/main/java/com/gs/dingtalk/mapper/SendMessageMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.gs.dingtalk.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gs.dingtalk.entity.SendMessage;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SendMessageMapper extends BaseMapper<SendMessage> {
}
src/main/java/com/gs/dingtalk/service/SendDingtalkService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.gs.dingtalk.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gs.dingtalk.entity.SendDingtalk;
public interface SendDingtalkService extends IService<SendDingtalk> {
    void getDingTalkUserId() throws Exception;
    void sendDingTalkFiveMinute() throws Exception;
    void sendDingTalkthirtyMinute() throws Exception;
    void chatSendMessage() throws Exception;
}
src/main/java/com/gs/dingtalk/service/SendMessageService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.gs.dingtalk.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.gs.dingtalk.entity.SendMessage;
import java.util.List;
public interface SendMessageService extends IService<SendMessage> {
    List<SendMessage> getSendMessageList();
}
src/main/java/com/gs/dingtalk/service/SimpleExample.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
package com.gs.dingtalk.service;
import com.aliyun.dingtalkoauth2_1_0.Client;
import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest;
import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.Common;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.dingtalk.api.request.OapiV2UserGetbymobileRequest;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.api.response.OapiRobotSendResponse;
import com.dingtalk.api.response.OapiV2UserGetbymobileResponse;
import com.google.gson.Gson;
import com.gs.dingtalk.config.DataAcquisitionConfiguration;
import com.gs.dingtalk.dto.DingTalkMessage;
import com.gs.dingtalk.dto.DingTalkResponse;
import com.gs.dingtalk.entity.SendDingtalk;
import com.taobao.api.ApiException;
import lombok.RequiredArgsConstructor;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
/**
 * å‘送个人消息
 *
 * @author tjx
 * @date 2024/11/17 16:18
 */
@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class SimpleExample {
    /**
     * ç¾¤é‡Œæœºå™¨äººå‘送消息
     *
     * @author tjx
     * @date 2024/11/18 08:54
     */
    public DingTalkResponse chatSendMessage(String message) throws Exception {
        try {
            Long timestamp = System.currentTimeMillis();
            System.out.println(timestamp);
            String secret = DataAcquisitionConfiguration.SECRET;
            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");
            System.out.println(sign);
            //sign字段和timestamp字段必须拼接到请求URL上,否则会出现 310000 çš„错误信息
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/robot/send?sign=" + sign + "&timestamp=" + timestamp);
            OapiRobotSendRequest req = new OapiRobotSendRequest();
            /**
             * å‘送文本消息
             */
            //定义文本内容
            OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
            text.setContent(message);
            //定义 @ å¯¹è±¡
            OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
            at.setIsAtAll(true);
            //设置消息类型
            req.setMsgtype("text");
            req.setText(text);
            req.setAt(at);
            OapiRobotSendResponse rsp = client.execute(req, DataAcquisitionConfiguration.CUSTOM_ROBOT_TOKEN);
            Gson gson = new Gson();
            return gson.fromJson(rsp.getBody(), DingTalkResponse.class);
        } catch (ApiException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        } catch (InvalidKeyException e) {
            throw new RuntimeException(e);
        }
        return null;
    }
    /**
     * å‘送消息
     */
    public DingTalkMessage sendMessage(String userIdList, String message) throws Exception {
        String accessToken = getAccessToken();
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
        OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
        request.setAgentId(DataAcquisitionConfiguration.AGENT_ID);
        request.setUseridList(userIdList);
        request.setToAllUser(false);
        OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
        msg.setMsgtype("text");
        msg.setText(new OapiMessageCorpconversationAsyncsendV2Request.Text());
        msg.getText().setContent(message);
        request.setMsg(msg);
        OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, accessToken);
        Gson gson = new Gson();
        return gson.fromJson(rsp.getBody(), DingTalkMessage.class);
    }
    /**
     * èŽ·å– AccessToken
     *
     * @return AccessToken
     * @throws Exception
     */
    public String getAccessToken() throws Exception {
        Client client = createClient();
        GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest()
                .setAppKey(DataAcquisitionConfiguration.APP_KEY)
                .setAppSecret(DataAcquisitionConfiguration.APP_SECRET);
        try {
            GetAccessTokenResponse accessToken = client.getAccessToken(getAccessTokenRequest);
            return accessToken.body.getAccessToken();
        } catch (TeaException err) {
            if (!Common.empty(err.code) && !Common.empty(err.message)) {
                // err ä¸­å«æœ‰ code å’Œ message å±žæ€§ï¼Œå¯å¸®åŠ©å¼€å‘å®šä½é—®é¢˜
                System.out.println(err.code);
                System.out.println(err.message);
            }
        } catch (Exception exception) {
            TeaException err = new TeaException(exception.getMessage(), exception);
            if (!Common.empty(err.code) && !Common.empty(err.message)) {
                // err ä¸­å«æœ‰ code å’Œ message å±žæ€§ï¼Œå¯å¸®åŠ©å¼€å‘å®šä½é—®é¢˜
                System.out.println(err.code);
                System.out.println(err.message);
            }
        }
        return null;
    }
    /**
     * ä½¿ç”¨ Token åˆå§‹åŒ–账号Client
     *
     * @return Client
     * @throws Exception
     */
    public Client createClient() throws Exception {
        Config config = new Config();
        config.protocol = "https";
        config.regionId = "central";
        return new Client(config);
    }
    public OapiV2UserGetbymobileResponse getOapiV2UserGetbymobileResponse(SendDingtalk s, String accessToken) {
        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile");
        OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();
        req.setMobile(s.getTelephone());
        req.setSupportExclusiveAccountSearch(true);
        OapiV2UserGetbymobileResponse rsp = null;
        try {
            rsp = client.execute(req, accessToken);
        } catch (ApiException e) {
            throw new RuntimeException(e);
        }
        return rsp;
    }
}
src/main/java/com/gs/dingtalk/service/impl/SendDingtalkServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,146 @@
package com.gs.dingtalk.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dingtalk.api.response.OapiV2UserGetbymobileResponse;
import com.google.gson.Gson;
import com.gs.dingtalk.dto.DingTalkMessage;
import com.gs.dingtalk.dto.DingTalkResponse;
import com.gs.dingtalk.entity.SendDingtalk;
import com.gs.dingtalk.entity.SendMessage;
import com.gs.dingtalk.mapper.SendDingtalkMapper;
import com.gs.dingtalk.service.SendDingtalkService;
import com.gs.dingtalk.service.SendMessageService;
import com.gs.dingtalk.service.SimpleExample;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class SendDingtalkServiceImpl extends ServiceImpl<SendDingtalkMapper, SendDingtalk> implements SendDingtalkService {
    private final SimpleExample simpleExample;
    private final SendMessageService sendMessageService;
    @Override
    public void getDingTalkUserId() throws Exception {
        String accessToken = simpleExample.getAccessToken();
        LambdaQueryWrapper<SendDingtalk> wrapper = new LambdaQueryWrapper<>();
        wrapper.isNull(SendDingtalk::getUserId);
        List<SendDingtalk> list = list(wrapper);
        list.forEach(s -> {
            OapiV2UserGetbymobileResponse rsp = simpleExample.getOapiV2UserGetbymobileResponse(s, accessToken);
            // ä½¿ç”¨ Gson è§£æžå“åº”数据
            Gson gson = new Gson();
            DingTalkResponse response = gson.fromJson(rsp.getBody(), DingTalkResponse.class);
            if ("ok".equals(response.getErrmsg())) {
                List<String> exclusiveAccountUseridList = response.getResult().getExclusiveAccountUseridList();
                String userId = "";
                if (CollectionUtil.isNotEmpty(exclusiveAccountUseridList)) {
                    userId = exclusiveAccountUseridList.get(0);
                } else if (StrUtil.isNotEmpty(response.getResult().getUserid())) {
                    userId = response.getResult().getUserid();
                }
                LambdaUpdateWrapper<SendDingtalk> updateWrapper = new LambdaUpdateWrapper<>();
                updateWrapper.set(SendDingtalk::getUserId, userId).eq(SendDingtalk::getId, s.getId());
                update(updateWrapper);
            }
        });
    }
    @Override
    public void sendDingTalkFiveMinute() throws Exception {
        LambdaQueryWrapper<SendDingtalk> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SendDingtalk::getFiveMinuteReminder, 1);
        List<SendDingtalk> list = list(wrapper);
        getMessage(list);
    }
    @Override
    public void sendDingTalkthirtyMinute() throws Exception {
        LambdaQueryWrapper<SendDingtalk> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SendDingtalk::getThirtyMinuteReminder, 1);
        List<SendDingtalk> list = list(wrapper);
        getMessage(list);
    }
    @Override
    public void chatSendMessage() throws Exception {
        List<SendMessage> sendMessageList = sendMessageService.getSendMessageList();
        sendMessageList.forEach(s -> {
            //钉钉的规则限制 ç»™åŒä¸€å‘˜å·¥ä¸€å¤©åªèƒ½å‘送一条内容相同的消息通知。
            String message = s.getLineName() + s.getProcName() + ",请尽快处理";
            DingTalkResponse dingTalkResponse = null;
            try {
                dingTalkResponse = simpleExample.chatSendMessage(message);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            if (dingTalkResponse != null) {
                if (dingTalkResponse.getErrcode() == 0) {
                    System.out.println("发送成功");
                }
            }
        });
    }
    private void getMessage(List<SendDingtalk> list) {
        List<SendMessage> sendMessageList = sendMessageService.getSendMessageList();
        sendMessageList.forEach(s -> {
            String userIdList = list.stream()
                    .filter(dingtalk -> {
                        String[] purviews = dingtalk.getPurview().split(",");
                        return Arrays.asList(purviews).contains(s.getProcNo());
                    }).map(SendDingtalk::getUserId).collect(Collectors.joining(","));
            //钉钉的规则限制 ç»™åŒä¸€å‘˜å·¥ä¸€å¤©åªèƒ½å‘送一条内容相同的消息通知。
            String message = s.getLineName() + s.getProcName() + ",请尽快处理";
            DingTalkMessage dingTalkMessage = null;
            try {
                dingTalkMessage = simpleExample.sendMessage(userIdList, message);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            if (dingTalkMessage.getErrcode() == 0) {
                System.out.println("发送成功");
            }
        });
    }
}
src/main/java/com/gs/dingtalk/service/impl/SendMessageServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.gs.dingtalk.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gs.dingtalk.entity.SendMessage;
import com.gs.dingtalk.mapper.SendMessageMapper;
import com.gs.dingtalk.service.SendMessageService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class SendMessageServiceImpl extends ServiceImpl<SendMessageMapper, SendMessage> implements SendMessageService {
    @Override
    public List<SendMessage> getSendMessageList() {
        LambdaQueryWrapper<SendMessage> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SendMessage::getFstatus, "待处理");
        List<SendMessage> list = list(queryWrapper);
        List<SendMessage> result = new ArrayList<>();
        result.add(list.get(0));
        return result;
    }
}
src/main/java/com/gs/dingtalk/task/ScheduledTasks.java
@@ -1,6 +1,7 @@
package com.gs.dingtalk.task;
import com.gs.dingtalk.service.SendDingtalkService;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@@ -8,6 +9,8 @@
@Component
@RequiredArgsConstructor
public class ScheduledTasks {
    private SendDingtalkService sendDingtalkService;
    /**
     * æ¯äº”分钟执行一次
@@ -19,7 +22,18 @@
     * @date 2024/9/27 21:48
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    public void getDeviceRealTimeData() {
    public void getDeviceRealTimeData() throws Exception {
        sendDingtalkService.sendDingTalkFiveMinute();
    }
    //0/5 * * * * ? *
    @Scheduled(cron = "0/5 * * * * ?")
    public void chatSendMessage() throws Exception {
        sendDingtalkService.chatSendMessage();
    }
    @Scheduled(cron = "0 0/30 * * * ?")
    public void sendDingTalkthirtyMinute() throws Exception {
        sendDingtalkService.sendDingTalkthirtyMinute();
    }
}
src/main/resources/application.yml
@@ -5,9 +5,9 @@
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: oracle.jdbc.OracleDriver
    url: jdbc:oracle:thin:@192.168.11.251:1521/orcl
    username: sg_prd
    password: sgprd
    url: jdbc:oracle:thin:@192.168.0.100:1521/orcl
    username: yc_dev
    password: ycdev
    druid:
      initialSize: 5
      minIdle: 5
src/main/resources/mapper/SendDingtalkMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gs.dingtalk.mapper.SendDingtalkMapper">
</mapper>
src/main/resources/mapper/SendMessageMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gs.dingtalk.mapper.SendMessageMapper">
</mapper>
src/test/java/com/gs/dingtalk/DeviceReceivingApplicationTests.java
@@ -1,7 +1,10 @@
package com.gs.dingtalk;
import com.gs.dingtalk.config.URLEncoder;
import com.gs.dingtalk.service.SendDingtalkService;
import com.gs.dingtalk.service.SimpleExample;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.math.BigDecimal;
@@ -10,6 +13,12 @@
@SpringBootTest
class DeviceReceivingApplicationTests {
    @Autowired
    private SimpleExample simpleExample;
    @Autowired
    private SendDingtalkService sendDingtalkService;
    @Test
    void contextLoads() {
@@ -30,4 +39,20 @@
        String encode = URLEncoder.encode("");
        System.out.println(encode);
    }
    @Test
    void getPhone() throws Exception {
        sendDingtalkService.getDingTalkUserId();
    }
    @Test
    void sendDingTalk() throws Exception {
        sendDingtalkService.sendDingTalkFiveMinute();
    }
    //chatSendMessage
    @Test
    void chatSendMessage() throws Exception {
        sendDingtalkService.chatSendMessage();
    }
}