提交 4dc18012 authored 作者: 艾庆国's avatar 艾庆国

运单预警

上级 5eeadd9f
package com.clx.performance.enums.linewarn;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
public enum LineWarnOrderGoodsEnum {
;
@Getter
@AllArgsConstructor
public enum TraceStatus {
DISABLE(0, "禁止"),
ENABLE(1, "启用"),
;
private final Integer code;
private final String msg;
public static Optional<TraceStatus> getByCode(int code) {
return Arrays.stream(values()).filter(e -> e.code == code).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(TraceStatus::getMsg).orElse(null);
}
}
@Getter
@AllArgsConstructor
public enum WarnStatus {
DISABLE(0, "禁止"),
ENABLE(1, "启用"),
;
private final Integer code;
private final String msg;
public static Optional<WarnStatus> getByCode(int code) {
return Arrays.stream(values()).filter(e -> e.code == code).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(WarnStatus::getMsg).orElse(null);
}
}
}
package com.clx.performance.param.mq.linewarn;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* @Author: aiqingguo
* @Description: 新增
* @Date: 2023-10-19 15:45:25
* @Version: 1.0
*/
@Setter
@Getter
@ToString
@NoArgsConstructor
public class LineWarnLineWarnMqParam {
private String orderGoodsNo; //货单编号
}
package com.clx.performance.param.mq.linewarn;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* @Author: aiqingguo
* @Description: 通知
* @Date: 2023-10-19 15:45:25
* @Version: 1.0
*/
@Setter
@Getter
@ToString
@NoArgsConstructor
public class LineWarnNoticeMqParam {
private Integer infoId; //id
}
package com.clx.performance.param.mq.linewarn;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/**
* @Author: aiqingguo
* @Description: 新增
* @Date: 2024-5-31 13:45:10
* @Version: 1.0
*/
@Setter
@Getter
@ToString
@NoArgsConstructor
public class LineWarnOrderGoodsAddMqParam {
private String orderGoodsNo; //货单编号
}
package com.clx.performance.config;
import com.clx.performance.constant.RabbitKeyLineWarnConstants;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: aiqingguo
* @Description: 货款往来明细 MQ
* @Date: 2023-10-12 16:27:30
* @Version: 1.0
*/
@Configuration
public class RabbitLineWarnConfig {
@Bean
public DirectExchange lineWarnDefaultExchange() {
return new DirectExchange(RabbitKeyLineWarnConstants.DEFAULT_EXCHANGE);
}
@Bean
public Queue lineWarnDefaultDelayQueue() {
Map<String, Object> params = new HashMap<>(8);
params.put("x-message-ttl", 15 * 60 * 1000);
params.put("x-max-length", 5000000);
params.put("x-dead-letter-exchange", RabbitKeyLineWarnConstants.DEFAULT_EXCHANGE);
params.put("x-dead-letter-routing-key", RabbitKeyLineWarnConstants.DEFAULT_DEAD_ROUTING_KEY);
return new Queue(RabbitKeyLineWarnConstants.DEFAULT_DELAY_QUEUE, true, false, false, params);
}
@Bean
public Binding lineWarnDefaultDelayQueueBinding() {
return BindingBuilder.bind(lineWarnDefaultDelayQueue()).to(lineWarnDefaultExchange()).with(RabbitKeyLineWarnConstants.DEFAULT_DELAY_ROUTING_KEY);
}
@Bean
public Queue lineWarnDefaultDeadQueue() {
return new Queue(RabbitKeyLineWarnConstants.DEFAULT_DEAD_QUEUE);
}
@Bean
public Binding lineWarnDefaultDeadQueueBinding() {
return BindingBuilder.bind(lineWarnDefaultDeadQueue()).to(lineWarnDefaultExchange()).with(RabbitKeyLineWarnConstants.DEFAULT_DEAD_ROUTING_KEY);
}
/**
* 新增
*/
@Bean
public Queue lineWarnChildAddQueue() {
return new Queue(RabbitKeyLineWarnConstants.ORDER_GOODS_ADD_QUEUE);
}
@Bean
public Binding lineWarnChildAddQueueBinding() {
return BindingBuilder.bind(lineWarnChildAddQueue()).to(lineWarnDefaultExchange()).with(RabbitKeyLineWarnConstants.ORDER_GOODS_ADD_ROUTING_KEY);
}
/**
* 线路预警
*/
@Bean
public Queue lineWarnQueue() {
return new Queue(RabbitKeyLineWarnConstants.LINE_WARN_QUEUE);
}
@Bean
public Binding lineWarnQueueBinding() {
return BindingBuilder.bind(lineWarnQueue()).to(lineWarnDefaultExchange()).with(RabbitKeyLineWarnConstants.LINE_WARN_ROUTING_KEY);
}
/**
* 线路预警通知
*/
@Bean
public Queue lineWarnNoticeQueue() {
return new Queue(RabbitKeyLineWarnConstants.LINE_WARN_NOTICE_QUEUE);
}
@Bean
public Binding lineWarnNoticeQueueBinding() {
return BindingBuilder.bind(lineWarnNoticeQueue()).to(lineWarnDefaultExchange()).with(RabbitKeyLineWarnConstants.LINE_WARN_NOTICE_ROUTING_KEY);
}
}
package com.clx.performance.constant;
/**
* @Author: aiqingguo
* @Description: 线路预警-mq
* @Date: 2023-10-19 15:10:10
* @Version: 1.0
*/
public class RabbitKeyLineWarnConstants {
private static final String PREFIX = "clx-performance.lineWarn.";
private static final String EXCHANGE = ".exchange";
private static final String QUEUE = ".queue";
private static final String QUEUE_ROUTING_KEY = ".routing.key";
private static final String DELAY_QUEUE = ".delay.queue";
private static final String DELAY_ROUTING_KEY = ".delay.routing.key";
private static final String DEAD_QUEUE = ".dead.queue";
private static final String DEAD_ROUTING_KEY = ".dead.routing.key";
private RabbitKeyLineWarnConstants() {
}
/**
* 缺省交换机
*/
public static final String DEFAULT_EXCHANGE = PREFIX +"default"+EXCHANGE;
/**
* 缺省延迟队列
*/
public static final String DEFAULT_DELAY_QUEUE = PREFIX +"default"+DELAY_QUEUE;
public static final String DEFAULT_DELAY_ROUTING_KEY = PREFIX +"default"+DELAY_ROUTING_KEY;
public static final String DEFAULT_DEAD_QUEUE = PREFIX +"default"+DEAD_QUEUE;
public static final String DEFAULT_DEAD_ROUTING_KEY = PREFIX +"default"+DEAD_ROUTING_KEY;
/**
* 新增
*/
public static final String ORDER_GOODS_ADD_QUEUE = PREFIX +"orderGoods.add"+QUEUE;
public static final String ORDER_GOODS_ADD_ROUTING_KEY = PREFIX +"orderGoods.add"+QUEUE_ROUTING_KEY;
/**
* 车辆预警
*/
public static final String LINE_WARN_QUEUE = PREFIX +"line.warn"+QUEUE;
public static final String LINE_WARN_ROUTING_KEY = PREFIX +"line.warn"+QUEUE_ROUTING_KEY;
/**
* 线路预警通知
*/
public static final String LINE_WARN_NOTICE_QUEUE = PREFIX +"lineWarn.notice"+QUEUE;
public static final String LINE_WARN_NOTICE_ROUTING_KEY = PREFIX +"lineWarn.notice"+QUEUE_ROUTING_KEY;
}
......@@ -166,4 +166,11 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int
Page<OrderChild> getMonthAgoByUserNo(Long userNo, LocalDateTime monthAgo, PageParam param);
IPage<OrderChild> pageOwnerOrderChildList(PageOwnerOrderChildListParam param);
Integer loadTimeAvg(Integer sendAddressId, Integer receiveAddressId,
Integer sendSystemAddressId, Integer receiveSystemAddressId,
String beginTime);
Integer unloadTimeAvg(Integer sendAddressId, Integer receiveAddressId,
Integer sendSystemAddressId, Integer receiveSystemAddressId,
String beginTime);
}
......@@ -538,4 +538,14 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
query.orderByDesc(OrderChild :: getCreateTime);
return baseMapper.selectPage(Page.of(param.getPage(), param.getPageSize()),query);
}
@Override
public Integer loadTimeAvg(Integer sendAddressId, Integer receiveAddressId, Integer sendSystemAddressId, Integer receiveSystemAddressId, String beginTime) {
return 0;
}
@Override
public Integer unloadTimeAvg(Integer sendAddressId, Integer receiveAddressId, Integer sendSystemAddressId, Integer receiveSystemAddressId, String beginTime) {
return 0;
}
}
package com.clx.performance.dao.impl.linewarn;
import com.clx.performance.dao.linewarn.LineWarnOrderGoodsDao;
import com.clx.performance.enums.linewarn.LineWarnOrderGoodsEnum;
import com.clx.performance.mapper.linewarn.LineWarnOrderGoodsMapper;
import com.clx.performance.model.linewarn.LineWarnOrderGoods;
import com.msl.common.base.Optional;
import com.msl.common.dao.impl.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class LineWarnOrderGoodsDaoImpl extends BaseDaoImpl<LineWarnOrderGoodsMapper, LineWarnOrderGoods, Integer> implements LineWarnOrderGoodsDao {
@Override
public Optional<LineWarnOrderGoods> getByOrderGoodsNo(String orderGoodsNo) {
return Optional.of(orderGoodsNo)
.map(item -> lQrWrapper()
.eq(LineWarnOrderGoods::getOrderGoodsNo, orderGoodsNo)
)
.map(super::getOne);
}
@Override
public List<LineWarnOrderGoods> ListOrderGoodsNoOfWarn() {
return list(lQrWrapper().select(LineWarnOrderGoods::getOrderGoodsNo)
.eq(LineWarnOrderGoods::getWarnStatus, LineWarnOrderGoodsEnum.WarnStatus.ENABLE.getCode())
.orderByDesc(LineWarnOrderGoods::getId)
.last("limit 10000")
);
}
}
......@@ -73,7 +73,7 @@ public class VehicleWarnInfoDaoImpl extends BaseDaoImpl<LineWarnInfoMapper, Line
}
@Override
public Optional<LineWarnInfo> findByChildNoAndWarnConfigId(String orderGoodsNo, Integer warnConfigId) {
public Optional<LineWarnInfo> findByOrderGoodsNoAndWarnConfigId(String orderGoodsNo, Integer warnConfigId) {
return Optional.of(orderGoodsNo)
.map(item -> lQrWrapper()
.eq(LineWarnInfo::getOrderGoodsNo, orderGoodsNo)
......
......@@ -19,7 +19,7 @@ public interface LineWarnInfoDao extends BaseDao<LineWarnInfoMapper, LineWarnInf
Optional<LineWarnInfo> findById(Integer id);
Optional<LineWarnInfo> findByChildNoAndWarnConfigId(String orderGoodsNo, Integer warnConfigId);
Optional<LineWarnInfo> findByOrderGoodsNoAndWarnConfigId(String orderGoodsNo, Integer warnConfigId);
List<LineWarnInfo> listSuspendTimeout();
......
......@@ -2,9 +2,14 @@ package com.clx.performance.dao.linewarn;
import com.clx.performance.mapper.linewarn.LineWarnOrderGoodsMapper;
import com.clx.performance.model.linewarn.LineWarnOrderGoods;
import com.msl.common.base.Optional;
import com.msl.common.dao.BaseDao;
import java.util.List;
public interface LineWarnOrderGoodsDao extends BaseDao<LineWarnOrderGoodsMapper, LineWarnOrderGoods, Integer> {
Optional<LineWarnOrderGoods> getByOrderGoodsNo(String orderGoodsNo);
List<LineWarnOrderGoods> ListOrderGoodsNoOfWarn();
}
package com.clx.performance.dto.linewarn;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.time.LocalDateTime;
@Getter
@Setter
@ToString
@NoArgsConstructor
public class LineWarnCommonInfoDTO {
String orderGoodsNo; //货单编号
private int loadTimeAvg; //平均装车时间(min)
private int unloadTimeAvg; //平均卸车时间(min)
private LocalDateTime transportEndTime; //拉运结束时间
private LocalDateTime pendingOrderTime; //挂单时间
private Integer arriveReceiveExpectTime; //预计到达目的地时间 (min)
}
package com.clx.performance.job.linewarn;
import com.clx.performance.dao.linewarn.LineWarnOrderGoodsDao;
import com.clx.performance.model.linewarn.LineWarnOrderGoods;
import com.clx.performance.service.linewarn.LineWarnMqService;
import com.msl.common.job.JobLog;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
@Slf4j
@Component
public class VehicleWarnJob {
@Autowired
private LineWarnOrderGoodsDao lineWarnOrderGoodsDao;
@Autowired
private LineWarnMqService lineWarnMqService;
/**
* 线路监控预警
*/
@XxlJob("lineWarnWarn")
public void lineWarnWarn() {
try {
List<LineWarnOrderGoods> list = lineWarnOrderGoodsDao.ListOrderGoodsNoOfWarn();
log.info("线路监控预警, size:{}", list.size());
for (LineWarnOrderGoods item : list) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime beginTime = now.minusSeconds(600);
// 发送mq (线路预警)
lineWarnMqService.lineWarn(item.getOrderGoodsNo());
}
} catch (Exception e) {
log.warn("线路监控预警失败,异常原因:{}", ExceptionUtils.getStackTrace(e));
JobLog.error("线路监控预警失败,异常原因=====================", e);
}
}
}
package com.clx.performance.listener.linewarn;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqDelay;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyLineWarnConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 线路预警 mq
* @Date: 2023-10-20 16:14:30
* @Version: 1.0
*/
@Slf4j
@Component
public class LineWarnDelayListener {
@Autowired
private RabbitTemplate rabbitTemplate;
@RabbitListener(queues = RabbitKeyLineWarnConstants.DEFAULT_DEAD_QUEUE)
public void process(Message message) {
try{
log.info("线路预警-延迟, message:{}", message);
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<MqDelay>>(){}).getData());
}catch (Exception e){
log.info("线路预警-延迟 失败",e);
}
}
void process(MqDelay mq){
Message message = MessageBuilder.withBody(JSON.toJSONString(mq.getData()).getBytes()).build();
rabbitTemplate.send(mq.getExchange(), mq.getRouterKey(), message);
}
}
package com.clx.performance.listener.linewarn;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyLineWarnConstants;
import com.clx.performance.param.mq.linewarn.LineWarnLineWarnMqParam;
import com.clx.performance.service.linewarn.LineWarnMqHandlerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 线路预警 mq
* @Date: 2023-10-20 16:34:40
* @Version: 1.0
*/
@Slf4j
@Component
public class LineWarnLineWarnListener {
@Autowired
private LineWarnMqHandlerService lineWarnMqHandlerService;
@RabbitListener(queues = RabbitKeyLineWarnConstants.LINE_WARN_QUEUE)
public void process(Message message) {
try{
log.info("线路预警-货单预警, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<LineWarnLineWarnMqParam>>(){}).getData());
}catch (Exception e){
log.info("线路预警-货单预警 失败",e);
}
}
private void process(LineWarnLineWarnMqParam mq){
lineWarnMqHandlerService.lineWarn(mq);
}
}
package com.clx.performance.listener.linewarn;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyLineWarnConstants;
import com.clx.performance.param.mq.linewarn.LineWarnOrderGoodsAddMqParam;
import com.clx.performance.service.linewarn.LineWarnMqHandlerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 货单新增 mq
* @Date: 2023-10-20 16:34:40
* @Version: 1.0
*/
@Slf4j
@Component
public class LineWarnOrderGoodsAddListener {
@Autowired
private LineWarnMqHandlerService lineWarnMqHandlerService;
@RabbitListener(queues = RabbitKeyLineWarnConstants.ORDER_GOODS_ADD_QUEUE)
public void process(Message message) {
try{
log.info("线路预警-货单新增, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<LineWarnOrderGoodsAddMqParam>>(){}).getData());
}catch (Exception e){
log.info("线路预警-货单新增 失败",e);
}
}
private void process(LineWarnOrderGoodsAddMqParam mq){
lineWarnMqHandlerService.orderGoodsAdd(mq);
}
}
package com.clx.performance.listener.linewarn;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyLineWarnConstants;
import com.clx.performance.param.mq.linewarn.LineWarnNoticeMqParam;
import com.clx.performance.service.linewarn.LineWarnMqHandlerService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @Author: 艾庆国
* @Description: 线路预警通知 mq
* @Date: 2023-10-20 16:34:40
* @Version: 1.0
*/
@Slf4j
@Component
public class LineWarnTruckNoticeListener {
@Autowired
private LineWarnMqHandlerService lineWarnMqHandlerService;
@RabbitListener(queues = RabbitKeyLineWarnConstants.LINE_WARN_NOTICE_QUEUE)
public void process(Message message) {
try{
log.info("线路预警-预警通知, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<LineWarnNoticeMqParam>>(){}).getData());
}catch (Exception e){
log.info("线路预警-预警通知 失败",e);
}
}
private void process(LineWarnNoticeMqParam mq){
lineWarnMqHandlerService.notice(mq);
}
}
......@@ -27,6 +27,10 @@ public class LineWarnOrderGoods implements HasKey<Integer> {
@TableId(value = "id", type = IdType.AUTO)
private Integer id; //id
private String orderGoodsNo; //货单编号
private LocalDateTime transportEndTime; //拉运结束时间
private LocalDateTime pendingOrderTime; //挂单时间
private Integer arriveReceiveExpectTime; //预计到达目的地时间 (min)
private Integer pengNum; //挂单数
private Integer takeNum; //接单数
private Integer arriveSendNum; //到达货源地车数
......@@ -34,6 +38,7 @@ public class LineWarnOrderGoods implements HasKey<Integer> {
private Integer arriveReceiveNum; //到达目的地车数
private Integer unloadNum; //卸车车数
private Integer status; //状态
private Integer warnStatus; //预警使能:0禁用 1启用
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
......
package com.clx.performance.service.impl.linewarn;
import com.clx.performance.dao.linewarn.LineWarnInfoDao;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.linewarn.LineWarnConfig;
import com.clx.performance.model.linewarn.LineWarnInfo;
import com.clx.performance.service.linewarn.LineWarnCommonService;
import com.clx.performance.service.linewarn.LineWarnMqService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Slf4j
@Service
public class LineWarnCommonServiceImpl implements LineWarnCommonService {
private final static int MIN_FER_HOUR = 60;
@Autowired
private LineWarnInfoDao lineWarnInfoDao;
@Autowired
private LineWarnMqService lineWarnMqService;
@Override
public void lineWarnInfoUpdate(OrderGoods orderGoods, LineWarnInfo lineWarnInfo, LineWarnConfig lineWarnConfig){
// 更新
if (lineWarnInfo != null){
// 计算下次生效时间
LocalDateTime nextTime = lineWarnInfo.getWarnTime().plusMinutes(lineWarnConfig.getInterval().multiply(new BigDecimal(MIN_FER_HOUR)).intValue());
if (nextTime.isAfter(LocalDateTime.now())) {return;}
lineWarnInfo.setWarnTime(LocalDateTime.now());
lineWarnInfoDao.updateWarnTime(lineWarnInfo);
// 发送mq (预警通知)
lineWarnMqService.lineWarnNotice(lineWarnInfo.getId());
return;
}
// 新增
lineWarnInfo = new LineWarnInfo();
lineWarnInfo.setWarnConfigId(lineWarnConfig.getId());
lineWarnInfo.setWarnType(lineWarnConfig.getWarnType());
lineWarnInfo.setWarnName(lineWarnConfig.getWarnName());
lineWarnInfo.setWarnLevel(lineWarnConfig.getWarnLevel());
lineWarnInfo.setOrderGoodsNo(orderGoods.getOrderGoodsNo());
lineWarnInfo.setSendAddressId(orderGoods.getSendAddressId());
lineWarnInfo.setSendAddress(orderGoods.getSendAddressShorter());
lineWarnInfo.setReceiveAddressId(orderGoods.getReceiveAddressId());
lineWarnInfo.setReceiveAddress(orderGoods.getReceiveAddressShorter());
lineWarnInfo.setWarnTime(LocalDateTime.now());
lineWarnInfoDao.saveEntity(lineWarnInfo);
// 发送mq (预警通知)
lineWarnMqService.lineWarnNotice(lineWarnInfo.getId());
}
}
package com.clx.performance.service.impl.linewarn;
import com.clx.performance.dao.linewarn.LineWarnConfigDao;
import com.clx.performance.dao.linewarn.LineWarnInfoDao;
import com.clx.performance.dto.linewarn.LineWarnCommonInfoDTO;
import com.clx.performance.enums.linewarn.LineWarnConfigEnum;
import com.clx.performance.enums.linewarn.LineWarnInfoEnum;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.linewarn.LineWarnConfig;
import com.clx.performance.model.linewarn.LineWarnInfo;
import com.clx.performance.service.linewarn.LineWarnCommonService;
import com.clx.performance.service.linewarn.LineWarnLoadWarnService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@Slf4j
@Service
public class LineWarnLoadWarnServiceImpl implements LineWarnLoadWarnService {
@Autowired
private LineWarnConfigDao lineWarnConfigDao;
@Autowired
private LineWarnInfoDao lineWarnInfoDao;
@Autowired
private LineWarnCommonService lineWarnCommonService;
@Override
public void loadWarn(OrderGoods orderGoods, LineWarnCommonInfoDTO lineWarnCommonInfo) {
int unloadTimeAvg = 0;
Integer arriveReceiveExpectTime = lineWarnCommonInfo.getArriveReceiveExpectTime();
long totalTime = Duration.between(lineWarnCommonInfo.getPendingOrderTime(),
lineWarnCommonInfo.getTransportEndTime()).toMinutes();
int needTime = unloadTimeAvg+arriveReceiveExpectTime;
// 接单最长时间
long difTime = totalTime - needTime;
// 任务完成率
BigDecimal taskCompleteRatio = BigDecimal.ZERO;
List<LineWarnConfig> vehicleWarnConfigList = lineWarnConfigDao
.listByWarnType(LineWarnConfigEnum.WarnType.LOAD.getCode());
if (vehicleWarnConfigList.isEmpty()) {return;}
for (LineWarnConfig item : vehicleWarnConfigList) {
doTakeWarn(orderGoods, item,lineWarnCommonInfo.getPendingOrderTime(), difTime, taskCompleteRatio);
}
}
private void doTakeWarn(OrderGoods orderGoods, LineWarnConfig lineWarnConfig, LocalDateTime pendingOrderTime,
long difTime, BigDecimal taskCompleteRatio){
LineWarnInfo lineWarnInfo = lineWarnInfoDao
.findByOrderGoodsNoAndWarnConfigId(orderGoods.getOrderGoodsNo(), lineWarnConfig.getId()).orNull();
if (lineWarnInfo != null
&& Objects.equals(lineWarnInfo.getStatus(), LineWarnInfoEnum.Status.RESOLVE.getCode())){
return;
}
int time = lineWarnConfig.getTimeRatio().multiply(new BigDecimal(difTime)).intValue();
// 未达到时间占比
if (pendingOrderTime.plusMinutes(time).isBefore(LocalDateTime.now())){return;}
// 达到任务占比
if (lineWarnConfig.getTaskCompleteRatio().compareTo(taskCompleteRatio) >= 0) {return;}
// 更新
lineWarnCommonService.lineWarnInfoUpdate(orderGoods, lineWarnInfo, lineWarnConfig);
}
}
package com.clx.performance.service.impl.linewarn;
import com.clx.order.feign.OrderFeign;
import com.clx.order.vo.feign.FeignOrderInfoVO;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dao.linewarn.LineWarnOrderGoodsDao;
import com.clx.performance.dto.linewarn.LineWarnCommonInfoDTO;
import com.clx.performance.enums.ResultEnum;
import com.clx.performance.extranal.user.OrderService;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.linewarn.LineWarnOrderGoods;
import com.clx.performance.param.mq.linewarn.LineWarnLineWarnMqParam;
import com.clx.performance.param.mq.linewarn.LineWarnNoticeMqParam;
import com.clx.performance.param.mq.linewarn.LineWarnOrderGoodsAddMqParam;
import com.clx.performance.service.linewarn.LineWarnLoadWarnService;
import com.clx.performance.service.linewarn.LineWarnMqHandlerService;
import com.clx.performance.service.linewarn.LineWarnTakeWarnService;
import com.clx.performance.service.linewarn.LineWarnUnloadWarnService;
import com.clx.performance.utils.LocalDateTimeUtils;
import com.clx.performance.utils.gd.GdUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Slf4j
@Service
public class LineWarnMqHandlerServiceImpl implements LineWarnMqHandlerService {
@Autowired
private OrderGoodsDao orderGoodsDao;
@Autowired
private LineWarnOrderGoodsDao lineWarnOrderGoodsDao;
@Autowired
private OrderFeign orderFeign;
@Autowired
private OrderService orderService;
@Autowired
private GdUtils gdUtils;
@Autowired
private LineWarnTakeWarnService lineWarnTakeWarnService;
@Autowired
private LineWarnUnloadWarnService lineWarnUnloadWarnService;
@Autowired
private LineWarnLoadWarnService lineWarnLoadWarnService;
@Autowired
private OrderChildDao orderChildDao;
@Override
public void orderGoodsAdd(LineWarnOrderGoodsAddMqParam mq) {
OrderGoods orderGoods = orderGoodsDao
.getByOrderGoodsNo(mq.getOrderGoodsNo()).orElseThrow(ResultEnum.DATA_NOT_FIND);
FeignOrderInfoVO orderInfo = orderService
.getOrderInfo(orderGoods.getOrderNo()).orElseThrow(ResultEnum.DATA_NOT_FIND);
// 计算货源地到
int arriveSendExpectTime = gdUtils.getNeedTime(new BigDecimal[]{orderGoods.getSendLongitude(),
orderGoods.getSendLatitude()}, orderGoods.getReceiveLongitude(), orderGoods.getReceiveLatitude());
LineWarnOrderGoods lineWarnOrderGoods = new LineWarnOrderGoods();
lineWarnOrderGoods.setOrderGoodsNo(orderGoods.getOrderGoodsNo());
lineWarnOrderGoods.setTransportEndTime(LocalDateTimeUtils.parseTime(orderInfo.getTransportEndTime()));
lineWarnOrderGoods.setPendingOrderTime(orderGoods.getPendingOrderTime());
lineWarnOrderGoods.setArriveReceiveExpectTime(arriveSendExpectTime==0? null : arriveSendExpectTime);
lineWarnOrderGoodsDao.saveEntity(lineWarnOrderGoods);
}
@Override
public void lineWarn(LineWarnLineWarnMqParam mq) {
LineWarnOrderGoods lineWarnOrderGoods = lineWarnOrderGoodsDao
.getByOrderGoodsNo(mq.getOrderGoodsNo()).orElseThrow(ResultEnum.DATA_NOT_FIND);
OrderGoods orderGoods = orderGoodsDao
.getByOrderGoodsNo(mq.getOrderGoodsNo()).orElseThrow(ResultEnum.DATA_NOT_FIND);
LineWarnCommonInfoDTO lineWarnCommonInfo = new LineWarnCommonInfoDTO();
lineWarnCommonInfo.setOrderGoodsNo(orderGoods.getOrderGoodsNo());
lineWarnCommonInfo.setTransportEndTime(lineWarnOrderGoods.getTransportEndTime());
lineWarnCommonInfo.setPendingOrderTime(lineWarnOrderGoods.getPendingOrderTime());
lineWarnCommonInfo.setArriveReceiveExpectTime(lineWarnOrderGoods.getArriveReceiveExpectTime());
Integer time = orderChildDao.loadTimeAvg(orderGoods.getSendAddressId(), orderGoods.getReceiveAddressId(),
orderGoods.getSendSystemAddressId(), orderGoods.getReceiveSystemAddressId(),
LocalDateTimeUtils.formatTime(LocalDateTime.now().minusDays(7)));
// 接单预警
try {
lineWarnTakeWarnService.takeWarn(orderGoods, lineWarnCommonInfo);
}catch (Exception e){
log.info("接单预警异常,msg:{}", e.getMessage());
}
// 装车预警
try{
lineWarnLoadWarnService.loadWarn(orderGoods, lineWarnCommonInfo);
}catch (Exception e){
log.info("装车预警异常,msg:{}", e.getMessage());
}
// 卸车预警
try{
lineWarnUnloadWarnService.unloadWarn(orderGoods, lineWarnCommonInfo);
}catch (Exception e){
log.info("卸车预警异常,msg:{}", e.getMessage());
}
}
@Override
public void notice(LineWarnNoticeMqParam mq) {
}
}
package com.clx.performance.service.impl.linewarn;
import com.clx.performance.dao.linewarn.LineWarnConfigDao;
import com.clx.performance.dao.linewarn.LineWarnInfoDao;
import com.clx.performance.dto.linewarn.LineWarnCommonInfoDTO;
import com.clx.performance.enums.linewarn.LineWarnConfigEnum;
import com.clx.performance.enums.linewarn.LineWarnInfoEnum;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.linewarn.LineWarnConfig;
import com.clx.performance.model.linewarn.LineWarnInfo;
import com.clx.performance.service.linewarn.LineWarnCommonService;
import com.clx.performance.service.linewarn.LineWarnTakeWarnService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@Slf4j
@Service
public class LineWarnTakeWarnServiceImpl implements LineWarnTakeWarnService {
@Autowired
private LineWarnConfigDao lineWarnConfigDao;
@Autowired
private LineWarnInfoDao lineWarnInfoDao;
@Autowired
private LineWarnCommonService lineWarnCommonService;
@Override
public void takeWarn(OrderGoods orderGoods, LineWarnCommonInfoDTO lineWarnCommonInfo) {
int loadTimeAvg = 0;
int unloadTimeAvg = 0;
Integer arriveReceiveExpectTime = lineWarnCommonInfo.getArriveReceiveExpectTime();
long totalTime = Duration.between(lineWarnCommonInfo.getPendingOrderTime(),
lineWarnCommonInfo.getTransportEndTime()).toMinutes();
int needTime = 60+loadTimeAvg+unloadTimeAvg+arriveReceiveExpectTime;
// 接单最长时间
long difTime = totalTime - needTime;
// 任务完成率
BigDecimal taskCompleteRatio = BigDecimal.ZERO;
List<LineWarnConfig> vehicleWarnConfigList = lineWarnConfigDao
.listByWarnType(LineWarnConfigEnum.WarnType.TAKE.getCode());
if (vehicleWarnConfigList.isEmpty()) {return;}
for (LineWarnConfig item : vehicleWarnConfigList) {
doTakeWarn(orderGoods, item,lineWarnCommonInfo.getPendingOrderTime(), difTime, taskCompleteRatio);
}
}
private void doTakeWarn(OrderGoods orderGoods, LineWarnConfig lineWarnConfig, LocalDateTime pendingOrderTime,
long difTime, BigDecimal taskCompleteRatio){
LineWarnInfo lineWarnInfo = lineWarnInfoDao
.findByOrderGoodsNoAndWarnConfigId(orderGoods.getOrderGoodsNo(), lineWarnConfig.getId()).orNull();
if (lineWarnInfo != null
&& Objects.equals(lineWarnInfo.getStatus(), LineWarnInfoEnum.Status.RESOLVE.getCode())){
return;
}
int time = lineWarnConfig.getTimeRatio().multiply(new BigDecimal(difTime)).intValue();
// 未达到时间占比
if (pendingOrderTime.plusMinutes(time).isBefore(LocalDateTime.now())){return;}
// 达到任务占比
if (lineWarnConfig.getTaskCompleteRatio().compareTo(taskCompleteRatio) >= 0) {return;}
// 更新
lineWarnCommonService.lineWarnInfoUpdate(orderGoods, lineWarnInfo, lineWarnConfig);
}
}
package com.clx.performance.service.impl.linewarn;
import com.clx.performance.dao.linewarn.LineWarnConfigDao;
import com.clx.performance.dao.linewarn.LineWarnInfoDao;
import com.clx.performance.dto.linewarn.LineWarnCommonInfoDTO;
import com.clx.performance.enums.linewarn.LineWarnConfigEnum;
import com.clx.performance.enums.linewarn.LineWarnInfoEnum;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.linewarn.LineWarnConfig;
import com.clx.performance.model.linewarn.LineWarnInfo;
import com.clx.performance.service.linewarn.LineWarnCommonService;
import com.clx.performance.service.linewarn.LineWarnUnloadWarnService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@Slf4j
@Service
public class LineWarnUnloadServiceImpl implements LineWarnUnloadWarnService {
@Autowired
private LineWarnConfigDao lineWarnConfigDao;
@Autowired
private LineWarnInfoDao lineWarnInfoDao;
@Autowired
private LineWarnCommonService lineWarnCommonService;
@Override
public void unloadWarn(OrderGoods orderGoods, LineWarnCommonInfoDTO lineWarnCommonInfo) {
long totalTime = Duration.between(lineWarnCommonInfo.getPendingOrderTime(),
lineWarnCommonInfo.getTransportEndTime()).toMinutes();
int needTime = 0;
// 接单最长时间
long difTime = totalTime - needTime;
// 任务完成率
BigDecimal taskCompleteRatio = BigDecimal.ZERO;
List<LineWarnConfig> vehicleWarnConfigList = lineWarnConfigDao
.listByWarnType(LineWarnConfigEnum.WarnType.UNLOAD.getCode());
if (vehicleWarnConfigList.isEmpty()) {return;}
for (LineWarnConfig item : vehicleWarnConfigList) {
doTakeWarn(orderGoods, item,lineWarnCommonInfo.getPendingOrderTime(), difTime, taskCompleteRatio);
}
}
private void doTakeWarn(OrderGoods orderGoods, LineWarnConfig lineWarnConfig, LocalDateTime pendingOrderTime,
long difTime, BigDecimal taskCompleteRatio){
LineWarnInfo lineWarnInfo = lineWarnInfoDao
.findByOrderGoodsNoAndWarnConfigId(orderGoods.getOrderGoodsNo(), lineWarnConfig.getId()).orNull();
if (lineWarnInfo != null
&& Objects.equals(lineWarnInfo.getStatus(), LineWarnInfoEnum.Status.RESOLVE.getCode())){
return;
}
int time = lineWarnConfig.getTimeRatio().multiply(new BigDecimal(difTime)).intValue();
// 未达到时间占比
if (pendingOrderTime.plusMinutes(time).isBefore(LocalDateTime.now())){return;}
// 达到任务占比
if (lineWarnConfig.getTaskCompleteRatio().compareTo(taskCompleteRatio) >= 0) {return;}
// 更新
lineWarnCommonService.lineWarnInfoUpdate(orderGoods, lineWarnInfo, lineWarnConfig);
}
}
package com.clx.performance.service.impl.linewarn;
import com.alibaba.fastjson.JSON;
import com.clx.performance.common.MqDelay;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyLineWarnConstants;
import com.clx.performance.param.mq.linewarn.LineWarnLineWarnMqParam;
import com.clx.performance.param.mq.linewarn.LineWarnNoticeMqParam;
import com.clx.performance.param.mq.linewarn.LineWarnOrderGoodsAddMqParam;
import com.clx.performance.service.linewarn.LineWarnMqService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class VehicleWarnMqServiceImpl implements LineWarnMqService {
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public void orderGoodsAdd(String orderGoodsNo) {
LineWarnOrderGoodsAddMqParam mq = new LineWarnOrderGoodsAddMqParam();
mq.setOrderGoodsNo(orderGoodsNo);
MqDelay delay = new MqDelay<>(RabbitKeyLineWarnConstants.DEFAULT_EXCHANGE, RabbitKeyLineWarnConstants.ORDER_GOODS_ADD_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeyLineWarnConstants.DEFAULT_EXCHANGE, RabbitKeyLineWarnConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
@Override
public void lineWarn(String orderGoodsNo) {
LineWarnLineWarnMqParam mq = new LineWarnLineWarnMqParam();
mq.setOrderGoodsNo(orderGoodsNo);
MqDelay delay = new MqDelay<>(RabbitKeyLineWarnConstants.DEFAULT_EXCHANGE, RabbitKeyLineWarnConstants.LINE_WARN_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeyLineWarnConstants.DEFAULT_EXCHANGE, RabbitKeyLineWarnConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
@Override
public void lineWarnNotice(Integer infoId) {
LineWarnNoticeMqParam mq = new LineWarnNoticeMqParam();
mq.setInfoId(infoId);
MqDelay delay = new MqDelay<>(RabbitKeyLineWarnConstants.DEFAULT_EXCHANGE, RabbitKeyLineWarnConstants.LINE_WARN_NOTICE_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeyLineWarnConstants.DEFAULT_EXCHANGE, RabbitKeyLineWarnConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
}
package com.clx.performance.service.linewarn;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.model.linewarn.LineWarnConfig;
import com.clx.performance.model.linewarn.LineWarnInfo;
public interface LineWarnCommonService {
void lineWarnInfoUpdate(OrderGoods orderGoods, LineWarnInfo lineWarnInfo, LineWarnConfig lineWarnConfig);
}
package com.clx.performance.service.linewarn;
import com.clx.performance.dto.linewarn.LineWarnCommonInfoDTO;
import com.clx.performance.model.OrderGoods;
public interface LineWarnLoadWarnService {
void loadWarn(OrderGoods orderGoods, LineWarnCommonInfoDTO lineWarnCommonInfo);
}
package com.clx.performance.service.linewarn;
import com.clx.performance.param.mq.linewarn.LineWarnLineWarnMqParam;
import com.clx.performance.param.mq.linewarn.LineWarnNoticeMqParam;
import com.clx.performance.param.mq.linewarn.LineWarnOrderGoodsAddMqParam;
public interface LineWarnMqHandlerService {
void orderGoodsAdd(LineWarnOrderGoodsAddMqParam mq);
void lineWarn(LineWarnLineWarnMqParam mq);
void notice(LineWarnNoticeMqParam mq);
}
package com.clx.performance.service.linewarn;
public interface LineWarnMqService {
void orderGoodsAdd(String orderGoodsNo);
void lineWarn(String childNo);
void lineWarnNotice(Integer infoId);
}
package com.clx.performance.service.linewarn;
import com.clx.performance.dto.linewarn.LineWarnCommonInfoDTO;
import com.clx.performance.model.OrderGoods;
public interface LineWarnTakeWarnService {
void takeWarn(OrderGoods orderGoods, LineWarnCommonInfoDTO lineWarnCommonInfo);
}
package com.clx.performance.service.linewarn;
import com.clx.performance.dto.linewarn.LineWarnCommonInfoDTO;
import com.clx.performance.model.OrderGoods;
public interface LineWarnUnloadWarnService {
void unloadWarn(OrderGoods orderGoods, LineWarnCommonInfoDTO lineWarnCommonInfo);
}
package com.clx.performance.utils.gd;
import com.clx.performance.dto.gd.GdRouteDTO;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.utils.gps.GpsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.List;
@Slf4j
@Component
public class GdUtils {
private static final Integer SEC_FER_MIN = 60;
@Autowired
private GdService gdService;
/**
* 获取需要时间(min)
*/
public int getNeedTime(BigDecimal originLongitude, BigDecimal originLatitude,
BigDecimal destinationLongitude, BigDecimal destinationLatitude){
try {
List<GdRouteDTO> gdRouteDTOS = gdService.getRoute(originLongitude, originLatitude, destinationLongitude, destinationLatitude);
if (!gdRouteDTOS.isEmpty()){
return gdRouteDTOS.get(0).getDuration() /SEC_FER_MIN;
}
} catch (ServiceSystemException e) {
log.info("获取高德线路失败, msg:{}", e.getMessage());
}
return 0;
}
/**
* 获取需要时间(min)
*/
public int getNeedTime(BigDecimal[] currentPosition, BigDecimal destinationLongitude, BigDecimal destinationLatitude) {
if (currentPosition == null) {return 0;}
return getNeedTime(currentPosition[0], currentPosition[1], destinationLongitude, destinationLatitude);
}
/**
* 获取需要距离(m)
*/
public int getNeedDistance(BigDecimal[] currentPosition,
BigDecimal destinationLongitude, BigDecimal destinationLatitude){
int needDistance = 0;
if (currentPosition == null) {return 0;}
try {
List<GdRouteDTO> gdRouteDTOS = gdService.getRoute(currentPosition[0], currentPosition[1], destinationLongitude, destinationLatitude);
if (!gdRouteDTOS.isEmpty()){
needDistance = gdRouteDTOS.get(0).getDistance();
}
} catch (ServiceSystemException e) {
log.info("获取高德线路失败, msg:{}", e.getMessage());
}
return needDistance;
}
public Integer getDistance(BigDecimal[] currentPosition, BigDecimal destinationLongitude, BigDecimal destinationLatitude) {
if (currentPosition == null) {return null;}
return GpsUtil.distanceM(currentPosition[0], currentPosition[1], destinationLongitude, destinationLatitude);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论