wzy vor 3 Wochen
Ursprung
Commit
b77e650a35

+ 29 - 0
mjava-siku/src/main/java/com/malk/siku/schedule/SikuTask.java

@@ -0,0 +1,29 @@
+package com.malk.siku.schedule;
+
+import com.malk.siku.service.SikuTaskService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+/**
+ * @EnableScheduling 开启定时任务 [配置参考McScheduleTask]
+ */
+@Slf4j
+@Configuration
+@EnableScheduling
+@ConditionalOnProperty(name = {"enable.scheduling"})
+public class SikuTask {
+
+    @Autowired
+    private SikuTaskService sikuTaskService;
+
+    //定时同步借款台账
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void syncMaterial(){
+        sikuTaskService.syncLoanManage();
+    }
+
+}

+ 6 - 0
mjava-siku/src/main/java/com/malk/siku/service/SikuTaskService.java

@@ -0,0 +1,6 @@
+package com.malk.siku.service;
+
+public interface SikuTaskService {
+    void syncLoanManage();
+
+}

+ 214 - 0
mjava-siku/src/main/java/com/malk/siku/service/impl/SikuTaskServiceImpl.java

@@ -0,0 +1,214 @@
+package com.malk.siku.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McException;
+import com.malk.server.dingtalk.DDR_New;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.siku.service.SikuTaskService;
+import com.malk.siku.utils.MkBxUtil;
+import com.malk.utils.UtilHttp;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Slf4j
+@Service
+public class SikuTaskServiceImpl implements SikuTaskService {
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private DDClient ddClient;
+
+    @Override
+    public void syncLoanManage() {
+        try {
+            //删除宜搭借款台账
+            List<List<String>> formInstanceIdListList = new ArrayList<>();//实例id集合,每100条
+
+            DDR_New ddrNew = new DDR_New();
+            int pageSize = 50;
+            int pageNumber = 0;
+            do {
+                pageNumber++;
+
+                ddrNew = retryQueryData(YDParam.builder()
+                        .formUuid("FORM-14F79868B683481295062CD1D643E06EVB7B")
+                        .searchFieldJson("")
+                        .pageNumber(pageNumber)
+                        .pageSize(pageSize)
+                        .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
+
+                formInstanceIdListList.addAll(Collections.singleton((List<String>) ddrNew.getData()));
+
+//                Thread.sleep(1000);
+            }while (ddrNew.getPageNumber() * pageSize < ddrNew.getTotalCount());
+
+            for (List<String> formInstanceIdList : formInstanceIdListList) {
+                if (!formInstanceIdList.isEmpty()){
+                    retryOperateData(YDParam.builder()
+                            .formUuid("FORM-14F79868B683481295062CD1D643E06EVB7B")
+                            .formInstanceIdList(formInstanceIdList)
+                            .build(), YDConf.FORM_OPERATION.delete_batch);
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        //查询每刻最新借款台账
+        List<Map> loanManageList = MkBxUtil.loanManageList();
+
+        for (Map loanManage : loanManageList) {
+            String code = UtilMap.getString(loanManage, "code");//台账编号\
+            String formCode = UtilMap.getString(loanManage, "formCode");//借款单单据号
+
+            String legalEntityName = UtilMap.getString(loanManage, "legalEntityName");//所属公司
+            String departmentName = UtilMap.getString(loanManage, "departmentName");//借款部门
+            String employeeName = UtilMap.getString(loanManage, "employeeName");//借款人
+            List<String> employeeDdUser = getDdUserId(employeeName);
+            String responseUserName = UtilMap.getString(loanManage, "responseUserName");//负责人
+            List<String> responseDdUser = getDdUserId(responseUserName);
+
+            String formName = UtilMap.getString(loanManage, "formName");//事由
+            String formSubTypeName = UtilMap.getString(loanManage, "formSubTypeName");//单据类型
+            long submittedAt = UtilMap.getLong(loanManage, "submittedAt");//提单时间
+            long expectRepaymentTime = UtilMap.getLong(loanManage, "expectRepaymentTime");//预计归还时间
+            int loanAge = UtilMap.getInt(loanManage, "loanAge");//账龄
+            Double amount = UtilMap.getDouble(UtilMap.getMap(loanManage, "approvedAmount"), "amount");//借款金额
+            Double owedAmount = UtilMap.getDouble(UtilMap.getMap(loanManage, "owedAmount"), "amount");//未归还(未核销)
+            Double pendingAmount = UtilMap.getDouble(UtilMap.getMap(loanManage, "pendingAmount"), "amount");//核销中金额
+
+            //借款单详情
+            Map loanDetailInfo = MkBxUtil.loanDetailInfo(formCode);
+            Map customObject = UtilMap.getMap(loanDetailInfo, "customObject");
+
+            Map cf0 = UtilMap.getMap(customObject, "CF0");
+            String projectCode = UtilMap.getString(cf0, "detailBusinessCode");//项目流水号
+            String projectName = UtilMap.getString(cf0, "text");//项目名称
+
+            long settledAt = UtilMap.getLong(loanDetailInfo, "settledAt");//支付时间
+
+            Map formData = new HashMap();
+            formData.put("textField_mnsly3li",code);
+            formData.put("textField_mnsly3lb",legalEntityName);
+            formData.put("textField_mnsly3lc",departmentName);
+            formData.put("employeeField_mnsly3mc",employeeDdUser);
+            formData.put("employeeField_mnsly3md",responseDdUser);
+            formData.put("textField_mnsm8q6f",projectName);
+            formData.put("textField_mnwtwu9z",projectCode);
+            formData.put("textareaField_mnsly3ll",formName);
+            formData.put("textField_mnsly3lg",formSubTypeName);
+            formData.put("dateField_mnsly3lx",submittedAt);
+            formData.put("dateField_mnsly3ly",expectRepaymentTime);
+            formData.put("dateField_mnsly3m3",settledAt);
+            formData.put("numberField_mnsly3m4",loanAge);
+            formData.put("numberField_mnsly3m5",amount);
+            formData.put("numberField_mnsly3ma",owedAmount);
+            formData.put("numberField_mnsly3mb",pendingAmount);
+
+            //同步宜搭借款台账
+            ydClient.operateData(YDParam.builder()
+                    .formUuid("FORM-14F79868B683481295062CD1D643E06EVB7B")
+                    .formDataJson(JSONObject.toJSONString(formData))
+                    .build(), YDConf.FORM_OPERATION.create);
+        }
+        System.out.println("111");
+
+    }
+
+
+    //自带重试的operateData方法
+    private Object retryOperateData(YDParam param, YDConf.FORM_OPERATION formOperation) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
+
+        Object result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.operateData(param, formOperation);
+
+                return result;
+            } catch (McException e) {
+                log.info("错误信息:{}",e.getMessage());
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(5000);
+                        log.info("尝试第{}次,param:{},FORM_OPERATION:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formOperation,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_OPERATION:{},异常信息:{}", JSONObject.toJSONString(param), formOperation,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_OPERATION:{}"+formOperation);
+    }
+
+
+    //自带重试的queryData方法
+    private DDR_New retryQueryData(YDParam param, YDConf.FORM_QUERY formQuery) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
+
+        DDR_New result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.queryData(param, formQuery);
+
+                return result;
+            } catch (McException e) {
+                log.info("错误信息:{}",e.getMessage());
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(5000);
+                        log.info("尝试第{}次,param:{},FORM_QUERY:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formQuery,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_QUERY:{},异常信息:{}", JSONObject.toJSONString(param), formQuery,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_QUERY:{}"+formQuery);
+    }
+
+    //根据员工名字匹配员工id
+    private List<String> getDdUserId(String Name){
+        HashMap body = new HashMap();
+
+        body.put("queryWord", Name);
+        body.put("offset",0);
+        body.put("size",1);
+
+        String s1 = UtilHttp.doPost("https://api.dingtalk.com/v1.0/contact/users/search", ddClient.initTokenHeader(), null, body);
+
+        List<String> list = JSONObject.parseObject(s1).getJSONArray("list").toJavaList(String.class);
+
+        return list;
+    }
+}

+ 0 - 8
mjava-siku/src/main/resources/application-dev.yml

@@ -26,14 +26,6 @@ aliwork:
   systemToken: Y2D66JB1A0B2OMK6OMB29AB8VMP43KJ7UCDKMG46
 
 mk:
-  #每刻报销-测试环境
-  bx:
-    appCode: AP52Y01LHHTAP9
-    appSecret: N4WuERLteAUPaWebnsHy
-  #每刻云票-测试环境
-  yp:
-    appCode: AP53EP1SVDS1N9
-    appSecret: qF4nm3nPnyXYcrWcr5jl
   downloadFilePath: d:\\
   downloadUrl: http://localhost:9037/api/siku/