|
@@ -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);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|