| | |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="reportFeeServiceDaoImpl"> |
| | | <select id="repostInFee" resultType="java.util.Map"> |
| | | SELECT |
| | | pfd.community_id, |
| | | td.name AS '费用类型名称', |
| | | YEAR(pfd.create_time) AS '统计周期', -- 统计周期只显示年份 |
| | | pf.fee_type_cd AS '费用类型编码', |
| | | -- 往年年度统计 |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2021-01-01' AND pfd.end_time >= '2020-01-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, '2020-12-31'), |
| | | GREATEST(pfd.start_time, '2020-01-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2020年收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2022-01-01' AND pfd.end_time >= '2021-01-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, '2021-12-31'), |
| | | GREATEST(pfd.start_time, '2021-01-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2021年收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2023-01-01' AND pfd.end_time >= '2022-01-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, '2022-12-31'), |
| | | GREATEST(pfd.start_time, '2022-01-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2022年收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2024-01-01' AND pfd.end_time >= '2023-01-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, '2023-12-31'), |
| | | GREATEST(pfd.start_time, '2023-01-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2023年收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-01-01' AND pfd.end_time >= '2024-01-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, '2024-12-31'), |
| | | GREATEST(pfd.start_time, '2024-01-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2024年收费金额(元)', |
| | | -- 步骤1:生成所有年份 |
| | | WITH all_years AS ( |
| | | SELECT 2020 AS year UNION ALL |
| | | SELECT 2021 UNION ALL |
| | | SELECT 2022 UNION ALL |
| | | SELECT 2023 UNION ALL |
| | | SELECT 2024 UNION ALL |
| | | SELECT 2025 |
| | | ), |
| | | -- 步骤2:生成所有费用类型 |
| | | all_fee_types AS ( |
| | | SELECT DISTINCT |
| | | f.fee_type_cd, |
| | | COALESCE(dict.`name`, '未知类型') AS fee_type_name |
| | | FROM pay_fee f |
| | | LEFT JOIN t_dict dict ON f.fee_type_cd = dict.status_cd |
| | | ), |
| | | -- 步骤3:生成"类型+年份"全量组合 |
| | | all_type_year AS ( |
| | | SELECT |
| | | t.fee_type_cd, |
| | | t.fee_type_name, |
| | | y.year AS detail_year |
| | | FROM all_fee_types t |
| | | CROSS JOIN all_years y |
| | | ), |
| | | -- 步骤4:修正原始数据聚合逻辑(关键:确保月度数据不重复计算) |
| | | original_agg AS ( |
| | | SELECT |
| | | f.fee_type_cd, |
| | | COALESCE(dict.`name`, '未知类型') AS fee_type_name, |
| | | d.detail_year, |
| | | -- 年度总金额(基础数据,确保不重复) |
| | | SUM(DISTINCT d.receivable_amount) AS 该年应缴总额, -- 修正1:避免同年度金额重复计算 |
| | | ROUND(SUM(DISTINCT d.receivable_amount)/12, 4) AS 每月费用, |
| | | 12 AS 应收月份数, |
| | | -- 收缴率计算(使用DISTINCT确保分子分母匹配) |
| | | ROUND(CASE WHEN SUM(DISTINCT d.receivable_amount) = 0 THEN 0 |
| | | ELSE SUM(DISTINCT d.received_amount)/SUM(DISTINCT d.receivable_amount)*100 |
| | | END, 2) AS `当年收缴率(%)`, |
| | | SUM(DISTINCT d.discount_amount) AS 折扣金额, |
| | | -- 各年实缴(按付款时间统计,避免跨年度重复) |
| | | SUM(CASE WHEN YEAR(d.pay_fee_time) = 2020 THEN d.received_amount ELSE 0 END) AS 2020年实缴, |
| | | SUM(CASE WHEN YEAR(d.pay_fee_time) = 2021 THEN d.received_amount ELSE 0 END) AS 2021年实缴, |
| | | SUM(CASE WHEN YEAR(d.pay_fee_time) = 2022 THEN d.received_amount ELSE 0 END) AS 2022年实缴, |
| | | SUM(CASE WHEN YEAR(d.pay_fee_time) = 2023 THEN d.received_amount ELSE 0 END) AS 2023年实缴, |
| | | SUM(CASE WHEN YEAR(d.pay_fee_time) = 2024 THEN d.received_amount ELSE 0 END) AS 2024年实缴, |
| | | -- 其他核心字段 |
| | | SUM(DISTINCT d.receivable_amount) AS 当年预算, |
| | | SUM(CASE WHEN YEAR(d.pay_fee_time) = 2025 THEN d.received_amount ELSE 0 END) AS 2025年实缴, |
| | | SUM(DISTINCT d.discount_amount) AS 当年折扣总额, |
| | | SUM(DISTINCT d.receivable_amount) - SUM(DISTINCT d.received_amount) AS 当年欠款, |
| | | -- 每月应收(修正2:按月份唯一值计算,避免重复) |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 1 THEN d.receivable_amount ELSE 0 END) AS 当年1月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 2 THEN d.receivable_amount ELSE 0 END) AS 当年2月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 3 THEN d.receivable_amount ELSE 0 END) AS 当年3月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 4 THEN d.receivable_amount ELSE 0 END) AS 当年4月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 5 THEN d.receivable_amount ELSE 0 END) AS 当年5月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 6 THEN d.receivable_amount ELSE 0 END) AS 当年6月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 7 THEN d.receivable_amount ELSE 0 END) AS 当年7月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 8 THEN d.receivable_amount ELSE 0 END) AS 当年8月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 9 THEN d.receivable_amount ELSE 0 END) AS 当年9月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 10 THEN d.receivable_amount ELSE 0 END) AS 当年10月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 11 THEN d.receivable_amount ELSE 0 END) AS 当年11月应收, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 12 THEN d.receivable_amount ELSE 0 END) AS 当年12月应收, |
| | | -- 每月实缴(同上,避免重复) |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 1 THEN d.received_amount ELSE 0 END) AS 当年1月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 2 THEN d.received_amount ELSE 0 END) AS 当年2月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 3 THEN d.received_amount ELSE 0 END) AS 当年3月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 4 THEN d.received_amount ELSE 0 END) AS 当年4月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 5 THEN d.received_amount ELSE 0 END) AS 当年5月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 6 THEN d.received_amount ELSE 0 END) AS 当年6月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 7 THEN d.received_amount ELSE 0 END) AS 当年7月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 8 THEN d.received_amount ELSE 0 END) AS 当年8月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 9 THEN d.received_amount ELSE 0 END) AS 当年9月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 10 THEN d.received_amount ELSE 0 END) AS 当年10月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 11 THEN d.received_amount ELSE 0 END) AS 当年11月实缴, |
| | | SUM(DISTINCT CASE WHEN d.detail_month = 12 THEN d.received_amount ELSE 0 END) AS 当年12月实缴 |
| | | FROM pay_fee_detail_month d |
| | | INNER JOIN pay_fee f ON d.fee_id = f.fee_id |
| | | LEFT JOIN t_dict dict ON f.fee_type_cd = dict.status_cd |
| | | WHERE d.community_id = '2025081537770016' AND d.status_cd = '0' |
| | | GROUP BY f.fee_type_cd, COALESCE(dict.`name`, '未知类型'), d.detail_year |
| | | ), |
| | | -- 步骤5:全量明细行 |
| | | detail_rows AS ( |
| | | SELECT |
| | | a.fee_type_cd, |
| | | a.fee_type_name, |
| | | a.detail_year AS 费用所属年份, |
| | | '明细' AS 行类型, |
| | | COALESCE(o.该年应缴总额, 0) AS 该年应缴总额, |
| | | COALESCE(o.每月费用, 0) AS 每月费用, |
| | | COALESCE(o.应收月份数, 12) AS 应收月份数, |
| | | COALESCE(o.`当年收缴率(%)`, 0) AS `当年收缴率(%)`, |
| | | COALESCE(o.折扣金额, 0) AS 折扣金额, |
| | | -- 各年实缴 |
| | | COALESCE(o.2020年实缴, 0) AS 2020年实缴, |
| | | COALESCE(o.2021年实缴, 0) AS 2021年实缴, |
| | | COALESCE(o.2022年实缴, 0) AS 2022年实缴, |
| | | COALESCE(o.2023年实缴, 0) AS 2023年实缴, |
| | | COALESCE(o.2024年实缴, 0) AS 2024年实缴, |
| | | -- 其他核心字段 |
| | | COALESCE(o.当年预算, 0) AS 当年预算, |
| | | COALESCE(o.2025年实缴, 0) AS 2025年实缴, |
| | | COALESCE(o.当年折扣总额, 0) AS 当年折扣总额, |
| | | COALESCE(o.当年欠款, 0) AS 当年欠款, |
| | | -- 每月应收 |
| | | COALESCE(o.当年1月应收, 0) AS 当年1月应收, |
| | | COALESCE(o.当年2月应收, 0) AS 当年2月应收, |
| | | COALESCE(o.当年3月应收, 0) AS 当年3月应收, |
| | | COALESCE(o.当年4月应收, 0) AS 当年4月应收, |
| | | COALESCE(o.当年5月应收, 0) AS 当年5月应收, |
| | | COALESCE(o.当年6月应收, 0) AS 当年6月应收, |
| | | COALESCE(o.当年7月应收, 0) AS 当年7月应收, |
| | | COALESCE(o.当年8月应收, 0) AS 当年8月应收, |
| | | COALESCE(o.当年9月应收, 0) AS 当年9月应收, |
| | | COALESCE(o.当年10月应收, 0) AS 当年10月应收, |
| | | COALESCE(o.当年11月应收, 0) AS 当年11月应收, |
| | | COALESCE(o.当年12月应收, 0) AS 当年12月应收, |
| | | -- 每月实缴 |
| | | COALESCE(o.当年1月实缴, 0) AS 当年1月实缴, |
| | | COALESCE(o.当年2月实缴, 0) AS 当年2月实缴, |
| | | COALESCE(o.当年3月实缴, 0) AS 当年3月实缴, |
| | | COALESCE(o.当年4月实缴, 0) AS 当年4月实缴, |
| | | COALESCE(o.当年5月实缴, 0) AS 当年5月实缴, |
| | | COALESCE(o.当年6月实缴, 0) AS 当年6月实缴, |
| | | COALESCE(o.当年7月实缴, 0) AS 当年7月实缴, |
| | | COALESCE(o.当年8月实缴, 0) AS 当年8月实缴, |
| | | COALESCE(o.当年9月实缴, 0) AS 当年9月实缴, |
| | | COALESCE(o.当年10月实缴, 0) AS 当年10月实缴, |
| | | COALESCE(o.当年11月实缴, 0) AS 当年11月实缴, |
| | | COALESCE(o.当年12月实缴, 0) AS 当年12月实缴 |
| | | FROM all_type_year a |
| | | LEFT JOIN original_agg o |
| | | ON a.fee_type_cd = o.fee_type_cd |
| | | AND a.detail_year = o.detail_year |
| | | ), |
| | | -- 步骤6:类型总计行 |
| | | type_total_rows AS ( |
| | | SELECT |
| | | fee_type_cd, |
| | | fee_type_name, |
| | | '类型总计' AS 费用所属年份, |
| | | '类型总计' AS 行类型, |
| | | SUM(该年应缴总额) AS 该年应缴总额, |
| | | ROUND(SUM(该年应缴总额) / (12 * COUNT(DISTINCT 费用所属年份)), 4) AS 每月费用, |
| | | 12 * COUNT(DISTINCT 费用所属年份) AS 应收月份数, |
| | | ROUND(CASE WHEN SUM(该年应缴总额) = 0 THEN 0 |
| | | ELSE SUM(2020年实缴 + 2021年实缴 + 2022年实缴 + 2023年实缴 + 2024年实缴 + 2025年实缴) |
| | | / SUM(该年应缴总额) * 100 |
| | | END, 2) AS `当年收缴率(%)`, |
| | | SUM(折扣金额) AS 折扣金额, |
| | | -- 各年实缴合计 |
| | | SUM(2020年实缴) AS 2020年实缴, |
| | | SUM(2021年实缴) AS 2021年实缴, |
| | | SUM(2022年实缴) AS 2022年实缴, |
| | | SUM(2023年实缴) AS 2023年实缴, |
| | | SUM(2024年实缴) AS 2024年实缴, |
| | | SUM(当年预算) AS 当年预算, |
| | | SUM(2025年实缴) AS 2025年实缴, |
| | | SUM(当年折扣总额) AS 当年折扣总额, |
| | | SUM(当年欠款) AS 当年欠款, |
| | | -- 每月应收合计 |
| | | SUM(当年1月应收) AS 当年1月应收, |
| | | SUM(当年2月应收) AS 当年2月应收, |
| | | SUM(当年3月应收) AS 当年3月应收, |
| | | SUM(当年4月应收) AS 当年4月应收, |
| | | SUM(当年5月应收) AS 当年5月应收, |
| | | SUM(当年6月应收) AS 当年6月应收, |
| | | SUM(当年7月应收) AS 当年7月应收, |
| | | SUM(当年8月应收) AS 当年8月应收, |
| | | SUM(当年9月应收) AS 当年9月应收, |
| | | SUM(当年10月应收) AS 当年10月应收, |
| | | SUM(当年11月应收) AS 当年11月应收, |
| | | SUM(当年12月应收) AS 当年12月应收, |
| | | -- 每月实缴合计 |
| | | SUM(当年1月实缴) AS 当年1月实缴, |
| | | SUM(当年2月实缴) AS 当年2月实缴, |
| | | SUM(当年3月实缴) AS 当年3月实缴, |
| | | SUM(当年4月实缴) AS 当年4月实缴, |
| | | SUM(当年5月实缴) AS 当年5月实缴, |
| | | SUM(当年6月实缴) AS 当年6月实缴, |
| | | SUM(当年7月实缴) AS 当年7月实缴, |
| | | SUM(当年8月实缴) AS 当年8月实缴, |
| | | SUM(当年9月实缴) AS 当年9月实缴, |
| | | SUM(当年10月实缴) AS 当年10月实缴, |
| | | SUM(当年11月实缴) AS 当年11月实缴, |
| | | SUM(当年12月实缴) AS 当年12月实缴 |
| | | FROM detail_rows |
| | | GROUP BY fee_type_cd, fee_type_name |
| | | ), |
| | | -- 步骤7:总合计行 |
| | | grand_total_row AS ( |
| | | SELECT |
| | | 'ALL' AS fee_type_cd, |
| | | '所有类型总计' AS fee_type_name, |
| | | '总合计' AS 费用所属年份, |
| | | '总合计' AS 行类型, |
| | | SUM(该年应缴总额) AS 该年应缴总额, |
| | | ROUND(SUM(该年应缴总额) / (12 * COUNT(DISTINCT 费用所属年份)), 4) AS 每月费用, |
| | | 12 * COUNT(DISTINCT 费用所属年份) AS 应收月份数, |
| | | ROUND(CASE WHEN SUM(该年应缴总额) = 0 THEN 0 |
| | | ELSE SUM(2020年实缴 + 2021年实缴 + 2022年实缴 + 2023年实缴 + 2024年实缴 + 2025年实缴) |
| | | / SUM(该年应缴总额) * 100 |
| | | END, 2) AS `当年收缴率`, |
| | | SUM(折扣金额) AS 折扣金额, |
| | | -- 各年实缴总合计 |
| | | SUM(2020年实缴) AS 2020年实缴, |
| | | SUM(2021年实缴) AS 2021年实缴, |
| | | SUM(2022年实缴) AS 2022年实缴, |
| | | SUM(2023年实缴) AS 2023年实缴, |
| | | SUM(2024年实缴) AS 2024年实缴, |
| | | SUM(当年预算) AS 当年预算, |
| | | SUM(2025年实缴) AS 2025年实缴, |
| | | SUM(当年折扣总额) AS 当年折扣总额, |
| | | SUM(当年欠款) AS 当年欠款, |
| | | -- 每月应收总合计 |
| | | SUM(当年1月应收) AS 当年1月应收, |
| | | SUM(当年2月应收) AS 当年2月应收, |
| | | SUM(当年3月应收) AS 当年3月应收, |
| | | SUM(当年4月应收) AS 当年4月应收, |
| | | SUM(当年5月应收) AS 当年5月应收, |
| | | SUM(当年6月应收) AS 当年6月应收, |
| | | SUM(当年7月应收) AS 当年7月应收, |
| | | SUM(当年8月应收) AS 当年8月应收, |
| | | SUM(当年9月应收) AS 当年9月应收, |
| | | SUM(当年10月应收) AS 当年10月应收, |
| | | SUM(当年11月应收) AS 当年11月应收, |
| | | SUM(当年12月应收) AS 当年12月应收, |
| | | -- 每月实缴总合计 |
| | | SUM(当年1月实缴) AS 当年1月实缴, |
| | | SUM(当年2月实缴) AS 当年2月实缴, |
| | | SUM(当年3月实缴) AS 当年3月实缴, |
| | | SUM(当年4月实缴) AS 当年4月实缴, |
| | | SUM(当年5月实缴) AS 当年5月实缴, |
| | | SUM(当年6月实缴) AS 当年6月实缴, |
| | | SUM(当年7月实缴) AS 当年7月实缴, |
| | | SUM(当年8月实缴) AS 当年8月实缴, |
| | | SUM(当年9月实缴) AS 当年9月实缴, |
| | | SUM(当年10月实缴) AS 当年10月实缴, |
| | | SUM(当年11月实缴) AS 当年11月实缴, |
| | | SUM(当年12月实缴) AS 当年12月实缴 |
| | | FROM detail_rows |
| | | ) |
| | | |
| | | -- 今年按月统计(2025年) |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-02-01' |
| | | AND pfd.end_time >= '2025-01-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-01-01')), |
| | | GREATEST(pfd.start_time, '2025-01-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年1月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-03-01' |
| | | AND pfd.end_time >= '2025-02-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-02-01')), |
| | | GREATEST(pfd.start_time, '2025-02-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年2月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-04-01' |
| | | AND pfd.end_time >= '2025-03-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-03-01')), |
| | | GREATEST(pfd.start_time, '2025-03-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年3月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-05-01' |
| | | AND pfd.end_time >= '2025-04-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-04-01')), |
| | | GREATEST(pfd.start_time, '2025-04-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年4月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-06-01' |
| | | AND pfd.end_time >= '2025-05-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-05-01')), |
| | | GREATEST(pfd.start_time, '2025-05-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年5月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-07-01' |
| | | AND pfd.end_time >= '2025-06-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-06-01')), |
| | | GREATEST(pfd.start_time, '2025-06-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年6月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-08-01' |
| | | AND pfd.end_time >= '2025-07-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-07-01')), |
| | | GREATEST(pfd.start_time, '2025-07-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年7月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-09-01' |
| | | AND pfd.end_time >= '2025-08-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-08-01')), |
| | | GREATEST(pfd.start_time, '2025-08-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年8月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-10-01' |
| | | AND pfd.end_time >= '2025-09-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-09-01')), |
| | | GREATEST(pfd.start_time, '2025-09-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年9月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-11-01' |
| | | AND pfd.end_time >= '2025-10-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-10-01')), |
| | | GREATEST(pfd.start_time, '2025-10-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年10月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2025-12-01' |
| | | AND pfd.end_time >= '2025-11-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-11-01')), |
| | | GREATEST(pfd.start_time, '2025-11-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年11月收费金额(元)', |
| | | SUM( |
| | | CASE |
| | | WHEN pfd.start_time < '2026-01-01' |
| | | AND pfd.end_time >= '2025-12-01' |
| | | THEN pfd.received_amount * |
| | | DATEDIFF( |
| | | LEAST(pfd.end_time, LAST_DAY('2025-12-01')), |
| | | GREATEST(pfd.start_time, '2025-12-01') |
| | | ) / DATEDIFF(pfd.end_time, pfd.start_time) |
| | | ELSE 0 |
| | | END |
| | | ) AS '2025年12月收费金额(元)', |
| | | |
| | | SUM(pfd.received_amount) AS '总收费金额(元)' |
| | | FROM |
| | | pay_fee_detail pfd |
| | | LEFT JOIN pay_fee pf ON pf.fee_id = pfd.fee_id |
| | | LEFT JOIN t_dict td ON td.table_name = "pay_fee_config" |
| | | AND td.table_columns = "fee_type_cd" |
| | | AND td.status_cd = pf.fee_type_cd |
| | | WHERE |
| | | pfd.status_cd = '0' |
| | | AND pfd.community_id = #{communityId} |
| | | GROUP BY |
| | | td.name, |
| | | pf.fee_type_cd, |
| | | pfd.community_id, |
| | | YEAR(pfd.create_time) -- 按年份分组 |
| | | -- 最终结果 |
| | | SELECT * FROM ( |
| | | SELECT * FROM type_total_rows |
| | | UNION ALL |
| | | SELECT * FROM detail_rows |
| | | UNION ALL |
| | | SELECT * FROM grand_total_row |
| | | ) AS all_rows |
| | | ORDER BY |
| | | pf.fee_type_cd, |
| | | td.name, |
| | | YEAR(pfd.create_time); |
| | | </select> |
| | | <select id="repostInFeeTwo" resultType="java.util.Map"> |
| | | select |
| | | td1.`name` as '费用类型', |
| | | t.fee_type_cd as '费用类型编码', |
| | | YEAR(t.start_time) as '统计周期', |
| | | -- 每月费用月份数 |
| | | MAX(CASE |
| | | WHEN YEAR(t.start_time) = YEAR(bc.create_time) THEN |
| | | 12 - MONTH(bc.create_time) + 1 -- 第一年月份数 |
| | | ELSE 12 -- 后续年份 |
| | | END) as '每月费用月份数', |
| | | -- 当年应缴总金额 |
| | | ROUND(SUM( |
| | | CASE |
| | | WHEN t.fee_flag = '1003006' THEN -- 周期性费用 |
| | | ROUND( |
| | | (CASE |
| | | WHEN t.fee_flag = '1003006' THEN |
| | | ROUND( |
| | | ( |
| | | TIMESTAMPDIFF(MONTH, t.start_time, LAST_DAY(pfa1.`value`)) |
| | | + CASE |
| | | WHEN DAY(pfa1.`value`) = DAY(LAST_DAY(pfa1.`value`)) THEN 1 |
| | | ELSE DAY(pfa1.`value`) / DAY(LAST_DAY(pfa1.`value`)) |
| | | END |
| | | / COALESCE(pfc.payment_cycle, 1) |
| | | ), |
| | | 2 |
| | | ) |
| | | ELSE 0 |
| | | END) |
| | | * |
| | | (CASE |
| | | WHEN pfc.computing_formula = '1001' THEN |
| | | ROUND( |
| | | (CASE |
| | | WHEN t.payer_obj_type = 3333 THEN COALESCE(br.built_up_area, 0) |
| | | WHEN t.payer_obj_type = 6666 THEN COALESCE(ps.area, 0) |
| | | ELSE 0 |
| | | END * COALESCE(pfc.square_price, 0) + COALESCE(pfc.additional_amount, 0)), |
| | | 6 |
| | | ) |
| | | WHEN pfc.computing_formula IN ('2002', '3003', '1101', '1102') THEN |
| | | ROUND(COALESCE(pfc.additional_amount, 0), 6) |
| | | WHEN pfc.computing_formula = '4004' THEN |
| | | ROUND( |
| | | CASE WHEN t.amount = -1 THEN 0 ELSE COALESCE(t.amount, 0) END, |
| | | 6 |
| | | ) |
| | | ELSE 0 |
| | | END), |
| | | pfc.decimal_place |
| | | ) |
| | | WHEN t.fee_flag = '2006012' THEN -- 一次性费用 |
| | | CASE |
| | | WHEN pfc.computing_formula = '1001' THEN |
| | | ROUND( |
| | | (CASE |
| | | WHEN t.payer_obj_type = 3333 THEN COALESCE(br.built_up_area, 0) |
| | | WHEN t.payer_obj_type = 6666 THEN COALESCE(ps.area, 0) |
| | | ELSE 0 |
| | | END * COALESCE(pfc.square_price, 0) + COALESCE(pfc.additional_amount, 0)), |
| | | pfc.decimal_place |
| | | ) |
| | | WHEN pfc.computing_formula IN ('2002', '3003', '1101', '1102') THEN |
| | | ROUND(COALESCE(pfc.additional_amount, 0), pfc.decimal_place) |
| | | WHEN pfc.computing_formula = '4004' THEN |
| | | ROUND( |
| | | CASE WHEN t.amount = -1 THEN 0 ELSE COALESCE(t.amount, 0) END, |
| | | pfc.decimal_place |
| | | ) |
| | | ELSE 0 |
| | | END |
| | | ELSE 0 |
| | | END |
| | | ), 2) as '当年应缴总金额', |
| | | -- 新增:每月费用 = 当年应缴总金额 / 每月费用月份数 |
| | | ROUND( |
| | | SUM( |
| | | CASE |
| | | WHEN t.fee_flag = '1003006' THEN |
| | | ROUND( |
| | | (CASE |
| | | WHEN t.fee_flag = '1003006' THEN |
| | | ROUND( |
| | | ( |
| | | TIMESTAMPDIFF(MONTH, t.start_time, LAST_DAY(pfa1.`value`)) |
| | | + CASE |
| | | WHEN DAY(pfa1.`value`) = DAY(LAST_DAY(pfa1.`value`)) THEN 1 |
| | | ELSE DAY(pfa1.`value`) / DAY(LAST_DAY(pfa1.`value`)) |
| | | END |
| | | / COALESCE(pfc.payment_cycle, 1) |
| | | ), |
| | | 2 |
| | | ) |
| | | ELSE 0 |
| | | END) |
| | | * |
| | | (CASE |
| | | WHEN pfc.computing_formula = '1001' THEN |
| | | ROUND( |
| | | (CASE |
| | | WHEN t.payer_obj_type = 3333 THEN COALESCE(br.built_up_area, 0) |
| | | WHEN t.payer_obj_type = 6666 THEN COALESCE(ps.area, 0) |
| | | ELSE 0 |
| | | END * COALESCE(pfc.square_price, 0) + COALESCE(pfc.additional_amount, 0)), |
| | | 6 |
| | | ) |
| | | WHEN pfc.computing_formula IN ('2002', '3003', '1101', '1102') THEN |
| | | ROUND(COALESCE(pfc.additional_amount, 0), 6) |
| | | WHEN pfc.computing_formula = '4004' THEN |
| | | ROUND( |
| | | CASE WHEN t.amount = -1 THEN 0 ELSE COALESCE(t.amount, 0) END, |
| | | 6 |
| | | ) |
| | | ELSE 0 |
| | | END), |
| | | pfc.decimal_place |
| | | ) |
| | | WHEN t.fee_flag = '2006012' THEN |
| | | CASE |
| | | WHEN pfc.computing_formula = '1001' THEN |
| | | ROUND( |
| | | (CASE |
| | | WHEN t.payer_obj_type = 3333 THEN COALESCE(br.built_up_area, 0) |
| | | WHEN t.payer_obj_type = 6666 THEN COALESCE(ps.area, 0) |
| | | ELSE 0 |
| | | END * COALESCE(pfc.square_price, 0) + COALESCE(pfc.additional_amount, 0)), |
| | | pfc.decimal_place |
| | | ) |
| | | WHEN pfc.computing_formula IN ('2002', '3003', '1101', '1102') THEN |
| | | ROUND(COALESCE(pfc.additional_amount, 0), pfc.decimal_place) |
| | | WHEN pfc.computing_formula = '4004' THEN |
| | | ROUND( |
| | | CASE WHEN t.amount = -1 THEN 0 ELSE COALESCE(t.amount, 0) END, |
| | | pfc.decimal_place |
| | | ) |
| | | ELSE 0 |
| | | END |
| | | ELSE 0 |
| | | END |
| | | ) / MAX(CASE |
| | | WHEN YEAR(t.start_time) = YEAR(bc.create_time) THEN |
| | | 12 - MONTH(bc.create_time) + 1 |
| | | ELSE 12 |
| | | END), |
| | | 2 |
| | | ) as '每月费用(合计/月份数)' |
| | | from pay_fee t |
| | | inner join pay_fee_config pfc on t.config_id = pfc.config_id and pfc.status_cd = '0' |
| | | inner join business_community bc on t.community_id = bc.community_id |
| | | left join t_dict td1 on pfc.fee_type_cd = td1.status_cd and td1.table_name = 'pay_fee_config' and td1.table_columns = 'fee_type_cd' |
| | | left join pay_fee_attrs pfa1 on t.fee_id = pfa1.fee_id and pfa1.spec_cd = '390010' and pfa1.status_cd = '0' |
| | | left join building_room br on t.payer_obj_type = 3333 and t.payer_obj_id = br.room_id and br.status_cd = '0' |
| | | left join owner_car oc on t.payer_obj_type = 6666 and t.payer_obj_id = oc.car_id and oc.status_cd = '0' |
| | | left join parking_space ps on oc.ps_id = ps.ps_id and ps.status_cd = '0' |
| | | where 1 = 1 |
| | | and t.status_cd = 0 |
| | | and t.community_id = #{communityId} |
| | | and pfc.community_id in (#{communityId}, '9999') |
| | | group by td1.`name`, t.fee_type_cd, YEAR(t.start_time) |
| | | order by t.fee_type_cd,YEAR(t.start_time) desc, td1.`name` |
| | | WHEN 行类型 = '总合计' THEN 2 |
| | | WHEN 行类型 = '类型总计' THEN 0 |
| | | ELSE 1 |
| | | END, |
| | | fee_type_cd, |
| | | CASE WHEN 费用所属年份 = '类型总计' THEN 0 ELSE CAST(费用所属年份 AS UNSIGNED) END; |
| | | |
| | | </select> |
| | | </mapper> |