更改内部配送费计算方法

This commit is contained in:
Jack 2025-12-22 22:31:51 +08:00
parent 9136af8a52
commit 52ff9dabe0
6 changed files with 188 additions and 166 deletions

View File

@ -258,6 +258,9 @@ public class ShopMchEntry implements Serializable {
@ApiModelProperty(value = "是否绑定分账接收方1-是2-否;")
private Integer has_bind_receiver;
@ApiModelProperty(value = "父入驻id总店入驻id")
private Integer parent_id;
@ApiModelProperty(value = "该商家入驻记录是否有效0:无效1:有效")
private Integer status;

View File

@ -99,7 +99,7 @@ public class LakalaController extends BaseControllerImpl {
// return lakalaApiService.tradeQuery(paramsJSON.getInt("storeId"), paramsJSON.getStr("orderId"));
return lklTkService.getLklShopId("8226330541100J8", "");
return lklTkService.openMerchantAddTerm("8226330541100J8");
}

View File

@ -827,18 +827,18 @@ public class LklTkServiceImpl {
String reviewPass = dataJSON.getStr("reviewPass");
String merCupNo = dataJSON.getStr("externalCustomerNo"); //拉卡拉外部商户号
String merInnerNo = dataJSON.getStr("customerNo"); //拉卡拉内部商户号
String termNos = dataJSON.getStr("termNos"); //拉卡拉分配的业务终端号
String termNo = dataJSON.getStr("termNo"); //拉卡拉分配的业务终端号
logger.debug("解析通知数据完成 - 审核状态: {},外部商户号: {},内部商户号: {},终端号: {}",
reviewPass, merCupNo, merInnerNo, termNos);
reviewPass, merCupNo, merInnerNo, termNo);
// 合并参数校验
if (dataJSON.isEmpty() ||
StrUtil.isBlank(reviewPass) ||
StrUtil.isBlank(merCupNo) ||
StrUtil.isBlank(merInnerNo) ||
StrUtil.isBlank(termNos)) {
logger.warn("拉卡拉异步通知参数解析出错,数据: {}", data);
StrUtil.isBlank(termNo)) {
logger.warn("拉卡拉进异步通知参数解析出错,数据: {}", data);
return new JSONObject().set("code", "500").set("message", "参数解析出错");
}
@ -869,7 +869,7 @@ public class LklTkServiceImpl {
// 更新已进件成功的商户号和设备号
logger.debug("开始更新商户拉卡拉审核状态");
Boolean success = shopMchEntryService.updateMerchEntryLklAuditStatusByLklMerCupNo(
merInnerNo, merCupNo, termNos, CommonConstant.Enable, null, data);
merInnerNo, merCupNo, termNo, CommonConstant.Enable, null, data);
if (!Boolean.TRUE.equals(success)) {
logger.error("拉卡拉进件审核通过但更新商户号失败商户ID: {}", mchId);

View File

@ -1422,14 +1422,17 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
if (!shopOrderBase.getOperate_flag().equals("0")) {
return CommonResult.failed("该状态不允许发货操作");
}
Pair<Boolean, String> pair = wxOrderShippingService.uploadShippingInfoToWx(2, shopOrderBase.getOrder_id());
if (pair.getFirst()) {
Integer orderStatus = StateCode.ORDER_STATE_SHIPPED;//已发货
Integer orderIsOutStatus = StateCode.ORDER_PICKING_STATE_YES; // 已出库
shopOrderInfoService.changeOrderStatus(orderId, orderStatus, orderIsOutStatus, 0);
//完成订单后修改订单异常操作流程进入完成订单环节
shopOrderBase.setOperate_flag("1");
shopOrderBaseService.updateById(shopOrderBase);
//出库扣减思迅库存star
// RMK 第三方数据同步相关redis 给这个商品减去对应的库存
QueryWrapper<ShopOrderItem> itemQueryWrapper = new QueryWrapper<>();
@ -1438,6 +1441,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
if (picking(order_item_rows)) {
logger.info("自行发货商品扣减库存成功");
}
if (!order_item_rows.isEmpty()) {
for (ShopOrderItem shopOrderItem : order_item_rows) {
Map<String, Integer> stockDeltaMap = new HashMap<>();

View File

@ -889,162 +889,171 @@ public class ShopStoreSameCityTransportBaseServiceImpl extends BaseServiceImpl<S
*/
@Override
public Integer computeSameCityInnerDeliveryFee(Integer storeId, String orderLongitude, String orderLatitude, Integer orderWeightGram, BigDecimal orderProductAmount, BigDecimal orderDiscountAmount, BigDecimal orderPayAmount) {
// 参数校验
if (storeId == null || orderLongitude == null || orderLatitude == null || storeId <= 0) {
logger.warn("同城配送缺少必要参数,无法计算配送费。");
SameCityDeliveryFeeRespDTO sameCityDeliveryFeeRespDTO = computeSameCityTransportFee(Convert.toLong(storeId), orderLongitude, orderLatitude, orderWeightGram, orderProductAmount, orderDiscountAmount, orderPayAmount, false);
if (sameCityDeliveryFeeRespDTO == null
|| sameCityDeliveryFeeRespDTO.getDeliveryFee() == null
|| sameCityDeliveryFeeRespDTO.getDeliveryFee().compareTo(BigDecimal.ZERO) <= 0) {
return 0;
}
// 获取店铺基本信息
ShopStoreBase storeBase = shopStoreBaseService.get(storeId);
if (storeBase == null) {
logger.warn("同城配送缺少店铺基本信息,无法计算配送费。");
return 0;
}
return sameCityDeliveryFeeRespDTO.getDeliveryFee().multiply(new BigDecimal(100)).intValue();
String storeName = storeBase.getStore_name();
String storeLng = storeBase.getStore_longitude();
String storeLat = storeBase.getStore_latitude();
if (StrUtil.isBlank(storeLng) || StrUtil.isBlank(storeLat)) {
logger.warn("无法获取{}的具体位置,请联系商家。", storeName);
return 0;
}
// 获取平台的基础运费设置记录
ShopStoreSameCityTransportBase transportBase = getShopStoreSameCityTransportBaseById(Convert.toLong(storeId), CommonConstant.Enable);
if (transportBase == null) {
logger.warn("商家{}尚未完成同城配送设置,无法计算配送费。", storeName);
return 0;
}
// 设置默认值
if (transportBase.getDistance_base() == null) {
transportBase.setDistance_base(0);
}
if (transportBase.getWeight_base() == null) {
transportBase.setWeight_base(0);
}
if (transportBase.getDelivery_base_fee() == null) {
transportBase.setDelivery_base_fee(BigDecimal.ZERO);
}
// 计算两点的距离(单位米)
Double distanceD = PositionUtil.getDistance1(Convert.toDouble(storeLng), Convert.toDouble(storeLat), Convert.toDouble(orderLongitude), Convert.toDouble(orderLatitude));
Integer distance = (distanceD != null) ? distanceD.intValue() : 0;
// 基础配送费计算
BigDecimal deliveryBaseFee = Convert.toBigDecimal(transportBase.getDelivery_base_fee(), BigDecimal.ZERO);
// 获取运费配送范围信息
List<ShopStoreSameCityTransport> transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportList(Convert.toLong(storeId));
if (CollUtil.isEmpty(transportList)) {
// 没有配送范围规则的时候直接以基础配送费来配送
return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue();
}
// 判断配送范围和起送金额条件
String canNotDeliveryReason = "";
boolean canDelivery = false;
// 优先处理距离和金额都满足的规则
for (ShopStoreSameCityTransport transport : transportList) {
// 判断订单距离是否在配送范围内
if (transport.getMax_delivery_radius() >= distance) {
// 距离在配送范围内判断金额是否符合起配金额额度
boolean moneyPassed = false;
if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) {
moneyPassed = orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) <= 0;
} else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) {
moneyPassed = orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) <= 0;
} else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) {
moneyPassed = orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) <= 0;
}
// 距离和金额都满足条件
if (moneyPassed) {
canDelivery = true;
break;
}
}
}
// 如果没有找到完全满足条件的规则再详细检查找出失败原因
if (!canDelivery) {
for (ShopStoreSameCityTransport transport : transportList) {
// 判断订单距离是否在配送范围内
if (transport.getMax_delivery_radius() < distance) {
// 记录距离不满足的原因
canNotDeliveryReason = storeName + "的订单不在配送范围内,订单无法配送。";
} else {
// 距离在配送范围内判断金额是否符合起配金额额度
if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) {
if (orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) > 0) {
BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderProductAmount);
canNotDeliveryReason = String.format("%s商品原价金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
} else {
canDelivery = true;
break;
}
} else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) {
if (orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) > 0) {
BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderDiscountAmount);
canNotDeliveryReason = String.format("%s订单折后金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
} else {
canDelivery = true;
break;
}
} else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) {
if (orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) > 0) {
BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderPayAmount);
canNotDeliveryReason = String.format("%s订单应支付金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
} else {
canDelivery = true;
break;
}
}
}
}
}
// 如果仍然不能配送记录日志并返回0
if (!canDelivery) {
logger.warn(canNotDeliveryReason.isEmpty() ? (storeName + "订单不在配送范围内或未达起送金额,请检查!") : canNotDeliveryReason);
return 0;
}
// 额外配送费计算
// 每增加一个距离累加运费
if (transportBase.getDistance_increase_km() != null && transportBase.getDistance_increase_fee() != null && distance > transportBase.getDistance_base() * 1000) {
// 实际配送距离超出基础距离单位km
BigDecimal diffDistanceM = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(distance - transportBase.getDistance_base() * 1000).divide(BigDecimal.valueOf(1000)));
// 倍数
BigDecimal times = BigDecimal.ZERO;
if (transportBase.getDistance_increase_km() > 0 && diffDistanceM.intValue() > transportBase.getDistance_increase_km()) {
// 末尾非零进位比如2.1将是3 2.0将是22.001将是3
times = NumberUtil.div(diffDistanceM, transportBase.getDistance_increase_km()).setScale(0, RoundingMode.UP);
}
// 超过基础运费距离后累加上运费
deliveryBaseFee = deliveryBaseFee.add(transportBase.getDistance_increase_fee().multiply(times));
}
// 每增加一个重量累加运费重量暂时忽略,配置的时候设置0
if (transportBase.getWeight_increase_kg() != null && transportBase.getWeight_increase_fee() != null && orderWeightGram != null && orderWeightGram > transportBase.getWeight_base() * 1000) {
// 实际配送重量超出基础重量单位kg
BigDecimal diffWeightKg = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(orderWeightGram - transportBase.getWeight_base() * 1000).divide(BigDecimal.valueOf(1000)));
// 倍数
BigDecimal times = BigDecimal.ZERO;
if (transportBase.getWeight_increase_kg() > 0 && diffWeightKg.intValue() > transportBase.getWeight_increase_kg()) {
// 末尾非零进位比如2.1将是3 2.0将是22.001将是3
times = NumberUtil.div(diffWeightKg, transportBase.getWeight_increase_kg()).setScale(0, RoundingMode.UP); // 修正应该除以weight_increase_kg而不是distance_increase_km
}
deliveryBaseFee = deliveryBaseFee.add(transportBase.getWeight_increase_fee().multiply(times));
}
// 返回单位为分的配送费
return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue();
// 参数校验
// if (storeId == null || orderLongitude == null || orderLatitude == null || storeId <= 0) {
// logger.warn("同城配送缺少必要参数,无法计算配送费。");
// return 0;
// }
//
// // 获取店铺基本信息
// ShopStoreBase storeBase = shopStoreBaseService.get(storeId);
// if (storeBase == null) {
// logger.warn("同城配送缺少店铺基本信息,无法计算配送费。");
// return 0;
// }
//
// String storeName = storeBase.getStore_name();
// String storeLng = storeBase.getStore_longitude();
// String storeLat = storeBase.getStore_latitude();
// if (StrUtil.isBlank(storeLng) || StrUtil.isBlank(storeLat)) {
// logger.warn("无法获取{}的具体位置,请联系商家。", storeName);
// return 0;
// }
//
// // 获取平台的基础运费设置记录
// ShopStoreSameCityTransportBase transportBase = getShopStoreSameCityTransportBaseById(Convert.toLong(storeId), CommonConstant.Enable);
// if (transportBase == null) {
// logger.warn("商家{}尚未完成同城配送设置,无法计算配送费。", storeName);
// return 0;
// }
//
// // 设置默认值
// if (transportBase.getDistance_base() == null) {
// transportBase.setDistance_base(0);
// }
// if (transportBase.getWeight_base() == null) {
// transportBase.setWeight_base(0);
// }
// if (transportBase.getDelivery_base_fee() == null) {
// transportBase.setDelivery_base_fee(BigDecimal.ZERO);
// }
//
// // 计算两点的距离(单位米)
// Double distanceD = PositionUtil.getDistance1(Convert.toDouble(storeLng), Convert.toDouble(storeLat), Convert.toDouble(orderLongitude), Convert.toDouble(orderLatitude));
// Integer distance = (distanceD != null) ? distanceD.intValue() : 0;
//
// // 基础配送费计算
// BigDecimal deliveryBaseFee = Convert.toBigDecimal(transportBase.getDelivery_base_fee(), BigDecimal.ZERO);
//
// // 获取运费配送范围信息
// List<ShopStoreSameCityTransport> transportList = shopStoreSameCityTransportService.selectShopStoreSameCityTransportList(Convert.toLong(storeId));
//
// if (CollUtil.isEmpty(transportList)) {
// // 没有配送范围规则的时候直接以基础配送费来配送
// return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue();
// }
//
// // 判断配送范围和起送金额条件
// String canNotDeliveryReason = "";
// boolean canDelivery = false;
//
// // 优先处理距离和金额都满足的规则
// for (ShopStoreSameCityTransport transport : transportList) {
// // 判断订单距离是否在配送范围内
// if (transport.getMax_delivery_radius() >= distance) {
// // 距离在配送范围内判断金额是否符合起配金额额度
// boolean moneyPassed = false;
// if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) {
// moneyPassed = orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) <= 0;
// } else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) {
// moneyPassed = orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) <= 0;
// } else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) {
// moneyPassed = orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) <= 0;
// }
//
// // 距离和金额都满足条件
// if (moneyPassed) {
// canDelivery = true;
// break;
// }
// }
// }
//
// // 如果没有找到完全满足条件的规则再详细检查找出失败原因
// if (!canDelivery) {
// for (ShopStoreSameCityTransport transport : transportList) {
// // 判断订单距离是否在配送范围内
// if (transport.getMax_delivery_radius() < distance) {
// // 记录距离不满足的原因
// canNotDeliveryReason = storeName + "的订单不在配送范围内,订单无法配送。";
// } else {
// // 距离在配送范围内判断金额是否符合起配金额额度
// if (CommonConstant.Delivery_Amount_Comput_Type_Original.equals(transport.getMin_delivery_amount_type())) {
// if (orderProductAmount != null && transport.getMin_delivery_amount().compareTo(orderProductAmount) > 0) {
// BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderProductAmount);
// canNotDeliveryReason = String.format("%s商品原价金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
// } else {
// canDelivery = true;
// break;
// }
// } else if (CommonConstant.Delivery_Amount_Comput_Type_Discounted.equals(transport.getMin_delivery_amount_type())) {
// if (orderDiscountAmount != null && transport.getMin_delivery_amount().compareTo(orderDiscountAmount) > 0) {
// BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderDiscountAmount);
// canNotDeliveryReason = String.format("%s订单折后金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
// } else {
// canDelivery = true;
// break;
// }
// } else if (CommonConstant.Delivery_Amount_Comput_Type_Payment.equals(transport.getMin_delivery_amount_type())) {
// if (orderPayAmount != null && transport.getMin_delivery_amount().compareTo(orderPayAmount) > 0) {
// BigDecimal diffMoney = transport.getMin_delivery_amount().subtract(orderPayAmount);
// canNotDeliveryReason = String.format("%s订单应支付金额还差%.2f元,才满足配送条件,请检查订单。", storeName, diffMoney);
// } else {
// canDelivery = true;
// break;
// }
// }
// }
// }
// }
//
// // 如果仍然不能配送记录日志并返回0
// if (!canDelivery) {
// logger.warn(canNotDeliveryReason.isEmpty() ? (storeName + "订单不在配送范围内或未达起送金额,请检查!") : canNotDeliveryReason);
// return 0;
// }
//
// // 额外配送费计算
// // 每增加一个距离累加运费
// if (transportBase.getDistance_increase_km() != null && transportBase.getDistance_increase_fee() != null && distance > transportBase.getDistance_base() * 1000) {
// // 实际配送距离超出基础距离单位km
// BigDecimal diffDistanceM = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(distance - transportBase.getDistance_base() * 1000).divide(BigDecimal.valueOf(1000)));
// // 倍数
// BigDecimal times = BigDecimal.ZERO;
// if (transportBase.getDistance_increase_km() > 0 && diffDistanceM.intValue() > transportBase.getDistance_increase_km()) {
// // 末尾非零进位比如2.1将是3 2.0将是22.001将是3
// times = NumberUtil.div(diffDistanceM, transportBase.getDistance_increase_km()).setScale(0, RoundingMode.UP);
// }
//
// // 超过基础运费距离后累加上运费
// deliveryBaseFee = deliveryBaseFee.add(transportBase.getDistance_increase_fee().multiply(times));
// }
//
// // 每增加一个重量累加运费重量暂时忽略,配置的时候设置0
// if (transportBase.getWeight_increase_kg() != null && transportBase.getWeight_increase_fee() != null && orderWeightGram != null && orderWeightGram > transportBase.getWeight_base() * 1000) {
// // 实际配送重量超出基础重量单位kg
// BigDecimal diffWeightKg = CommonUtil.DecimalRoundHalfUp(BigDecimal.valueOf(orderWeightGram - transportBase.getWeight_base() * 1000).divide(BigDecimal.valueOf(1000)));
// // 倍数
// BigDecimal times = BigDecimal.ZERO;
// if (transportBase.getWeight_increase_kg() > 0 && diffWeightKg.intValue() > transportBase.getWeight_increase_kg()) {
// // 末尾非零进位比如2.1将是3 2.0将是22.001将是3
// times = NumberUtil.div(diffWeightKg, transportBase.getWeight_increase_kg()).setScale(0, RoundingMode.UP);
// }
//
// deliveryBaseFee = deliveryBaseFee.add(transportBase.getWeight_increase_fee().multiply(times));
// }
//
// // 返回单位为分的配送费
// return deliveryBaseFee.multiply(BigDecimal.valueOf(100)).intValue();
}

