|
|
@@ -0,0 +1,262 @@
|
|
|
+<?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.jzg.console.quotationReport.mapper.QuotationReportMapper">
|
|
|
+ <!-- 订单先过滤、费用按订单聚合,避免费用一对多放大订单数和金额。筛选列不套函数以便使用索引。 -->
|
|
|
+ <sql id="base">
|
|
|
+ WITH orders AS (
|
|
|
+ SELECT o.id,o.quote_no,o.agreement_id,o.company_id,o.company_name,o.product_id,o.product_name,
|
|
|
+ o.order_status,o.entry_status,o.audit_status,o.real_quote_user_id,o.order_source,
|
|
|
+ o.docking_person,o.docking_person_phone,o.create_time,o.signing_time,o.parent_id,o.system_code,
|
|
|
+ ioci.license_no, ioci.vin_no, ioci.brand_name, ioci.engine_no,o.quote_time,
|
|
|
+ COALESCE(ifo.total_premium, 0) total_premium,
|
|
|
+ COALESCE(ifo.jq_premium, 0) jq_premium,
|
|
|
+ COALESCE(ifo.sy_premium, 0) sy_premium,
|
|
|
+ COALESCE(ifo.jy_premium, 0) jy_premium
|
|
|
+ FROM ins_orders o LEFT JOIN ins_orders_car_info ioci ON o.id = ioci.order_no
|
|
|
+ left join ins_fee_orders ifo on o.id = ifo.order_no
|
|
|
+ LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
|
|
|
+ LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
|
|
|
+ WHERE o.is_delete = 0
|
|
|
+
|
|
|
+ <if test="q != null and q.partnerCompanyIds != null and q.partnerCompanyIds.size() > 0">
|
|
|
+ AND a.partner_company_id IN
|
|
|
+ <foreach collection="q.partnerCompanyIds" item="v" open="(" separator="," close=")">#{v}</foreach>
|
|
|
+ </if>
|
|
|
+ <if test="q != null and q.companyId != null and q.companyId != ''">AND o.company_id = #{q.companyId}</if>
|
|
|
+ <if test="q != null and q.createTimeBegin != null and q.createTimeBegin != ''">AND o.create_time >= #{q.createTimeBegin}</if>
|
|
|
+ <if test="q != null and q.createTimeEnd != null and q.createTimeEnd != ''">AND o.create_time < #{q.createTimeEnd}</if>
|
|
|
+ <if test="q != null and q.signTimeBegin != null and q.signTimeBegin != ''">AND o.signing_time >= #{q.signTimeBegin}</if>
|
|
|
+ <if test="q != null and q.signTimeEnd != null and q.signTimeEnd != ''">AND o.signing_time < #{q.signTimeEnd}</if>
|
|
|
+ <if test="q != null and q.orderStatus != null and q.orderStatus.size() > 0">
|
|
|
+ AND o.order_status IN <foreach collection="q.orderStatus" item="v" open="(" separator="," close=")">#{v}</foreach>
|
|
|
+ </if>
|
|
|
+ <if test="q != null and q.orderSource != null and q.orderSource.size() > 0">
|
|
|
+ AND o.order_source IN <foreach collection="q.orderSource" item="v" open="(" separator="," close=")">#{v}</foreach>
|
|
|
+ </if>
|
|
|
+ <if test="q != null and q.productType != null and q.productType.size() > 0">
|
|
|
+ AND o.product_id IN <foreach collection="q.productType" item="v" open="(" separator="," close=")">#{v}</foreach>
|
|
|
+ </if>
|
|
|
+ <if test="q != null and q.riskTypes != null and q.riskTypes.size() > 0">
|
|
|
+ AND o.product_id IN <foreach collection="q.riskTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
|
|
|
+ </if>
|
|
|
+ <if test="q != null and q.salesmanName != null and q.salesmanName != ''">AND o.real_quote_user_id LIKE CONCAT('%',#{q.salesmanName},'%')</if>
|
|
|
+ <if test="q != null and q.salesmanPhone != null and q.salesmanPhone != ''">AND o.real_quote_user_id = #{q.salesmanPhone}</if>
|
|
|
+ <if test="q != null and q.manageName != null and q.manageName != ''">AND o.docking_person LIKE CONCAT('%',#{q.manageName},'%')</if>
|
|
|
+ <if test="q != null and q.managePhone != null and q.managePhone != ''">AND o.docking_person_phone = #{q.managePhone}</if>
|
|
|
+ <if test="q != null and q.orderTypes != null and q.orderTypes.size() > 0">
|
|
|
+ AND o.entry_status IN <foreach collection="q.orderTypes" item="v" open="(" separator="," close=")">#{v}</foreach>
|
|
|
+ </if>
|
|
|
+ <if test="q != null and q.systemCode != null and q.systemCode != ''">AND o.system_code =
|
|
|
+ #{q.systemCode}
|
|
|
+ </if>
|
|
|
+ <if test="q != null and q.orgIds != null and q.orgIds.size() > 0">
|
|
|
+ AND o.real_quote_user_id IN ( <foreach collection="q.orgIds" item="orgId" separator="UNION ALL">
|
|
|
+ SELECT su.mobile
|
|
|
+ FROM sys_organization_user_link soul
|
|
|
+ LEFT JOIN sys_user su ON soul.user_id = su.id
|
|
|
+ WHERE soul.organization_id = #{orgId}
|
|
|
+ AND soul.is_delete = 0
|
|
|
+ AND su.is_delete = 0
|
|
|
+ </foreach>
|
|
|
+ )
|
|
|
+ </if>
|
|
|
+ )
|
|
|
+ </sql>
|
|
|
+
|
|
|
+ <select id="quotationPage" resultType="com.jzg.commons.entity.report.dto.ReportQuotationOrderDataDto">
|
|
|
+ <include refid="base"/>
|
|
|
+ ,
|
|
|
+ <!-- 车辆维度聚合统计 -->
|
|
|
+ car_stat AS (
|
|
|
+ SELECT
|
|
|
+ license_no,
|
|
|
+ engine_no,
|
|
|
+ vin_no,
|
|
|
+ brand_name,
|
|
|
+ COUNT(id) AS quoteOrderNum,
|
|
|
+ COUNT(id) AS quoteCountNum,
|
|
|
+ MIN(NULLIF(total_premium, 0)) AS minPremium,
|
|
|
+ MAX(total_premium) AS maxPremium,
|
|
|
+ SUM(CASE WHEN order_status = 5 THEN total_premium ELSE 0 END) AS dealPremium
|
|
|
+ FROM orders
|
|
|
+ GROUP BY license_no, engine_no, vin_no, brand_name
|
|
|
+ ),
|
|
|
+ <!-- 单独提取成交保险公司(一台车可能多条成交,用GROUP_CONCAT拼接 -->
|
|
|
+ car_company AS (
|
|
|
+ SELECT
|
|
|
+ license_no,
|
|
|
+ engine_no,
|
|
|
+ vin_no,
|
|
|
+ brand_name,
|
|
|
+ GROUP_CONCAT(DISTINCT company_name SEPARATOR '、') AS dealCompanyName
|
|
|
+ FROM orders
|
|
|
+ WHERE order_status = 5
|
|
|
+ GROUP BY license_no, engine_no, vin_no, brand_name
|
|
|
+ )
|
|
|
+ SELECT
|
|
|
+ s.license_no,
|
|
|
+ s.engine_no,
|
|
|
+ s.vin_no,
|
|
|
+ s.brand_name,
|
|
|
+ s.quoteOrderNum,
|
|
|
+ s.quoteCountNum,
|
|
|
+ s.minPremium,
|
|
|
+ s.maxPremium,
|
|
|
+ IFNULL(c.dealCompanyName, '') AS dealCompanyName,
|
|
|
+ s.dealPremium
|
|
|
+ FROM car_stat s
|
|
|
+ LEFT JOIN car_company c
|
|
|
+ ON s.license_no = c.license_no
|
|
|
+ AND s.engine_no = c.engine_no
|
|
|
+ AND s.vin_no = c.vin_no
|
|
|
+ AND s.brand_name = c.brand_name
|
|
|
+ ORDER BY s.vin_no
|
|
|
+
|
|
|
+ </select>
|
|
|
+ <select id="quotationExport" resultType="com.jzg.commons.entity.report.dto.ReportQuotationOrderDataDto">
|
|
|
+ <include refid="base"/>
|
|
|
+ ,
|
|
|
+ <!-- 车辆维度聚合统计 -->
|
|
|
+ car_stat AS (
|
|
|
+ SELECT
|
|
|
+ license_no,
|
|
|
+ engine_no,
|
|
|
+ vin_no,
|
|
|
+ brand_name,
|
|
|
+ COUNT(id) AS quoteOrderNum,
|
|
|
+ COUNT(id) AS quoteCountNum,
|
|
|
+ MIN(NULLIF(total_premium, 0)) AS minPremium,
|
|
|
+ MAX(total_premium) AS maxPremium,
|
|
|
+ SUM(CASE WHEN order_status = 5 THEN total_premium ELSE 0 END) AS dealPremium
|
|
|
+ FROM orders
|
|
|
+ GROUP BY license_no, engine_no, vin_no, brand_name
|
|
|
+ ),
|
|
|
+ <!-- 单独提取成交保险公司(一台车可能多条成交,用GROUP_CONCAT拼接 -->
|
|
|
+ car_company AS (
|
|
|
+ SELECT
|
|
|
+ license_no,
|
|
|
+ engine_no,
|
|
|
+ vin_no,
|
|
|
+ brand_name,
|
|
|
+ GROUP_CONCAT(DISTINCT company_name SEPARATOR '、') AS dealCompanyName
|
|
|
+ FROM orders
|
|
|
+ WHERE order_status = 5
|
|
|
+ GROUP BY license_no, engine_no, vin_no, brand_name
|
|
|
+ )
|
|
|
+ SELECT
|
|
|
+ s.license_no,
|
|
|
+ s.engine_no,
|
|
|
+ s.vin_no,
|
|
|
+ s.brand_name,
|
|
|
+ s.quoteOrderNum,
|
|
|
+ s.quoteCountNum,
|
|
|
+ s.minPremium,
|
|
|
+ s.maxPremium,
|
|
|
+ IFNULL(c.dealCompanyName, '') AS dealCompanyName,
|
|
|
+ s.dealPremium
|
|
|
+ FROM car_stat s
|
|
|
+ LEFT JOIN car_company c
|
|
|
+ ON s.license_no = c.license_no
|
|
|
+ AND s.engine_no = c.engine_no
|
|
|
+ AND s.vin_no = c.vin_no
|
|
|
+ AND s.brand_name = c.brand_name
|
|
|
+ ORDER BY s.vin_no
|
|
|
+
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="companyPage" resultType="com.jzg.commons.entity.report.dto.ReportCompanyQuotationDataDto">
|
|
|
+ <include refid="base"/>,
|
|
|
+ company_stat AS (
|
|
|
+ SELECT
|
|
|
+ o.company_id AS companyId,
|
|
|
+ o.company_name AS companyName,
|
|
|
+ COALESCE(a.partner_company_id,'') partnerCompanyId,
|
|
|
+ COALESCE(pc.name_simple,'') partnerCompanyName,
|
|
|
+ COUNT(o.id) AS quoteCountNum,
|
|
|
+ SUM(CASE WHEN o.order_status IN (1,2,3,4,5,7) THEN 1 ELSE 0 END) AS quoteSuccessNum,
|
|
|
+ SUM(CASE WHEN o.order_status = 6 THEN 1 ELSE 0 END) AS quoteFailNum,
|
|
|
+ SUM(CASE WHEN o.quote_time IS NOT NULL THEN CAST(o.quote_time AS DECIMAL(10,2)) ELSE 0 END) AS total_quote_second,
|
|
|
+ COUNT(CASE WHEN o.quote_time IS NOT NULL THEN 1 END) AS valid_quote_count,
|
|
|
+ SUM(CASE WHEN o.order_status IN (2,3,4,5,7) THEN 1 ELSE 0 END) AS waitAuditNum,
|
|
|
+ SUM(CASE WHEN o.order_status = 3 THEN 1 ELSE 0 END) AS staffProcessNum,
|
|
|
+ SUM(CASE WHEN o.order_status IN (4,5) THEN 1 ELSE 0 END) AS underwritPassNum,
|
|
|
+ SUM(CASE WHEN o.order_status = 7 THEN 1 ELSE 0 END) AS underwritRejectNum,
|
|
|
+ SUM(CASE WHEN o.order_status = 5 THEN 1 ELSE 0 END) AS dealOrderNum,
|
|
|
+ SUM(COUNT(*)) OVER () AS totalQuoteNum
|
|
|
+ FROM orders o
|
|
|
+ LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
|
|
|
+ LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
|
|
|
+ GROUP BY o.company_id, o.company_name,a.partner_company_id,pc.name_simple
|
|
|
+ )
|
|
|
+ SELECT
|
|
|
+ companyId,
|
|
|
+ companyName,
|
|
|
+ partnerCompanyId,
|
|
|
+ partnerCompanyName,
|
|
|
+ quoteCountNum,
|
|
|
+ ROUND(quoteCountNum * 100.0 / totalQuoteNum, 2) AS quoteCountNumProportion,
|
|
|
+ quoteSuccessNum,
|
|
|
+ quoteFailNum,
|
|
|
+ CASE WHEN valid_quote_count = 0 THEN 0.00
|
|
|
+ ELSE ROUND(total_quote_second / valid_quote_count, 2)
|
|
|
+ END AS avgQuoteTime,
|
|
|
+ waitAuditNum,
|
|
|
+ staffProcessNum,
|
|
|
+ underwritPassNum,
|
|
|
+ underwritRejectNum,
|
|
|
+ CASE WHEN waitAuditNum = 0 THEN 0.00 ELSE ROUND(underwritPassNum * 100.0 / waitAuditNum, 2) END AS underwritPassRate,
|
|
|
+ dealOrderNum,
|
|
|
+ CASE WHEN quoteCountNum = 0 THEN 0.00 ELSE ROUND(dealOrderNum * 100.0 / quoteCountNum, 2) END AS conversionRate
|
|
|
+ FROM company_stat
|
|
|
+
|
|
|
+
|
|
|
+ </select>
|
|
|
+
|
|
|
+ <select id="companyExport" resultType="com.jzg.commons.entity.report.dto.ReportCompanyQuotationDataDto">
|
|
|
+ <include refid="base"/>,
|
|
|
+ company_stat AS (
|
|
|
+ SELECT
|
|
|
+ o.company_id AS companyId,
|
|
|
+ o.company_name AS companyName,
|
|
|
+ COALESCE(a.partner_company_id,'') partnerCompanyId,
|
|
|
+ COALESCE(pc.name_simple,'') partnerCompanyName,
|
|
|
+ COUNT(o.id) AS quoteCountNum,
|
|
|
+ SUM(CASE WHEN o.order_status IN (1,2,3,4,5,7) THEN 1 ELSE 0 END) AS quoteSuccessNum,
|
|
|
+ SUM(CASE WHEN o.order_status = 6 THEN 1 ELSE 0 END) AS quoteFailNum,
|
|
|
+ SUM(CASE WHEN o.quote_time IS NOT NULL THEN CAST(o.quote_time AS DECIMAL(10,2)) ELSE 0 END) AS total_quote_second,
|
|
|
+ COUNT(CASE WHEN o.quote_time IS NOT NULL THEN 1 END) AS valid_quote_count,
|
|
|
+ SUM(CASE WHEN o.order_status IN (2,3,4,5,7) THEN 1 ELSE 0 END) AS waitAuditNum,
|
|
|
+ SUM(CASE WHEN o.order_status = 3 THEN 1 ELSE 0 END) AS staffProcessNum,
|
|
|
+ SUM(CASE WHEN o.order_status IN (4,5) THEN 1 ELSE 0 END) AS underwritPassNum,
|
|
|
+ SUM(CASE WHEN o.order_status = 7 THEN 1 ELSE 0 END) AS underwritRejectNum,
|
|
|
+ SUM(CASE WHEN o.order_status = 5 THEN 1 ELSE 0 END) AS dealOrderNum,
|
|
|
+ SUM(COUNT(*)) OVER () AS totalQuoteNum
|
|
|
+ FROM orders o
|
|
|
+ LEFT JOIN ptl_agreement a ON a.id=o.agreement_id AND a.is_delete=0
|
|
|
+ LEFT JOIN esm_ins_company pc ON pc.id=a.partner_company_id AND pc.is_delete=0
|
|
|
+ GROUP BY o.company_id, o.company_name,a.partner_company_id,pc.name_simple
|
|
|
+ )
|
|
|
+ SELECT
|
|
|
+ companyId,
|
|
|
+ companyName,
|
|
|
+ partnerCompanyId,
|
|
|
+ partnerCompanyName,
|
|
|
+ quoteCountNum,
|
|
|
+ ROUND(quoteCountNum * 100.0 / totalQuoteNum, 2) AS quoteCountNumProportion,
|
|
|
+ quoteSuccessNum,
|
|
|
+ quoteFailNum,
|
|
|
+ CASE WHEN valid_quote_count = 0 THEN 0.00
|
|
|
+ ELSE ROUND(total_quote_second / valid_quote_count, 2)
|
|
|
+ END AS avgQuoteTime,
|
|
|
+ waitAuditNum,
|
|
|
+ staffProcessNum,
|
|
|
+ underwritPassNum,
|
|
|
+ underwritRejectNum,
|
|
|
+ CASE WHEN waitAuditNum = 0 THEN 0.00 ELSE ROUND(underwritPassNum * 100.0 / waitAuditNum, 2) END AS underwritPassRate,
|
|
|
+ dealOrderNum,
|
|
|
+ CASE WHEN quoteCountNum = 0 THEN 0.00 ELSE ROUND(dealOrderNum * 100.0 / quoteCountNum, 2) END AS conversionRate
|
|
|
+ FROM company_stat
|
|
|
+
|
|
|
+
|
|
|
+ </select>
|
|
|
+</mapper>
|