ソースを参照

3.27代码提交

“lqy 1 ヶ月 前
コミット
97434866bf

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

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