Commit d2e965fb02049add426fed1f326f3df6fc212f53

Authored by ZanGe丶
1 parent 1a93e3a1

【CRM:优化产品以及产品分类】

Showing 30 changed files with 442 additions and 319 deletions
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
... ... @@ -50,11 +50,18 @@ public interface ErrorCodeConstants {
50 50 ErrorCode CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_007, "删除数据权限失败,原因:不能删除负责人");
51 51  
52 52 // ========== 产品 1_020_008_000 ==========
53   - ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1_020_008_000, "产品不存在");
54   - ErrorCode PRODUCT_NO_EXISTS = new ErrorCode(1_020_008_001, "产品编号已存在");
  53 + ErrorCode CRM_PRODUCT_NOT_EXISTS = new ErrorCode(1_020_008_000, "产品不存在");
  54 + ErrorCode CRM_PRODUCT_NO_EXISTS = new ErrorCode(1_020_008_001, "产品编号已存在");
55 55  
56 56 // ========== 产品分类 1_020_009_000 ==========
57   - ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_020_009_000, "产品分类不存在");
  57 + ErrorCode CRM_PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_020_009_000, "产品分类不存在");
  58 + ErrorCode CRM_PRODUCT_CATEGORY_EXISTS = new ErrorCode(1_020_009_001, "产品分类已存在");
  59 +
  60 + ErrorCode CRM_PRODUCT_CATEGORY_USED = new ErrorCode(1_020_009_002, "产品分类已关联产品");
  61 +
  62 + ErrorCode CRM_CATEGORY_PARENT_NOT_EXISTS = new ErrorCode(1_020_009_003, "父分类不存在");
  63 + ErrorCode CRM_CATEGORY_PARENT_NOT_FIRST_LEVEL = new ErrorCode(1_020_009_004, "父分类不能是二级分类");
  64 + ErrorCode CRM_CATEGORY_EXISTS_CHILDREN = new ErrorCode(1_020_009_005, "存在子分类,无法删除");
58 65  
59 66 // ========== 商机状态类型 1_020_010_000 ==========
60 67 ErrorCode BUSINESS_STATUS_TYPE_NOT_EXISTS = new ErrorCode(1_020_010_000, "商机状态类型不存在");
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/product/CrmProductStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.enums.product;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +/**
  10 + * @author ZanGe丶
  11 + * @create 2023-11-30 21:53
  12 + */
  13 +@Getter
  14 +@AllArgsConstructor
  15 +public enum CrmProductStatusEnum implements IntArrayValuable {
  16 + DISABLE(0, "下架"),
  17 + ENABLE(1, "上架");
  18 +
  19 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmProductStatusEnum::getStatus).toArray();
  20 +
  21 + /**
  22 + * 状态
  23 + */
  24 + private final Integer status;
  25 + /**
  26 + * 状态名
  27 + */
  28 + private final String name;
  29 +
  30 + @Override
  31 + public int[] array() {
  32 + return ARRAYS;
  33 + }
  34 +
  35 + /**
  36 + * 判断是否处于【上架】状态
  37 + *
  38 + * @param status 状态
  39 + * @return 是否处于【上架】状态
  40 + */
  41 + public static boolean isEnable(Integer status) {
  42 + return ENABLE.getStatus().equals(status);
  43 + }
  44 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/productcategory/ProductCategoryController.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductCategoryController.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.productcategory;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product;
2 2  
3   -import org.springframework.web.bind.annotation.*;
4   -import javax.annotation.Resource;
5   -import org.springframework.validation.annotation.Validated;
6   -import org.springframework.security.access.prepost.PreAuthorize;
7   -import io.swagger.v3.oas.annotations.tags.Tag;
8   -import io.swagger.v3.oas.annotations.Parameter;
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryCreateReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryListReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryRespVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryUpdateReqVO;
  8 +import cn.iocoder.yudao.module.crm.convert.product.CrmProductCategoryConvert;
  9 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;
  10 +import cn.iocoder.yudao.module.crm.service.product.CrmProductCategoryService;
9 11 import io.swagger.v3.oas.annotations.Operation;
  12 +import io.swagger.v3.oas.annotations.Parameter;
  13 +import io.swagger.v3.oas.annotations.tags.Tag;
  14 +import org.springframework.security.access.prepost.PreAuthorize;
  15 +import org.springframework.validation.annotation.Validated;
  16 +import org.springframework.web.bind.annotation.*;
10 17  
11   -import javax.validation.constraints.*;
12   -import javax.validation.*;
13   -import javax.servlet.http.*;
14   -import java.util.*;
15   -import java.io.IOException;
  18 +import javax.annotation.Resource;
  19 +import javax.validation.Valid;
  20 +import java.util.List;
