|
|
@@ -42,6 +42,7 @@ import com.sckw.fleet.api.model.vo.*;
|
|
|
import com.sckw.mongo.model.SckwWaybillOrder;
|
|
|
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.TradeOrderContractVo;
|
|
|
import com.sckw.order.api.model.TradeOrderSettlePara;
|
|
|
import com.sckw.payment.api.feign.PaymentFeignService;
|
|
|
@@ -4287,9 +4288,137 @@ public class KwtWaybillOrderV1Service {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // 通过贸易订单代理商名称关键字查询关联的运单ID
|
|
|
+ log.debug("开始通过代理商名称关键字查询运单ID,关键字: {}", keywords);
|
|
|
+ Set<Long> orderIdsByAgentFirmName = queryBillOrderIdsByAgentFirmName(keywords);
|
|
|
+
|
|
|
+ // 如果查询到匹配的运单ID,则合并到结果集中
|
|
|
+ if (CollectionUtils.isNotEmpty(orderIdsByAgentFirmName)) {
|
|
|
+ keywordBillOrderIds.addAll(orderIdsByAgentFirmName);
|
|
|
+ log.info("通过贸易订单代理商名称[{}]查询到运单ID数量: {}", keywords, orderIdsByAgentFirmName.size());
|
|
|
+ } else {
|
|
|
+ log.debug("通过贸易订单代理商名称[{}]未查询到匹配的运单ID", keywords);
|
|
|
+ }
|
|
|
+
|
|
|
return keywordBillOrderIds;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过贸易订单代理商名称关键字查询关联的运单ID集合。
|
|
|
+ * <p>
|
|
|
+ * 业务逻辑链路:
|
|
|
+ * 1. 根据代理商名称关键字查询贸易订单单位信息(包含承运/代理单位)。
|
|
|
+ * 2. 筛选出类型为“代理/承运”(UnitType=2)的单位,提取对应的贸易订单ID。
|
|
|
+ * 3. 根据贸易订单ID查询贸易订单详情,并进一步过滤出代理商名称匹配且标记为代理的订单ID。
|
|
|
+ * 4. 根据贸易订单ID查询关联的物流订单ID。
|
|
|
+ * 5. 根据物流订单ID查询关联的子运单,最终提取主运单ID集合。
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @param keywords 代理商名称关键字
|
|
|
+ * @return 匹配的运单ID集合,若查询失败或无数据则返回空集合
|
|
|
+ */
|
|
|
+ private Set<Long> queryBillOrderIdsByAgentFirmName(String keywords) {
|
|
|
+ // 参数校验:关键字为空直接返回空集合
|
|
|
+ if (org.apache.commons.lang3.StringUtils.isBlank(keywords)) {
|
|
|
+ log.debug("通过代理商名称查询运单:关键字为空,返回空集合");
|
|
|
+ return Sets.newHashSet();
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("开始通过代理商名称关键字查询运单,keywords: {}", keywords);
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 1. 根据代理商名称查询贸易订单单位信息
|
|
|
+ List<OrderUnitInfoDetailVO> orderUnits = tradeOrderInfoService.queryOrderUnitInfByEntName(keywords);
|
|
|
+ if (CollectionUtils.isEmpty(orderUnits)) {
|
|
|
+ log.debug("通过代理商名称[{}]未查询到贸易订单单位信息", keywords);
|
|
|
+ return Sets.newHashSet();
|
|
|
+ }
|
|
|
+ log.debug("查询到贸易订单单位数量: {}", orderUnits.size());
|
|
|
+
|
|
|
+ // 2. 筛选单位为代理/承运类型(UnitType=2),并提取贸易订单ID
|
|
|
+ Set<Long> tradeOrderIds = orderUnits.stream()
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .filter(unit -> Objects.equals(unit.getUnitType(), String.valueOf(NumberConstant.TWO)))
|
|
|
+ .map(OrderUnitInfoDetailVO::getTOrderId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(tradeOrderIds)) {
|
|
|
+ log.debug("通过代理商名称[{}]未筛选到有效的代理类型贸易订单ID", keywords);
|
|
|
+ return Sets.newHashSet();
|
|
|
+ }
|
|
|
+ log.debug("筛选到代理类型贸易订单ID数量: {}", tradeOrderIds.size());
|
|
|
+
|
|
|
+ // 3. 查询贸易订单详情,并二次过滤确认代理商名称匹配
|
|
|
+ List<OrderDetailVo> tradeOrderDetails = tradeOrderInfoService.queryByTradeOrderIds(tradeOrderIds);
|
|
|
+ Set<Long> agentTradeOrderIds = extractAgentTradeOrderIdsByAgentName(tradeOrderDetails, keywords);
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(agentTradeOrderIds)) {
|
|
|
+ log.debug("通过代理商名称[{}]在贸易订单详情中未匹配到有效订单", keywords);
|
|
|
+ return Sets.newHashSet();
|
|
|
+ }
|
|
|
+ log.debug("二次过滤后匹配的贸易订单ID数量: {}", agentTradeOrderIds.size());
|
|
|
+
|
|
|
+ // 4. 根据贸易订单ID查询关联的物流订单
|
|
|
+ List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByTradeOrderIds(agentTradeOrderIds);
|
|
|
+ if (CollectionUtils.isEmpty(logisticsOrders)) {
|
|
|
+ log.debug("贸易订单ID集合[{}]未关联到任何物流订单", agentTradeOrderIds);
|
|
|
+ return Sets.newHashSet();
|
|
|
+ }
|
|
|
+ log.debug("查询到关联的物流订单数量: {}", logisticsOrders.size());
|
|
|
+
|
|
|
+ // 5. 提取物流订单ID
|
|
|
+ Set<Long> logOrderIds = logisticsOrders.stream()
|
|
|
+ .map(KwtLogisticsOrder::getId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(logOrderIds)) {
|
|
|
+ log.warn("物流订单列表中ID为空,无法继续查询子运单");
|
|
|
+ return Sets.newHashSet();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 6. 根据物流订单ID查询子运单,并提取主运单ID
|
|
|
+ List<KwtWaybillOrderSubtask> subtasks = waybillOrderSubtaskRepository.queryByLogIds(new ArrayList<>(logOrderIds));
|
|
|
+ Set<Long> resultBillOrderIds = Optional.ofNullable(subtasks)
|
|
|
+ .orElseGet(Collections::emptyList)
|
|
|
+ .stream()
|
|
|
+ .map(KwtWaybillOrderSubtask::getWOrderId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ log.info("通过代理商名称[{}]查询运单完成,最终匹配运单ID数量: {}", keywords, resultBillOrderIds.size());
|
|
|
+ return resultBillOrderIds;
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 异常捕获:记录警告日志,避免因远程服务波动导致主流程中断,返回空集合表示无匹配数据
|
|
|
+ log.warn("通过代理商名称关键字查询运单发生异常,keywords: {}, 错误信息: {}", keywords, e.getMessage(), e);
|
|
|
+ return Sets.newHashSet();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从贸易订单详情中过滤代理商名称命中的代理订单ID。
|
|
|
+ *
|
|
|
+ * @param tradeOrderDetails 贸易订单详情集合
|
|
|
+ * @param keywords 代理商名称关键字
|
|
|
+ * @return 代理商名称命中的贸易订单ID集合
|
|
|
+ */
|
|
|
+ static Set<Long> extractAgentTradeOrderIdsByAgentName(List<OrderDetailVo> tradeOrderDetails, String keywords) {
|
|
|
+ if (CollectionUtils.isEmpty(tradeOrderDetails)
|
|
|
+ || org.apache.commons.lang3.StringUtils.isBlank(keywords)) {
|
|
|
+ return Sets.newHashSet();
|
|
|
+ }
|
|
|
+ return tradeOrderDetails.stream()
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .filter(order -> Objects.equals(order.getAgentFlag(), Global.YES))
|
|
|
+ .filter(order -> org.apache.commons.lang3.StringUtils.contains(order.getAgentFirmName(), keywords))
|
|
|
+ .map(OrderDetailVo::getId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 合并关键字段命中的运单ID。
|
|
|
* <p>
|
|
|
@@ -4851,7 +4980,7 @@ public class KwtWaybillOrderV1Service {
|
|
|
log.info("运单详情查询完成,运单ID: {}", billOrder.getId());
|
|
|
return getWaybillOrderDetailResp(subtask, billOrder, logOrder, truck, fleet, goods,
|
|
|
keyAndAddressMap, kwpGoods, logisticsOrderUnitMap, nodeList, userCacheResDto,
|
|
|
- billOrders, ticketMap, dictValueAndDictResDtoMap, tradeContractUnitDtos,contractGoodsDto);
|
|
|
+ billOrders, ticketMap, dictValueAndDictResDtoMap, tradeContractUnitDtos, orderDetailVo, contractGoodsDto);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -4989,6 +5118,7 @@ public class KwtWaybillOrderV1Service {
|
|
|
Map<String, KwtWaybillOrderTicket> ticketMap,
|
|
|
Map<String, Map<String, String>> dictValueAndDictResDtoMap,
|
|
|
List<TradeContractUnitDto> tradeContractUnitDtos,
|
|
|
+ OrderDetailVo orderDetailVo,
|
|
|
TradeContractGoodsDto contractGoodsDto) {
|
|
|
WaybillOrderDetailResp resp = new WaybillOrderDetailResp();
|
|
|
|
|
|
@@ -5075,6 +5205,7 @@ public class KwtWaybillOrderV1Service {
|
|
|
.findFirst()
|
|
|
.ifPresent(x -> resp.setSupplyEntName(x.getFirmName()));
|
|
|
}
|
|
|
+ setAgentUnitInfo(resp, orderDetailVo);
|
|
|
|
|
|
// 状态信息
|
|
|
resp.setStatus(subtask.getStatus());
|
|
|
@@ -5118,6 +5249,22 @@ public class KwtWaybillOrderV1Service {
|
|
|
return resp;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 设置代理单位信息,仅代理贸易订单返回代理单位。
|
|
|
+ *
|
|
|
+ * @param resp 运单详情响应
|
|
|
+ * @param orderDetailVo 贸易订单详情
|
|
|
+ */
|
|
|
+ static void setAgentUnitInfo(WaybillOrderDetailResp resp, OrderDetailVo orderDetailVo) {
|
|
|
+ if (Objects.isNull(resp) || Objects.isNull(orderDetailVo)
|
|
|
+ || !Objects.equals(orderDetailVo.getAgentFlag(), Global.YES)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ resp.setAgentEntId(Objects.isNull(orderDetailVo.getAgentEntId())
|
|
|
+ ? null : String.valueOf(orderDetailVo.getAgentEntId()));
|
|
|
+ resp.setAgentFirmName(org.apache.commons.lang3.StringUtils.defaultString(orderDetailVo.getAgentFirmName()));
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 格式化金额
|
|
|
*/
|