longz
2026-08-19 2a916d05d9f14d583d89f77aed6f63fd49375f60
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -2652,9 +2652,9 @@
    <select id="chargingOrderBaseSummary" resultType="map">
        select
        sum(COALESCE(summary.charging_duration, UNIX_TIMESTAMP(b.end_time) - UNIX_TIMESTAMP(b.start_time))) as `time`,
        sum(COALESCE(summary.income, IFNULL(b.electrovalence, 0) + CASE WHEN b.order_source = 1 THEN IFNULL(b.service_charge, 0) ELSE IFNULL(b.service_charge, 0) * 0.8 END)) as income,
        sum(COALESCE(summary.electric_price, IFNULL(b.electrovalence, 0))) as electronicMoney,
        sum(COALESCE(summary.service_price, CASE WHEN b.order_source = 1 THEN IFNULL(b.service_charge, 0) ELSE IFNULL(b.service_charge, 0) * 0.8 END)) as serviceMoney,
        sum(CASE WHEN b.refund_status = 2 THEN 0 ELSE COALESCE(summary.income, IFNULL(b.electrovalence, 0) + CASE WHEN b.order_source = 1 THEN IFNULL(b.service_charge, 0) ELSE IFNULL(b.service_charge, 0) * 0.8 END) END) as income,
        sum(CASE WHEN b.refund_status = 2 THEN 0 ELSE COALESCE(summary.electric_price, IFNULL(b.electrovalence, 0)) END) as electronicMoney,
        sum(CASE WHEN b.refund_status = 2 THEN 0 ELSE COALESCE(summary.service_price, CASE WHEN b.order_source = 1 THEN IFNULL(b.service_charge, 0) ELSE IFNULL(b.service_charge, 0) * 0.8 END) END) as serviceMoney,
        sum(COALESCE(summary.charging_capacity, IFNULL(b.charging_capacity, 0))) as total,
        sum(CASE WHEN b.recharge_payment_type = 1 AND IFNULL(b.third_pay_amount, CASE WHEN b.pay_method = 3 THEN IFNULL(b.payment_amount, IFNULL(b.recharge_amount, 0)) ELSE 0 END) - IFNULL(b.third_refund_amount, CASE WHEN b.pay_method = 3 THEN IFNULL(b.refund_amount, 0) ELSE 0 END) &gt; 0 THEN IFNULL(b.third_pay_amount, CASE WHEN b.pay_method = 3 THEN IFNULL(b.payment_amount, IFNULL(b.recharge_amount, 0)) ELSE 0 END) - IFNULL(b.third_refund_amount, CASE WHEN b.pay_method = 3 THEN IFNULL(b.refund_amount, 0) ELSE 0 END) ELSE 0 END) as wechatIncome,
        sum(CASE WHEN b.recharge_payment_type in (2, 3) AND IFNULL(b.third_pay_amount, CASE WHEN b.pay_method = 3 THEN IFNULL(b.payment_amount, IFNULL(b.recharge_amount, 0)) ELSE 0 END) - IFNULL(b.third_refund_amount, CASE WHEN b.pay_method = 3 THEN IFNULL(b.refund_amount, 0) ELSE 0 END) &gt; 0 THEN IFNULL(b.third_pay_amount, CASE WHEN b.pay_method = 3 THEN IFNULL(b.payment_amount, IFNULL(b.recharge_amount, 0)) ELSE 0 END) - IFNULL(b.third_refund_amount, CASE WHEN b.pay_method = 3 THEN IFNULL(b.refund_amount, 0) ELSE 0 END) ELSE 0 END) as alipayIncome,
@@ -2722,19 +2722,23 @@
    <select id="chargingOrderShareIncomeByOrderIds" resultType="map">
        select
        s.charging_order_id as orderId,
        o.id as orderId,
        sum(IFNULL(s.channel_pay_amount, 0) - IFNULL(s.share_amount, 0)) as platformIncome,
        sum(IFNULL(s.share_amount, 0)) as partnerIncome
        from `charging_pile_order`.t_charging_order_share_record s
        inner join `charging_pile_order`.t_charging_order o on o.id = s.charging_order_id
        where s.del_flag = 0 and s.charging_order_id is not null
        sum(IFNULL(s.share_amount, 0)) as partnerIncome,
        CASE WHEN o.is_whitelist = 1 AND o.status = 5 THEN IFNULL(o.whitelist_electric_refund_amount, 0)
            + IFNULL(o.whitelist_service_refund_amount, 0) ELSE 0 END as whitelistRefund
        from `charging_pile_order`.t_charging_order o
        left join `charging_pile_order`.t_charging_order_share_record s
            on s.charging_order_id = o.id and s.del_flag = 0
        where o.del_flag = 0
        <if test="orderIds != null and orderIds.size()>0">
            and s.charging_order_id in
            and o.id in
            <foreach collection="orderIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
        group by s.charging_order_id
        group by o.id, o.is_whitelist, o.status,
            o.whitelist_electric_refund_amount, o.whitelist_service_refund_amount
    </select>
    <select id="chargingOrderShareIncomeByPayChannel" resultType="map">
