Commit fa1aa51c960152b505768778cbb076b88a889fe8

Authored by 芋道源码
Committed by Gitee
2 parents bc6cdecb db03b10d

!771 同步最新的 CRM 代码

Merge pull request !771 from 芋道源码/feature/crm
Showing 156 changed files with 2221 additions and 2747 deletions

Too many changes.

To preserve performance only 100 of 156 files are displayed.

sql/mysql/crm.sql
1 1 SET NAMES utf8mb4;
  2 +-- `ruoyi-vue-pro`.crm_contact definition
  3 +
... ...
sql/mysql/crm_menu.sql
1   --- ----------------------------
2   --- 客户公海配置
3   --- ----------------------------
4   --- 菜单 SQL
5   -INSERT INTO system_menu(
6   - name, permission, type, sort, parent_id,
7   - path, icon, component, status, component_name
8   -)
9   -VALUES (
10   - '客户公海配置', '', 2, 0, 2397,
11   - 'customer-pool-config', 'ep:data-analysis', 'crm/customerPoolConf/index', 0, 'CustomerPoolConf'
12   -);
13   -
14   --- 按钮父菜单ID
15   --- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码
16   -SELECT @parentId := LAST_INSERT_ID();
17   -
18   --- 按钮 SQL
19   -INSERT INTO system_menu(
20   - name, permission, type, sort, parent_id,
21   - path, icon, component, status
22   -)
23   -VALUES (
24   - '客户公海配置保存', 'crm:customer-pool-config:update', 3, 1, @parentId,
25   - '', '', '', 0
26   -);
27   -
28   -
29   -
30   -
31   --- ----------------------------
32   --- 客户限制配置管理
33   --- ----------------------------
34   --- 菜单 SQL
35   -INSERT INTO system_menu(
36   - name, permission, type, sort, parent_id,
37   - path, icon, component, status, component_name
38   -)
39   -VALUES (
40   - '客户限制配置管理', '', 2, 0, 2397,
41   - 'customer-limit-config', '', 'crm/customerLimitConfig/index', 0, 'CrmCustomerLimitConfig'
42   -);
43   -
44   --- 按钮父菜单ID
45   --- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码
46   -SELECT @parentId := LAST_INSERT_ID();
47   -
48   --- 按钮 SQL
49   -INSERT INTO system_menu(
50   - name, permission, type, sort, parent_id,
51   - path, icon, component, status
52   -)
53   -VALUES (
54   - '客户限制配置查询', 'crm:customer-limit-config:query', 3, 1, @parentId,
55   - '', '', '', 0
56   -);
57   -INSERT INTO system_menu(
58   - name, permission, type, sort, parent_id,
59   - path, icon, component, status
60   -)
61   -VALUES (
62   - '客户限制配置创建', 'crm:customer-limit-config:create', 3, 2, @parentId,
63   - '', '', '', 0
64   -);
65   -INSERT INTO system_menu(
66   - name, permission, type, sort, parent_id,
67   - path, icon, component, status
68   -)
69   -VALUES (
70   - '客户限制配置更新', 'crm:customer-limit-config:update', 3, 3, @parentId,
71   - '', '', '', 0
72   -);
73   -INSERT INTO system_menu(
74   - name, permission, type, sort, parent_id,
75   - path, icon, component, status
76   -)
77   -VALUES (
78   - '客户限制配置删除', 'crm:customer-limit-config:delete', 3, 4, @parentId,
79   - '', '', '', 0
80   -);
81   -INSERT INTO system_menu(
82   - name, permission, type, sort, parent_id,
83   - path, icon, component, status
84   -)
85   -VALUES (
86   - '客户限制配置导出', 'crm:customer-limit-config:export', 3, 5, @parentId,
87   - '', '', '', 0
88   -);
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtils.java
... ... @@ -73,6 +73,23 @@ public class CollectionUtils {
73 73 return from.stream().filter(filter).map(func).filter(Objects::nonNull).collect(Collectors.toList());
74 74 }
75 75  
  76 + public static <T, U> List<U> convertListByFlatMap(Collection<T> from,
  77 + Function<T, ? extends Stream<? extends U>> func) {
  78 + if (CollUtil.isEmpty(from)) {
  79 + return new ArrayList<>();
  80 + }
  81 + return from.stream().flatMap(func).filter(Objects::nonNull).collect(Collectors.toList());
  82 + }
  83 +
  84 + public static <T, U, R> List<R> convertListByFlatMap(Collection<T> from,
  85 + Function<? super T, ? extends U> mapper,
  86 + Function<U, ? extends Stream<? extends R>> func) {
  87 + if (CollUtil.isEmpty(from)) {
  88 + return new ArrayList<>();
  89 + }
  90 + return from.stream().map(mapper).flatMap(func).filter(Objects::nonNull).collect(Collectors.toList());
  91 + }
  92 +
76 93 public static <K, V> List<V> mergeValuesFromMap(Map<K, List<V>> map) {
77 94 return map.values()
78 95 .stream()
... ... @@ -101,6 +118,23 @@ public class CollectionUtils {
101 118 return from.stream().filter(filter).collect(Collectors.toMap(keyFunc, v -> v));
102 119 }
103 120  
  121 + public static <T, U> Set<U> convertSetByFlatMap(Collection<T> from,
  122 + Function<T, ? extends Stream<? extends U>> func) {
  123 + if (CollUtil.isEmpty(from)) {
  124 + return new HashSet<>();
  125 + }
  126 + return from.stream().flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet());
  127 + }
  128 +
  129 + public static <T, U, R> Set<R> convertSetByFlatMap(Collection<T> from,
  130 + Function<? super T, ? extends U> mapper,
  131 + Function<U, ? extends Stream<? extends R>> func) {
  132 + if (CollUtil.isEmpty(from)) {
  133 + return new HashSet<>();
  134 + }
  135 + return from.stream().map(mapper).flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet());
  136 + }
  137 +
104 138 public static <T, K> Map<K, T> convertMap(Collection<T> from, Function<T, K> keyFunc) {
105 139 if (CollUtil.isEmpty(from)) {
106 140 return new HashMap<>();
... ... @@ -272,38 +306,4 @@ public class CollectionUtils {
272 306 return deptId == null ? Collections.emptyList() : Collections.singleton(deptId);
273 307 }
274 308  
275   - public static <T, U> List<U> convertListByFlatMap(Collection<T> from,
276   - Function<T, ? extends Stream<? extends U>> func) {
277   - if (CollUtil.isEmpty(from)) {
278   - return new ArrayList<>();
279   - }
280   - return from.stream().flatMap(func).filter(Objects::nonNull).collect(Collectors.toList());
281   - }
282   -
283   - public static <T, U, R> List<R> convertListByFlatMap(Collection<T> from,
284   - Function<? super T, ? extends U> mapper,
285   - Function<U, ? extends Stream<? extends R>> func) {
286   - if (CollUtil.isEmpty(from)) {
287   - return new ArrayList<>();
288   - }
289   - return from.stream().map(mapper).flatMap(func).filter(Objects::nonNull).collect(Collectors.toList());
290   - }
291   -
292   - public static <T, U> Set<U> convertSetByFlatMap(Collection<T> from,
293   - Function<T, ? extends Stream<? extends U>> func) {
294   - if (CollUtil.isEmpty(from)) {
295   - return new HashSet<>();
296   - }
297   - return from.stream().flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet());
298   - }
299   -
300   - public static <T, U, R> Set<R> convertSetByFlatMap(Collection<T> from,
301   - Function<? super T, ? extends U> mapper,
302   - Function<U, ? extends Stream<? extends R>> func) {
303   - if (CollUtil.isEmpty(from)) {
304   - return new HashSet<>();
305   - }
306   - return from.stream().map(mapper).flatMap(func).filter(Objects::nonNull).collect(Collectors.toSet());
307   - }
308   -
309 309 }
... ...
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/spring/SpringExpressionUtils.java
... ... @@ -3,7 +3,7 @@ package cn.iocoder.yudao.framework.common.util.spring;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.map.MapUtil;
5 5 import cn.hutool.core.util.ArrayUtil;
6   -import org.aspectj.lang.ProceedingJoinPoint;
  6 +import org.aspectj.lang.JoinPoint;
