提交 1a10cfb1 authored 作者: 李瑞鑫's avatar 李瑞鑫

Merge remote-tracking branch 'origin/v21.1_jianzhuang_20240807' into v21.1_jianzhuang_20240807

# Conflicts: # performance-web/src/main/java/com/clx/performance/service/OrderChildService.java # performance-web/src/main/java/com/clx/performance/service/impl/OrderChildServiceImpl.java
......@@ -205,4 +205,84 @@ public enum OrderChildEnum {
}
}
/**
* 驶入驶离货源地状态
*/
@Getter
@AllArgsConstructor
public enum EnterExitSendStatus {
INIT(0, "到达货源地"),
DRIVE_IN(1, "驶入"),
DRIVE_OUT(2, "驶离");
private final Integer code;
private final String name;
public static Optional<EnterExitSendStatus> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(EnterExitSendStatus::getName).orElse(null);
}
}
/**
* 驶离通知状态
*/
@Getter
@AllArgsConstructor
public enum ExitNoticeStatus {
NOT_NOTIFIED(0, "到达货源地"),
NOTIFIED(1, "驶入");
private final Integer code;
private final String name;
public static Optional<ExitNoticeStatus> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(ExitNoticeStatus::getName).orElse(null);
}
}
/**
* 驶入驶离货源地状态
*/
@Getter
@AllArgsConstructor
public enum RemoveLoadLimitStatus {
NOT_REMOVED(0, "未解除"),
REMOVED(1, "已解除"),
;
private final Integer code;
private final String name;
public static Optional<RemoveLoadLimitStatus> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code.equals(code)).findFirst();
}
public static String getMsgByCode(int code) {
return getByCode(code).map(RemoveLoadLimitStatus::getName).orElse(null);
}
}
@Getter
@AllArgsConstructor
public enum NeedAlertEnum {
OK(0, "不用弹窗"),
FAIL(1, "需要弹");
private final int code;
private final String msg;
}
}
......@@ -4,6 +4,9 @@ import com.msl.common.enums.ResultEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Optional;
@Getter
@AllArgsConstructor
......@@ -195,4 +198,16 @@ public enum PerformanceResultEnum implements ResultEnum {
;
private final int code;
private final String msg;
public static Optional<PerformanceResultEnum> getByCode(Integer code) {
return Arrays.stream(values()).filter(e -> e.code == (code)).findFirst();
}
public static String getMsgByCode(Integer code) {
return getByCode(code).map(PerformanceResultEnum::getMsg).orElse(null);
}
public static PerformanceResultEnum getEnumByCode(Integer code) {
return getByCode(code).orElse(null);
}
}
......@@ -17,26 +17,10 @@ import java.math.BigDecimal;
@NoArgsConstructor
public class OrderChildLoadRangeCheckParam {
@ApiModelProperty(value = "货单编号", example = "100000000")
@NotBlank(message = "货单编号不能为空")
private String orderGoodsNo;
@ApiModelProperty(value = "运单编号", example = "100000000")
@NotBlank(message = "运单编号不能为空")
private String childNo;
@ApiModelProperty(value = "车辆id", example = "1")
@NotNull(message = "车辆id空")
private Integer truckId;
@ApiModelProperty(value = "车牌号", example = "1")
@NotNull(message = "车牌号不能为空")
private String truckNo;
@ApiModelProperty(value = "司机用户编号", example = "1")
@NotNull(message = "司机用户编号空")
private Long driverUserNo;
@ApiModelProperty("纬度")
private BigDecimal latitude;
......
package com.clx.performance.vo.app;
import com.clx.performance.enums.OrderChildEnum;
import com.clx.performance.enums.PerformanceResultEnum;
import com.msl.common.result.Result;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Objects;
import static com.clx.performance.enums.PerformanceResultEnum.ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED;
/**
* 是否需要监装结果VO
*/
......@@ -22,4 +29,18 @@ public class OrderChildLoadRangeCheckResultVO {
@ApiModelProperty(value = "错误信息", example = "错误")
private String msg;
public Result<OrderChildLoadRangeCheckResultVO> toResult() {
if (Objects.equals(code, OrderChildEnum.NeedAlertEnum.OK.getCode())
//配置禁用也不弹窗
|| (Objects.equals(code, ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED.getCode()))
) {
return Result.ok();
} else {
Result<OrderChildLoadRangeCheckResultVO> result = Result.fail(PerformanceResultEnum.getEnumByCode(code));
result.setData(this);
result.setMsg(msg);
return result;
}
}
}
\ No newline at end of file
......@@ -28,4 +28,8 @@ public class DriverNoticeConfigVO {
@ApiModelProperty(value = "启用状态:0禁用 1启用")
private Integer status;
public Integer getNoticeTriggerDistanceMeter() {
return noticeTriggerDistance != null ? noticeTriggerDistance.multiply(new BigDecimal(1000)).intValue() : 0;
}
}
......@@ -198,7 +198,7 @@ public class AppDriverOrderChildController {
@ApiOperation(value = "司机端装货范围检查拦截", notes = "<br>By:姜武杰")
@PostMapping("/loadRangeCheck")
public Result<OrderChildLoadRangeCheckResultVO> loadRangeCheck(@RequestBody @Validated OrderChildLoadRangeCheckParam param) {
return Result.ok(orderChildService.loadRangeCheck(param));
return orderChildService.loadRangeCheck(param).toResult();
}
@ApiOperation(value = "是否需要弹出监装信息", notes = "<br>By:姜武杰")
@PostMapping("/needAlertSuperviseInfo")
......
package com.clx.performance.job;
import com.clx.performance.service.OrderChildService;
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;
/**
* 运单监控实时位置耗时信息job
* @author jiangwujie
*/
@Slf4j
@Component
public class OrderChildMessageNoticeJob {
@Autowired
OrderChildService orderChildService;
/**
* 运单监控实时位置耗时信息
*/
@XxlJob("orderChildMessageNotice")
public void orderChildMessageNotice() {
try {
log.info("开始实时计算进行中的运单的实时位置计算任务================================================");
orderChildService.orderChildMessageNotice();
log.info("结束实时计算进行中的运单的实时位置计算任务================================================");
} catch (Exception e) {
log.warn("定时任务计算进行中的运单的实时位置失败,异常原因:{}", ExceptionUtils.getStackTrace(e));
JobLog.error("定时任务计算进行中的运单的实时位置失败,异常原因=====================", e);
}
}
}
......@@ -105,6 +105,19 @@ public class OrderChild implements HasKey<Integer> {
private BigDecimal platformServiceFeeRate; //平台服务费费率%
private BigDecimal deposit; //接单保证金(分/车)
/**
* 驶入驶离货源地状态 0 初始 1 驶入 2 驶离
*/
private Integer enterExitSendStatus;
/**
* 驶离通知状态 0 未通知 1 已通知
*/
private Integer exitNoticeStatus;
/**
* 是否解除监装限制 0 未解除 1 解除
*/
private Integer removeLoadLimitStatus;
private LocalDateTime createTime; //创建时间
private LocalDateTime modifiedTime; //修改时间
......
......@@ -111,6 +111,8 @@ public interface OrderChildService {
OrderChildLoadRangeCheckResultVO loadRangeCheck(OrderChildLoadRangeCheckParam param);
void orderChildMessageNotice();
NeedAlertSuperviseInfoResultVO needAlertSuperviseInfo(NeedAlertSuperviseInfoParam param);
}
......@@ -248,6 +248,8 @@ public class OrderChildServiceImpl implements OrderChildService {
private OrderChildOperateLimitConfigService orderChildOperateLimitConfigService;
@Autowired
private LoadAppConfig appConfig;
@Autowired
private DriverNoticeConfigService driverNoticeConfigService;
@PostConstruct
public void init(){
......@@ -2908,6 +2910,22 @@ public class OrderChildServiceImpl implements OrderChildService {
}
return gdRouteDTOS;
}
/**
* @Author kavin
* @Description 通过高德获取时间
* @Param [truckNo, beginLongitude, beginLatitude, endLongitude, endLatitude]
* @return
**/
public GdRouteDTO getGdRoute(String truckNo, BigDecimal beginLongitude, BigDecimal beginLatitude,
BigDecimal endLongitude, BigDecimal endLatitude) {
List<GdRouteDTO> gdRouteDTOS = null;
try {
gdRouteDTOS = gdService.getRoute(beginLongitude, beginLatitude, endLongitude, endLatitude);
} catch (ServiceSystemException e) {
log.info("orderChildExpect==高德地图调用失败,车辆{},异常原因{}", truckNo, e.getMessage());
}
return CollectionUtils.isNotEmpty(gdRouteDTOS) ? gdRouteDTOS.get(0) : null;
}
@Override
public IPage<CustomerComplaintOrderChildVO> pageCustomerComplaintOrderChild(PageParam param) {
......@@ -3088,24 +3106,29 @@ public class OrderChildServiceImpl implements OrderChildService {
OrderChildOperateLimitConfigVO config = orderChildOperateLimitConfigService.listConfig();
// 无配置
if (config == null || config.getAllowUploadDistance() == null) {
return new OrderChildLoadRangeCheckResultVO(NeedAlertEnum.FAIL.getCode(), ORDER_CHILD_LOAD_LIMIT_CONFIG_ERROR.getCode(), ORDER_CHILD_LOAD_LIMIT_CONFIG_ERROR.getMsg());
return new OrderChildLoadRangeCheckResultVO(OrderChildEnum.NeedAlertEnum.FAIL.getCode(), ORDER_CHILD_LOAD_LIMIT_CONFIG_ERROR.getCode(), ORDER_CHILD_LOAD_LIMIT_CONFIG_ERROR.getMsg());
}
// 配置禁用
if (Objects.equals(config.getStatus(), EnabledStatusEnum.DISABLE.getCode())) {
return new OrderChildLoadRangeCheckResultVO(NeedAlertEnum.OK.getCode(), ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED.getCode(), ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED.getMsg());
return new OrderChildLoadRangeCheckResultVO(OrderChildEnum.NeedAlertEnum.OK.getCode(), ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED.getCode(), ORDER_CHILD_LOAD_LIMIT_CONFIG_DISABLED.getMsg());
}
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(param.getOrderGoodsNo()).get();
OrderChild orderChild = orderChildDao.getByChildNo(param.getChildNo()).orNull();
if (orderChild == null) {
return new OrderChildLoadRangeCheckResultVO(OrderChildEnum.NeedAlertEnum.FAIL.getCode(), ORDER_CHILD_NO_FOUND.getCode(), ORDER_CHILD_NO_FOUND.getMsg());
}
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo()).get();
//todo 解除装车限制
// 发货地址纬度
BigDecimal sendLatitude = orderGoods.getSendLatitude();
// 发货地经度
BigDecimal sendLongitude = orderGoods.getSendLongitude();
// 卡车经纬度
BigDecimal[] truckLocation = getTruckLocation(param);
BigDecimal[] truckLocation = getTruckLocation(orderChild.getTruckNo(), param.getLongitude(), param.getLatitude());
BigDecimal longitude = truckLocation[0];
BigDecimal latitude = truckLocation[1];
// 获取卡车位置失败
if (longitude == null || latitude == null) {
return new OrderChildLoadRangeCheckResultVO(NeedAlertEnum.FAIL.getCode(), TRUCK_LOCATION_ERROR.getCode(), TRUCK_LOCATION_ERROR.getMsg());
return new OrderChildLoadRangeCheckResultVO(OrderChildEnum.NeedAlertEnum.FAIL.getCode(), TRUCK_LOCATION_ERROR.getCode(), TRUCK_LOCATION_ERROR.getMsg());
}
List<GdRouteDTO> route = gdService.getRoute(longitude, latitude, sendLongitude, sendLatitude);
if (CollectionUtils.isNotEmpty(route)) {
......@@ -3113,28 +3136,84 @@ public class OrderChildServiceImpl implements OrderChildService {
Integer distance = gdRouteDTO.getDistance();
if (distance > config.allowUploadDistanceMeter()) {
// 装车位置 超限
return new OrderChildLoadRangeCheckResultVO(NeedAlertEnum.FAIL.getCode(), TRUCK_LOCATION_OUT_OF_SEND_RANGE.getCode(), String.format(TRUCK_LOCATION_OUT_OF_SEND_RANGE.getMsg(), config.getAllowUploadDistance()));
return new OrderChildLoadRangeCheckResultVO(OrderChildEnum.NeedAlertEnum.FAIL.getCode(), TRUCK_LOCATION_OUT_OF_SEND_RANGE.getCode(), String.format(TRUCK_LOCATION_OUT_OF_SEND_RANGE.getMsg(), config.getAllowUploadDistance()));
}
return new OrderChildLoadRangeCheckResultVO(NeedAlertEnum.OK.getCode(), NeedAlertEnum.OK.getCode(), "验证通过");
return new OrderChildLoadRangeCheckResultVO(OrderChildEnum.NeedAlertEnum.OK.getCode(), OrderChildEnum.NeedAlertEnum.OK.getCode(), "验证通过");
}
return new OrderChildLoadRangeCheckResultVO(NeedAlertEnum.FAIL.getCode(), GAODE_DISTANCE_ERROR.getCode(), GAODE_DISTANCE_ERROR.getMsg());
return new OrderChildLoadRangeCheckResultVO(OrderChildEnum.NeedAlertEnum.FAIL.getCode(), GAODE_DISTANCE_ERROR.getCode(), GAODE_DISTANCE_ERROR.getMsg());
}
@Getter
@AllArgsConstructor
public enum NeedAlertEnum {
OK(0, "不用弹窗"),
FAIL(1, "需要弹");
private final int code;
private final String msg;
@Override
public void orderChildMessageNotice() {
// 司机通知配置
DriverNoticeConfigVO driverNoticeConfigVO = driverNoticeConfigService.listConfig();
if (driverNoticeConfigVO == null) {
log.error("司机通知配置为空");
return;
}
if (Objects.equals(driverNoticeConfigVO.getStatus(), EnabledStatusEnum.DISABLE.getCode())) {
log.info("司机通知配置为未启用状态,不进行通知处理");
return;
}
//查询平台车辆的定位信息
Map<String, TruckTraceDTO> truckTraceMap = redisTemplate.opsForHash().entries(
RedisConstants.ZJXL_TRUCK_TRACE_LIST);
//查询平台到达货源地的订单
List<Integer> list = Collections.singletonList(OrderChildEnum.Status.ARRIVE_SEND.getCode());
LocalDateTime endTime = LocalDateTime.now();
LocalDateTime startTime = endTime.minusMonths(1);
List<OrderChild> orderChildList = orderChildDao.listOrderChild(list, startTime, endTime);
for (OrderChild child : orderChildList) {
String childNo = child.getChildNo();
String truckNo = child.getTruckNo();
//解除监装限制的不进行处理
if (Objects.equals(child.getRemoveLoadLimitStatus(), OrderChildEnum.RemoveLoadLimitStatus.REMOVED.getCode())) {
log.info("运单:{},卡车:{} 已解除监装限制", childNo, truckNo);
return;
}
//获取卡车的位置
TruckTraceDTO truckTraceDTO = truckTraceMap.get(truckNo);
BigDecimal truckLongitudeX = null;
BigDecimal truckLatitudeY = null;
if (Objects.nonNull(truckTraceDTO)) {
truckLongitudeX = truckTraceDTO.getLocation()[0];
truckLatitudeY = truckTraceDTO.getLocation()[1];
}
//判断卡车是否出了货源地x公里范围
String orderGoodsNo = child.getOrderGoodsNo();
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderGoodsNo).get();
BigDecimal siteLongitudeX = orderGoods.getSendLongitude();
BigDecimal siteLatitudeY = orderGoods.getSendLatitude();
//调高德获取距离
if (Objects.nonNull(truckLongitudeX) && Objects.nonNull(truckLatitudeY)) {
GdRouteDTO route = getGdRoute(truckNo, orderGoods.getSendLongitude(), orderGoods.getSendLatitude(), siteLongitudeX,
siteLatitudeY);
if (route == null) {
log.error("高德获取卡车与货源地位置距离失败,orderGoodsNo:{},orderChildNo:{},truckNo:{}", orderGoodsNo, childNo, truckNo);
return;
}
//距离
Integer distance = route.getDistance();
//超出货源地x公里范围了,且通知状态为未通知
if (distance >= driverNoticeConfigVO.getNoticeTriggerDistanceMeter()) {
if (Objects.equals(child.getEnterExitSendStatus(), OrderChildEnum.EnterExitSendStatus.DRIVE_OUT.getCode())
&& Objects.equals(child.getExitNoticeStatus(), OrderChildEnum.ExitNoticeStatus.NOT_NOTIFIED.getCode())
) {
}
// orderChild.getExitNoticeStatus(OrderChildEnum.ExitNoticeStatus.NOT_NOTICE.getCode());
}
}
}
}
private BigDecimal[] getTruckLocation(OrderChildLoadRangeCheckParam param) {
BigDecimal longitude = param.getLongitude();
BigDecimal latitude = param.getLatitude();
private BigDecimal[] getTruckLocation(String truckNo ,BigDecimal longitude, BigDecimal latitude) {
TruckLocationDTO truckLocationDTO = null;
try {
truckLocationDTO = zjxlGpsService.getTruckLastLocation(param.getTruckNo());
truckLocationDTO = zjxlGpsService.getTruckLastLocation(truckNo);
} catch (Exception e) {
log.info("中交兴路获取失败:{}", e.getMessage());
}
......@@ -3144,9 +3223,9 @@ public class OrderChildServiceImpl implements OrderChildService {
BigDecimal[] location = truckLocationDTO.getLocation();
longitude = location[0];
latitude = location[1];
log.info("当前中交兴路获取司机车牌:{},相关位置信息:{}", param.getTruckNo(), JSONUtil.parse(truckLocationDTO));
log.info("当前中交兴路获取司机车牌:{},相关位置信息:{}", truckNo, JSONUtil.parse(truckLocationDTO));
} else {
log.info("中交兴路获取失败,通过高德获取,相关参数:{}", JSONUtil.parse(param));
log.info("中交兴路获取失败,通过高德获取,truckNo:{}", truckNo);
}
return new BigDecimal[]{longitude, latitude};
}
......
package com.clx.performance.service.impl;
import com.clx.performance.dao.OrderChildDao;
import com.clx.performance.dao.OrderGoodsDao;
import com.clx.performance.dto.gd.GdRouteDTO;
import com.clx.performance.enums.PerformanceResultEnum;
import com.clx.performance.model.OrderChild;
import com.clx.performance.model.OrderGoods;
import com.clx.performance.param.app.OrderChildLoadRangeCheckParam;
import com.clx.performance.service.OrderChildOperateLimitConfigService;
......@@ -38,6 +40,8 @@ public class OrderChildServiceImplTest {
@Mock
private OrderGoodsDao orderGoodsDao;
@Mock
private OrderChildDao orderChildDao;
private OrderChildLoadRangeCheckParam param;
private OrderChildOperateLimitConfigVO config;
......@@ -45,16 +49,20 @@ public class OrderChildServiceImplTest {
@Before
public void setUp() {
param = new OrderChildLoadRangeCheckParam();
param.setOrderGoodsNo("1234567890");
param.setTruckNo("苏A12345");
param.setLatitude(new BigDecimal("32.2304"));
param.setLongitude(new BigDecimal("122.4737"));
OrderChild orderChild = new OrderChild();
orderChild.setOrderGoodsNo("123456789");
orderChild.setTruckNo("黑A88888");
Mockito.<com.msl.common.base.Optional<OrderChild>>when(orderChildDao.getByChildNo(param.getChildNo())).thenReturn(com.msl.common.base.Optional.of(orderChild));
// 预设的返回值,根据具体业务逻辑可能需要调整
OrderGoods orderGoods = new OrderGoods();
orderGoods.setSendLatitude(BigDecimal.valueOf(31.2304));
orderGoods.setSendLongitude(BigDecimal.valueOf(121.4737));
Mockito.<com.msl.common.base.Optional<OrderGoods>>when(orderGoodsDao.getByOrderGoodsNo(param.getOrderGoodsNo())).thenReturn(com.msl.common.base.Optional.of(orderGoods));
Mockito.<com.msl.common.base.Optional<OrderGoods>>when(orderGoodsDao.getByOrderGoodsNo(orderChild.getOrderGoodsNo())).thenReturn(com.msl.common.base.Optional.of(orderGoods));
// Mock配置
config = new OrderChildOperateLimitConfigVO();
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论