@@ -3525,6 +3529,19 @@
        GROUP BY period
    </select>
    <select id="sumWhitelistRefundByOrderIds" resultType="java.math.BigDecimal">
        select coalesce(sum(IFNULL(whitelist_electric_refund_amount, 0)
            + IFNULL(whitelist_service_refund_amount, 0)), 0)
        from `charging_pile_order`.t_charging_order
        where del_flag = 0 and is_whitelist = 1 and status = 5
        <if test="orderIds != null and orderIds.size()>0">
            and id in
            <foreach collection="orderIds" item="item" index="index" separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
    </select>
    <!-- 接口用: 最近七日收入,直接查询确保历史日切片升级后也能立即显示正确金额。 -->
    <select id="incomeTrendFromOrders" resultType="com.ruoyi.order.dto.SixChargingDto">
        SELECT DATE_FORMAT(charging_order.create_time, '%Y-%m-%d') AS month,
@@ -3598,47 +3615,50 @@
            ArrayIndexOutOfBoundsException:17 / "is not being grouped" 规划崩溃;
         2) 聚合表达式内禁用 LEAST(),LEAST(ROUND(...)) 会触发 NPE,用嵌套 CASE 等价封顶替代。 -->
    <!-- 按 end_time 日聚合: 订单数/金额/服务费/电费/电量/功率/需求满足率/利用率 -->
    <!-- 按 pay_time 日聚合: 关键数据收入/服务费/总充电电量与管理后台 chargingOrderBaseSummary 保持一致 -->
    <select id="franchiseeDayStats" resultType="com.ruoyi.order.dto.FranchiseeDayStat">
        SELECT DATE(end_time)                       AS statDay,
               COUNT(*)                             AS orderCount,
               SUM(IFNULL(order_amount, 0))         AS orderAmount,
               SUM(COALESCE(order_amount, payment_amount)) AS orderAmountEffective,
               SUM(IFNULL(payment_amount, 0))       AS paymentAmount,
               SUM(IFNULL(service_charge, 0))       AS serviceFee,
               SUM(IFNULL(electrovalence, 0))       AS electrovalence,
               SUM(IFNULL(electrovalence, 0) + CASE
                       WHEN order_source = 1 THEN IFNULL(service_charge, 0)
                       ELSE IFNULL(service_charge, 0) * 0.8
                   END + CASE
                       WHEN is_whitelist = 1 THEN IFNULL(whitelist_electric_refund_amount, 0)
                               + IFNULL(whitelist_service_refund_amount, 0)
                       ELSE 0
                   END)                              AS chargingIncome,
               SUM(IFNULL(charging_capacity, 0))    AS capacity,
               SUM(IFNULL(charging_power, power))   AS totalPower,
               COUNT(IFNULL(charging_power, power)) AS powerCount,
               MAX(IFNULL(IFNULL(charging_power, power), 0)) AS maxPower,
               SUM(CASE WHEN `current` IS NOT NULL AND need_elec IS NOT NULL AND need_elec &gt; 0
                        THEN CASE WHEN ROUND(`current` * 100 / need_elec, 4) &gt; 100 THEN 100
                                  ELSE ROUND(`current` * 100 / need_elec, 4) END ELSE 0 END) AS elecSatSum,
               SUM(CASE WHEN `current` IS NOT NULL AND need_elec IS NOT NULL AND need_elec &gt; 0
                        THEN 1 ELSE 0 END)          AS elecSatCount,
               SUM(CASE WHEN IFNULL(IFNULL(charging_power, power), 0) &gt; 0
                        THEN IFNULL(IFNULL(charging_power, power), 0) ELSE 0 END) AS utilPowerSum,
               SUM(CASE WHEN IFNULL(IFNULL(charging_power, power), 0) &gt; 0
                        THEN 1 ELSE 0 END)          AS utilPowerCount
        FROM t_charging_order
        WHERE del_flag = 0
          AND recharge_payment_status = 2
        SELECT DATE(b.pay_time)                       AS statDay,
               COUNT(*)                               AS orderCount,
               SUM(IFNULL(b.order_amount, 0))         AS orderAmount,
               SUM(COALESCE(b.order_amount, b.payment_amount)) AS orderAmountEffective,
               SUM(IFNULL(b.payment_amount, 0))       AS paymentAmount,
               SUM(COALESCE(summary.service_price, CASE
                       WHEN b.order_source = 1 THEN IFNULL(b.service_charge, 0)
                       ELSE IFNULL(b.service_charge, 0) * 0.8
                   END))                               AS serviceFee,
               SUM(COALESCE(summary.electric_price, IFNULL(b.electrovalence, 0))) AS electrovalence,
               SUM(COALESCE(summary.income, IFNULL(b.electrovalence, 0) + CASE
                       WHEN b.order_source = 1 THEN IFNULL(b.service_charge, 0)
                       ELSE IFNULL(b.service_charge, 0) * 0.8
                   END))                               AS chargingIncome,
               SUM(COALESCE(summary.charging_capacity, IFNULL(b.charging_capacity, 0))) AS capacity,
               SUM(IFNULL(b.charging_power, b.power))  AS totalPower,
               COUNT(IFNULL(b.charging_power, b.power)) AS powerCount,
               MAX(IFNULL(IFNULL(b.charging_power, b.power), 0)) AS maxPower,
               SUM(CASE WHEN b.`current` IS NOT NULL AND b.need_elec IS NOT NULL AND b.need_elec &gt; 0
                        THEN CASE WHEN ROUND(b.`current` * 100 / b.need_elec, 4) &gt; 100 THEN 100
                                  ELSE ROUND(b.`current` * 100 / b.need_elec, 4) END ELSE 0 END) AS elecSatSum,
               SUM(CASE WHEN b.`current` IS NOT NULL AND b.need_elec IS NOT NULL AND b.need_elec &gt; 0
                        THEN 1 ELSE 0 END)             AS elecSatCount,
               SUM(CASE WHEN IFNULL(IFNULL(b.charging_power, b.power), 0) &gt; 0
                        THEN IFNULL(IFNULL(b.charging_power, b.power), 0) ELSE 0 END) AS utilPowerSum,
               SUM(CASE WHEN IFNULL(IFNULL(b.charging_power, b.power), 0) &gt; 0
                        THEN 1 ELSE 0 END)             AS utilPowerCount
        FROM `charging_pile_order`.t_charging_order b
        LEFT JOIN `charging_pile_order`.t_charging_order_summary_data summary
          ON summary.charging_order_id = b.id
        WHERE b.del_flag = 0
          AND b.recharge_payment_status = 2
          AND b.start_time IS NOT NULL
          AND b.end_time IS NOT NULL
        <if test="siteIds != null and siteIds.size() > 0">
            AND site_id IN
            AND b.site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                #{siteId}
            </foreach>
        </if>
          AND end_time &gt;= #{start}
          AND end_time &lt; #{end}
          AND b.pay_time &gt;= #{start}
          AND b.pay_time &lt; #{end}
        GROUP BY 1
    </select>
