Commit 8112b0f1 by 周晓航

Merge branch 'feature_夜间配送ID1040499_zxh20211208' into qa

parents 0746b403 9bbd1877
package cn.freemud.entities;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/8 下午5:08
* @description :
*/
@Data
public class ExtraDeliveryDto {
/**
* 原有配送费类型
*/
public static int TYPE_DEFAULT = -1;
/**
* 晚间时段 附加配送费类型
*/
public static int TYPE_EXTRA_NIGHT = 1;
/**
* 早间时段 附加配送费类型
*/
public static int TYPE_EXTRA_MORNING = 0;
/**
* 费用类型
*/
private int type;
/**
* 费用
*/
private Long deliveryAmount;
private ExtraDeliveryDto() {
}
public ExtraDeliveryDto(int type, Long deliveryAmount) {
this.type = type;
this.deliveryAmount = deliveryAmount;
}
}
...@@ -71,4 +71,17 @@ public class DeliveryInfoDTO { ...@@ -71,4 +71,17 @@ public class DeliveryInfoDTO {
*/ */
private Integer scopeConfig; private Integer scopeConfig;
/**
* 门店计算好的 最终配送费价格, 包含阶梯算价之后 (单位分)
*/
private Integer finalDeliveryAmount;
/**
* 额外拓展属性 json
* @see cn.freemud.entities.dto.console.DeliveryInfoExpandFieldDTO
*/
private String expandFields;
} }
package cn.freemud.entities.dto.console;
import lombok.Data;
import java.util.List;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/10 上午11:04
* @description :
*/
@Data
public class DeliveryInfoExpandFieldDTO {
/**
* 夜间 早间 额外配送费配置
*/
private List<NightDeliveryuInfo> nightDeliveryInfo;
}
package cn.freemud.entities.dto.console;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/10 上午11:05
* @description :
*/
@Data
public class NightDeliveryuInfo {
public static int COMMON_STATUS_CLOSE = 0;
public static int COMMON_STATUS_OPEN = 1;
/**
* 类型 0早间 1晚间
*/
private int type;
/**
* 开始时间
*/
private String startTime;
/**
* 结束时间
*/
private String endTime;
/**
* 是否开启 1开启 0关闭
*/
private int status;
/**
* 加的价格
*/
private Long price;
}
package cn.freemud.entities.vo;
import cn.freemud.entities.ExtraDeliveryDto;
import lombok.Data;
import java.util.List;
import java.util.Objects;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/8 下午5:03
* @description :
*/
@Data
public class DeliveryDto {
/**
* 总配送费
*/
public Long deliveryAmount;
/**
* 配送费为零的原因:0:正常,1:超出配送范围
*/
public Integer deliveryFeeZeroReason;
/**
* 附加配送费详细数据 上面的金额 已经加上 这里的金额了
*/
public List<ExtraDeliveryDto> deliveryAmountList;
private DeliveryDto() {
}
public DeliveryDto(Long deliveryAmount, Integer deliveryFeeZeroReason, List<ExtraDeliveryDto> deliveryAmountList) {
this.deliveryAmount = deliveryAmount;
this.deliveryFeeZeroReason = deliveryFeeZeroReason;
Objects.requireNonNull(deliveryAmountList);
this.deliveryAmountList = deliveryAmountList;
}
}
...@@ -12,16 +12,22 @@ ...@@ -12,16 +12,22 @@
*/ */
package cn.freemud.entities.vo; package cn.freemud.entities.vo;
import cn.freemud.entities.ExtraDeliveryDto;
import cn.freemud.entities.dto.calculate.Discount; import cn.freemud.entities.dto.calculate.Discount;
import cn.freemud.entities.dto.calculate.Goods; import cn.freemud.entities.dto.calculate.Goods;
import com.freemud.sdk.api.assortment.shoppingcart.domain.CartGoodsStates; import com.freemud.sdk.api.assortment.shoppingcart.domain.CartGoodsStates;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Data @Data
public class ShoppingCartGoodsResponseVo extends ShoppingCartGoodsBaseResponseVo{ public class ShoppingCartGoodsResponseVo extends ShoppingCartGoodsBaseResponseVo{
/**
* 配送费的清单 包含 普通配送费 额外夜间配送费 额外白天配送费 下面的 deliveryAmount 是总的配送费
*/
List<ExtraDeliveryDto> deliveryAmountList = new ArrayList<>();
/** /**
* 商品额外的属性 * 商品额外的属性
......
...@@ -13,12 +13,28 @@ ...@@ -13,12 +13,28 @@
package cn.freemud.service.delivery; package cn.freemud.service.delivery;
import cn.freemud.base.util.DateUtil;
import cn.freemud.entities.ExtraDeliveryDto;
import cn.freemud.entities.dto.console.DeliveryInfoExpandFieldDTO;
import cn.freemud.entities.dto.console.NightDeliveryuInfo;
import cn.freemud.entities.vo.ShoppingCartGoodsResponseVo; import cn.freemud.entities.vo.ShoppingCartGoodsResponseVo;
import cn.freemud.utils.DateTimeUtil;
import com.alibaba.fastjson.JSON;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
public interface DeliveryService { public interface DeliveryService {
/** /**
* 计算运费 * 计算运费
*
* @param receiveId * @param receiveId
* @param partnerId * @param partnerId
* @param storeId * @param storeId
...@@ -28,4 +44,45 @@ public interface DeliveryService { ...@@ -28,4 +44,45 @@ public interface DeliveryService {
Long calculateDeliveryAmount(String receiveId, String partnerId, String storeId, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo); Long calculateDeliveryAmount(String receiveId, String partnerId, String storeId, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo);
Long calculateDeliveryAmount(String receiveId, String partnerId, String storeId); Long calculateDeliveryAmount(String receiveId, String partnerId, String storeId);
/**
* 处理 额外配送费逻辑
*
* @param amount 原始配送费价格
* @param expandFields 门店反馈的额外配送费配置
*/
default List<ExtraDeliveryDto> nightDeliveryAmountHandle(long amount, String expandFields) {
List<ExtraDeliveryDto> list = new ArrayList<>();
if (amount > 0) {
ExtraDeliveryDto defaultAmount = new ExtraDeliveryDto(ExtraDeliveryDto.TYPE_DEFAULT, amount);
list.add(defaultAmount);
}
if (StringUtils.isNotBlank(expandFields)) {
DeliveryInfoExpandFieldDTO expandField = JSON.parseObject(expandFields, DeliveryInfoExpandFieldDTO.class);
if (Objects.nonNull(expandField) && CollectionUtils.isNotEmpty(expandField.getNightDeliveryInfo())) {
for (NightDeliveryuInfo info : expandField.getNightDeliveryInfo()) {
if (info.getStatus() == NightDeliveryuInfo.COMMON_STATUS_OPEN) {
// 当前时间在区间内
try {
Date nowTime = new SimpleDateFormat(DateUtil.FORMAT_time).parse(DateTimeUtil.getCurrentTimeStr());
Date startTime = new SimpleDateFormat(DateUtil.FORMAT_time).parse(info.getStartTime());
Date endTime = new SimpleDateFormat(DateUtil.FORMAT_time).parse(info.getEndTime());
if (DateTimeUtil.isEffectiveDate(nowTime, startTime, endTime)) {
ExtraDeliveryDto extraDeliveryDto = new ExtraDeliveryDto(info.getType(), amount);
list.add(extraDeliveryDto);
// 金额 增加
amount += info.getPrice();
}
} catch (ParseException e) {
// 报错表示 时间格式设置错误, 默认当做不计算
e.printStackTrace();
}
}
}
}
}
return list;
}
} }
...@@ -13,24 +13,21 @@ ...@@ -13,24 +13,21 @@
package cn.freemud.service.delivery.impl; package cn.freemud.service.delivery.impl;
import cn.freemud.entities.ExtraDeliveryDto;
import cn.freemud.entities.dto.console.*;
import cn.freemud.entities.vo.ShoppingCartGoodsResponseVo; import cn.freemud.entities.vo.ShoppingCartGoodsResponseVo;
import cn.freemud.enums.CreateOrderType;
import cn.freemud.enums.ResponseResult; import cn.freemud.enums.ResponseResult;
import cn.freemud.interceptor.ServiceException; import cn.freemud.interceptor.ServiceException;
import cn.freemud.service.delivery.DeliveryService; import cn.freemud.service.delivery.DeliveryService;
import cn.freemud.utils.ResponseUtil; import cn.freemud.service.thirdparty.ConsoleApiClient;
import com.freemud.application.sdk.api.log.LogThreadLocal; import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.membercenter.request.QueryReceiveAddressRequest;
import com.freemud.application.sdk.api.membercenter.response.QueryReceiveAddressResponse;
import com.freemud.application.sdk.api.storecenter.request.QueryDeliveryRequest;
import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest; import com.freemud.application.sdk.api.storecenter.request.StoreInfoRequest;
import com.freemud.application.sdk.api.storecenter.response.QueryDeliverDetailResponse;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse; import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.application.sdk.api.storecenter.service.StoreCenterService; import com.freemud.application.sdk.api.storecenter.service.StoreCenterService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Objects; import java.util.Objects;
@Service("fixDeliveryService") @Service("fixDeliveryService")
...@@ -39,20 +36,28 @@ public class FixDeliveryServiceImpl extends AbstractDeliveryServiceImpl implemen ...@@ -39,20 +36,28 @@ public class FixDeliveryServiceImpl extends AbstractDeliveryServiceImpl implemen
@Autowired @Autowired
private StoreCenterService storeCenterService; private StoreCenterService storeCenterService;
@Autowired
private ConsoleApiClient consoleApiClient;
@Override @Override
public Long calculateDeliveryAmount(String receiveId, String partnerId, String storeId, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo) { public Long calculateDeliveryAmount(String receiveId, String partnerId, String storeId, ShoppingCartGoodsResponseVo shoppingCartGoodsResponseVo) {
String trackingNo = LogThreadLocal.getTrackingNo();
// 获取门店信息,查询基础配送费用 // 获取门店信息,查询基础配送费用 移除sdk使用, 使用feign
StoreInfoRequest storeInfoRequest = new StoreInfoRequest(partnerId, storeId,null); GetStoreMixRequest query = GetStoreMixRequest.builder()
StoreResponse storeResponse = storeCenterService.getStoreInfo(storeInfoRequest, trackingNo); .partnerId(partnerId)
if (storeResponse == null || storeResponse.getBizVO() == null) { .storeCode(storeId)
throw new ServiceException (ResponseResult.STORE_NOT_FOUND); .query(QueryFlag.builder().queryDeliveryInfo(true).build())
.build();
ConsoleResponseDTO<BizDTO> responseDto = consoleApiClient.getStoreMix(query);
DeliveryInfoDTO deliveryInfo = responseDto.getBizVO().getDeliveryInfo();
// fisherman 处理 额外配送费
long amount = Objects.isNull(deliveryInfo.getFinalDeliveryAmount()) ? 0L : deliveryInfo.getFinalDeliveryAmount();
List<ExtraDeliveryDto> deliveryAmountList = super.nightDeliveryAmountHandle(amount, deliveryInfo.getExpandFields());
if (Objects.nonNull(shoppingCartGoodsResponseVo)) {
shoppingCartGoodsResponseVo.setDeliveryFeeZeroReason(0);
shoppingCartGoodsResponseVo.setDeliveryAmountList(deliveryAmountList);
} }
return amount;
shoppingCartGoodsResponseVo.setDeliveryFeeZeroReason(0);
return new Double(storeResponse.getBizVO().getDeliveryPrice() * 100).longValue();
} }
@Override @Override
......
...@@ -13,7 +13,9 @@ ...@@ -13,7 +13,9 @@
package cn.freemud.service.delivery.impl; package cn.freemud.service.delivery.impl;
import cn.freemud.entities.ExtraDeliveryDto;
import cn.freemud.entities.dto.console.*; import cn.freemud.entities.dto.console.*;
import cn.freemud.entities.vo.DeliveryDto;
import cn.freemud.entities.vo.QueryDeliveryDistanceRequest; import cn.freemud.entities.vo.QueryDeliveryDistanceRequest;
import cn.freemud.entities.vo.QueryDeliveryDistanceResponseVo; import cn.freemud.entities.vo.QueryDeliveryDistanceResponseVo;
import cn.freemud.entities.vo.ShoppingCartGoodsResponseVo; import cn.freemud.entities.vo.ShoppingCartGoodsResponseVo;
...@@ -32,6 +34,9 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -32,6 +34,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Service("gradDeliveryService") @Service("gradDeliveryService")
public class GradDeliveryServiceImpl extends AbstractDeliveryServiceImpl implements DeliveryService { public class GradDeliveryServiceImpl extends AbstractDeliveryServiceImpl implements DeliveryService {
...@@ -57,8 +62,13 @@ public class GradDeliveryServiceImpl extends AbstractDeliveryServiceImpl impleme ...@@ -57,8 +62,13 @@ public class GradDeliveryServiceImpl extends AbstractDeliveryServiceImpl impleme
queryReceiveAddressResponse.getData().getLongitude(), queryReceiveAddressResponse.getData().getLongitude(),
partnerId, partnerId,
storeId); storeId);
if (null != shoppingCartGoodsResponseVo) shoppingCartGoodsResponseVo.setDeliveryFeeZeroReason(deliveryDataMsg.deliveryFeeZeroReason); if (Objects.nonNull(shoppingCartGoodsResponseVo)) {
return deliveryDataMsg.deliveryAmount; shoppingCartGoodsResponseVo.setDeliveryFeeZeroReason(deliveryDataMsg.getDeliveryFeeZeroReason());
List<ExtraDeliveryDto> deliveryAmountList = deliveryDataMsg.getDeliveryAmountList();
shoppingCartGoodsResponseVo.setDeliveryAmountList(deliveryAmountList);
}
return deliveryDataMsg.getDeliveryAmount();
} }
@Override @Override
...@@ -67,21 +77,6 @@ public class GradDeliveryServiceImpl extends AbstractDeliveryServiceImpl impleme ...@@ -67,21 +77,6 @@ public class GradDeliveryServiceImpl extends AbstractDeliveryServiceImpl impleme
} }
class DeliveryDto {
/**
* 配送费
*/
Long deliveryAmount;
/**
* 配送费为零的原因:0:正常,1:超出配送范围
*/
Integer deliveryFeeZeroReason;
DeliveryDto(Long amount, Integer reason) {
deliveryAmount = amount;
deliveryFeeZeroReason = reason;
}
}
/** /**
* 获取 配送费 及预计送达时间接口 * 获取 配送费 及预计送达时间接口
* @param userLat 用户纬度 * @param userLat 用户纬度
...@@ -121,9 +116,12 @@ public class GradDeliveryServiceImpl extends AbstractDeliveryServiceImpl impleme ...@@ -121,9 +116,12 @@ public class GradDeliveryServiceImpl extends AbstractDeliveryServiceImpl impleme
} }
Long amount = calcDeliveryAmount(storeInfo, deliveryInfo, userLong, userLat); Long amount = calcDeliveryAmount(storeInfo, deliveryInfo, userLong, userLat);
if (amount < 0) { if (amount < 0) {
return new DeliveryDto(0L, 1); return new DeliveryDto(0L, 1, new ArrayList<>());
} else { } else {
return new DeliveryDto(amount, 0); // 标准配送费
// fisherman 处理 额外配送费
List<ExtraDeliveryDto> list = super.nightDeliveryAmountHandle(amount, deliveryInfo.getExpandFields());
return new DeliveryDto(amount, 0, list);
} }
} }
...@@ -205,7 +203,7 @@ public class GradDeliveryServiceImpl extends AbstractDeliveryServiceImpl impleme ...@@ -205,7 +203,7 @@ public class GradDeliveryServiceImpl extends AbstractDeliveryServiceImpl impleme
if (new BigDecimal(riderDistance).compareTo(new BigDecimal(defaultDeliveryRange)) <= 0) { if (new BigDecimal(riderDistance).compareTo(new BigDecimal(defaultDeliveryRange)) <= 0) {
return deliveryAmount; return deliveryAmount;
} else { } else {
//计算实际配送费 //计算实际配送费 (总距离-基础配送距离)/每公里增加基数*每公里配送加钱 + 基础配送费
BigDecimal extraAmount = (new BigDecimal(riderDistance).subtract(new BigDecimal(defaultDeliveryRange))) BigDecimal extraAmount = (new BigDecimal(riderDistance).subtract(new BigDecimal(defaultDeliveryRange)))
.divide(new BigDecimal(addRangeCount), 0, BigDecimal.ROUND_UP) .divide(new BigDecimal(addRangeCount), 0, BigDecimal.ROUND_UP)
.multiply(new BigDecimal(addRangeAmount)); .multiply(new BigDecimal(addRangeAmount));
......
...@@ -6,6 +6,7 @@ import java.time.format.DateTimeParseException; ...@@ -6,6 +6,7 @@ import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal; import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjusters; import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
/** /**
...@@ -281,4 +282,32 @@ public class DateTimeUtil { ...@@ -281,4 +282,32 @@ public class DateTimeUtil {
return getCurrentLocalDate().plus(2, ChronoUnit.DECADES).format(DATE_FORMATTER); return getCurrentLocalDate().plus(2, ChronoUnit.DECADES).format(DATE_FORMATTER);
} }
/**
* 是否在这个时间范围内
* @param nowTime
* @param startTime
* @param endTime
* @return
*/
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (nowTime.getTime() == startTime.getTime()
|| nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment