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

Merge branch 'v14.4_vehicle_warn_20240425' into dev

package com.clx.performance.param.mq.trace;
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 TruckTraceSyncMqParam {
private String truckNo; //车牌号
private String beginTime; //开始时间
private String endTime; //结束时间
}
package com.clx.performance.constant;
/**
* @Author: aiqingguo
* @Description: 轨迹-mq
* @Date: 2023-10-19 15:10:10
* @Version: 1.0
*/
public class RabbitKeyTraceConstants {
private static final String PREFIX = "clx-performance.trace.";
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 RabbitKeyTraceConstants() {
}
/**
* 缺省交换机
*/
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 TRUCK_TRACE_SYNC_QUEUE = PREFIX +"truck.trace.update"+QUEUE;
public static final String TRUCK_TRACE_SYNC_ROUTING_KEY = PREFIX +"truck.trace.update"+QUEUE_ROUTING_KEY;
}
package com.clx.performance.esplus.mapper;
import com.clx.performance.esplus.model.DriverTraceESPlus;
import org.dromara.easyes.core.kernel.BaseEsMapper;
public interface DriverTraceESPlusMapper extends BaseEsMapper<DriverTraceESPlus> {
}
\ No newline at end of file
package com.clx.performance.esplus.mapper;
import com.clx.performance.esplus.model.TruckTraceESPlus;
import org.dromara.easyes.core.kernel.BaseEsMapper;
public interface TruckTraceESPlusMapper extends BaseEsMapper<TruckTraceESPlus> {
}
\ No newline at end of file
package com.clx.performance.esplus.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import org.dromara.easyes.annotation.IndexField;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType;
import org.elasticsearch.common.geo.GeoPoint;
import org.springframework.data.annotation.Id;
import java.math.BigDecimal;
@Data
@IndexName("clx_trace_driver_trace_index1")
public class DriverTraceESPlus {
@IndexId(type= IdType.CUSTOMIZE)
private String id;
@ApiModelProperty("用户编号")
private Long userNo;
@ApiModelProperty("1-正常上传,2-离线上传")
private Integer dataType;
@ApiModelProperty("位置")
private GeoPoint location;
@ApiModelProperty("定位时间")
private String positionTime;
@ApiModelProperty("添加时间")
private String createTime;
@ApiModelProperty("修改时间")
private String modifiedTime;
}
\ No newline at end of file
package com.clx.performance.esplus.model;
import lombok.Data;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.annotation.Settings;
import org.dromara.easyes.annotation.rely.IdType;
import org.elasticsearch.common.geo.GeoPoint;
import java.math.BigDecimal;
@Data
@IndexName(value = "quality_task_info", keepGlobalPrefix = true)
public class TruckTraceESPlus {
@IndexId(type= IdType.CUSTOMIZE)
private String id;
private String truckNo; //车辆编号
private BigDecimal angle; //角度
private BigDecimal speed; //速度
private BigDecimal mileage; //里程
private BigDecimal height; //高度
private GeoPoint location; //位置
private String gpsTime; //时间
private String createTime;
private String modifiedTime;
}
\ No newline at end of file
...@@ -3,6 +3,7 @@ package com.clx.performance.job; ...@@ -3,6 +3,7 @@ package com.clx.performance.job;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.clx.performance.constant.RedisConstants; import com.clx.performance.constant.RedisConstants;
import com.clx.performance.dto.zjxl.TruckTraceDTO; import com.clx.performance.dto.zjxl.TruckTraceDTO;
import com.clx.performance.service.trace.TruckTraceMqService;
import com.clx.performance.utils.LocalDateTimeUtils; import com.clx.performance.utils.LocalDateTimeUtils;
import com.clx.performance.utils.zjxl.ZjxlGpsService; import com.clx.performance.utils.zjxl.ZjxlGpsService;
import com.clx.user.feign.UserClxFeign; import com.clx.user.feign.UserClxFeign;
...@@ -34,6 +35,9 @@ public class TruckTraceJob { ...@@ -34,6 +35,9 @@ public class TruckTraceJob {
@Autowired @Autowired
RedisTemplate redisTemplate; RedisTemplate redisTemplate;
@Autowired
private TruckTraceMqService truckTraceMqService;
/** /**
* 驾驶证过期 * 驾驶证过期
...@@ -99,4 +103,27 @@ public class TruckTraceJob { ...@@ -99,4 +103,27 @@ public class TruckTraceJob {
} }
/**
* 车辆轨迹同步
*/
@XxlJob("truckTraceSync")
public void truckTraceSync() {
try {
List<String> truckNoList = new ArrayList<>();
log.info("车辆轨迹同步, size:{}", truckNoList.size());
for (String truckNo : truckNoList) {
LocalDateTime now = LocalDateTime.now();
// 发送mq (同步车辆轨迹)
truckTraceMqService.truckTracSync(truckNo, LocalDateTimeUtils.formatTime(now.minusSeconds(600)), LocalDateTimeUtils.formatTime(now));
}
} catch (Exception e) {
log.warn("车辆轨迹同步失败,异常原因:{}",e);
JobLog.error("车辆轨迹同步失败,异常原因=====================", e);
}
}
} }
package com.clx.performance.listener.trace;
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.RabbitKeyTraceConstants;
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 10:30:49
* @Version: 1.0
*/
@Slf4j
@Component
public class TraceDelayListener {
@Autowired
private RabbitTemplate rabbitTemplate;
@RabbitListener(queues = RabbitKeyTraceConstants.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.trace;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyTraceConstants;
import com.clx.performance.param.mq.trace.TruckTraceSyncMqParam;
import com.clx.performance.service.trace.TruckTraceMqHandlerService;
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 TruckTraceSyncListener {
@Autowired
private TruckTraceMqHandlerService truckTraceMqHandlerService;
@RabbitListener(queues = RabbitKeyTraceConstants.TRUCK_TRACE_SYNC_QUEUE)
public void process(Message message) {
try{
log.info("轨迹, 车辆轨迹同步, message:{}", new String(message.getBody()));
process(JSON.parseObject(new String(message.getBody()), new TypeReference<MqWrapper<TruckTraceSyncMqParam>>(){}).getData());
}catch (Exception e){
log.info("轨迹, 车辆轨迹同步失败",e);
}
}
private void process(TruckTraceSyncMqParam mq){
truckTraceMqHandlerService.truckTracSync(mq);
}
}
package com.clx.performance.service.impl.trace;
import com.clx.performance.dto.zjxl.TruckTraceDTO;
import com.clx.performance.esplus.mapper.DriverTraceESPlusMapper;
import com.clx.performance.esplus.mapper.TruckTraceESPlusMapper;
import com.clx.performance.esplus.model.TruckTraceESPlus;
import com.clx.performance.param.mq.trace.TruckTraceSyncMqParam;
import com.clx.performance.service.trace.TruckTraceMqHandlerService;
import com.clx.performance.utils.zjxl.ZjxlGpsService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.common.geo.GeoPoint;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class TruckTraceMqHandlerServiceImpl implements TruckTraceMqHandlerService {
@Autowired
private ZjxlGpsService zjxlGpsService;
@Autowired
private TruckTraceESPlusMapper truckTraceESPlusMapper;
@Override
public void truckTracSync(TruckTraceSyncMqParam mq) {
List<TruckTraceDTO> list = zjxlGpsService.getTruckTrace(mq.getTruckNo(), mq.getBeginTime(), mq.getEndTime());
if (list.isEmpty()) {return;}
List<TruckTraceESPlus> esList = new ArrayList<>();
for (TruckTraceDTO item : list) {
TruckTraceESPlus es = new TruckTraceESPlus();
es.setTruckNo(item.getTruckNo());
es.setAngle(item.getAngle());
es.setHeight(item.getHeight());
es.setLocation(new GeoPoint(item.getLocation()[0].doubleValue(), item.getLocation()[1].doubleValue()));
es.setGpsTime(item.getGpsTime());
es.setMileage(item.getMileage());
es.setSpeed(item.getSpeed());
esList.add(es);
}
// 保存
truckTraceESPlusMapper.insertBatch(esList);
}
}
package com.clx.performance.service.impl.trace;
import com.alibaba.fastjson.JSON;
import com.clx.performance.common.MqDelay;
import com.clx.performance.common.MqWrapper;
import com.clx.performance.constant.RabbitKeyTraceConstants;
import com.clx.performance.param.mq.trace.TruckTraceSyncMqParam;
import com.clx.performance.service.trace.TruckTraceMqService;
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 TruckTraceMqServiceImpl implements TruckTraceMqService {
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public void truckTracSync(String truckNo, String beginTime, String endTime) {
TruckTraceSyncMqParam mq = new TruckTraceSyncMqParam();
mq.setTruckNo(truckNo);
mq.setBeginTime(beginTime);
mq.setEndTime(endTime);
MqDelay delay = new MqDelay<>(RabbitKeyTraceConstants.DEFAULT_EXCHANGE, RabbitKeyTraceConstants.TRUCK_TRACE_SYNC_ROUTING_KEY, new MqWrapper<>(mq));
Message message = MessageBuilder.withBody(JSON.toJSONString(new MqWrapper<>(delay)).getBytes()).build();
message.getMessageProperties().setExpiration("5000");
rabbitTemplate.send(RabbitKeyTraceConstants.DEFAULT_EXCHANGE, RabbitKeyTraceConstants.DEFAULT_DELAY_ROUTING_KEY, message);
}
}
package com.clx.performance.service.trace;
import com.clx.performance.param.mq.trace.TruckTraceSyncMqParam;
public interface TruckTraceMqHandlerService {
void truckTracSync(TruckTraceSyncMqParam mq);
}
package com.clx.performance.service.trace;
public interface TruckTraceMqService {
void truckTracSync(String truckNo, String beginTime, String endTime);
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论