Просмотр исходного кода

Merge branch 'master' into hurx

hurx 2 месяцев назад
Родитель
Сommit
b80bb9ff6e
32 измененных файлов с 2018 добавлено и 32 удалено
  1. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProtocolInfoController.java
  2. 126 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProtocolProductsController.java
  3. 63 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/pc/BenefitsProductController.java
  4. 12 5
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/pc/IndexProductController.java
  5. 119 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/pc/IndustryProductController.java
  6. 14 9
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/pc/MyProductController.java
  7. 129 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProtocolInfo.java
  8. 90 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProtocolProducts.java
  9. 1 1
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBaseBo.java
  10. 4 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBrandBo.java
  11. 139 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProtocolInfoBo.java
  12. 112 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProtocolProductsBo.java
  13. 9 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/PcProductVo.java
  14. 170 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProtocolInfoVo.java
  15. 102 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProtocolProductsVo.java
  16. 4 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductBaseMapper.java
  17. 6 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductBrandMapper.java
  18. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProtocolInfoMapper.java
  19. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProtocolProductsMapper.java
  20. 11 1
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductBaseService.java
  21. 8 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductBrandService.java
  22. 70 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProtocolInfoService.java
  23. 72 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProtocolProductsService.java
  24. 28 5
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java
  25. 16 8
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBrandServiceImpl.java
  26. 162 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProtocolInfoServiceImpl.java
  27. 164 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProtocolProductsServiceImpl.java
  28. 18 2
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBaseMapper.xml
  29. 16 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBrandMapper.xml
  30. 2 1
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductCategoryRecommendedLinkMapper.xml
  31. 77 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/BenefitsSystemController.java
  32. 138 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/IndustrySystemController.java

+ 106 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProtocolInfoController.java

