This commit is contained in:
linfso 2025-07-11 07:14:48 +08:00
parent d10a99cbe8
commit 49d091c555
4 changed files with 64 additions and 28 deletions

View File

@ -96,5 +96,6 @@ public class EmisTmsCostQuotePrice extends BaseEntity
private BigDecimal transWeight;
private BigDecimal totalWeight;
private BigDecimal totalVolume;
private String transType;
}

View File

@ -11,6 +11,7 @@
package com.xdadan.erp.emis.service.impl;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.time.LocalDate;
import java.util.*;
@ -295,6 +296,8 @@ public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisT
}
/**
* 计算固定成本
* @param billCode
@ -602,22 +605,18 @@ public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisT
}
existsMap.put(uniqKey,1);
// 计算结算重量
BigDecimal transVolume=quotePriceItem.getTotalVolume();
BigDecimal transVolumeWeight=transVolume.multiply(new BigDecimal("333.0"));
BigDecimal transWeight=quotePriceItem.getTransWeight();
if(transVolumeWeight.compareTo(transWeight)>0){
transWeight=transVolumeWeight;
}
// 获取批次结算重量
// BigDecimal totalSettlementWeight=emisTmsCostQuotePriceMapper.getTotalSettlementWeightByBatchNo(quotePriceItem.getBatchNo());
BigDecimal transVolume=quotePriceItem.getTotalVolume();
BigDecimal totalSettlementWeight=emisTmsCostQuotePriceMapper.getTotalSettlementWeightByBatchNo(quotePriceItem.getBatchNo());
BigDecimal transWeight=totalSettlementWeight;
// 计算 机场提货费操作费
EmisTmsCostFeeSplit splitItem = new EmisTmsCostFeeSplit();
splitItem.setBillCode(billCode.trim());
splitItem.setMainBillCode(mainBillCode.trim());
splitItem.setBillWeight(waybill.getBillWeight()); // 运单重量
splitItem.setBillWeight(waybill.getSettlementWeight()); // 运单重量
splitItem.setTotalVolume(waybill.getTotalVolume()); // 运单体积
// 运输成本
@ -642,15 +641,15 @@ public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisT
splitItem.setFeeType("1004"); // 网点机场操作费
splitItem.setSplitType("1"); // 按重量分摊
splitItem.setFeeItemId(-1L); // 无成本费用项来源
splitItem.setSplitValue(waybill.getBillWeight()); // 分摊重量
splitItem.setSplitValue(waybill.getSettlementWeight()); // 分摊重量
// 总费用=单价*公里数
BigDecimal totalDbCostFee = quotePriceItem.getPrice().multiply(quotePriceItem.getTransWeight());
BigDecimal totalDbCostFee = quotePriceItem.getPrice().multiply(transWeight);
String itemCalcExpr = quotePriceItem.getCalculateExpression();
// 正常计算公式
String calcExprStr = itemCalcExpr.replaceAll("w", waybill.getBillWeight().stripTrailingZeros().toPlainString())
String calcExprStr = itemCalcExpr.replaceAll("w", waybill.getSettlementWeight().stripTrailingZeros().toPlainString())
.replaceAll("t", transWeight.stripTrailingZeros().toPlainString())
.replaceAll("d", quotePriceItem.getPrice().stripTrailingZeros().toPlainString())
.replaceAll("c", totalDbCostFee.stripTrailingZeros().toPlainString());
@ -660,20 +659,20 @@ public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisT
totalDbCostFee=quotePriceItem.getLeastPrice(); // 总成本=最低报价
itemCalcExpr="(w/t)*c";
calcExprStr = itemCalcExpr.replaceAll("w", waybill.getBillWeight().stripTrailingZeros().toPlainString())
calcExprStr = itemCalcExpr.replaceAll("w", mainWaybill.getSettlementWeight().stripTrailingZeros().toPlainString())
.replaceAll("t", transWeight.stripTrailingZeros().toPlainString())
.replaceAll("c", totalDbCostFee.stripTrailingZeros().toPlainString());
}
Map<String, Object> env = new HashMap<>();
env.put("w", mainWaybill.getBillWeight());
env.put("w", waybill.getSettlementWeight());
env.put("t", transWeight);
env.put("d", quotePriceItem.getPrice());
env.put("c", totalDbCostFee);
double costFee = Double.valueOf(AviatorEvaluator.execute(itemCalcExpr,env).toString());
log.info("机场提货费操作费:计算公式:" + calcExprStr + ",重量:" + waybill.getBillWeight().stripTrailingZeros().toPlainString());
log.info("机场提货费操作费:计算公式:" + calcExprStr + ",重量:" + waybill.getSettlementWeight().stripTrailingZeros().toPlainString());
// 如果计算出来的成本大于单项收费取成本费用
if(costFee > totalDbCostFee.doubleValue()){
@ -877,7 +876,7 @@ public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisT
// /* 总票数 总重量 总体积 */
BigDecimal totalWeight = BigDecimal.ZERO;
BigDecimal totalVolume = BigDecimal.ZERO;
BigDecimal totalSettlementWeight = BigDecimal.ZERO;
// 获取费用列表
@ -907,17 +906,13 @@ public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisT
// 累加应收
totalWeight=totalWeight.add(emisWaybill.getBillWeight());
totalVolume=totalVolume.add(emisWaybill.getTotalVolume());
totalSettlementWeight=totalSettlementWeight.add(emisWaybill.getSettlementWeight());
pieceNumber=pieceNumber+emisWaybill.getParcelQty();
}
// 计算结算重量
BigDecimal transVolume=totalVolume;
BigDecimal transVolumeWeight=transVolume.multiply(new BigDecimal("333.0"));
BigDecimal transWeight=totalWeight;
if(transVolumeWeight.compareTo(transWeight)>0){
transWeight=transVolumeWeight;
}
BigDecimal transWeight=totalSettlementWeight;
Integer sendPieceSum = listBillCodeRel.size();
// 计算分摊成本
@ -945,7 +940,7 @@ public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisT
splitItem.setBillCode(billCode.trim());
splitItem.setMainBillCode(mainBillCode.trim());
splitItem.setBillWeight(waybill.getBillWeight()); // 运单重量
splitItem.setBillWeight(waybill.getSettlementWeight()); // 运单重量
splitItem.setTotalVolume(waybill.getTotalVolume()); // 运单体积
// 运输成本
@ -968,7 +963,7 @@ public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisT
splitItem.setFeeType(feeItem.getFeeType()); // 费用类型
splitItem.setSplitType(oldCostFee.getSplitType()); // 按重量分摊
splitItem.setFeeItemId(feeItem.getId()); // 无成本费用项来源
splitItem.setSplitValue(waybill.getBillWeight());
splitItem.setSplitValue(waybill.getSettlementWeight());
splitItem.setPrice(feeItem.getPrice());
splitItem.setCurrency(feeItem.getCurrency());
splitItem.setCurrecyToCnyRate(feeItem.getCurrecyToCnyRate());
@ -985,16 +980,16 @@ public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisT
// 按重量分摊
if ("1".equals(oldCostFee.getSplitType())) {
itemCalcExpr="(w/t)*c";
calcExprStr=itemCalcExpr.replaceAll("w", waybill.getBillWeight().stripTrailingZeros().toPlainString())
calcExprStr=itemCalcExpr.replaceAll("w", waybill.getSettlementWeight().stripTrailingZeros().toPlainString())
.replaceAll("t", transWeight.stripTrailingZeros().toPlainString())
.replaceAll("c", totalDbCostFee.stripTrailingZeros().toPlainString());
Map<String, Object> env = new HashMap<>();
env.put("w", waybill.getBillWeight());
env.put("w", waybill.getSettlementWeight());
env.put("t", transWeight);
env.put("c", totalDbCostFee);
costFee = Double.valueOf(AviatorEvaluator.execute(itemCalcExpr,env).toString());
log.info("按重量分摊:计算公式:" + calcExprStr + ",重量:" + waybill.getBillWeight().stripTrailingZeros().toPlainString());
log.info("按重量分摊:计算公式:" + calcExprStr + ",重量:" + waybill.getSettlementWeight().stripTrailingZeros().toPlainString());
}
// 按体积
@ -1004,7 +999,7 @@ public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisT
.replaceAll("t", transVolume.stripTrailingZeros().toPlainString())
.replaceAll("c", totalDbCostFee.stripTrailingZeros().toPlainString());
Map<String, Object> env = new HashMap<>();
env.put("w", waybill.getBillWeight());
env.put("w", waybill.getSettlementWeight());
env.put("t", transVolume);
env.put("c", totalDbCostFee);
costFee = Double.valueOf(AviatorEvaluator.execute(itemCalcExpr,env).toString());

