Explorar el Código

提交下单合同查询修改

chenxiaofei hace 1 semana
padre
commit
6b94756051

+ 5 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/ContractTradeOrderDto.java

@@ -29,4 +29,9 @@ public class ContractTradeOrderDto implements Serializable {
      * 企业类型(1-供应 2-采购)
      * 企业类型(1-供应 2-采购)
      */
      */
     private Integer entType;
     private Integer entType;
+
+    /**
+     * 下拉框输入匹配关键字,支持按“合同名称-采购企业名称”模糊匹配。
+     */
+    private String keyword;
 }
 }

+ 131 - 2
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -2285,6 +2285,13 @@ public class KwcContractTradeService {
                 tradeUnits1.stream().collect(Collectors.toMap(x -> x.getContractId() +
                 tradeUnits1.stream().collect(Collectors.toMap(x -> x.getContractId() +
                                 "_" + x.getUnitType(), Function.identity(),
                                 "_" + x.getUnitType(), Function.identity(),
                         (x, y) -> x));
                         (x, y) -> x));
+        // 判断当前查询的企业类型是否为供应方(供应商)
+        if (Objects.equals(contractTradeOrderDto.getEntType(), CooperateTypeEnum.SUPPLIER.getCode())) {
+            log.debug("当前查询类型为供应方,执行销售员签约贸易合同查询逻辑。entId: {}, goodsId: {}", 
+                    contractTradeOrderDto.getEntId(), contractTradeOrderDto.getGoodsId());
+            // 调用专用方法查询当前登录用户作为销售员且已签约的贸易合同信息
+            return querySalesmanSignedTradeOrder(contractTradeOrderDto, contractIds, conTractTradeUnitMap);
+        }
         contractIds = tradeUnits1.stream()
         contractIds = tradeUnits1.stream()
                 .filter(x -> Objects.equals(x.getEntId(), LoginUserHolder.getEntId()) && Objects.equals(x.getUnitType(),
                 .filter(x -> Objects.equals(x.getEntId(), LoginUserHolder.getEntId()) && Objects.equals(x.getUnitType(),
                         2))
                         2))
@@ -2311,9 +2318,128 @@ public class KwcContractTradeService {
         kwcContractTrades = kwcContractTrades.stream()
         kwcContractTrades = kwcContractTrades.stream()
                 .filter(x -> Objects.equals(x.getStatus(), ContractStatusEnum.SIGNED.getCode()))
                 .filter(x -> Objects.equals(x.getStatus(), ContractStatusEnum.SIGNED.getCode()))
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
-        return kwcContractTrades.stream()
+        List<ContractTradeOrderInfo> result = kwcContractTrades.stream()
                 .map(x -> getContractTradeOrderInfo(x, conTractTradeUnitMap, contractTradeOrderDto.getEntType(), contractGoodsMap))
                 .map(x -> getContractTradeOrderInfo(x, conTractTradeUnitMap, contractTradeOrderDto.getEntType(), contractGoodsMap))
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
+        return filterContractTradeOrderInfo(result, contractTradeOrderDto.getKeyword());
+    }
+
+
+    /**
+     * 查询当前登录用户作为销售员且已签约的贸易合同订单信息。
+     * <p>
+     * 该方法主要用于供应商端下拉选择场景,确保只返回当前销售员本人负责且状态为“已签约”的合同数据。
+     * </p>
+     *
+     * @param contractTradeOrderDto 查询条件DTO,包含商品ID、企业类型等关键过滤条件
+     * @param contractIds           待筛选的合同ID集合(通常基于当前企业查询出的关联合同)
+     * @param conTractTradeUnitMap  合同与单位信息的映射关系,Key格式为 "contractId_unitType",用于后续组装返回对象
+     * @return 过滤后的贸易合同订单信息列表,若无符合条件数据则返回空列表
+     */
+    private List<ContractTradeOrderInfo> querySalesmanSignedTradeOrder(ContractTradeOrderDto contractTradeOrderDto,
+                                                                       Set<Long> contractIds,
+                                                                       Map<String, KwcContractTradeUnit> conTractTradeUnitMap) {
+        // 1. 前置校验:若合同ID集合为空,直接返回空列表,避免无效数据库查询
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(contractIds)) {
+            log.debug("查询销售员签约合同失败:合同ID集合为空");
+            return Collections.emptyList();
+        }
+
+        // 2. 查询指定合同集合下包含特定商品的合同商品信息
+        Long goodsId = contractTradeOrderDto.getGoodsId();
+        log.debug("开始查询销售员签约合同,合同IDs数量: {}, 商品ID: {}", contractIds.size(), goodsId);
+        
+        List<KwcContractTradeGoods> kwcContractGoods = kwcContractTradeGoodsRepository.queryByContractIdsAndGoodsId(contractIds, goodsId);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwcContractGoods)) {
+            log.debug("未找到包含指定商品的合同商品信息,商品ID: {}", goodsId);
+            return Collections.emptyList();
+        }
+
+        // 3. 构建合同ID到合同商品信息的映射,方便后续快速查找价格、数量等详情
+        // 注意:这里使用 (x, y) -> x 处理可能的重复Key,保留第一个匹配项
+        Map<Long, KwcContractTradeGoods> contractGoodsMap = kwcContractGoods.stream()
+                .collect(Collectors.toMap(KwcContractTradeGoods::getContractId, Function.identity(), (x, y) -> x));
+
+        // 4. 过滤出状态为“已签约”的合同ID集合
+        // 只有已签约的合同才允许在下拉框中展示供业务操作
+        Set<Long> signedContractIdList = kwcContractGoods.stream()
+                .filter(goods -> Objects.equals(goods.getStatus(), ContractStatusEnum.SIGNED.getCode()))
+                .map(KwcContractTradeGoods::getContractId)
+                .collect(Collectors.toSet());
+
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(signedContractIdList)) {
+            log.debug("未找到状态为已签约的合同商品,商品ID: {}", goodsId);
+            return Collections.emptyList();
+        }
+
+        // 5. 根据已签约的合同ID集合,批量查询贸易合同主表信息
+        List<KwcContractTrade> kwcContractTrades = kwcContractTradeRepository.findByContractIds(signedContractIdList);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwcContractTrades)) {
+            log.warn("根据合同ID查询贸易合同主表信息为空,合同IDs: {}", signedContractIdList);
+            return Collections.emptyList();
+        }
+
+        // 6. 获取当前登录用户ID,用于权限过滤(仅查看本人销售的合同)
+        Long currentUserId = LoginUserHolder.getUserId();
+        log.debug("当前登录用户ID: {},开始过滤本人销售的已签约合同", currentUserId);
+
+        // 7. 流式处理:
+        //    - 再次确认合同状态为已签约(双重保险)
+        //    - 核心过滤: salesmanId 必须等于当前登录用户ID
+        //    - 组装返回对象:利用之前构建的 map 填充详细信息
+        List<ContractTradeOrderInfo> result = kwcContractTrades.stream()
+                .filter(trade -> Objects.equals(trade.getStatus(), ContractStatusEnum.SIGNED.getCode()))
+                .filter(trade -> {
+                    boolean isMySale = Objects.equals(trade.getSalesmanId(), currentUserId);
+                    if (!isMySale) {
+                        log.trace("合同ID: {} 被过滤,因为销售员ID: {} 不匹配当前用户: {}", 
+                                trade.getId(), trade.getSalesmanId(), currentUserId);
+                    }
+                    return isMySale;
+                })
+                .map(trade -> getContractTradeOrderInfo(trade, conTractTradeUnitMap, contractTradeOrderDto.getEntType(), contractGoodsMap))
+                .collect(Collectors.toList());
+
+        log.info("查询销售员签约合同完成,原始合同数: {}, 过滤后结果数: {}", kwcContractTrades.size(), result.size());
+
+        // 8. 最后根据关键字(如合同名称/企业名称)进行模糊匹配过滤
+        return filterContractTradeOrderInfo(result, contractTradeOrderDto.getKeyword());
+    }
+
+
+    /**
+     * 按下拉展示名称进行关键字过滤。
+     * <p>
+     * 该方法用于对贸易合同订单信息进行模糊匹配过滤,支持忽略大小写。
+     * 主要用于前端下拉框搜索场景,根据用户输入的关键字筛选出名称中包含该关键字的合同记录。
+     * </p>
+     *
+     * @param result  待过滤的贸易合同订单信息列表
+     * @param keyword 搜索关键字,若为空或空白则不进行过滤
+     * @return 过滤后的贸易合同订单信息列表;若原列表为空或关键字为空,则返回原列表
+     */
+    private static List<ContractTradeOrderInfo> filterContractTradeOrderInfo(List<ContractTradeOrderInfo> result, String keyword) {
+        // 前置校验:如果结果集为空或关键字为空/空白,直接返回原结果集,避免不必要的流处理
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(result) || org.apache.commons.lang3.StringUtils.isBlank(keyword)) {
+            return result;
+        }
+
+        log.debug("开始对贸易合同订单进行关键字过滤,关键字: {}, 原始数据量: {}", keyword, result.size());
+
+        // 执行过滤逻辑:使用 StringUtils.containsIgnoreCase 实现不区分大小写的包含匹配
+        List<ContractTradeOrderInfo> filteredList = result.stream()
+                .filter(item -> {
+                    // 防御性编程:确保 item 和 item.getName() 不为 null,避免 NPE
+                    if (item == null || item.getName() == null) {
+                        return false;
+                    }
+                    return org.apache.commons.lang3.StringUtils.containsIgnoreCase(item.getName(), keyword);
+                })
+                .collect(Collectors.toList());
+
+        log.debug("贸易合同订单关键字过滤完成,过滤后数据量: {}", filteredList.size());
+        
+        return filteredList;
     }
     }
 
 
     private static void checkParam(Long contractTradeOrderDto, Long contractTradeOrderDto1, Integer contractTradeOrderDto2) {
     private static void checkParam(Long contractTradeOrderDto, Long contractTradeOrderDto1, Integer contractTradeOrderDto2) {
@@ -2335,9 +2461,12 @@ public class KwcContractTradeService {
         contractTradeOrderInfo.setId(c.getId());
         contractTradeOrderInfo.setId(c.getId());
         KwcContractTradeUnit unit = conTractTradeUnitMap.getOrDefault(c.getId() + "_" + entType,
         KwcContractTradeUnit unit = conTractTradeUnitMap.getOrDefault(c.getId() + "_" + entType,
                 new KwcContractTradeUnit());
                 new KwcContractTradeUnit());
+        KwcContractTradeUnit purchaseUnit = conTractTradeUnitMap.getOrDefault(c.getId() + "_" + CooperateTypeEnum.PURCHASER.getCode(),
+                new KwcContractTradeUnit());
         contractTradeOrderInfo.setEntId(unit.getEntId());
         contractTradeOrderInfo.setEntId(unit.getEntId());
         contractTradeOrderInfo.setContractNo(c.getContractNo());
         contractTradeOrderInfo.setContractNo(c.getContractNo());
-        contractTradeOrderInfo.setName(c.getName());
+        //合同名称-企业名称
+        contractTradeOrderInfo.setName(String.format("%s-%s", Objects.toString(c.getName(), ""), Objects.toString(purchaseUnit.getFirmName(), "")));
         contractTradeOrderInfo.setSigningWay(c.getSigningWay());
         contractTradeOrderInfo.setSigningWay(c.getSigningWay());
         contractTradeOrderInfo.setTrading(c.getTrading());
         contractTradeOrderInfo.setTrading(c.getTrading());
         contractTradeOrderInfo.setStartTime(c.getStartTime());
         contractTradeOrderInfo.setStartTime(c.getStartTime());