|
@@ -17,6 +17,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.malk.server.aliwork.YDConf;
|
|
import com.malk.server.aliwork.YDConf;
|
|
|
import com.malk.server.aliwork.YDParam;
|
|
import com.malk.server.aliwork.YDParam;
|
|
|
import com.malk.server.aliwork.YDSearch;
|
|
import com.malk.server.aliwork.YDSearch;
|
|
|
|
|
+import com.malk.server.common.McException;
|
|
|
import com.malk.server.common.McR;
|
|
import com.malk.server.common.McR;
|
|
|
import com.malk.server.dingtalk.DDR_New;
|
|
import com.malk.server.dingtalk.DDR_New;
|
|
|
import com.malk.service.aliwork.YDClient;
|
|
import com.malk.service.aliwork.YDClient;
|
|
@@ -124,7 +125,7 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
|
|
|
String code = JSON.parseArray(responseBody)
|
|
String code = JSON.parseArray(responseBody)
|
|
|
.getJSONObject(0)
|
|
.getJSONObject(0)
|
|
|
.getString("code");
|
|
.getString("code");
|
|
|
- ydClient.operateData(
|
|
|
|
|
|
|
+ retryOperateData(
|
|
|
YDParam.builder()
|
|
YDParam.builder()
|
|
|
.formInstanceId(formInstId)
|
|
.formInstanceId(formInstId)
|
|
|
.updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_ml08nk3y, textareaField_mkxqgrvq", code, msg)))
|
|
.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)
|
|
.formInstId(formInstId)
|
|
|
.build(), YDConf.FORM_QUERY.retrieve_id);
|
|
.build(), YDConf.FORM_QUERY.retrieve_id);
|
|
|
Map formData = ddrNew.getFormData();
|
|
Map formData = ddrNew.getFormData();
|
|
@@ -347,7 +348,7 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
|
|
|
String code = JSON.parseArray(responseBody)
|
|
String code = JSON.parseArray(responseBody)
|
|
|
.getJSONObject(0)
|
|
.getJSONObject(0)
|
|
|
.getString("code");
|
|
.getString("code");
|
|
|
- ydClient.operateData(
|
|
|
|
|
|
|
+ retryOperateData(
|
|
|
YDParam.builder()
|
|
YDParam.builder()
|
|
|
.formInstanceId(formInstId)
|
|
.formInstanceId(formInstId)
|
|
|
.updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_ml08nk3y, textareaField_mkxqgrvq, textField_mjs6fuwo", code, msg, jdbh)))
|
|
.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 formInstId = UtilMap.getString(map, "formInstId");
|
|
|
String khbm = UtilMap.getString(map, "khbm");
|
|
String khbm = UtilMap.getString(map, "khbm");
|
|
|
|
|
|
|
|
|
|
+ // 参数校验
|
|
|
|
|
+ if (StringUtils.isBlank(formInstId)) {
|
|
|
|
|
+ throw new RuntimeException("订单ID不能为空");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StringUtils.isBlank(khbm)) {
|
|
|
|
|
+ throw new RuntimeException("客户编号不能为空");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 1. 查询订单详情
|
|
// 1. 查询订单详情
|
|
|
- DDR_New ddrNew = ydClient.queryData(YDParam.builder()
|
|
|
|
|
|
|
+ DDR_New ddrNew = retryQueryData(YDParam.builder()
|
|
|
.formInstId(formInstId)
|
|
.formInstId(formInstId)
|
|
|
.build(), YDConf.FORM_QUERY.retrieve_id);
|
|
.build(), YDConf.FORM_QUERY.retrieve_id);
|
|
|
|
|
|
|
|
if (ddrNew == null || ddrNew.getFormData() == null) {
|
|
if (ddrNew == null || ddrNew.getFormData() == null) {
|
|
|
- throw new RuntimeException("未找到订单信息");
|
|
|
|
|
|
|
+ throw new RuntimeException("未找到订单信息,订单ID:" + formInstId);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Map formData1 = ddrNew.getFormData();
|
|
Map formData1 = ddrNew.getFormData();
|
|
|
String ddje = UtilMap.getString(formData1, "numberField_mfxv2vgj");
|
|
String ddje = UtilMap.getString(formData1, "numberField_mfxv2vgj");
|
|
|
|
|
|
|
|
- // 参数校验
|
|
|
|
|
|
|
+ // 订单金额校验
|
|
|
if (ddje == null || ddje.trim().isEmpty()) {
|
|
if (ddje == null || ddje.trim().isEmpty()) {
|
|
|
- throw new RuntimeException("订单金额不能为空");
|
|
|
|
|
|
|
+ throw new RuntimeException("订单金额不能为空,订单ID:" + formInstId);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 2. 计算订单金额(保留两位小数)
|
|
|
|
|
|
|
+ // 2. 计算订单金额
|
|
|
Double orderAmount = null;
|
|
Double orderAmount = null;
|
|
|
try {
|
|
try {
|
|
|
orderAmount = Double.parseDouble(ddje);
|
|
orderAmount = Double.parseDouble(ddje);
|
|
|
orderAmount = Math.round(orderAmount * 100.0) / 100.0;
|
|
orderAmount = Math.round(orderAmount * 100.0) / 100.0;
|
|
|
|
|
+
|
|
|
|
|
+ // 订单金额合理性校验
|
|
|
|
|
+ if (orderAmount < 0) {
|
|
|
|
|
+ throw new RuntimeException("订单金额不能为负数: " + orderAmount);
|
|
|
|
|
+ }
|
|
|
} catch (NumberFormatException e) {
|
|
} catch (NumberFormatException e) {
|
|
|
- throw new RuntimeException("订单金额格式错误: " + ddje);
|
|
|
|
|
|
|
+ throw new RuntimeException("订单金额格式错误: " + ddje, e);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ System.out.println("订单信息:订单ID=" + formInstId +
|
|
|
|
|
+ ", 订单金额=" + orderAmount +
|
|
|
|
|
+ ", 客户编号=" + khbm);
|
|
|
|
|
+
|
|
|
// 3. 查询客户历史信息
|
|
// 3. 查询客户历史信息
|
|
|
- List<Map> list = (List<Map>) ydClient.queryData(YDParam.builder()
|
|
|
|
|
|
|
+ Object result = retryQueryData(YDParam.builder()
|
|
|
.formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
|
|
.formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
|
|
|
.searchFieldJson(JSONObject.toJSONString(Arrays.asList(
|
|
.searchFieldJson(JSONObject.toJSONString(Arrays.asList(
|
|
|
new YDSearch("textField_mjm9k35n",
|
|
new YDSearch("textField_mjm9k35n",
|
|
@@ -417,120 +435,171 @@ public class KdYdOrderServiceImpl extends ServiceImpl<KdYdOrderMapper, KdYdOrder
|
|
|
)))
|
|
)))
|
|
|
.build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
|
|
.build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
|
|
|
|
|
|
|
|
|
|
+ List<Map> list = (List<Map>) result;
|
|
|
|
|
+
|
|
|
if (list == null || list.isEmpty()) {
|
|
if (list == null || list.isEmpty()) {
|
|
|
throw new RuntimeException("未找到客户信息,客户编号:" + khbm);
|
|
throw new RuntimeException("未找到客户信息,客户编号:" + khbm);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 4. 获取客户现有信息
|
|
|
|
|
|
|
+ // 4. 获取客户现有信息并进行数据完整性校验
|
|
|
Map customerData = (Map) list.get(0).get("formData");
|
|
Map customerData = (Map) list.get(0).get("formData");
|
|
|
Double historicalAmount = UtilMap.getDouble(customerData, "numberField_mjm9k35k");
|
|
Double historicalAmount = UtilMap.getDouble(customerData, "numberField_mjm9k35k");
|
|
|
Long dddateTimestampStr = UtilMap.getLong(customerData, "dateField_mjqkkcsg");
|
|
Long dddateTimestampStr = UtilMap.getLong(customerData, "dateField_mjqkkcsg");
|
|
|
Long sfdateTimestampStr = UtilMap.getLong(customerData, "dateField_mjm9k35l");
|
|
Long sfdateTimestampStr = UtilMap.getLong(customerData, "dateField_mjm9k35l");
|
|
|
|
|
+ String originalSelectFieldValue = UtilMap.getString(customerData, "selectField_l3nrjuq0");
|
|
|
|
|
+ String originalKhsx = UtilMap.getString(customerData, "selectField_mjsco9d4");
|
|
|
|
|
|
|
|
- // 参数校验
|
|
|
|
|
|
|
+ // 关键字段完整性校验
|
|
|
if (dddateTimestampStr == null) {
|
|
if (dddateTimestampStr == null) {
|
|
|
- throw new RuntimeException("最后成交日期不能为空");
|
|
|
|
|
|
|
+ throw new RuntimeException("最后成交日期不能为空,客户编号:" + khbm);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 处理历史金额
|
|
|
|
|
if (historicalAmount == null) {
|
|
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;
|
|
Double totalAmount = orderAmount + historicalAmount;
|
|
|
totalAmount = Math.round(totalAmount * 100.0) / 100.0;
|
|
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 +
|
|
System.out.println("金额计算:订单金额=" + orderAmount +
|
|
|
", 历史金额=" + historicalAmount +
|
|
", 历史金额=" + historicalAmount +
|
|
|
", 总金额=" + totalAmount);
|
|
", 总金额=" + totalAmount);
|
|
|
|
|
|
|
|
- // 6. 时间戳转换
|
|
|
|
|
|
|
+ // 6. 时间计算
|
|
|
long currentTimestamp = System.currentTimeMillis();
|
|
long currentTimestamp = System.currentTimeMillis();
|
|
|
- // 计算时间差(天数)
|
|
|
|
|
long currentToDdDays = (currentTimestamp - dddateTimestampStr) / (1000 * 60 * 60 * 24);
|
|
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 + "天" +
|
|
", 当前-成交相差=" + currentToDdDays + "天" +
|
|
|
", 公海-成交相差=" + sfToDdDays + "天");
|
|
", 公海-成交相差=" + sfToDdDays + "天");
|
|
|
|
|
|
|
|
|
|
+ // 7. 业务规则计算
|
|
|
String ghcDateTimestamp = null;
|
|
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) {
|
|
if (totalAmount >= 75000 && sfToDdDays <= 180) {
|
|
|
khsx = "自行开发";
|
|
khsx = "自行开发";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// 2. 第一个条件:当前时间-成交日期<90天 且 总金额>0 且 公海日期-成交日期≈180天
|
|
|
|
|
|
|
+ // 业务规则判断
|
|
|
if (currentToDdDays < 90 && totalAmount > 0 && Math.abs(sfToDdDays - 180) <= 1) {
|
|
if (currentToDdDays < 90 && totalAmount > 0 && Math.abs(sfToDdDays - 180) <= 1) {
|
|
|
- // 在成交日期上加90天
|
|
|
|
|
|
|
+ // 条件1:在成交日期上加90天
|
|
|
ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestampStr, 90));
|
|
ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestampStr, 90));
|
|
|
selectFieldValue = "半年金额不足";
|
|
selectFieldValue = "半年金额不足";
|
|
|
System.out.println("条件1触发:公海池时间设为成交日期+90天=" +
|
|
System.out.println("条件1触发:公海池时间设为成交日期+90天=" +
|
|
|
timestampToDateString(ghcDateTimestamp));
|
|
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));
|
|
ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestampStr, 180));
|
|
|
selectFieldValue = "半年金额不足";
|
|
selectFieldValue = "半年金额不足";
|
|
|
System.out.println("条件2触发:公海池时间设为成交日期+180天=" +
|
|
System.out.println("条件2触发:公海池时间设为成交日期+180天=" +
|
|
|
timestampToDateString(ghcDateTimestamp));
|
|
timestampToDateString(ghcDateTimestamp));
|
|
|
- }
|
|
|
|
|
-// 4. 第三个条件:金额<15万 且 公海日期-成交日期>180天
|
|
|
|
|
- else if (totalAmount < 150000 && sfToDdDays > 180) {
|
|
|
|
|
|
|
+ } else if (totalAmount < 150000 && sfToDdDays > 180) {
|
|
|
|
|
+ // 条件3:设置一年金额不足,但不设置公海池日期
|
|
|
selectFieldValue = "一年金额不足";
|
|
selectFieldValue = "一年金额不足";
|
|
|
System.out.println("条件3触发:金额<15万且公海日期>180天,设置一年金额不足");
|
|
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) {
|
|
if (totalAmount > 0) {
|
|
|
- // 基础情况:金额大于0
|
|
|
|
|
ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestampStr, 90));
|
|
ghcDateTimestamp = String.valueOf(calculateTimestamp(sfdateTimestampStr, 90));
|
|
|
selectFieldValue = "半年金额不足";
|
|
selectFieldValue = "半年金额不足";
|
|
|
System.out.println("基础情况:金额大于0,公海池时间+90天=" +
|
|
System.out.println("基础情况:金额大于0,公海池时间+90天=" +
|
|
|
timestampToDateString(ghcDateTimestamp));
|
|
timestampToDateString(ghcDateTimestamp));
|
|
|
} else if (totalAmount < 75000) {
|
|
} else if (totalAmount < 75000) {
|
|
|
- // 金额 < 7.5万
|
|
|
|
|
selectFieldValue = "半年金额不足";
|
|
selectFieldValue = "半年金额不足";
|
|
|
System.out.println("金额<7.5万,但未设置公海池时间");
|
|
System.out.println("金额<7.5万,但未设置公海池时间");
|
|
|
} else if (totalAmount < 150000) {
|
|
} else if (totalAmount < 150000) {
|
|
|
- // 7.5万 ≤ 金额 < 15万
|
|
|
|
|
selectFieldValue = "一年金额不足";
|
|
selectFieldValue = "一年金额不足";
|
|
|
System.out.println("金额7.5-15万,但未设置公海池时间");
|
|
System.out.println("金额7.5-15万,但未设置公海池时间");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
- // 8. 构建更新数据
|
|
|
|
|
|
|
+ // 8. 构建更新数据(只更新需要变更的字段)
|
|
|
Map<String, Object> formData = new HashMap<>();
|
|
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) {
|
|
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 {
|
|
} 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")
|
|
.formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
|
|
|
.appType("APP_VQDMMWS6OR1VHL8VMFD3")
|
|
.appType("APP_VQDMMWS6OR1VHL8VMFD3")
|
|
|
.systemToken("XE766X81JHKXK4Z27SYOI86CPCLQ3J1LV7ODMH2")
|
|
.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())
|
|
return new BigDecimal(number.toString())
|
|
|
.setScale(2, RoundingMode.HALF_UP);
|
|
.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);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|