feat(bms):新增费用统计分析报表,科目按模板类别归并、仓储拆散租/固定出租两行、行级占营收比,含34列导出与智能分析归因

This commit is contained in:
rcx
2026-08-19 15:36:53 +08:00
parent dd0bf32c35
commit 83f05dd11d
19 changed files with 1893 additions and 0 deletions
@@ -0,0 +1,77 @@
<?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="com.mhd.bms.domain.feeAnalysisReport.repository.mapper.FeeAnalysisReportMapper">
<!-- 公共统计口径:软删/已审核已出账/未红冲/收支方向/组织(组织条件由 §6.5 fillAuthScope 决定是否传入) -->
<sql id="common_stat_where">
bs.DEL_FLAG = 1
AND bs.BILLING_STATE IN (2, 3)
AND bs.RED_FLUSH_STATE = 1
AND bs.ACCOUNT_EXPENSE_TYPE = #{accountExpenseType}
<if test="topOrganizationId != null">
AND bs.TOP_ORGANIZATION_ID = #{topOrganizationId}
</if>
<if test="organizationId != null">
AND bs.ORGANIZATION_ID = #{organizationId}
</if>
</sql>
<!-- 科目×年月汇总:统计区间跨两个年度(本年+上年),季度组装在Java侧完成 -->
<select id="sumBySubjectAndMonth"
resultType="com.mhd.bms.domain.feeAnalysisReport.repository.po.FeeSubjectMonthStatPO">
SELECT
bs.FIRST_SUBJECT_CODE AS firstSubjectCode,
bs.FIRST_SUBJECT_NAME AS firstSubjectName,
bs.SECOND_SUBJECT_CODE AS secondSubjectCode,
bs.SECOND_SUBJECT_NAME AS secondSubjectName,
SUBSTR(TO_CHAR(bs.BUSINESS_DATE, 'YYYY-MM'), 1, 7) AS statMonth,
SUM(bs.BILLING_AMOUNT) AS totalAmount,
CASE WHEN bd.DOCUMENT_FORM_JSON LIKE '%"lease_area":0,%' THEN 'SCATTERED' ELSE 'FIXED' END AS pushMode
FROM BILLING_STATEMENT bs
LEFT JOIN BUSINESS_DOCUMENT bd ON bd.BUSINESS_DOCUMENT_ID = bs.BUSINESS_DOCUMENT_ID
WHERE <include refid="common_stat_where"/>
AND bs.BUSINESS_DATE &gt;= TO_DATE(#{beginDate}, 'YYYY-MM-DD')
AND bs.BUSINESS_DATE &lt; TO_DATE(#{endDate}, 'YYYY-MM-DD')
GROUP BY bs.FIRST_SUBJECT_CODE, bs.FIRST_SUBJECT_NAME,
bs.SECOND_SUBJECT_CODE, bs.SECOND_SUBJECT_NAME,
CASE WHEN bd.DOCUMENT_FORM_JSON LIKE '%"lease_area":0,%' THEN 'SCATTERED' ELSE 'FIXED' END,
SUBSTR(TO_CHAR(bs.BUSINESS_DATE, 'YYYY-MM'), 1, 7)
</select>
<!-- 智能分析:科目×客户×年月,WHERE同上(传入区间覆盖"本期季度+基期季度"两个月窗),用于客户归因 -->
<select id="sumBySubjectAndCustomer"
resultType="com.mhd.bms.domain.feeAnalysisReport.repository.po.FeeSubjectMonthStatPO">
SELECT
bs.FIRST_SUBJECT_CODE AS firstSubjectCode,
bs.FIRST_SUBJECT_NAME AS firstSubjectName,
bs.SECOND_SUBJECT_CODE AS secondSubjectCode,
bs.SECOND_SUBJECT_NAME AS secondSubjectName,
bs.SETTLEMENT_ENTITY AS customerName,
SUBSTR(TO_CHAR(bs.BUSINESS_DATE, 'YYYY-MM'), 1, 7) AS statMonth,
SUM(bs.BILLING_AMOUNT) AS totalAmount,
CASE WHEN bd.DOCUMENT_FORM_JSON LIKE '%"lease_area":0,%' THEN 'SCATTERED' ELSE 'FIXED' END AS pushMode
FROM BILLING_STATEMENT bs
LEFT JOIN BUSINESS_DOCUMENT bd ON bd.BUSINESS_DOCUMENT_ID = bs.BUSINESS_DOCUMENT_ID
WHERE <include refid="common_stat_where"/>
AND bs.BUSINESS_DATE &gt;= TO_DATE(#{beginDate}, 'YYYY-MM-DD')
AND bs.BUSINESS_DATE &lt; TO_DATE(#{endDate}, 'YYYY-MM-DD')
GROUP BY bs.FIRST_SUBJECT_CODE, bs.FIRST_SUBJECT_NAME,
bs.SECOND_SUBJECT_CODE, bs.SECOND_SUBJECT_NAME,
CASE WHEN bd.DOCUMENT_FORM_JSON LIKE '%"lease_area":0,%' THEN 'SCATTERED' ELSE 'FIXED' END,
SUBSTR(TO_CHAR(bs.BUSINESS_DATE, 'YYYY-MM'), 1, 7)
</select>
<!-- 年份下拉(降序) -->
<select id="selectDistinctYears" resultType="java.lang.String">
SELECT DISTINCT SUBSTR(TO_CHAR(bs.BUSINESS_DATE, 'YYYY'), 1, 4)
FROM BILLING_STATEMENT bs
WHERE bs.DEL_FLAG = 1
AND bs.BILLING_STATE IN (2, 3)
AND bs.RED_FLUSH_STATE = 1
AND bs.ACCOUNT_EXPENSE_TYPE = #{accountExpenseType}
<if test="topOrganizationId != null">
AND bs.TOP_ORGANIZATION_ID = #{topOrganizationId}
</if>
ORDER BY 1 DESC
</select>
</mapper>