|
|
@@ -0,0 +1,465 @@
|
|
|
+package com.sckw.transport.service.app;
|
|
|
+
|
|
|
+
|
|
|
+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.sckw.contract.api.RemoteContractService;
|
|
|
+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.enums.GatekeeperStatusEnum;
|
|
|
+import com.sckw.core.utils.CollectionUtils;
|
|
|
+import com.sckw.core.utils.DateUtils;
|
|
|
+import com.sckw.core.web.response.result.PageDataResult;
|
|
|
+import com.sckw.order.api.dubbo.TradeOrderInfoService;
|
|
|
+import com.sckw.order.api.model.OrderUnitInfoDetailVO;
|
|
|
+import com.sckw.product.api.dubbo.GoodsInfoService;
|
|
|
+import com.sckw.product.api.model.KwpGoods;
|
|
|
+import com.sckw.system.api.RemoteSystemService;
|
|
|
+import com.sckw.transport.model.*;
|
|
|
+import com.sckw.transport.model.param.forklift.reponse.GatekeeperOrderResp;
|
|
|
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassParam;
|
|
|
+import com.sckw.transport.model.param.forklift.request.GatekeeperOrderQueryParam;
|
|
|
+import com.sckw.transport.model.vo.StatisticsWaybillResp;
|
|
|
+import com.sckw.transport.repository.*;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Author: donglang
|
|
|
+ * Time: 2026-01-05
|
|
|
+ * Des: 铲车司机Service
|
|
|
+ * Version: 1.0
|
|
|
+ */
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+public class GatekeeperOrderService {
|
|
|
+
|
|
|
+
|
|
|
+ private final KwtGatekeeperWaybillOrderRepository gatekeeperWaybillOrderRepository;
|
|
|
+
|
|
|
+ private final KwtWaybillOrderRepository waybillOrderRepository;
|
|
|
+ private final KwtWaybillOrderSubtaskRepository waybillOrderSubtaskRepository;
|
|
|
+ private final KwtWaybillOrderTicketRepository waybillOrderTicketRepository;
|
|
|
+ private final KwtLogisticsOrderRepository logisticsOrderRepository;
|
|
|
+ private final KwtLogisticsOrderGoodsRepository logisticsOrderGoodsRepository;
|
|
|
+
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false)
|
|
|
+ private RemoteContractService remoteContractService;
|
|
|
+
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 80000)
|
|
|
+ TradeOrderInfoService tradeOrderInfoService;
|
|
|
+
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
|
|
|
+ RemoteSystemService remoteSystemService;
|
|
|
+
|
|
|
+ @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
|
|
|
+ GoodsInfoService goodsInfoService;
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ WaybillOrderService waybillOrderService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询门卫订单
|
|
|
+ * @param param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public PageDataResult<GatekeeperOrderResp> pageQueryGatekeeperOrder(GatekeeperOrderQueryParam param) {
|
|
|
+ log.info("查询门卫订单:{}", JSON.toJSONString(param));
|
|
|
+ LambdaQueryWrapper<KwtGatekeeperWaybillOrder> wrapper = Wrappers.<KwtGatekeeperWaybillOrder>lambdaQuery()
|
|
|
+ .orderByDesc(KwtGatekeeperWaybillOrder::getCreateTime)
|
|
|
+ .orderByDesc(KwtGatekeeperWaybillOrder::getId);
|
|
|
+ //待进场
|
|
|
+ if (param.getStatus() == 1) {
|
|
|
+ wrapper.eq(KwtGatekeeperWaybillOrder::getStatus, GatekeeperStatusEnum.PENDING_ENTRY.getCode());
|
|
|
+ //待离场
|
|
|
+ } else if (param.getStatus() == 2) {
|
|
|
+ wrapper.in(KwtGatekeeperWaybillOrder::getStatus,
|
|
|
+ GatekeeperStatusEnum.PENDING_EXIT.getCode(),
|
|
|
+ GatekeeperStatusEnum.EMPTY_PENDING_EXIT.getCode(),
|
|
|
+ GatekeeperStatusEnum.RELEASED_NOT_EXITED.getCode());
|
|
|
+ //场内车辆,状态为4是:处理场内异常车辆逻辑
|
|
|
+ } else if (param.getStatus() == 3 || param.getStatus() == 4) {
|
|
|
+ wrapper.in(KwtGatekeeperWaybillOrder::getStatus,
|
|
|
+ GatekeeperStatusEnum.IN_YARD.getCode(),
|
|
|
+ GatekeeperStatusEnum.PENDING_EXIT.getCode(),
|
|
|
+ GatekeeperStatusEnum.EMPTY_PENDING_EXIT.getCode(),
|
|
|
+ GatekeeperStatusEnum.RELEASED_NOT_EXITED.getCode());
|
|
|
+ //出入记录
|
|
|
+ } else if (param.getStatus() == 5) {
|
|
|
+ wrapper.in(KwtGatekeeperWaybillOrder::getStatus,
|
|
|
+ GatekeeperStatusEnum.EXITED.getCode(),
|
|
|
+ GatekeeperStatusEnum.EMPTY_EXITED.getCode());
|
|
|
+ }
|
|
|
+ //查询门卫订单
|
|
|
+ Page<KwtGatekeeperWaybillOrder> pageByStatus = gatekeeperWaybillOrderRepository.page(new Page<>(param.getPageNum(), param.getPageSize()), wrapper);
|
|
|
+ List<KwtGatekeeperWaybillOrder> records = pageByStatus.getRecords();
|
|
|
+ if (CollectionUtils.isEmpty(records)) {
|
|
|
+ log.info("当前无运单订单信息");
|
|
|
+ return PageDataResult.empty(param.getPageNum(), param.getPageSize());
|
|
|
+ }
|
|
|
+ List<GatekeeperOrderResp> gatekeeperOrderPageResult = getGatekeeperOrderPageResult(records);
|
|
|
+ //处理异常车辆数据
|
|
|
+ gatekeeperOrderPageResult = filterGatekeeperOrderResp(param, gatekeeperOrderPageResult);
|
|
|
+
|
|
|
+ //排序
|
|
|
+ sort(param, gatekeeperOrderPageResult);
|
|
|
+ return PageDataResult.success(param.getPageNum(), param.getPageSize(), pageByStatus.getTotal(), gatekeeperOrderPageResult);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取门卫订单数据
|
|
|
+ * @param records
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<GatekeeperOrderResp> getGatekeeperOrderPageResult(List<KwtGatekeeperWaybillOrder> records) {
|
|
|
+ Set<Long> wOrderIds = records.stream().map(KwtGatekeeperWaybillOrder::getWOrderId).filter(Objects::nonNull).collect(Collectors.toSet());
|
|
|
+ //查询运单
|
|
|
+ List<KwtWaybillOrder> waybillOrders = waybillOrderRepository.queryByBillOrderIds(wOrderIds);
|
|
|
+ if (CollectionUtils.isEmpty(waybillOrders)) {
|
|
|
+ log.info("【门卫】无物流运单信息,运单id:{}", JSON.toJSONString(wOrderIds));
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ Map<Long, KwtWaybillOrder> waybillOrderMap = waybillOrders.stream()
|
|
|
+ .collect(Collectors.toMap(KwtWaybillOrder::getId, Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //查询子运单
|
|
|
+ List<KwtWaybillOrderSubtask> waybillOrderSubtasks = waybillOrderSubtaskRepository.findOneByWOrderIds(wOrderIds);
|
|
|
+ if (CollectionUtils.isEmpty(waybillOrderSubtasks)) {
|
|
|
+ log.info("【门卫】无物流子运单信息,运单id:{}", JSON.toJSONString(wOrderIds));
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ Map<Long, KwtWaybillOrderSubtask> subtaskMap = waybillOrderSubtasks.stream()
|
|
|
+ .collect(Collectors.toMap(KwtWaybillOrderSubtask::getWOrderId, Function.identity(), (x, y) -> x));
|
|
|
+ Set<Long> lOrderIds = waybillOrderSubtasks.stream().map(KwtWaybillOrderSubtask::getLOrderId).collect(Collectors.toSet());
|
|
|
+
|
|
|
+ //查询运单装卸货
|
|
|
+ List<KwtWaybillOrderTicket> waybillOrderTickets = waybillOrderTicketRepository.queryByWOrderIds(new ArrayList<>(wOrderIds));
|
|
|
+ if (CollectionUtils.isEmpty(waybillOrderTickets)) {
|
|
|
+ log.info("【门卫】无运单装卸货信息,运单id:{}", JSON.toJSONString(wOrderIds));
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ Map<String, KwtWaybillOrderTicket> waybillOrderTicketMap = waybillOrderTickets.stream()
|
|
|
+ .collect(Collectors.toMap(ticket -> ticket.getWOrderId() + "-" + ticket.getType(), Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //查询物流订单
|
|
|
+ List<KwtLogisticsOrder> logisticsOrder = logisticsOrderRepository.queryByLogOrderIds(lOrderIds);
|
|
|
+ if (CollectionUtils.isEmpty(logisticsOrder)) {
|
|
|
+ log.info("【门卫】无物流订单信息,物流订单id:{}", JSON.toJSONString(lOrderIds));
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ Map<Long, KwtLogisticsOrder> logisticsOrderMap = logisticsOrder.stream().collect(Collectors.toMap(KwtLogisticsOrder::getId, Function.identity(), (x, y) -> x));
|
|
|
+ Set<Long> tOrderIds = logisticsOrder.stream().map(KwtLogisticsOrder::getTOrderId).collect(Collectors.toSet());
|
|
|
+
|
|
|
+ //查询物流商品
|
|
|
+ List<KwtLogisticsOrderGoods> logisticsOrderGoods = logisticsOrderGoodsRepository.queryByLogOrderIds((List<Long>) lOrderIds);
|
|
|
+ if (CollectionUtils.isEmpty(logisticsOrderGoods)) {
|
|
|
+ log.info("【门卫】无订单商品信息,物流订单id:{}", JSON.toJSONString(lOrderIds));
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ Map<Long, KwtLogisticsOrderGoods> logisticsOrderGoodsMap = logisticsOrderGoods.stream().collect(Collectors.toMap(KwtLogisticsOrderGoods::getId, Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //交易商品信息
|
|
|
+ List<Long> goodsIds = logisticsOrderGoods.stream().map(KwtLogisticsOrderGoods::getGoodsId).distinct().collect(Collectors.toList());
|
|
|
+ if (CollectionUtils.isEmpty(goodsIds)) {
|
|
|
+ log.info("【门卫】无订单商品信息,商品id:{}", JSON.toJSONString(goodsIds));
|
|
|
+ }
|
|
|
+ Map<Long, KwpGoods> goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsIds);
|
|
|
+
|
|
|
+ //查询字典
|
|
|
+ Map<String, Map<String, String>> dictValueAndDictResDtoMap = remoteSystemService.queryDictByType(Arrays.asList(DictTypeEnum.PRODUCT_NAME_TYPE.getType(), DictTypeEnum.GOODS_SPEC.getType()));
|
|
|
+
|
|
|
+ //查询贸易订单企业信息
|
|
|
+ List<OrderUnitInfoDetailVO> orderUnitInfoDetailVOS = tradeOrderInfoService.queryOrderUnitInfByTOrderId(tOrderIds);
|
|
|
+ if (CollectionUtils.isEmpty(orderUnitInfoDetailVOS)) {
|
|
|
+ log.info("【门卫】无订单企业信息,物流订单id:{}", JSON.toJSONString(lOrderIds));
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ Map<String, OrderUnitInfoDetailVO> tradeOrderAndUnit = orderUnitInfoDetailVOS.stream().collect(Collectors.toMap(unit -> unit.getTOrderId() + "-" + unit.getUnitType(), Function.identity(), (x, y) -> x));
|
|
|
+
|
|
|
+ //组装铲车订单数据
|
|
|
+ return records.stream()
|
|
|
+ .map(gatekeeperWaybillOrder -> buildGatekeeperOrderResp(gatekeeperWaybillOrder, waybillOrderMap, subtaskMap, waybillOrderTicketMap, logisticsOrderMap, logisticsOrderGoodsMap, goodsIdAndGoodsMap, dictValueAndDictResDtoMap, tradeOrderAndUnit))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 组装门卫订单信息
|
|
|
+ * @param gatekeeperWaybillOrder
|
|
|
+ * @param waybillOrderMap
|
|
|
+ * @param subtaskMap
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private GatekeeperOrderResp buildGatekeeperOrderResp(KwtGatekeeperWaybillOrder gatekeeperWaybillOrder,
|
|
|
+ Map<Long, KwtWaybillOrder> waybillOrderMap,
|
|
|
+ Map<Long, KwtWaybillOrderSubtask> subtaskMap,
|
|
|
+ Map<String, KwtWaybillOrderTicket> waybillOrderTicketMap,
|
|
|
+ Map<Long, KwtLogisticsOrder> logisticsOrderMap,
|
|
|
+ Map<Long, KwtLogisticsOrderGoods> logisticsOrderGoodsMap,
|
|
|
+ Map<Long, KwpGoods> goodsIdAndGoodsMap,
|
|
|
+ Map<String, Map<String, String>> dictValueAndDictResDtoMap,
|
|
|
+ Map<String, OrderUnitInfoDetailVO> tradeOrderAndUnit) {
|
|
|
+
|
|
|
+ GatekeeperOrderResp gatekeeper = new GatekeeperOrderResp();
|
|
|
+ gatekeeper.setId(gatekeeperWaybillOrder.getId());
|
|
|
+ gatekeeper.setEntId(gatekeeperWaybillOrder.getEntId());
|
|
|
+ gatekeeper.setWOrderId(gatekeeperWaybillOrder.getWOrderId());
|
|
|
+ gatekeeper.setLOrderId(gatekeeperWaybillOrder.getLOrderId());
|
|
|
+ gatekeeper.setStatus(gatekeeperWaybillOrder.getStatus());
|
|
|
+ gatekeeper.setCarAxisName(gatekeeperWaybillOrder.getCarAxis());
|
|
|
+ gatekeeper.setLegalLoad(gatekeeper.getLegalLoad());
|
|
|
+ gatekeeper.setTruckType(gatekeeperWaybillOrder.getTruckType());
|
|
|
+ gatekeeper.setIntoTime(gatekeeperWaybillOrder.getIntoTime());
|
|
|
+ gatekeeper.setLeaveTime(gatekeeperWaybillOrder.getLeaveTime());
|
|
|
+ gatekeeper.setWaybillAcceptTime(gatekeeperWaybillOrder.getWaybillAcceptTime());
|
|
|
+
|
|
|
+ //运单数据
|
|
|
+ KwtWaybillOrder waybillOrder = waybillOrderMap.getOrDefault(gatekeeperWaybillOrder.getWOrderId(), new KwtWaybillOrder());
|
|
|
+ gatekeeper.setTruckId(waybillOrder.getTruckId());
|
|
|
+ gatekeeper.setTruckNo(waybillOrder.getTruckNo());
|
|
|
+ gatekeeper.setName(waybillOrder.getDriverName());
|
|
|
+ gatekeeper.setPhone(waybillOrder.getDriverPhone());
|
|
|
+ gatekeeper.setIdCard(waybillOrder.getDriverIdcard());
|
|
|
+
|
|
|
+ //子运单数据
|
|
|
+ KwtWaybillOrderSubtask subtask = subtaskMap.getOrDefault(gatekeeperWaybillOrder.getWOrderId(), new KwtWaybillOrderSubtask());
|
|
|
+ gatekeeper.setTaskNum(subtask.getEntrustAmount());
|
|
|
+
|
|
|
+ //采购企业信息
|
|
|
+ KwtLogisticsOrder logisticsOrder = logisticsOrderMap.getOrDefault(waybillOrder.getLOrderId(), new KwtLogisticsOrder());
|
|
|
+ OrderUnitInfoDetailVO orderUnit = tradeOrderAndUnit.getOrDefault(logisticsOrder.getTOrderId() + "-" + 1, new OrderUnitInfoDetailVO());
|
|
|
+ gatekeeper.setPrEntId(orderUnit.getEntId());
|
|
|
+ gatekeeper.setPrEntName(orderUnit.getFirmName());
|
|
|
+
|
|
|
+ //商品信息
|
|
|
+ KwtLogisticsOrderGoods orderGoods = logisticsOrderGoodsMap.getOrDefault(waybillOrder.getLOrderId(), new KwtLogisticsOrderGoods());
|
|
|
+ KwpGoods goods = goodsIdAndGoodsMap.getOrDefault(orderGoods.getGoodsId(), new KwpGoods());
|
|
|
+ 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<>());
|
|
|
+ gatekeeper.setGoodsName(goods.getName()+"/"+goodsTypeMap.getOrDefault(goods.getGoodsType(),"")+"/"+goodsSpecMap.getOrDefault(goods.getSpec(), ""));
|
|
|
+ gatekeeper.setGoodsId(goods.getId());
|
|
|
+
|
|
|
+ //装卸货信息
|
|
|
+ KwtWaybillOrderTicket ticket = waybillOrderTicketMap.getOrDefault(gatekeeperWaybillOrder.getWOrderId() + "-" + 1, new KwtWaybillOrderTicket());
|
|
|
+ gatekeeper.setTareAmount(ticket.getTareAmount());
|
|
|
+ gatekeeper.setGrossAmount(ticket.getGrossAmount());
|
|
|
+
|
|
|
+ return gatekeeper;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理异常车辆数据
|
|
|
+ * @param param
|
|
|
+ * @param gatekeeperOrderPageResult
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static List<GatekeeperOrderResp> filterGatekeeperOrderResp(GatekeeperOrderQueryParam param, List<GatekeeperOrderResp> gatekeeperOrderPageResult) {
|
|
|
+ double configHours = 0;
|
|
|
+ //处理异常车辆数据
|
|
|
+ if (param.getStatus() != 4) {
|
|
|
+ return gatekeeperOrderPageResult;
|
|
|
+ }
|
|
|
+ return gatekeeperOrderPageResult.stream().filter(order -> {
|
|
|
+ if (order.getIntoTime() == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 计算已停留小时数
|
|
|
+ double stayHours = DateUtils.hoursBetween(order.getIntoTime(), new Date());
|
|
|
+ order.setDurationTime(stayHours);
|
|
|
+ return stayHours > configHours;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 排序
|
|
|
+ * @param param
|
|
|
+ * @param gatekeeperOrderPageResult
|
|
|
+ */
|
|
|
+ private void sort(GatekeeperOrderQueryParam param, List<GatekeeperOrderResp> gatekeeperOrderPageResult) {
|
|
|
+ // 根据状态进行排序
|
|
|
+ switch (param.getStatus()) {
|
|
|
+ case 1:
|
|
|
+ // 待进场: 运输司机接单时间升序
|
|
|
+ gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getWaybillAcceptTime));
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ // 待离场:先按照待离场展示,后按照空载待离场和已放行未离场展示,在按照状态变更时间升序
|
|
|
+ gatekeeperOrderPageResult.sort(Comparator.comparing((GatekeeperOrderResp order) -> order.getStatus() != 10)
|
|
|
+ .thenComparing(GatekeeperOrderResp::getUpdateTime));
|
|
|
+ case 3:
|
|
|
+ // 场内车辆: 车辆进场时间升序
|
|
|
+ gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getIntoTime));
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ // 异常车辆: 场内耗时倒序
|
|
|
+ gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getDurationTime).reversed());
|
|
|
+ break;
|
|
|
+ case 5:
|
|
|
+ // 出入记录: 离场时间倒序
|
|
|
+ gatekeeperOrderPageResult.sort(Comparator.comparing(GatekeeperOrderResp::getLeaveTime).reversed());
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 铲车订单状态统计
|
|
|
+ * @param param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public StatisticsWaybillResp statisticsGatekeeperOrder(GatekeeperOrderQueryParam param) {
|
|
|
+ log.info("铲车订单状态统计:{}", JSON.toJSONString(param));
|
|
|
+ StatisticsWaybillResp resp = new StatisticsWaybillResp();
|
|
|
+
|
|
|
+ LambdaQueryWrapper<KwtGatekeeperWaybillOrder> wrapper = Wrappers.<KwtGatekeeperWaybillOrder>lambdaQuery()
|
|
|
+ .orderByDesc(KwtGatekeeperWaybillOrder::getCreateTime)
|
|
|
+ .orderByDesc(KwtGatekeeperWaybillOrder::getId);
|
|
|
+
|
|
|
+ //查询门卫订单
|
|
|
+ List<KwtGatekeeperWaybillOrder> orderList = gatekeeperWaybillOrderRepository.list(wrapper);
|
|
|
+ if (CollectionUtils.isEmpty(orderList)) {
|
|
|
+ log.info("当前无门卫统计记录,统计结果为空");
|
|
|
+ resp.setOrderStatusStatistics(buildDefaultStatusStatistics());
|
|
|
+ return resp;
|
|
|
+ }
|
|
|
+ List<GatekeeperOrderResp> gatekeeperOrderPageResult = getGatekeeperOrderPageResult(orderList);
|
|
|
+ resp.setOrderStatusStatistics(calculateStatusStatistics(gatekeeperOrderPageResult));
|
|
|
+ return resp;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建默认的状态统计列表(三种状态,数量均为0)
|
|
|
+ * @return 默认统计列表
|
|
|
+ */
|
|
|
+ private List<StatisticsWaybillResp.OrderBillStatusStatistics> buildDefaultStatusStatistics() {
|
|
|
+ List<StatisticsWaybillResp.OrderBillStatusStatistics> defaultList = new ArrayList<>();
|
|
|
+ // 待进场
|
|
|
+ StatisticsWaybillResp.OrderBillStatusStatistics pendingEntry = new StatisticsWaybillResp.OrderBillStatusStatistics();
|
|
|
+ pendingEntry.setOrderStatus("1");
|
|
|
+ pendingEntry.setOrderStatusDesc("待进场");
|
|
|
+ pendingEntry.setOrderNum("0");
|
|
|
+ defaultList.add(pendingEntry);
|
|
|
+ // 待离场
|
|
|
+ StatisticsWaybillResp.OrderBillStatusStatistics pendingExit = new StatisticsWaybillResp.OrderBillStatusStatistics();
|
|
|
+ pendingExit.setOrderStatus("2");
|
|
|
+ pendingExit.setOrderStatusDesc("待离场");
|
|
|
+ pendingExit.setOrderNum("0");
|
|
|
+ defaultList.add(pendingExit);
|
|
|
+ // 场内车辆
|
|
|
+ StatisticsWaybillResp.OrderBillStatusStatistics inPark = new StatisticsWaybillResp.OrderBillStatusStatistics();
|
|
|
+ inPark.setOrderStatus("3");
|
|
|
+ inPark.setOrderStatusDesc("场内车辆");
|
|
|
+ inPark.setOrderNum("0");
|
|
|
+ defaultList.add(inPark);
|
|
|
+ // 异常车辆
|
|
|
+ StatisticsWaybillResp.OrderBillStatusStatistics isAbnormal = new StatisticsWaybillResp.OrderBillStatusStatistics();
|
|
|
+ isAbnormal.setOrderStatus("4");
|
|
|
+ isAbnormal.setOrderStatusDesc("异常车辆");
|
|
|
+ isAbnormal.setOrderNum("0");
|
|
|
+ defaultList.add(isAbnormal);
|
|
|
+
|
|
|
+ return defaultList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算运单状态统计
|
|
|
+ * @param gatekeeperOrderList
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static List<StatisticsWaybillResp.OrderBillStatusStatistics> calculateStatusStatistics(List<GatekeeperOrderResp> gatekeeperOrderList) {
|
|
|
+ // 定义状态码聚合规则
|
|
|
+ Map<List<String>, String[]> aggregateRules = Map.of(
|
|
|
+ Arrays.asList("1", "5", "10", "11", "15"), new String[]{"1", "待进场"},
|
|
|
+ Arrays.asList("10", "15", "20"), new String[]{"2", "待离场"},
|
|
|
+ Arrays.asList("5", "10", "15", "20"), new String[]{"3", "场内车辆"},
|
|
|
+ Arrays.asList("5", "10", "15", "20"), new String[]{"4", "异常车辆"}
|
|
|
+ );
|
|
|
+
|
|
|
+ // 按原始状态统计数量
|
|
|
+ Map<String, Long> statusCountMap = gatekeeperOrderList.stream()
|
|
|
+ .collect(Collectors.groupingBy(va ->String.valueOf(va.getStatus()), Collectors.counting()));
|
|
|
+
|
|
|
+ // 进行状态聚合
|
|
|
+ List<StatisticsWaybillResp.OrderBillStatusStatistics> aggregatedList = aggregateRules.entrySet().stream()
|
|
|
+ .map(rule -> {
|
|
|
+ List<String> originalStatuses = rule.getKey();
|
|
|
+ String[] aggregateInfo = rule.getValue();
|
|
|
+ long totalNum = 0;
|
|
|
+
|
|
|
+ // 处理状态为4的异常车辆
|
|
|
+ if (Objects.equals(aggregateInfo[0],4)) {
|
|
|
+ double configHours = 0;
|
|
|
+ totalNum = gatekeeperOrderList.stream().filter(order -> {
|
|
|
+ // 1. 必须包含在定义的异常状态源中 (5,10,15,20)
|
|
|
+ if (!originalStatuses.contains(String.valueOf(order.getStatus()))) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 2. 进场时间不为空
|
|
|
+ if (order.getIntoTime() == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 3. 计算停留时长
|
|
|
+ double stayHours = DateUtils.hoursBetween(order.getIntoTime(), new Date());
|
|
|
+ return stayHours > configHours;
|
|
|
+ }).count();
|
|
|
+ } else {
|
|
|
+ // 汇总对应状态的数量
|
|
|
+ totalNum = originalStatuses.stream()
|
|
|
+ .mapToLong(status -> statusCountMap.getOrDefault(status, 0L))
|
|
|
+ .sum();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建聚合结果对象
|
|
|
+ StatisticsWaybillResp.OrderBillStatusStatistics aggregateStat = new StatisticsWaybillResp.OrderBillStatusStatistics();
|
|
|
+ aggregateStat.setOrderStatus(aggregateInfo[0]); // 聚合状态编码
|
|
|
+ aggregateStat.setOrderStatusDesc(aggregateInfo[1]); // 聚合状态描述
|
|
|
+ aggregateStat.setOrderNum(String.valueOf(totalNum)); // 汇总数量
|
|
|
+ return aggregateStat;
|
|
|
+ })
|
|
|
+ .sorted(Comparator.comparing(StatisticsWaybillResp.OrderBillStatusStatistics::getOrderStatus))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ return aggregatedList;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 门卫放行
|
|
|
+ * @param param
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public void pass(GatekeeperOrderPassParam param) {
|
|
|
+ log.info("门卫放行:{}", JSON.toJSONString(param));
|
|
|
+ KwtGatekeeperWaybillOrder gatekeeperWaybillOrder = gatekeeperWaybillOrderRepository.getById(param.getId());
|
|
|
+ if (gatekeeperWaybillOrder == null) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_NOT_FOUND, "当前车辆订单不存在!");
|
|
|
+ }
|
|
|
+ if (GatekeeperStatusEnum.PENDING_EXIT.getCode().equals(gatekeeperWaybillOrder.getStatus())
|
|
|
+ || GatekeeperStatusEnum.EMPTY_PENDING_EXIT.getCode().equals(gatekeeperWaybillOrder.getStatus())) {
|
|
|
+ throw new BusinessPlatfromException(ErrorCodeEnum.FORKLIFT_ORDER_STATUS_ERROR, "当前车辆订单状态异常,不能装载完成!");
|
|
|
+ }
|
|
|
+ //车辆放行后状态更改为:已放行未离场
|
|
|
+ gatekeeperWaybillOrder.setStatus(GatekeeperStatusEnum.RELEASED_NOT_EXITED.getCode());
|
|
|
+ gatekeeperWaybillOrderRepository.updateById(gatekeeperWaybillOrder);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|