View File

@ -10,6 +10,7 @@ package com.suisung.mall.shop.store.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.convert.Convert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.suisung.mall.common.api.CommonResult;
@ -45,13 +46,16 @@ public class ShopStoreSameCityTransportServiceImpl extends BaseServiceImpl<ShopS
public CommonResult deleteShopStoreSameCityTransport(Long transportId) {
// 判断有没有权限
UserDto user = getCurrentUser();
if (user == null || !user.isStore()) {
if (user == null || !user.isStore() || !user.isPlatform()) {
return CommonResult.failed("无权限操作!");
}
Long storeId = Convert.toLong(user.getStore_id());
Long storeId = 0L;
if (user.isPlatform()) {
storeId = Convert.toLong(user.getStore_id());
}
if (transportId == null || transportId <= 0 || storeId == null || storeId <= 0) {
if (transportId == null || transportId <= 0) {
return CommonResult.failed("缺少必要参数");
}
@ -208,14 +212,16 @@ public class ShopStoreSameCityTransportServiceImpl extends BaseServiceImpl<ShopS
*/
@Override
public Boolean deleteShopStoreSameCityTransport(Long transportId, Long storeId) {
if (transportId == null || transportId == null || transportId <= 0 || storeId == null || storeId <= 0) {
logger.error("缺少 transportId 或 storeId 必要参数!");
if (transportId == null || transportId == null || transportId <= 0) {
logger.error("缺少 transportId 必要参数!");
return false;
}
QueryWrapper<ShopStoreSameCityTransport> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("transport_id", transportId);
queryWrapper.eq("store_id", storeId);
LambdaQueryWrapper<ShopStoreSameCityTransport> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShopStoreSameCityTransport::getTransport_id, transportId);
if (storeId != null && storeId > 0) {
queryWrapper.eq(ShopStoreSameCityTransport::getStore_id, storeId);
}
ShopStoreSameCityTransport record = getOne(queryWrapper);
if (record == null) {