Selaa lähdekoodia

Merge remote-tracking branch 'origin/master'

lfx 6 kuukautta sitten
vanhempi
commit
42aa827b4d

+ 24 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/controller/TimerController.java

@@ -1,5 +1,6 @@
 package com.malk.lanyun.controller;
 
+import com.malk.lanyun.service.FService;
 import com.malk.lanyun.service.NCService;
 import com.malk.lanyun.service.SyncAssetsService;
 import com.malk.lanyun.service.TimerService;
@@ -198,4 +199,27 @@ public class TimerController {
         log.info("进入更新获取首条供应商价目表单价方法");
         timerService.updateDailyPrice(formInstId);
     }
+
+    @Autowired
+    private FService fService;
+
+    /**
+     * 蓝云, 全量同步账龄表
+     */
+    @GetMapping("syncAgingSchedule")
+    public McR syncAgingSchedule() {
+        log.info("全量同步账龄表");
+        fService.syncAgingSchedule();
+        return McR.success();
+    }
+
+    /**
+     * 蓝云, 同步催款函
+     */
+    @GetMapping("syncCallLetters")
+    public McR syncCallLetters() {
+        log.info("同步催款函");
+        fService.syncCallLetters();
+        return McR.success();
+    }
 }

+ 20 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/FService.java

@@ -0,0 +1,20 @@
+package com.malk.lanyun.service;
+
+import com.malk.server.common.McR;
+import org.springframework.web.bind.annotation.GetMapping;
+
+/**
+ * 财务账龄表\催款函
+ */
+public interface FService {
+
+    /**
+     * 蓝云, 全量同步账龄表
+     */
+     void syncAgingSchedule();
+
+    /**
+     * 蓝云, 同步催款函
+     */
+     McR syncCallLetters();
+}

+ 224 - 0
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/FImplService.java