7 7 import org.aspectj.lang.reflect.MethodSignature;
8 8 import org.springframework.core.DefaultParameterNameDiscoverer;
9 9 import org.springframework.core.ParameterNameDiscoverer;
... ... @@ -25,7 +25,7 @@ import java.util.Map;
25 25 public class SpringExpressionUtils {
26 26  
27 27 /**
28   - * spel表达式解析器
  28 + * Spring EL 表达式解析器
29 29 */
30 30 private static final ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser();
31 31 /**
... ... @@ -43,7 +43,7 @@ public class SpringExpressionUtils {
43 43 * @param expressionString EL 表达式数组
44 44 * @return 执行界面
45 45 */
46   - public static Object parseExpression(ProceedingJoinPoint joinPoint, String expressionString) {
  46 + public static Object parseExpression(JoinPoint joinPoint, String expressionString) {
47 47 Map<String, Object> result = parseExpressions(joinPoint, Collections.singletonList(expressionString));
48 48 return result.get(expressionString);
49 49 }
... ... @@ -55,7 +55,7 @@ public class SpringExpressionUtils {
55 55 * @param expressionStrings EL 表达式数组
56 56 * @return 结果,key 为表达式,value 为对应值
57 57 */
58   - public static Map<String, Object> parseExpressions(ProceedingJoinPoint joinPoint, List<String> expressionStrings) {
  58 + public static Map<String, Object> parseExpressions(JoinPoint joinPoint, List<String> expressionStrings) {
59 59 // 如果为空,则不进行解析
60 60 if (CollUtil.isEmpty(expressionStrings)) {
61 61 return MapUtil.newHashMap();
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/AuditStatusEnum.java deleted
1   -package cn.iocoder.yudao.module.crm.enums;
2   -
3   -import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
4   -
5   -import java.util.Arrays;
6   -
7   -// TODO @liuhongfeng:这个状态,还是搞成专属 CrmReceivableDO 专属的 status;
8   -/**
9   - * 流程审批状态枚举类
10   - * 0 未审核 1 审核通过 2 审核拒绝 3 审核中 4 已撤回 TODO @liuhongfeng:这一行可以删除,因为已经有枚举属性了哈;
11   - * @author 赤焰
12   - */
13   -// TODO @liuhongfeng:可以使用 @Getter、@AllArgsConstructor 简化 get、构造方法
14   -public enum AuditStatusEnum implements IntArrayValuable {
15   -
16   - // TODO @liuhongfeng:草稿 0;10 审核中;20 审核通过;30 审核拒绝;40 已撤回;主要是留好间隙,万一每个地方要做点拓展; 然后,枚举字段的顺序调整下,审批中,一定要放两个审批通过、拒绝前面哈;
17   - /**
18   - * 未审批
19   - */
20   - AUDIT_NEW(0, "未审批"),
21   - /**
22   - * 审核通过
23   - */
24   - AUDIT_FINISH(1, "审核通过"),
25   - /**
26   - * 审核拒绝
27   - */
28   - AUDIT_REJECT(2, "审核拒绝"),
29   - /**
30   - * 审核中
31   - */
32   - AUDIT_DOING(3, "审核中"),
33   - /**
34   - * 已撤回
35   - */
36   - AUDIT_RETURN(4, "已撤回");
37   -
38   - // TODO liuhongfeng:value 改成 status;desc 改成 name;
39   - private final Integer value;
40   - private final String desc;
41   -
42   - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(AuditStatusEnum::getValue).toArray();
43   -
44   - AuditStatusEnum(Integer value, String desc) {
45   - this.value = value;
46   - this.desc = desc;
47   - }
48   -
49   - public Integer getValue() {
50   - return value;
51   - }
52   -
53   - public String getDesc() {
54   - return desc;
55   - }
56   -
57   - @Override
58   - public int[] array() {
59   - return ARRAYS;
60   - }
61   -}
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/DictTypeConstants.java
... ... @@ -11,6 +11,6 @@ public interface DictTypeConstants {
11 11 String CRM_CUSTOMER_INDUSTRY = "crm_customer_industry"; // CRM 客户所属行业
12 12 String CRM_CUSTOMER_LEVEL = "crm_customer_level"; // CRM 客户等级
13 13 String CRM_CUSTOMER_SOURCE = "crm_customer_source"; // CRM 客户来源
14   - String CRM_RECEIVABLE_CHECK_STATUS = "crm_receivable_check_status"; // CRM 审批状态
  14 + String CRM_AUDIT_STATUS = "crm_audit_status"; // CRM 审批状态
15 15  
16 16 }
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ErrorCodeConstants.java
... ... @@ -20,8 +20,6 @@ public interface ErrorCodeConstants {
20 20  
21 21 // TODO @lilleo:商机状态、商机类型,都单独错误码段
22 22  
23   - ErrorCode BUSINESS_STATUS_TYPE_NOT_EXISTS = new ErrorCode(1_020_002_001, "商机状态类型不存在");
24   - ErrorCode BUSINESS_STATUS_NOT_EXISTS = new ErrorCode(1_020_002_002, "商机状态不存在");
25 23  
26 24 // ========== 联系人管理 1-020-003-000 ==========
27 25 ErrorCode CONTACT_NOT_EXISTS = new ErrorCode(1_020_003_000, "联系人不存在");
... ... @@ -34,18 +32,22 @@ public interface ErrorCodeConstants {
34 32  
35 33 // ========== 客户管理 1_020_006_000 ==========
36 34 ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode(1_020_006_000, "客户不存在");
37   - ErrorCode CUSTOMER_OWNER_EXISTS = new ErrorCode(1_020_006_001, "客户已存在所属负责人");
38   - ErrorCode CUSTOMER_LOCKED = new ErrorCode(1_020_006_002, "客户状态已锁定");
  35 + ErrorCode CUSTOMER_OWNER_EXISTS = new ErrorCode(1_020_006_001, "客户【{}】已存在所属负责人");
  36 + ErrorCode CUSTOMER_LOCKED = new ErrorCode(1_020_006_002, "客户【{}】状态已锁定");
39 37 ErrorCode CUSTOMER_ALREADY_DEAL = new ErrorCode(1_020_006_003, "客户已交易");
40   - // TODO @wanwan:这 2 个单独配置段噢
41   - ErrorCode CUSTOMER_POOL_CONFIG_ERROR = new ErrorCode(1_020_006_001, "客户公海规则设置不正确");
42   - ErrorCode CUSTOMER_LIMIT_CONFIG_NOT_EXISTS = new ErrorCode(1_020_006_002, "客户限制配置不存在");
  38 + ErrorCode CUSTOMER_IN_POOL = new ErrorCode(1_020_006_004, "客户【{}】放入公海失败,原因:已经是公海客户");
  39 + ErrorCode CUSTOMER_LOCKED_PUT_POOL_FAIL = new ErrorCode(1_020_006_005, "客户【{}】放入公海失败,原因:客户已锁定");
  40 + ErrorCode CUSTOMER_UPDATE_OWNER_USER_FAIL = new ErrorCode(1_020_006_006, "更新客户【{}】负责人失败, 原因:系统异常");
43 41  
44 42 // ========== 权限管理 1_020_007_000 ==========
45 43 ErrorCode CRM_PERMISSION_NOT_EXISTS = new ErrorCode(1_020_007_000, "数据权限不存在");
46 44 ErrorCode CRM_PERMISSION_DENIED = new ErrorCode(1_020_007_001, "{}操作失败,原因:没有权限");
47 45 ErrorCode CRM_PERMISSION_MODEL_NOT_EXISTS = new ErrorCode(1_020_007_002, "{}不存在");
48 46 ErrorCode CRM_PERMISSION_MODEL_TRANSFER_FAIL_OWNER_USER_EXISTS = new ErrorCode(1_020_007_003, "{}操作失败,原因:转移对象已经是该负责人");
  47 + ErrorCode CRM_PERMISSION_DELETE_FAIL = new ErrorCode(1_020_007_004, "删除数据权限失败,原因:批量删除权限的时候,只能属于同一个 bizId 下");
  48 + ErrorCode CRM_PERMISSION_DELETE_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_005, "删除数据权限失败,原因:存在负责人");
  49 + ErrorCode CRM_PERMISSION_DELETE_DENIED = new ErrorCode(1_020_007_006, "删除数据权限失败,原因:没有权限");
  50 + ErrorCode CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER = new ErrorCode(1_020_007_007, "删除数据权限失败,原因:不能删除负责人");
49 51  
50 52 // ========== 产品 1_020_008_000 ==========
51 53 ErrorCode PRODUCT_NOT_EXISTS = new ErrorCode(1_020_008_000, "产品不存在");
... ... @@ -54,4 +56,14 @@ public interface ErrorCodeConstants {
54 56 // ========== 产品分类 1_020_009_000 ==========
55 57 ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_020_009_000, "产品分类不存在");
56 58  
  59 + // ========== 商机状态类型 1_020_010_000 ==========
  60 + ErrorCode BUSINESS_STATUS_TYPE_NOT_EXISTS = new ErrorCode(1_020_010_000, "商机状态类型不存在");
  61 + ErrorCode BUSINESS_STATUS_TYPE_NAME_EXISTS = new ErrorCode(1_020_010_001, "商机状态类型名称已存在");
  62 +
  63 + // ========== 商机状态 1_020_011_000 ==========
  64 + ErrorCode BUSINESS_STATUS_NOT_EXISTS = new ErrorCode(1_020_011_000, "商机状态不存在");
  65 +
  66 + // ========== 客户公海规则设置 1_020_011_000 ==========
  67 + ErrorCode CUSTOMER_LIMIT_CONFIG_NOT_EXISTS = new ErrorCode(1_020_012_000, "客户限制配置不存在");
  68 +
57 69 }
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/ReturnTypeEnum.java deleted
1   -package cn.iocoder.yudao.module.crm.enums;
2   -
3   -// TODO @liuhongfeng:这个的作用是?
4   -/**
5   - * @author 赤焰
6   - */
7   -public enum ReturnTypeEnum {
8   -}
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmAuditStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.enums.common;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
  4 +import lombok.Getter;
  5 +import lombok.RequiredArgsConstructor;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +/**
  10 + * CRM 的审批状态
  11 + *
  12 + * @author 赤焰
  13 + */
  14 +@RequiredArgsConstructor
  15 +@Getter
  16 +public enum CrmAuditStatusEnum implements IntArrayValuable {
  17 +
  18 + DRAFT(0, "未提交"),
  19 + PROCESS(10, "审批中"),
  20 + APPROVE(20, "审核通过"),
  21 + REJECT(30, "审核不通过"),
  22 + CANCEL(40, "已取消");
  23 +
  24 + private final Integer status;
  25 + private final String name;
  26 +
  27 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmAuditStatusEnum::getStatus).toArray();
  28 +
  29 + @Override
  30 + public int[] array() {
  31 + return ARRAYS;
  32 + }
  33 +
  34 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmBizTypeEnum.java renamed to yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmBizTypeEnum.java
1   -package cn.iocoder.yudao.module.crm.framework.enums;
  1 +package cn.iocoder.yudao.module.crm.enums.common;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.ObjUtil;
... ... @@ -9,7 +9,7 @@ import lombok.RequiredArgsConstructor;
9 9 import java.util.Arrays;
10 10  
11 11 /**
12   - * Crm 类型枚举
  12 + * CRM 业务类型枚举
13 13 *
14 14 * @author HUIHUI
15 15 */
... ... @@ -17,15 +17,14 @@ import java.util.Arrays;
17 17 @Getter
18 18 public enum CrmBizTypeEnum implements IntArrayValuable {
19 19  
20   - // TODO @puhui999:如果类似 CrmBizPermission 的 bizType 需要为空,可以设置它是数组,参考 Telephone 的 payload
21   - CRM_PERMISSION(0, "团队"), // CrmPermissionController 中使用
22 20 CRM_LEADS(1, "线索"),
23 21 CRM_CUSTOMER(2, "客户"),
24   - CRM_CONTACTS(3, "联系人"),
25   - CRM_BUSINESS(5, "商机"),
26   - CRM_CONTRACT(6, "合同");
  22 + CRM_CONTACT(3, "联系人"),
  23 + CRM_BUSINESS(4, "商机"),
  24 + CRM_CONTRACT(5, "合同");
27 25  
28 26 public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmBizTypeEnum::getType).toArray();
  27 +
29 28 /**
30 29 * 类型
31 30 */
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerSceneEnum.java renamed to yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/common/CrmSceneEnum.java
1   -package cn.iocoder.yudao.module.crm.enums.customer;
  1 +package cn.iocoder.yudao.module.crm.enums.common;
2 2  
3 3 import cn.hutool.core.util.ObjUtil;
4 4 import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
... ... @@ -7,20 +7,19 @@ import lombok.Getter;
7 7  
8 8 import java.util.Arrays;
9 9  
10   -// TODO @puhui999:这个应该是 crm 全局的,不仅仅属于 customer 客户哈;
11 10 /**
12   - * CRM 客户等级
  11 + * CRM 列表检索场景
13 12 *
14   - * @author Wanwan
  13 + * @author HUIHUI
15 14 */
16 15 @Getter
17 16 @AllArgsConstructor
18   -public enum CrmCustomerSceneEnum implements IntArrayValuable {
  17 +public enum CrmSceneEnum implements IntArrayValuable {
19 18  
20   - OWNER(1, "我负责的客户"),
21   - FOLLOW(2, "我关注的客户");
  19 + OWNER(1, "我负责的"),
  20 + FOLLOW(2, "我关注的");
22 21  
23   - public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmCustomerSceneEnum::getType).toArray();
  22 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmSceneEnum::getType).toArray();
24 23  
25 24 /**
26 25 * 场景类型
... ...
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLimitConfigTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.enums.customer;
  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 + * CRM 客户限制配置规则类型
  11 + *
  12 + * @author Wanwan
  13 + */
  14 +@Getter
  15 +@AllArgsConstructor
  16 +public enum CrmCustomerLimitConfigTypeEnum implements IntArrayValuable {
  17 +
  18 + /**
  19 + * 拥有客户数限制
  20 + */
  21 + CUSTOMER_QUANTITY_LIMIT(1, "拥有客户数限制"),
  22 + /**
  23 + * 锁定客户数限制
  24 + */
  25 + CUSTOMER_LOCK_LIMIT(2, "锁定客户数限制"),
  26 + ;
  27 +
  28 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmCustomerLimitConfigTypeEnum::getCode).toArray();
  29 +
  30 + /**
  31 + * 状态
  32 + */
  33 + private final Integer code;
  34 + /**
  35 + * 状态名
  36 + */
  37 + private final String name;
  38 +
  39 + @Override
  40 + public int[] array() {
  41 + return ARRAYS;
  42 + }
  43 +
  44 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/framework/enums/CrmPermissionLevelEnum.java renamed to yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/permission/CrmPermissionLevelEnum.java
1   -package cn.iocoder.yudao.module.crm.framework.enums;
  1 +package cn.iocoder.yudao.module.crm.enums.permission;
2 2  
3 3 import cn.hutool.core.util.ObjUtil;
4 4 import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
... ... @@ -8,7 +8,7 @@ import lombok.Getter;
8 8 import java.util.Arrays;
9 9  
10 10 /**
11   - * Crm 数据权限级别枚举
  11 + * CRM 数据权限级别枚举
12 12 *
13 13 * @author HUIHUI
14 14 */
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessController.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.business;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
3 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 7 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6 8 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7   -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*;
  9 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*;
  10 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusQueryVO;
  11 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeQueryVO;
  12 +import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.CrmContractPageReqVO;
8 13 import cn.iocoder.yudao.module.crm.convert.business.CrmBusinessConvert;
9 14 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
10   -import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
  15 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
  16 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO;
  17 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
11 18 import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService;
  19 +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusService;
  20 +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusTypeService;
  21 +import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
12 22 import io.swagger.v3.oas.annotations.Operation;
13 23 import io.swagger.v3.oas.annotations.Parameter;
14 24 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -21,6 +31,9 @@ import javax.servlet.http.HttpServletResponse;
21 31 import javax.validation.Valid;
22 32 import java.io.IOException;
23 33 import java.util.List;
  34 +import java.util.Objects;
  35 +import java.util.Set;
  36 +import java.util.stream.Collectors;
24 37  
25 38 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
26 39 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
... ... @@ -35,6 +48,15 @@ public class CrmBusinessController {
35 48 @Resource
36 49 private CrmBusinessService businessService;
37 50  
  51 + @Resource
  52 + private CrmCustomerService customerService;
  53 +
  54 + @Resource
  55 + private CrmBusinessStatusTypeService businessStatusTypeService;
  56 +
  57 + @Resource
  58 + private CrmBusinessStatusService businessStatusService;
  59 +
38 60 @PostMapping("/create")
39 61 @Operation(summary = "创建商机")
40 62 @PreAuthorize("@ss.hasPermission('crm:business:create')")
... ... @@ -73,27 +95,72 @@ public class CrmBusinessController {
73 95 @PreAuthorize("@ss.hasPermission('crm:business:query')")
74 96 public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPage(@Valid CrmBusinessPageReqVO pageVO) {
75 97 PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(pageVO, getLoginUserId());
76   - return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult));
  98 + if (CollUtil.isEmpty(pageResult.getList())) {
  99 + return success(PageResult.empty(pageResult.getTotal()));
  100 + }
  101 + // 处理客户名称回显
  102 + // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈;
  103 + Set<Long> customerIds = pageResult.getList().stream()
  104 + .map(CrmBusinessDO::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet());
  105 + List<CrmCustomerDO> customerList = customerService.getCustomerList(customerIds);
  106 + // 处理商机状态类型名称回显
  107 + Set<Long> statusTypeIds = pageResult.getList().stream()
  108 + .map(CrmBusinessDO::getStatusTypeId).filter(Objects::nonNull).collect(Collectors.toSet());
  109 + CrmBusinessStatusTypeQueryVO queryStatusTypeVO = new CrmBusinessStatusTypeQueryVO();
  110 + queryStatusTypeVO.setIdList(statusTypeIds);
  111 + List<CrmBusinessStatusTypeDO> statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO);
  112 + // 处理商机状态名称回显
  113 + Set<Long> statusIds = pageResult.getList().stream()
  114 + .map(CrmBusinessDO::getStatusId).filter(Objects::nonNull).collect(Collectors.toSet());
  115 + CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO();
  116 + queryVO.setIdList(statusIds);
  117 + List<CrmBusinessStatusDO> statusList = businessStatusService.selectList(queryVO);
  118 + return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult, customerList, statusTypeList, statusList));
  119 + }
  120 +
  121 + @GetMapping("/page-by-customer")
  122 + @Operation(summary = "获得商机分页,基于指定客户")
  123 + public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPageByCustomer(@Valid CrmContractPageReqVO pageReqVO) {
  124 + Assert.notNull(pageReqVO.getCustomerId(), "客户编号不能为空");
  125 + PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPageByCustomer(pageReqVO);
  126 + // 处理客户名称回显
  127 + // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈;
  128 + Set<Long> customerIds = pageResult.getList().stream()
  129 + .map(CrmBusinessDO::getCustomerId).filter(Objects::nonNull).collect(Collectors.toSet());
  130 + List<CrmCustomerDO> customerList = customerService.getCustomerList(customerIds);
  131 + // 处理商机状态类型名称回显
  132 + Set<Long> statusTypeIds = pageResult.getList().stream()
  133 + .map(CrmBusinessDO::getStatusTypeId).filter(Objects::nonNull).collect(Collectors.toSet());
  134 + CrmBusinessStatusTypeQueryVO queryStatusTypeVO = new CrmBusinessStatusTypeQueryVO();
  135 + queryStatusTypeVO.setIdList(statusTypeIds);
  136 + List<CrmBusinessStatusTypeDO> statusTypeList = businessStatusTypeService.selectList(queryStatusTypeVO);
  137 + // 处理商机状态名称回显
  138 + Set<Long> statusIds = pageResult.getList().stream()
  139 + .map(CrmBusinessDO::getStatusId).filter(Objects::nonNull).collect(Collectors.toSet());
  140 + CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO();
  141 + queryVO.setIdList(statusIds);
  142 + List<CrmBusinessStatusDO> statusList = businessStatusService.selectList(queryVO);
  143 + return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult, customerList, statusTypeList, statusList));
77 144 }
78 145  
79 146 @GetMapping("/pool-page")
80 147 @Operation(summary = "获得商机公海分页")
81 148 @PreAuthorize("@ss.hasPermission('crm:business:query')")
82 149 public CommonResult<PageResult<CrmBusinessRespVO>> getBusinessPoolPage(@Valid CrmBusinessPageReqVO pageVO) {
83   - PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(pageVO, CrmPermissionDO.POOL_USER_ID);
84   - return success(CrmBusinessConvert.INSTANCE.convertPage(pageResult));
  150 + // TODO puhui999: 等数据权限完善后再实现
  151 + return null;
85 152 }
86 153  
87 154 @GetMapping("/export-excel")
88 155 @Operation(summary = "导出商机 Excel")
89 156 @PreAuthorize("@ss.hasPermission('crm:business:export')")
90 157 @OperateLog(type = EXPORT)
91   - public void exportBusinessExcel(@Valid CrmBusinessExportReqVO exportReqVO,
  158 + public void exportBusinessExcel(@Valid CrmBusinessPageReqVO exportReqVO,
92 159 HttpServletResponse response) throws IOException {
93   - List<CrmBusinessDO> list = businessService.getBusinessList(exportReqVO);
  160 + PageResult<CrmBusinessDO> pageResult = businessService.getBusinessPage(exportReqVO, getLoginUserId());
94 161 // 导出 Excel
95   - List<CrmBusinessExcelVO> datas = CrmBusinessConvert.INSTANCE.convertList02(list);
96   - ExcelUtils.write(response, "商机.xls", "数据", CrmBusinessExcelVO.class, datas);
  162 + ExcelUtils.write(response, "商机.xls", "数据", CrmBusinessExcelVO.class,
  163 + CrmBusinessConvert.INSTANCE.convertList02(pageResult.getList()));
97 164 }
98 165  
99 166 @PutMapping("/transfer")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/CrmBusinessStatusTypeController.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/CrmBusinessStatusTypeController.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business;
2 2  
3 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
5 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 8 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
7 9 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
8   -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.*;
  10 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusQueryVO;
  11 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusRespVO;
  12 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypePageReqVO;
  13 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeQueryVO;
  14 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeRespVO;
  15 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeSaveReqVO;
  16 +import cn.iocoder.yudao.module.crm.convert.businessstatus.CrmBusinessStatusConvert;
9 17 import cn.iocoder.yudao.module.crm.convert.businessstatustype.CrmBusinessStatusTypeConvert;
10   -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO;
11   -import cn.iocoder.yudao.module.crm.service.businessstatustype.CrmBusinessStatusTypeService;
  18 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
  19 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO;
  20 +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusService;
  21 +import cn.iocoder.yudao.module.crm.service.business.CrmBusinessStatusTypeService;
  22 +import cn.iocoder.yudao.module.system.api.dept.DeptApi;
  23 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
12 24 import io.swagger.v3.oas.annotations.Operation;
13 25 import io.swagger.v3.oas.annotations.Parameter;
14 26 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -22,11 +34,13 @@ import javax.validation.Valid;
22 34 import java.io.IOException;
23 35 import java.util.Collection;
24 36 import java.util.List;
  37 +import java.util.Objects;
  38 +import java.util.Set;
  39 +import java.util.stream.Collectors;
25 40  
26 41 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
27 42 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
28 43  
29   -// TODO @lilleo:这个模块,可以挪到 business 下;这样我打开 business 包下,就知道,噢~原来里面有 business 商机、有 type 状态类型、status 具体状态;
30 44 @Tag(name = "管理后台 - 商机状态类型")
31 45 @RestController
32 46 @RequestMapping("/crm/business-status-type")
... ... @@ -36,17 +50,23 @@ public class CrmBusinessStatusTypeController {
36 50 @Resource
37 51 private CrmBusinessStatusTypeService businessStatusTypeService;
38 52  
  53 + @Resource
  54 + private CrmBusinessStatusService businessStatusService;
  55 +
  56 + @Resource
  57 + private DeptApi deptApi;
  58 +
39 59 @PostMapping("/create")
40 60 @Operation(summary = "创建商机状态类型")
41 61 @PreAuthorize("@ss.hasPermission('crm:business-status-type:create')")
42   - public CommonResult<Long> createBusinessStatusType(@Valid @RequestBody CrmBusinessStatusTypeCreateReqVO createReqVO) {
  62 + public CommonResult<Long> createBusinessStatusType(@Valid @RequestBody CrmBusinessStatusTypeSaveReqVO createReqVO) {
43 63 return success(businessStatusTypeService.createBusinessStatusType(createReqVO));
44 64 }
45 65  
46 66 @PutMapping("/update")
47 67 @Operation(summary = "更新商机状态类型")
48 68 @PreAuthorize("@ss.hasPermission('crm:business-status-type:update')")
49   - public CommonResult<Boolean> updateBusinessStatusType(@Valid @RequestBody CrmBusinessStatusTypeUpdateReqVO updateReqVO) {
  69 + public CommonResult<Boolean> updateBusinessStatusType(@Valid @RequestBody CrmBusinessStatusTypeSaveReqVO updateReqVO) {
50 70 businessStatusTypeService.updateBusinessStatusType(updateReqVO);
51 71 return success(true);
52 72 }
... ... @@ -66,45 +86,62 @@ public class CrmBusinessStatusTypeController {
66 86 @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')")
67 87 public CommonResult<CrmBusinessStatusTypeRespVO> getBusinessStatusType(@RequestParam("id") Long id) {
68 88 CrmBusinessStatusTypeDO businessStatusType = businessStatusTypeService.getBusinessStatusType(id);
69   - return success(CrmBusinessStatusTypeConvert.INSTANCE.convert(businessStatusType));
70   - }
71   -
72   - // TODO @lilleo:这个接口,暂时用不到,可以考虑先删除掉
73   - @GetMapping("/list")
74   - @Operation(summary = "获得商机状态类型列表")
75   - @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
76   - @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')")
77   - public CommonResult<List<CrmBusinessStatusTypeRespVO>> getBusinessStatusTypeList(@RequestParam("ids") Collection<Long> ids) {
78   - List<CrmBusinessStatusTypeDO> list = businessStatusTypeService.getBusinessStatusTypeList(ids);
79   - return success(CrmBusinessStatusTypeConvert.INSTANCE.convertList(list));
  89 + // 处理状态回显
  90 + // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈;
  91 + CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO();
  92 + queryVO.setTypeId(id);
  93 + List<CrmBusinessStatusDO> statusList = businessStatusService.selectList(queryVO);
  94 + return success(CrmBusinessStatusTypeConvert.INSTANCE.convert(businessStatusType, statusList));
80 95 }
81 96  
82 97 @GetMapping("/page")
83 98 @Operation(summary = "获得商机状态类型分页")
84 99 @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')")
85   - public CommonResult<PageResult<CrmBusinessStatusTypeRespVO>> getBusinessStatusTypePage(@Valid CrmBusinessStatusTypePageReqVO pageVO) {
86   - PageResult<CrmBusinessStatusTypeDO> pageResult = businessStatusTypeService.getBusinessStatusTypePage(pageVO);
87   - return success(CrmBusinessStatusTypeConvert.INSTANCE.convertPage(pageResult));
  100 + public CommonResult<PageResult<CrmBusinessStatusTypeRespVO>> getBusinessStatusTypePage(@Valid CrmBusinessStatusTypePageReqVO pageReqVO) {
  101 + PageResult<CrmBusinessStatusTypeDO> pageResult = businessStatusTypeService.getBusinessStatusTypePage(pageReqVO);
  102 + // 处理部门回显
  103 + // TODO @ljlleo:可以使用 CollectionUtils.convertSet 替代常用的 stream 操作,更简洁一点;下面几个也是哈;
  104 + Set<Long> deptIds = pageResult.getList().stream()
  105 + .map(CrmBusinessStatusTypeDO::getDeptIds)
  106 + .filter(Objects::nonNull)
  107 + .flatMap(Collection::stream)
  108 + .collect(Collectors.toSet());
  109 + List<DeptRespDTO> deptList = deptApi.getDeptList(deptIds);
  110 + return success(CrmBusinessStatusTypeConvert.INSTANCE.convertPage(pageResult, deptList));
88 111 }
89 112  
90 113 @GetMapping("/export-excel")
91 114 @Operation(summary = "导出商机状态类型 Excel")
92 115 @PreAuthorize("@ss.hasPermission('crm:business-status-type:export')")
93 116 @OperateLog(type = EXPORT)
94   - public void exportBusinessStatusTypeExcel(@Valid CrmBusinessStatusTypeExportReqVO exportReqVO,
  117 + public void exportBusinessStatusTypeExcel(@Valid CrmBusinessStatusTypePageReqVO pageReqVO,
95 118 HttpServletResponse response) throws IOException {
96   - List<CrmBusinessStatusTypeDO> list = businessStatusTypeService.getBusinessStatusTypeList(exportReqVO);
  119 + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
  120 + List<CrmBusinessStatusTypeDO> list = businessStatusTypeService.getBusinessStatusTypePage(pageReqVO).getList();
97 121 // 导出 Excel
98   - List<CrmBusinessStatusTypeExcelVO> datas = CrmBusinessStatusTypeConvert.INSTANCE.convertList02(list);
99   - ExcelUtils.write(response, "商机状态类型.xls", "数据", CrmBusinessStatusTypeExcelVO.class, datas);
  122 + ExcelUtils.write(response, "商机状态类型.xls", "数据", CrmBusinessStatusTypeRespVO.class,
  123 + BeanUtils.toBean(list, CrmBusinessStatusTypeRespVO.class));
100 124 }
101 125  
102 126 @GetMapping("/get-simple-list")
103 127 @Operation(summary = "获得商机状态类型列表")
104 128 @PreAuthorize("@ss.hasPermission('crm:business-status-type:query')")
105 129 public CommonResult<List<CrmBusinessStatusTypeRespVO>> getBusinessStatusTypeList() {
106   - List<CrmBusinessStatusTypeDO> list = businessStatusTypeService.getBusinessStatusTypeListByStatus(CommonStatusEnum.ENABLE.getStatus());
107   - return success(CrmBusinessStatusTypeConvert.INSTANCE.convertList(list));
  130 + CrmBusinessStatusTypeQueryVO queryVO = new CrmBusinessStatusTypeQueryVO();
  131 + queryVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  132 + List<CrmBusinessStatusTypeDO> list = businessStatusTypeService.selectList(queryVO);
  133 + return success(BeanUtils.toBean(list, CrmBusinessStatusTypeRespVO.class));
  134 + }
  135 +
  136 + // TODO @ljlleo 这个接口,是不是可以和 getBusinessStatusTypeList 合并成一个?
  137 + @GetMapping("/get-status-list")
  138 + @Operation(summary = "获得商机状态列表")
  139 + @PreAuthorize("@ss.hasPermission('crm:business-status:query')")
  140 + public CommonResult<List<CrmBusinessStatusRespVO>> getBusinessStatusListByTypeId(@RequestParam("typeId") Long typeId) {
  141 + CrmBusinessStatusQueryVO queryVO = new CrmBusinessStatusQueryVO();
  142 + queryVO.setTypeId(typeId);
  143 + List<CrmBusinessStatusDO> list = businessStatusService.selectList(queryVO);
  144 + return success(CrmBusinessStatusConvert.INSTANCE.convertList(list));
108 145 }
109 146  
110 147 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/package-info.java deleted
1   -/**
2   - * 商机(销售机会)
3   - */
4   -package cn.iocoder.yudao.module.crm.controller.admin.business;
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessExportReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.business.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -import org.springframework.format.annotation.DateTimeFormat;
6   -
7   -import java.math.BigDecimal;
8   -import java.time.LocalDateTime;
9   -
10   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
11   -
12   -@Schema(description = "管理后台 - 商机 Excel 导出 Request VO,参数和 CrmBusinessPageReqVO 是一致的")
13   -@Data
14   -public class CrmBusinessExportReqVO {
15   -
16   - @Schema(description = "商机名称", example = "李四")
17   - private String name;
18   -
19   - @Schema(description = "商机状态类型编号", example = "25714")
20   - private Long statusTypeId;
21   -
22   - @Schema(description = "商机状态编号", example = "30320")
23   - private Long statusId;
24   -
25   - @Schema(description = "下次联系时间")
26   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
27   - private LocalDateTime[] contactNextTime;
28   -
29   - @Schema(description = "客户编号", example = "10299")
30   - private Long customerId;
31   -
32   - @Schema(description = "预计成交日期")
33   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
34   - private LocalDateTime[] dealTime;
35   -
36   - @Schema(description = "商机金额", example = "12371")
37   - private BigDecimal price;
38   -
39   - @Schema(description = "整单折扣")
40   - private BigDecimal discountPercent;
41   -
42   - @Schema(description = "产品总金额", example = "12025")
43   - private BigDecimal productPrice;
44   -
45   - @Schema(description = "备注", example = "随便")
46   - private String remark;
47   -
48   - @Schema(description = "负责人的用户编号", example = "25562")
49   - private Long ownerUserId;
50   -
51   - @Schema(description = "创建时间")
52   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
53   - private LocalDateTime[] createTime;
54   -
55   - @Schema(description = "只读权限的用户编号数组")
56   - private String roUserIds;
57   -
58   - @Schema(description = "读写权限的用户编号数组")
59   - private String rwUserIds;
60   -
61   - @Schema(description = "1赢单2输单3无效", example = "1")
62   - private Integer endStatus;
63   -
64   - @Schema(description = "结束时的备注", example = "你说的对")
65   - private String endRemark;
66   -
67   - @Schema(description = "最后跟进时间")
68   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
69   - private LocalDateTime[] contactLastTime;
70   -
71   - @Schema(description = "跟进状态", example = "1")
72   - private Integer followUpStatus;
73   -
74   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessBaseVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessBaseVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.business.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessCreateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessCreateReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.business.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessExcelVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessExcelVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.business.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business;
2 2  
3 3 import com.alibaba.excel.annotation.ExcelProperty;
4 4 import lombok.Data;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessPageReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessPageReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.business.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
... ... @@ -15,4 +15,7 @@ public class CrmBusinessPageReqVO extends PageParam {
15 15 @Schema(description = "商机名称", example = "李四")
16 16 private String name;
17 17  
  18 + @Schema(description = "客户编号", example = "10795")
  19 + private Long customerId;
  20 +
18 21 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessRespVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessRespVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.business.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.*;
... ... @@ -16,4 +16,13 @@ public class CrmBusinessRespVO extends CrmBusinessBaseVO {
16 16 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
17 17 private LocalDateTime createTime;
18 18  
  19 + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
  20 + private String customerName;
  21 +
  22 + @Schema(description = "状态类型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "进行中")
  23 + private String statusTypeName;
  24 +
  25 + @Schema(description = "状态名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "跟进中")
  26 + private String statusName;
  27 +
19 28 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessTransferReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessTransferReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.business.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business;
2 2  
3   -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
  3 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/CrmBusinessUpdateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/business/CrmBusinessUpdateReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.business.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.business;
2 2  
  3 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.CrmBusinessBaseVO;
3 4 import io.swagger.v3.oas.annotations.media.Schema;
4 5 import lombok.Data;
5 6 import lombok.EqualsAndHashCode;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusPageReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusPageReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.status;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
... ... @@ -12,7 +12,4 @@ import lombok.ToString;
12 12 @ToString(callSuper = true)
13 13 public class CrmBusinessStatusPageReqVO extends PageParam {
14 14  
15   - @Schema(description = "状态类型编号", example = "22882")
16   - private Long typeId;
17   -
18 15 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusQueryVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.status;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.ToString;
  6 +
  7 +import java.util.Collection;
  8 +
  9 +@Schema(description = "管理后台 - 商机状态 Query VO")
  10 +@Data
  11 +@ToString(callSuper = true)
  12 +public class CrmBusinessStatusQueryVO {
  13 +
  14 + @Schema(description = "主键集合")
  15 + private Collection<Long> idList;
  16 +
  17 + @Schema(description = "状态类型编号")
  18 + private Long typeId;
  19 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusExcelVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusRespVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.status;
2 2  
  3 +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
3 4 import com.alibaba.excel.annotation.ExcelProperty;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
4 6 import lombok.Data;
5 7  
6   -// TODO @lilleo:这个暂时不需要;嘿嘿~不是每个模块都需要导出哈
7   -/**
8   - * 商机状态 Excel VO
9   - *
10   - * @author ljlleo
11   - */
  8 +@Schema(description = "管理后台 - 商机状态 Response VO")
12 9 @Data
13   -public class CrmBusinessStatusExcelVO {
  10 +@ExcelIgnoreUnannotated
  11 +public class CrmBusinessStatusRespVO {
14 12  
  13 + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "23899")
15 14 @ExcelProperty("主键")
16 15 private Long id;
17 16  
  17 + @Schema(description = "状态类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7139")
18 18 @ExcelProperty("状态类型编号")
19 19 private Long typeId;
20 20  
  21 + @Schema(description = "状态名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
21 22 @ExcelProperty("状态名")
22 23 private String name;
23 24  
  25 + @Schema(description = "赢单率")
24 26 @ExcelProperty("赢单率")
25 27 private String percent;
26 28  
  29 + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
27 30 @ExcelProperty("排序")
28 31 private Integer sort;
29 32  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusBaseVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/status/CrmBusinessStatusSaveReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.status;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
5 5  
  6 +import javax.validation.constraints.NotEmpty;
6 7 import javax.validation.constraints.NotNull;
7 8  
8   -/**
9   - * 商机状态 Base VO,提供给添加、修改、详细的子 VO 使用
10   - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
11   - */
  9 +@Schema(description = "管理后台 - 商机状态新增/修改 Request VO")
12 10 @Data
13   -public class CrmBusinessStatusBaseVO {
  11 +public class CrmBusinessStatusSaveReqVO {
14 12  
15   - // TODO @lilleo:example 要写下
  13 + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "23899")
  14 + private Long id;
16 15  
17   - @Schema(description = "状态类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22882")
  16 + @Schema(description = "状态类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7139")
18 17 @NotNull(message = "状态类型编号不能为空")
19 18 private Long typeId;
20 19  
21   - @Schema(description = "状态名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
22   - @NotNull(message = "状态名不能为空")
  20 + @Schema(description = "状态名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
  21 + @NotEmpty(message = "状态名不能为空")
23 22 private String name;
24 23  
25 24 // TODO @lilleo:percent 应该是 Integer;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypePageReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypePageReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.type;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
... ... @@ -12,10 +12,4 @@ import lombok.ToString;
12 12 @ToString(callSuper = true)
13 13 public class CrmBusinessStatusTypePageReqVO extends PageParam {
14 14  
15   - @Schema(description = "状态类型名", example = "芋艿")
16   - private String name;
17   -
18   - @Schema(description = "开启状态", example = "1")
19   - private Boolean status;
20   -
21 15 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeQueryVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.type;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.ToString;
  6 +
  7 +import java.util.Collection;
  8 +
  9 +@Schema(description = "管理后台 - 商机状态类型 Query VO")
  10 +@Data
  11 +@ToString(callSuper = true)
  12 +public class CrmBusinessStatusTypeQueryVO {
  13 +
  14 + @Schema(description = "主键集合")
  15 + private Collection<Long> idList;
  16 +
  17 + @Schema(description = "状态")
  18 + private Integer status;
  19 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.type;
  2 +
  3 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
  4 +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  5 +import com.alibaba.excel.annotation.ExcelProperty;
  6 +import io.swagger.v3.oas.annotations.media.Schema;
  7 +import lombok.Data;
  8 +
  9 +import java.time.LocalDateTime;
  10 +import java.util.List;
  11 +
  12 +@Schema(description = "管理后台 - 商机状态类型 Response VO")
  13 +@Data
  14 +@ExcelIgnoreUnannotated
  15 +public class CrmBusinessStatusTypeRespVO {
  16 +
  17 + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "2934")
  18 + @ExcelProperty("主键")
  19 + private Long id;
  20 +
  21 + @Schema(description = "状态类型名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
  22 + @ExcelProperty("状态类型名")
  23 + private String name;
  24 +
  25 + @Schema(description = "使用的部门编号", requiredMode = Schema.RequiredMode.REQUIRED)
  26 + @ExcelProperty("使用的部门编号")
  27 + private List<Long> deptIds;
  28 + @Schema(description = "使用的部门名称", requiredMode = Schema.RequiredMode.REQUIRED)
  29 + @ExcelProperty("使用的部门名称")
  30 + private List<String> deptNames;
  31 +
  32 + @Schema(description = "创建人", requiredMode = Schema.RequiredMode.REQUIRED)
  33 + @ExcelProperty("创建人")
  34 + private String creator;
  35 +
  36 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  37 + @ExcelProperty("创建时间")
  38 + private LocalDateTime createTime;
  39 +
  40 + // TODO @ljlleo 字段后缀改成 statuses,保持和 deptIds 风格一致;CrmBusinessStatusDO 改成 VO 哈;一般不使用 do 直接返回
  41 + @Schema(description = "状态集合", requiredMode = Schema.RequiredMode.REQUIRED)
  42 + private List<CrmBusinessStatusDO> statusList;
  43 +
  44 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/business/vo/type/CrmBusinessStatusTypeSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.business.vo.type;
  2 +
  3 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusSaveReqVO;
  4 +import com.google.common.collect.Lists;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import lombok.Data;
  7 +
  8 +import javax.validation.constraints.NotEmpty;
  9 +import java.util.List;
  10 +
  11 +@Schema(description = "管理后台 - 商机状态类型新增/修改 Request VO")
  12 +@Data
  13 +public class CrmBusinessStatusTypeSaveReqVO {
  14 +
  15 + @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "2934")
  16 + private Long id;
  17 +
  18 + @Schema(description = "状态类型名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
  19 + @NotEmpty(message = "状态类型名不能为空")
  20 + private String name;
  21 +
  22 + @Schema(description = "使用的部门编号", requiredMode = Schema.RequiredMode.REQUIRED)
  23 + private List<Long> deptIds = Lists.newArrayList();
  24 +
  25 + // TODO @ljlleo VO 里面,我们不使用默认值哈。这里 Lists.newArrayList() 看看怎么去掉。上面 deptIds 也是类似噢
  26 + @Schema(description = "商机状态集合", requiredMode = Schema.RequiredMode.REQUIRED)
  27 + private List<CrmBusinessStatusSaveReqVO> statusList = Lists.newArrayList();
  28 +
  29 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/CrmBusinessStatusController.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus;
2   -
3   -import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6   -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7   -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.*;
8   -import cn.iocoder.yudao.module.crm.convert.businessstatus.CrmBusinessStatusConvert;
9   -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO;
10   -import cn.iocoder.yudao.module.crm.service.businessstatus.CrmBusinessStatusService;
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.*;
17   -
18   -import javax.annotation.Resource;
19   -import javax.servlet.http.HttpServletResponse;
20   -import javax.validation.Valid;
21   -import java.io.IOException;
22   -import java.util.Collection;
23   -import java.util.List;
24   -
25   -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
26   -import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
27   -
28   -// TODO @lilleo:这个模块,可以挪到 business 下;这样我打开 business 包下,就知道,噢~原来里面有 business 商机、有 type 状态类型、status 具体状态;
29   -@Tag(name = "管理后台 - 商机状态")
30   -@RestController
31   -@RequestMapping("/crm/business-status")
32   -@Validated
33   -public class CrmBusinessStatusController {
34   -
35   - @Resource
36   - private CrmBusinessStatusService businessStatusService;
37   -
38   - @PostMapping("/create")
39   - @Operation(summary = "创建商机状态")
40   - @PreAuthorize("@ss.hasPermission('crm:business-status:create')")
41   - public CommonResult<Long> createBusinessStatus(@Valid @RequestBody CrmBusinessStatusCreateReqVO createReqVO) {
42   - return success(businessStatusService.createBusinessStatus(createReqVO));
43   - }
44   -
45   - @PutMapping("/update")
46   - @Operation(summary = "更新商机状态")
47   - @PreAuthorize("@ss.hasPermission('crm:business-status:update')")
48   - public CommonResult<Boolean> updateBusinessStatus(@Valid @RequestBody CrmBusinessStatusUpdateReqVO updateReqVO) {
49   - businessStatusService.updateBusinessStatus(updateReqVO);
50   - return success(true);
51   - }
52   -
53   - @DeleteMapping("/delete")
54   - @Operation(summary = "删除商机状态")
55   - @Parameter(name = "id", description = "编号", required = true)
56   - @PreAuthorize("@ss.hasPermission('crm:business-status:delete')")
57   - public CommonResult<Boolean> deleteBusinessStatus(@RequestParam("id") Long id) {
58   - businessStatusService.deleteBusinessStatus(id);
59   - return success(true);
60   - }
61   -
62   - @GetMapping("/get")
63   - @Operation(summary = "获得商机状态")
64   - @Parameter(name = "id", description = "编号", required = true, example = "1024")
65   - @PreAuthorize("@ss.hasPermission('crm:business-status:query')")
66   - public CommonResult<CrmBusinessStatusRespVO> getBusinessStatus(@RequestParam("id") Long id) {
67   - CrmBusinessStatusDO businessStatus = businessStatusService.getBusinessStatus(id);
68   - return success(CrmBusinessStatusConvert.INSTANCE.convert(businessStatus));
69   - }
70   -
71   - // TODO @lilleo:这个接口,暂时用不到,可以考虑先删除掉
72   - @GetMapping("/list")
73   - @Operation(summary = "获得商机状态列表")
74   - @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
75   - @PreAuthorize("@ss.hasPermission('crm:business-status:query')")
76   - public CommonResult<List<CrmBusinessStatusRespVO>> getBusinessStatusList(@RequestParam("ids") Collection<Long> ids) {
77   - List<CrmBusinessStatusDO> list = businessStatusService.getBusinessStatusList(ids);
78   - return success(CrmBusinessStatusConvert.INSTANCE.convertList(list));
79   - }
80   -
81   - @GetMapping("/page")
82   - @Operation(summary = "获得商机状态分页")
83   - @PreAuthorize("@ss.hasPermission('crm:business-status:query')")
84   - public CommonResult<PageResult<CrmBusinessStatusRespVO>> getBusinessStatusPage(@Valid CrmBusinessStatusPageReqVO pageVO) {
85   - PageResult<CrmBusinessStatusDO> pageResult = businessStatusService.getBusinessStatusPage(pageVO);
86   - return success(CrmBusinessStatusConvert.INSTANCE.convertPage(pageResult));
87   - }
88   -
89   - @GetMapping("/export-excel")
90   - @Operation(summary = "导出商机状态 Excel")
91   - @PreAuthorize("@ss.hasPermission('crm:business-status:export')")
92   - @OperateLog(type = EXPORT)
93   - public void exportBusinessStatusExcel(@Valid CrmBusinessStatusExportReqVO exportReqVO,
94   - HttpServletResponse response) throws IOException {
95   - List<CrmBusinessStatusDO> list = businessStatusService.getBusinessStatusList(exportReqVO);
96   - // 导出 Excel
97   - List<CrmBusinessStatusExcelVO> datas = CrmBusinessStatusConvert.INSTANCE.convertList02(list);
98   - ExcelUtils.write(response, "商机状态.xls", "数据", CrmBusinessStatusExcelVO.class, datas);
99   - }
100   -
101   - // TODO 芋艿:后续再看看
102   - @GetMapping("/get-simple-list")
103   - @Operation(summary = "获得商机状态列表")
104   - @PreAuthorize("@ss.hasPermission('crm:business-status:query')")
105   - public CommonResult<List<CrmBusinessStatusRespVO>> getBusinessStatusListByTypeId(@RequestParam("typeId") Integer typeId) {
106   - List<CrmBusinessStatusDO> list = businessStatusService.getBusinessStatusListByTypeId(typeId);
107   - return success(CrmBusinessStatusConvert.INSTANCE.convertList(list));
108   - }
109   -
110   - // TODO 芋艿:后续再看看
111   - @GetMapping("/get-all-list")
112   - @Operation(summary = "获得商机状态列表")
113   - @PreAuthorize("@ss.hasPermission('crm:business-status:query')")
114   - public CommonResult<List<CrmBusinessStatusRespVO>> getBusinessStatusList() {
115   - List<CrmBusinessStatusDO> list = businessStatusService.getBusinessStatusList();
116   - return success(CrmBusinessStatusConvert.INSTANCE.convertList(list));
117   - }
118   -
119   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusCreateReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo;
2   -
3   -import lombok.*;
4   -import java.util.*;
5   -import io.swagger.v3.oas.annotations.media.Schema;
6   -import javax.validation.constraints.*;
7   -
8   -@Schema(description = "管理后台 - 商机状态创建 Request VO")
9   -@Data
10   -@EqualsAndHashCode(callSuper = true)
11   -@ToString(callSuper = true)
12   -public class CrmBusinessStatusCreateReqVO extends CrmBusinessStatusBaseVO {
13   -
14   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusExportReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -// TODO @lilleo:这个暂时不需要;嘿嘿~不是每个模块都需要导出哈
7   -@Schema(description = "管理后台 - 商机状态 Excel 导出 Request VO,参数和 CrmBusinessStatusPageReqVO 是一致的")
8   -@Data
9   -public class CrmBusinessStatusExportReqVO {
10   -
11   - @Schema(description = "状态类型编号", example = "22882")
12   - private Long typeId;
13   -
14   - @Schema(description = "状态名", example = "李四")
15   - private String name;
16   -
17   - @Schema(description = "赢单率")
18   - private String percent;
19   -
20   - @Schema(description = "排序")
21   - private Integer sort;
22   -
23   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusRespVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.*;
5   -
6   -@Schema(description = "管理后台 - 商机状态 Response VO")
7   -@Data
8   -@EqualsAndHashCode(callSuper = true)
9   -@ToString(callSuper = true)
10   -public class CrmBusinessStatusRespVO extends CrmBusinessStatusBaseVO {
11   -
12   - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6802")
13   - private Long id;
14   -
15   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatus/vo/CrmBusinessStatusUpdateReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7   -
8   -import javax.validation.constraints.NotNull;
9   -
10   -@Schema(description = "管理后台 - 商机状态更新 Request VO")
11   -@Data
12   -@EqualsAndHashCode(callSuper = true)
13   -@ToString(callSuper = true)
14   -public class CrmBusinessStatusUpdateReqVO extends CrmBusinessStatusBaseVO {
15   -
16   - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6802")
17   - @NotNull(message = "编号不能为空")
18   - private Long id;
19   -
20   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeBaseVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -import javax.validation.constraints.NotNull;
7   -
8   -/**
9   - * 商机状态类型 Base VO,提供给添加、修改、详细的子 VO 使用
10   - * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
11   - */
12   -@Data
13   -public class CrmBusinessStatusTypeBaseVO {
14   -
15   - @Schema(description = "状态类型名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
16   - @NotNull(message = "状态类型名不能为空")
17   - private String name;
18   -
19   - @Schema(description = "使用的部门编号", requiredMode = Schema.RequiredMode.REQUIRED)
20   - @NotNull(message = "使用的部门编号不能为空")
21   - private String deptIds;
22   -
23   - @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
24   - @NotNull(message = "开启状态不能为空")
25   - private Boolean status;
26   -
27   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeCreateReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7   -
8   -// TODO 状态类型和状态添加,是在一个请求里,所以需要把 CrmBusinessStatusCreateReqVO 融合进来;
9   -@Schema(description = "管理后台 - 商机状态类型创建 Request VO")
10   -@Data
11   -@EqualsAndHashCode(callSuper = true)
12   -@ToString(callSuper = true)
13   -public class CrmBusinessStatusTypeCreateReqVO extends CrmBusinessStatusTypeBaseVO {
14   -
15   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeExcelVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo;
2   -
3   -import com.alibaba.excel.annotation.ExcelProperty;
4   -import lombok.Data;
5   -
6   -import java.time.LocalDateTime;
7   -
8   -// TODO @lilleo:这个暂时不需要;嘿嘿~不是每个模块都需要导出哈
9   -/**
10   - * 商机状态类型 Excel VO
11   - *
12   - * @author ljlleo
13   - */
14   -@Data
15   -public class CrmBusinessStatusTypeExcelVO {
16   -
17   - @ExcelProperty("主键")
18   - private Long id;
19   -
20   - @ExcelProperty("状态类型名")
21   - private String name;
22   -
23   - @ExcelProperty("使用的部门编号")
24   - private String deptIds;
25   -
26   - @ExcelProperty("开启状态")
27   - private Boolean status;
28   -
29   - @ExcelProperty("创建时间")
30   - private LocalDateTime createTime;
31   -
32   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeExportReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -import org.springframework.format.annotation.DateTimeFormat;
6   -
7   -import java.time.LocalDateTime;
8   -
9   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
10   -
11   -// TODO @lilleo:这个暂时不需要;嘿嘿~不是每个模块都需要导出哈
12   -@Schema(description = "管理后台 - 商机状态类型 Excel 导出 Request VO,参数和 CrmBusinessStatusTypePageReqVO 是一致的")
13   -@Data
14   -public class CrmBusinessStatusTypeExportReqVO {
15   -
16   - @Schema(description = "状态类型名", example = "芋艿")
17   - private String name;
18   -
19   - @Schema(description = "使用的部门编号")
20   - private String deptIds;
21   -
22   - @Schema(description = "开启状态", example = "1")
23   - private Boolean status;
24   -
25   - @Schema(description = "创建时间")
26   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
27   - private LocalDateTime[] createTime;
28   -
29   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeRespVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.*;
5   -import java.time.LocalDateTime;
6   -
7   -@Schema(description = "管理后台 - 商机状态类型 Response VO")
8   -@Data
9   -@EqualsAndHashCode(callSuper = true)
10   -@ToString(callSuper = true)
11   -public class CrmBusinessStatusTypeRespVO extends CrmBusinessStatusTypeBaseVO {
12   -
13   - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "24019")
14   - private Long id;
15   -
16   - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
17   - private LocalDateTime createTime;
18   -
19   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/businessstatustype/vo/CrmBusinessStatusTypeUpdateReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7   -
8   -import javax.validation.constraints.NotNull;
9   -
10   -// TODO 状态类型和状态添加,是在一个请求里,所以需要把 CrmBusinessStatusUpdateReqVO 融合进来;
11   -@Schema(description = "管理后台 - 商机状态类型更新 Request VO")
12   -@Data
13   -@EqualsAndHashCode(callSuper = true)
14   -@ToString(callSuper = true)
15   -public class CrmBusinessStatusTypeUpdateReqVO extends CrmBusinessStatusTypeBaseVO {
16   -
17   - @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "24019")
18   - @NotNull(message = "主键不能为空")
19   - private Long id;
20   -
21   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/ContactController.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/CrmContactController.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.contact;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
4 5 import cn.hutool.core.util.NumberUtil;
5 6 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  7 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
6 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  9 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
7 10 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
8 11 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
9 12 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
10   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerExportReqVO;
11 13 import cn.iocoder.yudao.module.crm.convert.contact.ContactConvert;
12   -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
  14 +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
13 15 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
14   -import cn.iocoder.yudao.module.crm.service.contact.ContactService;
  16 +import cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants;
  17 +import cn.iocoder.yudao.module.crm.service.contact.CrmContactService;
15 18 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
16 19 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
17 20 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
... ... @@ -19,6 +22,7 @@ import com.google.common.collect.Lists;
19 22 import io.swagger.v3.oas.annotations.Operation;
20 23 import io.swagger.v3.oas.annotations.Parameter;
21 24 import io.swagger.v3.oas.annotations.tags.Tag;
  25 +import lombok.extern.slf4j.Slf4j;
22 26 import org.springframework.security.access.prepost.PreAuthorize;
23 27 import org.springframework.validation.annotation.Validated;
24 28 import org.springframework.web.bind.annotation.*;
... ... @@ -27,27 +31,29 @@ import javax.annotation.Resource;
27 31 import javax.servlet.http.HttpServletResponse;
28 32 import javax.validation.Valid;
29 33 import java.io.IOException;
  34 +import java.util.Collections;
30 35 import java.util.List;
31 36 import java.util.Map;
32   -import java.util.Optional;
33   -import java.util.stream.Collectors;
  37 +import java.util.stream.Stream;
34 38  
  39 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
35 40 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  41 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap;
  42 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
36 43 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
37 44 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
38 45  
39   -// TODO @zya:crm 所有的类,dou带 Crm 前缀,因为它的名字太通用了,可能和后续的 erp 之类的冲突
40 46 @Tag(name = "管理后台 - CRM 联系人")
41 47 @RestController
42 48 @RequestMapping("/crm/contact")
43 49 @Validated
44   -public class ContactController {
  50 +@Slf4j
  51 +public class CrmContactController {
45 52  
46 53 @Resource
47   - private ContactService contactService;
48   - // TODO @zyna:模块内,注入的变量,不用带 crm 前缀哈
  54 + private CrmContactService contactService;
49 55 @Resource
50   - private CrmCustomerService crmCustomerService;
  56 + private CrmCustomerService customerService;
51 57  
52 58 @Resource
53 59 private AdminUserApi adminUserApi;
... ... @@ -55,14 +61,14 @@ public class ContactController {
55 61 @PostMapping("/create")
56 62 @Operation(summary = "创建联系人")
57 63 @PreAuthorize("@ss.hasPermission('crm:contact:create')")
58   - public CommonResult<Long> createContact(@Valid @RequestBody ContactCreateReqVO createReqVO) {
  64 + public CommonResult<Long> createContact(@Valid @RequestBody CrmContactCreateReqVO createReqVO) {
59 65 return success(contactService.createContact(createReqVO, getLoginUserId()));
60 66 }
61 67  
62 68 @PutMapping("/update")
63 69 @Operation(summary = "更新联系人")
64 70 @PreAuthorize("@ss.hasPermission('crm:contact:update')")
65   - public CommonResult<Boolean> updateContact(@Valid @RequestBody ContactUpdateReqVO updateReqVO) {
  71 + public CommonResult<Boolean> updateContact(@Valid @RequestBody CrmContactUpdateReqVO updateReqVO) {
66 72 contactService.updateContact(updateReqVO);
67 73 return success(true);
68 74 }
... ... @@ -80,56 +86,78 @@ public class ContactController {
80 86 @Operation(summary = "获得联系人")
81 87 @Parameter(name = "id", description = "编号", required = true, example = "1024")
82 88 @PreAuthorize("@ss.hasPermission('crm:contact:query')")
83   - public CommonResult<ContactRespVO> getContact(@RequestParam("id") Long id) {
84   - ContactDO contact = contactService.getContact(id);
85   - // TODO @zyna:需要考虑 null 的情况;
86   - ContactRespVO contactRespVO = ContactConvert.INSTANCE.convert(contact);
87   - // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑
  89 + public CommonResult<CrmContactRespVO> getContact(@RequestParam("id") Long id) {
  90 + CrmContactDO contact = contactService.getContact(id);
  91 + if (contact == null) {
  92 + throw exception(ErrorCodeConstants.CONTACT_NOT_EXISTS);
  93 + }
  94 + // 1. 获取用户名
88 95 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(CollUtil.removeNull(Lists.newArrayList(
89   - NumberUtil.parseLong(contact.getCreator()))));
90   - contactRespVO.setCreatorName(Optional.ofNullable(userMap.get(NumberUtil.parseLong(contact.getCreator()))).map(AdminUserRespDTO::getNickname).orElse(null));
91   - contactRespVO.setCustomerName(Optional.ofNullable(crmCustomerService.getCustomer(contact.getCustomerId())).map(CrmCustomerDO::getName).orElse(null));
92   - return success(contactRespVO);
  96 + NumberUtil.parseLong(contact.getCreator()), contact.getOwnerUserId())));
  97 + // 2. 获取客户信息
  98 + List<CrmCustomerDO> customerList = customerService.getCustomerList(Collections.singletonList(contact.getCustomerId()));
  99 + // 3. 直属上级
  100 + List<CrmContactDO> parentContactList = contactService.getContactList(Collections.singletonList(contact.getParentId()));
  101 + return success(ContactConvert.INSTANCE.convert(contact, userMap, customerList, parentContactList));
93 102 }
94 103  
95   - // TODO @zyna:url 使用中划线噢;然后,单词的拼写也要注意呀,AllList 是不是更好呀;
96   - @GetMapping("/simpleAlllist")
  104 + @GetMapping("/simple-all-list")
97 105 @Operation(summary = "获得联系人列表")
98 106 @PreAuthorize("@ss.hasPermission('crm:contact:query')")
99   - public CommonResult<List<ContactSimpleRespVO>> simpleAlllist() {
100   - // TODO @zyna:方法名改成,getContactList;方法命名,要动名词,get 动词;all 可以去掉,因为没条件,自然是全部
101   - List<ContactDO> list = contactService.allContactList();
  107 + public CommonResult<List<CrmContactSimpleRespVO>> getSimpleContactList() {
  108 + List<CrmContactDO> list = contactService.getContactList();
102 109 return success(ContactConvert.INSTANCE.convertAllList(list));
103 110 }
104 111  
105 112 @GetMapping("/page")
106 113 @Operation(summary = "获得联系人分页")
107 114 @PreAuthorize("@ss.hasPermission('crm:contact:query')")
108   - public CommonResult<PageResult<ContactRespVO>> getContactPage(@Valid ContactPageReqVO pageVO) {
109   - PageResult<ContactDO> pageData = contactService.getContactPage(pageVO);
110   - PageResult<ContactRespVO> pageResult =ContactConvert.INSTANCE.convertPage(pageData);
111   - // TODO @zyna:需要考虑 null 的情况;
112   - // TODO @zyna:可以把数据读完后,convert 统一交给 ContactConvert,让 controller 更简洁;而 convert 专门去做一些转换逻辑
113   - //待接口实现后修改
114   - List<CrmCustomerDO> crmCustomerDOList = crmCustomerService.getCustomerList(new CrmCustomerExportReqVO());
115   - Map<Long,CrmCustomerDO> crmCustomerDOMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId,v->v));
116   - pageResult.getList().forEach(item -> {
117   - item.setCustomerName(Optional.ofNullable(crmCustomerDOMap.get(item.getCustomerId())).map(CrmCustomerDO::getName).orElse(null));
118   - });
119   - return success(pageResult);
  115 + public CommonResult<PageResult<CrmContactRespVO>> getContactPage(@Valid CrmContactPageReqVO pageVO) {
  116 + PageResult<CrmContactDO> pageResult = contactService.getContactPage(pageVO);
  117 + return success(convertDetailContactPage(pageResult));
  118 + }
  119 +
  120 + @GetMapping("/page-by-customer")
  121 + @Operation(summary = "获得联系人分页,基于指定客户")
  122 + public CommonResult<PageResult<CrmContactRespVO>> getContactPageByCustomer(@Valid CrmContactPageReqVO pageVO) {
  123 + Assert.notNull(pageVO.getCustomerId(), "客户编号不能为空");
  124 + PageResult<CrmContactDO> pageResult = contactService.getContactPageByCustomer(pageVO);
  125 + return success(convertDetailContactPage(pageResult));
120 126 }
121 127  
122   - // TODO @zyna:可以看下新的导出写法,这里调整下
123 128 @GetMapping("/export-excel")
124 129 @Operation(summary = "导出联系人 Excel")
125 130 @PreAuthorize("@ss.hasPermission('crm:contact:export')")
126 131 @OperateLog(type = EXPORT)
127   - public void exportContactExcel(@Valid ContactExportReqVO exportReqVO,
128   - HttpServletResponse response) throws IOException {
129   - List<ContactDO> list = contactService.getContactList(exportReqVO);
130   - // 导出 Excel
131   - List<ContactExcelVO> datas = ContactConvert.INSTANCE.convertList02(list);
132   - ExcelUtils.write(response, "crm联系人.xls", "数据", ContactExcelVO.class, datas);
  132 + public void exportContactExcel(@Valid CrmContactPageReqVO exportReqVO,
  133 + HttpServletResponse response) throws IOException {
  134 + exportReqVO.setPageNo(PageParam.PAGE_SIZE_NONE);
  135 + PageResult<CrmContactDO> pageResult = contactService.getContactPage(exportReqVO);
  136 + ExcelUtils.write(response, "联系人.xls", "数据", CrmContactRespVO.class,
  137 + convertDetailContactPage(pageResult).getList());
  138 + }
  139 +
  140 + /**
  141 + * 转换成详细的联系人分页,即读取关联信息
  142 + *
  143 + * @param pageResult 联系人分页
  144 + * @return 详细的联系人分页
  145 + */
  146 + private PageResult<CrmContactRespVO> convertDetailContactPage(PageResult<CrmContactDO> pageResult) {
  147 + List<CrmContactDO> contactList = pageResult.getList();
  148 + if (CollUtil.isEmpty(contactList)) {
  149 + return PageResult.empty(pageResult.getTotal());
  150 + }
  151 + // 1. 获取客户列表
  152 + List<CrmCustomerDO> crmCustomerDOList = customerService.getCustomerList(
  153 + convertSet(contactList, CrmContactDO::getCustomerId));
  154 + // 2. 获取创建人、负责人列表
  155 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(contactList,
  156 + contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId())));
  157 + // 3. 直属上级
  158 + List<CrmContactDO> parentContactList = contactService.getContactList(
  159 + convertSet(contactList, CrmContactDO::getParentId));
  160 + return ContactConvert.INSTANCE.convertPage(pageResult, userMap, crmCustomerDOList, parentContactList);
133 161 }
134 162  
135 163 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExcelVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2   -
3   -import com.alibaba.excel.annotation.ExcelProperty;
4   -import lombok.Data;
5   -
6   -import java.time.LocalDateTime;
7   -
8   -// TODO @zyna:参考新的 VO 结构,把 ContactExcelVO 融合到 ContactRespVO 中
9   -/**
10   - * crm联系人 Excel VO
11   - *
12   - * @author 芋道源码
13   - */
14   -@Data
15   -@Deprecated
16   -public class ContactExcelVO {
17   -
18   - @ExcelProperty("下次联系时间")
19   - private LocalDateTime nextTime;
20   -
21   - @ExcelProperty("手机号")
22   - private String mobile;
23   -
24   - @ExcelProperty("电话")
25   - private String telephone;
26   -
27   - @ExcelProperty("电子邮箱")
28   - private String email;
29   -
30   - @ExcelProperty("客户编号")
31   - private Long customerId;
32   -
33   - @ExcelProperty("地址")
34   - private String address;
35   -
36   - @ExcelProperty("备注")
37   - private String remark;
38   -
39   - @ExcelProperty("创建时间")
40   - private LocalDateTime createTime;
41   -
42   - @ExcelProperty("最后跟进时间")
43   - private LocalDateTime lastTime;
44   -
45   - @ExcelProperty("主键")
46   - private Long id;
47   -
48   - @ExcelProperty("直属上级")
49   - private Long parentId;
50   -
51   - @ExcelProperty("姓名")
52   - private String name;
53   -
54   - @ExcelProperty("职位")
55   - private String post;
56   -
57   - @ExcelProperty("QQ")
58   - private Long qq;
59   -
60   - @ExcelProperty("微信")
61   - private String webchat;
62   -
63   - @ExcelProperty("性别")
64   - private Integer sex;
65   -
66   - @ExcelProperty("是否关键决策人")
67   - private Boolean policyMakers;
68   -
69   - @ExcelProperty("负责人用户编号")
70   - private String ownerUserId;
71   -
72   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactExportReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -import org.springframework.format.annotation.DateTimeFormat;
6   -
7   -import java.time.LocalDateTime;
8   -
9   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
10   -
11   -// TODO @zyna:参考新的 VO 结构,使用 ContactPageReqVO 查询导出的数据
12   -@Schema(description = "管理后台 - crm联系人 Excel 导出 Request VO,参数和 ContactPageReqVO 是一致的")
13   -@Data
14   -@Deprecated
15   -public class ContactExportReqVO {
16   -
17   - @Schema(description = "下次联系时间")
18   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
19   - private LocalDateTime[] nextTime;
20   -
21   - @Schema(description = "手机号")
22   - private String mobile;
23   -
24   - @Schema(description = "电话")
25   - private String telephone;
26   -
27   - @Schema(description = "电子邮箱")
28   - private String email;
29   -
30   - @Schema(description = "客户编号", example = "10795")
31   - private Long customerId;
32   -
33   - @Schema(description = "地址")
34   - private String address;
35   -
36   - @Schema(description = "备注", example = "你说的对")
37   - private String remark;
38   -
39   - @Schema(description = "创建时间")
40   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
41   - private LocalDateTime[] createTime;
42   -
43   - @Schema(description = "最后跟进时间")
44   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
45   - private LocalDateTime[] lastTime;
46   -
47   - @Schema(description = "直属上级", example = "23457")
48   - private Long parentId;
49   -
50   - @Schema(description = "姓名", example = "芋艿")
51   - private String name;
52   -
53   - @Schema(description = "职位")
54   - private String post;
55   -
56   - @Schema(description = "QQ")
57   - private Long qq;
58   -
59   - @Schema(description = "微信")
60   - private String webchat;
61   -
62   - @Schema(description = "性别")
63   - private Integer sex;
64   -
65   - @Schema(description = "是否关键决策人")
66   - private Boolean policyMakers;
67   -
68   - @Schema(description = "负责人用户编号", example = "14334")
69   - private String ownerUserId;
70   -
71   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactPageReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2   -
3   -import cn.iocoder.yudao.framework.common.pojo.PageParam;
4   -import io.swagger.v3.oas.annotations.media.Schema;
5   -import lombok.Data;
6   -import lombok.EqualsAndHashCode;
7   -import lombok.ToString;
8   -import org.springframework.format.annotation.DateTimeFormat;
9   -
10   -import java.time.LocalDateTime;
11   -
12   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13   -
14   -@Schema(description = "管理后台 - crm联系人分页 Request VO")
15   -@Data
16   -@EqualsAndHashCode(callSuper = true)
17   -@ToString(callSuper = true)
18   -public class ContactPageReqVO extends PageParam {
19   -
20   - // TODO @zyna:筛选条件
21   - // ●客户:
22   - // ●姓名:
23   - // ●手机、电话、座机、QQ、微信、邮箱
24   -
25   - @Schema(description = "下次联系时间")
26   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
27   - private LocalDateTime[] nextTime;
28   -
29   - @Schema(description = "手机号")
30   - private String mobile;
31   -
32   - @Schema(description = "电话")
33   - private String telephone;
34   -
35   - @Schema(description = "电子邮箱")
36   - private String email;
37   -
38   - @Schema(description = "客户编号", example = "10795")
39   - private Long customerId;
40   -
41   - @Schema(description = "地址")
42   - private String address;
43   -
44   - @Schema(description = "备注", example = "你说的对")
45   - private String remark;
46   -
47   - @Schema(description = "创建时间")
48   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
49   - private LocalDateTime[] createTime;
50   -
51   - @Schema(description = "最后跟进时间")
52   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
53   - private LocalDateTime[] lastTime;
54   -
55   - @Schema(description = "直属上级", example = "23457")
56   - private Long parentId;
57   -
58   - @Schema(description = "姓名", example = "芋艿")
59   - private String name;
60   -
61   - @Schema(description = "职位")
62   - private String post;
63   -
64   - @Schema(description = "QQ")
65   - private Long qq;
66   -
67   - @Schema(description = "微信")
68   - private String webchat;
69   -
70   - @Schema(description = "性别")
71   - private Integer sex;
72   -
73   - @Schema(description = "是否关键决策人")
74   - private Boolean policyMakers;
75   -
76   - @Schema(description = "负责人用户编号", example = "14334")
77   - private String ownerUserId;
78   -
79   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactBaseVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactBaseVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2  
  3 +import cn.iocoder.yudao.framework.common.validation.Mobile;
  4 +import cn.iocoder.yudao.framework.common.validation.Telephone;
  5 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  6 +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  7 +import cn.iocoder.yudao.module.infra.enums.DictTypeConstants;
  8 +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  9 +import com.alibaba.excel.annotation.ExcelProperty;
3 10 import io.swagger.v3.oas.annotations.media.Schema;
4 11 import lombok.Data;
5 12 import org.springframework.format.annotation.DateTimeFormat;
6 13  
  14 +import javax.validation.constraints.Email;
  15 +import javax.validation.constraints.NotNull;
7 16 import java.time.LocalDateTime;
8 17  
9 18 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
10 19 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
11 20  
12   -// TODO zyna:参考新的 vo,重新拆分下 VO
  21 +// TODO zyna:要不按照新的,干掉这个 basevo,都放子类里
13 22 /**
14 23 * CRM 联系人 Base VO,提供给添加、修改、详细的子 VO 使用
15 24 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
16 25 */
17 26 @Data
18   -public class ContactBaseVO {
  27 +@ExcelIgnoreUnannotated
  28 +public class CrmContactBaseVO {
19 29  
20   - // TODO @zyna:example 最好都写下
21   - // TODO @zyna:必要的字段校验,例如说 @Mobile,@Emal 等等
  30 + @ExcelProperty(value = "姓名",order = 1)
  31 + @Schema(description = "姓名", example = "芋艿")
  32 + @NotNull(message = "姓名不能为空")
  33 + private String name;
22 34  
23   - @Schema(description = "下次联系时间")
24   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
25   - private LocalDateTime nextTime;
  35 + @Schema(description = "客户编号", example = "10795")
  36 + private Long customerId;
  37 +
  38 + @ExcelProperty(value = "性别", converter = DictConvert.class, order = 3)
  39 + @DictFormat(cn.iocoder.yudao.module.system.enums.DictTypeConstants.USER_SEX)
  40 + @Schema(description = "性别")
  41 + private Integer sex;
26 42  
27   - @Schema(description = "手机号")
  43 + @Schema(description = "职位")
  44 + @ExcelProperty(value = "职位", order = 3)
  45 + private String post;
  46 +
  47 + @Schema(description = "是否关键决策人")
  48 + @ExcelProperty(value = "是否关键决策人", converter = DictConvert.class, order = 3)
  49 + @DictFormat(DictTypeConstants.BOOLEAN_STRING)
  50 + private Boolean master;
  51 +
  52 + @Schema(description = "直属上级", example = "23457")
  53 + private Long parentId;
  54 +
  55 + @Schema(description = "手机号",example = "1387171766")
  56 + @Mobile
  57 + @ExcelProperty(value = "手机号",order = 4)
28 58 private String mobile;
29 59  
30   - @Schema(description = "电话")
  60 + @Schema(description = "座机",example = "021-0029922")
  61 + @Telephone
  62 + @ExcelProperty(value = "座机",order = 4)
31 63 private String telephone;
32 64  
33   - @Schema(description = "电子邮箱")
34   - private String email;
  65 + @ExcelProperty(value = "QQ",order = 4)
  66 + @Schema(description = "QQ",example = "197272662")
  67 + private Long qq;
35 68  
36   - @Schema(description = "客户编号", example = "10795")
37   - private Long customerId;
  69 + @ExcelProperty(value = "微信",order = 4)
  70 + @Schema(description = "微信",example = "zzz3883")
  71 + private String wechat;
  72 +
  73 + @Schema(description = "电子邮箱",example = "1111@22.com")
  74 + @Email
  75 + @ExcelProperty(value = "邮箱",order = 4)
  76 + private String email;
38 77  
  78 + @ExcelProperty(value = "地址",order = 5)
39 79 @Schema(description = "地址")
40 80 private String address;
41 81  
  82 + @Schema(description = "下次联系时间")
  83 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
  84 + @ExcelProperty(value = "下次联系时间",order = 6)
  85 + private LocalDateTime nextTime;
  86 +
42 87 @Schema(description = "备注", example = "你说的对")
  88 + @ExcelProperty(value = "备注",order = 6)
43 89 private String remark;
44 90  
45 91 @Schema(description = "最后跟进时间")
46 92 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  93 + @ExcelProperty(value = "最后跟进时间",order = 6)
47 94 private LocalDateTime lastTime;
48 95  
49   - @Schema(description = "直属上级", example = "23457")
50   - private Long parentId;
51   -
52   - @Schema(description = "姓名", example = "芋艿")
53   - private String name;
54   -
55   - @Schema(description = "职位")
56   - private String post;
57   -
58   - @Schema(description = "QQ")
59   - private Long qq;
60   -
61   - @Schema(description = "微信")
62   - private String webchat;
63   -
64   - @Schema(description = "性别")
65   - private Integer sex;
66   -
67   - @Schema(description = "是否关键决策人")
68   - private Boolean policyMakers;
69   -
70 96 @Schema(description = "负责人用户编号", example = "14334")
71   - private String ownerUserId;
  97 + @NotNull(message = "负责人不能为空")
  98 + private Long ownerUserId;
  99 +
  100 + @Schema(description = "地区编号", example = "20158")
  101 + private Integer areaId;
72 102  
73 103 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactCreateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactCreateReqVO.java
... ... @@ -9,6 +9,6 @@ import lombok.ToString;
9 9 @Data
10 10 @EqualsAndHashCode(callSuper = true)
11 11 @ToString(callSuper = true)
12   -public class ContactCreateReqVO extends ContactBaseVO {
  12 +public class CrmContactCreateReqVO extends CrmContactBaseVO {
13 13  
14 14 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +@Schema(description = "管理后台 - CRM 联系人分页 Request VO")
  10 +@Data
  11 +@EqualsAndHashCode(callSuper = true)
  12 +@ToString(callSuper = true)
  13 +public class CrmContactPageReqVO extends PageParam {
  14 +
  15 + @Schema(description = "姓名", example = "芋艿")
  16 + private String name;
  17 +
  18 + @Schema(description = "客户编号", example = "10795")
  19 + private Long customerId;
  20 +
  21 + @Schema(description = "手机号", example = "13898273941")
  22 + private String mobile;
  23 +
  24 + @Schema(description = "电话", example = "021-383773")
  25 + private String telephone;
  26 +
  27 + @Schema(description = "电子邮箱", example = "111@22.com")
  28 + private String email;
  29 +
  30 + @Schema(description = "QQ", example = "3882872")
  31 + private Long qq;
  32 +
  33 + @Schema(description = "微信", example = "zzZ98373")
  34 + private String wechat;
  35 +
  36 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactRespVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactRespVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2  
  3 +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
  4 +import com.alibaba.excel.annotation.ExcelProperty;
3 5 import io.swagger.v3.oas.annotations.media.Schema;
4 6 import lombok.*;
5 7 import java.time.LocalDateTime;
... ... @@ -8,20 +10,41 @@ import java.time.LocalDateTime;
8 10 @Data
9 11 @EqualsAndHashCode(callSuper = true)
10 12 @ToString(callSuper = true)
11   -public class ContactRespVO extends ContactBaseVO {
  13 +@ExcelIgnoreUnannotated
  14 +public class CrmContactRespVO extends CrmContactBaseVO {
12 15  
13 16 @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167")
14 17 private Long id;
15 18  
16 19 @Schema(description = "创建时间")
  20 + @ExcelProperty(value = "创建时间", order = 8)
17 21 private LocalDateTime createTime;
18 22  
19   - // TODO @zyna:example 最好写下;
  23 + @Schema(description = "更新时间")
  24 + @ExcelProperty(value = "更新时间", order = 8)
  25 + private LocalDateTime updateTime;
20 26  
21   - @Schema(description = "创建人")
  27 + @Schema(description = "创建人", example = "25682")
  28 + private String creator;
  29 +
  30 + @Schema(description = "创建人名字", example = "test")
  31 + @ExcelProperty(value = "创建人", order = 8)
22 32 private String creatorName;
23 33  
24   - @Schema(description = "客户名字")
  34 + @ExcelProperty(value = "客户名称",order = 2)
  35 + @Schema(description = "客户名字", example = "test")
25 36 private String customerName;
26 37  
  38 + @Schema(description = "负责人", example = "test")
  39 + @ExcelProperty(value = "负责人", order = 7)
  40 + private String ownerUserName;
  41 +
  42 + @Schema(description = "直属上级名", example = "芋头")
  43 + @ExcelProperty(value = "直属上级", order = 4)
  44 + private String parentName;
  45 +
  46 + @Schema(description = "地区名", example = "上海上海市浦东新区")
  47 + @ExcelProperty(value = "地区", order = 5)
  48 + private String areaName;
  49 +
27 50 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactSimpleRespVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactSimpleRespVO.java
... ... @@ -4,14 +4,15 @@ import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
5 5 import lombok.ToString;
6 6  
7   -@Schema(description = "管理后台 - CRM 联系人 Response VO")
  7 +@Schema(description = "管理后台 - CRM 联系人的精简 Response VO")
8 8 @Data
9 9 @ToString(callSuper = true)
10   -public class ContactSimpleRespVO {
11   - @Schema(description = "姓名", example = "芋艿") // TODO @zyna:requiredMode = Schema.RequiredMode.REQUIRED;需要空一行;字段的顺序改下,id 在 name 前面,会更干净
12   - private String name;
  10 +public class CrmContactSimpleRespVO {
13 11  
14 12 @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167")
15 13 private Long id;
16 14  
  15 + @Schema(description = "姓名", example = "芋艿")
  16 + private String name;
  17 +
17 18 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactTransferReqVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.contact.vo;
2 2  
3   -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
  3 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/ContactUpdateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contact/vo/CrmContactUpdateReqVO.java
... ... @@ -11,7 +11,7 @@ import javax.validation.constraints.NotNull;
11 11 @Data
12 12 @EqualsAndHashCode(callSuper = true)
13 13 @ToString(callSuper = true)
14   -public class ContactUpdateReqVO extends ContactBaseVO {
  14 +public class CrmContactUpdateReqVO extends CrmContactBaseVO {
15 15  
16 16 @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "3167")
17 17 @NotNull(message = "主键不能为空")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/ContractController.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/CrmContractController.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.contract;
2 2  
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.lang.Assert;
3 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  7 +import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
5 8 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
6 9 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
7 10 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*;
8 11 import cn.iocoder.yudao.module.crm.convert.contract.ContractConvert;
9   -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO;
10   -import cn.iocoder.yudao.module.crm.service.contract.ContractService;
  12 +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
  13 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
  14 +import cn.iocoder.yudao.module.crm.service.contract.CrmContractService;
  15 +import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
  16 +import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
  17 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
11 18 import io.swagger.v3.oas.annotations.Operation;
12 19 import io.swagger.v3.oas.annotations.Parameter;
13 20 import io.swagger.v3.oas.annotations.tags.Tag;
... ... @@ -20,8 +27,12 @@ import javax.servlet.http.HttpServletResponse;
20 27 import javax.validation.Valid;
21 28 import java.io.IOException;
22 29 import java.util.List;
  30 +import java.util.Map;
  31 +import java.util.stream.Stream;
23 32  
24 33 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  34 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertListByFlatMap;
  35 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
25 36 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
26 37 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
27 38  
... ... @@ -29,22 +40,27 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
29 40 @RestController
30 41 @RequestMapping("/crm/contract")
31 42 @Validated
32   -public class ContractController {
  43 +public class CrmContractController {
33 44  
34 45 @Resource
35   - private ContractService contractService;
  46 + private CrmContractService contractService;
  47 + @Resource
  48 + private CrmCustomerService customerService;
  49 +
  50 + @Resource
  51 + private AdminUserApi adminUserApi;
36 52  
37 53 @PostMapping("/create")
38 54 @Operation(summary = "创建合同")
39 55 @PreAuthorize("@ss.hasPermission('crm:contract:create')")
40   - public CommonResult<Long> createContract(@Valid @RequestBody ContractCreateReqVO createReqVO) {
  56 + public CommonResult<Long> createContract(@Valid @RequestBody CrmContractCreateReqVO createReqVO) {
41 57 return success(contractService.createContract(createReqVO, getLoginUserId()));
42 58 }
43 59  
44 60 @PutMapping("/update")
45 61 @Operation(summary = "更新合同")
46 62 @PreAuthorize("@ss.hasPermission('crm:contract:update')")
47   - public CommonResult<Boolean> updateContract(@Valid @RequestBody ContractUpdateReqVO updateReqVO) {
  63 + public CommonResult<Boolean> updateContract(@Valid @RequestBody CrmContractUpdateReqVO updateReqVO) {
48 64 contractService.updateContract(updateReqVO);
49 65 return success(true);
50 66 }
... ... @@ -63,28 +79,56 @@ public class ContractController {
63 79 @Parameter(name = "id", description = "编号", required = true, example = "1024")
64 80 @PreAuthorize("@ss.hasPermission('crm:contract:query')")
65 81 public CommonResult<ContractRespVO> getContract(@RequestParam("id") Long id) {
66   - ContractDO contract = contractService.getContract(id);
  82 + CrmContractDO contract = contractService.getContract(id);
67 83 return success(ContractConvert.INSTANCE.convert(contract));
68 84 }
69 85  
70 86 @GetMapping("/page")
71 87 @Operation(summary = "获得合同分页")
72 88 @PreAuthorize("@ss.hasPermission('crm:contract:query')")
73   - public CommonResult<PageResult<ContractRespVO>> getContractPage(@Valid ContractPageReqVO pageVO) {
74   - PageResult<ContractDO> pageResult = contractService.getContractPage(pageVO);
75   - return success(ContractConvert.INSTANCE.convertPage(pageResult));
  89 + public CommonResult<PageResult<ContractRespVO>> getContractPage(@Valid CrmContractPageReqVO pageVO) {
  90 + PageResult<CrmContractDO> pageResult = contractService.getContractPage(pageVO);
  91 + return success(convertDetailContractPage(pageResult));
  92 + }
  93 +
  94 + @GetMapping("/page-by-customer")
  95 + @Operation(summary = "获得联系人分页,基于指定客户")
  96 + public CommonResult<PageResult<ContractRespVO>> getContractPageByCustomer(@Valid CrmContractPageReqVO pageVO) {
  97 + Assert.notNull(pageVO.getCustomerId(), "客户编号不能为空");
  98 + PageResult<CrmContractDO> pageResult = contractService.getContractPageByCustomer(pageVO);
  99 + return success(convertDetailContractPage(pageResult));
76 100 }
77 101  
78 102 @GetMapping("/export-excel")
79 103 @Operation(summary = "导出合同 Excel")
80 104 @PreAuthorize("@ss.hasPermission('crm:contract:export')")
81 105 @OperateLog(type = EXPORT)
82   - public void exportContractExcel(@Valid ContractExportReqVO exportReqVO,
  106 + public void exportContractExcel(@Valid CrmContractPageReqVO exportReqVO,
83 107 HttpServletResponse response) throws IOException {
84   - List<ContractDO> list = contractService.getContractList(exportReqVO);
  108 + PageResult<CrmContractDO> pageResult = contractService.getContractPage(exportReqVO);
85 109 // 导出 Excel
86   - List<ContractExcelVO> datas = ContractConvert.INSTANCE.convertList02(list);
87   - ExcelUtils.write(response, "合同.xls", "数据", ContractExcelVO.class, datas);
  110 + ExcelUtils.write(response, "合同.xls", "数据", CrmContractExcelVO.class,
  111 + ContractConvert.INSTANCE.convertList02(pageResult.getList()));
  112 + }
  113 +
  114 + /**
  115 + * 转换成详细的联系人分页,即读取关联信息
  116 + *
  117 + * @param pageResult 联系人分页
  118 + * @return 详细的联系人分页
  119 + */
  120 + private PageResult<ContractRespVO> convertDetailContractPage(PageResult<CrmContractDO> pageResult) {
  121 + List<CrmContractDO> contactList = pageResult.getList();
  122 + if (CollUtil.isEmpty(contactList)) {
  123 + return PageResult.empty(pageResult.getTotal());
  124 + }
  125 + // 1. 获取客户列表
  126 + List<CrmCustomerDO> customerList = customerService.getCustomerList(
  127 + convertSet(contactList, CrmContractDO::getCustomerId));
  128 + // 2. 获取创建人、负责人列表
  129 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(contactList,
  130 + contact -> Stream.of(NumberUtils.parseLong(contact.getCreator()), contact.getOwnerUserId())));
  131 + return ContractConvert.INSTANCE.convertPage(pageResult, userMap, customerList);
88 132 }
89 133  
90 134 @PutMapping("/transfer")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractExportReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.contract.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -import org.springframework.format.annotation.DateTimeFormat;
6   -
7   -import java.time.LocalDateTime;
8   -
9   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
10   -
11   -@Schema(description = "管理后台 - CRM 合同 Excel 导出 Request VO,参数和 ContractPageReqVO 是一致的")
12   -@Data
13   -public class ContractExportReqVO {
14   -
15   - @Schema(description = "合同名称", example = "王五")
16   - private String name;
17   -
18   - @Schema(description = "客户编号", example = "18336")
19   - private Long customerId;
20   -
21   - @Schema(description = "商机编号", example = "10864")
22   - private Long businessId;
23   -
24   - @Schema(description = "下单日期")
25   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
26   - private LocalDateTime[] orderDate;
27   -
28   - @Schema(description = "合同编号")
29   - private String no;
30   -
31   - @Schema(description = "整单折扣")
32   - private Integer discountPercent;
33   -
34   - @Schema(description = "产品总金额", example = "19510")
35   - private Integer productPrice;
36   -
37   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractRespVO.java
... ... @@ -11,7 +11,7 @@ import java.time.LocalDateTime;
11 11 @Data
12 12 @EqualsAndHashCode(callSuper = true)
13 13 @ToString(callSuper = true)
14   -public class ContractRespVO extends ContractBaseVO {
  14 +public class ContractRespVO extends CrmContractBaseVO {
15 15  
16 16 @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
17 17 private Long id;
... ... @@ -19,4 +19,19 @@ public class ContractRespVO extends ContractBaseVO {
19 19 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
20 20 private LocalDateTime createTime;
21 21  
  22 + @Schema(description = "创建人", example = "25682")
  23 + private String creator;
  24 +
  25 + @Schema(description = "创建人名字", example = "test")
  26 + private String creatorName;
  27 +
  28 + @Schema(description = "客户名字", example = "test")
  29 + private String customerName;
  30 +
  31 + @Schema(description = "负责人", example = "test")
  32 + private String ownerUserName;
  33 +
  34 + @Schema(description = "审批状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  35 + private Integer auditStatus;
  36 +
22 37 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractBaseVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractBaseVO.java
... ... @@ -9,13 +9,12 @@ import java.time.LocalDateTime;
9 9  
10 10 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
11 11  
12   -// TODO @dhb52:所有类,带下 Crm 前缀,避免和别的模块重复
13 12 /**
14 13 * 合同 Base VO,提供给添加、修改、详细的子 VO 使用
15 14 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
16 15 */
17 16 @Data
18   -public class ContractBaseVO {
  17 +public class CrmContractBaseVO {
19 18  
20 19 // TODO @dhb52:类似 no 字段的 example 要写xia 哈;
21 20  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractCreateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractCreateReqVO.java
... ... @@ -9,6 +9,6 @@ import lombok.ToString;
9 9 @Data
10 10 @EqualsAndHashCode(callSuper = true)
11 11 @ToString(callSuper = true)
12   -public class ContractCreateReqVO extends ContractBaseVO {
  12 +public class CrmContractCreateReqVO extends CrmContractBaseVO {
13 13  
14 14 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractExcelVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractExcelVO.java
... ... @@ -11,7 +11,7 @@ import java.time.LocalDateTime;
11 11 * @author dhb52
12 12 */
13 13 @Data
14   -public class ContractExcelVO {
  14 +public class CrmContractExcelVO {
15 15  
16 16 @ExcelProperty("合同编号")
17 17 private Long id;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractPageReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractPageReqVO.java
... ... @@ -5,17 +5,15 @@ import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6 import lombok.EqualsAndHashCode;
7 7 import lombok.ToString;
8   -import org.springframework.format.annotation.DateTimeFormat;
9   -
10   -import java.time.LocalDateTime;
11   -
12   -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13 8  
14 9 @Schema(description = "管理后台 - CRM 合同分页 Request VO")
15 10 @Data
16 11 @EqualsAndHashCode(callSuper = true)
17 12 @ToString(callSuper = true)
18   -public class ContractPageReqVO extends PageParam {
  13 +public class CrmContractPageReqVO extends PageParam {
  14 +
  15 + @Schema(description = "合同编号", example = "XYZ008")
  16 + private String no;
19 17  
20 18 @Schema(description = "合同名称", example = "王五")
21 19 private String name;
... ... @@ -26,17 +24,4 @@ public class ContractPageReqVO extends PageParam {
26 24 @Schema(description = "商机编号", example = "10864")
27 25 private Long businessId;
28 26  
29   - @Schema(description = "下单日期")
30   - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
31   - private LocalDateTime[] orderDate;
32   -
33   - @Schema(description = "合同编号")
34   - private String no;
35   -
36   - @Schema(description = "整单折扣")
37   - private Integer discountPercent;
38   -
39   - @Schema(description = "产品总金额", example = "19510")
40   - private Integer productPrice;
41   -
42 27 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractTransferReqVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.contract.vo;
2 2  
3   -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
4 5 import io.swagger.v3.oas.annotations.media.Schema;
5 6 import lombok.Data;
6 7  
... ... @@ -14,19 +15,12 @@ public class CrmContractTransferReqVO {
14 15 @NotNull(message = "联系人编号不能为空")
15 16 private Long id;
16 17  
17   - /**
18   - * 新负责人的用户编号
19   - */
20 18 @Schema(description = "新负责人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
21 19 @NotNull(message = "新负责人的用户编号不能为空")
22 20 private Long newOwnerUserId;
23 21  
24   - /**
25   - * 老负责人加入团队后的权限级别。如果 null 说明移除
26   - *
27   - * 关联 {@link CrmPermissionLevelEnum}
28   - */
29 22 @Schema(description = "老负责人加入团队后的权限级别", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
  23 + @InEnum(value = CrmPermissionLevelEnum.class)
30 24 private Integer oldOwnerPermissionLevel;
31 25  
32 26 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/ContractUpdateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/contract/vo/CrmContractUpdateReqVO.java
... ... @@ -11,7 +11,7 @@ import javax.validation.constraints.NotNull;
11 11 @Data
12 12 @EqualsAndHashCode(callSuper = true)
13 13 @ToString(callSuper = true)
14   -public class ContractUpdateReqVO extends ContractBaseVO {
  14 +public class CrmContractUpdateReqVO extends CrmContractBaseVO {
15 15  
16 16 @Schema(description = "合同编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10430")
17 17 @NotNull(message = "合同编号不能为空")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.http 0 → 100644
  1 +### 请求 /update
  2 +GET {{baseUrl}}/crm/customer/page?pageNo=1&pageSize=10&name="张三"
  3 +Authorization: Bearer {{token}}
  4 +tenant-id: {{adminTenentId}}
  5 +
  6 +
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerController.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.customer;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
5 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 6 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
... ... @@ -9,20 +8,17 @@ import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
9 8 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*;
10 9 import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert;
11 10 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
12   -import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
13   -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
14   -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
15 11 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService;
16   -import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
17 12 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
18 13 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
19 14 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
20 15 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
21 16 import io.swagger.v3.oas.annotations.Operation;
22 17 import io.swagger.v3.oas.annotations.Parameter;
  18 +import io.swagger.v3.oas.annotations.Parameters;
23 19 import io.swagger.v3.oas.annotations.tags.Tag;
  20 +import org.mapstruct.ap.internal.util.Collections;
24 21 import org.springframework.security.access.prepost.PreAuthorize;
25   -import org.springframework.util.CollectionUtils;
26 22 import org.springframework.validation.annotation.Validated;
27 23 import org.springframework.web.bind.annotation.*;
28 24  
... ... @@ -30,17 +26,17 @@ import javax.annotation.Resource;
30 26 import javax.servlet.http.HttpServletResponse;
31 27 import javax.validation.Valid;
32 28 import java.io.IOException;
33   -import java.util.Collections;
34 29 import java.util.List;
35 30 import java.util.Map;
36   -import java.util.Set;
  31 +import java.util.stream.Stream;
37 32  
38   -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
39 33 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
40   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  34 +import static cn.iocoder.yudao.framework.common.pojo.PageParam.PAGE_SIZE_NONE;
41 35 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  36 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
42 37 import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
43 38 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
  39 +import static java.util.Collections.singletonList;
44 40  
45 41 @Tag(name = "管理后台 - CRM 客户")
46 42 @RestController
... ... @@ -55,8 +51,6 @@ public class CrmCustomerController {
55 51 private DeptApi deptApi;
56 52 @Resource
57 53 private AdminUserApi adminUserApi;
58   - @Resource
59   - private CrmPermissionService permissionService;
60 54  
61 55 @PostMapping("/create")
62 56 @Operation(summary = "创建客户")
... ... @@ -92,73 +86,38 @@ public class CrmCustomerController {
92 86 if (customer == null) {
93 87 return success(null);
94 88 }
95   -
96 89 // 2. 拼接数据
97   - // 2.1 获取负责人
98   - List<CrmPermissionDO> ownerList = permissionService.getPermissionByBizTypeAndBizIdsAndLevel(
99   - CrmBizTypeEnum.CRM_CUSTOMER.getType(), Collections.singletonList(customer.getId()),
100   - CrmPermissionLevelEnum.OWNER.getLevel());
101   - Map<Long, CrmPermissionDO> ownerMap = convertMap(ownerList, CrmPermissionDO::getBizId);
102   - // 2.2 获取负责人详情
103   - Set<Long> userIds = convertSet(ownerList, CrmPermissionDO::getUserId);
104   - userIds.add(Long.parseLong(customer.getCreator())); // 加入创建者
105   - List<AdminUserRespDTO> userList = adminUserApi.getUserList(userIds);
106   - Map<Long, AdminUserRespDTO> userMap = convertMap(userList, AdminUserRespDTO::getId);
107   - // 2.3 获取部门详情
108   - Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userList, AdminUserRespDTO::getDeptId));
109   - return success(CrmCustomerConvert.INSTANCE.convert(customer, ownerMap, userMap, deptMap));
  90 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
  91 + Collections.asSet(Long.valueOf(customer.getCreator()), customer.getOwnerUserId()));
  92 + Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
  93 + return success(CrmCustomerConvert.INSTANCE.convert(customer, userMap, deptMap));
110 94 }
111 95  
112   - // TODO @puhui999:可以在 CrmCustomerPageReqVO 里面加个 pool 参数,为 true 时,代表来自公海客户的分页
113 96 @GetMapping("/page")
114 97 @Operation(summary = "获得客户分页")
115 98 @PreAuthorize("@ss.hasPermission('crm:customer:query')")
116 99 public CommonResult<PageResult<CrmCustomerRespVO>> getCustomerPage(@Valid CrmCustomerPageReqVO pageVO) {
  100 + // 1. 查询客户分页
117 101 PageResult<CrmCustomerDO> pageResult = customerService.getCustomerPage(pageVO, getLoginUserId());
118 102 if (CollUtil.isEmpty(pageResult.getList())) {
119 103 return success(PageResult.empty(pageResult.getTotal()));
120 104 }
121   - // 拼接数据
122   - // TODO @puhui999:这块的拼接逻辑,可以和 convertPage 合并下;
123   -// Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
124   -// convertSetByFlatMap(pageResult.getList(), user -> Stream.of(NumberUtil.parseLong(user.getCreator()), user.getOwnerUserId())));
125   -// Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
126   -// convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
127   - return convertPage(customerService.getCustomerPage(pageVO, getLoginUserId()));
128   - }
129   -
130   - // TODO @puhui999:
131   - @GetMapping("/pool-page")
132   - @Operation(summary = "获得公海客户分页")
133   - @PreAuthorize("@ss.hasPermission('crm:customer:query')")
134   - public CommonResult<PageResult<CrmCustomerRespVO>> getPoolCustomerPage(@Valid CrmCustomerPageReqVO pageVO) {
135   - return convertPage(customerService.getCustomerPage(pageVO, CrmPermissionDO.POOL_USER_ID));
136   - }
137 105  
138   - private CommonResult<PageResult<CrmCustomerRespVO>> convertPage(PageResult<CrmCustomerDO> pageResult) {
139 106 // 2. 拼接数据
140   - Set<Long> ids = convertSet(pageResult.getList(), CrmCustomerDO::getId);
141   - // 2.1 获取负责人
142   - List<CrmPermissionDO> ownerList = permissionService.getPermissionByBizTypeAndBizIdsAndLevel(
143   - CrmBizTypeEnum.CRM_CUSTOMER.getType(), ids, CrmPermissionLevelEnum.OWNER.getLevel());
144   - Map<Long, CrmPermissionDO> ownerMap = convertMap(ownerList, CrmPermissionDO::getBizId);
145   - // 2.2 获取负责人详情
146   - Set<Long> userIds = convertSet(ownerList, CrmPermissionDO::getUserId);
147   - userIds.addAll(convertSet(pageResult.getList(), item -> Long.parseLong(item.getCreator()))); // 加入创建者
148   - List<AdminUserRespDTO> userList = adminUserApi.getUserList(userIds);
149   - Map<Long, AdminUserRespDTO> userMap = convertMap(userList, AdminUserRespDTO::getId);
150   - // 2.3 获取部门详情
151   - Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userList, AdminUserRespDTO::getDeptId));
152   - return success(CrmCustomerConvert.INSTANCE.convertPage(pageResult, ownerMap, userMap, deptMap));
  107 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
  108 + convertSetByFlatMap(pageResult.getList(), user -> Stream.of(Long.parseLong(user.getCreator()), user.getOwnerUserId())));
  109 + Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
  110 + return success(CrmCustomerConvert.INSTANCE.convertPage(pageResult, userMap, deptMap));
153 111 }
154 112  
155 113 @GetMapping("/export-excel")
156 114 @Operation(summary = "导出客户 Excel")
157 115 @PreAuthorize("@ss.hasPermission('crm:customer:export')")
158 116 @OperateLog(type = EXPORT)
159   - public void exportCustomerExcel(@Valid CrmCustomerExportReqVO exportReqVO,
  117 + public void exportCustomerExcel(@Valid CrmCustomerPageReqVO pageVO,
160 118 HttpServletResponse response) throws IOException {
161   - List<CrmCustomerDO> list = customerService.getCustomerList(exportReqVO);
  119 + pageVO.setPageSize(PAGE_SIZE_NONE); // 不分页
  120 + List<CrmCustomerDO> list = customerService.getCustomerPage(pageVO, getLoginUserId()).getList();
162 121 // 导出 Excel
163 122 List<CrmCustomerExcelVO> datas = CrmCustomerConvert.INSTANCE.convertList02(list);
164 123 ExcelUtils.write(response, "客户.xls", "数据", CrmCustomerExcelVO.class, datas);
... ... @@ -181,30 +140,48 @@ public class CrmCustomerController {
181 140 return success(true);
182 141 }
183 142  
  143 + // ==================== 公海相关操作 ====================
  144 +
  145 + @PutMapping("/put-pool")
  146 + @Operation(summary = "数据放入公海")
  147 + @Parameter(name = "id", description = "客户编号", required = true, example = "1024")
  148 + @PreAuthorize("@ss.hasPermission('crm:customer:update')")
  149 + public CommonResult<Boolean> putCustomerPool(@RequestParam("id") Long id) {
  150 + customerService.putCustomerPool(id);
  151 + return success(true);
  152 + }
  153 +
184 154 @PutMapping("/receive")
185 155 @Operation(summary = "领取公海客户")
186   - // TODO @xiaqing:1)receiveCustomer 方法名字;2)cIds 改成 ids,要加下 @RequestParam,还有 swagger 注解;3)参数非空,使用 validator 校验;4)返回 true 即可;
  156 + @Parameter(name = "ids", description = "编号数组", required = true, example = "1,2,3")
187 157 @PreAuthorize("@ss.hasPermission('crm:customer:receive')")
188   - public CommonResult<String> receiveByIds(List<Long> cIds){
189   - // 判断是否为空
190   - if(CollectionUtils.isEmpty(cIds))
191   - return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),GlobalErrorCodeConstants.BAD_REQUEST.getMsg());
192   - // 领取公海任务
193   - // TODO @xiaqing:userid,通过 controller 传递给 service,不要在 service 里面获取,无状态
194   - customerService.receive(cIds);
195   - return success("领取成功");
  158 + public CommonResult<Boolean> receiveCustomer(@RequestParam(value = "ids") List<Long> ids) {
  159 + customerService.receiveCustomer(ids, getLoginUserId());
  160 + return success(true);
196 161 }
197 162  
198   - // TODO @xiaqing:1)distributeCustomer 方法名;2)cIds 同上;3)参数校验,同上;4)ownerId 改成 ownerUserId,和别的模块统一;5)返回 true 即可;
199   - @PutMapping("/distributeByIds")
  163 + @PutMapping("/distribute")
200 164 @Operation(summary = "分配公海给对应负责人")
201   - @PreAuthorize("@ss.hasPermission('crm:customer:distributeByIds')")
202   - public CommonResult<String> distributeByIds(Long ownerId,List<Long>cIds){
203   - //判断参数不能为空
204   - if(ownerId==null || CollectionUtils.isEmpty(cIds))
205   - return error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),GlobalErrorCodeConstants.BAD_REQUEST.getMsg());
206   - customerService.distributeByIds(cIds,ownerId);
207   - return success("分配成功");
  165 + @Parameters({
  166 + @Parameter(name = "ids", description = "客户编号数组", required = true, example = "1,2,3"),
  167 + @Parameter(name = "ownerUserId", description = "分配的负责人编号", required = true, example = "12345")
  168 + })
  169 + @PreAuthorize("@ss.hasPermission('crm:customer:distribute')")
  170 + public CommonResult<Boolean> distributeCustomer(@RequestParam(value = "ids") List<Long> ids,
  171 + @RequestParam(value = "ownerUserId") Long ownerUserId) {
  172 + // 领取公海数据
  173 + customerService.receiveCustomer(ids, ownerUserId);
  174 + return success(true);
  175 + }
  176 +
  177 + // TODO 芋艿:这个接口要调整下
  178 + @GetMapping("/query-all-list")
  179 + @Operation(summary = "查询客户列表")
  180 + @PreAuthorize("@ss.hasPermission('crm:customer:all')")
  181 + public CommonResult<List<CrmCustomerQueryAllRespVO>> queryAll(){
  182 + List<CrmCustomerDO> crmCustomerDOList = customerService.getCustomerList();
  183 + List<CrmCustomerQueryAllRespVO> data = CrmCustomerConvert.INSTANCE.convertQueryAll(crmCustomerDOList);
  184 + return success(data);
208 185 }
209 186  
210 187 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerLimitConfigController.java
... ... @@ -3,13 +3,13 @@ package cn.iocoder.yudao.module.crm.controller.admin.customer;
3 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigCreateReqVO;
7   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigPageReqVO;
8   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigRespVO;
9   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigUpdateReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigPageReqVO;
  8 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigRespVO;
  9 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO;
10 10 import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerLimitConfigConvert;
11   -import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO;
12   -import cn.iocoder.yudao.module.crm.service.customerlimitconfig.CrmCustomerLimitConfigService;
  11 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO;
  12 +import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerLimitConfigService;
13 13 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
14 14 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
15 15 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
... ... @@ -29,7 +29,7 @@ import java.util.Map;
29 29 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
30 30 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap;
31 31  
32   -@Tag(name = "管理后台 - 客户限制配置")
  32 +@Tag(name = "管理后台 - CRM 客户限制配置")
33 33 @RestController
34 34 @RequestMapping("/crm/customer-limit-config")
35 35 @Validated
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/CrmCustomerPoolConfigController.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.customer;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPoolConfigRespVO;
5   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPoolConfigUpdateReqVO;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigRespVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO;
6 6 import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert;
7 7 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO;
8 8 import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerPoolConfigService;
... ... @@ -34,12 +34,11 @@ public class CrmCustomerPoolConfigController {
34 34 return success(CrmCustomerConvert.INSTANCE.convert(customerPoolConfig));
35 35 }
36 36  
37   - // TODO @wanwan:这个请求,搞成 save 哈;
38   - @PutMapping("/update")
  37 + @PutMapping("/save")
39 38 @Operation(summary = "更新客户公海规则设置")
40 39 @PreAuthorize("@ss.hasPermission('crm:customer-pool-config:update')")
41   - public CommonResult<Boolean> updateCustomerPoolConfig(@Valid @RequestBody CrmCustomerPoolConfigUpdateReqVO updateReqVO) {
42   - customerPoolConfigService.updateCustomerPoolConfig(updateReqVO);
  40 + public CommonResult<Boolean> saveCustomerPoolConfig(@Valid @RequestBody CrmCustomerPoolConfigSaveReqVO updateReqVO) {
  41 + customerPoolConfigService.saveCustomerPoolConfig(updateReqVO);
43 42 return success(true);
44 43 }
45 44  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerExportReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -// TODO 芋艿:导出最后做,等基本确认的差不多之后;
7   -@Schema(description = "管理后台 - CRM 客户 Excel 导出 Request VO,参数和 CrmCustomerPageReqVO 是一致的")
8   -@Data
9   -public class CrmCustomerExportReqVO {
10   -
11   - @Schema(description = "客户名称", example = "赵六")
12   - private String name;
13   -
14   - @Schema(description = "手机", example = "18000000000")
15   - private String mobile;
16   -
17   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPageReqVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4   -import cn.iocoder.yudao.module.crm.enums.customer.CrmCustomerSceneEnum;
  4 +import cn.iocoder.yudao.module.crm.enums.common.CrmSceneEnum;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import lombok.Data;
7 7 import lombok.EqualsAndHashCode;
8 8 import lombok.ToString;
9 9  
  10 +import javax.validation.constraints.NotNull;
  11 +
10 12 @Schema(description = "管理后台 - CRM 客户分页 Request VO")
11 13 @Data
12 14 @EqualsAndHashCode(callSuper = true)
... ... @@ -31,9 +33,13 @@ public class CrmCustomerPageReqVO extends PageParam {
31 33 /**
32 34 * 场景类型
33 35 *
34   - * 关联 {@link CrmCustomerSceneEnum}
  36 + * 关联 {@link CrmSceneEnum}
35 37 */
36 38 @Schema(description = "场景类型", example = "1")
37 39 private Integer sceneType;
38 40  
  41 + @Schema(description = "是否为公海数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
  42 + @NotNull(message = "是否为公海数据不能为空")
  43 + private Boolean pool;
  44 +
39 45 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigUpdateReqVO.java deleted
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -import lombok.EqualsAndHashCode;
6   -import lombok.ToString;
7   -
8   -@Schema(description = "管理后台 - CRM 客户更新 Request VO")
9   -@Data
10   -@EqualsAndHashCode(callSuper = true)
11   -@ToString(callSuper = true)
12   -public class CrmCustomerPoolConfigUpdateReqVO extends CrmCustomerPoolConfigBaseVO {
13   -
14   -}
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerQueryAllRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +// TODO 芋艿:这块要统一下;
  7 +@Schema(description = "管理后台 - CRM 全部客户 Response VO")
  8 +@Data
  9 +public class CrmCustomerQueryAllRespVO{
  10 +
  11 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13563")
  12 + private Long id;
  13 +
  14 + @Schema(description = "客户名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
  15 + private String name;
  16 +
  17 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerTransferReqVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
2 2  
3   -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
  3 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigBaseVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigBaseVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
... ... @@ -6,7 +6,6 @@ import lombok.Data;
6 6 import javax.validation.constraints.NotNull;
7 7 import java.util.List;
8 8  
9   -// TODO @wanwan:vo 下,可以新建一个 limitconfig,放它的 vo;
10 9 /**
11 10 * 客户限制配置 Base VO,提供给添加、修改、详细的子 VO 使用
12 11 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigCreateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigCreateReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigPageReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigPageReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigRespVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigRespVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig;
2 2  
  3 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
  4 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
3 5 import io.swagger.v3.oas.annotations.media.Schema;
4 6 import lombok.Data;
5 7 import lombok.EqualsAndHashCode;
... ... @@ -18,10 +20,10 @@ public class CrmCustomerLimitConfigRespVO extends CrmCustomerLimitConfigBaseVO {
18 20 private Long id;
19 21  
20 22 @Schema(description = "规则适用人群名称")
21   - private String userNames;
  23 + private List<AdminUserRespDTO> users;
22 24  
23 25 @Schema(description = "规则适用部门名称")
24   - private String deptNames;
  26 + private List<DeptRespDTO> depts;
25 27  
26 28 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
27 29 private LocalDateTime createTime;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerLimitConfigUpdateReqVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/limitconfig/CrmCustomerLimitConfigUpdateReqVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigBaseVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigBaseVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
... ... @@ -12,7 +12,6 @@ import javax.validation.constraints.NotNull;
12 12 @Data
13 13 public class CrmCustomerPoolConfigBaseVO {
14 14  
15   - // TODO @wanwan:参数校验
16 15 @Schema(description = "是否启用客户公海", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
17 16 @NotNull(message = "是否启用客户公海不能为空")
18 17 private Boolean enabled;
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerPoolConfigRespVO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigRespVO.java
1   -package cn.iocoder.yudao.module.crm.controller.admin.customer.vo;
  1 +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.Data;
5 5 import lombok.EqualsAndHashCode;
6 6 import lombok.ToString;
7 7  
8   -// TODO @wanwan:vo 下,可以新建一个 poolconfig,放它的 vo;
9 8 @Schema(description = "管理后台 - CRM 客户公海规则 Response VO")
10 9 @Data
11 10 @EqualsAndHashCode(callSuper = true)
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/poolconfig/CrmCustomerPoolConfigSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig;
  2 +
  3 +import cn.hutool.core.util.BooleanUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +
  10 +import javax.validation.constraints.AssertTrue;
  11 +import java.util.Objects;
  12 +
  13 +@Schema(description = "管理后台 - CRM 客户公海配置的保存 Request VO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +@ToString(callSuper = true)
  17 +public class CrmCustomerPoolConfigSaveReqVO extends CrmCustomerPoolConfigBaseVO {
  18 +
  19 + // TODO @wanwan:AssertTrue 必须 is 开头哈;注意需要 json 忽略下,避免被序列化;
  20 + @AssertTrue(message = "客户公海规则设置不正确")
  21 + // TODO @wanwan:这个方法,是不是拆成 2 个,一个校验 contactExpireDays、一个校验 dealExpireDays;
  22 + public boolean poolEnableValid() {
  23 + if (!BooleanUtil.isTrue(getEnabled())) {
  24 + return true;
  25 + }
  26 + return ObjectUtil.isAllNotEmpty(getContactExpireDays(), getDealExpireDays());
  27 + }
  28 +
  29 + @AssertTrue(message = "客户公海规则设置不正确")
  30 + // TODO @wanwan:这个方法,是不是改成 isNotifyDaysValid() 更好点?本质校验的是 notifyDays 是否为空
  31 + public boolean notifyEnableValid() {
  32 + if (!BooleanUtil.isTrue(getNotifyEnabled())) {
  33 + return true;
  34 + }
  35 + return Objects.nonNull(getNotifyDays());
  36 + }
  37 +
  38 +}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.http
1 1 ### 请求 /add
2   -PUT {{baseUrl}}/crm/permission/add
  2 +POST {{baseUrl}}/crm/permission/create
3 3 Content-Type: application/json
4 4 Authorization: Bearer {{token}}
5 5 tenant-id: {{adminTenentId}}
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/CrmPermissionController.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.permission;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.hutool.core.util.ObjUtil;
5 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
6 6 import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionCreateReqVO;
7 7 import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionRespVO;
8 8 import cn.iocoder.yudao.module.crm.controller.admin.permission.vo.CrmPermissionUpdateReqVO;
9 9 import cn.iocoder.yudao.module.crm.convert.permission.CrmPermissionConvert;
10 10 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
11 11 import cn.iocoder.yudao.module.crm.framework.core.annotations.CrmPermission;
12   -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
13   -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
  12 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
14 13 import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService;
15 14 import cn.iocoder.yudao.module.system.api.dept.DeptApi;
16 15 import cn.iocoder.yudao.module.system.api.dept.PostApi;
... ... @@ -29,17 +28,12 @@ import org.springframework.web.bind.annotation.*;
29 28 import javax.annotation.Resource;
30 29 import javax.validation.Valid;
31 30 import java.util.*;
32   -import java.util.function.Predicate;
33   -import java.util.stream.Collectors;
34 31  
35   -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
36 32 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
37   -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;
38 33 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
39 34 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
40   -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CRM_PERMISSION_NOT_EXISTS;
41 35  
42   -@Tag(name = "管理后台 - CRM 数据权限(数据团队成员操作)")
  36 +@Tag(name = "管理后台 - CRM 数据权限")
43 37 @RestController
44 38 @RequestMapping("/crm/permission")
45 39 @Validated
... ... @@ -55,87 +49,45 @@ public class CrmPermissionController {
55 49 @Resource
56 50 private PostApi postApi;
57 51  
58   - // TODO @puhui999:保持统一,create 噢;然后是 PostMapping
59   - @PutMapping("/add")
60   - @Operation(summary = "添加团队成员")
  52 + @PostMapping("/create")
  53 + @Operation(summary = "创建数据权限")
61 54 @PreAuthorize("@ss.hasPermission('crm:permission:create')")
62   - @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#reqVO.bizType", bizId = "#reqVO.bizId",
63   - level = CrmPermissionLevelEnum.OWNER)
  55 + @CrmPermission(bizTypeValue = "#reqVO.bizType", bizId = "#reqVO.bizId", level = CrmPermissionLevelEnum.OWNER)
64 56 public CommonResult<Boolean> addPermission(@Valid @RequestBody CrmPermissionCreateReqVO reqVO) {
65 57 permissionService.createPermission(CrmPermissionConvert.INSTANCE.convert(reqVO));
66 58 return success(true);
67 59 }
68 60  
69   - // TODO @puhui999:领取公海客户,是不是放到客户那更合适哈?
70   - @PutMapping("/receive")
71   - @Operation(summary = "领取公海数据")
72   - @PreAuthorize("@ss.hasPermission('crm:permission:update')")
73   - public CommonResult<Boolean> receive(@RequestParam("bizType") Integer bizType, @RequestParam("bizId") Long bizId) {
74   - permissionService.receiveBiz(bizType, bizId, getLoginUserId());
75   - return success(true);
76   - }
77   -
78   - // TODO @puhui999:是不是放到客户那更合适哈?
79   - @PutMapping("/put-pool")
80   - @Operation(summary = "数据放入公海")
81   - @PreAuthorize("@ss.hasPermission('crm:permission:update')")
82   - @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#bizType", bizId = "#bizId"
83   - , level = CrmPermissionLevelEnum.OWNER)
84   - public CommonResult<Boolean> putPool(@RequestParam(value = "bizType") Integer bizType, @RequestParam("bizId") Long bizId) {
85   - permissionService.putPool(bizType, bizId, getLoginUserId());
86   - return success(true);
87   - }
88   -
89 61 @PutMapping("/update")
90   - @Operation(summary = "编辑团队成员权限")
  62 + @Operation(summary = "编辑数据权限")
91 63 @PreAuthorize("@ss.hasPermission('crm:permission:update')")
92   - @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#updateReqVO.bizType", bizId = "#updateReqVO.bizId"
  64 + @CrmPermission(bizTypeValue = "#updateReqVO.bizType", bizId = "#updateReqVO.bizId"
93 65 , level = CrmPermissionLevelEnum.OWNER)
94 66 public CommonResult<Boolean> updatePermission(@Valid @RequestBody CrmPermissionUpdateReqVO updateReqVO) {
95 67 permissionService.updatePermission(updateReqVO);
96 68 return success(true);
97 69 }
98 70  
99   - // TODO @puhui999:bizType 和 bizId 是不是不用啦;因为参数校验需要 bizType 和 bizId,可以先查询下,在直接调用方法;不一定都要注解哈;
100 71 @DeleteMapping("/delete")
101   - @Operation(summary = "移除团队成员")
102   - @Parameters({
103   - @Parameter(name = "bizType", description = "CRM 类型", required = true, example = "2"),
104   - @Parameter(name = "bizId", description = "CRM 类型数据编号", required = true, example = "1024"),
105   - @Parameter(name = "ids", description = "团队成员编号", required = true, example = "1024")
106   - })
  72 + @Operation(summary = "删除数据权限")
  73 + @Parameter(name = "ids", description = "数据权限编号", required = true, example = "1024")
107 74 @PreAuthorize("@ss.hasPermission('crm:permission:delete')")
108   - @CrmPermission(bizType = CrmBizTypeEnum.CRM_PERMISSION, bizTypeValue = "#bizType", bizId = "#bizId"
109   - , level = CrmPermissionLevelEnum.OWNER) // 为了校验权限请求必须带上 bizType 和 bizId
110   - public CommonResult<Boolean> deletePermission(@RequestParam("bizType") Integer bizType,
111   - @RequestParam("bizId") Long bizId,
112   - @RequestParam("ids") Collection<Long> ids) {
113   - permissionService.deletePermission(ids);
  75 + public CommonResult<Boolean> deletePermission(@RequestParam("ids") Collection<Long> ids) {
  76 + permissionService.deletePermissionBatch(ids, getLoginUserId());
114 77 return success(true);
115 78 }
116 79  
117   - // TODO @puhui999:deleteSelfPermission;尽量归成 crud 这样的操作哈;
118   - @DeleteMapping("/quit-team")
119   - @Operation(summary = "退出团队")
120   - @Parameters({
121   - // TODO @puhui999:这个可以拿出来,不用包在 @Parameters 里,在只有一个参数时哈;
122   - @Parameter(name = "id", description = "团队成员编号", required = true, example = "1024")
123   - })
  80 + @DeleteMapping("/delete-self")
  81 + @Operation(summary = "删除自己的数据权限")
  82 + @Parameter(name = "id", description = "数据权限编号", required = true, example = "1024")
124 83 @PreAuthorize("@ss.hasPermission('crm:permission:delete')")
125   - public CommonResult<Boolean> deletePermission(@RequestParam("id") Long id) {
126   - // 校验数据存在且是自己
127   - CrmPermissionDO permission = permissionService.getPermissionByIdAndUserId(id, getLoginUserId());
128   - if (permission == null) {
129   - throw exception(CRM_PERMISSION_NOT_EXISTS);
130   - }
131   -
132   - // 删除
133   - permissionService.deletePermission(Collections.singletonList(id));
  84 + public CommonResult<Boolean> deleteSelfPermission(@RequestParam("id") Long id) {
  85 + permissionService.deleteSelfPermission(id, getLoginUserId());
134 86 return success(true);
135 87 }
136 88  
137 89 @GetMapping("/list")
138   - @Operation(summary = "获取团队成员")
  90 + @Operation(summary = "获得数据权限列表")
139 91 @Parameters({
140 92 @Parameter(name = "bizType", description = "CRM 类型", required = true, example = "2"),
141 93 @Parameter(name = "bizId", description = "CRM 类型数据编号", required = true, example = "1024")
... ... @@ -143,23 +95,15 @@ public class CrmPermissionController {
143 95 @PreAuthorize("@ss.hasPermission('crm:permission:query')")
144 96 public CommonResult<List<CrmPermissionRespVO>> getPermissionList(@RequestParam("bizType") Integer bizType,
145 97 @RequestParam("bizId") Long bizId) {
146   - List<CrmPermissionDO> permission = permissionService.getPermissionByBizTypeAndBizId(bizType, bizId);
  98 + List<CrmPermissionDO> permission = permissionService.getPermissionListByBiz(bizType, bizId);
147 99 if (CollUtil.isEmpty(permission)) {
148 100 return success(Collections.emptyList());
149 101 }
150   - // TODO @puhui999:池子的逻辑;
151   - // 判断是否是公海数据
152   - // TODO @puhui999:这段逻辑,可以删除么?
153   - Predicate<CrmPermissionDO> filter = item -> ObjUtil.equal(item.getUserId(), CrmPermissionDO.POOL_USER_ID);
154   - if (anyMatch(permission, filter)) {
155   - permission.removeIf(filter); // 排除
156   - }
157 102  
158 103 // 拼接数据
159 104 List<AdminUserRespDTO> userList = adminUserApi.getUserList(convertSet(permission, CrmPermissionDO::getUserId));
160 105 Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(convertSet(userList, AdminUserRespDTO::getDeptId));
161   - // TODO @puhui999:CollectionUtils.convertSetByFlatMap() 看看可以不
162   - Set<Long> postIds = userList.stream().flatMap(item -> item.getPostIds().stream()).collect(Collectors.toSet());
  106 + Set<Long> postIds = CollectionUtils.convertSetByFlatMap(userList, AdminUserRespDTO::getPostIds, Collection::stream);
163 107 Map<Long, PostRespDTO> postMap = postApi.getPostMap(postIds);
164 108 return success(CrmPermissionConvert.INSTANCE.convert(permission, userList, deptMap, postMap));
165 109 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionBaseVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.permission.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
5   -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
  4 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
6 6 import io.swagger.v3.oas.annotations.media.Schema;
7 7 import lombok.Data;
8 8  
9 9 import javax.validation.constraints.NotNull;
10 10  
11 11 /**
12   - * 数据权限(团队成员) Base VO,提供给添加、修改、详细的子 VO 使用
  12 + * 数据权限 Base VO,提供给添加、修改、详细的子 VO 使用
13 13 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
14 14 *
15 15 * @author HUIHUI
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionRespVO.java
... ... @@ -6,7 +6,7 @@ import lombok.Data;
6 6 import java.time.LocalDateTime;
7 7 import java.util.Set;
8 8  
9   -@Schema(description = "管理后台 - CRM 数据权限(团队成员) Response VO")
  9 +@Schema(description = "管理后台 - CRM 数据权限 Response VO")
10 10 @Data
11 11 public class CrmPermissionRespVO extends CrmPermissionBaseVO {
12 12  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/permission/vo/CrmPermissionUpdateReqVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.permission.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.crm.framework.enums.CrmBizTypeEnum;
5   -import cn.iocoder.yudao.module.crm.framework.enums.CrmPermissionLevelEnum;
  4 +import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
  5 +import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
6 6 import io.swagger.v3.oas.annotations.media.Schema;
7 7 import lombok.Data;
8 8  
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivableBaseVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.crm.enums.AuditStatusEnum;
  4 +import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import lombok.Data;
7 7 import org.springframework.format.annotation.DateTimeFormat;
... ... @@ -34,7 +34,7 @@ public class CrmReceivableBaseVO {
34 34  
35 35 // TODO @liuhongfeng:这个字段,应该不是前端传递的噢,而是后端自己生成的
36 36 @Schema(description = "审批状态", example = "1")
37   - @InEnum(AuditStatusEnum.class)
  37 + @InEnum(CrmAuditStatusEnum.class)
38 38 private Integer checkStatus;
39 39  
40 40 @Schema(description = "回款日期")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivableExcelVO.java
... ... @@ -28,7 +28,7 @@ public class CrmReceivableExcelVO {
28 28 private Long contractId;
29 29  
30 30 @ExcelProperty(value = "审批状态", converter = DictConvert.class)
31   - @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_RECEIVABLE_CHECK_STATUS)
  31 + @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_AUDIT_STATUS)
32 32 private Integer checkStatus;
33 33  
34 34 @ExcelProperty("工作流编号")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivablePlanBaseVO.java
1 1 package cn.iocoder.yudao.module.crm.controller.admin.receivable.vo;
2 2  
3 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4   -import cn.iocoder.yudao.module.crm.enums.AuditStatusEnum;
  4 +import cn.iocoder.yudao.module.crm.enums.common.CrmAuditStatusEnum;
5 5 import io.swagger.v3.oas.annotations.media.Schema;
6 6 import lombok.Data;
7 7 import org.springframework.format.annotation.DateTimeFormat;
... ... @@ -28,7 +28,7 @@ public class CrmReceivablePlanBaseVO {
28 28 private Integer status;
29 29  
30 30 @Schema(description = "审批状态", example = "1")
31   - @InEnum(AuditStatusEnum.class)
  31 + @InEnum(CrmAuditStatusEnum.class)
32 32 private Integer checkStatus;
33 33  
34 34 @Schema(description = "计划回款金额", example = "29675")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/receivable/vo/CrmReceivablePlanExcelVO.java
... ... @@ -31,7 +31,7 @@ public class CrmReceivablePlanExcelVO {
31 31 private Integer status;
32 32  
33 33 @ExcelProperty(value = "审批状态", converter = DictConvert.class)
34   - @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_RECEIVABLE_CHECK_STATUS)
  34 + @DictFormat(cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_AUDIT_STATUS)
35 35 private Integer checkStatus;
36 36  
37 37 //@ExcelProperty("工作流编号")
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/business/CrmBusinessConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.business;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.crm.controller.admin.business.vo.*;
  4 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.business.*;
5 5 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
  7 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO;
  8 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
6 9 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
7 10 import org.mapstruct.Mapper;
8 11 import org.mapstruct.Mapping;
... ... @@ -10,6 +13,9 @@ import org.mapstruct.Mappings;
10 13 import org.mapstruct.factory.Mappers;
11 14  
12 15 import java.util.List;
  16 +import java.util.Map;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
13 19  
14 20 /**
15 21 * 商机 Convert
... ... @@ -37,4 +43,18 @@ public interface CrmBusinessConvert {
37 43 })
38 44 CrmPermissionTransferReqBO convert(CrmBusinessTransferReqVO reqVO, Long userId);
39 45  
  46 + default PageResult<CrmBusinessRespVO> convertPage(PageResult<CrmBusinessDO> page, List<CrmCustomerDO> customerList,
  47 + List<CrmBusinessStatusTypeDO> statusTypeList, List<CrmBusinessStatusDO> statusList) {
  48 + PageResult<CrmBusinessRespVO> result = convertPage(page);
  49 + // 拼接关联字段
  50 + Map<Long, String> customerMap = convertMap(customerList, CrmCustomerDO::getId, CrmCustomerDO::getName);
  51 + Map<Long, String> statusTypeMap = convertMap(statusTypeList, CrmBusinessStatusTypeDO::getId, CrmBusinessStatusTypeDO::getName);
  52 + Map<Long, String> statusMap = convertMap(statusList, CrmBusinessStatusDO::getId, CrmBusinessStatusDO::getName);
  53 + result.getList().forEach(type -> type
  54 + .setCustomerName(customerMap.get(type.getCustomerId()))
  55 + .setStatusTypeName(statusTypeMap.get(type.getStatusTypeId()))
  56 + .setStatusName(statusMap.get(type.getStatusId())));
  57 + return result;
  58 + }
  59 +
40 60 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatus/CrmBusinessStatusConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.businessstatus;
2 2  
3   -import java.util.*;
4   -
5 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -
  4 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusRespVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.status.CrmBusinessStatusSaveReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
7 7 import org.mapstruct.Mapper;
8 8 import org.mapstruct.factory.Mappers;
9   -import cn.iocoder.yudao.module.crm.controller.admin.businessstatus.vo.*;
10   -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO;
  9 +
  10 +import java.util.List;
11 11  
12 12 /**
13 13 * 商机状态 Convert
... ... @@ -19,9 +19,7 @@ public interface CrmBusinessStatusConvert {
19 19  
20 20 CrmBusinessStatusConvert INSTANCE = Mappers.getMapper(CrmBusinessStatusConvert.class);
21 21  
22   - CrmBusinessStatusDO convert(CrmBusinessStatusCreateReqVO bean);
23   -
24   - CrmBusinessStatusDO convert(CrmBusinessStatusUpdateReqVO bean);
  22 + CrmBusinessStatusDO convert(CrmBusinessStatusSaveReqVO bean);
25 23  
26 24 CrmBusinessStatusRespVO convert(CrmBusinessStatusDO bean);
27 25  
... ... @@ -29,6 +27,4 @@ public interface CrmBusinessStatusConvert {
29 27  
30 28 PageResult<CrmBusinessStatusRespVO> convertPage(PageResult<CrmBusinessStatusDO> page);
31 29  
32   - List<CrmBusinessStatusExcelVO> convertList02(List<CrmBusinessStatusDO> list);
33   -
34 30 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/businessstatustype/CrmBusinessStatusTypeConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.businessstatustype;
2 2  
3   -import java.util.*;
4   -
5 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -
  4 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeRespVO;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.business.vo.type.CrmBusinessStatusTypeSaveReqVO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusDO;
  7 +import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessStatusTypeDO;
  8 +import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
7 9 import org.mapstruct.Mapper;
8 10 import org.mapstruct.factory.Mappers;
9   -import cn.iocoder.yudao.module.crm.controller.admin.businessstatustype.vo.*;
10   -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO;
  11 +
  12 +import java.util.List;
  13 +import java.util.Map;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  16 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
11 17  
12 18 /**
13 19 * 商机状态类型 Convert
... ... @@ -19,16 +25,25 @@ public interface CrmBusinessStatusTypeConvert {
19 25  
20 26 CrmBusinessStatusTypeConvert INSTANCE = Mappers.getMapper(CrmBusinessStatusTypeConvert.class);
21 27  
22   - CrmBusinessStatusTypeDO convert(CrmBusinessStatusTypeCreateReqVO bean);
23   -
24   - CrmBusinessStatusTypeDO convert(CrmBusinessStatusTypeUpdateReqVO bean);
  28 + CrmBusinessStatusTypeDO convert(CrmBusinessStatusTypeSaveReqVO bean);
25 29  
26 30 CrmBusinessStatusTypeRespVO convert(CrmBusinessStatusTypeDO bean);
27 31  
28   - List<CrmBusinessStatusTypeRespVO> convertList(List<CrmBusinessStatusTypeDO> list);
29   -
30 32 PageResult<CrmBusinessStatusTypeRespVO> convertPage(PageResult<CrmBusinessStatusTypeDO> page);
31 33  
32   - List<CrmBusinessStatusTypeExcelVO> convertList02(List<CrmBusinessStatusTypeDO> list);
  34 + default PageResult<CrmBusinessStatusTypeRespVO> convertPage(PageResult<CrmBusinessStatusTypeDO> page, List<DeptRespDTO> deptList) {
  35 + PageResult<CrmBusinessStatusTypeRespVO> pageResult = convertPage(page);
  36 + // 拼接关联字段
  37 + Map<Long, String> deptMap = convertMap(deptList, DeptRespDTO::getId, DeptRespDTO::getName);
  38 + pageResult.getList().forEach(type -> type.setDeptNames(convertList(type.getDeptIds(), deptMap::get)));
  39 + return pageResult;
  40 + }
  41 +
  42 + default CrmBusinessStatusTypeRespVO convert(CrmBusinessStatusTypeDO bean, List<CrmBusinessStatusDO> statusList) {
  43 + // TODO @ljlleo 可以链式赋值,简化成一行;
  44 + CrmBusinessStatusTypeRespVO result = convert(bean);
  45 + result.setStatusList(statusList);
  46 + return result;
  47 + }
33 48  
34 49 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contact/ContactConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.contact;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
4 5 import cn.iocoder.yudao.module.crm.controller.admin.contact.vo.*;
5   -import cn.iocoder.yudao.module.crm.dal.dataobject.contact.ContactDO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
  7 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
6 8 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
  9 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
7 10 import org.mapstruct.Mapper;
8 11 import org.mapstruct.Mapping;
9 12 import org.mapstruct.Mappings;
10 13 import org.mapstruct.factory.Mappers;
11 14  
12 15 import java.util.List;
  16 +import java.util.Map;
  17 +import java.util.stream.Collectors;
13 18  
  19 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  20 +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
  21 +
  22 +// TODO 芋艿:convert 后面在梳理下,略微有点乱
14 23 /**
15   - * crm联系人 Convert
  24 + * CRM 联系人 Convert
16 25 *
17 26 * @author 芋道源码
18 27 */
... ... @@ -21,19 +30,23 @@ public interface ContactConvert {
21 30  
22 31 ContactConvert INSTANCE = Mappers.getMapper(ContactConvert.class);
23 32  
24   - ContactDO convert(ContactCreateReqVO bean);
  33 + CrmContactDO convert(CrmContactCreateReqVO bean);
25 34  
26   - ContactDO convert(ContactUpdateReqVO bean);
  35 + CrmContactDO convert(CrmContactUpdateReqVO bean);
27 36  
28   - ContactRespVO convert(ContactDO bean);
  37 + CrmContactRespVO convert(CrmContactDO bean);
29 38  
30   - List<ContactRespVO> convertList(List<ContactDO> list);
  39 + List<CrmContactRespVO> convertList(List<CrmContactDO> list);
31 40  
32   - PageResult<ContactRespVO> convertPage(PageResult<ContactDO> page);
  41 + PageResult<CrmContactRespVO> convertPage(PageResult<CrmContactDO> page);
33 42  
34   - List<ContactExcelVO> convertList02(List<ContactDO> list);
  43 + default PageResult<CrmContactRespVO> convertPage(PageResult<CrmContactDO> pageResult, Map<Long, AdminUserRespDTO> userMap,
  44 + List<CrmCustomerDO> customerList, List<CrmContactDO> parentContactList) {
  45 + List<CrmContactRespVO> list = converList(pageResult.getList(), userMap, customerList, parentContactList);
  46 + return convertPage(pageResult).setList(list);
  47 + }
35 48  
36   - List<ContactSimpleRespVO> convertAllList(List<ContactDO> list);
  49 + List<CrmContactSimpleRespVO> convertAllList(List<CrmContactDO> list);
37 50  
38 51 @Mappings({
39 52 @Mapping(target = "bizId", source = "reqVO.id"),
... ... @@ -41,4 +54,54 @@ public interface ContactConvert {
41 54 })
42 55 CrmPermissionTransferReqBO convert(CrmContactTransferReqVO reqVO, Long userId);
43 56  
  57 + /**
  58 + * 转换详情信息
  59 + *
  60 + * @param contactDO 联系人
  61 + * @param userMap 用户列表
  62 + * @param crmCustomerDOList 客户
  63 + * @return ContactRespVO
  64 + */
  65 + default CrmContactRespVO convert(CrmContactDO contactDO, Map<Long, AdminUserRespDTO> userMap, List<CrmCustomerDO> crmCustomerDOList,
  66 + List<CrmContactDO> contactList) {
  67 + CrmContactRespVO contactVO = convert(contactDO);
  68 + setUserInfo(contactVO, userMap);
  69 + Map<Long, CrmCustomerDO> ustomerMap = crmCustomerDOList.stream().collect(Collectors.toMap(CrmCustomerDO::getId, v -> v));
  70 + Map<Long, CrmContactDO> contactMap = contactList.stream().collect(Collectors.toMap(CrmContactDO::getId, v -> v));
  71 + findAndThen(ustomerMap, contactDO.getCustomerId(), customer -> contactVO.setCustomerName(customer.getName()));
  72 + findAndThen(contactMap, contactDO.getParentId(), contact -> contactVO.setParentName(contact.getName()));
  73 + return contactVO;
  74 + }
  75 +
  76 + default List<CrmContactRespVO> converList(List<CrmContactDO> contactList, Map<Long, AdminUserRespDTO> userMap,
  77 + List<CrmCustomerDO> customerList, List<CrmContactDO> parentContactList) {
  78 + List<CrmContactRespVO> result = convertList(contactList);
  79 + Map<Long, CrmContactDO> parentContactMap = convertMap(parentContactList, CrmContactDO::getId);
  80 + Map<Long, CrmCustomerDO> customerMap = convertMap(customerList, CrmCustomerDO::getId);
  81 + result.forEach(item -> {
  82 + setUserInfo(item, userMap);
  83 + findAndThen(customerMap, item.getCustomerId(), customer -> { // TODO @zyna:这里的 { 可以去掉
  84 + item.setCustomerName(customer.getName());
  85 + });
  86 + findAndThen(parentContactMap, item.getParentId(), contactDO -> { // TODO @zyna:这里的 { 可以去掉
  87 + item.setParentName(contactDO.getName());
  88 + });
  89 + });
  90 + return result;
  91 + }
  92 +
  93 + /**
  94 + * 设置用户信息
  95 + *
  96 + * @param contactRespVO 联系人Response VO
  97 + * @param userMap 用户信息 map
  98 + */
  99 + static void setUserInfo(CrmContactRespVO contactRespVO, Map<Long, AdminUserRespDTO> userMap) {
  100 + contactRespVO.setAreaName(AreaUtils.format(contactRespVO.getAreaId()));
  101 + findAndThen(userMap, contactRespVO.getOwnerUserId(), user -> {
  102 + contactRespVO.setOwnerUserName(user == null ? "" : user.getNickname());
  103 + });
  104 + findAndThen(userMap, Long.parseLong(contactRespVO.getCreator()), user -> contactRespVO.setCreatorName(user.getNickname()));
  105 + }
  106 +
44 107 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/contract/ContractConvert.java
... ... @@ -2,14 +2,20 @@ package cn.iocoder.yudao.module.crm.convert.contract;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.module.crm.controller.admin.contract.vo.*;
5   -import cn.iocoder.yudao.module.crm.dal.dataobject.contract.ContractDO;
  5 +import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
  6 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
6 7 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
  8 +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
7 9 import org.mapstruct.Mapper;
8 10 import org.mapstruct.Mapping;
9 11 import org.mapstruct.Mappings;
10 12 import org.mapstruct.factory.Mappers;
11 13  
12 14 import java.util.List;
  15 +import java.util.Map;
  16 +
  17 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  18 +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
13 19  
14 20 /**
15 21 * 合同 Convert
... ... @@ -21,17 +27,17 @@ public interface ContractConvert {
21 27  
22 28 ContractConvert INSTANCE = Mappers.getMapper(ContractConvert.class);
23 29  
24   - ContractDO convert(ContractCreateReqVO bean);
  30 + CrmContractDO convert(CrmContractCreateReqVO bean);
25 31  
26   - ContractDO convert(ContractUpdateReqVO bean);
  32 + CrmContractDO convert(CrmContractUpdateReqVO bean);
27 33  
28   - ContractRespVO convert(ContractDO bean);
  34 + ContractRespVO convert(CrmContractDO bean);
29 35  
30   - List<ContractRespVO> convertList(List<ContractDO> list);
  36 + List<ContractRespVO> convertList(List<CrmContractDO> list);
31 37  
32   - PageResult<ContractRespVO> convertPage(PageResult<ContractDO> page);
  38 + PageResult<ContractRespVO> convertPage(PageResult<CrmContractDO> page);
33 39  
34   - List<ContractExcelVO> convertList02(List<ContractDO> list);
  40 + List<CrmContractExcelVO> convertList02(List<CrmContractDO> list);
35 41  
36 42 @Mappings({
37 43 @Mapping(target = "bizId", source = "reqVO.id"),
... ... @@ -39,4 +45,25 @@ public interface ContractConvert {
39 45 })
40 46 CrmPermissionTransferReqBO convert(CrmContractTransferReqVO reqVO, Long userId);
41 47  
  48 + default PageResult<ContractRespVO> convertPage(PageResult<CrmContractDO> pageResult, Map<Long, AdminUserRespDTO> userMap,
  49 + List<CrmCustomerDO> customerList) {
  50 + return new PageResult<>(converList(pageResult.getList(), userMap, customerList), pageResult.getTotal());
  51 + }
  52 +
  53 + default List<ContractRespVO> converList(List<CrmContractDO> contractList, Map<Long, AdminUserRespDTO> userMap,
  54 + List<CrmCustomerDO> customerList) {
  55 + List<ContractRespVO> result = convertList(contractList);
  56 + Map<Long, CrmCustomerDO> customerMap = convertMap(customerList, CrmCustomerDO::getId);
  57 + result.forEach(item -> {
  58 + setUserInfo(item, userMap);
  59 + findAndThen(customerMap, item.getCustomerId(), customer -> item.setCustomerName(customer.getName()));
  60 + });
  61 + return result;
  62 + }
  63 +
  64 + static void setUserInfo(ContractRespVO contract, Map<Long, AdminUserRespDTO> userMap) {
  65 + findAndThen(userMap, contract.getOwnerUserId(), user -> contract.setOwnerUserName(user.getNickname()));
  66 + findAndThen(userMap, Long.parseLong(contract.getCreator()), user -> contract.setCreatorName(user.getNickname()));
  67 + }
  68 +
42 69 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.customer;
2 2  
3   -import cn.hutool.core.util.NumberUtil;
4 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
6 4 import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
7 5 import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigRespVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.poolconfig.CrmCustomerPoolConfigSaveReqVO;
8 8 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
9 9 import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerPoolConfigDO;
10   -import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
11 10 import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionTransferReqBO;
12 11 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
13 12 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
... ... @@ -37,38 +36,20 @@ public interface CrmCustomerConvert {
37 36  
38 37 CrmCustomerRespVO convert(CrmCustomerDO bean);
39 38  
40   - default CrmCustomerRespVO convert(CrmCustomerDO customer, Map<Long, CrmPermissionDO> ownerMap,
41   - Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) {
42   - CrmCustomerRespVO customerResp = convert(customer);
43   - findAndThen(ownerMap, customerResp.getId(), owner -> {
44   - customerResp.setOwnerUserId(owner.getUserId());
45   - customerResp.setAreaName(AreaUtils.format(customerResp.getAreaId()));
46   - findAndThen(userMap, owner.getUserId(), user -> {
47   - customerResp.setOwnerUserName(user.getNickname());
48   - });
49   - findAndThen(userMap, Long.parseLong(customerResp.getCreator()), user -> {
50   - customerResp.setCreatorName(user.getNickname());
51   - });
52   - findAndThen(deptMap, customerResp.getOwnerUserId(), dept -> {
53   - customerResp.setOwnerUserDeptName(dept.getName());
54   - });
55   - });
56   - return customerResp;
57   - }
58   -
59   - default PageResult<CrmCustomerRespVO> convertPage(PageResult<CrmCustomerDO> page, Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) {
60   - PageResult<CrmCustomerRespVO> result = convertPage(page);
61   - result.getList().forEach(customerRespVO -> {
62   - customerRespVO.setAreaName(AreaUtils.format(customerRespVO.getAreaId()));
63   - MapUtils.findAndThen(userMap, NumberUtil.parseLong(customerRespVO.getCreator()), creator ->
64   - customerRespVO.setCreatorName(creator.getNickname()));
65   - MapUtils.findAndThen(userMap, customerRespVO.getOwnerUserId(), ownerUser -> {
66   - customerRespVO.setOwnerUserName(ownerUser.getNickname());
67   - MapUtils.findAndThen(deptMap, ownerUser.getDeptId(), dept ->
68   - customerRespVO.setOwnerUserDeptName(dept.getName()));
69   - });
  39 + /**
  40 + * 设置用户信息
  41 + *
  42 + * @param customer CRM 客户 Response VO
  43 + * @param userMap 用户信息 map
  44 + * @param deptMap 用户部门信息 map
  45 + */
  46 + static void setUserInfo(CrmCustomerRespVO customer, Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) {
  47 + customer.setAreaName(AreaUtils.format(customer.getAreaId()));
  48 + findAndThen(userMap, customer.getOwnerUserId(), user -> {
  49 + customer.setOwnerUserName(user.getNickname());
  50 + findAndThen(deptMap, user.getDeptId(), dept -> customer.setOwnerUserDeptName(dept.getName()));
70 51 });
71   - return result;
  52 + findAndThen(userMap, Long.parseLong(customer.getCreator()), user -> customer.setCreatorName(user.getNickname()));
72 53 }
73 54  
74 55 List<CrmCustomerExcelVO> convertList02(List<CrmCustomerDO> list);
... ... @@ -81,30 +62,24 @@ public interface CrmCustomerConvert {
81 62  
82 63 PageResult<CrmCustomerRespVO> convertPage(PageResult<CrmCustomerDO> page);
83 64  
84   - // TODO @puhui999:两个 convertPage 的逻辑,合并下;
85   - default PageResult<CrmCustomerRespVO> convertPage(PageResult<CrmCustomerDO> pageResult, Map<Long, CrmPermissionDO> ownerMap,
86   - Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) {
  65 + default CrmCustomerRespVO convert(CrmCustomerDO customer, Map<Long, AdminUserRespDTO> userMap,
  66 + Map<Long, DeptRespDTO> deptMap) {
  67 + CrmCustomerRespVO customerResp = convert(customer);
  68 + setUserInfo(customerResp, userMap, deptMap);
  69 + return customerResp;
  70 + }
  71 +
  72 + default PageResult<CrmCustomerRespVO> convertPage(PageResult<CrmCustomerDO> pageResult, Map<Long, AdminUserRespDTO> userMap,
  73 + Map<Long, DeptRespDTO> deptMap) {
87 74 PageResult<CrmCustomerRespVO> result = convertPage(pageResult);
88   - result.getList().forEach(item -> {
89   - findAndThen(ownerMap, item.getId(), owner -> {
90   - item.setOwnerUserId(owner.getUserId());
91   - item.setAreaName(AreaUtils.format(item.getAreaId()));
92   - findAndThen(userMap, owner.getUserId(), user -> {
93   - item.setOwnerUserName(user.getNickname());
94   - });
95   - findAndThen(userMap, Long.parseLong(item.getCreator()), user -> {
96   - item.setCreatorName(user.getNickname());
97   - });
98   - findAndThen(deptMap, item.getOwnerUserId(), dept -> {
99   - item.setOwnerUserDeptName(dept.getName());
100   - });
101   - });
102   - });
  75 + result.getList().forEach(item -> setUserInfo(item, userMap, deptMap));
103 76 return result;
104 77 }
105 78  
106 79 CrmCustomerPoolConfigRespVO convert(CrmCustomerPoolConfigDO customerPoolConfig);
107 80  
108   - CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigUpdateReqVO updateReqVO);
  81 + CrmCustomerPoolConfigDO convert(CrmCustomerPoolConfigSaveReqVO updateReqVO);
  82 +
  83 + List<CrmCustomerQueryAllRespVO> convertQueryAll(List<CrmCustomerDO> crmCustomerDO);
109 84  
110 85 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/customer/CrmCustomerLimitConfigConvert.java
1 1 package cn.iocoder.yudao.module.crm.convert.customer;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigCreateReqVO;
5   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigRespVO;
6   -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerLimitConfigUpdateReqVO;
7   -import cn.iocoder.yudao.module.crm.dal.dataobject.customerlimitconfig.CrmCustomerLimitConfigDO;
  4 +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  5 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigCreateReqVO;
  6 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigRespVO;
  7 +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.limitconfig.CrmCustomerLimitConfigUpdateReqVO;
  8 +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerLimitConfigDO;
8 9 import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
9 10 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
10 11 import org.mapstruct.Mapper;
... ... @@ -12,8 +13,6 @@ import org.mapstruct.factory.Mappers;
12 13  
13 14 import java.util.List;
14 15 import java.util.Map;
15   -import java.util.Objects;
16   -import java.util.stream.Collectors;
17 16  
18 17 /**
19 18 * 客户限制配置 Convert
... ... @@ -54,14 +53,11 @@ public interface CrmCustomerLimitConfigConvert {
54 53 *
55 54 * @param userMap 用户映射
56 55 * @param deptMap 部门映射
57   - * @param respVo 响应实体
  56 + * @param respVo 响应实体
58 57 */
59 58 static void fillNameField(Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap, CrmCustomerLimitConfigRespVO respVo) {
60   - // TODO wanwan:返回 list,具体怎么拼接叫给前端;
61   - respVo.setUserNames(respVo.getUserIds().stream().map(userMap::get)
62   - .filter(Objects::nonNull).map(AdminUserRespDTO::getNickname).collect(Collectors.joining(",")));
63   - respVo.setDeptNames(respVo.getDeptIds().stream().map(deptMap::get)
64   - .filter(Objects::nonNull).map(DeptRespDTO::getName).collect(Collectors.joining(",")));
  59 + respVo.setUsers(CollectionUtils.convertList(respVo.getUserIds(), userMap::get));
  60 + respVo.setDepts(CollectionUtils.convertList(respVo.getDeptIds(), deptMap::get));
65 61 }
66 62  
67 63 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/convert/permission/CrmPermissionConvert.java
... ... @@ -15,14 +15,15 @@ import com.google.common.collect.Multimaps;
15 15 import org.mapstruct.Mapper;
16 16 import org.mapstruct.factory.Mappers;
17 17  
18   -import java.util.ArrayList;
19 18 import java.util.List;
20 19 import java.util.Map;
21 20  
  21 +import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
  22 +
22 23 /**
23 24 * Crm 数据权限 Convert
24 25 *
25   - * @author Wanwan
  26 + * @author HUIHUI
26 27 */
27 28 @Mapper
28 29 public interface CrmPermissionConvert {
... ... @@ -43,9 +44,9 @@ public interface CrmPermissionConvert {
43 44 Map<Long, DeptRespDTO> deptMap, Map<Long, PostRespDTO> postMap) {
44 45 Map<Long, AdminUserRespDTO> userMap = CollectionUtils.convertMap(userList, AdminUserRespDTO::getId);
45 46 return CollectionUtils.convertList(convert(permission), item -> {
46   - MapUtils.findAndThen(userMap, item.getId(), user -> {
  47 + findAndThen(userMap, item.getUserId(), user -> {
47 48 item.setNickname(user.getNickname());
48   - MapUtils.findAndThen(deptMap, user.getDeptId(), deptRespDTO -> {
  49 + findAndThen(deptMap, user.getDeptId(), deptRespDTO -> {
49 50 item.setDeptName(deptRespDTO.getName());
50 51 });
51 52 List<PostRespDTO> postRespList = MapUtils.getList(Multimaps.forMap(postMap), user.getPostIds());
... ... @@ -56,12 +57,10 @@ public interface CrmPermissionConvert {
56 57 }
57 58  
58 59 default List<CrmPermissionDO> convertList(CrmPermissionUpdateReqVO updateReqVO) {
59   - // TODO @puhui999:CollectionUtils.convert
60   - List<CrmPermissionDO> permissions = new ArrayList<>();
61   - updateReqVO.getIds().forEach(id -> {
62   - permissions.add(new CrmPermissionDO().setId(id).setLevel(updateReqVO.getLevel()));
63   - });
64   - return permissions;
  60 + return CollectionUtils.convertList(updateReqVO.getIds(),
  61 + id -> new CrmPermissionDO().setId(id).setLevel(updateReqVO.getLevel()));
65 62 }
66 63  
  64 + List<CrmPermissionDO> convertList(List<CrmPermissionCreateReqBO> list);
  65 +
67 66 }
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessDO.java
1 1 package cn.iocoder.yudao.module.crm.dal.dataobject.business;
2 2  
3 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4   -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus.CrmBusinessStatusDO;
5   -import cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype.CrmBusinessStatusTypeDO;
6 4 import com.baomidou.mybatisplus.annotation.KeySequence;
7 5 import com.baomidou.mybatisplus.annotation.TableId;
8 6 import com.baomidou.mybatisplus.annotation.TableName;
... ... @@ -71,8 +69,7 @@ public class CrmBusinessDO extends BaseDO {
71 69 */
72 70 private Integer discountPercent;
73 71 /**
74   - * 产品总金额
75   - *
  72 + * 产品总金额,单位:分
76 73 */
77 74 private Integer productPrice;
78 75 /**
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/businessstatus/CrmBusinessStatusDO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusDO.java
1   -package cn.iocoder.yudao.module.crm.dal.dataobject.businessstatus;
  1 +package cn.iocoder.yudao.module.crm.dal.dataobject.business;
2 2  
3 3 import com.baomidou.mybatisplus.annotation.KeySequence;
4 4 import com.baomidou.mybatisplus.annotation.TableId;
... ... @@ -27,7 +27,7 @@ public class CrmBusinessStatusDO {
27 27 /**
28 28 * 状态类型编号
29 29 *
30   - * // TODO @ljlleo:要写下关联字段噢
  30 + * 关联 {@link CrmBusinessStatusTypeDO#getId()}
31 31 */
32 32 private Long typeId;
33 33 /**
... ... @@ -36,6 +36,8 @@ public class CrmBusinessStatusDO {
36 36 private String name;
37 37 /**
38 38 * 赢单率
  39 + *
  40 + * TODO 这里是不是改成 Integer 存储,百分比 * 100 ;
39 41 */
40 42 private String percent;
41 43 /**
... ...
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/businessstatustype/CrmBusinessStatusTypeDO.java renamed to yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/business/CrmBusinessStatusTypeDO.java
1   -package cn.iocoder.yudao.module.crm.dal.dataobject.businessstatustype;
  1 +package cn.iocoder.yudao.module.crm.dal.dataobject.business;
2 2  
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
3 5 import com.baomidou.mybatisplus.annotation.KeySequence;
  6 +import com.baomidou.mybatisplus.annotation.TableField;
4 7 import com.baomidou.mybatisplus.annotation.TableId;
5 8 import com.baomidou.mybatisplus.annotation.TableName;
6 9 import lombok.*;
7 10  
  11 +import java.util.List;
  12 +
8 13 /**
9 14 * 商机状态类型 DO
10 15 *
11 16 * @author ljlleo
12 17 */
13   -@TableName("crm_business_status_type")
  18 +@TableName(value = "crm_business_status_type", autoResultMap = true)
14 19 @KeySequence("crm_business_status_type_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
15 20 @Data
  21 +@EqualsAndHashCode(callSuper = true)
16 22 @ToString(callSuper = true)
17 23 @Builder
18 24 @NoArgsConstructor
19 25 @AllArgsConstructor
20   -public class CrmBusinessStatusTypeDO {
  26 +public class CrmBusinessStatusTypeDO extends BaseDO {
21 27  
22 28 /**
23 29 * 主键
... ... @@ -28,15 +34,16 @@ public class CrmBusinessStatusTypeDO {
28 34 * 状态类型名
29 35 */
30 36 private String name;
31   - // TODO @ljlleo:List 存储哈
32 37 /**
33 38 * 使用的部门编号
34 39 */
35   - private String deptIds;
  40 + @TableField(typeHandler = LongListTypeHandler.class)
  41 + private List<Long> deptIds;
36 42 /**
37 43 * 开启状态
  44 + *
  45 + * TODO 改成 Integer,关联 CommonStatus
38 46 */
39   - // TODO @ljlleo:这个字段,使用 Integer,对应 CommonStatus
40 47 private Boolean status;
41 48  
42 49 }
... ...