|
|
@@ -10,7 +10,6 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.github.pagehelper.PageHelper;
|
|
|
import com.github.pagehelper.PageInfo;
|
|
|
import com.google.common.collect.Lists;
|
|
|
-import com.mysql.cj.x.protobuf.MysqlxDatatypes;
|
|
|
import com.sckw.contract.api.RemoteContractService;
|
|
|
import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
|
|
|
import com.sckw.core.common.enums.StringConstant;
|
|
|
@@ -31,7 +30,6 @@ import com.sckw.excel.utils.DateUtil;
|
|
|
import com.sckw.excel.utils.ValidUtil;
|
|
|
import com.sckw.fleet.api.RemoteFleetService;
|
|
|
import com.sckw.fleet.api.model.vo.RTruckVo;
|
|
|
-import com.sckw.fleet.api.model.vo.TmsTruckAxleNumVO;
|
|
|
import com.sckw.fleet.api.model.vo.TruckDispatchCoefficientVO;
|
|
|
import com.sckw.manage.api.RemoteManageService;
|
|
|
import com.sckw.manage.api.model.dto.res.FindEntCooperateResVo;
|
|
|
@@ -85,6 +83,7 @@ import java.text.DecimalFormat;
|
|
|
import java.text.ParseException;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneId;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -3220,24 +3219,12 @@ public class KwtAcceptCarriageOrderService {
|
|
|
List<KwtLogisticsOrderGoods> savelogOrderGoodsList = Lists.newArrayList();
|
|
|
List<KwtLogisticsOrderContract> saveContractList = Lists.newArrayList();
|
|
|
List<KwtLogisticsOrderUnit> savelogOrderUnitList = Lists.newArrayList();
|
|
|
+ List<KwtLogisticsOrderCirculate> savelogOrderCirculateList = Lists.newArrayList();
|
|
|
+ //装卸地之间距离
|
|
|
+ String distance = getDistance(orderDTO);
|
|
|
//实际派车数 20
|
|
|
Integer actualDisPatch = orderDTO.getActualDisPatch() == null ? 0 : orderDTO.getActualDisPatch();
|
|
|
//已派车辆数(累计已分配的车辆数)
|
|
|
- //装卸地之间距离
|
|
|
- double distanceKm = LocUtils.calculateDistanceByAmap(
|
|
|
- Optional.ofNullable(orderDTO.getLoadLng()).map(String::valueOf).orElse(null),
|
|
|
- Optional.ofNullable(orderDTO.getLoadLat()).map(String::valueOf).orElse(null),
|
|
|
- Optional.ofNullable(orderDTO.getUnloadLng()).map(String::valueOf).orElse(null),
|
|
|
- Optional.ofNullable(orderDTO.getUnloadLat()).map(String::valueOf).orElse(null));
|
|
|
- // 如果高德API调用失败,使用原始方法作为备选
|
|
|
- if (distanceKm == -1) {
|
|
|
- distanceKm = DistanceUtils.calculateDistance(
|
|
|
- Optional.ofNullable(orderDTO.getLoadLng()).map(Double::valueOf).orElse(null),
|
|
|
- Optional.ofNullable(orderDTO.getLoadLat()).map(Double::valueOf).orElse(null),
|
|
|
- Optional.ofNullable(orderDTO.getUnloadLng()).map(Double::valueOf).orElse(null),
|
|
|
- Optional.ofNullable(orderDTO.getUnloadLat()).map(Double::valueOf).orElse(null));
|
|
|
- }
|
|
|
- String distance = String.valueOf(distanceKm);
|
|
|
Integer dispatched = 0;
|
|
|
for (LogisticData x : logisticInfo) {
|
|
|
Long lOrderId = new IdWorker(NumberConstant.ONE).nextId();
|
|
|
@@ -3249,7 +3236,7 @@ public class KwtAcceptCarriageOrderService {
|
|
|
break;
|
|
|
}
|
|
|
//校验物流企业可派车辆
|
|
|
- List<RTruckVo> signEntAvailableVehicle = getSignEntAvailableVehicle(orderDTO.getGoodsId(), x.getAcceptCompanyId());
|
|
|
+ List<RTruckVo> signEntAvailableVehicle = getSignEntAvailableVehicle(orderDTO, x.getAcceptCompanyId());
|
|
|
if (CollectionUtils.isEmpty(signEntAvailableVehicle)) {
|
|
|
continue;
|
|
|
}
|
|
|
@@ -3280,7 +3267,7 @@ public class KwtAcceptCarriageOrderService {
|
|
|
setLogisticUnitInfo(orderDTO, x, lOrderId, savelogOrderUnitList);
|
|
|
|
|
|
//创建物流派单数据
|
|
|
- setLogisticCirculateInfo(x, lOrderId, signEntAvailableVehicle);
|
|
|
+ setLogisticCirculateInfo(orderDTO, x, lOrderId, actualUseVehicles, savelogOrderCirculateList);
|
|
|
|
|
|
} else {
|
|
|
//物流订单信息
|
|
|
@@ -3300,7 +3287,7 @@ public class KwtAcceptCarriageOrderService {
|
|
|
}
|
|
|
|
|
|
// 批量保存并检查结果
|
|
|
- saveBatch(saveLogisticsOrderList, saveAddressList, savelogOrderGoodsList, saveContractList, savelogOrderUnitList, lOrderNo);
|
|
|
+ saveBatch(saveLogisticsOrderList, saveAddressList, savelogOrderGoodsList, saveContractList, savelogOrderUnitList, savelogOrderCirculateList, lOrderNo);
|
|
|
|
|
|
//校验派车总量,处理未达标场景
|
|
|
int unDispatched = actualDisPatch - dispatched;
|
|
|
@@ -3313,37 +3300,38 @@ public class KwtAcceptCarriageOrderService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 创建物流派单数据
|
|
|
- * @param x
|
|
|
- * @param lOrderId
|
|
|
- * @param signEntAvailableVehicle
|
|
|
+ * 获取装卸货地之间的导航距离
|
|
|
+ * @param orderDTO
|
|
|
+ * @return
|
|
|
*/
|
|
|
- private void setLogisticCirculateInfo(LogisticData x, Long lOrderId, List<RTruckVo> signEntAvailableVehicle) {
|
|
|
- DispatchCarReq req = new DispatchCarReq();
|
|
|
- req.setEntId(String.valueOf(x.getAcceptCompanyId()));
|
|
|
- req.setLogisticOrderId(String.valueOf(lOrderId));
|
|
|
-
|
|
|
- List<DispatchCarReq.CarInfo> carInfoList = signEntAvailableVehicle.stream().map(ve -> {
|
|
|
- DispatchCarReq.CarInfo carInfo = new DispatchCarReq.CarInfo();
|
|
|
- carInfo.setTruckId(Optional.ofNullable(ve.getId()).map(String::valueOf).orElse(null));
|
|
|
- carInfo.setTruckNo(ve.getTruckNo());
|
|
|
- return carInfo;
|
|
|
- }).collect(Collectors.toList());
|
|
|
-
|
|
|
- req.setCarInfos(carInfoList);
|
|
|
- logisticsConsignmentService.dispatchCar(req);
|
|
|
+ private static String getDistance(AddLogisticOrderDTO orderDTO) {
|
|
|
+ double distanceKm = LocUtils.calculateDistanceByAmap(
|
|
|
+ Optional.ofNullable(orderDTO.getLoadLng()).map(String::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(orderDTO.getLoadLat()).map(String::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(orderDTO.getUnloadLng()).map(String::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(orderDTO.getUnloadLat()).map(String::valueOf).orElse(null));
|
|
|
+ // 如果高德API调用失败,使用原始方法作为备选
|
|
|
+ if (distanceKm == -1) {
|
|
|
+ distanceKm = DistanceUtils.calculateDistance(
|
|
|
+ Optional.ofNullable(orderDTO.getLoadLng()).map(Double::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(orderDTO.getLoadLat()).map(Double::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(orderDTO.getUnloadLng()).map(Double::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(orderDTO.getUnloadLat()).map(Double::valueOf).orElse(null));
|
|
|
+ }
|
|
|
+ String distance = String.valueOf(distanceKm);
|
|
|
+ return distance;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 单个物流企业满足轴数可派车
|
|
|
- * @param goodId
|
|
|
+ * @param orderDTO
|
|
|
* @param logEntId
|
|
|
* @return
|
|
|
*/
|
|
|
- public List<RTruckVo> getSignEntAvailableVehicle(Long goodId, Long logEntId) {
|
|
|
+ public List<RTruckVo> getSignEntAvailableVehicle(AddLogisticOrderDTO orderDTO, Long logEntId) {
|
|
|
|
|
|
//查询商品轴数
|
|
|
- KwpGoods goodsById = goodsInfoService.getGoodsById(goodId);
|
|
|
+ KwpGoods goodsById = goodsInfoService.getGoodsById(orderDTO.getGoodsId());
|
|
|
if (goodsById == null) {
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.PARAM_ERROR, "【创建物流订单】商品信息不能为空!");
|
|
|
}
|
|
|
@@ -3356,13 +3344,14 @@ public class KwtAcceptCarriageOrderService {
|
|
|
//过滤满足轴数的车辆
|
|
|
List<RTruckVo> truckVoFilterList = truckVoList.stream()
|
|
|
.filter(Objects::nonNull)
|
|
|
- .filter(truck -> axleNumStrId.contains(truck.getCarAxis()))
|
|
|
+ .filter(truck -> truck.getCarAxisId() != null)
|
|
|
+ .filter(truck -> axleNumStrId.contains(String.valueOf(truck.getCarAxisId())))
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
//过滤满足车辆最大可派任务数的车辆
|
|
|
return truckVoFilterList.stream().filter(Objects::nonNull)
|
|
|
// 过滤已派单且生效中的车辆 + 校验最大可派任务数
|
|
|
- .filter(this::isTruckAvailable)
|
|
|
+ .filter(truck -> isTruckAvailable(truck, orderDTO.getEntId()))
|
|
|
.collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
@@ -3372,7 +3361,7 @@ public class KwtAcceptCarriageOrderService {
|
|
|
* @param truck
|
|
|
* @return
|
|
|
*/
|
|
|
- private boolean isTruckAvailable(RTruckVo truck) {
|
|
|
+ private boolean isTruckAvailable(RTruckVo truck, Long entId) {
|
|
|
// 查询车辆对应的物流订单合同(按车辆编号)
|
|
|
String truckNo = truck.getTruckNo();
|
|
|
if (StringUtils.isEmpty(truckNo)) {
|
|
|
@@ -3383,8 +3372,15 @@ public class KwtAcceptCarriageOrderService {
|
|
|
if (CollectionUtils.isEmpty(circulatesList)) {
|
|
|
return false;
|
|
|
}
|
|
|
+ List<Long> lOrderIds = circulatesList.stream().map(KwtLogisticsOrderCirculate::getLOrderId).distinct().collect(Collectors.toList());
|
|
|
+ //查询当前车辆正在运输的物流订单
|
|
|
+ List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByLOrderIdsAndStatus(lOrderIds);
|
|
|
+ List<Long> inTransitLOrderIds = logisticsOrders.stream().map(KwtLogisticsOrder::getId).distinct().collect(Collectors.toList());
|
|
|
+ //过滤出正在运输的派车订单数据
|
|
|
+ List<KwtLogisticsOrderCirculate> orderCirculates = circulatesList.stream()
|
|
|
+ .filter(cir -> inTransitLOrderIds.contains(cir.getLOrderId()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
|
- Long entId = LoginUserHolder.getEntId();
|
|
|
TruckDispatchCoefficientVO truckDispatchVO = fleetService.findAutoTruckDispatchByEntId(entId);
|
|
|
if (truckDispatchVO == null) {
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "未找到自动派车系数!");
|
|
|
@@ -3395,15 +3391,18 @@ public class KwtAcceptCarriageOrderService {
|
|
|
throw new BusinessPlatfromException(ErrorCodeEnum.DATA_NOT_EXIST, "自动派单车辆最大任务数需大于0!");
|
|
|
}
|
|
|
//TODO 车辆最大可派任务数校验
|
|
|
- boolean available = circulatesList.size() < vehicleMaxTasks;
|
|
|
+ boolean available = orderCirculates.size() <= vehicleMaxTasks;
|
|
|
return available;
|
|
|
|
|
|
}
|
|
|
|
|
|
- private void saveBatch(List<KwtLogisticsOrder> saveLogisticsOrderList, List<KwtLogisticsOrderAddress> saveAddressList, List<KwtLogisticsOrderGoods> savelogOrderGoodsList, List<KwtLogisticsOrderContract> saveContractList, List<KwtLogisticsOrderUnit> savelogOrderUnitList, String lOrderNo) {
|
|
|
- log.info("开始批量保存物流订单数据,订单数量:{},地址数量:{},商品数量:{},合同数量:{},单位数量:{}",
|
|
|
+ private void saveBatch(List<KwtLogisticsOrder> saveLogisticsOrderList, List<KwtLogisticsOrderAddress> saveAddressList,
|
|
|
+ List<KwtLogisticsOrderGoods> savelogOrderGoodsList, List<KwtLogisticsOrderContract> saveContractList,
|
|
|
+ List<KwtLogisticsOrderUnit> savelogOrderUnitList, List<KwtLogisticsOrderCirculate> savelogOrderCirculateList,
|
|
|
+ String lOrderNo) {
|
|
|
+ log.info("开始批量保存物流订单数据,订单数量:{},地址数量:{},商品数量:{},合同数量:{},单位数量:{}, 派车数量:{}",
|
|
|
saveLogisticsOrderList.size(), saveAddressList.size(), savelogOrderGoodsList.size(),
|
|
|
- saveContractList.size(), savelogOrderUnitList.size());
|
|
|
+ saveContractList.size(), savelogOrderUnitList.size(), savelogOrderCirculateList.size());
|
|
|
|
|
|
try {
|
|
|
if (!saveLogisticsOrderList.isEmpty()) {
|
|
|
@@ -3446,6 +3445,23 @@ public class KwtAcceptCarriageOrderService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (!savelogOrderCirculateList.isEmpty()) {
|
|
|
+ boolean result6 = logisticsOrderCirculateRepository.saveBatch(savelogOrderCirculateList);
|
|
|
+ log.info("物流订单派车保存结果:{}", result6);
|
|
|
+ if (!result6) {
|
|
|
+ throw new BusinessException("物流订单派车保存失败");
|
|
|
+ }
|
|
|
+ //派车成功修改物流订单状态
|
|
|
+ saveLogisticsOrderList.forEach(
|
|
|
+ logOrder -> logOrder.setStatus(LogisticsOrderV1Enum.IN_TRANSIT.getCode())
|
|
|
+ );
|
|
|
+
|
|
|
+ Boolean updateFlag = logisticsOrderRepository.updateBatchById(saveLogisticsOrderList);
|
|
|
+ if (!updateFlag) {
|
|
|
+ throw new BusinessException("修改物流订单状态失败");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
log.info("物流订单批量保存成功,订单编号:{}", lOrderNo);
|
|
|
} catch (Exception e) {
|
|
|
log.error("物流订单批量保存失败,订单编号:{},错误信息:{}", lOrderNo, e.getMessage(), e);
|
|
|
@@ -3650,4 +3666,37 @@ public class KwtAcceptCarriageOrderService {
|
|
|
kwtLogisticsOrder.setDistance(distance);
|
|
|
saveLogisticsOrderList.add(kwtLogisticsOrder);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建物流派单数据
|
|
|
+ * @param x
|
|
|
+ * @param lOrderId
|
|
|
+ * @param signEntAvailableVehicle
|
|
|
+ */
|
|
|
+ private void setLogisticCirculateInfo(AddLogisticOrderDTO orderDTO, LogisticData x, Long lOrderId,
|
|
|
+ List<RTruckVo> signEntAvailableVehicle,
|
|
|
+ List<KwtLogisticsOrderCirculate> savelogOrderCirculateList) {
|
|
|
+ for (RTruckVo truckVo : signEntAvailableVehicle) {
|
|
|
+ KwtLogisticsOrderCirculate logisticsOrderCirculate = new KwtLogisticsOrderCirculate();
|
|
|
+ logisticsOrderCirculate.setEntId(x.getAcceptCompanyId());
|
|
|
+ logisticsOrderCirculate.setLOrderId(lOrderId);
|
|
|
+ logisticsOrderCirculate.setTruckId(truckVo.getId());
|
|
|
+ logisticsOrderCirculate.setTruckNo(truckVo.getTruckNo());
|
|
|
+ logisticsOrderCirculate.setDriverId(-9L);
|
|
|
+ Date startDate = Objects.nonNull(orderDTO.getStartTime()) ?
|
|
|
+ Date.from(orderDTO.getStartTime().atStartOfDay(ZoneId.systemDefault()).toInstant()) : null;
|
|
|
+ logisticsOrderCirculate.setStartTime(startDate);
|
|
|
+ Date endDate = Objects.nonNull(orderDTO.getEndTime()) ?
|
|
|
+ Date.from(orderDTO.getEndTime().atStartOfDay(ZoneId.systemDefault()).toInstant()) : null;
|
|
|
+ logisticsOrderCirculate.setEndTime(endDate);
|
|
|
+ logisticsOrderCirculate.setUnit(orderDTO.getGoodsUnit());
|
|
|
+ logisticsOrderCirculate.setEntrustAmount(BigDecimal.ZERO);
|
|
|
+ Date date = new Date();
|
|
|
+ logisticsOrderCirculate.setCreateBy(LoginUserHolder.getUserId());
|
|
|
+ logisticsOrderCirculate.setCreateTime(date);
|
|
|
+ logisticsOrderCirculate.setUpdateBy(LoginUserHolder.getUserId());
|
|
|
+ logisticsOrderCirculate.setUpdateTime(date);
|
|
|
+ savelogOrderCirculateList.add(logisticsOrderCirculate);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|