Browse Source

定时任务

Zimo 1 day ago
parent
commit
6e2d67325d

+ 2 - 0
yudao-server/src/main/java/cn/iocoder/yudao/server/YudaoServerApplication.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.server;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * 项目的启动类
@@ -14,6 +15,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
  */
 @SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${yudao.info.base-package}
 @SpringBootApplication(scanBasePackages = {"${yudao.info.base-package}.server", "${yudao.info.base-package}.module"})
+@EnableScheduling
 public class YudaoServerApplication {
 
     public static void main(String[] args) {

+ 15 - 3
yudao-server/src/main/java/cn/iocoder/yudao/server/controller/admin/TodoController.java

@@ -12,8 +12,10 @@ import cn.iocoder.yudao.module.system.dal.mysql.oa.IotOaPersonMapper;
 import cn.iocoder.yudao.module.system.oa.OaFlow;
 import cn.iocoder.yudao.module.system.util.DingtalkUtil;
 import cn.iocoder.yudao.server.dal.dataobject.CrmNoticeDO;
+import cn.iocoder.yudao.server.dal.dataobject.CrmPersonDO;
 import cn.iocoder.yudao.server.dal.dataobject.OaNoticeDO;
 import cn.iocoder.yudao.server.dal.mysql.CrmNoticeMapper;
+import cn.iocoder.yudao.server.dal.mysql.CrmPersonMapper;
 import cn.iocoder.yudao.server.dal.mysql.OaNoticeMapper;
 import cn.iocoder.yudao.server.dal.mysql.PmsMapper;
 import cn.iocoder.yudao.server.rest.CrmRest;
@@ -55,6 +57,8 @@ public class TodoController {
     private IotOaPersonMapper iotOaPersonMapper;
     @Autowired
     private OaNoticeMapper oaNoticeMapper;
+    @Autowired
+    private CrmPersonMapper crmPersonMapper;
 
     @GetMapping("/oa")
     @PermitAll
@@ -108,7 +112,11 @@ public class TodoController {
         if (userByUsername == null) {throw new ServiceException(new ErrorCode(1,"门户系统中不存在该用户"));}
 
         String dingUserId = DingtalkUtil.getUserInfoByMobile(userByUsername.getMobile());
-        String crmUserId = crmRest.querySqlUser(String.valueOf(stringStringImmutableMap.get("access")), dingUserId);
+        List<CrmPersonDO> crmPersonDOS = crmPersonMapper.selectList("crm_user_unionid", dingUserId);
+        String crmUserId="";
+        if (CollUtil.isNotEmpty(crmPersonDOS)) {
+            crmUserId = crmPersonDOS.get(0).getCrmUserId();
+        }
         if (StringUtils.isBlank(crmUserId)) {
             return CommonResult.success(ImmutableMap.of("todoCount",0,"todoList", new ArrayList<>()));
         }
@@ -131,9 +139,13 @@ public class TodoController {
             try {
                 dingUserId = DingtalkUtil.getUserInfoByMobile(userByUsername.getMobile());
             } catch (Exception e) {
-                throw new ServiceException(new ErrorCode(1,e.getMessage()));
+                return CommonResult.success(new ArrayList<>());
+            }
+            List<CrmPersonDO> crmPersonDOS = crmPersonMapper.selectList("crm_user_unionid", dingUserId);
+            String crmUserId="";
+            if (CollUtil.isNotEmpty(crmPersonDOS)) {
+                crmUserId = crmPersonDOS.get(0).getCrmUserId();
             }
-            String crmUserId = crmRest.querySqlUser(String.valueOf(stringStringImmutableMap.get("access")), dingUserId);
             if (StringUtils.isBlank(crmUserId)) {
                 return CommonResult.success(new ArrayList());
             }

+ 26 - 0
yudao-server/src/main/java/cn/iocoder/yudao/server/job/CrmPersonJob.java

@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.server.job;
+
+import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.server.rest.CrmRest;
+import com.google.common.collect.ImmutableMap;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+@Component
+public class CrmPersonJob {
+    private final CrmRest crmRest;
+
+    public CrmPersonJob(CrmRest crmRest) {
+        this.crmRest = crmRest;
+    }
+
+    @Scheduled(cron = "0 0 1 * * ?")
+    @TenantIgnore
+    @DataPermission(enable = false)
+    public String executeCrmPerson() throws Exception {
+        ImmutableMap<String, String> stringStringImmutableMap = crmRest.refreshToken("ec301168-d9d7-4f0c-a73c-03f50e952a3a");
+        crmRest.querySqlUserJob(String.valueOf(stringStringImmutableMap.get("access")));
+        return "";
+    }
+}

+ 57 - 11
yudao-server/src/main/java/cn/iocoder/yudao/server/rest/CrmRest.java

@@ -13,6 +13,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.ImmutableMap;
 import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
@@ -21,10 +22,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
@@ -72,7 +70,7 @@ public class CrmRest {
         HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(headers);
         RestTemplate restTemplate = SslSkippingRestTemplate.createRestTemplate();
         ResponseEntity<String> exchange = restTemplate.exchange("https://api-tencent.xiaoshouyi.com/rest/data/v2/query?" +
-                        "q=select id,name,unionId,phone,personalEmail from user where unionId is not null",
+                        "q=select id,name,unionId,phone,personalEmail from user where unionId is not null limit 0,300",
                 HttpMethod.GET, requestEntity, String.class);
         String body = exchange.getBody();
         String result = JSON.parseObject(body).getString("result");
@@ -110,15 +108,58 @@ public class CrmRest {
         return userId.get();
     }
 
+
+    public void querySqlUserJob(String token) {
+        HttpHeaders headers = new HttpHeaders();
+        headers.add("Authorization", token);
+        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(headers);
+        RestTemplate restTemplate = SslSkippingRestTemplate.createRestTemplate();
+        ResponseEntity<String> exchange = restTemplate.exchange("https://api-tencent.xiaoshouyi.com/rest/data/v2/query?" +
+                        "q=select id,name,unionId,phone,personalEmail from user where unionId is not null limit 0,300",
+                HttpMethod.GET, requestEntity, String.class);
+        String body = exchange.getBody();
+        String result = JSON.parseObject(body).getString("result");
+        String records = JSON.parseObject(result).getJSONArray("records").toJSONString();
+
+        List<CrmUser> crmUsers = JSON.parseArray(records, CrmUser.class);
+        List<CrmPersonDO> crmPersonDOS = crmPersonMapper.selectList();
+        Set<String> existIds = crmPersonDOS.stream()
+                .map(CrmPersonDO::getCrmUserId)
+                .collect(Collectors.toSet());
+
+
+        //插入自己的数据库,保存crm人员信息
+        List<CrmUser> needInsertUsers = crmUsers.stream()
+                .filter(user -> !existIds.contains(user.getId()))
+                .collect(Collectors.toList());
+        List<CrmPersonDO> collect = needInsertUsers.stream().map(e -> {
+            CrmPersonDO crmPersonDO = new CrmPersonDO();
+            crmPersonDO.setCrmUserId(e.getId());
+            crmPersonDO.setCrmUserName(e.getName());
+            crmPersonDO.setCrmUserPhone(e.getPhone());
+            crmPersonDO.setCrmUserMail(e.getPersonalEmail());
+            crmPersonDO.setCrmUserUnionid(e.getUnionId());
+            crmPersonDO.setDeleted(false);
+            return crmPersonDO;
+        }).collect(Collectors.toList());
+        crmPersonMapper.insertBatch(collect);
+    }
+
     public ImmutableMap<String, Object> getCrmTodoList(String token, String crmUserId, String type, Integer pageSize, Integer pageNo) {
         HttpHeaders headers = new HttpHeaders();
         headers.add("Authorization", token);
         HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(headers);
         RestTemplate restTemplate = SslSkippingRestTemplate.createRestTemplate();
         ResponseEntity<String> exchange = restTemplate.exchange("https://api-tencent.xiaoshouyi.com/rest/data/v2.0/creekflow/task/filter?assigneeIds="+crmUserId+"&status="+type+"&pageNum="+pageNo+"&pageSize="+pageSize, HttpMethod.GET, requestEntity, String.class);
-        String body = exchange.getBody();
-        String data = JSON.parseObject(body).getString("data");
-        String records = JSON.parseObject(data).getJSONArray("records").toJSONString();
+        String data = null;
+        String records = null;
+        try {
+            String body = exchange.getBody();
+            data = JSON.parseObject(body).getString("data");
+            records = JSON.parseObject(data).getJSONArray("records").toJSONString();
+        } catch (Exception e) {
+            return ImmutableMap.of("todoCount", 0,"todoList", new ArrayList<>());
+        }
         List<CrmTodoVo> crmTodoVos = JSON.parseArray(records, CrmTodoVo.class);
         Integer dataCount = JSON.parseObject(data).getInteger("dataCount");
         List<CrmPersonDO> crmPersonDOS = crmPersonMapper.selectList();
@@ -137,9 +178,14 @@ public class CrmRest {
         RestTemplate restTemplate = SslSkippingRestTemplate.createRestTemplate();
         ResponseEntity<String> exchange = restTemplate.exchange("https://api-tencent.xiaoshouyi.com/rest/notice/v2.0/notice/actions/list?userId="+crmUserId+"&pageNo=1&pageSize=1000",
                 HttpMethod.GET, requestEntity, String.class);
-        String body = exchange.getBody();
-        String data = JSON.parseObject(body).getString("result");
-        JSONArray objects = JSON.parseArray(data);
+        JSONArray objects = null;
+        try {
+            String body = exchange.getBody();
+            String data = JSON.parseObject(body).getString("result");
+            objects = JSON.parseArray(data);
+        } catch (Exception e) {
+            return new ArrayList();
+        }
         if (CollUtil.isEmpty(objects)) {return new ArrayList<>();}
         String data1 = JSON.parseObject(objects.get(0).toString()).getString("data");
         String records = JSON.parseObject(data1).getJSONArray("records").toJSONString();

+ 2 - 13
yudao-server/src/main/java/cn/iocoder/yudao/server/service/PortalOaFlow.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.server.service;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.NumberUtil;
 import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.module.system.oa.E9ApiTokenUtil;
@@ -41,18 +42,6 @@ public class PortalOaFlow {
     private String registerUrl;
     @Value("${oa.gettoken}")
     private String tokenUrl;
-    @Value("${oa.companyUrl}")
-    private String companyUrl;
-    @Value("${oa.departmentUrl}")
-    private String departmentUrl;
-    @Value("${oa.userUrl}")
-    private String userUrl;
-    @Value("${oa.workflowId}")
-    private String workflowId;
-    @Value("${oa.requestName}")
-    private String requestName;
-    @Value("${oa.outMaintain}")
-    private String outMaintainUrl;
 
     private static String spk = "";
     private static String secret = "";
@@ -171,7 +160,7 @@ public class PortalOaFlow {
         if (todoList != null && !todoList.contains("token不存在或者超时")) {
             doneJsonObjects = JSON.parseArray(doneList, JSONObject.class);
         }
-        return ImmutableMap.of("todoCount", out, "todoList", jsonObjects,"doneCount", done,"doneList", doneJsonObjects);
+        return ImmutableMap.of("todoCount", NumberUtil.isNumber(out)?out:0 , "todoList", jsonObjects,"doneCount", NumberUtil.isNumber(done)?done : 0,"doneList", doneJsonObjects);
     }
 
     public List getOaNotice(String oaId, OaNoticeDO oaNoticeDO, String workcode) throws Exception {