Commit ca552825168c74734088ed4694faff6d347f9d4b

Authored by YunaiV
1 parent 4c200eda

CRM:商机 code review

Showing 20 changed files with 60 additions and 98 deletions
sql/mysql/optinal/crm_20240114.sql
... ... @@ -20,36 +20,4 @@ CREATE TABLE `crm_business_product` (
20 20 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
21 21 `tenant_id` bigint(0) NOT NULL DEFAULT 1 COMMENT '租户编号',
22 22 PRIMARY KEY (`id`) USING BTREE
23   -) ENGINE = InnoDB AUTO_INCREMENT = 29 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '商机产品关联表' ROW_FORMAT = Dynamic;
24   -
25   --- ----------------------------
26   --- Table structure for crm_business_status
27   --- ----------------------------
28   -DROP TABLE IF EXISTS `crm_business_status`;
29   -CREATE TABLE `crm_business_status` (
30   - `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
31   - `type_id` bigint(0) NOT NULL COMMENT '状态类型编号',
32   - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '状态名',
33   - `percent` bigint(0) NULL DEFAULT NULL COMMENT '赢单率',
34   - `sort` int(0) NULL DEFAULT NULL COMMENT '排序',
35   - `tenant_id` bigint(0) NOT NULL DEFAULT 0 COMMENT '租户编号',
36   - PRIMARY KEY (`id`) USING BTREE
37   -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '商机状态' ROW_FORMAT = Dynamic;
38   -
39   --- ----------------------------
40   --- Table structure for crm_business_status_type
41   --- ----------------------------
42   -DROP TABLE IF EXISTS `crm_business_status_type`;
43   -CREATE TABLE `crm_business_status_type` (
44   - `id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
45   - `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '状态类型名',
46   - `dept_ids` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '使用的部门编号',
47   - `status` int(0) NOT NULL DEFAULT 1 COMMENT '开启状态',
48   - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
49   - `create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
50   - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
51   - `update_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
52   - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
53   - `tenant_id` bigint(0) NOT NULL DEFAULT 0 COMMENT '租户编号',
54   - PRIMARY KEY (`id`) USING BTREE
55   -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '商机状态类型' ROW_FORMAT = Dynamic;
  23 +) ENGINE = InnoDB AUTO_INCREMENT = 29 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '商机产品关联表' ROW_FORMAT = Dynamic;
56 24 \ No newline at end of file
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/business/CrmBizEndStatus.java
1 1 package cn.iocoder.yudao.module.crm.enums.business;
2 2  
3   -import cn.hutool.core.util.ObjUtil;
4 3 import cn.hutool.core.util.ObjectUtil;
5 4 import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
6 5 import lombok.Getter;
... ... @@ -8,6 +7,7 @@ import lombok.RequiredArgsConstructor;
8 7  
9 8 import java.util.Arrays;
10 9  
  10 +// TODO @lzxhqs:1)title、description、create 可以删除,非标准的 javadoc 注释哈,然后可以在类上加下这个类的注释;2)CrmBizEndStatus 改成 CrmBusinessEndStatus,非必要不缩写哈,可阅读比较重要
11 11 /**
12 12 * @author lzxhqs
13 13 * @version 1.0
... ... @@ -18,12 +18,14 @@ import java.util.Arrays;
18 18 @RequiredArgsConstructor
19 19 @Getter
20 20 public enum CrmBizEndStatus implements IntArrayValuable {
  21 +
21 22 WIN(1, "赢单"),
22 23 LOSE(2, "输单"),
23 24 INVALID(3, "无效");
24 25  
25 26 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmBizEndStatus::getStatus).toArray();
26 27  
  28 + // TODO @lzxhqs:这里的方法,建议放到 49 行之后;一般类里是,静态变量,普通变量;静态方法;普通方法
27 29 public static boolean isWin(Integer status) {
28 30 return ObjectUtil.equal(WIN.getStatus(), status);
29 31 }
... ... @@ -49,4 +51,5 @@ public enum CrmBizEndStatus implements IntArrayValuable {
49 51 public int[] array() {
50 52 return ARRAYS;
51 53 }
  54 +
52 55 }
... ...
yudao-module-crm/yudao-module-crm-biz/pom.xml
... ... @@ -24,11 +24,6 @@
24 24 </dependency>
25 25 <dependency>
26 26 <groupId>cn.iocoder.boot</groupId>
27   - <artifactId>yudao-module-system-biz</artifactId>
28   - <version>${revision}</version>
29   - </dependency>
30   - <dependency>
31   - <groupId>cn.iocoder.boot</groupId>
32 27 <artifactId>yudao-module-crm-api</artifactId>
33 28 <version>${revision}</version>
34 29 </dependency>
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusTypeController.java
... ... @@ -25,19 +25,17 @@ import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
25 25 import io.swagger.v3.oas.annotations.Operation;
26 26 import io.swagger.v3.oas.annotations.Parameter;
27 27 import io.swagger.v3.oas.annotations.tags.Tag;
  28 +import jakarta.annotation.Resource;
  29 +import jakarta.servlet.http.HttpServletResponse;
  30 +import jakarta.validation.Valid;
28 31 import org.springframework.security.access.prepost.PreAuthorize;
29 32 import org.springframework.validation.annotation.Validated;
30 33 import org.springframework.web.bind.annotation.*;
31 34  
32   -import jakarta.annotation.Resource;
33   -import jakarta.servlet.http.HttpServletResponse;
34   -import jakarta.validation.Valid;
35 35 import java.io.IOException;
36 36 import java.util.Collection;
37 37 import java.util.List;
38   -import java.util.Objects;
39 38 import java.util.Set;
40   -import java.util.stream.Collectors;
41 39  
42 40 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
43 41 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
... ... @@ -86,13 +84,13 @@ public class CrmBusinessStatusTypeController {
86 84 @Parameter(name = "id", description = "编号", required = true, example = "1024")
87 85 @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')")
88 86 public CommonResult<CrmBusinessStatusTypeRespVO> getBusinessStatusType(@RequestParam("id") Long id) {
89   - CrmBusinessStatusTypeDO businessStatusType = businessStatusTypeService.getBusinessStatusType(id);
  87 + CrmBusinessStatusTypeDO statusType = businessStatusTypeService.getBusinessStatusType(id);
90 88 // 处理状态回显
91   - // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈;
  89 + // TODO @lzxhqs:可以在 businessStatusService 加个 getBusinessStatusListByTypeId 方法,直接返回 List<CrmBusinessStatusDO> 哈,常用的,尽量封装个简单易懂的方法,不用追求绝对通用哈;
92 90 CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO();
93 91 queryVO.setTypeId(id);
94 92 List<CrmBusinessStatusDO> statusList = businessStatusService.selectList(queryVO);
95   - return success(CrmBusinessStatusTypeConvert.INSTANCE.convert(businessStatusType, statusList));
  93 + return success(CrmBusinessStatusTypeConvert.INSTANCE.convert(statusType, statusList));
96 94 }
97 95  
98 96 @GetMapping("/page")
... ... @@ -101,12 +99,6 @@ public class CrmBusinessStatusTypeController {
101 99 public CommonResult<PageResult<CrmBusinessStatusTypeRespVO>> getBusinessStatusTypePage(@Valid CrmBusinessStatusTypePageReqVO pageReqVO) {
102 100 PageResult<CrmBusinessStatusTypeDO> pageResult = businessStatusTypeService.getBusinessStatusTypePage(pageReqVO);
103 101 // 处理部门回显
104   - // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈;
105   -// Set<Long> deptIds = pageResult.getList().stream()
106   -// .map(CrmBusinessStatusTypeDO::getDeptIds)
107   -// .filter(Objects::nonNull)
108   -// .flatMap(Collection::stream)
109   -// .collect(Collectors.toSet());
110 102 Set<Long> deptIds = CollectionUtils.convertSetByFlatMap(pageResult.getList(), CrmBusinessStatusTypeDO::getDeptIds,Collection::stream);
111 103 List<DeptRespDTO> deptList = deptApi.getDeptList(deptIds);
112 104 return success(CrmBusinessStatusTypeConvert.INSTANCE.convertPage(pageResult, deptList));
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessSaveReqVO.java
... ... @@ -17,7 +17,6 @@ import java.util.List;
17 17  
18 18 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
19 19  
20   -// TODO @ljileo:DiffLogField function 完善一下
21 20 @Schema(description = "管理后台 - CRM 商机创建/更新 Request VO")
22 21 @Data
23 22 public class CrmBusinessSaveReqVO {
... ... @@ -59,7 +58,7 @@ public class CrmBusinessSaveReqVO {
59 58 @DiffLogField(name = "商机金额")
60 59 private Integer price;
61 60  
62   - // TODO @ljileo:折扣使用 Integer 类型,存储时,默认 * 100;展示的时候,前端需要 / 100;避免精度丢失问题
  61 + // TODO @lzxhqs:折扣使用 Integer 类型,存储时,默认 * 100;展示的时候,前端需要 / 100;避免精度丢失问题
63 62 @Schema(description = "整单折扣")
64 63 @DiffLogField(name = "整单折扣")
65 64 private Integer discountPercent;
... ... @@ -71,17 +70,16 @@ public class CrmBusinessSaveReqVO {
71 70 @Schema(description = "备注", example = "随便")
72 71 @DiffLogField(name = "备注")
73 72 private String remark;
74   - // TODO @ljileo:修改的时候,应该可以传递添加的产品;
75   - @Schema(description = "联系人编号", example = "110")
76   - @NotNull(message = "联系人编号不能为空")
77   - private Long contactId;
78 73  
79   - @Schema(description = "1赢单2输单3无效", example = "1")
  74 + @Schema(description = "结束状态", example = "1")
80 75 @InEnum(CrmBizEndStatus.class)
81 76 private Integer endStatus;
82 77  
83   - @Schema(description = "商机产品列表", example = "")
  78 + // TODO @lzxhqs:不设置默认 new ArrayList<>();一般 pojo 不设置默认值哈
  79 + @Schema(description = "商机产品列表")
84 80 private List<CrmBusinessProductSaveReqVO> products = new ArrayList<>();
85 81  
  82 + @Schema(description = "联系人编号", example = "110")
  83 + private Long contactId; // 使用场景,在【联系人详情】添加商机时,如果需要关联两者,需要传递 contactId 字段
86 84  
87 85 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/product/CrmBusinessProductPageReqVO.java
... ... @@ -6,10 +6,7 @@ import lombok.Data;
6 6 import lombok.EqualsAndHashCode;
7 7 import lombok.ToString;
8 8  
9   -
10   -/**
11   - * @author lzxhqs
12   - */
  9 +// TODO @lzxhqs:这个类,如果没用到,可以考虑删除哈
13 10 @Schema(description = "管理后台 - 商机产品分页 Request VO")
14 11 @Data
15 12 @EqualsAndHashCode(callSuper = true)
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/product/CrmBusinessProductRespVO.java
... ... @@ -4,9 +4,6 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
7   -/**
8   - * @author lzxhqs
9   - */
10 7 @Schema(description = "管理后台 - 商机产品关联 Response VO")
11 8 @Data
12 9 @ExcelIgnoreUnannotated
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/product/CrmBusinessProductSaveReqVO.java
... ... @@ -6,9 +6,6 @@ import lombok.Data;
6 6  
7 7 import java.math.BigDecimal;
8 8  
9   -/**
10   - * @author lzxhqs
11   - */
12 9 @Schema(description = "管理后台 - CRM 商机产品关联表 创建/更新 Request VO")
13 10 @Data
14 11 public class CrmBusinessProductSaveReqVO {
... ... @@ -16,12 +13,14 @@ public class CrmBusinessProductSaveReqVO {
16 13 @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32129")
17 14 private Long id;
18 15  
19   - @Schema(description = "商机ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30320")
20   - @NotNull(message = "商机ID不能为空")
  16 + // TODO @lzxhqs:这个字段,应该是 Long 类型
  17 + @Schema(description = "商机编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30320")
  18 + @NotNull(message = "商机编号不能为空")
21 19 private Integer businessId;
22 20  
23   - @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "30320")
24   - @NotNull(message = "产品ID不能为空")
  21 + // TODO @lzxhqs:这个字段,应该是 Long 类型
  22 + @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "30320")
  23 + @NotNull(message = "产品编号不能为空")
25 24 private Integer productId;
26 25  
27 26 @Schema(description = "产品单价", requiredMode = Schema.RequiredMode.REQUIRED, example = "30320")
... ... @@ -44,7 +43,9 @@ public class CrmBusinessProductSaveReqVO {
44 43 @NotNull(message = "小计(折扣后价格)不能为空")
45 44 private BigDecimal subtotal;
46 45  
  46 + // TODO @lzxhqs:字符串,用 @NotEmpty,因为要考虑 "" 前端搞了这个玩意
47 47 @Schema(description = "单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "30320")
48 48 @NotNull(message = "单位不能为空")
49 49 private String unit;
  50 +
50 51 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java
... ... @@ -21,11 +21,11 @@ public class CrmBusinessStatusSaveReqVO {
21 21 @NotEmpty(message = "状态名不能为空")
22 22 private String name;
23 23  
24   - // TODO @lilleo:percent 应该是 Integer;
  24 + // TODO @lzxhqs::percent 应该是 Integer;
25 25 @Schema(description = "赢单率")
26 26 private String percent;
27 27  
28   - // TODO @lilleo:这个是不是不用前端新增和修改的时候传递,交给顺序计算出来,存储起来就好了;
  28 + // TODO @lzxhqs:这个是不是不用前端新增和修改的时候传递,交给顺序计算出来,存储起来就好了;
29 29 @Schema(description = "排序")
30 30 private Integer sort;
31 31  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeSaveReqVO.java
... ... @@ -19,10 +19,10 @@ public class CrmBusinessStatusTypeSaveReqVO {
19 19 @NotEmpty(message = "状态类型名不能为空")
20 20 private String name;
21 21  
  22 + // TODO @lzxhqs: VO 里面,我们不使用默认值哈。这里 Lists.newArrayList() 看看怎么去掉。上面 deptIds 也是类似噢
22 23 @Schema(description = "使用的部门编号", requiredMode = Schema.RequiredMode.REQUIRED)
23 24 private List<Long> deptIds = Lists.newArrayList();
24 25  
25   - // TODO @ljlleo VO 里面,我们不使用默认值哈。这里 Lists.newArrayList() 看看怎么去掉。上面 deptIds 也是类似噢
26 26 @Schema(description = "商机状态集合", requiredMode = Schema.RequiredMode.REQUIRED)
27 27 private List<CrmBusinessStatusSaveReqVO> statusList;
28 28  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessproduct/CrmBusinessProductConvert.java
... ... @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessProductDO;
5 5 import org.mapstruct.Mapper;
6 6 import org.mapstruct.factory.Mappers;
7 7  
  8 +// TODO @lzxhqs:看看是不是用 BeanUtils 替代了
8 9 /**
9 10 * @author lzxhqs
10 11 * @version 1.0
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatustype/CrmBusinessStatusTypeConvert.java
... ... @@ -14,6 +14,7 @@ import java.util.Map;
14 14 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
15 15 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
16 16  
  17 +// TODO @lzxhqs:看看是不是用 BeanUtils 替代了
17 18 /**
18 19 * 商机状态类型 Convert
19 20 *
... ... @@ -24,7 +25,6 @@ public interface CrmBusinessStatusTypeConvert {
24 25  
25 26 CrmBusinessStatusTypeConvert INSTANCE = Mappers.getMapper(CrmBusinessStatusTypeConvert.class);
26 27  
27   -
28 28 CrmBusinessStatusTypeRespVO convert(CrmBusinessStatusTypeDO bean);
29 29  
30 30 PageResult<CrmBusinessStatusTypeRespVO> convertPage(PageResult<CrmBusinessStatusTypeDO> page);
... ... @@ -38,9 +38,6 @@ public interface CrmBusinessStatusTypeConvert {
38 38 }
39 39  
40 40 default CrmBusinessStatusTypeRespVO convert(CrmBusinessStatusTypeDO bean, List<CrmBusinessStatusDO> statusList) {
41   - // TODO @ljlleo 可以链式赋值,简化成一行;
42   -// CrmBusinessStatusTypeRespVO result = convert(bean);
43   -// result.setStatusList(statusList);
44 41 return convert(bean).setStatusList(statusList);
45 42 }
46 43  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.crm.dal.dataobject.business;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
5   -import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
  5 +import cn.iocoder.yudao.module.crm.enums.business.CrmBizEndStatus;
6 6 import com.baomidou.mybatisplus.annotation.KeySequence;
7 7 import com.baomidou.mybatisplus.annotation.TableId;
8 8 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -80,9 +80,9 @@ public class CrmBusinessDO extends BaseDO {
80 80 */
81 81 private String remark;
82 82 /**
83   - * 1赢单2输单3无效
  83 + * 结束状态
84 84 *
85   - * TODO @lijie:搞个枚举;
  85 + * 枚举 {@link CrmBizEndStatus}
86 86 */
87 87 private Integer endStatus;
88 88 /**
... ... @@ -96,7 +96,7 @@ public class CrmBusinessDO extends BaseDO {
96 96 /**
97 97 * 跟进状态
98 98 *
99   - * TODO @lijie:目前就是 Boolean;是否跟进
  99 + * TODO @lzxhqs:目前就是 Boolean;是否跟进
100 100 */
101 101 private Integer followUpStatus;
102 102  
... ... @@ -104,7 +104,6 @@ public class CrmBusinessDO extends BaseDO {
104 104 * 负责人的用户编号
105 105 *
106 106 * 关联 AdminUserDO 的 id 字段
107   - * {@link AdminUserDO#getId()}
108 107 */
109 108 private Long ownerUserId;
110 109  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessProductDO.java
... ... @@ -31,17 +31,20 @@ public class CrmBusinessProductDO extends BaseDO {
31 31 private Long id;
32 32  
33 33 /**
34   - * 商机ID
  34 + * 商机编号
  35 + *
35 36 * 关联 {@link CrmBusinessDO#getId()}
36 37 */
37 38 private Long businessId;
38 39  
39 40 /**
40   - * 产品ID
41   - * 关联{@link CrmProductDO#getId()}
  41 + * 产品编号
  42 + *
  43 + * 关联 {@link CrmProductDO#getId()}
42 44 */
43 45 private Long productId;
44 46  
  47 + // TODO @lzxhqs:改成 Integer,单位:分。目前整体倾向放大 100 倍哈
45 48 /**
46 49 * 产品单价
47 50 */
... ... @@ -52,16 +55,19 @@ public class CrmBusinessProductDO extends BaseDO {
52 55 */
53 56 private BigDecimal salesPrice;
54 57  
  58 + // TODO @lzxhqs:改成 count
55 59 /**
56 60 * 数量
57 61 */
58 62 private BigDecimal num;
59 63  
  64 + // TODO @lzxhqs:改成 discountPercent
60 65 /**
61 66 * 折扣
62 67 */
63 68 private BigDecimal discount;
64 69  
  70 + // TODO @lzxhqs:改成 totalPrice;总计价格,和现有项目风格一致;
65 71 /**
66 72 * 小计(折扣后价格)
67 73 */
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java
... ... @@ -35,9 +35,7 @@ public class CrmBusinessStatusDO {
35 35 */
36 36 private String name;
37 37 /**
38   - * 赢单率
39   - *
40   - * TODO 这里是不是改成 Integer 存储,百分比 * 100 ;
  38 + * 赢单率,百分比
41 39 */
42 40 private Integer percent;
43 41 /**
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java
... ... @@ -44,7 +44,7 @@ public class CrmBusinessStatusTypeDO extends BaseDO {
44 44 * 开启状态
45 45 *
46 46 * TODO 改成 Integer,关联 CommonStatus
47   - * {@link CommonStatusEnum}
  47 + * 枚举 {@link CommonStatusEnum}
48 48 */
49 49 private Boolean status;
50 50  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessProductMapper.java
... ... @@ -6,16 +6,16 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessProductDO;
6 6 import org.apache.ibatis.annotations.Mapper;
7 7  
8 8 /**
9   - * 商机产品 Mapper
  9 + * 商机产品 Mapper // TODO @lzxhqs:类注释,和作者之间要有一个空行
10 10 * @author lzxhqs
11 11 */
12 12 @Mapper
13 13 public interface CrmBusinessProductMapper extends BaseMapperX<CrmBusinessProductDO> {
14   - default void deleteByBusinessId(Long id) {
  14 + default void deleteByBusinessId(Long id) { // TODO @lzxhqs:第一个方法,和类之间最好空一行;
15 15 delete(CrmBusinessProductDO::getBusinessId, id);
16 16 }
17 17  
18   - default CrmBusinessProductDO selectByBusinessId(Long id) {
  18 + default CrmBusinessProductDO selectByBusinessId(Long id) { // TODO @lzxhqs:id 最好改成 businessId,上面也是;这样一看更容易懂
19 19 return selectOne(CrmBusinessProductDO::getBusinessId, id);
20 20 }
21 21 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/business/CrmBusinessStatusTypeMapper.java
... ... @@ -29,6 +29,7 @@ public interface CrmBusinessStatusTypeMapper extends BaseMapperX&lt;CrmBusinessStat
29 29 .inIfPresent(CrmBusinessStatusTypeDO::getId, queryVO.getIdList()));
30 30 }
31 31  
  32 + // TODO @lzxhqs:这个可以改成 selectByName。业务上基于在判断 id 匹配;这样更通用一些;mapper 尽量通用,不关注或者特别关联业务;
32 33 /**
33 34 * 根据ID和name查询
34 35 *
... ... @@ -39,4 +40,5 @@ public interface CrmBusinessStatusTypeMapper extends BaseMapperX&lt;CrmBusinessStat
39 40 default CrmBusinessStatusTypeDO selectByIdAndName(Long id, String name) {
40 41 return selectOne(CrmBusinessStatusTypeDO::getId, id, CrmBusinessStatusTypeDO::getName, name);
41 42 }
  43 +
42 44 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/contract/CrmContractMapper.java
... ... @@ -63,7 +63,7 @@ public interface CrmContractMapper extends BaseMapperX&lt;CrmContractDO&gt; {
63 63 default Long selectCountByContactId(Long contactId) {
64 64 return selectCount(CrmContractDO::getContactId, contactId);
65 65 }
66   - default CrmContractDO selectByBizId(Long businessId) {
  66 + default CrmContractDO selectByBizId(Long businessId) { // TODO @lzxhqs:1)方法和方法之间要有空行;2)selectCountByBusinessId,一个是应该求数量,一个是不要缩写 BizId 可读性;
67 67 return selectOne(CrmContractDO::getBusinessId, businessId);
68 68 }
69 69  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/business/CrmBusinessServiceImpl.java
... ... @@ -57,9 +57,11 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
57 57  
58 58 @Resource
59 59 private CrmBusinessProductMapper businessProductMapper;
  60 + // TODO @lzxhqs:不直接调用这个 mapper,要调用对方的 service;每个业务独立收敛
60 61 @Resource
61 62 private CrmContractMapper contractMapper;
62 63  
  64 + // TODO @lzxhqs:不直接调用这个 mapper,要调用对方的 service;每个业务独立收敛
63 65 @Resource
64 66 private CrmContactBusinessMapper contactBusinessMapper;
65 67 @Resource
... ... @@ -78,7 +80,9 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
78 80 .setOwnerUserId(userId);
79 81 businessMapper.insert(business);
80 82 // TODO 商机待定:插入商机与产品的关联表;校验商品存在
  83 + // TODO lzxhqs:新增时,是不是不用调用这个方法哈;
81 84 verifyCrmBusinessProduct(business.getId());
  85 + // TODO @lzxhqs:用 CollUtils.isNotEmpty;
82 86 if (!createReqVO.getProducts().isEmpty()) {
83 87 createBusinessProducts(createReqVO.getProducts(), business.getId());
84 88 }
... ... @@ -95,6 +99,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
95 99 return business.getId();
96 100 }
97 101  
  102 + // TODO @lzxhqs:CrmContactBusinessService 调用这个;这样逻辑才能收敛哈;
98 103 /**
99 104 * @param businessId 商机id
100 105 * @param contactId 联系人id
... ... @@ -110,12 +115,14 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
110 115  
111 116 }
112 117  
  118 + // TODO @lzxhqs:这个方法注释格式不对;删除@description,然后把 插入商机产品关联表 作为方法注释;
113 119 /**
114 120 * @param products 产品集合
115 121 * @description 插入商机产品关联表
116 122 * @author lzxhqs
117 123 */
118 124 private void createBusinessProducts(List<CrmBusinessProductSaveReqVO> products, Long businessId) {
  125 + // TODO @lzxhqs:可以用 CollectionUtils.convertList;
119 126 List<CrmBusinessProductDO> list = new ArrayList<>();
120 127 for (CrmBusinessProductSaveReqVO product : products) {
121 128 CrmBusinessProductDO businessProductDO = CrmBusinessProductConvert.INSTANCE.convert(product);
... ... @@ -152,6 +159,7 @@ public class CrmBusinessServiceImpl implements CrmBusinessService {
152 159 CrmBusinessDO updateObj = BeanUtils.toBean(updateReqVO, CrmBusinessDO.class);
153 160 businessMapper.updateById(updateObj);
154 161 // TODO 商机待定:插入商机与产品的关联表;校验商品存在
  162 + // TODO @lzxhqs:更新时,可以调用 CollectionUtils 的 diffList,尽量避免这种先删除再插入;而是新增的插入、变更的更新,没的删除;不然这个表每次更新,会多好多数据;
155 163 verifyCrmBusinessProduct(updateReqVO.getId());
156 164 if (!updateReqVO.getProducts().isEmpty()) {
157 165 createBusinessProducts(updateReqVO.getProducts(), updateReqVO.getId());
... ...