chengf
2025-09-02 9faac602a31237bfc67b0b0748af1b31f5302482
java110-db/src/main/resources/mapper/fee/ReportFeeServiceDaoImplMapper.xml
@@ -4,52 +4,154 @@
<mapper namespace="reportFeeServiceDaoImpl">
    <select id="repostInFee" resultType="java.util.Map">
        SELECT
        fee_type_cd AS 'fee_type_cd',
        detail_year,
        ROUND(SUM(CASE WHEN detail_year BETWEEN ${startYear} AND ${endYear} THEN receivable_amount ELSE 0 END), 2) AS '该年应缴总额',
        f.fee_type_cd AS 'fee_type_cd',
        f.detail_year,
        ROUND(SUM(CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} THEN f.receivable_amount ELSE 0 END), 2) AS '该年应缴总额',
        ROUND(
        CASE
        WHEN SUM(CASE WHEN detail_year BETWEEN ${startYear} AND ${endYear} THEN receivable_amount ELSE 0 END) = 0 THEN 0
        ELSE SUM(CASE WHEN detail_year BETWEEN ${startYear} AND ${endYear} THEN received_amount ELSE 0 END)
        / SUM(CASE WHEN detail_year BETWEEN ${startYear} AND ${endYear} THEN receivable_amount ELSE 0 END) * 100
        WHEN SUM(CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} THEN f.receivable_amount ELSE 0 END) = 0 THEN 0
        ELSE SUM(CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} AND f.detail_id != -1 THEN d.received_amount ELSE 0 END)
        / SUM(CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} THEN f.receivable_amount ELSE 0 END) * 100
        END, 2
        ) AS '当年收缴率',
        ROUND(SUM(CASE WHEN detail_year BETWEEN ${startYear} AND ${endYear} THEN discount_amount ELSE 0 END), 2) AS '折扣金额',
        ROUND(SUM(CASE
        WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} AND f.detail_id != -1 THEN d.discount_amount
        ELSE 0
        END), 2) AS '折扣金额',
        <foreach collection="yearList" item="year" separator=",">
            <if test="year != endYear">  <!-- 排除最后一年,最后一年单独处理为“当年实缴” -->
                ROUND(SUM(CASE WHEN detail_year = ${year} THEN received_amount ELSE 0 END), 2) AS '${year}年实缴'
                ROUND(SUM(CASE
                WHEN YEAR(d.create_time) = ${year} AND f.detail_id != -1 THEN d.received_amount
                ELSE 0
                END), 2) AS '${year}年实缴'
            </if>
        </foreach>,
        ROUND(SUM(CASE WHEN detail_year = ${endYear} THEN receivable_amount ELSE 0 END), 2) AS '当年预算',
        ROUND(SUM(CASE WHEN detail_year = ${endYear} THEN received_amount ELSE 0 END), 2) AS '${endYear}年实缴',
        ROUND(SUM(CASE WHEN detail_year = ${endYear} THEN discount_amount ELSE 0 END), 2) AS '当年折扣总额',
        ROUND(SUM(CASE WHEN detail_year = ${endYear} THEN receivable_amount - received_amount ELSE 0 END), 2) AS '当年欠款',
        ROUND(SUM(CASE WHEN f.detail_year = ${endYear} THEN f.receivable_amount ELSE 0 END), 2) AS '当年预算',
        ROUND(SUM(CASE WHEN YEAR(d.create_time) = ${endYear} AND f.detail_id != -1 THEN d.received_amount ELSE 0 END), 2) AS '${endYear}年实缴',
        ROUND(SUM(CASE WHEN YEAR(d.create_time) = ${endYear} AND f.detail_id != -1 THEN d.discount_amount ELSE 0 END), 2) AS '当年折扣总额',
        ROUND(SUM(CASE WHEN YEAR(d.create_time) = ${endYear} AND f.detail_id != -1 THEN d.receivable_amount ELSE 0 END), 2) AS '当年欠款',
        <foreach collection="monthList" item="month" separator=",">
            ROUND(SUM(CASE WHEN detail_year = ${endYear} AND detail_month = ${month} THEN received_amount ELSE 0 END), 2) AS '当年${month}月实缴'
            ROUND(SUM(CASE
            WHEN YEAR(d.create_time) = 2027 AND MONTH(d.create_time) = 1 AND f.detail_id != -1 THEN d.received_amount
            ELSE 0 END), 2) AS '当年${month}月实缴'
        </foreach>,
        ROUND(AVG(CASE WHEN detail_year BETWEEN ${startYear} AND ${endYear} THEN receivable_amount ELSE NULL END), 2) AS '每月费用',
        COUNT(DISTINCT CASE WHEN detail_year BETWEEN ${startYear} AND ${endYear} THEN CONCAT(detail_year, '-', detail_month) END) AS '应收月份数',
        ROUND(AVG(CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} THEN f.receivable_amount ELSE NULL END), 2) AS '每月费用',
        COUNT(DISTINCT CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} THEN CONCAT(f.detail_year, '-', f.detail_month) END) AS '应收月份数',
        CASE
        WHEN detail_year IS NULL THEN '类型总计'
        ELSE CAST(detail_year AS CHAR)
        WHEN f.detail_year IS NULL THEN '类型总计'
        ELSE CAST(f.detail_year AS CHAR)
        END AS '费用所属年份'
        FROM
        pay_fee_detail_month
        pay_fee_detail_month f
        LEFT JOIN pay_fee_detail d on d.detail_id = f.detail_id
        WHERE
        community_id = #{communityId}
        AND detail_year BETWEEN ${startYear} AND ${endYear}  <!-- 动态年份过滤 -->
        f.community_id = #{communityId}
        AND f.detail_year BETWEEN ${startYear} AND ${endYear}  <!-- 动态年份过滤 -->
        GROUP BY
        fee_type_cd, detail_year
        f.fee_type_cd, f.detail_year
        WITH ROLLUP;
    </select>
    <select id="countRepostPaidInFeeByWhiteOrder" parameterType="Map" resultType="Map">
        WITH RECURSIVE year_ranges AS (
        -- 基础查询:与原SQL一致,生成初始数据和递归所需字段
        SELECT
        ROW_NUMBER() OVER () AS row1,
        bc.`name` AS row2,
        ROW_NUMBER() OVER () AS row3,
        pfd.create_time AS row4,
        pw.invoice_receipt_no AS row5,
        br.property_address AS row6,
        br.door_room_num AS row7,
        CONCAT(pfd.start_time, ' 至 ', pfd.end_time) AS row8,
        YEAR(pfd.start_time) AS row9,
        YEAR(pfd.end_time) AS row10,
        pfc.fee_name AS row11,
        pfd.received_amount AS row12,
        pfd.cashier_name AS row13,
        pw.bank_deposit_date AS row14,
        pw.bank_depositor AS row15,
        pw.bank_deposit_amount AS row16,
        pw.split_bank_deposit_amount AS row17,
        pw.check_amount AS row18,
        pw.white_list_archive_no AS row19,
        pw.sheet_count AS row20,
        pw.financial_receiver AS row21,
        pw.input_time AS row22,
        pw.input_person AS row23,
        pw.input_time AS row24,
        YEAR(pw.input_time) AS row25,
        pw.license_plate AS row26,
        pw.category_22 AS row27,
        YEAR(pfd.start_time) AS current_year,  -- 递归起始年份
        YEAR(pfd.end_time) AS end_year,        -- 递归终止年份
        pfd.start_time AS original_start,
        pfd.end_time AS original_end
        FROM pay_fee_detail pfd
        LEFT JOIN s_community bc ON bc.community_id = pfd.community_id
        LEFT JOIN pay_fee pf ON pf.fee_id = pfd.fee_id
        LEFT JOIN building_room br ON br.room_id = pf.payer_obj_id
        LEFT JOIN pay_fee_config pfc ON pf.config_id = pfc.config_id
        LEFT JOIN property_white_list_flow pw
        ON pfd.create_time = pw.input_time
        AND pfd.start_time = pw.charge_start
        AND pfd.cashier_name = pw.charger
        WHERE pfd.state = 1400
        <if test="communityId != null">
            AND pfd.community_id = #{communityId}  -- 保留原社区筛选条件
        </if>
        UNION ALL
        -- 递归查询:与原SQL一致,递增年份生成中间记录
        SELECT
        row1,
        row2,
        row3,
        row4,
        row5,
        row6,
        row7,
        row8,
        row9,
        row10,
        row11,
        row12,
        row13,
        row14,
        row15,
        row16,
        row17,
        row18,
        row19,
        row20,
        row21,
        row22,
        row23,
        row24,
        row25,
        row26,
        row27,
        current_year + 1 AS current_year,
        end_year,
        original_start,
        original_end
        FROM year_ranges
        WHERE current_year + 1 &lt;= end_year  -- 递归终止条件:年份未超过结束年
        )
        -- 核心:统计递归结果集的总条数
        SELECT COUNT(*) AS count
        FROM year_ranges;
    </select>
    <select id="repostPaidInFeeByWhiteOrder" resultType="java.util.Map">
        WITH RECURSIVE year_ranges AS (
        -- 基础查询:获取所有需要的字段并计算起始年份和结束年份