Kaynağa Gözat

固话导入

HULEI 2 hafta önce
ebeveyn
işleme
60e8a32699

+ 55 - 36
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/event/DataWindowImportAfterEvent.java

@@ -18,9 +18,9 @@ import java.util.*;
 /**
  * 数据导入后事件处理类(全数据库驱动,精确到天,4位小数,兼容DATETIME时间戳)
  * 功能:查询当天代缴费数据,匹配合同ID,更新对应账期的合同周期金额
+ * 金额计算逻辑:ISP_TOTAL + SERVICE_FEE
  */
 public class DataWindowImportAfterEvent extends DataWindowAfterImport {
-    // ====================== 全局静态常量(统一配置,方便维护) =======================
     // 日期格式化常量:核心精确到天,兼容账期转换
     private static final DateTimeFormatter FORMATTER_DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 当前时间(精确到天)
     private static final DateTimeFormatter FORMATTER_YEAR_MONTH_DASH = DateTimeFormatter.ofPattern("yyyy-MM"); // 账期格式1(带横杠)
@@ -36,29 +36,28 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
     private static final String FIELD_CONTRACT_SERVICE_ID = "CONTRACT_SERVICE_ID"; // 合同服务ID(唯一标识)
     private static final String FIELD_PERIOD_PRICE = "PERIOD_PRICE"; // 周期金额(待更新字段)
     private static final String FIELD_REFERENCE_NUMBER = "REFERENCE_NUMBER"; // 参考编号(提取手机号后四位)
-    private static final String FIELD_EXTENDED_PRICE = "EXTENDED_PRICE"; // 含税总金额(数据来源:代缴费表)
+    // 替换为新的金额字段
+    private static final String FIELD_ISP_TOTAL = "ISP_TOTAL"; // ISP总金额
+    private static final String FIELD_SERVICE_FEE = "SERVICE_FEE"; // 服务费
     private static final String FIELD_CREATE_DATE = "CREATEDATE"; // 创建时间(查询条件:代缴费表)
     private static final String FIELD_PHONE = "PHONE"; // 完整手机号(代缴费表)
     private static final String FIELD_FEE_DATE = "FEE_DATE"; // 账期(代缴费表)
 
-    // 提示信息常量(统一日志输出,便于问题排查)
     private static final String MSG_NO_CURRENT_DATA = "未查询到当天(" + LocalDate.now().format(FORMATTER_DATE) + ")的有效代缴费数据";
     private static final String MSG_NO_CONTRACT_ID = "未匹配到对应的合同服务ID";
     private static final String MSG_FEE_DATE_FORMAT_ERROR = "账期格式错误(需为yyyy-MM或yyyyMM格式)";
     private static final String MSG_NO_VALID_DATA = "无有效数据可进行后续处理";
     private static final String MSG_PROCESS_COMPLETE = "处理完成:更新周期表%d条数据";
 
-    // ====================== 构造方法(平台要求:必须存在无参构造器) =======================
+    // 构造方法(平台要求:必须存在无参构造器)
     public DataWindowImportAfterEvent() {
         super();
     }
 
-    // ====================== 简单日志方法(无SDK依赖,控制台输出详细信息) =======================
     private static void log(String msg) {
         System.out.println("[DataWindowImportAfterEvent] " + msg);
     }
 
-    // ====================== 核心业务方法(重写平台导入事件,全数据库驱动执行) =======================
     @Override
     public void excute(UserContext userContext, String processDefId, String formDefId, List<ImportModel> importModels, String type, Map<String, Object> extendParams) {
         // 1. 获取当前系统日期(精确到天),作为数据库查询核心条件
@@ -74,7 +73,7 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
         }
         log("查询到当天代缴费记录共:" + proxyPayList.size() + " 条");
 
-        // 3. 整理数据库返回数据(格式化、去重、过滤无效数据,4位小数)
+        // 3. 整理数据库返回数据
         Map<String, BigDecimal> phoneAmountMap = new HashMap<>(); // 手机号后四位 → 4位小数含税金额
         Map<String, String> phoneFeeDateMap = new HashMap<>();    // 手机号后四位 → 账期
         Set<String> phoneLast4Set = new HashSet<>();               // 去重手机号后四位集合
@@ -95,8 +94,8 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
                 continue;
             }
 
-            // 3.3 提取并格式化金额(兼容多类型,保留4位小数,四舍五入)
-            BigDecimal amount = formatAmountFromRow(row);
+            // 3.3 计算金额:ISP_TOTAL + SERVICE_FEE(保留4位小数,四舍五入)
+            BigDecimal amount = calculateAmountFromRow(row);
             if (amount.compareTo(BigDecimal.ZERO) == 0) {
                 log("【数据过滤】金额无效(为0或转换失败),跳过当前记录(手机号后四位:" + phoneLast4 + ")");
                 continue;
@@ -125,7 +124,7 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
         }
         log("匹配到有效合同服务ID共:" + phoneContractMap.size() + " 个");
 
