335 lines
19 KiB
XML
335 lines
19 KiB
XML
<?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.bms.price.mapper.PrcProfitReportMapper">
|
|
|
|
<resultMap type="PrcProfitReportExport" id="PrcProfitReportExportResult">
|
|
<id property="exportId" column="export_id"/>
|
|
<result property="dimension" column="dimension"/>
|
|
<result property="fileName" column="file_name"/>
|
|
<result property="storageKey" column="storage_key"/>
|
|
<result property="rowCount" column="row_count"/>
|
|
<result property="exportStatus" column="export_status"/>
|
|
<result property="exportUserId" column="export_user_id"/>
|
|
<result property="exportBy" column="export_by"/>
|
|
<result property="exportTime" column="export_time"/>
|
|
<result property="remark" column="remark"/>
|
|
</resultMap>
|
|
|
|
<sql id="profitReportExportColumns">
|
|
select export_id, dimension, file_name, storage_key, row_count,
|
|
export_status, export_user_id, export_by, export_time, remark
|
|
from prc_profit_report_export
|
|
</sql>
|
|
|
|
<insert id="insertExport" parameterType="PrcProfitReportExport" useGeneratedKeys="true" keyProperty="exportId">
|
|
insert into prc_profit_report_export (
|
|
dimension, file_name, storage_key, row_count, export_status, export_user_id, export_by, export_time, remark
|
|
) values (
|
|
#{dimension}, #{fileName}, #{storageKey}, #{rowCount}, #{exportStatus}, #{exportUserId}, #{exportBy}, sysdate(), #{remark}
|
|
)
|
|
</insert>
|
|
|
|
<update id="markExportSuccess" parameterType="PrcProfitReportExport">
|
|
update prc_profit_report_export
|
|
set file_name = #{fileName}, storage_key = #{storageKey}, row_count = #{rowCount},
|
|
export_status = 'SUCCESS', remark = null
|
|
where export_id = #{exportId} and export_status = 'PROCESSING'
|
|
</update>
|
|
|
|
<update id="markExportFailed">
|
|
update prc_profit_report_export
|
|
set export_status = 'FAILED', remark = #{remark}
|
|
where export_id = #{exportId} and export_status = 'PROCESSING'
|
|
</update>
|
|
|
|
<select id="selectExports" resultMap="PrcProfitReportExportResult">
|
|
<include refid="profitReportExportColumns"/>
|
|
order by export_time desc, export_id desc
|
|
</select>
|
|
|
|
<select id="selectExportById" resultMap="PrcProfitReportExportResult">
|
|
<include refid="profitReportExportColumns"/>
|
|
where export_id = #{exportId}
|
|
</select>
|
|
|
|
<resultMap type="PrcProfitReportOrderRow" id="PrcProfitReportOrderResult">
|
|
<result property="orderNo" column="order_no"/>
|
|
<result property="customerCode" column="customer_code"/>
|
|
<result property="customerName" column="customer_name"/>
|
|
<result property="belongSaler" column="belong_saler"/>
|
|
<result property="belongSalerCode" column="belong_saler_code"/>
|
|
<result property="productCode" column="product_code"/>
|
|
<result property="productName" column="product_name"/>
|
|
<result property="countryCode" column="country_code"/>
|
|
<result property="countryName" column="country_name"/>
|
|
<result property="currency" column="currency"/>
|
|
<result property="bizDate" column="biz_date"/>
|
|
<result property="costAmount" column="cost_amount"/>
|
|
<result property="redlineAmount" column="redline_amount"/>
|
|
<result property="redlineGrossProfit" column="redline_gross_profit"/>
|
|
<result property="redlineGrossMarginRate" column="redline_gross_margin_rate"/>
|
|
<result property="salesAmount" column="sales_amount"/>
|
|
<result property="salesGrossProfit" column="sales_gross_profit"/>
|
|
<result property="salesGrossMarginRate" column="sales_gross_margin_rate"/>
|
|
<!-- 提成结果字段暂停使用。
|
|
<result property="commissionRate" column="commission_rate"/>
|
|
<result property="commissionAmount" column="commission_amount"/>
|
|
-->
|
|
<result property="arBillStatus" column="ar_bill_status"/>
|
|
</resultMap>
|
|
|
|
<resultMap type="PrcProfitReportProductRow" id="PrcProfitReportProductResult">
|
|
<result property="productCode" column="product_code"/>
|
|
<result property="productName" column="product_name"/>
|
|
<result property="countryCode" column="country_code"/>
|
|
<result property="countryName" column="country_name"/>
|
|
<result property="currency" column="currency"/>
|
|
<result property="orderCount" column="order_count"/>
|
|
<result property="costAmount" column="cost_amount"/>
|
|
<result property="redlineAmount" column="redline_amount"/>
|
|
<result property="redlineGrossProfit" column="redline_gross_profit"/>
|
|
<result property="redlineGrossMarginRate" column="redline_gross_margin_rate"/>
|
|
<result property="salesAmount" column="sales_amount"/>
|
|
<result property="salesGrossProfit" column="sales_gross_profit"/>
|
|
<result property="salesGrossMarginRate" column="sales_gross_margin_rate"/>
|
|
<!-- 提成结果字段暂停使用。
|
|
<result property="commissionAmount" column="commission_amount"/>
|
|
<result property="commissionMissingOrderCount" column="commission_missing_order_count"/>
|
|
-->
|
|
<result property="incompleteOrderCount" column="incomplete_order_count"/>
|
|
</resultMap>
|
|
|
|
<resultMap type="PrcProfitReportSummary" id="PrcProfitReportSummaryResult">
|
|
<result property="orderCount" column="order_count"/>
|
|
<result property="incompleteOrderCount" column="incomplete_order_count"/>
|
|
<result property="currency" column="currency"/>
|
|
<result property="costAmount" column="cost_amount"/>
|
|
<result property="redlineAmount" column="redline_amount"/>
|
|
<result property="redlineGrossProfit" column="redline_gross_profit"/>
|
|
<result property="redlineGrossMarginRate" column="redline_gross_margin_rate"/>
|
|
<result property="salesAmount" column="sales_amount"/>
|
|
<result property="salesGrossProfit" column="sales_gross_profit"/>
|
|
<result property="salesGrossMarginRate" column="sales_gross_margin_rate"/>
|
|
<!-- 提成汇总字段暂停使用。
|
|
<result property="commissionAmount" column="commission_amount"/>
|
|
<result property="commissionMissingOrderCount" column="commission_missing_order_count"/>
|
|
-->
|
|
</resultMap>
|
|
|
|
<sql id="profitReportFromAndWhere">
|
|
from prc_income_bill i
|
|
inner join prc_order_bill p on p.bill_id = i.bill_id
|
|
<!-- 提成表关联暂停使用,毛利报表不再依赖提成配置。
|
|
left join prc_profit_commission_rate cr
|
|
on cr.belong_saler_code = i.belong_saler_code and cr.status = '0'
|
|
-->
|
|
<where>
|
|
<!-- 不将未匹配产品、国家或重量段的计费失败订单纳入毛利报表;保留历史空值(按成功处理)。 -->
|
|
and (p.billing_fail_status is null or p.billing_fail_status not in (1, 2, 3))
|
|
<if test="beginBizDate != null">
|
|
and p.biz_date >= #{beginBizDate}
|
|
</if>
|
|
<if test="endBizDate != null">
|
|
and p.biz_date <= #{endBizDate}
|
|
</if>
|
|
<choose>
|
|
<when test="orderNos != null and orderNos.size() > 0">
|
|
and (
|
|
<foreach collection="orderNos" item="orderValue" separator=" or ">
|
|
p.order_no like concat('%', #{orderValue}, '%')
|
|
</foreach>
|
|
)
|
|
</when>
|
|
<when test="orderNo != null and orderNo != ''">
|
|
and p.order_no like concat('%', #{orderNo}, '%')
|
|
</when>
|
|
</choose>
|
|
<choose>
|
|
<when test="customerCodes != null and customerCodes.size() > 0">
|
|
and p.customer_code in
|
|
<foreach collection="customerCodes" item="customerValue" open="(" separator="," close=")">
|
|
#{customerValue}
|
|
</foreach>
|
|
</when>
|
|
<when test="customerCode != null and customerCode != ''">
|
|
and p.customer_code = #{customerCode}
|
|
</when>
|
|
</choose>
|
|
<choose>
|
|
<when test="customerNames != null and customerNames.size() > 0">
|
|
and (
|
|
<foreach collection="customerNames" item="customerValue" separator=" or ">
|
|
p.customer_name like concat('%', #{customerValue}, '%')
|
|
</foreach>
|
|
)
|
|
</when>
|
|
<when test="customerName != null and customerName != ''">
|
|
and p.customer_name like concat('%', #{customerName}, '%')
|
|
</when>
|
|
</choose>
|
|
<choose>
|
|
<when test="productDrilldown != null and productDrilldown">
|
|
and p.product_code <=> #{productCode}
|
|
and p.country_code <=> #{countryCode}
|
|
and i.currency <=> #{currency}
|
|
<if test="belongSalerCode != null and belongSalerCode != ''">
|
|
and i.belong_saler_code = #{belongSalerCode}
|
|
</if>
|
|
</when>
|
|
<otherwise>
|
|
<if test="belongSalerCode != null and belongSalerCode != ''">
|
|
and i.belong_saler_code = #{belongSalerCode}
|
|
</if>
|
|
<if test="productCode != null and productCode != ''">
|
|
and p.product_code = #{productCode}
|
|
</if>
|
|
<if test="countryCode != null and countryCode != ''">
|
|
and p.country_code = #{countryCode}
|
|
</if>
|
|
<if test="currency != null and currency != ''">
|
|
and i.currency = #{currency}
|
|
</if>
|
|
</otherwise>
|
|
</choose>
|
|
<choose>
|
|
<!-- 提成未计算订单下钻暂停使用。
|
|
<when test="detailType == 'COMMISSION_MISSING'">
|
|
and (cr.commission_rate is null or i.product_amount is null or i.sales_amount is null)
|
|
</when>
|
|
-->
|
|
<when test="detailType == 'INCOMPLETE'">
|
|
and (i.product_amount is null or i.redline_amount is null or i.sales_amount is null)
|
|
</when>
|
|
</choose>
|
|
</where>
|
|
</sql>
|
|
|
|
<!-- 红线毛利 = 产品价 - 红线价;红线毛利率 = 红线毛利 / 红线价 * 100%。汇总先逐单计算再求和。 -->
|
|
<sql id="profitExpressions">
|
|
i.product_amount as cost_amount,
|
|
i.redline_amount,
|
|
case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.product_amount - i.redline_amount else null end as redline_gross_profit,
|
|
case when i.product_amount is not null and i.redline_amount is not null and i.redline_amount != 0
|
|
then round((i.product_amount - i.redline_amount) * 100 / i.redline_amount, 4) else null end as redline_gross_margin_rate,
|
|
i.sales_amount,
|
|
case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount - i.product_amount else null end as sales_gross_profit,
|
|
case when i.product_amount is not null and i.sales_amount is not null and i.sales_amount != 0
|
|
then round((i.sales_amount - i.product_amount) * 100 / i.sales_amount, 4) else null end as sales_gross_margin_rate
|
|
<!-- 提成比例与金额计算暂停使用;恢复时包含前置逗号。
|
|
, cr.commission_rate,
|
|
case when cr.commission_rate is not null and i.product_amount is not null and i.sales_amount is not null
|
|
then round((i.sales_amount - i.product_amount) * cr.commission_rate / 100, 4) else null end as commission_amount
|
|
-->
|
|
</sql>
|
|
|
|
<select id="selectOrderRows" resultMap="PrcProfitReportOrderResult">
|
|
select p.order_no, p.customer_code, p.customer_name,
|
|
i.belong_saler, i.belong_saler_code,
|
|
p.product_code, p.product_name, p.country_code, p.country_name,
|
|
i.currency, p.biz_date,
|
|
<include refid="profitExpressions"/>,
|
|
p.ar_bill_status
|
|
<include refid="profitReportFromAndWhere"/>
|
|
<if test="arBillStatus != null and arBillStatus != '' and productDrilldown != true">
|
|
and p.ar_bill_status = #{arBillStatus}
|
|
</if>
|
|
order by p.biz_date desc, p.bill_id desc
|
|
</select>
|
|
|
|
<select id="selectProductRows" resultMap="PrcProfitReportProductResult">
|
|
select p.product_code, p.product_name, p.country_code, p.country_name,
|
|
i.currency, count(*) as order_count,
|
|
sum(i.product_amount) as cost_amount,
|
|
sum(i.redline_amount) as redline_amount,
|
|
sum(case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.product_amount - i.redline_amount else null end) as redline_gross_profit,
|
|
case when sum(case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.redline_amount else null end) is null
|
|
or sum(case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.redline_amount else null end) = 0
|
|
then null
|
|
else round(
|
|
sum(case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.product_amount - i.redline_amount else null end) * 100 /
|
|
sum(case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.redline_amount else null end), 4)
|
|
end as redline_gross_margin_rate,
|
|
sum(i.sales_amount) as sales_amount,
|
|
sum(case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount - i.product_amount else null end) as sales_gross_profit,
|
|
case when sum(case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount else null end) is null
|
|
or sum(case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount else null end) = 0
|
|
then null
|
|
else round(
|
|
sum(case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount - i.product_amount else null end) * 100 /
|
|
sum(case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount else null end), 4)
|
|
end as sales_gross_margin_rate,
|
|
<!-- 提成金额与未计算订单数暂停使用。
|
|
sum(case when cr.commission_rate is not null and i.product_amount is not null and i.sales_amount is not null
|
|
then (i.sales_amount - i.product_amount) * cr.commission_rate / 100 else null end) as commission_amount,
|
|
sum(case when cr.commission_rate is null or i.product_amount is null or i.sales_amount is null
|
|
then 1 else 0 end) as commission_missing_order_count,
|
|
-->
|
|
sum(case when i.product_amount is null or i.redline_amount is null or i.sales_amount is null
|
|
then 1 else 0 end) as incomplete_order_count
|
|
<include refid="profitReportFromAndWhere"/>
|
|
group by p.product_code, p.product_name, p.country_code, p.country_name, i.currency
|
|
order by p.product_code, p.country_code, i.currency
|
|
</select>
|
|
|
|
<select id="selectSummary" resultMap="PrcProfitReportSummaryResult">
|
|
select i.currency, count(*) as order_count,
|
|
sum(case when i.product_amount is null or i.redline_amount is null or i.sales_amount is null
|
|
then 1 else 0 end) as incomplete_order_count,
|
|
sum(i.product_amount) as cost_amount,
|
|
sum(i.redline_amount) as redline_amount,
|
|
sum(case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.product_amount - i.redline_amount else null end) as redline_gross_profit,
|
|
case when sum(case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.redline_amount else null end) is null
|
|
or sum(case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.redline_amount else null end) = 0
|
|
then null
|
|
else round(
|
|
sum(case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.product_amount - i.redline_amount else null end) * 100 /
|
|
sum(case when i.product_amount is not null and i.redline_amount is not null
|
|
then i.redline_amount else null end), 4)
|
|
end as redline_gross_margin_rate,
|
|
sum(i.sales_amount) as sales_amount,
|
|
sum(case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount - i.product_amount else null end) as sales_gross_profit,
|
|
case when sum(case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount else null end) is null
|
|
or sum(case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount else null end) = 0
|
|
then null
|
|
else round(
|
|
sum(case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount - i.product_amount else null end) * 100 /
|
|
sum(case when i.product_amount is not null and i.sales_amount is not null
|
|
then i.sales_amount else null end), 4)
|
|
end as sales_gross_margin_rate
|
|
<!-- 提成汇总计算暂停使用;恢复时包含前置逗号。
|
|
, sum(case when cr.commission_rate is not null and i.product_amount is not null and i.sales_amount is not null
|
|
then (i.sales_amount - i.product_amount) * cr.commission_rate / 100 else null end) as commission_amount,
|
|
sum(case when cr.commission_rate is null or i.product_amount is null or i.sales_amount is null
|
|
then 1 else 0 end) as commission_missing_order_count
|
|
-->
|
|
<include refid="profitReportFromAndWhere"/>
|
|
<if test="arBillStatus != null and arBillStatus != ''">
|
|
and p.ar_bill_status = #{arBillStatus}
|
|
</if>
|
|
group by i.currency
|
|
order by i.currency
|
|
</select>
|
|
</mapper>
|