Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

lfx 1 месяц назад
Родитель
Сommit
f6d1bec9fb
23 измененных файлов с 767 добавлено и 173 удалено
  1. 2 2
      mjava-boyang/src/main/java/com/malk/boyang/controller/BoyangController.java
  2. 1 1
      mjava-boyang/src/main/java/com/malk/boyang/service/BoyangService.java
  3. 31 14
      mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java
  4. 1 1
      mjava-boyang/src/main/resources/application.yml
  5. 30 1
      mjava-huagao/src/main/java/com/malk/huagao/controller/KdYdCustomerController.java
  6. 5 0
      mjava-huagao/src/main/java/com/malk/huagao/controller/KdYdOrderController.java
  7. 2 0
      mjava-huagao/src/main/java/com/malk/huagao/entity/KdYdOrderDetail.java
  8. 2 0
      mjava-huagao/src/main/java/com/malk/huagao/entity/KdYdTransfer.java
  9. 4 0
      mjava-huagao/src/main/java/com/malk/huagao/entity/KdYdTransferDetail.java
  10. 22 0
      mjava-huagao/src/main/java/com/malk/huagao/schedule/YdScheduleTask.java
  11. 2 0
      mjava-huagao/src/main/java/com/malk/huagao/service/IKdYdOrderService.java
  12. 3 0
      mjava-huagao/src/main/java/com/malk/huagao/service/YdHuaGaoService.java
  13. 27 11
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/EqbServiceImpl.java
  14. 3 0
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdHuaGaoServiceImpl.java
  15. 3 2
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdDeliveryServiceImpl.java
  16. 429 83
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdOrderServiceImpl.java
  17. 82 17
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/YdHuaGaoServiceImpl.java
  18. 1 0
      mjava-huagao/src/main/resources/application-dev.yml
  19. 2 1
      mjava-huagao/src/main/resources/application-prod.yml
  20. 2 1
      mjava-huagao/src/main/resources/application-prod2.yml
  21. 16 10
      mjava-huagao/src/test/java/com/malk/huagao/YqbTest.java
  22. 81 29
      mjava-lianan/src/main/java/com/malk/lianan/TestUtil.java
  23. 16 0
      mjava-lianan/src/main/resources/cer/ICBC_CZY__SIGN_TEST.cer

+ 2 - 2
mjava-boyang/src/main/java/com/malk/boyang/controller/BoyangController.java

