This commit is contained in:
linfso 2025-07-04 07:30:03 +08:00
parent 5186ff16ab
commit 0dcc5fbb81
5 changed files with 123 additions and 55 deletions

View File

@ -13,7 +13,9 @@ package com.xdadan.erp.emis.mapper;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xdadan.erp.emis.domain.EmisTmsCostFee;
import com.xdadan.erp.emis.domain.EmisWaybill;
import com.xdadan.erp.emis.domain.vo.cost.CostFeeWaybillRel;
import org.apache.ibatis.annotations.Param;
/**
* @ClassName EmisTmsCostFeeMapper
@ -33,6 +35,8 @@ public interface EmisTmsCostFeeMapper extends BaseMapper<EmisTmsCostFee>
public EmisTmsCostFee selectEmisTmsCostFeeByCostNo(String costNo);
public EmisWaybill selectThinWaybillInfoByCostFeeCalc(@Param("billCode")String billCode);
public EmisTmsCostFee selectEmisTmsCostFeeByBatchNo(String batchNo);
/**
@ -50,6 +54,7 @@ public interface EmisTmsCostFeeMapper extends BaseMapper<EmisTmsCostFee>
*/
public List<CostFeeWaybillRel> selectCostFeeRelListByBillCode(String billCode);
// 成本和费用关系
public List<CostFeeWaybillRel> selectCostFeeRelListByCostNo(String costNo);
/**

View File

@ -30,6 +30,15 @@ import org.apache.ibatis.annotations.Param;
public interface EmisWaybillMapper extends BaseMapper<EmisWaybill>
{
/**
* 获取最基础的bill对象
* @param billCode
* @return
*/
public EmisWaybill selectWaybillBaseInfoByBillCode(@Param("billCode")String billCode);
public EmisWaybill selectEmisWaybillByBillCode(@Param("billCode")String billCode);
public EmisWaybill selectMasterWaybillByBillCode(@Param("billCode")String billCode);

View File

