Commit c463f831f41da8738d15c1f082ffd73e686a7c24

Authored by 芋道源码
Committed by Gitee
2 parents 72969e92 d2e965fb

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

Merge pull request !776 from ZanGe丶/feature/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,11 +50,18 @@ public interface ErrorCodeConstants {
50 ErrorCode CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_007, "删除数据权限失败,原因:不能删除负责人"); 50 ErrorCode CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_007, "删除数据权限失败,原因:不能删除负责人");
51 51
52 // ========== 产品 1_020_008_000 ========== 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 // ========== 产品分类 1_020_009_000 ========== 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 // ========== 商机状态类型 1_020_010_000 ========== 66 // ========== 商机状态类型 1_020_010_000 ==========
60 ErrorCode BUSINESS_STATUS_TYPE_NOT_EXISTS = new ErrorCode(1_020_010_000, "商机状态类型不存在"); 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 import io.swagger.v3.oas.annotations.Operation; 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 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 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 @Tag(name = "管理后台 - 产品分类") 24 @Tag(name = "管理后台 - 产品分类")
32 @RestController 25 @RestController
33 @RequestMapping("/crm/product-category") 26 @RequestMapping("/crm/product-category")
34 @Validated 27 @Validated
35 -public class ProductCategoryController { 28 +public class CrmProductCategoryController {
36 29
37 @Resource 30 @Resource
38 - private ProductCategoryService productCategoryService; 31 + private CrmProductCategoryService productCategoryService;
39 32
40 @PostMapping("/create") 33 @PostMapping("/create")
41 @Operation(summary = "创建产品分类") 34 @Operation(summary = "创建产品分类")
42 @PreAuthorize("@ss.hasPermission('crm:product-category:create')") 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 return success(productCategoryService.createProductCategory(createReqVO)); 37 return success(productCategoryService.createProductCategory(createReqVO));
45 } 38 }
46 39
47 @PutMapping("/update") 40 @PutMapping("/update")
48 @Operation(summary = "更新产品分类") 41 @Operation(summary = "更新产品分类")
49 @PreAuthorize("@ss.hasPermission('crm:product-category:update')") 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 productCategoryService.updateProductCategory(updateReqVO); 44 productCategoryService.updateProductCategory(updateReqVO);
52 return success(true); 45 return success(true);
53 } 46 }
@@ -65,17 +58,17 @@ public class ProductCategoryController { @@ -65,17 +58,17 @@ public class ProductCategoryController {
65 @Operation(summary = "获得产品分类") 58 @Operation(summary = "获得产品分类")
66 @Parameter(name = "id", description = "编号", required = true, example = "1024") 59 @Parameter(name = "id", description = "编号", required = true, example = "1024")
67 @PreAuthorize("@ss.hasPermission('crm:product-category:query')") 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 @GetMapping("/list") 66 @GetMapping("/list")
74 @Operation(summary = "获得产品分类列表") 67 @Operation(summary = "获得产品分类列表")
75 @PreAuthorize("@ss.hasPermission('crm:product-category:query')") 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,10 +4,10 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; 5 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; 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 import io.swagger.v3.oas.annotations.Operation; 11 import io.swagger.v3.oas.annotations.Operation;
12 import io.swagger.v3.oas.annotations.Parameter; 12 import io.swagger.v3.oas.annotations.Parameter;
13 import io.swagger.v3.oas.annotations.tags.Tag; 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,22 +28,22 @@ import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.E
28 @RestController 28 @RestController
29 @RequestMapping("/crm/product") 29 @RequestMapping("/crm/product")
30 @Validated 30 @Validated
31 -public class ProductController { 31 +public class CrmProductController {
32 32
33 @Resource 33 @Resource
34 - private ProductService productService; 34 + private CrmProductService productService;
35 35
36 @PostMapping("/create") 36 @PostMapping("/create")
37 @Operation(summary = "创建产品") 37 @Operation(summary = "创建产品")
38 @PreAuthorize("@ss.hasPermission('crm:product:create')") 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 return success(productService.createProduct(createReqVO)); 40 return success(productService.createProduct(createReqVO));
41 } 41 }
42 42
43 @PutMapping("/update") 43 @PutMapping("/update")
44 @Operation(summary = "更新产品") 44 @Operation(summary = "更新产品")
45 @PreAuthorize("@ss.hasPermission('crm:product:update')") 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 productService.updateProduct(updateReqVO); 47 productService.updateProduct(updateReqVO);
48 return success(true); 48 return success(true);
49 } 49 }
@@ -61,29 +61,29 @@ public class ProductController { @@ -61,29 +61,29 @@ public class ProductController {
61 @Operation(summary = "获得产品") 61 @Operation(summary = "获得产品")
62 @Parameter(name = "id", description = "编号", required = true, example = "1024") 62 @Parameter(name = "id", description = "编号", required = true, example = "1024")
63 @PreAuthorize("@ss.hasPermission('crm:product:query')") 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 @GetMapping("/page") 69 @GetMapping("/page")
70 @Operation(summary = "获得产品分页") 70 @Operation(summary = "获得产品分页")
71 @PreAuthorize("@ss.hasPermission('crm:product:query')") 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 @GetMapping("/export-excel") 77 @GetMapping("/export-excel")
78 @Operation(summary = "导出产品 Excel") 78 @Operation(summary = "导出产品 Excel")
79 @PreAuthorize("@ss.hasPermission('crm:product:export')") 79 @PreAuthorize("@ss.hasPermission('crm:product:export')")
80 @OperateLog(type = EXPORT) 80 @OperateLog(type = EXPORT)
81 - public void exportProductExcel(@Valid ProductExportReqVO exportReqVO, 81 + public void exportProductExcel(@Valid CrmProductExportReqVO exportReqVO,
82 HttpServletResponse response) throws IOException { 82 HttpServletResponse response) throws IOException {
83 - List<ProductDO> list = productService.getProductList(exportReqVO); 83 + List<CrmProductDO> list = productService.getProductList(exportReqVO);
84 // 导出 Excel 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 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 import javax.validation.constraints.NotNull; 6 import javax.validation.constraints.NotNull;
7 7
8 -// TODO @zange:需要加 CRM 前置噢 8 +// TODO @zange-ok:需要加 CRM 前置噢
9 /** 9 /**
10 * 产品 Base VO,提供给添加、修改、详细的子 VO 使用 10 * 产品 Base VO,提供给添加、修改、详细的子 VO 使用
11 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 11 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
12 */ 12 */
13 @Data 13 @Data
14 -public class ProductBaseVO { 14 +public class CrmProductBaseVO {
15 15
16 // TODO @zange:example 要写哈;主要是接口文档,可以基于 example 可以生产请求参数 16 // TODO @zange:example 要写哈;主要是接口文档,可以基于 example 可以生产请求参数
17 17
18 - @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四") 18 + @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "好产品")
19 @NotNull(message = "产品名称不能为空") 19 @NotNull(message = "产品名称不能为空")
20 private String name; 20 private String name;
21 21
22 - @Schema(description = "产品编码", requiredMode = Schema.RequiredMode.REQUIRED) 22 + @Schema(description = "产品编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "12306")
23 @NotNull(message = "产品编码不能为空") 23 @NotNull(message = "产品编码不能为空")
24 private String no; 24 private String no;
25 25
26 - @Schema(description = "单位") 26 + @Schema(description = "单位", example = "2")
27 private String unit; 27 private String unit;
28 28
29 @Schema(description = "价格", example = "8911") 29 @Schema(description = "价格", example = "8911")
30 private Long price; 30 private Long price;
31 31
32 - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") 32 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "上架")
33 @NotNull(message = "状态不能为空") 33 @NotNull(message = "状态不能为空")
34 private Integer status; 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 @NotNull(message = "产品分类ID不能为空") 37 @NotNull(message = "产品分类ID不能为空")
38 private Long categoryId; 38 private Long categoryId;
39 39
40 @Schema(description = "产品描述", example = "你说的对") 40 @Schema(description = "产品描述", example = "你说的对")
41 private String description; 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 import lombok.*; 3 import lombok.*;
4 -import java.util.*;  
5 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
6 -import javax.validation.constraints.*; 5 +
  6 +import javax.validation.constraints.NotNull;
7 7
8 @Schema(description = "管理后台 - 产品创建 Request VO") 8 @Schema(description = "管理后台 - 产品创建 Request VO")
9 @Data 9 @Data
10 @EqualsAndHashCode(callSuper = true) 10 @EqualsAndHashCode(callSuper = true)
11 @ToString(callSuper = true) 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 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; 3 import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; 4 import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
@@ -7,14 +7,14 @@ import lombok.Data; @@ -7,14 +7,14 @@ import lombok.Data;
7 7
8 import java.time.LocalDateTime; 8 import java.time.LocalDateTime;
9 9
10 -// TODO 芋艿:这个导出最后搞 10 +// TODO 芋艿:这个导出最后搞 那暂时就放着不动了哈
11 /** 11 /**
12 * 产品 Excel VO 12 * 产品 Excel VO
13 * 13 *
14 * @author ZanGe丶 14 * @author ZanGe丶
15 */ 15 */
16 @Data 16 @Data
17 -public class ProductExcelVO { 17 +public class CrmProductExcelVO {
18 18
19 @ExcelProperty("主键id") 19 @ExcelProperty("主键id")
20 private Long id; 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 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
@@ -11,7 +11,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -11,7 +11,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
11 // TODO 芋艿:这个导出最后搞 11 // TODO 芋艿:这个导出最后搞
12 @Schema(description = "管理后台 - 产品 Excel 导出 Request VO,参数和 ProductPageReqVO 是一致的") 12 @Schema(description = "管理后台 - 产品 Excel 导出 Request VO,参数和 ProductPageReqVO 是一致的")
13 @Data 13 @Data
14 -public class ProductExportReqVO { 14 +public class CrmProductExportReqVO {
15 15
16 @Schema(description = "产品名称", example = "李四") 16 @Schema(description = "产品名称", example = "李四")
17 private String name; 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 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
@@ -11,12 +11,12 @@ import java.time.LocalDateTime; @@ -11,12 +11,12 @@ import java.time.LocalDateTime;
11 11
12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 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 @Schema(description = "管理后台 - 产品分页 Request VO") 15 @Schema(description = "管理后台 - 产品分页 Request VO")
16 @Data 16 @Data
17 @EqualsAndHashCode(callSuper = true) 17 @EqualsAndHashCode(callSuper = true)
18 @ToString(callSuper = true) 18 @ToString(callSuper = true)
19 -public class ProductPageReqVO extends PageParam { 19 +public class CrmProductPageReqVO extends PageParam {
20 20
21 @Schema(description = "产品名称", example = "李四") 21 @Schema(description = "产品名称", example = "李四")
22 private String name; 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 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.*; 4 import lombok.*;
  5 +
  6 +import javax.validation.constraints.NotNull;
5 import java.time.LocalDateTime; 7 import java.time.LocalDateTime;
6 8
7 @Schema(description = "管理后台 - 产品 Response VO") 9 @Schema(description = "管理后台 - 产品 Response VO")
8 @Data 10 @Data
9 @EqualsAndHashCode(callSuper = true) 11 @EqualsAndHashCode(callSuper = true)
10 @ToString(callSuper = true) 12 @ToString(callSuper = true)
11 -public class ProductRespVO extends ProductBaseVO { 13 +public class CrmProductRespVO extends CrmProductBaseVO {
12 14
13 @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529") 15 @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
14 private Long id; 16 private Long id;
@@ -16,4 +18,7 @@ public class ProductRespVO extends ProductBaseVO { @@ -16,4 +18,7 @@ public class ProductRespVO extends ProductBaseVO {
16 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) 18 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
17 private LocalDateTime createTime; 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 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.*; 4 import lombok.*;
5 -import java.util.*; 5 +
6 import javax.validation.constraints.*; 6 import javax.validation.constraints.*;
7 7
8 @Schema(description = "管理后台 - 产品更新 Request VO") 8 @Schema(description = "管理后台 - 产品更新 Request VO")
9 @Data 9 @Data
10 @EqualsAndHashCode(callSuper = true) 10 @EqualsAndHashCode(callSuper = true)
11 @ToString(callSuper = true) 11 @ToString(callSuper = true)
12 -public class ProductUpdateReqVO extends ProductBaseVO { 12 +public class CrmProductUpdateReqVO extends CrmProductBaseVO {
13 13
14 @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529") 14 @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "20529")
15 @NotNull(message = "主键id不能为空") 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 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
@@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull; @@ -10,7 +10,7 @@ import javax.validation.constraints.NotNull;
10 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 10 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
11 */ 11 */
12 @Data 12 @Data
13 -public class ProductCategoryBaseVO { 13 +public class CrmProductCategoryBaseVO {
14 14
15 @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六") 15 @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
16 @NotNull(message = "名称不能为空") 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 import lombok.*; 3 import lombok.*;
4 -import java.util.*;  
5 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
6 -import javax.validation.constraints.*;  
7 5
8 @Schema(description = "管理后台 - 产品分类创建 Request VO") 6 @Schema(description = "管理后台 - 产品分类创建 Request VO")
9 @Data 7 @Data
10 @EqualsAndHashCode(callSuper = true) 8 @EqualsAndHashCode(callSuper = true)
11 @ToString(callSuper = true) 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 import com.alibaba.excel.annotation.ExcelProperty; 3 import com.alibaba.excel.annotation.ExcelProperty;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
@@ -9,7 +9,7 @@ import java.time.LocalDateTime; @@ -9,7 +9,7 @@ import java.time.LocalDateTime;
9 // TODO 芋艿:这个导出最后搞;命名应该是按照 ProductExportReqVO 风格 9 // TODO 芋艿:这个导出最后搞;命名应该是按照 ProductExportReqVO 风格
10 @Schema(description = "管理后台 - 产品分类列表 Request VO") 10 @Schema(description = "管理后台 - 产品分类列表 Request VO")
11 @Data 11 @Data
12 -public class ProductCategoryListReqVO { 12 +public class CrmProductCategoryListReqVO {
13 13
14 @ExcelProperty("名称") 14 @ExcelProperty("名称")
15 private String name; 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 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.*; 4 import lombok.*;
@@ -8,7 +8,7 @@ import java.time.LocalDateTime; @@ -8,7 +8,7 @@ import java.time.LocalDateTime;
8 @Data 8 @Data
9 @EqualsAndHashCode(callSuper = true) 9 @EqualsAndHashCode(callSuper = true)
10 @ToString(callSuper = true) 10 @ToString(callSuper = true)
11 -public class ProductCategoryRespVO extends ProductCategoryBaseVO { 11 +public class CrmProductCategoryRespVO extends CrmProductCategoryBaseVO {
12 12
13 @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23902") 13 @Schema(description = "主键id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23902")
14 private Long id; 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 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
@@ -11,7 +11,7 @@ import javax.validation.constraints.NotNull; @@ -11,7 +11,7 @@ import javax.validation.constraints.NotNull;
11 @Data 11 @Data
12 @EqualsAndHashCode(callSuper = true) 12 @EqualsAndHashCode(callSuper = true)
13 @ToString(callSuper = true) 13 @ToString(callSuper = true)
14 -public class ProductCategoryUpdateReqVO extends ProductCategoryBaseVO { 14 +public class CrmProductCategoryUpdateReqVO extends CrmProductCategoryBaseVO {
15 15
16 @Schema(description = "主键 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23902") 16 @Schema(description = "主键 id", requiredMode = Schema.RequiredMode.REQUIRED, example = "23902")
17 @NotNull(message = "主键 id 不能为空") 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 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import com.baomidou.mybatisplus.annotation.KeySequence; 4 import com.baomidou.mybatisplus.annotation.KeySequence;
@@ -19,7 +19,16 @@ import lombok.*; @@ -19,7 +19,16 @@ import lombok.*;
19 @Builder 19 @Builder
20 @NoArgsConstructor 20 @NoArgsConstructor
21 @AllArgsConstructor 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 * 主键id 34 * 主键id
@@ -32,7 +41,7 @@ public class ProductCategoryDO extends BaseDO { @@ -32,7 +41,7 @@ public class ProductCategoryDO extends BaseDO {
32 private String name; 41 private String name;
33 /** 42 /**
34 * 父级 id 43 * 父级 id
35 - * // TODO @zange:这个要写下关联 CategoryDO 的 id 字段;参考下别的模块哈 44 + * // TODO @zange-ok:这个要写下关联 CategoryDO 的 id 字段;参考下别的模块哈
36 */ 45 */
37 private Long parentId; 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 package cn.iocoder.yudao.module.crm.dal.dataobject.product; 1 package cn.iocoder.yudao.module.crm.dal.dataobject.product;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.crm.enums.product.CrmProductStatusEnum;
4 import com.baomidou.mybatisplus.annotation.KeySequence; 5 import com.baomidou.mybatisplus.annotation.KeySequence;
5 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
@@ -19,7 +20,7 @@ import lombok.*; @@ -19,7 +20,7 @@ import lombok.*;
19 @Builder 20 @Builder
20 @NoArgsConstructor 21 @NoArgsConstructor
21 @AllArgsConstructor 22 @AllArgsConstructor
22 -public class ProductDO extends BaseDO { 23 +public class CrmProductDO extends BaseDO {
23 24
24 /** 25 /**
25 * 主键 id 26 * 主键 id
@@ -44,14 +45,12 @@ public class ProductDO extends BaseDO { @@ -44,14 +45,12 @@ public class ProductDO extends BaseDO {
44 private Long price; 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 private Integer status; 50 private Integer status;
52 /** 51 /**
53 * 产品分类 ID 52 * 产品分类 ID
54 - * // TODO @zange:这个要写下关联 CategoryDO 的 id 字段;参考下别的模块哈 53 + * 关联 {@link CrmProductCategoryDO#id}
55 */ 54 */
56 private Long categoryId; 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 * 产品分类 Service 接口 12 * 产品分类 Service 接口
11 * 13 *
12 * @author ZanGe丶 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,14 +21,14 @@ public interface ProductCategoryService {
19 * @param createReqVO 创建信息 21 * @param createReqVO 创建信息
20 * @return 编号 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 * @param updateReqVO 更新信息 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,7 +43,7 @@ public interface ProductCategoryService {
41 * @param id 编号 43 * @param id 编号
42 * @return 产品分类 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,6 +51,6 @@ public interface ProductCategoryService {
49 * @param ids 编号 51 * @param ids 编号
50 * @return 产品分类列表 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 import org.springframework.stereotype.Service; 11 import org.springframework.stereotype.Service;
10 import org.springframework.validation.annotation.Validated; 12 import org.springframework.validation.annotation.Validated;
11 13
12 import javax.annotation.Resource; 14 import javax.annotation.Resource;
13 import java.util.List; 15 import java.util.List;
  16 +import java.util.Objects;
14 17
15 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 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 * 产品分类 Service 实现类 24 * 产品分类 Service 实现类
21 * 25 *
@@ -23,28 +27,46 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.PRODUCT_CATEG @@ -23,28 +27,46 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.PRODUCT_CATEG
23 */ 27 */
24 @Service 28 @Service
25 @Validated 29 @Validated
26 -public class ProductCategoryServiceImpl implements ProductCategoryService { 30 +public class CrmProductCategoryServiceImpl implements CrmProductCategoryService {
27 31
28 @Resource 32 @Resource
29 - private ProductCategoryMapper productCategoryMapper; 33 + private CrmProductCategoryMapper productCategoryMapper;
  34 + @Resource
  35 + @Lazy
  36 + private CrmProductService crmProductService;
30 37
31 @Override 38 @Override
32 - public Long createProductCategory(ProductCategoryCreateReqVO createReqVO) { 39 + public Long createProductCategory(CrmProductCategoryCreateReqVO createReqVO) {
33 // TODO zange:参考 mall: ProductCategoryServiceImpl 补充下必要的参数校验; 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 productCategoryMapper.insert(productCategory); 50 productCategoryMapper.insert(productCategory);
37 // 返回 51 // 返回
38 return productCategory.getId(); 52 return productCategory.getId();
39 } 53 }
40 54
41 @Override 55 @Override
42 - public void updateProductCategory(ProductCategoryUpdateReqVO updateReqVO) { 56 + public void updateProductCategory(CrmProductCategoryUpdateReqVO updateReqVO) {
43 // TODO zange:参考 mall: ProductCategoryServiceImpl 补充下必要的参数校验; 57 // TODO zange:参考 mall: ProductCategoryServiceImpl 补充下必要的参数校验;
44 // 校验存在 58 // 校验存在
45 validateProductCategoryExists(updateReqVO.getId()); 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 productCategoryMapper.updateById(updateObj); 70 productCategoryMapper.updateById(updateObj);
49 } 71 }
50 72
@@ -53,23 +75,47 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { @@ -53,23 +75,47 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
53 // TODO zange:参考 mall: ProductCategoryServiceImpl 补充下必要的参数校验; 75 // TODO zange:参考 mall: ProductCategoryServiceImpl 补充下必要的参数校验;
54 // 校验存在 76 // 校验存在
55 validateProductCategoryExists(id); 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 productCategoryMapper.deleteById(id); 87 productCategoryMapper.deleteById(id);
58 } 88 }
59 89
60 private void validateProductCategoryExists(Long id) { 90 private void validateProductCategoryExists(Long id) {
61 if (productCategoryMapper.selectById(id) == null) { 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 @Override 112 @Override
67 - public ProductCategoryDO getProductCategory(Long id) { 113 + public CrmProductCategoryDO getProductCategory(Long id) {
68 return productCategoryMapper.selectById(id); 114 return productCategoryMapper.selectById(id);
69 } 115 }
70 116
71 @Override 117 @Override
72 - public List<ProductCategoryDO> getProductCategoryList(ProductCategoryListReqVO treeListReqVO) { 118 + public List<CrmProductCategoryDO> getProductCategoryList(CrmProductCategoryListReqVO treeListReqVO) {
73 return productCategoryMapper.selectList(treeListReqVO); 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 package cn.iocoder.yudao.module.crm.service.product; 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 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 * 产品 Service 接口 15 * 产品 Service 接口
11 * 16 *
12 * @author ZanGe丶 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,14 +24,14 @@ public interface ProductService {
19 * @param createReqVO 创建信息 24 * @param createReqVO 创建信息
20 * @return 编号 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 * @param updateReqVO 更新信息 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,7 +46,7 @@ public interface ProductService {
41 * @param id 编号 46 * @param id 编号
42 * @return 产品 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,7 +54,7 @@ public interface ProductService {
49 * @param ids 编号 54 * @param ids 编号
50 * @return 产品列表 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,7 +62,7 @@ public interface ProductService {
57 * @param pageReqVO 分页查询 62 * @param pageReqVO 分页查询
58 * @return 产品分页 63 * @return 产品分页
59 */ 64 */
60 - PageResult<ProductDO> getProductPage(ProductPageReqVO pageReqVO); 65 + PageResult<CrmProductDO> getProductPage(CrmProductPageReqVO pageReqVO);
61 66
62 /** 67 /**
63 * 获得产品列表, 用于 Excel 导出 68 * 获得产品列表, 用于 Excel 导出
@@ -65,6 +70,13 @@ public interface ProductService { @@ -65,6 +70,13 @@ public interface ProductService {
65 * @param exportReqVO 查询条件 70 * @param exportReqVO 查询条件
66 * @return 产品列表 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,13 +3,14 @@ package cn.iocoder.yudao.module.crm.service.product;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.collection.ListUtil; 4 import cn.hutool.core.collection.ListUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 14 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
14 import org.springframework.stereotype.Service; 15 import org.springframework.stereotype.Service;
15 import org.springframework.validation.annotation.Validated; 16 import org.springframework.validation.annotation.Validated;
@@ -19,8 +20,7 @@ import java.util.Collection; @@ -19,8 +20,7 @@ import java.util.Collection;
19 import java.util.List; 20 import java.util.List;
20 21
21 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 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 * 产品 Service 实现类 26 * 产品 Service 实现类
@@ -29,59 +29,67 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.PRODUCT_NO_EX @@ -29,59 +29,67 @@ import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.PRODUCT_NO_EX
29 */ 29 */
30 @Service 30 @Service
31 @Validated 31 @Validated
32 -public class ProductServiceImpl implements ProductService { 32 +public class CrmProductServiceImpl implements CrmProductService {
33 33
34 @Resource 34 @Resource
35 - private ProductMapper productMapper; 35 + private CrmProductMapper productMapper;
  36 + @Resource
  37 + private CrmProductCategoryService productCategoryService;
36 38
37 @Override 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 productMapper.insert(product); 47 productMapper.insert(product);
45 // 返回 48 // 返回
46 return product.getId(); 49 return product.getId();
47 } 50 }
48 51
49 @Override 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 productMapper.updateById(updateObj); 60 productMapper.updateById(updateObj);
57 } 61 }
58 62
59 @Override 63 @Override
60 public void deleteProduct(Long id) { 64 public void deleteProduct(Long id) {
61 // 校验存在 65 // 校验存在
62 - validateProductExists(id, null); 66 + validateProductExists(id);
63 // 删除 67 // 删除
64 productMapper.deleteById(id); 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 if (product == null) { 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 @Override 86 @Override
79 - public ProductDO getProduct(Long id) { 87 + public CrmProductDO getProduct(Long id) {
80 return productMapper.selectById(id); 88 return productMapper.selectById(id);
81 } 89 }
82 90
83 @Override 91 @Override
84 - public List<ProductDO> getProductList(Collection<Long> ids) { 92 + public List<CrmProductDO> getProductList(Collection<Long> ids) {
85 if (CollUtil.isEmpty(ids)) { 93 if (CollUtil.isEmpty(ids)) {
86 return ListUtil.empty(); 94 return ListUtil.empty();
87 } 95 }
@@ -89,19 +97,24 @@ public class ProductServiceImpl implements ProductService { @@ -89,19 +97,24 @@ public class ProductServiceImpl implements ProductService {
89 } 97 }
90 98
91 @Override 99 @Override
92 - public PageResult<ProductDO> getProductPage(ProductPageReqVO pageReqVO) { 100 + public PageResult<CrmProductDO> getProductPage(CrmProductPageReqVO pageReqVO) {
93 return productMapper.selectPage(pageReqVO); 101 return productMapper.selectPage(pageReqVO);
94 } 102 }
95 103
96 @Override 104 @Override
97 - public List<ProductDO> getProductList(ProductExportReqVO exportReqVO) { 105 + public List<CrmProductDO> getProductList(CrmProductExportReqVO exportReqVO) {
98 return productMapper.selectList(exportReqVO); 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 if (product != null) { 116 if (product != null) {
104 - throw exception(PRODUCT_NO_EXISTS); 117 + throw exception(CRM_PRODUCT_NO_EXISTS);
105 } 118 }
106 } 119 }
107 120