@@ -0,0 +1,224 @@
+package com.malk.lanyun.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.malk.lanyun.service.FService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.aliwork.YDService;
+import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilList;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class FImplService implements FService {
+
+@Autowired
+private YDService ydService;
+
+    @Autowired
+    private YDClient ydClient;
+
+    /**
+     * 同步开票档案账龄表
+     */
+
+    private YDParam.YDParamBuilder _initLYParam() {
+        return YDParam.builder()
+                .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP");
+    }
+
+    /**
+     * 蓝云, 同步催款函
+     */
+    @Override
+    public McR syncCallLetters() {
+        List<Map> dataList = ydService.queryFormData_all(_initLYParam()
+                .formUuid("FORM-EC785A5AB2B9432C892062823EB7C62A9NTL")
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lvituew9, radioField_m4qrz687", "正常", "否")))
+                .build());
+
+        // 更新数据版本, upsert不支持版本更新
+//        if (true) {
+//            for (Map data : dataList) {
+//                ydClient.operateData(_initLYParam()
+//                        .formInstanceId(UtilMap.getString(data, "formInstanceId"))
+//                        .updateFormDataJson(JSON.toJSONString(UtilMap.empty()))
+//                        .useLatestVersion(true)
+//                        .build(), YDConf.FORM_OPERATION.delete);
+//            }
+//            return McR.success();
+//        }
+
+        // 公司主体
+        List<Map> subjectList = ydService.queryFormData_all(_initLYParam()
+                .formUuid("FORM-B1425F3ECC294B858B267A806CB5AEDEFTND")
+                .build());
+        log.info("同步账龄表数据, {}", dataList.size());
+        // 匹配逻辑: 客户 + 项目 + 蓝云主体【明细按照开票周期】
+        Map<String, Map> setMap = new HashMap();
+        Map dataMap = UtilMap.empty();
+        for (Map data : dataList) {
+            String kpgs = UtilMap.getString(data, "selectField_lvc9x4vo");  // 开票公司
+            String xmdbh = UtilMap.getString(data, "textField_m25j5gxk");   // 项目点编号
+            String khmc = UtilMap.getString(data, "selectField_lvdojfui");  // 客户名称
+            String unique = kpgs + "_" + xmdbh + "_" + khmc;
+            Map formData = UtilMap.getMap(setMap, unique); // 累计标识
+            if (!dataMap.containsKey(unique)) {
+                // 主表信息: 由 --> 至, 合计金额
+                formData = UtilMap.map("textField_m06ij3z7, textField_m06ij3z8, numberField_m06lmogz", kpgs, khmc, UtilMap.getFloat(data, "numberField_m4qrz685"));
+                List<Map> subjects = subjectList.stream().filter(item -> kpgs.equals(UtilMap.getString(item, "textField_lrintpap"))).collect(Collectors.toList());
+                if (subjects.size() == 0) {
+                    continue;
+                }
+                formData.putAll(UtilMap.map("textField_m06ij3zr, textField_m06ij3zs", kpgs, UtilMap.getString(subjects.get(0), "textField_m4qrp33v")));
+                // 付款信息
+                List<Map> details = (List<Map>) UtilMap.getList(subjects.get(0), "tableField_luq9ph7m").stream().filter(item -> !"现金".equals(((Map) item).get("selectField_lt557ppq"))).collect(Collectors.toList());
+                if (details.size() > 0) {
+                    // 开户行, 银行账号
+                    formData.putAll(UtilMap.map("textField_m06ij3zt, textField_m06ij3zu", "textField_lrpq6es0, textField_lrpq6es1, ", details.get(0)));
+                }
+                // 开票子表: 业务内容-开票内容, 发票号码, 开票时间-开票周期(文本), 项目名称, 金额-未回款金额, 备注-差异说明
+                Map sub = UtilMap.map("textField_m06ij3zf, textField_m06ij3zg, textField_m06ij3zh, textField_m06ij3zi, numberField_m06ij3zk, textField_m06ij3zj", "textField_lvdnme0u, textField_lvd8pp35, textField_m25j5gxv, textField_lvdntzul, numberField_m4qrz685, textareaField_m25j5gyc", data);
+                sub.put("textField_m06ij3ze", 1); // 序号
+                formData.put("tableField_m06ij3zd", UtilList.asList(sub));
+            } else {
+                List<Map> table = UtilMap.getList(formData, "tableField_m06ij3zd");
+                // 开票子表: 业务内容-开票内容, 发票号码, 开票时间-开票周期(文本), 项目名称, 金额-未回款金额, 备注-差异说明
+                Map sub = UtilMap.map("textField_m06ij3zf, textField_m06ij3zg, textField_m06ij3zh, textField_m06ij3zi, numberField_m06ij3zk, textField_m06ij3zj", "textField_lvdnme0u, textField_lvd8pp35, textField_m25j5gxv, textField_lvdntzul, numberField_m4qrz685, textareaField_m25j5gyc", data);
+                sub.put("textField_m06ij3ze", table.size() + 1); // 序号
+                table.add(sub);
+                formData.put("tableField_m06ij3zd", table);
+                // 累计合计金额
+                formData.put("numberField_m06lmogz", UtilMap.getFloat(formData, "numberField_m06lmogz") + UtilMap.getFloat(data, "numberField_m4qrz685"));
+            }
+            setMap.put(unique, formData);
+        }
+
+        log.info("催款函, {}", setMap.size());
+        for (String unique : setMap.keySet()) {
+            Map formData = UtilMap.getMap(setMap, unique);
+            formData.put("textField_m4qxo07x", unique + "_" + UtilDateTime.formatDate(new Date()));
+            ydClient.operateData(_initLYParam()
+                    .formUuid("FORM-738D89FEC34740EC92B08BF6D7B9470DEQY6")
+                    .processCode("TPROC--IMD665A1KDXNJ2V47QQ9UCM9I9F827DEEI60M6")
+                    .formDataJson(JSON.toJSONString(formData))
+                    .userId("396511732") // 通过宜搭平台发起的,不会有待办, 通过企业账号发送 (system)
+                    .build(), YDConf.FORM_OPERATION.start);
+        }
+        return McR.success();
+    }
+
+
+    /**
+     * 蓝云, 全量同步账龄表 [todo 后续可调整为同步前一天更新数据]
+     */
+    @Override
+    public void syncAgingSchedule() {
+
+        List<Map> dataList = ydService.queryFormData_all(_initLYParam()
+                .formUuid("FORM-6603375ED27B4D059CBB919C2BEFA44BZVOL")
+//                .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lvdosccc", "KP_2024121301677")))
+                .build());
+
+        // 合同业务类型: 日保一次性与小业主一致
+        Map compIds = UtilMap.map("大业主, 小业主, 工程订单, 日保一次性", "tableField_lvc9x4vt, tableField_lvdnme13, tableField_lvd8pp44, tableField_lvdnme13");
+
+        // 账龄表主表: 1 开票档案, 合同业务类型, 开票编号
+        Map compId_main = UtilMap.map("associationFormField_m25j5gxb, selectField_lvc9x4vn, textField_lvdosccc", "kpdh_gl, selectField_lvc9x4vn, textField_lvdosccc");
+        // 账龄表主表: 2 开票公司, 公司编码, 开票类型,
+        compId_main.putAll(UtilMap.map("selectField_lvc9x4vo, textField_m065jst5, selectField_lvc9x4vp", "selectField_lvc9x4vo, textField_m065jst5, selectField_lvc9x4vp"));
+        // 账龄表主表: 3 项目点名称, 项目点编号, 收款协议
+        compId_main.putAll(UtilMap.map("textField_lvdntzul, textField_m25j5gxk, selectField_lvc9x4vq", "textField_m4h15mt7, textField_lvdntzul, selectField_lvc9x4vq"));
+        // 账龄表主表: 4 客户名称, 客户编号, 实际开票日期
+        compId_main.putAll(UtilMap.map("selectField_lvdojfui, textField_lvdojfuj, dateField_lw5ud9bk", "selectField_lvdojfui, textField_lvdojfuj, dateField_lw5ud9bk"));
+        // 账龄表主表: 5 实例ID, 发票号码, 发票状态
+        compId_main.putAll(UtilMap.map("textField_m25j5gyi, textField_lvd8pp35, selectField_lvituew9", "formInstanceId, textField_lvd8pp35, selectField_lvituew9"));
+
+        // 账龄表子表: 1 开票周期, 开票周期-文本, 开票内容, 含税单价, 数量, 税率
+        List<String> compId_detail = UtilList.asList("dateField_m25j5gxu", "textField_m25j5gxv", "textField_lvdnme0u", "numberField_lvdnme0w", "numberField_lvdnme0x", "numberField_lvdnme0y");
+        // 账龄表子表: 2 含税小计, 税额, 无税金额, 差异说明, 已回款金额, 回款周期, 回款周期-文本
+        compId_detail.addAll(Arrays.asList("numberField_lvdnme0z", "numberField_lvdnme10", "numberField_lvdnme11", "textareaField_m25j5gyc", "numberField_lvg084l9", "dateField_m0dp1g0e", "textField_m25j5gyh"));
+        // 账龄表子表: 匹配来源数据表
+        Map compIds_tab = UtilMap.map("tableField_lvc9x4vt, tableField_lvd8pp44, tableField_lvdnme13",
+                // 大业主对应子表
+                Arrays.asList("dateField_lw5uybgq", "dateField_lw5uybgq_wb", "textField_lvd8pp2t", "numberField_lvd8pp2v", "numberField_lvd8pp2w", "numberField_lvd8pp2x", "numberField_lvd8pp2y", "numberField_lvd8pp2z", "numberField_lvd8pp30", "textField_lvdnme0g", "numberField_lvg084lb", "dateField_m0f55roc", "dateField_m0f55roc_wb"),
+                // 工程订单对应子表
+                Arrays.asList("dateField_lvd8pp45", "ateField_lvd8pp45_wb", "textField_lvd8pp3w", "numberField_lvd8pp3y", "numberField_lvd8pp3z", "numberField_lvd8pp40", "numberField_lvd8pp41", "numberField_lvd8pp42", "numberField_lvd8pp43", "textField_lvdnme0h", "numberField_lvg084l9", "dateField_m0dp1g0e", "dateField_m0dp1g0e_wb"),
+                // 小业主\日报一次性对应子表
+                Arrays.asList("dateField_lvdnme0t", "dateField_lvdnme0t_wb", "textField_lvdnme0u", "numberField_lvdnme0w", "numberField_lvdnme0x", "numberField_lvdnme0y", "numberField_lvdnme0z", "numberField_lvdnme10", "numberField_lvdnme11", "textField_lvdnme12", "numberField_lvg084la", "dateField_m0f55roe", "dateField_m0f55roe_wb"));
+
+        // 明细处理为主表记录, 以明细形式写入
+        for (Map formData : dataList) {
+
+            String compId_type = UtilMap.getString(compIds, UtilMap.getString(formData, "selectField_lvc9x4vn"));
+            List<Map> details = UtilMap.getList(formData, compId_type);
+            log.info("账龄表同步, {}, {}, {}", UtilMap.getString(formData, "selectField_lvc9x4vn"), formData.get("formInstanceId"), details.size());
+            if (details.isEmpty()) {
+                continue;
+            }
+            // 主表字段匹配 kpdh_gl
+            Map dataForm = UtilMap.empty();
+            for (Object key : compId_main.keySet()) {
+                if ("kpdh_gl".equals(compId_main.get(key))) {
+                    dataForm.put(key, YDConf.associationForm("APP_ERBDTFS82HOVBPL3NFH0", "FORM-6603375ED27B4D059CBB919C2BEFA44BZVOL", UtilMap.getString(formData, "formInstanceId"), UtilMap.getString(formData, "textField_lvdosccc"), null, false));
+                } else {
+                    dataForm.put(key, formData.get(compId_main.get(key)));
+                }
+            }
+            // 子表数据匹配 _wb
+            for (Map detail : details) {
+                // 唯一条件: 单据编号 + 业务类型 + 开票周期
+                String compId_date = (String) UtilMap.getList(compIds_tab, compId_type).get(0);
+                long kpzq = UtilMap.getLong(detail, compId_date);
+                if (kpzq == 0) {
+                    continue;
+                }
+                List<String> arrCompId = UtilMap.getList(compIds_tab, compId_type);
+                for (int i = 0; i < arrCompId.size(); i++) {
+                    String key = compId_detail.get(i);
+                    if (arrCompId.get(i).contains("dateField_")) {
+                        String cId = arrCompId.get(i).replace("_wb", "");
+                        if (!detail.containsKey(cId)) {
+                            continue;
+                        }
+                        long tm = UtilMap.getLong(detail, cId);
+                        if (tm == 0) {
+                            continue;
+                        }
+                        if (arrCompId.get(i).contains("_wb")) {
+                            dataForm.put(key, UtilDateTime.format(new Date(tm), "yyyy-MM"));
+                        } else {
+                            dataForm.put(key, tm);
+                        }
+                    } else {
+                        dataForm.put(key, detail.get(arrCompId.get(i)));
+                    }
+                }
+                String kpzq_wb = UtilDateTime.format(new Date(kpzq), "yyyy-MM");
+                List<Map> searchCondition = Arrays.asList(YDConf.searchCondition_TextFiled("textField_lvdosccc", UtilMap.getString(formData, "textField_lvdosccc"), "eq"),
+                        YDConf.searchCondition_TextFiled("selectField_lvc9x4vn", UtilMap.getString(formData, "selectField_lvc9x4vn"), "eq"),
+                        YDConf.searchCondition_TextFiled("textField_m25j5gxv", kpzq_wb, "eq"));
+                // 回款状态与未回款金额记录, 用于催款函查询
+                float figure = UtilMap.getFloat(dataForm, "numberField_lvdnme0z") - UtilMap.getFloat(dataForm, "numberField_lvg084l9");
+                dataForm.put("radioField_m4qrz687", figure == 0 ? "是" : "否");
+                dataForm.put("numberField_m4qrz685", figure);
+                ydClient.operateData(_initLYParam()
+                        .searchCondition(JSON.toJSONString(searchCondition))
+                        .formUuid("FORM-EC785A5AB2B9432C892062823EB7C62A9NTL")
+                        .formDataJson(JSON.toJSONString(dataForm))
+                        .build(), YDConf.FORM_OPERATION.upsert_v2);
+            }
+        }
+    }
+}