@@ -3715,16 +3735,23 @@
        GROUP BY 1, 2, 3
    </select>
    <!-- 平台新增用户按注册日聚合(全平台口径,跨库 t_app_user;GROUP BY 序号防 Calcite 崩溃) -->
    <select id="franchiseeNewUserStats" resultType="com.ruoyi.order.dto.FranchiseeNewUserStat">
        SELECT DATE(create_time) AS statDay,
               COUNT(*)          AS userCount
        FROM charging_pile_account.t_app_user
    <!-- 加盟商站点"新增用户"识别:统计窗内每用户首次充电成功日(MIN(DATE(end_time)),与 franchiseeUserAggs 同过滤条件) -->
    <select id="franchiseeUserFirstChargedDays" resultType="com.ruoyi.order.dto.FranchiseeUserFirstCharge">
        SELECT app_user_id                AS appUserId,
               MIN(DATE(end_time))        AS firstChargedDay
        FROM t_charging_order
        WHERE del_flag = 0
          AND create_time &gt;= #{start}
          AND create_time &lt; #{end}
        GROUP BY 1
        ORDER BY 1
          AND recharge_payment_status = 2
          AND status = 5
        <if test="siteIds != null and siteIds.size() > 0">
            AND site_id IN
            <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                #{siteId}
            </foreach>
        </if>
          AND end_time &gt;= #{start}
          AND end_time &lt; #{end}
        GROUP BY app_user_id
    </select>
    <!-- 流量来源统计(仅 status=5 已结束订单,空值归"明星充电"由服务端处理) -->