@@ -65,8 +65,8 @@ public class BoyangController {
             eventList.put(info, System.currentTimeMillis());
             //签署开始回写签署详情地址
             if ("SIGN_FLOW_START".equals(callBackDesc)) {
-                String signPreUrl = UtilMap.getString(callBackProcessVO, "signPreUrl");
-                boyangService.start(processInstanceId,signPreUrl);
+//                String signPreUrl = UtilMap.getString(callBackProcessVO, "signPreUrl");
+                boyangService.start(processInstanceId,signFlowId);
             }
             //签署完成回写审批单
             if ("SIGN_FLOW_FINISH".equals(callBackDesc)) {

+ 1 - 1
mjava-boyang/src/main/java/com/malk/boyang/service/BoyangService.java

@@ -13,5 +13,5 @@ public interface BoyangService {
 
     McR getOrganization(String name);
 
-    void start(String processInstanceId, String signPreUrl);
+    void start(String processInstanceId,String signFlowId);
 }

+ 31 - 14
mjava-boyang/src/main/java/com/malk/boyang/service/impl/BoyangServiceImpl.java

@@ -11,10 +11,6 @@ import com.malk.service.dingtalk.*;
 import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
-import okhttp3.*;
-import okio.BufferedSink;
-import okio.Okio;
-import okio.Sink;
 import org.apache.commons.codec.binary.Hex;
 import org.apache.commons.codec.digest.HmacAlgorithms;
 import org.apache.commons.codec.digest.HmacUtils;
@@ -27,7 +23,6 @@ import org.springframework.stereotype.Service;
 import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.text.MessageFormat;
 import java.util.*;
 
 @Slf4j
@@ -67,16 +62,21 @@ public class BoyangServiceImpl implements BoyangService {
     final static String organizationCode = "b60a9c18b8cc4ecc80e30f36b4267a68";// 宁波博洋家纺集团有限公司
     final static String host = "http://122.227.225.202:9011/";// 接口调用域名
     final static String intranet_host = "http://11.0.11.62/";// 接口调用域名(内网)
-    final static String signerUser = "wangze";// 签署人*/
+    final static String signerUser = "wangze";// 签署人
+    final static String uploadFileUrlHost = "http://11.0.11.62:8199/";// 返回的上传文件url host*/
 
     //正式环境
     final static String projectId = "1000003";// 应用ID
     final static String secret = "5V6xsY3q8JWZ9Qik";// 应用密钥
-    final static String businessTypeCode = "dcbf2d9db561a0e656c86177d36279cd";// 钉钉对接测试业务模板
+    final static String businessTypeCode = "f5e84fdb04ef4ead57f37e2a60729066";// 钉钉OA对接业务模板
     final static String organizationCode = "0c8dd6496e7f4d228ec033aeef95a526";// 宁波博洋家纺集团有限公司
     final static String host = "https://dzqz.beyond-it-service.com/";// 接口调用域名
-    final static String intranet_host = "https://dzqz.beyond-it-service.com/";// 接口调用域名(内网)
+    final static String intranet_host = "http://11.0.11.82/";// 接口调用域名(内网)
     final static String signerUser = "22060093";// 签署人
+    final static String uploadFileUrlHost = "http://11.0.11.82:8199/";// 返回的上传文件url host
+
+
+
 
     @Override
     public McR eSignSubmit(Map map) {
@@ -326,7 +326,7 @@ public class BoyangServiceImpl implements BoyangService {
                 String signedFileName = fileName.substring(0, suffixIndex) + "(已签署)" + fileName.substring(suffixIndex);
 
                 //todo 1、评论签署后附件下载链接
-//                    comment(processInstanceId,userId,"接口测试 "+ fileName + "已签署,签署文件下载地址:" + signDownloadOuterUrl,null);
+//                    comment(processInstanceId,userId,"接口测试 "+ "已签署,签署文件下载地址:" + signDownloadOuterUrl,null);
 
 
 
@@ -336,7 +336,7 @@ public class BoyangServiceImpl implements BoyangService {
                 //todo 签署后文件上传到钉盘
                 Map dentry = uploadDdFile(spaceId, parentDentryUuid, downloadPath + signedFileName, operatorUnionId);
                 //todo 审批单添加评论
-                comment(processInstanceId,originatorUserId,"接口测试 "+ fileName + "已签署",Arrays.asList(dentry));
+                comment(processInstanceId,originatorUserId,fileName + "已签署",Arrays.asList(dentry));
             }
         } catch (Exception e) {
             throw new RuntimeException(e);
@@ -370,18 +370,26 @@ public class BoyangServiceImpl implements BoyangService {
             }
         }
 
+        //options按label排序
+        options.sort(Comparator.comparing(m -> UtilMap.getString(m, "label")));
+
         return McR.success(options);
     }
 
     @Override
-    public void start(String processInstanceId, String signPreUrl) {
+    public void start(String processInstanceId,String signFlowId) {
         try {
             Map result = ddClient_workflow.getProcessInstanceId(ddClient.getAccessToken(), processInstanceId);
             String originatorUserId = UtilMap.getString(result, "originatorUserId");
 
+            //获取签署地址列表
+            Map eqbData = (Map) eqbGet(host + "/esign-signs/v1/signFlow/signUrls?signFlowId=" + signFlowId);
+            Map signUrlInfo = ((List<Map>) UtilMap.getList(eqbData, "signUrlInfos")).get(0);
+
+            String signUrlShort = UtilMap.getString(signUrlInfo, "signUrlShort");
+
             //审批单添加评论
-            String signPreUrl2 = signPreUrl.replace(intranet_host, host);
-            comment(processInstanceId,originatorUserId,"签署预览地址:" + signPreUrl2,null);
+            comment(processInstanceId,originatorUserId,"签署地址:" + signUrlShort,null);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
@@ -566,7 +574,8 @@ public class BoyangServiceImpl implements BoyangService {
 
             String url = UtilMap.getString(data, "url");
 
-            url = url.replace("http://11.0.11.62:8199/",host);
+            url = url.replace(uploadFileUrlHost,host);
+
 
             //2、上传文件到指定链接
             Map<String,Object> body = new HashMap<>();
@@ -616,7 +625,9 @@ public class BoyangServiceImpl implements BoyangService {
             header.put("Content-Type", contentType);
 
             // 发送GET请求
+            log.info("eqb请求入参,url:{},header:{}",url,header);
             String resultStr = HTTPHelper.sendGet(url, header, "UTF-8");
+            log.info("eqb请求响应:{}",resultStr);
             Map result = (Map) JSONObject.parse(resultStr);
 
             isSuccess(result);
@@ -647,8 +658,12 @@ public class BoyangServiceImpl implements BoyangService {
             header.put("Accept", "*/*");
             header.put("Content-Type", "application/json; charset=UTF-8");
 
+            log.info("eqb请求入参,url:{},reqBodyData:{},header:{}",url,reqBodyData,header);
+
             String resultStr = HTTPHelper.sendPOST(url, reqBodyData, header, "UTF-8");
 
+            log.info("eqb请求响应:{}",resultStr);
+
             Map result = (Map) JSONObject.parse(resultStr);
 
             isSuccess(result);
@@ -672,7 +687,9 @@ public class BoyangServiceImpl implements BoyangService {
             header.put("X-timevale-signature", reqSignature);
             header.put("Accept", "*/*");
 
+            log.info("eqb请求入参,url:{},filePath:{},body:{},header:{}",url,filePath,body,header);
             String resultStr = HTTPHelper.uploadFile(url,  "file", filePath, body,  header, "UTF-8");
+            log.info("eqb请求响应:{}",resultStr);
 
             Map result = (Map) JSONObject.parse(resultStr);
 

+ 1 - 1
mjava-boyang/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: dev
+    active: prod
   servlet:
     multipart:
       max-file-size: 100MB

+ 30 - 1
mjava-huagao/src/main/java/com/malk/huagao/controller/KdYdCustomerController.java

@@ -1,5 +1,6 @@
 package com.malk.huagao.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.huagao.service.IKdYdCustomerService;
 import com.malk.huagao.service.IKdYdZpService;
@@ -7,6 +8,7 @@ import com.malk.huagao.service.YdHuaGaoService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.common.McR;
+import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.utils.UtilMap;
 import org.slf4j.MDC;
@@ -17,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -44,15 +47,41 @@ private YDClient ydClient;
 //        String ins = String.valueOf(data.get("formInstId"));
 //
 //
+//        DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+//                .formUuid("FORM-E64114E9F2C9426E91F92886EDFFA2C08Q90")
+//                .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
 //
+//        System.out.println(ddrNew.getTotalCount());
+//
+//        ydClient.operateData(YDParam.builder()
+//                .formUuid("FORM-E64114E9F2C9426E91F92886EDFFA2C08Q90")
+//                .asynchronousExecution(true)
+//                .formInstanceIdList((List<String>) ddrNew.getData())
+//                .build(), YDConf.FORM_OPERATION.delete_batch);
+
+//        DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+//                .formInstId("FINST-S2666U81RZA18BDUNZO2U8URNQ8H3X0D2GMJMW932")
+//                .build(), YDConf.FORM_QUERY.retrieve_id);
+//
+//        if (ddrNew == null || ddrNew.getFormData() == null) {
+//            throw new RuntimeException("未找到订单信息");
+//        }
+//
+//        Map formData1 = ddrNew.getFormData();
+//        String ddje = UtilMap.getString(formData1, "numberField_mjm9k35k");
+//        String dddate = UtilMap.getString(formData1, "dateField_mjm9k35j");
+//
+//        System.out.println(dddate);
+//        System.out.println(ddje);
 //        ydClient.operateData(YDParam.builder()
 //                .formInstanceId(ins)
 //      .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_mhirg0kz","156")))//xz04
 ////                .updateFormDataJson(JSONObject.toJSONString(UtilMap.map(employ,id)))//xz04
 //                .useLatestVersion(true)
 //                .build(), YDConf.FORM_OPERATION.update);
-        ydHuaGaoService.synckdYdMaterial();
+//        ydHuaGaoService.synckdYdMaterial();
 //        ydHuaGaoService.synckdYdPayment();
+        ydHuaGaoService.synckdYdTRANSFER();
 //        ydHuaGaoService.syncKdYdReceivable();
 //        kdYdZpService.insertkdYdZp(data);
 //        ydHuaGaoService.synckdYdOutbound();

+ 5 - 0
mjava-huagao/src/main/java/com/malk/huagao/controller/KdYdOrderController.java

@@ -32,4 +32,9 @@ public class KdYdOrderController {
         kdYdOrderService.insertkdYdOrder(map);
         return McR.success();
     }
+    @PostMapping("/SckdYdOrder")
+    McR SckdYdOrder(@RequestBody Map map) {
+        kdYdOrderService.SckdYdOrder(map);
+        return McR.success();
+    }
 }

+ 2 - 0
mjava-huagao/src/main/java/com/malk/huagao/entity/KdYdOrderDetail.java

@@ -47,6 +47,8 @@ public class KdYdOrderDetail implements Serializable {
 
     private String sfzp;
 
+    private String bz;
+
     private Integer sl;
 
     private BigDecimal se;

+ 2 - 0
mjava-huagao/src/main/java/com/malk/huagao/entity/KdYdTransfer.java

@@ -69,4 +69,6 @@ public class KdYdTransfer implements Serializable {
     private String fkfs;
 
     private String ddbh;
+
+    private String fhtzdbh;
 }

+ 4 - 0
mjava-huagao/src/main/java/com/malk/huagao/entity/KdYdTransferDetail.java

@@ -48,6 +48,10 @@ public class KdYdTransferDetail implements Serializable {
 
     private String drck;
 
+    private String xlh;
+
+    private String kddh;
+
     private String drcw;
 
     private String drckzt;

+ 22 - 0
mjava-huagao/src/main/java/com/malk/huagao/schedule/YdScheduleTask.java

@@ -8,6 +8,7 @@ import com.malk.huagao.service.YdHuaGaoService;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
 import com.malk.server.aliwork.YDSearch;
+import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
@@ -179,4 +180,25 @@ private YdHuaGaoService ydHuaGaoService;
             log.error("【synckdYdTRANSFER同步任务】执行过程中发生严重错误", e);
         }
     }
+
+//    @Scheduled(cron = "0/1 * * * * ?")
+    public void synckddel() {
+        log.info("定时删除物料表");
+        try {
+            MDC.put("MDC_KEY_PID","1003");
+            DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+                    .formUuid("FORM-E64114E9F2C9426E91F92886EDFFA2C08Q90")
+                    .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
+
+            System.out.println(ddrNew.getTotalCount());
+
+            ydClient.operateData(YDParam.builder()
+                    .formUuid("FORM-E64114E9F2C9426E91F92886EDFFA2C08Q90")
+                    .asynchronousExecution(true)
+                    .formInstanceIdList((List<String>) ddrNew.getData())
+                    .build(), YDConf.FORM_OPERATION.delete_batch);
+        } catch (Exception e) {
+            log.error("【synckdYdTRANSFER同步任务】执行过程中发生严重错误", e);
+        }
+    }
 }

+ 2 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/IKdYdOrderService.java

@@ -16,4 +16,6 @@ import java.util.Map;
 public interface IKdYdOrderService extends IService<KdYdOrder> {
 
     void insertkdYdOrder(Map map);
+
+    void SckdYdOrder(Map map);
 }

+ 3 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/YdHuaGaoService.java

@@ -1,5 +1,7 @@
 package com.malk.huagao.service;
 
+import com.malk.server.common.McR;
+
 public interface YdHuaGaoService {
     void syncKdYdCustomer();
 
@@ -23,4 +25,5 @@ public interface YdHuaGaoService {
 
     void synckdYdTRANSFER();
 
+
 }

+ 27 - 11
mjava-huagao/src/main/java/com/malk/huagao/service/impl/EqbServiceImpl.java

@@ -65,6 +65,9 @@ public class EqbServiceImpl implements EqbService {
     @Value(value = "${eqb.signatoryPsnId}")
     private String signatoryPsnId;
 
+    @Value(value = "${dingtalk.atUserId}")
+    private String atUserId;
+
 
 
     @Async
@@ -164,6 +167,13 @@ public class EqbServiceImpl implements EqbService {
 
         String fileId = UtilMap.getString(result,"fileId");
 
+        //文档转换pdf需时间
+        try {
+            Thread.sleep(3000);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+
         //3、基于文件发起签署
         JSONObject reqBodyObj2 = new JSONObject();
         //设置待签署文件信息
@@ -180,13 +190,19 @@ public class EqbServiceImpl implements EqbService {
 
         //签署方信息
         Map signer = new HashMap();
-        signer.put("signerType",0);//签署方类型,0 - 个人,1 - 企业/机构,2 - 法定代表人,3 - 经办人
-            /*Map orgSignerInfo = new HashMap();
-            orgSignerInfo.put("orgId","a5ec8fb7d8cc4276bd486824df0ec640");
-            signer.put("orgSignerInfo",orgSignerInfo);*/
-        Map psnSignerInfo = new HashMap();
+        signer.put("signerType",1);//签署方类型,0 - 个人,1 - 企业/机构,2 - 法定代表人,3 - 经办人
+
+        Map orgSignerInfo = new HashMap();
+        orgSignerInfo.put("orgId","a5ec8fb7d8cc4276bd486824df0ec640");//华高机构id
+        //企业/机构经办人信息
+        Map transactorInfo = new HashMap();
+        transactorInfo.put("psnId",signatoryPsnId);//陈伟东
+        orgSignerInfo.put("transactorInfo",transactorInfo);
+        signer.put("orgSignerInfo",orgSignerInfo);
+
+        /*Map psnSignerInfo = new HashMap();
         psnSignerInfo.put("psnId",signatoryPsnId);//陈伟东
-        signer.put("psnSignerInfo",psnSignerInfo);
+        signer.put("psnSignerInfo",psnSignerInfo);*/
 
         Map signField = new HashMap();
         signField.put("fileId",fileId);
@@ -211,7 +227,7 @@ public class EqbServiceImpl implements EqbService {
         //4、回写签署地址
         JSONObject reqBodyObj3 = new JSONObject();
         Map operator = new HashMap();
-        operator.put("psnId", "0fd3eb8b0c424b4e827bb3bf1fba62f3");
+        operator.put("psnId", signatoryPsnId);
         reqBodyObj3.put("operator", operator);
         Map result3 = eqbPost("/v3/sign-flow/" + signFlowId + "/sign-url", reqBodyObj3);
 
@@ -220,8 +236,8 @@ public class EqbServiceImpl implements EqbService {
         ydClient.operateData(YDParam.builder()
                 .formInstanceId(formInstId)
                 .content("签署地址:"+shortUrl)
-                .userId("344749020127590108")
-                .atUserId("344749020127590108")
+                .userId("yida_pub_account")
+                .atUserId(atUserId)//陈伟东
                 .build(), YDConf.FORM_OPERATION.remarks);
 
 
@@ -582,9 +598,9 @@ public class EqbServiceImpl implements EqbService {
             String mxbz = UtilMap.getString(cgmx.get(i), "textField_mizdd3r0");//备注
 
             if (i == 0){
-                cghtmx.add(getRowMap(false,i+1,wlbm,wlmc,null,ggxh,cgdw,cgsl,hsdj,jshj,jhrqStr,mxbz));
+                cghtmx.add(getRowMap(false,i+1,wlbm,wlmc,null,ggxh,cgsl,cgdw,hsdj,jshj,jhrqStr,mxbz));
             }else {
-                cghtmx.add(getRowMap(true,i+1,wlbm,wlmc,null,ggxh,cgdw,cgsl,hsdj,jshj,jhrqStr,mxbz));
+                cghtmx.add(getRowMap(true,i+1,wlbm,wlmc,null,ggxh,cgsl,cgdw,hsdj,jshj,jhrqStr,mxbz));
             }
         }
         Map component7 = new HashMap();

+ 3 - 0
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdHuaGaoServiceImpl.java

@@ -107,6 +107,8 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
                         .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
 
                 formInstanceIdListList.addAll(Collections.singleton((List<String>) ddrNew.getData()));
+
+                Thread.sleep(1000);
             }while (ddrNew.getPageNumber() * pageSize < ddrNew.getTotalCount());
 
             for (List<String> formInstanceIdList : formInstanceIdListList) {
@@ -1015,6 +1017,7 @@ public class KdHuaGaoServiceImpl implements KdHuaGaoService {
                 formData.put("textField_mizdd3pi",fProviderContactPost);
                 formData.put("textField_mizdd3pk",fProviderContactMobile);
                 formData.put("textField_mizdd3pm",fSupplierAddress);
+                formData.put("selectField_mjs0s3ku","未完成");
 
 
                 Map detail = new HashMap();

+ 3 - 2
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdDeliveryServiceImpl.java

@@ -119,13 +119,14 @@ public class KdYdDeliveryServiceImpl extends ServiceImpl<KdYdDeliveryMapper, KdY
 
         Long id = kdYdDelivery.getId();
         System.out.println("id:"+id);
-        int count = 1;
+//        int count = 1;
         for (Map item : tableField) {
             String wlbm = safeGetString(item, "textField_mejnamff");
             String wlmc = safeGetString(item, "textField_mejnamfg");
             String ggxh = safeGetString(item, "textField_mejnamfh");
             String xsdw = safeGetString(item, "textField_mejnamfk");
             int jjsl = parseInt(safeGetString(item, "numberField_mf6a0h6r"), 0); // 如果为空或格式错误,返回 0
+            int count = parseInt(safeGetString(item, "numberField_mjzg06br"), 0); // 如果为空或格式错误,返回 0
             String ssxl = safeGetString(item, "textField_mejnamfx");
             String sfzp = safeGetString(item, "radioField_mf6a0h6h");
             String ckck = safeGetString(item, "textField_mf6a0h6l");
@@ -167,7 +168,7 @@ public class KdYdDeliveryServiceImpl extends ServiceImpl<KdYdDeliveryMapper, KdY
                 kdYdDeliveryDetailMapper.insert(kdYdDeliveryDetail);
             }
 
-            count++;
+//            count++;
 //save(kdYdDeliveryDetail);
         }
 //        ydClient.operateData(

+ 429 - 83
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdOrderServiceImpl.java

@@ -13,6 +13,8 @@ import com.malk.huagao.service.IKdYdOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.utils.UtilMap;
@@ -24,12 +26,11 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * <p>
@@ -65,6 +66,14 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
             kdYdOrderMapper.update(kdYdOrder, new LambdaQueryWrapper<KdYdOrder>().eq(KdYdOrder::getDjbh, bm));
             return; // 或者根据你的业务逻辑返回相应的结果
         }
+        if ("4".equals(type)) {
+            String bm = UtilMap.getString(map, "bm");
+            KdYdOrder kdYdOrder = new KdYdOrder();
+            kdYdOrder.setOperationType("4");
+            kdYdOrder.setSyncStatus("0");
+            kdYdOrderMapper.update(kdYdOrder, new LambdaQueryWrapper<KdYdOrder>().eq(KdYdOrder::getDjbh, bm));
+            return; // 或者根据你的业务逻辑返回相应的结果
+        }
         DDR_New ddrNew = ydClient.queryData(YDParam.builder()
                 .formInstId(formInstId)
                 .build(), YDConf.FORM_QUERY.retrieve_id);
@@ -72,9 +81,9 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
 
         String djlx = UtilMap.getString(formData, "selectField_mejowmna");
         String khmc = UtilMap.getString(formData, "textField_mejnamf2");
-        String djbh = UtilMap.getString(formData, "serialNumberField_mewfgzku");
+        String djbh = UtilMap.getString(formData, "textField_mjs6fuwo");
         if("2".equals(type)){
-             djbh = UtilMap.getString(formData, "textField_miwvnkep");
+             djbh = UtilMap.getString(formData, "textField_mjs6fuwo");
         }
         LocalDateTime rq = parseTimestamp(UtilMap.getString(formData, "dateField_mejowmnb"));
         String khxypj = UtilMap.getString(formData, "selectField_mewirdx4");
@@ -113,6 +122,7 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
         String jws = UtilMap.getString(formData, "radioField_mfxv2vgm");
         List<Map> tableField = (List<Map>) formData.get("tableField_mfbx1pqi");
         List<Map> tableFieldPayment = (List<Map>) formData.get("tableField_mhiui6v5");
+
         KdYdOrder kdYdOrder = new KdYdOrder();
         kdYdOrder.setDjlx(djlx);
         kdYdOrder.setDjbh(djbh);
@@ -134,104 +144,209 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
         kdYdOrder.setSfhs(sfhs);
         kdYdOrder.setJws(jws);
         kdYdOrder.setSyncStatus("0");
-        kdYdOrder.setOperationType("1");
-//        kdYdOrder.setForminstid(formInstId);
+
+        Long id;
         if ("2".equals(type)) {
-            kdYdOrder.setOperationType(type);
-            kdYdOrderMapper.update(kdYdOrder, new LambdaQueryWrapper<KdYdOrder>().eq(KdYdOrder::getDjbh, djbh));
+            // 查询已存在的订单
+            KdYdOrder existing = kdYdOrderMapper.selectOne(
+                    new LambdaQueryWrapper<KdYdOrder>().eq(KdYdOrder::getDjbh, djbh)
+            );
+            if (existing == null) {
+                throw new IllegalArgumentException("无法更新订单:单据编号 [" + djbh + "] 不存在");
+            }
+            id = existing.getId();
+            kdYdOrder.setId(id);
+            kdYdOrder.setOperationType("2");
+            kdYdOrderMapper.updateById(kdYdOrder); // 使用 updateById 更安全
         } else {
+            kdYdOrder.setOperationType("1");
             kdYdOrderMapper.insert(kdYdOrder);
+            id = kdYdOrder.getId(); // MyBatis-Plus 会自动回填主键
         }
 
-        Long id = kdYdOrder.getId();
-        int count = 1;
-        for (Map item : tableField) {
-
-            String wlbm = safeGetString(item, "textField_mfbx1pqt");
-            String wlmc = safeGetString(item, "textField_mfbx1pqs");
-            String ggxh = safeGetString(item, "textField_mfbx1pqr");
-            String xsdw = safeGetString(item, "textField_mfbx1pqq");
-            int xssl = parseInt(safeGetString(item, "numberField_mfbx1pr4"), 0); // 如果为空或格式错误,返回 0
-            String ssxl = safeGetString(item, "selectField_mfbx1pr1");
-            BigDecimal dj = toBigDecimal(safeGetString(item, "numberField_mfbx1prf"));
-            BigDecimal hsdj = toBigDecimal(safeGetString(item, "numberField_mfbx1prg"));
-            String sfzp = safeGetString(item, "radioField_mfbx1prc");
-            int sl = parseInt(safeGetString(item, "numberField_mfbx1prb"), 0);
-            BigDecimal zse = toBigDecimal(safeGetString(item, "numberField_mfbx1prh"));
-            BigDecimal zje = toBigDecimal(safeGetString(item, "numberField_mfbx1pri"));
-            BigDecimal zjshj = toBigDecimal(safeGetString(item, "numberField_mfbx1prj"));
-            BigDecimal jj = toBigDecimal(safeGetString(item, "numberField_mfbx1prk"));
-            BigDecimal zkl = toBigDecimal(safeGetString(item, "numberField_mfbx1pru"));
-            BigDecimal zke = toBigDecimal(safeGetString(item, "numberField_mfbx1prt"));
-            LocalDateTime yhrq = parseTimestamp(UtilMap.getString(item, "dateField_mfbx1prs"));
-            BigDecimal xsjzj = toBigDecimal(safeGetString(item, "numberField_mfbx1pr0"));
-            String zmzs = safeGetString(item, "textField_mfxv2vgv");
-            KdYdOrderDetail kdYdOrderDetail = new KdYdOrderDetail();
-            kdYdOrderDetail.setOrderId(id);
-            kdYdOrderDetail.setWlbm(wlbm);
-            kdYdOrderDetail.setWlmc(wlmc);
-            kdYdOrderDetail.setGgxh(ggxh);
-            kdYdOrderDetail.setXsdw(xsdw);
-            kdYdOrderDetail.setXssl(xssl);
-            kdYdOrderDetail.setSsxl(ssxl);
-            kdYdOrderDetail.setDj(dj);
-            kdYdOrderDetail.setHsdj(hsdj);
-            kdYdOrderDetail.setSfzp(sfzp);
-            kdYdOrderDetail.setSl(sl);
-            kdYdOrderDetail.setSe(zse);
-            kdYdOrderDetail.setJe(zje);
-            kdYdOrderDetail.setJshj(zjshj);
-            kdYdOrderDetail.setJj(jj);
-            kdYdOrderDetail.setZkl(zkl);
-            kdYdOrderDetail.setZke(zke);
-            kdYdOrderDetail.setYhrq(yhrq);
-            kdYdOrderDetail.setXsjzj(xsjzj);
-            kdYdOrderDetail.setDetailId(count);
-            kdYdOrderDetail.setSmzs(zmzs);
-            kdYdOrderDetail.setSyncStatus("0");
-            kdYdOrderDetail.setOperationType("1");
-//            kdYdOrderDetail.setForminstid(formInstId);
-            if ("2".equals(type) || "3".equals(type)) {
-                kdYdOrderDetail.setOperationType(type);
-                kdYdOrderDetailMapper.update(kdYdOrderDetail, new LambdaQueryWrapper<KdYdOrderDetail>()
-                        .eq(KdYdOrderDetail::getWlbm, wlbm)
-                        .eq(KdYdOrderDetail::getOrderId, id));
-            } else {
-                kdYdOrderDetailMapper.insert(kdYdOrderDetail);
+// ====== 1. 获取数据库中当前 orderId 的所有明细(用于后续对比删除)======
+        LambdaQueryWrapper<KdYdOrderDetail> existingWrapper = new LambdaQueryWrapper<>();
+        existingWrapper.eq(KdYdOrderDetail::getOrderId, id);
+        List<KdYdOrderDetail> existingDetails = kdYdOrderDetailMapper.selectList(existingWrapper);
+        Set<Integer> incomingDetailIds = new HashSet<>(); // 用于记录本次传入的 detailId
+
+// ====== 2. 遍历传入的 tableField,逐条处理 ======
+        if (tableField != null) {
+            for (Map item : tableField) {
+                int detailId = parseInt(safeGetString(item, "indexField"), 0); // 建议前端传一个明确的 index 或 detailId 字段
+                // 如果前端没有显式传 detailId,可以用循环计数(但需注意顺序稳定性)
+                // 这里假设你用 count 作为 detailId(与前端一致)
+                // 若前端表格支持拖拽/乱序,建议传唯一行ID,但你当前用的是序号,我们继续用 count
+
+                // 注意:你原代码用 count++,这里我们改用从数据中获取或维持顺序
+                // 为兼容你原有逻辑,我们仍用递增序号,但更推荐前端传 detailId
+            }
+
+            // 重新遍历,使用 index 作为 detailId
+            for (int i = 0; i < tableField.size(); i++) {
+                Map item = tableField.get(i);
+                int detailId = parseInt(safeGetString(item, "numberField_mjzfodew"), 0);
+                incomingDetailIds.add(detailId);
+
+                String wlbm = safeGetString(item, "textField_mfbx1pqt");
+                String wlmc = safeGetString(item, "textField_mfbx1pqs");
+                String ggxh = safeGetString(item, "textField_mfbx1pqr");
+                String xsdw = safeGetString(item, "textField_mfbx1pqq");
+                int xssl = parseInt(safeGetString(item, "numberField_mfbx1pr4"), 0);
+                String ssxl = safeGetString(item, "selectField_mfbx1pr1");
+                BigDecimal dj = toBigDecimal(safeGetString(item, "numberField_mfbx1prf"));
+                BigDecimal hsdj = toBigDecimal(safeGetString(item, "numberField_mfbx1prg"));
+                String sfzp = safeGetString(item, "radioField_mfbx1prc");
+                String bz1 = safeGetString(item, "textareaField_mjryuaok");
+                int sl = parseInt(safeGetString(item, "numberField_mfbx1prb"), 0);
+                BigDecimal zse = toBigDecimal(safeGetString(item, "numberField_mfbx1prh"));
+                BigDecimal zje = toBigDecimal(safeGetString(item, "numberField_mfbx1pri"));
+                BigDecimal zjshj = toBigDecimal(safeGetString(item, "numberField_mfbx1prj"));
+                BigDecimal jj = toBigDecimal(safeGetString(item, "numberField_mfbx1prk"));
+                BigDecimal zkl = toBigDecimal(safeGetString(item, "numberField_mfbx1pru"));
+                BigDecimal zke = toBigDecimal(safeGetString(item, "numberField_mfbx1prt"));
+                LocalDateTime yhrq = parseTimestamp(UtilMap.getString(item, "dateField_mfbx1prs"));
+                BigDecimal xsjzj = toBigDecimal(safeGetString(item, "numberField_mfbx1pr0"));
+                String zmzs = safeGetString(item, "textField_mfxv2vgv");
+
+                // 查询是否已存在
+                LambdaQueryWrapper<KdYdOrderDetail> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(KdYdOrderDetail::getOrderId, id)
+                        .eq(KdYdOrderDetail::getDetailId, detailId);
+                KdYdOrderDetail existing = kdYdOrderDetailMapper.selectOne(queryWrapper);
+
+                if (existing != null) {
+                    // 更新
+                    existing.setWlbm(wlbm);
+                    existing.setWlmc(wlmc);
+                    existing.setGgxh(ggxh);
+                    existing.setXsdw(xsdw);
+                    existing.setXssl(xssl);
+                    existing.setSsxl(ssxl);
+                    existing.setDj(dj);
+                    existing.setHsdj(hsdj);
+                    existing.setSfzp(sfzp);
+                    existing.setSl(sl);
+                    existing.setBz(bz1);
+                    existing.setSe(zse);
+                    existing.setJe(zje);
+                    existing.setJshj(zjshj);
+                    existing.setJj(jj);
+                    existing.setZkl(zkl);
+                    existing.setZke(zke);
+                    existing.setYhrq(yhrq);
+                    existing.setXsjzj(xsjzj);
+                    existing.setSmzs(zmzs);
+                    existing.setSyncStatus("0");
+                    existing.setOperationType(type); // 注意:type 决定是 insert(1) 还是 update(2/3)
+
+                    kdYdOrderDetailMapper.updateById(existing);
+                } else {
+                    // 新增
+                    KdYdOrderDetail kdYdOrderDetail = new KdYdOrderDetail();
+                    kdYdOrderDetail.setOrderId(id);
+                    kdYdOrderDetail.setDetailId(detailId);
+                    kdYdOrderDetail.setWlbm(wlbm);
+                    kdYdOrderDetail.setWlmc(wlmc);
+                    kdYdOrderDetail.setGgxh(ggxh);
+                    kdYdOrderDetail.setXsdw(xsdw);
+                    kdYdOrderDetail.setXssl(xssl);
+                    kdYdOrderDetail.setSsxl(ssxl);
+                    kdYdOrderDetail.setDj(dj);
+                    kdYdOrderDetail.setHsdj(hsdj);
+                    kdYdOrderDetail.setSfzp(sfzp);
+                    kdYdOrderDetail.setSl(sl);
+                    kdYdOrderDetail.setSe(zse);
+                    kdYdOrderDetail.setJe(zje);
+                    kdYdOrderDetail.setBz(bz1);
+                    kdYdOrderDetail.setJshj(zjshj);
+                    kdYdOrderDetail.setJj(jj);
+                    kdYdOrderDetail.setZkl(zkl);
+                    kdYdOrderDetail.setZke(zke);
+                    kdYdOrderDetail.setYhrq(yhrq);
+                    kdYdOrderDetail.setXsjzj(xsjzj);
+                    kdYdOrderDetail.setSmzs(zmzs);
+                    kdYdOrderDetail.setSyncStatus("0");
+                    kdYdOrderDetail.setOperationType("1"); // 新增始终是 1
+
+                    kdYdOrderDetailMapper.insert(kdYdOrderDetail);
+                }
+            }
+        }
+
+// ====== 3. 删除数据库中存在但本次未传入的明细 ======
+        for (KdYdOrderDetail existing : existingDetails) {
+            if (!incomingDetailIds.contains(existing.getDetailId())) {
+                kdYdOrderDetailMapper.deleteById(existing.getId());
+                // 或者软删除:update sync_status = '9' 等
             }
-            count++;
         }
+
+// ====== 处理付款计划子表(KdYdOrderPayment)======
+
+// 1. 查询数据库中当前 orderId 下所有已存在的付款记录
+        LambdaQueryWrapper<KdYdOrderPayment> paymentExistingWrapper = new LambdaQueryWrapper<>();
+        paymentExistingWrapper.eq(KdYdOrderPayment::getOrderId, id);
+        List<KdYdOrderPayment> existingPayments = kdYdOrderPaymentMapper.selectList(paymentExistingWrapper);
+        Set<Integer> incomingPaymentDetailIds = new HashSet<>();
+
         if (tableFieldPayment != null) {
             for (int i = 0; i < tableFieldPayment.size(); i++) {
                 Map row = tableFieldPayment.get(i);
+                int detailId = i + 1; // 使用 1-based 序号作为 detailId(需与前端表格顺序一致)
+                incomingPaymentDetailIds.add(detailId);
+
                 String sfys = safeGetString(row, "radioField_mhiui6v7");
                 String gldh = safeGetString(row, "textField_mhiui6va");
                 BigDecimal ysbl = toBigDecimal(UtilMap.getString(row, "numberField_mhiui6v6"));
                 BigDecimal ysje = toBigDecimal(UtilMap.getString(row, "numberField_mhiui6v8"));
                 BigDecimal ssje = toBigDecimal(UtilMap.getString(row, "numberField_mhiui6vb"));
-                int detailId = i + 1;
                 LocalDateTime endTime = parseTimestamp(UtilMap.getString(row, "dateField_mhiui6v9"));
-                KdYdOrderPayment kdYdOrderPayment = new KdYdOrderPayment();
-                kdYdOrderPayment.setOrderId(id);
-                kdYdOrderPayment.setSfys(sfys);
-                kdYdOrderPayment.setGldh(gldh);
-                kdYdOrderPayment.setYsbl(ysbl);
-                kdYdOrderPayment.setYsje(ysje);
-                kdYdOrderPayment.setSsje(ssje);
-                kdYdOrderPayment.setDetailId(detailId);
-                kdYdOrderPayment.setEndTime(endTime);
-                kdYdOrderPayment.setSyncStatus("0");
-                kdYdOrderPayment.setOperationType("1");
-                if ("2".equals(type) || "3".equals(type)) {
-                    kdYdOrderPayment.setOperationType(type);
-                    kdYdOrderPaymentMapper.update(kdYdOrderPayment, new LambdaQueryWrapper<KdYdOrderPayment>()
-                            .eq(KdYdOrderPayment::getDetailId, detailId)
-                            .eq(KdYdOrderPayment::getOrderId, id));
+
+                // 查询是否已存在该 (orderId, detailId)
+                LambdaQueryWrapper<KdYdOrderPayment> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(KdYdOrderPayment::getOrderId, id)
+                        .eq(KdYdOrderPayment::getDetailId, detailId);
+                KdYdOrderPayment existingPayment = kdYdOrderPaymentMapper.selectOne(queryWrapper);
+
+                if (existingPayment != null) {
+                    // 更新
+                    existingPayment.setSfys(sfys);
+                    existingPayment.setGldh(gldh);
+                    existingPayment.setYsbl(ysbl);
+                    existingPayment.setYsje(ysje);
+                    existingPayment.setSsje(ssje);
+                    existingPayment.setEndTime(endTime);
+                    existingPayment.setSyncStatus("0");
+                    existingPayment.setOperationType(type); // 使用传入的 type("2" 或 "3")
+
+                    kdYdOrderPaymentMapper.updateById(existingPayment);
                 } else {
-                    kdYdOrderPaymentMapper.insert(kdYdOrderPayment);
+                    // 新增
+                    KdYdOrderPayment payment = new KdYdOrderPayment();
+                    payment.setOrderId(id);
+                    payment.setDetailId(detailId);
+                    payment.setSfys(sfys);
+                    payment.setGldh(gldh);
+                    payment.setYsbl(ysbl);
+                    payment.setYsje(ysje);
+                    payment.setSsje(ssje);
+                    payment.setEndTime(endTime);
+                    payment.setSyncStatus("0");
+                    payment.setOperationType("1"); // 新增操作类型为 "1"
+
+                    kdYdOrderPaymentMapper.insert(payment);
                 }
             }
         }
+
+// 3. 删除数据库中存在但本次未传入的付款记录
+        for (KdYdOrderPayment existing : existingPayments) {
+            if (!incomingPaymentDetailIds.contains(existing.getDetailId())) {
+                kdYdOrderPaymentMapper.deleteById(existing.getId());
+                // 或软删除:existing.setSyncStatus("9"); updateById
+            }
+        }
 //        ydClient.operateData(
 //                YDParam.builder()
 //                        .formInstanceId(formInstId)
@@ -240,6 +355,237 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
 
     }
 
+    @Override
+    public void SckdYdOrder(Map map) {
+        MDC.put("MDC_KEY_PID", "1003");
+
+        try {
+            String formInstId = UtilMap.getString(map, "formInstId");
+            String khbm = UtilMap.getString(map, "khbm");
+
+            // 1. 查询订单详情
+            DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+                    .formInstId(formInstId)
+                    .build(), YDConf.FORM_QUERY.retrieve_id);
+
+            if (ddrNew == null || ddrNew.getFormData() == null) {
+                throw new RuntimeException("未找到订单信息");
+            }
+
+            Map formData1 = ddrNew.getFormData();
+            String ddje = UtilMap.getString(formData1, "numberField_mfxv2vgj");
+
+            // 参数校验
+            if (ddje == null || ddje.trim().isEmpty()) {
+                throw new RuntimeException("订单金额不能为空");
+            }
+
+            // 2. 计算订单金额(保留两位小数)
+            Double orderAmount = null;
+            try {
+                orderAmount = Double.parseDouble(ddje);
+                orderAmount = Math.round(orderAmount * 100.0) / 100.0;
+            } catch (NumberFormatException e) {
+                throw new RuntimeException("订单金额格式错误: " + ddje);
+            }
+
+            // 3. 查询客户历史信息
+            List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
+                    .formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
+                    .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
+                            new YDSearch("textField_mjm9k35n",
+                                    khbm,
+                                    "客户编号",
+                                    YDSearch.Type.TEXT_FIELD,
+                                    YDSearch.Operator.EQ)
+                    )))
+                    .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
+
+            if (list == null || list.isEmpty()) {
+                throw new RuntimeException("未找到客户信息,客户编号:" + khbm);
+            }
+
+            // 4. 获取客户现有信息
+            Map customerData = list.get(0);
+            Double historicalAmount = UtilMap.getDouble(customerData, "numberField_mjm9k35k");
+            String dddateTimestampStr = UtilMap.getString(customerData, "dateField_mjqkkcsg");
+            String sfdateTimestampStr = UtilMap.getString(customerData, "dateField_mjm9k35l");
+
+            // 参数校验
+            if (dddateTimestampStr == null || dddateTimestampStr.trim().isEmpty()) {
+                throw new RuntimeException("最后成交日期不能为空");
+            }
+
+            // 处理历史金额
+            if (historicalAmount == null) {
+                historicalAmount = 0.0;
+            } else {
+                historicalAmount = Math.round(historicalAmount * 100.0) / 100.0;
+            }
+
+            // 5. 计算总金额
+            Double totalAmount = orderAmount + historicalAmount;
+            totalAmount = Math.round(totalAmount * 100.0) / 100.0;
+
+            System.out.println("金额计算:订单金额=" + orderAmount +
+                    ", 历史金额=" + historicalAmount +
+                    ", 总金额=" + totalAmount);
+
+            // 6. 时间戳转换
+            long dddateTimestamp = Long.parseLong(dddateTimestampStr.trim());
+            long currentTimestamp = System.currentTimeMillis();
+            long sfdateTimestamp = (sfdateTimestampStr != null && !sfdateTimestampStr.trim().isEmpty())
+                    ? Long.parseLong(sfdateTimestampStr.trim()) : 0;
+
+            // 计算时间差(天数)
+            long currentToDdDays = (currentTimestamp - dddateTimestamp) / (1000 * 60 * 60 * 24);
+            long sfToDdDays = (sfdateTimestamp > 0) ? (sfdateTimestamp - dddateTimestamp) / (1000 * 60 * 60 * 24) : 0;
+
+            System.out.println("时间计算:当前时间-" + timestampToDateString(String.valueOf(currentTimestamp)) +
+                    ", 成交日期-" + timestampToDateString(dddateTimestampStr) +
+                    ", 当前-成交相差=" + currentToDdDays + "天" +
+                    ", 公海-成交相差=" + sfToDdDays + "天");
+
+            String ghcDateTimestamp = null;
+            String selectFieldValue = "";
+            String khsx = "";
+
+// 1. 设置客户属性(单独判断)
+            if(totalAmount >= 75000 && sfToDdDays <= 180){
+                khsx = "自行开发";
+            }
+
+// 2. 第一个条件:当前时间-成交日期<90天 且 总金额>0 且 公海日期-成交日期≈180天
+            if (currentToDdDays < 90 && totalAmount > 0 && Math.abs(sfToDdDays - 180) <= 1) {
+                // 在成交日期上加90天
+                ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestamp, 90));
+                selectFieldValue = "半年金额不足";
+                System.out.println("条件1触发:公海池时间设为成交日期+90天=" +
+                        timestampToDateString(ghcDateTimestamp));
+            }
+// 3. 第二个条件:总金额≥7.5万 且 公海日期-成交日期≤180天
+            else if (totalAmount >= 75000 && sfToDdDays <= 180) {
+                // 在成交日期上加180天
+                ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestamp, 180));
+                selectFieldValue = "半年金额不足";
+                System.out.println("条件2触发:公海池时间设为成交日期+180天=" +
+                        timestampToDateString(ghcDateTimestamp));
+            }
+// 4. 第三个条件:金额<15万 且 公海日期-成交日期>180天
+            else if (totalAmount < 150000 && sfToDdDays > 180) {
+                selectFieldValue = "一年金额不足";
+                System.out.println("条件3触发:金额<15万且公海日期>180天,设置一年金额不足");
+            }
+// 5. 其他情况
+            else {
+                if (totalAmount > 0) {
+                    // 基础情况:金额大于0
+                    ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestamp, 90));
+                    selectFieldValue = "半年金额不足";
+                    System.out.println("基础情况:金额大于0,公海池时间+90天=" +
+                            timestampToDateString(ghcDateTimestamp));
+                } else if (totalAmount < 75000) {
+                    // 金额 < 7.5万
+                    selectFieldValue = "半年金额不足";
+                    System.out.println("金额<7.5万,但未设置公海池时间");
+                } else if (totalAmount < 150000) {
+                    // 7.5万 ≤ 金额 < 15万
+                    selectFieldValue = "一年金额不足";
+                    System.out.println("金额7.5-15万,但未设置公海池时间");
+                }
+            }
+
+
+            // 8. 构建更新数据
+            Map<String, Object> formData = new HashMap<>();
+            formData.put("dateField_mjm9k35j", dddateTimestampStr); // 最后成交日期(保持原时间戳)
+
+            // 只有selectField有值时才设置
+            if (!selectFieldValue.isEmpty()) {
+                formData.put("selectField_l3nrjuq0", selectFieldValue);
+            }
+
+            if (ghcDateTimestamp != null) {
+                formData.put("dateField_mjm9k35l", ghcDateTimestamp); // 释放公海日期
+            } else {
+                formData.put("dateField_mjm9k35l", ""); // 明确设置为空
+            }
+
+            // 更新累计金额(保留两位小数)
+            formData.put("numberField_mjm9k35k", totalAmount);
+            formData.put("selectField_mjsco9d4", khsx);
+
+            System.out.println("更新客户数据:" + formData);
+
+            // 9. 执行更新操作
+            ydClient.operateData(YDParam.builder()
+                    .formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
+                    .appType("APP_VQDMMWS6OR1VHL8VMFD3")
+                    .systemToken("XE766X81JHKXK4Z27SYOI86CPCLQ3J1LV7ODMH2")
+                    .noExecuteExpression(false)
+                    .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
+                            new YDSearch("textField_mjm9k35n",
+                                    khbm,
+                                    "客户编号",
+                                    YDSearch.Type.TEXT_FIELD,
+                                    YDSearch.Operator.EQ)
+                    )))
+                    .formDataJson(JSONObject.toJSONString(formData))
+                    .build(), YDConf.FORM_OPERATION.upsert);
+
+            System.out.println("客户信息更新成功,客户编号:" + khbm);
+
+        } catch (Exception e) {
+            System.err.println("处理订单失败: " + e.getMessage());
+            e.printStackTrace();
+            throw new RuntimeException("处理订单失败: " + e.getMessage(), e);
+        } finally {
+            MDC.remove("MDC_KEY_PID");
+        }
+    }
+
+    /**
+     * 计算时间戳:在基础时间戳上添加天数
+     * @param baseTimestamp 基础时间戳(毫秒)
+     * @param days 要添加的天数
+     * @return 计算后的时间戳(毫秒)
+     */
+    private long calculateTimestamp(long baseTimestamp, int days) {
+        try {
+            long oneDayMillis = 24L * 60L * 60L * 1000L;
+            long daysMillis = (long) days * oneDayMillis;
+            return baseTimestamp + daysMillis;
+        } catch (Exception e) {
+            System.err.println("时间戳计算失败:" + baseTimestamp + ", 天数:" + days);
+            return baseTimestamp + (days * 24L * 60L * 60L * 1000L);
+        }
+    }
+
+    /**
+     * 辅助方法:将时间戳转换为可读日期(仅用于调试)
+     */
+    private String timestampToDateString(String timestamp) {
+        try {
+            long ts = Long.parseLong(timestamp.trim());
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            return sdf.format(new Date(ts));
+        } catch (Exception e) {
+            return "无效时间戳:" + timestamp;
+        }
+    }
+
+    /**
+     * 重载方法:直接接收long类型时间戳
+     */
+    private String timestampToDateString(long timestamp) {
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            return sdf.format(new Date(timestamp));
+        } catch (Exception e) {
+            return "无效时间戳:" + timestamp;
+        }
+    }
+
     private static LocalDateTime parseTimestamp(String timestampStr) {
         if (timestampStr == null || timestampStr.trim().isEmpty()) return null;
         try {

+ 82 - 17
mjava-huagao/src/main/java/com/malk/huagao/service/impl/YdHuaGaoServiceImpl.java

@@ -10,11 +10,11 @@ import com.malk.huagao.service.YdHuaGaoService;
 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.service.aliwork.YDClient;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
-import org.checkerframework.checker.units.qual.A;
 import org.slf4j.MDC;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -339,7 +339,7 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
                 List<KdYdOutboundDetail> kdYdOutboundDetails = kdYdOutboundDetailMapper.selectList(outbounddetailqw);
 
                 ArrayList<Object> tableList = new ArrayList<>();
-                List<Map<String, Object>> tableListxlh = new ArrayList<>();
+                List<Map<String, Object>> tableListxlh = new ArrayList<>(); // 在循环外初始化
                 for (KdYdOutboundDetail kdYdOutboundDetail : kdYdOutboundDetails) {
                     HashMap<String, String> tablemap = new HashMap<>();
                     HashMap<String, String> tablemapxlh = new HashMap<>();
@@ -374,21 +374,30 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
                     tablemap.put("textField_mf6a0h6y", kdYdOutboundDetail.getJx());
                     String xlhjh = kdYdOutboundDetail.getXlh();
                     if (xlhjh != null && !xlhjh.trim().isEmpty()) {
-                        tableListxlh = Arrays.stream(xlhjh.split(","))
+                        List<Map<String, Object>> currentXlhList = Arrays.stream(xlhjh.split(","))
                                 .map(String::trim)
                                 .filter(item -> !item.isEmpty())
                                 .map(item -> {
                                     Map<String, Object> map = new HashMap<>();
-                                    map.put("textField_mf6a0h6w", item);
+                                    map.put("textField_mf6a0h6w", item); // 序列号
+                                    map.put("textField_mjqst61l", kdYdOutboundDetail.getWlbm()); // 对应的物料编码
+                                    map.put("textField_mjqst61m", kdYdOutboundDetail.getGgxh());
                                     return map;
                                 })
                                 .collect(Collectors.toList());
+
+                        tableListxlh.addAll(currentXlhList); // 追加到总列表
                     }
+
+                    // 主表仍保留原始 xlh(可选)
+                    tablemap.put("textField_mf6a0h6w", kdYdOutboundDetail.getXlh());
                     tablemap.put("radioField_mf6a0h6h", kdYdOutboundDetail.getSfzp());
+
                     tableList.add(tablemap);
+
+                    // 更新同步状态
                     kdYdOutboundDetail.setSyncStatus("1");
                     kdYdOutboundDetailMapper.updateById(kdYdOutboundDetail);
-
                 }
 
                 String fhdformInstanceId = null;
@@ -733,6 +742,7 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
                 }
                 updateData.put("tableField_mhiui6v5", tableListPay);
                 updateData.put("textField_mg3a0tgs", kdYdReceivable.getDjbh());
+                updateData.put("textField_mj15q3dk", ckddjbh);
                 updateData.put("selectField_mg3a0th4", kdYdReceivable.getDjlx());
                 updateData.put("selectField_mev13l3r", kdYdReceivable.getSktj());
                 updateData.put("dateField_mejmtic3", kdYdReceivable.getEndTime().atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli());
@@ -950,7 +960,10 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
                         .appType("APP_VQDMMWS6OR1VHL8VMFD3")
                         .systemToken("XE766X81JHKXK4Z27SYOI86CPCLQ3J1LV7ODMH2")
 //                        .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mg4h6mz5", wlbt)))
-                        .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_misfb2ft", jdnm)))
+//                        .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_misfb2ft", jdnm)))
+                        .searchCondition(JSONObject.toJSONString(Arrays.asList(new YDSearch(
+                                "textField_misfb2ft", jdnm, "金蝶内码", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ))))
+//
                         .formDataJson(JSONObject.toJSONString(updateFormData))
                         .build(), YDConf.FORM_OPERATION.upsert);
 
@@ -1222,7 +1235,7 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
                     List<Map> ddlist = (List<Map>) ydClient.queryData(
                             YDParam.builder()
                                     .formUuid("FORM-B62CAE3075CE4098B17BB86C90FFA21C9B7C")
-                                    .searchCondition(JSON.toJSONString(UtilMap.map("serialNumberField_mewfgzku", xsddbh)))
+                                    .searchCondition(JSON.toJSONString(UtilMap.map("textField_mjs6fuwo", xsddbh)))
                                     .build(),
                             YDConf.FORM_QUERY.retrieve_list_all
                     ).getData();
@@ -1231,9 +1244,9 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
                         for (Map<String, Object> khitem : ddlist) {
                             Map<String, Object> khformData = (Map<String, Object>) khitem.get("formData");
 
-                            if (khformData != null && xsddbh.equals(khformData.get("serialNumberField_mewfgzku"))) {
+                            if (khformData != null && xsddbh.equals(khformData.get("textField_mjs6fuwo"))) {
                                 ddformInstanceId = (String) khitem.get("formInstanceId");
-                                ddbh = (String) khformData.get("serialNumberField_mewfgzku");
+                                ddbh = (String) khformData.get("textField_mjs6fuwo");
                                 break;
                             }
                         }
@@ -1399,12 +1412,14 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
                         .orderByAsc(KdYdTransferDetail::getDetailId);
                 List<KdYdTransferDetail> kdYdTransferDetails = kdYdTransferDetailMapper.selectList(transferdetailqw);
                 ArrayList<Object> tableList = new ArrayList<>();
+                List<Map<String, Object>> tableListxlh = new ArrayList<>();
                 for (KdYdTransferDetail kdYdTransferDetail : kdYdTransferDetails) {
                     HashMap<String, String> tablemap = new HashMap<>();
                     tablemap.put("textField_mhubzsav", kdYdTransferDetail.getWlbm());
                     tablemap.put("textField_mhubzsaw", kdYdTransferDetail.getWlmc());
                     tablemap.put("textField_mhubzsax", kdYdTransferDetail.getGgxh());
                     tablemap.put("textField_mhubzsay", kdYdTransferDetail.getDw());
+                    tablemap.put("textareaField_mjshnw4c", kdYdTransferDetail.getKddh());
                     tablemap.put("numberField_mhubzsaz", String.valueOf(kdYdTransferDetail.getDbsl()));
                     tablemap.put("textField_mhubzsb0", kdYdTransferDetail.getPh());
                     tablemap.put("textField_mhubzsb1", kdYdTransferDetail.getDcck());
@@ -1413,14 +1428,38 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
                     tablemap.put("textField_mhubzsb3", kdYdTransferDetail.getDrck());
                     tablemap.put("textField_mhubzsb6", kdYdTransferDetail.getDrckzt());
                     tablemap.put("textField_mhubzsb4", kdYdTransferDetail.getDrcw());
+                    String xlhjh = kdYdTransferDetail.getXlh();
+                    if (xlhjh != null && !xlhjh.trim().isEmpty()) {
+                        List<Map<String, Object>> currentXlhList = Arrays.stream(xlhjh.split(","))
+                                .map(String::trim)
+                                .filter(item -> !item.isEmpty())
+                                .map(item -> {
+                                    Map<String, Object> map = new HashMap<>();
+                                    map.put("textField_mf6a0h6w", item); // 序列号
+                                    map.put("textField_mjqst61l", kdYdTransferDetail.getWlbm()); // 对应的物料编码
+                                    map.put("textField_mjqst61m", kdYdTransferDetail.getGgxh());
+                                    return map;
+                                })
+                                .collect(Collectors.toList());
+
+                        tableListxlh.addAll(currentXlhList); // 追加到总列表
+                    }
+
+                    // 主表仍保留原始 xlh(可选)
+                    tablemap.put("textField_mf6a0h6w", kdYdTransferDetail.getXlh());
+//                    tablemap.put("radioField_mf6a0h6h", kdYdTransferDetail.getSfzp());
+
+                    tableList.add(tablemap);
                     kdYdTransferDetail.setSyncStatus("1");
                     kdYdTransferDetailMapper.updateById(kdYdTransferDetail);
-                    tableList.add(tablemap);
 
                 }
                 String xsddbh = kdYdTransfer.getDdbh();
+                String fhtzdbh = kdYdTransfer.getFhtzdbh();
                 String ddformInstanceId = null;
+                String fhdformInstanceId = null;
                 String ddbh = null;
+                String fhdbh = null;
                 String jydate = null;
                 String ghrq = null;
                 String jyyy = null;
@@ -1436,18 +1475,38 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
                     List<Map<String, Object>> ddlist = (List<Map<String, Object>>) ydClient.queryData(
                             YDParam.builder()
                                     .formUuid("FORM-B62CAE3075CE4098B17BB86C90FFA21C9B7C")
-                                    .searchCondition(JSON.toJSONString(UtilMap.map("serialNumberField_mewfgzku", xsddbh)))
+                                    .searchCondition(JSON.toJSONString(UtilMap.map("serialNumberField_mheazm7w", fhtzdbh)))
                                     .build(),
                             YDConf.FORM_QUERY.retrieve_list_all
                     ).getData();
 
+                    List<Map<String, Object>> fhdlist = (List<Map<String, Object>>) ydClient.queryData(
+                            YDParam.builder()
+                                    .formUuid("FORM-A7F03ACEE01D4F609550C86BF7FE87D35M6I")
+                                    .searchCondition(JSON.toJSONString(UtilMap.map("textField_mjs6fuwo", xsddbh)))
+                                    .build(),
+                            YDConf.FORM_QUERY.retrieve_list_all
+                    ).getData();
+                    if (fhdlist != null && !fhdlist.isEmpty()) {
+                        for (Map<String, Object> fhditem : fhdlist) {
+                            Map<String, Object> fhdformData = (Map<String, Object>) fhditem.get("formData");
+                            if (fhdformData == null) continue;
+                            Object serialObj1 = fhdformData.get("serialNumberField_mheazm7w");
+                            String serialStr1 = serialObj1 != null ? serialObj1.toString() : null;
+                            if (fhtzdbh.equals(serialStr1)) {
+                                fhdformInstanceId = safeToString(fhditem.get("formInstanceId"));
+                                fhdbh = serialStr1;
+                                break;
+                            }
+                        }
+                    }
                     if (ddlist != null && !ddlist.isEmpty()) {
                         for (Map<String, Object> khitem : ddlist) {
                             Map<String, Object> khformData = (Map<String, Object>) khitem.get("formData");
                             if (khformData == null) continue;
 
                             // 安全获取字段值(避免 ClassCastException)
-                            Object serialObj = khformData.get("serialNumberField_mewfgzku");
+                            Object serialObj = khformData.get("textField_mjs6fuwo");
                             String serialStr = serialObj instanceof String ? (String) serialObj : String.valueOf(serialObj);
 
                             if (xsddbh.equals(serialStr)) {
@@ -1478,15 +1537,19 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
 // 构建更新数据
                 HashMap<String, Object> updateMap = new HashMap<>();
                 updateMap.put("tableField_mhubzsau", tableList);
-
+                updateMap.put("tableField_mips137b", tableListxlh);
                 if (ddbh != null && ddformInstanceId != null) {
                     updateMap.put("associationFormField_mhubzsaf",
                             Collections.singletonList(getddAss(ddbh, ddformInstanceId)));
                 }
+                if (fhdbh != null && fhdformInstanceId != null) {
+                    updateMap.put("associationFormField_mjzervdt",
+                            Collections.singletonList(getddAss(fhdbh, fhdformInstanceId)));
 
+                }
 // 只有所有必要字段都非空时才填充关联字段
                 if (jydate != null && ghrq != null && jyyy != null && jtyy != null
-                        && xsy != null && khxypj != null && ddformInstanceId != null) {
+                        && xsy != null && khxypj != null) {
 
                     updateMap.put("dateField_mdya1lom", jydate);
                     updateMap.put("dateField_meqpbxsj", ghrq);
@@ -1494,11 +1557,11 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
                     updateMap.put("textareaField_meqpbxsd", jtyy); // 注意:原代码这里写成了 jyyy,已修正为 jtyy
                     updateMap.put("employeeField_mejowmng", xsy);
                     updateMap.put("selectField_mewirdx4", khxypj);
-                    updateMap.put("textField_miquh5zj", ddformInstanceId);
                     updateMap.put("attachmentField_mfoqcctz", fj);
                 }
-
+                updateMap.put("textField_mjzervdu", kdYdTransfer.getFhtzdbh());
 // 基础字段同步(这些字段即使为空也会覆盖,符合原逻辑)
+                updateMap.put("textField_miquh5zj", ddformInstanceId);
                 updateMap.put("selectField_mhubzsa5", kdYdTransfer.getDjlx());
                 updateMap.put("textField_mhubzsas", kdYdTransfer.getKh());
                 updateMap.put("textField_miptelgh", kdYdTransfer.getDdbh());
@@ -1532,7 +1595,7 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
 
                 ydClient.operateData(YDParam.builder()
                         .formUuid("FORM-F1B2BA2AF310476C88F4756F4DB50667VXDR")
-                                .noExecuteExpression(false)
+                        .noExecuteExpression(false)
                         .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_miptelgc", kdYdTransfer.getDjbh())))
                         .formDataJson(JSONObject.toJSONString(updateMap))
                         .build(), YDConf.FORM_OPERATION.upsert);
@@ -1553,9 +1616,11 @@ public class YdHuaGaoServiceImpl implements YdHuaGaoService {
         log.info("【调拨单同步任务】完成: 成功={}, 失败={}, 总计={}",
                 successCount, failCount, kdYdTRANSFERdels.size());
     }
+
     private static String safeToString(Object obj) {
         return obj == null ? null : obj.toString();
     }
+
     private Object getddAss(String title, String id) {
         return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_VQDMMWS6OR1VHL8VMFD3", "FORM-B62CAE3075CE4098B17BB86C90FFA21C9B7C", "receipt", id, title, "");
     }

+ 1 - 0
mjava-huagao/src/main/resources/application-dev.yml

@@ -39,6 +39,7 @@ dingtalk:
   aesKey:
   token:
   operator:
+  atUserId: 15959870735792794 #陈伟东
 
 # aliwork
 aliwork:

+ 2 - 1
mjava-huagao/src/main/resources/application-prod.yml

@@ -2,7 +2,7 @@ server:
   port: 7708
   servlet:
     context-path: /huagao
-  host: https://mes.huagaochina.com:8022
+  host: http://mes.huagaochina.com:7708
 
 enable:
   scheduling: true
@@ -39,6 +39,7 @@ dingtalk:
   aesKey:
   token:
   operator:
+  atUserId: 15959870735792794 #陈伟东
 
 # aliwork
 aliwork:

+ 2 - 1
mjava-huagao/src/main/resources/application-prod2.yml

@@ -3,7 +3,7 @@ server:
   port: 7708
   servlet:
     context-path: /huagao
-    host: https://mes.huagaochina.com:8022
+    host: http://mes.huagaochina.com:7708
 
 enable:
   scheduling: true
@@ -40,6 +40,7 @@ dingtalk:
   aesKey:
   token:
   operator:
+  atUserId: 15959870735792794 #陈伟东
 
 # aliwork
 aliwork:

+ 16 - 10
mjava-huagao/src/test/java/com/malk/huagao/YqbTest.java

@@ -13,7 +13,7 @@ import com.malk.huagao.utils.HTTPHelper;
 import org.apache.commons.codec.binary.Base64;
 import com.alibaba.fastjson.JSONObject;
 
-public class YqbTest {
+public class EqbTest {
 
     public static void main(String[] args) {
         // 应用ID
@@ -38,7 +38,7 @@ public class YqbTest {
         //1.2上传文件流 postman
 
         //步骤2:查看文件上传状态及详情
-//        getFileInfo(appId,appKey,host,"e5f64e2ba6694a8daebcb13249ded314");
+//        getFileInfo(appId,appKey,host,"1c2ede25c6454ad4af8bcba3dd9beb35");
 
         //步骤3:获取制作合同模板页面链接
 //        getDocCreateUrl(appId,appKey,host,"418d535ab69f4c1fbe01931b8b74f82f");
@@ -48,7 +48,7 @@ public class YqbTest {
         //正式环境模板id 采购订单模板: a0827f8946994ebfbed7f44e6b8a6ed8
 
         //步骤4:制作含动态表格控件的HTML模板 访问【获取制作合同模板页面】接口返回的创建文件模板页面链接(docTemplateCreateUrl参数值),并在页面中拖动【动态表格】控件来制作模板,若链接失效,调用【获取编辑合同模板页面】接口
-//        getDocTemplateEditUrl(appId,appKey,host,"6a23f76742d74b858cdc2259a5d5c32f");
+//        getDocTemplateEditUrl(appId,appKey,host,"a0827f8946994ebfbed7f44e6b8a6ed8");
 
 
         //步骤5:获取 HTML 模板中控件ID和控件Key
@@ -62,7 +62,7 @@ public class YqbTest {
 
 
         //基于文件发起签署
-//        createByFile(appId,appKey,host,"28e65af0dd3a4f989da68d14bcd06373");
+        createByFile(appId,appKey,host,"1c2ede25c6454ad4af8bcba3dd9beb35");
 
         //查询签署流程详情
 //        getSignFlowDetail(appId,appKey,host,"62dc01292d684653bae341adb014b4d0");
@@ -75,7 +75,7 @@ public class YqbTest {
 
 //        getOrgUserInfo(appId,appKey,host,"00739a62731c498a8ecf477bf79efc54");
 
-        getOrgMember(appId,appKey,host,"a5ec8fb7d8cc4276bd486824df0ec640");
+//        getOrgMember(appId,appKey,host,"a5ec8fb7d8cc4276bd486824df0ec640");
 
 
         //获取签署地址
@@ -591,13 +591,19 @@ public class YqbTest {
 
             //签署方信息
             Map signer = new HashMap();
-            signer.put("signerType",0);//签署方类型,0 - 个人,1 - 企业/机构,2 - 法定代表人,3 - 经办人
-            /*Map orgSignerInfo = new HashMap();
+            signer.put("signerType",1);//签署方类型,0 - 个人,1 - 企业/机构,2 - 法定代表人,3 - 经办人
+
+            Map orgSignerInfo = new HashMap();
             orgSignerInfo.put("orgId","a5ec8fb7d8cc4276bd486824df0ec640");
-            signer.put("orgSignerInfo",orgSignerInfo);*/
-            Map psnSignerInfo = new HashMap();
+            //企业/机构经办人信息
+            Map transactorInfo = new HashMap();
+            transactorInfo.put("psnId","0fd3eb8b0c424b4e827bb3bf1fba62f3");//wzy
+            orgSignerInfo.put("transactorInfo",transactorInfo);
+            signer.put("orgSignerInfo",orgSignerInfo);
+
+            /*Map psnSignerInfo = new HashMap();
             psnSignerInfo.put("psnId","0fd3eb8b0c424b4e827bb3bf1fba62f3");//wzy
-            signer.put("psnSignerInfo",psnSignerInfo);
+            signer.put("psnSignerInfo",psnSignerInfo);*/
 
             Map signField = new HashMap();
             signField.put("fileId",fileId);

+ 81 - 29
mjava-lianan/src/main/java/com/malk/lianan/TestUtil.java

@@ -16,12 +16,14 @@ import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilFile;
 import com.malk.utils.UtilMap;
 import com.sun.deploy.security.CertUtils;
 import lombok.extern.slf4j.Slf4j;
 
 import java.io.ByteArrayInputStream;
 import java.io.FileInputStream;
+import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.security.KeyFactory;
 import java.security.PublicKey;
@@ -56,35 +58,41 @@ public class TestUtil {
 
     public static void main(String[] args) throws Exception {
         query();
-//        String sign1="GRJCRklJVIy8vUFUg4gDo+iv+MIp+MHmitPrnUJLO0mcg+6EiJklYhoXtHhgmTgx2Rw7AgTsAsNNbM02ehgMLim0zeX76Ghq1oD/xbDyydi6/CLSEf1QS9fQvUsnOIwgZKarSc/UM2wdlgHf9M7OmNpf3Mv+YuEHwyMF6dXlljc=";
-//        String data="AeWTi5jUG8l1h6JJG9uuvGH63r6sSpnJW2VhOA52XGW5QdH6TESqQ4iKV46TuAB53juaW6DyBrQcuoXOXZK6lzIkird1cQksS8ve/IxVBwc1sa8BJRrO9cqCHoURjbKdJz66+FBE5L4pCZy5DESP/Q==";
-////        RSASignatureUtil.verifySafe("AeWTi5jUG8l1h6JJG9uuvGH63r6sSpnJW2VhOA52XGW5QdH6TESqQ4iKV46TuAB53juaW6DyBrQcuoXOXZK6lzIkird1cQksS8ve/IxVBwc1sa8BJRrO9cqCHoURjbKdJz66+FBE5L4pCZy5DESP/Q=="
-////                ,"GRJCRklJVIy8vUFUg4gDo+iv+MIp+MHmitPrnUJLO0mcg+6EiJklYhoXtHhgmTgx2Rw7AgTsAsNNbM02ehgMLim0zeX76Ghq1oD/xbDyydi6/CLSEf1QS9fQvUsnOIwgZKarSc/UM2wdlgHf9M7OmNpf3Mv+YuEHwyMF6dXlljc="
-////                ,GYPAY_API_SIGN_PUB_KEY);
-////        byte[] derData = Base64.decode(PRIVATE_KEY);
-////        X509Certificate x= parseDERCertificate(derData);
-////        PublicKey publicKey = x.getPublicKey();
-////        System.out.println(Base64.encode(publicKey.getEncoded()));
-//        try {
-//            // 加载证书文件
-//            CertificateFactory cf = CertificateFactory.getInstance("X.509");
-//            FileInputStream fis = null;
-//            fis = new FileInputStream("/home/ICBC_CZY__SIGN_TEST.cer");
-//            X509Certificate cert = (X509Certificate) cf.generateCertificate(fis);
-//            // 从证书中提取公钥
-//            PublicKey publicKey = cert.getPublicKey();
-//            System.out.println(new String(Base64.encode(publicKey.getEncoded()).getBytes(), StandardCharsets.UTF_8));
-//
-//            // 验证签名
-//            Signature signature = Signature.getInstance("SHA256withRSA");
-//            signature.initVerify(publicKey);
-//            signature.update(data.getBytes(StandardCharsets.UTF_8));
-//            boolean verify = signature.verify(Base64.decode(sign1));
-//            System.out.println(verify);
-//        }catch (Exception e){
-//            e.printStackTrace();
-//        }
 
+
+        /*String sign1="Ra/WLUYZUeHHyaOhyvTDm1tczq8b25mTn2tfW4VQesbQHdY6E88bjXkuuJt0YVn6jgelH56Kl7z9zgv8L3QVCfy5WLgMwpsxjUeRGrL03Gd2KIz4R9ithmGNNziSJz0JR1yYHkUU2eHv+KmKGOxEjI+7NQ/oHOxe+mVI1HpioAo=";
+        String data="{    \"ResultCode\": \"82000007\",    \"ResultMsg\": \"签名验证失败\",    \"NextTag\": \"0\",    \"ResultSet\": [    ]}";
+
+//        RSASignatureUtil.verifySafe("AeWTi5jUG8l1h6JJG9uuvGH63r6sSpnJW2VhOA52XGW5QdH6TESqQ4iKV46TuAB53juaW6DyBrQcuoXOXZK6lzIkird1cQksS8ve/IxVBwc1sa8BJRrO9cqCHoURjbKdJz66+FBE5L4pCZy5DESP/Q=="
+//                ,"GRJCRklJVIy8vUFUg4gDo+iv+MIp+MHmitPrnUJLO0mcg+6EiJklYhoXtHhgmTgx2Rw7AgTsAsNNbM02ehgMLim0zeX76Ghq1oD/xbDyydi6/CLSEf1QS9fQvUsnOIwgZKarSc/UM2wdlgHf9M7OmNpf3Mv+YuEHwyMF6dXlljc="
+//                ,GYPAY_API_SIGN_PUB_KEY);
+//        byte[] derData = Base64.decode(PRIVATE_KEY);
+//        X509Certificate x= parseDERCertificate(derData);
+//        PublicKey publicKey = x.getPublicKey();
+//        System.out.println(Base64.encode(publicKey.getEncoded()));
+        try {
+            // 加载证书文件
+            CertificateFactory cf = CertificateFactory.getInstance("X.509");
+            FileInputStream fis = null;
+            fis = new FileInputStream("D:\\project\\cont\\mjava-lianan\\src\\main\\resources\\cer\\ICBC_CZY__SIGN_TEST.cer");
+//            InputStream inputStream = UtilFile.readPackageResource("cer/" + "ICBC_CZY__SIGN_TEST.cer");
+
+            X509Certificate cert = (X509Certificate) cf.generateCertificate(fis);
+//            X509Certificate cert = (X509Certificate) cf.generateCertificate(inputStream);
+            // 从证书中提取公钥
+            PublicKey publicKey = cert.getPublicKey();
+            System.out.println(new String(Base64.encode(publicKey.getEncoded()).getBytes(), StandardCharsets.UTF_8));
+
+            // 验证签名
+            Signature signature = Signature.getInstance("SHA256withRSA");
+            signature.initVerify(publicKey);
+            signature.update(data.getBytes(StandardCharsets.UTF_8));
+            boolean verify = signature.verify(Base64.decode(sign1));
+            System.out.println(verify);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+*/
     }
 
     /**
@@ -103,7 +111,7 @@ public class TestUtil {
         head.put("Timestamp", UtilDateTime.getLocalDateTimeTimeStamp());
         head.put("SystemNo",GYPAY_API_SYS_ID);
         head.put("SystemName",GYPAY_API_SYS_NAME);
-        head.put("RequestNo","12150001");
+        head.put("RequestNo","12150007");
         Map<String,Object> body = new HashMap<>();
         Map<String,Object> item = new HashMap<>();
         item.put("AcctNo",GYPAY_API_ACCOUNT_NO);
@@ -111,6 +119,50 @@ public class TestUtil {
         item.put("StartTransDate","2025-12-01");
         item.put("EndTransDate","2025-12-15");
         item.put("NextTag","1");
+        Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
+        System.out.println(JSON.toJSONString(data));
+        String encrypt = AesUtil.encrypt(JSON.toJSONString(data),GYPAY_API_AES_KEY);
+        log.info("encrypt:{},{}","",encrypt);
+        //解密
+        body.put("Data", encrypt);
+        String signed=RSASignatureUtil.signSafe(JSONObject.toJSONString(data),GYPAY_API_PRI_KEY);
+        body.put("Sign", signed);
+
+        Map<String,Object> Cmscloud = new HashMap<>();
+        Cmscloud.put("Head",head);
+        Cmscloud.put("Body",body);
+        String indata=JSONObject.toJSONString(UtilMap.map("Cmscloud",Cmscloud));
+        System.out.println(indata);
+        String result=HttpUtil.createPost(GYPAY_API_URL).body(indata).execute().body();
+        System.out.println(result);
+        JSONObject resultjson=JSONObject.parseObject(result);
+        JSONObject resultBody = resultjson.getJSONObject("Cmscloud").getJSONObject("Body");
+        String resultData=AesUtil.decrypt(resultBody.getString("Data"),GYPAY_API_AES_KEY);
+        System.out.println(resultData);
+
+        Boolean flag=RSASignatureUtil.verifySafe(resultData,resultBody.getString("Sign"),GYPAY_API_SIGN_PUB_KEY);
+        System.out.println(flag);
+
+    }
+
+    //账户信息查询接口
+    public static void query2(){
+        Map<String,Object> head = new HashMap<>();
+        head.put("MesgNo","T0005");
+        head.put("TenantId",GYPAY_API_TENANT_ID);
+        head.put("Timestamp", UtilDateTime.getLocalDateTimeTimeStamp());
+        head.put("SystemNo",GYPAY_API_SYS_ID);
+        head.put("SystemName",GYPAY_API_SYS_NAME);
+        head.put("RequestNo","12300001");
+
+
+        Map<String,Object> body = new HashMap<>();
+        Map<String,Object> item = new HashMap<>();
+        item.put("CurrencyCodeList",Arrays.asList("CNY"));
+        item.put("AcctStatus","1");
+        item.put("AcctNoOrName","浙江联联看数字科技有限公司");
+        item.put("NextTag",1);
+
         Map<String,Object> data = UtilMap.map("ParamSet", Arrays.asList(item));
         System.out.println(JSON.toJSONString(data));
         String encrypt = AesUtil.encrypt(JSON.toJSONString(data),GYPAY_API_AES_KEY);

+ 16 - 0
mjava-lianan/src/main/resources/cer/ICBC_CZY__SIGN_TEST.cer

@@ -0,0 +1,16 @@
+-----BEGIN CERTIFICATE-----
+MIICmDCCAgGgAwIBAgIEAq6v0jANBgkqhkiG9w0BAQUFADB+MREwDwYDVQQGDAgo
+5Lit5Zu9KTERMA8GA1UECAwIKOW5v+S4nCkxETAPBgNVBAcMCCjlub/lt54pMRcw
+FQYDVQQKDA4o5Lq65rCR57uE57uHKTEXMBUGA1UECwwOKOS6uuawkeWNleS9jSkx
+ETAPBgNVBAMMCCjlvKDkuIkpMCAXDTIxMDgwNTA5MzAzNloYDzIxMjEwNzEyMDkz
+MDM2WjB+MREwDwYDVQQGDAgo5Lit5Zu9KTERMA8GA1UECAwIKOW5v+S4nCkxETAP
+BgNVBAcMCCjlub/lt54pMRcwFQYDVQQKDA4o5Lq65rCR57uE57uHKTEXMBUGA1UE
+CwwOKOS6uuawkeWNleS9jSkxETAPBgNVBAMMCCjlvKDkuIkpMIGfMA0GCSqGSIb3
+DQEBAQUAA4GNADCBiQKBgQCmudhlkVXrFP1DB0r11LvVpy8nYVO9sR2tYLXCkQxX
+E4HR2VlihCO43B2v/Ep3tlny4l/OX++AQX4sJpO8vAnCRmNIAgXKXAfvre1HTSkJ
+f9vb8G9sf4UsZX2bLEOtH4wOO7Osv8Za98WzBHBRrqESI91Z4GSE0/8ucMp6V7EZ
+5wIDAQABoyEwHzAdBgNVHQ4EFgQUBsYJEnvf2AxVqDtEm8Wl6SMvFh0wDQYJKoZI
+hvcNAQEFBQADgYEAAeDqJsLkkADrht3MiQ35D4J9ka29VWY+bw153OhrC9MGga+O
+BfLP/jyO3kBoG39I/2eyajrF7UMsxfRrsaGx705xWtqhSpeXsfxYO1hIDrXBlQKy
+hj5PAScDSZ5FB3atuhQw5M2BLbVuqn9nTGJiV3RUGqjq+OqgLKnTkm7Sn7A=
+-----END CERTIFICATE-----