瀏覽代碼

完整流程代码提交

“lqy 18 小時之前
父節點
當前提交
2649be4555

+ 21 - 41
mjava-lilin/pom.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.malk</groupId>
@@ -7,12 +8,21 @@
     <version>0.0.1-SNAPSHOT</version>
     <name>mjava-lilin</name>
     <description>mjava-lilin</description>
+
+    <!-- ✅ 使用统一的 parent -->
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.7.18</version>
+        <relativePath/>
+    </parent>
+
     <properties>
         <java.version>1.8</java.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-        <spring-boot.version>2.6.13</spring-boot.version>
     </properties>
+
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -23,11 +33,6 @@
             <artifactId>fastjson</artifactId>
             <version>1.2.83</version>
         </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
         <dependency>
             <groupId>com.squareup.okhttp3</groupId>
             <artifactId>okhttp</artifactId>
@@ -48,49 +53,24 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-dependencies</artifactId>
-                <version>${spring-boot.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
 
     <build>
+        <finalName>lilin</finalName>
         <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.8.1</version>
-                <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
-                    <encoding>UTF-8</encoding>
-                </configuration>
-            </plugin>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
-                <version>${spring-boot.version}</version>
                 <configuration>
-                    <mainClass>com.malk.lilin.MjavaLilinApplication</mainClass>
-                    <skip>true</skip>
+                    <executable>true</executable>
+                    <includeSystemScope>true</includeSystemScope>
                 </configuration>
-                <executions>
-                    <execution>
-                        <id>repackage</id>
-                        <goals>
-                            <goal>repackage</goal>
-                        </goals>
-                    </execution>
-                </executions>
             </plugin>
         </plugins>
     </build>
-
-</project>
+</project>

+ 18 - 17
mjava-lilin/src/main/java/com/malk/lilin/Controller/LiLinController.java

@@ -5,16 +5,10 @@ import com.alibaba.fastjson.JSON;
 import com.malk.lilin.Service.LiLinService;
 import com.malk.server.common.McR;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -25,45 +19,52 @@ import java.util.Objects;
 public class LiLinController {
     @Autowired
     private LiLinService liLinService;
+
     @GetMapping("/test")
     public McR test() {
-       return McR.success();
+        return McR.success();
     }
+
     @PostMapping("/lilinUpsert")
-    public McR lilinUpsert(@RequestBody Map<String,Object> map) {
-        if (Objects.nonNull(map.get("rqqj"))){
+    public McR lilinUpsert(@RequestBody Map<String, Object> map) {
+        if (Objects.nonNull(map.get("rqqj"))) {
             List<String> rqqj = (List<String>) map.get("rqqj");
-            String  bdbh = String.valueOf(map.get("ddbh"));
-            return liLinService.lilinUpsert(rqqj,bdbh);
+            String bdbh = String.valueOf(map.get("ddbh"));
+            return liLinService.lilinUpsert(rqqj, bdbh);
 
         }
         return McR.errorParam("实例id不能为空!");
     }
+
     @PostMapping("/lilinhqbank")//获取银行联行号
-    public McR hqbank(@RequestBody Map<String,Object> map) throws IOException {
+    public McR hqbank(@RequestBody Map<String, Object> map) throws IOException {
         log.info("lilinhqbank:{}", JSON.toJSONString(map));
         return liLinService.hqbank(map);
     }
+
     @PostMapping("/lilinZD")//付款制单
-    public McR lilinZD(@RequestBody Map<String,Object> map) throws IOException {
+    public McR lilinZD(@RequestBody Map<String, Object> map) throws IOException {
         log.info("lilinZD:{}", JSON.toJSONString(map));
-            return liLinService.lilinZD(map);
+        return liLinService.lilinZD(map);
 
     }
+
     @PostMapping("/lilinJG")//支付结果查询
-    public McR lilinJG(@RequestBody Map<String,Object> map) throws IOException {
+    public McR lilinJG(@RequestBody Map<String, Object> map) throws IOException {
         log.info("lilinJG:{}", JSON.toJSONString(map));
         return liLinService.lilinJG(map);
 
     }
+
     @PostMapping("/lilinLS")//查银行流水
-    public McR lilinLS(@RequestBody Map<String,Object> map) throws IOException {
+    public McR lilinLS(@RequestBody Map<String, Object> map) throws IOException {
         log.info("lilinLS:{}", JSON.toJSONString(map));
         return liLinService.lilinLS(map);
 
     }
+
     @PostMapping("/lilinLSCF")//流水拆分
-    public McR lilinLSCF(@RequestBody Map<String,Object> map) throws IOException {
+    public McR lilinLSCF(@RequestBody Map<String, Object> map) throws IOException {
         log.info("lilinLSCF:{}", JSON.toJSONString(map));
         return liLinService.lilinLSCF(map);
 

+ 204 - 11
mjava-lilin/src/main/java/com/malk/lilin/Controller/taskController.java

@@ -1,10 +1,16 @@
 package com.malk.lilin.Controller;
 
-import cn.hutool.core.io.FileUtil;
 import cn.hutool.crypto.SecureUtil;
-import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.malk.lilin.Service.LiLinService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.service.aliwork.YDClient;
+import com.malk.utils.UtilMap;
+import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
@@ -14,14 +20,15 @@ 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;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.io.IOException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
 @RestController
 @Configuration
 @Slf4j
@@ -31,6 +38,7 @@ import java.time.format.DateTimeFormatter;
 public class taskController {
     @Autowired
     private LiLinService lilinService;
+
     public static void main(String[] args) throws IOException {
 
         System.out.println(token().getData());
@@ -47,20 +55,22 @@ public class taskController {
         OkHttpClient client = new OkHttpClient();
 
         Request request = new Request.Builder()
-                .url("https://openapi.xencio.com/sandbox/cfa/api/bank/searchBranch?securityCode="+token().getData()+"&queryType=full")
+                .url("https://openapi.xencio.com/sandbox/cfa/api/bank/searchBranch?securityCode=" + token().getData() + "&queryType=full")
                 .get()
                 .addHeader("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a")
                 .addHeader("content-type", "application/x-www-form-urlencoded")
                 .build();
         Response response = client.newCall(request).execute();
     }
+
     @GetMapping("/token")
 
-    public String  token1() {
+    public String token1() {
         return (String) token().getData();
     }
-//    @Scheduled(cron = "0 44 14 * * ?")
-//    @Scheduled(fixedRate = 30 * 60 * 1000)
+
+    //    @Scheduled(cron = "0 44 14 * * ?")
+    @Scheduled(fixedRate = 30 * 60 * 1000)
     public void task() {
         log.info("定时获取单笔付款结果开始:{}", LocalDateTime.now());
         try {
@@ -73,7 +83,7 @@ public class taskController {
 
     }
 
-//    @Scheduled(fixedRate = 60 * 60 * 1000)
+        @Scheduled(fixedRate = 60 * 60 * 1000)
     public void taskLS() {
         log.info("定时获取银行流水结果开始:{}", LocalDateTime.now());
         try {
@@ -82,15 +92,198 @@ public class taskController {
             // 记录错误信息
             e.printStackTrace();
         }
+    }
+
+        @Scheduled(fixedRate = 30 * 60 * 1000)
+    public void taskPLJG() {
+        log.info("定时获取支付结果发起批量审批开始:{}", LocalDateTime.now());
+        try {
+            lilinService.taskPLJG();
+        } catch (Exception e) {
+            // 记录错误信息
+            e.printStackTrace();
+        }
+    }
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+    @Autowired
+    private DDConf ddConf;
+
+    @SneakyThrows
+    @PostMapping("/insetRLW")
+    McR insetRLW(@RequestBody JSONObject param) {
+        String formInstanceId = param.getString("formInstanceId");
+        log.info("formInstanceId:{}", formInstanceId);
+        // 根据实例ID获取表单数据
+        Map data = (Map) ydClient.queryData(YDParam.builder()
+                .formInstId(formInstanceId)
+                .appType(ydConf.getAppType())
+                .systemToken(ydConf.getSystemToken())
+                .userId(ddConf.getOperator())
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        if (data == null) {
+            log.warn("formData 为空, formInstanceId:{}", formInstanceId);
+            return McR.errorParam("formData 为空");
+        }
 
+        // 提取字段值
+        String xm = (String) data.get("textField_cbp011r");
+        String lxdh = (String) data.get("textField_e03i1pp");
+        String zjhm = (String) data.get("textField_zzw8p5a");
+        Object cbgszt = data.get("textField_047q8sa");
+        String jzgw = (String) data.get("textField_th8v2yz");
+        Long htksrq = (Long) data.get("dateField_vcsn4ij");
+        Long htjsrq = (Long) data.get("dateField_8hefkvf");
+        Long syksrq = (Long) data.get("dateField_v0mq0eh");
+        Long syjsrq = (Long) data.get("dateField_5m94qor");
+        Integer htqx = (Integer) data.get("numberField_pcryupm");
+        String gzd = (String) data.get("textField_mds5v9ws");
+        String gzzd = (String) data.get("textField_5ug31ny");
+        Integer jbgzzs = (Integer) data.get("numberField_6yzgnbn");
+        String sbd = (String) data.get("textField_kvingds");
+        Integer sbjs = (Integer) data.get("numberField_49g9wy0");
+        Integer gjjjs = (Integer) data.get("numberField_ptdrap4");
+        String yglx = (String) data.get("textField_idzudk7");
 
+        // 查询人力窝标志
+        List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-3B6D99D1B3E1422BBC848E5AD5FD3B99KQYW")
+                .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_md5p9nay", gzd)))
+                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+
+
+        String sfrlw = "否"; // 默认值
+
+        if (list != null && !list.isEmpty()) {
+            try {
+                Map<?, ?> formData = null;
+                Object firstItem = list.get(0);
+
+                // 尝试获取 formData 内部数据,如果不存在则使用顶层数据
+                if (firstItem instanceof Map) {
+                    Map<?, ?> itemMap = (Map<?, ?>) firstItem;
+                    Object rawData = itemMap.get("formData");
+                    formData = (rawData instanceof Map) ? (Map<?, ?>) rawData : itemMap;
+                }
+
+                if (formData != null) {
+                    Object val = formData.get("radioField_mde59hby");
+                    if (val != null && "是".equals(val.toString().trim())) {
+                        sfrlw = "是";
+                    }
+                }
+            } catch (Exception e) {
+                log.warn("解析人力窝标志失败", e);
+                // 异常时保持 sfrlw = "否"
+            }
+        }
+
+
+        // 构建目标表单数据
+        Map<String, Object> formData = new HashMap<>();
+
+        formData.put("textField_swflbna", xm);
+        formData.put("textField_wlfqmpt", lxdh);
+        formData.put("textField_jkc1eg0", zjhm);
+        formData.put("textField_ans20nj", cbgszt);
+        formData.put("textField_eefjs16", jzgw);
+        formData.put("dateField_973ypn3", htksrq);
+        formData.put("dateField_1udu9fe", htjsrq);
+        formData.put("dateField_uzg03bt", syksrq);
+        formData.put("dateField_zqyq80r", syjsrq);
+        formData.put("numberField_eeaqsst", htqx);
+        formData.put("textField_d4nmf4u", gzd);
+        formData.put("textField_1n9ndz9", gzzd);
+        formData.put("numberField_ivcq47u", jbgzzs);
+        formData.put("textField_6t648n0", sbd);
+        formData.put("numberField_ker1ufe", sbjs);
+        formData.put("numberField_4b3vaj2", gjjjs);
+        formData.put("textField_0jfrjiw", yglx);
+
+        // 设置人力窝相关标志
+        if ("是".equals(sfrlw)) {
+            formData.put("textField_pqh9s53", "是");
+            formData.put("textField_2q3356p", "否");
+        } else {
+            formData.put("textField_pqh9s53", "否");
+            formData.put("textField_2q3356p", "是");
+        }
+
+        // 提交到目标表单
+        ydClient.operateData(YDParam.builder()
+                .formUuid("FORM-4292D265889B4759A29F37F535FE306AP4ER")
+                .formDataJson(JSON.toJSONString(formData))
+                .userId("01150949543132101208")
+                .build(), YDConf.FORM_OPERATION.create);
+
+        return McR.success();
     }
 
+    @PostMapping("/test")
+    String  test(@RequestBody Map param) {
+//        List<Map> khlist = (List<Map>) ydClient.queryData(
+//                YDParam.builder()
+//                        .formUuid("FORM-2C2D6EAC04FD48D295590EB6BD287B13DVMV")
+//                        .build(),
+//                YDConf.FORM_QUERY.retrieve_list_all
+//        ).getData();
+//
+//        List<String> khdaList = khlist.stream()
+//                .map(item -> (Map<String, Object>) item.get("formData"))
+//                .filter(Objects::nonNull) // 过滤掉 formData 为 null 的
+//                .map(formData -> (String) formData.get("textField_mdwiyspj"))
+//                .filter(yhzh -> yhzh != null && !yhzh.trim().isEmpty())
+//                .collect(Collectors.toList());
+        List<String> khdaList = Arrays.asList(
+                "1001260509024819590",
+                "1001260509424880696",
+                "1001260509324868573",
+                "1001260509324808614"
+        );
+        for (String accountNo : khdaList) {
+            try {
+                // 假设这是你要对每个 accountNo 做的业务逻辑
+                System.out.println("正在处理账号: " + accountNo);
+            } catch (Exception e) {
+                log.error("处理账号失败: {}", accountNo, e);
+
+            }
+        }
+// 使用结果
+//        System.out.println("所有银行账号: " + yhzhList);
 
+//        for (Map<String, Object> item : khlist) {
+//            String formInstanceId = (String) item.get("formInstanceId");
+//
+//            Map<String, Object> formData = (Map<String, Object>) item.get("formData");
+//            String textFieldValue = (String) formData.get("textField_m8sjaafp");
+//
+//            Map<String, Object> formData1 = new HashMap<>();
+//
+//            formData1.put("associationFormField_mdwt4s1d", Arrays.asList(getkhAss(textFieldValue,formInstanceId)));
+//
+//            ydClient.operateData(YDParam.builder()
+//                    .formUuid("FORM-DAEFD29BDE4D4A7D9DA8DDA848DA3D12X5S8")
+//                    .processCode("TPROC--9DD668C1KMQXI9A68YLJ26K02B4M210H4TWDM0")
+//                    .formDataJson(JSON.toJSONString(formData1))
+//                    .userId("275412081437800471")
+//                    .build(), YDConf.FORM_OPERATION.start);
+//        }
+        return "aa";
+    }
+    private Object getkhAss(String title, String id) {
+        return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_RPH7R3LF3SMXLRDY1ZJW", "FORM-E18CC7F3495B45BB852CB386F325BF03IAS3", "receipt", id, title, "");
+    }
     private static McR token() {
         String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        String s = SecureUtil.md5("KHPuj0JMS6nS1ACzc#" + today);
+        String s = SecureUtil.md5("}bH5%t4_)6e3#" + today);
         return McR.success(s);
     }
 
+
 }
+

+ 2 - 0
mjava-lilin/src/main/java/com/malk/lilin/Service/LiLinService.java

@@ -21,4 +21,6 @@ public interface LiLinService {
     McR lilinLS(Map<String, Object> map) throws IOException;
 
     McR lilinLSCF(Map<String, Object> map) throws IOException;
+
+    McR taskPLJG() ;
 }

+ 351 - 150
mjava-lilin/src/main/java/com/malk/lilin/Service/impl/LiLinServiceImpl.java

@@ -3,11 +3,9 @@ package com.malk.lilin.Service.impl;
 
 import cn.hutool.crypto.SecureUtil;
 
-import com.alibaba.excel.util.StringUtils;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.TypeReference;
 import com.malk.lilin.Service.LiLinService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
@@ -32,8 +30,8 @@ import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.DoubleAdder;
+import java.util.stream.Collectors;
 
 @Slf4j
 @Service
@@ -53,7 +51,7 @@ public class LiLinServiceImpl implements LiLinService {
     @Override
     public McR lilinUpsert(List<String> rqqj, String bdbh) {
         List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
-                .formUuid("FORM-B4B6126350C041EAAF4F04AECF6A3F0C95NV")
+                .formUuid("FORM-5F8B2B6418E14EF0967CC60DA25A7558K5L7")
                 .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
                         new YDSearch("createTime", rqqj, "DateField", YDSearch.Type.DATE_FIELD, YDSearch.Operator.BETWEEN),
                         new YDSearch("textField_m9cdsn32", bdbh, "TextField", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ))))
@@ -157,7 +155,7 @@ public class LiLinServiceImpl implements LiLinService {
                             // 查询项目主表单
                             List<Map> xmdata = (List<Map>) ydClient.queryData(
                                     YDParam.builder()
-                                            .formUuid("FORM-198963B3B465493D859E56557A4E346FPA15")
+                                            .formUuid("FORM-FFA52F0206684931A0F18C00C2C937EAAVI5")
                                             .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m9awsc29", xmbh)))
                                             .build(),
                                     YDConf.FORM_QUERY.retrieve_list_all
@@ -215,7 +213,7 @@ public class LiLinServiceImpl implements LiLinService {
                 }
                 for (String ddbh : orderToProjectMap.keySet()) {
                     List<Map> data = (List<Map>) ydClient.queryData(YDParam.builder()
-                            .formUuid("FORM-BDA88E0932564B64B1619AC05290A012L16E")
+                            .formUuid("FORM-C9BC8F7A159E4281B707ADBE1628EB7FDACQ")
                             .searchFieldJson(JSONObject.toJSONString(UtilMap.map("textField_m9cdcten", ddbh)))
                             .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
 
@@ -319,7 +317,7 @@ public class LiLinServiceImpl implements LiLinService {
                     if (!details2.isEmpty()) {
                         ydClient.operateData(YDParam.builder()
                                 .formInstanceIdList(details2)
-                                .formUuid("FORM-B4B6126350C041EAAF4F04AECF6A3F0C95NV")
+                                .formUuid("FORM-5F8B2B6418E14EF0967CC60DA25A7558K5L7")
                                 .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_md6z2k32", "已同步")))
                                 .useLatestVersion(true)
                                 .build(), YDConf.FORM_OPERATION.multi_update);
@@ -551,9 +549,9 @@ public class LiLinServiceImpl implements LiLinService {
             String name = String.valueOf(map.get("name"));
             OkHttpClient client = new OkHttpClient();
             Request request = new Request.Builder()
-                    .url("https://openapi.xencio.com/sandbox/cfa/api/bank/searchBranch?securityCode=" + token().getData() + "&queryType=full&name=" + name)
+                    .url("https://x.xencio.com/c4c3/api/bank/searchBranch?securityCode=" + token().getData() + "&queryType=full&name=" + name)
                     .get()
-                    .addHeader("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a")
+                    .addHeader("x-xencio-client-id", "7dc3a31209b94a91ba40a44358fe70eb")
                     .addHeader("content-type", "application/x-www-form-urlencoded")
                     .build();
             Response response = client.newCall(request).execute();
@@ -661,9 +659,9 @@ public class LiLinServiceImpl implements LiLinService {
         // 公共参数
         String securityCode = String.valueOf(token().getData());
         Map<String, String> headers = new HashMap<>();
-        headers.put("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a");
-        headers.put("Content-Type", "application/x-www-form-urlencoded");
-        String url = "https://openapi.xencio.com/sandbox/cfa/api/payment/transfer";
+        headers.put("x-xencio-client-id", "7dc3a31209b94a91ba40a44358fe70eb");
+        headers.put("content-Type", "application/x-www-form-urlencoded");
+        String url = "https://x.xencio.com/c4c3/api/payment/transfer";
 
         // 判断是否为物流付款单
         if ("物流付款单".equals(fklx)) {
@@ -694,6 +692,7 @@ public class LiLinServiceImpl implements LiLinService {
                 mapAll.put("toAccountCode", toAccountCode);
                 mapAll.put("toAccountName", toAccountName);
                 mapAll.put("payAmount", payAmount);
+                mapAll.put("source", "OA");
                 mapAll.put("note", note);
                 mapAll.put("toBank", toBank);
                 mapAll.put("securityCode", securityCode);
@@ -723,6 +722,7 @@ public class LiLinServiceImpl implements LiLinService {
             mapAll.put("toAccountCode", toAccountCode);
             mapAll.put("toAccountName", toAccountName);
             mapAll.put("payAmount", payAmount);
+            mapAll.put("source", "OA");
             mapAll.put("note", note);
             mapAll.put("toBank", toBank);
             mapAll.put("securityCode", securityCode);
@@ -741,7 +741,7 @@ public class LiLinServiceImpl implements LiLinService {
     public McR lilinJG(Map<String, Object> map) throws IOException {
         // 1. 查询所有需要处理的单据(状态为“已审批待付款”或“已审批部分付款”)
         List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
-                .formUuid("FORM-1A612AA91BAC467CB9823B6CB92491152WZH")
+                .formUuid("FORM-754586D31BF6414586E5C20DB3774A7320CV")
                 .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
                         new YDSearch("selectField_ma0w9yrb",
                                 Arrays.asList("已审批待付款", "已审批部分付款"),
@@ -749,7 +749,7 @@ public class LiLinServiceImpl implements LiLinService {
                                 YDSearch.Type.RADIO_FIELD,
                                 YDSearch.Operator.CONTAINS)
                 )))
-            .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
 
         if (list == null || list.isEmpty()) {
             log.info("没有找到需要处理的单据");
@@ -759,12 +759,12 @@ public class LiLinServiceImpl implements LiLinService {
         log.info("共查询到 {} 条待处理单据", list.size());
 
         // 公共参数提前准备(安全码、URL、请求头等)
-        String url = "https://openapi.xencio.com/sandbox/cfa/api/payment/transferStatus";
+        String url = "https://x.xencio.com/c4c3/api/payment/transferStatus";
         String securityCode = String.valueOf(token().getData());
 
         Map<String, String> headers = new HashMap<>();
-        headers.put("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a");
-        headers.put("Content-Type", "application/x-www-form-urlencoded");
+        headers.put("x-xencio-client-id", "7dc3a31209b94a91ba40a44358fe70eb");
+        headers.put("content-Type", "application/x-www-form-urlencoded");
 
         Map<String, Object> params = new HashMap<>();
         params.put("securityCode", securityCode);
@@ -919,18 +919,12 @@ public class LiLinServiceImpl implements LiLinService {
 
     @Override
     public McR lilinLS(Map<String, Object> map) {
-//        String accountNo = String.valueOf(map.get("accountNo"));
-        String accountNo = "888001";
-        if (accountNo == null || accountNo.trim().isEmpty()) {
-            return McR.errorParam("accountNo 不能为空");
-        }
-        accountNo = accountNo.trim();
-
-        log.info("开始对账单同步,accountNo: {}", accountNo);
-
-        // 准备时间范围
-        String dayFromId = LocalDate.now().minusDays(10).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        String dayToId = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        List<String> khdaList = Arrays.asList(
+                "1001260509024819590",
+                "1001260509424880696",
+                "1001260509324868573",
+                "1001260509324808614"
+        );
 
         // 获取 token 一次
         String securityCode;
@@ -945,110 +939,157 @@ public class LiLinServiceImpl implements LiLinService {
             return McR.errorParam("认证信息获取失败");
         }
 
-        // 构建 POST 请求体
-        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
-        String requestBodyStr = "securityCode=" + securityCode +
-                "&accountNo=" + accountNo +
-                "&dayFromId=" + dayFromId +
-                "&dayToId=" + dayToId +
-                "&instructionIdFlag=1" +
-                "&pageNow=1" +
-                "&trxFlag=R" +
-                "&pageSize=20";
-
-        RequestBody body = RequestBody.create(mediaType, requestBodyStr);
-
-        Request request = new Request.Builder()
-                .url("https://openapi.xencio.com/sandbox/cfa/api/bs/list")
-                .post(body)
-                .addHeader("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a")
-                .addHeader("content-Type", "application/x-www-form-urlencoded")
-                .build();
-
         OkHttpClient client = new OkHttpClient();
 
-        Response response = null;
-        try {
-            response = client.newCall(request).execute();
-            if (!response.isSuccessful()) {
-                log.error("银行接口调用失败,HTTP状态码: {}", response.code());
-                return McR.errorParam("接口调用失败: " + response.code());
-            }
+        for (String accountNo : khdaList) {
+            Response response = null;
+            try {
+                if (accountNo == null || accountNo.trim().isEmpty()) {
+                    log.warn("跳过空 accountNo");
+                    continue;
+                }
+                accountNo = accountNo.trim();
+
+                log.info("开始对账单同步,accountNo: {}", accountNo);
+
+                // 准备时间范围
+                String dayFromId = LocalDate.now().minusDays(7).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+                String dayToId = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+
+                // 构建 POST 请求体
+                MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
+                String requestBodyStr = "securityCode=" + securityCode +
+                        "&accountNo=" + accountNo +
+                        "&dayFromId=" + dayFromId +
+                        "&dayToId=" + dayToId +
+                        "&instructionIdFlag=1" +
+                        "&pageNow=1" +
+                        "&trxFlag=R" +
+                        "&pageSize=20";
+
+                RequestBody body = RequestBody.create(mediaType, requestBodyStr);
+
+                Request request = new Request.Builder()
+                        .url("https://x.xencio.com/c4c3/api/bs/list")
+                        .post(body)
+                        .addHeader("x-xencio-client-id", "7dc3a31209b94a91ba40a44358fe70eb")
+                        .addHeader("content-Type", "application/x-www-form-urlencoded")
+                        .build();
+
+                response = client.newCall(request).execute();
+
+                if (!response.isSuccessful()) {
+                    log.error("银行接口调用失败,HTTP状态码: {}", response.code());
+                    continue; // 跳过当前账号
+                }
 
-            String jsonStr = response.body().string();
-            log.debug("银行接口响应原始数据: {}", jsonStr);
+                String jsonStr = response.body().string();
+                log.debug("银行接口响应原始数据: {}", jsonStr);
 
-            JSONObject jsonObject = JSON.parseObject(jsonStr);
-            JSONObject data = jsonObject.getJSONObject("data");
-            if (data == null) {
-                log.error("响应中缺少 'data' 字段");
-                return McR.errorParam("响应数据格式错误:缺少 data");
-            }
+                JSONObject jsonObject = JSON.parseObject(jsonStr);
+                JSONObject data = jsonObject.getJSONObject("data");
+                if (data == null) {
+                    log.error("响应中缺少 'data' 字段, accountNo: {}", accountNo);
+                    continue;
+                }
 
-            JSONArray statementList = data.getJSONArray("searchBankStatementList");
-            if (statementList == null || statementList.isEmpty()) {
-                log.info("银行接口返回空列表,accountNo: {}", accountNo);
-                return McR.success("无对账单数据");
-            }
+                JSONArray statementList = data.getJSONArray("searchBankStatementList");
+                if (statementList == null || statementList.isEmpty()) {
+                    log.info("银行接口返回空列表,accountNo: {}", accountNo);
+                    continue;
+                }
+
+                List<Map<String, String>> extractedList = new ArrayList<>();
+
+                for (int i = 0; i < statementList.size(); i++) {
+                    JSONObject item = statementList.getJSONObject(i);
+                    if (item == null) continue;
+
+                    Map<String, String> extractedItem = new HashMap<>();
+                    String bankStatementId = getStringValue(item, "bankStatementId");
+                    String bankComments = getStringValue(item, "bankComments");
+                    String crAmount = getStringValue(item, "crAmount");
+                    String trxDate = getStringValue(item, "trxDate");
+                    String accountName = getStringValue(item, "accountName"); // 本方账号名称
+                    String userRemarks = getStringValue(item, "userRemarks");
+                    String userMemo = getStringValue(item, "userMemo");
+                    String transFlag = getStringValue(item, "transFlag");
+                    String catalogName = getStringValue(item, "catalogName");
+                    String customerName = getStringValue(item, "customerName"); // 对手方账户名称
+
+                    Long timestamp = null;
+                    if (trxDate != null && !trxDate.isEmpty()) {
+                        try {
+                            timestamp = LocalDateTime.parse(trxDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
+                                    .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+                        } catch (Exception e) {
+                            log.warn("日期解析失败: {}", trxDate);
+                        }
+                    }
 
-            List<Map<String, String>> extractedList = new ArrayList<>();
-
-            for (int i = 0; i < statementList.size(); i++) {
-                JSONObject item = statementList.getJSONObject(i);
-                if (item == null) continue;
-
-                Map<String, String> extractedItem = new HashMap<>();
-                String bankStatementId = getStringValue(item, "bankStatementId");
-                String bankComments = getStringValue(item, "bankComments");
-                String crAmount = getStringValue(item, "crAmount");
-                String trxDate = getStringValue(item, "trxDate");
-                String userRemarks = getStringValue(item, "userRemarks");
-                String userMemo = getStringValue(item, "userMemo");
-                String transFlag = getStringValue(item, "transFlag");
-                String catalogName = getStringValue(item, "catalogName");
-                String customerName = getStringValue(item, "customerName");
-
-                // 提取时间戳
-                Long timestamp = null;
-                if (trxDate != null && !trxDate.isEmpty()) {
+                    extractedItem.put("bankStatementId", bankStatementId);
+                    extractedItem.put("bankComments", bankComments);
+                    extractedItem.put("crAmount", crAmount);
+                    extractedItem.put("accountName", accountName);
+                    extractedItem.put("trxDate", trxDate);
+                    extractedItem.put("userRemarks", userRemarks);
+                    extractedItem.put("customerName", customerName);
+                    extractedList.add(extractedItem);
+
+                    // 检查是否已存在该对账单记录
+                    boolean exists = false;
                     try {
-                        timestamp = LocalDateTime.parse(trxDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
-                                .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+                        List<Map> list = (List<Map>) ydClient.queryData(
+                                YDParam.builder()
+                                        .formUuid("FORM-AF6E9FBF8F7642D59A333BC9EF3DF3FB836A")
+                                        .appType("APP_RPH7R3LF3SMXLRDY1ZJW")
+                                        .systemToken("7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT")
+                                        .searchCondition(JSON.toJSONString(UtilMap.map("textField_mdh05xw6", bankStatementId)))
+                                        .build(),
+                                YDConf.FORM_QUERY.retrieve_list_all
+                        ).getData();
+
+                        exists = list != null && !list.isEmpty();
                     } catch (Exception e) {
-                        log.warn("日期解析失败: {}", trxDate);
+                        log.error("查询宜搭系统失败,bankStatementId: {}", bankStatementId, e);
                     }
-                }
 
-                // 填充提取数据
-                extractedItem.put("bankStatementId", bankStatementId);
-                extractedItem.put("bankComments", bankComments);
-                extractedItem.put("crAmount", crAmount);
-                extractedItem.put("trxDate", trxDate);
-                extractedItem.put("userRemarks", userRemarks);
-                extractedItem.put("customerName", customerName);
-                extractedList.add(extractedItem);
-
-                // ===== 查询是否已存在 =====
-                boolean exists = false;
-                try {
-                    List<Map> list = (List<Map>) ydClient.queryData(
-                            YDParam.builder()
-                                    .formUuid("FORM-AC0D84A40AD64E469C6AC6D049931C22IDO8")
-                                    .appType("APP_V25MK3XKODKB02UVTGSH")
-                                    .systemToken("IQC66GC1L5TW5HKF6SX645RC4AXG2CFGQOMCMOQ4")
-                                    .searchCondition(JSON.toJSONString(UtilMap.map("textField_mdh05xw6", bankStatementId)))
-                                    .build(),
-                            YDConf.FORM_QUERY.retrieve_list_all
-                    ).getData();
-
-                    exists = list != null && !list.isEmpty();
-                } catch (Exception e) {
-                    log.error("查询宜搭系统失败,bankStatementId: {}", bankStatementId, e);
-                }
+                    if (exists) {
+                        log.debug("记录已存在,跳过: bankStatementId={}", bankStatementId);
+                        continue;
+                    }
 
-                // ===== 若不存在则创建 =====
-                if (!exists && bankStatementId != null && !bankStatementId.isEmpty()) {
+                    // 查询客户主数据
+                    String khformInstanceId = null;
+                    String khaccountName = null;
                     try {
+                        List<Map> khlist = (List<Map>) ydClient.queryData(
+                                YDParam.builder()
+                                        .formUuid("FORM-E18CC7F3495B45BB852CB386F325BF03IAS3")
+                                        .appType("APP_RPH7R3LF3SMXLRDY1ZJW")
+                                        .systemToken("7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT")
+                                        .searchCondition(JSON.toJSONString(UtilMap.map("textField_m8sjaafp", customerName)))
+                                        .build(),
+                                YDConf.FORM_QUERY.retrieve_list_all
+                        ).getData();
+
+                        if (khlist != null && !khlist.isEmpty()) {
+                            for (Map<String, Object> khitem : khlist) {
+                                Map<String, Object> khformData = (Map<String, Object>) khitem.get("formData");
+                                if (khformData != null && customerName.equals(khformData.get("textField_m8sjaafp"))) {
+                                    khformInstanceId = (String) khitem.get("formInstanceId");
+                                    khaccountName = (String) khformData.get("textField_m8sjaafp");
+                                    break;
+                                }
+                            }
+                        }
+
+                        if (khformInstanceId == null || khaccountName == null) {
+                            log.warn("未找到匹配的客户信息: customerName={}", customerName);
+                            // 可选择跳过或继续(不关联客户)
+                        }
+
+                        // 构造 formData
                         Map<String, Object> formData = new HashMap<>();
                         formData.put("dateField_m8yeduje", timestamp != null ? timestamp : System.currentTimeMillis());
                         formData.put("dateField_mbg6gyre", timestamp != null ? timestamp : System.currentTimeMillis());
@@ -1059,42 +1100,50 @@ public class LiLinServiceImpl implements LiLinService {
                         formData.put("textField_mdh51nxq", userMemo);
                         formData.put("textField_mdh51nxr", transFlag);
                         formData.put("textField_mdh51nxs", catalogName);
+                        formData.put("selectField_m982msou", accountName);
 
-                        ydClient.operateData(YDParam.builder()
-                                .formUuid("FORM-AC0D84A40AD64E469C6AC6D049931C22IDO8")
-                                .processCode("TPROC--K8C66U6152SW46P3DKE38BFVC2AA3HQGQOMCM13")
-                                .formDataJson(JSON.toJSONString(formData))
-                                .userId("275412081437800471")
-                                .build(), YDConf.FORM_OPERATION.start);
+                        if (khaccountName != null && khformInstanceId != null) {
+                            formData.put("associationFormField_m8yeduj1",
+                                    Arrays.asList(getkhAss(khaccountName, khformInstanceId)));
+                        }
+
+                        // 提交创建流程
+                        ydClient.operateData(
+                                YDParam.builder()
+                                        .formUuid("FORM-AF6E9FBF8F7642D59A333BC9EF3DF3FB836A")
+                                        .processCode("TPROC--FPB66VB19FKVVL56E43NW6XQCP7T3URA33WAML3")
+                                        .formDataJson(JSON.toJSONString(formData))
+                                        .userId("275412081437800471")
+                                        .build(),
+                                YDConf.FORM_OPERATION.start
+                        );
 
                         log.info("成功创建对账记录: bankStatementId={}", bankStatementId);
+
                     } catch (Exception e) {
                         log.error("创建对账记录失败: bankStatementId={}", bankStatementId, e);
                     }
-                } else if (exists) {
-                    log.debug("记录已存在,跳过: bankStatementId={}", bankStatementId);
                 }
-            }
 
-            log.info("对账单同步完成,共处理 {} 条", extractedList.size());
-            return McR.success("同步完成"); // 可改为返回统计信息
+                log.info("对账单同步完成,accountNo={},共处理 {} 条", accountNo, extractedList.size());
 
-        } catch (IOException e) {
-            log.error("网络IO异常", e);
-            return McR.errorParam("网络请求失败: " + e.getMessage());
-        } catch (Exception e) {
-            log.error("未知异常", e);
-            return McR.errorParam("处理过程发生错误: " + e.getMessage());
-        } finally {
-            // 确保 response 被关闭
-            if (response != null) {
-                try {
-                    response.close();
-                } catch (Exception e) {
-                    log.warn("关闭 response 失败", e);
+            } catch (IOException e) {
+                log.error("网络IO异常: accountNo={}", accountNo, e);
+            } catch (Exception e) {
+                log.error("处理账号异常: accountNo={}", accountNo, e);
+            } finally {
+                // 确保 response 被安全关闭
+                if (response != null) {
+                    try {
+                        response.close();
+                    } catch (Exception e) {
+                        log.warn("关闭 HTTP 响应失败", e);
+                    }
                 }
             }
         }
+
+        return McR.success("所有账号同步完成");
     }
 
     // 工具方法:安全获取字符串值
@@ -1152,7 +1201,7 @@ public class LiLinServiceImpl implements LiLinService {
                 Map<String, Object> newItem = new HashMap<>();
                 newItem.put("itemIndex", i + 1);
                 newItem.put("amount", getAmountFromMap(row, "numberField_m9u2a5tf").doubleValue());
-                newItem.put("projectInfo", getStringValue(row, "textField_m9i9k5cl")+"-"+getStringValue(row, "textField_m8yedujm"));
+                newItem.put("projectInfo", getStringValue(row, "textField_m9i9k5cl") + "-" + getStringValue(row, "textField_m8yedujm"));
                 newItem.put("userMemo", userMemo);
                 newItem.put("trxFlag", transFlag);
                 newItem.put("catalogName", catalogName);
@@ -1172,7 +1221,7 @@ public class LiLinServiceImpl implements LiLinService {
         requestBody.put("subBankStatementList", subBankStatementList);
 
         // 请求参数
-        String url = "https://openapi.xencio.com/sandbox/cfa/api/sub/bs/splitBankStatement";
+        String url = "https://x.xencio.com/c4c3/api/sub/bs/splitBankStatement";
         String securityCode = String.valueOf(token().getData());
         if (securityCode == null || securityCode.isEmpty()) {
             log.error("获取 securityCode 失败");
@@ -1180,7 +1229,7 @@ public class LiLinServiceImpl implements LiLinService {
         }
 
         Map<String, String> headers = new HashMap<>();
-        headers.put("x-xencio-client-id", "4d9414e89bc24b0d89b678d9f20bc56a");
+        headers.put("x-xencio-client-id", "7dc3a31209b94a91ba40a44358fe70eb");
 
 //        Map params = new HashMap<>();
         headers.put("securityCode", securityCode);
@@ -1239,7 +1288,7 @@ public class LiLinServiceImpl implements LiLinService {
         }
 
         int successCount = 0, failCount = 0;
-        String updateUrl = "https://openapi.xencio.com/sandbox/cfa/api/sub/bs/updateProjectInfo";
+        String updateUrl = "https://x.xencio.com/c4c3/api/sub/bs/updateProjectInfo";
 
         for (Map<String, Object> item : result) {
             try {
@@ -1258,6 +1307,158 @@ public class LiLinServiceImpl implements LiLinService {
         return McR.success(result);
     }
 
+    @Override
+    public McR taskPLJG() {
+        List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
+                .formUuid("FORM-754586D31BF6414586E5C20DB3774A7320CV")
+                .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
+                        new YDSearch("selectField_ma0w9yrb",
+                                "已审批已付款",
+                                "SelectField",
+                                YDSearch.Type.RADIO_FIELD,
+                                YDSearch.Operator.EQ)
+                )))
+                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+
+        if (list == null || list.isEmpty()) {
+            log.info("没有找到需要处理的单据");
+            return McR.success("无待处理数据");
+        }
+
+        for (Map item : list) {
+            try {
+                String formInstanceId = getStringValue(item, "formInstanceId");
+                if (formInstanceId == null || formInstanceId.isEmpty()) {
+                    log.warn("跳过:formInstanceId 为空");
+                    continue;
+                }
+
+                // 获取源表单详情
+                Map data = (Map) ydClient.queryData(YDParam.builder()
+                        .formInstId(formInstanceId)
+                        .appType(ydConf.getAppType())
+                        .systemToken(ydConf.getSystemToken())
+                        .userId(ddConf.getOperator())
+                        .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+                if (data == null) {
+                    log.warn("formInstanceId={} 的 formData 为空,跳过", formInstanceId);
+                    continue;
+                }
+
+                String fklx = getStringValue(data, "selectField_m9ze3rjf"); // 付款类型
+                String mainInstructionId = getStringValue(data, "serialNumberField_m9ze3rjd"); // 主表流水号
+
+                // 🔍 查询目标表单是否已存在该 mainInstructionId 的记录
+                List<Map> list1 = (List<Map>) ydClient.queryData(
+                        YDParam.builder()
+                                .formUuid("FORM-6B8A683A23524D3596C8C6CA13327EF3552K")
+                                .appType("APP_RPH7R3LF3SMXLRDY1ZJW")
+                                .systemToken("7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT")
+                                .searchCondition(JSON.toJSONString(UtilMap.map("textField_mdsk7rlm", mainInstructionId)))
+                                .build(),
+                        YDConf.FORM_QUERY.retrieve_list_all
+                ).getData();
+
+                // ✅ 如果目标表单中已存在该流水号,则跳过,不再新增
+                if (list1 != null && !list1.isEmpty()) {
+                    log.info("已存在重复数据,跳过插入:mainInstructionId={}", mainInstructionId);
+                    continue;
+                }
+
+                // 继续提取其他字段
+                String note = getStringValue(data, "textField_m9ze3rk3"); // 付款用途
+                String toAccountCode = getStringValue(data, "textField_m9ze3rjs"); // 收款账号
+                String toAccountName = getStringValue(data, "textField_m9ze3rjl"); // 收款户名
+                String toBank = getStringValue(data, "textField_m9ze3rjr"); // 收款银行支行
+                String fromAccountCode = getStringValue(data, "textField_mdfnuyl9"); // 付款账号
+                String fromAccountName = getStringValue(data, "textField_m9ze3rj8"); // 付款户名
+                BigDecimal PayAmount;
+                List<Map<String, Object>> updateList = new ArrayList<>();
+
+                if ("物流付款单".equals(fklx)) {
+                    List<Map<String, Object>> tableField = (List<Map<String, Object>>) data.get("tableField_m986c5os");
+                    PayAmount = BigDecimal.ZERO; // 初始化累加器
+                    if (tableField != null) {
+                        for (Map<String, Object> row : tableField) {
+                            String instructionId = getStringValue(row, "textField_mdnuob9a");
+                            String xmbh = getStringValue(row, "textField_m9lfmh1p");
+                            String payAmountStr = getStringValue(row, "numberField_m8yf6gn1");
+                            BigDecimal payAmount1 = BigDecimal.ZERO;
+                            if (payAmountStr != null && !payAmountStr.trim().isEmpty()) {
+                                try {
+                                    payAmount1 = new BigDecimal(payAmountStr.trim());
+                                    PayAmount = PayAmount.add(payAmount1);
+                                } catch (NumberFormatException e) {
+                                    // 处理转换失败的情况(可选:记录日志或忽略)
+                                    System.err.println("Invalid number format: " + payAmountStr);
+                                }
+                            }
+                            Map<String, Object> tablemap = new HashMap<>();
+                            tablemap.put("associationFormField_ma13k7v2", Arrays.asList(getAss(mainInstructionId, formInstanceId)));
+                            tablemap.put("selectField_m9ze3rjf", fklx);
+                            tablemap.put("numberField_m9ze3rk4", payAmountStr);
+                            tablemap.put("textField_m9ze3rk3", note);
+                            tablemap.put("textField_m9ze3rjl", toAccountName);
+                            tablemap.put("textField_m9ze3rjr", toBank);
+                            tablemap.put("textField_m9ze3rjs", toAccountCode);
+                            tablemap.put("textField_ma13k7v3", instructionId);
+                            tablemap.put("textField_ma13k7v4", mainInstructionId);
+                            tablemap.put("textField_madmzxce", xmbh);
+                            updateList.add(tablemap);
+                        }
+                    }
+                } else {
+                    String instructionId = mainInstructionId;
+                    PayAmount = safeGetBigDecimal(data, "numberField_m9ze3rk4");
+                    String xmbh = getStringValue(data, "textField_madmzxce");
+
+                    Map<String, Object> tablemap = new HashMap<>();
+                    tablemap.put("associationFormField_ma13k7v2", Arrays.asList(getAss(mainInstructionId, formInstanceId)));
+                    tablemap.put("selectField_m9ze3rjf", fklx);
+                    tablemap.put("numberField_m9ze3rk4", PayAmount);
+                    tablemap.put("textField_m9ze3rk3", note);
+                    tablemap.put("textField_m9ze3rjl", toAccountName);
+                    tablemap.put("textField_m9ze3rjr", toBank);
+                    tablemap.put("textField_m9ze3rjs", toAccountCode);
+                    tablemap.put("textField_ma13k7v3", instructionId);
+                    tablemap.put("textField_ma13k7v4", mainInstructionId);
+                    tablemap.put("textField_madmzxce", xmbh);
+                    updateList.add(tablemap);
+                }
+
+                // 构建目标数据
+                Map<String, Object> formData = new HashMap<>();
+                formData.put("tableField_ma13k7v1", updateList);
+                formData.put("numberField_mac3ccn8", PayAmount);
+                formData.put("textField_mdsk7rlm", mainInstructionId); // 主流水号用于去重
+                formData.put("employeeField_m8yf6gkl", Arrays.asList("275412081437800471"));
+
+                // 执行新增
+                ydClient.operateData(YDParam.builder()
+                        .formUuid("FORM-6B8A683A23524D3596C8C6CA13327EF3552K")
+                        .formDataJson(JSON.toJSONString(formData))
+                        .userId("275412081437800471")
+                        .build(), YDConf.FORM_OPERATION.create);
+
+                log.info("成功插入新数据:mainInstructionId={}, 付款类型={}", mainInstructionId, fklx);
+
+            } catch (Exception e) {
+                log.error("处理单据时发生异常", e);
+            }
+        }
+
+        return McR.success();
+    }
+
+    private Object getAss(String title, String id) {
+        return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_RPH7R3LF3SMXLRDY1ZJW", "FORM-754586D31BF6414586E5C20DB3774A7320CV", "receipt", id, title, "");
+    }
+
+    private Object getkhAss(String title, String id) {
+        return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_RPH7R3LF3SMXLRDY1ZJW", "FORM-E18CC7F3495B45BB852CB386F325BF03IAS3", "receipt", id, title, "");
+    }
+
     // 工具方法:安全获取字符串
     private String getStringValue(Map data, String key) {
         Object val = data.get(key);
@@ -1298,7 +1499,7 @@ public class LiLinServiceImpl implements LiLinService {
 
     private static McR token() {
         String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        String s = SecureUtil.md5("KHPuj0JMS6nS1ACzc#" + today);
+        String s = SecureUtil.md5("}bH5%t4_)6e3#" + today);
         return McR.success(s);
     }
 

+ 14 - 9
mjava-lilin/src/main/resources/application-dev.yml

@@ -7,8 +7,8 @@ server:
 enable:
   scheduling: true
 logging:
-#  config: classpath:logback-spring.xml
-#  path: /home/server/lianxiang/log/
+  config: classpath:logback-spring.xml
+#  path: /lilin/log
   level:
     com.malk.*: debug
 
@@ -17,18 +17,23 @@ dingtalk:
   agentId: 3745118146
   appKey: dingrlxbv5y8hrsmmrnm
   appSecret: tnAtNJUfYmYWURK302FkLXYLRW3PnCat6wj65lOG06db86m24kRqpWnVPHFCgUCU
+#  agentId: 2691784047
+#  appKey: dinghbynhnd2dbgypmsa
+#  appSecret: Kl5Xw8x0TlEIlvcJuUkYZD18UTTShJmfdKrAIpY8oX-Q_tazyUKA28nQh7dG5-mq
   corpId:
   aesKey:
   token:
-#  operator: 1656315499790273 #孙海生
-#  unionId: iPPoZ001WAYlZxyoU04g2bgiEiE #孙海生
-#  spaceId: 26395140381 #钉盘-团队文件-宜搭文件库
-#  partnersDentryId: 176651024213 #钉盘-团队文件-宜搭文件库-合作伙伴文件
-#  unrestrictedDonationDentryId: 176648777099 #钉盘-团队文件-宜搭文件库-资助人费用登记文件
 
+
+#aliwork:
+#  appType: APP_V25MK3XKODKB02UVTGSH
+#  systemToken: IQC66GC1L5TW5HKF6SX645RC4AXG2CFGQOMCMOQ4
 aliwork:
-  appType: APP_V25MK3XKODKB02UVTGSH
-  systemToken: IQC66GC1L5TW5HKF6SX645RC4AXG2CFGQOMCMOQ4
+  appType: APP_RPH7R3LF3SMXLRDY1ZJW
+  systemToken: 7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT
+#aliwork:
+#  appType: APP_G1MXVGRR5L6OTZDEME0M
+#  systemToken: PTA66DA1S07X9DRA9EQZ96UUWJTQ2GHXLL5DMY42
 
 
 

+ 61 - 0
mjava-lilin/src/main/resources/logback-spring.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration debug="false" scan="false" scanPeriod="60 seconds">
+    <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/home/server/log/"/>
+    <property name="FileNamePattern" value="${LOG_HOME}%d{yyyyMM}/%d{dd}"/>
+
+    <!-- 定义控制台输出 -->
+    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 指定日志文件的名称 -->
+        <!--<file>${FileNamePattern}/info.log</file>-->
+
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${FileNamePattern}/info-%i.log</fileNamePattern>
+            <MaxHistory>30</MaxHistory>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <MaxFileSize>30MB</MaxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
+        </layout>
+    </appender>
+
+    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
+        <discriminator>
+            <Key>processid</Key>
+            <DefaultValue>sys</DefaultValue>
+        </discriminator>
+        <sift>
+            <appender name="FILE-${processid}"
+                      class="ch.qos.logback.core.rolling.RollingFileAppender">
+                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+                    <FileNamePattern>
+                        ${FileNamePattern}/${processid}.log
+                    </FileNamePattern>
+                </rollingPolicy>
+                <layout class="ch.qos.logback.classic.PatternLayout">
+                    <Pattern>
+                        %d{yyyyMMdd:HH:mm:ss.SSS} [%thread] %-5level %msg%n
+                    </Pattern>
+                </layout>
+            </appender>
+        </sift>
+    </appender>
+
+
+    <!-- 日志输出级别 -->
+    <logger name="org.springframework" level="debug"  additivity="false"/>
+    <logger name="com.zitoo.connecter" level="debug"/>
+    <root level="INFO">
+        <appender-ref ref="stdout"/>
+        <appender-ref ref="appLogAppender"/>
+        <appender-ref ref="SIFT"/>
+    </root>
+</configuration>