<?xml version="1.0" encoding="UTF-8" ?>
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
"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年收费金额(元)',
|
|
-- 今年按月统计(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) -- 按年份分组
|
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`
|
|
</select>
|
</mapper>
|