Browse Source

净重计算有误

java8
han\hanst 3 months ago
parent
commit
b568c5acfa
  1. 64
      src/main/resources/mapper/ecss/CoDelMapper.xml

64
src/main/resources/mapper/ecss/CoDelMapper.xml

@ -263,7 +263,7 @@
lt=#{lt,jdbcType=DECIMAL},cmc_comment=#{cmcComment},saleType=#{saleType},pn=#{pn}, lt=#{lt,jdbcType=DECIMAL},cmc_comment=#{cmcComment},saleType=#{saleType},pn=#{pn},
awb_bl=#{awbBl},shipping_number=#{shippingNumber},forwarder_info=#{forwarderInfo},currency=#{currency}, awb_bl=#{awbBl},shipping_number=#{shippingNumber},forwarder_info=#{forwarderInfo},currency=#{currency},
tp=#{tp,jdbcType=DECIMAL},ttl_amount=#{ttlAmount,jdbcType=DECIMAL},sum_price=#{sumPrice,jdbcType=DECIMAL}, tp=#{tp,jdbcType=DECIMAL},ttl_amount=#{ttlAmount,jdbcType=DECIMAL},sum_price=#{sumPrice,jdbcType=DECIMAL},
so=#{so},upc=#{upc},remark=#{remark},modifyFlag=#{modifyFlag},modifyQtyFlag=#{modifyQtyFlag},surplus_qty=#{qty},vat=#{vat},roll=#{roll},carton=#{carton}
so=#{so},upc=#{upc},remark=#{remark},modifyFlag=#{modifyFlag},modifyQtyFlag=#{modifyQtyFlag},surplus_qty=#{qty,jdbcType=DECIMAL},vat=#{vat},roll=#{roll},carton=#{carton}
where where
site=#{site} and delNo=#{delNo} and item_no=#{itemNo} site=#{site} and delNo=#{delNo} and item_no=#{itemNo}
</update> </update>
@ -547,45 +547,45 @@ create_by,create_date,update_by,update_date
</select> </select>
<select id="getDefaultEcssDeclarationDetailData" resultType="EcssDeclarationDetailData"> <select id="getDefaultEcssDeclarationDetailData" resultType="EcssDeclarationDetailData">
-- 修复重复计算净重的问题:使用子查询先计算每个hsCode的数量和总净重,然后按比例分配
WITH HsCodeQty AS (
-- 先计算每个hsCode的总数量
SELECT b.hsCode, b.hsCodeDesc, SUM(a.qty) as totalQty
FROM ecss_CoDelPalletDetail a
LEFT JOIN part b ON a.site=b.site AND a.part_no=b.part_no
WHERE a.site=#{site} AND a.delNo=#{delNo} AND a.bu_no=#{buNo}
GROUP BY b.hsCode, b.hsCodeDesc
),
TotalWeight AS (
-- 计算总净重(不重复)
SELECT SUM(net_weight) as totalNetWeight
FROM ecss_CoDelBoxList
WHERE site=#{site} AND delNo=#{delNo} AND bu_no=#{buNo}
),
TotalQty AS (
-- 计算总数量
SELECT SUM(qty) as allQty
FROM ecss_CoDelPalletDetail
WHERE site=#{site} AND delNo=#{delNo} AND bu_no=#{buNo}
)
-- 修复净重计算问题:按数量比例分配箱子净重,避免重复计算
-- 一个箱子(BoxList)可能包含多个零件(PalletDetail),这些零件可能有相同的hsCode
-- 需要按每个零件的数量占该箱子总数量的比例来分配净重
WITH BoxDetail AS (
-- 计算每个箱子中每个零件的数量及其占比
SELECT SELECT
#{site} as site,
h.hsCode,
h.hsCodeDesc,
h.totalQty as qty,
-- 按数量比例分配净重:(该hsCode的数量 / 总数量) * 总净重
d.site,
d.bu_no,
d.delNo,
d.seq_no,
p.hsCode,
p.hsCodeDesc,
d.qty,
b.net_weight,
-- 计算该零件数量占该箱子总数量的比例
CASE CASE
WHEN tq.allQty > 0 THEN CONVERT(DECIMAL(20,2), (h.totalQty * tw.totalNetWeight) / tq.allQty)
WHEN SUM(d.qty) OVER (PARTITION BY d.site, d.bu_no, d.delNo, d.seq_no) > 0
THEN d.qty * 1.0 / SUM(d.qty) OVER (PARTITION BY d.site, d.bu_no, d.delNo, d.seq_no)
ELSE 0 ELSE 0
END as NetWeight,
END as qtyRatio
FROM ecss_CoDelPalletDetail d
LEFT JOIN part p ON d.site=p.site AND d.part_no=p.part_no
LEFT JOIN ecss_CoDelBoxList b ON d.site=b.site AND d.bu_no=b.bu_no AND d.delNo=b.delNo AND d.seq_no=b.item_no
WHERE d.site=#{site} AND d.delNo=#{delNo} AND d.bu_no=#{buNo}
)
SELECT
#{site} as site,
hsCode,
hsCodeDesc,
SUM(qty) as qty,
-- 按数量比例分配净重后汇总
CONVERT(DECIMAL(20,2), SUM(ISNULL(net_weight, 0) * qtyRatio)) as NetWeight,
'CNY' as currency, 'CNY' as currency,
'中国' as madeArea, '中国' as madeArea,
#{destination} as destination, #{destination} as destination,
'南通其他' as sourceArea, '南通其他' as sourceArea,
'照章征免' as levy '照章征免' as levy
FROM HsCodeQty h
CROSS JOIN TotalWeight tw
CROSS JOIN TotalQty tq
FROM BoxDetail
GROUP BY hsCode, hsCodeDesc
</select> </select>
<select id="getDefaultEcssDeclarationDetailData2" resultType="EcssDeclarationDetailData"> <select id="getDefaultEcssDeclarationDetailData2" resultType="EcssDeclarationDetailData">

Loading…
Cancel
Save