Commit d6998bcf by zhangxingmin

push

parent 69d67a28
......@@ -68,14 +68,46 @@
</where>
</select>
<select id="receivableReportPage" resultType="com.yd.csf.service.vo.ReceivableReportVO">
<!-- 预先获取每个 policy_biz_id 对应的第一条保单持有人和受保人信息 -->
<!-- 使用子查询 + MIN(id) 方式,兼容 MySQL 5.7 -->
SELECT
tmp.*
FROM (
-- 关联保单应收单部分
SELECT
<!-- 完全对齐 getQueryWrapper 的条件 -->
<choose>
<!-- 如果 commissionBizType 有值且不为空,只查对应类型 -->
<when test="query.commissionBizType != null and query.commissionBizType != ''">
<if test="query.commissionBizType == 'R'">
SELECT * FROM (
<include refid="receivableReportRSql"/>
WHERE ce.commission_biz_type = 'R'
<include refid="receivableReportWhereCommon"/>
) tmp
</if>
<if test="query.commissionBizType == 'U'">
SELECT * FROM (
<include refid="receivableReportUSql"/>
WHERE ce.commission_biz_type = 'U'
<include refid="receivableReportWhereCommon"/>
) tmp
</if>
</when>
<!-- 否则 UNION ALL 两种类型 -->
<otherwise>
SELECT * FROM (
<include refid="receivableReportRSql"/>
WHERE ce.commission_biz_type = 'R'
<include refid="receivableReportWhereCommon"/>
UNION ALL
<include refid="receivableReportUSql"/>
WHERE ce.commission_biz_type = 'U'
<include refid="receivableReportWhereCommon"/>
) tmp
</otherwise>
</choose>
<include refid="receivableReportOrderBy"/>
</select>
<!-- R 类型主查询(不含 WHERE 条件) -->
<sql id="receivableReportRSql">
SELECT
NULL AS receivableNo,
ce.policy_no AS policyNo,
ph.name AS policyHolder,
......@@ -96,39 +128,36 @@
IFNULL(SUM(ce.paid_amount), 0) AS paidAmount,
IFNULL(SUM(ce.expected_amount) - SUM(ce.paid_amount), 0) AS unpaidAmount,
CASE WHEN IFNULL(SUM(ce.expected_amount), 0) > 0
THEN ROUND(IFNULL(SUM(ce.paid_amount), 0) / IFNULL(SUM(ce.expected_amount), 0) * 100, 2)
ELSE 0
THEN ROUND(IFNULL(SUM(ce.paid_amount), 0) / IFNULL(SUM(ce.expected_amount), 0) * 100, 2)
ELSE 0
END AS paidRatio,
CASE WHEN IFNULL(SUM(ce.expected_amount), 0) > 0
THEN ROUND((IFNULL(SUM(ce.expected_amount), 0) - IFNULL(SUM(ce.paid_amount), 0)) / IFNULL(SUM(ce.expected_amount), 0) * 100, 2)
ELSE 0
THEN ROUND((IFNULL(SUM(ce.expected_amount), 0) - IFNULL(SUM(ce.paid_amount), 0)) / IFNULL(SUM(ce.expected_amount), 0) * 100, 2)
ELSE 0
END AS unpaidRatio,
MAX(ce.default_exchange_rate) AS exchangeRate,
MAX(p.insurance_company) AS insuranceCompany,
MAX(p.product_name) AS productName,
IFNULL(AVG(ce.premium), 0) AS premium,
MAX(p.currency) AS policyCurrency
FROM commission_expected ce
LEFT JOIN policy p ON ce.policy_no = p.policy_no
LEFT JOIN (
FROM commission_expected ce
LEFT JOIN policy p ON ce.policy_no = p.policy_no
LEFT JOIN (
SELECT policy_biz_id, name, name_en
FROM policy_policyholder
WHERE id IN (SELECT MIN(id) FROM policy_policyholder GROUP BY policy_biz_id)
) ph ON ph.policy_biz_id = p.policy_biz_id
LEFT JOIN (
) ph ON ph.policy_biz_id = p.policy_biz_id
LEFT JOIN (
SELECT policy_biz_id, name, name_en
FROM policy_insurant
WHERE id IN (SELECT MIN(id) FROM policy_insurant GROUP BY policy_biz_id)
) ins ON ins.policy_biz_id = p.policy_biz_id
WHERE ce.commission_biz_type = 'R'
AND ce.is_deleted = 0
<include refid="receivableReportWhere"/>
GROUP BY ce.policy_no, ce.commission_period
UNION ALL
) ins ON ins.policy_biz_id = p.policy_biz_id
GROUP BY ce.policy_no, ce.commission_period
</sql>
-- 非关联保单应收单部分
SELECT
<!-- U 类型主查询(不含 WHERE 条件) -->
<sql id="receivableReportUSql">
SELECT
ce.receivable_no AS receivableNo,
ce.policy_no AS policyNo,
ph.name AS policyHolder,
......@@ -149,76 +178,126 @@
IFNULL(ce.paid_amount, 0) AS paidAmount,
IFNULL(ce.expected_amount - ce.paid_amount, 0) AS unpaidAmount,
CASE WHEN IFNULL(ce.expected_amount, 0) > 0
THEN ROUND(IFNULL(ce.paid_amount, 0) / IFNULL(ce.expected_amount, 0) * 100, 2)
ELSE 0
THEN ROUND(IFNULL(ce.paid_amount, 0) / IFNULL(ce.expected_amount, 0) * 100, 2)
ELSE 0
END AS paidRatio,
CASE WHEN IFNULL(ce.expected_amount, 0) > 0
THEN ROUND((IFNULL(ce.expected_amount, 0) - IFNULL(ce.paid_amount, 0)) / IFNULL(ce.expected_amount, 0) * 100, 2)
ELSE 0
THEN ROUND((IFNULL(ce.expected_amount, 0) - IFNULL(ce.paid_amount, 0)) / IFNULL(ce.expected_amount, 0) * 100, 2)
ELSE 0
END AS unpaidRatio,
ce.default_exchange_rate AS exchangeRate,
p.insurance_company AS insuranceCompany,
p.product_name AS productName,
IFNULL(ce.premium, 0) AS premium,
NULL AS policyCurrency
FROM commission_expected ce
LEFT JOIN policy p ON ce.policy_no = p.policy_no
LEFT JOIN (
FROM commission_expected ce
LEFT JOIN policy p ON ce.policy_no = p.policy_no
LEFT JOIN (
SELECT policy_biz_id, name, name_en
FROM policy_policyholder
WHERE id IN (SELECT MIN(id) FROM policy_policyholder GROUP BY policy_biz_id)
) ph ON ph.policy_biz_id = p.policy_biz_id
LEFT JOIN (
) ph ON ph.policy_biz_id = p.policy_biz_id
LEFT JOIN (
SELECT policy_biz_id, name, name_en
FROM policy_insurant
WHERE id IN (SELECT MIN(id) FROM policy_insurant GROUP BY policy_biz_id)
) ins ON ins.policy_biz_id = p.policy_biz_id
WHERE ce.commission_biz_type = 'U'
AND ce.is_deleted = 0
<include refid="receivableReportWhere"/>
) tmp
ORDER BY tmp.commissionDate DESC, tmp.policyNo, tmp.commissionPeriod
</select>
) ins ON ins.policy_biz_id = p.policy_biz_id
-- 注意 U 类型没有 GROUP BY,每笔单独显示
</sql>
<!-- 公共 WHERE 条件片段 -->
<sql id="receivableReportWhere">
<!-- 公共 WHERE 条件(完全对应 getQueryWrapper) -->
<sql id="receivableReportWhereCommon">
AND ce.is_deleted = 0
<!-- 1. 空结果处理:queryFlag=true 且 policyNoList 为空 -> 1=0 -->
<if test="query.queryFlag != null and query.queryFlag and (query.policyNoList == null or query.policyNoList.size == 0)">
AND 1=0
</if>
<!-- 2. receivableNo -->
<if test="query.receivableNo != null and query.receivableNo != ''">
AND ce.receivable_no = #{query.receivableNo}
</if>
<!-- 3. policyNo (精确) -->
<if test="query.policyNo != null and query.policyNo != ''">
AND ce.policy_no = #{query.policyNo}
</if>
<!-- 4. policyNoList (IN) -->
<if test="query.policyNoList != null and query.policyNoList.size > 0">
AND ce.policy_no IN
<foreach collection="query.policyNoList" item="no" open="(" close=")" separator=",">
#{no}
</foreach>
</if>
<!-- 5. statusList (IN) -->
<if test="query.statusList != null and query.statusList.size > 0">
AND ce.status IN
<foreach collection="query.statusList" item="status" open="(" close=")" separator=",">
#{status}
</foreach>
</if>
<!-- 6. commissionDateStart -->
<if test="query.commissionDateStart != null">
AND ce.commission_date >= #{query.commissionDateStart}
</if>
<!-- 7. commissionDateEnd -->
<if test="query.commissionDateEnd != null">
AND ce.commission_date &lt;= #{query.commissionDateEnd}
</if>
<!-- 8. commissionPeriod -->
<if test="query.commissionPeriod != null">
AND ce.commission_period = #{query.commissionPeriod}
</if>
<!-- 9. commissionType -->
<if test="query.commissionType != null and query.commissionType != ''">
AND ce.commission_type = #{query.commissionType}
</if>
<!-- 10. reconciliationCompanyBizIdList -->
<if test="query.reconciliationCompanyBizIdList != null and query.reconciliationCompanyBizIdList.size > 0">
AND ce.reconciliation_company_biz_id IN
<foreach collection="query.reconciliationCompanyBizIdList" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
<!-- 11. insurerCompanyBizIdList -->
<if test="query.insurerCompanyBizIdList != null and query.insurerCompanyBizIdList.size > 0">
AND ce.insurance_company_biz_id IN
<foreach collection="query.insurerCompanyBizIdList" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
<!-- 12. productLaunchBizId -->
<if test="query.productLaunchBizId != null and query.productLaunchBizId != ''">
AND ce.product_launch_biz_id = #{query.productLaunchBizId}
</if>
<!-- 可根据需要添加更多条件,如 statusList 等 -->
<!-- 13. teamBizId (使用 EXISTS 子查询,与 getQueryWrapper 完全一致) -->
<if test="query.teamBizId != null and query.teamBizId != ''">
AND EXISTS (
SELECT 1 FROM policy_broker pb
WHERE pb.policy_no = ce.policy_no
AND pb.team_biz_id = #{query.teamBizId}
)
</if>
</sql>
<!-- 排序(默认按 commission_date DESC,支持传入 sortField 和 sortOrder) -->
<sql id="receivableReportOrderBy">
ORDER BY
<choose>
<when test="query.sortField != null and query.sortField != '' and query.sortOrder != null">
<if test="query.sortField == 'reconciliation_company'">reconciliationCompany</if>
<if test="query.sortField == 'commission_name'">commissionName</if>
<if test="query.sortField == 'commission_period'">commissionPeriod</if>
<if test="query.sortField == 'amount'">amount</if>
<if test="query.sortField != 'reconciliation_company' and query.sortField != 'commission_name' and query.sortField != 'commission_period' and query.sortField != 'amount'">
commissionDate
</if>
<if test="query.sortOrder == 'asc'">ASC</if>
<if test="query.sortOrder != 'asc'">DESC</if>
</when>
<otherwise>
commissionDate DESC
</otherwise>
</choose>
, policyNo, commissionPeriod
</sql>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment