3 次代碼提交 91a9e957f7 ... ed6a030415

作者 SHA1 備註 提交日期
  “lqy ed6a030415 9.19礼林终版 2 月之前
  “lqy 5a6574da90 Merge remote-tracking branch 'origin/master' 2 月之前
  “lqy da35619a49 9.8代码提交 3 月之前

+ 5 - 5
mjava-lilin/pom.xml

@@ -38,11 +38,7 @@
             <artifactId>okhttp</artifactId>
             <version>3.14.9</version>
         </dependency>
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <scope>provided</scope>
-        </dependency>
+
         <dependency>
             <groupId>com.malk</groupId>
             <artifactId>base</artifactId>
@@ -58,6 +54,10 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 145 - 47
mjava-lilin/src/main/java/com/malk/lilin/Controller/taskController.java

@@ -6,6 +6,7 @@ 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.aliwork.YDSearch;
 import com.malk.server.common.McR;
 import com.malk.server.dingtalk.DDConf;
 import com.malk.server.dingtalk.DDR_New;
@@ -13,8 +14,13 @@ import com.malk.service.aliwork.YDClient;
 import com.malk.service.dingtalk.DDClient;
 import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
+
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Configuration;
@@ -37,7 +43,7 @@ import java.util.stream.Collectors;
 @Configuration
 @Slf4j
 @ConditionalOnProperty(name = {"enable.scheduling"})