-        // 6. 转换为合同ID-金额映射(提取基准账期,用于后续日期转换)
+        // 6. 转换为合同ID-金额映射
         Map<String, BigDecimal> contractAmountMap = new HashMap<>();
         String targetFeeDate = ""; // 基准账期(取第一个有效账期)
 
@@ -135,18 +134,18 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
             // 金额保留4位小数,兜底格式化(防止数据异常)
             BigDecimal amount = phoneAmountMap.getOrDefault(phoneLast4, BigDecimal.ZERO).setScale(4, RoundingMode.HALF_UP);
 
-            // 过滤无效金额(大于0才参与更新)
+            // 过滤无效金额
             if (amount.compareTo(BigDecimal.ZERO) > 0) {
                 contractAmountMap.put(contractId, amount);
             }
 
-            // 提取基准账期(仅取第一个有效值,用于统一转换周期)
+            // 提取基准账期
             if (StringUtils.isBlank(targetFeeDate)) {
                 targetFeeDate = phoneFeeDateMap.getOrDefault(phoneLast4, "");
             }
         }
 
-        // 7. 账期转换为当月起止日期(精准更新对应周期,兼容两种账期格式)
+        // 7. 账期转换为当月起止日期
         Map<String, String> periodDateMap = convertFeeDateToPeriod(targetFeeDate);
         if (periodDateMap == null) {
             log(MSG_FEE_DATE_FORMAT_ERROR);
@@ -157,14 +156,13 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
         String periodEndDate = periodDateMap.get("end");
         log("账期转换完成,更新周期范围:" + periodBeginDate + " 至 " + periodEndDate);
 
-        // 8. 批量更新合同服务周期表(核心落地步骤,兼容DATETIME时间戳)
+        // 8. 批量更新合同服务周期表
         int updatedCount = batchUpdateContractPeriod(contractAmountMap, periodBeginDate, periodEndDate);
 
         // 9. 打印最终处理结果,流程闭环
         log("===== 业务处理完成,共更新合同周期表 " + updatedCount + " 条数据 =====");
     }
 
-    // ====================== 工具方法(各司其职,解耦主流程,无报错兼容) =======================
     /**
      * 核心:以当前日期(精确到天)为条件,查询代缴费表当天所有有效数据
      * 忽略CREATE_DATE的时分秒,避免因时间戳差异导致数据遗漏
@@ -173,7 +171,8 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
      */
     private List<RowMap> getProxyPayDataByCurrentDate(String currentDate) {
         // SQL优化:使用DATE()函数提取日期部分,兼容DATETIME/DATE类型字段
-        String sql = "SELECT " + FIELD_PHONE + ", " + FIELD_FEE_DATE + ", " + FIELD_EXTENDED_PRICE + ", " + FIELD_CREATE_DATE +
+        // 替换查询字段:EXTENDED_PRICE → ISP_TOTAL + SERVICE_FEE
+        String sql = "SELECT " + FIELD_PHONE + ", " + FIELD_FEE_DATE + ", " + FIELD_ISP_TOTAL + ", " + FIELD_SERVICE_FEE + ", " + FIELD_CREATE_DATE +
                 " FROM " + TABLE_PROXY_PAY +
                 " WHERE DATE(" + FIELD_CREATE_DATE + ") = ?"; // 忽略时分秒,精准匹配当天所有记录
 
@@ -182,34 +181,54 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
     }
 
     /**
-     * 格式化从RowMap中提取的金额(兼容BigDecimal/Number/String类型,避免转换报错)
+     * 计算金额:ISP_TOTAL + SERVICE_FEE(兼容多类型,避免转换报错)
      * 最终保留4位小数,四舍五入,符合高精度财务需求
      * @param row 数据库查询结果行
      * @return 格式化后的4位小数金额
      */