+ 1 - 0
mjava/src/main/java/com/malk/server/aliwork/YDConf.java

@@ -74,6 +74,7 @@ public class YDConf {
         delete,             // 传入为body, 文档为param
         update,
         upsert,
+        upsert_v2,                  // 新版本 searchCondition 条件精准匹配
         multi_create,               // 批量操作
         delete_batch,               // 批量删除
         multi_update,               // 批量更新

+ 7 - 0
mjava/src/main/java/com/malk/service/aliwork/impl/YDClientImpl.java

@@ -42,6 +42,10 @@ public class YDClientImpl implements YDClient {
     private String getRequestUrl(String uri) {
         return "https://api.dingtalk.com/v1.0/yida" + uri;
     }
+    // 请求地址 [v2]
+    private String getRequestUrl_v2(String uri) {
+        return "https://api.dingtalk.com/v2.0/yida" + uri;
+    }
 
     // 请求地址 [实例]
     private String getRequestUrl(String uri, String instanceId) {
@@ -65,6 +69,9 @@ public class YDClientImpl implements YDClient {
             case upsert:
                 ddr_new = (DDR_New)UtilHttp.doPost(this.getRequestUrl("/forms/instances/insertOrUpdate"), this.ddClient.initTokenHeader(), bodys, DDR_New.class);
                 break;
+            case upsert_v2:
+                ddr_new = (DDR_New) UtilHttp.doPost(this.getRequestUrl_v2("/forms/instances/insertOrUpdate"), this.ddClient.initTokenHeader(), bodys, DDR_New.class);
+                break;
             case delete:
                 ddr_new = (DDR_New) UtilHttp.doDelete(getRequestUrl("/forms/instances"), ddClient.initTokenHeader(), bodys, DDR_New.class);
                 break;