DingtalkServiceImpl.java 6.73 KB
package com.chinagas.modules.schsf.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.chinagas.common.core.domain.AjaxResult;
import com.chinagas.common.core.exceptions.ServiceException;
import com.chinagas.common.core.utils.StringUtils;
import com.chinagas.modules.schsf.constant.DingtalkConstant;
import com.chinagas.modules.schsf.service.DingtalkService;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.oapi.lib.aes.DingTalkJsApiSingnature;
import com.dingtalk.open.client.ServiceFactory;
import com.dingtalk.open.client.api.model.corp.JsapiTicket;
import com.dingtalk.open.client.api.service.corp.CorpConnectionService;
import com.dingtalk.open.client.api.service.corp.JsapiService;
import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class DingtalkServiceImpl implements DingtalkService {

    @Autowired
    private DingtalkConstant dingtalkConstant;
    final int MAX_USERID_LIST_SIZE = 100;

    @Override
    public String getAccessToken() {
        if (StringUtils.isEmpty(dingtalkConstant.getCorpId())
                || StringUtils.isEmpty(dingtalkConstant.getAgentId())
                || StringUtils.isEmpty(dingtalkConstant.getAppKey())
                || StringUtils.isEmpty(dingtalkConstant.getAppSecret())) {
            log.warn("钉钉相关信息未配置,请在nacos中进行配置,appKey:{},agentId:{},corpId:{},appSecret:{}", dingtalkConstant.getAppKey(), dingtalkConstant.getAgentId(), dingtalkConstant.getCorpId(), dingtalkConstant.getAppSecret());
            throw new ServiceException("钉钉相关信息未配置,请在nacos中进行配置");
        }
        String accToken = "";
        JSONObject jsontemp = new JSONObject();
        try {
            ServiceFactory serviceFactory = ServiceFactory.getInstance();
            CorpConnectionService corpConnectionService = serviceFactory.getOpenService(CorpConnectionService.class);
            accToken = corpConnectionService.getCorpToken(dingtalkConstant.getAppKey(), dingtalkConstant.getAppSecret());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return accToken;
    }

    @Override
    public String getJsapiTicket(String accessToken) {
        String jsTicket = "";
        ServiceFactory serviceFactory;
        try {
            serviceFactory = ServiceFactory.getInstance();
            JsapiService jsapiService = serviceFactory.getOpenService(JsapiService.class);
            JsapiTicket JsapiTicket = jsapiService.getJsapiTicket(accessToken, "jsapi");
            jsTicket = JsapiTicket.getTicket();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsTicket;
    }

    @Override
    public String getSign(String ticket, String nonceStr, Long timeStamp, String url) {
        try {
            return DingTalkJsApiSingnature.getJsApiSingnature(url, nonceStr, timeStamp, ticket);
        } catch (Exception ex) {
            throw new ServiceException(ex.getMessage());
        }
    }

    @Override
    public void sendMarketFeeNotification(List<String> userIds, String title, String markdown) {
        log.info("钉钉通知,通知标题:{}", title);
        log.info("钉钉通知,通知内容:{}", markdown);
        log.info("钉钉通知,通知用户id:{},通知用户数量:{}", userIds, userIds.size());
        if (userIds==null || userIds.size()==0){
            return;
        }
        if (StringUtils.isEmpty(dingtalkConstant.getCorpId())
                || StringUtils.isEmpty(dingtalkConstant.getAgentId())
                || StringUtils.isEmpty(dingtalkConstant.getAppKey())
                || StringUtils.isEmpty(dingtalkConstant.getAppSecret())) {
            log.warn("钉钉通知,钉钉相关信息未配置,请在nacos中进行配置,appKey:{},agentId:{},corpId:{},appSecret:{}", dingtalkConstant.getAppKey(), dingtalkConstant.getAgentId(), dingtalkConstant.getCorpId(), dingtalkConstant.getAppSecret());
            return;
        }
        // 分割用户ID列表为多个不超过100的子列表
        List<String> userIdSubList = new ArrayList<>();
        List<List<String>> splitUserIds = new ArrayList<>();
        for (String userId : userIds) {
            userIdSubList.add(userId);
            if (userIdSubList.size() == MAX_USERID_LIST_SIZE) {
                splitUserIds.add(new ArrayList<>(userIdSubList));
                userIdSubList.clear(); // 准备下一个子列表
            }
        }
        // 如果最后的子列表非空,也要加进去
        if (!userIdSubList.isEmpty()) {
            splitUserIds.add(userIdSubList);
        }
        log.info("钉钉通知,将用户分组数:{}", splitUserIds.size());
        for (List<String> uids : splitUserIds) {
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
            OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
            request.setAgentId(Long.valueOf(dingtalkConstant.getAgentId()));
            request.setUseridList(String.join(",", uids));
            request.setToAllUser(false);
            OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
            msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());
            msg.getActionCard().setTitle(title);
            msg.getActionCard().setMarkdown(markdown);
            if (StringUtils.isNotEmpty(dingtalkConstant.getAppUrl())) {
                msg.getActionCard().setSingleTitle("点击查看");
                msg.getActionCard().setSingleUrl("dingtalk://dingtalkclient/action/openapp?" +
                        "corpid=" + dingtalkConstant.getCorpId() +
                        "&container_type=work_platform" +
                        "&app_id=0_" + dingtalkConstant.getAgentId() +
                        "&redirect_type=jump" +
                        "&redirect_url=" + dingtalkConstant.getAppUrl());
                msg.setMsgtype("action_card");
            }
            request.setMsg(msg);
            try {
                OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, getAccessToken());
                log.info("钉钉通知,通知结果:{}", rsp);
            } catch (ApiException e) {
                throw new RuntimeException(e);
            }
        }
    }


}