|
|
@@ -1,35 +1,51 @@
|
|
|
package com.sckw.transport.service.app;
|
|
|
|
|
|
|
|
|
+import cn.hutool.core.map.MapUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.google.common.collect.Lists;
|
|
|
+import com.google.common.collect.Maps;
|
|
|
import com.sckw.contract.api.RemoteContractService;
|
|
|
+import com.sckw.core.common.enums.enums.DictEnum;
|
|
|
+import com.sckw.core.common.enums.enums.DictTypeEnum;
|
|
|
import com.sckw.core.common.enums.enums.ErrorCodeEnum;
|
|
|
import com.sckw.core.exception.BusinessPlatfromException;
|
|
|
import com.sckw.core.model.constant.Global;
|
|
|
import com.sckw.core.model.enums.AddressTypeEnum;
|
|
|
import com.sckw.core.model.enums.CarWaybillV1Enum;
|
|
|
import com.sckw.core.model.enums.LogisticsOrderV1Enum;
|
|
|
+import com.sckw.core.model.enums.UnitTypeEnum;
|
|
|
import com.sckw.core.utils.CollectionUtils;
|
|
|
+import com.sckw.core.utils.DateUtils;
|
|
|
+import com.sckw.core.web.context.LoginUserHolder;
|
|
|
+import com.sckw.core.web.response.result.PageDataResult;
|
|
|
import com.sckw.fleet.api.RemoteFleetService;
|
|
|
import com.sckw.fleet.api.model.vo.RDriverVo;
|
|
|
import com.sckw.fleet.api.model.vo.RTruckVo;
|
|
|
import com.sckw.order.api.dubbo.RemoteTradeOrderAmountService;
|
|
|
import com.sckw.order.api.dubbo.TradeOrderInfoService;
|
|
|
import com.sckw.order.api.model.OrderDetailVo;
|
|
|
+import com.sckw.order.api.model.OrderUnitInfoDetailVO;
|
|
|
import com.sckw.order.api.model.UpdateActualAmountParam;
|
|
|
import com.sckw.product.api.dubbo.GoodsInfoService;
|
|
|
+import com.sckw.product.api.model.KwpGoods;
|
|
|
import com.sckw.redis.config.RedisLockUtil;
|
|
|
import com.sckw.system.api.RemoteSystemService;
|
|
|
+import com.sckw.system.api.model.dto.res.UserCacheResDto;
|
|
|
import com.sckw.transport.common.config.MessageUrlConfig;
|
|
|
import com.sckw.transport.dao.*;
|
|
|
import com.sckw.transport.handler.*;
|
|
|
import com.sckw.transport.model.*;
|
|
|
import com.sckw.transport.model.param.*;
|
|
|
+import com.sckw.transport.model.vo.OrderCirculateTotalTakeVo;
|
|
|
+import com.sckw.transport.model.vo.OrderStatusStatisticsResp;
|
|
|
+import com.sckw.transport.model.vo.StatisticsWaybillResp;
|
|
|
import com.sckw.transport.repository.*;
|
|
|
import com.sckw.transport.service.*;
|
|
|
+import com.sckw.transport.utils.DistanceUtils;
|
|
|
import jakarta.annotation.Resource;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -56,18 +72,25 @@ import java.util.stream.Collectors;
|
|
|
public class WaybillOrderService {
|
|
|
|
|
|
private final KwtLogisticsOrderRepository logisticsOrderRepository;
|
|
|
+ private final KwtLogisticsOrderCirculateRepository logisticsOrderCirculateRepository;
|
|
|
+ private final KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
|
|
|
private final KwtLogisticsOrderAddressRepository logisticsOrderAddressRepository;
|
|
|
+ private final KwtLogisticsOrderUnitRepository logisticsOrderUnitRepository;
|
|
|
+
|
|
|
private final KwtWaybillOrderSubtaskRepository waybillOrderSubtaskRepository;
|
|
|
private final KwtWaybillOrderRepository waybillOrderRepository;
|
|
|
private final KwtWaybillOrderAddressRepository waybillOrderAddressRepository;
|
|
|
private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
|
|
|
private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
|
|
|
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
|
|
|
+ RemoteSystemService remoteSystemService;
|
|
|
@DubboReference(version = "1.0.0", group = "design", check = false, timeout = 80000)
|
|
|
TradeOrderInfoService tradeOrderInfoService;
|
|
|
-
|
|
|
@DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
|
|
|
RemoteFleetService remoteFleetService;
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
|
|
|
+ GoodsInfoService goodsInfoService;
|
|
|
|
|
|
private final TakingOrderHandler takingOrderHandler;
|
|
|
private final CancelHandler cancelHandler;
|
|
|
@@ -77,6 +100,8 @@ public class WaybillOrderService {
|
|
|
private final LeaveHandler leaveHandler;
|
|
|
private final UnloadingHandler unloadingHandler;
|
|
|
|
|
|
+ private final KwtWaybillOrderV1Service waybillOrderV1Service;
|
|
|
+
|
|
|
//载重任务量浮动吨数
|
|
|
private static final BigDecimal TWO_TONS = new BigDecimal("2");
|
|
|
//载重任务量计算比例
|
|
|
@@ -90,6 +115,469 @@ public class WaybillOrderService {
|
|
|
CarWaybillV1Enum.COMPLETION_UNLOADING.getCode()
|
|
|
);
|
|
|
|
|
|
+ // 定义进行中的状态集合
|
|
|
+ private static final List<Integer> UNDER_WAY = Arrays.asList(
|
|
|
+ CarWaybillV1Enum.PENDING_VEHICLE.getCode(),
|
|
|
+ CarWaybillV1Enum.REFUSE_TRAFFIC.getCode(),
|
|
|
+ CarWaybillV1Enum.EXIT_COMPLETED.getCode(),
|
|
|
+ CarWaybillV1Enum.WAIT_LOADING.getCode());
|
|
|
+
|
|
|
+ // 定义审核的状态集合
|
|
|
+ private static final List<Integer> REVIEW = Arrays.asList(
|
|
|
+ CarWaybillV1Enum.COMPLETION_LOADING.getCode(),
|
|
|
+ CarWaybillV1Enum.COMPLETION_UNLOADING.getCode());
|
|
|
+
|
|
|
+ // 定义已完成的状态集合
|
|
|
+ private static final List<Integer> COMPLETED = Arrays.asList(
|
|
|
+ CarWaybillV1Enum.WAIT_UNLOADING.getCode(),
|
|
|
+ CarWaybillV1Enum.APPROVAL_TREAT.getCode());
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询司机关联完成运单和累计运输量
|
|
|
+ * @param param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public OrderCirculateTotalTakeVo queryTotalTake(OrderCirculateTotalTakeParam param) {
|
|
|
+ log.info("查询司机关联完成运单和累计运输量:{}", JSON.toJSONString(param));
|
|
|
+ LambdaQueryWrapper<KwtLogisticsOrderCirculate> queryWrapper = Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery()
|
|
|
+ .eq(KwtLogisticsOrderCirculate::getEntId, param.getEntId())
|
|
|
+ .eq(KwtLogisticsOrderCirculate::getDriverId, param.getDriverId())
|
|
|
+ .eq(KwtLogisticsOrderCirculate::getDelFlag,0)
|
|
|
+ .orderByDesc(KwtLogisticsOrderCirculate::getCreateTime)
|
|
|
+ .orderByDesc(KwtLogisticsOrderCirculate::getId);
|
|
|
+ List<KwtLogisticsOrderCirculate> circulateList = logisticsOrderCirculateRepository.list(queryWrapper);
|
|
|
+ if (CollectionUtils.isEmpty(circulateList)) {
|
|
|
+ log.info("当前司机的无运单,driverId: {}", JSON.toJSONString(param));
|
|
|
+ return new OrderCirculateTotalTakeVo();
|
|
|
+ }
|
|
|
+
|
|
|
+ //总运单量
|
|
|
+ int totalTake = circulateList.stream()
|
|
|
+ .filter(cr -> cr.getTotalTake() != null)
|
|
|
+ .mapToInt(KwtLogisticsOrderCirculate::getTotalTake)
|
|
|
+ .sum();
|
|
|
+ //总运输量
|
|
|
+ BigDecimal toalEntrustAmount = circulateList.stream().map(KwtLogisticsOrderCirculate::getEntrustAmount)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ //单位
|
|
|
+ String unit = circulateList.stream().map(KwtLogisticsOrderCirculate::getUnit)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .findFirst().orElse(null);
|
|
|
+
|
|
|
+ OrderCirculateTotalTakeVo totalTakeVo = new OrderCirculateTotalTakeVo();
|
|
|
+ totalTakeVo.setTotalTake(totalTake);
|
|
|
+ totalTakeVo.setEntrustAmount(toalEntrustAmount);
|
|
|
+ totalTakeVo.setUnit(unit);
|
|
|
+ log.info("查询司机关联完成运单和累计运输量成功,结果:{}", JSON.toJSONString(totalTakeVo));
|
|
|
+
|
|
|
+ return totalTakeVo;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询司机关联车辆的物流订单
|
|
|
+ * @param param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public PageDataResult<LogisticsOrderResp> queryTruckLogisticsOrder(OrderCirculateQueryParam param) {
|
|
|
+ log.info("查询司机关联车辆的物流订单:{}", JSON.toJSONString(param));
|
|
|
+ LambdaQueryWrapper<KwtLogisticsOrderCirculate> queryWrapper = Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery()
|
|
|
+ .eq(KwtLogisticsOrderCirculate::getEntId, param.getEntId())
|
|
|
+ .eq(KwtLogisticsOrderCirculate::getTruckNo, param.getTruckNo())
|
|
|
+ .eq(KwtLogisticsOrderCirculate::getDelFlag, 0)
|
|
|
+ .orderByDesc(KwtLogisticsOrderCirculate::getCreateTime)
|
|
|
+ .orderByDesc(KwtLogisticsOrderCirculate::getId);//TODO donglang 运单状态
|
|
|
+ //车牌映射的物流订单
|
|
|
+ Page<KwtLogisticsOrderCirculate> logOrderCirculateList = logisticsOrderCirculateRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), queryWrapper);
|
|
|
+ List<KwtLogisticsOrderCirculate> records = logOrderCirculateList.getRecords();
|
|
|
+ if (CollectionUtils.isEmpty(records)) {
|
|
|
+ log.info("当前车辆无派单订单,truckNo:{}", param.getTruckNo());
|
|
|
+ return PageDataResult.empty(param.getPageNum(), param.getPageSize());
|
|
|
+ }
|
|
|
+ //车牌关联物流订单
|
|
|
+ Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap = records.stream().collect(Collectors.toMap(KwtLogisticsOrderCirculate::getLOrderId,
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ List<Long> logOrderIdList = records.stream().map(KwtLogisticsOrderCirculate::getLOrderId)
|
|
|
+ .filter(Objects::nonNull).collect(Collectors.toList());
|
|
|
+
|
|
|
+ //物流订单
|
|
|
+ List<KwtLogisticsOrder> logOrderList = logisticsOrderRepository.queryByLogisticsOrderIds(logOrderIdList);
|
|
|
+ if (CollectionUtils.isEmpty(logOrderList)) {
|
|
|
+ log.info("当前车辆无物流订单,truckNo:{}", param.getTruckNo());
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_STATUS_ERROR, "当前车辆无物流订单");
|
|
|
+ }
|
|
|
+
|
|
|
+ //商品
|
|
|
+ List<KwtLogisticsOrderGoods> logOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
|
|
|
+ if (CollectionUtils.isEmpty(logOrderGoods)) {
|
|
|
+ log.info("当前车辆的物流订单无商品信息,truckNo:{}", param.getTruckNo());
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_GOODS, "当前车辆的物流订单无商品信息");
|
|
|
+ }
|
|
|
+
|
|
|
+ //物流id映射物流商品
|
|
|
+ Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap = logOrderGoods.stream().collect(Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId,
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+ List<Long> goodsIds = logOrderGoods.stream().map(KwtLogisticsOrderGoods::getGoodsId).distinct().collect(Collectors.toList());
|
|
|
+
|
|
|
+ //交易商品信息
|
|
|
+ Map<Long, KwpGoods> goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsIds);
|
|
|
+ if (MapUtil.isEmpty(goodsIdAndGoodsMap)) {
|
|
|
+ log.info("物流订单无关联商品信息,logOrderId:{}", JSON.toJSONString(logOrderIdList));
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_GOODS, "物流订单无关联商品信息");
|
|
|
+ }
|
|
|
+
|
|
|
+ //承运托运企业
|
|
|
+ List<KwtLogisticsOrderUnit> logOrderUnits = logisticsOrderUnitRepository.queryByLogOrderIds(logOrderIdList);
|
|
|
+ if (CollectionUtils.isEmpty(logOrderUnits)) {
|
|
|
+ log.info("物流订单无关联承运托运企业,logOrderId:{}", JSON.toJSONString(logOrderIdList));
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_ENT, "物流订单无关联承运托运企业");
|
|
|
+ }
|
|
|
+ Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap = logOrderUnits.stream()
|
|
|
+ .collect(Collectors.toMap(unit -> unit.getLOrderId() + "-" + unit.getUnitType(),
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //供应企业
|
|
|
+ Set<Long> tradeOrderIds = logOrderList.stream().map(KwtLogisticsOrder::getTOrderId).collect(Collectors.toSet());
|
|
|
+ List<OrderUnitInfoDetailVO> orderUnitDetailVOS = tradeOrderInfoService.queryOrderUnitInfByTOrderId(tradeOrderIds);
|
|
|
+ if (CollectionUtils.isEmpty(orderUnitDetailVOS)) {
|
|
|
+ log.info("交易订单无关联采取/销售企业,tradeOrderIds:{}", JSON.toJSONString(tradeOrderIds));
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.TRADE_ORDER_NOT_ENT, "交易订单无关联采取/销售企业");
|
|
|
+ }
|
|
|
+ //交易订单Map
|
|
|
+ Map<String, OrderUnitInfoDetailVO> tOrderIdAndUnitMap = orderUnitDetailVOS.stream()
|
|
|
+ .collect(Collectors.toMap(unit -> unit.getTOrderId() + "-" + unit.getUnitType(),
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //地址
|
|
|
+ Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap = getKwtLogisticsOrderAddressMap(logOrderIdList);
|
|
|
+
|
|
|
+ //组装数据
|
|
|
+ List<LogisticsOrderResp> ordderList = logOrderList.stream()
|
|
|
+ .map(order -> {
|
|
|
+ return getLogisticsOrderResp(order, logOrderIdAndGoodsMap, goodsIdAndGoodsMap, logOrderIdAndUnitMap,
|
|
|
+ tOrderIdAndUnitMap, logOrderIdAndAddressMap, logOrderIdAndCirculateMap);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ log.info("查询司机关联车辆的物流订单成功!");
|
|
|
+ return PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) ordderList.size(), ordderList);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 装卸货地址
|
|
|
+ * @param logOrderIdList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Map<String, KwtLogisticsOrderAddress> getKwtLogisticsOrderAddressMap(List<Long> logOrderIdList) {
|
|
|
+ List<KwtLogisticsOrderAddress> logOrderAddressList = logisticsOrderAddressRepository.queryByLogOrderIds(logOrderIdList);
|
|
|
+ if (CollectionUtils.isEmpty(logOrderAddressList)) {
|
|
|
+ log.info("物流订单无装卸货地址信息,logOrderIdList:{}", JSON.toJSONString(logOrderIdList));
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_ADDRESS, "物流订单无装卸货地址信息");
|
|
|
+ }
|
|
|
+ return logOrderAddressList.stream().collect(Collectors
|
|
|
+ .toMap(address -> address.getLOrderId() + "-" + address.getType(),
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 组装订单列表信息
|
|
|
+ * @param order
|
|
|
+ * @param logOrderIdAndGoodsMap
|
|
|
+ * @param goodsIdAndGoodsMap
|
|
|
+ * @param logOrderIdAndUnitMap
|
|
|
+ * @param tOrderIdAndUnitMap
|
|
|
+ * @param logOrderIdAndAddressMap
|
|
|
+ * @param logOrderIdAndCirculateMap
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private LogisticsOrderResp getLogisticsOrderResp(KwtLogisticsOrder order, Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap,
|
|
|
+ Map<Long, KwpGoods> goodsIdAndGoodsMap,
|
|
|
+ Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap,
|
|
|
+ Map<String, OrderUnitInfoDetailVO> tOrderIdAndUnitMap,
|
|
|
+ Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap,
|
|
|
+ Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap) {
|
|
|
+ LogisticsOrderResp orderResp = new LogisticsOrderResp();
|
|
|
+ orderResp.setLogisticsOrderNo(order.getLOrderNo());
|
|
|
+ //商品
|
|
|
+ KwtLogisticsOrderGoods orderGoods = logOrderIdAndGoodsMap.getOrDefault(order.getId(), new KwtLogisticsOrderGoods());
|
|
|
+ KwpGoods goods = goodsIdAndGoodsMap.getOrDefault(orderGoods.getGoodsId(), new KwpGoods());
|
|
|
+ orderResp.setGoodsId(String.valueOf(goods.getId()));
|
|
|
+ orderResp.setGoodsName(goods.getName());
|
|
|
+
|
|
|
+ //托运企业
|
|
|
+ KwtLogisticsOrderUnit consignEnt = logOrderIdAndUnitMap.getOrDefault(order.getId() + "-" + UnitTypeEnum.CONSIGN.getCode(), new KwtLogisticsOrderUnit());
|
|
|
+ orderResp.setConsignCompanyId(Optional.ofNullable(consignEnt.getEntId()).map(String::valueOf).orElse(null));
|
|
|
+ orderResp.setConsignCompanyName(consignEnt.getFirmName());
|
|
|
+ //承运企业
|
|
|
+ KwtLogisticsOrderUnit carriageEnt = logOrderIdAndUnitMap.getOrDefault(order.getId() + "-" + UnitTypeEnum.CONSIGN.getCode(), new KwtLogisticsOrderUnit());
|
|
|
+ orderResp.setCarriageCompanyId(Optional.ofNullable(carriageEnt.getEntId()).map(String::valueOf).orElse(null));
|
|
|
+ orderResp.setCarriageCompanyName(carriageEnt.getFirmName());
|
|
|
+ //供应企业
|
|
|
+ OrderUnitInfoDetailVO supplierEnt = tOrderIdAndUnitMap.getOrDefault(order.getTOrderId() + "-" + "2", new OrderUnitInfoDetailVO());
|
|
|
+ orderResp.setSupplierCompanyId(Optional.ofNullable(supplierEnt.getEntId()).map(String::valueOf).orElse(null));
|
|
|
+ orderResp.setSupplierCompanyName(supplierEnt.getFirmName());
|
|
|
+
|
|
|
+ //装货地址
|
|
|
+ KwtLogisticsOrderAddress shipmentAddress = logOrderIdAndAddressMap.getOrDefault(order.getId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new KwtLogisticsOrderAddress());
|
|
|
+ orderResp.setLoadAddress(shipmentAddress.getDetailAddress());
|
|
|
+ //卸货地址
|
|
|
+ KwtLogisticsOrderAddress takeAddress = logOrderIdAndAddressMap.getOrDefault(order.getId() + "-" + AddressTypeEnum.TAKE.getCode(), new KwtLogisticsOrderAddress());
|
|
|
+ orderResp.setUnloadAddress(takeAddress.getDetailAddress());
|
|
|
+ //装卸地之间距离
|
|
|
+ double distanceKm = DistanceUtils.calculateDistance(
|
|
|
+ Optional.ofNullable(shipmentAddress.getLat()).map(Double::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(shipmentAddress.getLng()).map(Double::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(takeAddress.getLat()).map(Double::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(takeAddress.getLng()).map(Double::valueOf).orElse(null));
|
|
|
+ orderResp.setDistanceKm(distanceKm);
|
|
|
+
|
|
|
+ //时间
|
|
|
+ orderResp.setStartTime(DateUtils.format(order.getStartTime(), DateUtils.DATE_PATTERN));
|
|
|
+ orderResp.setEndTime(DateUtils.format(order.getEndTime(), DateUtils.DATE_PATTERN));
|
|
|
+ KwtLogisticsOrderCirculate orderCirculate = logOrderIdAndCirculateMap.getOrDefault(order.getId(), new KwtLogisticsOrderCirculate());
|
|
|
+ orderResp.setSendTime(DateUtils.format(orderCirculate.getCreateTime(), DateUtils.DATE_PATTERN));
|
|
|
+
|
|
|
+ //派单人信息
|
|
|
+ UserCacheResDto userCacheResDto = remoteSystemService.queryUserCacheById(orderCirculate.getCreateBy());
|
|
|
+ orderResp.setSendOperator(Optional.ofNullable(userCacheResDto).map(UserCacheResDto::getName).orElse(null));
|
|
|
+ orderResp.setSendPhone(Optional.ofNullable(userCacheResDto).map(UserCacheResDto::getPhone).orElse(null));
|
|
|
+
|
|
|
+ return orderResp;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询司机关联车辆的物流订单
|
|
|
+ * @param param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public PageDataResult<WaybillOrderStatusResp> queryWaybillOrder(WaybillOrderQueryParam param) {
|
|
|
+ log.info("查询司机的物流运单:{}", JSON.toJSONString(param));
|
|
|
+ LambdaQueryWrapper<KwtWaybillOrder> queryWrapper = Wrappers.<KwtWaybillOrder>lambdaQuery()
|
|
|
+ .eq(KwtWaybillOrder::getEntId, param.getEntId())
|
|
|
+ .eq(KwtWaybillOrder::getTruckNo, param.getTruckNo())
|
|
|
+ .eq(KwtWaybillOrder::getDelFlag, 0)
|
|
|
+ .orderByDesc(KwtWaybillOrder::getCreateTime)
|
|
|
+ .orderByDesc(KwtWaybillOrder::getId);
|
|
|
+ //进行中
|
|
|
+ if (Objects.equals(param.getStatus(), Global.NUMERICAL_ONE)) {
|
|
|
+ queryWrapper.in(KwtWaybillOrder::getStatus, UNDER_WAY);
|
|
|
+ } else if (Objects.equals(param.getStatus(), Global.NUMERICAL_TWO)) {
|
|
|
+ //单证审核
|
|
|
+ queryWrapper.in(KwtWaybillOrder::getStatus, REVIEW);
|
|
|
+ } else if (Objects.equals(param.getStatus(), Global.NUMERICAL_THREE)) {
|
|
|
+ //已完成
|
|
|
+ queryWrapper.in(KwtWaybillOrder::getStatus, COMPLETED);
|
|
|
+ }
|
|
|
+
|
|
|
+ //当前车辆的运单
|
|
|
+ Page<KwtWaybillOrder> waybillOrderList = waybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), queryWrapper);
|
|
|
+ List<KwtWaybillOrder> records = waybillOrderList.getRecords();
|
|
|
+ if (CollectionUtils.isEmpty(records)) {
|
|
|
+ log.info("当前车辆辆的无物流运单,truckNo:{}", param.getTruckNo());
|
|
|
+ return PageDataResult.empty(param.getPageNum(), param.getPageSize());
|
|
|
+ }
|
|
|
+
|
|
|
+ //物流运单id
|
|
|
+ List<Long> wbOrderIdList = records.stream().map(KwtWaybillOrder::getId)
|
|
|
+ .filter(Objects::nonNull).distinct().collect(Collectors.toList());
|
|
|
+ //物流订单id
|
|
|
+ List<Long> logOrderIdList = records.stream().map(KwtWaybillOrder::getLOrderId)
|
|
|
+ .filter(Objects::nonNull).distinct().collect(Collectors.toList());
|
|
|
+
|
|
|
+ //子运单
|
|
|
+ List<KwtWaybillOrderSubtask> orderSubtaskList = waybillOrderSubtaskRepository.queryByWOrderIds(wbOrderIdList);
|
|
|
+ if (CollectionUtils.isEmpty(orderSubtaskList)) {
|
|
|
+ log.info("当前车辆辆的无物流子运单,truckNo:{}", param.getTruckNo());
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_SUB_NOT_FOUND, "当前物流子运单不存在");
|
|
|
+ }
|
|
|
+ Map<Long, KwtWaybillOrderSubtask> subtaskMap = orderSubtaskList.stream().collect(Collectors.toMap(subtask -> subtask.getWOrderId(),
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //派单信息
|
|
|
+ List<KwtLogisticsOrderCirculate> logOrderCirculateList = logisticsOrderCirculateRepository.queryByLogOrderIdsAndTruckNo(logOrderIdList, param.getTruckNo());
|
|
|
+ if (CollectionUtils.isEmpty(logOrderCirculateList)) {
|
|
|
+ log.info("当前车辆无派单订单,truckNo:{}", param.getTruckNo());
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_FOUND, "当前车辆无派单订单");
|
|
|
+ }
|
|
|
+ //车牌关联物流订单
|
|
|
+ Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap = logOrderCirculateList.stream().collect(
|
|
|
+ Collectors.toMap(KwtLogisticsOrderCirculate::getLOrderId, Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //物流订单
|
|
|
+ List<KwtLogisticsOrder> logOrderList = logisticsOrderRepository.queryByLogisticsOrderIds(logOrderIdList);
|
|
|
+ if (CollectionUtils.isEmpty(logOrderList)) {
|
|
|
+ log.info("当前车辆无物流订单,truckNo:{}", param.getTruckNo());
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_STATUS_ERROR, "当前车辆无物流订单");
|
|
|
+ }
|
|
|
+ Map<Long, KwtLogisticsOrder> logOrderMap = logOrderList.stream().collect(Collectors.toMap(logOrder -> logOrder.getId(),
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //物流订单商品
|
|
|
+ List<KwtLogisticsOrderGoods> logOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
|
|
|
+ if (CollectionUtils.isEmpty(logOrderGoods)) {
|
|
|
+ log.info("当前车辆的物流订单无商品信息,truckNo:{}", param.getTruckNo());
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_GOODS, "当前车辆的物流订单无商品信息");
|
|
|
+ }
|
|
|
+ //物流id映射商品
|
|
|
+ Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap = logOrderGoods.stream().collect(
|
|
|
+ Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId, Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+
|
|
|
+ //承运托运企业
|
|
|
+ List<KwtLogisticsOrderUnit> logOrderUnits = logisticsOrderUnitRepository.queryByLogOrderIds(logOrderIdList);
|
|
|
+ if (CollectionUtils.isEmpty(logOrderUnits)) {
|
|
|
+ log.info("物流订单无关联承运托运企业,logOrderId:{}", JSON.toJSONString(logOrderIdList));
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_ENT, "物流订单无关联承运托运企业");
|
|
|
+ }
|
|
|
+ Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap = logOrderUnits.stream().collect(
|
|
|
+ Collectors.toMap(unit -> unit.getLOrderId() + "-" + unit.getUnitType(),
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+ //地址
|
|
|
+ Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap = getKwtLogisticsOrderAddressMap(logOrderIdList);
|
|
|
+
|
|
|
+ //装卸货信息
|
|
|
+ List<KwtWaybillOrderTicket> orderTicketList = waybillOrderTicketRepository.queryByWOrderIds(wbOrderIdList);
|
|
|
+ if (CollectionUtils.isEmpty(orderTicketList)) {
|
|
|
+ log.info("当前车辆无物流运单装卸货信息,truckNo:{}", param.getTruckNo());
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_TICKET, "当前车辆无物流运单装卸货信息");
|
|
|
+ }
|
|
|
+ Map<String, KwtWaybillOrderTicket> ticketMap = orderTicketList.stream().collect(
|
|
|
+ Collectors.toMap(ticket -> ticket.getWOrderId() + "-" + ticket.getType(),
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ List<WaybillOrderStatusResp> ordderList = records.stream().map(
|
|
|
+ billOrder -> {
|
|
|
+ return getWaybillOrderResp(billOrder, subtaskMap, logOrderMap, logOrderIdAndCirculateMap,
|
|
|
+ logOrderIdAndGoodsMap, logOrderIdAndUnitMap, logOrderIdAndAddressMap, ticketMap);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ log.info("查询司机的物流运单成功!");
|
|
|
+ return PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) ordderList.size(), ordderList);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 组装运单列表信息
|
|
|
+ * @param order
|
|
|
+ * @param logOrderIdAndGoodsMap
|
|
|
+ * @param logOrderIdAndUnitMap
|
|
|
+ * @param logOrderIdAndAddressMap
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private WaybillOrderStatusResp getWaybillOrderResp(KwtWaybillOrder wbOrder, Map<Long, KwtWaybillOrderSubtask> subtaskMap,
|
|
|
+ Map<Long, KwtLogisticsOrder> logOrderMap,
|
|
|
+ Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap,
|
|
|
+ Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap,
|
|
|
+ Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap,
|
|
|
+ Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap,
|
|
|
+ Map<String, KwtWaybillOrderTicket> ticketMap) {
|
|
|
+ WaybillOrderStatusResp wbOrderResp = new WaybillOrderStatusResp();
|
|
|
+
|
|
|
+ //装货、卸货净重、任务量
|
|
|
+ KwtWaybillOrderSubtask subtask = subtaskMap.getOrDefault(wbOrder.getId(), new KwtWaybillOrderSubtask());
|
|
|
+ wbOrderResp.setLoadingNetWeight(subtask.getLoadAmount());
|
|
|
+ wbOrderResp.setUnloadingNetWeight(subtask.getUnloadAmount());
|
|
|
+ wbOrderResp.setTaskNum(subtask.getEntrustAmount());
|
|
|
+
|
|
|
+ //物流订单信息
|
|
|
+ KwtLogisticsOrder logOrder = logOrderMap.getOrDefault(wbOrder.getLOrderId(), new KwtLogisticsOrder());
|
|
|
+ wbOrderResp.setLogisticsOrderNo(logOrder.getLOrderNo());
|
|
|
+ wbOrderResp.setChargeType(logOrder.getBillingMode());
|
|
|
+ wbOrderResp.setChargeTypeDesc(DictEnum.getLabel(DictTypeEnum.CHARGING_TYPE.getType(), logOrder.getBillingMode()));
|
|
|
+
|
|
|
+ //托运企业
|
|
|
+ KwtLogisticsOrderUnit consignEnt = logOrderIdAndUnitMap.getOrDefault(wbOrder.getLOrderId() + "-" + UnitTypeEnum.CONSIGN.getCode(), new KwtLogisticsOrderUnit());
|
|
|
+ wbOrderResp.setConsignCompanyId(Optional.ofNullable(consignEnt.getEntId()).map(String::valueOf).orElse(null));
|
|
|
+ wbOrderResp.setConsignCompanyName(consignEnt.getFirmName());
|
|
|
+
|
|
|
+ //商品
|
|
|
+ KwtLogisticsOrderGoods orderGoods = logOrderIdAndGoodsMap.getOrDefault(wbOrder.getLOrderId(), new KwtLogisticsOrderGoods());
|
|
|
+ wbOrderResp.setGoodsId(Optional.ofNullable(orderGoods.getId()).map(String::valueOf).orElse(null));
|
|
|
+ wbOrderResp.setGoodsName(orderGoods.getGoodsName());
|
|
|
+
|
|
|
+ //装货地址
|
|
|
+ KwtLogisticsOrderAddress shipmentAddress = logOrderIdAndAddressMap.getOrDefault(wbOrder.getLOrderId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new KwtLogisticsOrderAddress());
|
|
|
+ wbOrderResp.setLoadAddress(shipmentAddress.getDetailAddress());
|
|
|
+ //卸货地址
|
|
|
+ KwtLogisticsOrderAddress takeAddress = logOrderIdAndAddressMap.getOrDefault(wbOrder.getLOrderId() + "-" + AddressTypeEnum.TAKE.getCode(), new KwtLogisticsOrderAddress());
|
|
|
+ wbOrderResp.setUnloadAddress(takeAddress.getDetailAddress());
|
|
|
+ //装卸地之间距离
|
|
|
+ double distanceKm = DistanceUtils.calculateDistance(
|
|
|
+ Optional.ofNullable(shipmentAddress.getLat()).map(Double::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(shipmentAddress.getLng()).map(Double::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(takeAddress.getLat()).map(Double::valueOf).orElse(null),
|
|
|
+ Optional.ofNullable(takeAddress.getLng()).map(Double::valueOf).orElse(null));
|
|
|
+ wbOrderResp.setDistanceKm(distanceKm);
|
|
|
+
|
|
|
+ //皮重
|
|
|
+ KwtWaybillOrderTicket tareAmountTicket = ticketMap.getOrDefault(wbOrder.getId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new KwtWaybillOrderTicket());
|
|
|
+ wbOrderResp.setTareAmount(tareAmountTicket.getTareAmount());
|
|
|
+ //毛重
|
|
|
+ KwtWaybillOrderTicket grossAmountTicket = ticketMap.getOrDefault(wbOrder.getId() + "-" + AddressTypeEnum.TAKE.getCode(), new KwtWaybillOrderTicket());
|
|
|
+ wbOrderResp.setGrossAmount(grossAmountTicket.getTareAmount());
|
|
|
+
|
|
|
+ //司机信息
|
|
|
+ wbOrderResp.setDriverId(wbOrder.getDriverId());
|
|
|
+ wbOrderResp.setDriverName(wbOrder.getDriverName());
|
|
|
+ wbOrderResp.setDriverPhone(wbOrder.getDriverPhone());
|
|
|
+
|
|
|
+ //派车信息
|
|
|
+ KwtLogisticsOrderCirculate orderCirculate = logOrderIdAndCirculateMap.getOrDefault(wbOrder.getLOrderId(), new KwtLogisticsOrderCirculate());
|
|
|
+ wbOrderResp.setSendTime(DateUtils.format(orderCirculate.getCreateTime(), DateUtils.DATE_PATTERN));
|
|
|
+ //法定载重
|
|
|
+ RTruckVo truckByTruckNo = remoteFleetService.findTruckByTruckNo(orderCirculate.getTruckNo());
|
|
|
+ if (truckByTruckNo != null) {
|
|
|
+ wbOrderResp.setLegalLoad(truckByTruckNo.getActualWeight());
|
|
|
+ }
|
|
|
+
|
|
|
+ //派单人信息
|
|
|
+ UserCacheResDto userCacheResDto = remoteSystemService.queryUserCacheById(orderCirculate.getCreateBy());
|
|
|
+ wbOrderResp.setSendOperator(Optional.ofNullable(userCacheResDto).map(UserCacheResDto::getName).orElse(null));
|
|
|
+ wbOrderResp.setSendPhone(Optional.ofNullable(userCacheResDto).map(UserCacheResDto::getPhone).orElse(null));
|
|
|
+
|
|
|
+ //状态
|
|
|
+ wbOrderResp.setStatus(wbOrder.getStatus());
|
|
|
+ wbOrderResp.setStatusDesc(CarWaybillV1Enum.geDesc(wbOrder.getStatus()));
|
|
|
+ return wbOrderResp;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public StatisticsWaybillResp statisticsWaybillOrder() {
|
|
|
+ log.info("运单状态统计");
|
|
|
+ StatisticsWaybillResp statisticsWaybillResp = waybillOrderV1Service.statisticsWaybillOrder();
|
|
|
+ if (statisticsWaybillResp == null || CollectionUtils.isEmpty(statisticsWaybillResp.getOrderStatusStatistics())) {
|
|
|
+ return new StatisticsWaybillResp();
|
|
|
+ }
|
|
|
+ // 定义状态码聚合规则
|
|
|
+ Map<List<String>, String[]> aggregateRules = Map.of(
|
|
|
+ Arrays.asList("1", "5", "10", "15"), new String[]{"1", "进行中"},
|
|
|
+ Arrays.asList("20", "30"), new String[]{"2", "审核中"},
|
|
|
+ Arrays.asList("25", "99"), new String[]{"3", "已完成"}
|
|
|
+ );
|
|
|
+ List<StatisticsWaybillResp.OrderBillStatusStatistics> orderStatusStatistics = statisticsWaybillResp.getOrderStatusStatistics();
|
|
|
+
|
|
|
+ List<StatisticsWaybillResp.OrderBillStatusStatistics> aggregatedList = aggregateRules.entrySet()
|
|
|
+ .stream().map(rule -> {
|
|
|
+ List<String> originalStatuses = rule.getKey();
|
|
|
+ String[] aggregateInfo = rule.getValue();
|
|
|
+ // 过滤并汇总对应状态的数量
|
|
|
+ int totalNum = orderStatusStatistics.stream()
|
|
|
+ .filter(stat -> originalStatuses.contains(stat.getOrderStatus()))
|
|
|
+ .mapToInt(stat -> Integer.parseInt(stat.getOrderNum()))
|
|
|
+ .sum();
|
|
|
+ // 构建聚合结果对象
|
|
|
+ StatisticsWaybillResp.OrderBillStatusStatistics aggregateStat = new StatisticsWaybillResp.OrderBillStatusStatistics();
|
|
|
+ aggregateStat.setOrderStatus(aggregateInfo[0]); // 聚合状态编码
|
|
|
+ aggregateStat.setOrderStatusDesc(aggregateInfo[1]); // 聚合状态描述
|
|
|
+ aggregateStat.setOrderNum(String.valueOf(totalNum)); // 汇总数量
|
|
|
+ return aggregateStat;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ return new StatisticsWaybillResp();
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 物流订单接单
|