Explorar o código

feat(product): 实现批量添加商品到商品池功能

- 新增 BatchAddProductBo 业务对象,支持商品池 ID 和商品列表的批量输入
- 在 IProductPoolLinkService 接口新增 batchAddProducts 方法,用于处理批量添加逻辑
- 优化 ProductBaseVo 查询逻辑,整合扩展信息、价格库存、属性及定制信息
- 移除部分字段校验注解,调整 ProductBaseBo、ProductAssociateBo 等 BO 类字段约束
- 更新权限控制注解,移除部分控制器中的 SaCheckPermission 注解
- 调整实体继承关系,FileCategory 与 FileInfo 继承自 TenantEntityWithoutPlatformCode
- 添加 pom.xml 新 profile 配置 xiaolu 环境相关参数
- 在 PlatformDataScopeInterceptor 与 PlatformTenantLineHandler 中忽略 sys_file_category 与 sys_file_info 表的租户过滤
肖路 hai 3 meses
pai
achega
b222d6e63a
Modificáronse 62 ficheiros con 942 adicións e 494 borrados
  1. 13 0
      pom.xml
  2. 2 0
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
  3. 2 0
      ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlatformTenantLineHandler.java
  4. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductAfterSalesController.java
  5. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductAssociateController.java
  6. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductAttributesController.java
  7. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBaseController.java
  8. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBlacklistController.java
  9. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBrandController.java
  10. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductCategoryController.java
  11. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductClassificationController.java
  12. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductCustomizationController.java
  13. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductEnsureController.java
  14. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductLableController.java
  15. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductPoolController.java
  16. 22 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductPoolLinkController.java
  17. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductProgramController.java
  18. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductProgramLinkController.java
  19. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductRecommendController.java
  20. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductRecommendLinkController.java
  21. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductSpecsController.java
  22. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductTaxrateController.java
  23. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductUnitController.java
  24. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductVolumeUnitController.java
  25. 7 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductWeightUnitController.java
  26. 6 11
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductPoolLink.java
  27. 56 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/BatchAddProductBo.java
  28. 3 3
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductAfterSalesBo.java
  29. 4 4
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductAssociateBo.java
  30. 6 6
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductAttributesBo.java
  31. 6 36
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBaseBo.java
  32. 3 3
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBlacklistBo.java
  33. 16 16
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBrandBo.java
  34. 21 21
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductCategoryBo.java
  35. 4 4
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductClassificationBo.java
  36. 9 9
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductCustomizationBo.java
  37. 3 3
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductEnsureBo.java
  38. 38 38
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductExtendBo.java
  39. 3 3
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductLableBo.java
  40. 2 2
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPoolBo.java
  41. 40 11
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPoolLinkBo.java
  42. 8 8
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPriceInventoryBo.java
  43. 4 4
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductProgramBo.java
  44. 3 3
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductProgramLinkBo.java
  45. 1 1
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductRecommendBo.java
  46. 3 3
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductRecommendLinkBo.java
  47. 3 3
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductSpecsBo.java
  48. 6 6
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductTaxrateBo.java
  49. 5 5
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductUnitBo.java
  50. 3 3
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductVolumeUnitBo.java
  51. 3 3
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductWeightUnitBo.java
  52. 31 54
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseVo.java
  53. 100 10
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductPoolLinkVo.java
  54. 17 1
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductPoolLinkMapper.java
  55. 1 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductCategoryService.java
  56. 21 14
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductPoolLinkService.java
  57. 84 2
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java
  58. 1 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductCategoryServiceImpl.java
  59. 73 48
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductPoolLinkServiceImpl.java
  60. 165 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductPoolLinkMapper.xml
  61. 2 1
      ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/FileCategory.java
  62. 2 1
      ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/FileInfo.java

+ 13 - 0
pom.xml

@@ -91,6 +91,19 @@
                 <nacos.password>nacos</nacos.password>
                 <logstash.address>127.0.0.1:4560</logstash.address>
             </properties>
+        </profile>
+        <profile>
+            <id>xiaolu</id>
+            <properties>
+                <!-- 环境标识,需要与配置文件的名称相对应 -->
+                <profiles.active>9e017a3a-a9c0-4a4a-9581-7c8f38e42131</profiles.active>
+                <nacos.server>127.0.0.1:8848</nacos.server>
+                <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
+                <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
+                <nacos.username>nacos</nacos.username>
+                <nacos.password>nacos</nacos.password>
+                <logstash.address>127.0.0.1:4560</logstash.address>
+            </properties>
             <activation>
                 <!-- 默认环境 -->
                 <activeByDefault>true</activeByDefault>

+ 2 - 0
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java

@@ -45,6 +45,8 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "sys_dict_type",
         "sys_oss",
         "sys_oss_config",
+        "sys_file_category",
+        "sys_file_info",
         "qrtz_"
         // 注意:前缀匹配需特殊处理(如 qrtz_),见 isIgnoreTable 方法
     ));

+ 2 - 0
ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/handle/PlatformTenantLineHandler.java

@@ -34,6 +34,8 @@ public class PlatformTenantLineHandler implements TenantLineHandler {
         "sys_oss_config",
         "gen_table",
         "gen_table_column",
+        "sys_file_category",
+        "sys_file_info",
         "qrtz_"
         // 注意:前缀匹配(如 qrtz_)在 ignoreTable 中单独处理
     ));

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductAfterSalesController.java

