|
|
@@ -360,6 +360,7 @@ public class KwcContractTradeService {
|
|
|
|
|
|
private void checkParam(TradeBaseInfoReqVo baseInfo, List<TradeGoodsInfoReqVo> goodsInfo) {
|
|
|
if (Objects.nonNull(baseInfo)) {
|
|
|
+ validateAgentUnitParam(baseInfo);
|
|
|
if (StringUtils.isNotBlank(baseInfo.getContractCode()) && baseInfo.getContractCode().length() > 20) {
|
|
|
throw new SystemException("合同编号超长!");
|
|
|
}
|
|
|
@@ -429,6 +430,28 @@ public class KwcContractTradeService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 校验代理单位参数,兼容不传代理单位的旧合同新增请求。
|
|
|
+ *
|
|
|
+ * @param baseInfo 贸易合同基础信息
|
|
|
+ */
|
|
|
+ static void validateAgentUnitParam(TradeBaseInfoReqVo baseInfo) {
|
|
|
+ if (Objects.isNull(baseInfo)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ boolean hasAgentEnt = Objects.nonNull(baseInfo.getAgentEntId());
|
|
|
+ boolean hasAgentPhone = StringUtils.isNotBlank(baseInfo.getAgentPhone());
|
|
|
+ if (!hasAgentEnt && !hasAgentPhone) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!hasAgentEnt) {
|
|
|
+ throw new SystemException("代理单位不能为空");
|
|
|
+ }
|
|
|
+ if (!hasAgentPhone) {
|
|
|
+ throw new SystemException("代理单位联系电话不能为空");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private static boolean hasDuplicateGoodsId(List<TradeGoodsInfoReqVo> goodsInfo) {
|
|
|
if (goodsInfo == null || goodsInfo.isEmpty()) {
|
|
|
return false;
|
|
|
@@ -2366,63 +2389,157 @@ public class KwcContractTradeService {
|
|
|
}
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 查询贸易合同订单信息(主要用于下拉框选择等场景)。
|
|
|
+ * <p>
|
|
|
+ * 根据传入的企业ID、企业类型和商品ID,查询符合条件的已签约贸易合同列表。
|
|
|
+ * 针对供应商类型(Supplier),会进一步过滤为当前登录用户作为销售员的合同;
|
|
|
+ * 针对其他类型(如采购商),则基于当前登录企业进行过滤。
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @param contractTradeOrderDto 查询条件DTO,包含 goodsId(商品ID)、entId(企业ID)、entType(企业类型)、keyword(搜索关键字)
|
|
|
+ * @return 贸易合同订单信息列表 {@link ContractTradeOrderInfo}
|
|
|
+ */
|
|
|
public List<ContractTradeOrderInfo> queryContractTradeOrder(ContractTradeOrderDto contractTradeOrderDto) {
|
|
|
- log.info("查询贸易合同订单,请求:{}", JSON.toJSONString(contractTradeOrderDto));
|
|
|
+ log.info("开始查询贸易合同订单,请求参数:{}", JSON.toJSONString(contractTradeOrderDto));
|
|
|
+
|
|
|
+ // 1. 参数校验:确保商品ID、企业ID和企业类型不为空
|
|
|
checkParam(contractTradeOrderDto.getGoodsId(), contractTradeOrderDto.getEntId(), contractTradeOrderDto.getEntType());
|
|
|
- //查询贸易合同企业信息
|
|
|
- List<KwcContractTradeUnit> tradeUnits = kwcContractTradeUnitRepository.queryByEntIdAndUnitType(contractTradeOrderDto.getEntId(),
|
|
|
- contractTradeOrderDto.getEntType());
|
|
|
+
|
|
|
+ // 2. 根据企业和类型查询关联的合同单位信息
|
|
|
+ // 例如:查询某供应商参与的所有作为“供应方”的合同,或某采购商参与的所有作为“采购方”的合同
|
|
|
+ List<KwcContractTradeUnit> tradeUnits = kwcContractTradeUnitRepository.queryByEntIdAndUnitType(
|
|
|
+ contractTradeOrderDto.getEntId(),
|
|
|
+ contractTradeOrderDto.getEntType()
|
|
|
+ );
|
|
|
+
|
|
|
if (org.apache.commons.collections4.CollectionUtils.isEmpty(tradeUnits)) {
|
|
|
+ log.debug("未找到指定企业[{}]在类型[{}]下的合同单位信息,返回空列表", contractTradeOrderDto.getEntId(), contractTradeOrderDto.getEntType());
|
|
|
return List.of();
|
|
|
}
|
|
|
- Set<Long> contractIds =
|
|
|
- tradeUnits.stream().map(KwcContractTradeUnit::getContractId).collect(Collectors.toSet());
|
|
|
|
|
|
- List<KwcContractTradeUnit> tradeUnits1 = kwcContractTradeUnitRepository.queryByContractIds(contractIds);
|
|
|
- if (org.apache.commons.collections4.CollectionUtils.isEmpty(tradeUnits1)) {
|
|
|
+ // 提取这些单位关联的所有合同ID
|
|
|
+ Set<Long> contractIds = tradeUnits.stream()
|
|
|
+ .map(KwcContractTradeUnit::getContractId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ if (org.apache.commons.collections4.CollectionUtils.isEmpty(contractIds)) {
|
|
|
+ log.debug("提取到的合同ID集合为空,返回空列表");
|
|
|
return List.of();
|
|
|
}
|
|
|
- Map<String, KwcContractTradeUnit> conTractTradeUnitMap =
|
|
|
- tradeUnits1.stream().collect(Collectors.toMap(x -> x.getContractId() +
|
|
|
- "_" + x.getUnitType(), Function.identity(),
|
|
|
- (x, y) -> x));
|
|
|
- // 判断当前查询的企业类型是否为供应方(供应商)
|
|
|
- if (Objects.equals(contractTradeOrderDto.getEntType(), CooperateTypeEnum.SUPPLIER.getCode())) {
|
|
|
- log.debug("当前查询类型为供应方,执行销售员签约贸易合同查询逻辑。entId: {}, goodsId: {}",
|
|
|
- contractTradeOrderDto.getEntId(), contractTradeOrderDto.getGoodsId());
|
|
|
- // 调用专用方法查询当前登录用户作为销售员且已签约的贸易合同信息
|
|
|
- return querySalesmanSignedTradeOrder(contractTradeOrderDto, contractIds, conTractTradeUnitMap);
|
|
|
+ log.debug("初步筛选出的合同ID数量: {}", contractIds.size());
|
|
|
+
|
|
|
+ // 3. 批量查询这些合同的所有单位信息,用于后续构建返回对象中的企业名称等字段
|
|
|
+ List<KwcContractTradeUnit> allTradeUnits = kwcContractTradeUnitRepository.queryByContractIds(contractIds);
|
|
|
+ if (org.apache.commons.collections4.CollectionUtils.isEmpty(allTradeUnits)) {
|
|
|
+ log.warn("根据合同ID集合查询合同单位信息为空,contractIds: {}", contractIds);
|
|
|
+ return List.of();
|
|
|
}
|
|
|
- contractIds = tradeUnits1.stream()
|
|
|
- .filter(x -> Objects.equals(x.getEntId(), LoginUserHolder.getEntId()) && Objects.equals(x.getUnitType(),
|
|
|
- 2))
|
|
|
+
|
|
|
+ // 构建映射:Key为 "contractId_unitType",Value为单位对象
|
|
|
+ // 方便后续通过合同ID和单位类型快速获取对应的企业信息(如采购方名称、供应方名称)
|
|
|
+ Map<String, KwcContractTradeUnit> contractTradeUnitMap = allTradeUnits.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ unit -> unit.getContractId() + "_" + unit.getUnitType(),
|
|
|
+ Function.identity(),
|
|
|
+ (existing, replacement) -> existing // 处理Key冲突,保留第一个
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 4. 分支处理:根据企业类型执行不同的查询逻辑
|
|
|
+ Integer entType = contractTradeOrderDto.getEntType();
|
|
|
+
|
|
|
+ // 场景A:如果查询的是供应方(供应商)
|
|
|
+ // 业务规则:供应商查看合同时,通常只能看到自己作为销售员负责的、且已签约的合同
|
|
|
+ if (Objects.equals(entType, CooperateTypeEnum.SUPPLIER.getCode())) {
|
|
|
+ log.debug("当前查询类型为供应方(Supplier),进入销售员专属查询逻辑。entId: {}, goodsId: {}",
|
|
|
+ contractTradeOrderDto.getEntId(), contractTradeOrderDto.getGoodsId());
|
|
|
+
|
|
|
+ // 调用专用方法,内部会过滤 salesmanId = 当前登录用户ID 且状态为已签约的合同
|
|
|
+ return querySalesmanSignedTradeOrder(contractTradeOrderDto, contractIds, contractTradeUnitMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 场景B:其他类型(主要是采购方 Purchaser)
|
|
|
+ // 业务规则:采购商查看合同时,需限制在当前登录企业范围内,且角色为采购方(unitType=2)
|
|
|
+ log.debug("当前查询类型非供应方,执行通用采购方查询逻辑。当前登录企业ID: {}", LoginUserHolder.getEntId());
|
|
|
+
|
|
|
+ // 再次过滤合同ID:只保留当前登录企业作为“采购方”参与的合同
|
|
|
+ // 注意:这里硬编码了 unitType=2 (假设 2 代表 PURCHASER/采购方,需与 CooperateTypeEnum.PURCHASER.getCode() 保持一致)
|
|
|
+ Set<Long> filteredContractIds = allTradeUnits.stream()
|
|
|
+ .filter(unit -> Objects.equals(unit.getEntId(), LoginUserHolder.getEntId())
|
|
|
+ && Objects.equals(unit.getUnitType(), CooperateTypeEnum.PURCHASER.getCode()))
|
|
|
.map(KwcContractTradeUnit::getContractId)
|
|
|
.collect(Collectors.toSet());
|
|
|
- //查询商品信息
|
|
|
- List<KwcContractTradeGoods> kwcContractGoods = kwcContractTradeGoodsRepository.queryByContractIdsAndGoodsId(contractIds,
|
|
|
- contractTradeOrderDto.getGoodsId());
|
|
|
- if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwcContractGoods)) {
|
|
|
+
|
|
|
+ if (org.apache.commons.collections4.CollectionUtils.isEmpty(filteredContractIds)) {
|
|
|
+ log.debug("当前登录企业[{}]未作为采购方参与任何上述合同,返回空列表", LoginUserHolder.getEntId());
|
|
|
return Collections.emptyList();
|
|
|
}
|
|
|
- Map<Long, KwcContractTradeGoods> contractGoodsMap = kwcContractGoods.stream()
|
|
|
- .collect(Collectors.toMap(KwcContractTradeGoods::getContractId, Function.identity(), (x, y) -> x));
|
|
|
- //只查询已签约的
|
|
|
- Set<Long> contractIdList = kwcContractGoods.stream()
|
|
|
- .filter(x -> Objects.equals(x.getStatus(), ContractStatusEnum.SIGNED.getCode()))
|
|
|
+ log.debug("过滤后剩余合同ID数量: {}", filteredContractIds.size());
|
|
|
+
|
|
|
+ // 5. 根据商品ID进一步筛选合同
|
|
|
+ // 查询上述合同中,包含指定商品ID的合同商品信息
|
|
|
+ List<KwcContractTradeGoods> contractGoodsList = kwcContractTradeGoodsRepository.queryByContractIdsAndGoodsId(
|
|
|
+ filteredContractIds,
|
|
|
+ contractTradeOrderDto.getGoodsId()
|
|
|
+ );
|
|
|
+
|
|
|
+ if (org.apache.commons.collections4.CollectionUtils.isEmpty(contractGoodsList)) {
|
|
|
+ log.debug("在合同[{}]中未找到包含商品ID[{}]的商品信息,返回空列表", filteredContractIds, contractTradeOrderDto.getGoodsId());
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建映射:Key为 contractId,Value为合同商品信息(用于获取价格、数量等)
|
|
|
+ Map<Long, KwcContractTradeGoods> contractGoodsMap = contractGoodsList.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ KwcContractTradeGoods::getContractId,
|
|
|
+ Function.identity(),
|
|
|
+ (x, y) -> x
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 6. 状态过滤:只保留“已签约”状态的合同
|
|
|
+ Set<Long> signedContractIds = contractGoodsList.stream()
|
|
|
+ .filter(goods -> Objects.equals(goods.getStatus(), ContractStatusEnum.SIGNED.getCode()))
|
|
|
.map(KwcContractTradeGoods::getContractId)
|
|
|
.collect(Collectors.toSet());
|
|
|
- //查询贸易合同
|
|
|
- List<KwcContractTrade> kwcContractTrades = kwcContractTradeRepository.findByContractIds(contractIdList);
|
|
|
- if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwcContractTrades)) {
|
|
|
+
|
|
|
+ if (org.apache.commons.collections4.CollectionUtils.isEmpty(signedContractIds)) {
|
|
|
+ log.debug("未找到状态为“已签约”且包含指定商品的合同,返回空列表");
|
|
|
return Collections.emptyList();
|
|
|
}
|
|
|
- kwcContractTrades = kwcContractTrades.stream()
|
|
|
- .filter(x -> Objects.equals(x.getStatus(), ContractStatusEnum.SIGNED.getCode()))
|
|
|
+ log.debug("符合条件的已签约合同ID数量: {}", signedContractIds.size());
|
|
|
+
|
|
|
+ // 7. 查询合同主表信息
|
|
|
+ List<KwcContractTrade> contractTrades = kwcContractTradeRepository.findByContractIds(signedContractIds);
|
|
|
+ if (org.apache.commons.collections4.CollectionUtils.isEmpty(contractTrades)) {
|
|
|
+ log.warn("根据合同ID查询合同主表信息为空,signedContractIds: {}", signedContractIds);
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 双重保险:再次在内存中过滤状态,确保数据一致性
|
|
|
+ List<KwcContractTrade> validTrades = contractTrades.stream()
|
|
|
+ .filter(trade -> Objects.equals(trade.getStatus(), ContractStatusEnum.SIGNED.getCode()))
|
|
|
.collect(Collectors.toList());
|
|
|
- List<ContractTradeOrderInfo> result = kwcContractTrades.stream()
|
|
|
- .map(x -> getContractTradeOrderInfo(x, conTractTradeUnitMap, contractTradeOrderDto.getEntType(), contractGoodsMap))
|
|
|
+
|
|
|
+ if (org.apache.commons.collections4.CollectionUtils.isEmpty(validTrades)) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 8. 组装返回结果
|
|
|
+ List<ContractTradeOrderInfo> resultList = validTrades.stream()
|
|
|
+ .map(trade -> getContractTradeOrderInfo(
|
|
|
+ trade,
|
|
|
+ contractTradeUnitMap,
|
|
|
+ contractTradeOrderDto.getEntType(),
|
|
|
+ contractGoodsMap
|
|
|
+ ))
|
|
|
.collect(Collectors.toList());
|
|
|
- return filterContractTradeOrderInfo(result, contractTradeOrderDto.getKeyword());
|
|
|
+
|
|
|
+ // 9. 关键字模糊匹配过滤(如有)
|
|
|
+ List<ContractTradeOrderInfo> finalResult = filterContractTradeOrderInfo(resultList, contractTradeOrderDto.getKeyword());
|
|
|
+
|
|
|
+ log.info("查询贸易合同订单完成,最终返回记录数: {}", finalResult.size());
|
|
|
+ return finalResult;
|
|
|
}
|
|
|
|
|
|
|