提交 0454d134 authored 作者: 李瑞鑫's avatar 李瑞鑫

Merge branch 'v20.6_carrier_station_pound_20240802' into dev

# Conflicts: # performance-api/src/main/java/com/clx/performance/feign/PerformanceSDKFeign.java # performance-api/src/main/java/com/clx/performance/vo/pc/OrderGoodsVO.java # performance-web/pom.xml # performance-web/src/main/java/com/clx/performance/controller/feign/PerformanceSdkFeignController.java # performance-web/src/main/java/com/clx/performance/controller/temp/TempTraceController.java # performance-web/src/main/java/com/clx/performance/dao/AppDao.java # performance-web/src/main/java/com/clx/performance/dao/OrderChildDao.java # performance-web/src/main/java/com/clx/performance/dao/impl/OrderChildDaoImpl.java # performance-web/src/main/java/com/clx/performance/mapper/AppMapper.java # performance-web/src/main/java/com/clx/performance/model/App.java # performance-web/src/main/java/com/clx/performance/service/OrderChildService.java # performance-web/src/main/java/com/clx/performance/service/impl/OrderChildServiceImpl.java # performance-web/src/main/java/com/clx/performance/service/impl/OrderGoodsServiceImpl.java # performance-web/src/main/java/com/clx/performance/service/trace/TruckTraceService.java
package com.clx.performance.feign;
import com.clx.open.sdk.request.action.GetOrderBreakContractOwnerRuleFileAction;
import com.clx.open.sdk.request.dto.OrderCanExtractWeightDTO;
import com.clx.open.sdk.request.action.QueryPerformanceProgressAction;
import com.clx.open.sdk.request.action.QueryPerformanceProgressLogAction;
import com.clx.open.sdk.request.dto.BatchOrderStatisticsInfoDTO;
......@@ -49,6 +50,7 @@ public interface PerformanceSDKFeign {
Result<List<PerformanceProgressOperationLogVO>> queryPerformanceProgressLog(@RequestBody QueryPerformanceProgressLogAction action);
@GetMapping(value = {"clx-performance/feign/sdk/getOrderCanExtractWeight"})
Result<OrderCanExtractWeightDTO> getOrderCanExtractWeight(@RequestParam(value = "orderNo") String orderNo);
......
......@@ -6,7 +6,6 @@ import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 装车范围校验检查参数
......@@ -22,7 +21,6 @@ public class NeedAlertSuperviseInfoParam {
@ApiModelProperty(value = "类型 1-监装 2-监卸", example = "1")
@NotNull(message = "类型不能为空")
private Integer type;
}
......@@ -272,6 +272,9 @@ public class OrderChildVO {
@ApiModelProperty(value = "监装联系人电话")
private String superviseMobile;
@ApiModelProperty(value = "是否解除监装限制 0 未解除 1 解除")
private Integer removeLoadLimitStatus;
@ApiModelProperty(value = "发货地采样照片")
public List<String> getSendSamplingPicList() {
......
......@@ -171,6 +171,7 @@ public class OrderGoodsVO {
@ApiModelProperty("接单保证金 平台服务费费率 弹窗和文案显示 0 不显示 1 显示")
private Integer goodsOrderDetailShow = 0;
/* 20240730 增加货源地信息 */
@ApiModelProperty(value = "货源地现场联系人")
......
......@@ -103,16 +103,14 @@
<artifactId>smart-weight-sdk</artifactId>
</dependency>
<dependency>
<groupId>com.msl</groupId>
<artifactId>open-starter</artifactId>
</dependency>
<dependency>
<groupId>com.clx.cy</groupId>
<artifactId>purchase-manage-sdk</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.msl</groupId>-->
<!-- <artifactId>cache-spring-boot-starter</artifactId>-->
......
......@@ -126,7 +126,7 @@ public class OrderGoodsStatusLazyComponent implements InitializingBean {
BigDecimal residueTransportWeight = ApplicationContextUtils.getBean(OrderGoodsService.class).
calcOrderGoodsResidueWeight(orderGoods.getExtractWeight(),orderGoods.getAlreadyTransportWeight());;
if (residueTransportWeight.compareTo(BigDecimal.ZERO) == 0) {
if (residueTransportWeight.compareTo(BigDecimal.ZERO) <= 0) {
List<OrderChild> orderChildren = orderChildDao.selectInTransitOrderChildByOrderGoodsNo(orderGoodsNo);
if (CollectionUtil.isNotEmpty(orderChildren)) {
//更新货单已完结
......
......@@ -14,7 +14,6 @@ import org.springframework.stereotype.Component;
@Component
public class LoadAppConfig {
private App purchaseManageApp;
@Autowired
......
......@@ -42,6 +42,15 @@ public class RedisConstants {
*/
public static final String LINE_WARN_WEATHER = "clx-performance:lineWarn:weather:";
/**
* 电子围栏短信通知 未装车
*/
public static final String NOTICE_MESSAGE_LIMIT_UNLOAD = "clx-performance:notice_message_limit_unload:";
/**
* 电子围栏短信通知 未监装
*/
public static final String NOTICE_MESSAGE_LIMIT_UNSUPERVISED = "clx-performance:notice_message_limit_unsupervised:";
/**
* 订单最后一车
......
......@@ -200,9 +200,14 @@ public class AppDriverOrderChildController {
public Result<OrderChildLoadRangeCheckResultVO> loadRangeCheck(@RequestBody @Validated OrderChildLoadRangeCheckParam param) {
return orderChildService.loadRangeCheck(param).toResult();
}
@ApiOperation(value = "是否需要弹出监装信息", notes = "<br>By:姜武杰")
@PostMapping("/needAlertSuperviseInfo")
public Result<NeedAlertSuperviseInfoResultVO> needAlertSuperviseInfo(@RequestBody @Validated NeedAlertSuperviseInfoParam param) {
// todo :jiangwujie 临时设置type 前端给type后删除
if (param.getType() == null) {
param.setType(1);
}
return Result.ok(orderChildService.needAlertSuperviseInfo(param));
}
......
package com.clx.performance.controller.feign;
import com.clx.open.sdk.request.action.GetOrderBreakContractOwnerRuleFileAction;
import com.clx.open.sdk.request.dto.OrderCanExtractWeightDTO;
import com.clx.open.sdk.request.action.GetOwnerAccountInfoAction;
import com.clx.open.sdk.request.action.QueryPerformanceProgressAction;
import com.clx.open.sdk.request.action.QueryPerformanceProgressLogAction;
import com.clx.open.sdk.request.dto.OrderCanExtractWeightDTO;
......@@ -31,6 +33,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty;
import java.math.BigDecimal;
import java.util.List;
import static com.clx.performance.enums.PerformanceProgressEnum.LogType.PERFORMANCE_ABNORMAL_REASON;
......@@ -61,6 +64,8 @@ public class PerformanceSdkFeignController {
private final OrderService orderService;
private final PerformanceProgressService performanceProgressService;
@ApiOperation(value = "货主端取消订单", notes = "<br>By:胡宇帆")
@PostMapping("/ownCancelOrderPre")
......
package com.clx.performance.controller.temp;
import com.clx.performance.dto.gd.GdRouteDTO;
import com.clx.performance.esplus.model.TruckLatestPosESPlus;
import com.clx.performance.param.mq.trace.TruckTraceSyncMqParam;
import com.clx.performance.param.temp.DriverTraceAddParam;
import com.clx.performance.param.temp.TruckTraceAddParam;
......@@ -26,6 +27,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
......@@ -134,4 +136,16 @@ public class TempTraceController {
@ApiOperation(value = "获取车辆最新位置信息", notes = "<br>By:姜武杰")
@GetMapping("/calDistance")
public Result<Integer> getTruckLatestPos(
@RequestParam("l1") @NotNull(message = "当前经度不能为空") BigDecimal l1,
@RequestParam("l2") @NotNull(message = "当前纬度不能为空") BigDecimal l2,
@RequestParam("l3") @NotNull(message = "货源经度不能为空") BigDecimal l3,
@RequestParam("l4") @NotNull(message = "货源纬度不能为空") BigDecimal l4
) {
return Result.ok( gdService.getShortestRouteDistance(l1,l2,l3,l4));
}
}
......@@ -5,11 +5,7 @@ import com.clx.performance.mapper.AppMapper;
import com.clx.performance.model.App;
import com.msl.common.dao.BaseDao;
/**
* @author Min
* Date 2024-06-14
* Time 11:51
*/
public interface AppDao extends BaseDao<AppMapper, App, Integer> {
}
......@@ -212,6 +212,7 @@ public interface OrderChildDao extends BaseDao<OrderChildMapper, OrderChild, Int
List<OrderChild> listChidNosByStatus(List<Integer> status);
List<OrderGoodsNotCancelChildDTO> countValidByOrderGoodsNoList(List<String> orderGoodsList);
void batchUpdateCancel(List<OrderChild> canCancelOrderChildList);
......
......@@ -699,6 +699,8 @@ public class OrderChildDaoImpl extends BaseDaoImpl<OrderChildMapper, OrderChild,
);
}
@Override
public List<OrderGoodsNotCancelChildDTO> countValidByOrderGoodsNoList(List<String> orderGoodsList) {
return baseMapper.countValidByOrderGoodsNoList(orderGoodsList);
......
......@@ -4,10 +4,6 @@ package com.clx.performance.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.clx.performance.model.App;
/**
* @author Min
* Date 2024-06-14
* Time 11:51
*/
public interface AppMapper extends BaseMapper<App> {
}
......@@ -13,11 +13,7 @@ import lombok.experimental.Accessors;
import java.time.LocalDateTime;
/**
* @author Min
* Date 2024-06-14
* Time 11:51
*/
@Getter
@Setter
@Accessors(chain = true)
......
......@@ -119,4 +119,6 @@ public interface OrderChildService {
NeedAlertSuperviseInfoResultVO needAlertSuperviseInfo(NeedAlertSuperviseInfoParam param);
}
......@@ -516,7 +516,7 @@ public class OrderCancelServiceImpl implements OrderCancelService {
OrderChildEnum.Status.ARRIVE_SEND.getCode(),
OrderChildEnum.Status.UNLOAD.getCode())
.contains(orderChild.getStatus())) {
log.error("运单:{} 状态:{}不在【装车成功】【前往目的地】【到达目的地】【收货待确认】范围中,不允许取消", orderChildNo, orderChild.getStatus());
log.info("运单:{} 状态:{}不在【装车成功】【前往目的地】【到达目的地】【收货待确认】范围中,不允许取消", orderChildNo, orderChild.getStatus());
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_CANCEL_FORBID, "不可操作");
}
......@@ -579,6 +579,7 @@ public class OrderCancelServiceImpl implements OrderCancelService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public void removeLoadLimit(ArtificialCancelOrderParam param) {
OrderChild orderChild = orderChildDao.getByChildNo(param.getOrderChildNo()).orElseThrow(PerformanceResultEnum.ORDER_CHILD_NO_FOUND);
//判断运单状态【已接单】【前往货源地】【到达货源地】时可对该运单解除装车限制,否则toast:不可操作
......@@ -586,7 +587,7 @@ public class OrderCancelServiceImpl implements OrderCancelService {
OrderChildEnum.Status.GO_TO_SEND.getCode(),
OrderChildEnum.Status.ARRIVE_SEND.getCode())
.contains(orderChild.getStatus())) {
log.error("运单:{} 状态:{}不在【已接单】【前往货源地】【到达货源地】范围中,不允许解除装车限制", param.getOrderChildNo(), orderChild.getStatus());
log.info("运单:{} 状态:{}不在【已接单】【前往货源地】【到达货源地】范围中,不允许解除装车限制", param.getOrderChildNo(), orderChild.getStatus());
throw new ServiceSystemException(PerformanceResultEnum.ORDER_CHILD_CANCEL_FORBID, "不可操作");
}
......
......@@ -76,6 +76,7 @@ import com.clx.user.enums.idcard.IdCardEnum;
import com.clx.user.feign.DocumentFeign;
import com.clx.user.feign.UserClxFeign;
import com.clx.user.param.feign.BatchUpdateDriverAndTruckParam;
import com.clx.user.feign.UserClxFeign;
import com.clx.user.vo.feign.DriverTruckInfoFeignVo;
import com.clx.user.vo.feign.OwnerInfoFeignVO;
import com.clx.user.vo.pc.auth.AuthVo;
......@@ -103,7 +104,9 @@ import com.tencentcloudapi.ocr.v20181119.models.ItemInfo;
import com.tencentcloudapi.ocr.v20181119.models.SmartStructuralOCRV2Request;
import com.tencentcloudapi.ocr.v20181119.models.SmartStructuralOCRV2Response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
......@@ -250,6 +253,12 @@ public class OrderChildServiceImpl implements OrderChildService {
@Autowired
private DocumentFeign documentFeign;
@Autowired
private OrderChildWeighPictureDao pictureDao;
@Autowired
private OrderWeightService orderWeightService;
@Autowired
private UserClxFeign userClxFeign;
@Autowired
private OrderWeightService orderWeightService;
......@@ -1739,9 +1748,9 @@ public class OrderChildServiceImpl implements OrderChildService {
result.setSendSamplingPic(orderInfoFeign.getSendSamplingPic());
result.setSendQualityPosition(orderInfoFeign.getSendQualityPosition());
result.setSendSamplingVideo(orderInfoFeign.getSendSamplingVideo());
Object[] superviseInfo = getSuperviseInfo(orderChild.getOrderNo(), orderChild.getChildNo());
result.setSuperviseContacts(superviseInfo != null ? (String) superviseInfo[0] : null);
result.setSuperviseMobile(superviseInfo != null ? (String) superviseInfo[1] : null);
SuperviseInfo superviseInfo = getSuperviseInfo(orderChild.getOrderNo(), orderChild.getChildNo());
result.setSuperviseContacts(superviseInfo != null ? superviseInfo.getSuperviseContacts() : null);
result.setSuperviseMobile(superviseInfo != null ? superviseInfo.getSuperviseMobile() : null);
//查询结算信息
Optional<SettlementOwnerDetail> optional = settlementOwnerDetailDao.getByChildNo(childNo);
......@@ -1771,13 +1780,22 @@ public class OrderChildServiceImpl implements OrderChildService {
return result;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
static class SuperviseInfo {
private String superviseContacts;
private String superviseMobile;
private String taskAddress;
}
/**
* 获取监装
* @param orderNo
* @param childNo
* @return
*/
private Object[] getSuperviseInfo(String orderNo, String childNo) {
private SuperviseInfo getSuperviseInfo(String orderNo, String childNo) {
NeedAlertSuperviseInfoResultVO result = new NeedAlertSuperviseInfoResultVO();
App app = appConfig.getPurchaseManageApp();//对接马上来供应链配置信息
//组装配置信息
......@@ -1794,7 +1812,38 @@ public class OrderChildServiceImpl implements OrderChildService {
return null;
}
SupervisionLoadInfoDto supervisionLoadInfo = supervisionLoadInfoDto.getData();//监装信息
if (Objects.nonNull(supervisionLoadInfo)) {//有监装信息
if (Objects.isNull(supervisionLoadInfo)) {//有监装信息
return null;
}
return new SuperviseInfo(supervisionLoadInfo.getTaskContracts(), supervisionLoadInfo.getTaskMobile(), supervisionLoadInfo.getTaskAddress());
}
/**
* 获取监装
* @param orderNo
* @param childNo
* @return
*/
private SuperviseInfo getSuperviseInfoWithSubStatus(String orderNo, String childNo, String truckNo) {
NeedAlertSuperviseInfoResultVO result = new NeedAlertSuperviseInfoResultVO();
App app = appConfig.getPurchaseManageApp();//对接马上来供应链配置信息
//组装配置信息
RequestConfig config = new RequestConfig()
.setAppId(app.getAppNo())
.setAppKey(app.getAppKey())
.setGatewayUrl(app.getCallback());
//通过订单号查询监装监卸信息
SupplyChainSupervisionLoadAction action = new SupplyChainSupervisionLoadAction();
action.setOrderNo(orderNo);
action.setType(OrderChildEnum.SuperviseTypeEnum.SUPERVISE_LOAD.getCode());
Result<SupervisionLoadInfoDto> supervisionLoadInfoDto = OpenClient.doAction(config, action);
if (!supervisionLoadInfoDto.succeed()) {//接口调用失败
return null;
}
SupervisionLoadInfoDto supervisionLoadInfo = supervisionLoadInfoDto.getData();//监装信息
if (Objects.isNull(supervisionLoadInfo)) {//有监装信息
return null;
}
//通过运单号查询监装监卸子任务状态
SupplyChainSupervisionLoadTruckAction truckAction = new SupplyChainSupervisionLoadTruckAction();
truckAction.setChildNo(childNo);
......@@ -1803,16 +1852,17 @@ public class OrderChildServiceImpl implements OrderChildService {
if (!supervisionLoadTruckInfoDto.succeed()) {//接口调用失败
return null;
}
//监装子任务状态
SupervisionLoadTruckInfoDto supervisionLoadTruckInfo = supervisionLoadTruckInfoDto.getData();
if (Objects.nonNull(supervisionLoadTruckInfo)) {
if (supervisionLoadTruckInfo.getLoadStatus()) {
return new Object[]{supervisionLoadInfo.getTaskContracts(), supervisionLoadInfo.getTaskMobile(), supervisionLoadInfo.getTaskAddress()};
}
}
if (Objects.isNull(supervisionLoadTruckInfo) || !supervisionLoadTruckInfo.getLoadStatus()) {
return null;
}
//判断当前卡车是否是监装车辆
if (!Objects.equals(truckNo, supervisionLoadTruckInfo.getTruckNo())) {
return null;
}
return new SuperviseInfo(supervisionLoadInfo.getTaskContracts(), supervisionLoadInfo.getTaskMobile(), supervisionLoadInfo.getTaskAddress());
}
//查看运单车辆是否开启了中交兴路
public String isOpenZJXL(Integer orderChildStatus,String truckNo){
......@@ -2198,7 +2248,9 @@ public class OrderChildServiceImpl implements OrderChildService {
}
if (dif.compareTo(BigDecimal.ZERO) != 0) {
BigDecimal orderResidueWeight = orderWeightService.getOrderResidueWeight(orderGoods.getOrderNo());
if(orderResidueWeight.compareTo(BigDecimal.ZERO) <= 0){
//增加吨数 && 订单剩余吨数小于等于0 ,则提示吨数不足
if(dif.compareTo(BigDecimal.ZERO) > 0 && orderResidueWeight.compareTo(BigDecimal.ZERO) <= 0){
throw new ServiceSystemException(ORDER_WEIGHT_LACK);
}
//运单修改装车吨数,从货单进行扣减
......@@ -2983,15 +3035,15 @@ public class OrderChildServiceImpl implements OrderChildService {
* @Param [truckNo, beginLongitude, beginLatitude, endLongitude, endLatitude]
* @return
**/
public GdRouteDTO getGdRoute(String truckNo, BigDecimal beginLongitude, BigDecimal beginLatitude,
public Integer getGdRoute(String truckNo, BigDecimal beginLongitude, BigDecimal beginLatitude,
BigDecimal endLongitude, BigDecimal endLatitude) {
List<GdRouteDTO> gdRouteDTOS = null;
Integer distance = null;
try {
gdRouteDTOS = gdService.getRoute(beginLongitude, beginLatitude, endLongitude, endLatitude);
distance = gdService.getShortestRouteDistance(beginLongitude, beginLatitude, endLongitude, endLatitude);
} catch (ServiceSystemException e) {
log.info("orderChildExpect==高德地图调用失败,车辆{},异常原因{}", truckNo, e.getMessage());
}
return CollectionUtils.isNotEmpty(gdRouteDTOS) ? gdRouteDTOS.get(0) : null;
return distance;
}
@Override
......@@ -3240,10 +3292,9 @@ public class OrderChildServiceImpl implements OrderChildService {
if (longitude == null || latitude == null) {
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)) {
GdRouteDTO gdRouteDTO = route.get(0);
Integer distance = gdRouteDTO.getDistance();
Integer distance = gdService.getShortestRouteDistance(longitude, latitude, sendLongitude, sendLatitude);
if (distance != null) {
log.info("truckNo:{} 高德计算距离:{} curr:{},{}, 货源地:{},{}", orderChild.getTruckNo(), distance, longitude, latitude, sendLongitude, sendLatitude);
if (distance > config.allowUploadDistanceMeter()) {
// 装车位置 超限
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()));
......@@ -3277,49 +3328,72 @@ public class OrderChildServiceImpl implements OrderChildService {
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;
}
Long driverUserNo = child.getDriverUserNo();
//获取卡车的位置
TruckTraceDTO truckTraceDTO = truckTraceMap.get(truckNo);
log.info("运单号:{},卡车:{},中交兴路地图位置:{}", childNo, truckNo, truckTraceDTO);
BigDecimal truckLongitudeX = null;
BigDecimal truckLatitudeY = null;
if (Objects.nonNull(truckTraceDTO)) {
truckLongitudeX = truckTraceDTO.getLocation()[0];
truckLatitudeY = truckTraceDTO.getLocation()[1];
}
if (truckLongitudeX == null || truckLatitudeY == null) {
BigDecimal[] location = truckTraceService.getCurrentPosition(truckNo, driverUserNo);
log.info("运单号:{},卡车:{},卡车/司机经纬度:{}", childNo, truckNo, location);
if (location != null && location.length >= 2) {
truckLongitudeX = location[0];
truckLatitudeY = location[1];
}
}
//判断卡车是否出了货源地x公里范围
String orderGoodsNo = child.getOrderGoodsNo();
OrderGoods orderGoods = orderGoodsDao.getByOrderGoodsNo(orderGoodsNo).get();
BigDecimal siteLongitudeX = orderGoods.getSendLongitude();
BigDecimal siteLatitudeY = orderGoods.getSendLatitude();
log.info("运单号:{},卡车:{},status:{},站点经度:{},站点纬度:{},卡车经度:{},卡车纬度:{}", childNo, truckNo, child.getStatus(), siteLongitudeX, siteLatitudeY, truckLongitudeX, truckLatitudeY);
if (Objects.isNull(truckLongitudeX) || Objects.isNull(truckLatitudeY)) {
continue;
}
//调高德获取距离
if (Objects.nonNull(truckLongitudeX) && Objects.nonNull(truckLatitudeY)) {
GdRouteDTO route = getGdRoute(truckNo, orderGoods.getSendLongitude(), orderGoods.getSendLatitude(), siteLongitudeX,
Integer distance = getGdRoute(truckNo, truckLongitudeX, truckLatitudeY, siteLongitudeX,
siteLatitudeY);
if (route == null) {
log.error("高德获取卡车与货源地位置距离失败,orderGoodsNo:{},orderChildNo:{},truckNo:{}", orderGoodsNo, childNo, truckNo);
return;
if (distance == null) {
log.info("高德获取卡车与货源地位置距离失败,orderGoodsNo:{},orderChildNo:{},truckNo:{}", orderGoodsNo, childNo, truckNo);
continue;
}
//距离
Integer distance = route.getDistance();
log.info("运单号:{},卡车:{},status:{},站点经度:{},站点纬度:{},卡车经度:{},卡车纬度:{},距离:{}", orderGoodsNo, truckNo, child.getStatus(), siteLongitudeX, siteLatitudeY, truckLongitudeX, truckLatitudeY, distance);
// 超出货源地+通知触发距离
if (distance > driverNoticeConfigVO.getNoticeTriggerDistanceMeter()) {
if (Objects.equals(child.getExitNoticeStatus(), OrderChildEnum.ExitNoticeStatus.NOT_NOTIFIED.getCode())
// 运单驶入过1km且通知状态为未通知
if (Objects.equals(child.getEnterExitSendStatus(), OrderChildEnum.EnterExitSendStatus.DRIVE_IN.getCode()) &&
Objects.equals(child.getExitNoticeStatus(), OrderChildEnum.ExitNoticeStatus.NOT_NOTIFIED.getCode())
) {
//超出货源地x公里范围了,且通知状态为未通知
// 到达货源地
if (Objects.equals(child.getStatus(), OrderChildEnum.Status.ARRIVE_SEND.getCode())) {
Integer count = (Integer) redisTemplate.opsForValue().get(RedisConstants.NOTICE_MESSAGE_LIMIT_UNLOAD + childNo);
if (count != null && count > 3) {
log.info("{}超出货源地x公里范围了,运单{}为到达货源地状态,运单已发送短信次数:{},不进行短信通知", truckNo, childNo, count);
continue;
}
log.info("{}超出货源地x公里范围了,运单{}为到达货源地状态,发送短信", truckNo, childNo);
sendLoadSms(child.getDriverMobile(), child.getTruckNo(), child.getChildNo());
redisTemplate.opsForValue().increment(RedisConstants.NOTICE_MESSAGE_LIMIT_UNLOAD + childNo);
}
// 已装货
if (Objects.equals(child.getStatus(), OrderChildEnum.Status.LOAD.getCode())) {
Object[] superviseInfo = getSuperviseInfo(child.getOrderNo(), child.getChildNo());
SuperviseInfo superviseInfo = getSuperviseInfoWithSubStatus(child.getOrderNo(), child.getChildNo(), child.getTruckNo());
log.info("运单号:{},卡车:{},监装信息{}", childNo, truckNo, superviseInfo);
if (superviseInfo != null) {
sendSupervisionSms(child.getDriverMobile(), child.getTruckNo(), child.getChildNo(), (String) superviseInfo[2]);
Integer count = (Integer) redisTemplate.opsForValue().get(RedisConstants.NOTICE_MESSAGE_LIMIT_UNSUPERVISED + childNo);
if (count != null && count > 3) {
log.info("{}超出货源地x公里范围了,运单{}为装货成功状态,运单已发送短信次数:{},不进行短信通知", truckNo, childNo, count);
continue;
}
log.info("{}超出货源地x公里范围了,运单{}为装货成功状态,发送短信", truckNo, childNo);
sendSupervisionSms(child.getDriverMobile(), child.getTruckNo(), child.getChildNo(), superviseInfo.getTaskAddress());
redisTemplate.opsForValue().increment(RedisConstants.NOTICE_MESSAGE_LIMIT_UNSUPERVISED + childNo);
}
}
// 修改 通知状态 为已通知
......@@ -3327,11 +3401,14 @@ public class OrderChildServiceImpl implements OrderChildService {
child.setEnterExitSendStatus(OrderChildEnum.EnterExitSendStatus.DRIVE_OUT.getCode());
orderChildDao.updateEntityByKey(child);
}
} else {
} else if (distance <= 1000) {
log.info("运单号:{},卡车:{},status:{},站点经度:{},站点纬度:{},卡车经度:{},卡车纬度:{},距离:{} 距离小于1km", childNo, truckNo, child.getStatus(), siteLongitudeX, siteLatitudeY, truckLongitudeX, truckLatitudeY, distance);
// 这里的1km的距离是产品需求写死的,不使用通知配置范围
// 未超出货源地+通知触发距离
// 驶入货源地+通知触发距离范围内了
if (Objects.equals(child.getEnterExitSendStatus(), OrderChildEnum.EnterExitSendStatus.DRIVE_OUT.getCode())) {
if (Objects.equals(child.getEnterExitSendStatus(), OrderChildEnum.EnterExitSendStatus.DRIVE_OUT.getCode())
|| Objects.equals(child.getEnterExitSendStatus(), OrderChildEnum.EnterExitSendStatus.INIT.getCode())
) {
//驶入货源地x公里范围了,且通知状态为已通知
// 修改 通知状态 为未通知
child.setExitNoticeStatus(OrderChildEnum.ExitNoticeStatus.NOT_NOTIFIED.getCode());
......@@ -3342,7 +3419,6 @@ public class OrderChildServiceImpl implements OrderChildService {
}
}
}
}
/**
* 发送上传装货信息短信
......@@ -3368,7 +3444,8 @@ public class OrderChildServiceImpl implements OrderChildService {
req.setMobile(mobile);
req.setContent(jsonObject.toString());
req.setExpire(300L);
clxMessageOpenapiFeign.sendAliSms(req);
Result<String> result = clxMessageOpenapiFeign.sendAliSms(req);
log.info("发送上传装货信息提示短信:【当前车牌号{},运单{}未上传装车信息,请上传后再驶离货源地,如需帮助请联系客服。】,结果:{}", truckNo, childNo, result);
}
/**
......@@ -3397,29 +3474,42 @@ public class OrderChildServiceImpl implements OrderChildService {
req.setMobile(mobile);
req.setContent(jsonObject.toString());
req.setExpire(300L);
clxMessageOpenapiFeign.sendAliSms(req);
Result<String> result = clxMessageOpenapiFeign.sendAliSms(req);
log.info("发送发送监装提示短信:【当前车牌号{},运单{}需要进行现场监装,请您前往{}进行配合,如需帮助请联系客服。】,结果:{}", truckNo, childNo, supervisionAddress, result);
}
private BigDecimal[] getTruckLocation(String truckNo ,BigDecimal longitude, BigDecimal latitude) {
private BigDecimal[] getTruckLocation(String truckNo, BigDecimal longitude, BigDecimal latitude) {
TruckLocationDTO truckLocationDTO = null;
try {
truckLocationDTO = zjxlGpsService.getTruckLastLocation(truckNo);
} catch (Exception e) {
log.info("中交兴路获取失败:{}", e.getMessage());
}
//如果中交兴路获取到位置信息,则使用中交,否则用APP传的位置信息
if (truckLocationDTO != null) {
BigDecimal[] location = truckLocationDTO.getLocation();
longitude = location[0];
latitude = location[1];
log.info("当前中交兴路获取司机车牌:{},相关位置信息:{}", truckNo, JSONUtil.parse(truckLocationDTO));
} else {
log.info("中交兴路获取失败,通过高德获取,truckNo:{}", truckNo);
return new BigDecimal[]{longitude, latitude};
}
} catch (Exception e) {
log.info("中交兴路获取失败:{}", e.getMessage());
}
//20240815 海泉说中交兴路也可能往缓存中放,也可能往es中放,最新的应该都是使用es,所以缓存中如果取不到,就从es中取一下看看
BigDecimal[] truckLocation = truckTraceService.getCurrentTruckPosition(truckNo);
if (truckLocation != null && truckLocation.length >= 2
&& truckLocation[0] != null && truckLocation[1] != null
) {
longitude = truckLocation[0];
latitude = truckLocation[1];
log.info("中交兴路es获取司机车牌:{},相关位置信息:{}", truckNo, truckLocation);
return new BigDecimal[]{longitude, latitude};
}
BigDecimal[] result = new BigDecimal[]{longitude, latitude};
//如果中交兴路获取到位置信息,则使用中交,否则用APP传的位置信息
log.info("中交兴路获取失败,使用app上传位置,truckNo:{},相关位置信息:{}", truckNo, result);
return result;
}
@Override
public OcrRecognitionResultVO ocrRecognition(OcrRecognitionParam param) {
//校验,同一运单同一图片类型只能识别一次
......@@ -3427,6 +3517,14 @@ public class OrderChildServiceImpl implements OrderChildService {
return null;
}
List<OrderChildWeighPicture> pictures = pictureDao.getImages(param.getChildNo());
List<String> image = pictures.stream().filter(
item -> Objects.equals(item.getType(), 2)).map(
item -> item.getOriginalImg()).collect(Collectors.toList());
if(CollectionUtils.isNotEmpty(image)){
return null;
}
try{
OcrRecognitionResultVO vo = new OcrRecognitionResultVO();
Credential cred = new Credential(tencentCloudApiOcrConfig.getSecretId(), tencentCloudApiOcrConfig.getSecretKey());
......@@ -3467,6 +3565,65 @@ public class OrderChildServiceImpl implements OrderChildService {
}
}
@Override
public List<HistoryLineTranVolumeChartVO> getHistoryLineTransportVolume(String orderNo) {
//查询近一个月与该订单收发货地线路一致的订单
Optional<List<String>> result = orderService.getMonthSameLineOrderList(orderNo);
if(!result.isPresent()){
log.warn("通过订单号:{} 查找相同线路的订单列列表,返回结果:{}",orderNo,result);
throw new ServiceSystemException(ResultEnum.DATA_ERROR,"获取相同线路的订单列表失败");
}
List<BigDecimal> priceList = orderGoodsAdjustmentPriceService.getNoRepeatAdjustmentPriceRecord(result.get());
List<HistoryLineTranVolumeChartVO> charts = new ArrayList<>();
if(CollectionUtils.isEmpty(priceList)){
return charts;
}
//查询相同路线的订单下的所有运单
List<OrderChild> childs = orderChildDao.listCompleteByOrderNos(result.get());
if(CollectionUtils.isEmpty(childs)){
priceList.forEach(item-> charts.add(HistoryLineTranVolumeChartVO.builder()
.pendingOrderFreight(item).number(0).build()));
return charts;
}
LinkedHashMap<BigDecimal,Integer> priceMap =
priceList.stream().collect(Collectors.toMap(item->item,item->0,
(existing, replacement) -> existing, // 如果有冲突的键,则保留现有的键
LinkedHashMap::new));
//进行相同路线运费拉运单数统计
childs.forEach(item->{
if(priceMap.containsKey(item.getFreightPrice())){
priceMap.put(item.getFreightPrice(),priceMap.get(item.getFreightPrice()) + 1);
}
});
for (Map.Entry<BigDecimal, Integer> entry : priceMap.entrySet()) {
charts.add(HistoryLineTranVolumeChartVO.builder().pendingOrderFreight(entry.getKey()).number(
entry.getValue()).build());
}
return charts;
}
@Override
public NeedAlertSuperviseInfoResultVO needAlertSuperviseInfo(NeedAlertSuperviseInfoParam param) {
//查询运单信息
OrderChild orderChild = orderChildDao.getByChildNo(param.getChildNo()).orElseThrow(DATA_NOT_FIND);
SuperviseInfo superviseInfo = getSuperviseInfoWithSubStatus(orderChild.getOrderNo(), orderChild.getChildNo(), orderChild.getTruckNo());
//返回对象
NeedAlertSuperviseInfoResultVO result = new NeedAlertSuperviseInfoResultVO();
if (superviseInfo != null) {
result.setNeedAlert(OrderChildEnum.NeedAlertEnum.FAIL.getCode());
result.setLocation(superviseInfo.getTaskAddress());
result.setMobile(superviseInfo.getSuperviseMobile());
result.setSupervisor(superviseInfo.getSuperviseContacts());
return result;
}
result.setNeedAlert(OrderChildEnum.NeedAlertEnum.OK.getCode());
return result;
}
@Transactional(rollbackFor = Exception.class)
@Override
public UpdateCarrierBatchCancelVO updateCarrierBatchCancel(OrderChildCarrierBatchCancelParam param) {
......@@ -3483,6 +3640,14 @@ public class OrderChildServiceImpl implements OrderChildService {
notCancelOrderChildList.add(child);
}
}
//如果可取消的订单为空。直接返回
if(CollectionUtils.isEmpty(canCancelOrderChildList)){
UpdateCarrierBatchCancelVO result = new UpdateCarrierBatchCancelVO();
result.setFailChildNoList(notCancelOrderChildList.stream().map(OrderChild :: getChildNo).collect(Collectors.toList()));
result.setSuccessCount(canCancelOrderChildList.size());
return result;
}
// 返回吨数
batchUpdateOrderGoodsWeightReturn(canCancelOrderChildList);
......
......@@ -178,6 +178,13 @@ public class OrderGoodsServiceImpl implements OrderGoodsService, InitializingBea
orderGoodsVO.setLoadBeginTime(orderInfoFeign.getLoadBeginTime());
orderGoodsVO.setLoadEndTime(orderInfoFeign.getLoadEndTime());
orderGoodsVO.setResidueTransportWeight(residueWeight);
orderGoodsVO.setResidueTransportWeight(residueWeight);
//货源地信息
orderGoodsVO.setSendContact(orderInfoFeign.getSendContact());
orderGoodsVO.setSendContactPhone(orderInfoFeign.getSendContactPhone());
orderGoodsVO.setSendWaitSystem(orderInfoFeign.getSendWaitSystem());
orderGoodsVO.setSendWaitSystemName(orderInfoFeign.getSendWaitSystemName());
orderGoodsVO.setSendWaitMode(orderInfoFeign.getSendWaitMode());
//获取订单配置的违约金方案
OwnerQuotationDetailVO quotationDetailVO = quotationService.getQuotationByOrderNo(orderNo).orElseThrow(PerformanceResultEnum.DATA_NOT_FIND);
......@@ -495,7 +502,6 @@ public class OrderGoodsServiceImpl implements OrderGoodsService, InitializingBea
UserSessionData loginUserInfo = TokenUtil.getLoginUserInfo();
OrderGoodsEditParams orderGoodsParams = param.getOrderGoodsParams();
OrderGoods oldOrderGoods = orderGoodsDao.getByOrderGoodsNo(orderGoodsParams.getOrderGoodsNo()).get();
//FeignOrderVO orderInfoFeign = orderFeign.getOrderInfoFeign(param.getOrderNo());
if (orderGoodsParams.getExtractWeight().compareTo(oldOrderGoods.getAlreadyTransportWeight()) < 0) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, "当前货单提取吨数不能小于货单已拉运吨数");
}
......@@ -503,27 +509,25 @@ public class OrderGoodsServiceImpl implements OrderGoodsService, InitializingBea
//考虑到借吨、恢复吨数的货单,逻辑判断实际的提取吨数
BigDecimal oldResidueTransportWeight = this.calcOrderGoodsResidueWeight
(oldOrderGoods.getExtractWeight(),oldOrderGoods.getAlreadyTransportWeight());
BigDecimal realExtractWeight = oldResidueTransportWeight.compareTo(BigDecimal.ZERO) == 0?
oldOrderGoods.getAlreadyTransportWeight():oldOrderGoods.getAlreadyTransportWeight().add(oldResidueTransportWeight);
oldOrderGoods.setExtractWeight(realExtractWeight);
//本次提取增加或者减少的吨数 = 本次提取的吨数 - 货单原实际提取吨数
BigDecimal changeWeight = orderGoodsParams.getExtractWeight().subtract(realExtractWeight);
BigDecimal residueTransportWeight = this.calcOrderGoodsResidueWeight
(oldOrderGoods.getExtractWeight(),oldOrderGoods.getAlreadyTransportWeight());
OrderExtractWeightVO orderCanExtractWeight = orderWeightService.getOrderCanExtractWeight(param.getOrderNo());
BigDecimal canExtractWeight = orderCanExtractWeight.getCanExtractWeight();
BigDecimal changeWeight = orderGoodsParams.getExtractWeight().subtract(oldOrderGoods.getExtractWeight());
//当计算出的订单可提取量为负数时,说明订单下调吨数,货单超过订单量,所以货单编辑吨数的时候只能进行下调操作
if(canExtractWeight.compareTo(BigDecimal.ZERO) < 0 && changeWeight.compareTo(BigDecimal.ZERO) > 0){
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, "当前货单总量已超吨,只能做吨数下调操作");
if (changeWeight.compareTo(BigDecimal.ZERO) > 0) {
orderGoodsParams.setResidueTransportWeight(residueTransportWeight.add(changeWeight));
}else if (changeWeight.compareTo(BigDecimal.ZERO) < 0 ){
orderGoodsParams.setResidueTransportWeight(orderGoodsParams.getExtractWeight().subtract(oldOrderGoods.getAlreadyTransportWeight()));
} else {
//当编辑吨数等于0 的时候,不进行拦截
orderGoodsParams.setResidueTransportWeight(residueTransportWeight);
}
BigDecimal realExtractWeight = oldResidueTransportWeight.compareTo(BigDecimal.ZERO) <= 0?
oldOrderGoods.getAlreadyTransportWeight():oldOrderGoods.getExtractWeight();
oldOrderGoods.setExtractWeight(realExtractWeight);
BigDecimal orderResidueWeight = orderWeightService.getOrderResidueWeight(param.getOrderNo());
if (orderResidueWeight.compareTo(orderGoodsParams.getExtractWeight().subtract(oldOrderGoods.getExtractWeight())) < 0) {
if (orderResidueWeight.compareTo(changeWeight) < 0) {
throw new ServiceSystemException(PerformanceResultEnum.HTTP_ERROR, "当前货单提取吨数已超订单可提取吨数");
}
......
......@@ -303,6 +303,41 @@ public class TruckTraceServiceImpl implements TruckTraceService {
return null;
}
/**
* 获取卡车当前位置 5分钟内的位置
* @param truckNo 卡车车牌号
* @return 位置
*/
@Override
public BigDecimal[] getTruckCurrentPosition(String truckNo) {
String beginTime = LocalDateTimeUtils.formatTime(LocalDateTime.now().minusMinutes(LAST_POSITION_TIME));
return getTruckCurrentPosition(truckNo, beginTime);
}
/**
* 获取卡车当前位置
* @param truckNo 卡车车牌号
* @param beginTime 开始时间
* @return 位置
*/
@Override
public BigDecimal[] getTruckCurrentPosition(String truckNo, String beginTime) {
String endTime = LocalDateTimeUtils.formatTime();
// 车辆
List<TruckTraceESPlus> list = truckTraceESPlusMapper.selectList(new LambdaEsQueryWrapper<TruckTraceESPlus>()
.eq(TruckTraceESPlus::getTruckNo, truckNo)
.ge(TruckTraceESPlus::getGpsTime, beginTime)
.le(TruckTraceESPlus::getGpsTime, endTime)
.orderByDesc("gpsTime")
.limit(1)
);
if (!list.isEmpty()){
return list.get(0).getLocation();
}
return null;
}
@Override
public int getParkTime(String truckNo, Long userNo, LocalDateTime beginDateTime) {
return getParkTime(truckNo, userNo, beginDateTime, LocalDateTime.now());
......
......@@ -23,6 +23,10 @@ public interface TruckTraceService {
BigDecimal[] getCurrentPosition(String truckNo, Long userNo, String beginTime);
BigDecimal[] getTruckCurrentPosition(String truckNo);
BigDecimal[] getTruckCurrentPosition(String truckNo, String beginTime);
int getParkTime(String truckNo, Long userNo, LocalDateTime beginDateTime);
int getParkTime(String truckNo, Long userNo, LocalDateTime beginTime, LocalDateTime endTime);
......
......@@ -16,8 +16,6 @@ import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.StringJoiner;
......@@ -181,38 +179,34 @@ public class OrderChildSqlProvider {
return sql;
}
public String findArtificialCancelOrder(@Param("param") ArtificialCancelOrderQueryParam param) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT child_no, goods_name, freight_price, order_no, ");
sql.append("send_address, receive_address, ");
sql.append("driver_user_no, driver_name, driver_mobile, ");
sql.append("truck_no, unload_pound_no, weight, ");
sql.append("cancel_remark, pound_status, status, ");
sql.append("DATE_FORMAT(load_deadline, '%Y-%m-%d %H:%i:%s') AS loadDeadline, ");
sql.append("DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS createTime, ");
sql.append("DATE_FORMAT(unload_time, '%Y-%m-%d %H:%i:%s') AS unloadTime ");
sql.append("FROM order_child ");
sql.append("WHERE 1=1 ");
List<String> conditions = new ArrayList<>();
public String findArtificialCancelOrder(ArtificialCancelOrderQueryParam param) {
return new SQL() {{
SELECT("child_no, goods_name, freight_price, order_no, " +
"send_address, receive_address, " +
"driver_user_no, driver_name, driver_mobile, " +
"truck_no, unload_pound_no, weight, " +
"cancel_remark, pound_status, status, remove_load_limit_status, " +
"DATE_FORMAT(load_deadline, '%Y-%m-%d %H:%i:%s') AS loadDeadline, " +
"DATE_FORMAT(create_time, '%Y-%m-%d %H:%i:%s') AS createTime, " +
"DATE_FORMAT(unload_time, '%Y-%m-%d %H:%i:%s') AS unloadTime ");
FROM("order_child ");
if (StringUtils.isNotBlank(param.getOrderChildNo())) {
conditions.add("child_no = #{param.orderChildNo}");
WHERE("child_no = #{param.orderChildNo,jdbcType=VARCHAR}");
}
if (StringUtils.isNotBlank(param.getTruckNo())) {
conditions.add("truck_no = #{param.truckNo}");
WHERE("truck_no = #{param.truckNo,jdbcType=VARCHAR}");
}
List<Integer> statuses = Arrays.asList(
OrderChildEnum.Status.CREATED.getCode(),
OrderChildEnum.Status.GO_TO_SEND.getCode(),
OrderChildEnum.Status.ARRIVE_SEND.getCode(),
OrderChildEnum.Status.LOAD.getCode(),
OrderChildEnum.Status.GO_TO_RECEIVE.getCode(),
OrderChildEnum.Status.ARRIVE_RECEIVE.getCode()
);
conditions.add("status IN (" + StringUtils.join(statuses, ", ") + ")");
sql.append("AND ");
sql.append(StringUtils.join(conditions, " AND "));
return sql.toString();
//支付状态 可以忽略
WHERE("status >=" + OrderChildEnum.Status.CREATED.getCode());
WHERE("status <=" + OrderChildEnum.Status.ARRIVE_RECEIVE.getCode());
}}.toString();
}
public static void main(String[] args) {
ArtificialCancelOrderQueryParam param = new ArtificialCancelOrderQueryParam();
param.setTruckNo("A123456");
param.setOrderChildNo("CYD1234567890");
System.out.println(new OrderChildSqlProvider().findArtificialCancelOrder(param));
}
public String orderChildCancelRecord(@Param("page") Page<OrderChildVO> page, @Param("param") OrderChildCancelRecordParam param) {
......
......@@ -9,14 +9,12 @@ import com.msl.common.enums.ResultCodeEnum;
import com.msl.common.exception.ServiceSystemException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.dromara.easyes.common.utils.CollectionUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.*;
/**
* @Author: aiqingguo
......@@ -47,6 +45,26 @@ public class GdService {
return getRoute(gaodeKey, originLongitude, originLatitude, destinationLongitude, destinationLatitude);
}
/**
* 获取最短距离路径
* @param originLongitude
* @param originLatitude
* @param destinationLongitude
* @param destinationLatitude
* @return
*/
public Integer getShortestRouteDistance(BigDecimal originLongitude, BigDecimal originLatitude,
BigDecimal destinationLongitude, BigDecimal destinationLatitude) {
List<GdRouteDTO> routeList = getRoute(gaodeKey, originLongitude, originLatitude, destinationLongitude, destinationLatitude);
if (CollectionUtils.isNotEmpty(routeList)) {
Optional<GdRouteDTO> minRoute = routeList.stream()
.min((r1, r2) -> Double.compare(r1.getDistance(), r2.getDistance()));
return minRoute.map(GdRouteDTO::getDistance).orElse(null);
}
return null;
}
public static List<GdRouteDTO> getRoute(String key, BigDecimal originLongitude, BigDecimal originLatitude,
BigDecimal destinationLongitude, BigDecimal destinationLatitude) {
//log.info("高德线路规划开始");
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论