@ -19,12 +19,14 @@ import java.util.concurrent.TimeUnit;
import cn.hutool.core.collection.CollectionUtil;
import com.googlecode.aviator.AviatorEvaluator;
import com.xdadan.erp.common.core.domain.entity.SysUser;
import com.xdadan.erp.common.utils.DateUtils;
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.domain.vo.cost.CostFeeWaybillRel;
import com.xdadan.erp.emis.mapper.*;
import com.xdadan.erp.emis.service.EmisBaseService;
import com.xdadan.erp.emis.utils.WaybillHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
@ -46,7 +48,7 @@ import static org.apache.commons.lang3.time.DateUtils.parseDate;
*/
@Slf4j
@Service
public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
public class EmisTmsCostFeeServiceImpl extends EmisBaseService implements IEmisTmsCostFeeService
{
@Autowired
private EmisTmsCostFeeMapper emisTmsCostFeeMapper;
@ -127,9 +129,6 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
@Override
@Transactional
public int insertEmisTmsCostFee(EmisTmsCostFee emisTmsCostFee) throws EmisBizError {
// if(CollectionUtils.isEmpty(emisTmsCostFee.getBillRelList())){
// throw new EmisBizError(EmisBizErrorType.FAIL,"关联单号不能为空");
// }
// 判断是否重复录入
int cnt=emisTmsCostFeeMapper.checkUnique(emisTmsCostFee);
@ -137,15 +136,8 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
throw new EmisBizError(EmisBizErrorType.FAIL,"费用录入重复");
}
String costNo = WaybillHelper.genCostNo();
emisTmsCostFee.setCostNo(costNo);
// 插入关联单号
// for (EmisTmsCostFeeRel costFeeRelItem:emisTmsCostFee.getBillRelList()) {
// costFeeRelItem.setId(null);
// costFeeRelItem.setCostNo(costNo);
// emisTmsCostFeeRelMapper.insertEmisTmsCostFeeRel(costFeeRelItem);
// }
// 总票数
emisTmsCostFee.setSendPieceSum(emisTmsCostFee.getBillRelList().size());
@ -226,10 +218,8 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
@Transactional
public int reCalcCostFeeByBillCode(String billCode) throws EmisBizError {
// 计算固定成本费用-取件费
EmisWaybill waybill=emisWaybillMapper.selectEmisWaybillByBillCode(billCode);
// 获取运单基础数据
EmisWaybill waybill=emisWaybillMapper.selectWaybillBaseInfoByBillCode(billCode);
if(waybill==null){
throw new EmisBizError(EmisBizErrorType.FAIL,"运单不存在");
}
@ -242,11 +232,41 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
String mainBillCode = billCode;
if( "1".equals(waybill.getBlVirtual()) ){
mainBillCode=waybill.getMasterBillCode();
mainWaybill=emisWaybillMapper.selectEmisWaybillByBillCode(mainBillCode);
mainWaybill=emisWaybillMapper.selectWaybillBaseInfoByBillCode(mainBillCode);
}else{
mainWaybill=waybill;
}
// 计算固定成本费用-取件费
reCalcFixedCostFee(billCode,mainBillCode,waybill,mainWaybill);
// 搜索已录入成本的费用分摊
List<CostFeeWaybillRel> listBillCodeRel=emisTmsCostFeeMapper.selectCostFeeRelListByBillCode(billCode);
if(!CollectionUtil.isEmpty(listBillCodeRel)){
for(CostFeeWaybillRel item:listBillCodeRel){
try {
reCalcCostFeeOnlyOne(item.getCostNo(),billCode,false);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
mergeCostFeeByBillCode(billCode);
return 1;
}
/**
* 计算固定成本
* @param billCode
* @param mainBillCode
* @param waybill
* @param mainWaybill
*/
private void reCalcFixedCostFee(String billCode,String mainBillCode,EmisWaybill waybill,EmisWaybill mainWaybill){
// bug:1682 (1)快递类型的货(取件费):寄件国家:中国,取件方式:上门取件,取件成本:首重1Kg 10元,续重1kg 1元
// 只有主单才会计算取件费
if("2".equals(mainWaybill.getPickupMethod())
@ -267,12 +287,29 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
splitItem.setTransWeight(mainWaybill.getBillWeight()); // 运输重量
splitItem.setTransVolume(mainWaybill.getTotalVolume()); // 运输体积
// 取件员,取件网点
String takeEmpName=null;
if(!StringUtils.isEmpty(mainWaybill.getTakePieceEmployeeCode())) {
SysUser takeEmpUser = getEmisStaffByCode(mainWaybill.getTakePieceEmployeeCode());
if (takeEmpUser != null) {
takeEmpName = takeEmpUser.getEmpName();
}
}
String sendSiteName=null;
if(!StringUtils.isEmpty(mainWaybill.getSendSiteCode())) {
EmisSite sendSite = getSiteByCode(mainWaybill.getSendSiteCode());
if (sendSite != null) {
sendSiteName = sendSite.getSiteName();
}
}
// 供应商
splitItem.setSupplierCode("10213"); // 供应商
splitItem.setTransSignNo(mainWaybill.getTakePieceEmployeeName()); // 运输号
splitItem.setTransSignNo(takeEmpName); // 运输号
splitItem.setSendPlace("客户现场");
splitItem.setDestPlace(mainWaybill.getSendSiteName());
splitItem.setDestPlace(sendSiteName);
splitItem.setBillMonth(DateUtils.parseDateToStr(DateUtils.YYYY_MM,mainWaybill.getSendDate()));
splitItem.setTradeDate(mainWaybill.getSendDate());
@ -298,7 +335,7 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
splitItem.setCurrency("CNY");
splitItem.setCalcExpr(itemCalcExpr);
splitItem.setCalcRemark(calcExprStr+"="+splitCostFee.stripTrailingZeros().toPlainString());
splitItem.setRemark("网点上门取件费:取件员["+waybill.getTakePieceEmployeeName()+"]");
splitItem.setRemark("网点上门取件费:取件员["+takeEmpName+"]");
// 总成本费用=本次取件费
splitItem.setTransCostFee(splitCostFee);
@ -316,15 +353,15 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
// 派送
if(
"1".equals(mainWaybill.getCarryType()) // 快递
&& "1".equals(mainWaybill.getDispatchMethod()) // 派送
&& (
&& "1".equals(mainWaybill.getDispatchMethod()) // 派送
&& (
"0855".equals(mainWaybill.getReceiveCountry()) // 柬埔寨
|| "0095".equals(mainWaybill.getReceiveCountry()) // 缅甸
|| "0880".equals(mainWaybill.getReceiveCountry()) // 孟加拉
|| "0084".equals(mainWaybill.getReceiveCountry()) // 越南
|| "0856".equals(mainWaybill.getReceiveCountry()) // 老挝
|| "0095".equals(mainWaybill.getReceiveCountry()) // 缅甸
|| "0880".equals(mainWaybill.getReceiveCountry()) // 孟加拉
|| "0084".equals(mainWaybill.getReceiveCountry()) // 越南
|| "0856".equals(mainWaybill.getReceiveCountry()) // 老挝
)
){
){
EmisTmsCostFeeSplit splitItem = new EmisTmsCostFeeSplit();
splitItem.setBillCode(billCode);
@ -339,12 +376,29 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
splitItem.setTransWeight(mainWaybill.getBillWeight()); // 运输重量
splitItem.setTransVolume(mainWaybill.getTotalVolume()); // 运输体积
// 取件员,取件网点
String dispathEmpName=null;
if(!StringUtils.isEmpty(mainWaybill.getTakePieceEmployeeCode())) {
SysUser dispathEmpUser = getEmisStaffByCode(mainWaybill.getDispatchManCode());
if (dispathEmpUser != null) {
dispathEmpName = dispathEmpUser.getEmpName();
}
}
String dispatchUnderlingSiteName=null;
if(!StringUtils.isEmpty(mainWaybill.getDispatchUnderlingSiteCode())) {
EmisSite dispatchUnderlingSite = getSiteByCode(mainWaybill.getDispatchUnderlingSiteCode());
if (dispatchUnderlingSite != null) {
dispatchUnderlingSiteName = dispatchUnderlingSite.getSiteName();
}
}
// 供应商
splitItem.setSupplierCode("10214"); // 供应商
splitItem.setTransSignNo(mainWaybill.getDispatchManName()); // 运输号
splitItem.setTransSignNo(dispathEmpName); // 运输号
// 目的网点到客户现场
splitItem.setSendPlace(mainWaybill.getDispatchUnderlingSiteName());
splitItem.setSendPlace(dispatchUnderlingSiteName);
splitItem.setDestPlace("客户现场");
splitItem.setBillMonth(DateUtils.parseDateToStr(DateUtils.YYYY_MM,waybill.getSendDate()));
@ -374,13 +428,13 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
splitItem.setCalcExpr(itemCalcExpr);
splitItem.setCalcRemark(calcExprStr+"="+splitCostFee.stripTrailingZeros().toPlainString());
splitItem.setRemark("网点派送费(首重:2美金/15元,续重:0.2美金/1.5元/kg)-派件员:"+waybill.getDispatchManName());
splitItem.setRemark("网点派送费(首重:2美金/15元,续重:0.2美金/1.5元/kg)-派件员:"+dispatchUnderlingSiteName);
// 总成本费用=本次取件费
splitItem.setTransCostFee(splitCostFee);
splitItem.setCnyFee(splitCostFee);
// 先删除取件费,再插入
// 先删除,再插入
emisTmsCostFeeSplitMapper.deleteByBillCodeAndFeeType(mainBillCode,"1003");
// 插入分摊明细数据
@ -517,7 +571,7 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
String itemCalcExpr = quotePriceItem.getCalculateExpression();
// 正常计算公司
// 正常计算公式
String calcExprStr = itemCalcExpr.replaceAll("w", waybill.getBillWeight().stripTrailingZeros().toPlainString())
.replaceAll("t", quotePriceItem.getTransWeight().stripTrailingZeros().toPlainString())
.replaceAll("d", quotePriceItem.getPrice().stripTrailingZeros().toPlainString())
@ -557,23 +611,6 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
emisTmsCostFeeSplitMapper.insertEmisTmsCostFeeSplit(splitItem);
}
}
// 搜索已录入成本的费用分摊
List<CostFeeWaybillRel> listBillCodeRel=emisTmsCostFeeMapper.selectCostFeeRelListByBillCode(billCode);
if(!CollectionUtil.isEmpty(listBillCodeRel)){
for(CostFeeWaybillRel item:listBillCodeRel){
try {
reCalcCostFeeOnlyOne(item.getCostNo(),billCode,false);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
mergeCostFeeByBillCode(billCode);
return 1;
}
@ -753,9 +790,6 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
// /* 总票数 总重量 总体积 */
BigDecimal totalWeight = BigDecimal.ZERO;
BigDecimal totalVolume = BigDecimal.ZERO;
// if(oldCostFee.getCostFee()==null || BigDecimal.ZERO.compareTo(oldCostFee.getCostFee()) == 0){
// throw new EmisBizError(EmisBizErrorType.FAIL,"成本费用不能为0");
// }
// 获取费用列表
List<EmisTmsCostFeeFeeitem> listFeeItemRel=emisTmsCostFeeFeeitemMapper.selectEmisTmsCostFeeFeeitemByCostNo(costNo);
@ -807,7 +841,6 @@ public class EmisTmsCostFeeServiceImpl implements IEmisTmsCostFeeService
EmisTmsCostFee costFeeDetail= billCodeItem.getCostFeeDetail();
// 循环费用类型
for (EmisTmsCostFeeFeeitem feeItem: listFeeItemRel) {
EmisTmsCostFeeSplit splitItem = new EmisTmsCostFeeSplit();

View File

@ -43,11 +43,13 @@
</resultMap>
<resultMap type="CostFeeWaybillRel" id="CostFeeWaybillRelResult">
<resultMap type="CostFeeWaybillRel" id="BaseCostFeeWaybillRelResult">
<result property="id" column="id" />
<result property="costNo" column="cost_no" />
<result property="billCode" column="bill_code" />
</resultMap>
<resultMap type="CostFeeWaybillRel" id="CostFeeWaybillRelResult" extends="BaseCostFeeWaybillRelResult">
<association property="costFeeDetail"
column="cost_no"
select="selectEmisTmsCostFeeByCostNo"
@ -56,7 +58,7 @@
<association property="waybillDetail"
column="bill_code"
select="com.xdadan.erp.emis.mapper.EmisWaybillMapper.selectWaybillBaseInfoByBillCode"
select="selectThinWaybillInfoByCostFeeCalc"
fetchType="lazy"
/>
</resultMap>
@ -99,6 +101,24 @@
AND c.cost_no = #{costNo}
</select>
<!-- 成本运算获取最小化运单信息 -->
<select id="selectThinWaybillInfoByCostFeeCalc" parameterType="parameterType" resultType="EmisWaybill">
SELECT
a.id,
a.bill_code as billCode,
a.total_volume as totalVolume,
a.parcel_qty parcelQty,
a.bill_weight as billWeight,
a.volume_weight as volumeWeight,
a.settlement_weight as settlementWeight,
a.freight as freight,
a.bl_virtual as blVirtual,
a.master_bill_code as masterBillCode
FROM emis_waybill a
WHERE a.del_flag = '0' and bill_code=#{billCode}
</select>
<sql id="selectEmisTmsCostFeeVo">
select id, cost_no, cost_name, batch_no, fee_type, split_type, trans_type, trans_sign_no, supplier_code, supplier_name, send_place, dest_place, cost_fee, usd_cost_fee, bill_month, trade_date, send_piece_sum, piece_number, total_weight, total_volume, bl_confirm_center, real_piece_number, real_total_weight, real_total_volume, confirm_center_date, confirm_center_note, confirm_center_man_code, confirm_center_code, bl_confirm_site, confirm_site_date, confirm_site_man_code, confirm_site_note, confirm_site_code, bl_has_calc, calc_date, remark, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_tms_cost_fee

View File

@ -510,7 +510,7 @@
limit 1
</select>
<!-- 提供给扫描记录 查询使用,简化的,不包含扫描记录-->
<!-- 提供给扫描记录 查询使用, 简化的,不包含扫描记录-->
<select id="selectWaybillBaseInfoByBillCode" parameterType="String" resultMap="BaseEmisWaybillResult">
<include refid="selectEmisWaybillVo"/>
<where>
@ -2734,6 +2734,7 @@
ORDER BY a.send_date DESC
</select>
<insert id="insertEmisWaybill" parameterType="EmisWaybill" useGeneratedKeys="true" keyProperty="id">
insert into emis_waybill
<trim prefix="(" suffix=")" suffixOverrides=",">