提交 5200a89e authored 作者: 刘海泉's avatar 刘海泉

Merge remote-tracking branch 'origin/v15.4_truck_fleet_20240513'

# Conflicts: # performance-api/src/main/java/com/clx/performance/vo/app/OrderChildVO.java # performance-web/pom.xml # performance-web/src/main/java/com/clx/performance/service/impl/OrderChildServiceImpl.java
......@@ -83,4 +83,20 @@ public enum DriverTruckEnum {
return Arrays.stream(values()).filter(e -> e.code == code).findFirst();
}
}
//车辆状态:1空车 2重车
@Getter
@AllArgsConstructor
public enum TraceTruckStatus {
EMPTY(1, "空车"),
HEAVY(2, "重车");
private final Integer code;
private final String msg;
public static Optional<TraceTruckStatus> getByCode(int code) {
return Arrays.stream(values()).filter(e -> e.code == code).findFirst();
}
}
}
......@@ -34,10 +34,8 @@ public enum IntegralRecordEnum {
// REPORT_TRUCK_INFO(50, "提交基础信息"),
REPORT_REFUEL(51, "油表上报"),
REPORT_TRAFFIC(52, "上报交通拥堵"),
REPORT_SEND_ADDRESS_WAIT(53, "上报货源地需要排队"),
REPORT_SEND_ADDRESS_NO_WAIT(54, "上报货源地无需排队"),
REPORT_RECEIVE_ADDRESS_WAIT(55, "上报目的地需要排队"),
REPORT_RECEIVE_ADDRESS_NO_WAIT(56, "上报目的地无需排队"),
REPORT_SEND_ADDRESS_WAIT(53, "上报货源地排队"),
REPORT_RECEIVE_ADDRESS_WAIT(55, "上报目的地排队"),
REPORT_QUALITY(57, "上报煤炭质量问题"),
REPORT_ABNORMAL(58, "上报拉运异常问题"),
REPORT_SEND_ADDRESS_INFO(59, "上报货源地情况"),
......@@ -58,9 +56,7 @@ public enum IntegralRecordEnum {
Type.REPORT_REFUEL.value,
Type.REPORT_TRAFFIC.value,
Type.REPORT_SEND_ADDRESS_WAIT.value,
Type.REPORT_SEND_ADDRESS_NO_WAIT.value,
Type.REPORT_RECEIVE_ADDRESS_WAIT.value,
Type.REPORT_RECEIVE_ADDRESS_NO_WAIT.value,
Type.REPORT_QUALITY.value,
Type.REPORT_ABNORMAL.value
......
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 childNo; //运单编号
private String truckNo; //车牌号
private String beginTime; //开始时间
private String endTime; //结束时间
}
package com.clx.performance.param.pc.trace;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @ClassName QueryTraceParam
* @Description
* @Author kavin
* @Date 2024/5/13 18:07
* @Version 1.0
*/
@Getter
@Setter
public class QueryTraceParam {
@ApiModelProperty("运单编号")
private String childNo;
@NotBlank(message = "车牌号不能为空")
@ApiModelProperty("车牌号")
private String truckNo;
@NotBlank(message = "开始时间不能为空")
@ApiModelProperty("开始时间")
private String beginTime;
@NotBlank(message = "结束时间不能为空")
@ApiModelProperty("结束时间")
private String endTime;
}
package com.clx.performance.param.temp;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
import java.util.List;
@Setter
@Getter
@ToString
@NoArgsConstructor
public class DriverTraceAddParam {
@ApiModelProperty(value = "车辆轨迹列表")
private List<DriverTraceItem> traceList;
@Setter
@Getter
@ToString
@NoArgsConstructor
public static class DriverTraceItem{
@ApiModelProperty(value = "用户编码", example = "10000")
private Long userNo;
@ApiModelProperty(value = "1-正常上传,2-离线上传", example = "1")
private Integer dataType;
@ApiModelProperty(value = "位置 [123.45, 12.34]")
private BigDecimal[] location;
@ApiModelProperty(value = "时间")
private String gpsTime;
@ApiModelProperty(value = "速度", example = "12.34")
private BigDecimal speed;
}
}
package com.clx.performance.param.temp;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import java.math.BigDecimal;
import java.util.List;
@Setter
@Getter
@ToString
@NoArgsConstructor
public class TruckTraceAddParam {
@ApiModelProperty(value = "车辆轨迹列表")
private List<TruckTraceItem> traceList;
@Setter
@Getter
@ToString
@NoArgsConstructor
public static class TruckTraceItem{
@ApiModelProperty(value = "车辆编号", example = "京A12345")
private String truckNo;
@ApiModelProperty(value = "正北方向夹角", example = "12.34")
private BigDecimal angle;
@ApiModelProperty(value = "速度", example = "12.34")
private BigDecimal speed;
@ApiModelProperty(value = "里程", example = "12.34")
private BigDecimal mileage;
@ApiModelProperty(value = "海拔", example = "12.34")
private BigDecimal height;
@ApiModelProperty(value = "位置 [123.45, 12.34]")
private BigDecimal[] location;
@ApiModelProperty(value = "时间")
private String gpsTime;
}
}
......@@ -216,5 +216,8 @@ public class OrderChildVO {
@ApiModelProperty("可装车时间段结束")
private String loadEndTime;
@ApiModelProperty(value = "车辆未开启中交兴路的提示信息")
private String notOpenZJXLMsg;
}
\ No newline at end of file
......@@ -115,5 +115,12 @@ public class CarrierOrderChildDetailVO {
@ApiModelProperty(value = "完成时间", example = "2020-01-01 10:10:10")
private String finishTime;
@ApiModelProperty(value = "接单时间", example = "2020-01-01 10:10:10")
private String createTime;
@ApiModelProperty(value = "取消时间", example = "2020-01-01 10:10:10")
private String cancelTime;
}
\ No newline at end of file
......@@ -122,14 +122,13 @@ public class AppIntegralRuleVO {
private Integer integralRefuel;
// @ApiModelProperty(value = "上报交通拥堵积分x")
// private Integer integralTraffic;
@ApiModelProperty(value = "上报货源地需要排队积分x")
@ApiModelProperty(value = "上报货源地排队积分x")
private Integer integralSendAddressWait;
@ApiModelProperty(value = "上报货源地无需排队积分x")
private Integer integralSendAddressNoWait;
@ApiModelProperty(value = "上报目的地需要排队积分x")
private Integer integralReceiveAddressWait;
@ApiModelProperty(value = "上报目的地无需排队积分x")
private Integer integralReceiveAddressNoWait;
@ApiModelProperty(value = "上报煤炭质量问题积分x")
private Integer integralQuality;
@ApiModelProperty(value = "上报拉运异常问题积分x")
......
package com.clx.performance.vo.pc.trace;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.math.BigDecimal;
@Getter
@Setter
@NoArgsConstructor
public class DriverTraceVO {
@ApiModelProperty(value = "经度")
private BigDecimal longitude;
@ApiModelProperty(value = "纬度")
private BigDecimal latitude;
@ApiModelProperty(value = "GPS 时间")
private String gpsTime;
@ApiModelProperty(value = "速度")
private BigDecimal speed;
@ApiModelProperty(value = "停留时长(min)", example = "12.3")
private BigDecimal stayTime=BigDecimal.ZERO;
@ApiModelProperty(value = "停留结束时间")
private String stayEndTime;
@ApiModelProperty(value = "车辆状态:1空车 2重车", example = "1")
private Integer truckStatus;
}
package com.clx.performance.vo.pc.trace;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.math.BigDecimal;
@Getter
@Setter
@NoArgsConstructor
public class DriverTruckTraceVO {
@ApiModelProperty(value = "正北方向夹角", example = "12.34")
private BigDecimal angle;
@ApiModelProperty(value = "GPS 速度", example = "12.34")
private BigDecimal speed;
@ApiModelProperty(value = "里程", example = "12.34")
private BigDecimal mileage;
@ApiModelProperty(value = "海拔", example = "12.34")
private BigDecimal height;
@ApiModelProperty(value = "经度", example = "123.45")
private BigDecimal longitude;
@ApiModelProperty(value = "纬度", example = "12.34")
private BigDecimal latitude;
@ApiModelProperty(value = "GPS 时间")
private String gpsTime;
@ApiModelProperty(value = "停留结束时间")
private String stayEndTime;
@ApiModelProperty(value = "停留时长(min)", example = "12.3")
private BigDecimal stayTime=BigDecimal.ZERO;
@ApiModelProperty(value = "车辆状态:1空车 2重车", example = "1")
private Integer truckStatus;
}
package com.clx.performance.vo.pc.trace;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.List;
/**
* @Author: aiqinguo
* @Description: 车辆轨迹
* @Date: 2024/04/25 17:09:33
* @Version: 1.0
*/
@Getter
@Setter
@NoArgsConstructor
public class OrderChildTraceVO {
@ApiModelProperty(value = "车辆轨迹列表")
List<List<DriverTruckTraceVO>> truckTraceList;
@ApiModelProperty(value = "司机轨迹列表")
List<List<DriverTraceVO>> driverTraceList;
}
\ No newline at end of file
......@@ -101,6 +101,16 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
......@@ -265,6 +275,26 @@
<groupId>com.clx.cy</groupId>
<artifactId>open-sdk</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.14.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.14.0</version>
</dependency>
<dependency>
<groupId>org.dromara.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>2.0.0-beta7</version>
</dependency>
</dependencies>
......
package com.clx.performance;
import com.msl.common.config.ViewScan;
import org.dromara.easyes.starter.register.EsMapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
......@@ -18,6 +19,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
@ComponentScan({"com.clx.performance.*", "com.msl.*"})
@EnableFeignClients(basePackages = {"com.msl.*", "com.clx.performance.*", "com.clx.order.*", "com.clx.user.*", "com.clx.message.*"})
@ViewScan(basePackage = "com.clx.user.view")
@EsMapperScan("com.clx.performance.esplus.mapper")
public class PerformanceApplication {
public static void main(String[] args) {
......
package com.clx.performance.config;
import com.clx.performance.constant.RabbitKeyTraceConstants;
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 RabbitTraceConfig {
@Bean
public DirectExchange traceDefaultExchange() {
return new DirectExchange(RabbitKeyTraceConstants.DEFAULT_EXCHANGE);
}
@Bean
public Queue traceDefaultDelayQueue() {
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", RabbitKeyTraceConstants.DEFAULT_EXCHANGE);
params.put("x-dead-letter-routing-key", RabbitKeyTraceConstants.DEFAULT_DEAD_ROUTING_KEY);
return new Queue(RabbitKeyTraceConstants.DEFAULT_DELAY_QUEUE, true, false, false, params);
}
@Bean
public Binding traceDefaultDelayQueueBinding() {
return BindingBuilder.bind(traceDefaultDelayQueue()).to(traceDefaultExchange()).with(RabbitKeyTraceConstants.DEFAULT_DELAY_ROUTING_KEY);
}
@Bean
public Queue traceDefaultDeadQueue() {
return new Queue(RabbitKeyTraceConstants.DEFAULT_DEAD_QUEUE);
}
@Bean
public Binding traceDefaultDeadQueueBinding() {
return BindingBuilder.bind(traceDefaultDeadQueue()).to(traceDefaultExchange()).with(RabbitKeyTraceConstants.DEFAULT_DEAD_ROUTING_KEY);
}
/**
* 统计更新
*/
@Bean
public Queue traceTruckTraceSyncQueue() {
return new Queue(RabbitKeyTraceConstants.TRUCK_TRACE_SYNC_QUEUE);
}
@Bean
public Binding traceTruckTraceSyncQueueBinding() {
return BindingBuilder.bind(traceTruckTraceSyncQueue()).to(traceDefaultExchange()).with(RabbitKeyTraceConstants.TRUCK_TRACE_SYNC_ROUTING_KEY);
}
}
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.controller.pc.trace;
import com.clx.performance.param.pc.trace.QueryTraceParam;
import com.clx.performance.service.trace.TraceMonitorService;
import com.clx.performance.service.trace.TruckTraceService;
import com.clx.performance.vo.pc.trace.OrderChildTraceVO;
import com.msl.common.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
/**
* @ClassName TraceController
* @Description
* @Author kavin
* @Date 2024/5/13 17:54
* @Version 1.0
*/
@Slf4j
@RestController
@RequestMapping("/pc/carrier/trace/monitor")
@Validated
@Api(tags = "PC-承运轨迹监控")
@AllArgsConstructor
public class TraceController{
private final TraceMonitorService traceMonitorService;
@ApiOperation(value = "运单轨迹监控", notes = "<br>By:刘海泉")
@PostMapping("/getOrderChildTrace")
public Result<OrderChildTraceVO> getOrderChildTrace(@RequestBody @Validated QueryTraceParam param) {
return Result.ok(traceMonitorService.getOrderChildTrace(param));
}
@ApiOperation(value = "车辆轨迹监控", notes = "<br>By:刘海泉")
@PostMapping("/getTruckTrace")
public Result<OrderChildTraceVO> getTruckTrace(@RequestBody @Validated QueryTraceParam param) {
return Result.ok(traceMonitorService.getTruckTrace(param));
}
}
\ No newline at end of file
package com.clx.performance.controller.temp;
import com.clx.performance.param.temp.DriverTraceAddParam;
import com.clx.performance.param.temp.TruckTraceAddParam;
import com.clx.performance.service.trace.TruckTraceService;
import com.clx.performance.vo.pc.trace.DriverTraceVO;
import com.clx.performance.vo.pc.trace.DriverTruckTraceVO;
import com.msl.common.result.Result;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.List;
/**
* @Author: aiqingguo
* @Description: 临时接口
* @Date: 2023-8-21 12:10:16
* @Version: 1.0
*/
@Slf4j
@RestController
@RequestMapping(value="/temp/trace")
public class TempTraceController {
@Autowired
private TruckTraceService truckTraceService;
@ApiOperation(value = "车辆轨迹同步", notes = "<br>By:艾庆国")
@PostMapping("/truckTraceSync")
public Result truckTraceSync(@RequestBody TruckTraceAddParam param) {
truckTraceService.truckTraceSave(param);
return Result.ok();
}
@ApiOperation(value = "查询车辆轨迹", notes = "<br>By:艾庆国")
@PostMapping("/listTruckTraceByTime")
public Result<List<DriverTruckTraceVO>> listTruckTraceByTime(String truckNo, String beginTime, String endTime) {
return Result.ok(truckTraceService.listTruckTraceByTime(truckNo,beginTime,endTime));
}
@ApiOperation(value = "司机轨迹同步", notes = "<br>By:艾庆国")
@PostMapping("/driverTraceSync")
public Result driverTraceSync(@RequestBody DriverTraceAddParam param) {
truckTraceService.driverTraceSave(param);
return Result.ok();
}
@ApiOperation(value = "查询司机轨迹", notes = "<br>By:艾庆国")
@PostMapping("/listDriverTraceByTime")
public Result<List<DriverTraceVO>> listDriverTraceByTime(Long userNo, String beginTime, String endTime) {
return Result.ok(truckTraceService.listDriverTraceByTime(userNo,beginTime,endTime));
}
@ApiOperation(value = "查询车辆5分钟内的最新位置", notes = "<br>By:刘海泉")
@PostMapping("/getTruckPosition")
public Result<BigDecimal[]> getTruckPosition(String truckNo) {
return Result.ok(truckTraceService.getCurrentTruckPosition(truckNo));
}
}
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.NoArgsConstructor;
import lombok.Setter;
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 java.math.BigDecimal;
@Data
@IndexName("clx_trace_driver_trace_index1")
public class DriverTraceESPlus {
@IndexId(type= IdType.UUID)
private String id;
@ApiModelProperty("用户编号")
private Long userNo;
@ApiModelProperty("1-正常上传,2-离线上传")
private Integer dataType;
@IndexField(fieldType = FieldType.GEO_POINT)
private BigDecimal[] location; //位置
@ApiModelProperty("速度")
private BigDecimal speed;
@IndexField(fieldType = FieldType.DATE)
private String positionTime;
@IndexField(fieldType = FieldType.DATE)
private String createTime;
@IndexField(fieldType = FieldType.DATE)
private String modifiedTime;
}
\ No newline at end of file
package com.clx.performance.esplus.model;
import lombok.Data;
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 java.math.BigDecimal;
@Data
@IndexName(value = "clx_truck_trace")
public class TruckTraceESPlus {
@IndexId(type= IdType.UUID)
private String id;
@IndexField(fieldType = FieldType.KEYWORD)
private String truckNo; //车辆编号
private BigDecimal angle; //agl
private BigDecimal speed; //速度
private BigDecimal mileage; //里程
private BigDecimal height; //海拔
private BigDecimal[] location; //位置
@IndexField(fieldType = FieldType.DATE)
private String gpsTime; //时间
private String createTime;
}
\ No newline at end of file
package com.clx.performance.job.trace;
import com.clx.performance.service.trace.TruckTraceMqService;
import com.clx.performance.utils.LocalDateTimeUtils;
import com.clx.user.feign.UserClxFeign;
import com.msl.common.job.JobLog;
import com.msl.common.result.Result;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
@Slf4j
@Component
@AllArgsConstructor
public class PlatTruckTraceJob {
private final UserClxFeign userClxFeign;
private final TruckTraceMqService truckTraceMqService;
/**
* 车辆轨迹同步
*/
@XxlJob("platTruckTraceSync")
public void platTruckTraceSync() {
try {
Result<List<String>> result = userClxFeign.getPlatformTruckList();
if(result.succeed()){
log.info("平台车辆轨迹开始同步, size:{}", result.getData().size());
for (String truckNo : result.getData()) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime beginTime = now.minusSeconds(600);
// 发送mq (同步车辆轨迹)
truckTraceMqService.truckTracSync( truckNo, LocalDateTimeUtils.formatTime(beginTime), LocalDateTimeUtils.formatTime(now));
}
log.info("平台车辆轨迹结束同步================");
}
} catch (Exception e) {
log.warn("平台车辆轨迹同步失败,异常原因:{}", ExceptionUtils.getStackTrace(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);
}
}
......@@ -89,6 +89,12 @@ public class IntegralRecordServiceImpl implements IntegralRecordService {
return;
}
//超过上限只能增加积分上限
if (sum + integral > ruleInfo.getDriverReportRule().getIntegralLimit()){
integral = ruleInfo.getDriverReportRule().getIntegralLimit() - sum;
}
// 更新积分
statistics.setIntegral(statistics.getIntegral()+integral);
integralStatisticsDao.updateIntegral(statistics);
......
......@@ -160,7 +160,6 @@ public class IntegralTruckServiceImpl implements IntegralTruckService {
@Override
public IPage<IntegralTruckVO> driverPageTruckRank(DriverPageIntegralTruckRankParam param) {
String time = LocalDateTimeUtils.formatTime(LocalDateTimeUtils.getStartWeek().minusDays(7));
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
Long userNo = loginUserInfo.getUserNo();
......@@ -172,6 +171,7 @@ public class IntegralTruckServiceImpl implements IntegralTruckService {
param.setTruckNoList(truckNoList);
param.setTime(LocalDateTimeUtils.formatTime(LocalDateTimeUtils.getStartWeek()));
param.setStatisticsDate(time);
IPage<IntegralTruckVO> page = integralTruckDao.driverPageTruckRank(param);
truckNoList = page.getRecords().stream().map(item -> item.getTruckNo()).collect(Collectors.toList());
......@@ -212,9 +212,7 @@ public class IntegralTruckServiceImpl implements IntegralTruckService {
IntegralRecordEnum.Type.REPORT_REFUEL.getValue(),
IntegralRecordEnum.Type.REPORT_TRAFFIC.getValue(),
IntegralRecordEnum.Type.REPORT_SEND_ADDRESS_WAIT.getValue(),
IntegralRecordEnum.Type.REPORT_SEND_ADDRESS_NO_WAIT.getValue(),
IntegralRecordEnum.Type.REPORT_RECEIVE_ADDRESS_WAIT.getValue(),
IntegralRecordEnum.Type.REPORT_RECEIVE_ADDRESS_NO_WAIT.getValue(),
IntegralRecordEnum.Type.REPORT_QUALITY.getValue(),
IntegralRecordEnum.Type.REPORT_ABNORMAL.getValue(),
IntegralRecordEnum.Type.REPORT_SEND_ADDRESS_INFO.getValue(),
......
package com.clx.performance.service.impl;
import cn.hutool.json.JSONUtil;
import cn.hutool.core.util.ArrayUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.order.enums.OrderEnum;
......@@ -36,9 +37,11 @@ import com.clx.performance.param.pc.PagePoundAuditParam;
import com.clx.performance.service.*;
import com.clx.performance.service.breakcontract.BreakContractDriverRecordService;
import com.clx.performance.service.child.OrderChildPostService;
import com.clx.performance.service.impl.trace.TruckTraceServiceImpl;
import com.clx.performance.service.settle.SettlementDriverDetailService;
import com.clx.performance.service.settle.SettlementMqService;
import com.clx.performance.service.settle.SettlementOwnerDetailService;
import com.clx.performance.service.trace.TruckTraceService;
import com.clx.performance.struct.*;
import com.clx.performance.utils.gd.GdService;
import com.clx.performance.utils.spring.ApplicationContextUtils;
......@@ -62,6 +65,7 @@ import com.msl.user.utils.TokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
......@@ -182,6 +186,9 @@ public class OrderChildServiceImpl implements OrderChildService {
@Autowired
private OrderChildLoanComponent orderChildLoanComponent;
@Autowired
private TruckTraceService truckTraceService;
@Override
public SaveOrderChildVO saveOrderChild(OrderChildSaveParam param) {
......@@ -577,9 +584,11 @@ public class OrderChildServiceImpl implements OrderChildService {
PerformanceResultEnum.DATA_NOT_FIND);
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).orElseThrow(
PerformanceResultEnum.DATA_NOT_FIND);
double [] currentTruckPosition = getCurrentTruckPosition(orderChild.getTruckNo(),param);
double distance = GpsUtil.distance(orderGoods.getSendLongitude().doubleValue(),
orderGoods.getSendLatitude().doubleValue(), param.getLongitude().doubleValue(),
param.getLatitude().doubleValue()) / 1000;
orderGoods.getSendLatitude().doubleValue(), currentTruckPosition[0], currentTruckPosition[1]) / 1000;
if (distance > orderInfo.getSendDriverArriveRange().doubleValue()) {
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_ARRIVE_SEND_ADDRESS_DISTANCE_ERROR);
}
......@@ -595,6 +604,22 @@ public class OrderChildServiceImpl implements OrderChildService {
orderChildMqService.orderChildArriveSendAddress(orderChild.getChildNo());
}
//首先获取中交的车来那个经纬度信息,不存在则使用app传过来的经纬度
private double[] getCurrentTruckPosition(String truckNo,PositionParam param) {
double longitude;
double latitude;
//首先获取中交的车来那个经纬度信息,不存在则使用app传过来的经纬度
BigDecimal[] currentTruckPosition = truckTraceService.getCurrentTruckPosition(truckNo);
if(ArrayUtils.isNotEmpty(currentTruckPosition)){
longitude = currentTruckPosition[0].doubleValue();
latitude = currentTruckPosition[1].doubleValue();
}else{
longitude = param.getLongitude().doubleValue();
latitude = param.getLatitude().doubleValue();
}
return new double[]{longitude, latitude};
}
@Override
@Transactional(rollbackFor = Exception.class)
......@@ -657,9 +682,13 @@ public class OrderChildServiceImpl implements OrderChildService {
PerformanceResultEnum.DATA_NOT_FIND);
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).orElseThrow(
PerformanceResultEnum.DATA_NOT_FIND);
double [] currentTruckPosition = getCurrentTruckPosition(orderChild.getTruckNo(),param);
double distance = GpsUtil.distance(orderGoods.getReceiveLongitude().doubleValue(),
orderGoods.getReceiveLatitude().doubleValue(), param.getLongitude().doubleValue(),
param.getLatitude().doubleValue()) / 1000;
orderGoods.getReceiveLatitude().doubleValue(),currentTruckPosition[0],
currentTruckPosition[1]) / 1000;
if (distance > orderInfo.getReveiveDriverArriveRange().doubleValue()) {
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_ARRIVE_RECEIVE_ADDRESS_DISTANCE_ERROR);
}
......@@ -1417,10 +1446,24 @@ public class OrderChildServiceImpl implements OrderChildService {
result.setSettlementFreight(settlementOwnerDetail.getSettlementFreight());
}
//查询进行中的运单车辆是否开启了中交兴路
result.setNotOpenZJXLMsg(isOpenZJXL(orderChild.getStatus(),orderChild.getTruckNo()));
return result;
}
//查看运单车辆是否开启了中交兴路
public String isOpenZJXL(Integer orderChildStatus,String truckNo){
if(orderChildStatus <= OrderChildEnum.Status.UNLOAD.getCode()){
BigDecimal[] currentTruckPosition = truckTraceService.getCurrentTruckPosition(truckNo);
if(Objects.isNull(currentTruckPosition)){
return "为保证您正常拉运及接单,请勿关闭车载定位设备";
}
}
return StringUtils.EMPTY;
}
@Override
public OrderChildVO getOwnerOrderChildInfo(String childNo) {
OrderChild orderChild = orderChildDao.getByChildNo(childNo).orElseThrow(
......
......@@ -133,23 +133,29 @@ public class CollectWaitReportServiceImpl implements CollectWaitReportService {
// 保存积分
if (Objects.equals(collectTruckWait.getReportType(), CollectTruckWait.ReportType.LOAD.getCode())) {
if (Objects.equals(collectTruckWait.getWaitType(), CollectTruckWaitEnum.waitType.INNER.getCode())
/* if (Objects.equals(collectTruckWait.getWaitType(), CollectTruckWaitEnum.waitType.INNER.getCode())
|| Objects.equals(collectTruckWait.getWaitType(), CollectTruckWaitEnum.waitType.OUTER.getCode())) {
integralRecordService.addDriverReportRecord(ruleInfo, collectTruckWait.getTruckNo(), IntegralRecordEnum.Type.REPORT_SEND_ADDRESS_WAIT.getValue(),
ruleInfo.getDriverReportRule().getIntegralSendAddressWait(), IntegralRecordEnum.Type.REPORT_SEND_ADDRESS_WAIT.getMsg());
} else {
integralRecordService.addDriverReportRecord(ruleInfo, collectTruckWait.getTruckNo(), IntegralRecordEnum.Type.REPORT_SEND_ADDRESS_NO_WAIT.getValue(),
ruleInfo.getDriverReportRule().getIntegralSendAddressNoWait(), IntegralRecordEnum.Type.REPORT_SEND_ADDRESS_NO_WAIT.getMsg());
}
}*/
integralRecordService.addDriverReportRecord(ruleInfo, collectTruckWait.getTruckNo(), IntegralRecordEnum.Type.REPORT_SEND_ADDRESS_WAIT.getValue(),
ruleInfo.getDriverReportRule().getIntegralSendAddressWait(), IntegralRecordEnum.Type.REPORT_SEND_ADDRESS_WAIT.getMsg());
}else {
if (Objects.equals(collectTruckWait.getWaitType(), CollectTruckWaitEnum.waitType.INNER.getCode())
/* if (Objects.equals(collectTruckWait.getWaitType(), CollectTruckWaitEnum.waitType.INNER.getCode())
|| Objects.equals(collectTruckWait.getWaitType(), CollectTruckWaitEnum.waitType.OUTER.getCode())) {
integralRecordService.addDriverReportRecord(ruleInfo, collectTruckWait.getTruckNo(), IntegralRecordEnum.Type.REPORT_RECEIVE_ADDRESS_WAIT.getValue(),
ruleInfo.getDriverReportRule().getIntegralReceiveAddressWait(), IntegralRecordEnum.Type.REPORT_RECEIVE_ADDRESS_WAIT.getMsg());
} else {
integralRecordService.addDriverReportRecord(ruleInfo, collectTruckWait.getTruckNo(), IntegralRecordEnum.Type.REPORT_RECEIVE_ADDRESS_NO_WAIT.getValue(),
ruleInfo.getDriverReportRule().getIntegralReceiveAddressNoWait(), IntegralRecordEnum.Type.REPORT_RECEIVE_ADDRESS_NO_WAIT.getMsg());
}
}*/
integralRecordService.addDriverReportRecord(ruleInfo, collectTruckWait.getTruckNo(), IntegralRecordEnum.Type.REPORT_RECEIVE_ADDRESS_WAIT.getValue(),
ruleInfo.getDriverReportRule().getIntegralReceiveAddressWait(), IntegralRecordEnum.Type.REPORT_RECEIVE_ADDRESS_WAIT.getMsg());
}
}
......
package com.clx.performance.service.impl.trace;
import com.clx.order.enums.ResultEnum;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.enums.DriverTruckEnum;
import com.clx.performance.model.OrderChild;
import com.clx.performance.param.pc.trace.QueryTraceParam;
import com.clx.performance.service.trace.TraceMonitorService;
import com.clx.performance.service.trace.TruckTraceService;
import com.clx.performance.utils.LocalDateTimeUtils;
import com.clx.performance.vo.pc.trace.DriverTraceVO;
import com.clx.performance.vo.pc.trace.DriverTruckTraceVO;
import com.clx.performance.vo.pc.trace.OrderChildTraceVO;
import com.msl.common.exception.ServiceSystemException;
import com.msl.common.utils.DateUtils;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
@Slf4j
@Service
@AllArgsConstructor
public class TraceMonitorServiceImpl implements TraceMonitorService {
private final TruckTraceService truckTraceService;
private final OrderChildDao orderChildDao;
//private final TruckFeign truckFeign;
private final int TRACE_DAY_MAX = 3;
@Override
public OrderChildTraceVO getOrderChildTrace(QueryTraceParam param) {
if(StringUtils.isBlank(param.getChildNo())){
throw new ServiceSystemException(ResultEnum.PARAM_ERROR,"运单编号不能为空");
}
checkParam(param);
OrderChild child = orderChildDao.getByChildNo(param.getChildNo()).orElseThrow(ResultEnum.DATA_NOT_FIND,
"运单数据不存在");
List<DriverTruckTraceVO> truckTrace = truckTraceService.listTruckTraceByTime(param.getTruckNo(),param.getBeginTime(),param.getEndTime());
// 接单重车、卸车空车
for (DriverTruckTraceVO item : truckTrace) {
item.setTruckStatus(DriverTruckEnum.TraceTruckStatus.HEAVY.getCode());
if (child.getCancelTime() != null){
if (LocalDateTimeUtils.parseTime(item.getGpsTime()).isAfter(child.getCancelTime())){
item.setTruckStatus(DriverTruckEnum.TraceTruckStatus.EMPTY.getCode());}
}
if (child.getUnloadTime() != null){
if (LocalDateTimeUtils.parseTime(item.getGpsTime()).isAfter(child.getUnloadTime())){
item.setTruckStatus(DriverTruckEnum.TraceTruckStatus.EMPTY.getCode());}
}
}
List<DriverTraceVO> driverTrace = truckTraceService.listDriverTraceByTime(child.getDriverUserNo(),param.getBeginTime(),param.getEndTime());
OrderChildTraceVO result = new OrderChildTraceVO();
result.setDriverTraceList(truckTraceService.splitDriverTrace(driverTrace));
result.setTruckTraceList(truckTraceService.splitTruckTrace(truckTrace));
return result;
}
@Override
public OrderChildTraceVO getTruckTrace(QueryTraceParam param) {
checkParam(param);
//查询车辆的车主信息
/* Result<TruckOwnerInfoVO> result = truckFeign.getTruckOwnerInfo(
param.getTruckNo());
log.info("查询车辆车主信息,车牌号:{},结果:{}",param.getTruckNo(),result);
if(!result.succeed() || Objects.isNull(result.getData())){
throw new ServiceSystemException(ResultEnum.DATA_NOT_FIND,"未查询到车辆车主信息");
}
long userNo = result.getData().getUserNo();*/
return this.getTrace(null,param.getTruckNo(),param.getBeginTime(),param.getEndTime());
}
private OrderChildTraceVO getTrace(Long userNo,String truckNo,String beginTime,String endTime){
OrderChildTraceVO result = new OrderChildTraceVO();
List<DriverTruckTraceVO> truckTrace = truckTraceService.listTruckTraceByTime(truckNo,beginTime,endTime);
if(Objects.nonNull(userNo)){
List<DriverTraceVO> driverTrace = truckTraceService.listDriverTraceByTime(userNo,beginTime,endTime);
result.setDriverTraceList(truckTraceService.splitDriverTrace(driverTrace));
}
result.setTruckTraceList(truckTraceService.splitTruckTrace(truckTrace));
return result;
}
public void checkParam(QueryTraceParam param){
LocalDateTime beginTime = DateUtils.parseDateTime(param.getBeginTime()).get();
LocalDateTime endTime = DateUtils.parseDateTime(param.getEndTime()).get();
if (endTime.isAfter(beginTime.plusDays(TRACE_DAY_MAX)) ) { //最多查询7天
throw new ServiceSystemException(ResultEnum.PARAM_ERROR,"选择的时间范围需小于"+TRACE_DAY_MAX+"天");
}
}
}
package com.clx.performance.service.impl.trace;
import com.clx.performance.dto.zjxl.TruckTraceDTO;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class TruckTraceMqHandlerServiceImpl implements TruckTraceMqHandlerService {
@Autowired
private ZjxlGpsService zjxlGpsService;
@Autowired
private TruckTraceESPlusMapper truckTraceESPlusMapper;
@Transactional(rollbackFor = Exception.class)
@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 BigDecimal[]{item.getLocation()[0], item.getLocation()[1]});
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 childNo, String truckNo, String beginTime, String endTime) {
TruckTraceSyncMqParam mq = new TruckTraceSyncMqParam();
mq.setChildNo(childNo);
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);
}
@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.pc.trace.QueryTraceParam;
import com.clx.performance.vo.pc.trace.OrderChildTraceVO;
public interface TraceMonitorService {
OrderChildTraceVO getOrderChildTrace(QueryTraceParam param);
OrderChildTraceVO getTruckTrace(QueryTraceParam param);
}
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 childNo, String truckNo, String beginTime, String endTime);
void truckTracSync( String truckNo, String beginTime, String endTime);
}
package com.clx.performance.service.trace;
import com.clx.performance.param.temp.DriverTraceAddParam;
import com.clx.performance.param.temp.TruckTraceAddParam;
import com.clx.performance.vo.pc.trace.DriverTraceVO;
import com.clx.performance.vo.pc.trace.DriverTruckTraceVO;
import java.math.BigDecimal;
import java.util.List;
public interface TruckTraceService {
List<DriverTruckTraceVO> listTruckTraceByTime(String truckNo, String beginTime, String endTime);
List<DriverTraceVO> listDriverTraceByTime(Long userNo, String beginTime, String endTime);
void truckTraceSave(TruckTraceAddParam param);
void driverTraceSave(DriverTraceAddParam param);
BigDecimal[] getCurrentPosition(String truckNo, Long userNo);
int getParkTime(String truckNo, Long userNo);
BigDecimal[] getCurrentTruckPosition(String truckNo);
List<List<DriverTraceVO>> splitDriverTrace(List<DriverTraceVO> driverTraceList);
//计算车辆的停留结束时间
List<DriverTruckTraceVO> calcTruckStayTime(List<DriverTruckTraceVO> traceList);
//计算司机的停留结束时间
List<DriverTraceVO> calcDriverStayTime(List<DriverTraceVO> traceList);
List<List<DriverTruckTraceVO>> splitTruckTrace(List<DriverTruckTraceVO> traceList);
}
package com.clx.performance.struct.trace;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.esplus.model.DriverTraceESPlus;
import com.clx.performance.vo.pc.trace.DriverTraceVO;
import com.msl.common.utils.DateStructUtil;
import com.msl.common.utils.DateUtils;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import java.math.BigDecimal;
import java.util.List;
@Mapper(componentModel = "spring", uses = DateStructUtil.class, imports = {DateUtils.class, BigDecimal.class})
public interface DriverTraceStruct {
@Mapping(target = "longitude", expression = "java(item.getLocation()[0])")
@Mapping(target = "latitude", expression = "java(item.getLocation()[1])")
@Mapping(target = "gpsTime", source = "positionTime")
DriverTraceVO convert(DriverTraceESPlus item);
List<DriverTraceVO> convert(List<DriverTraceESPlus> list);
Page<DriverTraceVO> convertPage(IPage<DriverTraceESPlus> page);
}
package com.clx.performance.struct.trace;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.clx.performance.esplus.model.TruckTraceESPlus;
import com.clx.performance.vo.pc.trace.DriverTruckTraceVO;
import com.msl.common.utils.DateStructUtil;
import com.msl.common.utils.DateUtils;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import java.util.List;
@Mapper(componentModel = "spring", uses = DateStructUtil.class, imports = {DateUtils.class})
public interface TruckTraceStruct {
@Mapping(target = "longitude", expression = "java(item.getLocation()[0])")
@Mapping(target = "latitude", expression = "java(item.getLocation()[1])")
DriverTruckTraceVO convert(TruckTraceESPlus item);
List<DriverTruckTraceVO> convert(List<TruckTraceESPlus> list);
Page<DriverTruckTraceVO> convertPage(IPage<TruckTraceESPlus> page);
}
......@@ -409,4 +409,9 @@ public class LocalDateTimeUtils {
Duration duration = Duration.between(startTime, endTime);
return duration.getSeconds();
}
public static long betweenMin(LocalDateTime startTime, LocalDateTime endTime){
Duration duration = Duration.between(startTime, endTime);
return duration.toMinutes();
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论