@@ -40,7 +40,7 @@ public class ProductAfterSalesController extends BaseController {
     /**
      * 查询产品售后服务项列表
      */
-    @SaCheckPermission("product:afterSales:list")
+    //@SaCheckPermission("product:afterSales:list")
     @GetMapping("/list")
     public TableDataInfo<ProductAfterSalesVo> list(ProductAfterSalesBo bo, PageQuery pageQuery) {
         return productAfterSalesService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductAfterSalesController extends BaseController {
     /**
      * 导出产品售后服务项列表
      */
-    @SaCheckPermission("product:afterSales:export")
+    //@SaCheckPermission("product:afterSales:export")
     @Log(title = "产品售后服务项", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductAfterSalesBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductAfterSalesController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:afterSales:query")
+    //@SaCheckPermission("product:afterSales:query")
     @GetMapping("/{id}")
-    public R<ProductAfterSalesVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductAfterSalesVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productAfterSalesService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductAfterSalesController extends BaseController {
     /**
      * 新增产品售后服务项
      */
-    @SaCheckPermission("product:afterSales:add")
+    //@SaCheckPermission("product:afterSales:add")
     @Log(title = "产品售后服务项", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductAfterSalesController extends BaseController {
     /**
      * 修改产品售后服务项
      */
-    @SaCheckPermission("product:afterSales:edit")
+    //@SaCheckPermission("product:afterSales:edit")
     @Log(title = "产品售后服务项", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductAfterSalesController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:afterSales:remove")
+    //@SaCheckPermission("product:afterSales:remove")
     @Log(title = "产品售后服务项", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductAssociateController.java

@@ -40,7 +40,7 @@ public class ProductAssociateController extends BaseController {
     /**
      * 查询产品关联列表
      */
-    @SaCheckPermission("product:associate:list")
+    //@SaCheckPermission("product:associate:list")
     @GetMapping("/list")
     public TableDataInfo<ProductAssociateVo> list(ProductAssociateBo bo, PageQuery pageQuery) {
         return productAssociateService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductAssociateController extends BaseController {
     /**
      * 导出产品关联列表
      */
-    @SaCheckPermission("product:associate:export")
+    //@SaCheckPermission("product:associate:export")
     @Log(title = "产品关联", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductAssociateBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductAssociateController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:associate:query")
+    //@SaCheckPermission("product:associate:query")
     @GetMapping("/{id}")
-    public R<ProductAssociateVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductAssociateVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productAssociateService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductAssociateController extends BaseController {
     /**
      * 新增产品关联
      */
-    @SaCheckPermission("product:associate:add")
+    //@SaCheckPermission("product:associate:add")
     @Log(title = "产品关联", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductAssociateController extends BaseController {
     /**
      * 修改产品关联
      */
-    @SaCheckPermission("product:associate:edit")
+    //@SaCheckPermission("product:associate:edit")
     @Log(title = "产品关联", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductAssociateController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:associate:remove")
+    //@SaCheckPermission("product:associate:remove")
     @Log(title = "产品关联", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductAttributesController.java

@@ -40,7 +40,7 @@ public class ProductAttributesController extends BaseController {
     /**
      * 查询产品属性定义(用于动态属性配置)列表
      */
-    @SaCheckPermission("product:attributes:list")
+    //@SaCheckPermission("product:attributes:list")
     @GetMapping("/list")
     public TableDataInfo<ProductAttributesVo> list(ProductAttributesBo bo, PageQuery pageQuery) {
         return productAttributesService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductAttributesController extends BaseController {
     /**
      * 导出产品属性定义(用于动态属性配置)列表
      */
-    @SaCheckPermission("product:attributes:export")
+    //@SaCheckPermission("product:attributes:export")
     @Log(title = "产品属性定义(用于动态属性配置)", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductAttributesBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductAttributesController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:attributes:query")
+    //@SaCheckPermission("product:attributes:query")
     @GetMapping("/{id}")
-    public R<ProductAttributesVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductAttributesVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productAttributesService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductAttributesController extends BaseController {
     /**
      * 新增产品属性定义(用于动态属性配置)
      */
-    @SaCheckPermission("product:attributes:add")
+    //@SaCheckPermission("product:attributes:add")
     @Log(title = "产品属性定义(用于动态属性配置)", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductAttributesController extends BaseController {
     /**
      * 修改产品属性定义(用于动态属性配置)
      */
-    @SaCheckPermission("product:attributes:edit")
+    //@SaCheckPermission("product:attributes:edit")
     @Log(title = "产品属性定义(用于动态属性配置)", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductAttributesController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:attributes:remove")
+    //@SaCheckPermission("product:attributes:remove")
     @Log(title = "产品属性定义(用于动态属性配置)", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBaseController.java

@@ -53,7 +53,7 @@ public class ProductBaseController extends BaseController {
     /**
      * 查询产品基础信息列表
      */
-    @SaCheckPermission("product:base:list")
+    //@SaCheckPermission("product:base:list")
     @GetMapping("/list")
     public TableDataInfo<ProductBaseVo> list(ProductBaseBo bo, PageQuery pageQuery) {
         return productBaseService.queryPageList(bo, pageQuery);
@@ -62,7 +62,7 @@ public class ProductBaseController extends BaseController {
     /**
      * 导出产品基础信息列表
      */
-    @SaCheckPermission("product:base:export")
+    //@SaCheckPermission("product:base:export")
     @Log(title = "产品基础信息", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductBaseBo bo, HttpServletResponse response) {
@@ -75,9 +75,9 @@ public class ProductBaseController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:base:query")
+    //@SaCheckPermission("product:base:query")
     @GetMapping("/{id}")
-    public R<ProductBaseVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductBaseVo> getInfo(//@NotNull(message = "主键不能为空")
                                     @PathVariable("id") Long id) {
         return R.ok(productBaseService.queryById(id));
     }
@@ -85,7 +85,7 @@ public class ProductBaseController extends BaseController {
     /**
      * 新增产品基础信息
      */
-    @SaCheckPermission("product:base:add")
+    //@SaCheckPermission("product:base:add")
     @Log(title = "产品基础信息", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -96,7 +96,7 @@ public class ProductBaseController extends BaseController {
     /**
      * 修改产品基础信息
      */
-    @SaCheckPermission("product:base:edit")
+    //@SaCheckPermission("product:base:edit")
     @Log(title = "产品基础信息", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -109,7 +109,7 @@ public class ProductBaseController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:base:remove")
+    //@SaCheckPermission("product:base:remove")
     @Log(title = "产品基础信息", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBlacklistController.java

@@ -40,7 +40,7 @@ public class ProductBlacklistController extends BaseController {
     /**
      * 查询产品黑名单列表
      */
-    @SaCheckPermission("product:blacklist:list")
+    //@SaCheckPermission("product:blacklist:list")
     @GetMapping("/list")
     public TableDataInfo<ProductBlacklistVo> list(ProductBlacklistBo bo, PageQuery pageQuery) {
         return productBlacklistService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductBlacklistController extends BaseController {
     /**
      * 导出产品黑名单列表
      */
-    @SaCheckPermission("product:blacklist:export")
+    //@SaCheckPermission("product:blacklist:export")
     @Log(title = "产品黑名单", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductBlacklistBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductBlacklistController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:blacklist:query")
+    //@SaCheckPermission("product:blacklist:query")
     @GetMapping("/{id}")
-    public R<ProductBlacklistVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductBlacklistVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productBlacklistService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductBlacklistController extends BaseController {
     /**
      * 新增产品黑名单
      */
-    @SaCheckPermission("product:blacklist:add")
+    //@SaCheckPermission("product:blacklist:add")
     @Log(title = "产品黑名单", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductBlacklistController extends BaseController {
     /**
      * 修改产品黑名单
      */
-    @SaCheckPermission("product:blacklist:edit")
+    //@SaCheckPermission("product:blacklist:edit")
     @Log(title = "产品黑名单", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductBlacklistController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:blacklist:remove")
+    //@SaCheckPermission("product:blacklist:remove")
     @Log(title = "产品黑名单", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBrandController.java

@@ -40,7 +40,7 @@ public class ProductBrandController extends BaseController {
     /**
      * 查询产品品牌信息列表
      */
-    @SaCheckPermission("product:brand:list")
+    //@SaCheckPermission("product:brand:list")
     @GetMapping("/list")
     public TableDataInfo<ProductBrandVo> list(ProductBrandBo bo, PageQuery pageQuery) {
         return productBrandService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductBrandController extends BaseController {
     /**
      * 导出产品品牌信息列表
      */
-    @SaCheckPermission("product:brand:export")
+    //@SaCheckPermission("product:brand:export")
     @Log(title = "产品品牌信息", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductBrandBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductBrandController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:brand:query")
+    //@SaCheckPermission("product:brand:query")
     @GetMapping("/{id}")
-    public R<ProductBrandVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductBrandVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productBrandService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductBrandController extends BaseController {
     /**
      * 新增产品品牌信息
      */
-    @SaCheckPermission("product:brand:add")
+    //@SaCheckPermission("product:brand:add")
     @Log(title = "产品品牌信息", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductBrandController extends BaseController {
     /**
      * 修改产品品牌信息
      */
-    @SaCheckPermission("product:brand:edit")
+    //@SaCheckPermission("product:brand:edit")
     @Log(title = "产品品牌信息", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductBrandController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:brand:remove")
+    //@SaCheckPermission("product:brand:remove")
     @Log(title = "产品品牌信息", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductCategoryController.java

@@ -40,7 +40,7 @@ public class ProductCategoryController extends BaseController {
     /**
      * 查询产品分类列表
      */
-    @SaCheckPermission("product:category:list")
+    //@SaCheckPermission("product:category:list")
     @GetMapping("/list")
     public TableDataInfo<ProductCategoryVo> list(ProductCategoryBo bo, PageQuery pageQuery) {
         return productCategoryService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductCategoryController extends BaseController {
     /**
      * 导出产品分类列表
      */
-    @SaCheckPermission("product:category:export")
+    //@SaCheckPermission("product:category:export")
     @Log(title = "产品分类", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductCategoryBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductCategoryController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:category:query")
+    //@SaCheckPermission("product:category:query")
     @GetMapping("/{id}")
-    public R<ProductCategoryVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductCategoryVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productCategoryService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductCategoryController extends BaseController {
     /**
      * 新增产品分类
      */
-    @SaCheckPermission("product:category:add")
+    //@SaCheckPermission("product:category:add")
     @Log(title = "产品分类", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductCategoryController extends BaseController {
     /**
      * 修改产品分类
      */
-    @SaCheckPermission("product:category:edit")
+    //@SaCheckPermission("product:category:edit")
     @Log(title = "产品分类", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductCategoryController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:category:remove")
+    //@SaCheckPermission("product:category:remove")
     @Log(title = "产品分类", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductClassificationController.java

@@ -40,7 +40,7 @@ public class ProductClassificationController extends BaseController {
     /**
      * 查询产品属性关联列表
      */
-    @SaCheckPermission("product:classification:list")
+    //@SaCheckPermission("product:classification:list")
     @GetMapping("/list")
     public TableDataInfo<ProductClassificationVo> list(ProductClassificationBo bo, PageQuery pageQuery) {
         return productClassificationService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductClassificationController extends BaseController {
     /**
      * 导出产品属性关联列表
      */
-    @SaCheckPermission("product:classification:export")
+    //@SaCheckPermission("product:classification:export")
     @Log(title = "产品属性关联", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductClassificationBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductClassificationController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:classification:query")
+    //@SaCheckPermission("product:classification:query")
     @GetMapping("/{id}")
-    public R<ProductClassificationVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductClassificationVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productClassificationService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductClassificationController extends BaseController {
     /**
      * 新增产品属性关联
      */
-    @SaCheckPermission("product:classification:add")
+    //@SaCheckPermission("product:classification:add")
     @Log(title = "产品属性关联", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductClassificationController extends BaseController {
     /**
      * 修改产品属性关联
      */
-    @SaCheckPermission("product:classification:edit")
+    //@SaCheckPermission("product:classification:edit")
     @Log(title = "产品属性关联", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductClassificationController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:classification:remove")
+    //@SaCheckPermission("product:classification:remove")
     @Log(title = "产品属性关联", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductCustomizationController.java

@@ -40,7 +40,7 @@ public class ProductCustomizationController extends BaseController {
     /**
      * 查询产品定制信息列表
      */
-    @SaCheckPermission("product:customization:list")
+    //@SaCheckPermission("product:customization:list")
     @GetMapping("/list")
     public TableDataInfo<ProductCustomizationVo> list(ProductCustomizationBo bo, PageQuery pageQuery) {
         return productCustomizationService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductCustomizationController extends BaseController {
     /**
      * 导出产品定制信息列表
      */
-    @SaCheckPermission("product:customization:export")
+    //@SaCheckPermission("product:customization:export")
     @Log(title = "产品定制信息", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductCustomizationBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductCustomizationController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:customization:query")
+    //@SaCheckPermission("product:customization:query")
     @GetMapping("/{id}")
-    public R<ProductCustomizationVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductCustomizationVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productCustomizationService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductCustomizationController extends BaseController {
     /**
      * 新增产品定制信息
      */
-    @SaCheckPermission("product:customization:add")
+    //@SaCheckPermission("product:customization:add")
     @Log(title = "产品定制信息", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductCustomizationController extends BaseController {
     /**
      * 修改产品定制信息
      */
-    @SaCheckPermission("product:customization:edit")
+    //@SaCheckPermission("product:customization:edit")
     @Log(title = "产品定制信息", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductCustomizationController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:customization:remove")
+    //@SaCheckPermission("product:customization:remove")
     @Log(title = "产品定制信息", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductEnsureController.java

@@ -40,7 +40,7 @@ public class ProductEnsureController extends BaseController {
     /**
      * 查询产品保障项列表
      */
-    @SaCheckPermission("product:ensure:list")
+    //@SaCheckPermission("product:ensure:list")
     @GetMapping("/list")
     public TableDataInfo<ProductEnsureVo> list(ProductEnsureBo bo, PageQuery pageQuery) {
         return productEnsureService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductEnsureController extends BaseController {
     /**
      * 导出产品保障项列表
      */
-    @SaCheckPermission("product:ensure:export")
+    //@SaCheckPermission("product:ensure:export")
     @Log(title = "产品保障项", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductEnsureBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductEnsureController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:ensure:query")
+    //@SaCheckPermission("product:ensure:query")
     @GetMapping("/{id}")
-    public R<ProductEnsureVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductEnsureVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productEnsureService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductEnsureController extends BaseController {
     /**
      * 新增产品保障项
      */
-    @SaCheckPermission("product:ensure:add")
+    //@SaCheckPermission("product:ensure:add")
     @Log(title = "产品保障项", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductEnsureController extends BaseController {
     /**
      * 修改产品保障项
      */
-    @SaCheckPermission("product:ensure:edit")
+    //@SaCheckPermission("product:ensure:edit")
     @Log(title = "产品保障项", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductEnsureController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:ensure:remove")
+    //@SaCheckPermission("product:ensure:remove")
     @Log(title = "产品保障项", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductLableController.java

@@ -40,7 +40,7 @@ public class ProductLableController extends BaseController {
     /**
      * 查询产品标签信息(注意:名疑似拼写错误,应为 product_label)列表
      */
-    @SaCheckPermission("product:lable:list")
+    //@SaCheckPermission("product:lable:list")
     @GetMapping("/list")
     public TableDataInfo<ProductLableVo> list(ProductLableBo bo, PageQuery pageQuery) {
         return productLableService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductLableController extends BaseController {
     /**
      * 导出产品标签信息(注意:名疑似拼写错误,应为 product_label)列表
      */
-    @SaCheckPermission("product:lable:export")
+    //@SaCheckPermission("product:lable:export")
     @Log(title = "产品标签信息(注意:名疑似拼写错误,应为 product_label)", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductLableBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductLableController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:lable:query")
+    //@SaCheckPermission("product:lable:query")
     @GetMapping("/{id}")
-    public R<ProductLableVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductLableVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productLableService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductLableController extends BaseController {
     /**
      * 新增产品标签信息(注意:名疑似拼写错误,应为 product_label)
      */
-    @SaCheckPermission("product:lable:add")
+    //@SaCheckPermission("product:lable:add")
     @Log(title = "产品标签信息(注意:名疑似拼写错误,应为 product_label)", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductLableController extends BaseController {
     /**
      * 修改产品标签信息(注意:名疑似拼写错误,应为 product_label)
      */
-    @SaCheckPermission("product:lable:edit")
+    //@SaCheckPermission("product:lable:edit")
     @Log(title = "产品标签信息(注意:名疑似拼写错误,应为 product_label)", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductLableController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:lable:remove")
+    //@SaCheckPermission("product:lable:remove")
     @Log(title = "产品标签信息(注意:名疑似拼写错误,应为 product_label)", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductPoolController.java

@@ -40,7 +40,7 @@ public class ProductPoolController extends BaseController {
     /**
      * 查询产品池列表
      */
-    @SaCheckPermission("product:pool:list")
+    //@SaCheckPermission("product:pool:list")
     @GetMapping("/list")
     public TableDataInfo<ProductPoolVo> list(ProductPoolBo bo, PageQuery pageQuery) {
         return productPoolService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductPoolController extends BaseController {
     /**
      * 导出产品池列表
      */
-    @SaCheckPermission("product:pool:export")
+    //@SaCheckPermission("product:pool:export")
     @Log(title = "产品池", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductPoolBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductPoolController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:pool:query")
+    //@SaCheckPermission("product:pool:query")
     @GetMapping("/{id}")
-    public R<ProductPoolVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductPoolVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productPoolService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductPoolController extends BaseController {
     /**
      * 新增产品池
      */
-    @SaCheckPermission("product:pool:add")
+    //@SaCheckPermission("product:pool:add")
     @Log(title = "产品池", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductPoolController extends BaseController {
     /**
      * 修改产品池
      */
-    @SaCheckPermission("product:pool:edit")
+    //@SaCheckPermission("product:pool:edit")
     @Log(title = "产品池", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductPoolController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:pool:remove")
+    //@SaCheckPermission("product:pool:remove")
     @Log(title = "产品池", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 22 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductPoolLinkController.java

@@ -19,6 +19,7 @@ import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.product.domain.vo.ProductPoolLinkVo;
 import org.dromara.product.domain.bo.ProductPoolLinkBo;
+import org.dromara.product.domain.bo.BatchAddProductBo;
 import org.dromara.product.service.IProductPoolLinkService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
@@ -40,7 +41,7 @@ public class ProductPoolLinkController extends BaseController {
     /**
      * 查询产品池和产品关联列表
      */
-    @SaCheckPermission("product:poolLink:list")
+    //@SaCheckPermission("product:poolLink:list")
     @GetMapping("/list")
     public TableDataInfo<ProductPoolLinkVo> list(ProductPoolLinkBo bo, PageQuery pageQuery) {
         return productPoolLinkService.queryPageList(bo, pageQuery);
@@ -49,7 +50,7 @@ public class ProductPoolLinkController extends BaseController {
     /**
      * 导出产品池和产品关联列表
      */
-    @SaCheckPermission("product:poolLink:export")
+    //@SaCheckPermission("product:poolLink:export")
     @Log(title = "产品池和产品关联", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductPoolLinkBo bo, HttpServletResponse response) {
@@ -62,9 +63,9 @@ public class ProductPoolLinkController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:poolLink:query")
+    //@SaCheckPermission("product:poolLink:query")
     @GetMapping("/{id}")
-    public R<ProductPoolLinkVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductPoolLinkVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productPoolLinkService.queryById(id));
     }
@@ -72,7 +73,7 @@ public class ProductPoolLinkController extends BaseController {
     /**
      * 新增产品池和产品关联
      */
-    @SaCheckPermission("product:poolLink:add")
+    //@SaCheckPermission("product:poolLink:add")
     @Log(title = "产品池和产品关联", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +84,7 @@ public class ProductPoolLinkController extends BaseController {
     /**
      * 修改产品池和产品关联
      */
-    @SaCheckPermission("product:poolLink:edit")
+    //@SaCheckPermission("product:poolLink:edit")
     @Log(title = "产品池和产品关联", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,11 +97,25 @@ public class ProductPoolLinkController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:poolLink:remove")
+    //@SaCheckPermission("product:poolLink:remove")
     @Log(title = "产品池和产品关联", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable("ids") Long[] ids) {
         return toAjax(productPoolLinkService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    /**
+     * 批量添加商品到商品池
+     *
+     * @param bo 批量添加参数
+     * @return 操作结果
+     */
+    //@SaCheckPermission("product:poolLink:add")
+    @Log(title = "批量添加商品到商品池", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping("/batchAdd")
+    public R<Void> batchAdd(@Validated @RequestBody BatchAddProductBo bo) {
+        return toAjax(productPoolLinkService.batchAddProducts(bo));
+    }
 }

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductProgramController.java

@@ -40,7 +40,7 @@ public class ProductProgramController extends BaseController {
     /**
      * 查询产品解决方案/项目方案列表
      */
-    @SaCheckPermission("product:program:list")
+    //@SaCheckPermission("product:program:list")
     @GetMapping("/list")
     public TableDataInfo<ProductProgramVo> list(ProductProgramBo bo, PageQuery pageQuery) {
         return productProgramService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductProgramController extends BaseController {
     /**
      * 导出产品解决方案/项目方案列表
      */
-    @SaCheckPermission("product:program:export")
+    //@SaCheckPermission("product:program:export")
     @Log(title = "产品解决方案/项目方案", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductProgramBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductProgramController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:program:query")
+    //@SaCheckPermission("product:program:query")
     @GetMapping("/{id}")
-    public R<ProductProgramVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductProgramVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productProgramService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductProgramController extends BaseController {
     /**
      * 新增产品解决方案/项目方案
      */
-    @SaCheckPermission("product:program:add")
+    //@SaCheckPermission("product:program:add")
     @Log(title = "产品解决方案/项目方案", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductProgramController extends BaseController {
     /**
      * 修改产品解决方案/项目方案
      */
-    @SaCheckPermission("product:program:edit")
+    //@SaCheckPermission("product:program:edit")
     @Log(title = "产品解决方案/项目方案", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductProgramController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:program:remove")
+    //@SaCheckPermission("product:program:remove")
     @Log(title = "产品解决方案/项目方案", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductProgramLinkController.java

@@ -40,7 +40,7 @@ public class ProductProgramLinkController extends BaseController {
     /**
      * 查询项目方案关联列表
      */
-    @SaCheckPermission("product:programLink:list")
+    //@SaCheckPermission("product:programLink:list")
     @GetMapping("/list")
     public TableDataInfo<ProductProgramLinkVo> list(ProductProgramLinkBo bo, PageQuery pageQuery) {
         return productProgramLinkService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductProgramLinkController extends BaseController {
     /**
      * 导出项目方案关联列表
      */
-    @SaCheckPermission("product:programLink:export")
+    //@SaCheckPermission("product:programLink:export")
     @Log(title = "项目方案关联", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductProgramLinkBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductProgramLinkController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:programLink:query")
+    //@SaCheckPermission("product:programLink:query")
     @GetMapping("/{id}")
-    public R<ProductProgramLinkVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductProgramLinkVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productProgramLinkService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductProgramLinkController extends BaseController {
     /**
      * 新增项目方案关联
      */
-    @SaCheckPermission("product:programLink:add")
+    //@SaCheckPermission("product:programLink:add")
     @Log(title = "项目方案关联", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductProgramLinkController extends BaseController {
     /**
      * 修改项目方案关联
      */
-    @SaCheckPermission("product:programLink:edit")
+    //@SaCheckPermission("product:programLink:edit")
     @Log(title = "项目方案关联", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductProgramLinkController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:programLink:remove")
+    //@SaCheckPermission("product:programLink:remove")
     @Log(title = "项目方案关联", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductRecommendController.java

@@ -40,7 +40,7 @@ public class ProductRecommendController extends BaseController {
     /**
      * 查询产品推荐位配置列表
      */
-    @SaCheckPermission("product:recommend:list")
+    //@SaCheckPermission("product:recommend:list")
     @GetMapping("/list")
     public TableDataInfo<ProductRecommendVo> list(ProductRecommendBo bo, PageQuery pageQuery) {
         return productRecommendService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductRecommendController extends BaseController {
     /**
      * 导出产品推荐位配置列表
      */
-    @SaCheckPermission("product:recommend:export")
+    //@SaCheckPermission("product:recommend:export")
     @Log(title = "产品推荐位配置", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductRecommendBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductRecommendController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:recommend:query")
+    //@SaCheckPermission("product:recommend:query")
     @GetMapping("/{id}")
-    public R<ProductRecommendVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductRecommendVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productRecommendService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductRecommendController extends BaseController {
     /**
      * 新增产品推荐位配置
      */
-    @SaCheckPermission("product:recommend:add")
+    //@SaCheckPermission("product:recommend:add")
     @Log(title = "产品推荐位配置", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductRecommendController extends BaseController {
     /**
      * 修改产品推荐位配置
      */
-    @SaCheckPermission("product:recommend:edit")
+    //@SaCheckPermission("product:recommend:edit")
     @Log(title = "产品推荐位配置", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductRecommendController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:recommend:remove")
+    //@SaCheckPermission("product:recommend:remove")
     @Log(title = "产品推荐位配置", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductRecommendLinkController.java

@@ -40,7 +40,7 @@ public class ProductRecommendLinkController extends BaseController {
     /**
      * 查询产品推荐关联列表
      */
-    @SaCheckPermission("product:recommendLink:list")
+    //@SaCheckPermission("product:recommendLink:list")
     @GetMapping("/list")
     public TableDataInfo<ProductRecommendLinkVo> list(ProductRecommendLinkBo bo, PageQuery pageQuery) {
         return productRecommendLinkService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductRecommendLinkController extends BaseController {
     /**
      * 导出产品推荐关联列表
      */
-    @SaCheckPermission("product:recommendLink:export")
+    //@SaCheckPermission("product:recommendLink:export")
     @Log(title = "产品推荐关联", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductRecommendLinkBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductRecommendLinkController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:recommendLink:query")
+    //@SaCheckPermission("product:recommendLink:query")
     @GetMapping("/{id}")
-    public R<ProductRecommendLinkVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductRecommendLinkVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productRecommendLinkService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductRecommendLinkController extends BaseController {
     /**
      * 新增产品推荐关联
      */
-    @SaCheckPermission("product:recommendLink:add")
+    //@SaCheckPermission("product:recommendLink:add")
     @Log(title = "产品推荐关联", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductRecommendLinkController extends BaseController {
     /**
      * 修改产品推荐关联
      */
-    @SaCheckPermission("product:recommendLink:edit")
+    //@SaCheckPermission("product:recommendLink:edit")
     @Log(title = "产品推荐关联", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductRecommendLinkController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:recommendLink:remove")
+    //@SaCheckPermission("product:recommendLink:remove")
     @Log(title = "产品推荐关联", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductSpecsController.java

@@ -40,7 +40,7 @@ public class ProductSpecsController extends BaseController {
     /**
      * 查询产品规格关联列表
      */
-    @SaCheckPermission("product:specs:list")
+    //@SaCheckPermission("product:specs:list")
     @GetMapping("/list")
     public TableDataInfo<ProductSpecsVo> list(ProductSpecsBo bo, PageQuery pageQuery) {
         return productSpecsService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductSpecsController extends BaseController {
     /**
      * 导出产品规格关联列表
      */
-    @SaCheckPermission("product:specs:export")
+    //@SaCheckPermission("product:specs:export")
     @Log(title = "产品规格关联", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductSpecsBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductSpecsController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:specs:query")
+    //@SaCheckPermission("product:specs:query")
     @GetMapping("/{id}")
-    public R<ProductSpecsVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductSpecsVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productSpecsService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductSpecsController extends BaseController {
     /**
      * 新增产品规格关联
      */
-    @SaCheckPermission("product:specs:add")
+    //@SaCheckPermission("product:specs:add")
     @Log(title = "产品规格关联", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductSpecsController extends BaseController {
     /**
      * 修改产品规格关联
      */
-    @SaCheckPermission("product:specs:edit")
+    //@SaCheckPermission("product:specs:edit")
     @Log(title = "产品规格关联", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductSpecsController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:specs:remove")
+    //@SaCheckPermission("product:specs:remove")
     @Log(title = "产品规格关联", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductTaxrateController.java

@@ -40,7 +40,7 @@ public class ProductTaxrateController extends BaseController {
     /**
      * 查询产品税率配置列表
      */
-    @SaCheckPermission("product:taxrate:list")
+    //@SaCheckPermission("product:taxrate:list")
     @GetMapping("/list")
     public TableDataInfo<ProductTaxrateVo> list(ProductTaxrateBo bo, PageQuery pageQuery) {
         return productTaxrateService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductTaxrateController extends BaseController {
     /**
      * 导出产品税率配置列表
      */
-    @SaCheckPermission("product:taxrate:export")
+    //@SaCheckPermission("product:taxrate:export")
     @Log(title = "产品税率配置", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductTaxrateBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductTaxrateController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:taxrate:query")
+    //@SaCheckPermission("product:taxrate:query")
     @GetMapping("/{id}")
-    public R<ProductTaxrateVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductTaxrateVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productTaxrateService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductTaxrateController extends BaseController {
     /**
      * 新增产品税率配置
      */
-    @SaCheckPermission("product:taxrate:add")
+    //@SaCheckPermission("product:taxrate:add")
     @Log(title = "产品税率配置", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductTaxrateController extends BaseController {
     /**
      * 修改产品税率配置
      */
-    @SaCheckPermission("product:taxrate:edit")
+    //@SaCheckPermission("product:taxrate:edit")
     @Log(title = "产品税率配置", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductTaxrateController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:taxrate:remove")
+    //@SaCheckPermission("product:taxrate:remove")
     @Log(title = "产品税率配置", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductUnitController.java

@@ -40,7 +40,7 @@ public class ProductUnitController extends BaseController {
     /**
      * 查询产品计量单位列表
      */
-    @SaCheckPermission("product:unit:list")
+    //@SaCheckPermission("product:unit:list")
     @GetMapping("/list")
     public TableDataInfo<ProductUnitVo> list(ProductUnitBo bo, PageQuery pageQuery) {
         return productUnitService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductUnitController extends BaseController {
     /**
      * 导出产品计量单位列表
      */
-    @SaCheckPermission("product:unit:export")
+    //@SaCheckPermission("product:unit:export")
     @Log(title = "产品计量单位", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductUnitBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductUnitController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:unit:query")
+    //@SaCheckPermission("product:unit:query")
     @GetMapping("/{id}")
-    public R<ProductUnitVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductUnitVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productUnitService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductUnitController extends BaseController {
     /**
      * 新增产品计量单位
      */
-    @SaCheckPermission("product:unit:add")
+    //@SaCheckPermission("product:unit:add")
     @Log(title = "产品计量单位", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductUnitController extends BaseController {
     /**
      * 修改产品计量单位
      */
-    @SaCheckPermission("product:unit:edit")
+    //@SaCheckPermission("product:unit:edit")
     @Log(title = "产品计量单位", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductUnitController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:unit:remove")
+    //@SaCheckPermission("product:unit:remove")
     @Log(title = "产品计量单位", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductVolumeUnitController.java

@@ -40,7 +40,7 @@ public class ProductVolumeUnitController extends BaseController {
     /**
      * 查询产品体积单位列表
      */
-    @SaCheckPermission("product:volumeUnit:list")
+    //@SaCheckPermission("product:volumeUnit:list")
     @GetMapping("/list")
     public TableDataInfo<ProductVolumeUnitVo> list(ProductVolumeUnitBo bo, PageQuery pageQuery) {
         return productVolumeUnitService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductVolumeUnitController extends BaseController {
     /**
      * 导出产品体积单位列表
      */
-    @SaCheckPermission("product:volumeUnit:export")
+    //@SaCheckPermission("product:volumeUnit:export")
     @Log(title = "产品体积单位", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductVolumeUnitBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductVolumeUnitController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:volumeUnit:query")
+    //@SaCheckPermission("product:volumeUnit:query")
     @GetMapping("/{id}")
-    public R<ProductVolumeUnitVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductVolumeUnitVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productVolumeUnitService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductVolumeUnitController extends BaseController {
     /**
      * 新增产品体积单位
      */
-    @SaCheckPermission("product:volumeUnit:add")
+    //@SaCheckPermission("product:volumeUnit:add")
     @Log(title = "产品体积单位", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductVolumeUnitController extends BaseController {
     /**
      * 修改产品体积单位
      */
-    @SaCheckPermission("product:volumeUnit:edit")
+    //@SaCheckPermission("product:volumeUnit:edit")
     @Log(title = "产品体积单位", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductVolumeUnitController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:volumeUnit:remove")
+    //@SaCheckPermission("product:volumeUnit:remove")
     @Log(title = "产品体积单位", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductWeightUnitController.java

@@ -40,7 +40,7 @@ public class ProductWeightUnitController extends BaseController {
     /**
      * 查询产品重量单位列表
      */
-    @SaCheckPermission("product:weightUnit:list")
+    //@SaCheckPermission("product:weightUnit:list")
     @GetMapping("/list")
     public TableDataInfo<ProductWeightUnitVo> list(ProductWeightUnitBo bo, PageQuery pageQuery) {
         return productWeightUnitService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ProductWeightUnitController extends BaseController {
     /**
      * 导出产品重量单位列表
      */
-    @SaCheckPermission("product:weightUnit:export")
+    //@SaCheckPermission("product:weightUnit:export")
     @Log(title = "产品重量单位", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ProductWeightUnitBo bo, HttpServletResponse response) {
@@ -62,9 +62,9 @@ public class ProductWeightUnitController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("product:weightUnit:query")
+    //@SaCheckPermission("product:weightUnit:query")
     @GetMapping("/{id}")
-    public R<ProductWeightUnitVo> getInfo(@NotNull(message = "主键不能为空")
+    public R<ProductWeightUnitVo> getInfo(//@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
         return R.ok(productWeightUnitService.queryById(id));
     }
@@ -72,7 +72,7 @@ public class ProductWeightUnitController extends BaseController {
     /**
      * 新增产品重量单位
      */
-    @SaCheckPermission("product:weightUnit:add")
+    //@SaCheckPermission("product:weightUnit:add")
     @Log(title = "产品重量单位", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ProductWeightUnitController extends BaseController {
     /**
      * 修改产品重量单位
      */
-    @SaCheckPermission("product:weightUnit:edit")
+    //@SaCheckPermission("product:weightUnit:edit")
     @Log(title = "产品重量单位", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ProductWeightUnitController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("product:weightUnit:remove")
+    //@SaCheckPermission("product:weightUnit:remove")
     @Log(title = "产品重量单位", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 6 - 11
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductPoolLink.java

@@ -1,12 +1,15 @@
 package org.dromara.product.domain;
 
-import org.dromara.common.tenant.core.TenantEntity;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import java.math.BigDecimal;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.tenant.core.TenantEntity;
 
 import java.io.Serial;
+import java.math.BigDecimal;
 
 /**
  * 产品池和产品关联对象 product_pool_link
@@ -63,16 +66,8 @@ public class ProductPoolLink extends TenantEntity {
      */
     private String isShow;
 
-    /**
-     * 删除标志(0代表存在 2代表删除)
-     */
-    @TableLogic
-    private String delFlag;
-
     /**
      * 备注
      */
     private String remark;
-
-
 }

+ 56 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/BatchAddProductBo.java

@@ -0,0 +1,56 @@
+package org.dromara.product.domain.bo;
+
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 批量添加商品到商品池业务对象
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+public class BatchAddProductBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 商品池ID
+     */
+    @NotNull(message = "商品池ID不能为空")
+    private Long poolId;
+
+    /**
+     * 商品列表
+     */
+    @NotEmpty(message = "商品列表不能为空")
+    private List<ProductItem> products;
+
+    /**
+     * 商品项
+     */
+    @Data
+    public static class ProductItem implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        /**
+         * 商品ID
+         */
+        @NotNull(message = "商品ID不能为空")
+        private Long productId;
+
+        /**
+         * 协议价
+         */
+        private BigDecimal agreementPrice;
+    }
+}

+ 3 - 3
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductAfterSalesBo.java

@@ -28,19 +28,19 @@ public class ProductAfterSalesBo extends BaseEntity {
     /**
      * 售后服务项目(如:保修、退换货、技术支持等)
      */
-    @NotBlank(message = "售后服务项目(如:保修、退换货、技术支持等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "售后服务项目(如:保修、退换货、技术支持等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String afterSalesItems;
 
     /**
      * 数据来源(如:系统录入、接口同步等)
      */
-    @NotBlank(message = "数据来源(如:系统录入、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "数据来源(如:系统录入、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String dataSource;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

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

@@ -28,13 +28,13 @@ public class ProductAssociateBo extends BaseEntity {
     /**
      * 主产品id
      */
-    @NotNull(message = "主产品id不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "主产品id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long productId;
 
     /**
      * 关联产品编号列表(如:用逗号分隔的产品编号)
      */
-    @NotBlank(message = "关联产品编号列表(如:用逗号分隔的产品编号)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "关联产品编号列表(如:用逗号分隔的产品编号)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productIds;
 
     /**
@@ -45,13 +45,13 @@ public class ProductAssociateBo extends BaseEntity {
     /**
      * 关联标题/展示名称
      */
-    @NotBlank(message = "关联标题/展示名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "关联标题/展示名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String relatedTitle;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 6 - 6
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductAttributesBo.java

@@ -28,19 +28,19 @@ public class ProductAttributesBo extends BaseEntity {
     /**
      * 关联的产品分类id
      */
-    @NotBlank(message = "关联的产品分类id不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "关联的产品分类id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long categoryId;
 
     /**
      * 属性编码(用于系统识别)
      */
-    @NotBlank(message = "属性编码(用于系统识别)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "属性编码(用于系统识别)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productAttributesCode;
 
     /**
      * 属性显示名称
      */
-    @NotBlank(message = "属性显示名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "属性显示名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productAttributesName;
 
     /**
@@ -61,19 +61,19 @@ public class ProductAttributesBo extends BaseEntity {
     /**
      * 预定义属性值列表(逗号分隔或JSON)
      */
-    @NotBlank(message = "预定义属性值列表(逗号分隔或JSON)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "预定义属性值列表(逗号分隔或JSON)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String attributesList;
 
     /**
      * 是否必填: 1=是, 0=否
      */
-    @NotBlank(message = "是否必填: 1=是, 0=否不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "是否必填: 1=是, 0=否不能为空", groups = { AddGroup.class, EditGroup.class })
     private String required;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

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

@@ -32,37 +32,37 @@ public class ProductBaseBo extends BaseEntity {
     /**
      * 产品编号
      */
-    @NotBlank(message = "产品编号不能为空", groups = {AddGroup.class, EditGroup.class})
+    //@NotBlank(message = "产品编号不能为空", groups = {AddGroup.class, EditGroup.class})
     private String productNo;
 
     /**
      * 项目名称
      */
-    @NotBlank(message = "项目名称不能为空", groups = {AddGroup.class, EditGroup.class})
+    //@NotBlank(message = "项目名称不能为空", groups = {AddGroup.class, EditGroup.class})
     private String itemName;
 
     /**
      * 品牌id
      */
-    @NotNull(message = "品牌id不能为空", groups = {AddGroup.class, EditGroup.class})
+    //@NotNull(message = "品牌id不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long brandId;
 
     /**
      * 顶级分类id
      */
-    @NotNull(message = "顶级分类id不能为空", groups = {AddGroup.class, EditGroup.class})
+    //@NotNull(message = "顶级分类id不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long topCategoryId;
 
     /**
      * 中级分类id
      */
-    @NotNull(message = "中级分类id不能为空", groups = {AddGroup.class, EditGroup.class})
+    //@NotNull(message = "中级分类id不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long mediumCategoryId;
 
     /**
      * 底层分类id
      */
-    @NotNull(message = "底层分类id不能为空", groups = {AddGroup.class, EditGroup.class})
+    //@NotNull(message = "底层分类id不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long bottomCategoryId;
 
     /**
@@ -155,16 +155,6 @@ public class ProductBaseBo extends BaseEntity {
      */
     private String invoiceSpec;
 
-    /**
-     * 产品品牌
-     */
-    private String productBrand;
-
-    /**
-     * 段号
-     */
-    private String sectionNo;
-
     /**
      * 包装规格
      */
@@ -245,11 +235,6 @@ public class ProductBaseBo extends BaseEntity {
      */
     private java.math.BigDecimal certificatePrice;
 
-    /**
-     * 售价验证量
-     */
-    private String priceVerificationQuantity;
-
     /**
      * 采购价
      */
@@ -270,21 +255,6 @@ public class ProductBaseBo extends BaseEntity {
      */
     private String purchasingPersonnel;
 
-    /**
-     * 旧属性类型
-     */
-    private String oldAttributeType;
-
-    /**
-     * 录入套数
-     */
-    private String entrySetCount;
-
-    /**
-     * 商品主图
-     */
-    private String mainImage;
-
     /**
      * 商品详情 - 电脑端
      */

+ 3 - 3
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBlacklistBo.java

@@ -28,13 +28,13 @@ public class ProductBlacklistBo extends BaseEntity {
     /**
      * 客户id(可为空,表示全局黑名单)
      */
-    @NotNull(message = "客户id(可为空,表示全局黑名单)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "客户id(可为空,表示全局黑名单)不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long customerId;
 
     /**
      * 产品id(可为空,表示该客户对整个分类禁用)
      */
-    @NotNull(message = "产品id(可为空,表示该客户对整个分类禁用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "产品id(可为空,表示该客户对整个分类禁用)不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long productId;
 
     /**
@@ -45,7 +45,7 @@ public class ProductBlacklistBo extends BaseEntity {
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

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

@@ -42,85 +42,85 @@ public class ProductBrandBo extends BaseEntity {
     /**
      * 品牌首字母缩写(如拼音首字母)
      */
-    @NotBlank(message = "品牌首字母缩写(如拼音首字母)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "品牌首字母缩写(如拼音首字母)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String brandInitials;
 
     /**
      * 品牌英文名称
      */
-    @NotBlank(message = "品牌英文名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "品牌英文名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String brandEnglishName;
 
     /**
      * 推荐值(数值越大越靠前)
      */
-    @NotNull(message = "推荐值(数值越大越靠前)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "推荐值(数值越大越靠前)不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long recommendValue;
 
     /**
      * 品牌Logo图片路径或URL
      */
-    @NotBlank(message = "品牌Logo图片路径或URL不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "品牌Logo图片路径或URL不能为空", groups = { AddGroup.class, EditGroup.class })
     private String brandLogo;
 
     /**
      * 品牌标题(用于展示)
      */
-    @NotBlank(message = "品牌标题(用于展示)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "品牌标题(用于展示)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String brandTitle;
 
     /**
      * 品牌大图(横幅/封面图)
      */
-    @NotBlank(message = "品牌大图(横幅/封面图)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "品牌大图(横幅/封面图)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String brandBigImage;
 
     /**
      * 品牌故事(简介文本)
      */
-    @NotBlank(message = "品牌故事(简介文本)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "品牌故事(简介文本)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String brandStory;
 
     /**
      * 是否显示(1=显示,0=隐藏)
      */
-    @NotNull(message = "是否显示(1=显示,0=隐藏)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "是否显示(1=显示,0=隐藏)不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long isShow;
 
     /**
      * 品牌注册人
      */
-    @NotBlank(message = "品牌注册人不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "品牌注册人不能为空", groups = { AddGroup.class, EditGroup.class })
     private String brandRegistrant;
 
     /**
      * 许可证编号
      */
-    @NotBlank(message = "许可证编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "许可证编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String license;
 
     /**
      * 注册证书编号
      */
-    @NotBlank(message = "注册证书编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "注册证书编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String registrationCertificate;
 
     /**
      * 证书/许可过期时间
      */
-    @NotNull(message = "证书/许可过期时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "证书/许可过期时间不能为空", groups = { AddGroup.class, EditGroup.class })
     private Date expireTime;
 
     /**
      * 品牌描述(较长文本)
      */
-    @NotBlank(message = "品牌描述(较长文本)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "品牌描述(较长文本)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String brandDescribe;
 
     /**
      * 展示位置(如首页、分类页等)
      */
-    @NotBlank(message = "展示位置(如首页、分类页等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "展示位置(如首页、分类页等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String position;
 
     /**
@@ -131,13 +131,13 @@ public class ProductBrandBo extends BaseEntity {
     /**
      * 数据来源
      */
-    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
     private String dataSource;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 21 - 21
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductCategoryBo.java

@@ -29,25 +29,25 @@ public class ProductCategoryBo extends BaseEntity {
     /**
      * 分类编号
      */
-    @NotBlank(message = "分类编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "分类编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String categoryNo;
 
     /**
      * 分类名称
      */
-    @NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String categoryName;
 
     /**
      * 父级分类ID
      */
-    @NotNull(message = "父级分类ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "父级分类ID不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long parentId;
 
     /**
      * 祖籍列表
      */
-    @NotBlank(message = "祖籍列表不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "祖籍列表不能为空", groups = { AddGroup.class, EditGroup.class })
     private String ancestors;
 
     /**
@@ -58,7 +58,7 @@ public class ProductCategoryBo extends BaseEntity {
     /**
      * 是否显示(1=显示,0=隐藏)
      */
-    @NotNull(message = "是否显示(1=显示,0=隐藏)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "是否显示(1=显示,0=隐藏)不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long isShow;
 
     /**
@@ -69,97 +69,97 @@ public class ProductCategoryBo extends BaseEntity {
     /**
      * 折扣率(可能为JSON或文本)
      */
-    @NotNull(message = "折扣率(可能为JSON或文本)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "折扣率(可能为JSON或文本)不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal discountRate;
 
     /**
      * 拼音码(用于快速检索)
      */
-    @NotBlank(message = "拼音码(用于快速检索)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "拼音码(用于快速检索)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String pyCode;
 
     /**
      * 分类描述
      */
-    @NotBlank(message = "分类描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "分类描述不能为空", groups = { AddGroup.class, EditGroup.class })
     private String classDescription;
 
     /**
      * 数据来源
      */
-    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
     private String dataSource;
 
     /**
      * 自定义标签1
      */
-    @NotBlank(message = "自定义标签1不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "自定义标签1不能为空", groups = { AddGroup.class, EditGroup.class })
     private String oneLable1;
 
     /**
      * 自定义标签2
      */
-    @NotBlank(message = "自定义标签2不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "自定义标签2不能为空", groups = { AddGroup.class, EditGroup.class })
     private String oneLable2;
 
     /**
      * 自定义链接1
      */
-    @NotBlank(message = "自定义链接1不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "自定义链接1不能为空", groups = { AddGroup.class, EditGroup.class })
     private String oneLink1;
 
     /**
      * 自定义链接2
      */
-    @NotBlank(message = "自定义链接2不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "自定义链接2不能为空", groups = { AddGroup.class, EditGroup.class })
     private String oneLink2;
 
     /**
      * 排序值,默认为0
      */
-    @NotNull(message = "排序值,默认为0不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "排序值,默认为0不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long sort;
 
     /**
      * 颜色(如CSS颜色值)
      */
-    @NotBlank(message = "颜色(如CSS颜色值)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "颜色(如CSS颜色值)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String color;
 
     /**
      * 采购编号
      */
-    @NotBlank(message = "采购编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "采购编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String purchaseNo;
 
     /**
      * 采购名称
      */
-    @NotBlank(message = "采购名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "采购名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String purchaseName;
 
     /**
      * 采购负责人编号
      */
-    @NotBlank(message = "采购负责人编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "采购负责人编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String purchaseManagerNo;
 
     /**
      * 采购负责人姓名
      */
-    @NotBlank(message = "采购负责人姓名不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "采购负责人姓名不能为空", groups = { AddGroup.class, EditGroup.class })
     private String purchaseManagerName;
 
     /**
      * 所属平台(0=Web, 1=小程序)
      */
-    @NotNull(message = "所属平台(0=Web, 1=小程序)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "所属平台(0=Web, 1=小程序)不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long platform;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

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

@@ -28,25 +28,25 @@ public class ProductClassificationBo extends BaseEntity {
     /**
      * 产品id
      */
-    @NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long productId;
 
     /**
      * 分类编号
      */
-    @NotNull(message = "分类编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "分类编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long categoryId;
 
     /**
      * 属性列表(JSON或分号分隔等格式)
      */
-    @NotBlank(message = "属性列表(JSON或分号分隔等格式)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "属性列表(JSON或分号分隔等格式)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String attributesList;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 9 - 9
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductCustomizationBo.java

@@ -29,55 +29,55 @@ public class ProductCustomizationBo extends BaseEntity {
     /**
      * 定制编号
      */
-    @NotBlank(message = "定制编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "定制编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String customizationNo;
 
     /**
      * 产品id
      */
-    @NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long productId;
 
     /**
      * 定制方式  支持多选,分隔  (0=包装定制,1=商品定制,2=开模定制)
      */
-    @NotBlank(message = "定制方式  支持多选,分隔  (0=包装定制,1=商品定制,2=开模定制)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "定制方式  支持多选,分隔  (0=包装定制,1=商品定制,2=开模定制)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String customizedStyle;
 
     /**
      * 定制工艺  支持多选,分隔  (0=丝印,1=热转印,2=激光,烤花,压印)
      */
-    @NotBlank(message = "定制工艺  支持多选,分隔  (0=丝印,1=热转印,2=激光,烤花,压印)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "定制工艺  支持多选,分隔  (0=丝印,1=热转印,2=激光,烤花,压印)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String customizedCraft;
 
     /**
      * 打样周期(天)
      */
-    @NotNull(message = "打样周期(天)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "打样周期(天)不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long proofingPeriod;
 
     /**
      * 生产周期(天)
      */
-    @NotNull(message = "生产周期(天)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "生产周期(天)不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long productionCycle;
 
     /**
      * 最小起订量(MOQ)
      */
-    @NotNull(message = "最小起订量(MOQ)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "最小起订量(MOQ)不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long moq;
 
     /**
      * MOQ对应价格
      */
-    @NotNull(message = "MOQ对应价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "MOQ对应价格不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal moqPrice;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 3 - 3
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductEnsureBo.java

@@ -28,19 +28,19 @@ public class ProductEnsureBo extends BaseEntity {
     /**
      * 保障名称(如:正品保证、售后保障等)
      */
-    @NotBlank(message = "保障名称(如:正品保证、售后保障等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "保障名称(如:正品保证、售后保障等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String ensureName;
 
     /**
      * 数据来源(如:系统配置、接口同步等)
      */
-    @NotBlank(message = "数据来源(如:系统配置、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "数据来源(如:系统配置、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String dataSource;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 38 - 38
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductExtendBo.java

@@ -30,73 +30,73 @@ public class ProductExtendBo extends BaseEntity {
     /**
      * 促销标题
      */
-    @NotBlank(message = "促销标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "促销标题不能为空", groups = { AddGroup.class, EditGroup.class })
     private String promotionTitle;
 
     /**
      * 发票名称
      */
-    @NotBlank(message = "发票名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "发票名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String invoiceName;
 
     /**
      * 发票类型
      */
-    @NotBlank(message = "发票类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "发票类型不能为空", groups = { AddGroup.class, EditGroup.class })
     private String invoiceType;
 
     /**
      * 规格代码
      */
-    @NotBlank(message = "规格代码不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "规格代码不能为空", groups = { AddGroup.class, EditGroup.class })
     private String specificationsCode;
 
     /**
      * 条形码
      */
-    @NotBlank(message = "条形码不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "条形码不能为空", groups = { AddGroup.class, EditGroup.class })
     private String barCoding;
 
     /**
      * 产品描述
      */
-    @NotBlank(message = "产品描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "产品描述不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productDescription;
 
     /**
      * 产品重量
      */
-    @NotBlank(message = "产品重量不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "产品重量不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productWeight;
 
     /**
      * 重量单位
      */
-    @NotBlank(message = "重量单位不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "重量单位不能为空", groups = { AddGroup.class, EditGroup.class })
     private String weightUnit;
 
     /**
      * 产品体积
      */
-    @NotBlank(message = "产品体积不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "产品体积不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productVolume;
 
     /**
      * 体积单位
      */
-    @NotBlank(message = "体积单位不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "体积单位不能为空", groups = { AddGroup.class, EditGroup.class })
     private String volumeUnit;
 
     /**
      * 售后服务
      */
-    @NotBlank(message = "售后服务不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "售后服务不能为空", groups = { AddGroup.class, EditGroup.class })
     private String afterSalesService;
 
     /**
      * 服务保障  支持多选,分隔 (0=无忧退货,1=快速退款,2=免费包邮,3正品保障)
      */
-    @NotBlank(message = "服务保障  支持多选,分隔 (0=无忧退货,1=快速退款,2=免费包邮,3正品保障)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "服务保障  支持多选,分隔 (0=无忧退货,1=快速退款,2=免费包邮,3正品保障)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String serviceGuarantee;
 
     /**
@@ -107,31 +107,31 @@ public class ProductExtendBo extends BaseEntity {
     /**
      * 安装费用
      */
-    @NotBlank(message = "安装费用不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "安装费用不能为空", groups = { AddGroup.class, EditGroup.class })
     private String installAmount;
 
     /**
      * 分销价格
      */
-    @NotBlank(message = "分销价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "分销价格不能为空", groups = { AddGroup.class, EditGroup.class })
     private String distributionPrice;
 
     /**
      * 标准尺寸
      */
-    @NotBlank(message = "标准尺寸不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "标准尺寸不能为空", groups = { AddGroup.class, EditGroup.class })
     private String standardSizes;
 
     /**
      * 克重
      */
-    @NotBlank(message = "克重不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "克重不能为空", groups = { AddGroup.class, EditGroup.class })
     private String gramWeight;
 
     /**
      * 透明度
      */
-    @NotBlank(message = "透明度不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "透明度不能为空", groups = { AddGroup.class, EditGroup.class })
     private String opacity;
 
     /**
@@ -142,127 +142,127 @@ public class ProductExtendBo extends BaseEntity {
     /**
      * 定制描述
      */
-    @NotBlank(message = "定制描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "定制描述不能为空", groups = { AddGroup.class, EditGroup.class })
     private String customDescription;
 
     /**
      * 产品利润
      */
-    @NotBlank(message = "产品利润不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "产品利润不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productProfit;
 
     /**
      * 报告需求
      */
-    @NotBlank(message = "报告需求不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "报告需求不能为空", groups = { AddGroup.class, EditGroup.class })
     private String reportRequire;
 
     /**
      * 审核评论
      */
-    @NotBlank(message = "审核评论不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "审核评论不能为空", groups = { AddGroup.class, EditGroup.class })
     private String reviewComments;
 
     /**
      * 供应商编号
      */
-    @NotBlank(message = "供应商编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "供应商编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String supplierNo;
 
     /**
      * 推送状态
      */
-    @NotBlank(message = "推送状态不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "推送状态不能为空", groups = { AddGroup.class, EditGroup.class })
     private String pushStatus;
 
     /**
      * 数据来源
      */
-    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
     private String dataSource;
 
     /**
      * 发票规格
      */
-    @NotBlank(message = "发票规格不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "发票规格不能为空", groups = { AddGroup.class, EditGroup.class })
     private String invoiceSpecs;
 
     /**
      * 增量
      */
-    @NotNull(message = "增量不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "增量不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long increment;
 
     /**
      * 采购编号
      */
-    @NotBlank(message = "采购编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "采购编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String purchaseNo;
 
     /**
      * 采购名称
      */
-    @NotBlank(message = "采购名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "采购名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String purchaseName;
 
     /**
      * 供应商名称
      */
-    @NotBlank(message = "供应商名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "供应商名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String supplierName;
 
     /**
      * 采购经理编号
      */
-    @NotBlank(message = "采购经理编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "采购经理编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String purchaseManagerNo;
 
     /**
      * 采购经理姓名
      */
-    @NotBlank(message = "采购经理姓名不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "采购经理姓名不能为空", groups = { AddGroup.class, EditGroup.class })
     private String purchaseManagerName;
 
     /**
      * 参考链接
      */
-    @NotBlank(message = "参考链接不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "参考链接不能为空", groups = { AddGroup.class, EditGroup.class })
     private String referenceLink;
 
     /**
      * 销售量
      */
-    @NotNull(message = "销售量不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "销售量不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long salesVolume;
 
     /**
      * 发货时效
      */
-    @NotBlank(message = "发货时效不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "发货时效不能为空", groups = { AddGroup.class, EditGroup.class })
     private String deliveryTime;
 
     /**
      * PIT时间
      */
-    @NotNull(message = "PIT时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "PIT时间不能为空", groups = { AddGroup.class, EditGroup.class })
     private Date pitTime;
 
     /**
      * 创建时的供应商标识
      */
-    @NotBlank(message = "创建时的供应商标识不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "创建时的供应商标识不能为空", groups = { AddGroup.class, EditGroup.class })
     private String createSupplier;
 
     /**
      * 其他补充信息
      */
-    @NotBlank(message = "其他补充信息不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "其他补充信息不能为空", groups = { AddGroup.class, EditGroup.class })
     private String otherInfo;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 3 - 3
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductLableBo.java

@@ -28,13 +28,13 @@ public class ProductLableBo extends BaseEntity {
     /**
      * 产品标签编号(如:NEW2025、HOT、VIP_ONLY 等)
      */
-    @NotBlank(message = "产品标签编号(如:NEW2025、HOT、VIP_ONLY 等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "产品标签编号(如:NEW2025、HOT、VIP_ONLY 等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productLabelNo;
 
     /**
      * 标签显示名称(如:新品、热销、限时优惠)
      */
-    @NotBlank(message = "标签显示名称(如:新品、热销、限时优惠)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "标签显示名称(如:新品、热销、限时优惠)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productLabelName;
 
     /**
@@ -45,7 +45,7 @@ public class ProductLableBo extends BaseEntity {
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 2 - 2
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPoolBo.java

@@ -48,13 +48,13 @@ public class ProductPoolBo extends BaseEntity {
     /**
      * 审核原因
      */
-    @NotBlank(message = "审核原因不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "审核原因不能为空", groups = { AddGroup.class, EditGroup.class })
     private String reviewReason;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 40 - 11
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPoolLinkBo.java

@@ -1,17 +1,18 @@
 package org.dromara.product.domain.bo;
 
-import org.dromara.product.domain.ProductPoolLink;
-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 jakarta.validation.constraints.NotNull;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import jakarta.validation.constraints.*;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.product.domain.ProductPoolLink;
+
 import java.math.BigDecimal;
 
 /**
- * 产品池和产品关联业务对象 product_pool_link
+ * 产品池和产品关联业务对象
  *
  * @author LionLi
  * @date 2025-12-11
@@ -24,22 +25,24 @@ public class ProductPoolLinkBo extends BaseEntity {
     /**
      * 主键ID
      */
+    @NotNull(message = "主键不能为空", groups = {EditGroup.class})
     private Long id;
 
     /**
      * 所属池ID
      */
+    @NotNull(message = "所属池ID不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long poolId;
 
     /**
      * 产品id
      */
+    @NotNull(message = "产品id不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long productId;
 
     /**
      * 产品价格
      */
-    @NotNull(message = "产品价格不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal productPrice;
 
     /**
@@ -50,26 +53,52 @@ public class ProductPoolLinkBo extends BaseEntity {
     /**
      * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
      */
-    @NotBlank(message = "产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productReviewStatus;
 
     /**
      * 审核原因
      */
-    @NotBlank(message = "审核原因不能为空", groups = { AddGroup.class, EditGroup.class })
     private String reviewReason;
 
     /**
      * 是否显示:1=是,0=否
      */
-    @NotBlank(message = "是否显示:1=是,0=否不能为空", groups = { AddGroup.class, EditGroup.class })
     private String isShow;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
+    // ========== 查询扩展字段 ==========
+
+    /**
+     * 商品编号
+     */
+    private String productNo;
+
+    /**
+     * 商品名称
+     */
+    private String itemName;
 
+    /**
+     * 品牌ID
+     */
+    private Long brandId;
+
+    /**
+     * 分类ID
+     */
+    private Long categoryId;
+
+    /**
+     * 商品状态 1=上架,0=下架
+     */
+    private String productStatus;
+
+    /**
+     * 供应商
+     */
+    private String supplier;
 }

+ 8 - 8
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPriceInventoryBo.java

@@ -29,31 +29,31 @@ public class ProductPriceInventoryBo extends BaseEntity {
     /**
      * 市场价格
      */
-    @NotNull(message = "市场价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "市场价格不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal marketPrice;
 
     /**
      * 会员价格
      */
-    @NotNull(message = "会员价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "会员价格不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal memberPrice;
 
     /**
      * 最低销售价格
      */
-    @NotNull(message = "最低销售价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "最低销售价格不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal minSellingPrice;
 
     /**
      * 采购价格
      */
-    @NotNull(message = "采购价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "采购价格不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal purchasingPrice;
 
     /**
      * 最高采购价格
      */
-    @NotNull(message = "最高采购价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "最高采购价格不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal maxPurchasePrice;
 
     /**
@@ -79,19 +79,19 @@ public class ProductPriceInventoryBo extends BaseEntity {
     /**
      * 税率
      */
-    @NotNull(message = "税率不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "税率不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal taxRate;
 
     /**
      * 货币类型
      */
-    @NotBlank(message = "货币类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "货币类型不能为空", groups = { AddGroup.class, EditGroup.class })
     private String currency;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

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

@@ -60,7 +60,7 @@ public class ProductProgramBo extends BaseEntity {
     /**
      * 方案内容(如简介、详情等)
      */
-    @NotBlank(message = "方案内容(如简介、详情等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "方案内容(如简介、详情等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String content;
 
     /**
@@ -76,19 +76,19 @@ public class ProductProgramBo extends BaseEntity {
     /**
      * 标签
      */
-    @NotBlank(message = "标签不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "标签不能为空", groups = { AddGroup.class, EditGroup.class })
     private String label;
 
     /**
      * 内部广告内容(如 Banner 文案或链接)
      */
-    @NotBlank(message = "内部广告内容(如 Banner 文案或链接)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "内部广告内容(如 Banner 文案或链接)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String innerAdvert;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 3 - 3
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductProgramLinkBo.java

@@ -28,19 +28,19 @@ public class ProductProgramLinkBo extends BaseEntity {
     /**
      * 项目编号
      */
-    @NotNull(message = "项目编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "项目编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long programId;
 
     /**
      * 产品编号
      */
-    @NotNull(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long productId;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

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

@@ -53,7 +53,7 @@ public class ProductRecommendBo extends BaseEntity {
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 3 - 3
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductRecommendLinkBo.java

@@ -28,19 +28,19 @@ public class ProductRecommendLinkBo extends BaseEntity {
     /**
      * 项目编号
      */
-    @NotNull(message = "项目编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "项目编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long recommendId;
 
     /**
      * 产品编号
      */
-    @NotNull(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long productId;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 3 - 3
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductSpecsBo.java

@@ -28,13 +28,13 @@ public class ProductSpecsBo extends BaseEntity {
     /**
      * 主产品编号
      */
-    @NotBlank(message = "主产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "主产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String productId;
 
     /**
      * 关联的规格产品id列表(如:逗号分隔的产品id)
      */
-    @NotBlank(message = "关联的规格产品id列表(如:逗号分隔的产品id)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "关联的规格产品id列表(如:逗号分隔的产品id)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String specsProductIds;
 
     /**
@@ -45,7 +45,7 @@ public class ProductSpecsBo extends BaseEntity {
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 6 - 6
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductTaxrateBo.java

@@ -29,37 +29,37 @@ public class ProductTaxrateBo extends BaseEntity {
     /**
      * 税率编号
      */
-    @NotBlank(message = "税率编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "税率编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String taxrateNo;
 
     /**
      * 税率名称
      */
-    @NotBlank(message = "税率名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "税率名称不能为空", groups = { AddGroup.class, EditGroup.class })
     private String taxrateName;
 
     /**
      * 税率值)
      */
-    @NotNull(message = "税率值)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotNull(message = "税率值)不能为空", groups = { AddGroup.class, EditGroup.class })
     private BigDecimal taxrate;
 
     /**
      * 数据来源
      */
-    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
     private String dataSource;
 
     /**
      * 是否显示:1=是,0=否
      */
-    @NotBlank(message = "是否显示:1=是,0=否不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "是否显示:1=是,0=否不能为空", groups = { AddGroup.class, EditGroup.class })
     private String isShow;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 5 - 5
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductUnitBo.java

@@ -28,31 +28,31 @@ public class ProductUnitBo extends BaseEntity {
     /**
      * 单位编号
      */
-    @NotBlank(message = "单位编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "单位编号不能为空", groups = { AddGroup.class, EditGroup.class })
     private String unitNo;
 
     /**
      * 单位名称(如:件、箱、千克等)
      */
-    @NotBlank(message = "单位名称(如:件、箱、千克等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "单位名称(如:件、箱、千克等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String unitName;
 
     /**
      * 数据来源
      */
-    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
     private String dataSource;
 
     /**
      * 是否显示:1=是,0=否
      */
-    @NotBlank(message = "是否显示:1=是,0=否不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "是否显示:1=是,0=否不能为空", groups = { AddGroup.class, EditGroup.class })
     private String isShow;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 3 - 3
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductVolumeUnitBo.java

@@ -28,19 +28,19 @@ public class ProductVolumeUnitBo extends BaseEntity {
     /**
      * 体积单位名称(如:立方米、升、立方厘米等)
      */
-    @NotBlank(message = "体积单位名称(如:立方米、升、立方厘米等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "体积单位名称(如:立方米、升、立方厘米等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String unitName;
 
     /**
      * 数据来源(如:系统配置、接口同步等)
      */
-    @NotBlank(message = "数据来源(如:系统配置、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "数据来源(如:系统配置、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String dataSource;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 3 - 3
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductWeightUnitBo.java

@@ -28,19 +28,19 @@ public class ProductWeightUnitBo extends BaseEntity {
     /**
      * 重量单位名称(如:千克、克、吨、磅等)
      */
-    @NotBlank(message = "重量单位名称(如:千克、克、吨、磅等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "重量单位名称(如:千克、克、吨、磅等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String unitName;
 
     /**
      * 数据来源(如:系统配置、接口同步等)
      */
-    @NotBlank(message = "数据来源(如:系统配置、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "数据来源(如:系统配置、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String dataSource;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 31 - 54
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseVo.java

@@ -54,6 +54,12 @@ public class ProductBaseVo implements Serializable {
     @ExcelProperty(value = "品牌id")
     private Long brandId;
 
+    /**
+     * 品牌名称
+     */
+    @Translation(type = "brand_id_to_name", mapper = "brandId")
+    private String brandName;
+
     /**
      * 顶级分类id
      */
@@ -188,12 +194,6 @@ public class ProductBaseVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
-    /**
-     * 款号
-     */
-    @ExcelProperty(value = "款号")
-    private String styleNo;
-
     /**
      * A10产品名称
      */
@@ -224,36 +224,12 @@ public class ProductBaseVo implements Serializable {
     @ExcelProperty(value = "发票规格")
     private String invoiceSpec;
 
-    /**
-     * 产品品牌
-     */
-    @ExcelProperty(value = "产品品牌")
-    private String productBrand;
-
-    /**
-     * 段号
-     */
-    @ExcelProperty(value = "段号")
-    private String sectionNo;
-
     /**
      * 包装规格
      */
     @ExcelProperty(value = "包装规格")
     private String packagingSpec;
 
-    /**
-     * 采用基准
-     */
-    @ExcelProperty(value = "采用基准")
-    private String adoptionStandard;
-
-    /**
-     * 采品性质
-     */
-    @ExcelProperty(value = "采品性质")
-    private String purchaseNature;
-
     /**
      * 参考链接
      */
@@ -344,12 +320,6 @@ public class ProductBaseVo implements Serializable {
     @ExcelProperty(value = "套证价")
     private BigDecimal certificatePrice;
 
-    /**
-     * 售价验证量
-     */
-    @ExcelProperty(value = "售价验证量")
-    private String priceVerificationQuantity;
-
     /**
      * 采购价
      */
@@ -374,24 +344,6 @@ public class ProductBaseVo implements Serializable {
     @ExcelProperty(value = "采购人员")
     private String purchasingPersonnel;
 
-    /**
-     * 旧属性类型
-     */
-    @ExcelProperty(value = "旧属性类型")
-    private String oldAttributeType;
-
-    /**
-     * 录入套数
-     */
-    @ExcelProperty(value = "录入套数")
-    private String entrySetCount;
-
-    /**
-     * 商品主图
-     */
-    @ExcelProperty(value = "商品主图")
-    private String mainImage;
-
     /**
      * 商品详情 - 电脑端
      */
@@ -437,4 +389,29 @@ public class ProductBaseVo implements Serializable {
      */
     private String customDetailsJson;
 
+    /**
+     * 服务保障(逗号分隔的ID列表)
+     */
+    private String serviceGuarantee;
+
+    /**
+     * 商品属性值(JSON字符串)
+     */
+    private String attributesList;
+
+    /**
+     * 销售量/销量人气
+     */
+    private Long salesVolume;
+
+    /**
+     * 定制方式(逗号分隔)
+     */
+    private String customizedStyle;
+
+    /**
+     * 定制工艺(逗号分隔)
+     */
+    private String customizedCraft;
+
 }

+ 100 - 10
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductPoolLinkVo.java

@@ -1,22 +1,20 @@
 package org.dromara.product.domain.vo;
 
-import java.math.BigDecimal;
-import org.dromara.product.domain.ProductPoolLink;
 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 org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.product.domain.ProductPoolLink;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
-
-
 /**
- * 产品池和产品关联视图对象 product_pool_link
+ * 产品池和产品关联视图对象
  *
  * @author LionLi
  * @date 2025-12-11
@@ -56,13 +54,15 @@ public class ProductPoolLinkVo implements Serializable {
     /**
      * 是否在池中:1-是,0-否
      */
-    @ExcelProperty(value = "是否在池中:1-是,0-否")
+    @ExcelProperty(value = "是否在池中", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_yes_no")
     private String isPoolStatus;
 
     /**
      * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
      */
-    @ExcelProperty(value = "产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回")
+    @ExcelProperty(value = "产品审核状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=待提交,1=待审核,2=审核通过,3=审核驳回")
     private String productReviewStatus;
 
     /**
@@ -74,7 +74,8 @@ public class ProductPoolLinkVo implements Serializable {
     /**
      * 是否显示:1=是,0=否
      */
-    @ExcelProperty(value = "是否显示:1=是,0=否")
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_show_hide")
     private String isShow;
 
     /**
@@ -83,5 +84,94 @@ public class ProductPoolLinkVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 商品编号
+     */
+    @ExcelProperty(value = "商品编号")
+    private String productNo;
+
+    /**
+     * 商品名称
+     */
+    @ExcelProperty(value = "商品名称")
+    private String itemName;
+
+    /**
+     * 商品图片URL
+     */
+    @ExcelProperty(value = "商品图片")
+    private String productImageUrl;
+
+    /**
+     * 品牌名称
+     */
+    @ExcelProperty(value = "品牌名称")
+    private String brandName;
+
+    /**
+     * 分类名称
+     */
+    @ExcelProperty(value = "分类名称")
+    private String categoryName;
 
+    /**
+     * 单位名称
+     */
+    @ExcelProperty(value = "单位名称")
+    private String unitName;
+
+    /**
+     * 库存
+     */
+    @ExcelProperty(value = "库存")
+    private Integer stock;
+
+    /**
+     * 市场价
+     */
+    @ExcelProperty(value = "市场价")
+    private BigDecimal marketPrice;
+
+    /**
+     * 平台售价
+     */
+    @ExcelProperty(value = "平台售价")
+    private BigDecimal platformPrice;
+
+    /**
+     * 最低售价
+     */
+    @ExcelProperty(value = "最低售价")
+    private BigDecimal minPrice;
+
+    /**
+     * 采购价
+     */
+    @ExcelProperty(value = "采购价")
+    private BigDecimal purchasePrice;
+
+    /**
+     * 暂估毛利率
+     */
+    @ExcelProperty(value = "暂估毛利率")
+    private BigDecimal grossMargin;
+
+    /**
+     * 商品状态 1=上架,0=下架
+     */
+    @ExcelProperty(value = "商品状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "1=上架,0=下架")
+    private String productStatus;
+
+    /**
+     * 供应商
+     */
+    @ExcelProperty(value = "创建供应商")
+    private String supplier;
 }

+ 17 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductPoolLinkMapper.java

@@ -1,8 +1,15 @@
 package org.dromara.product.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 import org.dromara.product.domain.ProductPoolLink;
+import org.dromara.product.domain.bo.ProductPoolLinkBo;
 import org.dromara.product.domain.vo.ProductPoolLinkVo;
-import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
 
 /**
  * 产品池和产品关联Mapper接口
@@ -12,4 +19,13 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  */
 public interface ProductPoolLinkMapper extends BaseMapperPlus<ProductPoolLink, ProductPoolLinkVo> {
 
+    /**
+     * 查询产品池商品列表
+     */
+    List<ProductPoolLinkVo> selectPoolProductList(@Param("bo") ProductPoolLinkBo bo);
+
+    /**
+     * 分页查询产品池商品列表
+     */
+    Page<ProductPoolLinkVo> selectPoolProductPage(Page<ProductPoolLinkVo> page, @Param("bo") ProductPoolLinkBo bo);
 }

+ 1 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductCategoryService.java

@@ -84,4 +84,5 @@ public interface IProductCategoryService extends IService<ProductCategory>{
     List<Tree<Long>> buildTreeSelect(List<ProductCategoryVo> productCategorys);
 
 
+
 }

+ 21 - 14
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductPoolLinkService.java

@@ -1,11 +1,10 @@
 package org.dromara.product.service;
 
-import com.baomidou.mybatisplus.extension.service.IService;
-import org.dromara.product.domain.ProductPoolLink;
-import org.dromara.product.domain.vo.ProductPoolLinkVo;
-import org.dromara.product.domain.bo.ProductPoolLinkBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.product.domain.vo.ProductPoolLinkVo;
+import org.dromara.product.domain.bo.ProductPoolLinkBo;
+import org.dromara.product.domain.bo.BatchAddProductBo;
 
 import java.util.Collection;
 import java.util.List;
@@ -16,7 +15,7 @@ import java.util.List;
  * @author LionLi
  * @date 2025-12-11
  */
-public interface IProductPoolLinkService extends IService<ProductPoolLink>{
+public interface IProductPoolLinkService {
 
     /**
      * 查询产品池和产品关联
@@ -27,19 +26,19 @@ public interface IProductPoolLinkService extends IService<ProductPoolLink>{
     ProductPoolLinkVo queryById(Long id);
 
     /**
-     * 分页查询产品池和产品关联列表
+     * 查询产品池和产品关联列表
      *
      * @param bo        查询条件
      * @param pageQuery 分页参数
-     * @return 产品池和产品关联分页列表
+     * @return 产品池和产品关联集合
      */
     TableDataInfo<ProductPoolLinkVo> queryPageList(ProductPoolLinkBo bo, PageQuery pageQuery);
 
     /**
-     * 查询符合条件的产品池和产品关联列表
+     * 查询产品池和产品关联列表
      *
      * @param bo 查询条件
-     * @return 产品池和产品关联列表
+     * @return 产品池和产品关联集合
      */
     List<ProductPoolLinkVo> queryList(ProductPoolLinkBo bo);
 
@@ -47,7 +46,7 @@ public interface IProductPoolLinkService extends IService<ProductPoolLink>{
      * 新增产品池和产品关联
      *
      * @param bo 产品池和产品关联
-     * @return 是否新增成功
+     * @return 结果
      */
     Boolean insertByBo(ProductPoolLinkBo bo);
 
@@ -55,16 +54,24 @@ public interface IProductPoolLinkService extends IService<ProductPoolLink>{
      * 修改产品池和产品关联
      *
      * @param bo 产品池和产品关联
-     * @return 是否修改成功
+     * @return 结果
      */
     Boolean updateByBo(ProductPoolLinkBo bo);
 
     /**
      * 校验并批量删除产品池和产品关联信息
      *
-     * @param ids     待删除的主键集合
-     * @param isValid 是否进行有效性校验
-     * @return 是否删除成功
+     * @param ids     主键集合
+     * @param isValid 是否校验,true-删除前校验,false-不校验
+     * @return 结果
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 批量添加商品到商品池
+     *
+     * @param bo 批量添加参数
+     * @return 结果
+     */
+    Boolean batchAddProducts(BatchAddProductBo bo);
 }

+ 84 - 2
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java

@@ -53,14 +53,96 @@ public class ProductBaseServiceImpl  extends ServiceImpl<ProductBaseMapper, Prod
     private final ProductCustomizationMapper customizationMapper;
 
     /**
-     * 查询产品基础信息
+     * 查询产品基础信息(包含扩展信息、价格库存、属性、定制信息)
      *
      * @param id 主键
      * @return 产品基础信息
      */
     @Override
     public ProductBaseVo queryById(Long id){
-        return baseMapper.selectVoById(id);
+        // 1. 查询基础信息
+        ProductBaseVo vo = baseMapper.selectVoById(id);
+        if (vo == null) {
+            return null;
+        }
+
+        // 2. 查询并填充扩展信息(product_extend表)
+        LambdaQueryWrapper<ProductExtend> extendWrapper = Wrappers.lambdaQuery();
+        extendWrapper.eq(ProductExtend::getProductId, id);
+        ProductExtend extend = extendMapper.selectOne(extendWrapper);
+        if (extend != null) {
+            vo.setInvoiceName(extend.getInvoiceName());
+            vo.setInvoiceSpec(extend.getInvoiceSpecs());
+            vo.setUpcBarcode(extend.getBarCoding());
+            vo.setWeight(extend.getProductWeight());
+            vo.setWeightUnit(extend.getWeightUnit());
+            vo.setVolume(extend.getProductVolume());
+            vo.setVolumeUnit(extend.getVolumeUnit());
+            vo.setAfterSalesService(extend.getAfterSalesService());
+            vo.setServiceGuarantee(extend.getServiceGuarantee());
+            vo.setFreeInstallation(extend.getIsInstallService());
+            vo.setReferenceLink(extend.getReferenceLink());
+            vo.setSalesVolume(extend.getSalesVolume());
+            vo.setCustomizable("1".equals(extend.getIsCustomize()));
+            vo.setCustomDescription(extend.getCustomDescription());
+        }
+
+        // 3. 查询并填充价格库存信息(product_price_inventory表)
+        ProductPriceInventory priceInventory = priceInventoryMapper.selectById(id);
+        if (priceInventory != null) {
+            vo.setMarketPrice(priceInventory.getMarketPrice());
+            vo.setMemberPrice(priceInventory.getMemberPrice());
+            vo.setMinSellingPrice(priceInventory.getMinSellingPrice());
+            vo.setPurchasingPrice(priceInventory.getPurchasingPrice());
+            vo.setMidRangePrice(priceInventory.getMarketPrice());
+            vo.setStandardPrice(priceInventory.getMemberPrice());
+            vo.setCertificatePrice(priceInventory.getMinSellingPrice());
+            vo.setPurchasePrice(priceInventory.getPurchasingPrice());
+            vo.setEstimatedPurchasePrice(priceInventory.getMaxPurchasePrice());
+            vo.setTaxRate(priceInventory.getTaxRate());
+            vo.setCurrency(priceInventory.getCurrency());
+            vo.setMinOrderQuantity(priceInventory.getMinOrderQuantity());
+        }
+
+        // 4. 查询并填充商品属性(product_classification表)
+        LambdaQueryWrapper<ProductClassification> classificationWrapper = Wrappers.lambdaQuery();
+        classificationWrapper.eq(ProductClassification::getProductId, id);
+        ProductClassification classification = classificationMapper.selectOne(classificationWrapper);
+        if (classification != null) {
+            vo.setAttributesList(classification.getAttributesList());
+        }
+
+        // 5. 查询并填充定制信息(product_customization表)
+        LambdaQueryWrapper<ProductCustomization> customizationWrapper = Wrappers.lambdaQuery();
+        customizationWrapper.eq(ProductCustomization::getProductId, id);
+        List<ProductCustomization> customizations = customizationMapper.selectList(customizationWrapper);
+        if (customizations != null && !customizations.isEmpty()) {
+            // 提取定制方式和工艺(去重)
+            StringBuilder styles = new StringBuilder();
+            StringBuilder crafts = new StringBuilder();
+            for (ProductCustomization custom : customizations) {
+                if (StringUtils.isNotBlank(custom.getCustomizedStyle())) {
+                    if (styles.length() > 0) styles.append(",");
+                    styles.append(custom.getCustomizedStyle());
+                }
+                if (StringUtils.isNotBlank(custom.getCustomizedCraft())) {
+                    if (crafts.length() > 0) crafts.append(",");
+                    crafts.append(custom.getCustomizedCraft());
+                }
+            }
+            vo.setCustomizedStyle(styles.toString());
+            vo.setCustomizedCraft(crafts.toString());
+            
+            // 将定制详情列表转换为JSON字符串
+            try {
+                ObjectMapper objectMapper = new ObjectMapper();
+                vo.setCustomDetailsJson(objectMapper.writeValueAsString(customizations));
+            } catch (Exception e) {
+                log.error("转换定制详情为JSON失败: {}", e.getMessage());
+            }
+        }
+
+        return vo;
     }
 
     /**

+ 1 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductCategoryServiceImpl.java

@@ -14,6 +14,7 @@ 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.common.mybatis.helper.DataBaseHelper;
 import org.springframework.stereotype.Service;
 import org.dromara.product.domain.bo.ProductCategoryBo;
 import org.dromara.product.domain.vo.ProductCategoryVo;

+ 73 - 48
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductPoolLinkServiceImpl.java

@@ -1,25 +1,29 @@
 package org.dromara.product.service.impl;
 
-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 cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.product.domain.ProductPoolLink;
+import org.dromara.product.domain.ProductBase;
+import org.dromara.product.domain.bo.BatchAddProductBo;
 import org.dromara.product.domain.bo.ProductPoolLinkBo;
 import org.dromara.product.domain.vo.ProductPoolLinkVo;
-import org.dromara.product.domain.ProductPoolLink;
 import org.dromara.product.mapper.ProductPoolLinkMapper;
+import org.dromara.product.mapper.ProductBaseMapper;
 import org.dromara.product.service.IProductPoolLinkService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Collection;
 
 /**
  * 产品池和产品关联Service业务层处理
@@ -27,70 +31,64 @@ import java.util.Collection;
  * @author LionLi
  * @date 2025-12-11
  */
-@Slf4j
 @RequiredArgsConstructor
 @Service
-public class ProductPoolLinkServiceImpl  extends ServiceImpl<ProductPoolLinkMapper, ProductPoolLink> implements IProductPoolLinkService {
+public class ProductPoolLinkServiceImpl implements IProductPoolLinkService {
 
     private final ProductPoolLinkMapper baseMapper;
+    private final ProductBaseMapper productBaseMapper;
 
     /**
      * 查询产品池和产品关联
-     *
-     * @param id 主键
-     * @return 产品池和产品关联
      */
     @Override
-    public ProductPoolLinkVo queryById(Long id){
+    public ProductPoolLinkVo queryById(Long id) {
         return baseMapper.selectVoById(id);
     }
 
     /**
-     * 分页查询产品池和产品关联列表
-     *
-     * @param bo        查询条件
-     * @param pageQuery 分页参数
-     * @return 产品池和产品关联分页列表
+     * 查询产品池和产品关联列表
      */
     @Override
     public TableDataInfo<ProductPoolLinkVo> queryPageList(ProductPoolLinkBo bo, PageQuery pageQuery) {
-        LambdaQueryWrapper<ProductPoolLink> lqw = buildQueryWrapper(bo);
-        Page<ProductPoolLinkVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        Page<ProductPoolLinkVo> page = pageQuery.build();
+        Page<ProductPoolLinkVo> result = baseMapper.selectPoolProductPage(page, bo);
         return TableDataInfo.build(result);
     }
 
     /**
-     * 查询符合条件的产品池和产品关联列表
-     *
-     * @param bo 查询条件
-     * @return 产品池和产品关联列表
+     * 查询产品池和产品关联列表
      */
     @Override
     public List<ProductPoolLinkVo> queryList(ProductPoolLinkBo bo) {
-        LambdaQueryWrapper<ProductPoolLink> lqw = buildQueryWrapper(bo);
-        return baseMapper.selectVoList(lqw);
+        return baseMapper.selectPoolProductList(bo);
     }
 
     private LambdaQueryWrapper<ProductPoolLink> buildQueryWrapper(ProductPoolLinkBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<ProductPoolLink> lqw = Wrappers.lambdaQuery();
-        lqw.orderByAsc(ProductPoolLink::getId);
+
+        // 基础查询条件
         lqw.eq(bo.getPoolId() != null, ProductPoolLink::getPoolId, bo.getPoolId());
         lqw.eq(bo.getProductId() != null, ProductPoolLink::getProductId, bo.getProductId());
-        lqw.eq(bo.getProductPrice() != null, ProductPoolLink::getProductPrice, bo.getProductPrice());
         lqw.eq(StringUtils.isNotBlank(bo.getIsPoolStatus()), ProductPoolLink::getIsPoolStatus, bo.getIsPoolStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getProductReviewStatus()), ProductPoolLink::getProductReviewStatus, bo.getProductReviewStatus());
-        lqw.eq(StringUtils.isNotBlank(bo.getReviewReason()), ProductPoolLink::getReviewReason, bo.getReviewReason());
         lqw.eq(StringUtils.isNotBlank(bo.getIsShow()), ProductPoolLink::getIsShow, bo.getIsShow());
-        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProductPoolLink::getPlatformCode, bo.getPlatformCode());
+
+        // 时间范围查询(入池时间)
+        if (params != null) {
+            Object beginTime = params.get("beginCreateTime");
+            Object endTime = params.get("endCreateTime");
+            if (ObjectUtil.isNotNull(beginTime) && ObjectUtil.isNotNull(endTime)) {
+                lqw.between(ProductPoolLink::getCreateTime, beginTime, endTime);
+            }
+        }
+
         return lqw;
     }
 
     /**
      * 新增产品池和产品关联
-     *
-     * @param bo 产品池和产品关联
-     * @return 是否新增成功
      */
     @Override
     public Boolean insertByBo(ProductPoolLinkBo bo) {
@@ -105,9 +103,6 @@ public class ProductPoolLinkServiceImpl  extends ServiceImpl<ProductPoolLinkMapp
 
     /**
      * 修改产品池和产品关联
-     *
-     * @param bo 产品池和产品关联
-     * @return 是否修改成功
      */
     @Override
     public Boolean updateByBo(ProductPoolLinkBo bo) {
@@ -119,22 +114,52 @@ public class ProductPoolLinkServiceImpl  extends ServiceImpl<ProductPoolLinkMapp
     /**
      * 保存前的数据校验
      */
-    private void validEntityBeforeSave(ProductPoolLink entity){
-        //TODO 做一些数据校验,如唯一约束
+    private void validEntityBeforeSave(ProductPoolLink entity) {
+        // TODO 做一些数据校验,如唯一约束
     }
 
     /**
-     * 校验并批量删除产品池和产品关联信息
-     *
-     * @param ids     待删除的主键集合
-     * @param isValid 是否进行有效性校验
-     * @return 是否删除成功
+     * 批量删除产品池和产品关联
      */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if(isValid){
-            //TODO 做一些业务上的校验,判断是否需要校验
+        if (isValid) {
+            // TODO 做一些业务上的校验,判断是否需要校验
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    /**
+     * 批量添加商品到商品池
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean batchAddProducts(BatchAddProductBo bo) {
+        if (ObjectUtil.isNull(bo.getPoolId()) || ObjectUtil.isEmpty(bo.getProducts())) {
+            return false;
+        }
+
+        // 批量插入商品池关联记录
+        for (BatchAddProductBo.ProductItem product : bo.getProducts()) {
+            ProductPoolLink poolLink = new ProductPoolLink();
+            poolLink.setPoolId(bo.getPoolId());
+            poolLink.setProductId(product.getProductId());
+            poolLink.setProductPrice(product.getAgreementPrice());
+            poolLink.setIsPoolStatus("1"); // 1-在池中
+            poolLink.setIsShow("1"); // 1-显示
+            poolLink.setProductReviewStatus("0"); // 0-待提交
+
+            // 检查是否已存在
+            LambdaQueryWrapper<ProductPoolLink> wrapper = Wrappers.lambdaQuery();
+            wrapper.eq(ProductPoolLink::getPoolId, bo.getPoolId())
+                   .eq(ProductPoolLink::getProductId, product.getProductId());
+
+            Long count = baseMapper.selectCount(wrapper);
+            if (count == 0) {
+                baseMapper.insert(poolLink);
+            }
+        }
+
+        return true;
+    }
 }

+ 165 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductPoolLinkMapper.xml

@@ -4,4 +4,169 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="org.dromara.product.mapper.ProductPoolLinkMapper">
 
+    <resultMap type="org.dromara.product.domain.vo.ProductPoolLinkVo" id="ProductPoolLinkResult">
+        <result property="id"    column="id"    />
+        <result property="poolId"    column="pool_id"    />
+        <result property="productId"    column="product_id"    />
+        <result property="productPrice"    column="product_price"    />
+        <result property="isPoolStatus"    column="is_pool_status"    />
+        <result property="productReviewStatus"    column="product_review_status"    />
+        <result property="reviewReason"    column="review_reason"    />
+        <result property="isShow"    column="is_show"    />
+        <result property="remark"    column="remark"    />
+        <result property="createTime"    column="create_time"    />
+
+        <!-- 商品基础信息 -->
+        <result property="productNo"    column="product_no"    />
+        <result property="itemName"    column="item_name"    />
+        <result property="productImageUrl"    column="product_image_url"    />
+        <result property="brandName"    column="brand_name"    />
+        <result property="categoryName"    column="category_name"    />
+        <result property="unitName"    column="unit_name"    />
+        <result property="productStatus"    column="product_status"    />
+
+        <!-- 价格库存信息 -->
+        <result property="stock"    column="stock"    />
+        <result property="marketPrice"    column="market_price"    />
+        <result property="platformPrice"    column="platform_price"    />
+        <result property="minPrice"    column="min_price"    />
+        <result property="purchasePrice"    column="purchase_price"    />
+        <result property="grossMargin"    column="gross_margin"    />
+
+        <result property="supplier"    column="supplier"    />
+    </resultMap>
+
+    <!-- 基础查询列 -->
+    <sql id="selectProductPoolLinkVo">
+        select
+            ppl.id,
+            ppl.pool_id,
+            ppl.product_id,
+            ppl.product_price,
+            ppl.is_pool_status,
+            ppl.product_review_status,
+            ppl.review_reason,
+            ppl.is_show,
+            ppl.remark,
+            ppl.create_time,
+
+            pb.product_no,
+            pb.item_name,
+            pb.product_image_url,
+            pb.product_status,
+            pb.brand_id,
+            pb.bottom_category_id,
+
+            pbr.brand_name,
+            pc.category_name,
+            pu.unit_name,
+
+            ppi.total_inventory as  stock,
+            ppi.market_price,
+            ppi.member_price AS platform_price,
+            ppi.min_selling_price AS min_price,
+
+            ppl.product_price AS purchase_price,
+            ppl.create_by as supplier
+
+        from product_pool_link ppl
+        left join product_base pb on ppl.product_id = pb.id
+        left join product_brand pbr on pb.brand_id = pbr.id
+        left join product_category pc on pb.bottom_category_id = pc.id
+        left join product_unit pu on pb.unit_id = pu.id
+        left join product_price_inventory ppi on pb.id = ppi.product_id
+    </sql>
+
+    <!-- 查询产品池商品列表 -->
+    <select id="selectPoolProductList" resultMap="ProductPoolLinkResult">
+        <include refid="selectProductPoolLinkVo"/>
+        <where>
+            <!-- 池ID -->
+            <if test="bo.poolId != null">
+                AND ppl.pool_id = #{bo.poolId}
+            </if>
+            <!-- 商品编号 -->
+            <if test="bo.productNo != null and bo.productNo != ''">
+                AND pb.product_no like concat('%', #{bo.productNo}, '%')
+            </if>
+            <!-- 商品名称 -->
+            <if test="bo.itemName != null and bo.itemName != ''">
+                AND pb.item_name like concat('%', #{bo.itemName}, '%')
+            </if>
+            <!-- 品牌ID -->
+            <if test="bo.brandId != null">
+                AND pb.brand_id = #{bo.brandId}
+            </if>
+            <!-- 分类ID -->
+            <if test="bo.categoryId != null">
+                AND pb.bottom_category_id = #{bo.categoryId}
+            </if>
+            <!-- 商品状态 -->
+            <if test="bo.productStatus != null and bo.productStatus != ''">
+                AND pb.product_status = #{bo.productStatus}
+            </if>
+            <!-- 供应商 -->
+            <if test="bo.supplier != null and bo.supplier != ''">
+                AND ppl.create_by like concat('%', #{bo.supplier}, '%')
+            </if>
+            <!-- 入池时间范围 -->
+            <if test="bo.params != null and bo.params.beginCreateTime != null and bo.params.beginCreateTime != ''">
+                AND date_format(ppl.create_time,'%Y-%m-%d') &gt;= date_format(#{bo.params.beginCreateTime},'%Y-%m-%d')
+            </if>
+            <if test="bo.params != null and bo.params.endCreateTime != null and bo.params.endCreateTime != ''">
+                AND date_format(ppl.create_time,'%Y-%m-%d') &lt;= date_format(#{bo.params.endCreateTime},'%Y-%m-%d')
+            </if>
+        </where>
+        order by ppl.create_time desc
+    </select>
+
+    <!-- 分页查询产品池商品列表 -->
+    <select id="selectPoolProductPage" resultMap="ProductPoolLinkResult">
+        <include refid="selectProductPoolLinkVo"/>
+        <where>
+            <!-- 池ID -->
+            <if test="bo.poolId != null">
+                AND ppl.pool_id = #{bo.poolId}
+            </if>
+            <!-- 商品编号 -->
+            <if test="bo.productNo != null and bo.productNo != ''">
+                AND pb.product_no like concat('%', #{bo.productNo}, '%')
+            </if>
+            <!-- 商品名称 -->
+            <if test="bo.itemName != null and bo.itemName != ''">
+                AND pb.item_name like concat('%', #{bo.itemName}, '%')
+            </if>
+            <!-- 品牌ID -->
+            <if test="bo.brandId != null">
+                AND pb.brand_id = #{bo.brandId}
+            </if>
+            <!-- 分类ID -->
+            <if test="bo.categoryId != null">
+                AND pb.bottom_category_id = #{bo.categoryId}
+            </if>
+            <!-- 商品状态 -->
+            <if test="bo.productStatus != null and bo.productStatus != ''">
+                AND pb.product_status = #{bo.productStatus}
+            </if>
+            <!-- 供应商 -->
+            <if test="bo.supplier != null and bo.supplier != ''">
+                AND ppl.create_by like concat('%', #{bo.supplier}, '%')
+            </if>
+            <!-- 入池时间范围 -->
+            <if test="bo.params != null and bo.params.beginCreateTime != null and bo.params.beginCreateTime != ''">
+                AND date_format(ppl.create_time,'%Y-%m-%d') &gt;= date_format(#{bo.params.beginCreateTime},'%Y-%m-%d')
+            </if>
+            <if test="bo.params != null and bo.params.endCreateTime != null and bo.params.endCreateTime != ''">
+                AND date_format(ppl.create_time,'%Y-%m-%d') &lt;= date_format(#{bo.params.endCreateTime},'%Y-%m-%d')
+            </if>
+        </where>
+        order by ppl.create_time desc
+    </select>
+
+    <!-- 根据ID查询 -->
+    <select id="selectVoById" resultMap="ProductPoolLinkResult">
+        <include refid="selectProductPoolLinkVo"/>
+        where ppl.id = #{id}
+    </select>
+
 </mapper>

+ 2 - 1
ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/FileCategory.java

@@ -8,6 +8,7 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.common.tenant.core.TenantEntityWithoutPlatformCode;
 import org.dromara.resource.domain.vo.FileCategoryVo;
 
 import java.io.Serial;
@@ -22,7 +23,7 @@ import java.io.Serial;
 @EqualsAndHashCode(callSuper = true)
 @TableName("sys_file_category")
 @AutoMapper(target = FileCategoryVo.class)
-public class FileCategory extends TenantEntity {
+public class FileCategory extends TenantEntityWithoutPlatformCode {
 
     @Serial
     private static final long serialVersionUID = 1L;

+ 2 - 1
ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/FileInfo.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.common.tenant.core.TenantEntityWithoutPlatformCode;
 
 import java.io.Serial;
 
@@ -19,7 +20,7 @@ import java.io.Serial;
 @Data
 @EqualsAndHashCode(callSuper = true)
 @TableName("sys_file_info")
-public class FileInfo extends TenantEntity {
+public class FileInfo extends TenantEntityWithoutPlatformCode {
 
     @Serial
     private static final long serialVersionUID = 1L;