-@RequestMapping("/ll")
+@RequestMapping("/csll")
 public class taskController {
     @Autowired
     private LiLinService lilinService;
@@ -91,7 +97,8 @@ public class taskController {
     }
 
     //    @Scheduled(cron = "0 44 14 * * ?")
-    @Scheduled(fixedRate = 30 * 60 * 1000)
+//    @Scheduled(fixedRate = 30 * 60 * 1000)
+    @Scheduled(cron = "0 */30 * * * *")
     public void task() {
         log.info("定时获取单笔付款结果开始:{}", LocalDateTime.now());
         try {
@@ -104,7 +111,8 @@ public class taskController {
 
     }
 
-    @Scheduled(fixedRate = 60 * 60 * 1000)
+//    @Scheduled(fixedRate = 60 * 60 * 1000)
+@Scheduled(cron = "0 0 * * * *")
     public void taskLS() {
         log.info("定时获取银行流水结果开始:{}", LocalDateTime.now());
         try {
@@ -115,7 +123,8 @@ public class taskController {
         }
     }
 
-    @Scheduled(fixedRate = 30 * 60 * 1000)
+//    @Scheduled(fixedRate = 30 * 60 * 1000)
+@Scheduled(cron = "0 0 * * * *")
     public void taskPLJG() {
         log.info("定时获取支付结果发起批量审批开始:{}", LocalDateTime.now());
         try {
@@ -245,54 +254,143 @@ public class taskController {
     }
 
     @PostMapping("/test")
-    McR test(@RequestBody Map param) {
-        String formInstanceId = String.valueOf(param.get("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 为空");
+    McR test(@RequestBody Map param) throws IOException{
+
+//        List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
+//                .formUuid("FORM-754586D31BF6414586E5C20DB3774A7320CV")
+//                .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
+//                        new YDSearch("selectField_ma0w9yrb",
+//                                Arrays.asList("未审批"),
+//                                "SelectField",
+//                                YDSearch.Type.RADIO_FIELD,
+//                                YDSearch.Operator.CONTAINS)
+//                )))
+//                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+        List<String> khdaList = Arrays.asList(
+                "31050161373600008173"
+
+        );
+
+        // 获取 token 一次
+        String securityCode;
+        try {
+            securityCode = String.valueOf(token().getData());
+            if (securityCode == null || securityCode.isEmpty()) {
+                log.error("获取 securityCode 失败");
+                return McR.errorParam("安全码获取失败");
+            }
+        } catch (Exception e) {
+            log.error("调用 token() 异常", e);
+            return McR.errorParam("认证信息获取失败");
         }
-        String xmdbh = (String) data.get("textField_m25j5gxk");//项目点编号
-        String kpzq = (String) data.get("textField_m25j5gxv");//开票周期
-        String hsxjStr = (String) data.get("numberField_lvdnme0z");//含税小计
-        BigDecimal hsxj = hsxjStr != null && hsxjStr.trim().length() > 0 ? new BigDecimal(hsxjStr) : BigDecimal.ZERO;
-        List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-97BA6C6C8C50416A9E5854F2F4B5C3F3R4WC")
-                .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_ltxrn8h1", xmdbh)))
-                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
 
-        for (Map<String, Object> item : list) {
-            String formInstanceIdItem = (String) item.get("formInstanceId");
-            Map<String, Object> formData = (Map<String, Object>) item.get("formData");
-            List<Map> tableFieid = (List<Map>) formData.get("tableField_lrru2tnq");
-//            List<Map> updateList = new ArrayList<>();
-            if (tableFieid != null) {
-                for (Map<String, Object> tableItem : tableFieid) {
-                    String zq = (String) tableItem.get("textField_luh0k82j");
-                    if (kpzq.equals(zq)) {
-                        String xjStr = (String) tableItem.get("numberField_lrru2to2");//开票金额保留两位小数
-                        BigDecimal xj = xjStr != null && !xjStr.trim().isEmpty() ? new BigDecimal(xjStr) : BigDecimal.ZERO;
-                        BigDecimal newXj = xj.add(hsxj); // 原金额 + 含税小计
-                        // 保留两位小数,四舍五入
-                        tableItem.put("numberField_lrru2to2", newXj);
-//                        updateList.add(tableItem);
-                    }
-//                    updateList.add(tableItem);
+        OkHttpClient client = new OkHttpClient();
+
+        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(16).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";
+
+                okhttp3.RequestBody body = okhttp3.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);
+
+                JSONObject jsonObject = JSON.parseObject(jsonStr);
+                JSONObject data = jsonObject.getJSONObject("data");
+                System.out.println(data);
+            }
+            catch (Exception e) {
+                log.error("调用银行接口异常", e);
+                continue;
             }
-            formData.put("tableField_lrru2tnq", tableFieid);
-            ydClient.operateData(YDParam.builder()
-                    .formInstanceId(formInstanceIdItem)
-                    .updateFormDataJson(JSON.toJSONString(formData))
-                    .build(), YDConf.FORM_OPERATION.update);
         }
+
+//        return McR.success(list);
+//        lilinService.taskPLJG();
+//        String formInstanceId = String.valueOf(param.get("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 xmdbh = (String) data.get("textField_m25j5gxk");//项目点编号
+//        String kpzq = (String) data.get("textField_m25j5gxv");//开票周期
+//        String hsxjStr = (String) data.get("numberField_lvdnme0z");//含税小计
+//        BigDecimal hsxj = hsxjStr != null && hsxjStr.trim().length() > 0 ? new BigDecimal(hsxjStr) : BigDecimal.ZERO;
+//        List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-97BA6C6C8C50416A9E5854F2F4B5C3F3R4WC")
+//                .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_ltxrn8h1", xmdbh)))
+//                .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+//
+//        for (Map<String, Object> item : list) {
+//            String formInstanceIdItem = (String) item.get("formInstanceId");
+//            Map<String, Object> formData = (Map<String, Object>) item.get("formData");
+//            List<Map> tableFieid = (List<Map>) formData.get("tableField_lrru2tnq");
+////            List<Map> updateList = new ArrayList<>();
+//            if (tableFieid != null) {
+//                for (Map<String, Object> tableItem : tableFieid) {
+//                    String zq = (String) tableItem.get("textField_luh0k82j");
+//                    if (kpzq.equals(zq)) {
+//                        String xjStr = (String) tableItem.get("numberField_lrru2to2");//开票金额保留两位小数
+//                        BigDecimal xj = xjStr != null && !xjStr.trim().isEmpty() ? new BigDecimal(xjStr) : BigDecimal.ZERO;
+//                        BigDecimal newXj = xj.add(hsxj); // 原金额 + 含税小计
+//                        // 保留两位小数,四舍五入
+//                        tableItem.put("numberField_lrru2to2", newXj);
+////                        updateList.add(tableItem);
+//                    }
+////                    updateList.add(tableItem);
+//                }
+//            }
+//            formData.put("tableField_lrru2tnq", tableFieid);
+//            ydClient.operateData(YDParam.builder()
+//                    .formInstanceId(formInstanceIdItem)
+//                    .updateFormDataJson(JSON.toJSONString(formData))
+//                    .build(), YDConf.FORM_OPERATION.update);
+//        }
+
         return McR.success();
     }
 

+ 268 - 75
mjava-lilin/src/main/java/com/malk/lilin/Service/impl/LiLinServiceImpl.java

@@ -26,6 +26,8 @@ import org.springframework.stereotype.Service;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -121,9 +123,9 @@ public class LiLinServiceImpl implements LiLinService {
                     detail.put("numberField_majmvrdr", safeGetString(formData, "numberField_majn78hg")); // 运费补贴
                     detail.put("numberField_m9cdctdv", safeGetString(formData, "numberField_m8yanvkv")); // 销售单价未税
                     detail.put("numberField_m9cdctdz", safeGetString(formData, "numberField_m9b2rwwp")); // 金额未税小计
-                    detail.put("textField_m96r764p", safeGetString(formData, "textField_m96r764p")); // 产品小类
-                    detail.put("textField_m96r764o", safeGetString(formData, "textField_m96r764o")); // 产品大类
-                    detail.put("textField_m9cdctdp", safeGetString(formData, "numberField_majn78hg")); // 品牌
+                    detail.put("textField_m96r764p", safeGetString(formData, "selectField_m8xtlcwg")); // 产品小类
+                    detail.put("textField_m96r764o", safeGetString(formData, "selectField_m8xtlcwf")); // 产品大类
+                    detail.put("textField_m9cdctdp", safeGetString(formData, "textField_m8yanvkk")); // 品牌
                     detail.put("textField_m9cdctdr", safeGetString(formData, "textField_m8yanvks")); // 产品单位
                     detail.put("textField_m9cdctds", safeGetString(formData, "textField_m8yanvkt")); // 颜色
                     detail.put("selectField_m9cdcte0", safeGetString(formData, "selectField_m8yanvkn")); // 是否带采
@@ -131,13 +133,13 @@ public class LiLinServiceImpl implements LiLinService {
                     detail.put("selectField_m9cdcte2", safeGetString(formData, "selectField_m8yanvkp")); // 是否明细
                     detail.put("textField_m9gewnyi", safeGetString(formData, "textField_m9gfqsow")); // 产品名称
                     detail.put("textField_m9gewnyj", safeGetString(formData, "textField_m9gfqsox")); // SKU码
-                    detail.put("selectField_m9qrzktd", safeGetString(formData, "selectField_m9cdsn2v")); // 订单状态
+                    detail.put("selectField_m9qrzktd", "未生产"); // 订单状态
                     detail.put("textField_m9qnz34u", safeGetString(formData, "textField_m9gfqsox")); // 订单明细编号
                     detail.put("numberField_m9gfg5mi", safeGetString(formData, "numberField_m9gfg5mi")); // 成本单价含税
                     detail.put("selectField_m9me4py8", safeGetString(formData, "selectField_m9me4py8")); // 成本税率
                     detail.put("numberField_m9gfg5mj", safeGetString(formData, "numberField_m9gfg5mj")); // 成本单价无税
-                    detail.put("textField_maoynrp4", safeGetString(formData, "textField_maoynrp4")); // 供应商名称
-                    detail.put("textField_maoynrp5", safeGetString(formData, "textField_maoynrp5")); // 供应商编号
+                    detail.put("textField_maoynrp4", safeGetString(formData, "textField_maqkme86")); // 供应商名称
+                    detail.put("textField_maoynrp5", safeGetString(formData, "textField_maqkme87")); // 供应商编号
 
                     details.add(detail);
 
@@ -192,14 +194,22 @@ public class LiLinServiceImpl implements LiLinService {
                                 xmupdateMap.put("numberField_m9iarxwc", existingXsddwkp.stripTrailingZeros().toPlainString());
 
                                 // 执行更新
-                                ydClient.operateData(
-                                        YDParam.builder()
-                                                .formInstanceId(xmformInstanceId)
-                                                .updateFormDataJson(JSONObject.toJSONString(xmupdateMap))
-                                                .useLatestVersion(true)
-                                                .build(),
-                                        YDConf.FORM_OPERATION.update
-                                );
+//                                ydClient.operateData(
+//                                        YDParam.builder()
+//                                                .formInstanceId(xmformInstanceId)
+//                                                .updateFormDataJson(JSONObject.toJSONString(xmupdateMap))
+//                                                .useLatestVersion(true)
+//                                                .build(),
+//                                        YDConf.FORM_OPERATION.update
+//                                );
+                                ydClient.operateData(YDParam.builder()
+                                        .formUuid("FORM-FFA52F0206684931A0F18C00C2C937EAAVI5")
+                                        .appType("APP_RPH7R3LF3SMXLRDY1ZJW")
+                                        .systemToken("7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT")
+                                        .noExecuteExpression(true)
+                                        .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_marp9xdr", xmformInstanceId)))
+                                        .formDataJson(JSONObject.toJSONString(xmupdateMap))
+                                        .build(), YDConf.FORM_OPERATION.upsert);
 
                                 log.info("已更新项目表单,项目编号:{},累加含税金额:{}", xmbh, je);
 
@@ -240,6 +250,17 @@ public class LiLinServiceImpl implements LiLinService {
 
                     for (Map item : tableField) {
                         String sku = safeGetString(item, "textField_m9gewnyj");
+                        Set<String> fillableFields = new HashSet<>(item.keySet());
+                        fillableFields.removeAll(Arrays.asList(
+                                "numberField_m9cdctdx",   // 数量
+                                "numberField_m9cdctdy",   // 销售含税金额小计
+                                "numberField_majmvrdr",   // 运费补贴
+                                "numberField_m9cdctdz",   // 销售未税金额小计
+                                "numberField_m9gfg5mi",   // 成本单价含税
+                                "numberField_m9gfg5mj"    // 成本单价无税
+                                // 可继续添加其他数值字段
+                        ));
+
                         if (skuMap.containsKey(sku)) {
                             // 如果SKU已存在,则累加数值字段
                             Map existingItem = skuMap.get(sku);
@@ -273,11 +294,23 @@ public class LiLinServiceImpl implements LiLinService {
                             double currentWsCost = getDoubleSafe(existingItem, "numberField_m9gfg5mj");
                             double newWsCost = getDoubleSafe(item, "numberField_m9gfg5mj");
                             existingItem.put("numberField_m9gfg5mj", currentWsCost + newWsCost);
+                            for (String field : fillableFields) {
+                                Object existingValue = existingItem.get(field);
+                                Object newValue = item.get(field);
+
+                                boolean isEmptyExisting = existingValue == null ||
+                                        (existingValue instanceof String && ((String) existingValue).trim().isEmpty());
+                                boolean hasValidNewValue = newValue != null &&
+                                        (! (newValue instanceof String) || !((String) newValue).trim().isEmpty());
+
+                                if (isEmptyExisting && hasValidNewValue) {
+                                    existingItem.put(field, newValue);
+                                }
+                            }
 
-                            // 单价字段保持不变(销售单价含税/未税)
                         } else {
                             // 如果SKU不存在,则添加到map中
-                            skuMap.put(sku, new HashMap(item));
+                            skuMap.put(sku, item);
                         }
                     }
 
@@ -301,6 +334,7 @@ public class LiLinServiceImpl implements LiLinService {
                     updateMap.put("numberField_m9cdcte5", totalZsl.doubleValue());
                     updateMap.put("numberField_ma14qlv3", totalZsl.doubleValue());
                     updateMap.put("numberField_ma14qlv7", totalZsl.doubleValue());
+                    updateMap.put("numberField_maowfpzl", totalZsl.doubleValue());
                     updateMap.put("numberField_m9cdcte7", totalXsDj.doubleValue() + totalYfzj.doubleValue());
                     updateMap.put("numberField_m9cdcte9", totalJexj.doubleValue());
                     updateMap.put("numberField_majmvrdq", totalYfzj.doubleValue());
@@ -308,11 +342,19 @@ public class LiLinServiceImpl implements LiLinService {
                     updateMap.put("numberField_m9iap5e6", totalXsDj.doubleValue() + totalYfzj.doubleValue());
                     System.out.println("updateMap=======" + updateMap);
                     // 更新主表单
+//                    ydClient.operateData(YDParam.builder()
+//                            .formInstanceId(formInstanceId1)
+//                            .updateFormDataJson(JSONObject.toJSONString(updateMap))
+//                            .useLatestVersion(true)
+//                            .build(), YDConf.FORM_OPERATION.update);
                     ydClient.operateData(YDParam.builder()
-                            .formInstanceId(formInstanceId1)
-                            .updateFormDataJson(JSONObject.toJSONString(updateMap))
-                            .useLatestVersion(true)
-                            .build(), YDConf.FORM_OPERATION.update);
+                            .formUuid("FORM-C9BC8F7A159E4281B707ADBE1628EB7FDACQ")
+                            .appType("APP_RPH7R3LF3SMXLRDY1ZJW")
+                            .systemToken("7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT")
+                            .noExecuteExpression(true)
+                            .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_m9cdcten", ddbh)))
+                            .formDataJson(JSONObject.toJSONString(updateMap))
+                            .build(), YDConf.FORM_OPERATION.upsert);
 
                     // 批量更新子表单状态为“已同步”
                     if (!details2.isEmpty()) {
@@ -456,6 +498,7 @@ public class LiLinServiceImpl implements LiLinService {
         String fromAccountName = String.valueOf(data.get("textField_m9ze3rj8")); // 付款户名
         String toAccountTypeStr = String.valueOf(data.get("textField_m9ze3rjm")); // 收款类型
         String djlx = String.valueOf(data.get("textField_m9ze3rjr")); // 单据类型
+        String applyDepartment = String.valueOf(data.get("textField_m9ze3rjy")); // 回单邮箱
         String paymentOrderType = djlx.contains("支付宝") ? "alipay" : "common";
 //        Map<String, String> accountMap = new HashMap<>();
 //        accountMap.put("上海韵林礼品有限公司", "1001260509024819590");
@@ -516,6 +559,7 @@ public class LiLinServiceImpl implements LiLinService {
                 mapAll.put("toBank", toBank);
                 mapAll.put("securityCode", securityCode);
                 mapAll.put("metaJson", metaJson);
+                mapAll.put("applyDepartment", applyDepartment);
 
                 // 发起支付
                 String response = UtilHttp.doPost(url, headers, null, null, mapAll);
@@ -564,6 +608,7 @@ public class LiLinServiceImpl implements LiLinService {
             mapAll.put("toBank", toBank);
             mapAll.put("securityCode", securityCode);
             mapAll.put("metaJson", metaJson);
+            mapAll.put("applyDepartment", applyDepartment);
 
             String response = UtilHttp.doPost(url, headers, null, null, mapAll);
             log.info("非物流付款单 - 支付成功 [凭证号: {}, 金额: {}], 响应: {}", instructionId, payAmount, response);
@@ -638,14 +683,7 @@ public class LiLinServiceImpl implements LiLinService {
                 log.info("开始处理单据: formInstanceId={}", formInstanceId);
 
                 // ===== 开始执行原 lilinJG 方法中的核心逻辑 =====
-
-                // 获取表单数据
-                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();
+                Map data = (Map) item.get("formData");
 
                 if (data == null) {
                     log.warn("获取表单数据为空,formInstanceId: {}", formInstanceId);
@@ -674,6 +712,7 @@ public class LiLinServiceImpl implements LiLinService {
                     int completedCount = 0;
                     String zfqk = "";
                     String message = "";
+                    long bankTrxTime = 0L;
                     for (int i = 0; i < tableField.size(); i++) {
                         Map<String, Object> row = new HashMap<>(tableField.get(i)); // 复制原数据用于更新
                         String subInstructionId = String.valueOf(row.get("textField_mdnuob9a")); // 子表流水号
@@ -687,6 +726,21 @@ public class LiLinServiceImpl implements LiLinService {
                         JSONObject jsonResponse = JSON.parseObject(response);
                         JSONObject dataObj = jsonResponse.getJSONObject("data");
                         String code = dataObj.getString("code");
+                        String bankTrxTimeStr = dataObj.getString("bankTrxTime");
+
+                        // 修复:添加空值检查
+                        if (bankTrxTimeStr != null && !bankTrxTimeStr.trim().isEmpty()) {
+                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                            try {
+                                Date date = sdf.parse(bankTrxTimeStr);
+                                bankTrxTime = date.getTime(); // 获取时间戳(毫秒)
+                            } catch (ParseException e) {
+                                log.warn("时间格式解析失败: {}", bankTrxTimeStr, e);
+                                bankTrxTime = 0L; // 解析失败时设为0
+                            }
+                        } else {
+                            bankTrxTime = 0L; // 空字符串时设为0
+                        }
                          zfqk = "P0000".equals(code) ? "支付成功" : "支付异常";
                          message = dataObj != null ? dataObj.getString("message") : "";
 
@@ -716,12 +770,17 @@ public class LiLinServiceImpl implements LiLinService {
                         mainStatus = "已审批待付款";
                     } else if (completedCount == updatedRows.size()) {
                         mainStatus = "已审批已付款";
+                        if (bankTrxTime > 0) {
+                            updateData.put("dateField_maw6ci7a", bankTrxTime);
+                            updateData.put("dateField_me2m3mmd", bankTrxTime);
+                        }
                     } else {
                         mainStatus = "已审批部分付款";
                     }
 
                     updateData.put("selectField_ma0w9yrb", mainStatus);
 
+
                     // 提交更新
                     ydClient.operateData(YDParam.builder()
                             .formInstanceId(formInstanceId)
@@ -748,14 +807,32 @@ public class LiLinServiceImpl implements LiLinService {
                     JSONObject dataObj = jsonResponse.getJSONObject("data");
                     String message = dataObj != null ? dataObj.getString("message") : "";
                     String code = dataObj.getString("code");
+                    String bankTrxTimeStr = dataObj.getString("bankTrxTime");
+
+                    long bankTrxTime = 0L; // 初始化为0
+                    // 修复:添加空值检查
+                    if (bankTrxTimeStr != null && !bankTrxTimeStr.trim().isEmpty()) {
+                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                        try {
+                            Date date = sdf.parse(bankTrxTimeStr);
+                            bankTrxTime = date.getTime(); // 获取时间戳(毫秒)
+                        } catch (ParseException e) {
+                            log.warn("时间格式解析失败: {}", bankTrxTimeStr, e);
+                            bankTrxTime = 0L; // 解析失败时设为0
+                        }
+                    }
                     String zfqk = "P0000".equals(code) ? "支付成功" : "支付异常";
 
                     Map<String, Object> updateData = new HashMap<>();
                     updateData.put("selectField_ma0w9yrb", "已审批已付款");
                     updateData.put("radioField_mel5n51w", zfqk);
                     updateData.put("textareaField_mel5n51x", message);
+
                     if (message != null && message.contains("成功")) {
-                        // 更新主表状态为“已审批已付款”
+                        if (bankTrxTime > 0) {
+                            updateData.put("dateField_maw6ci7a", bankTrxTime);
+                            updateData.put("dateField_me2m3mmd", bankTrxTime);
+                        }
                         ydClient.operateData(YDParam.builder()
                                 .formInstanceId(formInstanceId)
                                 .updateFormDataJson(JSON.toJSONString(
@@ -794,10 +871,12 @@ public class LiLinServiceImpl implements LiLinService {
     @Override
     public McR lilinLS(Map<String, Object> map) {
         List<String> khdaList = Arrays.asList(
-                "1001260509024819590",
-                "1001260509424880696",
-                "1001260509324868573",
-                "1001260509324808614"
+                "1001260509024819590","121911279910703",
+                "1001260509424880696","931004010000963305",
+                "1001260509324868573","440382314019",
+                "1001260509324808614","31050161373600008173",
+                "1001260509424865022","1001260509300324484",
+                "1001260509300325413"
         );
 
         // 获取 token 一次
@@ -827,7 +906,7 @@ public class LiLinServiceImpl implements LiLinService {
                 log.info("开始对账单同步,accountNo: {}", accountNo);
 
                 // 准备时间范围
-                String dayFromId = LocalDate.now().minusDays(7).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+                String dayFromId = LocalDate.now().minusDays(12).format(DateTimeFormatter.ofPattern("yyyyMMdd"));
                 String dayToId = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
 
                 // 构建 POST 请求体
@@ -990,7 +1069,7 @@ public class LiLinServiceImpl implements LiLinService {
                         formData.put("textField_mdh51nxr", transFlag);
                         formData.put("textField_mdh51nxs", catalogName);
                         formData.put("selectField_m982msou", accountName);
-                        formData.put("textField_megl2h3a", accountName);
+                        formData.put("textField_megl2h3a", khaccountName);
                         formData.put("numberField_megl2h3k", crAmount);
                         formData.put("radioField_me267g3r", "接口创建");
 
@@ -1085,22 +1164,70 @@ public class LiLinServiceImpl implements LiLinService {
 
         // 处理子表数据
         List<Map<String, Object>> tableField = (List<Map<String, Object>>) data.get("tableField_m9m8zhyy");
+        List<Map<String, Object>> tableField1 = (List<Map<String, Object>>) data.get("tableField_m8yanvjk");
         List<Map<String, Object>> subBankStatementList = new ArrayList<>();
+        // 统计分布:是否有“以产定销”和“以销定产”
+        boolean hasChanXiao = false;  // 以产定销
+        boolean hasXiaoChan = false;  // 以销定产
 
-        if (tableField != null && !tableField.isEmpty()) {
-            for (int i = 0; i < tableField.size(); i++) {
-                Map<String, Object> row = tableField.get(i);
+        if (tableField != null) {
+            for (Map<String, Object> row : tableField) {
                 if (row == null) continue;
-
-                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("userMemo", userMemo);
-                newItem.put("trxFlag", transFlag);
-                newItem.put("catalogName", catalogName);
-
-                subBankStatementList.add(newItem);
+                String xmlx = getStringValue(row, "selectField_mfosn87t");
+                if ("以产定销".equals(xmlx)) {
+                    hasChanXiao = true;
+                } else if ("以销定产".equals(xmlx)) {
+                    hasXiaoChan = true;
+                }
+            }
+        }
+        // 根据分布决定处理策略
+        if (hasChanXiao && !hasXiaoChan) {
+            // 情况1:全是“以产定销” → 使用 tableField1 的所有行
+            if (tableField1 != null) {
+                for (int i = 0; i < tableField1.size(); i++) {
+                    Map<String, Object> row = tableField1.get(i);
+                    if (row == null) continue;
+
+                    Map<String, Object> newItem = buildItemForChanXiao(row, i, userMemo, transFlag, catalogName);
+                    subBankStatementList.add(newItem);
+                }
+            }
+        } else if (hasXiaoChan && !hasChanXiao) {
+            // 情况2:全是“以销定产” → 使用 tableField 的所有行
+            if (tableField != null) {
+                for (int i = 0; i < tableField.size(); i++) {
+                    Map<String, Object> row = tableField.get(i);
+                    if (row == null) continue;
+
+                    Map<String, Object> newItem = buildItemForXiaoChan(row, i, userMemo, transFlag, catalogName);
+                    subBankStatementList.add(newItem);
+                }
+            }
+        } else if (hasChanXiao && hasXiaoChan) {
+            // 情况3:混合存在
+            // a. tableField 中只保留“以销定产”的行
+            if (tableField != null) {
+                for (int i = 0; i < tableField.size(); i++) {
+                    Map<String, Object> row = tableField.get(i);
+                    if (row == null) continue;
+                    String xmlx = getStringValue(row, "selectField_mfosn87t");
+                    if ("以销定产".equals(xmlx)) {
+                        Map<String, Object> newItem = buildItemForXiaoChan(row, i, userMemo, transFlag, catalogName);
+                        subBankStatementList.add(newItem);
+                    }
+                    // “以产定销”的行被舍弃
+                }
+            }
+            // b. 加入 tableField1 的全部数据(“以产定销”专用)
+            if (tableField1 != null) {
+                for (int i = 0; i < tableField1.size(); i++) {
+                    Map<String, Object> row = tableField1.get(i);
+                    if (row == null) continue;
+
+                    Map<String, Object> newItem = buildItemForChanXiao(row, i, userMemo, transFlag, catalogName);
+                    subBankStatementList.add(newItem);
+                }
             }
         }
 
@@ -1200,7 +1327,57 @@ public class LiLinServiceImpl implements LiLinService {
         // 返回结果(可附加统计)
         return McR.success(result);
     }
+    // 构建“以产定销”类型的数据(来自 tableField1)
+    private Map<String, Object> buildItemForChanXiao(Map<String, Object> row,
+                                                     int index,
+                                                     String userMemo,
+                                                     String transFlag,
+                                                     String catalogName) {
+        Map<String, Object> item = new HashMap<>();
+        item.put("itemIndex", index + 1);
+
+        // amount 取 numberField_md5e3oib
+        BigDecimal amount = getAmountFromMap(row, "numberField_mfq6budd");
+        item.put("amount", amount != null ? amount.doubleValue() : 0.0);
+
+        // projectInfo = textField_md5e3oih + "-" + textField_md5e3oig
+        String part1 = getStringValue(row, "textField_md5e3oih");
+        String part2 = getStringValue(row, "textField_md5e3oig");
+        String projectInfo = (part1 != null ? part1 : "") + "-" + (part2 != null ? part2 : "");
+        item.put("projectInfo", projectInfo);
+
+        item.put("userMemo", userMemo);
+        item.put("trxFlag", transFlag);
+        item.put("catalogName", catalogName);
+
+        return item;
+    }
 
+    // 构建“以销定产”类型的数据(来自 tableField)
+    private Map<String, Object> buildItemForXiaoChan(Map<String, Object> row,
+                                                     int index,
+                                                     String userMemo,
+                                                     String transFlag,
+                                                     String catalogName) {
+        Map<String, Object> item = new HashMap<>();
+        item.put("itemIndex", index + 1);
+
+        // amount 取 numberField_m9u2a5tf
+        BigDecimal amount = getAmountFromMap(row, "numberField_m9u2a5tf");
+        item.put("amount", amount != null ? amount.doubleValue() : 0.0);
+
+        // projectInfo = textField_m9i9k5cl + "-" + textField_m8yedujm
+        String part1 = getStringValue(row, "textField_m9i9k5cl");
+        String part2 = getStringValue(row, "textField_m8yedujm");
+        String projectInfo = (part1 != null ? part1 : "") + "-" + (part2 != null ? part2 : "");
+        item.put("projectInfo", projectInfo);
+
+        item.put("userMemo", userMemo);
+        item.put("trxFlag", transFlag);
+        item.put("catalogName", catalogName);
+
+        return item;
+    }
     @Override
     public McR taskPLJG() {
         List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
@@ -1222,18 +1399,19 @@ public class LiLinServiceImpl implements LiLinService {
         for (Map item : list) {
             try {
                 String formInstanceId = getStringValue(item, "formInstanceId");
+
                 if (formInstanceId == null || formInstanceId.isEmpty()) {
                     log.warn("跳过:formInstanceId 为空");
                     continue;
                 }
-
+                Map data = (Map) item.get("formData");
                 // 获取源表单详情
-                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();
+//                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);
@@ -1244,30 +1422,35 @@ public class LiLinServiceImpl implements LiLinService {
                 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();
+//                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;
-                }
+//                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"); // 收款户名
+
+                List<String> sqr =UtilMap.getList(data, "employeeField_madmj9kw_id");// 申请人
+                String fklsh = getStringValue(data, "textField_ma13ih7u"); // 付款流程编号
                 String toBank = getStringValue(data, "textField_m9ze3rjr"); // 收款银行支行
                 String fromAccountCode = getStringValue(data, "textField_mdfnuyl9"); // 付款账号
                 String fromAccountName = getStringValue(data, "textField_m9ze3rj8"); // 付款户名
-                long zfsj = System.currentTimeMillis();//支付时间
+//                long zfsj = System.currentTimeMillis();//支付时间
+//                String  zfsj = getStringValue(data, "dateField_me2m3mmd");//支付时间
+
                 BigDecimal PayAmount;
                 List<Map<String, Object>> updateList = new ArrayList<>();
 
@@ -1294,11 +1477,12 @@ public class LiLinServiceImpl implements LiLinService {
                             tablemap.put("selectField_m9ze3rjf", fklx);
                             tablemap.put("numberField_m9ze3rk4", payAmountStr);
                             tablemap.put("textField_m9ze3rk3", note);
+                            tablemap.put("employeeField_maopzwym", sqr);
                             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_ma13k7v4", fklsh);
                             tablemap.put("textField_madmzxce", xmbh);
                             updateList.add(tablemap);
                         }
@@ -1313,11 +1497,12 @@ public class LiLinServiceImpl implements LiLinService {
                     tablemap.put("selectField_m9ze3rjf", fklx);
                     tablemap.put("numberField_m9ze3rk4", PayAmount);
                     tablemap.put("textField_m9ze3rk3", note);
+                    tablemap.put("employeeField_maopzwym", sqr);
                     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_ma13k7v4", fklsh);
                     tablemap.put("textField_madmzxce", xmbh);
                     updateList.add(tablemap);
                 }
@@ -1325,7 +1510,8 @@ public class LiLinServiceImpl implements LiLinService {
                 // 构建目标数据
                 Map<String, Object> formData = new HashMap<>();
                 formData.put("tableField_ma13k7v1", updateList);
-                formData.put("dateField_me2m2oeu",  zfsj);
+                formData.put("dateField_me2m2oeu",  data.get("dateField_me2m3mmd"));
+                formData.put("selectField_megv3ask",  "接口创建");
                 formData.put("numberField_mac3ccn8", PayAmount);
                 formData.put("textField_mdsk7rlm", mainInstructionId); // 主流水号用于去重
                 formData.put("employeeField_m8yf6gkl", Arrays.asList("275412081437800471"));
@@ -1333,9 +1519,16 @@ public class LiLinServiceImpl implements LiLinService {
                 // 执行新增
                 ydClient.operateData(YDParam.builder()
                         .formUuid("FORM-6B8A683A23524D3596C8C6CA13327EF3552K")
-                        .formDataJson(JSON.toJSONString(formData))
-                        .userId("275412081437800471")
-                        .build(), YDConf.FORM_OPERATION.create);
+                        .appType("APP_RPH7R3LF3SMXLRDY1ZJW")
+                        .systemToken("7M866K91D4LVACB4EADAZ5UJG7IN3OGA33WAMNT")
+                        .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mdsk7rlm", mainInstructionId)))
+                        .formDataJson(JSONObject.toJSONString(formData))
+                        .build(), YDConf.FORM_OPERATION.upsert);
+//                ydClient.operateData(YDParam.builder()
+//                        .formUuid("FORM-6B8A683A23524D3596C8C6CA13327EF3552K")
+//                        .formDataJson(JSON.toJSONString(formData))
+//                        .userId("275412081437800471")
+//                        .build(), YDConf.FORM_OPERATION.create);
 
                 log.info("成功插入新数据:mainInstructionId={}, 付款类型={}", mainInstructionId, fklx);
 

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

@@ -1,14 +1,14 @@
-#测试学习
+
 server:
   port: 9091
   servlet:
     context-path: /lilin
 
 enable:
-  scheduling: false
+  scheduling: true
 logging:
   config: classpath:logback-spring.xml
-  path: /home/server/lilin/log
+  path: /home/server/logs/lilin
   level:
     com.malk.*: info