Commit 79409307 by 周晓航

Merge branch 'feature-ka半自动派单ID1040800-20211222-zxh'

# Conflicts:
#	order-management/src/main/java/cn/freemud/management/service/impl/SaasOrderMangerServiceImpl.java
parents 9a41a82f c7a34af5
......@@ -27,6 +27,7 @@ import com.freemud.application.sdk.api.util.DateUtil;
import com.freemud.sdk.api.assortment.order.constant.CommonConstant;
import com.freemud.sdk.api.assortment.order.domain.OrderStatesVO;
import com.freemud.sdk.api.assortment.order.domain.ResponseCodeConstant;
import com.freemud.sdk.api.assortment.order.entities.other.OtherParamDTO;
import com.freemud.sdk.api.assortment.order.entities.promption.ActivityUpdateStockRequest;
import com.freemud.sdk.api.assortment.order.entities.promption.SubtractStockVO;
import com.freemud.sdk.api.assortment.order.enums.*;
......@@ -64,12 +65,12 @@ public class OrderSdkAdapter {
/**
* 接单request
*
* @param operator
* @param orderBean
* @param dispatchType 派单模式(0-系统自动派单;1-手动派单) null表示方法重载使用,无需关注该参数
* @return
*/
public BaseQueryOrderRequest getOrderConfirmRequest(String operator, OrderBeanV1 orderBean) {
public BaseQueryOrderRequest getOrderConfirmRequest(String operator, OrderBeanV1 orderBean, OtherParamDTO otherParamDTO) {
BaseQueryOrderRequest orderRequest = new BaseQueryOrderRequest();
orderRequest.setOrderId(orderBean.getOid());
orderRequest.setShopId(orderBean.getShopId());
......@@ -89,6 +90,10 @@ public class OrderSdkAdapter {
} else {
orderRequest.setDeliveryType(orderBean.getAddInfo().getDeliveryType());
}
if (Objects.nonNull(otherParamDTO)) {
orderRequest.setDispatchType(otherParamDTO.getDispatchType());
orderRequest.setDispatchTimeout(otherParamDTO.getDispatchTimeout());
}
return orderRequest;
}
......@@ -4035,4 +4040,7 @@ public class OrderSdkAdapter {
}
}
public BaseQueryOrderRequest getOrderConfirmRequest(String operator, OrderBeanV1 orderBean) {
return this.getOrderConfirmRequest(operator,orderBean,null);
}
}
package com.freemud.sdk.api.assortment.order.entities.other;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/22 上午11:11
* @description : 额外参数逻辑处理 操作
*/
@Data
public class OtherParamDTO {
/**
* 派单模式(0-系统自动派单;1-手动派单)
* 内置传参使用
*/
private String dispatchType;
/**
* 半自动派单时间 (分钟)
*/
private Integer dispatchTimeout;
}
......@@ -70,4 +70,8 @@ public class BaseQueryOrderRequest extends BaseConfig {
* 内置传参使用
*/
private String dispatchType;
/**
* 半自动派单时间 (分钟)
*/
private Integer dispatchTimeout;
}
......@@ -922,6 +922,7 @@ public class OrderCenterSdkServiceImpl implements OrderCenterSdkService {
request.setOrderCode(baseQueryOrderRequest.getOrderId());
request.setOperator(baseQueryOrderRequest.getOperator());
request.setDispatchType(baseQueryOrderRequest.getDispatchType());
request.setDispatchTimeout(baseQueryOrderRequest.getDispatchTimeout());
// 引入门店基础服务 查询自动制作完成配置时间
setTimeout(baseQueryOrderRequest,request);
com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp response = orderSdkService.acceptOrder(request, baseQueryOrderRequest.getTrackingNo());
......
package cn.freemud.management.entities.dto.request.console;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/24 上午9:47
* @description : 派单配置
*/
@Data
public class DispatchConfig {
/**
* 0工作日
*/
public static int DATETYPE_ZERO = 0;
/**
* 1双休日
*/
public static int DATETYPE_ONE = 1;
/**
* 2活动日
*/
public static int DATETYPE_TWO = 2;
/**
* 日期类型(0工作日,1双休日,2活动日)
*/
private int dateType;
/**
* 派单时间(分钟)
*/
private Integer dispatchTime;
/**
* 2活动日 才有值
* 活动开始时间(yyyy-MM-dd HH:mm:ss)
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date startTime;
/**
* 2活动日 才有值
* 活动结束时间(yyyy-MM-dd HH:mm:ss)
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
/**
* 高峰期派单配置(json)
*/
private List<PeakTimeConfig> peakTimeConfigList;
}
......@@ -2,6 +2,8 @@ package cn.freemud.management.entities.dto.request.console;
import lombok.Data;
import java.util.List;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
......@@ -68,4 +70,9 @@ public class ExpandFieldsDTO {
*/
private String dispatchType;
/**
* 手动派单的半自动配置
*/
private List<DispatchConfig> dispatchConfig;
}
package cn.freemud.management.entities.dto.request.console;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2021/12/24 上午9:48
* @description : 高峰期派单配置
*/
@Data
public class PeakTimeConfig {
/**
* 时间格式 HH:mm:ss
*/
private String startTime;
/**
* 时间格式 HH:mm:ss
*/
private String endTime;
/**
* 派单时间
*/
private Integer dispatchTime;
}
......@@ -68,4 +68,9 @@ public class OrderManagerRequest {
* 内置传参使用
*/
private String dispatchType;
/**
* 半自动派单时间 (分钟)
*/
private Integer dispatchTimeout;
}
package cn.freemud.management.service.handle;
import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.util.DateUtil;
import cn.freemud.management.adapter.DeliverySdkAdapter;
import cn.freemud.management.entities.dto.request.console.BizDTO;
import cn.freemud.management.entities.dto.request.console.BusinessInfoDTO;
import cn.freemud.management.entities.dto.request.console.ConsoleResponseDTO;
import cn.freemud.management.entities.dto.request.console.ExpandFieldsDTO;
import cn.freemud.management.entities.dto.request.console.*;
import cn.freemud.management.entities.dto.request.delivery.DeliveryOrderHaltedRequest;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.enums.DeliveryStatus;
......@@ -24,13 +22,18 @@ import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.service.EmailAlertService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
......@@ -195,12 +198,135 @@ public class DeliveryHandle {
return false;
}
//自配送不创建配送单
if (delivery_type_self.equalsIgnoreCase(orderBean.getAddInfo().getDeliveryType())) {
if (this.deliveryTypeSelf(orderBean.getAddInfo().getDeliveryType())) {
return false;
}
return true;
}
/**
* 半自动派单 获取时间区间范围
* 对外暴露的方法
* @param dispatchConfig
* @return
*/
public Integer getDispatchTimeout(List<DispatchConfig> dispatchConfig) {
Integer rest = -1;
if (CollectionUtils.isNotEmpty(dispatchConfig)) {
Date currentDate = new Date();
Integer dispatchTimeout = this.getDispatchTimeoutHandle(currentDate, dispatchConfig, DispatchConfig.DATETYPE_TWO);
if (dispatchTimeout != null) {
return dispatchTimeout;
}
int weekDay = DateUtil.getWeekDay(currentDate);
// 是否命中 工作日
boolean isWorkDay = weekDay != 6 && weekDay != 0;
dispatchTimeout = this.getDispatchTimeoutHandle(currentDate, dispatchConfig, (isWorkDay ? DispatchConfig.DATETYPE_ZERO : DispatchConfig.DATETYPE_ONE));
if (dispatchTimeout != null) {
return dispatchTimeout;
}
}
return rest;
}
/**
* 校验时间 是否命中范围
*
* @param currentDate
* @param startTimeStr 时间格式 HH:mm:ss
* @param endTimeStr 时间格式 HH:mm:ss
* @return
*/
private Boolean timeScoreVerify(Date currentDate, String startTimeStr, String endTimeStr) {
if (StringUtils.isEmpty(startTimeStr) || StringUtils.isEmpty(endTimeStr)) {
return Boolean.FALSE;
}
String formatTime = DateUtil.FORMAT_time;
Date nowTime = DateUtil.convert2Date(currentDate, formatTime);
Date startTime = DateUtil.convert2Date(startTimeStr, formatTime);
Date endTime = DateUtil.convert2Date(endTimeStr, formatTime);
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 Boolean.TRUE;
} else {
return Boolean.FALSE;
}
}
/**
* 获取配置
*
* @param currentDate
* @param dispatchConfig
* @param dateType
* @return null 表示没有配置
*/
private Integer getDispatchTimeoutHandle(Date currentDate, List<DispatchConfig> dispatchConfig, int dateType) {
List<DispatchConfig> activityDayConfig = dispatchConfig.stream().filter(d -> d.getDateType() == dateType).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(activityDayConfig)) {
for (DispatchConfig d : activityDayConfig) {
if (dateType == DispatchConfig.DATETYPE_TWO) {
// null 默认当做没配置
if (Objects.isNull(d.getStartTime()) || Objects.isNull(d.getEndTime())) {
return null;
}
// 并且不在 活动日内
boolean isActivityDay = currentDate.after(d.getStartTime()) && currentDate.before(d.getEndTime());
if (!isActivityDay) {
return null;
}
}
Integer peakTime = this.getPeakTime(currentDate, d.getPeakTimeConfigList());
if (Objects.nonNull(peakTime)) {
return peakTime;
}
// 在活动范围内, 没有命中高峰期
return d.getDispatchTime();
}
}
return null;
}
/**
* 返回是否有高峰配置 , 没有就返回 null
*
* @param currentDate
* @param peakTimeConfigList
* @return
*/
private Integer getPeakTime(Date currentDate, List<PeakTimeConfig> peakTimeConfigList) {
if (CollectionUtils.isNotEmpty(peakTimeConfigList)) {
for (PeakTimeConfig peakTimeConfig : peakTimeConfigList) {
boolean isHit = this.timeScoreVerify(currentDate, peakTimeConfig.getStartTime(), peakTimeConfig.getEndTime());
if (isHit) {
return peakTimeConfig.getDispatchTime();
}
}
}
return null;
}
/**
* 是否商家自配送
* @param deliveryType
* @return true 自配送
*/
public boolean deliveryTypeSelf(String deliveryType){
return delivery_type_self.equalsIgnoreCase(deliveryType);
}
}
......@@ -18,6 +18,7 @@ import com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoR
import com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse;
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.freemud.sdk.api.assortment.order.entities.other.OtherParamDTO;
import com.freemud.sdk.api.assortment.order.enums.PayRefundStatus;
import com.freemud.sdk.api.assortment.order.request.order.BaseQueryOrderRequest;
import com.freemud.sdk.api.assortment.order.request.order.CancelOrderRequest;
......@@ -71,8 +72,11 @@ public class SaasOrderHandle {
*/
public BaseResponse orderConfirm(OrderManagerRequest request, OrderBeanV1 orderBean) {
//订单接单
BaseQueryOrderRequest orderConfirmRequest = orderSdkAdapter.getOrderConfirmRequest(request.getOperator(), orderBean);
orderConfirmRequest.setDispatchType(request.getDispatchType());
OtherParamDTO dto = new OtherParamDTO();
dto.setDispatchType(request.getDispatchType());
dto.setDispatchTimeout(request.getDispatchTimeout());
BaseQueryOrderRequest orderConfirmRequest = orderSdkAdapter.getOrderConfirmRequest(request.getOperator(), orderBean, dto);
orderSdkAdapter.convert2wmDeliveryTimeOut(orderConfirmRequest,this.wmDeliveryTimeOut);
//合阔pos 商户订单状态不自动扭转
// 2021-07-07 合阔自动
......
......@@ -25,6 +25,7 @@ import com.freemud.application.sdk.api.ordercenter.enums.OrderClientType;
import com.freemud.application.sdk.api.ordercenter.enums.PayType;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderSourceV1;
import com.freemud.application.sdk.api.ordercenter.enums.orderv1.OrderStatusV1;
import com.freemud.application.sdk.api.ordercenter.enums.OrderType;
import com.freemud.application.sdk.api.ordercenter.request.OrderCancelReq;
import com.freemud.application.sdk.api.ordercenter.request.OrderExpressReq;
import com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto;
......@@ -103,18 +104,26 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
public BaseResponse<OrderManagerResponse> orderConfirm(OrderManagerRequest request, OrderBeanV1 orderBean) {
QueryFlag query = QueryFlag.builder().queryBusinessInfo(true).queryStoreInfo(true).build();
ConsoleResponseDTO<BizDTO> storeMix = this.getStoreMix(query, orderBean.getCompanyId(), orderBean.getShopId());
boolean idAutoCreate = false;
if (storeMix!=null && ObjectUtils.equals(ResponseResult.SUCCESS.getCode(), storeMix.getStatusCode())) {
BizDTO bizVO = storeMix.getBizVO();
if (bizVO!=null && bizVO.getBusinessInfo() !=null) {
// fisherman 预约单不走自动|半自动派单逻辑 【【野萃山】手动派单增加半自动配置】 https://www.tapd.cn/43862731/prong/stories/view/1143862731001040800
boolean reservedExpress = Objects.equals(orderBean.getNewOrderType(), OrderType.GENERAL_EXPRESS.getIndex());
// fisherman 自配送 不走 自动 | 半自动逻辑
boolean deliveryTypeSelf = deliveryHandle.deliveryTypeSelf(Objects.isNull(orderBean.getAddInfo()) ? null : orderBean.getAddInfo().getDeliveryType());
if (bizVO != null && bizVO.getBusinessInfo() != null && reservedExpress && !deliveryTypeSelf) {
ExpandFieldsDTO expandFields = bizVO.getBusinessInfo().getExpandFields();
request.setDispatchType(expandFields.getDispatchType());
// fisherman 半自动派单时间获取
request.setDispatchTimeout(deliveryHandle.getDispatchTimeout(expandFields.getDispatchConfig()));
idAutoCreate = true;
}
}
// 订单接单
BaseResponse baseResponse = saasOrderHandle.orderConfirm(request, orderBean);
// 使用feign调用 获取门店信息
// 创建配送单
deliveryHandle.createDelivery(orderBean, request, storeMix, true);
deliveryHandle.createDelivery(orderBean, request, storeMix, idAutoCreate);
// 推送pos、微信消息中心 重复接单不重复推消息(针对蜜雪做的修改)
if(baseResponse != null && baseResponse.getResult() == null){
orderBaseService.sendMessage(orderBean, OperateType.ORDER_CONFIRM, request.getReason());
......
......@@ -32,4 +32,8 @@ public class POSOrderOperationBaseReq {
* 内置传参使用
*/
private String dispatchType;
/**
* 半自动派单时间 (分钟)
*/
private Integer dispatchTimeout;
}
......@@ -51,7 +51,7 @@ public class FixDeliveryServiceImpl extends AbstractDeliveryServiceImpl implemen
ConsoleResponseDTO<BizDTO> responseDto = consoleApiClient.getStoreMix(query);
DeliveryInfoDTO deliveryInfo = responseDto.getBizVO().getDeliveryInfo();
// fisherman 处理 额外配送费
long amount = Objects.isNull(deliveryInfo.getFinalDeliveryAmount()) ? 0L : deliveryInfo.getFinalDeliveryAmount();
long amount = Objects.isNull(deliveryInfo) || Objects.isNull(deliveryInfo.getFinalDeliveryAmount()) ? 0L : deliveryInfo.getFinalDeliveryAmount();
List<ExtraDeliveryDto> deliveryAmountList = super.nightDeliveryAmountHandle(amount, deliveryInfo.getExpandFields());
if (Objects.nonNull(shoppingCartGoodsResponseVo)) {
shoppingCartGoodsResponseVo.setDeliveryFeeZeroReason(0);
......
......@@ -244,7 +244,7 @@ public class CalculationSharingDiscountService {
throw new ServiceException(ResponseResult.OPERATE_TOO_OFTEN);
}
// 返回成功
if (sharingDiscountResponseDto != null && StringUtils.equals(sharingDiscountResponseDto.getStatusCode(), ResponseCodeConstant.RESPONSE_SUCCESS_STR)) {
if (StringUtils.equals(sharingDiscountResponseDto.getStatusCode(), ResponseCodeConstant.RESPONSE_SUCCESS_STR)) {
CalculationDiscountResult result = sharingDiscountResponseDto.getResult();
List<Integer> activityTypes = result.getDiscounts().stream().map(Discount::getType).collect(Collectors.toList());
......@@ -262,9 +262,13 @@ public class CalculationSharingDiscountService {
}
// 这个是专门给coco使用的券验证错误的异常,message要抛出去
if (sharingDiscountResponseDto != null && StringUtils.equals(sharingDiscountResponseDto.getStatusCode(), ResponseCodeConstant.COCO_RESPONSE_COUPON_ERR_STR)) {
if (StringUtils.equals(sharingDiscountResponseDto.getStatusCode(), ResponseCodeConstant.COCO_RESPONSE_COUPON_ERR_STR)) {
throw new BizServiceException(ResponseResult.COCO_COUPON_VALIDATOR_FAIL, sharingDiscountResponseDto.getMsg());
}
// 80000 促销校验业务错误,直接抛给前端
if (sharingDiscountResponseDto != null && StringUtils.equals(sharingDiscountResponseDto.getStatusCode(), "80000")) {
throw new ServiceException(ResponseResult.SYSTEM_BUSINESS_ERROR,sharingDiscountResponseDto.getMsg());
}
// 支付宝华莱士紧急修改代码,当促销返回103错误码时,需要报券不适用于该门店,且清空购物车
//throw new ServiceException(ResponseResult.OPERATE_TOO_OFTEN);
......
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