Sfoglia il codice sorgente

Merge branch 'master' of https://mc.cloudpure.cn/mjava/cont

wzy 1 mese fa
parent
commit
d6bbad330e
37 ha cambiato i file con 2190 aggiunte e 72 eliminazioni
  1. 74 2
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdCustomerServiceImpl.java
  2. 79 5
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdDeliveryServiceImpl.java
  3. 77 4
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdMaterialServiceImpl.java
  4. 259 55
      mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdOrderServiceImpl.java
  5. 2 2
      mjava-mc/src/main/java/com/malk/mc/service/impl/McYdServiceImpl.java
  6. 1 1
      mjava-mc/src/main/resources/application.yml
  7. 37 0
      mjava-ounuo/src/main/java/com/malk/tuosi/entity/CommissionTable.java
  8. 2 0
      mjava-ounuo/src/main/java/com/malk/tuosi/entity/PersonalMonthlySuccessrate.java
  9. 13 0
      mjava-ounuo/src/main/java/com/malk/tuosi/mapper/CommissionTableMapper.java
  10. 691 0
      mjava-ounuo/src/main/java/com/malk/tuosi/schedule/ScheduleTask.java
  11. 7 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/CommissionTableService.java
  12. 13 0
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/CommissionTableServiceImpl.java
  13. 1 1
      mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/TbServiceImpl.java
  14. 10 0
      mjava-zhiwei/pom.xml
  15. 24 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/config/KDWebApiConf.java
  16. 32 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/config/KDWebApiConfig.java
  17. 26 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/Audit.java
  18. 18 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/BillQuery.java
  19. 24 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/ContactModel.java
  20. 10 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/CustomerContactEntry.java
  21. 72 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/CustomerModel.java
  22. 40 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/FBillHead.java
  23. 15 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/FNumber.java
  24. 15 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/FSTAFFNUMBER.java
  25. 7 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/Model.java
  26. 137 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/PreBaseDataOne.java
  27. 104 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/Receivebill.java
  28. 57 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/SaleOrderEntry.java
  29. 17 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/SaleOrderFinance.java
  30. 25 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/SaleOrderModel.java
  31. 26 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/Save.java
  32. 22 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/Submit.java
  33. 24 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/UnAudit.java
  34. 14 0
      mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/View.java
  35. 2 2
      mjava-zhiwei/src/main/java/com/malk/zhiwei/schedule/ScheduleTask.java
  36. 19 0
      mjava-zhiwei/src/main/resources/application-dev.yml
  37. 194 0
      mjava-zhiwei/src/test/java/com/malk/zhiwei/JdTest.java

+ 74 - 2
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdCustomerServiceImpl.java

@@ -15,6 +15,7 @@ import com.malk.huagao.service.IKdYdCustomerService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McException;
 import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.utils.UtilMap;
@@ -91,7 +92,7 @@ public class KdYdCustomerServiceImpl extends ServiceImpl<KdYdCustomerMapper, KdY
             }
 
             // === 获取表单数据 ===
-            DDR_New ddrNew = ydClient.queryData(
+            DDR_New ddrNew = retryQueryData(
                     YDParam.builder().formInstId(formInstId).build(),
                     YDConf.FORM_QUERY.retrieve_id
             );
@@ -234,7 +235,7 @@ public class KdYdCustomerServiceImpl extends ServiceImpl<KdYdCustomerMapper, KdY
                     String code = JSON.parseArray(responseBody)
                             .getJSONObject(0)
                             .getString("code");
-                    ydClient.operateData(
+                    retryOperateData(
                             YDParam.builder()
                                     .formInstanceId(formInstId)
                                     .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_ml08nk3y, textareaField_mkxqgrvq, textField_meqhqqvg", code, msg, khbh)))
@@ -296,6 +297,77 @@ public class KdYdCustomerServiceImpl extends ServiceImpl<KdYdCustomerMapper, KdY
         }
     }
 
+    //自带重试的operateData方法
+    private Object retryOperateData(YDParam param, YDConf.FORM_OPERATION formOperation) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
 
+        Object result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.operateData(param, formOperation);
+
+                return result;
+            } catch (McException e) {
+                log.info("错误信息:{}",e.getMessage());
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(5000);
+                        log.info("尝试第{}次,param:{},FORM_OPERATION:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formOperation,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_OPERATION:{},异常信息:{}", JSONObject.toJSONString(param), formOperation,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_OPERATION:{}"+formOperation);
+    }
+
+
+    //自带重试的queryData方法
+    private DDR_New retryQueryData(YDParam param, YDConf.FORM_QUERY formQuery) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
+
+        DDR_New result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.queryData(param, formQuery);
+
+                return result;
+            } catch (McException e) {
+                log.info("错误信息:{}",e.getMessage());
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(5000);
+                        log.info("尝试第{}次,param:{},FORM_QUERY:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formQuery,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_QUERY:{},异常信息:{}", JSONObject.toJSONString(param), formQuery,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_QUERY:{}"+formQuery);
+    }
 
 }

+ 79 - 5
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdDeliveryServiceImpl.java

@@ -15,6 +15,7 @@ import com.malk.huagao.service.IKdYdDeliveryService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.malk.server.aliwork.YDConf;
 import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McException;
 import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.utils.UtilMap;
@@ -133,10 +134,10 @@ public class KdYdDeliveryServiceImpl extends ServiceImpl<KdYdDeliveryMapper, KdY
             List<Map> tableField = (List<Map>) formData.get("tableField_mejnamfd");
 
             if (tableField != null && !tableField.isEmpty()) {
-                int detailId = 1;
+//                int detailId = 1;
                 for (Map item : tableField) {
                     Map<String, Object> table1Map = new HashMap<>();
-//                    int detailId = parseInt(safeGetString(item, "numberField_mjzg06br"), 0);
+                    int detailId = parseInt(safeGetString(item, "numberField_mjzg06br"), 1);
                     String wlbm = safeGetString(item, "textField_mejnamff");
                     String wlmc = safeGetString(item, "textField_mejnamfg");
                     String ggxh = safeGetString(item, "textField_mejnamfh");
@@ -177,7 +178,7 @@ public class KdYdDeliveryServiceImpl extends ServiceImpl<KdYdDeliveryMapper, KdY
                     table1Map.put("mdh", mdh);
 
                     deliveryList.add(table1Map);
-                    detailId++;
+//                    detailId++;
                 }
             }
 
@@ -268,7 +269,7 @@ public class KdYdDeliveryServiceImpl extends ServiceImpl<KdYdDeliveryMapper, KdY
         String formInstId = UtilMap.getString(map, "formInstId");
 
         // 查询原表单数据