@@ -0,0 +1,106 @@
+package org.dromara.product.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.product.domain.vo.ProtocolInfoVo;
+import org.dromara.product.domain.bo.ProtocolInfoBo;
+import org.dromara.product.service.IProtocolInfoService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 协议信息
+ * 前端访问路由地址为:/product/info
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/info")
+public class ProtocolInfoController extends BaseController {
+
+    private final IProtocolInfoService protocolInfoService;
+
+    /**
+     * 查询协议信息列表
+     */
+    //@SaCheckPermission("product:info:list")
+    @GetMapping("/list")
+    public TableDataInfo<ProtocolInfoVo> list(ProtocolInfoBo bo, PageQuery pageQuery) {
+        return protocolInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出协议信息列表
+     */
+    //@SaCheckPermission("product:info:export")
+    @Log(title = "协议信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ProtocolInfoBo bo, HttpServletResponse response) {
+        List<ProtocolInfoVo> list = protocolInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "协议信息", ProtocolInfoVo.class, response);
+    }
+
+    /**
+     * 获取协议信息详细信息
+     *
+     * @param id 主键
+     */
+    //@SaCheckPermission("product:info:query")
+    @GetMapping("/{id}")
+    public R<ProtocolInfoVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(protocolInfoService.queryById(id));
+    }
+
+    /**
+     * 新增协议信息
+     */
+    //@SaCheckPermission("product:info:add")
+    @Log(title = "协议信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ProtocolInfoBo bo) {
+        return toAjax(protocolInfoService.insertByBo(bo));
+    }
+
+    /**
+     * 修改协议信息
+     */
+    //@SaCheckPermission("product:info:edit")
+    @Log(title = "协议信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProtocolInfoBo bo) {
+        return toAjax(protocolInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 删除协议信息
+     *
+     * @param ids 主键串
+     */
+    //@SaCheckPermission("product:info:remove")
+    @Log(title = "协议信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(protocolInfoService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 126 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProtocolProductsController.java

@@ -0,0 +1,126 @@
+package org.dromara.product.controller;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.product.domain.ProtocolProducts;
+import org.dromara.product.domain.bo.ProductBaseBo;
+import org.dromara.product.domain.vo.ProductBaseVo;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.product.domain.vo.ProtocolProductsVo;
+import org.dromara.product.domain.bo.ProtocolProductsBo;
+import org.dromara.product.service.IProtocolProductsService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 协议产品关联
+ * 前端访问路由地址为:/product/products
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/products")
+public class ProtocolProductsController extends BaseController {
+
+    private final IProtocolProductsService protocolProductsService;
+
+
+
+    /**
+     * 查询协议产品关联列表
+     */
+    //@SaCheckPermission("product:products:list")
+    @GetMapping("/list")
+    public TableDataInfo<ProductBaseVo> list(ProtocolProductsBo bo, PageQuery pageQuery) {
+        return protocolProductsService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 获取协议中所有的产品id
+     *
+     * @param id 主键
+     */
+    @GetMapping("/getProductIds/{id}")
+    public R<List<Long>> getProductIds(@NotNull(message = "主键不能为空") @PathVariable("id") Long id){
+        List<ProtocolProducts> list = protocolProductsService.list(Wrappers.lambdaQuery(ProtocolProducts.class)
+            .select(ProtocolProducts::getProductId)
+            .eq(ProtocolProducts::getProtocolId, id)
+        );
+        return R.ok(list.stream().map(ProtocolProducts::getProductId).toList());
+    }
+
+    /**
+     * 导出协议产品关联列表
+     */
+    //@SaCheckPermission("product:products:export")
+    @Log(title = "协议产品关联", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ProtocolProductsBo bo, HttpServletResponse response) {
+        List<ProtocolProductsVo> list = protocolProductsService.queryList(bo);
+        ExcelUtil.exportExcel(list, "协议产品关联", ProtocolProductsVo.class, response);
+    }
+
+    /**
+     * 获取协议产品关联详细信息
+     *
+     * @param id 主键
+     */
+    //@SaCheckPermission("product:products:query")
+    @GetMapping("/{id}")
+    public R<ProtocolProductsVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(protocolProductsService.queryById(id));
+    }
+
+    /**
+     * 新增协议产品关联
+     */
+    //@SaCheckPermission("product:products:add")
+    @Log(title = "协议产品关联", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ProtocolProductsBo bo) {
+        return toAjax(protocolProductsService.insertByBo(bo));
+    }
+
+    /**
+     * 修改协议产品关联
+     */
+    //@SaCheckPermission("product:products:edit")
+    @Log(title = "协议产品关联", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProtocolProductsBo bo) {
+        return toAjax(protocolProductsService.updateByBo(bo));
+    }
+
+    /**
+     * 删除协议产品关联
+     *
+     * @param ids 主键串
+     */
+    //@SaCheckPermission("product:products:remove")
+    @Log(title = "协议产品关联", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(protocolProductsService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 63 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/pc/BenefitsProductController.java

@@ -0,0 +1,63 @@
+package org.dromara.product.controller.pc;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.product.domain.bo.ProductGiftCategoryBo;
+import org.dromara.product.domain.vo.ProductGiftCategoryVo;
+import org.dromara.product.service.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ *
+ * 工业商城
+ * @author
+ * @date 2026/2/6 上午11:31
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/benefitsProduct")
+public class BenefitsProductController {
+
+    //商品
+    private final IProductBaseService productBaseService;
+    //商品分类
+    private final IProductCategoryService productCategoryService;
+    //商品品牌
+    private final IProductBrandService productBrandService;
+    //主题页面
+    private final IProductThemeService productThemeService;
+    //产品解决方案
+    private final IProductProgramService productProgramService;
+    //福利分类
+    private final IProductGiftCategoryService productGiftCategoryService;
+    //福利分类下的商品
+    private final IProductGiftCategoryLinkService productGiftCategoryLinkService;
+    //福利楼层广告
+    private final IProductGiftFloorService productGiftFloorService;
+    //福利楼层广告下的商品
+    private final IProductGiftFloorLinkService productGiftFloorLinkService;
+    //福利公告管理
+    private final IProductGiftNoticeService productGiftNoticeService;
+    //推荐商品
+    private final IProductRecommendService productRecommendService;
+    //工业品牌楼层
+    private final IProductIndustrialFloorService productIndustrialFloorService;
+    //分类楼层商品
+    private final IProductDecorationFloorLinkService productDecorationFloorLinkService;
+    //项目案例
+    private final IServiceCaseService serviceCaseService;
+
+    /**
+     * 获取福利分类(福利装修-分类管理)
+     * */
+    @GetMapping("getGiftCategoryList")
+    public R<List<ProductGiftCategoryVo>> getGiftCategoryList() {
+        return R.ok(productGiftCategoryService.queryList(new ProductGiftCategoryBo()));
+    }
+}

+ 12 - 5
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/pc/IndexProductController.java

@@ -133,11 +133,9 @@ public class IndexProductController {
     /**
     /**
      * 查询顶级分类下的的品牌列表
      * 查询顶级分类下的的品牌列表
      * */
      * */
-    @GetMapping("/getBrandPage/{categoryId}")
-    public R<TableDataInfo<ProductBrandVo>> getBrandPage(@PathVariable Long categoryId, PageQuery pageQuery) {
-        ProductBrandBo bo = new ProductBrandBo();
-        bo.setCategoryId(categoryId);
-        return R.ok(productBrandService.getBrandPage(bo,pageQuery));
+    @GetMapping("/getBrandPage")
+    public TableDataInfo<ProductBrandVo> getBrandPage(ProductBrandBo bo, PageQuery pageQuery) {
+        return productBrandService.getBrandPage(bo,pageQuery);
     }
     }
 
 
     /**
     /**
@@ -148,6 +146,15 @@ public class IndexProductController {
         return productBaseService.getCategoryRecommendProductPage(categoryId, pageQuery);
         return productBaseService.getCategoryRecommendProductPage(categoryId, pageQuery);
     }
     }
 
 
+//    /**
+//    * 查询协议供货的商品信息
+//    * */
+//    @GetMapping("/getAgreementSupplyProductList")
+//    public TableDataInfo<PcProductVo> getAgreementSupplyProductList(PageQuery pageQuery) {
+//        return productBaseService.getAgreementSupplyProductList(pageQuery);
+//    }
+
+
 
 
 
 
 
 

+ 119 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/pc/IndustryProductController.java

@@ -0,0 +1,119 @@
+package org.dromara.product.controller.pc;
+
+import cn.hutool.core.lang.tree.Tree;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.product.domain.bo.ProductCategoryBo;
+import org.dromara.product.domain.bo.ProductCategoryRecommendedBo;
+import org.dromara.product.domain.bo.ProductIndustrialFloorBo;
+import org.dromara.product.domain.vo.*;
+import org.dromara.product.service.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ *
+ * 工业商城
+ * @author
+ * @date 2026/2/6 上午11:31
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/industryProduct")
+public class IndustryProductController {
+    //商品
+    private final IProductBaseService productBaseService;
+    //商品分类
+    private final IProductCategoryService productCategoryService;
+    //商品品牌
+    private final IProductBrandService productBrandService;
+    //主题页面
+    private final IProductThemeService productThemeService;
+    //产品解决方案
+    private final IProductProgramService productProgramService;
+    //福利分类
+    private final IProductGiftCategoryService productGiftCategoryService;
+    //福利分类下的商品
+    private final IProductGiftCategoryLinkService productGiftCategoryLinkService;
+    //福利楼层广告
+    private final IProductGiftFloorService productGiftFloorService;
+    //福利楼层广告下的商品
+    private final IProductGiftFloorLinkService productGiftFloorLinkService;
+    //福利公告管理
+    private final IProductGiftNoticeService productGiftNoticeService;
+    //推荐商品
+    private final IProductRecommendService productRecommendService;
+    //工业品牌楼层
+    private final IProductIndustrialFloorService productIndustrialFloorService;
+    //分类楼层商品
+    private final IProductDecorationFloorLinkService productDecorationFloorLinkService;
+    //工业品牌楼层商品
+    private final IProductIndustrialFloorLinkService productIndustrialFloorLinkService;
+    //分类推荐
+    private final IProductCategoryRecommendedService productCategoryRecommendedService;
+    //分类推荐商品
+    private final IProductCategoryRecommendedLinkService productCategoryRecommendedLinkService;
+    //项目案例
+    private final IServiceCaseService serviceCaseService;
+
+    /**
+     * 查询产品分类树
+     * */
+    @GetMapping("getProductCategoryTree")
+    public R<List<Tree<Long>>> getProductCategoryTree() {
+        ProductCategoryBo bo = new ProductCategoryBo();
+        bo.setDataSource("youyi");
+        return R.ok(productCategoryService.selectCategoryTreeList(bo));
+    }
+
+    /**
+    * 轮播展位商品(工业装修-轮播展位商品)
+    * */
+    @GetMapping("getCarouselDisplayProductList")
+    public R<List<PcProductVo>> getCarouselDisplayProductList() {
+        return R.ok(productBaseService.getCarouselDisplayProductList());
+    }
+
+    /*
+    * 获取工业名牌楼层(工业装修-品牌楼层)
+    * */
+    @GetMapping("getIndustrialFloor")
+    public R<List<ProductIndustrialFloorVo>> getIndustrialFloor() {
+        return R.ok(productIndustrialFloorService.queryList(new ProductIndustrialFloorBo()));
+    }
+    /*
+    * 获取工业名牌楼层商品(工业装修-品牌楼层商品)
+    * */
+    @GetMapping("getIndustrialFloorProduct")
+    public R<List<PcProductVo>> getIndustrialFloorProduct(Long floorId) {
+        return R.ok(productBaseService.getIndustrialFloorProduct(floorId));
+    }
+
+    /**
+    * 获取工业品牌楼层品牌(工业装修-品牌楼层品牌)
+    * */
+    @GetMapping("getIndustrialFloorBrand")
+    public R<List<ProductBrandVo>> getIndustrialFloorBrand(Long floorId) {
+        return R.ok(productBrandService.getIndustrialFloorBrand(floorId));
+    }
+
+    /**
+    * 获取推荐的分类(工业装修-分类推荐商品列表)
+    * */
+    @GetMapping("getRecommendedCategory")
+    public R<List<ProductCategoryRecommendedVo>> getRecommendedCategory() {
+        return R.ok(productCategoryRecommendedService.queryList(new ProductCategoryRecommendedBo()));
+    }
+
+    /**
+    * 获取推荐的分类商品(工业装修-分类推荐商品列表)
+    * */
+
+
+
+}

+ 14 - 9
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/pc/MyProductController.java

@@ -20,6 +20,7 @@ import org.dromara.product.service.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -122,9 +123,13 @@ public class MyProductController {
     /**
     /**
     * 取消收藏
     * 取消收藏
     * */
     * */
-    @DeleteMapping("/cancelProductCollect/{collectId}")
-    public R cancelProductCollect(@PathVariable Long collectId) {
-        productCollectService.deleteWithValidByIds(List.of(collectId), false);
+    @DeleteMapping("/cancelProductCollect")
+    public R cancelProductCollect(ProductCollectBo bo) {
+        productCollectService.remove(Wrappers.lambdaQuery(ProductCollect.class)
+            .eq(ProductCollect::getUserId, LoginHelper.getUserId())
+            .eq(ProductCollect::getProductId, bo.getProductId())
+            .eq(ProductCollect::getFavoritesId, bo.getFavoritesId())
+        );
         return R.ok();
         return R.ok();
     }
     }
 
 
@@ -140,7 +145,7 @@ public class MyProductController {
     * 查询商品是否在默认收藏夹收藏
     * 查询商品是否在默认收藏夹收藏
     * */
     * */
     @GetMapping("/isProductInDefaultCollect/{productIds}")
     @GetMapping("/isProductInDefaultCollect/{productIds}")
-    public R isProductInDefaultCollect(@PathVariable List<Long> productIds) {
+    public R isProductInDefaultCollect(@PathVariable Long[] productIds) {
         //查询商品是否在默认收藏夹收藏
         //查询商品是否在默认收藏夹收藏
         ProductFavorites one = productFavoritesService.getOne(Wrappers.lambdaQuery(ProductFavorites.class)
         ProductFavorites one = productFavoritesService.getOne(Wrappers.lambdaQuery(ProductFavorites.class)
             .eq(ProductFavorites::getUserId, LoginHelper.getUserId())
             .eq(ProductFavorites::getUserId, LoginHelper.getUserId())
@@ -175,17 +180,17 @@ public class MyProductController {
     * 删除购物车商品
     * 删除购物车商品
     * */
     * */
     @DeleteMapping("/deleteProductShoppingCart/{ids}")
     @DeleteMapping("/deleteProductShoppingCart/{ids}")
-    public R deleteProductShoppingCart(@PathVariable List<Long> ids) {
-        productShoppingCartService.removeByIds(ids);
+    public R deleteProductShoppingCart(@PathVariable Long[] ids) {
+        productShoppingCartService.removeByIds(Arrays.asList(ids));
         return R.ok();
         return R.ok();
     }
     }
 
 
     /**
     /**
     * 查询购物车的商品
     * 查询购物车的商品
     * */
     * */
-    @GetMapping("/getProductShoppingCartPage")
-    public TableDataInfo<PcProductVo> getProductShoppingCartPage(PageQuery pageQuery) {
-        return productBaseService.getProductShoppingCartPage(LoginHelper.getUserId(),pageQuery);
+    @GetMapping("/getProductShoppingCartPage/{ids}")
+    public TableDataInfo<PcProductVo> getProductShoppingCartPage(@PathVariable Long[] ids, PageQuery pageQuery) {
+        return productBaseService.getProductShoppingCartPage(ids,LoginHelper.getUserId(),pageQuery);
     }
     }
 
 
 
 

+ 129 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProtocolInfo.java

@@ -0,0 +1,129 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 协议信息对象 protocol_info
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("protocol_info")
+public class ProtocolInfo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID,自增
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 协议编号
+     */
+    private String protocolNo;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 客户id
+     */
+    private Long customerId;
+
+    /**
+     * 客户名称
+     */
+    private String customerName;
+
+    /**
+     * 审核时间
+     */
+    private Date reviewTime;
+
+    /**
+     * 审批状态(例如:0-待审批,1-已通过,2-已拒绝)
+     */
+    private Long approvalStatus;
+
+    /**
+     * 协议开始时间
+     */
+    private Date startTime;
+
+    /**
+     * 协议结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 产品数量
+     */
+    private Long productNum;
+
+    /**
+     * 备注信息
+     */
+    private String remark;
+
+    /**
+     * 协议状态(例如:0-草稿,1-生效,2-终止)
+     */
+    private Long protocolStatus;
+
+    /**
+     * 业务员id
+     */
+    private Long salesmanId;
+
+    /**
+     * 公司id
+     */
+    private Long companyId;
+
+    /**
+     * 客服id
+     */
+    private Long serviceId;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 协议文件路径
+     */
+    private String protocolFile;
+
+    /**
+     * 协议文件原始名称
+     */
+    private String fileName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 90 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProtocolProducts.java

@@ -0,0 +1,90 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 协议产品关联对象 protocol_products
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("protocol_products")
+public class ProtocolProducts extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID,自增
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 协议编号
+     */
+    private String protocolNo;
+
+    private Long protocolId;
+    /**
+     * 产品编号
+     */
+    private String productNo;
+
+    /**
+     * 产品Id
+     */
+    //@NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * 协议价格(字符串形式,可能含货币符号或格式化)
+     */
+    private BigDecimal agreementPrice;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 客户ID
+     */
+    private Long customerId;
+
+    /**
+     * 备注信息
+     */
+    private String remark;
+
+    /**
+     * 税率ID或税务编码
+     */
+    private String taxId;
+
+    /**
+     * 类型(例如:1-标准产品,2-定制产品等)
+     */
+    private Long type;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 1 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBaseBo.java

@@ -32,7 +32,7 @@ public class ProductBaseBo extends BaseEntity {
     /**
     /**
     * 多个商品
     * 多个商品
     * */
     * */
-    private String productIds;
+    private String ids;
 
 
     /**
     /**
      * 产品编号
      * 产品编号

+ 4 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBrandBo.java

@@ -145,5 +145,9 @@ public class ProductBrandBo extends BaseEntity {
     * */
     * */
     private Long categoryId;
     private Long categoryId;
 
 
+    /**
+    * 分类名称
+    * */
+    private String categoryName;
 
 
 }
 }

+ 139 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProtocolInfoBo.java

@@ -0,0 +1,139 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProtocolInfo;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 协议信息业务对象 protocol_info
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProtocolInfo.class, reverseConvertGenerate = false)
+public class ProtocolInfoBo extends BaseEntity {
+
+    /**
+     * 主键ID,自增
+     */
+    private Long id;
+
+    /**
+     * 协议编号
+     */
+    //@NotBlank(message = "协议编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String protocolNo;
+
+    /**
+     * 客户编号
+     */
+    //@NotBlank(message = "客户编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String customerNo;
+
+    /**
+     * 客户id
+     */
+    //@NotNull(message = "客户id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long customerId;
+
+    /**
+     * 客户名称
+     */
+    //@NotBlank(message = "客户名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String customerName;
+
+    /**
+     * 审核时间
+     */
+    //@NotNull(message = "审核时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date reviewTime;
+
+    /**
+     * 审批状态(例如:0-待审批,1-已通过,2-已拒绝)
+     */
+    //@NotNull(message = "审批状态(例如:0-待审批,1-已通过,2-已拒绝)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long approvalStatus;
+
+    /**
+     * 协议开始时间
+     */
+    //@NotNull(message = "协议开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date startTime;
+
+    /**
+     * 协议结束时间
+     */
+    //@NotNull(message = "协议结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date endTime;
+
+    /**
+     * 产品数量
+     */
+    //@NotNull(message = "产品数量不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productNum;
+
+    /**
+     * 备注信息
+     */
+    //@NotBlank(message = "备注信息不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+    /**
+     * 协议状态(例如:0-草稿,1-生效,2-终止)
+     */
+    //@NotNull(message = "协议状态(例如:0-草稿,1-生效,2-终止)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long protocolStatus;
+
+    /**
+     * 业务员id
+     */
+    //@NotNull(message = "业务员id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long salesmanId;
+
+    /**
+     * 公司id
+     */
+    //@NotNull(message = "公司id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long companyId;
+
+    /**
+     * 客服id
+     */
+    //@NotNull(message = "客服id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long serviceId;
+
+    /**
+     * 数据来源
+     */
+    //@NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 协议文件路径
+     */
+    //@NotBlank(message = "协议文件路径不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String protocolFile;
+
+    /**
+     * 协议文件原始名称
+     */
+    //@NotBlank(message = "协议文件原始名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String fileName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    //@NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+
+}

+ 112 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProtocolProductsBo.java

@@ -0,0 +1,112 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProtocolProducts;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+/**
+ * 协议产品关联业务对象 protocol_products
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProtocolProducts.class, reverseConvertGenerate = false)
+public class ProtocolProductsBo extends BaseEntity {
+
+    /**
+     * 主键ID,自增
+     */
+    private Long id;
+
+    /**
+     * 协议编号
+     */
+    //@NotBlank(message = "协议编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String protocolNo;
+
+    /**
+     * 协议编号
+     */
+    //@NotBlank(message = "协议编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long protocolId;
+
+    /**
+     * 产品编号
+     */
+    //@NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productNo;
+
+    /**
+     * 产品Id
+     */
+    //@NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+
+    /**
+     * 协议价格(字符串形式,可能含货币符号或格式化)
+     */
+    //@NotNull(message = "协议价格(字符串形式,可能含货币符号或格式化)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal agreementPrice;
+
+    /**
+     * 数据来源
+     */
+    //@NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 客户ID
+     */
+    //@NotNull(message = "客户ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long customerId;
+
+    /**
+     * 备注信息
+     */
+    //@NotBlank(message = "备注信息不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+    /**
+     * 税率ID或税务编码
+     */
+    //@NotBlank(message = "税率ID或税务编码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String taxId;
+
+    /**
+     * 类型(例如:1-标准产品,2-定制产品等)
+     */
+    //@NotNull(message = "类型(例如:1-标准产品,2-定制产品等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long type;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    //@NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+    * 产品名称
+    * */
+    private String productName;
+
+    /**
+    * 商品品牌id
+    * */
+    private Long brandId;
+
+    /**
+    * 商品状态 0-下架 1-上架
+    * */
+    private Long productStatus;
+
+
+}

+ 9 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/PcProductVo.java

@@ -64,5 +64,14 @@ public class PcProductVo {
     * 产品状态 0-下架 1-上架 2 上架中
     * 产品状态 0-下架 1-上架 2 上架中
     * */
     * */
     private String productStatus;
     private String productStatus;
+    /**
+    * 产品库存
+    * */
+    private Long totalInventory;
+
+    /**
+    * 购物车id
+    * */
+    private Long shoppingCartId;
 
 
 }
 }

+ 170 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProtocolInfoVo.java

@@ -0,0 +1,170 @@
+package org.dromara.product.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.product.domain.ProtocolInfo;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 协议信息视图对象 protocol_info
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProtocolInfo.class)
+public class ProtocolInfoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID,自增
+     */
+    @ExcelProperty(value = "主键ID,自增")
+    private Long id;
+
+    /**
+     * 协议编号
+     */
+    @ExcelProperty(value = "协议编号")
+    private String protocolNo;
+
+    /**
+     * 客户编号
+     */
+    @ExcelProperty(value = "客户编号")
+    private String customerNo;
+
+    /**
+     * 客户id
+     */
+    @ExcelProperty(value = "客户id")
+    private Long customerId;
+
+    /**
+     * 客户名称
+     */
+    @ExcelProperty(value = "客户名称")
+    private String customerName;
+
+    /**
+     * 审核时间
+     */
+    @ExcelProperty(value = "审核时间")
+    private Date reviewTime;
+
+    /**
+     * 审批状态(例如:0-待审批,1-已通过,2-已拒绝)
+     */
+    @ExcelProperty(value = "审批状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "例=如:0-待审批,1-已通过,2-已拒绝")
+    private Long approvalStatus;
+
+    /**
+     * 协议开始时间
+     */
+    @ExcelProperty(value = "协议开始时间")
+    private Date startTime;
+
+    /**
+     * 协议结束时间
+     */
+    @ExcelProperty(value = "协议结束时间")
+    private Date endTime;
+
+    /**
+     * 产品数量
+     */
+    @ExcelProperty(value = "产品数量")
+    private Long productNum;
+
+    /**
+     * 备注信息
+     */
+    @ExcelProperty(value = "备注信息")
+    private String remark;
+
+    /**
+     * 协议状态(例如:0-草稿,1-生效,2-终止)
+     */
+    @ExcelProperty(value = "协议状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "例=如:0-草稿,1-生效,2-终止")
+    private Long protocolStatus;
+
+    /**
+     * 业务员id
+     */
+    @ExcelProperty(value = "业务员id")
+    private Long salesmanId;
+
+    /**
+     * 业务员名称
+     */
+    @ExcelProperty(value = "业务员名称")
+    private String salesmanName;
+
+
+    /**
+     * 公司id
+     */
+    @ExcelProperty(value = "公司id")
+    private Long companyId;
+
+    /**
+     * 客服id
+     */
+    @ExcelProperty(value = "客服id")
+    private Long serviceId;
+    /**
+    * 客服名称
+    * */
+    @ExcelProperty(value = "客服名称")
+    private String serviceName;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 协议文件路径
+     */
+    @ExcelProperty(value = "协议文件路径")
+    private String protocolFile;
+
+    /**
+     * 协议文件原始名称
+     */
+    @ExcelProperty(value = "协议文件原始名称")
+    private String fileName;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+
+
+}

+ 102 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProtocolProductsVo.java

@@ -0,0 +1,102 @@
+package org.dromara.product.domain.vo;
+
+import java.math.BigDecimal;
+import org.dromara.product.domain.ProtocolProducts;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 协议产品关联视图对象 protocol_products
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProtocolProducts.class)
+public class ProtocolProductsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID,自增
+     */
+    @ExcelProperty(value = "主键ID,自增")
+    private Long id;
+
+    /**
+     * 协议编号
+     */
+    @ExcelProperty(value = "协议编号")
+    private String protocolNo;
+
+    /**
+     * 产品编号
+     */
+    @ExcelProperty(value = "产品编号")
+    private String productNo;
+
+    /**
+     * 产品Id
+     */
+    //@NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * 协议价格(字符串形式,可能含货币符号或格式化)
+     */
+    @ExcelProperty(value = "协议价格", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "字=符串形式,可能含货币符号或格式化")
+    private BigDecimal agreementPrice;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 客户ID
+     */
+    @ExcelProperty(value = "客户ID")
+    private Long customerId;
+
+    /**
+     * 备注信息
+     */
+    @ExcelProperty(value = "备注信息")
+    private String remark;
+
+    /**
+     * 税率ID或税务编码
+     */
+    @ExcelProperty(value = "税率ID或税务编码")
+    private String taxId;
+
+    /**
+     * 类型(例如:1-标准产品,2-定制产品等)
+     */
+    @ExcelProperty(value = "类型", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "例=如:1-标准产品,2-定制产品等")
+    private Long type;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+
+}

+ 4 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductBaseMapper.java

@@ -99,4 +99,8 @@ public interface ProductBaseMapper extends BaseMapperPlus<ProductBase, ProductBa
      */
      */
     StatusCountVo selectProductStatusCount();
     StatusCountVo selectProductStatusCount();
 
 
+    /**
+    * 根据分类信息获取品牌id
+    * */
+    List<Long> selectBrandIdsByCategory(@Param("categoryId") Long categoryId, @Param("categoryName") String categoryName);
 }
 }

+ 6 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductBrandMapper.java

@@ -1,9 +1,14 @@
 package org.dromara.product.mapper;
 package org.dromara.product.mapper;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
 import org.dromara.product.domain.ProductBrand;
 import org.dromara.product.domain.ProductBrand;
 import org.dromara.product.domain.vo.ProductBrandVo;
 import org.dromara.product.domain.vo.ProductBrandVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
 
+import java.util.List;
+
 /**
 /**
  * 产品品牌信息Mapper接口
  * 产品品牌信息Mapper接口
  *
  *
@@ -12,4 +17,5 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  */
  */
 public interface ProductBrandMapper extends BaseMapperPlus<ProductBrand, ProductBrandVo> {
 public interface ProductBrandMapper extends BaseMapperPlus<ProductBrand, ProductBrandVo> {
 
 
+    List<ProductBrandVo> getBrandPage( @Param("limit")Integer limit, @Param("categoryId") Long categoryId, @Param("categoryName") String categoryName);
 }
 }

+ 15 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProtocolInfoMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProtocolInfo;
+import org.dromara.product.domain.vo.ProtocolInfoVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 协议信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+public interface ProtocolInfoMapper extends BaseMapperPlus<ProtocolInfo, ProtocolInfoVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProtocolProductsMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProtocolProducts;
+import org.dromara.product.domain.vo.ProtocolProductsVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 协议产品关联Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+public interface ProtocolProductsMapper extends BaseMapperPlus<ProtocolProducts, ProtocolProductsVo> {
+
+}

+ 11 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductBaseService.java

@@ -170,5 +170,15 @@ public interface IProductBaseService extends IService<ProductBase>{
     /**
     /**
     * PC端商品购物车
     * PC端商品购物车
     * */
     * */
-    TableDataInfo<PcProductVo> getProductShoppingCartPage(Long userId, PageQuery pageQuery);
+    TableDataInfo<PcProductVo> getProductShoppingCartPage(Long[] ids,Long userId, PageQuery pageQuery);
+
+    /**
+    * PC端轮播图商品列表
+    * */
+    List<PcProductVo> getCarouselDisplayProductList();
+
+    /**
+    * PC端工业品牌楼层商品列表
+    * */
+    List<PcProductVo> getIndustrialFloorProduct(Long floorId);
 }
 }

+ 8 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductBrandService.java

@@ -83,4 +83,12 @@ public interface IProductBrandService extends IService<ProductBrand>{
      * @return
      * @return
      */
      */
     TableDataInfo<ProductBrandVo> getBrandPage(ProductBrandBo bo, PageQuery pageQuery);
     TableDataInfo<ProductBrandVo> getBrandPage(ProductBrandBo bo, PageQuery pageQuery);
+
+    /**
+     * 获取工业品牌楼层品牌
+     *
+     * @param floorId
+     * @return
+     */
+    List<ProductBrandVo> getIndustrialFloorBrand(Long floorId);
 }
 }

+ 70 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProtocolInfoService.java

@@ -0,0 +1,70 @@
+package org.dromara.product.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.product.domain.ProtocolInfo;
+import org.dromara.product.domain.vo.ProtocolInfoVo;
+import org.dromara.product.domain.bo.ProtocolInfoBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 协议信息Service接口
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+public interface IProtocolInfoService extends IService<ProtocolInfo>{
+
+    /**
+     * 查询协议信息
+     *
+     * @param id 主键
+     * @return 协议信息
+     */
+    ProtocolInfoVo queryById(Long id);
+
+    /**
+     * 分页查询协议信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 协议信息分页列表
+     */
+    TableDataInfo<ProtocolInfoVo> queryPageList(ProtocolInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的协议信息列表
+     *
+     * @param bo 查询条件
+     * @return 协议信息列表
+     */
+    List<ProtocolInfoVo> queryList(ProtocolInfoBo bo);
+
+    /**
+     * 新增协议信息
+     *
+     * @param bo 协议信息
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ProtocolInfoBo bo);
+
+    /**
+     * 修改协议信息
+     *
+     * @param bo 协议信息
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ProtocolInfoBo bo);
+
+    /**
+     * 校验并批量删除协议信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 72 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProtocolProductsService.java

@@ -0,0 +1,72 @@
+package org.dromara.product.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.product.domain.ProtocolProducts;
+import org.dromara.product.domain.bo.ProductBaseBo;
+import org.dromara.product.domain.vo.ProductBaseVo;
+import org.dromara.product.domain.vo.ProtocolProductsVo;
+import org.dromara.product.domain.bo.ProtocolProductsBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 协议产品关联Service接口
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+public interface IProtocolProductsService extends IService<ProtocolProducts>{
+
+    /**
+     * 查询协议产品关联
+     *
+     * @param id 主键
+     * @return 协议产品关联
+     */
+    ProtocolProductsVo queryById(Long id);
+
+    /**
+     * 分页查询协议产品关联列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 协议产品关联分页列表
+     */
+    TableDataInfo<ProductBaseVo> queryPageList(ProtocolProductsBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的协议产品关联列表
+     *
+     * @param bo 查询条件
+     * @return 协议产品关联列表
+     */
+    List<ProtocolProductsVo> queryList(ProtocolProductsBo bo);
+
+    /**
+     * 新增协议产品关联
+     *
+     * @param bo 协议产品关联
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ProtocolProductsBo bo);
+
+    /**
+     * 修改协议产品关联
+     *
+     * @param bo 协议产品关联
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ProtocolProductsBo bo);
+
+    /**
+     * 校验并批量删除协议产品关联信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 28 - 5
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java

@@ -345,6 +345,9 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
     @Override
     @Override
     public TableDataInfo<ProductBaseVo> queryPageList(ProductBaseBo bo, PageQuery pageQuery) {
     public TableDataInfo<ProductBaseVo> queryPageList(ProductBaseBo bo, PageQuery pageQuery) {
         QueryWrapper<ProductBase> lqw = Wrappers.query();
         QueryWrapper<ProductBase> lqw = Wrappers.query();
+        if(ObjectUtil.isNotEmpty(bo.getIds())){
+            lqw.in( "b.id", bo.getIds().split(","));
+        }
         lqw.ge(ObjectUtil.isNotEmpty(pageQuery.getFirstSeenId()) && pageQuery.getWay() == 0,"b.id", pageQuery.getFirstSeenId());
         lqw.ge(ObjectUtil.isNotEmpty(pageQuery.getFirstSeenId()) && pageQuery.getWay() == 0,"b.id", pageQuery.getFirstSeenId());
         lqw.gt(ObjectUtil.isNotEmpty(pageQuery.getLastSeenId()) && pageQuery.getWay() == 1,"b.id", pageQuery.getLastSeenId());
         lqw.gt(ObjectUtil.isNotEmpty(pageQuery.getLastSeenId()) && pageQuery.getWay() == 1,"b.id", pageQuery.getLastSeenId());
         lqw.eq(ObjectUtil.isNotEmpty(bo.getBottomCategoryId()),"b.bottom_category_id", bo.getBottomCategoryId());
         lqw.eq(ObjectUtil.isNotEmpty(bo.getBottomCategoryId()),"b.bottom_category_id", bo.getBottomCategoryId());
@@ -1234,13 +1237,13 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
             String[] sortFields = bo.getSortField().split(",");
             String[] sortFields = bo.getSortField().split(",");
             String[] sortOrders = bo.getSortOrder().split(",");
             String[] sortOrders = bo.getSortOrder().split(",");
             for (int i = 0; i < sortFields.length; i++) {
             for (int i = 0; i < sortFields.length; i++) {
-                switch (bo.getPriceRange()) {
+                switch (sortFields[i]) {
                     case "1":
                     case "1":
-                        lqw.orderBy( true, sortOrders[i].equals("asc"),"b.id");
+                        lqw.orderBy( true, sortOrders[i].equals("Asc"),"b.id");
                     case "2":
                     case "2":
-                        lqw.orderBy( true, sortOrders[i].equals("asc"),"p.total_inventory");
+                        lqw.orderBy( true, sortOrders[i].equals("Asc"),"p.total_inventory");
                     case "3":
                     case "3":
-                        lqw.orderBy( true, sortOrders[i].equals("asc"),"p.market_price");
+                        lqw.orderBy( true, sortOrders[i].equals("Asc"),"p.market_price");
                 }
                 }
             }
             }
         }
         }
@@ -1369,9 +1372,10 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
      * @param pageQuery
      * @param pageQuery
      */
      */
     @Override
     @Override
-    public TableDataInfo<PcProductVo> getProductShoppingCartPage(Long userId, PageQuery pageQuery) {
+    public TableDataInfo<PcProductVo> getProductShoppingCartPage(Long[] ids,Long userId, PageQuery pageQuery) {
         Page<ProductShoppingCart> productShoppingCartPage = productShoppingCartMapper.selectPage(pageQuery.build(), Wrappers.lambdaQuery(ProductShoppingCart.class)
         Page<ProductShoppingCart> productShoppingCartPage = productShoppingCartMapper.selectPage(pageQuery.build(), Wrappers.lambdaQuery(ProductShoppingCart.class)
             .eq(ProductShoppingCart::getUserId, userId)
             .eq(ProductShoppingCart::getUserId, userId)
+            .in(ids != null && ids.length > 0, ProductShoppingCart::getId, ids)
         );
         );
         if (CollUtil.isNotEmpty(productShoppingCartPage.getRecords())) {
         if (CollUtil.isNotEmpty(productShoppingCartPage.getRecords())) {
             List<PcProductVo> productVos = new ArrayList<>();
             List<PcProductVo> productVos = new ArrayList<>();
@@ -1383,6 +1387,7 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
                 if (CollUtil.isNotEmpty(productBaseVos)) {
                 if (CollUtil.isNotEmpty(productBaseVos)) {
                     BeanUtil.copyProperties(productBaseVos.get(0), productVo);
                     BeanUtil.copyProperties(productBaseVos.get(0), productVo);
                     productVo.setProductNum(productShoppingCart.getProductNum());
                     productVo.setProductNum(productShoppingCart.getProductNum());
+                    productVo.setShoppingCartId(productShoppingCart.getId());
                     productVos.add(productVo);
                     productVos.add(productVo);
                 }
                 }
             }
             }
@@ -1393,5 +1398,23 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
 
 
         return TableDataInfo.build();
         return TableDataInfo.build();
     }
     }
+
+    /**
+     * PC端轮播图商品列表
+     */
+    @Override
+    public List<PcProductVo> getCarouselDisplayProductList() {
+        return List.of();
+    }
+
+    /**
+     * PC端工业品牌楼层商品列表
+     *
+     * @param floorId
+     */
+    @Override
+    public List<PcProductVo> getIndustrialFloorProduct(Long floorId) {
+        return List.of();
+    }
 }
 }
 
 

+ 16 - 8
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBrandServiceImpl.java

@@ -21,6 +21,7 @@ import org.dromara.product.domain.vo.PcProductVo;
 import org.dromara.product.domain.vo.ProductBaseVo;
 import org.dromara.product.domain.vo.ProductBaseVo;
 import org.dromara.product.domain.vo.ProductRecommendLinkVo;
 import org.dromara.product.domain.vo.ProductRecommendLinkVo;
 import org.dromara.product.esmapper.ProductBrandEsMapper;
 import org.dromara.product.esmapper.ProductBrandEsMapper;
+import org.dromara.product.mapper.ProductBaseMapper;
 import org.dromara.product.mapper.ProductRecommendLinkMapper;
 import org.dromara.product.mapper.ProductRecommendLinkMapper;
 import org.dromara.product.service.IProductRecommendLinkService;
 import org.dromara.product.service.IProductRecommendLinkService;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationArguments;
@@ -36,6 +37,7 @@ import org.springframework.stereotype.Component;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Collection;
 import java.util.Collection;
+import java.util.Objects;
 
 
 /**
 /**
  * 产品品牌信息Service业务层处理
  * 产品品牌信息Service业务层处理
@@ -54,6 +56,8 @@ public class ProductBrandServiceImpl  extends ServiceImpl<ProductBrandMapper, Pr
 
 
     private final ProductRecommendLinkMapper productRecommendLinkMapper;
     private final ProductRecommendLinkMapper productRecommendLinkMapper;
 
 
+    private final ProductBaseMapper productBaseMapper;
+
     @Override
     @Override
     public void run(ApplicationArguments args) throws Exception {
     public void run(ApplicationArguments args) throws Exception {
         // 检查索引是否存在,不存在则创建
         // 检查索引是否存在,不存在则创建
@@ -245,14 +249,18 @@ public class ProductBrandServiceImpl  extends ServiceImpl<ProductBrandMapper, Pr
      */
      */
     @Override
     @Override
     public TableDataInfo<ProductBrandVo> getBrandPage(ProductBrandBo bo, PageQuery pageQuery) {
     public TableDataInfo<ProductBrandVo> getBrandPage(ProductBrandBo bo, PageQuery pageQuery) {
-        Page<ProductBrandVo> productBrandVoIPage = baseMapper.selectVoPage(pageQuery.build(), Wrappers.lambdaQuery(ProductBrand.class)
-                .eq(ProductBrand::getIsShow, 1)
-                .inSql(ProductBrand::getId,
-                "SELECT" +
-                    "product.brand_id " +
-                    "FROM product_base product " +
-                    "INNER JOIN product_category category ON product.top_category_id = category.id " +
-                    "WHERE category.id=  " + bo.getCategoryId()));
+        List<ProductBrandVo> productBrandVoIPage = baseMapper.getBrandPage(pageQuery.getPageSize(),bo.getCategoryId(), bo.getCategoryName());
         return TableDataInfo.build(productBrandVoIPage);
         return TableDataInfo.build(productBrandVoIPage);
     }
     }
+
+    /**
+     * 获取工业品牌楼层品牌
+     *
+     * @param floorId
+     * @return
+     */
+    @Override
+    public List<ProductBrandVo> getIndustrialFloorBrand(Long floorId) {
+        return List.of();
+    }
 }
 }

+ 162 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProtocolInfoServiceImpl.java

@@ -0,0 +1,162 @@
+package org.dromara.product.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.system.api.RemoteComStaffService;
+import org.springframework.stereotype.Service;
+import org.dromara.product.domain.bo.ProtocolInfoBo;
+import org.dromara.product.domain.vo.ProtocolInfoVo;
+import org.dromara.product.domain.ProtocolInfo;
+import org.dromara.product.mapper.ProtocolInfoMapper;
+import org.dromara.product.service.IProtocolInfoService;
+
+import java.util.*;
+
+/**
+ * 协议信息Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ProtocolInfoServiceImpl  extends ServiceImpl<ProtocolInfoMapper, ProtocolInfo> implements IProtocolInfoService {
+
+    private final ProtocolInfoMapper baseMapper;
+
+    @DubboReference
+    private RemoteComStaffService remoteComStaffService;
+
+    /**
+     * 查询协议信息
+     *
+     * @param id 主键
+     * @return 协议信息
+     */
+    @Override
+    public ProtocolInfoVo queryById(Long id){
+        ProtocolInfoVo item = baseMapper.selectVoById(id);
+        Map<Long, String> staffMap = remoteComStaffService.selectStaffNameByIds(Set.of(item.getSalesmanId(), item.getServiceId()));
+        item.setSalesmanName(staffMap.get(item.getSalesmanId()));
+        item.setServiceName(staffMap.get(item.getServiceId()));
+        return item;
+    }
+
+    /**
+     * 分页查询协议信息列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 协议信息分页列表
+     */
+    @Override
+    public TableDataInfo<ProtocolInfoVo> queryPageList(ProtocolInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ProtocolInfo> lqw = buildQueryWrapper(bo);
+        Page<ProtocolInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        result.getRecords().forEach(item -> {
+            Map<Long, String> staffMap = remoteComStaffService.selectStaffNameByIds(Set.of(item.getSalesmanId(), item.getServiceId()));
+            item.setSalesmanName(staffMap.get(item.getSalesmanId()));
+            item.setServiceName(staffMap.get(item.getServiceId()));
+        });
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的协议信息列表
+     *
+     * @param bo 查询条件
+     * @return 协议信息列表
+     */
+    @Override
+    public List<ProtocolInfoVo> queryList(ProtocolInfoBo bo) {
+        LambdaQueryWrapper<ProtocolInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ProtocolInfo> buildQueryWrapper(ProtocolInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ProtocolInfo> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ProtocolInfo::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getProtocolNo()), ProtocolInfo::getProtocolNo, bo.getProtocolNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getCustomerNo()), ProtocolInfo::getCustomerNo, bo.getCustomerNo());
+        lqw.eq(bo.getCustomerId() != null, ProtocolInfo::getCustomerId, bo.getCustomerId());
+        lqw.like(StringUtils.isNotBlank(bo.getCustomerName()), ProtocolInfo::getCustomerName, bo.getCustomerName());
+        lqw.eq(bo.getReviewTime() != null, ProtocolInfo::getReviewTime, bo.getReviewTime());
+        lqw.eq(bo.getApprovalStatus() != null, ProtocolInfo::getApprovalStatus, bo.getApprovalStatus());
+        lqw.eq(bo.getStartTime() != null, ProtocolInfo::getStartTime, bo.getStartTime());
+        lqw.eq(bo.getEndTime() != null, ProtocolInfo::getEndTime, bo.getEndTime());
+        lqw.eq(bo.getProductNum() != null, ProtocolInfo::getProductNum, bo.getProductNum());
+        lqw.eq(bo.getProtocolStatus() != null, ProtocolInfo::getProtocolStatus, bo.getProtocolStatus());
+        lqw.eq(bo.getSalesmanId() != null, ProtocolInfo::getSalesmanId, bo.getSalesmanId());
+        lqw.eq(bo.getCompanyId() != null, ProtocolInfo::getCompanyId, bo.getCompanyId());
+        lqw.eq(bo.getServiceId() != null, ProtocolInfo::getServiceId, bo.getServiceId());
+        lqw.eq(StringUtils.isNotBlank(bo.getDataSource()), ProtocolInfo::getDataSource, bo.getDataSource());
+        lqw.eq(StringUtils.isNotBlank(bo.getProtocolFile()), ProtocolInfo::getProtocolFile, bo.getProtocolFile());
+        lqw.like(StringUtils.isNotBlank(bo.getFileName()), ProtocolInfo::getFileName, bo.getFileName());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ProtocolInfo::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProtocolInfo::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增协议信息
+     *
+     * @param bo 协议信息
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ProtocolInfoBo bo) {
+        ProtocolInfo add = MapstructUtils.convert(bo, ProtocolInfo.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改协议信息
+     *
+     * @param bo 协议信息
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ProtocolInfoBo bo) {
+        ProtocolInfo update = MapstructUtils.convert(bo, ProtocolInfo.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ProtocolInfo entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除协议信息信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 164 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProtocolProductsServiceImpl.java

@@ -0,0 +1,164 @@
+package org.dromara.product.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.product.domain.ProductBase;
+import org.dromara.product.domain.bo.ProductBaseBo;
+import org.dromara.product.domain.vo.ProductBaseVo;
+import org.dromara.product.mapper.ProductBaseMapper;
+import org.springframework.stereotype.Service;
+import org.dromara.product.domain.bo.ProtocolProductsBo;
+import org.dromara.product.domain.vo.ProtocolProductsVo;
+import org.dromara.product.domain.ProtocolProducts;
+import org.dromara.product.mapper.ProtocolProductsMapper;
+import org.dromara.product.service.IProtocolProductsService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 协议产品关联Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ProtocolProductsServiceImpl  extends ServiceImpl<ProtocolProductsMapper, ProtocolProducts> implements IProtocolProductsService {
+
+    private final ProtocolProductsMapper baseMapper;
+
+    private final ProductBaseMapper productBaseMapper;
+
+    /**
+     * 查询协议产品关联
+     *
+     * @param id 主键
+     * @return 协议产品关联
+     */
+    @Override
+    public ProtocolProductsVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询协议产品关联列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 协议产品关联分页列表
+     */
+    @Override
+    public TableDataInfo<ProductBaseVo> queryPageList(ProtocolProductsBo bo, PageQuery pageQuery) {
+        //先查询协议中的商品id
+        List<ProtocolProducts> protocolProducts = baseMapper.selectList(Wrappers.lambdaQuery(ProtocolProducts.class)
+            .eq(ProtocolProducts::getProtocolId, bo.getProtocolId())
+        );
+        if (protocolProducts.isEmpty()) {
+            return TableDataInfo.build();
+        }
+        List<Long> productIds = protocolProducts.stream().map(ProtocolProducts::getProductId).distinct().toList();
+        QueryWrapper<ProductBase> lqw = Wrappers.query();
+        lqw.in("b.id", productIds);
+        lqw.eq(ObjectUtil.isNotEmpty(bo.getProductName()),"b.item_name", bo.getProductName());
+        lqw.eq(ObjectUtil.isNotEmpty(bo.getBrandId()),"b.brand_id", bo.getBrandId());
+        lqw.eq(ObjectUtil.isNotEmpty(bo.getProductStatus()),"b.product_status", bo.getProductStatus());
+        lqw.orderByAsc("b.id");
+        List<ProductBaseVo> result = productBaseMapper.selectAllList(lqw);
+        TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(result);
+        tableDataInfo.setTotal(productIds.size());
+        return tableDataInfo;
+    }
+
+    /**
+     * 查询符合条件的协议产品关联列表
+     *
+     * @param bo 查询条件
+     * @return 协议产品关联列表
+     */
+    @Override
+    public List<ProtocolProductsVo> queryList(ProtocolProductsBo bo) {
+        LambdaQueryWrapper<ProtocolProducts> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ProtocolProducts> buildQueryWrapper(ProtocolProductsBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ProtocolProducts> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ProtocolProducts::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getProtocolNo()), ProtocolProducts::getProtocolNo, bo.getProtocolNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getProductNo()), ProtocolProducts::getProductNo, bo.getProductNo());
+        lqw.eq(bo.getAgreementPrice() != null, ProtocolProducts::getAgreementPrice, bo.getAgreementPrice());
+        lqw.eq(StringUtils.isNotBlank(bo.getDataSource()), ProtocolProducts::getDataSource, bo.getDataSource());
+        lqw.eq(bo.getCustomerId() != null, ProtocolProducts::getCustomerId, bo.getCustomerId());
+        lqw.eq(StringUtils.isNotBlank(bo.getTaxId()), ProtocolProducts::getTaxId, bo.getTaxId());
+        lqw.eq(bo.getType() != null, ProtocolProducts::getType, bo.getType());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ProtocolProducts::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProtocolProducts::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增协议产品关联
+     *
+     * @param bo 协议产品关联
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ProtocolProductsBo bo) {
+        ProtocolProducts add = MapstructUtils.convert(bo, ProtocolProducts.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改协议产品关联
+     *
+     * @param bo 协议产品关联
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ProtocolProductsBo bo) {
+        ProtocolProducts update = MapstructUtils.convert(bo, ProtocolProducts.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ProtocolProducts entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除协议产品关联信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 18 - 2
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBaseMapper.xml

@@ -67,8 +67,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND b.product_status = #{bo.productStatus}
                 AND b.product_status = #{bo.productStatus}
             </if>
             </if>
         </where>
         </where>
-        GROUP BY b.id, b.product_no, b.item_name, b.product_image, b.is_self, 
-                 b.product_review_status, b.product_status, b.brand_id, 
+        GROUP BY b.id, b.product_no, b.item_name, b.product_image, b.is_self,
+                 b.product_review_status, b.product_status, b.brand_id,
                  b.top_category_id, b.medium_category_id, b.bottom_category_id, b.remark,
                  b.top_category_id, b.medium_category_id, b.bottom_category_id, b.remark,
                  p.market_price, p.member_price, p.min_selling_price, p.purchasing_price,
                  p.market_price, p.member_price, p.min_selling_price, p.purchasing_price,
                  p.max_purchase_price, p.total_inventory, p.now_inventory, p.virtual_inventory,
                  p.max_purchase_price, p.total_inventory, p.now_inventory, p.virtual_inventory,
@@ -329,5 +329,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         FROM product_base
         FROM product_base
         WHERE del_flag = '0'
         WHERE del_flag = '0'
     </select>
     </select>
+    <select id="selectBrandIdsByCategory" resultType="java.lang.Long">
+        SELECT
+            product.brand_id
+        FROM product_base product
+        INNER JOIN product_category category ON product.top_category_id = category.id
+        <where>
+            <if test="categoryId != null">
+                AND category.id = #{categoryId}
+            </if>
+            <if test="categoryName != null and categoryName !=''">
+                AND  category.category_Name LIKE CONCAT('%', #{categoryName}, '%')
+            </if>
+        </where>
+
+    </select>
+
 
 
 </mapper>
 </mapper>

+ 16 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBrandMapper.xml

@@ -4,4 +4,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.dromara.product.mapper.ProductBrandMapper">
 <mapper namespace="org.dromara.product.mapper.ProductBrandMapper">
 
 
+	<select id="getBrandPage" resultType="org.dromara.product.domain.vo.ProductBrandVo">
+        SELECT DISTINCT brand.*  -- 加 DISTINCT 避免重复
+        FROM product_category category
+        INNER JOIN product_base product ON product.top_category_id = category.id
+        INNER JOIN product_brand brand ON brand.id = product.brand_id
+        WHERE brand.is_show = 1
+        <where>
+            <if test="categoryId != null">
+                AND category.id = #{categoryId}
+            </if>
+            <if test="categoryName != null and categoryName !=''">
+                AND  category.category_Name LIKE CONCAT('%', #{categoryName}, '%')
+            </if>
+        </where>
+        limit #{limit}
+    </select>
 </mapper>
 </mapper>

+ 2 - 1
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductCategoryRecommendedLinkMapper.xml

@@ -16,9 +16,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             l.modify,
             l.modify,
             p.item_name,
             p.item_name,
             p.product_image,
             p.product_image,
-            p.min_selling_price
+            i.min_selling_price
         FROM product_category_recommended_link l
         FROM product_category_recommended_link l
         LEFT JOIN product_base p ON l.product_id = p.id
         LEFT JOIN product_base p ON l.product_id = p.id
+        LEFT JOIN product_price_inventory i ON l.product_id = i.product_id
         <where>
         <where>
             <if test="categoryId != null">
             <if test="categoryId != null">
                 AND l.category_id = #{categoryId}
                 AND l.category_id = #{categoryId}

+ 77 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/BenefitsSystemController.java

@@ -0,0 +1,77 @@
+package org.dromara.system.controller.pc;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.system.domain.SysAdContent;
+import org.dromara.system.service.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 福利商城
+ * @author
+ * @date 2026/1/29 下午3:31
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/benefitsSystem")
+public class BenefitsSystemController {
+
+    //平台公告
+    private final ISysAnnouncementService sysAnnouncementService;
+    //自定义海报
+    private final ISysCustomPosterService sysCustomPosterService;
+    //轮播广告
+    private final ISysAdContentService sysAdContentService;
+    //楼层标题配置
+    private final ISysFloorTitleService sysFloorTitleService;
+    //楼层广告管理
+    private final ISysFloorAdvertManageService sysFloorAdvertManageService;
+    //分类楼层
+    private final ISysFloorService sysFloorService;
+    //分类楼层详情
+    private final ISysFloorAdvertiseService sysFloorAdvertiseService;
+    //分类楼层标签
+    private final ISysFloorLabelService sysFloorLabelService;
+
+    /**
+     * 轮播广告(福利装修-轮播广告)
+     */
+    @GetMapping("/getHomeAdList")
+    public R<List<SysAdContent>> getHomeAdList() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "gift_banner")
+            .eq(SysAdContent::getStatus, 1)
+        );
+        return R.ok(list);
+    }
+
+    /**
+    * 标题广告(福利装修-标题广告)
+    * */
+    @GetMapping("/getTitleAdList")
+    public R<List<SysAdContent>> getTitleAdList() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "gift_title")
+            .eq(SysAdContent::getStatus, 1)
+        );
+        return R.ok(list);
+    }
+    /**
+     * 图标广告(福利装修-图标广告)
+     */
+    @GetMapping("/getIconAdList")
+    public R<List<SysAdContent>> getIconAdList() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "gift_icon")
+            .eq(SysAdContent::getStatus, 1)
+        );
+        return R.ok(list);
+    }
+}

