mirror of
https://gitee.com/ZhongBangKeJi/crmeb_java.git
synced 2026-04-23 03:58:35 +08:00
优化运费计算逻辑
This commit is contained in:
@@ -59,7 +59,7 @@ public class ShippingTemplatesRegion implements Serializable {
|
|||||||
@ApiModelProperty(value = "续件运费")
|
@ApiModelProperty(value = "续件运费")
|
||||||
private BigDecimal renewalPrice;
|
private BigDecimal renewalPrice;
|
||||||
|
|
||||||
@ApiModelProperty(value = "计费方式")
|
@ApiModelProperty(value = "计费方式 1按件数 2按重量 3按体积")
|
||||||
private Integer type;
|
private Integer type;
|
||||||
|
|
||||||
@ApiModelProperty(value = "分组唯一值")
|
@ApiModelProperty(value = "分组唯一值")
|
||||||
|
|||||||
@@ -16,6 +16,13 @@ public interface ShippingTemplatesFreeService extends IService<ShippingTemplates
|
|||||||
|
|
||||||
List<ShippingTemplatesFree> getList(PageParamRequest pageParamRequest);
|
List<ShippingTemplatesFree> getList(PageParamRequest pageParamRequest);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据模版id查询包邮信息
|
||||||
|
* @param tempIds 模版id
|
||||||
|
* @return 包邮信息集合
|
||||||
|
*/
|
||||||
|
List<ShippingTemplatesFree> getListByTempIds(List<Integer> tempIds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据条件查询
|
* 根据条件查询
|
||||||
* @param templatesFree 模版参数
|
* @param templatesFree 模版参数
|
||||||
|
|||||||
@@ -51,6 +51,18 @@ public class ShippingTemplatesFreeServiceImpl extends ServiceImpl<ShippingTempla
|
|||||||
return dao.selectList(null);
|
return dao.selectList(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据模版id查询包邮信息
|
||||||
|
* @param tempIds 模版id
|
||||||
|
* @return 包邮信息集合
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<ShippingTemplatesFree> getListByTempIds(List<Integer> tempIds) {
|
||||||
|
LambdaQueryWrapper<ShippingTemplatesFree> lqw = new LambdaQueryWrapper<>();
|
||||||
|
lqw.in(ShippingTemplatesFree::getTempId, tempIds);
|
||||||
|
return dao.selectList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据模版参数查询 H5 计算订单价格使用
|
* 根据模版参数查询 H5 计算订单价格使用
|
||||||
* @param templatesFree 模版参数
|
* @param templatesFree 模版参数
|
||||||
|
|||||||
@@ -17,7 +17,9 @@ import org.springframework.scheduling.annotation.Async;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -49,6 +51,14 @@ public class ShippingTemplatesRegionServiceImpl extends ServiceImpl<ShippingTemp
|
|||||||
return dao.selectList(null);
|
return dao.selectList(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ShippingTemplatesRegion> listByIds(Collection<? extends Serializable> idList) {
|
||||||
|
LambdaQueryWrapper<ShippingTemplatesRegion> lqw = new LambdaQueryWrapper<>();
|
||||||
|
lqw.in(ShippingTemplatesRegion::getTempId, idList);
|
||||||
|
lqw.orderByAsc(ShippingTemplatesRegion::getCityId);
|
||||||
|
return dao.selectList(lqw);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据id集合和城市id获取
|
* 根据id集合和城市id获取
|
||||||
* @param ids id集合
|
* @param ids id集合
|
||||||
|
|||||||
@@ -660,6 +660,7 @@ public class OrderUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算价格集合
|
* 计算价格集合
|
||||||
|
* 计算逻辑说明,先从最小的逻辑找,1:是否指定包邮,2:按照区域计算邮费,3:默认缺省模版中的计算方式
|
||||||
* @param storeCartResponse 购物车参数
|
* @param storeCartResponse 购物车参数
|
||||||
* @param userAddress 用户收货地址
|
* @param userAddress 用户收货地址
|
||||||
* @return 计算后的价格集合
|
* @return 计算后的价格集合
|
||||||
@@ -672,13 +673,14 @@ public class OrderUtils {
|
|||||||
costPrice = BigDecimal.ZERO, // 订单成本价
|
costPrice = BigDecimal.ZERO, // 订单成本价
|
||||||
vipPrice = BigDecimal.ZERO; // 订单会员优惠价
|
vipPrice = BigDecimal.ZERO; // 订单会员优惠价
|
||||||
|
|
||||||
String storeFreePostageString = systemConfigService.getValueByKey("store_free_postage");
|
|
||||||
for (StoreCartResponse cartResponse : storeCartResponse) {
|
for (StoreCartResponse cartResponse : storeCartResponse) {
|
||||||
totalPrice = totalPrice.add(cartResponse.getTruePrice().multiply(BigDecimal.valueOf(cartResponse.getCartNum())));
|
totalPrice = (totalPrice.add(cartResponse.getTruePrice().multiply(BigDecimal.valueOf(cartResponse.getCartNum()))));
|
||||||
costPrice = costPrice.add(cartResponse.getCostPrice().multiply(BigDecimal.valueOf(cartResponse.getCartNum())));
|
costPrice = (costPrice.add(cartResponse.getCostPrice().multiply(BigDecimal.valueOf(cartResponse.getCartNum()))));
|
||||||
vipPrice = vipPrice.add(cartResponse.getVipTruePrice().multiply(BigDecimal.valueOf(cartResponse.getCartNum())));
|
vipPrice = (vipPrice.add(cartResponse.getVipTruePrice().multiply(BigDecimal.valueOf(cartResponse.getCartNum()))));
|
||||||
}
|
}
|
||||||
if(storeFreePostageString.equals("0")){ // 包邮
|
// 判断是否满额包邮 type=1按件数 2按重量 3按体积
|
||||||
|
Integer storeFreePostageString = Integer.valueOf(systemConfigService.getValueByKey("store_free_postage"));
|
||||||
|
if(storeFreePostageString <= 0){ // 包邮
|
||||||
storeFreePostage = BigDecimal.ZERO;
|
storeFreePostage = BigDecimal.ZERO;
|
||||||
}else{
|
}else{
|
||||||
if(null != userAddress && userAddress.getCityId() > 0){
|
if(null != userAddress && userAddress.getCityId() > 0){
|
||||||
@@ -686,104 +688,40 @@ public class OrderUtils {
|
|||||||
List<StoreProductCartProductInfoResponse> spcpInfo =
|
List<StoreProductCartProductInfoResponse> spcpInfo =
|
||||||
storeCartResponse.stream().map(StoreCartResponse::getProductInfo).distinct().collect(Collectors.toList());
|
storeCartResponse.stream().map(StoreCartResponse::getProductInfo).distinct().collect(Collectors.toList());
|
||||||
List<Integer> tempIds = spcpInfo.stream().map(StoreProductCartProductInfoResponse::getTempId).distinct().collect(Collectors.toList());
|
List<Integer> tempIds = spcpInfo.stream().map(StoreProductCartProductInfoResponse::getTempId).distinct().collect(Collectors.toList());
|
||||||
|
// 查询运费模版
|
||||||
List<ShippingTemplates> shippingTemplates = shippingTemplatesService.getListInIds(tempIds);
|
List<ShippingTemplates> shippingTemplates = shippingTemplatesService.getListInIds(tempIds);
|
||||||
List<ShippingTemplatesRegion> shippingTemplateRegions = shippingTemplatesRegionService.getListInIdsAndCityId(tempIds, cityId);
|
|
||||||
List<Integer> shippingTemplateRids = shippingTemplateRegions.stream().map(ShippingTemplatesRegion::getTempId).distinct().collect(Collectors.toList());
|
|
||||||
|
|
||||||
// LinkedHashMap<Integer,HashMap<String,Object>> templateNumMap = new LinkedHashMap<>();
|
// 包邮
|
||||||
List<PriceGroup> priceGroups = new ArrayList<>();
|
List<ShippingTemplatesFree> shippingTempFree = shippingTemplatesFreeService.getListByTempIds(tempIds);
|
||||||
PriceGroup priceGroup = new PriceGroup();
|
|
||||||
for (StoreCartResponse cartResponse : storeCartResponse) {
|
|
||||||
Integer tempId = cartResponse.getProductInfo().getTempId() > 0 ? cartResponse.getProductInfo().getTempId() : 0;
|
|
||||||
List<ShippingTemplates> findHas = shippingTemplates.stream().filter(e -> e.getId() == tempId).distinct().collect(Collectors.toList());
|
|
||||||
Integer type = findHas.size() > 0 ? findHas.get(0).getType() : shippingTemplates.get(0).getType();
|
|
||||||
BigDecimal num;
|
|
||||||
|
|
||||||
switch (type){
|
// 指定区域包邮费用
|
||||||
case 1:
|
List<ShippingTemplatesRegion> shippingTemplateRegions = shippingTemplatesRegionService.listByIds(tempIds);
|
||||||
num = BigDecimal.valueOf(cartResponse.getCartNum());
|
BigDecimal postPrice = BigDecimal.ZERO;
|
||||||
break;
|
if(!shippingTemplates.get(0).getAppoint() && shippingTemplateRegions.size() > 0){
|
||||||
case 2:
|
postPrice = shippingTemplateRegions.get(0).getFirstPrice();
|
||||||
num = cartResponse.getProductInfo().getAttrInfo().getWeight().multiply(BigDecimal.valueOf(cartResponse.getCartNum()));
|
}else if(shippingTemplates.get(0).getAppoint()){ // 正常配送和运费
|
||||||
break;
|
//todo 首重等计算
|
||||||
default:
|
List<ShippingTemplatesRegion> shippingTemplateRegionsHasCity = shippingTemplatesRegionService.getListInIdsAndCityId(tempIds, cityId);
|
||||||
num = cartResponse.getProductInfo().getAttrInfo().getVolume().multiply(BigDecimal.valueOf(cartResponse.getCartNum()));
|
postPrice = shippingTemplateRegionsHasCity.size() > 0 ?
|
||||||
break;
|
shippingTemplateRegionsHasCity.get(0).getFirstPrice() : shippingTemplateRegions.get(0).getFirstPrice();
|
||||||
}
|
}else{
|
||||||
List<ShippingTemplatesRegion> hasTempRegions = shippingTemplateRegions.stream().filter(e -> e.getTempId() == tempId).distinct().collect(Collectors.toList());
|
postPrice = shippingTempFree.get(0).getPrice();
|
||||||
ShippingTemplatesRegion region = hasTempRegions.size() > 0 ? hasTempRegions.get(0) : shippingTemplateRegions.get(0);
|
|
||||||
Integer tempTempId = cartResponse.getProductInfo().getTempId();
|
|
||||||
|
|
||||||
if(priceGroups.size() == 0){
|
|
||||||
PriceItem priceItem = new PriceItem(
|
|
||||||
num,cartResponse.getTruePrice().multiply(BigDecimal.valueOf(cartResponse.getCartNum())),
|
|
||||||
region.getFirst(),region.getFirstPrice(),region.getRenewal(),region.getRenewalPrice(),
|
|
||||||
cartResponse.getProductInfo().getTempId(),userAddress.getCityId()
|
|
||||||
);
|
|
||||||
priceGroup.setTempId(tempTempId);
|
|
||||||
priceGroup.setPriceItem(priceItem);
|
|
||||||
}else{
|
|
||||||
BigDecimal priceValue = cartResponse.getTruePrice().multiply(BigDecimal.valueOf(cartResponse.getCartNum()));
|
|
||||||
|
|
||||||
priceGroup.getPriceItem().setNum(priceGroup.getPriceItem().getNum().add(BigDecimal.valueOf(cartResponse.getCartNum())));
|
|
||||||
priceGroup.getPriceItem().setPrice(priceGroup.getPriceItem().getPrice().add(priceValue));
|
|
||||||
}
|
|
||||||
priceGroups.add(priceGroup);
|
|
||||||
}
|
|
||||||
// 首重排序
|
|
||||||
priceGroups.sort((p1, p2) -> p1.getPriceItem().getPrice().compareTo(p2.getPriceItem().getFirst()));
|
|
||||||
|
|
||||||
Integer type = 0;
|
|
||||||
storePostage = BigDecimal.ZERO;
|
|
||||||
for (int i = 0; i < priceGroups.size(); i++) {
|
|
||||||
PriceGroup priceg = priceGroups.get(i);
|
|
||||||
ShippingTemplatesFree shippingTemplatesFree = new ShippingTemplatesFree();
|
|
||||||
shippingTemplatesFree.setTempId(priceg.getTempId());
|
|
||||||
shippingTemplatesFree.setCityId(priceg.getPriceItem().getCityId());
|
|
||||||
shippingTemplatesFree.setNumber(priceg.getPriceItem().getNum().intValue());
|
|
||||||
shippingTemplatesFree.setPrice(priceg.getPriceItem().getPrice());
|
|
||||||
List<ShippingTemplatesFree> listByConditionForCalcOrderPrice = shippingTemplatesFreeService.getListByConditionForCalcOrderPrice(shippingTemplatesFree);
|
|
||||||
if(listByConditionForCalcOrderPrice.size() == 0) priceGroups.remove(i);
|
|
||||||
}
|
|
||||||
for (PriceGroup priceg : priceGroups) {
|
|
||||||
if(type == 0){
|
|
||||||
BigDecimal number = priceg.getPriceItem().getNum();
|
|
||||||
BigDecimal first = priceg.getPriceItem().getFirst();
|
|
||||||
BigDecimal firstPrice = priceg.getPriceItem().getFirstPrice();
|
|
||||||
if(first.compareTo(number) >= 1){
|
|
||||||
storePostage.add(firstPrice);
|
|
||||||
}else{
|
|
||||||
BigDecimal renewal = priceg.getPriceItem().getRenewal();
|
|
||||||
if(renewal.compareTo(BigDecimal.ZERO) > 0){
|
|
||||||
BigDecimal fistPrice = priceg.getPriceItem().getNum().subtract(priceg.getPriceItem().getFirst());
|
|
||||||
Integer renwal = priceg.getPriceItem().getRenewal().compareTo(BigDecimal.ZERO) > -1 ? 0:2;
|
|
||||||
BigDecimal divPrice = BigDecimal.valueOf(renwal).divide(fistPrice);
|
|
||||||
BigDecimal mulPrice = divPrice.multiply(priceg.getPriceItem().getRenewalPrice());
|
|
||||||
BigDecimal addPrice = storePostage.add(priceg.getPriceItem().getFirstPrice());
|
|
||||||
storePostage = mulPrice.add(addPrice);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
type = 1;
|
|
||||||
}else{
|
|
||||||
if(priceg.getPriceItem().getRenewal().compareTo(BigDecimal.ZERO) > 0){
|
|
||||||
Integer renwal = priceg.getPriceItem().getRenewal().compareTo(BigDecimal.ZERO) > -1 ? 0:2;
|
|
||||||
BigDecimal divPrice = priceg.getPriceItem().getNum().divide(BigDecimal.valueOf(renwal));
|
|
||||||
BigDecimal mulPrice = divPrice.multiply(BigDecimal.valueOf(2));
|
|
||||||
storePostage = storePostage.add(mulPrice);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
storePostage = postPrice;
|
||||||
}else{
|
}else{
|
||||||
storePostage = BigDecimal.ZERO;
|
storePostage = BigDecimal.ZERO;
|
||||||
}
|
}
|
||||||
if(storeFreePostage.compareTo(totalPrice) <= -1) storePostage = BigDecimal.ZERO;
|
// 判断价格是否超出满额包邮价格
|
||||||
|
// if(storeFreePostage.compareTo(totalPrice) <= -1) storePostage = BigDecimal.ZERO;
|
||||||
}
|
}
|
||||||
|
// storePostage = BigDecimal.TEN;
|
||||||
|
// storeFreePostage = BigDecimal.ONE;
|
||||||
priceGroupResponse.setStorePostage(storePostage);
|
priceGroupResponse.setStorePostage(storePostage);
|
||||||
priceGroupResponse.setStoreFreePostage(storeFreePostage);
|
priceGroupResponse.setStoreFreePostage(storeFreePostage);
|
||||||
priceGroupResponse.setTotalPrice(totalPrice);
|
priceGroupResponse.setTotalPrice(totalPrice);
|
||||||
priceGroupResponse.setCostPrice(costPrice);
|
priceGroupResponse.setCostPrice(costPrice);
|
||||||
priceGroupResponse.setVipPrice(vipPrice);
|
priceGroupResponse.setVipPrice(vipPrice);
|
||||||
priceGroupResponse.setPayPrice(storeFreePostage.add(totalPrice));
|
priceGroupResponse.setPayPrice(storePostage.add(totalPrice));
|
||||||
return priceGroupResponse;
|
return priceGroupResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user