diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsCostFeeRel.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsCostFeeRel.java index c4e07353b..8e5bc1787 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsCostFeeRel.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsCostFeeRel.java @@ -48,4 +48,7 @@ public class EmisTmsCostFeeRel extends BaseEntity /* 计算备注 */ private String calcRemark; + // 扩展参数 + private EmisWaybill waybillDetail; + } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsCostFeeMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsCostFeeMapper.java index a020ca78d..9e6c5b686 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsCostFeeMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsCostFeeMapper.java @@ -28,6 +28,9 @@ public interface EmisTmsCostFeeMapper extends BaseMapper */ public EmisTmsCostFee selectEmisTmsCostFeeById(Long id); + + public EmisTmsCostFee selectEmisTmsCostFeeByCostNo(String costNo); + /** * 查询列表 * diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsCostFeeRelMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsCostFeeRelMapper.java index 4258a307e..c06ffb313 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsCostFeeRelMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTmsCostFeeRelMapper.java @@ -12,6 +12,7 @@ package com.xdadan.erp.emis.mapper; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xdadan.erp.emis.domain.EmisSettleSubBill; import com.xdadan.erp.emis.domain.EmisTmsCostFeeRel; /** * @ClassName EmisTmsCostFeeRelMapper @@ -36,6 +37,8 @@ public interface EmisTmsCostFeeRelMapper extends BaseMapper */ public List selectEmisTmsCostFeeRelList(EmisTmsCostFeeRel emisTmsCostFeeRel); + public List selectEmisTmsCostFeeRelListByCostNo(String costNo); + /** * 检查是否重复 diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsCostFeeService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsCostFeeService.java index 59d3d89aa..823c15d46 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsCostFeeService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTmsCostFeeService.java @@ -76,4 +76,8 @@ public interface IEmisTmsCostFeeService * @return 结果 */ public int deleteEmisTmsCostFeeById(Long id); + + + public int reCalcSplitCostFee(String costNo) throws EmisBizError; + } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsCostFeeServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsCostFeeServiceImpl.java index 7fd89b8de..edca38560 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsCostFeeServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsCostFeeServiceImpl.java @@ -10,17 +10,19 @@ package com.xdadan.erp.emis.service.impl; +import java.math.BigDecimal; import java.util.List; -import com.xdadan.erp.emis.domain.EmisTmsCostFeeRel; +import cn.hutool.core.collection.CollectionUtil; +import com.xdadan.erp.emis.domain.*; import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.mapper.EmisTmsCostFeeRelMapper; import com.xdadan.erp.emis.utils.WaybillHelper; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.xdadan.erp.emis.domain.EmisTmsCostFee; import com.xdadan.erp.emis.mapper.EmisTmsCostFeeMapper; import com.xdadan.erp.emis.service.IEmisTmsCostFeeService; import org.springframework.transaction.annotation.Transactional; @@ -31,6 +33,7 @@ import org.springframework.transaction.annotation.Transactional; * @author linfso * @date 2024-10-10 01:53:20 */ + @Slf4j @Service public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService { @@ -87,7 +90,6 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService @Transactional public int insertEmisTmsCostFee(EmisTmsCostFee emisTmsCostFee) throws EmisBizError { // billRelList - if(CollectionUtils.isEmpty(emisTmsCostFee.getBillRelList())){ throw new EmisBizError(EmisBizErrorType.FAIL,"关联单号不能为空"); } @@ -101,9 +103,95 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService emisTmsCostFeeRelMapper.insertEmisTmsCostFeeRel(costFeeRel); } - return emisTmsCostFeeMapper.insertEmisTmsCostFee(emisTmsCostFee); + emisTmsCostFeeMapper.insertEmisTmsCostFee(emisTmsCostFee); + + // 计算分摊费用 + reCalcSplitCostFee(costNo); + + return 1; } + /** + * 成本分摊重算 + * @param costNo + * @return + * @throws EmisBizError + */ + @Override + public int reCalcSplitCostFee(String costNo) throws EmisBizError { + + // 获取最新的数据 + EmisTmsCostFee old = emisTmsCostFeeMapper.selectEmisTmsCostFeeByCostNo(costNo); + +// /* 总票数 总重量 总体积 */ + BigDecimal totalWeight = BigDecimal.ZERO; + BigDecimal totalVolume = BigDecimal.ZERO; + + if(old.getCostFee()==null || BigDecimal.ZERO.compareTo(old.getCostFee()) == 0){ + throw new EmisBizError(EmisBizErrorType.FAIL,"成本费用不能为0"); + } + + List listFeeRel=emisTmsCostFeeRelMapper.selectEmisTmsCostFeeRelListByCostNo(costNo); + if(CollectionUtil.isEmpty(listFeeRel)){ + throw new EmisBizError(EmisBizErrorType.FAIL,"子运单数量为空,请检查"); + } + + + Integer pieceNumber = 0; + // 计算总重量 + for (EmisTmsCostFeeRel feeRel: listFeeRel) { + // 获取运单信息 + EmisWaybill emisWaybill=feeRel.getWaybillDetail(); + // 累加应收 + totalWeight=totalWeight.add(emisWaybill.getBillWeight()); + totalVolume=totalVolume.add(emisWaybill.getTotalVolume()); + pieceNumber=pieceNumber+emisWaybill.getParcelQty(); + } + + + Integer sendPieceSum = listFeeRel.size(); + + EmisTmsCostFee emisTmsCostFee = new EmisTmsCostFee(); + emisTmsCostFee.setId(old.getId()); + // 总票数 总件数 总重量 总体积 + emisTmsCostFee.setSendPieceSum(sendPieceSum); + emisTmsCostFee.setPieceNumber(pieceNumber); + emisTmsCostFee.setTotalWeight(totalWeight); + emisTmsCostFee.setTotalVolume(totalVolume); + + // 计算分摊成本 + for (EmisTmsCostFeeRel feeRel: listFeeRel) { + EmisTmsCostFeeRel updRel = new EmisTmsCostFeeRel(); + updRel.setId(feeRel.getId()); + updRel.setFeeType(emisTmsCostFee.getFeeType()); + updRel.setSplitType(emisTmsCostFee.getSplitType()); + + BigDecimal splitCostFee=BigDecimal.ZERO; + BigDecimal splitRate=BigDecimal.ZERO; + // 按重量分摊 + if("1".equals(updRel.getSplitType()) ){ + splitRate = feeRel.getWaybillDetail().getBillWeight().divide(totalWeight); + } + // 按体积 + else if("2".equals(updRel.getSplitType()) ){ + splitRate = feeRel.getWaybillDetail().getTotalVolume().divide(totalVolume); + } + // 按票 + else if("3".equals(updRel.getSplitType()) ){ + splitRate = 1/sendPieceSum; + } + splitCostFee = old.getCostFee().multiply(splitRate); + updRel.setCostFee(splitCostFee); + + emisTmsCostFeeRelMapper.updateEmisTmsCostFeeRel(updRel); + } + + + // 更新信息 + return emisTmsCostFeeMapper.updateEmisTmsCostFee(emisTmsCostFee); + } + + /** * 修改TMS运输成本账单 * diff --git a/emis-biz/src/main/resources/mapper/EmisTmsCostFeeMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsCostFeeMapper.xml index 8e2202933..6034de020 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsCostFeeMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsCostFeeMapper.xml @@ -131,6 +131,12 @@ where a.id = #{id} + + insert into emis_tms_cost_fee diff --git a/emis-biz/src/main/resources/mapper/EmisTmsCostFeeRelMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsCostFeeRelMapper.xml index b6d2f22e5..ed71d9a3d 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsCostFeeRelMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsCostFeeRelMapper.xml @@ -14,6 +14,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + select id, cost_no, bill_code, fee_type, split_type, cost_fee, calc_remark, remark, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_tms_cost_fee_rel @@ -61,7 +70,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and update_site = #{updateSite} limit 1 - + + +