16 21  
17   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
18   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
19 22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
20 23  
21   -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
22   -
23   -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
24   -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
25   -
26   -import cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo.*;
27   -import cn.iocoder.yudao.module.crm.dal.dataobject.productcategory.ProductCategoryDO;
28   -import cn.iocoder.yudao.module.crm.convert.productcategory.ProductCategoryConvert;
29   -import cn.iocoder.yudao.module.crm.service.productcategory.ProductCategoryService;
30   -
31 24 @Tag(name = "管理后台 - 产品分类")
32 25 @RestController
33 26 @RequestMapping("/crm/product-category")
34 27 @Validated
35   -public class ProductCategoryController {
  28 +public class CrmProductCategoryController {
36 29  
37 30 @Resource
38   - private ProductCategoryService productCategoryService;
  31 + private CrmProductCategoryService productCategoryService;
39 32  
40 33 @PostMapping("/create")
41 34 @Operation(summary = "创建产品分类")
42 35 @PreAuthorize("@ss.hasPermission('crm:product-category:create')")
43   - public CommonResult<Long> createProductCategory(@Valid @RequestBody ProductCategoryCreateReqVO createReqVO) {
  36 + public CommonResult<Long> createProductCategory(@Valid @RequestBody CrmProductCategoryCreateReqVO createReqVO) {
44 37 return success(productCategoryService.createProductCategory(createReqVO));
45 38 }
46 39  
47 40 @PutMapping("/update")
48 41 @Operation(summary = "更新产品分类")
49 42 @PreAuthorize("@ss.hasPermission('crm:product-category:update')")
50   - public CommonResult<Boolean> updateProductCategory(@Valid @RequestBody ProductCategoryUpdateReqVO updateReqVO) {
  43 + public CommonResult<Boolean> updateProductCategory(@Valid @RequestBody CrmProductCategoryUpdateReqVO updateReqVO) {
51 44 productCategoryService.updateProductCategory(updateReqVO);
52 45 return success(true);
53 46 }
... ... @@ -65,17 +58,17 @@ public class ProductCategoryController {
65 58 @Operation(summary = "获得产品分类")
66 59 @Parameter(name = "id", description = "编号", required = true, example = "1024")
67 60 @PreAuthorize("@ss.hasPermission('crm:product-category:query')")
68   - public CommonResult<ProductCategoryRespVO> getProductCategory(@RequestParam("id") Long id) {
69   - ProductCategoryDO productCategory = productCategoryService.getProductCategory(id);
70   - return success(ProductCategoryConvert.INSTANCE.convert(productCategory));
  61 + public CommonResult<CrmProductCategoryRespVO> getProductCategory(@RequestParam("id") Long id) {
  62 + CrmProductCategoryDO productCategory = productCategoryService.getProductCategory(id);
  63 + return success(CrmProductCategoryConvert.INSTANCE.convert(productCategory));
71 64 }
72 65  
73 66 @GetMapping("/list")
74 67 @Operation(summary = "获得产品分类列表")
75 68 @PreAuthorize("@ss.hasPermission('crm:product-category:query')")
76   - public CommonResult<List<ProductCategoryRespVO>> getProductCategoryList(@Valid ProductCategoryListReqVO treeListReqVO) {
77   - List<ProductCategoryDO> list = productCategoryService.getProductCategoryList(treeListReqVO);
78   - return success(ProductCategoryConvert.INSTANCE.convertList(list));
  69 + public CommonResult<List<CrmProductCategoryRespVO>> getProductCategoryList(@Valid CrmProductCategoryListReqVO treeListReqVO) {
  70 + List<CrmProductCategoryDO> list = productCategoryService.getProductCategoryList(treeListReqVO);
  71 + return success(CrmProductCategoryConvert.INSTANCE.convertList(list));
79 72 }
80 73  
81 74 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/ProductController.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/CrmProductController.java
... ... @@ -4,10 +4,10 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6 6 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7   -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.*;
8   -import cn.iocoder.yudao.module.crm.convert.product.ProductConvert;
9   -import cn.iocoder.yudao.module.crm.dal.dataobject.product.ProductDO;
10   -import cn.iocoder.yudao.module.crm.service.product.ProductService;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.*;
  8 +import cn.iocoder.yudao.module.crm.convert.product.CrmProductConvert;
  9 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
  10 +import cn.iocoder.yudao.module.crm.service.product.CrmProductService;
11 11 import io.swagger.v3.oas.annotations.Operation;
12 12 import io.swagger.v3.oas.annotations.Parameter;
13 13 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -28,22 +28,22 @@ import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.E
28 28 @RestController
29 29 @RequestMapping("/crm/product")
30 30 @Validated
31   -public class ProductController {
  31 +public class CrmProductController {
32 32  
33 33 @Resource
34   - private ProductService productService;
  34 + private CrmProductService productService;
35 35  
36 36 @PostMapping("/create")
37 37 @Operation(summary = "创建产品")
38 38 @PreAuthorize("@ss.hasPermission('crm:product:create')")
39   - public CommonResult<Long> createProduct(@Valid @RequestBody ProductCreateReqVO createReqVO) {
  39 + public CommonResult<Long> createProduct(@Valid @RequestBody CrmProductCreateReqVO createReqVO) {
40 40 return success(productService.createProduct(createReqVO));
41 41 }
42 42  
43 43 @PutMapping("/update")
44 44 @Operation(summary = "更新产品")
45 45 @PreAuthorize("@ss.hasPermission('crm:product:update')")
46   - public CommonResult<Boolean> updateProduct(@Valid @RequestBody ProductUpdateReqVO updateReqVO) {
  46 + public CommonResult<Boolean> updateProduct(@Valid @RequestBody CrmProductUpdateReqVO updateReqVO) {
47 47 productService.updateProduct(updateReqVO);
48 48 return success(true);
49 49 }
... ... @@ -61,29 +61,29 @@ public class ProductController {
61 61 @Operation(summary = "获得产品")
62 62 @Parameter(name = "id", description = "编号", required = true, example = "1024")
63 63 @PreAuthorize("@ss.hasPermission('crm:product:query')")
64   - public CommonResult<ProductRespVO> getProduct(@RequestParam("id") Long id) {
65   - ProductDO product = productService.getProduct(id);
66   - return success(ProductConvert.INSTANCE.convert(product));
  64 + public CommonResult<CrmProductRespVO> getProduct(@RequestParam("id") Long id) {
  65 + CrmProductDO product = productService.getProduct(id);
  66 + return success(CrmProductConvert.INSTANCE.convert(product));
67 67 }
68 68  
69 69 @GetMapping("/page")
70 70 @Operation(summary = "获得产品分页")
71 71 @PreAuthorize("@ss.hasPermission('crm:product:query')")
72   - public CommonResult<PageResult<ProductRespVO>> getProductPage(@Valid ProductPageReqVO pageVO) {
73   - PageResult<ProductDO> pageResult = productService.getProductPage(pageVO);
74   - return success(ProductConvert.INSTANCE.convertPage(pageResult));
  72 + public CommonResult<PageResult<CrmProductRespVO>> getProductPage(@Valid CrmProductPageReqVO pageVO) {
  73 + PageResult<CrmProductDO> pageResult = productService.getProductPage(pageVO);
  74 + return success(CrmProductConvert.INSTANCE.convertPage(pageResult));
75 75 }
76 76  
77 77 @GetMapping("/export-excel")
78 78 @Operation(summary = "导出产品 Excel")
79 79 @PreAuthorize("@ss.hasPermission('crm:product:export')")
80 80 @OperateLog(type = EXPORT)
81   - public void exportProductExcel(@Valid ProductExportReqVO exportReqVO,
  81 + public void exportProductExcel(@Valid CrmProductExportReqVO exportReqVO,
82 82 HttpServletResponse response) throws IOException {
83   - List<ProductDO> list = productService.getProductList(exportReqVO);
  83 + List<CrmProductDO> list = productService.getProductList(exportReqVO);
84 84 // 导出 Excel
85   - List<ProductExcelVO> datas = ProductConvert.INSTANCE.convertList02(list);
86   - ExcelUtils.write(response, "产品.xls", "数据", ProductExcelVO.class, datas);
  85 + List<CrmProductExcelVO> datas = CrmProductConvert.INSTANCE.convertList02(list);
  86 + ExcelUtils.write(response, "产品.xls", "数据", CrmProductExcelVO.class, datas);
87 87 }
88 88  
89 89 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/ProductBaseVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductBaseVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.product.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.product;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
5 5  
6 6 import javax.validation.constraints.NotNull;
7 7  
8   -// TODO @zange:需要加 CRM 前置噢
  8 +// TODO @zange-ok:需要加 CRM 前置噢
9 9 /**
10 10 * 产品 Base VO,提供给添加、修改、详细的子 VO 使用
11 11 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
12 12 */
13 13 @Data
14   -public class ProductBaseVO {
  14 +public class CrmProductBaseVO {
15 15  
16 16 // TODO @zange:example 要写哈;主要是接口文档,可以基于 example 可以生产请求参数
17 17  
18   - @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
  18 + @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "好产品")
19 19 @NotNull(message = "产品名称不能为空")
20 20 private String name;
21 21  
22   - @Schema(description = "产品编码", requiredMode = Schema.RequiredMode.REQUIRED)
  22 + @Schema(description = "产品编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "12306")
23 23 @NotNull(message = "产品编码不能为空")
24 24 private String no;
25 25  
26   - @Schema(description = "单位")
  26 + @Schema(description = "单位", example = "2")
27 27 private String unit;
28 28  
29 29 @Schema(description = "价格", example = "8911")
30 30 private Long price;
31 31  
32   - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
  32 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "上架")
33 33 @NotNull(message = "状态不能为空")
34 34 private Integer status;
35 35  
36   - @Schema(description = "产品分类ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1738")
  36 + @Schema(description = "产品分类ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
37 37 @NotNull(message = "产品分类ID不能为空")
38 38 private Long categoryId;
39 39  
40 40 @Schema(description = "产品描述", example = "你说的对")
41 41 private String description;
42 42  
43   - // TODO @zange:这个字段只有 create 可以传递,update 不传递;所以放到 create 和 resp 里;
44   -
45   - @Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31926")
46   - @NotNull(message = "负责人的用户编号不能为空")
47   - private Long ownerUserId;
  43 + // TODO @zange-ok:这个字段只有 create 可以传递,update 不传递;所以放到 create 和 resp 里;
48 44  
49 45 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/ProductCreateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductCreateReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.product.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.product;
2 2  
3 3 import lombok.*;
4   -import java.util.*;
5 4 import io.swagger.v3.oas.annotations.media.Schema;
6   -import javax.validation.constraints.*;
  5 +
  6 +import javax.validation.constraints.NotNull;
7 7  
8 8 @Schema(description = "管理后台 - 产品创建 Request VO")
9 9 @Data
10 10 @EqualsAndHashCode(callSuper = true)
11 11 @ToString(callSuper = true)
12   -public class ProductCreateReqVO extends ProductBaseVO {
13   -
  12 +public class CrmProductCreateReqVO extends CrmProductBaseVO {
  13 + @Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31926")
  14 + @NotNull(message = "负责人的用户编号不能为空")
  15 + private Long ownerUserId;
14 16 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/ProductExcelVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductExcelVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.product.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.product;
2 2  
3 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
... ... @@ -7,14 +7,14 @@ import lombok.Data;
7 7  
8 8 import java.time.LocalDateTime;
9 9  
10   -// TODO 芋艿:这个导出最后搞
  10 +// TODO 芋艿:这个导出最后搞 那暂时就放着不动了哈
11 11 /**
12 12 * 产品 Excel VO
13 13 *
14 14 * @author ZanGe丶
15 15 */
16 16 @Data
17   -public class ProductExcelVO {
  17 +public class CrmProductExcelVO {
18 18  
19 19 @ExcelProperty("主键id")
20 20 private Long id;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/ProductExportReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductExportReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.product.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.product;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
... ... @@ -11,7 +11,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
11 11 // TODO 芋艿:这个导出最后搞
12 12 @Schema(description = "管理后台 - 产品 Excel 导出 Request VO,参数和 ProductPageReqVO 是一致的")
13 13 @Data
14   -public class ProductExportReqVO {
  14 +public class CrmProductExportReqVO {
15 15  
16 16 @Schema(description = "产品名称", example = "李四")
17 17 private String name;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/ProductPageReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductPageReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.product.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.product;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
... ... @@ -11,12 +11,12 @@ import java.time.LocalDateTime;
11 11  
12 12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13 13  
14   -// TODO @zange:按照需求,裁剪下筛选的字段,目前应该只要 name 和 status
  14 +// TODO @zange-ok:按照需求,裁剪下筛选的字段,目前应该只要 name 和 status
15 15 @Schema(description = "管理后台 - 产品分页 Request VO")
16 16 @Data
17 17 @EqualsAndHashCode(callSuper = true)
18 18 @ToString(callSuper = true)
19   -public class ProductPageReqVO extends PageParam {
  19 +public class CrmProductPageReqVO extends PageParam {
20 20  
21 21 @Schema(description = "产品名称", example = "李四")
22 22 private String name;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/ProductRespVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductRespVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.product.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.product;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
  5 +
  6 +import javax.validation.constraints.NotNull;
5 7 import java.time.LocalDateTime;
6 8  
7 9 @Schema(description = "管理后台 - 产品 Response VO")
8 10 @Data
9 11 @EqualsAndHashCode(callSuper = true)
10 12 @ToString(callSuper = true)
11   -public class ProductRespVO extends ProductBaseVO {
  13 +public class CrmProductRespVO extends CrmProductBaseVO {
12 14  
13 15 @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
14 16 private Long id;
... ... @@ -16,4 +18,7 @@ public class ProductRespVO extends ProductBaseVO {
16 18 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
17 19 private LocalDateTime createTime;
18 20  
  21 + @Schema(description = "负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "31926")
  22 + @NotNull(message = "负责人的用户编号不能为空")
  23 + private Long ownerUserId;
19 24 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/ProductUpdateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/product/CrmProductUpdateReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.product.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.product;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
5   -import java.util.*;
  5 +
6 6 import javax.validation.constraints.*;
7 7  
8 8 @Schema(description = "管理后台 - 产品更新 Request VO")
9 9 @Data
10 10 @EqualsAndHashCode(callSuper = true)
11 11 @ToString(callSuper = true)
12   -public class ProductUpdateReqVO extends ProductBaseVO {
  12 +public class CrmProductUpdateReqVO extends CrmProductBaseVO {
13 13  
14 14 @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
15 15 @NotNull(message = "主键id不能为空")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/productcategory/vo/ProductCategoryBaseVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/productcategory/CrmProductCategoryBaseVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
... ... @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull;
10 10 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
11 11 */
12 12 @Data
13   -public class ProductCategoryBaseVO {
  13 +public class CrmProductCategoryBaseVO {
14 14  
15 15 @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
16 16 @NotNull(message = "名称不能为空")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/productcategory/vo/ProductCategoryCreateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/productcategory/CrmProductCategoryCreateReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory;
2 2  
3 3 import lombok.*;
4   -import java.util.*;
5 4 import io.swagger.v3.oas.annotations.media.Schema;
6   -import javax.validation.constraints.*;
7 5  
8 6 @Schema(description = "管理后台 - 产品分类创建 Request VO")
9 7 @Data
10 8 @EqualsAndHashCode(callSuper = true)
11 9 @ToString(callSuper = true)
12   -public class ProductCategoryCreateReqVO extends ProductCategoryBaseVO {
  10 +public class CrmProductCategoryCreateReqVO extends CrmProductCategoryBaseVO {
13 11  
14 12 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/productcategory/vo/ProductCategoryListReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/productcategory/CrmProductCategoryListReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory;
2 2  
3 3 import com.alibaba.excel.annotation.ExcelProperty;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
... ... @@ -9,7 +9,7 @@ import java.time.LocalDateTime;
9 9 // TODO 芋艿:这个导出最后搞;命名应该是按照 ProductExportReqVO 风格
10 10 @Schema(description = "管理后台 - 产品分类列表 Request VO")
11 11 @Data
12   -public class ProductCategoryListReqVO {
  12 +public class CrmProductCategoryListReqVO {
13 13  
14 14 @ExcelProperty("名称")
15 15 private String name;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/productcategory/vo/ProductCategoryRespVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/productcategory/CrmProductCategoryRespVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
... ... @@ -8,7 +8,7 @@ import java.time.LocalDateTime;
8 8 @Data
9 9 @EqualsAndHashCode(callSuper = true)
10 10 @ToString(callSuper = true)
11   -public class ProductCategoryRespVO extends ProductCategoryBaseVO {
  11 +public class CrmProductCategoryRespVO extends CrmProductCategoryBaseVO {
12 12  
13 13 @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23902")
14 14 private Long id;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/productcategory/vo/ProductCategoryUpdateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/product/vo/productcategory/CrmProductCategoryUpdateReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
... ... @@ -11,7 +11,7 @@ import javax.validation.constraints.NotNull;
11 11 @Data
12 12 @EqualsAndHashCode(callSuper = true)
13 13 @ToString(callSuper = true)
14   -public class ProductCategoryUpdateReqVO extends ProductCategoryBaseVO {
  14 +public class CrmProductCategoryUpdateReqVO extends CrmProductCategoryBaseVO {
15 15  
16 16 @Schema(description = "主键 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23902")
17 17 @NotNull(message = "主键 id 不能为空")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/product/CrmProductCategoryConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.convert.product;
  2 +
  3 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryCreateReqVO;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryRespVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryUpdateReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;
  7 +import org.mapstruct.Mapper;
  8 +import org.mapstruct.factory.Mappers;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 产品分类 Convert
  14 + *
  15 + * @author ZanGe丶
  16 + */
  17 +@Mapper
  18 +public interface CrmProductCategoryConvert {
  19 +
  20 + CrmProductCategoryConvert INSTANCE = Mappers.getMapper(CrmProductCategoryConvert.class);
  21 +
  22 + CrmProductCategoryDO convert(CrmProductCategoryCreateReqVO bean);
  23 +
  24 + CrmProductCategoryDO convert(CrmProductCategoryUpdateReqVO bean);
  25 +
  26 + CrmProductCategoryRespVO convert(CrmProductCategoryDO bean);
  27 +
  28 + List<CrmProductCategoryRespVO> convertList(List<CrmProductCategoryDO> list);
  29 +
  30 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/product/CrmProductConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.convert.product;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductCreateReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductExcelVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductRespVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductUpdateReqVO;
  8 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
  9 +import org.mapstruct.Mapper;
  10 +import org.mapstruct.factory.Mappers;
  11 +
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 产品 Convert
  16 + *
  17 + * @author ZanGe丶
  18 + */
  19 +@Mapper
  20 +public interface CrmProductConvert {
  21 +
  22 + CrmProductConvert INSTANCE = Mappers.getMapper(CrmProductConvert.class);
  23 +
  24 + CrmProductDO convert(CrmProductCreateReqVO bean);
  25 +
  26 + CrmProductDO convert(CrmProductUpdateReqVO bean);
  27 +
  28 + CrmProductRespVO convert(CrmProductDO bean);
  29 +
  30 + List<CrmProductRespVO> convertList(List<CrmProductDO> list);
  31 +
  32 + PageResult<CrmProductRespVO> convertPage(PageResult<CrmProductDO> page);
  33 +
  34 + List<CrmProductExcelVO> convertList02(List<CrmProductDO> list);
  35 +
  36 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/product/ProductConvert.java deleted
1   -package cn.iocoder.yudao.module.crm.convert.product;
2   -
3   -import java.util.*;
4   -
5   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -
7   -import org.mapstruct.Mapper;
8   -import org.mapstruct.factory.Mappers;
9   -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.*;
10   -import cn.iocoder.yudao.module.crm.dal.dataobject.product.ProductDO;
11   -
12   -/**
13   - * 产品 Convert
14   - *
15   - * @author ZanGe丶
16   - */
17   -@Mapper
18   -public interface ProductConvert {
19   -
20   - ProductConvert INSTANCE = Mappers.getMapper(ProductConvert.class);
21   -
22   - ProductDO convert(ProductCreateReqVO bean);
23   -
24   - ProductDO convert(ProductUpdateReqVO bean);
25   -
26   - ProductRespVO convert(ProductDO bean);
27   -
28   - List<ProductRespVO> convertList(List<ProductDO> list);
29   -
30   - PageResult<ProductRespVO> convertPage(PageResult<ProductDO> page);
31   -
32   - List<ProductExcelVO> convertList02(List<ProductDO> list);
33   -
34   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/productcategory/ProductCategoryConvert.java deleted
1   -package cn.iocoder.yudao.module.crm.convert.productcategory;
2   -
3   -import java.util.*;
4   -
5   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -
7   -import org.mapstruct.Mapper;
8   -import org.mapstruct.factory.Mappers;
9   -import cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo.*;
10   -import cn.iocoder.yudao.module.crm.dal.dataobject.productcategory.ProductCategoryDO;
11   -
12   -/**
13   - * 产品分类 Convert
14   - *
15   - * @author ZanGe丶
16   - */
17   -@Mapper
18   -public interface ProductCategoryConvert {
19   -
20   - ProductCategoryConvert INSTANCE = Mappers.getMapper(ProductCategoryConvert.class);
21   -
22   - ProductCategoryDO convert(ProductCategoryCreateReqVO bean);
23   -
24   - ProductCategoryDO convert(ProductCategoryUpdateReqVO bean);
25   -
26   - ProductCategoryRespVO convert(ProductCategoryDO bean);
27   -
28   - List<ProductCategoryRespVO> convertList(List<ProductCategoryDO> list);
29   -
30   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/productcategory/ProductCategoryDO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductCategoryDO.java
1   -package cn.iocoder.yudao.module.crm.dal.dataobject.productcategory;
  1 +package cn.iocoder.yudao.module.crm.dal.dataobject.product;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import com.baomidou.mybatisplus.annotation.KeySequence;
... ... @@ -19,7 +19,16 @@ import lombok.*;
19 19 @Builder
20 20 @NoArgsConstructor
21 21 @AllArgsConstructor
22   -public class ProductCategoryDO extends BaseDO {
  22 +public class CrmProductCategoryDO extends BaseDO {
  23 +
  24 + /**
  25 + * 父分类编号 - 根分类
  26 + */
  27 + public static final Long PARENT_ID_NULL = 0L;
  28 + /**
  29 + * 限定分类层级
  30 + */
  31 + public static final int CATEGORY_LEVEL = 2;
23 32  
24 33 /**
25 34 * 主键id
... ... @@ -32,7 +41,7 @@ public class ProductCategoryDO extends BaseDO {
32 41 private String name;
33 42 /**
34 43 * 父级 id
35   - * // TODO @zange:这个要写下关联 CategoryDO 的 id 字段;参考下别的模块哈
  44 + * // TODO @zange-ok:这个要写下关联 CategoryDO 的 id 字段;参考下别的模块哈
36 45 */
37 46 private Long parentId;
38 47  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/ProductDO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/product/CrmProductDO.java
1 1 package cn.iocoder.yudao.module.crm.dal.dataobject.product;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.crm.enums.product.CrmProductStatusEnum;
4 5 import com.baomidou.mybatisplus.annotation.KeySequence;
5 6 import com.baomidou.mybatisplus.annotation.TableId;
6 7 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -19,7 +20,7 @@ import lombok.*;
19 20 @Builder
20 21 @NoArgsConstructor
21 22 @AllArgsConstructor
22   -public class ProductDO extends BaseDO {
  23 +public class CrmProductDO extends BaseDO {
23 24  
24 25 /**
25 26 * 主键 id
... ... @@ -44,14 +45,12 @@ public class ProductDO extends BaseDO {
44 45 private Long price;
45 46 /**
46 47 * 状态
47   - *
48   - * 枚举 {@link TODO crm_product_status 对应的类}
49   - * // TODO @zange:这个写个枚举类,然后 {@link关联下
  48 + * 关联 {@link CrmProductStatusEnum}
50 49 */
51 50 private Integer status;
52 51 /**
53 52 * 产品分类 ID
54   - * // TODO @zange:这个要写下关联 CategoryDO 的 id 字段;参考下别的模块哈
  53 + * 关联 {@link CrmProductCategoryDO#id}
55 54 */
56 55 private Long categoryId;
57 56 /**
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductCategoryMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.dal.mysql.product;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  4 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryListReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;
  7 +import org.apache.ibatis.annotations.Mapper;
  8 +
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * 产品分类 Mapper
  13 + *
  14 + * @author ZanGe丶
  15 + */
  16 +@Mapper
  17 +public interface CrmProductCategoryMapper extends BaseMapperX<CrmProductCategoryDO> {
  18 +
  19 +
  20 + default List<CrmProductCategoryDO> selectList(CrmProductCategoryListReqVO reqVO) {
  21 + return selectList(new LambdaQueryWrapperX<CrmProductCategoryDO>()
  22 + .likeIfPresent(CrmProductCategoryDO::getName, reqVO.getName())
  23 + .eqIfPresent(CrmProductCategoryDO::getParentId, reqVO.getParentId())
  24 + .orderByDesc(CrmProductCategoryDO::getId));
  25 + }
  26 + default CrmProductCategoryDO selectByName(String name) {
  27 + return selectOne(CrmProductCategoryDO::getName, name);
  28 + }
  29 +
  30 + default Long selectCountByParentId(Long parentId) {
  31 + return selectCount(CrmProductCategoryDO::getParentId, parentId);
  32 + }
  33 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/CrmProductMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.dal.mysql.product;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductExportReqVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO;
  8 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 产品 Mapper
  15 + *
  16 + * @author ZanGe丶
  17 + */
  18 +@Mapper
  19 +public interface CrmProductMapper extends BaseMapperX<CrmProductDO> {
  20 +
  21 + default PageResult<CrmProductDO> selectPage(CrmProductPageReqVO reqVO) {
  22 + return selectPage(reqVO, new LambdaQueryWrapperX<CrmProductDO>()
  23 + .likeIfPresent(CrmProductDO::getName, reqVO.getName())
  24 + .eqIfPresent(CrmProductDO::getStatus, reqVO.getStatus())
  25 + .orderByDesc(CrmProductDO::getId));
  26 + }
  27 +
  28 + default List<CrmProductDO> selectList(CrmProductExportReqVO reqVO) {
  29 + return selectList(new LambdaQueryWrapperX<CrmProductDO>()
  30 + .likeIfPresent(CrmProductDO::getName, reqVO.getName())
  31 + .eqIfPresent(CrmProductDO::getStatus, reqVO.getStatus())
  32 + .orderByDesc(CrmProductDO::getId));
  33 + }
  34 +
  35 + default CrmProductDO selectByNo(String no) {
  36 + return selectOne(CrmProductDO::getNo, no);
  37 + }
  38 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/product/ProductMapper.java deleted
1   -package cn.iocoder.yudao.module.crm.dal.mysql.product;
2   -
3   -import java.util.*;
4   -
5   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7   -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
8   -import cn.iocoder.yudao.module.crm.dal.dataobject.product.ProductDO;
9   -import org.apache.ibatis.annotations.Mapper;
10   -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.*;
11   -
12   -/**
13   - * 产品 Mapper
14   - *
15   - * @author ZanGe丶
16   - */
17   -@Mapper
18   -public interface ProductMapper extends BaseMapperX<ProductDO> {
19   -
20   - default PageResult<ProductDO> selectPage(ProductPageReqVO reqVO) {
21   - return selectPage(reqVO, new LambdaQueryWrapperX<ProductDO>()
22   - .likeIfPresent(ProductDO::getName, reqVO.getName())
23   - .likeIfPresent(ProductDO::getNo, reqVO.getNo())
24   - .eqIfPresent(ProductDO::getUnit, reqVO.getUnit())
25   - .eqIfPresent(ProductDO::getPrice, reqVO.getPrice())
26   - .eqIfPresent(ProductDO::getStatus, reqVO.getStatus())
27   - .eqIfPresent(ProductDO::getCategoryId, reqVO.getCategoryId())
28   - .eqIfPresent(ProductDO::getDescription, reqVO.getDescription())
29   - .eqIfPresent(ProductDO::getOwnerUserId, reqVO.getOwnerUserId())
30   - .betweenIfPresent(ProductDO::getCreateTime, reqVO.getCreateTime())
31   - .orderByDesc(ProductDO::getId));
32   - }
33   -
34   - default List<ProductDO> selectList(ProductExportReqVO reqVO) {
35   - return selectList(new LambdaQueryWrapperX<ProductDO>()
36   - .likeIfPresent(ProductDO::getName, reqVO.getName())
37   - .likeIfPresent(ProductDO::getNo, reqVO.getNo())
38   - .eqIfPresent(ProductDO::getUnit, reqVO.getUnit())
39   - .eqIfPresent(ProductDO::getPrice, reqVO.getPrice())
40   - .eqIfPresent(ProductDO::getStatus, reqVO.getStatus())
41   - .eqIfPresent(ProductDO::getCategoryId, reqVO.getCategoryId())
42   - .eqIfPresent(ProductDO::getDescription, reqVO.getDescription())
43   - .eqIfPresent(ProductDO::getOwnerUserId, reqVO.getOwnerUserId())
44   - .betweenIfPresent(ProductDO::getCreateTime, reqVO.getCreateTime())
45   - .orderByDesc(ProductDO::getId));
46   - }
47   -
48   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/productcategory/ProductCategoryMapper.java deleted
1   -package cn.iocoder.yudao.module.crm.dal.mysql.productcategory;
2   -
3   -import java.util.*;
4   -
5   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7   -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
8   -import cn.iocoder.yudao.module.crm.dal.dataobject.productcategory.ProductCategoryDO;
9   -import org.apache.ibatis.annotations.Mapper;
10   -import cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo.*;
11   -
12   -/**
13   - * 产品分类 Mapper
14   - *
15   - * @author ZanGe丶
16   - */
17   -@Mapper
18   -public interface ProductCategoryMapper extends BaseMapperX<ProductCategoryDO> {
19   -
20   -
21   - default List<ProductCategoryDO> selectList(ProductCategoryListReqVO reqVO) {
22   - return selectList(new LambdaQueryWrapperX<ProductCategoryDO>()
23   - .likeIfPresent(ProductCategoryDO::getName, reqVO.getName())
24   - .eqIfPresent(ProductCategoryDO::getParentId, reqVO.getParentId())
25   - .orderByDesc(ProductCategoryDO::getId));
26   - }
27   -
28   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/productcategory/ProductCategoryService.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductCategoryService.java
1   -package cn.iocoder.yudao.module.crm.service.productcategory;
  1 +package cn.iocoder.yudao.module.crm.service.product;
2 2  
3   -import java.util.*;
4   -import javax.validation.*;
5   -import cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo.*;
6   -import cn.iocoder.yudao.module.crm.dal.dataobject.productcategory.ProductCategoryDO;
7   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
  3 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryCreateReqVO;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryListReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryUpdateReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;
  7 +
  8 +import javax.validation.Valid;
  9 +import java.util.List;
8 10  
9 11 /**
10 12 * 产品分类 Service 接口
11 13 *
12 14 * @author ZanGe丶
13 15 */
14   -public interface ProductCategoryService {
  16 +public interface CrmProductCategoryService {
15 17  
16 18 /**
17 19 * 创建产品分类
... ... @@ -19,14 +21,14 @@ public interface ProductCategoryService {
19 21 * @param createReqVO 创建信息
20 22 * @return 编号
21 23 */
22   - Long createProductCategory(@Valid ProductCategoryCreateReqVO createReqVO);
  24 + Long createProductCategory(@Valid CrmProductCategoryCreateReqVO createReqVO);
23 25  
24 26 /**
25 27 * 更新产品分类
26 28 *
27 29 * @param updateReqVO 更新信息
28 30 */
29   - void updateProductCategory(@Valid ProductCategoryUpdateReqVO updateReqVO);
  31 + void updateProductCategory(@Valid CrmProductCategoryUpdateReqVO updateReqVO);
30 32  
31 33 /**
32 34 * 删除产品分类
... ... @@ -41,7 +43,7 @@ public interface ProductCategoryService {
41 43 * @param id 编号
42 44 * @return 产品分类
43 45 */
44   - ProductCategoryDO getProductCategory(Long id);
  46 + CrmProductCategoryDO getProductCategory(Long id);
45 47  
46 48 /**
47 49 * 获得产品分类列表
... ... @@ -49,6 +51,6 @@ public interface ProductCategoryService {
49 51 * @param ids 编号
50 52 * @return 产品分类列表
51 53 */
52   - List<ProductCategoryDO> getProductCategoryList(ProductCategoryListReqVO treeListReqVO);
  54 + List<CrmProductCategoryDO> getProductCategoryList(CrmProductCategoryListReqVO treeListReqVO);
53 55  
54 56 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/productcategory/ProductCategoryServiceImpl.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductCategoryServiceImpl.java
1   -package cn.iocoder.yudao.module.crm.service.productcategory;
  1 +package cn.iocoder.yudao.module.crm.service.product;
2 2  
3   -import cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo.ProductCategoryCreateReqVO;
4   -import cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo.ProductCategoryListReqVO;
5   -import cn.iocoder.yudao.module.crm.controller.admin.productcategory.vo.ProductCategoryUpdateReqVO;
6   -import cn.iocoder.yudao.module.crm.convert.productcategory.ProductCategoryConvert;
7   -import cn.iocoder.yudao.module.crm.dal.dataobject.productcategory.ProductCategoryDO;
8   -import cn.iocoder.yudao.module.crm.dal.mysql.productcategory.ProductCategoryMapper;
  3 +import cn.hutool.core.util.ObjUtil;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryCreateReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryListReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.productcategory.CrmProductCategoryUpdateReqVO;
  7 +import cn.iocoder.yudao.module.crm.convert.product.CrmProductCategoryConvert;
  8 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;
  9 +import cn.iocoder.yudao.module.crm.dal.mysql.product.CrmProductCategoryMapper;
  10 +import org.springframework.context.annotation.Lazy;
9 11 import org.springframework.stereotype.Service;
10 12 import org.springframework.validation.annotation.Validated;
11 13  
12 14 import javax.annotation.Resource;
13 15 import java.util.List;
  16 +import java.util.Objects;
14 17  
15 18 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
16   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.PRODUCT_CATEGORY_NOT_EXISTS;
  19 +import static cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO.PARENT_ID_NULL;
  20 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
17 21  
18   -// TODO @zange:这个类所在的包,放到 product 下;
  22 +// TODO @zange-ok:这个类所在的包,放到 product 下;
19 23 /**
20 24 * 产品分类 Service 实现类
21 25 *
... ... @@ -23,28 +27,46 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.PRODUCT_CATEG
23 27 */
24 28 @Service
25 29 @Validated
26   -public class ProductCategoryServiceImpl implements ProductCategoryService {
  30 +public class CrmProductCategoryServiceImpl implements CrmProductCategoryService {
27 31  
28 32 @Resource
29   - private ProductCategoryMapper productCategoryMapper;
  33 + private CrmProductCategoryMapper productCategoryMapper;
  34 + @Resource
  35 + @Lazy
  36 + private CrmProductService crmProductService;
30 37  
31 38 @Override
32   - public Long createProductCategory(ProductCategoryCreateReqVO createReqVO) {
  39 + public Long createProductCategory(CrmProductCategoryCreateReqVO createReqVO) {
33 40 // TODO zange:参考 mall: ProductCategoryServiceImpl 补充下必要的参数校验;
  41 + // 校验父分类存在
  42 + validateParentProductCategory(createReqVO.getParentId());
  43 + // 分类名称是否存在
  44 + CrmProductCategoryDO dbProductCategory = productCategoryMapper.selectByName(createReqVO.getName());
  45 + if (dbProductCategory != null) {
  46 + return dbProductCategory.getId();
  47 + }
34 48 // 插入
35   - ProductCategoryDO productCategory = ProductCategoryConvert.INSTANCE.convert(createReqVO);
  49 + CrmProductCategoryDO productCategory = CrmProductCategoryConvert.INSTANCE.convert(createReqVO);
36 50 productCategoryMapper.insert(productCategory);
37 51 // 返回
38 52 return productCategory.getId();
39 53 }
40 54  
41 55 @Override
42   - public void updateProductCategory(ProductCategoryUpdateReqVO updateReqVO) {
  56 + public void updateProductCategory(CrmProductCategoryUpdateReqVO updateReqVO) {
43 57 // TODO zange:参考 mall: ProductCategoryServiceImpl 补充下必要的参数校验;
44 58 // 校验存在
45 59 validateProductCategoryExists(updateReqVO.getId());
  60 + // 校验父分类存在
  61 + validateParentProductCategory(updateReqVO.getParentId());
  62 + // 校验名字重复
  63 + CrmProductCategoryDO productCategoryDO = productCategoryMapper.selectByName(updateReqVO.getName());
  64 + if (productCategoryDO != null &&
  65 + ObjUtil.notEqual(productCategoryDO.getId(), updateReqVO.getId())) {
  66 + throw exception(CRM_PRODUCT_CATEGORY_EXISTS);
  67 + }
46 68 // 更新
47   - ProductCategoryDO updateObj = ProductCategoryConvert.INSTANCE.convert(updateReqVO);
  69 + CrmProductCategoryDO updateObj = CrmProductCategoryConvert.INSTANCE.convert(updateReqVO);
48 70 productCategoryMapper.updateById(updateObj);
49 71 }
50 72  
... ... @@ -53,23 +75,47 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
53 75 // TODO zange:参考 mall: ProductCategoryServiceImpl 补充下必要的参数校验;
54 76 // 校验存在
55 77 validateProductCategoryExists(id);
  78 + // 校验是否还有子分类
  79 + if (productCategoryMapper.selectCountByParentId(id) > 0) {
  80 + throw exception(CRM_CATEGORY_EXISTS_CHILDREN);
  81 + }
  82 + // 校验是否被产品使用
  83 + if (crmProductService.getProductByCategoryId(id) !=null) {
  84 + throw exception(CRM_PRODUCT_CATEGORY_USED);
  85 + }
56 86 // 删除
57 87 productCategoryMapper.deleteById(id);
58 88 }
59 89  
60 90 private void validateProductCategoryExists(Long id) {
61 91 if (productCategoryMapper.selectById(id) == null) {
62   - throw exception(PRODUCT_CATEGORY_NOT_EXISTS);
  92 + throw exception(CRM_PRODUCT_CATEGORY_NOT_EXISTS);
  93 + }
  94 + }
  95 +
  96 + private void validateParentProductCategory(Long id) {
  97 + // 如果是根分类,无需验证
  98 + if (Objects.equals(id, PARENT_ID_NULL)) {
  99 + return;
  100 + }
  101 + // 父分类不存在
  102 + CrmProductCategoryDO category = productCategoryMapper.selectById(id);
  103 + if (category == null) {
  104 + throw exception(CRM_CATEGORY_PARENT_NOT_EXISTS);
  105 + }
  106 + // 父分类不能是二级分类
  107 + if (!Objects.equals(category.getParentId(), PARENT_ID_NULL)) {
  108 + throw exception(CRM_CATEGORY_PARENT_NOT_FIRST_LEVEL);
63 109 }
64 110 }
65 111  
66 112 @Override
67   - public ProductCategoryDO getProductCategory(Long id) {
  113 + public CrmProductCategoryDO getProductCategory(Long id) {
68 114 return productCategoryMapper.selectById(id);
69 115 }
70 116  
71 117 @Override
72   - public List<ProductCategoryDO> getProductCategoryList(ProductCategoryListReqVO treeListReqVO) {
  118 + public List<CrmProductCategoryDO> getProductCategoryList(CrmProductCategoryListReqVO treeListReqVO) {
73 119 return productCategoryMapper.selectList(treeListReqVO);
74 120 }
75 121  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/ProductService.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductService.java
1 1 package cn.iocoder.yudao.module.crm.service.product;
2 2  
3   -import java.util.*;
4   -import javax.validation.*;
5   -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.*;
6   -import cn.iocoder.yudao.module.crm.dal.dataobject.product.ProductDO;
7 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductCreateReqVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductExportReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductUpdateReqVO;
  8 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
  9 +
  10 +import javax.validation.Valid;
  11 +import java.util.Collection;
  12 +import java.util.List;
8 13  
9 14 /**
10 15 * 产品 Service 接口
11 16 *
12 17 * @author ZanGe丶
13 18 */
14   -public interface ProductService {
  19 +public interface CrmProductService {
15 20  
16 21 /**
17 22 * 创建产品
... ... @@ -19,14 +24,14 @@ public interface ProductService {
19 24 * @param createReqVO 创建信息
20 25 * @return 编号
21 26 */
22   - Long createProduct(@Valid ProductCreateReqVO createReqVO);
  27 + Long createProduct(@Valid CrmProductCreateReqVO createReqVO);
23 28  
24 29 /**
25 30 * 更新产品
26 31 *
27 32 * @param updateReqVO 更新信息
28 33 */
29   - void updateProduct(@Valid ProductUpdateReqVO updateReqVO);
  34 + void updateProduct(@Valid CrmProductUpdateReqVO updateReqVO);
30 35  
31 36 /**
32 37 * 删除产品
... ... @@ -41,7 +46,7 @@ public interface ProductService {
41 46 * @param id 编号
42 47 * @return 产品
43 48 */
44   - ProductDO getProduct(Long id);
  49 + CrmProductDO getProduct(Long id);
45 50  
46 51 /**
47 52 * 获得产品列表
... ... @@ -49,7 +54,7 @@ public interface ProductService {
49 54 * @param ids 编号
50 55 * @return 产品列表
51 56 */
52   - List<ProductDO> getProductList(Collection<Long> ids);
  57 + List<CrmProductDO> getProductList(Collection<Long> ids);
53 58  
54 59 /**
55 60 * 获得产品分页
... ... @@ -57,7 +62,7 @@ public interface ProductService {
57 62 * @param pageReqVO 分页查询
58 63 * @return 产品分页
59 64 */
60   - PageResult<ProductDO> getProductPage(ProductPageReqVO pageReqVO);
  65 + PageResult<CrmProductDO> getProductPage(CrmProductPageReqVO pageReqVO);
61 66  
62 67 /**
63 68 * 获得产品列表, 用于 Excel 导出
... ... @@ -65,6 +70,13 @@ public interface ProductService {
65 70 * @param exportReqVO 查询条件
66 71 * @return 产品列表
67 72 */
68   - List<ProductDO> getProductList(ProductExportReqVO exportReqVO);
  73 + List<CrmProductDO> getProductList(CrmProductExportReqVO exportReqVO);
69 74  
  75 + /**
  76 + * 获得产品
  77 + *
  78 + * @param categoryId 分类编号
  79 + * @return 产品
  80 + */
  81 + CrmProductDO getProductByCategoryId(Long categoryId);
70 82 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/ProductServiceImpl.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/product/CrmProductServiceImpl.java
... ... @@ -3,13 +3,14 @@ package cn.iocoder.yudao.module.crm.service.product;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.collection.ListUtil;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.ProductCreateReqVO;
7   -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.ProductExportReqVO;
8   -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.ProductPageReqVO;
9   -import cn.iocoder.yudao.module.crm.controller.admin.product.vo.ProductUpdateReqVO;
10   -import cn.iocoder.yudao.module.crm.convert.product.ProductConvert;
11   -import cn.iocoder.yudao.module.crm.dal.dataobject.product.ProductDO;
12   -import cn.iocoder.yudao.module.crm.dal.mysql.product.ProductMapper;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductCreateReqVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductExportReqVO;
  8 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductPageReqVO;
  9 +import cn.iocoder.yudao.module.crm.controller.admin.product.vo.product.CrmProductUpdateReqVO;
  10 +import cn.iocoder.yudao.module.crm.convert.product.CrmProductConvert;
  11 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductCategoryDO;
  12 +import cn.iocoder.yudao.module.crm.dal.dataobject.product.CrmProductDO;
  13 +import cn.iocoder.yudao.module.crm.dal.mysql.product.CrmProductMapper;
13 14 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
14 15 import org.springframework.stereotype.Service;
15 16 import org.springframework.validation.annotation.Validated;
... ... @@ -19,8 +20,7 @@ import java.util.Collection;
19 20 import java.util.List;
20 21  
21 22 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
22   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.PRODUCT_NOT_EXISTS;
23   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.PRODUCT_NO_EXISTS;
  23 +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*;
24 24  
25 25 /**
26 26 * 产品 Service 实现类
... ... @@ -29,59 +29,67 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.PRODUCT_NO_EX
29 29 */
30 30 @Service
31 31 @Validated
32   -public class ProductServiceImpl implements ProductService {
  32 +public class CrmProductServiceImpl implements CrmProductService {
33 33  
34 34 @Resource
35   - private ProductMapper productMapper;
  35 + private CrmProductMapper productMapper;
  36 + @Resource
  37 + private CrmProductCategoryService productCategoryService;
36 38  
37 39 @Override
38   - public Long createProduct(ProductCreateReqVO createReqVO) {
  40 + public Long createProduct(CrmProductCreateReqVO createReqVO) {
39 41 // 校验产品编号是否存在
40   - validateProductNo(createReqVO.getNo());
41   - // TODO @zange:需要校验 categoryId 是否存在;
  42 + validateProductNoDuplicate(createReqVO.getNo());
  43 + // TODO @zange-ok:需要校验 categoryId 是否存在;
  44 + validateProductCategoryExists(createReqVO.getCategoryId());
42 45 // 插入
43   - ProductDO product = ProductConvert.INSTANCE.convert(createReqVO);
  46 + CrmProductDO product = CrmProductConvert.INSTANCE.convert(createReqVO);
44 47 productMapper.insert(product);
45 48 // 返回
46 49 return product.getId();
47 50 }
48 51  
49 52 @Override
50   - public void updateProduct(ProductUpdateReqVO updateReqVO) {
  53 + public void updateProduct(CrmProductUpdateReqVO updateReqVO) {
51 54 // 校验存在
52   - validateProductExists(updateReqVO.getId(), updateReqVO.getNo());
53   - // TODO @zange:需要校验 categoryId 是否存在;
  55 + validateProductExists(updateReqVO.getId());
  56 + // TODO @zange-ok:需要校验 categoryId 是否存在;
  57 + validateProductCategoryExists(updateReqVO.getCategoryId());
54 58 // 更新
55   - ProductDO updateObj = ProductConvert.INSTANCE.convert(updateReqVO);
  59 + CrmProductDO updateObj = CrmProductConvert.INSTANCE.convert(updateReqVO);
56 60 productMapper.updateById(updateObj);
57 61 }
58 62  
59 63 @Override
60 64 public void deleteProduct(Long id) {
61 65 // 校验存在
62   - validateProductExists(id, null);
  66 + validateProductExists(id);
63 67 // 删除
64 68 productMapper.deleteById(id);
65 69 }
66 70  
67   - // TODO @zange:validateProductExists 要不只校验是否存在;然后是否 no 重复,交给 validateProductNo,名字改成 validateProductNoDuplicate,和别的模块保持一致哈;
68   - private void validateProductExists(Long id, String no) {
69   - ProductDO product = productMapper.selectById(id);
  71 + // TODO @zange-ok:validateProductExists 要不只校验是否存在;然后是否 no 重复,交给 validateProductNo,名字改成 validateProductNoDuplicate,和别的模块保持一致哈;
  72 + private void validateProductExists(Long id) {
  73 + CrmProductDO product = productMapper.selectById(id);
70 74 if (product == null) {
71   - throw exception(PRODUCT_NOT_EXISTS);
  75 + throw exception(CRM_PRODUCT_NOT_EXISTS);
72 76 }
73   - if (no != null && no.equals(product.getNo())) {
74   - throw exception(PRODUCT_NO_EXISTS);
  77 + }
  78 +
  79 + private void validateProductCategoryExists(Long categoryId) {
  80 + CrmProductCategoryDO productCategory = productCategoryService.getProductCategory(categoryId);
  81 + if (productCategory == null) {
  82 + throw exception(CRM_PRODUCT_CATEGORY_NOT_EXISTS);
75 83 }
76 84 }
77 85  
78 86 @Override
79   - public ProductDO getProduct(Long id) {
  87 + public CrmProductDO getProduct(Long id) {
80 88 return productMapper.selectById(id);
81 89 }
82 90  
83 91 @Override
84   - public List<ProductDO> getProductList(Collection<Long> ids) {
  92 + public List<CrmProductDO> getProductList(Collection<Long> ids) {
85 93 if (CollUtil.isEmpty(ids)) {
86 94 return ListUtil.empty();
87 95 }
... ... @@ -89,19 +97,24 @@ public class ProductServiceImpl implements ProductService {
89 97 }
90 98  
91 99 @Override
92   - public PageResult<ProductDO> getProductPage(ProductPageReqVO pageReqVO) {
  100 + public PageResult<CrmProductDO> getProductPage(CrmProductPageReqVO pageReqVO) {
93 101 return productMapper.selectPage(pageReqVO);
94 102 }
95 103  
96 104 @Override
97   - public List<ProductDO> getProductList(ProductExportReqVO exportReqVO) {
  105 + public List<CrmProductDO> getProductList(CrmProductExportReqVO exportReqVO) {
98 106 return productMapper.selectList(exportReqVO);
99 107 }
100 108  
101   - private void validateProductNo(String no) {
102   - ProductDO product = productMapper.selectOne(new LambdaQueryWrapper<ProductDO>().eq(ProductDO::getNo, no));
  109 + @Override
  110 + public CrmProductDO getProductByCategoryId(Long categoryId) {
  111 + return productMapper.selectOne(new LambdaQueryWrapper<CrmProductDO>().eq(CrmProductDO::getCategoryId, categoryId));
  112 + }
  113 +
  114 + private void validateProductNoDuplicate(String no) {
  115 + CrmProductDO product = productMapper.selectOne(new LambdaQueryWrapper<CrmProductDO>().eq(CrmProductDO::getNo, no));
103 116 if (product != null) {
104   - throw exception(PRODUCT_NO_EXISTS);
  117 + throw exception(CRM_PRODUCT_NO_EXISTS);
105 118 }
106 119 }
107 120  
... ...