浏览代码

【钉钉对接】【订阅推送】

wuyx 1 年之前
父节点
当前提交
ac2972ff89

+ 51 - 1
dingtalk-sdk/src/main/java/com/usoftchina/dingtalk/sdk/dto/SendMessageReq.java

@@ -97,7 +97,13 @@ public class SendMessageReq {
         this.body = new ActionCard(title, description, url);
         return this;
     }
-
+    public SendMessageReq actionCardWithMultiUrl(String title, String description,boolean verticalLayout, List<ActionUrlList> urlList) {
+//        for (ActionUrlList urlItem: urlList) {
+//            System.out.println("title: "+(urlItem.title).toString()+" =====URL: "+urlItem.url);
+//        }
+        this.body = new ActionCardWithMultiUrl(title, description, verticalLayout, urlList);
+        return this;
+    }
     /**
      * markdown消息
      *
@@ -214,7 +220,51 @@ public class SendMessageReq {
             return msg;
         }
     }
+    class ActionCardWithMultiUrl implements AbstractMessageBody {
+        private final String title;
+        private final String description;
+        private final boolean verticalLayout;//是否竖直排列
+        private List<ActionUrlList> actionUrlList;
 
+        public ActionCardWithMultiUrl(String title, String description, boolean verticalLayout, List<ActionUrlList> actionUrlList) {
+            this.title = title;
+            this.description = description;
+            this.verticalLayout = verticalLayout;
+            this.actionUrlList = actionUrlList;
+        }
+        @Override
+        public OapiMessageCorpconversationAsyncsendV2Request.Msg build() {
+            OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
+            msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());
+            msg.getActionCard().setTitle(title);
+            msg.getActionCard().setMarkdown(description);
+            if(verticalLayout){
+                msg.getActionCard().setBtnOrientation("0");
+            }else {
+                msg.getActionCard().setBtnOrientation("1");
+            }
+            List<OapiMessageCorpconversationAsyncsendV2Request.BtnJsonList> btnJsonList = new ArrayList<>();
+            if(actionUrlList!=null&&actionUrlList.size()>0){
+                for (ActionUrlList actionUrlItem: actionUrlList) {
+                    OapiMessageCorpconversationAsyncsendV2Request.BtnJsonList btnJsonItem = new OapiMessageCorpconversationAsyncsendV2Request.BtnJsonList();
+                    btnJsonItem.setTitle(actionUrlItem.title);
+                    btnJsonItem.setActionUrl(actionUrlItem.url);
+                    btnJsonList.add(btnJsonItem);
+                }
+            }
+            msg.getActionCard().setBtnJsonList(btnJsonList);
+            msg.setMsgtype("action_card");
+            return msg;
+        }
+    }
+    public static class ActionUrlList {
+        private final String title;
+        private final String url;
+        public ActionUrlList(String title, String url) {
+            this.title = title;
+            this.url = url;
+        }
+    }
     class Link implements AbstractMessageBody {
         private final String title;
         private final String text;

+ 2 - 2
dingtalk-sdk/src/test/java/com/usoftchina/dingtalk/sdk/test/BaseTest.java

@@ -17,7 +17,7 @@ public class BaseTest {
         properties = new DingTalkProperties();
 //        properties.setCorpId("ding0fb1b0cd2510faf7ffe93478753d9884");
 //        properties.setAgents(Arrays.asList(new Agent("Uas", 508343055L, "dingibz8hztjohd4epzp", "Kwkf2aq4k35Crjw2smSAGH9diTj5q--c0Qg4TsyoFxfurOkiIoKzmOd-VCLJ1kEc")));
-        properties.setCorpId("dingf484d054c7fcbf4435c2f4657eb6378f");
-        properties.setAgents(Arrays.asList(new Agent("Uas", 587373913L, "dingk8oe4y0efafgwe4m", "n_xcuKNsqcID8GvXPVtXlFEWnw4WJLIXqSc4zR67Y8MrLHUYCw20yF_Gifu9ctRi")));
+        properties.setCorpId("dingb198daf2d56cca6ba1320dcb25e91351");//易连
+        properties.setAgents(Arrays.asList(new Agent("Uas", 1889191924L, "dings45ynfpmqqc8fekh", "ByQRJ3xJh_p6oFN_EpBEo4s69SKkRAZh33DOAr8Uh817hmfPYYMKyDNS0k9MJmBX")));
     }
 }

+ 70 - 0
dingtalk-sdk/src/test/java/com/usoftchina/dingtalk/sdk/test/MessageTest.java

@@ -6,6 +6,10 @@ import com.usoftchina.dingtalk.sdk.util.UrlUtils;
 import org.junit.Test;
 
 import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @author yingp
@@ -27,4 +31,70 @@ public class MessageTest extends BaseTest {
                 .actionCard("应鹏的工作日报流程", "单据编号:2020020258", msgUrl)
                 .toUser("manager8449"));
     }
+    @Test
+    public void sendSubsMessage() throws Exception {
+        String corpId = properties.getCorpId();
+        String masterCode = "NELINK_GROUPCENTER";
+        String agentUrl = "http://218.17.192.202:8099/ERP/";
+        String outerUrl="http://218.17.192.202:8099/office/";
+        String process = agentUrl.substring(agentUrl.indexOf("/",10)+1,agentUrl.indexOf("/",agentUrl.indexOf("/",10)+1));
+
+        String title = "您有新的订阅信息";
+        String description ="您有新的订阅信息,共:(%s)条。";
+/*
+*
+ID_, NUM_ID_, INSTANCE_ID_, TITLE_
+21	8143	361	逾期订单提醒(测试)
+24	8144	364	逾期订单提醒(测试2)
+22	8145	362	逾期订单提醒(测试3)
+23	8146	363	逾期订单提醒(测试4)
+* */
+        List<Map<String,Object>> remindList = new ArrayList<>();
+        HashMap<String,Object> m = new HashMap<>();
+        m.put("ID_","21");
+        m.put("NUM_ID_","8143");
+        m.put("INSTANCE_ID_","361");
+        m.put("TITLE_","逾期订单提醒(测试)");
+        remindList.add(m);
+        m = new HashMap<>();
+        m.put("ID_","24");
+        m.put("NUM_ID_","8144");
+        m.put("INSTANCE_ID_","364");
+        m.put("TITLE_","逾期订单提醒(测试2)");
+        remindList.add(m);
+        remindList.add(m);
+        m = new HashMap<>();
+        m.put("ID_","22");
+        m.put("NUM_ID_","8145");
+        m.put("INSTANCE_ID_","362");
+        m.put("TITLE_","逾期订单提醒(测试3)");
+        remindList.add(m);
+        m = new HashMap<>();
+        m.put("ID_","23");
+        m.put("NUM_ID_","8146");
+        m.put("INSTANCE_ID_","363");
+        m.put("TITLE_","逾期订单提醒(测试4)");
+        remindList.add(m);
+
+        description = String.format(description,remindList.size());
+        List<SendMessageReq.ActionUrlList> urlList = new ArrayList<>();
+        for (int i = 0; i <remindList.size(); i++) {
+            Map<String,Object> remindRecor = remindList.get(i);
+            if(i > 2){
+                break;
+            }//https://erp.yitoa.com:8888/ERP/uasMobile/#/ERP/uasMobile/subscribeChart/660372/20665/85487
+            String msgUrl=UrlUtils.generateAuthUrl(corpId, masterCode, "Uas", agentUrl,
+                    outerUrl + "authorize",process+"/uasMobile/subscribeChart/"+remindRecor.get("ID_")+"/"+remindRecor.get("NUM_ID_")
+                            +"/"+remindRecor.get("INSTANCE_ID_") );
+            urlList.add(new SendMessageReq.ActionUrlList(remindRecor.get("TITLE_").toString(),msgUrl));
+        }
+        if(remindList.size() > 3){//更多 https://erp.yitoa.com:8888/ERP/uasMobile/#/ERP/uasMobile/subscribeList
+            String moreUrl = UrlUtils.generateAuthUrl(corpId, masterCode, "Uas",agentUrl,
+                    outerUrl + "authorize", process+"/uasMobile/subscribeList");
+            urlList.add(new SendMessageReq.ActionUrlList("更多...",moreUrl));
+        }
+        sdk.send("Uas", new SendMessageReq()
+                .actionCardWithMultiUrl(title, description, true,urlList)
+                .toUser("0324074353583741665"));
+    }
 }

