Ver Fonte

Merge remote-tracking branch 'origin/dev_20260630' into dev_20260630

xucaiqin há 4 horas atrás
pai
commit
caa1786543

+ 9 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java

@@ -199,5 +199,14 @@ public interface RemoteContractService {
 
     ProxyContractVo queryProxyContract(Long goodsId);
 
+    /**
+     * 根据供应企业和代理商企业查询代理合同商品ID集合。
+     *
+     * @param entId      企业ID
+     * @param proxyEntId 代理商企业ID
+     * @return 商品ID集合
+     */
+    List<Long> queryProxyGoodsIds(Long entId, Long proxyEntId);
+
     List<TradeEntInfoResVo> queryPrepaidTradeEntIds(TradeEntListQueryFeignDto queryFeignDto);
 }

+ 1 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dao/KwcContractProxyGoodsMapper.java

@@ -10,4 +10,4 @@ import org.apache.ibatis.annotations.Mapper;
 */
 @Mapper
 public interface KwcContractProxyGoodsMapper extends BaseMapper<KwcContractProxyGoods> {
-}
+}

+ 43 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java

@@ -1010,6 +1010,49 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         return null;
     }
 
+    @Override
+    public List<Long> queryProxyGoodsIds(Long entId, Long proxyEntId) {
+        if (Objects.isNull(entId) || Objects.isNull(proxyEntId)) {
+            log.warn("查询代理合同商品ID参数为空,entId:{}, proxyEntId:{}", entId, proxyEntId);
+            return Collections.emptyList();
+        }
+        // 查询代理合同
+        List<KwcContractProxy> proxyContracts = kwcContractProxyMapper.selectList(Wrappers.lambdaQuery(KwcContractProxy.class)
+                .select(KwcContractProxy::getId)
+                .eq(KwcContractProxy::getEntId, entId)
+                .eq(KwcContractProxy::getProxyId, proxyEntId)
+                .eq(KwcContractProxy::getDelFlag, Global.NO));
+        log.info("查询代理合同,企业id :{}, 代理商id :{},条数:{}", entId, proxyEntId, proxyContracts.size());
+        if (CollUtil.isEmpty(proxyContracts)) {
+            log.info("查询代理合同为空");
+            return Collections.emptyList();
+        }
+        List<Long> contractIds = proxyContracts.stream()
+                .map(KwcContractProxy::getId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .toList();
+        if (CollUtil.isEmpty(contractIds)) {
+            log.info("查询代理合同为空");
+            return Collections.emptyList();
+        }
+        // 查询代理合同商品
+        List<KwcContractProxyGoods> proxyGoods = kwcContractProxyGoodsMapper.selectList(Wrappers.lambdaQuery(KwcContractProxyGoods.class)
+                .select(KwcContractProxyGoods::getGoodsId)
+                .in(KwcContractProxyGoods::getContractId, contractIds)
+                .eq(KwcContractProxyGoods::getDelFlag, Global.NO)
+                .isNotNull(KwcContractProxyGoods::getGoodsId));
+        if (CollUtil.isEmpty(proxyGoods)) {
+            log.info("查询代理合同商品为空");
+            return Collections.emptyList();
+        }
+        return proxyGoods.stream()
+                .map(KwcContractProxyGoods::getGoodsId)
+                .filter(Objects::nonNull)
+                .distinct()
+                .toList();
+    }
+
     @Override
     public List<TradeEntInfoResVo> queryPrepaidTradeEntIds(TradeEntListQueryFeignDto queryFeignDto) {
         if (queryFeignDto.getCurEntId() == null) {

+ 1 - 1
sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractProxyGoodsMapper.xml

@@ -25,4 +25,4 @@
     id, contract_id, goods_id, goods_name, sku_id, unit, amount, price, remark, `status`, 
     create_by, create_time, update_by, update_time, del_flag
   </sql>
-</mapper>
+</mapper>

+ 5 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/GoodsInfoReq.java

@@ -23,6 +23,11 @@ public class GoodsInfoReq implements Serializable {
      */
     @Schema(description = "企业id")
     private String entId;
+    /**
+     * 代理商id
+     */
+    @Schema(description = "代理商id")
+    private String proxyEntId;
     /**
      * 商品名称
      */

+ 10 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/repository/KwpGoodsRepository.java

@@ -26,6 +26,16 @@ public class KwpGoodsRepository extends ServiceImpl<KwpGoodsMapper, KwpGoods> {
 
     }
 
+    public List<KwpGoods> queryByIdsAndGoodsName(List<Long> goodsIds, String goodsName) {
+        if (Objects.isNull(goodsIds) || goodsIds.isEmpty()) {
+            return List.of();
+        }
+        return list(Wrappers.<KwpGoods>lambdaQuery()
+                .eq(KwpGoods::getDelFlag, 0)
+                .in(KwpGoods::getId, goodsIds)
+                .like(StringUtils.isNotBlank(goodsName), KwpGoods::getName, goodsName));
+    }
+
     public List<KwpGoods> queryByGoodsNameAndTypeAndDesc(String goodsName, String goodsType, String goodsSpec) {
         return list(Wrappers.<KwpGoods>lambdaQuery()
                 .eq(KwpGoods::getDelFlag,0)

+ 57 - 2
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

@@ -1491,8 +1491,10 @@ public class KwpGoodsService {
     public GoodsInfoResp getGoods(GoodsInfoReq req) {
         log.info("查询商品信息,请求参数 :{}", JSON.toJSONString(req));
         //查询上商品信息
-        Long entId = StringUtils.isNotBlank(req.getEntId()) ? Long.valueOf(req.getEntId()) : null;
-        List<KwpGoods> goods = kwpGoodsRepository.queryByEntIdAndGoodsName(entId, req.getGoodsName());
+        Long entId = parseLongParam(req.getEntId(), "企业id");
+        Long proxyEntId = parseLongParam(req.getProxyEntId(), "代理商id");
+        List<KwpGoods> goods = queryGoodsInfoList(req, entId, proxyEntId);
+        log.info("查询商品信息,返回条数 :{}", goods.size());
         if (org.apache.commons.collections4.CollectionUtils.isEmpty(goods)) {
             return new GoodsInfoResp();
         }
@@ -1506,6 +1508,59 @@ public class KwpGoodsService {
         return goodsInfoResp;
     }
 
+    /**
+     * 查询商品信息列表。企业id和代理商id同时传入时,按代理合同商品限定商品范围;代理商id未传入时保持原有查询逻辑。
+     *
+     * @param req        查询商品请求参数
+     * @param entId      企业id
+     * @param proxyEntId 代理商id
+     * @return 商品信息列表
+     */
+    private List<KwpGoods> queryGoodsInfoList(GoodsInfoReq req, Long entId, Long proxyEntId) {
+        if (!isProxyGoodsQuery(req)) {
+            log.info("查询商品信息,请求参数 :{}", JSON.toJSONString(req));
+            return kwpGoodsRepository.queryByEntIdAndGoodsName(entId, req.getGoodsName());
+        }
+        List<Long> proxyGoodsIds = remoteContractService.queryProxyGoodsIds(entId, proxyEntId);
+        log.info("查询代理商品信息,企业id :{}, 代理商id :{},条数:{}", entId, proxyEntId, proxyGoodsIds.size());
+        if (CollUtil.isEmpty(proxyGoodsIds)) {
+            log.info("查询代理商品信息为空");
+            return Collections.emptyList();
+        }
+        return kwpGoodsRepository.queryByIdsAndGoodsName(proxyGoodsIds, req.getGoodsName());
+    }
+
+    /**
+     * 判断是否按代理合同商品查询。只有企业id与代理商id同时存在时才切换新逻辑,避免影响原有调用方。
+     *
+     * @param req 查询商品请求参数
+     * @return true-按代理合同商品查询;false-按原有企业商品查询
+     */
+    static boolean isProxyGoodsQuery(GoodsInfoReq req) {
+        return Objects.nonNull(req)
+                && StringUtils.isNotBlank(req.getEntId())
+                && StringUtils.isNotBlank(req.getProxyEntId());
+    }
+
+    /**
+     * 安全转换Long参数,避免非法字符串导致系统异常。
+     *
+     * @param value     参数值
+     * @param paramName 参数名称
+     * @return Long参数值
+     */
+    private Long parseLongParam(String value, String paramName) {
+        if (StringUtils.isBlank(value)) {
+            return null;
+        }
+        try {
+            return Long.valueOf(value);
+        } catch (NumberFormatException e) {
+            log.warn("查询商品信息参数转换失败,{}:{}", paramName, value, e);
+            throw new BusinessException(paramName + "格式不正确");
+        }
+    }
+
     private static GoodsInfoResp.GoodsInfo getGoodsInfo(KwpGoods x, Map<String, Map<String, String>> valueAndDictResDtoMap) {
         GoodsInfoResp.GoodsInfo goodsInfo = new GoodsInfoResp.GoodsInfo();
         goodsInfo.setGoodsId(x.getId());

+ 34 - 0
sckw-modules/sckw-product/src/test/java/com/sckw/product/service/KwpGoodsServiceTest.java

@@ -0,0 +1,34 @@
+package com.sckw.product.service;
+
+import com.sckw.product.model.vo.req.GoodsInfoReq;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * 商品服务单元测试。
+ */
+public class KwpGoodsServiceTest {
+
+    /**
+     * 企业id和代理商id同时存在时,应按代理合同商品查询。
+     */
+    @Test
+    public void shouldUseProxyGoodsQueryWhenEntIdAndProxyEntIdExist() {
+        GoodsInfoReq req = new GoodsInfoReq();
+        req.setEntId("1001");
+        req.setProxyEntId("2001");
+
+        Assert.assertTrue(KwpGoodsService.isProxyGoodsQuery(req));
+    }
+
+    /**
+     * 代理商id为空时,应保持原有企业商品查询逻辑。
+     */
+    @Test
+    public void shouldKeepOriginalGoodsQueryWhenProxyEntIdMissing() {
+        GoodsInfoReq req = new GoodsInfoReq();
+        req.setEntId("1001");
+
+        Assert.assertFalse(KwpGoodsService.isProxyGoodsQuery(req));
+    }
+}