chengf
2025-08-20 b4de49622a64e15d673f2716f126734e339e5977
java110-db/src/main/resources/mapper/fee/ReportFeeServiceDaoImplMapper.xml
@@ -3,396 +3,268 @@
        "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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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 &lt; '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>