| | |
| | | <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) > 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) > 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, |
| | |
| | | |
| | | <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"> |
| | |
| | | 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, |
| | |
| | | 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 > 0 |
| | | THEN CASE WHEN ROUND(`current` * 100 / need_elec, 4) > 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 > 0 |
| | | THEN 1 ELSE 0 END) AS elecSatCount, |
| | | SUM(CASE WHEN IFNULL(IFNULL(charging_power, power), 0) > 0 |
| | | THEN IFNULL(IFNULL(charging_power, power), 0) ELSE 0 END) AS utilPowerSum, |
| | | SUM(CASE WHEN IFNULL(IFNULL(charging_power, power), 0) > 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 > 0 |
| | | THEN CASE WHEN ROUND(b.`current` * 100 / b.need_elec, 4) > 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 > 0 |
| | | THEN 1 ELSE 0 END) AS elecSatCount, |
| | | SUM(CASE WHEN IFNULL(IFNULL(b.charging_power, b.power), 0) > 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) > 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 >= #{start} |
| | | AND end_time < #{end} |
| | | AND b.pay_time >= #{start} |
| | | AND b.pay_time < #{end} |
| | | GROUP BY 1 |
| | | </select> |
| | | |
| | |
| | | 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 >= #{start} |
| | | AND create_time < #{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 >= #{start} |
| | | AND end_time < #{end} |
| | | GROUP BY app_user_id |
| | | </select> |
| | | |
| | | <!-- 流量来源统计(仅 status=5 已结束订单,空值归"明星充电"由服务端处理) --> |