platformx-business-finance-biz/src/main/resources/mapper/ContractPaymentScheduleMapper.xml
@@ -16,7 +16,7 @@
        <result property="paymentRatio" column="payment_ratio"/>
        <result property="paymentStatus" column="payment_status"/>
        <result property="plannedAmount" column="planned_amount"/>
        <result property="plannedPaymentDate" column="planned_payment_date"/>
<!--        <result property="plannedPaymentDate" column="planned_payment_date"/>-->
        <result property="remark" column="remark"/>
        <result property="stageName" column="stage_name"/>
        <result property="stageOrder" column="stage_order"/>
@@ -28,4 +28,316 @@
        <result property="updateTime" column="update_time"/>
        <result property="delFlag" column="del_flag"/>
  </resultMap>
    <select id="selectAgingCompany" resultType="com.by4cloud.platformx.business.vo.AgingCompanyVo">
      SELECT
      c.party_a_id companyId,
      cps.comp_id
      FROM
      contract_payment_schedule cps,
      contract c
      WHERE
      cps.contract_id = c.id
      AND cps.del_flag = '0'
      AND c.del_flag = '0'
       AND cps.effective_end_date is not null
      AND cps.effective_end_date &lt; current_date
      AND DATEDIFF(current_date, cps.effective_end_date)>0
      AND cps.payment_status &lt;&gt; '2'
      AND cps.payment_status &lt;&gt; 3
      GROUP BY
      c.party_a_id,
      cps.comp_id
   </select>
   <select id="selectAgingTotal" resultType="com.by4cloud.platformx.business.vo.AgingVo">
      SELECT
      ranges.sort,
      ranges.overdue_range,
      COALESCE (
      sum(
      CASE
      WHEN cps.payment_status = '0' THEN
      cps.planned_amount
      WHEN cps.payment_status = '1' THEN
      cps.planned_amount - cps.actual_amount ELSE 0
      END
      ),
      0
      ) AS total_amount
      FROM
      (
      SELECT
      1 sort,
      '0-30天' AS overdue_range,
      0 AS min_days,
      30 AS max_days UNION ALL
      SELECT
      2 sort,
      '31-60天',
      31,
      60 UNION ALL
      SELECT
      3 sort,
      '61-90天',
      61,
      90 UNION ALL
      SELECT
      4 sort,
      '91-180天',
      91,
      180 UNION ALL
      SELECT
      5 sort,
      '181-365天',
      181,
      365 UNION ALL
      SELECT
      6 sort,
      '1年以上',
      366,
      999999
      ) ranges
      LEFT JOIN contract_payment_schedule cps ON cps.del_flag = '0'
      AND cps.payment_status NOT IN ( '2', '3' )
      AND cps.effective_end_date &lt; CURRENT_DATE
       AND DATEDIFF( CURRENT_DATE, cps.effective_end_date ) BETWEEN ranges.min_days
      AND ranges.max_days
      LEFT JOIN contract c ON cps.contract_id = c.id
      LEFT JOIN business_customer bc ON c.party_a_id = bc.id
      WHERE
      c.del_flag = '0'
      <if test="queryDTO.companyId !=null">
         and c.comp_id = #{queryDTO.companyId}
      </if>
      <if test="queryDTO.areaId !=null">
         and bc.area_id = #{queryDTO.areaId}
      </if>
      <if test="queryDTO.industryId !=null">
         and c.industry_code = #{queryDTO.industryId}
      </if>
      <if test="queryDTO.classId !=null">
         and bc.class_id = #{queryDTO.classId}
      </if>
      GROUP BY
      ranges.sort,
      ranges.overdue_range,
      ranges.min_days
      ORDER BY
      ranges.min_days
   </select>
   <select id="selectAgingCompanyShip" resultType="com.by4cloud.platformx.business.vo.AgingCompanyVo">
      SELECT
         c.party_a_id companyId,
          c.comp_id
      FROM
         contract c
      WHERE
         c.del_flag = '0'
        AND c.amount > c.paid_amount
        AND EXISTS ( SELECT 1 FROM contract_out_bound cob WHERE cob.del_flag = '0' AND cob.contract_id = c.id )
      GROUP BY
         c.party_a_id,
         c.comp_id;
   </select>
   <select id="selectAgingCompanyInvoice" resultType="com.by4cloud.platformx.business.vo.AgingCompanyVo">
      SELECT
         c.party_a_id companyId,
         c.comp_id
      FROM
         contract c
      WHERE
         c.del_flag = '0'
        AND c.amount > c.paid_amount
        AND EXISTS ( SELECT 1 FROM contract_invoice ci WHERE ci.del_flag = '0' AND ci.contract_id = c.id )
      GROUP BY
         c.party_a_id,
         c.comp_id;
   </select>
   <select id="selectAgingTotalShip" resultType="com.by4cloud.platformx.business.vo.AgingVo">
      SELECT
         ranges.sort,
         ranges.overdue_range,
         COALESCE (
               sum(amount-paid_amount),
               0
            ) AS total_amount
      FROM
         (
      SELECT
      1 sort,
      '0-30天' AS overdue_range,
      0 AS min_days,
      30 AS max_days UNION ALL
      SELECT
      2 sort,
      '31-60天',
      31,
      60 UNION ALL
      SELECT
      3 sort,
      '61-90天',
      61,
      90 UNION ALL
      SELECT
      4 sort,
      '91-180天',
      91,
      180 UNION ALL
      SELECT
      5 sort,
      '181-365天',
      181,
      365 UNION ALL
      SELECT
      6 sort,
      '1年以上',
      366,
      999999
      ) ranges
            LEFT JOIN contract c ON c.del_flag = '0'
            AND DATEDIFF(
                     CURRENT_DATE,
                     ( SELECT max( out_bound_time ) FROM contract_out_bound cob WHERE cob.del_flag = '0' AND cob.contract_id = c.id ORDER BY out_bound_time ASC )) BETWEEN ranges.min_days
            AND ranges.max_days
      WHERE
         c.del_flag = '0'
        AND c.amount > c.paid_amount
      <if test="queryDTO.companyId !=null">
         and c.party_b_id = #{queryDTO.companyId}
      </if>
        AND EXISTS ( SELECT 1 FROM contract_out_bound cob WHERE cob.del_flag = '0' AND cob.contract_id = c.id )
      GROUP BY
         ranges.sort,
         ranges.overdue_range,
         ranges.min_days
      ORDER BY
         ranges.min_days;
   </select>
   <select id="selectAgingTotalInvoice" resultType="com.by4cloud.platformx.business.vo.AgingVo">
      SELECT
         ranges.sort,
         ranges.overdue_range,
         COALESCE (
               sum(amount-paid_amount),
               0
            ) AS total_amount
      FROM
         (
      SELECT
      1 sort,
      '0-30天' AS overdue_range,
      0 AS min_days,
      30 AS max_days UNION ALL
      SELECT
      2 sort,
      '31-60天',
      31,
      60 UNION ALL
      SELECT
      3 sort,
      '61-90天',
      61,
      90 UNION ALL
      SELECT
      4 sort,
      '91-180天',
      91,
      180 UNION ALL
      SELECT
      5 sort,
      '181-365天',
      181,
      365 UNION ALL
      SELECT
      6 sort,
      '1年以上',
      366,
      999999
      ) ranges
            LEFT JOIN contract c ON c.del_flag = '0'
            AND DATEDIFF(
                                          CURRENT_DATE,
                                          ( SELECT max( invoice_time ) FROM contract_invoice ci WHERE ci.del_flag = '0' AND ci.contract_id = c.id ORDER BY invoice_time ASC )) BETWEEN ranges.min_days
                                 AND ranges.max_days
      WHERE
         c.del_flag = '0'
        AND c.amount > c.paid_amount
      <if test="queryDTO.companyId !=null">
         and c.party_b_id = #{queryDTO.companyId}
      </if>
        AND EXISTS ( SELECT 1 FROM contract_invoice ci WHERE ci.del_flag = '0' AND ci.contract_id = c.id)
      GROUP BY
         ranges.sort,
         ranges.overdue_range,
         ranges.min_days
      ORDER BY
         ranges.min_days;
   </select>
   <select id="selectAgingTotalScale" resultType="com.by4cloud.platformx.business.vo.AgingVo">
      SELECT
      ranges.sort,
      ranges.overdue_range,
      COALESCE (
      SUM(
      CASE
      WHEN cps.payment_status = '0' THEN
      cps.planned_amount
      WHEN cps.payment_status = '1' THEN
      cps.planned_amount - cps.actual_amount ELSE 0
      END
      ),
      0
      ) AS total_amount
      FROM
      (
      SELECT
      1 sort,
      '0-30天' AS overdue_range,
      0 AS min_days,
      30 AS max_days UNION ALL
      SELECT
      2 sort,
      '31-60天',
      31,
      60 UNION ALL
      SELECT
      3 sort,
      '61-90天',
      61,
      90 UNION ALL
      SELECT
      4 sort,
      '91-180天',
      91,
      180 UNION ALL
      SELECT
      5 sort,
      '181-365天',
      181,
      365 UNION ALL
      SELECT
      6 sort,
      '1年以上',
      366,
      999999
      ) AS ranges
      LEFT JOIN contract_payment_schedule cps ON cps.del_flag = '0'
      AND cps.payment_status NOT IN ( '2', '3' )
      AND cps.effective_end_date &lt; CURRENT_DATE
       AND DATEDIFF( CURRENT_DATE, cps.effective_end_date ) BETWEEN ranges.min_days
      AND ranges.max_days
      LEFT JOIN contract c ON cps.contract_id = c.id
      WHERE
      c.del_flag = '0'
      <if test="queryDTO.companyId !=null">
         and c.party_b_id = #{queryDTO.companyId}
      </if>
      GROUP BY
      ranges.sort,
      ranges.overdue_range,
      ranges.min_days
      ORDER BY
      ranges.min_days;
   </select>
</mapper>