Commit 11887bfc by 周晓航

半自动配置逻辑:

1.优先匹配是否活动日
2.工作日/双休日二选一,不会出现没有的情况(产品明确)

Signed-off-by: 周晓航 <xiaohang.zhou@freemud.com>
parent d011e052
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; ...@@ -2,6 +2,8 @@ package cn.freemud.management.entities.dto.request.console;
import lombok.Data; import lombok.Data;
import java.util.List;
/** /**
* @author : xh.Z * @author : xh.Z
* @email : fisherman0510@163.com * @email : fisherman0510@163.com
...@@ -68,4 +70,9 @@ public class ExpandFieldsDTO { ...@@ -68,4 +70,9 @@ public class ExpandFieldsDTO {
*/ */
private String dispatchType; 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 { ...@@ -68,4 +68,9 @@ public class OrderManagerRequest {
* 内置传参使用 * 内置传参使用
*/ */
private String dispatchType; private String dispatchType;
/**
* 半自动派单时间 (分钟)
*/
private Integer semiAutoDispathTime;
} }
package cn.freemud.management.service.handle; package cn.freemud.management.service.handle;
import cn.freemud.base.entity.BaseResponse; import cn.freemud.base.entity.BaseResponse;
import cn.freemud.base.util.DateUtil;
import cn.freemud.management.adapter.DeliverySdkAdapter; import cn.freemud.management.adapter.DeliverySdkAdapter;
import cn.freemud.management.entities.dto.request.console.BizDTO; import cn.freemud.management.entities.dto.request.console.*;
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.delivery.DeliveryOrderHaltedRequest; import cn.freemud.management.entities.dto.request.delivery.DeliveryOrderHaltedRequest;
import cn.freemud.management.entities.dto.request.order.OrderManagerRequest; import cn.freemud.management.entities.dto.request.order.OrderManagerRequest;
import cn.freemud.management.enums.DeliveryStatus; import cn.freemud.management.enums.DeliveryStatus;
...@@ -24,13 +22,18 @@ import com.freemud.application.sdk.api.log.ApiLog; ...@@ -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.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1; import com.freemud.application.sdk.api.ordercenter.entities.v1.OrderBeanV1;
import com.freemud.application.sdk.api.service.EmailAlertService; 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.ObjectUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
...@@ -201,6 +204,117 @@ public class DeliveryHandle { ...@@ -201,6 +204,117 @@ public class DeliveryHandle {
return true; return true;
} }
/**
* 半自动派单 获取时间区间范围
* 对外暴露的方法
* @param dispatchConfig
* @return
*/
public Integer getSemiAutoDispathTime(List<DispatchConfig> dispatchConfig) {
Integer rest = -1;
if (CollectionUtils.isNotEmpty(dispatchConfig)) {
Date currentDate = new Date();
Integer semiAutoDispathTime = this.getSemiAutoDispathTimeHandle(currentDate, dispatchConfig, DispatchConfig.DATETYPE_TWO);
if (semiAutoDispathTime != null) {
return semiAutoDispathTime;
}
int weekDay = DateUtil.getWeekDay(currentDate);
// 是否命中 工作日
boolean isWorkDay = weekDay != 6 && weekDay != 0;
semiAutoDispathTime = this.getSemiAutoDispathTimeHandle(currentDate, dispatchConfig, (isWorkDay ? DispatchConfig.DATETYPE_ZERO : DispatchConfig.DATETYPE_ONE));
if (semiAutoDispathTime != null) {
return semiAutoDispathTime;
}
}
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 getSemiAutoDispathTimeHandle(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) {
// 并且不在 活动日内
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;
}
} }
...@@ -108,6 +108,8 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService { ...@@ -108,6 +108,8 @@ public class SaasOrderMangerServiceImpl implements OrderManagerService {
if (bizVO!=null && bizVO.getBusinessInfo() !=null) { if (bizVO!=null && bizVO.getBusinessInfo() !=null) {
ExpandFieldsDTO expandFields = bizVO.getBusinessInfo().getExpandFields(); ExpandFieldsDTO expandFields = bizVO.getBusinessInfo().getExpandFields();
request.setDispatchType(expandFields.getDispatchType()); request.setDispatchType(expandFields.getDispatchType());
// fisherman 半自动派单时间获取
request.setSemiAutoDispathTime(deliveryHandle.getSemiAutoDispathTime(expandFields.getDispatchConfig()));
} }
} }
// 订单接单 // 订单接单
......
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