Browse Source

feat(product): 添加多个产品相关服务接口

- 新增产品售后服务项服务接口
- 新增产品关联服务接口
- 新增产品属性定义服务接口
- 新增产品基础信息服务接口
- 新增产品黑名单服务接口
- 新增产品品牌信息服务接口
- 新增产品分类服务接口
- 新增产品属性关联服务接口
- 新增产品定制信息服务接口
- 新增产品保障项服务接口
- 新增产品扩展属性服务接口
- 新增产品标签信息服务接口
- 新增产品池和产品关联服务接口
- 新增产品池服务接口
- 新增产品价格与库存信息服务接口
- 新增项目方案关联服务接口
- 新增产品解决方案/项目方案服务接口
- 新增产品推荐关联服务接口
- 新增产品推荐位配置服务接口
肖路 1 ngày trước cách đây
mục cha
commit
44e921914d
100 tập tin đã thay đổi với 9138 bổ sung0 xóa
  1. 2 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/RuoyiProductApplication.java
  2. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductAfterSalesController.java
  3. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductAssociateController.java
  4. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductAttributesController.java
  5. 180 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBaseController.java
  6. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBlacklistController.java
  7. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBrandController.java
  8. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductCategoryController.java
  9. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductClassificationController.java
  10. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductCustomizationController.java
  11. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductEnsureController.java
  12. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductLableController.java
  13. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductPoolController.java
  14. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductPoolLinkController.java
  15. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductProgramController.java
  16. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductProgramLinkController.java
  17. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductRecommendController.java
  18. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductRecommendLinkController.java
  19. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductSpecsController.java
  20. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductTaxrateController.java
  21. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductUnitController.java
  22. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductVolumeUnitController.java
  23. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductWeightUnitController.java
  24. 52 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductAfterSales.java
  25. 62 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductAssociate.java
  26. 82 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductAttributes.java
  27. 133 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductBase.java
  28. 57 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductBlacklist.java
  29. 136 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductBrand.java
  30. 153 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductCategory.java
  31. 57 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductClassification.java
  32. 83 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductCustomization.java
  33. 52 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductEnsure.java
  34. 239 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductExtend.java
  35. 57 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductLable.java
  36. 67 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductPool.java
  37. 78 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductPoolLink.java
  38. 98 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductPriceInventory.java
  39. 99 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductProgram.java
  40. 52 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductProgramLink.java
  41. 67 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductRecommend.java
  42. 52 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductRecommendLink.java
  43. 57 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductSpecs.java
  44. 68 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductTaxrate.java
  45. 62 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductUnit.java
  46. 52 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductVolumeUnit.java
  47. 52 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductWeightUnit.java
  48. 47 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductAfterSalesBo.java
  49. 58 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductAssociateBo.java
  50. 80 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductAttributesBo.java
  51. 333 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBaseBo.java
  52. 52 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBlacklistBo.java
  53. 144 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBrandBo.java
  54. 166 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductCategoryBo.java
  55. 53 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductClassificationBo.java
  56. 84 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductCustomizationBo.java
  57. 47 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductEnsureBo.java
  58. 269 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductExtendBo.java
  59. 52 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductLableBo.java
  60. 61 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPoolBo.java
  61. 75 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPoolLinkBo.java
  62. 98 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPriceInventoryBo.java
  63. 95 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductProgramBo.java
  64. 47 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductProgramLinkBo.java
  65. 60 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductRecommendBo.java
  66. 47 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductRecommendLinkBo.java
  67. 52 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductSpecsBo.java
  68. 66 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductTaxrateBo.java
  69. 59 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductUnitBo.java
  70. 47 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductVolumeUnitBo.java
  71. 47 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductWeightUnitBo.java
  72. 58 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductAfterSalesVo.java
  73. 69 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductAssociateVo.java
  74. 95 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductAttributesVo.java
  75. 440 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseVo.java
  76. 65 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBlacklistVo.java
  77. 171 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBrandVo.java
  78. 183 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductCategoryVo.java
  79. 63 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductClassificationVo.java
  80. 96 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductCustomizationVo.java
  81. 58 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductEnsureVo.java
  82. 280 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductExtendVo.java
  83. 65 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductLableVo.java
  84. 87 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductPoolLinkVo.java
  85. 74 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductPoolVo.java
  86. 111 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductPriceInventoryVo.java
  87. 56 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductProgramLinkVo.java
  88. 122 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductProgramVo.java
  89. 56 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductRecommendLinkVo.java
  90. 77 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductRecommendVo.java
  91. 63 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductSpecsVo.java
  92. 75 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductTaxrateVo.java
  93. 69 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductUnitVo.java
  94. 58 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductVolumeUnitVo.java
  95. 58 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductWeightUnitVo.java
  96. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductAfterSalesMapper.java
  97. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductAssociateMapper.java
  98. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductAttributesMapper.java
  99. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductBaseMapper.java
  100. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductBlacklistMapper.java

+ 2 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/RuoyiProductApplication.java

@@ -4,6 +4,8 @@ import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
 
+import java.math.BigDecimal;
+
 @SpringBootApplication
 public class RuoyiProductApplication {
 

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

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

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

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

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

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

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

@@ -0,0 +1,180 @@
+package org.dromara.product.controller;
+
+import java.util.List;
+
+import cn.hutool.core.lang.tree.Tree;
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.product.domain.bo.*;
+import org.dromara.product.domain.vo.*;
+import org.dromara.product.service.*;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 产品基础信息
+ * 前端访问路由地址为:/product/base
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/base")
+public class ProductBaseController extends BaseController {
+
+    private final IProductBaseService productBaseService;
+
+    private final IProductCategoryService productCategoryService;
+
+    private final IProductBrandService productBrandService;
+
+    private final IProductAttributesService productAttributesService;
+
+    private final IProductEnsureService productEnsureService;
+
+    private final IProductAfterSalesService productAfterSalesService;
+
+    private final IProductUnitService productUnitService;
+
+    /**
+     * 查询产品基础信息列表
+     */
+    @SaCheckPermission("product:base:list")
+    @GetMapping("/list")
+    public TableDataInfo<ProductBaseVo> list(ProductBaseBo bo, PageQuery pageQuery) {
+        return productBaseService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出产品基础信息列表
+     */
+    @SaCheckPermission("product:base:export")
+    @Log(title = "产品基础信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ProductBaseBo bo, HttpServletResponse response) {
+        List<ProductBaseVo> list = productBaseService.queryList(bo);
+        ExcelUtil.exportExcel(list, "产品基础信息", ProductBaseVo.class, response);
+    }
+
+    /**
+     * 获取产品基础信息详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("product:base:query")
+    @GetMapping("/{id}")
+    public R<ProductBaseVo> getInfo(@NotNull(message = "主键不能为空")
+                                    @PathVariable("id") Long id) {
+        return R.ok(productBaseService.queryById(id));
+    }
+
+    /**
+     * 新增产品基础信息
+     */
+    @SaCheckPermission("product:base:add")
+    @Log(title = "产品基础信息", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ProductBaseBo bo) {
+        return toAjax(productBaseService.insertByBo(bo));
+    }
+
+    /**
+     * 修改产品基础信息
+     */
+    @SaCheckPermission("product:base:edit")
+    @Log(title = "产品基础信息", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProductBaseBo bo) {
+        return toAjax(productBaseService.updateByBo(bo));
+    }
+
+    /**
+     * 删除产品基础信息
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("product:base:remove")
+    @Log(title = "产品基础信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(productBaseService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 获取分类树列表
+     */
+    @GetMapping("/categoryTree")
+    public R<List<Tree<Long>>> categoryTree(ProductCategoryBo bo) {
+        return R.ok(productCategoryService.selectCategoryTreeList(bo));
+    }
+
+
+    /**
+     * 获取分类列表
+     */
+    @GetMapping("/categoryList")
+    public R<List<ProductCategoryVo>> categoryList(ProductCategoryBo bo) {
+        return R.ok(productCategoryService.queryList(bo));
+    }
+
+    /**
+     * 获取品牌列表
+     */
+    @GetMapping("/brandList")
+    public R<List<ProductBrandVo>> brandList(ProductBrandBo bo) {
+        return R.ok(productBrandService.queryList(bo));
+    }
+
+    /**
+     * 获取当前分类下的商品属性列表
+     */
+    @GetMapping("/getProductAttributeList/{categoryId}")
+    public R<List<ProductAttributesVo>> getProductAttributeList(@PathVariable Long categoryId) {
+        ProductAttributesBo productAttributesBo = new ProductAttributesBo();
+        productAttributesBo.setCategoryId(categoryId);
+        return R.ok(productAttributesService.queryList(productAttributesBo));
+    }
+
+    /**
+    * 获取服务保障信息列表
+    * */
+    @GetMapping("/getServiceList")
+    public R<List<ProductEnsureVo>> getServiceList(ProductEnsureBo bo) {
+        return R.ok(productEnsureService.queryList(bo));
+    }
+
+    /**
+    * 获取售后服务信息列表
+    * */
+    @GetMapping("/getAfterSalesList")
+    public R<List<ProductAfterSalesVo>> getAfterSalesList(ProductAfterSalesBo bo) {
+        return R.ok(productAfterSalesService.queryList(bo));
+    }
+
+    /**
+    * 获取单位列表
+    * */
+    @GetMapping("/getUnitList")
+    public R<List<ProductUnitVo>> getUnitList(ProductUnitBo bo) {
+        return R.ok(productUnitService.queryList(bo));
+    }
+
+
+}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@@ -0,0 +1,106 @@
+package org.dromara.product.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.product.domain.vo.ProductPoolLinkVo;
+import org.dromara.product.domain.bo.ProductPoolLinkBo;
+import org.dromara.product.service.IProductPoolLinkService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 产品池和产品关联
+ * 前端访问路由地址为:/product/poolLink
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/poolLink")
+public class ProductPoolLinkController extends BaseController {
+
+    private final IProductPoolLinkService productPoolLinkService;
+
+    /**
+     * 查询产品池和产品关联列表
+     */
+    @SaCheckPermission("product:poolLink:list")
+    @GetMapping("/list")
+    public TableDataInfo<ProductPoolLinkVo> list(ProductPoolLinkBo bo, PageQuery pageQuery) {
+        return productPoolLinkService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出产品池和产品关联列表
+     */
+    @SaCheckPermission("product:poolLink:export")
+    @Log(title = "产品池和产品关联", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ProductPoolLinkBo bo, HttpServletResponse response) {
+        List<ProductPoolLinkVo> list = productPoolLinkService.queryList(bo);
+        ExcelUtil.exportExcel(list, "产品池和产品关联", ProductPoolLinkVo.class, response);
+    }
+
+    /**
+     * 获取产品池和产品关联详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("product:poolLink:query")
+    @GetMapping("/{id}")
+    public R<ProductPoolLinkVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(productPoolLinkService.queryById(id));
+    }
+
+    /**
+     * 新增产品池和产品关联
+     */
+    @SaCheckPermission("product:poolLink:add")
+    @Log(title = "产品池和产品关联", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ProductPoolLinkBo bo) {
+        return toAjax(productPoolLinkService.insertByBo(bo));
+    }
+
+    /**
+     * 修改产品池和产品关联
+     */
+    @SaCheckPermission("product:poolLink:edit")
+    @Log(title = "产品池和产品关联", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProductPoolLinkBo bo) {
+        return toAjax(productPoolLinkService.updateByBo(bo));
+    }
+
+    /**
+     * 删除产品池和产品关联
+     *
+     * @param ids 主键串
+     */
+    @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));
+    }
+}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+ 52 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductAfterSales.java

@@ -0,0 +1,52 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品售后服务项对象 product_after_sales
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_after_sales")
+public class ProductAfterSales extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 售后服务项目(如:保修、退换货、技术支持等)
+     */
+    private String afterSalesItems;
+
+    /**
+     * 数据来源(如:系统录入、接口同步等)
+     */
+    private String dataSource;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 62 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductAssociate.java

@@ -0,0 +1,62 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品关联对象 product_associate
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_associate")
+public class ProductAssociate extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 主产品id
+     */
+    private Long productId;
+
+    /**
+     * 关联产品编号列表(如:用逗号分隔的产品编号)
+     */
+    private String productIds;
+
+    /**
+     * 是否单向关联:0=双向,1=单向
+     */
+    private String isUnidirectional;
+
+    /**
+     * 关联标题/展示名称
+     */
+    private String relatedTitle;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 82 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductAttributes.java