-        DDR_New ddrNew = ydClient.queryData(
+        DDR_New ddrNew = retryQueryData(
                 YDParam.builder().formInstId(formInstId).build(),
                 YDConf.FORM_QUERY.retrieve_id
         );
@@ -356,7 +357,7 @@ public class KdYdDeliveryServiceImpl extends ServiceImpl<KdYdDeliveryMapper, KdY
             System.out.println("sqrid==" + sqrid);
             // 创建新表单实例
             try {
-                ydClient.operateData(
+                retryOperateData(
                         YDParam.builder()
                                 .formUuid("FORM-FAE2575E112644ED914CAB4FEC9309F32AVR")
                                 .formDataJson(JSON.toJSONString(updateMap))
@@ -446,4 +447,77 @@ public class KdYdDeliveryServiceImpl extends ServiceImpl<KdYdDeliveryMapper, KdY
         return new BigDecimal(number.toString())
                 .setScale(2, RoundingMode.HALF_UP);
     }
+
+    //自带重试的operateData方法
+    private Object retryOperateData(YDParam param, YDConf.FORM_OPERATION formOperation) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
+
+        Object result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.operateData(param, formOperation);
+
+                return result;
+            } catch (McException e) {
+                log.info("错误信息:{}",e.getMessage());
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(5000);
+                        log.info("尝试第{}次,param:{},FORM_OPERATION:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formOperation,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_OPERATION:{},异常信息:{}", JSONObject.toJSONString(param), formOperation,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_OPERATION:{}"+formOperation);
+    }
+
+
+    //自带重试的queryData方法
+    private DDR_New retryQueryData(YDParam param, YDConf.FORM_QUERY formQuery) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
+
+        DDR_New result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.queryData(param, formQuery);
+
+                return result;
+            } catch (McException e) {
+                log.info("错误信息:{}",e.getMessage());
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(5000);
+                        log.info("尝试第{}次,param:{},FORM_QUERY:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formQuery,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_QUERY:{},异常信息:{}", JSONObject.toJSONString(param), formQuery,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_QUERY:{}"+formQuery);
+    }
 }

+ 77 - 4
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdMaterialServiceImpl.java

@@ -10,6 +10,7 @@ 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.McException;
 import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.utils.UtilMap;
@@ -41,7 +42,7 @@ public class KdYdMaterialServiceImpl extends ServiceImpl<KdYdMaterialMapper, KdY
     public void insertkdYdMaterial(Map map) {
         MDC.put("MDC_KEY_PID", "1003");
         String formInstId = UtilMap.getString(map, "formInstId");
-        DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+        DDR_New ddrNew = retryQueryData(YDParam.builder()
                 .formInstId(formInstId)
                 .build(), YDConf.FORM_QUERY.retrieve_id);
         Map formData = ddrNew.getFormData();
@@ -117,7 +118,7 @@ public class KdYdMaterialServiceImpl extends ServiceImpl<KdYdMaterialMapper, KdY
                         Object fmaterialidObj = item.get("FMATERIALID");
                         String fmaterialidStr = String.valueOf(fmaterialidObj);
 
-                        List<Map> list1 = (List<Map>) ydClient.queryData(YDParam.builder()
+                        List<Map> list1 = (List<Map>) retryQueryData(YDParam.builder()
                                 .formUuid("FORM-E64114E9F2C9426E91F92886EDFFA2C08Q90")
                                 .appType("APP_VQDMMWS6OR1VHL8VMFD3")
                                 .systemToken("XE766X81JHKXK4Z27SYOI86CPCLQ3J1LV7ODMH2")
@@ -144,7 +145,7 @@ public class KdYdMaterialServiceImpl extends ServiceImpl<KdYdMaterialMapper, KdY
                 // 执行批量删除
                 if (!list.isEmpty()) {
                     try {
-                        Object deleteResult = ydClient.operateData(YDParam.builder()
+                        Object deleteResult = retryOperateData(YDParam.builder()
                                 .formUuid("FORM-E64114E9F2C9426E91F92886EDFFA2C08Q90")
                                 .formInstanceIdList(list)
                                 .build(), YDConf.FORM_OPERATION.delete_batch);
@@ -297,7 +298,7 @@ public class KdYdMaterialServiceImpl extends ServiceImpl<KdYdMaterialMapper, KdY
                     updateFormData.put("textField_mg4h6mz5", wlbt);
 
                     // 执行操作并获取结果
-                    Object operationResult = ydClient.operateData(YDParam.builder()
+                    Object operationResult = retryOperateData(YDParam.builder()
                             .formUuid("FORM-E64114E9F2C9426E91F92886EDFFA2C08Q90")
                             .appType("APP_VQDMMWS6OR1VHL8VMFD3")
                             .systemToken("XE766X81JHKXK4Z27SYOI86CPCLQ3J1LV7ODMH2")
@@ -397,4 +398,76 @@ public class KdYdMaterialServiceImpl extends ServiceImpl<KdYdMaterialMapper, KdY
         return new BigDecimal(number.toString())
                 .setScale(2, RoundingMode.HALF_UP);
     }
+    //自带重试的operateData方法
+    private Object retryOperateData(YDParam param, YDConf.FORM_OPERATION formOperation) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
+
+        Object result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.operateData(param, formOperation);
+
+                return result;
+            } catch (McException e) {
+                log.info("错误信息:{}",e.getMessage());
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(5000);
+                        log.info("尝试第{}次,param:{},FORM_OPERATION:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formOperation,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_OPERATION:{},异常信息:{}", JSONObject.toJSONString(param), formOperation,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_OPERATION:{}"+formOperation);
+    }
+
+
+    //自带重试的queryData方法
+    private DDR_New retryQueryData(YDParam param, YDConf.FORM_QUERY formQuery) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
+
+        DDR_New result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.queryData(param, formQuery);
+
+                return result;
+            } catch (McException e) {
+                log.info("错误信息:{}",e.getMessage());
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(5000);
+                        log.info("尝试第{}次,param:{},FORM_QUERY:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formQuery,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_QUERY:{},异常信息:{}", JSONObject.toJSONString(param), formQuery,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_QUERY:{}"+formQuery);
+    }
 }

+ 259 - 55
mjava-huagao/src/main/java/com/malk/huagao/service/impl/KdYdOrderServiceImpl.java

@@ -17,6 +17,7 @@ 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.McException;
 import com.malk.server.common.McR;
 import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
@@ -124,7 +125,7 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
                 String code = JSON.parseArray(responseBody)
                         .getJSONObject(0)
                         .getString("code");
-                ydClient.operateData(
+                retryOperateData(
                         YDParam.builder()
                                 .formInstanceId(formInstId)
                                 .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_ml08nk3y, textareaField_mkxqgrvq", code, msg)))
@@ -142,7 +143,7 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
             }
 
             // 查询表单数据
-            DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+            DDR_New ddrNew = retryQueryData(YDParam.builder()
                     .formInstId(formInstId)
                     .build(), YDConf.FORM_QUERY.retrieve_id);
             Map formData = ddrNew.getFormData();
@@ -347,7 +348,7 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
                 String code = JSON.parseArray(responseBody)
                         .getJSONObject(0)
                         .getString("code");
-                ydClient.operateData(
+                retryOperateData(
                         YDParam.builder()
                                 .formInstanceId(formInstId)
                                 .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_ml08nk3y, textareaField_mkxqgrvq, textField_mjs6fuwo", code, msg, jdbh)))
@@ -379,34 +380,51 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
             String formInstId = UtilMap.getString(map, "formInstId");
             String khbm = UtilMap.getString(map, "khbm");
 
+            // 参数校验
+            if (StringUtils.isBlank(formInstId)) {
+                throw new RuntimeException("订单ID不能为空");
+            }
+            if (StringUtils.isBlank(khbm)) {
+                throw new RuntimeException("客户编号不能为空");
+            }
+
             // 1. 查询订单详情
-            DDR_New ddrNew = ydClient.queryData(YDParam.builder()
+            DDR_New ddrNew = retryQueryData(YDParam.builder()
                     .formInstId(formInstId)
                     .build(), YDConf.FORM_QUERY.retrieve_id);
 
             if (ddrNew == null || ddrNew.getFormData() == null) {
-                throw new RuntimeException("未找到订单信息");
+                throw new RuntimeException("未找到订单信息,订单ID:" + formInstId);
             }
 
             Map formData1 = ddrNew.getFormData();
             String ddje = UtilMap.getString(formData1, "numberField_mfxv2vgj");
 
-            // 参数校验
+            // 订单金额校验
             if (ddje == null || ddje.trim().isEmpty()) {
-                throw new RuntimeException("订单金额不能为空");
+                throw new RuntimeException("订单金额不能为空,订单ID:" + formInstId);
             }
 
-            // 2. 计算订单金额(保留两位小数)
+            // 2. 计算订单金额
             Double orderAmount = null;
             try {
                 orderAmount = Double.parseDouble(ddje);
                 orderAmount = Math.round(orderAmount * 100.0) / 100.0;
+
+                // 订单金额合理性校验
+                if (orderAmount < 0) {
+                    throw new RuntimeException("订单金额不能为负数: " + orderAmount);
+                }
             } catch (NumberFormatException e) {
-                throw new RuntimeException("订单金额格式错误: " + ddje);
+                throw new RuntimeException("订单金额格式错误: " + ddje, e);
             }
 
+            System.out.println("订单信息:订单ID=" + formInstId +
+                    ", 订单金额=" + orderAmount +
+                    ", 客户编号=" + khbm);
+
             // 3. 查询客户历史信息
-            List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
+            Object result = retryQueryData(YDParam.builder()
                     .formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
                     .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
                             new YDSearch("textField_mjm9k35n",
@@ -417,120 +435,171 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
                     )))
                     .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
 
+            List<Map> list = (List<Map>) result;
+
             if (list == null || list.isEmpty()) {
                 throw new RuntimeException("未找到客户信息,客户编号:" + khbm);
             }
 
-            // 4. 获取客户现有信息
+            // 4. 获取客户现有信息并进行数据完整性校验
             Map customerData = (Map) list.get(0).get("formData");
             Double historicalAmount = UtilMap.getDouble(customerData, "numberField_mjm9k35k");
             Long dddateTimestampStr = UtilMap.getLong(customerData, "dateField_mjqkkcsg");
             Long sfdateTimestampStr = UtilMap.getLong(customerData, "dateField_mjm9k35l");
+            String originalSelectFieldValue = UtilMap.getString(customerData, "selectField_l3nrjuq0");
+            String originalKhsx = UtilMap.getString(customerData, "selectField_mjsco9d4");
 
-            // 参数校验
+            // 关键字段完整性校验
             if (dddateTimestampStr == null) {
-                throw new RuntimeException("最后成交日期不能为空");
+                throw new RuntimeException("最后成交日期不能为空,客户编号:" + khbm);
             }
 
-            // 处理历史金额
             if (historicalAmount == null) {
-                historicalAmount = 0.0;
-            } else {
-                historicalAmount = Math.round(historicalAmount * 100.0) / 100.0;
+                // 历史金额为null时,记录错误日志并抛出异常,避免错误清零
+                System.err.println("严重错误:未能获取到客户历史金额,客户编号:" + khbm +
+                        ",返回数据:" + JSONObject.toJSONString(customerData));
+                throw new RuntimeException("无法获取客户历史金额,客户编号:" + khbm + ",请检查数据完整性");
             }
 
-            // 5. 计算总金额
+            // 记录更新前的数据快照,便于问题追踪
+            System.out.println("更新前数据快照:客户编号=" + khbm +
+                    ", 历史金额=" + historicalAmount +
+                    ", 最后成交日期=" + timestampToDateString(dddateTimestampStr) +
+                    ", 公海池日期=" + (sfdateTimestampStr != null ? timestampToDateString(sfdateTimestampStr) : "空") +
+                    ", 销售属性=" + originalKhsx +
+                    ", 选择字段=" + originalSelectFieldValue);
+
+            // 5. 金额计算和校验
+            historicalAmount = Math.round(historicalAmount * 100.0) / 100.0;
             Double totalAmount = orderAmount + historicalAmount;
             totalAmount = Math.round(totalAmount * 100.0) / 100.0;
 
+            // 金额变化监控:检测异常的大幅减少
+            if (totalAmount < historicalAmount && totalAmount < historicalAmount * 0.5) {
+                String errorMsg = String.format(
+                        "警告:金额异常减少!客户编号=%s, 订单金额=%.2f, 原历史金额=%.2f, 新总金额=%.2f, 减少比例=%.2f%%",
+                        khbm, orderAmount, historicalAmount, totalAmount,
+                        (historicalAmount - totalAmount) / historicalAmount * 100
+                );
+                System.err.println(errorMsg);
+                // 根据业务需求决定是否抛出异常
+                // throw new RuntimeException(errorMsg);
+            }
+
+            // 订单金额为0时的特殊处理:保持原金额不变
+            if (orderAmount == 0 && historicalAmount > 0) {
+                System.out.println("订单金额为0,保持原累计金额不变:" + historicalAmount);
+                totalAmount = historicalAmount;
+            }
+
             System.out.println("金额计算:订单金额=" + orderAmount +
                     ", 历史金额=" + historicalAmount +
                     ", 总金额=" + totalAmount);
 
-            // 6. 时间戳转换
+            // 6. 时间计算
             long currentTimestamp = System.currentTimeMillis();
-            // 计算时间差(天数)
             long currentToDdDays = (currentTimestamp - dddateTimestampStr) / (1000 * 60 * 60 * 24);
-            long sfToDdDays = (sfdateTimestampStr > 0) ? (sfdateTimestampStr - dddateTimestampStr) / (1000 * 60 * 60 * 24) : 0;
+            long sfToDdDays = (sfdateTimestampStr != null && sfdateTimestampStr > 0) ?
+                    (sfdateTimestampStr - dddateTimestampStr) / (1000 * 60 * 60 * 24) : 0;
 
-            System.out.println("时间计算:当前时间-" + timestampToDateString(String.valueOf(currentTimestamp)) +
-                    ", 成交日期-" + timestampToDateString(dddateTimestampStr) +
+            System.out.println("时间计算:当前时间=" + timestampToDateString(String.valueOf(currentTimestamp)) +
+                    ", 成交日期=" + timestampToDateString(String.valueOf(dddateTimestampStr)) +
                     ", 当前-成交相差=" + currentToDdDays + "天" +
                     ", 公海-成交相差=" + sfToDdDays + "天");
 
+            // 7. 业务规则计算
             String ghcDateTimestamp = null;
-            String selectFieldValue = UtilMap.getString(customerData, "selectField_l3nrjuq0");
-            String khsx = UtilMap.getString(customerData, "selectField_mjsco9d4");
+            String selectFieldValue = originalSelectFieldValue;
+            String khsx = originalKhsx;
 
-// 1. 设置客户属性(单独判断)
+            // 设置客户属性
             if (totalAmount >= 75000 && sfToDdDays <= 180) {
                 khsx = "自行开发";
             }
 
-// 2. 第一个条件:当前时间-成交日期<90天 且 总金额>0 且 公海日期-成交日期≈180天
+            // 业务规则判断
             if (currentToDdDays < 90 && totalAmount > 0 && Math.abs(sfToDdDays - 180) <= 1) {
-                // 在成交日期上加90天
+                // 条件1:在成交日期上加90天
                 ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestampStr, 90));
                 selectFieldValue = "半年金额不足";
                 System.out.println("条件1触发:公海池时间设为成交日期+90天=" +
                         timestampToDateString(ghcDateTimestamp));
-            }
-// 3. 第二个条件:总金额≥7.5万 且 公海日期-成交日期≤180天
-            else if (totalAmount >= 75000 && sfToDdDays <= 180) {
-                // 在成交日期上加180天
+            } else if (totalAmount >= 75000 && sfToDdDays <= 180) {
+                // 条件2:在成交日期上加180天
                 ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestampStr, 180));
                 selectFieldValue = "半年金额不足";
                 System.out.println("条件2触发:公海池时间设为成交日期+180天=" +
                         timestampToDateString(ghcDateTimestamp));
-            }
-// 4. 第三个条件:金额<15万 且 公海日期-成交日期>180天
-            else if (totalAmount < 150000 && sfToDdDays > 180) {
+            } else if (totalAmount < 150000 && sfToDdDays > 180) {
+                // 条件3:设置一年金额不足,但不设置公海池日期
                 selectFieldValue = "一年金额不足";
                 System.out.println("条件3触发:金额<15万且公海日期>180天,设置一年金额不足");
-            }
-// 5. 其他情况
-            else {
+            } else if (totalAmount > 150000) {
+                // 【新增】总金额大于15万:释放公海池日期设为成交日期的下一年第一天
+                ghcDateTimestamp = getNextYearFirstDay(dddateTimestampStr);
+                selectFieldValue = "金额充足";
+                System.out.println("条件4触发:总金额>15万,公海池时间设为成交日期下一年第一天=" +
+                        timestampToDateString(ghcDateTimestamp));
+            } else {
+                // 其他情况
                 if (totalAmount > 0) {
-                    // 基础情况:金额大于0
                     ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestampStr, 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. 构建更新数据
+            // 8. 构建更新数据(只更新需要变更的字段)
             Map<String, Object> formData = new HashMap<>();
-            formData.put("dateField_mjm9k35j", dddateTimestampStr); // 最后成交日期(保持原时间戳)
 
-            // 只有selectField有值时才设置
-            if (!selectFieldValue.isEmpty()) {
-                formData.put("selectField_l3nrjuq0", selectFieldValue);
+            // 必须更新的字段
+            formData.put("dateField_mjm9k35j", dddateTimestampStr);  // 最后成交日期
+            formData.put("numberField_mjm9k35k", totalAmount);       // 累计金额
+            formData.put("selectField_mjsco9d4", khsx);              // 销售属性
+
+            // 条件更新:只在有值时才更新 selectField
+            if (selectFieldValue != null && !selectFieldValue.isEmpty()) {
+                if (!selectFieldValue.equals(originalSelectFieldValue)) {
+                    formData.put("selectField_l3nrjuq0", selectFieldValue);
+                    System.out.println("更新选择字段:" + originalSelectFieldValue + " -> " + selectFieldValue);
+                }
             }
 
+            // 条件更新:只在明确需要变更公海池日期时才更新
             if (ghcDateTimestamp != null) {
-                formData.put("dateField_mjm9k35l", ghcDateTimestamp); // 释放公海日期
+                // 只有当新值与旧值不同时才更新
+                String newDateStr = timestampToDateString(ghcDateTimestamp);
+                String oldDateStr = sfdateTimestampStr != null ? timestampToDateString(String.valueOf(sfdateTimestampStr)) : "空";
+                if (!newDateStr.equals(oldDateStr)) {
+                    formData.put("dateField_mjm9k35l", ghcDateTimestamp);
+                    System.out.println("更新公海池日期:" + oldDateStr + " -> " + newDateStr);
+                } else {
+                    System.out.println("公海池日期未变化,跳过更新:" + newDateStr);
+                }
             } else {
-                formData.put("dateField_mjm9k35l", ""); // 明确设置为空
+                // 不设置该字段,upsert操作会保持原值不变
+                System.out.println("公海池日期无需变更,保持原值:" +
+                        (sfdateTimestampStr != null ? timestampToDateString(String.valueOf(sfdateTimestampStr)) : "空"));
             }
 
-            // 更新累计金额(保留两位小数)
-            formData.put("numberField_mjm9k35k", totalAmount);
-            formData.put("selectField_mjsco9d4", khsx);
+            // 9. 数据变更前最终校验
+            if (totalAmount == 0 && historicalAmount > 0) {
+                System.err.println("警告:即将把客户金额从 " + historicalAmount + " 更新为 0,请确认业务逻辑!");
+                // 可选:根据业务需求决定是否继续执行
+                // throw new RuntimeException("金额异常清零,操作已阻止");
+            }
 
-            System.out.println("更新客户数据:" + formData);
+            System.out.println("最终更新数据:" + JSONObject.toJSONString(formData));
 
-            // 9. 执行更新操作
-            ydClient.operateData(YDParam.builder()
+            // 10. 执行更新操作(retryOperateData已内置重试功能)
+            retryOperateData(YDParam.builder()
                     .formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
                     .appType("APP_VQDMMWS6OR1VHL8VMFD3")
                     .systemToken("XE766X81JHKXK4Z27SYOI86CPCLQ3J1LV7ODMH2")
@@ -556,6 +625,68 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
         }
     }
 
+    /**
+     * 获取指定时间戳的下一年第一天零点的时间戳
+     * @param timestamp 时间戳(毫秒)
+     * @return 下一年第一天零点的时间戳
+     */
+    private String getNextYearFirstDay(Long timestamp) {
+        if (timestamp == null || timestamp <= 0) {
+            // 如果时间戳无效,返回当前时间下一年第一天
+            timestamp = System.currentTimeMillis();
+        }
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTimeInMillis(timestamp);
+
+        // 设置为下一年第一天
+        calendar.add(Calendar.YEAR, 1);
+        calendar.set(Calendar.MONTH, Calendar.JANUARY);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+
+        return String.valueOf(calendar.getTimeInMillis());
+    }
+
+    /**
+     * 计算指定日期加上天数后的时间戳
+     */
+    private long calculateTimestamp(Long baseTimestamp, int daysToAdd) {
+        if (baseTimestamp == null || baseTimestamp <= 0) {
+            baseTimestamp = System.currentTimeMillis();
+        }
+        return baseTimestamp + (daysToAdd * 24L * 60 * 60 * 1000);
+    }
+
+    /**
+     * 时间戳转日期字符串(用于日志)
+     */
+    private String timestampToDateString(Object timestamp) {
+        if (timestamp == null) {
+            return "空";
+        }
+        try {
+            long ts;
+            if (timestamp instanceof String) {
+                ts = Long.parseLong((String) timestamp);
+            } else if (timestamp instanceof Long) {
+                ts = (Long) timestamp;
+            } else {
+                return timestamp.toString();
+            }
+            if (ts <= 0) {
+                return "无效时间戳";
+            }
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            return sdf.format(new Date(ts));
+        } catch (Exception e) {
+            return timestamp.toString();
+        }
+    }
+
     /**
      * 计算时间戳:在基础时间戳上添加天数
      *
@@ -651,4 +782,77 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
         return new BigDecimal(number.toString())
                 .setScale(2, RoundingMode.HALF_UP);
     }
+
+    //自带重试的operateData方法
+    private Object retryOperateData(YDParam param, YDConf.FORM_OPERATION formOperation) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
+
+        Object result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.operateData(param, formOperation);
+
+                return result;
+            } catch (McException e) {
+                log.info("错误信息:{}",e.getMessage());
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(5000);
+                        log.info("尝试第{}次,param:{},FORM_OPERATION:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formOperation,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_OPERATION:{},异常信息:{}", JSONObject.toJSONString(param), formOperation,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_OPERATION:{}"+formOperation);
+    }
+
+
+    //自带重试的queryData方法
+    private DDR_New retryQueryData(YDParam param, YDConf.FORM_QUERY formQuery) {
+        int maxAttempts = 3; // 尝试的最大次数
+        int attempt = 0;
+
+        DDR_New result = null;
+
+        while (attempt < maxAttempts) {
+            try {
+                result = ydClient.queryData(param, formQuery);
+
+                return result;
+            } catch (McException e) {
+                log.info("错误信息:{}",e.getMessage());
+                if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
+                    attempt++;
+                    // 线程睡眠3秒
+                    try {
+                        Thread.sleep(5000);
+                        log.info("尝试第{}次,param:{},FORM_QUERY:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formQuery,e.getMessage());
+                    } catch (InterruptedException ie) {
+                        Thread.currentThread().interrupt(); // 重新设置中断状态
+                        System.err.println("Sleep interrupted: " + ie.getMessage());
+                    }
+                }
+            } catch (Exception e) {
+                log.error("操作失败,param:{},FORM_QUERY:{},异常信息:{}", JSONObject.toJSONString(param), formQuery,e.getMessage());
+
+                throw new RuntimeException(e);
+            }
+
+        }
+
+        throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_QUERY:{}"+formQuery);
+    }
 }

+ 2 - 2
mjava-mc/src/main/java/com/malk/mc/service/impl/McYdServiceImpl.java

@@ -700,8 +700,8 @@ public class McYdServiceImpl implements McYdService {
             }
 
             BigDecimal VirtualQuantity1 = null;
-            if(!data1.get("numberField_m8obn6wl_value").toString().isEmpty()){
-                VirtualQuantity1 = new BigDecimal( data1.get("numberField_m8obn6wl").toString());//虚拟数量
+            if(!data1.get("numberField_m8obn6wq_value").toString().isEmpty()){
+                VirtualQuantity1 = new BigDecimal( data1.get("numberField_m8obn6wq").toString());//虚拟数量
             }else {
                 VirtualQuantity1 = BigDecimal.valueOf(0);
             }

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

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

+ 37 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/entity/CommissionTable.java

@@ -0,0 +1,37 @@
+package com.malk.tuosi.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.math3.linear.PreconditionedIterativeLinearSolver;
+
+/**
+ * 用户实体类
+ * 注意:实体类使用驼峰命名,对应数据库的下划线命名
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CommissionTable {
+    /*任务id*/
+    private String taskId;
+    /*任务名称*/
+    private String taskName;
+    /*任务类型*/
+    private String taskType;
+    /*客户*/
+    private String customer;
+    /*设计人员*/
+    private String designPerson;
+    /*所属部门*/
+    private String department;
+    /*设计等级*/
+    private String designLevel;
+    /*是否扩版*/
+    private String expandOr;
+    /*设计扩版数量*/
+    private String addedPlates;
+    /*单价*/
+    private String price;
+
+}

+ 2 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/entity/PersonalMonthlySuccessrate.java

@@ -20,6 +20,8 @@ public class PersonalMonthlySuccessrate {
     private String taskType;
     /*设计人员*/
     private String designPerson;
+    /*所属部门*/
+    private String department;
     /*客户*/
     private String customer;
     /*时间*/

+ 13 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/mapper/CommissionTableMapper.java

@@ -0,0 +1,13 @@
+package com.malk.tuosi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.malk.tuosi.entity.CommissionTable;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 用户数据访问接口
+ * 注意:使用@Mapper注解,Spring Boot会自动扫描
+ */
+@Mapper
+public interface CommissionTableMapper extends BaseMapper<CommissionTable> {
+}

File diff suppressed because it is too large
+ 691 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/schedule/ScheduleTask.java


+ 7 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/CommissionTableService.java

@@ -0,0 +1,7 @@
+package com.malk.tuosi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.malk.tuosi.entity.CommissionTable;
+
+public interface CommissionTableService extends IService<CommissionTable> {
+}

+ 13 - 0
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/CommissionTableServiceImpl.java

@@ -0,0 +1,13 @@
+package com.malk.tuosi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.malk.tuosi.entity.CommissionTable;
+import com.malk.tuosi.mapper.CommissionTableMapper;
+import com.malk.tuosi.service.CommissionTableService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class CommissionTableServiceImpl extends ServiceImpl<CommissionTableMapper, CommissionTable> implements CommissionTableService {
+}

+ 1 - 1
mjava-ounuo/src/main/java/com/malk/tuosi/service/impl/TbServiceImpl.java

@@ -467,7 +467,7 @@ public class TbServiceImpl implements TBService {
                     message.put("openSpaceId","dtv1.card//IM_GROUP.cidXES2AIusSs+mb9gD8i4w1w==");
                 }else if("张昆".equals(businessManager)){
                     message.put("openSpaceId","dtv1.card//IM_GROUP.cidI3G/EnCvlem5w3+qKfTMDA==");
-                }else if("谷晨".equals(businessManager)){
+                }else if("谷晨".equals(businessManager)){
                     message.put("openSpaceId","dtv1.card//IM_GROUP.cidqXtqGAN+Es7L/5m3uaZzSg==");
                 }
 //                message.put("openSpaceId", "dtv1.card//IM_GROUP.cidTppONwRCrkshRlCt28O+NA==");//正式群id:cidTppONwRCrkshRlCt28O+NA==   测试群id:cidKoVDKhvynnj+73h0uxSJBA==

+ 10 - 0
mjava-zhiwei/pom.xml

@@ -50,6 +50,16 @@
             <artifactId>lombok</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>com.example</groupId>
+            <artifactId>k3cloud</artifactId>
+            <version>8.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.example</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.0</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 24 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/config/KDWebApiConf.java

@@ -0,0 +1,24 @@
+package com.malk.zhiwei.config;
+
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@Component
+@ConfigurationProperties(prefix = "kingdee")
+@Slf4j
+public class KDWebApiConf {
+
+    private String XKDApiAcctID;
+
+    private String XKDApiUserName;
+
+    private String XKDApiAppID;
+
+    private String XKDApiAppSec;
+
+    private String XKDApiServerUrl;
+
+}

+ 32 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/config/KDWebApiConfig.java

@@ -0,0 +1,32 @@
+package com.malk.zhiwei.config;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+public class KDWebApiConfig {
+    private Properties properties = new Properties();
+
+    public KDWebApiConfig(String filePath) throws IOException {
+        try (FileInputStream input = new FileInputStream(filePath)) {
+            properties.load(input);
+        }
+    }
+
+    public String getProperty(String key) {
+        return properties.getProperty(key);
+    }
+
+    public static void main(String[] args) {
+        try {
+            KDWebApiConfig config = new KDWebApiConfig("mjava-jinlun/src/main/resources/application-dev.yml");
+            System.out.println("AcctID: " + config.getProperty("X-KDApi-AcctID"));
+            // 打印其他属性...
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+
+}

+ 26 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/Audit.java

@@ -0,0 +1,26 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Audit {
+    private int CreateOrgId;
+
+    private List<String> Numbers;
+
+    private String Ids;
+
+    private String InterationFlags;
+
+    private int UseOrgId;
+
+    private String NetworkCtrl;
+
+    private Boolean IsVerifyProcInst;
+
+    private String IgnoreInterationFlag;
+
+    private Boolean UseBatControlTimes;
+}

+ 18 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/BillQuery.java

@@ -0,0 +1,18 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class BillQuery {
+    private String FormId;
+    private String FieldKeys;
+    private List<Map> FilterString;
+    private String OrderString;
+    private int TopRowCount;
+    private int StartRow;
+    private int Limit;
+    private String SubSystemId;
+}

+ 24 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/ContactModel.java

@@ -0,0 +1,24 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+@Data
+public class ContactModel extends Model{
+    private String FName;//联系人名称
+
+    private FNumber FCustId;//客户编号
+
+    private String FMobile;//移动电话
+
+    private FNumber Fex;//性别
+
+    private String FPost;//职务
+
+    private String FTel;//固定电话
+
+    private String FFax;//传真
+
+    private String FEmail;//邮箱
+
+    private String FCompanyType;//类型:BD_Customer:客户,BD_Supplier:供应商
+}

+ 10 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/CustomerContactEntry.java

@@ -0,0 +1,10 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+@Data
+public class CustomerContactEntry {
+    private String FNUMBER1;//地点编码
+
+    private String FNAME1;//地点名称
+}

+ 72 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/CustomerModel.java

@@ -0,0 +1,72 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class CustomerModel extends Model{
+    private int FCUSTID;
+
+    private String FName;//客户名称
+
+    private String FShortName;//简称
+
+    private FNumber FCOUNTRY;//国家
+
+    private FNumber FGroup;//客户分组
+
+    private String F_VMKV_Combo;//客户等级
+
+    private FNumber FCustTypeId;//客类别
+
+    private String FDescription;//备注
+
+    private FNumber FSALDEPTID;//销售部门
+
+    private FNumber FSELLER;//销售员
+
+    private FSTAFFNUMBER F_VMKV_Base1;//跟单员
+
+    private String F_VMKV_Combo1;//订单要求
+
+    private FNumber FRECCONDITIONID;//收款条件
+
+    private FNumber FTRADINGCURRID;//结算币别
+
+    private FNumber FSETTLETYPEID;//结算方式
+
+    private FNumber FTaxRate;//税率
+
+    private FNumber FTaxType;//税分类
+
+    private String FInvoiceType;//发票类型
+
+    private Boolean FISCREDITCHECK;//启用信用管理
+
+    private String FINVOICEBANKACCOUNT;//银行账号
+
+    private String FINVOICETITLE;//发票抬头
+
+    private String FTAXREGISTERCODE;//纳税登记号
+
+    private String FINVOICEBANKNAME;//开户银行
+
+    private String FSOCIALCRECODE;//统一社会信用代码
+
+    private String FINVOICETEL;//开票联系电话
+
+    private String FINVOICEADDRESS;//开票通讯地址
+
+    private List<CustomerContactEntry> FT_BD_CUSTCONTACT;//地址信息
+
+    private FNumber FCreateOrgId;//创建组织 (必填项)
+
+    public CustomerModel (){}
+
+    public CustomerModel(String name){
+        this.FName=name;
+        this.FCreateOrgId = new FNumber("100");
+        this.FTRADINGCURRID = new FNumber("PRE001");
+    }
+}

+ 40 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/FBillHead.java

@@ -0,0 +1,40 @@
+package com.malk.zhiwei.entity;
+
+import com.malk.utils.UtilMap;
+import com.malk.xiding.entity.Model;
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class FBillHead extends Model {
+    private String FID;//实体主键
+    private String FDocumentStatus;//数据状态
+    private String FForbidStatus;//禁用状态
+    private String FName;//名称 (必填项)
+    private String FNumber;//编码
+    private String FDescription;//描述
+    private Map<String,String> FCreateOrgId;//创建组织 (必填项)
+    private Map<String,String> FUseOrgId;//使用组织 (必填项)
+    private String FCreatorId;//创建人
+    private String FModifierId;//修改人
+    private String FCreateDate;//创建日期
+    private String FModifyDate;//修改日期
+    private Map<String,String> F_ABC_Assistant;//项目类型 (必填项)
+    private String F_VPOX_Text;//CRM编号
+
+    public void setFCreateOrgId(String fCreateOrgId){
+        this.FCreateOrgId = UtilMap.map("FNumber",fCreateOrgId);
+    }
+    public void setFUseOrgId(String fUseOrgId){
+        this.FUseOrgId = UtilMap.map("FNumber",fUseOrgId);
+    }
+    public FBillHead(String FName,String FNumber,String type){
+        this.FUseOrgId = UtilMap.map("FNumber","100");
+        this.FCreateOrgId = UtilMap.map("FNumber","100");
+        this.FName=FName;
+        this.FNumber=FNumber;
+        this.F_ABC_Assistant = UtilMap.map("FNumber",type);
+    }
+    public FBillHead(){}
+}

+ 15 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/FNumber.java

@@ -0,0 +1,15 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+@Data
+public class FNumber {
+    public FNumber() {
+    }
+
+    public FNumber(String FNumber) {
+        this.FNumber = FNumber;
+    }
+
+    private String FNumber;
+}

+ 15 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/FSTAFFNUMBER.java

@@ -0,0 +1,15 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+@Data
+public class FSTAFFNUMBER {
+    public FSTAFFNUMBER() {
+    }
+
+    public FSTAFFNUMBER(String FSTAFFNUMBER) {
+        this.FSTAFFNUMBER = FSTAFFNUMBER;
+    }
+
+    private String FSTAFFNUMBER;
+}

+ 7 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/Model.java

@@ -0,0 +1,7 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+@Data
+public class Model {
+}

+ 137 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/PreBaseDataOne.java

@@ -0,0 +1,137 @@
+package com.malk.zhiwei.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.List;
+
+/**
+ * 单据操作请求实体类
+ * 用于处理单据相关的操作请求参数
+ */
+public class PreBaseDataOne {
+    
+    /**
+     * 创建者组织内码
+     * 非必录字段
+     */
+    @JsonProperty("CreateOrgId")
+    private String createOrgId;
+    
+    /**
+     * 单据编码集合
+     * 数组类型,格式:[No1,No2,...]
+     * 使用编码时必录
+     */
+    @JsonProperty("Numbers")
+    private List<String> numbers;
+    
+    /**
+     * 单据内码集合
+     * 字符串类型,格式:"Id1,Id2,..."
+     * 使用内码时必录
+     */
+    @JsonProperty("Ids")
+    private String ids;
+    
+    /**
+     * 工作流发起员工岗位内码
+     * 整型,非必录
+     * 注:员工身兼多岗时不传参默认取第一个岗位
+     */
+    @JsonProperty("SelectedPostId")
+    private Integer selectedPostId;
+    
+    /**
+     * 是否启用网控
+     * 布尔类型,默认false
+     * 非必录
+     */
+    @JsonProperty("NetworkCtrl")
+    private Boolean networkCtrl = false;
+    
+    /**
+     * 是否允许忽略交互
+     * 布尔类型,默认true
+     * 非必录
+     */
+    @JsonProperty("IgnoreInterationFlag")
+    private Boolean ignoreInterationFlag = true;
+    
+    // 无参构造函数
+    public PreBaseDataOne() {
+    }
+    
+    // 全参构造函数
+    public PreBaseDataOne(String createOrgId, List<String> numbers,
+                                   String ids, Integer selectedPostId, 
+                                   Boolean networkCtrl, Boolean ignoreInterationFlag) {
+        this.createOrgId = createOrgId;
+        this.numbers = numbers;
+        this.ids = ids;
+        this.selectedPostId = selectedPostId;
+        this.networkCtrl = networkCtrl;
+        this.ignoreInterationFlag = ignoreInterationFlag;
+    }
+    
+    // Getter和Setter方法
+    
+    public String getCreateOrgId() {
+        return createOrgId;
+    }
+    
+    public void setCreateOrgId(String createOrgId) {
+        this.createOrgId = createOrgId;
+    }
+    
+    public List<String> getNumbers() {
+        return numbers;
+    }
+    
+    public void setNumbers(List<String> numbers) {
+        this.numbers = numbers;
+    }
+    
+    public String getIds() {
+        return ids;
+    }
+    
+    public void setIds(String ids) {
+        this.ids = ids;
+    }
+    
+    public Integer getSelectedPostId() {
+        return selectedPostId;
+    }
+    
+    public void setSelectedPostId(Integer selectedPostId) {
+        this.selectedPostId = selectedPostId;
+    }
+    
+    public Boolean getNetworkCtrl() {
+        return networkCtrl;
+    }
+    
+    public void setNetworkCtrl(Boolean networkCtrl) {
+        this.networkCtrl = networkCtrl;
+    }
+    
+    public Boolean getIgnoreInterationFlag() {
+        return ignoreInterationFlag;
+    }
+    
+    public void setIgnoreInterationFlag(Boolean ignoreInterationFlag) {
+        this.ignoreInterationFlag = ignoreInterationFlag;
+    }
+    
+    @Override
+    public String toString() {
+        return "DocumentOperationRequest{" +
+                "createOrgId='" + createOrgId + '\'' +
+                ", numbers=" + numbers +
+                ", ids='" + ids + '\'' +
+                ", selectedPostId=" + selectedPostId +
+                ", networkCtrl=" + networkCtrl +
+                ", ignoreInterationFlag=" + ignoreInterationFlag +
+                '}';
+    }
+}

+ 104 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/Receivebill.java

@@ -0,0 +1,104 @@
+package com.malk.zhiwei.entity;
+
+import cn.hutool.core.annotation.Alias;
+import com.malk.utils.PublicUtil;
+import com.malk.utils.UtilDateTime;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class Receivebill {
+
+    // ==================== 基础信息 ====================
+
+    @Alias("FBillNo")
+    private String textField_mmvtlugm; // 单据编号
+
+    @Alias("FPAYUNIT.FName")
+    private String associationFormField_lypey1wr; // 付款单位(客户选择)
+
+    @Alias("FREALRECAMOUNTFOR")
+    private String numberField_lsvmld1x; // 实收金额(收款金额)
+
+    @Alias("FDATE")
+    private String dateField_lsy1vr0z; // 业务日期(收款时间)
+
+    @Alias("FSETTLETYPEID.FName")
+    private String selectField_lx4j5lnh; // 明细:结算方式(回款形式)
+
+    // 回款性质 - 默认:项目回款,无金蝶映射
+    private String selectField_lx4j5lne="项目回款";
+
+    @Alias("F.ABC.Base1")
+    private String selectField_lx4j5lnf; // 收款单位(回款主体)
+
+    @Alias("FRECACCOUNTNAME")
+    private String selectField_lx4j5lnd; // 明细:我方账户名称(回款银行)
+
+    @Alias("FACCOUNTID.FNumber")
+    private String textField_lypey1wy; // 明细:我方银行账号(银行账号)
+
+    @Alias("FSALEERID")
+    private String employeeField_lzwhaly9; // 销售员(客户负责人)
+
+    @Alias("F.ABC.Base")
+    private String associationFormField_lsvmld22; // 项目(合同选择)
+
+    @Alias("F.ABC.BaseProperty")
+    private String textField_m0oohuvq; // 项目中编码(合同编码)
+
+    // 区域负责人 - 无金蝶映射,系统查询
+    private String employeeField_m1aft8yd;
+
+    // 未收款金额 - 无金蝶映射,系统计算
+    private String numberField_lxu29mvg;
+
+    // ==================== 票据信息 ====================
+
+    // 收票日期 - 当前日期
+    private String dateField_lzca2rq0;
+
+    // 出票人名称
+    private String textField_lzca2rpv;
+
+    // 付款行名称
+    private String textField_lzca2rpx;
+
+    @Alias("FBPBILLNUMBER")
+    private String textField_lzca2rpt; // 明细:票据号(票号)
+
+    @Alias("FBPBILLPARAMOUNT")
+    private String numberField_lzca2rq1; // 明细:票面金额(票面金额)
+
+    // 出票日
+    private String dateField_lzca2rq2;
+
+    // 付款期限
+    private String textField_lzca2rq4;
+
+    @Alias("FBPBILLTYPE")
+    private String selectField_lzca2rq7; // 明细:票据类型(票据性质)
+
+    @Alias("FPAYUNIT.FName")
+    private String textField_lzca2rq8; // 付款单位(背书单位)
+
+    @Alias("FEXPIRY")
+    private String dateField_lzca2rqb; // 明细:到期日(到日期)
+
+    public Receivebill toYiDa(){
+        if(!PublicUtil.isNull(this.dateField_lzca2rqb)){
+            this.dateField_lzca2rqb = String.valueOf(UtilDateTime.getLocalDateTimeTimeStamp(LocalDateTime.parse(this.dateField_lzca2rqb)));
+            this.dateField_lzca2rq0 = this.dateField_lzca2rqb;
+        }
+        if(!PublicUtil.isNull(this.dateField_lsy1vr0z)){
+            this.dateField_lsy1vr0z = String.valueOf(UtilDateTime.getLocalDateTimeTimeStamp(LocalDateTime.parse(this.dateField_lsy1vr0z)));
+            this.dateField_lzca2rq0 = this.dateField_lsy1vr0z;
+        }
+        if(!PublicUtil.isNull(this.associationFormField_lsvmld22)){
+            System.out.println(associationFormField_lsvmld22);
+            this.associationFormField_lsvmld22="";
+        }
+        return  this;
+    }
+}

+ 57 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/SaleOrderEntry.java

@@ -0,0 +1,57 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+@Data
+public class SaleOrderEntry {
+    private FNumber FMaterialId;//物料编码
+    private String F_Sl_XSTYPE;//产品类别
+
+    private FNumber FUnitID;//销售单位
+    private double FQty;//销售数量
+    private FNumber FPriceUnitId;//计价单位
+    private double FPriceUnitQty;//计价数量
+//    private double FPrice;
+    private double FTaxPrice;//含税单价
+
+    private boolean FIsFree;//是否赠品
+
+    private double FEntryTaxRate;//税率
+
+    /*private double FTaxAmount_LC;
+    private double FAmount_LC;
+    private double FAllAmount_LC;*/
+
+    private String FDeliveryDate;
+
+    /*private FNumber FStockFNumber;
+    private FNumber FSettleOrgIds;
+    private String FOwnerTypeId;
+    private FNumber FOwnerId;*/
+    private String FEntryNote;
+
+    private double F_VMKV_MPPRICE;//报价价格
+    private String F_VMKV_SCCQ1;//生产厂区
+/*    private double F_WMVJ_Decimal;
+    private double F_WMVJ_Amount;
+    private double F_WMVJ_Qty;
+    private boolean F_WMVJ_CheckBox;*/
+
+    private String F_VMKV_JSYQ;//技术要求
+    private String F_NLD_BR;//剩磁(Br)
+    private String F_NLD_Hcj;//内禀矫顽力(Hcj)
+    private String F_NLD_Hcb;//磁感矫顽力(Hcb)
+    private String F_NLD_BH;//最大磁能积(BH)max
+    private String F_NLD_Hk;//方形度Hk/Hcj
+    private String F_VMKV_GXYQ;//公差要求
+
+    private boolean FDeliveryControl;//控制发货数量
+    private double FDeliveryMaxQty;//发货上限
+    private double FDeliveryMinQty;//发货下限
+
+    private String F_WGR_Combo_qtr;//产品质量等级
+    private String F_NLD_khwl;//客户物料编码
+    private FNumber F_Sl_salexingnengid;//客户性能
+
+    String F_Sl_Attachment;//订单图纸附件
+}

+ 17 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/SaleOrderFinance.java

@@ -0,0 +1,17 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+@Data
+public class SaleOrderFinance {
+    private FNumber FSettleCurrId;//结算币别
+
+    private FNumber FRecConditionId ;//收款条件
+
+    private FNumber FSettleModeId;//结算方式
+
+    private boolean FIsIncludedTax;//是否含税
+
+    private boolean FIsPriceExcludeTax;//价外税
+
+}

+ 25 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/SaleOrderModel.java

@@ -0,0 +1,25 @@
+package com.malk.zhiwei.entity;
+
+import com.malk.xiding.entity.SaleOrderEntry;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SaleOrderModel extends Model{
+    private int FID;
+    private FNumber FBillTypeID;//单据类型
+    private String FDate;//日期
+    private String F_NLD_DDTYPE ;//订单类型
+    private String F_WGR_Combo_re5 ;//订单要求
+    private FNumber FCustId;//客户
+    private FNumber FSalerId;//销售员
+    private FSTAFFNUMBER F_Sl_gendanyuan;//跟单员
+    private FNumber FHeadDeliveryWay;//交货方式
+    private String FBusinessType;//业务类型
+    private FNumber FHEADLOCID;//交货地点
+    private String FNote;//备注
+    private String F_Sl_customerbillno;//客户订单号
+    private SaleOrderFinance FSaleOrderFinance;//财务信息
+    private List<SaleOrderEntry> FSaleOrderEntry;//订单明细
+}

+ 26 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/Save.java

@@ -0,0 +1,26 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Save {
+        //默认为空 需要时选择性赋值
+        private List<String> NeedUpDateFields;
+        /*private List<String> NeedReturnFields;
+        private boolean IsDeleteEntry;
+        private String SubSystemId;
+        private boolean IsVerifyBaseDataField;
+        private boolean IsEntryBatchFill;
+        private boolean ValidateFlag;
+        private boolean NumberSearch;
+        private boolean IsAutoAdjustField;
+        private String InterationFlags;
+        private boolean IgnoreInterationFlag;
+        private boolean IsControlPrecision;
+        private boolean ValidateRepeatJson;*/
+
+        //保存实体
+        private Model Model;
+}

+ 22 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/Submit.java

@@ -0,0 +1,22 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class Submit {
+    private int CreateOrgId;
+
+    private List<String> Numbers;
+
+    private String Ids;
+
+    private int SelectedPostId;
+
+    private int UseOrgId;
+
+    private Boolean NetworkCtrl;
+
+    private Boolean IgnoreInterationFlag;
+}

+ 24 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/UnAudit.java

@@ -0,0 +1,24 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class UnAudit {
+    private int CreateOrgId;
+
+    private List<String> Numbers;
+
+    private String Ids;
+
+    private String InterationFlags;
+
+    private int UseOrgId;
+
+    private String NetworkCtrl;
+
+    private Boolean IsVerifyProcInst;
+
+    private String IgnoreInterationFlag;
+}

+ 14 - 0
mjava-zhiwei/src/main/java/com/malk/zhiwei/entity/View.java

@@ -0,0 +1,14 @@
+package com.malk.zhiwei.entity;
+
+import lombok.Data;
+
+@Data
+public class View {
+    private int CreateOrgId;
+
+    private String Number;
+
+    private String Id;
+
+    private Boolean IsSortBySeq;
+}

+ 2 - 2
mjava-zhiwei/src/main/java/com/malk/zhiwei/schedule/ScheduleTask.java

@@ -38,7 +38,7 @@ public class ScheduleTask {
 
     /**
      */
-    @Scheduled(cron = "0 0/5 * * * ?")
+//    @Scheduled(cron = "0 0/5 * * * ?")
     public void sync() {
         List<Map> list=(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-3A89370AC94B429B9180ED98260BAF680JYM").pageSize(1)
                 .searchFieldJson(JSONObject.toJSONString(UtilMap.map("selectField_mcefftmv","待处理"))).build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
@@ -72,7 +72,7 @@ public class ScheduleTask {
         }
     }
 
-    @Scheduled(cron = "0 0 1 * * ?")
+//    @Scheduled(cron = "0 0 1 * * ?")
     public void syncProd() {
         zwService.syncProduct("","PILOT2024");
         zwService.syncProduct("","PILOT2023");

+ 19 - 0
mjava-zhiwei/src/main/resources/application-dev.yml

@@ -25,3 +25,22 @@ aliwork:
   appType: APP_G0JV4FGIR0EOSBD0K7XV
   systemToken: F2766O91DH8WNHHUD63KBDP3B5GE234U4ZSBMBS1
 
+kingdee:
+  # 第三方系统登录授权的账套ID
+  X-KDApi-AcctID: 692653fa165f17
+  # 第三方系统登录授权的用户
+  X-KDApi-UserName: 徐峰
+  # 第三方系统登录授权的应用ID
+  X-KDApi-AppID: 337960_TZ5N39EPSvpaX5+KQ11rV8VMzM5X0CLo
+  # 第三方系统登录授权的应用密钥
+  X-KDApi-AppSec: 49ac4562f30d4db6a5cb3fcca22585a9
+  # 服务Url地址(公有云统一走网关sdk底层已处理,无需传X-KDApi-ServerUrl,下面这行需要注释)
+  X-KDApi-ServerUrl: http://211.91.58.31:8081/k3cloud/
+  # 账套语系,默认2052
+  # X-KDApi-LCID: 2052
+  # 组织编码,启用多组织时配置对应的组织编码才有效
+  # X-KDApi-OrgNum: 100
+  # 允许的最大连接延时,单位为秒
+  # X-KDApi-ConnectTimeout: 120
+  # 允许的最大读取延时,单位为秒
+  # X-KDApi-RequestTimeout: 120

+ 194 - 0
mjava-zhiwei/src/test/java/com/malk/zhiwei/JdTest.java

@@ -0,0 +1,194 @@
+package com.malk.zhiwei;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
+import com.kingdee.bos.webapi.entity.IdentifyInfo;
+import com.kingdee.bos.webapi.entity.RepoRet;
+import com.kingdee.bos.webapi.sdk.K3CloudApi;
+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.service.aliwork.YDClient;
+import com.malk.utils.PublicUtil;
+import com.malk.utils.UtilMap;
+import com.malk.zhiwei.config.KDWebApiConf;
+import com.malk.zhiwei.entity.*;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.*;
+
+@Slf4j
+@SpringBootTest
+@RunWith(SpringRunner.class)
+public class JdTest {
+
+    @Autowired
+    private KDWebApiConf kdWebApiConf;
+
+    @Autowired
+    private YDClient ydClient;
+    @Autowired
+    private YDConf ydConf;
+
+    private IdentifyInfo initIden(){
+        //注意 1:此处不再使用参数形式传入用户名及密码等敏感信息,改为在登录配置文件中设置。
+        //注意 2:必须先配置第三方系统登录授权信息后,再进行业务操作,详情参考各语言版本SDK介绍中的登录配置文件说明。
+        //读取配置,初始化SDK
+        IdentifyInfo iden = new IdentifyInfo();
+        iden.setUserName(kdWebApiConf.getXKDApiUserName());
+        iden.setAppId(kdWebApiConf.getXKDApiAppID());
+        iden.setdCID(kdWebApiConf.getXKDApiAcctID());
+        iden.setAppSecret(kdWebApiConf.getXKDApiAppSec());
+        iden.setServerUrl(kdWebApiConf.getXKDApiServerUrl());
+
+        return iden;
+    }
+
+    @Test
+    public void test(){
+        K3CloudApi client = new K3CloudApi(initIden());
+        String value="{\"CreateOrgId\":0,\"Number\":\"\",\"Id\":\"\",\"IsSortBySeq\":\"false\"}";
+        try {
+//            String result=client.view("BAS_PreBaseDataOne",value);
+            PreBaseDataOne preBaseDataOne = new PreBaseDataOne();
+            preBaseDataOne.setCreateOrgId(value);
+            String result=client.submit("BAS_PreBaseDataOne", JSONObject.toJSONString(preBaseDataOne));
+            System.out.println(result);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void saveProject(){
+        K3CloudApi client = new K3CloudApi(initIden());
+        try {
+            FBillHead fBillHead = new FBillHead("测试项目","TEST-2026-03-18-001","AI");
+            String result=client.save("BD_Customer",JSONObject.toJSONString(UtilMap.map("Model",fBillHead)));
+            System.out.println(result); // 保存数据到金蝶
+//            JsonObject jsonData = new JsonObject();
+//            jsonData.addProperty("Numbers", "TEST-2026-03-18-001");
+//            String result=client.audit("BAS_PreBaseDataOne", jsonData.toString());
+            System.out.println(result);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void saveCust() throws Exception {
+        CustomerModel customerModel = new CustomerModel("测试客户");
+        System.out.println(saveToAudit("BD_Customer", customerModel));
+    }
+
+    private McR saveToAudit(String formid, Object object) throws Exception {
+        JSONObject resultObj = new JSONObject();
+        K3CloudApi client = new K3CloudApi(initIden());
+        String result=client.save(formid,JSONObject.toJSONString(UtilMap.map("Model",object)));
+        resultObj.put("save",result);
+        Gson gson = new Gson();
+        RepoRet sRet = gson.fromJson(result, RepoRet.class);
+        if (sRet.isSuccessfully()) {
+            JsonObject jsonData = new JsonObject();
+            jsonData.addProperty("Ids", sRet.getResult().getId());
+            String result2=client.submit(formid, jsonData.toString());
+            resultObj.put("save",result2);
+            RepoRet sRet2 = gson.fromJson(result, RepoRet.class);
+            if (sRet2.isSuccessfully()) {
+                JsonObject jsonData3 = new JsonObject();
+                jsonData3.addProperty("Ids", sRet2.getResult().getId());
+                String result3 = client.audit(formid, jsonData3.toString());
+                RepoRet repoRet3 = gson.fromJson(result3, RepoRet.class);
+                if (repoRet3.getResult().getResponseStatus().isIsSuccess()) {
+                    log.info("审批通过,新增完成");
+                    return McR.success(resultObj);
+                }
+            }
+        }
+        return McR.error("203",JSONObject.toJSONString(resultObj));
+    }
+
+    @Test
+    public void queryOrder(){
+        K3CloudApi client = new K3CloudApi(initIden());
+        try {
+            int startRow = 0;
+            int limit = 2000;
+            BillQuery billQuery = new BillQuery();
+            billQuery.setFormId("AR_RECEIVEBILL");
+            billQuery.setFieldKeys("FPAYUNIT.FName,FREALRECAMOUNTFOR,FDATE,FSETTLETYPEID,FSETTLETYPEID.FName,F_ABC_Base1,FRECACCOUNTNAME,FACCOUNTID.FNumber,FACCOUNTID.FName,FSALEERID.FName,F_ABC_Base,F_ABC_BaseProperty,FBPBILLNUMBER,FBPBILLPARAMOUNT,FBPBILLTYPE,FEXPIRY");
+//            billQuery.setFieldKeys("FBillNo,FBillTypeID.FName,FPAYUNITTYPE,FDate,FPAYUNIT.FName,FCURRENCYID.FName,FRECEIVEAMOUNTFOR_H,FREALRECAMOUNTFOR,FSALEERID.FName,FSETTLETYPEID,FSETTLETYPEID.FName,FPURPOSEID.FName,FACCOUNTID.FNumber,FACCOUNTID.FName,FRECTOTALAMOUNTFOR,FREALRECAMOUNTFOR_D,FCOMMENT");
+            List<Map> filterString = new ArrayList<>();
+            //审核日期为昨天至今天
+            filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",4,"","","0"));//审核日期在今天之前N天以后
+//        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","420","2025-10-20 00:00:00","","","0"));//审核日期年=XX
+//        filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FNumber","67","35","","","0"));//物料编码等于XX
+            billQuery.setFilterString(filterString);
+            billQuery.setLimit(limit);
+            billQuery.setStartRow(startRow);
+            String result=client.billQuery(JSONObject.toJSONString(billQuery));
+            JSONArray jsonArray = JSONArray.parseArray(result);
+            for(int i=0;i<jsonArray.size();i++){
+                JSONObject jsonObject = jsonArray.getJSONObject(i);
+                System.out.println(jsonObject);
+                Receivebill rb= BeanUtil.toBean(jsonObject, Receivebill.class);
+                if(!PublicUtil.isNull(rb.getAssociationFormField_lypey1wr())){
+                    List<Map> data=(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-8E4AA59DFB354F2D922826F47F70B31AZ8ES")
+                            .searchCondition(JSONObject.toJSONString(Arrays.asList(YDConf.searchCondition_TextFiled("textField_lx05suvl",rb.getAssociationFormField_lypey1wr(),"eq"))))
+                            .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+                    if(data.size()>0){
+                        System.out.println(data.get(0).get("formInstanceId"));
+                        List<Map> kh=ydConf.associationForm("FORM-8E4AA59DFB354F2D922826F47F70B31AZ8ES", String.valueOf(data.get(0).get("formInstanceId")),rb.getAssociationFormField_lypey1wr(),"",false);
+                        rb.setAssociationFormField_lypey1wr(JSONObject.toJSONString(kh));
+                    }else{
+                        rb.setAssociationFormField_lypey1wr("[]");
+                    }
+                }
+                Map prodata=new HashMap();
+                if(!PublicUtil.isNull(rb.getAssociationFormField_lsvmld22())){
+                    List<Map> data=(List<Map>) ydClient.queryData(YDParam.builder().formUuid("FORM-2E06211370FA43D3AEAAC0CF7636365491YX")
+                            .searchCondition(JSONObject.toJSONString(Arrays.asList(YDConf.searchCondition_TextFiled("textField_m0c4utr2",rb.getAssociationFormField_lsvmld22(),"eq"))))
+                            .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+                    if(data.size()>0){
+                        System.out.println(data.get(0).get("formInstanceId"));
+                        Map formData= UtilMap.getMap(data.get(0),"formData");
+                        List<Map> kh=ydConf.associationForm("FORM-2E06211370FA43D3AEAAC0CF7636365491YX", String.valueOf(data.get(0).get("formInstanceId")),UtilMap.getString(formData,"textField_m50ci9rk"),"",false);
+                        rb.setAssociationFormField_lsvmld22(JSONObject.toJSONString(kh));
+                        prodata.put("textField_lwgba84b",formData.get("textField_m0namazl"));
+                        prodata.put("textField_lxvrmu61",formData.get("textField_m0namazj"));
+                        prodata.put("textField_lypey1wx",formData.get("textField_m0c4utr2"));
+                        prodata.put("textField_m1aft8ye",formData.get("textField_m6yurmat"));
+                        prodata.put("numberField_lxu21h6c",formData.get("numberField_mdcwz9mr"));
+                        prodata.put("numberField_lxu29mvg",formData.get("numberField_mdcwz9mv"));
+                        prodata.put("numberField_lxu336sn",formData.get("numberField_m0gb97py"));
+                    }else{
+                        rb.setAssociationFormField_lsvmld22("[]");
+                    }
+                }
+                prodata.putAll(JSONObject.parseObject(JSONObject.toJSONString(rb.toYiDa())));
+                ydClient.operateData(YDParam.builder().formUuid("FORM-9BDAFB39320246EFACC176C9E33E51DC4N40")
+                        .formDataJson(JSONObject.toJSONString(prodata)).build(), YDConf.FORM_OPERATION.start);
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @Test
+    public void queryOrder2(){
+
+    }
+
+
+
+}