From 6cc444a4d57137e991ea449fff7ca66b872975b3 Mon Sep 17 00:00:00 2001 From: Guoqs <123456@jsowell.com> Date: Thu, 12 Mar 2026 15:23:32 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E6=89=B9=E9=87=8F=E6=8F=92=E5=85=A5?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/AdapayUnsplitRecordMapper.java | 2 ++ .../service/AdapayUnsplitRecordService.java | 2 ++ .../pile/AdapayUnsplitRecordServiceImpl.java | 5 +++ .../mapper/pile/AdapayUnsplitRecordMapper.xml | 26 +++++++++++++++ .../com/jsowell/quartz/task/JsowellTask.java | 32 +++++++++++++++++-- 5 files changed, 65 insertions(+), 2 deletions(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayUnsplitRecordMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayUnsplitRecordMapper.java index 60e7f9218..b4df2b4ce 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayUnsplitRecordMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/AdapayUnsplitRecordMapper.java @@ -31,6 +31,8 @@ public interface AdapayUnsplitRecordMapper { int batchInsert(@Param("list") List list); + int batchInsertOrUpdateSelective(@Param("list") List list); + List queryUnsplitOrders(@Param("startTime") String startTime, @Param("endTime") String endTime); List queryList(); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayUnsplitRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayUnsplitRecordService.java index ba7d84052..39483bbbc 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayUnsplitRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/AdapayUnsplitRecordService.java @@ -28,6 +28,8 @@ public interface AdapayUnsplitRecordService{ int batchInsert(List list); + int batchInsertOrUpdateSelective(List list); + List queryUnsplitOrders(String startTime, String endTime); List queryList(); diff --git a/jsowell-pile/src/main/java/com/jsowell/web/controller/pile/AdapayUnsplitRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/web/controller/pile/AdapayUnsplitRecordServiceImpl.java index b3b26b4d6..b418b9573 100644 --- a/jsowell-pile/src/main/java/com/jsowell/web/controller/pile/AdapayUnsplitRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/web/controller/pile/AdapayUnsplitRecordServiceImpl.java @@ -69,6 +69,11 @@ public class AdapayUnsplitRecordServiceImpl implements AdapayUnsplitRecordServic return adapayUnsplitRecordMapper.batchInsert(list); } + @Override + public int batchInsertOrUpdateSelective(List list) { + return adapayUnsplitRecordMapper.batchInsertOrUpdateSelective(list); + } + @Override public List queryUnsplitOrders(String startTime, String endTime) { return adapayUnsplitRecordMapper.queryUnsplitOrders(startTime, endTime); diff --git a/jsowell-pile/src/main/resources/mapper/pile/AdapayUnsplitRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/AdapayUnsplitRecordMapper.xml index 9cc93db45..306f82ee1 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/AdapayUnsplitRecordMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/AdapayUnsplitRecordMapper.xml @@ -447,6 +447,32 @@ #{item.id,jdbcType=INTEGER} + + insert into adapay_unsplit_record + (merchant_code, pay_time, payment_id, order_no, pay_amount, confirmed_split_amount, + refund_amount, payment_revoke_amount, remaining_split_amount, order_code, pile_type, + due_refund_amount, settle_amount, refund_flag, split_flag, update_time) + values + + (#{item.merchantCode,jdbcType=VARCHAR}, #{item.payTime,jdbcType=TIMESTAMP}, #{item.paymentId,jdbcType=VARCHAR}, + #{item.orderNo,jdbcType=VARCHAR}, #{item.payAmount,jdbcType=DECIMAL}, #{item.confirmedSplitAmount,jdbcType=DECIMAL}, + #{item.refundAmount,jdbcType=DECIMAL}, #{item.paymentRevokeAmount,jdbcType=DECIMAL}, + #{item.remainingSplitAmount,jdbcType=DECIMAL}, #{item.orderCode,jdbcType=VARCHAR}, + #{item.pileType,jdbcType=VARCHAR}, #{item.dueRefundAmount,jdbcType=DECIMAL}, #{item.settleAmount,jdbcType=DECIMAL}, + #{item.refundFlag,jdbcType=VARCHAR}, #{item.splitFlag,jdbcType=VARCHAR}, #{item.updateTime,jdbcType=TIMESTAMP}) + + on duplicate key update + merchant_code = values(merchant_code), + pay_time = values(pay_time), + order_no = values(order_no), + pay_amount = values(pay_amount), + confirmed_split_amount = values(confirmed_split_amount), + refund_amount = values(refund_amount), + payment_revoke_amount = values(payment_revoke_amount), + remaining_split_amount = values(remaining_split_amount), + order_code = values(order_code), + update_time = values(update_time) + insert into adapay_unsplit_record diff --git a/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java b/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java index fc3c33358..a3aedb869 100644 --- a/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java +++ b/jsowell-quartz/src/main/java/com/jsowell/quartz/task/JsowellTask.java @@ -528,15 +528,25 @@ public class JsowellTask { * 默认文件路径:doc/万车充小程序-未分账明细.xlsx * jsowellTask.importAdapayUnsplitRecordAndCompleteFields() */ + /** + * 从默认路径导入未分账明细并补齐缺失字段(无参入口) + * 默认读取 doc/万车充小程序-未分账明细.xlsx(相对于工作目录) + * jsowellTask.importAdapayUnsplitRecordAndCompleteFields() + */ public void importAdapayUnsplitRecordAndCompleteFields() { importAdapayUnsplitRecordAndCompleteFields("doc/万车充小程序-未分账明细.xlsx"); } /** * 从Excel导入adapay_unsplit_record,并补齐缺失字段 + * 流程: + * 1. 校验文件路径(相对路径自动拼接工作目录转为绝对路径) + * 2. 解析Excel,逐行转换为 AdapayUnsplitRecord,调用 insertOrUpdateSelective 写入数据库 + * 3. 以导入数据的支付时间范围为条件,分页查询已入库记录,补齐 orderCode/退款金额/结算金额/桩类型等缺失字段 * jsowellTask.importAdapayUnsplitRecordAndCompleteFields(文件路径) */ public void importAdapayUnsplitRecordAndCompleteFields(String filePath) { + // 相对路径转绝对路径(基于 JVM 工作目录) Path path = Paths.get(filePath); if (!path.isAbsolute()) { path = Paths.get(System.getProperty("user.dir"), filePath); @@ -546,6 +556,7 @@ public class JsowellTask { return; } + // 第一步:读取Excel,将每行数据 insertOrUpdate 到 adapay_unsplit_record 表 ImportSummary summary = importAdapayUnsplitRecord(path); if (summary.successRows == 0) { @@ -553,6 +564,8 @@ public class JsowellTask { return; } + // 第二步:以导入数据中最早/最晚支付时间为范围,补齐已入库记录的缺失字段 + // 若 Excel 中无有效支付时间,则使用兜底时间范围(2024-01-01 至当前时间) String startTime = summary.minPayTime == null ? "2024-01-01 00:00:00" : DateUtils.formatDateTime(summary.minPayTime); @@ -564,6 +577,8 @@ public class JsowellTask { log.info("导入并补齐未分账数据完成, 导入统计:{}, 补齐更新:{}条", summary, updatedCount); } + private static final int IMPORT_BATCH_SIZE = 500; + private ImportSummary importAdapayUnsplitRecord(Path filePath) { ImportSummary summary = new ImportSummary(); DataFormatter formatter = new DataFormatter(); @@ -595,6 +610,8 @@ public class JsowellTask { int firstDataRow = sheet.getFirstRowNum() + 1; int lastDataRow = sheet.getLastRowNum(); + // 批量收集记录,每 IMPORT_BATCH_SIZE 条执行一次批量 upsert,减少数据库交互次数 + List batch = new ArrayList<>(IMPORT_BATCH_SIZE); for (int rowNum = firstDataRow; rowNum <= lastDataRow; rowNum++) { Row row = sheet.getRow(rowNum); if (row == null || isRowEmpty(row)) { @@ -608,9 +625,15 @@ public class JsowellTask { summary.skippedRows++; continue; } - adapayUnsplitRecordService.insertOrUpdateSelective(record); - summary.successRows++; + batch.add(record); summary.updatePayTimeRange(record.getPayTime()); + + // 达到批量大小时执行一次批量写入 + if (batch.size() >= IMPORT_BATCH_SIZE) { + adapayUnsplitRecordService.batchInsertOrUpdateSelective(batch); + summary.successRows += batch.size(); + batch.clear(); + } } catch (Exception e) { summary.failedRows++; log.error("导入未分账数据失败, rowNum:{}, file:{}", rowNum + 1, filePath.toAbsolutePath(), e); @@ -621,6 +644,11 @@ public class JsowellTask { summary.totalRows, summary.successRows, summary.skippedRows, summary.failedRows); } } + // 处理剩余不足一批的记录 + if (!batch.isEmpty()) { + adapayUnsplitRecordService.batchInsertOrUpdateSelective(batch); + summary.successRows += batch.size(); + } } catch (Exception e) { log.error("导入未分账数据失败, file:{}", filePath.toAbsolutePath(), e); }