@@ -0,0 +1,82 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品属性定义(用于动态属性配置)对象 product_attributes
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_attributes")
+public class ProductAttributes extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联的产品分类id
+     */
+    private Long categoryId;
+
+    /**
+     * 属性编码(用于系统识别)
+     */
+    private String productAttributesCode;
+
+    /**
+     * 属性显示名称
+     */
+    private String productAttributesName;
+
+    /**
+     * 是否可选:1=是,0=否
+     */
+    private String isOptional;
+
+    /**
+     * 属性录入方式(1=下拉,2=文本输入,3=多选等)
+     */
+    private String entryMethod;
+
+    /**
+     * 是否用于商品筛选:1=是,0=否
+     */
+    private String isFilter;
+
+    /**
+     * 预定义属性值列表(逗号分隔或JSON)
+     */
+    private String attributesList;
+
+    /**
+     * 是否必填: 1=是, 0=否
+     */
+    private String required;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 133 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductBase.java

@@ -0,0 +1,133 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 产品基础信息对象 product_base
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_base")
+public class ProductBase extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 产品编号
+     */
+    private String productNo;
+
+    /**
+     * 项目名称
+     */
+    private String itemName;
+
+    /**
+     * 品牌id
+     */
+    private Long brandId;
+
+    /**
+     * 顶级分类id
+     */
+    private Long topCategoryId;
+
+    /**
+     * 中级分类id
+     */
+    private Long mediumCategoryId;
+
+    /**
+     * 底层分类id
+     */
+    private Long bottomCategoryId;
+
+    /**
+     * 单位id
+     */
+    private String unitId;
+
+    /**
+     * 产品图片URL
+     */
+    private String productImage;
+
+    /**
+     * 是否自营(1=是,0=否)
+     */
+    private String isSelf;
+
+    /**
+     * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+     */
+    private String productReviewStatus;
+
+    /**
+     * 首页推荐:1=推荐,0=不推荐
+     */
+    private String homeRecommended;
+
+    /**
+     * 分类推荐:1=推荐,0=不推荐
+     */
+    private String categoryRecommendation;
+
+    /**
+     * 购物车推荐:1=推荐,0=不推荐
+     */
+    private String cartRecommendation;
+
+    /**
+     * 推荐产品顺序
+     */
+    private Long recommendedProductOrder;
+
+    /**
+     * 是否热门:1=是,0=否
+     */
+    private String isPopular;
+
+    /**
+     * 是否新品:1=是,0=否
+     */
+    private String isNew;
+
+    /**
+     * 商品状态:1=上架,0=下架等
+     */
+    private String productStatus;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductBlacklist.java

@@ -0,0 +1,57 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品黑名单对象 product_blacklist
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_blacklist")
+public class ProductBlacklist extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 客户id(可为空,表示全局黑名单)
+     */
+    private Long customerId;
+
+    /**
+     * 产品id(可为空,表示该客户对整个分类禁用)
+     */
+    private Long productId;
+
+    /**
+     * 产品分类id(必填)
+     */
+    private Long productCategoryId;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 136 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductBrand.java

@@ -0,0 +1,136 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 产品品牌信息对象 product_brand
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_brand")
+public class ProductBrand extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 品牌编号(唯一标识)
+     */
+    private String brandNo;
+
+    /**
+     * 品牌中文名称
+     */
+    private String brandName;
+
+    /**
+     * 品牌首字母缩写(如拼音首字母)
+     */
+    private String brandInitials;
+
+    /**
+     * 品牌英文名称
+     */
+    private String brandEnglishName;
+
+    /**
+     * 推荐值(数值越大越靠前)
+     */
+    private Long recommendValue;
+
+    /**
+     * 品牌Logo图片路径或URL
+     */
+    private String brandLogo;
+
+    /**
+     * 品牌标题(用于展示)
+     */
+    private String brandTitle;
+
+    /**
+     * 品牌大图(横幅/封面图)
+     */
+    private String brandBigImage;
+
+    /**
+     * 品牌故事(简介文本)
+     */
+    private String brandStory;
+
+    /**
+     * 是否显示(1=显示,0=隐藏)
+     */
+    private Long isShow;
+
+    /**
+     * 品牌注册人
+     */
+    private String brandRegistrant;
+
+    /**
+     * 许可证编号
+     */
+    private String license;
+
+    /**
+     * 注册证书编号
+     */
+    private String registrationCertificate;
+
+    /**
+     * 证书/许可过期时间
+     */
+    private Date expireTime;
+
+    /**
+     * 品牌描述(较长文本)
+     */
+    private String brandDescribe;
+
+    /**
+     * 展示位置(如首页、分类页等)
+     */
+    private String position;
+
+    /**
+     * 关注度/收藏数(默认为0)
+     */
+    private Long care;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 153 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductCategory.java

@@ -0,0 +1,153 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 产品分类对象 product_category
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_category")
+public class ProductCategory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+    private String categoryNo;
+
+    /**
+     * 分类名称
+     */
+    private String categoryName;
+
+    /**
+     * 父级分类ID
+     */
+    private Long parentId;
+
+    /**
+     * 祖籍列表
+     */
+    private String ancestors;
+
+    /**
+     * 分类层级(1=一级,2=二级, 3三级)
+     */
+    private Long classLevel;
+
+    /**
+     * 是否显示(1=显示,0=隐藏)
+     */
+    private Long isShow;
+
+    /**
+     * 是否在GPS中显示
+     */
+    private Long isShowGps;
+
+    /**
+     * 折扣率(可能为JSON或文本)
+     */
+    private BigDecimal discountRate;
+
+    /**
+     * 拼音码(用于快速检索)
+     */
+    private String pyCode;
+
+    /**
+     * 分类描述
+     */
+    private String classDescription;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 自定义标签1
+     */
+    private String oneLable1;
+
+    /**
+     * 自定义标签2
+     */
+    private String oneLable2;
+
+    /**
+     * 自定义链接1
+     */
+    private String oneLink1;
+
+    /**
+     * 自定义链接2
+     */
+    private String oneLink2;
+
+    /**
+     * 排序值,默认为0
+     */
+    private Long sort;
+
+    /**
+     * 颜色(如CSS颜色值)
+     */
+    private String color;
+
+    /**
+     * 采购编号
+     */
+    private String purchaseNo;
+
+    /**
+     * 采购名称
+     */
+    private String purchaseName;
+
+    /**
+     * 采购负责人编号
+     */
+    private String purchaseManagerNo;
+
+    /**
+     * 采购负责人姓名
+     */
+    private String purchaseManagerName;
+
+    /**
+     * 所属平台(0=Web, 1=小程序)
+     */
+    private Long platform;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductClassification.java

@@ -0,0 +1,57 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品属性关联对象 product_classification
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_classification")
+public class ProductClassification extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 分类编号
+     */
+    private Long categoryId;
+
+    /**
+     * 属性列表(JSON或分号分隔等格式)
+     */
+    private String attributesList;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 83 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductCustomization.java

@@ -0,0 +1,83 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 产品定制信息对象 product_customization
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_customization")
+public class ProductCustomization extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 定制编号
+     */
+    private String customizationNo;
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 定制方式  支持多选,分隔  (0=包装定制,1=商品定制,2=开模定制)
+     */
+    private String customizedStyle;
+
+    /**
+     * 定制工艺  支持多选,分隔  (0=丝印,1=热转印,2=激光,烤花,压印)
+     */
+    private String customizedCraft;
+
+    /**
+     * 打样周期(天)
+     */
+    private Long proofingPeriod;
+
+    /**
+     * 生产周期(天)
+     */
+    private Long productionCycle;
+
+    /**
+     * 最小起订量(MOQ)
+     */
+    private Long moq;
+
+    /**
+     * MOQ对应价格
+     */
+    private BigDecimal moqPrice;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 52 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductEnsure.java

@@ -0,0 +1,52 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品保障项对象 product_ensure
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_ensure")
+public class ProductEnsure extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 保障名称(如:正品保证、售后保障等)
+     */
+    private String ensureName;
+
+    /**
+     * 数据来源(如:系统配置、接口同步等)
+     */
+    private String dataSource;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 239 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductExtend.java

@@ -0,0 +1,239 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 产品扩展属性(低频访问字段)对象 product_extend
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_extend")
+public class ProductExtend extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 关联 product_base.id
+     */
+    @TableId(value = "product_id")
+    private Long productId;
+
+    /**
+     * 促销标题
+     */
+    private String promotionTitle;
+
+    /**
+     * 发票名称
+     */
+    private String invoiceName;
+
+    /**
+     * 发票类型
+     */
+    private String invoiceType;
+
+    /**
+     * 规格代码
+     */
+    private String specificationsCode;
+
+    /**
+     * 条形码
+     */
+    private String barCoding;
+
+    /**
+     * 产品描述
+     */
+    private String productDescription;
+
+    /**
+     * 产品重量
+     */
+    private String productWeight;
+
+    /**
+     * 重量单位
+     */
+    private String weightUnit;
+
+    /**
+     * 产品体积
+     */
+    private String productVolume;
+
+    /**
+     * 体积单位
+     */
+    private String volumeUnit;
+
+    /**
+     * 售后服务
+     */
+    private String afterSalesService;
+
+    /**
+     * 服务保障  支持多选,分隔 (0=无忧退货,1=快速退款,2=免费包邮,3正品保障)
+     */
+    private String serviceGuarantee;
+
+    /**
+     * 是否安装服务:1=是,0=否
+     */
+    private String isInstallService;
+
+    /**
+     * 安装费用
+     */
+    private String installAmount;
+
+    /**
+     * 分销价格
+     */
+    private String distributionPrice;
+
+    /**
+     * 标准尺寸
+     */
+    private String standardSizes;
+
+    /**
+     * 克重
+     */
+    private String gramWeight;
+
+    /**
+     * 透明度
+     */
+    private String opacity;
+
+    /**
+     * 是否可定制:1=是,0=否
+     */
+    private String isCustomize;
+
+    /**
+     * 定制描述
+     */
+    private String customDescription;
+
+    /**
+     * 产品利润
+     */
+    private String productProfit;
+
+    /**
+     * 报告需求
+     */
+    private String reportRequire;
+
+    /**
+     * 审核评论
+     */
+    private String reviewComments;
+
+    /**
+     * 供应商编号
+     */
+    private String supplierNo;
+
+    /**
+     * 推送状态
+     */
+    private String pushStatus;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 发票规格
+     */
+    private String invoiceSpecs;
+
+    /**
+     * 增量
+     */
+    private Long increment;
+
+    /**
+     * 采购编号
+     */
+    private String purchaseNo;
+
+    /**
+     * 采购名称
+     */
+    private String purchaseName;
+
+    /**
+     * 供应商名称
+     */
+    private String supplierName;
+
+    /**
+     * 采购经理编号
+     */
+    private String purchaseManagerNo;
+
+    /**
+     * 采购经理姓名
+     */
+    private String purchaseManagerName;
+
+    /**
+     * 参考链接
+     */
+    private String referenceLink;
+
+    /**
+     * 销售量
+     */
+    private Long salesVolume;
+
+    /**
+     * 发货时效
+     */
+    private String deliveryTime;
+
+    /**
+     * PIT时间
+     */
+    private Date pitTime;
+
+    /**
+     * 创建时的供应商标识
+     */
+    private String createSupplier;
+
+    /**
+     * 其他补充信息
+     */
+    private String otherInfo;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductLable.java

@@ -0,0 +1,57 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品标签信息(注意:名疑似拼写错误,应为 product_label)对象 product_lable
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_lable")
+public class ProductLable extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 产品标签编号(如:NEW2025、HOT、VIP_ONLY 等)
+     */
+    private String productLabelNo;
+
+    /**
+     * 标签显示名称(如:新品、热销、限时优惠)
+     */
+    private String productLabelName;
+
+    /**
+     * 使用该标签的产品数量(可用于统计或缓存)
+     */
+    private Long productQuantity;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 67 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductPool.java

@@ -0,0 +1,67 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品池对象 product_pool
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_pool")
+public class ProductPool extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 池编码
+     */
+    private String poolNo;
+
+    /**
+     * 池名称
+     */
+    private String name;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    private String isShow;
+
+    /**
+     * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+     */
+    private String productReviewStatus;
+
+    /**
+     * 审核原因
+     */
+    private String reviewReason;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 78 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductPoolLink.java

