mirror of
https://gitee.com/dromara/dax-pay
synced 2026-08-12 15:35:38 +08:00
refactor(dashboard): 报表 Mapper @Select 改为 text block
利用 Java text block 提升多行 SQL 可读性,语义与占位符不变。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -32,126 +32,146 @@ public interface AdminTradeReportMapper extends MPJBaseMapper<PayTrade> {
|
||||
// ===== 概览 =====
|
||||
|
||||
/// 成交聚合: 按 pay_time 过滤, 填充 success_amount / success_count
|
||||
@Select("SELECT COALESCE(SUM(posted_amount), 0)::bigint AS success_amount, "
|
||||
+ "COUNT(*)::bigint AS success_count "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE status = 'success' AND posted_amount > 0 "
|
||||
+ "AND pay_time >= #{start} AND pay_time < #{end}")
|
||||
@Select("""
|
||||
SELECT COALESCE(SUM(posted_amount), 0)::bigint AS success_amount,
|
||||
COUNT(*)::bigint AS success_count
|
||||
FROM pay_trade
|
||||
WHERE status = 'success' AND posted_amount > 0
|
||||
AND pay_time >= #{start} AND pay_time < #{end}
|
||||
""")
|
||||
TradeOverviewResult successAggregate(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end);
|
||||
|
||||
/// 总下单笔数聚合: 按 create_time 过滤, 填充 total_orders
|
||||
@Select("SELECT COUNT(*)::bigint AS total_orders "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE create_time >= #{start} AND create_time < #{end}")
|
||||
@Select("""
|
||||
SELECT COUNT(*)::bigint AS total_orders
|
||||
FROM pay_trade
|
||||
WHERE create_time >= #{start} AND create_time < #{end}
|
||||
""")
|
||||
TradeOverviewResult totalOrdersAggregate(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end);
|
||||
|
||||
/// 退款聚合
|
||||
@Select("SELECT COALESCE(SUM(amount), 0)::bigint AS refund_amount, "
|
||||
+ "COUNT(*)::bigint AS refund_count "
|
||||
+ "FROM pay_refund_order "
|
||||
+ "WHERE status = 'success' "
|
||||
+ "AND finish_time >= #{start} AND finish_time < #{end}")
|
||||
@Select("""
|
||||
SELECT COALESCE(SUM(amount), 0)::bigint AS refund_amount,
|
||||
COUNT(*)::bigint AS refund_count
|
||||
FROM pay_refund_order
|
||||
WHERE status = 'success'
|
||||
AND finish_time >= #{start} AND finish_time < #{end}
|
||||
""")
|
||||
TradeOverviewResult refundAggregate(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end);
|
||||
|
||||
// ===== 趋势 =====
|
||||
|
||||
@Select("SELECT TO_CHAR(pay_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, "
|
||||
+ "COALESCE(SUM(posted_amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS count "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE status = 'success' AND posted_amount > 0 "
|
||||
+ "AND pay_time >= #{start} AND pay_time < #{end} "
|
||||
+ "GROUP BY 1 ORDER BY 1")
|
||||
@Select("""
|
||||
SELECT TO_CHAR(pay_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date,
|
||||
COALESCE(SUM(posted_amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS count
|
||||
FROM pay_trade
|
||||
WHERE status = 'success' AND posted_amount > 0
|
||||
AND pay_time >= #{start} AND pay_time < #{end}
|
||||
GROUP BY 1 ORDER BY 1
|
||||
""")
|
||||
List<TradeTrendItemResult> trend(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end);
|
||||
|
||||
@Select("SELECT TO_CHAR(finish_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, "
|
||||
+ "COALESCE(SUM(amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS count "
|
||||
+ "FROM pay_refund_order "
|
||||
+ "WHERE status = 'success' "
|
||||
+ "AND finish_time >= #{start} AND finish_time < #{end} "
|
||||
+ "GROUP BY 1 ORDER BY 1")
|
||||
@Select("""
|
||||
SELECT TO_CHAR(finish_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date,
|
||||
COALESCE(SUM(amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS count
|
||||
FROM pay_refund_order
|
||||
WHERE status = 'success'
|
||||
AND finish_time >= #{start} AND finish_time < #{end}
|
||||
GROUP BY 1 ORDER BY 1
|
||||
""")
|
||||
List<RefundTrendItemResult> refundTrend(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end);
|
||||
|
||||
// ===== 渠道分布 =====
|
||||
|
||||
@Select("SELECT provider, "
|
||||
+ "COALESCE(SUM(posted_amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS count "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE status = 'success' AND posted_amount > 0 "
|
||||
+ "AND provider IS NOT NULL "
|
||||
+ "AND pay_time >= #{start} AND pay_time < #{end} "
|
||||
+ "GROUP BY provider ORDER BY amount DESC")
|
||||
@Select("""
|
||||
SELECT provider,
|
||||
COALESCE(SUM(posted_amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS count
|
||||
FROM pay_trade
|
||||
WHERE status = 'success' AND posted_amount > 0
|
||||
AND provider IS NOT NULL
|
||||
AND pay_time >= #{start} AND pay_time < #{end}
|
||||
GROUP BY provider ORDER BY amount DESC
|
||||
""")
|
||||
List<ProviderDistItemResult> providerDist(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end);
|
||||
|
||||
@Select("SELECT provider, "
|
||||
+ "ROUND(COUNT(*) FILTER (WHERE status = 'success' AND posted_amount > 0)::numeric "
|
||||
+ " / NULLIF(COUNT(*), 0) * 100, 1) AS rate "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE provider IS NOT NULL "
|
||||
+ "AND create_time >= #{start} AND create_time < #{end} "
|
||||
+ "GROUP BY provider "
|
||||
+ "HAVING COUNT(*) > 0 "
|
||||
+ "ORDER BY rate DESC")
|
||||
@Select("""
|
||||
SELECT provider,
|
||||
ROUND(COUNT(*) FILTER (WHERE status = 'success' AND posted_amount > 0)::numeric
|
||||
/ NULLIF(COUNT(*), 0) * 100, 1) AS rate
|
||||
FROM pay_trade
|
||||
WHERE provider IS NOT NULL
|
||||
AND create_time >= #{start} AND create_time < #{end}
|
||||
GROUP BY provider
|
||||
HAVING COUNT(*) > 0
|
||||
ORDER BY rate DESC
|
||||
""")
|
||||
List<ProviderSuccessItemResult> providerSuccess(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end);
|
||||
|
||||
// ===== 时段分布 =====
|
||||
|
||||
@Select("SELECT EXTRACT(HOUR FROM pay_time AT TIME ZONE 'Asia/Shanghai')::int AS hour, "
|
||||
+ "COALESCE(SUM(posted_amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS count "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE status = 'success' AND posted_amount > 0 "
|
||||
+ "AND pay_time >= #{start} AND pay_time < #{end} "
|
||||
+ "GROUP BY 1 ORDER BY 1")
|
||||
@Select("""
|
||||
SELECT EXTRACT(HOUR FROM pay_time AT TIME ZONE 'Asia/Shanghai')::int AS hour,
|
||||
COALESCE(SUM(posted_amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS count
|
||||
FROM pay_trade
|
||||
WHERE status = 'success' AND posted_amount > 0
|
||||
AND pay_time >= #{start} AND pay_time < #{end}
|
||||
GROUP BY 1 ORDER BY 1
|
||||
""")
|
||||
List<HourlyDistItemResult> hourlyDist(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end);
|
||||
|
||||
// ===== 金额区间分桶 =====
|
||||
|
||||
@Select("SELECT CASE "
|
||||
+ "WHEN amount < 5000 THEN '0-50' "
|
||||
+ "WHEN amount < 20000 THEN '50-200' "
|
||||
+ "WHEN amount < 100000 THEN '200-1000' "
|
||||
+ "WHEN amount < 500000 THEN '1000-5000' "
|
||||
+ "ELSE '5000+' END AS bucket, "
|
||||
+ "COUNT(*)::bigint AS count "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE status = 'success' AND posted_amount > 0 "
|
||||
+ "AND pay_time >= #{start} AND pay_time < #{end} "
|
||||
+ "GROUP BY 1")
|
||||
@Select("""
|
||||
SELECT CASE
|
||||
WHEN amount < 5000 THEN '0-50'
|
||||
WHEN amount < 20000 THEN '50-200'
|
||||
WHEN amount < 100000 THEN '200-1000'
|
||||
WHEN amount < 500000 THEN '1000-5000'
|
||||
ELSE '5000+' END AS bucket,
|
||||
COUNT(*)::bigint AS count
|
||||
FROM pay_trade
|
||||
WHERE status = 'success' AND posted_amount > 0
|
||||
AND pay_time >= #{start} AND pay_time < #{end}
|
||||
GROUP BY 1
|
||||
""")
|
||||
List<AmountRangeItemResult> amountRange(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end);
|
||||
|
||||
// ===== 商户排名 =====
|
||||
|
||||
@Select("SELECT t.mch_no AS mchNo, m.mch_name AS merchantName, "
|
||||
+ "COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS orders "
|
||||
+ "FROM pay_trade t "
|
||||
+ "LEFT JOIN mch_info m ON m.mch_no = t.mch_no AND m.deleted = false "
|
||||
+ "WHERE t.status = 'success' AND t.posted_amount > 0 "
|
||||
+ "AND t.pay_time >= #{start} AND t.pay_time < #{end} "
|
||||
+ "GROUP BY t.mch_no, m.mch_name "
|
||||
+ "ORDER BY amount DESC "
|
||||
+ "LIMIT #{limit}")
|
||||
@Select("""
|
||||
SELECT t.mch_no AS mchNo, m.mch_name AS merchantName,
|
||||
COALESCE(SUM(t.posted_amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS orders
|
||||
FROM pay_trade t
|
||||
LEFT JOIN mch_info m ON m.mch_no = t.mch_no AND m.deleted = false
|
||||
WHERE t.status = 'success' AND t.posted_amount > 0
|
||||
AND t.pay_time >= #{start} AND t.pay_time < #{end}
|
||||
GROUP BY t.mch_no, m.mch_name
|
||||
ORDER BY amount DESC
|
||||
LIMIT #{limit}
|
||||
""")
|
||||
List<MerchantRankItemResult> merchantRank(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
|
||||
@@ -32,34 +32,40 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
|
||||
// ===== 概览 =====
|
||||
|
||||
/// 成交聚合: 按 pay_time 过滤, 填充 success_amount / success_count
|
||||
@Select("SELECT COALESCE(SUM(posted_amount), 0)::bigint AS success_amount, "
|
||||
+ "COUNT(*)::bigint AS success_count "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE status = 'success' AND posted_amount > 0 "
|
||||
+ "AND pay_time >= #{start} AND pay_time < #{end} "
|
||||
+ "AND mch_no = #{mchNo}")
|
||||
@Select("""
|
||||
SELECT COALESCE(SUM(posted_amount), 0)::bigint AS success_amount,
|
||||
COUNT(*)::bigint AS success_count
|
||||
FROM pay_trade
|
||||
WHERE status = 'success' AND posted_amount > 0
|
||||
AND pay_time >= #{start} AND pay_time < #{end}
|
||||
AND mch_no = #{mchNo}
|
||||
""")
|
||||
TradeOverviewResult successAggregate(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@Param("mchNo") String mchNo);
|
||||
|
||||
/// 总下单笔数聚合: 按 create_time 过滤, 填充 total_orders
|
||||
@Select("SELECT COUNT(*)::bigint AS total_orders "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE create_time >= #{start} AND create_time < #{end} "
|
||||
+ "AND mch_no = #{mchNo}")
|
||||
@Select("""
|
||||
SELECT COUNT(*)::bigint AS total_orders
|
||||
FROM pay_trade
|
||||
WHERE create_time >= #{start} AND create_time < #{end}
|
||||
AND mch_no = #{mchNo}
|
||||
""")
|
||||
TradeOverviewResult totalOrdersAggregate(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@Param("mchNo") String mchNo);
|
||||
|
||||
/// 退款聚合
|
||||
@Select("SELECT COALESCE(SUM(amount), 0)::bigint AS refund_amount, "
|
||||
+ "COUNT(*)::bigint AS refund_count "
|
||||
+ "FROM pay_refund_order "
|
||||
+ "WHERE status = 'success' "
|
||||
+ "AND finish_time >= #{start} AND finish_time < #{end} "
|
||||
+ "AND mch_no = #{mchNo}")
|
||||
@Select("""
|
||||
SELECT COALESCE(SUM(amount), 0)::bigint AS refund_amount,
|
||||
COUNT(*)::bigint AS refund_count
|
||||
FROM pay_refund_order
|
||||
WHERE status = 'success'
|
||||
AND finish_time >= #{start} AND finish_time < #{end}
|
||||
AND mch_no = #{mchNo}
|
||||
""")
|
||||
TradeOverviewResult refundAggregate(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@@ -67,27 +73,31 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
|
||||
|
||||
// ===== 趋势 =====
|
||||
|
||||
@Select("SELECT TO_CHAR(pay_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, "
|
||||
+ "COALESCE(SUM(posted_amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS count "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE status = 'success' AND posted_amount > 0 "
|
||||
+ "AND pay_time >= #{start} AND pay_time < #{end} "
|
||||
+ "AND mch_no = #{mchNo} "
|
||||
+ "GROUP BY 1 ORDER BY 1")
|
||||
@Select("""
|
||||
SELECT TO_CHAR(pay_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date,
|
||||
COALESCE(SUM(posted_amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS count
|
||||
FROM pay_trade
|
||||
WHERE status = 'success' AND posted_amount > 0
|
||||
AND pay_time >= #{start} AND pay_time < #{end}
|
||||
AND mch_no = #{mchNo}
|
||||
GROUP BY 1 ORDER BY 1
|
||||
""")
|
||||
List<TradeTrendItemResult> trend(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@Param("mchNo") String mchNo);
|
||||
|
||||
@Select("SELECT TO_CHAR(finish_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, "
|
||||
+ "COALESCE(SUM(amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS count "
|
||||
+ "FROM pay_refund_order "
|
||||
+ "WHERE status = 'success' "
|
||||
+ "AND finish_time >= #{start} AND finish_time < #{end} "
|
||||
+ "AND mch_no = #{mchNo} "
|
||||
+ "GROUP BY 1 ORDER BY 1")
|
||||
@Select("""
|
||||
SELECT TO_CHAR(finish_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date,
|
||||
COALESCE(SUM(amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS count
|
||||
FROM pay_refund_order
|
||||
WHERE status = 'success'
|
||||
AND finish_time >= #{start} AND finish_time < #{end}
|
||||
AND mch_no = #{mchNo}
|
||||
GROUP BY 1 ORDER BY 1
|
||||
""")
|
||||
List<RefundTrendItemResult> refundTrend(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@@ -95,30 +105,34 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
|
||||
|
||||
// ===== 渠道分布 =====
|
||||
|
||||
@Select("SELECT provider, "
|
||||
+ "COALESCE(SUM(posted_amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS count "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE status = 'success' AND posted_amount > 0 "
|
||||
+ "AND provider IS NOT NULL "
|
||||
+ "AND pay_time >= #{start} AND pay_time < #{end} "
|
||||
+ "AND mch_no = #{mchNo} "
|
||||
+ "GROUP BY provider ORDER BY amount DESC")
|
||||
@Select("""
|
||||
SELECT provider,
|
||||
COALESCE(SUM(posted_amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS count
|
||||
FROM pay_trade
|
||||
WHERE status = 'success' AND posted_amount > 0
|
||||
AND provider IS NOT NULL
|
||||
AND pay_time >= #{start} AND pay_time < #{end}
|
||||
AND mch_no = #{mchNo}
|
||||
GROUP BY provider ORDER BY amount DESC
|
||||
""")
|
||||
List<ProviderDistItemResult> providerDist(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@Param("mchNo") String mchNo);
|
||||
|
||||
@Select("SELECT provider, "
|
||||
+ "ROUND(COUNT(*) FILTER (WHERE status = 'success' AND posted_amount > 0)::numeric "
|
||||
+ " / NULLIF(COUNT(*), 0) * 100, 1) AS rate "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE provider IS NOT NULL "
|
||||
+ "AND create_time >= #{start} AND create_time < #{end} "
|
||||
+ "AND mch_no = #{mchNo} "
|
||||
+ "GROUP BY provider "
|
||||
+ "HAVING COUNT(*) > 0 "
|
||||
+ "ORDER BY rate DESC")
|
||||
@Select("""
|
||||
SELECT provider,
|
||||
ROUND(COUNT(*) FILTER (WHERE status = 'success' AND posted_amount > 0)::numeric
|
||||
/ NULLIF(COUNT(*), 0) * 100, 1) AS rate
|
||||
FROM pay_trade
|
||||
WHERE provider IS NOT NULL
|
||||
AND create_time >= #{start} AND create_time < #{end}
|
||||
AND mch_no = #{mchNo}
|
||||
GROUP BY provider
|
||||
HAVING COUNT(*) > 0
|
||||
ORDER BY rate DESC
|
||||
""")
|
||||
List<ProviderSuccessItemResult> providerSuccess(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@@ -126,14 +140,16 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
|
||||
|
||||
// ===== 时段分布 =====
|
||||
|
||||
@Select("SELECT EXTRACT(HOUR FROM pay_time AT TIME ZONE 'Asia/Shanghai')::int AS hour, "
|
||||
+ "COALESCE(SUM(posted_amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS count "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE status = 'success' AND posted_amount > 0 "
|
||||
+ "AND pay_time >= #{start} AND pay_time < #{end} "
|
||||
+ "AND mch_no = #{mchNo} "
|
||||
+ "GROUP BY 1 ORDER BY 1")
|
||||
@Select("""
|
||||
SELECT EXTRACT(HOUR FROM pay_time AT TIME ZONE 'Asia/Shanghai')::int AS hour,
|
||||
COALESCE(SUM(posted_amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS count
|
||||
FROM pay_trade
|
||||
WHERE status = 'success' AND posted_amount > 0
|
||||
AND pay_time >= #{start} AND pay_time < #{end}
|
||||
AND mch_no = #{mchNo}
|
||||
GROUP BY 1 ORDER BY 1
|
||||
""")
|
||||
List<HourlyDistItemResult> hourlyDist(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@@ -141,18 +157,20 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
|
||||
|
||||
// ===== 金额区间分桶 =====
|
||||
|
||||
@Select("SELECT CASE "
|
||||
+ "WHEN amount < 5000 THEN '0-50' "
|
||||
+ "WHEN amount < 20000 THEN '50-200' "
|
||||
+ "WHEN amount < 100000 THEN '200-1000' "
|
||||
+ "WHEN amount < 500000 THEN '1000-5000' "
|
||||
+ "ELSE '5000+' END AS bucket, "
|
||||
+ "COUNT(*)::bigint AS count "
|
||||
+ "FROM pay_trade "
|
||||
+ "WHERE status = 'success' AND posted_amount > 0 "
|
||||
+ "AND pay_time >= #{start} AND pay_time < #{end} "
|
||||
+ "AND mch_no = #{mchNo} "
|
||||
+ "GROUP BY 1")
|
||||
@Select("""
|
||||
SELECT CASE
|
||||
WHEN amount < 5000 THEN '0-50'
|
||||
WHEN amount < 20000 THEN '50-200'
|
||||
WHEN amount < 100000 THEN '200-1000'
|
||||
WHEN amount < 500000 THEN '1000-5000'
|
||||
ELSE '5000+' END AS bucket,
|
||||
COUNT(*)::bigint AS count
|
||||
FROM pay_trade
|
||||
WHERE status = 'success' AND posted_amount > 0
|
||||
AND pay_time >= #{start} AND pay_time < #{end}
|
||||
AND mch_no = #{mchNo}
|
||||
GROUP BY 1
|
||||
""")
|
||||
List<AmountRangeItemResult> amountRange(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@@ -161,20 +179,22 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
|
||||
// ===== 维度排名 =====
|
||||
|
||||
/// 按通道商户号分组排名
|
||||
@Select("SELECT t.channel_mch_no AS dimKey, "
|
||||
+ "COALESCE(cm.channel_merchant_name, t.channel_mch_no) AS dimName, "
|
||||
+ "COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS orders "
|
||||
+ "FROM pay_trade t "
|
||||
+ "LEFT JOIN mch_channel_merchant cm "
|
||||
+ " ON cm.channel_mch_no = t.channel_mch_no AND cm.mch_no = t.mch_no AND cm.deleted = false "
|
||||
+ "WHERE t.status = 'success' AND t.posted_amount > 0 "
|
||||
+ "AND t.channel_mch_no IS NOT NULL AND t.channel_mch_no <> '' "
|
||||
+ "AND t.pay_time >= #{start} AND t.pay_time < #{end} "
|
||||
+ "AND t.mch_no = #{mchNo} "
|
||||
+ "GROUP BY t.channel_mch_no, cm.channel_merchant_name "
|
||||
+ "ORDER BY amount DESC "
|
||||
+ "LIMIT #{limit}")
|
||||
@Select("""
|
||||
SELECT t.channel_mch_no AS dimKey,
|
||||
COALESCE(cm.channel_merchant_name, t.channel_mch_no) AS dimName,
|
||||
COALESCE(SUM(t.posted_amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS orders
|
||||
FROM pay_trade t
|
||||
LEFT JOIN mch_channel_merchant cm
|
||||
ON cm.channel_mch_no = t.channel_mch_no AND cm.mch_no = t.mch_no AND cm.deleted = false
|
||||
WHERE t.status = 'success' AND t.posted_amount > 0
|
||||
AND t.channel_mch_no IS NOT NULL AND t.channel_mch_no <> ''
|
||||
AND t.pay_time >= #{start} AND t.pay_time < #{end}
|
||||
AND t.mch_no = #{mchNo}
|
||||
GROUP BY t.channel_mch_no, cm.channel_merchant_name
|
||||
ORDER BY amount DESC
|
||||
LIMIT #{limit}
|
||||
""")
|
||||
List<DimRankItemResult> dimRankByChannelMch(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@@ -182,20 +202,22 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
|
||||
@Param("limit") int limit);
|
||||
|
||||
/// 按应用分组排名
|
||||
@Select("SELECT t.app_id AS dimKey, "
|
||||
+ "COALESCE(a.app_name, t.app_id) AS dimName, "
|
||||
+ "COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS orders "
|
||||
+ "FROM pay_trade t "
|
||||
+ "LEFT JOIN mch_app_info a "
|
||||
+ " ON a.app_id = t.app_id AND a.mch_no = t.mch_no AND a.deleted = false "
|
||||
+ "WHERE t.status = 'success' AND t.posted_amount > 0 "
|
||||
+ "AND t.app_id IS NOT NULL AND t.app_id <> '' "
|
||||
+ "AND t.pay_time >= #{start} AND t.pay_time < #{end} "
|
||||
+ "AND t.mch_no = #{mchNo} "
|
||||
+ "GROUP BY t.app_id, a.app_name "
|
||||
+ "ORDER BY amount DESC "
|
||||
+ "LIMIT #{limit}")
|
||||
@Select("""
|
||||
SELECT t.app_id AS dimKey,
|
||||
COALESCE(a.app_name, t.app_id) AS dimName,
|
||||
COALESCE(SUM(t.posted_amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS orders
|
||||
FROM pay_trade t
|
||||
LEFT JOIN mch_app_info a
|
||||
ON a.app_id = t.app_id AND a.mch_no = t.mch_no AND a.deleted = false
|
||||
WHERE t.status = 'success' AND t.posted_amount > 0
|
||||
AND t.app_id IS NOT NULL AND t.app_id <> ''
|
||||
AND t.pay_time >= #{start} AND t.pay_time < #{end}
|
||||
AND t.mch_no = #{mchNo}
|
||||
GROUP BY t.app_id, a.app_name
|
||||
ORDER BY amount DESC
|
||||
LIMIT #{limit}
|
||||
""")
|
||||
List<DimRankItemResult> dimRankByApp(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
@@ -203,19 +225,21 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
|
||||
@Param("limit") int limit);
|
||||
|
||||
/// 按门店分组排名; 空 store_no 归到 dimKey='' (前端展示「未指定门店」)
|
||||
@Select("SELECT COALESCE(NULLIF(t.store_no, ''), '') AS dimKey, "
|
||||
+ "s.store_name AS dimName, "
|
||||
+ "COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, "
|
||||
+ "COUNT(*)::bigint AS orders "
|
||||
+ "FROM pay_trade t "
|
||||
+ "LEFT JOIN mch_store_info s "
|
||||
+ " ON s.store_no = t.store_no AND s.mch_no = t.mch_no AND s.deleted = false "
|
||||
+ "WHERE t.status = 'success' AND t.posted_amount > 0 "
|
||||
+ "AND t.pay_time >= #{start} AND t.pay_time < #{end} "
|
||||
+ "AND t.mch_no = #{mchNo} "
|
||||
+ "GROUP BY COALESCE(NULLIF(t.store_no, ''), ''), s.store_name "
|
||||
+ "ORDER BY amount DESC "
|
||||
+ "LIMIT #{limit}")
|
||||
@Select("""
|
||||
SELECT COALESCE(NULLIF(t.store_no, ''), '') AS dimKey,
|
||||
s.store_name AS dimName,
|
||||
COALESCE(SUM(t.posted_amount), 0)::bigint AS amount,
|
||||
COUNT(*)::bigint AS orders
|
||||
FROM pay_trade t
|
||||
LEFT JOIN mch_store_info s
|
||||
ON s.store_no = t.store_no AND s.mch_no = t.mch_no AND s.deleted = false
|
||||
WHERE t.status = 'success' AND t.posted_amount > 0
|
||||
AND t.pay_time >= #{start} AND t.pay_time < #{end}
|
||||
AND t.mch_no = #{mchNo}
|
||||
GROUP BY COALESCE(NULLIF(t.store_no, ''), ''), s.store_name
|
||||
ORDER BY amount DESC
|
||||
LIMIT #{limit}
|
||||
""")
|
||||
List<DimRankItemResult> dimRankByStore(
|
||||
@Param("start") OffsetDateTime start,
|
||||
@Param("end") OffsetDateTime end,
|
||||
|
||||
Reference in New Issue
Block a user