소스 검색

根据贸易合同查询单位信息

chenxiaofei 5 시간 전
부모
커밋
e1167148cb

+ 2 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/IdReqVo.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.vo.req;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
@@ -21,6 +22,7 @@ public class IdReqVo implements Serializable {
      * 主键
      */
     @NotNull(message = "id不能为空")
+    @Schema(description = "贸易合同id")
     private Long id;
 
 }

+ 2 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/enums/OrderUnitTypeEnum.java

@@ -13,7 +13,8 @@ import lombok.Getter;
 public enum OrderUnitTypeEnum {
 
     PURCHASE("1", "采购单位"),
-    SALE("2", "销售单位");
+    SALE("2", "销售单位"),
+    AGENT("3", "代理单位");
 
     private final String type;
 

+ 60 - 25
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -806,13 +806,16 @@ public class KwoTradeOrderService {
 
         //单位信息
         List<KwoTradeOrderUnit> units = kwoTradeOrderUnitService.getByOrderId(id);
+        List<UnitInfoDetailRes> unitInfos = new ArrayList<>();
         if (CollUtil.isNotEmpty(units)) {
-            List<UnitInfoDetailRes> unitInfos = new ArrayList<>(units.size());
             units.forEach(e -> {
                 UnitInfoDetailRes unit = BeanUtil.copyProperties(e, UnitInfoDetailRes.class);
-                unit.setUnitTypeLabel(CollUtil.isNotEmpty(orderUnitMap) ? orderUnitMap.get(unit.getUnitType()) : null);
+                unit.setUnitTypeLabel(resolveUnitTypeLabel(orderUnitMap, unit.getUnitType()));
                 unitInfos.add(unit);
             });
+        }
+        supplementAgentUnitInfoIfNeeded(id, detail, unitInfos, orderUnitMap);
+        if (CollUtil.isNotEmpty(unitInfos)) {
             detail.setUnitInfo(unitInfos);
             populateAgentUnitInfo(detail, unitInfos);
         }
@@ -913,48 +916,80 @@ public class KwoTradeOrderService {
 
     /**
      * 填充订单详情中的供应商及代理单位信息。
-     * <p>
-     * 业务逻辑说明:
-     * 1. 校验入参有效性,若订单详情对象为空或单位列表为空,则直接返回。
-     * 2. 从单位列表中筛选出类型为“供应方”(unitType="2")的单位记录。
-     * 3. 将首个匹配的供应方单位信息填充至订单详情的供应商字段(供应商ID、名称、电话)。
-     * 4. 若订单标记为代理订单(agentFlag=1),则将同样的供应方单位信息同时填充至代理字段(代理ID、名称、电话)。
-     * <p>
-     * 注意:该方法为静态私有方法,仅用于内部数据组装,不涉及数据库操作或远程调用。
-     *
-     * @param detail   订单详情响应对象,用于接收填充后的数据
-     * @param unitInfos 订单关联的单位信息列表
+     * 供应商取自销售单位(unitType=2),代理单位取自代理单位(unitType=3)。
      */
     private static void populateAgentUnitInfo(OrderDetailRes detail, List<UnitInfoDetailRes> unitInfos) {
-        // 参数预校验:确保订单详情对象和单位列表非空,避免后续处理出现空指针异常
         if (Objects.isNull(detail) || CollUtil.isEmpty(unitInfos)) {
             log.debug("填充代理单位信息跳过:detail为空或unitInfos为空");
             return;
         }
 
-        // 流式处理:过滤非空单位 -> 筛选供应方类型(unitType="2") -> 获取第一个匹配项
         unitInfos.stream()
                 .filter(Objects::nonNull)
                 .filter(unit -> String.valueOf(NumberConstant.TWO).equals(unit.getUnitType()))
                 .findFirst()
                 .ifPresent(unit -> {
-                    log.debug("找到供应方单位信息,entId={}, firmName={}", unit.getEntId(), unit.getFirmName());
-
-                    // 设置基础供应商信息
                     detail.setSupplierEntId(unit.getEntId());
                     detail.setSupplierFirmName(unit.getFirmName());
                     detail.setSupplierPhone(unit.getPhone());
+                });
 
-                    // 若为代理订单,则同时设置代理信息(通常代理即为供应方)
-                    if (Objects.equals(detail.getAgentFlag(), Global.YES)) {
-                        log.debug("订单为代理订单,同步设置代理单位信息");
-                        detail.setAgentEntId(unit.getEntId());
-                        detail.setAgentFirmName(unit.getFirmName());
-                        detail.setAgentPhone(unit.getPhone());
-                    }
+        unitInfos.stream()
+                .filter(Objects::nonNull)
+                .filter(unit -> StrUtil.equals(AGENT_UNIT_TYPE, unit.getUnitType()))
+                .findFirst()
+                .ifPresent(unit -> {
+                    detail.setAgentEntId(unit.getEntId());
+                    detail.setAgentFirmName(unit.getFirmName());
+                    detail.setAgentPhone(unit.getPhone());
                 });
     }
 
+    private void supplementAgentUnitInfoIfNeeded(Long orderId, OrderDetailRes detail,
+                                                 List<UnitInfoDetailRes> unitInfos,
+                                                 Map<String, String> orderUnitMap) {
+        if (!Objects.equals(detail.getAgentFlag(), Global.YES)) {
+            return;
+        }
+        boolean hasAgentUnit = unitInfos.stream()
+                .anyMatch(unit -> StrUtil.equals(AGENT_UNIT_TYPE, unit.getUnitType()));
+        if (hasAgentUnit) {
+            return;
+        }
+        KwoTradeOrderContract contract = kwoTradeOrderContractService.getByOrderId(orderId);
+        if (Objects.isNull(contract) || Objects.isNull(contract.getContractId())) {
+            return;
+        }
+        List<TradeContractUnitDto> contractUnits = remoteContractService.queryContractUnitByContractId(contract.getContractId());
+        if (CollUtil.isEmpty(contractUnits)) {
+            return;
+        }
+        contractUnits.stream()
+                .filter(unit -> StrUtil.equals(AGENT_UNIT_TYPE, unit.getUnitType()))
+                .findFirst()
+                .ifPresent(unit -> unitInfos.add(buildAgentUnitInfoDetailRes(unit, orderUnitMap)));
+    }
+
+    private static UnitInfoDetailRes buildAgentUnitInfoDetailRes(TradeContractUnitDto contractUnit,
+                                                                 Map<String, String> orderUnitMap) {
+        UnitInfoDetailRes unit = new UnitInfoDetailRes();
+        unit.setUnitType(AGENT_UNIT_TYPE);
+        unit.setEntId(contractUnit.getEntId());
+        unit.setFirmName(contractUnit.getFirmName());
+        unit.setContacts(contractUnit.getContacts());
+        unit.setContactsId(contractUnit.getContactsId());
+        unit.setPhone(contractUnit.getPhone());
+        unit.setUnitTypeLabel(resolveUnitTypeLabel(orderUnitMap, AGENT_UNIT_TYPE));
+        return unit;
+    }
+
+    private static String resolveUnitTypeLabel(Map<String, String> orderUnitMap, String unitType) {
+        if (CollUtil.isNotEmpty(orderUnitMap) && orderUnitMap.containsKey(unitType)) {
+            return orderUnitMap.get(unitType);
+        }
+        return OrderUnitTypeEnum.getLabel(unitType);
+    }
+
     /**
      * @desc: 修改订单
      * @author: yzc

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

@@ -49,6 +49,11 @@ public class LogisticsOrderResp implements Serializable {
      */
     @Schema(description = "代理单位名称")
     private String agentFirmName;
+    /**
+     * 代理单位联系电话
+     */
+    @Schema(description = "代理单位联系电话")
+    private String agentPhone;
     /**
      * 承运单位id
      */

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderDetailResp.java

@@ -151,6 +151,12 @@ public class WaybillOrderDetailResp implements Serializable {
     @Schema(description = "代理单位")
     private String agentFirmName;
 
+    /**
+     * 代理单位联系电话
+     */
+    @Schema(description = "代理单位联系电话")
+    private String agentPhone;
+
     /**
      * 托运企业
      */

+ 13 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

@@ -3613,7 +3613,10 @@ public class KwtLogisticsConsignmentService {
                 String.valueOf(kwtLogisticsOrder.getBillingMode())));
         OrderDetailVo orderDetailVo = tradeIdAndOrderDetailVoMap.getOrDefault(kwtLogisticsOrder.getTOrderId(), new OrderDetailVo());
         setConsignCompanyInfo(logisticsOrderResp, orderDetailVo, consignCompany);
-        setAgentUnitInfo(logisticsOrderResp, orderDetailVo);
+        KwtLogisticsOrderUnit agentUnit = finalLogOrderIdAndUnitTypeKeyAndUnitMap.getOrDefault(kwtLogisticsOrder.getId() +
+                        "-" + LOGISTICS_AGENT_UNIT_TYPE,
+                new KwtLogisticsOrderUnit());
+        setAgentUnitInfo(logisticsOrderResp, orderDetailVo, agentUnit);
         KwtLogisticsOrderUnit carriageCompany = finalLogOrderIdAndUnitTypeKeyAndUnitMap.getOrDefault(kwtLogisticsOrder.getId() +
                         "-" + NumberConstant.TWO,
                 new KwtLogisticsOrderUnit());
@@ -3706,7 +3709,8 @@ public class KwtLogisticsConsignmentService {
      * @param logisticsOrderResp 物流订单响应对象,用于设置代理商信息
      * @param orderDetailVo      贸易订单详情对象,包含代理标识及代理企业信息
      */
-    private static void setAgentUnitInfo(LogisticsOrderResp logisticsOrderResp, OrderDetailVo orderDetailVo) {
+    static void setAgentUnitInfo(LogisticsOrderResp logisticsOrderResp, OrderDetailVo orderDetailVo,
+                                 KwtLogisticsOrderUnit agentUnit) {
         // 1. 前置校验:判断是否为代理订单且代理企业ID不为空
         // Global.YES 通常代表常量 1,表示是/启用
         if (!Objects.equals(orderDetailVo.getAgentFlag(), Global.YES) || Objects.isNull(orderDetailVo.getAgentEntId())) {
@@ -3720,9 +3724,14 @@ public class KwtLogisticsConsignmentService {
         
         // 3. 设置代理企业名称
         logisticsOrderResp.setAgentFirmName(orderDetailVo.getAgentFirmName());
+
+        // 4. 设置代理企业联系电话:优先使用贸易订单详情,缺失时使用物流订单企业表兜底
+        String agentPhone = org.apache.commons.lang3.StringUtils.defaultIfBlank(orderDetailVo.getAgentPhone(),
+                Objects.nonNull(agentUnit) ? agentUnit.getPhone() : null);
+        logisticsOrderResp.setAgentPhone(agentPhone);
         
-        log.debug("成功设置代理单位信息:agentEntId={}, agentFirmName={}", 
-                orderDetailVo.getAgentEntId(), orderDetailVo.getAgentFirmName());
+        log.debug("成功设置代理单位信息:agentEntId={}, agentFirmName={}, agentPhone={}",
+                orderDetailVo.getAgentEntId(), orderDetailVo.getAgentFirmName(), agentPhone);
     }
 
     /**

+ 21 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -5320,6 +5320,7 @@ public class KwtWaybillOrderV1Service {
             log.debug("运单详情-物流订单无有效代理单位,尝试从贸易订单详情中获取代理信息");
             setAgentUnitInfo(resp, orderDetailVo);
         }
+        fillDetailAgentPhone(resp, agentEnt, orderDetailVo);
 
         // 状态信息
         resp.setStatus(subtask.getStatus());
@@ -5510,6 +5511,26 @@ public class KwtWaybillOrderV1Service {
         log.debug("设置运单详情代理企业名称: {}", agentFirmName);
     }
 
+    /**
+     * 填充运单详情代理单位联系电话:优先贸易订单详情,缺失时使用物流订单企业表兜底。
+     *
+     * @param resp          运单详情响应对象
+     * @param agentUnit     物流订单代理单位
+     * @param orderDetailVo 贸易订单详情
+     */
+    static void fillDetailAgentPhone(WaybillOrderDetailResp resp, KwtLogisticsOrderUnit agentUnit,
+                                     OrderDetailVo orderDetailVo) {
+        if (Objects.isNull(resp) || org.apache.commons.lang3.StringUtils.isBlank(resp.getAgentEntId())) {
+            log.debug("跳过设置运单详情代理单位电话:响应对象为空或未设置代理单位ID");
+            return;
+        }
+        String agentPhone = org.apache.commons.lang3.StringUtils.defaultIfBlank(
+                Objects.nonNull(orderDetailVo) ? orderDetailVo.getAgentPhone() : null,
+                hasValidLogisticsUnit(agentUnit) ? agentUnit.getPhone() : null);
+        resp.setAgentPhone(agentPhone);
+        log.debug("设置运单详情代理单位电话: {}", agentPhone);
+    }
+
     /**
      * 格式化金额
      */

+ 1 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java

@@ -775,6 +775,7 @@ public class GatekeeperOrderService {
         // EMPTY_EXITED: 空车离场
         List<Integer> PASS_STATUSES = Arrays.asList(
                 GatekeeperStatusEnum.PENDING_ENTRY.getCode(),
+                GatekeeperStatusEnum.IN_YARD.getCode(),
                 GatekeeperStatusEnum.READY_RELEASE.getCode(),
                 GatekeeperStatusEnum.EXITED.getCode(),
                 GatekeeperStatusEnum.EMPTY_EXITED.getCode()

+ 47 - 0
sckw-modules/sckw-transport/src/test/java/com/sckw/transport/service/KwtLogisticsConsignmentServiceTest.java

@@ -2,6 +2,7 @@ package com.sckw.transport.service;
 
 import com.sckw.order.api.model.OrderDetailVo;
 import com.sckw.transport.model.KwtLogisticsOrderUnit;
+import com.sckw.transport.model.param.LogisticsOrderResp;
 import com.sckw.transport.model.param.QueryLogisticsOrderReq;
 import com.sckw.transport.model.vo.LogisticsOrderDetailResp;
 import org.junit.Assert;
@@ -172,4 +173,50 @@ public class KwtLogisticsConsignmentServiceTest {
         Assert.assertEquals("测试代理单位", unitInfoVO.getAgentUnitName());
         Assert.assertEquals("13800000000", unitInfoVO.getAgentUnitPhone());
     }
+
+    /**
+     * 物流订单列表代理单位电话应优先使用贸易订单详情中的代理电话。
+     */
+    @Test
+    public void setAgentUnitInfoUsesTradeOrderAgentPhoneFirst() {
+        LogisticsOrderResp resp = new LogisticsOrderResp();
+        OrderDetailVo orderDetailVo = new OrderDetailVo();
+        orderDetailVo.setAgentFlag(1);
+        orderDetailVo.setAgentEntId(2001L);
+        orderDetailVo.setAgentFirmName("测试代理单位");
+        orderDetailVo.setAgentPhone("13900000000");
+        KwtLogisticsOrderUnit agentUnit = new KwtLogisticsOrderUnit()
+                .setEntId(2001L)
+                .setFirmName("测试代理单位")
+                .setPhone("13800000000");
+
+        KwtLogisticsConsignmentService.setAgentUnitInfo(resp, orderDetailVo, agentUnit);
+
+        Assert.assertEquals("2001", resp.getAgentEntId());
+        Assert.assertEquals("测试代理单位", resp.getAgentFirmName());
+        Assert.assertEquals("13900000000", resp.getAgentPhone());
+    }
+
+    /**
+     * 物流订单列表代理单位电话在贸易订单详情缺失时应使用物流订单企业表电话兜底。
+     */
+    @Test
+    public void setAgentUnitInfoUsesLogisticsUnitPhoneWhenTradeOrderPhoneBlank() {
+        LogisticsOrderResp resp = new LogisticsOrderResp();
+        OrderDetailVo orderDetailVo = new OrderDetailVo();
+        orderDetailVo.setAgentFlag(1);
+        orderDetailVo.setAgentEntId(2001L);
+        orderDetailVo.setAgentFirmName("测试代理单位");
+        orderDetailVo.setAgentPhone(" ");
+        KwtLogisticsOrderUnit agentUnit = new KwtLogisticsOrderUnit()
+                .setEntId(2001L)
+                .setFirmName("测试代理单位")
+                .setPhone("13800000000");
+
+        KwtLogisticsConsignmentService.setAgentUnitInfo(resp, orderDetailVo, agentUnit);
+
+        Assert.assertEquals("2001", resp.getAgentEntId());
+        Assert.assertEquals("测试代理单位", resp.getAgentFirmName());
+        Assert.assertEquals("13800000000", resp.getAgentPhone());
+    }
 }

+ 35 - 0
sckw-modules/sckw-transport/src/test/java/com/sckw/transport/service/KwtWaybillOrderV1ServiceTest.java

@@ -198,6 +198,41 @@ public class KwtWaybillOrderV1ServiceTest {
         Assert.assertEquals("测试代理单位", resp.getAgentFirmName());
     }
 
+    /**
+     * 运单详情代理单位电话应优先使用贸易订单详情中的代理电话。
+     */
+    @Test
+    public void fillDetailAgentPhoneUsesTradeOrderAgentPhoneFirst() {
+        WaybillOrderDetailResp resp = new WaybillOrderDetailResp();
+        resp.setAgentEntId("2001");
+        OrderDetailVo orderDetailVo = new OrderDetailVo();
+        orderDetailVo.setAgentPhone("13900000000");
+        KwtLogisticsOrderUnit agentUnit = new KwtLogisticsOrderUnit()
+                .setEntId(2001L)
+                .setPhone("13800000000");
+
+        KwtWaybillOrderV1Service.fillDetailAgentPhone(resp, agentUnit, orderDetailVo);
+
+        Assert.assertEquals("13900000000", resp.getAgentPhone());
+    }
+
+    /**
+     * 运单详情代理单位电话在贸易订单详情缺失时应使用物流订单企业表电话兜底。
+     */
+    @Test
+    public void fillDetailAgentPhoneUsesLogisticsUnitPhoneWhenTradeOrderPhoneBlank() {
+        WaybillOrderDetailResp resp = new WaybillOrderDetailResp();
+        resp.setAgentEntId("2001");
+        OrderDetailVo orderDetailVo = new OrderDetailVo();
+        KwtLogisticsOrderUnit agentUnit = new KwtLogisticsOrderUnit()
+                .setEntId(2001L)
+                .setPhone("13800000000");
+
+        KwtWaybillOrderV1Service.fillDetailAgentPhone(resp, agentUnit, orderDetailVo);
+
+        Assert.assertEquals("13800000000", resp.getAgentPhone());
+    }
+
     /**
      * 非代理贸易订单不返回代理单位信息。
      */