+ 3 - 2
dingtalk-sdk/src/test/java/com/usoftchina/dingtalk/sdk/test/UrlTest.java

@@ -8,7 +8,8 @@ import com.usoftchina.dingtalk.sdk.util.UrlUtils;
  */
 public class UrlTest {
     public static void main(String[] args) throws Exception {
-        System.out.println(UrlUtils.generateAuthUrl("ding0fb1b0cd2510faf7ffe93478753d9884", "N_USOFTSYS", "Uas", "http://2788e5c924.qicp.vip/uas/",
-                "http://2788e5c924.qicp.vip/office/authorize", "/"));
+        System.out.println(UrlUtils.generateAuthUrl("dingb198daf2d56cca6ba1320dcb25e91351", "NELINK_GROUPCENTER"
+                , "Uas", "http://218.17.192.202:8099/ERP/",
+                "http://218.17.192.202:8099/office/authorize", "/ERP/uasMobile/subscribeList"));
     }
 }

+ 37 - 0
uas-office-dingtalk/src/main/java/com/usoftchina/uas/office/dingtalk/service/UasSubsService.java

@@ -0,0 +1,37 @@
+package com.usoftchina.uas.office.dingtalk.service;
+
+import com.usoftchina.uas.office.service.AbstractService;
+import org.springframework.dao.EmptyResultDataAccessException;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author wuyx
+ * @date 2024/7/03
+ * @desc: 订阅提醒
+ */
+@Service
+public class UasSubsService extends AbstractService {
+    public boolean pushSubsDataEnable(){
+        boolean pushFlag = false;
+        try{
+           int count = jdbcTemplate.queryForObject( "select count(1) from configs where caller ='sys' and code = 'enableMSubsPush' and nvl(DATA,'0')<>'0'",Integer.class);
+           pushFlag= count > 0;
+        } catch (EmptyResultDataAccessException e) {
+
+        }
+        return pushFlag;
+    }
+    public List<Map<String,Object>> getSubs_instance(Integer emId) {
+        List<Map<String,Object>> resList = new ArrayList<>();
+        try{
+            resList = jdbcTemplate.queryForList( "SELECT ID_,NUM_ID_,INSTANCE_ID_,TITLE_ FROM SUBS_MAN_INSTANCE WHERE EMP_ID_=? AND  TO_CHAR(CREATEDATE_,'yyyy-mm-dd')=TO_CHAR(SYSDATE,'yyyy-mm-dd') ORDER BY TITLE_ ASC ",emId);
+        } catch (EmptyResultDataAccessException e) {
+            return resList;
+        }
+        return resList;
+    }
+}

