Ver código fonte

fix: 消费金额统计接口今天/7天为0 — gmt_recieve_pay全NULL改用gmt_biz_create

根因:pay_bill.gmt_recieve_pay全部为NULL,SQL中NULL>=CURRENT_DATE永远走ELSE 0,
导致amount_of_today和amount_of_7days恒为0。

修复:
- PayBillMapper: 时间列从gmt_recieve_pay改为gmt_biz_create,CURRENT_DATE改为应用层参数#{today}/#{weekAgo}
- AccountService: 计算北京时间窗口传入mapper,与转账/当面付统计保持一致
alphaH 2 dias atrás
pai
commit
bdb22b2f3f

+ 6 - 1
java/src/main/java/com/payment/platform/module/payment/account/service/AccountService.java

@@ -83,9 +83,14 @@ public class AccountService {
      * 统计消费金额 — 查询 pay_bill 表 (consume_type=CONSUME, status=PROCESSED)
      *
      * Python 对应: stat_consume_amount_service
+     *
+     * 时间窗口由应用层计算(北京时间),避免 PostgreSQL CURRENT_DATE 的时区问题。
+     * 使用 gmt_biz_create 而非 gmt_recieve_pay,因为后者在通知回调中可能为空。
      */
     public Map<String, String> statConsumeAmount(Long tenantId, String enterpriseId, String payeeType) {
-        Map<String, BigDecimal> amounts = payBillMapper.statConsumeAmount(tenantId, enterpriseId, payeeType);
+        OffsetDateTime today = LocalDate.now().atStartOfDay(ZoneOffset.ofHours(8)).toOffsetDateTime();
+        OffsetDateTime weekAgo = today.minusDays(7);
+        Map<String, BigDecimal> amounts = payBillMapper.statConsumeAmount(tenantId, enterpriseId, payeeType, today, weekAgo);
         return Map.of(
                 "amount_of_today", amounts.getOrDefault("amount_of_today", BigDecimal.ZERO).toPlainString(),
                 "amount_of_7days", amounts.getOrDefault("amount_of_7days", BigDecimal.ZERO).toPlainString(),

+ 8 - 3
java/src/main/java/com/payment/platform/module/payment/notification/mapper/PayBillMapper.java

@@ -18,13 +18,16 @@ public interface PayBillMapper extends BaseMapper<PayBillEntity> {
      * 统计消费金额 — 对应 Python stat_consume_amount_service
      * 查询 pay_bill 表 (consume_type=CONSUME, status=PROCESSED)
      * 单次 SQL 完成三个时间窗口聚合(参考 doStatAmount 模式)
+     *
+     * 使用 gmt_biz_create(业务创建时间)而非 gmt_recieve_pay(收款时间),
+     * 因为 gmt_recieve_pay 在通知回调中可能为空。时间戳由应用层传入,避免 CURRENT_DATE 时区问题。
      */
     @Select("""
             <script>
             SELECT
-              COALESCE(SUM(CASE WHEN gmt_recieve_pay >= CURRENT_DATE
+              COALESCE(SUM(CASE WHEN gmt_biz_create >= #{today}
                 THEN consume_amount ELSE 0 END), 0) as amount_of_today,
-              COALESCE(SUM(CASE WHEN gmt_recieve_pay >= CURRENT_DATE - INTERVAL '7 days'
+              COALESCE(SUM(CASE WHEN gmt_biz_create >= #{weekAgo}
                 THEN consume_amount ELSE 0 END), 0) as amount_of_7days,
               COALESCE(SUM(consume_amount), 0) as amount_of_all
             FROM pay_bill
@@ -42,7 +45,9 @@ public interface PayBillMapper extends BaseMapper<PayBillEntity> {
             """)
     Map<String, BigDecimal> statConsumeAmount(@Param("tenantId") Long tenantId,
                                                @Param("enterpriseId") String enterpriseId,
-                                               @Param("payeeType") String payeeType);
+                                               @Param("payeeType") String payeeType,
+                                               @Param("today") java.time.OffsetDateTime today,
+                                               @Param("weekAgo") java.time.OffsetDateTime weekAgo);
 
     /**
      * 原子 upsert(通知处理用,跳过租户过滤)

+ 3 - 1
java/src/main/java/com/payment/platform/module/payment/serviceprovider/enums/ServiceProviderBizType.java

@@ -12,7 +12,9 @@ public enum ServiceProviderBizType {
     FACETOFACE_AGENT("FACETOFACE_AGENT"),
 
     /** 当面付收款通知 */
-    FACETOFACE_NOTIFY("FACETOFACE_NOTIFY");
+    FACETOFACE_NOTIFY("FACETOFACE_NOTIFY"),
+
+    TRANSFER("TRANSFER");
 
     private final String value;