+ 138 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/IndustrySystemController.java

@@ -0,0 +1,138 @@
+package org.dromara.system.controller.pc;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.system.domain.SysAdContent;
+import org.dromara.system.domain.bo.SysIndustrialHomeTitleBo;
+import org.dromara.system.domain.vo.SysIndustrialHomeTitleVo;
+import org.dromara.system.service.*;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 首页
+ *
+ * @author
+ * @date 2026/1/29 下午3:31
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/industrySystem")
+public class IndustrySystemController {
+
+    //平台公告
+    private final ISysAnnouncementService sysAnnouncementService;
+    //自定义海报
+    private final ISysCustomPosterService sysCustomPosterService;
+    //轮播广告
+    private final ISysAdContentService sysAdContentService;
+    //楼层标题配置
+    private final ISysFloorTitleService sysFloorTitleService;
+    //楼层广告管理
+    private final ISysFloorAdvertManageService sysFloorAdvertManageService;
+    //分类楼层
+    private final ISysFloorService sysFloorService;
+    //分类楼层详情
+    private final ISysFloorAdvertiseService sysFloorAdvertiseService;
+    //分类楼层标签
+    private final ISysFloorLabelService sysFloorLabelService;
+    //首页导航信息
+    private final ISysIndustrialHomeTitleService sysIndustrialHomeTitleService;
+
+
+
+    /**
+     * 轮播广告(工业装修-轮播广告)
+     */
+    @GetMapping("/getHomeAdList")
+    public R<List<SysAdContent>> getHomeAdList() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "industrial_banner")
+            .eq(SysAdContent::getStatus, 1)
+        );
+        return R.ok(list);
+    }
+
+    /**
+    * 商业标签(工业装修-商业标签)
+    * */
+    @GetMapping("/getBusinessLabelList")
+    public R<List<SysAdContent>> getBusinessLabelList() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "industrial_tag")
+            .eq(SysAdContent::getStatus, 1)
+        );
+        return R.ok(list);
+    }
+
+
+    /**
+     * 首页横幅广告(工业装修-楼层广告-首页横幅广告)
+     * */
+    @GetMapping ("/getHomeBannerAd")
+    public R<List<SysAdContent>> getHomeBannerAd() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "industrial_ad_triple")
+        );
+        return R.ok(list);
+    }
+
+    /**
+     * 首页图标广告(工业装修-楼层广告-首页图标广告)
+     * */
+    @GetMapping("/getHomeIconAd")
+    public R<List<SysAdContent>> getHomeIconAd() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "industrial_ad_icon")
+        );
+        return R.ok(list);
+    }
+    /**
+     * 获取首页logo(工业装修-楼层广告-获取首页logo)
+     * */
+    @GetMapping("/getHomeLogo")
+    public R<List<SysAdContent>> getHomeLogo() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "industrial_ad_logo")
+        );
+        return R.ok(list);
+    }
+    /**
+     * 获取首页联系电话(工业装修-楼层广告-获取首页联系电话)
+     * */
+    @GetMapping("/getHomePhone")
+    public R<List<SysAdContent>> getHomePhone() {
+        List<SysAdContent> list = sysAdContentService.list(Wrappers.<SysAdContent>lambdaQuery(SysAdContent.class)
+            .eq(SysAdContent::getAdType, "industrial_ad_contact")
+        );
+        return R.ok(list);
+    }
+    /**
+     * 获取首页导航信息(工业装修-楼层广告-获取首页导航信息)
+     * */
+    @GetMapping("/getHomeTitle")
+    public R<List<SysIndustrialHomeTitleVo>> getHomeTitle() {
+        SysIndustrialHomeTitleBo sysIndustrialHomeTitleBo = new SysIndustrialHomeTitleBo();
+        sysIndustrialHomeTitleBo.setType(1L);
+        return R.ok(sysIndustrialHomeTitleService.queryList(sysIndustrialHomeTitleBo));
+    }
+
+    /**
+    * 获取搜索导航信息列表
+    * */
+    @GetMapping("/getSearchTitle")
+    public R<List<SysIndustrialHomeTitleVo>> getSearchTitle() {
+        SysIndustrialHomeTitleBo sysIndustrialHomeTitleBo = new SysIndustrialHomeTitleBo();
+        sysIndustrialHomeTitleBo.setType(0L);
+        return R.ok(sysIndustrialHomeTitleService.queryList(sysIndustrialHomeTitleBo));
+    }
+
+
+
+}