View File

@ -407,6 +407,44 @@ public class WaybillHelper {
}
}
/**
* 体积重量计算
* @param totalVolume
* @param transType
* 快递 -1 5000
* 空运 -2 6000
* 陆运 -3 3333
* 海运 -4 3333
* 铁路 -5 4000
* 同行 -6 5000
* @return
*/
public static BigDecimal calcVolumeWeight(BigDecimal totalVolume,String transType){
// 特殊计泡处理
// 6000 167
// 3333 300
BigDecimal volumeWeight=BigDecimal.ZERO;
// 快递、同行
if("1".equals(transType)||"6".equals(transType)){
double mRate=1000000.0 / Double.valueOf("5000");
volumeWeight=totalVolume.multiply(BigDecimal.valueOf(mRate));
}
// 空运 6000
else if("2".equals(transType)){
volumeWeight=totalVolume.multiply(BigDecimal.valueOf(167.0f));
}
// 陆运、海运 3333
else if("3".equals(transType)||"4".equals(transType)){
volumeWeight=totalVolume.multiply(BigDecimal.valueOf(300.0f));
}
// 铁路 4000
else if("5".equals(transType)){
double mRate=1000000.0 / Double.valueOf("4000");
volumeWeight=totalVolume.multiply(BigDecimal.valueOf(mRate));
}
return volumeWeight;
}
public static void main(String[] args) {

View File

@ -34,6 +34,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="transWeight" column="trans_weight" />
<result property="totalVolume" column="total_volume" />
<result property="totalWeight" column="total_weight" />
<result property="transType" column="trans_type" />
<association property="startSiteName" column="start_site_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectSiteNameByCode"/>
<association property="nextSiteName" column="next_site_code" select="com.xdadan.erp.emis.mapper.EmisBaseMapper.selectSiteNameByCode"/>
@ -102,6 +103,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
b.trans_weight,
b.total_weight,
b.total_volume,
b.trans_type,
b.total_settlement_weight
FROM