shiyunteng
2026-05-22 ff225eded880cea74563368c8c18483efc85ab28
platformx-business-finance-biz/src/main/resources/mapper/ContractMapper.xml
@@ -4,6 +4,9 @@
<mapper namespace="com.by4cloud.platformx.business.mapper.ContractMapper">
   <update id="setSession">
      SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
   </update>
    <select id="pageByCredit" resultType="com.by4cloud.platformx.business.vo.ContractCreditSalesPageVo">
      SELECT
      id,
@@ -100,4 +103,712 @@
         </otherwise>
      </choose>
   </select>
    <select id="contractAmountAnalysis"
            resultType="com.by4cloud.platformx.business.vo.ContractAmountAnalysisVo">
      SELECT
         party_b_name AS 'compName',
            SUM(m01) AS 'month1',
            SUM(m02) AS 'month2',
            SUM(m03) AS 'month3',
            SUM(m04) AS 'month4',
            SUM(m05) AS 'month5',
            SUM(m06) AS 'month6',
            SUM(m07) AS 'month7',
            SUM(m08) AS 'month8',
            SUM(m09) AS 'month9',
            SUM(m10) AS 'month10',
            SUM(m11) AS 'month11',
            SUM(m12) AS 'month12'
      FROM (
             SELECT
                COALESCE(party_b, '未知甲方') AS party_b_name,
                SUM(CASE WHEN MONTH(sign_date) = 1 THEN amount ELSE 0 END) AS m01,
                SUM(CASE WHEN MONTH(sign_date) = 2 THEN amount ELSE 0 END) AS m02,
                SUM(CASE WHEN MONTH(sign_date) = 3 THEN amount ELSE 0 END) AS m03,
                SUM(CASE WHEN MONTH(sign_date) = 4 THEN amount ELSE 0 END) AS m04,
                SUM(CASE WHEN MONTH(sign_date) = 5 THEN amount ELSE 0 END) AS m05,
                SUM(CASE WHEN MONTH(sign_date) = 6 THEN amount ELSE 0 END) AS m06,
                SUM(CASE WHEN MONTH(sign_date) = 7 THEN amount ELSE 0 END) AS m07,
                SUM(CASE WHEN MONTH(sign_date) = 8 THEN amount ELSE 0 END) AS m08,
                SUM(CASE WHEN MONTH(sign_date) = 9 THEN amount ELSE 0 END) AS m09,
                SUM(CASE WHEN MONTH(sign_date) = 10 THEN amount ELSE 0 END) AS m10,
                SUM(CASE WHEN MONTH(sign_date) = 11 THEN amount ELSE 0 END) AS m11,
                SUM(CASE WHEN MONTH(sign_date) = 12 THEN amount ELSE 0 END) AS m12,
                SUM(amount) AS total_amt
             FROM contract
             WHERE
                      del_flag = '0'
                   AND amount IS NOT NULL
                   AND sign_date IS NOT NULL
                   AND YEAR(sign_date) = #{queryDTO.year}
                  AND   party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      GROUP BY party_b_id, party_b
      UNION ALL
      SELECT
         '总计' AS party_b_name,
         SUM(CASE WHEN MONTH(sign_date) = 1 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 2 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 3 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 4 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 5 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 6 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 7 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 8 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 9 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 10 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 11 THEN amount ELSE 0 END),
         SUM(CASE WHEN MONTH(sign_date) = 12 THEN amount ELSE 0 END),
         SUM(amount)
      FROM contract
      WHERE
               del_flag = '0'
            AND amount IS NOT NULL
            AND sign_date IS NOT NULL
            AND YEAR(sign_date) = #{queryDTO.year}
      AND   party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
            ) AS pivot_table
         GROUP BY party_b_name
         ORDER BY
            CASE WHEN party_b_name = '总计' THEN 1 ELSE 0 END,
      party_b_name;
   </select>
   <select id="contractIncomeAnalysis"
         resultType="com.by4cloud.platformx.business.vo.ContractIncomeAnalysisVo">
      SELECT
         compName,
         SUM(CASE WHEN month_num = 1 THEN total_amount ELSE 0 END) AS 'srMonth1',
            SUM(CASE WHEN month_num = 1 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth1',
            SUM(CASE WHEN month_num = 1 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth1',
            SUM(CASE WHEN month_num = 1 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth1',
            SUM(CASE WHEN month_num = 2 THEN total_amount ELSE 0 END) AS 'srMonth2',
            SUM(CASE WHEN month_num = 2 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth2',
            SUM(CASE WHEN month_num = 2 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth2',
            SUM(CASE WHEN month_num = 2 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth2',
            SUM(CASE WHEN month_num = 3 THEN total_amount ELSE 0 END) AS 'srMonth3',
            SUM(CASE WHEN month_num = 3 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth3',
            SUM(CASE WHEN month_num = 3 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth3',
            SUM(CASE WHEN month_num = 3 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth3',
            SUM(CASE WHEN month_num = 4 THEN total_amount ELSE 0 END) AS 'srMonth4',
            SUM(CASE WHEN month_num = 4 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth4',
            SUM(CASE WHEN month_num = 4 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth4',
            SUM(CASE WHEN month_num = 4 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth4',
            SUM(CASE WHEN month_num = 5 THEN total_amount ELSE 0 END) AS 'srMonth5',
            SUM(CASE WHEN month_num = 5 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth5',
            SUM(CASE WHEN month_num = 5 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth5',
            SUM(CASE WHEN month_num = 5 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth5',
            SUM(CASE WHEN month_num = 6 THEN total_amount ELSE 0 END) AS 'srMonth6',
            SUM(CASE WHEN month_num = 6 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth6',
            SUM(CASE WHEN month_num = 6 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth6',
            SUM(CASE WHEN month_num = 6 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth6',
            SUM(CASE WHEN month_num = 7 THEN total_amount ELSE 0 END) AS 'srMonth7',
            SUM(CASE WHEN month_num = 7 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth7',
            SUM(CASE WHEN month_num = 7 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth7',
            SUM(CASE WHEN month_num = 7 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth7',
            SUM(CASE WHEN month_num = 8 THEN total_amount ELSE 0 END) AS 'srMonth8',
            SUM(CASE WHEN month_num = 8 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth8',
            SUM(CASE WHEN month_num = 8 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth8',
            SUM(CASE WHEN month_num = 8 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth8',
            SUM(CASE WHEN month_num = 9 THEN total_amount ELSE 0 END) AS 'srMonth9',
            SUM(CASE WHEN month_num = 9 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth9',
            SUM(CASE WHEN month_num = 9 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth9',
            SUM(CASE WHEN month_num = 9 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth9',
            SUM(CASE WHEN month_num = 10 THEN total_amount ELSE 0 END) AS 'srMonth10',
            SUM(CASE WHEN month_num = 10 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth10',
            SUM(CASE WHEN month_num = 10 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth10',
            SUM(CASE WHEN month_num = 10 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth10',
            SUM(CASE WHEN month_num = 11 THEN total_amount ELSE 0 END) AS 'srMonth11',
            SUM(CASE WHEN month_num = 11 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth11',
            SUM(CASE WHEN month_num = 11 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth11',
            SUM(CASE WHEN month_num = 11 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth11',
            SUM(CASE WHEN month_num = 12 THEN total_amount ELSE 0 END) AS 'srMonth12',
            SUM(CASE WHEN month_num = 12 AND pay_type = 0 THEN total_amount ELSE 0 END) AS 'xhMonth12',
            SUM(CASE WHEN month_num = 12 AND pay_type = 1 THEN total_amount ELSE 0 END) AS 'cdMonth12',
            SUM(CASE WHEN month_num = 12 AND pay_type = 2 THEN total_amount ELSE 0 END) AS 'qtMonth12'
      FROM (
             SELECT
                COALESCE(c.party_b, '未知单位') AS compName,
                MONTH(confirm_time) AS month_num,
                pay_type,
                COALESCE(transation_amount, 0) AS total_amount
             FROM payment_confirm pc,contract c
             WHERE
                pc.del_flag = '0'
               And c.del_flag = '0'
               AND pc.contract_id = c.id
               AND confirm_time IS NOT NULL
               AND transation_amount IS NOT NULL
               AND YEAR(confirm_time) = #{queryDTO.year}
      AND   party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
          ) AS source_data
      GROUP BY compName
   </select>
   <select id="contractIncomeAnalysisByComp"
         resultType="com.by4cloud.platformx.business.vo.ContractIncomeAnalysisCompVo">
      SELECT
         months.yf,
         COALESCE ( SUM( transation_amount ), 0 ) AS sr,
         COALESCE ( SUM( CASE WHEN pay_type = 0 THEN COALESCE ( transation_amount, 0 ) ELSE 0 END ), 0 ) AS xh,
         COALESCE ( SUM( CASE WHEN pay_type = 1 THEN COALESCE ( transation_amount, 0 ) ELSE 0 END ), 0 ) AS cd,
         COALESCE ( SUM( CASE WHEN pay_type = 2 THEN COALESCE ( transation_amount, 0 ) ELSE 0 END ), 0 ) AS qt
      FROM
         (
            SELECT
               '1月' AS yf UNION ALL
            SELECT
               '2月' UNION ALL
            SELECT
               '3月' UNION ALL
            SELECT
               '4月' UNION ALL
            SELECT
               '5月' UNION ALL
            SELECT
               '6月' UNION ALL
            SELECT
               '7月' UNION ALL
            SELECT
               '8月' UNION ALL
            SELECT
               '9月' UNION ALL
            SELECT
               '10月' UNION ALL
            SELECT
               '11月' UNION ALL
            SELECT
               '12月'
         ) AS months
            LEFT JOIN payment_confirm pc ON months.yf = CONCAT( MONTH ( pc.confirm_time ), '月' )
            AND pc.del_flag = '0'
            AND pc.confirm_time IS NOT NULL
            AND pc.transation_amount IS NOT NULL
            AND YEAR ( pc.confirm_time ) = #{queryDTO.year}
            AND pc.comp_id = #{compId}
      WHERE
         1 = 1
      GROUP BY
         months.yf
   </select>
   <select id="contractAmountAnalysisByArea"
         resultType="com.by4cloud.platformx.business.vo.ContractIncomeAnalysisAreaVo">
      SELECT
         b.area_id,
         SUM( CASE WHEN c.party_b_id = #{sgbCompId} THEN c.amount ELSE 0 END ) AS sgbze,
         ROUND(
                     SUM( CASE WHEN c.party_b_id = #{sgbCompId} THEN c.amount ELSE 0 END ) / (
                     SELECT
                        SUM( amount )
                     FROM
                        contract
                     WHERE
                        party_b_id IN
                     <foreach collection="compIds" item="id" open="(" close=")" separator=",">
                        #{id}
                     </foreach>
             ) * 100,
                     0
            ) AS zgbzb,
         SUM( CASE WHEN c.party_b_id = #{jxcCompId} THEN c.amount ELSE 0 END ) AS jxcze,
         ROUND(
                     SUM( CASE WHEN c.party_b_id = #{jxcCompId} THEN c.amount ELSE 0 END ) / (
                     SELECT
                        SUM( amount )
                     FROM
                        contract
                     WHERE
                        party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
             ) * 100,
                     0
            ) AS jxczb ,
         SUM( CASE WHEN c.party_b_id = #{smjCompId} THEN c.amount ELSE 0 END ) AS smjze,
         ROUND(
                     SUM( CASE WHEN c.party_b_id = #{smjCompId} THEN c.amount ELSE 0 END ) / (
                     SELECT
                        SUM( amount )
                     FROM
                        contract
                     WHERE
                        party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
             ) * 100,
                     0
            ) AS smjzb ,
         SUM( CASE WHEN c.party_b_id = #{ymjCompId} THEN c.amount ELSE 0 END ) AS ymjze,
         ROUND(
                     SUM( CASE WHEN c.party_b_id = #{ymjCompId} THEN c.amount ELSE 0 END ) / (
                     SELECT
                        SUM( amount )
                     FROM
                        contract
                     WHERE
                        party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
             ) * 100,
                     0
            ) AS ymjzb ,
         SUM( CASE WHEN c.party_b_id = #{tfCompId} THEN c.amount ELSE 0 END ) AS tfze,
         ROUND(
                     SUM( CASE WHEN c.party_b_id = #{tfCompId} THEN c.amount ELSE 0 END ) / (
                     SELECT
                        SUM( amount )
                     FROM
                        contract
                     WHERE
                        party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
             ) * 100,
                     0
            ) AS tfzb
      FROM
         contract c
            JOIN business_customer b ON c.party_a_id = b.id
      WHERE
         b.area_id IS NOT NULL
      AND YEAR ( sign_date ) = #{queryDTO.year}
      GROUP BY
         b.area_id
   </select>
   <select id="contractAmountAnalysisByIndustry"
         resultType="com.by4cloud.platformx.business.vo.ContractIncomeAnalysisAreaVo">
      SELECT
      b.industry_id area_id,
      SUM( CASE WHEN c.party_b_id = #{sgbCompId} THEN c.amount ELSE 0 END ) AS sgbze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{sgbCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS zgbzb,
      SUM( CASE WHEN c.party_b_id = #{jxcCompId} THEN c.amount ELSE 0 END ) AS jxcze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{jxcCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS jxczb ,
      SUM( CASE WHEN c.party_b_id = #{smjCompId} THEN c.amount ELSE 0 END ) AS smjze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{smjCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS smjzb ,
      SUM( CASE WHEN c.party_b_id = #{ymjCompId} THEN c.amount ELSE 0 END ) AS ymjze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{ymjCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS ymjzb ,
      SUM( CASE WHEN c.party_b_id = #{tfCompId} THEN c.amount ELSE 0 END ) AS tfze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{tfCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS tfzb
      FROM
      contract c
      JOIN business_customer b ON c.party_a_id = b.id
      WHERE
      b.industry_id IS NOT NULL
      AND YEAR ( sign_date ) = #{queryDTO.year}
      GROUP BY
      b.industry_id
   </select>
   <select id="contractAmountAnalysisByMarket"
         resultType="com.by4cloud.platformx.business.vo.ContractIncomeAnalysisAreaVo">
      SELECT
      b.class_id area_id,
      SUM( CASE WHEN c.party_b_id = #{sgbCompId} THEN c.amount ELSE 0 END ) AS sgbze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{sgbCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS zgbzb,
      SUM( CASE WHEN c.party_b_id = #{jxcCompId} THEN c.amount ELSE 0 END ) AS jxcze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{jxcCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS jxczb ,
      SUM( CASE WHEN c.party_b_id = #{smjCompId} THEN c.amount ELSE 0 END ) AS smjze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{smjCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS smjzb ,
      SUM( CASE WHEN c.party_b_id = #{ymjCompId} THEN c.amount ELSE 0 END ) AS ymjze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{ymjCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS ymjzb ,
      SUM( CASE WHEN c.party_b_id = #{tfCompId} THEN c.amount ELSE 0 END ) AS tfze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{tfCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS tfzb
      FROM
      contract c
      JOIN business_customer b ON c.party_a_id = b.id
      WHERE
      b.class_id IS NOT NULL
      AND YEAR ( sign_date ) = #{queryDTO.year}
      GROUP BY
      b.class_id
   </select>
   <select id="contractAmountAnalysisByExportBus"
         resultType="com.by4cloud.platformx.business.vo.ContractIncomeAnalysisAreaVo">
      SELECT
      b.export_service_attr area_id,
      SUM( CASE WHEN c.party_b_id = #{sgbCompId} THEN c.amount ELSE 0 END ) AS sgbze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{sgbCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS zgbzb,
      SUM( CASE WHEN c.party_b_id = #{jxcCompId} THEN c.amount ELSE 0 END ) AS jxcze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{jxcCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS jxczb ,
      SUM( CASE WHEN c.party_b_id = #{smjCompId} THEN c.amount ELSE 0 END ) AS smjze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{smjCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS smjzb ,
      SUM( CASE WHEN c.party_b_id = #{ymjCompId} THEN c.amount ELSE 0 END ) AS ymjze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{ymjCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS ymjzb ,
      SUM( CASE WHEN c.party_b_id = #{tfCompId} THEN c.amount ELSE 0 END ) AS tfze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{tfCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS tfzb
      FROM
      contract c
      JOIN business_customer b ON c.party_a_id = b.id
      WHERE
      b.export_service_attr IS NOT NULL
      AND YEAR ( sign_date ) = #{queryDTO.year}
      GROUP BY
      b.export_service_attr
   </select>
   <select id="contractAmountAnalysisBySpcBus"
         resultType="com.by4cloud.platformx.business.vo.ContractIncomeAnalysisAreaVo">
      SELECT
      c.supply_attribute area_id,
      SUM( CASE WHEN c.party_b_id = #{sgbCompId} THEN c.amount ELSE 0 END ) AS sgbze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{sgbCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS zgbzb,
      SUM( CASE WHEN c.party_b_id = #{jxcCompId} THEN c.amount ELSE 0 END ) AS jxcze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{jxcCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS jxczb ,
      SUM( CASE WHEN c.party_b_id = #{smjCompId} THEN c.amount ELSE 0 END ) AS smjze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{smjCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS smjzb ,
      SUM( CASE WHEN c.party_b_id = #{ymjCompId} THEN c.amount ELSE 0 END ) AS ymjze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{ymjCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS ymjzb ,
      SUM( CASE WHEN c.party_b_id = #{tfCompId} THEN c.amount ELSE 0 END ) AS tfze,
      ROUND(
      SUM( CASE WHEN c.party_b_id = #{tfCompId} THEN c.amount ELSE 0 END ) / (
      SELECT
      SUM( amount )
      FROM
      contract
      WHERE
      party_b_id IN
      <foreach collection="compIds" item="id" open="(" close=")" separator=",">
         #{id}
      </foreach>
      ) * 100,
      0
      ) AS tfzb
      FROM
      contract c
      WHERE
      c.supply_attribute IS NOT NULL
      AND YEAR ( sign_date ) = #{queryDTO.year}
      GROUP BY
      c.supply_attribute
   </select>
   <select id="contractAmountAnalysisByComp"
         resultType="com.by4cloud.platformx.business.vo.ContractAmountAnalysisCompVo">
      SELECT
         m.stat_month AS yf,
         COALESCE(curr.total_amount, 0) AS je,
         CASE
            WHEN prev.total_amount IS NULL OR prev.total_amount = 0 THEN NULL
            ELSE ROUND(
                        (COALESCE(curr.total_amount, 0) - prev.total_amount) / prev.total_amount * 100,
                        2
               )
            END AS hb,
         CASE
            WHEN last_year.total_amount IS NULL OR last_year.total_amount = 0 THEN NULL
            ELSE ROUND(
                        (COALESCE(curr.total_amount, 0) - last_year.total_amount) / last_year.total_amount * 100,
                        2
               )
            END AS tb
      FROM (
             SELECT DATE_FORMAT(MAKEDATE(${queryDTO.year}, 1), '%Y-%m') AS stat_month, 1 AS month_num
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 1 MONTH), '%Y-%m'), 2
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 2 MONTH), '%Y-%m'), 3
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 3 MONTH), '%Y-%m'), 4
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 4 MONTH), '%Y-%m'), 5
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 5 MONTH), '%Y-%m'), 6
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 6 MONTH), '%Y-%m'), 7
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 7 MONTH), '%Y-%m'), 8
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 8 MONTH), '%Y-%m'), 9
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 9 MONTH), '%Y-%m'), 10
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 10 MONTH), '%Y-%m'), 11
             UNION ALL SELECT DATE_FORMAT(DATE_ADD(MAKEDATE(${queryDTO.year}, 1), INTERVAL 11 MONTH), '%Y-%m'), 12
          ) m
             LEFT JOIN (
         SELECT
            DATE_FORMAT(sign_date, '%Y-%m') AS stat_month,
            SUM(amount) AS total_amount
         FROM contract
         WHERE YEAR(sign_date) = #{queryDTO.year}
             AND party_b_id = #{compId}
         GROUP BY DATE_FORMAT(sign_date, '%Y-%m')
      ) curr ON m.stat_month = curr.stat_month
             LEFT JOIN (
         SELECT
            DATE_FORMAT(sign_date, '%Y-%m') AS stat_month,
            MONTH(sign_date) AS month_num,
            SUM(amount) AS total_amount
         FROM contract
         WHERE YEAR(sign_date) = YEAR(CURDATE())
           AND party_b_id = #{compId}
         GROUP BY DATE_FORMAT(sign_date, '%Y-%m'), MONTH(sign_date)
      ) prev ON m.month_num = prev.month_num + 1
             LEFT JOIN (
         SELECT
            MONTH(sign_date) AS month_num,
            SUM(amount) AS total_amount
         FROM contract
         WHERE YEAR(sign_date) = YEAR(CURDATE()) - 1
         AND party_b_id = #{compId}
         GROUP BY MONTH(sign_date)
      ) last_year ON m.month_num = last_year.month_num
      ORDER BY m.month_num
   </select>
</mapper>