|
|
@@ -2,12 +2,13 @@ package com.sckw.transport.service;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.util.ArrayUtil;
|
|
|
-
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.github.pagehelper.PageHelper;
|
|
|
import com.github.pagehelper.PageInfo;
|
|
|
import com.google.common.collect.Lists;
|
|
|
@@ -18,6 +19,7 @@ import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
|
|
|
import com.sckw.core.common.enums.enums.DictEnum;
|
|
|
import com.sckw.core.common.enums.enums.DictTypeEnum;
|
|
|
import com.sckw.core.exception.BusinessException;
|
|
|
+import com.sckw.core.exception.SystemException;
|
|
|
import com.sckw.core.model.constant.Global;
|
|
|
import com.sckw.core.model.constant.NumberConstant;
|
|
|
import com.sckw.core.model.enums.*;
|
|
|
@@ -32,7 +34,6 @@ import com.sckw.core.web.response.result.PageDataResult;
|
|
|
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.RFleetVo;
|
|
|
import com.sckw.fleet.api.model.vo.RTruckVo;
|
|
|
import com.sckw.mongo.enums.BusinessTypeEnum;
|
|
|
import com.sckw.mongo.model.SckwLogisticsOrder;
|
|
|
@@ -47,16 +48,15 @@ import com.sckw.stream.enums.MessageEnum;
|
|
|
import com.sckw.stream.model.SckwBusSum;
|
|
|
import com.sckw.system.api.RemoteSystemService;
|
|
|
import com.sckw.system.api.model.dto.res.EntCacheResDto;
|
|
|
+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.model.*;
|
|
|
import com.sckw.transport.model.dto.*;
|
|
|
-import com.sckw.transport.model.param.AddLogisticsOrderParam;
|
|
|
-import com.sckw.transport.model.param.LogisticsConsignmentParam;
|
|
|
-import com.sckw.transport.model.param.LogisticsOrderResp;
|
|
|
-import com.sckw.transport.model.param.QueryLogisticsOrderReq;
|
|
|
+import com.sckw.transport.model.param.*;
|
|
|
import com.sckw.transport.model.vo.*;
|
|
|
import com.sckw.transport.repository.*;
|
|
|
+import com.sckw.transport.utils.DistanceUtils;
|
|
|
import io.seata.spring.annotation.GlobalTransactional;
|
|
|
import jakarta.annotation.Resource;
|
|
|
import jakarta.validation.Valid;
|
|
|
@@ -2624,9 +2624,10 @@ public class KwtLogisticsConsignmentService {
|
|
|
return PageDataResult.empty(req.getPageNum(), req.getPageSize());
|
|
|
}
|
|
|
//获取车辆id
|
|
|
- Set<Long> truckIds = records.stream()
|
|
|
+ List<Long> truckIds = records.stream()
|
|
|
.map(KwtWaybillOrder::getTruckId)
|
|
|
- .collect(Collectors.toSet());
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
Map<Long, RTruckVo> truckIdAndTruckMap = Maps.newHashMap();
|
|
|
List<RTruckVo> truckByTruckIds = Lists.newArrayList() ;
|
|
|
//查询车辆信息
|
|
|
@@ -2677,9 +2678,10 @@ public class KwtLogisticsConsignmentService {
|
|
|
return PageDataResult.empty(req.getPageNum(), req.getPageSize());
|
|
|
}
|
|
|
|
|
|
- Set<Long> truckIds = records.stream()
|
|
|
+ List<Long> truckIds = records.stream()
|
|
|
.map(KwtLogisticsOrderCirculate::getTruckId)
|
|
|
- .collect(Collectors.toSet());
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
List<RTruckVo> truckByTruckIds = remoteFleetService.findTruckByTruckIds(truckIds);
|
|
|
Map<Long, RTruckVo> truckIdAndTruckMap = Maps.newHashMap();
|
|
|
if (CollectionUtils.isNotEmpty(truckByTruckIds)){
|
|
|
@@ -2770,4 +2772,209 @@ public class KwtLogisticsConsignmentService {
|
|
|
|
|
|
return logisticsOrderCirculateRepository.updateCirculates(orderCirculates);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询司机关联完成运单和累计运输量
|
|
|
+ * @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());
|
|
|
+ return PageDataResult.empty(param.getPageNum(), param.getPageSize());
|
|
|
+ }
|
|
|
+
|
|
|
+ //商品
|
|
|
+ List<KwtLogisticsOrderGoods> kwtLogisticsOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
|
|
|
+ //物流id映射物流商品
|
|
|
+ Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap = kwtLogisticsOrderGoods.stream().collect(Collectors.toMap(KwtLogisticsOrderGoods::getLOrderId,
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ List<Long> goodsIds = kwtLogisticsOrderGoods.stream().map(KwtLogisticsOrderGoods::getGoodsId).distinct().collect(Collectors.toList());
|
|
|
+ //商品id映射商品
|
|
|
+ Map<Long, KwpGoods> goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsIds);
|
|
|
+
|
|
|
+ //承运托运企业
|
|
|
+ List<KwtLogisticsOrderUnit> kwtLogisticsOrderUnits = logisticsOrderUnitRepository.queryByLogOrderIds(logOrderIdList);
|
|
|
+ Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap = kwtLogisticsOrderUnits.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());
|
|
|
+ //交易订单Map
|
|
|
+ List<OrderUnitInfoDetailVO> orderUnitDetailVOS = tradeOrderInfoService.queryOrderUnitInfByTOrderId(tradeOrderIds);
|
|
|
+ Map<String, OrderUnitInfoDetailVO> tOrderIdAndUnitMap = orderUnitDetailVOS.stream()
|
|
|
+ .collect(Collectors.toMap(unit -> unit.getTOrderId() + "-" + unit.getUnitType(),
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //地址
|
|
|
+ List<KwtLogisticsOrderAddress> logOrderAddressList = logisticsOrderAddressRepository.queryByLogOrderIds(logOrderIdList);
|
|
|
+ Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap = logOrderAddressList.stream()
|
|
|
+ .collect(Collectors.toMap(address -> address.getLOrderId() + "-" + address.getType(),
|
|
|
+ Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //组装数据
|
|
|
+ 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 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 void orderTaking(Long LogOrderId){
|
|
|
+ log.info("物流订单接单入参参数:{}", LogOrderId);
|
|
|
+ //校验
|
|
|
+ KwtLogisticsOrder order = logisticsOrderRepository.queryByLogOrderIdAndStatus(LogOrderId);
|
|
|
+ if (order == null) {
|
|
|
+ log.info("当前物流订单不是可接单状态:{}", LogOrderId);
|
|
|
+ throw new SystemException(HttpStatus.QUERY_FAIL_CODE, HttpStatus.LOG_ORDER_TAKING);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|