Przeglądaj źródła

原矿运输逻辑

donglang 1 miesiąc temu
rodzic
commit
7feda422b1

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/LogisticsOrderResp.java

@@ -199,4 +199,10 @@ public class LogisticsOrderResp implements Serializable {
     @Schema(description = "订单余量")
     private BigDecimal remainingAmount;
 
+    /**
+     * 订单类型
+     */
+    @Schema(description = "订单类型(1-原矿转运)")
+    private String orderType;
+
 }

+ 195 - 16
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -17,7 +17,6 @@ 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.response.BaseResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.RTruckVo;
@@ -35,9 +34,7 @@ import com.sckw.transport.model.vo.OrderTotalTakeVo;
 import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.repository.*;
 import com.sckw.transport.service.KwtWaybillOrderV1Service;
-import io.swagger.v3.oas.annotations.Operation;
 import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -46,8 +43,6 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.script.DefaultRedisScript;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -229,8 +224,53 @@ public class WaybillOrderService {
             log.info("当前车辆无物流订单,truckNo:{}", param.getTruckNo());
             throw new BusinessPlatfromException(ErrorCodeEnum.DRIVER_STATUS_ERROR, "当前车辆无物流订单");
         }
-        Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList = logOrderList.stream()
-                .collect(Collectors.groupingBy(KwtLogisticsOrder::getTOrderId));
+
+        // 按照order_type区分“正常订单”和“原矿运输订单”
+        Map<Boolean, List<KwtLogisticsOrder>> partitionedMap = logOrderList.stream()
+                .collect(Collectors.partitioningBy(order -> Integer.valueOf(1).equals(order.getOrderType())));
+
+        // 获取order_type=1的订单集合
+        List<KwtLogisticsOrder> typeOneList = partitionedMap.get(true);
+        log.info("正常流程的订单数量: {},信息:{}", JSON.toJSONString(typeOneList), typeOneList.size());
+
+        // 获取order_type=null的订单集合
+        List<KwtLogisticsOrder> typeNullList = partitionedMap.get(false);
+        log.info("原矿运输的订单数量: {},信息:{}",  JSON.toJSONString(typeNullList), typeNullList.size());
+
+        List<LogisticsOrderResp> orderList = new ArrayList<>();
+        // 正常流程
+        List<LogisticsOrderResp> normalOrderList = getLogisticsOrderResps(param, typeOneList, logOrderIdList, logOrderIdAndCirculateMap, rTruckVo);
+        orderList.addAll(normalOrderList);
+        // 原矿运输
+        List<LogisticsOrderResp> rawOreOrdderList = getRawOreLogisticsOrderResps(param, typeNullList, logOrderIdList, logOrderIdAndCirculateMap, rTruckVo);
+        orderList.addAll(rawOreOrdderList);
+
+        //内存分页
+        List<List<LogisticsOrderResp>> pageList = Lists.partition(orderList, param.getPageSize());
+        List<LogisticsOrderResp> walletPageList = pageList.size() >= param.getPageNum() ?
+                pageList.get(param.getPageNum() - 1) : Collections.emptyList();
+
+        PageDataResult<LogisticsOrderResp> walletPageResponse = PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) walletPageList.size(), walletPageList);
+        log.info("查询司机关联车辆的物流订单成功,resouce:{}", JSON.toJSONString(walletPageResponse));
+        return walletPageResponse;
+
+    }
+
+    /**
+     * 正常流程查询物流订单
+     * @param param
+     * @param logOrderList
+     * @param logOrderIdList
+     * @param logOrderIdAndCirculateMap
+     * @param rTruckVo
+     * @return
+     */
+    private List<LogisticsOrderResp> getLogisticsOrderResps(OrderCirculateQueryParam param, List<KwtLogisticsOrder> logOrderList,
+                                                            List<Long> logOrderIdList,
+                                                            Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap,
+                                                            RTruckVo rTruckVo) {
+        log.info("开始查询正常流程物流订单,param:{}", JSON.toJSONString(param));
+        Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList = logOrderList.stream().collect(Collectors.groupingBy(KwtLogisticsOrder::getTOrderId));
 
         //物流id映射物流商品
         List<KwtLogisticsOrderGoods> logOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
@@ -260,7 +300,7 @@ public class WaybillOrderService {
 
         //贸易订单id
         Set<Long> tradeOrderIds = logOrderList.stream().map(KwtLogisticsOrder::getTOrderId).collect(Collectors.toSet());
-        
+
         //供应企业
         List<OrderUnitInfoDetailVO> orderUnitDetailVOS = tradeOrderInfoService.queryOrderUnitInfByTOrderId(tradeOrderIds);
         if (CollectionUtils.isEmpty(orderUnitDetailVOS)) {
@@ -306,16 +346,83 @@ public class WaybillOrderService {
                     return checkCurTruckLoadVolume(rTruckVo, logisticsOrderResp.getRemainingAmount());
                 })
                 .collect(Collectors.toList());
+        log.info("查询正常流程物流订单结束,resouse:{}", JSON.toJSONString(ordderList));
+        return ordderList;
+    }
 
-        //内存分页
-        List<List<LogisticsOrderResp>> pageList = Lists.partition(ordderList, param.getPageSize());
-        List<LogisticsOrderResp> walletPageList = pageList.size() >= param.getPageNum() ?
-                pageList.get(param.getPageNum() - 1) : Collections.emptyList();
+    /**
+     * 原矿运输
+     * @param param
+     * @param logOrderList
+     * @param logOrderIdList
+     * @param logOrderIdAndCirculateMap
+     * @param rTruckVo
+     * @return
+     */
+    private List<LogisticsOrderResp> getRawOreLogisticsOrderResps(OrderCirculateQueryParam param, List<KwtLogisticsOrder> logOrderList,
+                                                                  List<Long> logOrderIdList,
+                                                                  Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap,
+                                                                  RTruckVo rTruckVo) {
+        log.info("开始查询原矿运输流程物流订单,param:{}", JSON.toJSONString(param));
 
-        PageDataResult<LogisticsOrderResp> walletPageResponse = PageDataResult.success(param.getPageNum(), param.getPageSize(), (long) walletPageList.size(), walletPageList);
-        log.info("查询司机关联车辆的物流订单成功!");
-        return walletPageResponse;
+        Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList = logOrderList.stream()
+                .collect(Collectors.groupingBy(KwtLogisticsOrder::getTOrderId));
+
+        //物流id映射物流商品
+        List<KwtLogisticsOrderGoods> logOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds(logOrderIdList);
+        if (CollectionUtils.isEmpty(logOrderGoods)) {
+            log.info("当前车辆的物流订单无商品信息,truckNo:{}", param.getTruckNo());
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_GOODS, "当前车辆的物流订单无商品信息");
+        }
+        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());
+        if (CollectionUtils.isEmpty(goodsIds)) {
+            log.info("物流订单无关联商品信息,logOrderId:{}", JSON.toJSONString(logOrderIdList));
+            throw new BusinessPlatfromException(ErrorCodeEnum.LOGISTICS_ORDER_NOT_GOODS, "物流订单无关联商品信息");
+        }
+        Map<Long, KwpGoods> goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsIds);
+
+        //承运托运企业
+        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<KwtWaybillOrderSubtask> orderSubtaskList = waybillOrderSubtaskRepository.queryByLogIds(logOrderIdList);
+        if(CollectionUtils.isEmpty(orderSubtaskList)) {
+            orderSubtaskList = new ArrayList<>();
+        }
+        Map<Long, List<KwtWaybillOrderSubtask>> logOrderIdAndSubtaskMap = orderSubtaskList.stream()
+                .collect(Collectors.groupingBy(KwtWaybillOrderSubtask::getLOrderId));
+
+        //查询字典
+        Map<String, Map<String, String>> dictValueAndDictResDtoMap = remoteSystemService.queryDictByType(
+                Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
 
+        //组装数据
+        List<LogisticsOrderResp> ordderList = logOrderList.stream()
+                .map(order -> {
+                    return getRawOreLogisticsOrderResp(order, logOrderIdAndGoodsMap, goodsIdAndGoodsMap, logOrderIdAndUnitMap,
+                            logOrderIdAndAddressMap, logOrderIdAndCirculateMap,
+                            tradeIdAndLogOrderList, logOrderIdAndSubtaskMap, dictValueAndDictResDtoMap);
+                })
+                .filter(logisticsOrderResp -> {
+                    // 校验是否满足车辆任务量,满足才保留
+                    return checkCurTruckLoadVolume(rTruckVo, logisticsOrderResp.getRemainingAmount());
+                })
+                .collect(Collectors.toList());
+        log.info("查询原矿运输流程物流订单结束,resouse:{}", JSON.toJSONString(ordderList));
+        return ordderList;
     }
 
     /**
@@ -392,7 +499,7 @@ public class WaybillOrderService {
     }
 
     /**
-     * 组装订单列表信息
+     * 组装正常流程订单列表信息
      * @param order
      * @param logOrderIdAndGoodsMap
      * @param goodsIdAndGoodsMap
@@ -468,6 +575,78 @@ public class WaybillOrderService {
         return orderResp;
     }
 
+    /**
+     * 组装原矿运输订单列表信息
+     * @param order
+     * @param logOrderIdAndGoodsMap
+     * @param goodsIdAndGoodsMap
+     * @param logOrderIdAndUnitMap
+     * @param tOrderIdAndUnitMap
+     * @param logOrderIdAndAddressMap
+     * @param logOrderIdAndCirculateMap
+     * @return
+     */
+    private LogisticsOrderResp getRawOreLogisticsOrderResp(KwtLogisticsOrder order, Map<Long, KwtLogisticsOrderGoods> logOrderIdAndGoodsMap,
+                                                     Map<Long, KwpGoods> goodsIdAndGoodsMap,
+                                                     Map<String, KwtLogisticsOrderUnit> logOrderIdAndUnitMap,
+                                                     Map<String, KwtLogisticsOrderAddress> logOrderIdAndAddressMap,
+                                                     Map<Long, KwtLogisticsOrderCirculate> logOrderIdAndCirculateMap,
+                                                     Map<Long, List<KwtLogisticsOrder>> tradeIdAndLogOrderList ,
+                                                     Map<Long, List<KwtWaybillOrderSubtask>> logisticsOrderIdAndSubtaskList,
+                                                     Map<String, Map<String, String>> dictValueAndDictResDtoMap) {
+        LogisticsOrderResp orderResp = new LogisticsOrderResp();
+        orderResp.setOrderType("原矿转运");
+        orderResp.setLogisticsOrderId(Optional.ofNullable(order.getId()).map(String::valueOf).orElse(null));
+        orderResp.setLogisticsOrderNo(order.getLOrderNo());
+        //商品
+        KwtLogisticsOrderGoods orderGoods = logOrderIdAndGoodsMap.getOrDefault(order.getId(), new KwtLogisticsOrderGoods());
+        KwpGoods goods = goodsIdAndGoodsMap.getOrDefault(orderGoods.getGoodsId(), new KwpGoods());
+        if (Objects.nonNull(goods)){
+            orderResp.setGoodsId(Optional.ofNullable(goods.getId()).map(String::valueOf).orElse(null));
+            Map<String, String> goodsTypeMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), new HashMap<>());
+            Map<String, String> goodsSpecMap= dictValueAndDictResDtoMap.getOrDefault(DictTypeEnum.GOODS_SPEC.getType(), new HashMap<>());
+            orderResp.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
+        }
+
+        //供应企业
+        KwtLogisticsOrderUnit supplierEnt = logOrderIdAndUnitMap.getOrDefault(order.getId() + "-" + 1, new KwtLogisticsOrderUnit());
+        orderResp.setSupplierCompanyId(Optional.ofNullable(supplierEnt.getEntId()).map(String::valueOf).orElse(null));
+        orderResp.setSupplierCompanyName(supplierEnt.getFirmName());
+        //承运企业
+        KwtLogisticsOrderUnit carriageEnt = logOrderIdAndUnitMap.getOrDefault(order.getId() + "-" + 2, new KwtLogisticsOrderUnit());
+        orderResp.setCarriageCompanyId(Optional.ofNullable(carriageEnt.getEntId()).map(String::valueOf).orElse(null));
+        orderResp.setCarriageCompanyName(carriageEnt.getFirmName());
+
+        //装货地址
+        KwtLogisticsOrderAddress shipmentAddress = logOrderIdAndAddressMap.getOrDefault(order.getId() + "-" + AddressTypeEnum.SHIPMENT.getCode(), new KwtLogisticsOrderAddress());
+        orderResp.setLoadAddress(shipmentAddress.getCityName()+shipmentAddress.getDetailAddress());
+        //卸货地址
+        KwtLogisticsOrderAddress takeAddress = logOrderIdAndAddressMap.getOrDefault(order.getId() + "-" + AddressTypeEnum.TAKE.getCode(), new KwtLogisticsOrderAddress());
+        orderResp.setUnloadAddress(takeAddress.getCityName()+takeAddress.getDetailAddress());
+        //装卸地之间距离
+        orderResp.setDistanceKm(order.getDistance());
+
+        //时间
+        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_TIME_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));
+        orderResp.setStatus(Optional.ofNullable(order.getStatus()).map(String::valueOf).orElse(null));
+        orderResp.setStatusDesc(LogisticsOrderV1Enum.IN_TRANSIT.getCode().equals(order.getStatus()) ? "待接单" : "未知状态");
+        //设置余量
+//        BigDecimal orderSurplus = getSupAmount(order.getTOrderId(), tradeIdAndOrderDetailVoMap, tradeIdAndLogOrderList,
+//                logisticsOrderIdAndSubtaskList);
+//        orderResp.setOrderSurplus(orderSurplus.toPlainString());
+//        orderResp.setRemainingAmount(orderSurplus);
+
+        return orderResp;
+    }
+
 
     /**
      * 查询司机关联车辆的物流运单