@@ -0,0 +1,78 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 产品池和产品关联对象 product_pool_link
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_pool_link")
+public class ProductPoolLink extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 所属池ID
+     */
+    private Long poolId;
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 产品价格
+     */
+    private BigDecimal productPrice;
+
+    /**
+     * 是否在池中:1-是,0-否
+     */
+    private String isPoolStatus;
+
+    /**
+     * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+     */
+    private String productReviewStatus;
+
+    /**
+     * 审核原因
+     */
+    private String reviewReason;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    private String isShow;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 98 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductPriceInventory.java

@@ -0,0 +1,98 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 产品价格与库存信息对象 product_price_inventory
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_price_inventory")
+public class ProductPriceInventory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 关联 product_base.id
+     */
+    @TableId(value = "product_id")
+    private Long productId;
+
+    /**
+     * 市场价格
+     */
+    private BigDecimal marketPrice;
+
+    /**
+     * 会员价格
+     */
+    private BigDecimal memberPrice;
+
+    /**
+     * 最低销售价格
+     */
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 采购价格
+     */
+    private BigDecimal purchasingPrice;
+
+    /**
+     * 最高采购价格
+     */
+    private BigDecimal maxPurchasePrice;
+
+    /**
+     * 总库存量
+     */
+    private Long totalInventory;
+
+    /**
+     * 当前可用库存
+     */
+    private Long nowInventory;
+
+    /**
+     * 虚拟库存
+     */
+    private Long virtualInventory;
+
+    /**
+     * 最小起订数量
+     */
+    private Long minOrderQuantity;
+
+    /**
+     * 税率
+     */
+    private BigDecimal taxRate;
+
+    /**
+     * 货币类型
+     */
+    private String currency;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 99 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductProgram.java

@@ -0,0 +1,99 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 产品解决方案/项目方案对象 product_program
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_program")
+public class ProductProgram extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 方案编号(唯一标识)
+     */
+    private String programNo;
+
+    /**
+     * 方案标题
+     */
+    private String title;
+
+    /**
+     * 方案描述(注意:字段名为 SQL 关键字,建议未来重命名为 description)
+     */
+    private String describe;
+
+    /**
+     * 所属分类编号或名称
+     */
+    private String category;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    private String isShow;
+
+    /**
+     * 封面图片URL(可存储较长路径)
+     */
+    private String coverImage;
+
+    /**
+     * 方案内容(如简介、详情等)
+     */
+    private String content;
+
+    /**
+     * 所属行业编号或名称
+     */
+    private String industry;
+
+    /**
+     * 适配产品/设备编号
+     */
+    private String adaptNo;
+
+    /**
+     * 标签
+     */
+    private String label;
+
+    /**
+     * 内部广告内容(如 Banner 文案或链接)
+     */
+    private String innerAdvert;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 52 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductProgramLink.java

@@ -0,0 +1,52 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 项目方案关联对象 product_program_link
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_program_link")
+public class ProductProgramLink extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 项目编号
+     */
+    private Long programId;
+
+    /**
+     * 产品编号
+     */
+    private Long productId;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 67 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductRecommend.java

@@ -0,0 +1,67 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品推荐位配置对象 product_recommend
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_recommend")
+public class ProductRecommend extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 推荐编号(唯一标识)
+     */
+    private String recommendNo;
+
+    /**
+     * 推荐名称(如:首页爆款、新品专区等)
+     */
+    private String recommendName;
+
+    /**
+     * 推荐位描述(用于后台说明或前端提示)
+     */
+    private String recommendDescribe;
+
+    /**
+     * 是否显示:1=显示,0=隐藏
+     */
+    private String isShow;
+
+    /**
+     * 推荐封面图片路径或URL
+     */
+    private String recommendCoverphoto;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 52 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductRecommendLink.java

@@ -0,0 +1,52 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品推荐关联对象 product_recommend_link
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_recommend_link")
+public class ProductRecommendLink extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 项目编号
+     */
+    private Long recommendId;
+
+    /**
+     * 产品编号
+     */
+    private Long productId;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 57 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductSpecs.java

@@ -0,0 +1,57 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品规格关联对象 product_specs
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_specs")
+public class ProductSpecs extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 主产品编号
+     */
+    private String productId;
+
+    /**
+     * 关联的规格产品id列表(如:逗号分隔的产品id)
+     */
+    private String specsProductIds;
+
+    /**
+     * 是否单向关联:0=双向,1=单向
+     */
+    private String isUnidirectional;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 68 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductTaxrate.java

@@ -0,0 +1,68 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 产品税率配置对象 product_taxrate
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_taxrate")
+public class ProductTaxrate extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 税率编号
+     */
+    private String taxrateNo;
+
+    /**
+     * 税率名称
+     */
+    private String taxrateName;
+
+    /**
+     * 税率值)
+     */
+    private BigDecimal taxrate;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    private String isShow;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 62 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductUnit.java

@@ -0,0 +1,62 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品计量单位对象 product_unit
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_unit")
+public class ProductUnit extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 单位编号
+     */
+    private String unitNo;
+
+    /**
+     * 单位名称(如:件、箱、千克等)
+     */
+    private String unitName;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    private String isShow;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 52 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductVolumeUnit.java

@@ -0,0 +1,52 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品体积单位对象 product_volume_unit
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_volume_unit")
+public class ProductVolumeUnit extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 体积单位名称(如:立方米、升、立方厘米等)
+     */
+    private String unitName;
+
+    /**
+     * 数据来源(如:系统配置、接口同步等)
+     */
+    private String dataSource;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 52 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductWeightUnit.java

@@ -0,0 +1,52 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 产品重量单位对象 product_weight_unit
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_weight_unit")
+public class ProductWeightUnit extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 重量单位名称(如:千克、克、吨、磅等)
+     */
+    private String unitName;
+
+    /**
+     * 数据来源(如:系统配置、接口同步等)
+     */
+    private String dataSource;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

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