-    private BigDecimal formatAmountFromRow(RowMap row) {
-        Object amountObj = row.get(FIELD_EXTENDED_PRICE);
-        BigDecimal amount = BigDecimal.ZERO;
+    private BigDecimal calculateAmountFromRow(RowMap row) {
+        // 提取ISP_TOTAL字段值并转换
+        BigDecimal ispTotal = getBigDecimalFromRow(row, FIELD_ISP_TOTAL);
+        // 提取SERVICE_FEE字段值并转换
+        BigDecimal serviceFee = getBigDecimalFromRow(row, FIELD_SERVICE_FEE);
 
-        if (amountObj != null) {
+        // 计算总和并保留4位小数
+        BigDecimal totalAmount = ispTotal.add(serviceFee).setScale(4, RoundingMode.HALF_UP);
+
+        log("【金额计算】ISP_TOTAL=" + ispTotal + ", SERVICE_FEE=" + serviceFee + ", 合计=" + totalAmount);
+        return totalAmount;
+    }
+
+    /**
+     * 从RowMap中提取指定字段并转换为BigDecimal(兼容各种数据类型)
+     * @param row 数据库行数据
+     * @param fieldName 字段名
+     * @return 转换后的BigDecimal,默认值为0
+     */
+    private BigDecimal getBigDecimalFromRow(RowMap row, String fieldName) {
+        Object valueObj = row.get(fieldName);
+        BigDecimal value = BigDecimal.ZERO;
+
+        if (valueObj != null) {
             try {
-                if (amountObj instanceof BigDecimal) {
-                    amount = (BigDecimal) amountObj;
-                } else if (amountObj instanceof Number) {
+                if (valueObj instanceof BigDecimal) {
+                    value = (BigDecimal) valueObj;
+                } else if (valueObj instanceof Number) {
                     // 兼容Integer/Double/Long/Float等所有数值类型
-                    amount = BigDecimal.valueOf(((Number) amountObj).doubleValue());
+                    value = BigDecimal.valueOf(((Number) valueObj).doubleValue());
                 } else {
                     // 兼容字符串类型金额,去除首尾空格后转换
-                    amount = new BigDecimal(amountObj.toString().trim());
+                    String valueStr = valueObj.toString().trim();
+                    if (StringUtils.isNotBlank(valueStr)) {
+                        value = new BigDecimal(valueStr);
+                    }
                 }
             } catch (NumberFormatException e) {
-                log("【金额转换异常】无效金额值,转换失败:" + amountObj.toString());
-                amount = BigDecimal.ZERO;
+                log("【字段转换异常】字段" + fieldName + "值无效,转换失败:" + valueObj.toString());
+                value = BigDecimal.ZERO;
             }
         }
-
-        // 格式化金额:保留4位小数,四舍五入(符合高精度财务数据规范)
-        return amount.setScale(4, RoundingMode.HALF_UP);
+        return value;
     }
 
     /**
@@ -224,7 +243,7 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
         }
 
         try {
-            // 动态拼接IN条件SQL,批量查询(避免循环单条查询,提升性能)
+            // 动态拼接IN条件SQL,批量查询
             StringBuilder sqlBuilder = new StringBuilder("SELECT RIGHT(" + FIELD_REFERENCE_NUMBER + ",4) AS REF_LAST4, " +
                     FIELD_CONTRACT_SERVICE_ID + " FROM " + TABLE_INSTALLED_PRODUCT + " WHERE RIGHT(" +
                     FIELD_REFERENCE_NUMBER + ",4) IN (");
@@ -244,7 +263,7 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
                 String refLast4 = row.getString("REF_LAST4");
                 String contractId = row.getString(FIELD_CONTRACT_SERVICE_ID);
 
-                // 过滤无效数据,封装有效映射(非空判断)
+                // 过滤无效数据,封装有效映射
                 if (StringUtils.isNoneBlank(refLast4, contractId)) {
                     refLast4 = refLast4.trim();
                     contractId = contractId.trim();
@@ -271,7 +290,7 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
         }
 
         try {
-            // 解析账期为YearMonth对象,兼容两种常见格式
+            // 解析账期为YearMonth对象,兼容两种格式
             YearMonth feeYearMonth = feeDate.contains("-") ?
                     YearMonth.parse(feeDate, FORMATTER_YEAR_MONTH_DASH) :
                     YearMonth.parse(feeDate, FORMATTER_YEAR_MONTH_NO_DASH);
@@ -323,7 +342,7 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
                 contractIdList.add(contractId);
             }
 
-            // 拼接WHERE条件(限定合同ID和周期日期范围,避免误改数据,兼容DATETIME时间戳)
+            // 拼接WHERE条件
             sqlBuilder.append("END WHERE ").append(FIELD_CONTRACT_SERVICE_ID).append(" IN (");
             for (int i = 0; i < contractIdList.size(); i++) {
                 if (i > 0) {
@@ -333,7 +352,7 @@ public class DataWindowImportAfterEvent extends DataWindowAfterImport {
             }
             sqlBuilder.append(") AND DATE(PERIOD_BEGIN_DATE) >= ? AND DATE(PERIOD_END_DATE) <= ?");
 
-            // 追加WHERE条件参数(合同ID列表 + 周期起止日期)
+            // 追加WHERE条件参数
             batchParams.addAll(contractIdList);
             batchParams.add(periodBeginDate);
             batchParams.add(periodEndDate);