+ 122 - 0
uas-office-dingtalk/src/main/java/com/usoftchina/uas/office/dingtalk/task/DingTalkSubsTask.java

@@ -0,0 +1,122 @@
+package com.usoftchina.uas.office.dingtalk.task;
+
+import com.usoftchina.dingtalk.sdk.MessageSdk;
+import com.usoftchina.dingtalk.sdk.dto.SendMessageReq;
+import com.usoftchina.dingtalk.sdk.util.UrlUtils;
+import com.usoftchina.uas.office.dingtalk.entity.Employee;
+import com.usoftchina.uas.office.dingtalk.manage.entity.DingTalkAgent;
+import com.usoftchina.uas.office.dingtalk.manage.service.DingTalkAgentService;
+import com.usoftchina.uas.office.dingtalk.service.UasEmployeeService;
+import com.usoftchina.uas.office.dingtalk.service.UasSubsService;
+import com.usoftchina.uas.office.entity.DataCenter;
+import com.usoftchina.uas.office.jdbc.DataSourceHolder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author wuyx
+ * @date 2024/7/03
+ */
+@Component
+public class DingTalkSubsTask {
+
+    @Autowired
+    private MessageSdk messageSdk;
+
+    @Autowired
+    private UasSubsService uasSubsService;
+
+    @Autowired
+    private UasEmployeeService uasEmployeeService;
+
+    @Autowired
+    private DingTalkAgentService agentService;
+
+    private final Logger logger = LoggerFactory.getLogger(DingTalkSubsTask.class);
+
+    /**
+     * 每日订阅提醒推送
+     */
+    @Scheduled(cron="0 0 19 * * ? ")
+//    @Scheduled(fixedDelay = 180000, initialDelay = 10000)
+    public void pushSubsData() {
+        DataCenter dataCenter = DataCenter.INSTANCE;
+        if (null != dataCenter.getUrl()) {
+            try {
+                DataSourceHolder.set(dataCenter);
+                try {
+                    boolean pushFlag = uasSubsService.pushSubsDataEnable();
+                    System.out.println("pushFlag:"+pushFlag);
+                    if(!pushFlag){
+                        return;
+                    }
+                }catch (Exception e){
+
+                }
+                //获取要推送人员列表
+                List<Employee> emList = new ArrayList<>();
+//              emList = uasEmployeeService.getAll();
+                Employee emp =  uasEmployeeService.getByCode("TEST");
+                if(emp!=null){
+                    emList.add(emp);
+                }
+                if(CollectionUtils.isEmpty(emList)){
+                    return;
+                }
+                DingTalkAgent agent = getUasAgent();
+                for(Employee employee : emList){
+                    try {
+                        String title = "您有新的订阅信息";
+                        String description ="您有新的订阅信息,共:(%s)条。";
+                        String agentUrl = agent.getOuterUrl();
+                        String process = agentUrl.substring(agentUrl.indexOf("/",10)+1,agentUrl.indexOf("/",agentUrl.indexOf("/",10)+1));
+                        //获取待推送的订阅信息
+                        List<Map<String,Object>> remindList =uasSubsService.getSubs_instance(employee.getEm_id());
+                        if(remindList.size() > 0){
+                            try {
+                                // 往uas应用发送
+                                description = String.format(description,remindList.size());
+                                List<SendMessageReq.ActionUrlList> urlList = new ArrayList<>();
+                                for (int i = 0; i <remindList.size(); i++) {
+                                    Map<String,Object> remindRecor = remindList.get(i);
+                                    if(i > 2){
+                                        break;
+                                    }//https://erp.yitoa.com:8888/ERP/uasMobile/#/ERP/uasMobile/subscribeChart/660372/20665/85487
+                                    String msgUrl=UrlUtils.generateAuthUrl(messageSdk.getCorpId(), dataCenter.getUsername(), "Uas", agentUrl.substring(0,agentUrl.indexOf("#")+2),
+                                            dataCenter.getOuterUrl() + "authorize",process+"/uasMobile/subscribeChart/"+remindRecor.get("ID_")+"/"+remindRecor.get("NUM_ID_")
+                                                    +"/"+remindRecor.get("INSTANCE_ID_") );
+                                    urlList.add(new SendMessageReq.ActionUrlList(remindRecor.get("TITLE_").toString(),msgUrl));
+                                }
+                                if(remindList.size() > 3){//更多 https://erp.yitoa.com:8888/ERP/uasMobile/#/ERP/uasMobile/subscribeList
+                                    String moreUrl = UrlUtils.generateAuthUrl(messageSdk.getCorpId(), dataCenter.getUsername(), "Uas", agent.getOuterUrl(),
+                                            dataCenter.getOuterUrl() + "authorize", process+"/uasMobile/subscribeList");
+                                    urlList.add(new SendMessageReq.ActionUrlList("更多...",moreUrl));
+                                }
+                                messageSdk.send("Uas", new SendMessageReq()
+                                        .actionCardWithMultiUrl(title, description, true,urlList)
+                                        .toUser(employee.getEm_ding()));
+                            } catch (Exception e) {
+                                logger.error("send process message error", e);
+                            }
+                        }
+                    } catch (Exception e) {
+                        logger.error("send subs remind error", e);
+                    }
+                }
+            } finally {
+                DataSourceHolder.clear();
+            }
+        }
+    }
+    public DingTalkAgent getUasAgent() {
+        return agentService.findByCode("Uas");
+    }
+}