@@ -0,0 +1,47 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductAfterSales;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品售后服务项业务对象 product_after_sales
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductAfterSales.class, reverseConvertGenerate = false)
+public class ProductAfterSalesBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 售后服务项目(如:保修、退换货、技术支持等)
+     */
+    @NotBlank(message = "售后服务项目(如:保修、退换货、技术支持等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String afterSalesItems;
+
+    /**
+     * 数据来源(如:系统录入、接口同步等)
+     */
+    @NotBlank(message = "数据来源(如:系统录入、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,58 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductAssociate;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品关联业务对象 product_associate
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductAssociate.class, reverseConvertGenerate = false)
+public class ProductAssociateBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 主产品id
+     */
+    @NotNull(message = "主产品id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * 关联产品编号列表(如:用逗号分隔的产品编号)
+     */
+    @NotBlank(message = "关联产品编号列表(如:用逗号分隔的产品编号)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productIds;
+
+    /**
+     * 是否单向关联:0=双向,1=单向
+     */
+    private String isUnidirectional;
+
+    /**
+     * 关联标题/展示名称
+     */
+    @NotBlank(message = "关联标题/展示名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String relatedTitle;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,80 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductAttributes;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品属性定义(用于动态属性配置)业务对象 product_attributes
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductAttributes.class, reverseConvertGenerate = false)
+public class ProductAttributesBo extends BaseEntity {
+
+    /**
+     * 主键,自增ID
+     */
+    private Long id;
+
+    /**
+     * 关联的产品分类id
+     */
+    @NotBlank(message = "关联的产品分类id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long categoryId;
+
+    /**
+     * 属性编码(用于系统识别)
+     */
+    @NotBlank(message = "属性编码(用于系统识别)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productAttributesCode;
+
+    /**
+     * 属性显示名称
+     */
+    @NotBlank(message = "属性显示名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productAttributesName;
+
+    /**
+     * 是否可选:1=是,0=否
+     */
+    private String isOptional;
+
+    /**
+     * 属性录入方式(1=下拉,2=文本输入,3=多选等)
+     */
+    private String entryMethod;
+
+    /**
+     * 是否用于商品筛选:1=是,0=否
+     */
+    private String isFilter;
+
+    /**
+     * 预定义属性值列表(逗号分隔或JSON)
+     */
+    @NotBlank(message = "预定义属性值列表(逗号分隔或JSON)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String attributesList;
+
+    /**
+     * 是否必填: 1=是, 0=否
+     */
+    @NotBlank(message = "是否必填: 1=是, 0=否不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String required;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,333 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductBase;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.math.BigDecimal;
+
+/**
+ * 产品基础信息业务对象 product_base
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductBase.class, reverseConvertGenerate = false)
+public class ProductBaseBo extends BaseEntity {
+
+    /**
+     * 主键,自增ID
+     */
+    private Long id;
+
+    /**
+     * 产品编号
+     */
+    @NotBlank(message = "产品编号不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String productNo;
+
+    /**
+     * 项目名称
+     */
+    @NotBlank(message = "项目名称不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String itemName;
+
+    /**
+     * 品牌id
+     */
+    @NotNull(message = "品牌id不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long brandId;
+
+    /**
+     * 顶级分类id
+     */
+    @NotNull(message = "顶级分类id不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long topCategoryId;
+
+    /**
+     * 中级分类id
+     */
+    @NotNull(message = "中级分类id不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long mediumCategoryId;
+
+    /**
+     * 底层分类id
+     */
+    @NotNull(message = "底层分类id不能为空", groups = {AddGroup.class, EditGroup.class})
+    private Long bottomCategoryId;
+
+    /**
+     * 单位id
+     */
+    private String unitId;
+
+    /**
+     * 产品图片URL
+     */
+    private String productImage;
+
+    /**
+     * 是否自营(1=是,0=否)
+     */
+    private String isSelf;
+
+    /**
+     * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+     */
+    private String productReviewStatus;
+
+    /**
+     * 首页推荐:1=推荐,0=不推荐
+     */
+    private String homeRecommended;
+
+    /**
+     * 分类推荐:1=推荐,0=不推荐
+     */
+    private String categoryRecommendation;
+
+    /**
+     * 购物车推荐:1=推荐,0=不推荐
+     */
+    private String cartRecommendation;
+
+    /**
+     * 推荐产品顺序
+     */
+    private Long recommendedProductOrder;
+
+    /**
+     * 是否热门:1=是,0=否
+     */
+    private String isPopular;
+
+    /**
+     * 是否新品:1=是,0=否
+     */
+    private String isNew;
+
+    /**
+     * 商品状态:1=上架,0=下架等
+     */
+    private String productStatus;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * A10产品名称
+     */
+    private String a10ProductName;
+
+    /**
+     * 规格型号
+     */
+    private String specification;
+
+    /**
+     * UPC(S)条码
+     */
+    private String upcBarcode;
+
+    /**
+     * 发票名称
+     */
+    private String invoiceName;
+
+    /**
+     * 发票规格
+     */
+    private String invoiceSpec;
+
+    /**
+     * 产品品牌
+     */
+    private String productBrand;
+
+    /**
+     * 段号
+     */
+    private String sectionNo;
+
+    /**
+     * 包装规格
+     */
+    private String packagingSpec;
+
+    /**
+     * 采用基准
+     */
+    private String adoptionStandard;
+
+    /**
+     * 采品性质
+     */
+    private String purchaseNature;
+
+    /**
+     * 参考链接
+     */
+    private String referenceLink;
+
+    /**
+     * 商品重量
+     */
+    private String weight;
+
+    /**
+     * 重量单位
+     */
+    private String weightUnit;
+
+    /**
+     * 商品体积
+     */
+    private String volume;
+
+    /**
+     * 体积单位
+     */
+    private String volumeUnit;
+
+    /**
+     * 主库简介
+     */
+    private String mainLibraryIntro;
+
+    /**
+     * 售后服务
+     */
+    private String afterSalesService;
+
+    /**
+     * 服务保障 支持多选,分隔 (存储服务保障ID列表,如: "1,2,3")
+     */
+    private String serviceGuarantee;
+
+    /**
+     * 安装服务 - 免费安装
+     */
+    private String freeInstallation;
+
+    /**
+     * 销售量
+     */
+    private Long salesVolume;
+
+    /**
+     * 市场价
+     */
+    private java.math.BigDecimal midRangePrice;
+
+    /**
+     * 会员价
+     */
+    private java.math.BigDecimal standardPrice;
+
+    /**
+     * 最低售价
+     */
+    private java.math.BigDecimal certificatePrice;
+
+    /**
+     * 售价验证量
+     */
+    private String priceVerificationQuantity;
+
+    /**
+     * 采购价
+     */
+    private java.math.BigDecimal purchasePrice;
+
+    /**
+     * 暂估采购价
+     */
+    private java.math.BigDecimal estimatedPurchasePrice;
+
+    /**
+     * 产品性质
+     */
+    private String productNature;
+
+    /**
+     * 采购人员
+     */
+    private String purchasingPersonnel;
+
+    /**
+     * 旧属性类型
+     */
+    private String oldAttributeType;
+
+    /**
+     * 录入套数
+     */
+    private String entrySetCount;
+
+    /**
+     * 商品主图
+     */
+    private String mainImage;
+
+    /**
+     * 商品详情 - 电脑端
+     */
+    private String pcDetail;
+
+    /**
+     * 商品详情 - 移动端
+     */
+    private String mobileDetail;
+
+    /**
+    * 商品属性
+    * */
+    private String attributesList;
+
+    /**
+     * 税率
+     */
+    private BigDecimal taxRate;
+
+    /**
+     * 币种
+     */
+    private String currency;
+
+    /**
+     * 最低起订量
+     */
+    private Long minOrderQuantity;
+
+    /**
+     * 是否可定制
+     */
+    private Boolean customizable;
+
+    /**
+     * 定制说明
+     */
+    private String customDescription;
+
+    /**
+     * 定制详情列表(JSON字符串)
+     */
+    private String customDetailsJson;
+
+}

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

@@ -0,0 +1,52 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductBlacklist;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品黑名单业务对象 product_blacklist
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductBlacklist.class, reverseConvertGenerate = false)
+public class ProductBlacklistBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 客户id(可为空,表示全局黑名单)
+     */
+    @NotNull(message = "客户id(可为空,表示全局黑名单)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long customerId;
+
+    /**
+     * 产品id(可为空,表示该客户对整个分类禁用)
+     */
+    @NotNull(message = "产品id(可为空,表示该客户对整个分类禁用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * 产品分类id(必填)
+     */
+    private Long productCategoryId;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,144 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductBrand;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 产品品牌信息业务对象 product_brand
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductBrand.class, reverseConvertGenerate = false)
+public class ProductBrandBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 品牌编号(唯一标识)
+     */
+    private String brandNo;
+
+    /**
+     * 品牌中文名称
+     */
+    private String brandName;
+
+    /**
+     * 品牌首字母缩写(如拼音首字母)
+     */
+    @NotBlank(message = "品牌首字母缩写(如拼音首字母)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String brandInitials;
+
+    /**
+     * 品牌英文名称
+     */
+    @NotBlank(message = "品牌英文名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String brandEnglishName;
+
+    /**
+     * 推荐值(数值越大越靠前)
+     */
+    @NotNull(message = "推荐值(数值越大越靠前)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long recommendValue;
+
+    /**
+     * 品牌Logo图片路径或URL
+     */
+    @NotBlank(message = "品牌Logo图片路径或URL不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String brandLogo;
+
+    /**
+     * 品牌标题(用于展示)
+     */
+    @NotBlank(message = "品牌标题(用于展示)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String brandTitle;
+
+    /**
+     * 品牌大图(横幅/封面图)
+     */
+    @NotBlank(message = "品牌大图(横幅/封面图)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String brandBigImage;
+
+    /**
+     * 品牌故事(简介文本)
+     */
+    @NotBlank(message = "品牌故事(简介文本)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String brandStory;
+
+    /**
+     * 是否显示(1=显示,0=隐藏)
+     */
+    @NotNull(message = "是否显示(1=显示,0=隐藏)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long isShow;
+
+    /**
+     * 品牌注册人
+     */
+    @NotBlank(message = "品牌注册人不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String brandRegistrant;
+
+    /**
+     * 许可证编号
+     */
+    @NotBlank(message = "许可证编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String license;
+
+    /**
+     * 注册证书编号
+     */
+    @NotBlank(message = "注册证书编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String registrationCertificate;
+
+    /**
+     * 证书/许可过期时间
+     */
+    @NotNull(message = "证书/许可过期时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date expireTime;
+
+    /**
+     * 品牌描述(较长文本)
+     */
+    @NotBlank(message = "品牌描述(较长文本)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String brandDescribe;
+
+    /**
+     * 展示位置(如首页、分类页等)
+     */
+    @NotBlank(message = "展示位置(如首页、分类页等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String position;
+
+    /**
+     * 关注度/收藏数(默认为0)
+     */
+    private Long care;
+
+    /**
+     * 数据来源
+     */
+    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,166 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductCategory;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+/**
+ * 产品分类业务对象 product_category
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductCategory.class, reverseConvertGenerate = false)
+public class ProductCategoryBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+    @NotBlank(message = "分类编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String categoryNo;
+
+    /**
+     * 分类名称
+     */
+    @NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String categoryName;
+
+    /**
+     * 父级分类ID
+     */
+    @NotNull(message = "父级分类ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long parentId;
+
+    /**
+     * 祖籍列表
+     */
+    @NotBlank(message = "祖籍列表不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String ancestors;
+
+    /**
+     * 分类层级(1=一级,2=二级, 3三级)
+     */
+    private Long classLevel;
+
+    /**
+     * 是否显示(1=显示,0=隐藏)
+     */
+    @NotNull(message = "是否显示(1=显示,0=隐藏)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long isShow;
+
+    /**
+     * 是否在GPS中显示
+     */
+    private Long isShowGps;
+
+    /**
+     * 折扣率(可能为JSON或文本)
+     */
+    @NotNull(message = "折扣率(可能为JSON或文本)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal discountRate;
+
+    /**
+     * 拼音码(用于快速检索)
+     */
+    @NotBlank(message = "拼音码(用于快速检索)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String pyCode;
+
+    /**
+     * 分类描述
+     */
+    @NotBlank(message = "分类描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String classDescription;
+
+    /**
+     * 数据来源
+     */
+    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 自定义标签1
+     */
+    @NotBlank(message = "自定义标签1不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String oneLable1;
+
+    /**
+     * 自定义标签2
+     */
+    @NotBlank(message = "自定义标签2不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String oneLable2;
+
+    /**
+     * 自定义链接1
+     */
+    @NotBlank(message = "自定义链接1不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String oneLink1;
+
+    /**
+     * 自定义链接2
+     */
+    @NotBlank(message = "自定义链接2不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String oneLink2;
+
+    /**
+     * 排序值,默认为0
+     */
+    @NotNull(message = "排序值,默认为0不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long sort;
+
+    /**
+     * 颜色(如CSS颜色值)
+     */
+    @NotBlank(message = "颜色(如CSS颜色值)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String color;
+
+    /**
+     * 采购编号
+     */
+    @NotBlank(message = "采购编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String purchaseNo;
+
+    /**
+     * 采购名称
+     */
+    @NotBlank(message = "采购名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String purchaseName;
+
+    /**
+     * 采购负责人编号
+     */
+    @NotBlank(message = "采购负责人编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String purchaseManagerNo;
+
+    /**
+     * 采购负责人姓名
+     */
+    @NotBlank(message = "采购负责人姓名不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String purchaseManagerName;
+
+    /**
+     * 所属平台(0=Web, 1=小程序)
+     */
+    @NotNull(message = "所属平台(0=Web, 1=小程序)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long platform;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,53 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductClassification;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品属性关联业务对象 product_classification
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductClassification.class, reverseConvertGenerate = false)
+public class ProductClassificationBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 产品id
+     */
+    @NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * 分类编号
+     */
+    @NotNull(message = "分类编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long categoryId;
+
+    /**
+     * 属性列表(JSON或分号分隔等格式)
+     */
+    @NotBlank(message = "属性列表(JSON或分号分隔等格式)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String attributesList;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,84 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductCustomization;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+/**
+ * 产品定制信息业务对象 product_customization
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductCustomization.class, reverseConvertGenerate = false)
+public class ProductCustomizationBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 定制编号
+     */
+    @NotBlank(message = "定制编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String customizationNo;
+
+    /**
+     * 产品id
+     */
+    @NotNull(message = "产品id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * 定制方式  支持多选,分隔  (0=包装定制,1=商品定制,2=开模定制)
+     */
+    @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 })
+    private String customizedCraft;
+
+    /**
+     * 打样周期(天)
+     */
+    @NotNull(message = "打样周期(天)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long proofingPeriod;
+
+    /**
+     * 生产周期(天)
+     */
+    @NotNull(message = "生产周期(天)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productionCycle;
+
+    /**
+     * 最小起订量(MOQ)
+     */
+    @NotNull(message = "最小起订量(MOQ)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long moq;
+
+    /**
+     * MOQ对应价格
+     */
+    @NotNull(message = "MOQ对应价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal moqPrice;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,47 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductEnsure;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品保障项业务对象 product_ensure
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductEnsure.class, reverseConvertGenerate = false)
+public class ProductEnsureBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 保障名称(如:正品保证、售后保障等)
+     */
+    @NotBlank(message = "保障名称(如:正品保证、售后保障等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String ensureName;
+
+    /**
+     * 数据来源(如:系统配置、接口同步等)
+     */
+    @NotBlank(message = "数据来源(如:系统配置、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,269 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductExtend;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 产品扩展属性(低频访问字段)业务对象 product_extend
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductExtend.class, reverseConvertGenerate = false)
+public class ProductExtendBo extends BaseEntity {
+
+    /**
+     * 关联 product_base.id
+     */
+    private Long productId;
+
+    /**
+     * 促销标题
+     */
+    @NotBlank(message = "促销标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String promotionTitle;
+
+    /**
+     * 发票名称
+     */
+    @NotBlank(message = "发票名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String invoiceName;
+
+    /**
+     * 发票类型
+     */
+    @NotBlank(message = "发票类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String invoiceType;
+
+    /**
+     * 规格代码
+     */
+    @NotBlank(message = "规格代码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String specificationsCode;
+
+    /**
+     * 条形码
+     */
+    @NotBlank(message = "条形码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String barCoding;
+
+    /**
+     * 产品描述
+     */
+    @NotBlank(message = "产品描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productDescription;
+
+    /**
+     * 产品重量
+     */
+    @NotBlank(message = "产品重量不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productWeight;
+
+    /**
+     * 重量单位
+     */
+    @NotBlank(message = "重量单位不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String weightUnit;
+
+    /**
+     * 产品体积
+     */
+    @NotBlank(message = "产品体积不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productVolume;
+
+    /**
+     * 体积单位
+     */
+    @NotBlank(message = "体积单位不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String volumeUnit;
+
+    /**
+     * 售后服务
+     */
+    @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 })
+    private String serviceGuarantee;
+
+    /**
+     * 是否安装服务:1=是,0=否
+     */
+    private String isInstallService;
+
+    /**
+     * 安装费用
+     */
+    @NotBlank(message = "安装费用不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String installAmount;
+
+    /**
+     * 分销价格
+     */
+    @NotBlank(message = "分销价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String distributionPrice;
+
+    /**
+     * 标准尺寸
+     */
+    @NotBlank(message = "标准尺寸不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String standardSizes;
+
+    /**
+     * 克重
+     */
+    @NotBlank(message = "克重不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String gramWeight;
+
+    /**
+     * 透明度
+     */
+    @NotBlank(message = "透明度不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String opacity;
+
+    /**
+     * 是否可定制:1=是,0=否
+     */
+    private String isCustomize;
+
+    /**
+     * 定制描述
+     */
+    @NotBlank(message = "定制描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String customDescription;
+
+    /**
+     * 产品利润
+     */
+    @NotBlank(message = "产品利润不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productProfit;
+
+    /**
+     * 报告需求
+     */
+    @NotBlank(message = "报告需求不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String reportRequire;
+
+    /**
+     * 审核评论
+     */
+    @NotBlank(message = "审核评论不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String reviewComments;
+
+    /**
+     * 供应商编号
+     */
+    @NotBlank(message = "供应商编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String supplierNo;
+
+    /**
+     * 推送状态
+     */
+    @NotBlank(message = "推送状态不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String pushStatus;
+
+    /**
+     * 数据来源
+     */
+    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 发票规格
+     */
+    @NotBlank(message = "发票规格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String invoiceSpecs;
+
+    /**
+     * 增量
+     */
+    @NotNull(message = "增量不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long increment;
+
+    /**
+     * 采购编号
+     */
+    @NotBlank(message = "采购编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String purchaseNo;
+
+    /**
+     * 采购名称
+     */
+    @NotBlank(message = "采购名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String purchaseName;
+
+    /**
+     * 供应商名称
+     */
+    @NotBlank(message = "供应商名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String supplierName;
+
+    /**
+     * 采购经理编号
+     */
+    @NotBlank(message = "采购经理编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String purchaseManagerNo;
+
+    /**
+     * 采购经理姓名
+     */
+    @NotBlank(message = "采购经理姓名不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String purchaseManagerName;
+
+    /**
+     * 参考链接
+     */
+    @NotBlank(message = "参考链接不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String referenceLink;
+
+    /**
+     * 销售量
+     */
+    @NotNull(message = "销售量不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long salesVolume;
+
+    /**
+     * 发货时效
+     */
+    @NotBlank(message = "发货时效不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String deliveryTime;
+
+    /**
+     * PIT时间
+     */
+    @NotNull(message = "PIT时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date pitTime;
+
+    /**
+     * 创建时的供应商标识
+     */
+    @NotBlank(message = "创建时的供应商标识不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String createSupplier;
+
+    /**
+     * 其他补充信息
+     */
+    @NotBlank(message = "其他补充信息不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String otherInfo;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,52 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductLable;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品标签信息(注意:名疑似拼写错误,应为 product_label)业务对象 product_lable
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductLable.class, reverseConvertGenerate = false)
+public class ProductLableBo extends BaseEntity {
+
+    /**
+     * 主键,自增ID
+     */
+    private Long id;
+
+    /**
+     * 产品标签编号(如:NEW2025、HOT、VIP_ONLY 等)
+     */
+    @NotBlank(message = "产品标签编号(如:NEW2025、HOT、VIP_ONLY 等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productLabelNo;
+
+    /**
+     * 标签显示名称(如:新品、热销、限时优惠)
+     */
+    @NotBlank(message = "标签显示名称(如:新品、热销、限时优惠)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productLabelName;
+
+    /**
+     * 使用该标签的产品数量(可用于统计或缓存)
+     */
+    private Long productQuantity;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,61 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductPool;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品池业务对象 product_pool
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductPool.class, reverseConvertGenerate = false)
+public class ProductPoolBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 池编码
+     */
+    private String poolNo;
+
+    /**
+     * 池名称
+     */
+    private String name;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    private String isShow;
+
+    /**
+     * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+     */
+    private String productReviewStatus;
+
+    /**
+     * 审核原因
+     */
+    @NotBlank(message = "审核原因不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String reviewReason;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 75 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPoolLinkBo.java

@@ -0,0 +1,75 @@
+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 lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+/**
+ * 产品池和产品关联业务对象 product_pool_link
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductPoolLink.class, reverseConvertGenerate = false)
+public class ProductPoolLinkBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 所属池ID
+     */
+    private Long poolId;
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 产品价格
+     */
+    @NotNull(message = "产品价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal productPrice;
+
+    /**
+     * 是否在池中:1-是,0-否
+     */
+    private String isPoolStatus;
+
+    /**
+     * 产品审核状态 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;
+
+
+}

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

@@ -0,0 +1,98 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductPriceInventory;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+/**
+ * 产品价格与库存信息业务对象 product_price_inventory
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductPriceInventory.class, reverseConvertGenerate = false)
+public class ProductPriceInventoryBo extends BaseEntity {
+
+    /**
+     * 关联 product_base.id
+     */
+    private Long productId;
+
+    /**
+     * 市场价格
+     */
+    @NotNull(message = "市场价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal marketPrice;
+
+    /**
+     * 会员价格
+     */
+    @NotNull(message = "会员价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal memberPrice;
+
+    /**
+     * 最低销售价格
+     */
+    @NotNull(message = "最低销售价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 采购价格
+     */
+    @NotNull(message = "采购价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal purchasingPrice;
+
+    /**
+     * 最高采购价格
+     */
+    @NotNull(message = "最高采购价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal maxPurchasePrice;
+
+    /**
+     * 总库存量
+     */
+    private Long totalInventory;
+
+    /**
+     * 当前可用库存
+     */
+    private Long nowInventory;
+
+    /**
+     * 虚拟库存
+     */
+    private Long virtualInventory;
+
+    /**
+     * 最小起订数量
+     */
+    private Long minOrderQuantity;
+
+    /**
+     * 税率
+     */
+    @NotNull(message = "税率不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal taxRate;
+
+    /**
+     * 货币类型
+     */
+    @NotBlank(message = "货币类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String currency;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,95 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductProgram;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 产品解决方案/项目方案业务对象 product_program
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductProgram.class, reverseConvertGenerate = false)
+public class ProductProgramBo extends BaseEntity {
+
+    /**
+     * 主键,自增ID
+     */
+    private Long id;
+
+    /**
+     * 方案编号(唯一标识)
+     */
+    private String programNo;
+
+    /**
+     * 方案标题
+     */
+    private String title;
+
+    /**
+     * 方案描述(注意:字段名为 SQL 关键字,建议未来重命名为 description)
+     */
+    private String describe;
+
+    /**
+     * 所属分类编号或名称
+     */
+    private String category;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    private String isShow;
+
+    /**
+     * 封面图片URL(可存储较长路径)
+     */
+    private String coverImage;
+
+    /**
+     * 方案内容(如简介、详情等)
+     */
+    @NotBlank(message = "方案内容(如简介、详情等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String content;
+
+    /**
+     * 所属行业编号或名称
+     */
+    private String industry;
+
+    /**
+     * 适配产品/设备编号
+     */
+    private String adaptNo;
+
+    /**
+     * 标签
+     */
+    @NotBlank(message = "标签不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String label;
+
+    /**
+     * 内部广告内容(如 Banner 文案或链接)
+     */
+    @NotBlank(message = "内部广告内容(如 Banner 文案或链接)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String innerAdvert;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,47 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductProgramLink;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 项目方案关联业务对象 product_program_link
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductProgramLink.class, reverseConvertGenerate = false)
+public class ProductProgramLinkBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 项目编号
+     */
+    @NotNull(message = "项目编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long programId;
+
+    /**
+     * 产品编号
+     */
+    @NotNull(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,60 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductRecommend;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品推荐位配置业务对象 product_recommend
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductRecommend.class, reverseConvertGenerate = false)
+public class ProductRecommendBo extends BaseEntity {
+
+    /**
+     * 主键,自增ID
+     */
+    private Long id;
+
+    /**
+     * 推荐编号(唯一标识)
+     */
+    private String recommendNo;
+
+    /**
+     * 推荐名称(如:首页爆款、新品专区等)
+     */
+    private String recommendName;
+
+    /**
+     * 推荐位描述(用于后台说明或前端提示)
+     */
+    private String recommendDescribe;
+
+    /**
+     * 是否显示:1=显示,0=隐藏
+     */
+    private String isShow;
+
+    /**
+     * 推荐封面图片路径或URL
+     */
+    private String recommendCoverphoto;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,47 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductRecommendLink;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品推荐关联业务对象 product_recommend_link
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductRecommendLink.class, reverseConvertGenerate = false)
+public class ProductRecommendLinkBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 项目编号
+     */
+    @NotNull(message = "项目编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long recommendId;
+
+    /**
+     * 产品编号
+     */
+    @NotNull(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,52 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductSpecs;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品规格关联业务对象 product_specs
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductSpecs.class, reverseConvertGenerate = false)
+public class ProductSpecsBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 主产品编号
+     */
+    @NotBlank(message = "主产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String productId;
+
+    /**
+     * 关联的规格产品id列表(如:逗号分隔的产品id)
+     */
+    @NotBlank(message = "关联的规格产品id列表(如:逗号分隔的产品id)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String specsProductIds;
+
+    /**
+     * 是否单向关联:0=双向,1=单向
+     */
+    private String isUnidirectional;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,66 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductTaxrate;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+/**
+ * 产品税率配置业务对象 product_taxrate
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductTaxrate.class, reverseConvertGenerate = false)
+public class ProductTaxrateBo extends BaseEntity {
+
+    /**
+     * 主键,自增ID
+     */
+    private Long id;
+
+    /**
+     * 税率编号
+     */
+    @NotBlank(message = "税率编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String taxrateNo;
+
+    /**
+     * 税率名称
+     */
+    @NotBlank(message = "税率名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String taxrateName;
+
+    /**
+     * 税率值)
+     */
+    @NotNull(message = "税率值)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private BigDecimal taxrate;
+
+    /**
+     * 数据来源
+     */
+    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    @NotBlank(message = "是否显示:1=是,0=否不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String isShow;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,59 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductUnit;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品计量单位业务对象 product_unit
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductUnit.class, reverseConvertGenerate = false)
+public class ProductUnitBo extends BaseEntity {
+
+    /**
+     * 主键,自增ID
+     */
+    private Long id;
+
+    /**
+     * 单位编号
+     */
+    @NotBlank(message = "单位编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String unitNo;
+
+    /**
+     * 单位名称(如:件、箱、千克等)
+     */
+    @NotBlank(message = "单位名称(如:件、箱、千克等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String unitName;
+
+    /**
+     * 数据来源
+     */
+    @NotBlank(message = "数据来源不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    @NotBlank(message = "是否显示:1=是,0=否不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String isShow;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,47 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductVolumeUnit;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品体积单位业务对象 product_volume_unit
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductVolumeUnit.class, reverseConvertGenerate = false)
+public class ProductVolumeUnitBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 体积单位名称(如:立方米、升、立方厘米等)
+     */
+    @NotBlank(message = "体积单位名称(如:立方米、升、立方厘米等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String unitName;
+
+    /**
+     * 数据来源(如:系统配置、接口同步等)
+     */
+    @NotBlank(message = "数据来源(如:系统配置、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

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

@@ -0,0 +1,47 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductWeightUnit;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 产品重量单位业务对象 product_weight_unit
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductWeightUnit.class, reverseConvertGenerate = false)
+public class ProductWeightUnitBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 重量单位名称(如:千克、克、吨、磅等)
+     */
+    @NotBlank(message = "重量单位名称(如:千克、克、吨、磅等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String unitName;
+
+    /**
+     * 数据来源(如:系统配置、接口同步等)
+     */
+    @NotBlank(message = "数据来源(如:系统配置、接口同步等)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 58 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductAfterSalesVo.java

@@ -0,0 +1,58 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductAfterSales;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品售后服务项视图对象 product_after_sales
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductAfterSales.class)
+public class ProductAfterSalesVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 售后服务项目(如:保修、退换货、技术支持等)
+     */
+    @ExcelProperty(value = "售后服务项目", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:保修、退换货、技术支持等")
+    private String afterSalesItems;
+
+    /**
+     * 数据来源(如:系统录入、接口同步等)
+     */
+    @ExcelProperty(value = "数据来源", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:系统录入、接口同步等")
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 69 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductAssociateVo.java

@@ -0,0 +1,69 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductAssociate;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品关联视图对象 product_associate
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductAssociate.class)
+public class ProductAssociateVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 主产品id
+     */
+    @ExcelProperty(value = "主产品id")
+    private Long productId;
+
+    /**
+     * 关联产品编号列表(如:用逗号分隔的产品编号)
+     */
+    @ExcelProperty(value = "关联产品编号列表", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:用逗号分隔的产品编号")
+    private String productIds;
+
+    /**
+     * 是否单向关联:0=双向,1=单向
+     */
+    @ExcelProperty(value = "是否单向关联:0=双向,1=单向")
+    private String isUnidirectional;
+
+    /**
+     * 关联标题/展示名称
+     */
+    @ExcelProperty(value = "关联标题/展示名称")
+    private String relatedTitle;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 95 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductAttributesVo.java

@@ -0,0 +1,95 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductAttributes;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品属性定义(用于动态属性配置)视图对象 product_attributes
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductAttributes.class)
+public class ProductAttributesVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @ExcelProperty(value = "主键,自增ID")
+    private Long id;
+
+    /**
+     * 关联的产品分类id
+     */
+    @ExcelProperty(value = "关联的产品分类id")
+    private Long categoryId;
+
+    /**
+     * 属性编码(用于系统识别)
+     */
+    @ExcelProperty(value = "属性编码", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "用=于系统识别")
+    private String productAttributesCode;
+
+    /**
+     * 属性显示名称
+     */
+    @ExcelProperty(value = "属性显示名称")
+    private String productAttributesName;
+
+    /**
+     * 是否可选:1=是,0=否
+     */
+    @ExcelProperty(value = "是否可选:1=是,0=否")
+    private String isOptional;
+
+    /**
+     * 属性录入方式(1=下拉,2=文本输入,3=多选等)
+     */
+    @ExcelProperty(value = "属性录入方式", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "1==下拉,2=文本输入,3=多选等")
+    private String entryMethod;
+
+    /**
+     * 是否用于商品筛选:1=是,0=否
+     */
+    @ExcelProperty(value = "是否用于商品筛选:1=是,0=否")
+    private String isFilter;
+
+    /**
+     * 预定义属性值列表(逗号分隔或JSON)
+     */
+    @ExcelProperty(value = "预定义属性值列表", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "逗=号分隔或JSON")
+    private String attributesList;
+
+    /**
+     * 是否必填: 1=是, 0=否
+     */
+    @ExcelProperty(value = "是否必填: 1=是, 0=否")
+    private String required;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 440 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseVo.java

@@ -0,0 +1,440 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.product.domain.ProductBase;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+ * 产品基础信息视图对象 product_base
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductBase.class)
+public class ProductBaseVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @ExcelProperty(value = "主键,自增ID")
+    private Long id;
+
+    /**
+     * 产品编号
+     */
+    @ExcelProperty(value = "产品编号")
+    private String productNo;
+
+    /**
+     * 产品名称
+     */
+    @ExcelProperty(value = "项目名称")
+    private String itemName;
+
+    /**
+     * 品牌id
+     */
+    @ExcelProperty(value = "品牌id")
+    private Long brandId;
+
+    /**
+     * 顶级分类id
+     */
+    @ExcelProperty(value = "顶级分类id")
+    private Long topCategoryId;
+
+    /**
+     * 中级分类id
+     */
+    @ExcelProperty(value = "中级分类id")
+    private Long mediumCategoryId;
+
+    /**
+     * 底层分类id
+     */
+    @ExcelProperty(value = "底层分类id")
+    private Long bottomCategoryId;
+
+    /**
+     * 单位id
+     */
+    @ExcelProperty(value = "单位id")
+    private String unitId;
+
+    /**
+     * 产品图片URL
+     */
+    @ExcelProperty(value = "产品图片URL")
+    private String productImage;
+
+    /**
+     * 产品图片URLUrl
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "productImage")
+    private String productImageUrl;
+    /**
+     * 是否自营(1=是,0=否)
+     */
+    @ExcelProperty(value = "是否自营", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "1==是,0=否")
+    private String isSelf;
+
+    /**
+     * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+     */
+    @ExcelProperty(value = "产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回")
+    private String productReviewStatus;
+
+    /**
+     * 首页推荐:1=推荐,0=不推荐
+     */
+    @ExcelProperty(value = "首页推荐:1=推荐,0=不推荐")
+    private String homeRecommended;
+
+    /**
+     * 分类推荐:1=推荐,0=不推荐
+     */
+    @ExcelProperty(value = "分类推荐:1=推荐,0=不推荐")
+    private String categoryRecommendation;
+
+    /**
+     * 购物车推荐:1=推荐,0=不推荐
+     */
+    @ExcelProperty(value = "购物车推荐:1=推荐,0=不推荐")
+    private String cartRecommendation;
+
+    /**
+     * 推荐产品顺序
+     */
+    @ExcelProperty(value = "推荐产品顺序")
+    private Long recommendedProductOrder;
+
+    /**
+     * 是否热门:1=是,0=否
+     */
+    @ExcelProperty(value = "是否热门:1=是,0=否")
+    private String isPopular;
+
+    /**
+     * 是否新品:1=是,0=否
+     */
+    @ExcelProperty(value = "是否新品:1=是,0=否")
+    private String isNew;
+
+    /**
+     * 商品状态:1=上架,0=下架等
+     */
+    @ExcelProperty(value = "商品状态:1=上架,0=下架等")
+    private String productStatus;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+    * 市场价
+    * */
+    @ExcelProperty(value = "市场价")
+    private BigDecimal marketPrice;
+
+    /**
+     * 会员价格
+     */
+    @ExcelProperty(value = "会员价格")
+    private BigDecimal memberPrice;
+
+    /**
+     * 最低销售价格
+     */
+    @ExcelProperty(value = "最低销售价格")
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 采购价格
+     */
+    @ExcelProperty(value = "采购价格")
+    private BigDecimal purchasingPrice;
+
+
+    /**
+    * 暂估毛利率
+    * */
+    @ExcelProperty(value = "暂估毛利率")
+    private BigDecimal tempGrossMargin;
+
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    /**
+     * 款号
+     */
+    @ExcelProperty(value = "款号")
+    private String styleNo;
+
+    /**
+     * A10产品名称
+     */
+    @ExcelProperty(value = "A10产品名称")
+    private String a10ProductName;
+
+    /**
+     * 规格型号
+     */
+    @ExcelProperty(value = "规格型号")
+    private String specification;
+
+    /**
+     * UPC(S)条码
+     */
+    @ExcelProperty(value = "UPC(S)条码")
+    private String upcBarcode;
+
+    /**
+     * 发票名称
+     */
+    @ExcelProperty(value = "发票名称")
+    private String invoiceName;
+
+    /**
+     * 发票规格
+     */
+    @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;
+
+    /**
+     * 参考链接
+     */
+    @ExcelProperty(value = "参考链接")
+    private String referenceLink;
+
+    /**
+     * 商品重量
+     */
+    @ExcelProperty(value = "商品重量")
+    private String weight;
+
+    /**
+     * 重量单位
+     */
+    @ExcelProperty(value = "重量单位")
+    private String weightUnit;
+
+    /**
+     * 商品体积
+     */
+    @ExcelProperty(value = "商品体积")
+    private String volume;
+
+    /**
+     * 体积单位
+     */
+    @ExcelProperty(value = "体积单位")
+    private String volumeUnit;
+
+    /**
+     * 主库简介
+     */
+    @ExcelProperty(value = "主库简介")
+    private String mainLibraryIntro;
+
+    /**
+     * 售后服务
+     */
+    @ExcelProperty(value = "售后服务")
+    private String afterSalesService;
+
+    /**
+     * 服务保证 - 无忧退货
+     */
+    @ExcelProperty(value = "无忧退货")
+    private String worryFreeReturn;
+
+    /**
+     * 服务保证 - 快速退款
+     */
+    @ExcelProperty(value = "快速退款")
+    private String quickRefund;
+
+    /**
+     * 服务保证 - 免费包邮
+     */
+    @ExcelProperty(value = "免费包邮")
+    private String freeShipping;
+
+    /**
+     * 服务保证 - 正品保障
+     */
+    @ExcelProperty(value = "正品保障")
+    private String genuineGuarantee;
+
+    /**
+     * 安装服务 - 免费安装
+     */
+    @ExcelProperty(value = "免费安装")
+    private String freeInstallation;
+
+    /**
+     * 中档价
+     */
+    @ExcelProperty(value = "中档价")
+    private BigDecimal midRangePrice;
+
+    /**
+     * 平档价
+     */
+    @ExcelProperty(value = "平档价")
+    private BigDecimal standardPrice;
+
+    /**
+     * 套证价
+     */
+    @ExcelProperty(value = "套证价")
+    private BigDecimal certificatePrice;
+
+    /**
+     * 售价验证量
+     */
+    @ExcelProperty(value = "售价验证量")
+    private String priceVerificationQuantity;
+
+    /**
+     * 采购价
+     */
+    @ExcelProperty(value = "采购价")
+    private BigDecimal purchasePrice;
+
+    /**
+     * 暂估采购价
+     */
+    @ExcelProperty(value = "暂估采购价")
+    private BigDecimal estimatedPurchasePrice;
+
+    /**
+     * 产品性质
+     */
+    @ExcelProperty(value = "产品性质")
+    private String productNature;
+
+    /**
+     * 采购人员
+     */
+    @ExcelProperty(value = "采购人员")
+    private String purchasingPersonnel;
+
+    /**
+     * 旧属性类型
+     */
+    @ExcelProperty(value = "旧属性类型")
+    private String oldAttributeType;
+
+    /**
+     * 录入套数
+     */
+    @ExcelProperty(value = "录入套数")
+    private String entrySetCount;
+
+    /**
+     * 商品主图
+     */
+    @ExcelProperty(value = "商品主图")
+    private String mainImage;
+
+    /**
+     * 商品详情 - 电脑端
+     */
+    @ExcelProperty(value = "电脑端详情")
+    private String pcDetail;
+
+    /**
+     * 商品详情 - 移动端
+     */
+    @ExcelProperty(value = "移动端详情")
+    private String mobileDetail;
+
+    /**
+     * 税率
+     */
+    @ExcelProperty(value = "税率")
+    private BigDecimal taxRate;
+
+    /**
+     * 币种
+     */
+    @ExcelProperty(value = "币种")
+    private String currency;
+
+    /**
+     * 最低起订量
+     */
+    @ExcelProperty(value = "最低起订量")
+    private Long minOrderQuantity;
+
+    /**
+     * 是否可定制
+     */
+    private Boolean customizable;
+
+    /**
+     * 定制说明
+     */
+    private String customDescription;
+
+    /**
+     * 定制详情列表(JSON字符串)
+     */
+    private String customDetailsJson;
+
+}

+ 65 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBlacklistVo.java

@@ -0,0 +1,65 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductBlacklist;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品黑名单视图对象 product_blacklist
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductBlacklist.class)
+public class ProductBlacklistVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 客户id(可为空,表示全局黑名单)
+     */
+    @ExcelProperty(value = "客户id", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "可=为空,表示全局黑名单")
+    private Long customerId;
+
+    /**
+     * 产品id(可为空,表示该客户对整个分类禁用)
+     */
+    @ExcelProperty(value = "产品id", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "可=为空,表示该客户对整个分类禁用")
+    private Long productId;
+
+    /**
+     * 产品分类id(必填)
+     */
+    @ExcelProperty(value = "产品分类id", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "必=填")
+    private Long productCategoryId;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 171 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBrandVo.java

@@ -0,0 +1,171 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.product.domain.ProductBrand;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品品牌信息视图对象 product_brand
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductBrand.class)
+public class ProductBrandVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 品牌编号(唯一标识)
+     */
+    @ExcelProperty(value = "品牌编号", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "唯=一标识")
+    private String brandNo;
+
+    /**
+     * 品牌中文名称
+     */
+    @ExcelProperty(value = "品牌中文名称")
+    private String brandName;
+
+    /**
+     * 品牌首字母缩写(如拼音首字母)
+     */
+    @ExcelProperty(value = "品牌首字母缩写", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=拼音首字母")
+    private String brandInitials;
+
+    /**
+     * 品牌英文名称
+     */
+    @ExcelProperty(value = "品牌英文名称")
+    private String brandEnglishName;
+
+    /**
+     * 推荐值(数值越大越靠前)
+     */
+    @ExcelProperty(value = "推荐值", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "数=值越大越靠前")
+    private Long recommendValue;
+
+    /**
+     * 品牌Logo图片路径或URL
+     */
+    @ExcelProperty(value = "品牌Logo图片路径或URL")
+    private String brandLogo;
+
+    /**
+     * 品牌标题(用于展示)
+     */
+    @ExcelProperty(value = "品牌标题", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "用=于展示")
+    private String brandTitle;
+
+    /**
+     * 品牌大图(横幅/封面图)
+     */
+    @ExcelProperty(value = "品牌大图", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "横=幅/封面图")
+    private String brandBigImage;
+
+    /**
+     * 品牌大图(横幅/封面图)Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "brandBigImage")
+    private String brandBigImageUrl;
+    /**
+     * 品牌故事(简介文本)
+     */
+    @ExcelProperty(value = "品牌故事", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "简=介文本")
+    private String brandStory;
+
+    /**
+     * 是否显示(1=显示,0=隐藏)
+     */
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "1==显示,0=隐藏")
+    private Long isShow;
+
+    /**
+     * 品牌注册人
+     */
+    @ExcelProperty(value = "品牌注册人")
+    private String brandRegistrant;
+
+    /**
+     * 许可证编号
+     */
+    @ExcelProperty(value = "许可证编号")
+    private String license;
+
+    /**
+     * 注册证书编号
+     */
+    @ExcelProperty(value = "注册证书编号")
+    private String registrationCertificate;
+
+    /**
+     * 证书/许可过期时间
+     */
+    @ExcelProperty(value = "证书/许可过期时间")
+    private Date expireTime;
+
+    /**
+     * 品牌描述(较长文本)
+     */
+    @ExcelProperty(value = "品牌描述", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "较=长文本")
+    private String brandDescribe;
+
+    /**
+     * 展示位置(如首页、分类页等)
+     */
+    @ExcelProperty(value = "展示位置", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=首页、分类页等")
+    private String position;
+
+    /**
+     * 关注度/收藏数(默认为0)
+     */
+    @ExcelProperty(value = "关注度/收藏数", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "默=认为0")
+    private Long care;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 183 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductCategoryVo.java

@@ -0,0 +1,183 @@
+package org.dromara.product.domain.vo;
+
+import java.math.BigDecimal;
+import org.dromara.product.domain.ProductCategory;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品分类视图对象 product_category
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductCategory.class)
+public class ProductCategoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 分类编号
+     */
+    @ExcelProperty(value = "分类编号")
+    private String categoryNo;
+
+    /**
+     * 分类名称
+     */
+    @ExcelProperty(value = "分类名称")
+    private String categoryName;
+
+    /**
+     * 父级分类ID
+     */
+    @ExcelProperty(value = "父级分类ID")
+    private Long parentId;
+
+    /**
+     * 祖籍列表
+     */
+    @ExcelProperty(value = "祖籍列表")
+    private String ancestors;
+
+    /**
+     * 分类层级(1=一级,2=二级, 3三级)
+     */
+    @ExcelProperty(value = "分类层级", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "1==一级,2=二级,,3=三级")
+    private Long classLevel;
+
+    /**
+     * 是否显示(1=显示,0=隐藏)
+     */
+    @ExcelProperty(value = "是否显示", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "1==显示,0=隐藏")
+    private Long isShow;
+
+    /**
+     * 是否在GPS中显示
+     */
+    @ExcelProperty(value = "是否在GPS中显示")
+    private Long isShowGps;
+
+    /**
+     * 折扣率(可能为JSON或文本)
+     */
+    @ExcelProperty(value = "折扣率", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "可=能为JSON或文本")
+    private BigDecimal discountRate;
+
+    /**
+     * 拼音码(用于快速检索)
+     */
+    @ExcelProperty(value = "拼音码", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "用=于快速检索")
+    private String pyCode;
+
+    /**
+     * 分类描述
+     */
+    @ExcelProperty(value = "分类描述")
+    private String classDescription;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 自定义标签1
+     */
+    @ExcelProperty(value = "自定义标签1")
+    private String oneLable1;
+
+    /**
+     * 自定义标签2
+     */
+    @ExcelProperty(value = "自定义标签2")
+    private String oneLable2;
+
+    /**
+     * 自定义链接1
+     */
+    @ExcelProperty(value = "自定义链接1")
+    private String oneLink1;
+
+    /**
+     * 自定义链接2
+     */
+    @ExcelProperty(value = "自定义链接2")
+    private String oneLink2;
+
+    /**
+     * 排序值,默认为0
+     */
+    @ExcelProperty(value = "排序值,默认为0")
+    private Long sort;
+
+    /**
+     * 颜色(如CSS颜色值)
+     */
+    @ExcelProperty(value = "颜色", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=CSS颜色值")
+    private String color;
+
+    /**
+     * 采购编号
+     */
+    @ExcelProperty(value = "采购编号")
+    private String purchaseNo;
+
+    /**
+     * 采购名称
+     */
+    @ExcelProperty(value = "采购名称")
+    private String purchaseName;
+
+    /**
+     * 采购负责人编号
+     */
+    @ExcelProperty(value = "采购负责人编号")
+    private String purchaseManagerNo;
+
+    /**
+     * 采购负责人姓名
+     */
+    @ExcelProperty(value = "采购负责人姓名")
+    private String purchaseManagerName;
+
+    /**
+     * 所属平台(0=Web, 1=小程序)
+     */
+    @ExcelProperty(value = "所属平台", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0==Web,,1==小程序")
+    private Long platform;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 63 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductClassificationVo.java

@@ -0,0 +1,63 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductClassification;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品属性关联视图对象 product_classification
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductClassification.class)
+public class ProductClassificationVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 产品id
+     */
+    @ExcelProperty(value = "产品id")
+    private Long productId;
+
+    /**
+     * 分类编号
+     */
+    @ExcelProperty(value = "分类编号")
+    private Long categoryId;
+
+    /**
+     * 属性列表(JSON或分号分隔等格式)
+     */
+    @ExcelProperty(value = "属性列表", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "J=SON或分号分隔等格式")
+    private String attributesList;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 96 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductCustomizationVo.java

@@ -0,0 +1,96 @@
+package org.dromara.product.domain.vo;
+
+import java.math.BigDecimal;
+import org.dromara.product.domain.ProductCustomization;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品定制信息视图对象 product_customization
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductCustomization.class)
+public class ProductCustomizationVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 定制编号
+     */
+    @ExcelProperty(value = "定制编号")
+    private String customizationNo;
+
+    /**
+     * 产品id
+     */
+    @ExcelProperty(value = "产品id")
+    private Long productId;
+
+    /**
+     * 定制方式  支持多选,分隔  (0=包装定制,1=商品定制,2=开模定制)
+     */
+    @ExcelProperty(value = "定制方式  支持多选,分隔  (0=包装定制,1=商品定制,2=开模定制)")
+    private String customizedStyle;
+
+    /**
+     * 定制工艺  支持多选,分隔  (0=丝印,1=热转印,2=激光,烤花,压印)
+     */
+    @ExcelProperty(value = "定制工艺  支持多选,分隔  (0=丝印,1=热转印,2=激光,烤花,压印)")
+    private String customizedCraft;
+
+    /**
+     * 打样周期(天)
+     */
+    @ExcelProperty(value = "打样周期", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "天=")
+    private Long proofingPeriod;
+
+    /**
+     * 生产周期(天)
+     */
+    @ExcelProperty(value = "生产周期", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "天=")
+    private Long productionCycle;
+
+    /**
+     * 最小起订量(MOQ)
+     */
+    @ExcelProperty(value = "最小起订量", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "M=OQ")
+    private Long moq;
+
+    /**
+     * MOQ对应价格
+     */
+    @ExcelProperty(value = "MOQ对应价格")
+    private BigDecimal moqPrice;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 58 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductEnsureVo.java

@@ -0,0 +1,58 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductEnsure;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品保障项视图对象 product_ensure
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductEnsure.class)
+public class ProductEnsureVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 保障名称(如:正品保证、售后保障等)
+     */
+    @ExcelProperty(value = "保障名称", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:正品保证、售后保障等")
+    private String ensureName;
+
+    /**
+     * 数据来源(如:系统配置、接口同步等)
+     */
+    @ExcelProperty(value = "数据来源", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:系统配置、接口同步等")
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 280 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductExtendVo.java

@@ -0,0 +1,280 @@
+package org.dromara.product.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.product.domain.ProductExtend;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品扩展属性(低频访问字段)视图对象 product_extend
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductExtend.class)
+public class ProductExtendVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 关联 product_base.id
+     */
+    @ExcelProperty(value = "关联 product_base.id")
+    private Long productId;
+
+    /**
+     * 促销标题
+     */
+    @ExcelProperty(value = "促销标题")
+    private String promotionTitle;
+
+    /**
+     * 发票名称
+     */
+    @ExcelProperty(value = "发票名称")
+    private String invoiceName;
+
+    /**
+     * 发票类型
+     */
+    @ExcelProperty(value = "发票类型")
+    private String invoiceType;
+
+    /**
+     * 规格代码
+     */
+    @ExcelProperty(value = "规格代码")
+    private String specificationsCode;
+
+    /**
+     * 条形码
+     */
+    @ExcelProperty(value = "条形码")
+    private String barCoding;
+
+    /**
+     * 产品描述
+     */
+    @ExcelProperty(value = "产品描述")
+    private String productDescription;
+
+    /**
+     * 产品重量
+     */
+    @ExcelProperty(value = "产品重量")
+    private String productWeight;
+
+    /**
+     * 重量单位
+     */
+    @ExcelProperty(value = "重量单位")
+    private String weightUnit;
+
+    /**
+     * 产品体积
+     */
+    @ExcelProperty(value = "产品体积")
+    private String productVolume;
+
+    /**
+     * 体积单位
+     */
+    @ExcelProperty(value = "体积单位")
+    private String volumeUnit;
+
+    /**
+     * 售后服务
+     */
+    @ExcelProperty(value = "售后服务")
+    private String afterSalesService;
+
+    /**
+     * 服务保障  支持多选,分隔 (0=无忧退货,1=快速退款,2=免费包邮,3正品保障)
+     */
+    @ExcelProperty(value = "服务保障  支持多选,分隔 (0=无忧退货,1=快速退款,2=免费包邮,3正品保障)")
+    private String serviceGuarantee;
+
+    /**
+     * 是否安装服务:1=是,0=否
+     */
+    @ExcelProperty(value = "是否安装服务:1=是,0=否")
+    private String isInstallService;
+
+    /**
+     * 安装费用
+     */
+    @ExcelProperty(value = "安装费用")
+    private String installAmount;
+
+    /**
+     * 分销价格
+     */
+    @ExcelProperty(value = "分销价格")
+    private String distributionPrice;
+
+    /**
+     * 标准尺寸
+     */
+    @ExcelProperty(value = "标准尺寸")
+    private String standardSizes;
+
+    /**
+     * 克重
+     */
+    @ExcelProperty(value = "克重")
+    private String gramWeight;
+
+    /**
+     * 透明度
+     */
+    @ExcelProperty(value = "透明度")
+    private String opacity;
+
+    /**
+     * 是否可定制:1=是,0=否
+     */
+    @ExcelProperty(value = "是否可定制:1=是,0=否")
+    private String isCustomize;
+
+    /**
+     * 定制描述
+     */
+    @ExcelProperty(value = "定制描述")
+    private String customDescription;
+
+    /**
+     * 产品利润
+     */
+    @ExcelProperty(value = "产品利润")
+    private String productProfit;
+
+    /**
+     * 报告需求
+     */
+    @ExcelProperty(value = "报告需求")
+    private String reportRequire;
+
+    /**
+     * 审核评论
+     */
+    @ExcelProperty(value = "审核评论")
+    private String reviewComments;
+
+    /**
+     * 供应商编号
+     */
+    @ExcelProperty(value = "供应商编号")
+    private String supplierNo;
+
+    /**
+     * 推送状态
+     */
+    @ExcelProperty(value = "推送状态")
+    private String pushStatus;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 发票规格
+     */
+    @ExcelProperty(value = "发票规格")
+    private String invoiceSpecs;
+
+    /**
+     * 增量
+     */
+    @ExcelProperty(value = "增量")
+    private Long increment;
+
+    /**
+     * 采购编号
+     */
+    @ExcelProperty(value = "采购编号")
+    private String purchaseNo;
+
+    /**
+     * 采购名称
+     */
+    @ExcelProperty(value = "采购名称")
+    private String purchaseName;
+
+    /**
+     * 供应商名称
+     */
+    @ExcelProperty(value = "供应商名称")
+    private String supplierName;
+
+    /**
+     * 采购经理编号
+     */
+    @ExcelProperty(value = "采购经理编号")
+    private String purchaseManagerNo;
+
+    /**
+     * 采购经理姓名
+     */
+    @ExcelProperty(value = "采购经理姓名")
+    private String purchaseManagerName;
+
+    /**
+     * 参考链接
+     */
+    @ExcelProperty(value = "参考链接")
+    private String referenceLink;
+
+    /**
+     * 销售量
+     */
+    @ExcelProperty(value = "销售量")
+    private Long salesVolume;
+
+    /**
+     * 发货时效
+     */
+    @ExcelProperty(value = "发货时效")
+    private String deliveryTime;
+
+    /**
+     * PIT时间
+     */
+    @ExcelProperty(value = "PIT时间")
+    private Date pitTime;
+
+    /**
+     * 创建时的供应商标识
+     */
+    @ExcelProperty(value = "创建时的供应商标识")
+    private String createSupplier;
+
+    /**
+     * 其他补充信息
+     */
+    @ExcelProperty(value = "其他补充信息")
+    private String otherInfo;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 65 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductLableVo.java

@@ -0,0 +1,65 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductLable;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品标签信息(注意:名疑似拼写错误,应为 product_label)视图对象 product_lable
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductLable.class)
+public class ProductLableVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @ExcelProperty(value = "主键,自增ID")
+    private Long id;
+
+    /**
+     * 产品标签编号(如:NEW2025、HOT、VIP_ONLY 等)
+     */
+    @ExcelProperty(value = "产品标签编号", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:NEW2025、HOT、VIP_ONLY,等=")
+    private String productLabelNo;
+
+    /**
+     * 标签显示名称(如:新品、热销、限时优惠)
+     */
+    @ExcelProperty(value = "标签显示名称", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:新品、热销、限时优惠")
+    private String productLabelName;
+
+    /**
+     * 使用该标签的产品数量(可用于统计或缓存)
+     */
+    @ExcelProperty(value = "使用该标签的产品数量", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "可=用于统计或缓存")
+    private Long productQuantity;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 87 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductPoolLinkVo.java

@@ -0,0 +1,87 @@
+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 java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品池和产品关联视图对象 product_pool_link
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductPoolLink.class)
+public class ProductPoolLinkVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 所属池ID
+     */
+    @ExcelProperty(value = "所属池ID")
+    private Long poolId;
+
+    /**
+     * 产品id
+     */
+    @ExcelProperty(value = "产品id")
+    private Long productId;
+
+    /**
+     * 产品价格
+     */
+    @ExcelProperty(value = "产品价格")
+    private BigDecimal productPrice;
+
+    /**
+     * 是否在池中:1-是,0-否
+     */
+    @ExcelProperty(value = "是否在池中:1-是,0-否")
+    private String isPoolStatus;
+
+    /**
+     * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+     */
+    @ExcelProperty(value = "产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回")
+    private String productReviewStatus;
+
+    /**
+     * 审核原因
+     */
+    @ExcelProperty(value = "审核原因")
+    private String reviewReason;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    @ExcelProperty(value = "是否显示:1=是,0=否")
+    private String isShow;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 74 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductPoolVo.java

@@ -0,0 +1,74 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductPool;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品池视图对象 product_pool
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductPool.class)
+public class ProductPoolVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 池编码
+     */
+    @ExcelProperty(value = "池编码")
+    private String poolNo;
+
+    /**
+     * 池名称
+     */
+    @ExcelProperty(value = "池名称")
+    private String name;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    @ExcelProperty(value = "是否显示:1=是,0=否")
+    private String isShow;
+
+    /**
+     * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
+     */
+    @ExcelProperty(value = "产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回")
+    private String productReviewStatus;
+
+    /**
+     * 审核原因
+     */
+    @ExcelProperty(value = "审核原因")
+    private String reviewReason;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 111 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductPriceInventoryVo.java

@@ -0,0 +1,111 @@
+package org.dromara.product.domain.vo;
+
+import java.math.BigDecimal;
+import org.dromara.product.domain.ProductPriceInventory;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品价格与库存信息视图对象 product_price_inventory
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductPriceInventory.class)
+public class ProductPriceInventoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 关联 product_base.id
+     */
+    @ExcelProperty(value = "关联 product_base.id")
+    private Long productId;
+
+    /**
+     * 市场价格
+     */
+    @ExcelProperty(value = "市场价格")
+    private BigDecimal marketPrice;
+
+    /**
+     * 会员价格
+     */
+    @ExcelProperty(value = "会员价格")
+    private BigDecimal memberPrice;
+
+    /**
+     * 最低销售价格
+     */
+    @ExcelProperty(value = "最低销售价格")
+    private BigDecimal minSellingPrice;
+
+    /**
+     * 采购价格
+     */
+    @ExcelProperty(value = "采购价格")
+    private BigDecimal purchasingPrice;
+
+    /**
+     * 最高采购价格
+     */
+    @ExcelProperty(value = "最高采购价格")
+    private BigDecimal maxPurchasePrice;
+
+    /**
+     * 总库存量
+     */
+    @ExcelProperty(value = "总库存量")
+    private Long totalInventory;
+
+    /**
+     * 当前可用库存
+     */
+    @ExcelProperty(value = "当前可用库存")
+    private Long nowInventory;
+
+    /**
+     * 虚拟库存
+     */
+    @ExcelProperty(value = "虚拟库存")
+    private Long virtualInventory;
+
+    /**
+     * 最小起订数量
+     */
+    @ExcelProperty(value = "最小起订数量")
+    private Long minOrderQuantity;
+
+    /**
+     * 税率
+     */
+    @ExcelProperty(value = "税率")
+    private BigDecimal taxRate;
+
+    /**
+     * 货币类型
+     */
+    @ExcelProperty(value = "货币类型")
+    private String currency;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 56 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductProgramLinkVo.java

@@ -0,0 +1,56 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductProgramLink;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 项目方案关联视图对象 product_program_link
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductProgramLink.class)
+public class ProductProgramLinkVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 项目编号
+     */
+    @ExcelProperty(value = "项目编号")
+    private Long programId;
+
+    /**
+     * 产品编号
+     */
+    @ExcelProperty(value = "产品编号")
+    private Long productId;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 122 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductProgramVo.java

@@ -0,0 +1,122 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.product.domain.ProductProgram;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品解决方案/项目方案视图对象 product_program
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductProgram.class)
+public class ProductProgramVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @ExcelProperty(value = "主键,自增ID")
+    private Long id;
+
+    /**
+     * 方案编号(唯一标识)
+     */
+    @ExcelProperty(value = "方案编号", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "唯=一标识")
+    private String programNo;
+
+    /**
+     * 方案标题
+     */
+    @ExcelProperty(value = "方案标题")
+    private String title;
+
+    /**
+     * 方案描述(注意:字段名为 SQL 关键字,建议未来重命名为 description)
+     */
+    @ExcelProperty(value = "方案描述", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "注=意:字段名为,S=QL,关=键字,建议未来重命名为,d=escription")
+    private String describe;
+
+    /**
+     * 所属分类编号或名称
+     */
+    @ExcelProperty(value = "所属分类编号或名称")
+    private String category;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    @ExcelProperty(value = "是否显示:1=是,0=否")
+    private String isShow;
+
+    /**
+     * 封面图片URL(可存储较长路径)
+     */
+    @ExcelProperty(value = "封面图片URL", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "可=存储较长路径")
+    private String coverImage;
+
+    /**
+     * 封面图片URL(可存储较长路径)Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "coverImage")
+    private String coverImageUrl;
+    /**
+     * 方案内容(如简介、详情等)
+     */
+    @ExcelProperty(value = "方案内容", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=简介、详情等")
+    private String content;
+
+    /**
+     * 所属行业编号或名称
+     */
+    @ExcelProperty(value = "所属行业编号或名称")
+    private String industry;
+
+    /**
+     * 适配产品/设备编号
+     */
+    @ExcelProperty(value = "适配产品/设备编号")
+    private String adaptNo;
+
+    /**
+     * 标签
+     */
+    @ExcelProperty(value = "标签")
+    private String label;
+
+    /**
+     * 内部广告内容(如 Banner 文案或链接)
+     */
+    @ExcelProperty(value = "内部广告内容", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=,B=anner,文=案或链接")
+    private String innerAdvert;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 56 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductRecommendLinkVo.java

@@ -0,0 +1,56 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductRecommendLink;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品推荐关联视图对象 product_recommend_link
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductRecommendLink.class)
+public class ProductRecommendLinkVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 项目编号
+     */
+    @ExcelProperty(value = "项目编号")
+    private Long recommendId;
+
+    /**
+     * 产品编号
+     */
+    @ExcelProperty(value = "产品编号")
+    private Long productId;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 77 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductRecommendVo.java

@@ -0,0 +1,77 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductRecommend;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品推荐位配置视图对象 product_recommend
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductRecommend.class)
+public class ProductRecommendVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @ExcelProperty(value = "主键,自增ID")
+    private Long id;
+
+    /**
+     * 推荐编号(唯一标识)
+     */
+    @ExcelProperty(value = "推荐编号", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "唯=一标识")
+    private String recommendNo;
+
+    /**
+     * 推荐名称(如:首页爆款、新品专区等)
+     */
+    @ExcelProperty(value = "推荐名称", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:首页爆款、新品专区等")
+    private String recommendName;
+
+    /**
+     * 推荐位描述(用于后台说明或前端提示)
+     */
+    @ExcelProperty(value = "推荐位描述", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "用=于后台说明或前端提示")
+    private String recommendDescribe;
+
+    /**
+     * 是否显示:1=显示,0=隐藏
+     */
+    @ExcelProperty(value = "是否显示:1=显示,0=隐藏")
+    private String isShow;
+
+    /**
+     * 推荐封面图片路径或URL
+     */
+    @ExcelProperty(value = "推荐封面图片路径或URL")
+    private String recommendCoverphoto;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 63 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductSpecsVo.java

@@ -0,0 +1,63 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductSpecs;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品规格关联视图对象 product_specs
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductSpecs.class)
+public class ProductSpecsVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 主产品编号
+     */
+    @ExcelProperty(value = "主产品编号")
+    private String productId;
+
+    /**
+     * 关联的规格产品id列表(如:逗号分隔的产品id)
+     */
+    @ExcelProperty(value = "关联的规格产品id列表", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:逗号分隔的产品id")
+    private String specsProductIds;
+
+    /**
+     * 是否单向关联:0=双向,1=单向
+     */
+    @ExcelProperty(value = "是否单向关联:0=双向,1=单向")
+    private String isUnidirectional;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 75 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductTaxrateVo.java

@@ -0,0 +1,75 @@
+package org.dromara.product.domain.vo;
+
+import java.math.BigDecimal;
+import org.dromara.product.domain.ProductTaxrate;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品税率配置视图对象 product_taxrate
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductTaxrate.class)
+public class ProductTaxrateVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @ExcelProperty(value = "主键,自增ID")
+    private Long id;
+
+    /**
+     * 税率编号
+     */
+    @ExcelProperty(value = "税率编号")
+    private String taxrateNo;
+
+    /**
+     * 税率名称
+     */
+    @ExcelProperty(value = "税率名称")
+    private String taxrateName;
+
+    /**
+     * 税率值)
+     */
+    @ExcelProperty(value = "税率值)")
+    private BigDecimal taxrate;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    @ExcelProperty(value = "是否显示:1=是,0=否")
+    private String isShow;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 69 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductUnitVo.java

@@ -0,0 +1,69 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductUnit;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品计量单位视图对象 product_unit
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductUnit.class)
+public class ProductUnitVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键,自增ID
+     */
+    @ExcelProperty(value = "主键,自增ID")
+    private Long id;
+
+    /**
+     * 单位编号
+     */
+    @ExcelProperty(value = "单位编号")
+    private String unitNo;
+
+    /**
+     * 单位名称(如:件、箱、千克等)
+     */
+    @ExcelProperty(value = "单位名称", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:件、箱、千克等")
+    private String unitName;
+
+    /**
+     * 数据来源
+     */
+    @ExcelProperty(value = "数据来源")
+    private String dataSource;
+
+    /**
+     * 是否显示:1=是,0=否
+     */
+    @ExcelProperty(value = "是否显示:1=是,0=否")
+    private String isShow;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 58 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductVolumeUnitVo.java

@@ -0,0 +1,58 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductVolumeUnit;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品体积单位视图对象 product_volume_unit
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductVolumeUnit.class)
+public class ProductVolumeUnitVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 体积单位名称(如:立方米、升、立方厘米等)
+     */
+    @ExcelProperty(value = "体积单位名称", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:立方米、升、立方厘米等")
+    private String unitName;
+
+    /**
+     * 数据来源(如:系统配置、接口同步等)
+     */
+    @ExcelProperty(value = "数据来源", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:系统配置、接口同步等")
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 58 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductWeightUnitVo.java

@@ -0,0 +1,58 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductWeightUnit;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 产品重量单位视图对象 product_weight_unit
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductWeightUnit.class)
+public class ProductWeightUnitVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 重量单位名称(如:千克、克、吨、磅等)
+     */
+    @ExcelProperty(value = "重量单位名称", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:千克、克、吨、磅等")
+    private String unitName;
+
+    /**
+     * 数据来源(如:系统配置、接口同步等)
+     */
+    @ExcelProperty(value = "数据来源", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "如=:系统配置、接口同步等")
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProductAfterSales;
+import org.dromara.product.domain.vo.ProductAfterSalesVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 产品售后服务项Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface ProductAfterSalesMapper extends BaseMapperPlus<ProductAfterSales, ProductAfterSalesVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProductAssociate;
+import org.dromara.product.domain.vo.ProductAssociateVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 产品关联Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface ProductAssociateMapper extends BaseMapperPlus<ProductAssociate, ProductAssociateVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProductAttributes;
+import org.dromara.product.domain.vo.ProductAttributesVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 产品属性定义(用于动态属性配置)Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface ProductAttributesMapper extends BaseMapperPlus<ProductAttributes, ProductAttributesVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProductBase;
+import org.dromara.product.domain.vo.ProductBaseVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 产品基础信息Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface ProductBaseMapper extends BaseMapperPlus<ProductBase, ProductBaseVo> {
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProductBlacklist;
+import org.dromara.product.domain.vo.ProductBlacklistVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 产品黑名单Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+public interface ProductBlacklistMapper extends BaseMapperPlus<ProductBlacklist, ProductBlacklistVo> {
+
+}

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác