Selaa lähdekoodia

feat(jldx): 集成外部产品数据查询功能

- 引入 Dubbo 服务引用和外部产品相关实体类
- 实现外部产品分类数据查询接口逻辑
- 集成远程商品服务获取商品详情信息
- 完善商品 SKU 批量查询和状态同步功能
- 优化商品库存、价格、图片等字段映射处理
- 添加商品分类层级和商品状态判断逻辑
- 修复商品不存在情况下的错误处理机制
肖路 1 viikko sitten
vanhempi
sitoutus
90668ed659

+ 181 - 7
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/jldx/JLDXController.java

@@ -8,15 +8,24 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.compress.utils.Lists;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.common.core.domain.jldx.JLDXResult;
+import org.dromara.external.api.erp.domain.ErpProductCategory;
 import org.dromara.external.api.jldx.*;
 import org.dromara.external.api.jldx.bo.*;
+import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.domain.ExternalProductCategory;
+import org.dromara.external.service.IExternalProductCategoryService;
+import org.dromara.external.service.IExternalProductService;
+import org.dromara.product.api.RemoteProductService;
+import org.dromara.product.api.domain.ProductVo;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -32,6 +41,12 @@ import java.util.stream.Collectors;
 @RequestMapping(value = "/api")
 public class JLDXController {
 
+    private final IExternalProductCategoryService iExternalProductCategoryService;
+
+    private final IExternalProductService iExternalProductService;
+
+    @DubboReference
+    private RemoteProductService remoteProductService;
 
     /**
      * 查询商品对外接口列表
@@ -42,7 +57,18 @@ public class JLDXController {
         if(ObjectUtil.isNotEmpty(JLDXResult)){
             return JLDXResult;
         }
-        List<BProductCategory> list = new ArrayList<>();
+        List<ExternalProductCategory> externalProductCategories = iExternalProductCategoryService.list(Wrappers.lambdaQuery(ExternalProductCategory.class)
+            .select(ExternalProductCategory::getCategoryNo, ExternalProductCategory::getCategoryName, ExternalProductCategory::getId)
+            .eq(ExternalProductCategory::getClassLevel, 3)
+            .eq(ExternalProductCategory::getItemId, 13)
+        );
+        List<BProductCategory> list = externalProductCategories.stream().map(item -> {
+            BProductCategory bProductCategory = new BProductCategory();
+            bProductCategory.setId(item.getId());
+            bProductCategory.setCategoryNo(item.getCategoryNo());
+            bProductCategory.setCategoryName(item.getCategoryName());
+            return bProductCategory;
+        }).toList();
         List<Map<String, Object>> maps = list.stream().map(item -> {
             Map<String, Object> map = new HashMap<>();
             map.put("id", item.getId());
@@ -64,6 +90,17 @@ public class JLDXController {
             return JLDXResult.fail("catalog_id不能为空");
         }
         List<BProductExternal> bProductExternals = new ArrayList<>();
+        List<ExternalProduct> externalProducts = iExternalProductService.list(
+            Wrappers.lambdaQuery(ExternalProduct.class)
+                .select(ExternalProduct::getProductNo)
+                .eq(ExternalProduct::getItemId, 13)
+                .eq(ExternalProduct::getCategoryId, bo.getCatalog_id())
+        );
+        bProductExternals = externalProducts.stream().map(item -> {
+            BProductExternal bProductExternal = new BProductExternal();
+            bProductExternal.setSku(item.getProductNo());
+            return bProductExternal;
+        }).toList();
         List<String> skus = bProductExternals.stream().map(item -> item.getSku()).toList();
         return JLDXResult.ok(skus);
     }
@@ -80,9 +117,53 @@ public class JLDXController {
             return JLDXResult.fail("sku不能为空");
         }
         BProductExternal sku = new BProductExternal();
-        if(ObjectUtil.isEmpty(sku)){
+        ExternalProduct externalProduct = iExternalProductService.getOne(Wrappers.lambdaQuery(ExternalProduct.class)
+            .eq(ExternalProduct::getProductNo, bo.getSku())
+            .eq(ExternalProduct::getItemId, 13)
+            .last("limit 1")
+        );
+        if(ObjectUtil.isEmpty(externalProduct)){
             return JLDXResult.fail("商品不存在");
         }
+        List<ProductVo> productDetailsByNo = remoteProductService.getProductDetailsByNo(bo.getSku());
+
+        ProductVo productVo = productDetailsByNo.get(0);
+        //匹配字段productVo到sku
+        sku.setSku(productVo.getProductNo());
+        sku.setName(productVo.getItemName());
+        sku.setBrandName(productVo.getBrandName());
+        sku.setModel(productVo.getSpecification());
+        sku.setUpc(productVo.getBarCoding());
+        sku.setUnit(productVo.getUnitName());
+        sku.setWeight(productVo.getProductWeight());
+        sku.setImagePath(productVo.getProductImage());
+        sku.setImages(productVo.getImageUrl());
+        sku.setIntroduction(productVo.getPcDetail());
+        sku.setService(productVo.getAfterSalesService());
+        sku.setCode69(productVo.getBarCoding());
+        sku.setPrice(externalProduct.getExternalPrice());
+        sku.setMallPrice(productVo.getMarketPrice());
+        sku.setNum(externalProduct.getTotalInventory() != null ? productVo.getTotalInventory().intValue() : 0);
+
+        // 设置商品状态:1=已上架,0=下架
+        if (productVo.getProductStatus() != null) {
+            sku.setState(externalProduct.getProductStatus() == 1 ? "1" : "0");
+        }
+
+        // 设置分类信息
+        if (productVo.getBottomCategoryId() != null) {
+            sku.setCatalogId(externalProduct.getCategoryId());
+        }
+
+        // 设置属性信息
+//        if (ObjectUtil.isNotEmpty(productVo.getAttributesList())) {
+//            sku.setAttributes(productVo.getAttributesList());
+//        }
+
+        // 设置规格参数
+//        if (ObjectUtil.isNotEmpty(productVo.getSpecification())) {
+//            sku.setParam(productVo.getSpecification());
+//        }
         Map<String, Object> map = BeanUtil.beanToMap(sku, true, false);
         map.put("code_69",sku.getCode69());
         map.put("code_69_file",sku.getCode69File());
@@ -105,7 +186,57 @@ public class JLDXController {
         if(ObjectUtil.isEmpty(skusSplit)){
             return JLDXResult.fail("skus不能为空");
         }
-        List<BProductExternal> bProductExternals = new ArrayList<>();
+
+        ExternalProduct externalProduct = iExternalProductService.getOne(Wrappers.lambdaQuery(ExternalProduct.class)
+            .in(ExternalProduct::getProductNo, skusSplit)
+            .eq(ExternalProduct::getItemId, 13)
+            .last("limit 1")
+        );
+        if(ObjectUtil.isEmpty(externalProduct)){
+            return JLDXResult.fail("商品不存在");
+        }
+        List<ProductVo> productDetailsByNo = remoteProductService.getProductDetailsByNo(bo.getSkus());
+
+        List<BProductExternal> bProductExternals = productDetailsByNo.stream().map(productVo -> {
+            BProductExternal sku = new BProductExternal();
+            //匹配字段productVo到sku
+            sku.setSku(productVo.getProductNo());
+            sku.setName(productVo.getItemName());
+            sku.setBrandName(productVo.getBrandName());
+            sku.setModel(productVo.getSpecification());
+            sku.setUpc(productVo.getBarCoding());
+            sku.setUnit(productVo.getUnitName());
+            sku.setWeight(productVo.getProductWeight());
+            sku.setImagePath(productVo.getProductImage());
+            sku.setImages(productVo.getImageUrl());
+            sku.setIntroduction(productVo.getPcDetail());
+            sku.setService(productVo.getAfterSalesService());
+            sku.setCode69(productVo.getBarCoding());
+            sku.setPrice(externalProduct.getExternalPrice());
+            sku.setMallPrice(productVo.getMarketPrice());
+            sku.setNum(externalProduct.getTotalInventory() != null ? productVo.getTotalInventory().intValue() : 0);
+
+            // 设置商品状态:1=已上架,0=下架
+            if (productVo.getProductStatus() != null) {
+                sku.setState(externalProduct.getProductStatus() == 1 ? "1" : "0");
+            }
+
+            // 设置分类信息
+            if (productVo.getBottomCategoryId() != null) {
+                sku.setCatalogId(externalProduct.getCategoryId());
+            }
+
+            // 设置属性信息
+//        if (ObjectUtil.isNotEmpty(productVo.getAttributesList())) {
+//            sku.setAttributes(productVo.getAttributesList());
+//        }
+
+            // 设置规格参数
+//        if (ObjectUtil.isNotEmpty(productVo.getSpecification())) {
+//            sku.setParam(productVo.getSpecification());
+//        }
+            return sku;
+        }).toList();
         List<Map<String, Object>> maps = bProductExternals.stream().map(item -> {
             Map<String, Object> map = new HashMap<>();
             map.put("sku", item.getSku());
@@ -131,7 +262,19 @@ public class JLDXController {
         if(ObjectUtil.isEmpty(skusSplit)){
             return JLDXResult.fail("sku不能为空");
         }
-        List<BProductExternal> bProductExternals = new ArrayList<>();
+        List<ExternalProduct> externalProducts = iExternalProductService.list(Wrappers.lambdaQuery(ExternalProduct.class)
+            .in(ExternalProduct::getProductNo, skusSplit)
+            .eq(ExternalProduct::getItemId, 13)
+        );
+        if(ObjectUtil.isEmpty(externalProducts)){
+            return JLDXResult.fail("商品不存在");
+        }
+        List<BProductExternal> bProductExternals = externalProducts.stream().map(externalProduct -> {
+            BProductExternal bProductExternal = new BProductExternal();
+            bProductExternal.setSku(externalProduct.getProductNo());
+            bProductExternal.setState(externalProduct.getProductStatus() == 1 ? "1" : "0");
+            return bProductExternal;
+        }).toList();
         List<Map<String, Object>> maps = bProductExternals.stream().map(item -> {
             Map<String, Object> map = new HashMap<>();
             map.put("sku", item.getSku());
@@ -157,7 +300,17 @@ public class JLDXController {
         if(ObjectUtil.isEmpty(skusSplit)){
             return JLDXResult.fail("sku不能为空");
         }
-        List<BProductExternal> bProductExternals = new ArrayList<>();
+        List<ExternalProduct> externalProducts = iExternalProductService.list(Wrappers.lambdaQuery(ExternalProduct.class)
+            .in(ExternalProduct::getProductNo, skusSplit)
+            .eq(ExternalProduct::getItemId, 13)
+        );
+        List<ProductVo> productDetailsByNo = remoteProductService.getProductDetailsByNo(bo.getSku());
+        List<BProductExternal> bProductExternals = productDetailsByNo.stream().map(productVo -> {
+            BProductExternal bProductExternal = new BProductExternal();
+            bProductExternal.setSku(productVo.getProductNo());
+            bProductExternal.setImages(productVo.getImageUrl());
+            return bProductExternal;
+        }).toList();
         List<Map<String, Object>> maps = bProductExternals.stream().map(item -> {
             Map<String, Object> map = new HashMap<>();
             map.put("sku", item.getSku());
@@ -245,7 +398,19 @@ public class JLDXController {
         if(ObjectUtil.isEmpty(skusSplit)){
             return JLDXResult.fail("sku不能为空");
         }
-        List<BProductExternal> bProductExternals = new ArrayList<>();
+        List<ExternalProduct> externalProducts = iExternalProductService.list(Wrappers.lambdaQuery(ExternalProduct.class)
+            .in(ExternalProduct::getProductNo, skusSplit)
+            .eq(ExternalProduct::getItemId, 13)
+        );
+        Map<String, BigDecimal> decimalMap = externalProducts.stream().collect(Collectors.toMap(ExternalProduct::getProductNo, ExternalProduct::getExternalPrice));
+        List<ProductVo> productDetailsByNo = remoteProductService.getProductDetailsByNo(bo.getSku());
+        List<BProductExternal> bProductExternals = productDetailsByNo.stream().map(productVo -> {
+            BProductExternal bProductExternal = new BProductExternal();
+            bProductExternal.setSku(productVo.getProductNo());
+            bProductExternal.setPrice(decimalMap.get(productVo.getProductNo()) != null ? decimalMap.get(productVo.getProductNo()) : BigDecimal.ZERO);
+            bProductExternal.setMallPrice(productVo.getMarketPrice());
+            return bProductExternal;
+        }).toList();
         List<Map<String, Object>> maps = bProductExternals.stream().map(item -> {
             Map<String, Object> map = new HashMap<>();
             map.put("sku", item.getSku());
@@ -274,7 +439,16 @@ public class JLDXController {
         if(ObjectUtil.isEmpty(skusSplit)){
             return JLDXResult.fail("sku不能为空");
         }
-        List<BProductExternal> bProductExternals = new ArrayList<>();
+        List<ExternalProduct> externalProducts = iExternalProductService.list(Wrappers.lambdaQuery(ExternalProduct.class)
+            .in(ExternalProduct::getProductNo, skusSplit)
+            .eq(ExternalProduct::getItemId, 13)
+        );
+        List<BProductExternal> bProductExternals = externalProducts.stream().map(item -> {
+            BProductExternal bProductExternal = new BProductExternal();
+            bProductExternal.setSku(item.getProductNo());
+            bProductExternal.setNum(item.getAvailableInventory());
+            return bProductExternal;
+        }).toList();
         if(ObjectUtil.isEmpty(bProductExternals)){
             List<Map<String, Object>> maps = Arrays.stream(skusSplit).map(item -> {
                 Map<String, Object> map = new HashMap<>();

+ 5 - 5
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCancelMessageHandler.java

@@ -1,8 +1,8 @@
 package org.dromara.external.controller.zhongche.handle.impl;
 
 import cn.hutool.json.JSONUtil;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.external.api.zhongche.domain.bo.MessageBo;
 import org.dromara.external.api.zhongche.domain.vo.MessageVo;
 import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
@@ -19,13 +19,13 @@ import org.springframework.stereotype.Component;
  */
 @Component
 @Slf4j
-@RequiredArgsConstructor
 public class OrderCancelMessageHandler implements MallMessageHandler {
 
+    @DubboReference
+    private RemoteExternalOrderService remoteExternalOrderService;
 
-    private final RemoteExternalOrderService remoteExternalOrderService;
-
-    private final RemoteApiOrderService remoteApiOrderService;
+    @DubboReference
+    private RemoteApiOrderService remoteApiOrderService;
 
     @Override
     public MallMessageTypeEnum supportType() {

+ 1 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBaseMapper.xml

@@ -303,6 +303,7 @@
             p.purchasing_price AS purchasePrice,
             p.max_purchase_price AS maxPurchasePrice,
             p.tax_rate AS taxRate,
+            p.taxation_id AS taxationId,
             p.currency,
             p.min_order_quantity AS minOrderQuantity,
             p.total_inventory AS totalInventory,