Commit fe50356ae8cedc4ffacdcc87aca00e56535b4e4d
1 parent
0657c357
code review:crm 客户模块的实现
Showing
11 changed files
with
44 additions
and
172 deletions
sql/mysql/crm.sql
| @@ -185,45 +185,7 @@ CREATE TABLE `crm_contact` ( | @@ -185,45 +185,7 @@ CREATE TABLE `crm_contact` ( | ||
| 185 | PRIMARY KEY (`id`) | 185 | PRIMARY KEY (`id`) |
| 186 | ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='crm联系人'; | 186 | ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='crm联系人'; |
| 187 | 187 | ||
| 188 | --- ---------------------------- | ||
| 189 | --- 客户表 | ||
| 190 | --- ---------------------------- | ||
| 191 | -DROP TABLE IF EXISTS `crm_customer`; | ||
| 192 | -CREATE TABLE `crm_customer` ( | ||
| 193 | - `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号,主键自增', | ||
| 194 | - `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '客户名称', | ||
| 195 | - `follow_up_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '跟进状态', | ||
| 196 | - `lock_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '锁定状态', | ||
| 197 | - `deal_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '成交状态', | ||
| 198 | - `industry_id` int NULL DEFAULT NULL COMMENT '所属行业', | ||
| 199 | - `level` int NULL DEFAULT NULL COMMENT '客户等级', | ||
| 200 | - `source` int NULL DEFAULT NULL COMMENT '客户来源', | ||
| 201 | - `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '手机', | ||
| 202 | - `telephone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '电话', | ||
| 203 | - `website` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '网址', | ||
| 204 | - `qq` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'QQ', | ||
| 205 | - `wechat` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '微信', | ||
| 206 | - `email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '邮箱', | ||
| 207 | - `description` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '客户描述', | ||
| 208 | - `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '备注', | ||
| 209 | - `owner_user_id` bigint NULL DEFAULT NULL COMMENT '负责人的用户编号', | ||
| 210 | - `ro_user_ids` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '只读权限的用户编号数组', | ||
| 211 | - `rw_user_ids` varchar(4096) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '读写权限的用户编号数组', | ||
| 212 | - `area_id` bigint NULL DEFAULT NULL COMMENT '地区编号', | ||
| 213 | - `detail_address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '详细地址', | ||
| 214 | - `longitude` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '地理位置经度', | ||
| 215 | - `latitude` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '地理位置维度', | ||
| 216 | - `contact_last_time` datetime NULL DEFAULT NULL COMMENT '最后跟进时间', | ||
| 217 | - `contact_next_time` datetime NULL DEFAULT NULL COMMENT '下次联系时间', | ||
| 218 | - `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', | ||
| 219 | - `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', | ||
| 220 | - `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者', | ||
| 221 | - `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', | ||
| 222 | - `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', | ||
| 223 | - `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号', | ||
| 224 | - PRIMARY KEY (`id`) USING BTREE, | ||
| 225 | - INDEX `owner_user_id`(`owner_user_id`) USING BTREE | ||
| 226 | -) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '客户表' ROW_FORMAT = Dynamic; | 188 | + |
| 227 | -- ---------------------------- | 189 | -- ---------------------------- |
| 228 | -- 商机状态表 | 190 | -- 商机状态表 |
| 229 | -- ---------------------------- | 191 | -- ---------------------------- |
sql/mysql/crm_data.sql
| @@ -18,41 +18,3 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st | @@ -18,41 +18,3 @@ INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `st | ||
| 18 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1401, 8, '其他', '8', 'crm_return_type', 0, 'default', '', '', '1', '2023-10-18 21:56:06', '1', '2023-10-18 21:56:06', b'0'); | 18 | INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1401, 8, '其他', '8', 'crm_return_type', 0, 'default', '', '', '1', '2023-10-18 21:56:06', '1', '2023-10-18 21:56:06', b'0'); |
| 19 | 19 | ||
| 20 | 20 | ||
| 21 | - | ||
| 22 | -INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (188, '客户来源', 'crm_customer_source', 0, 'CRM 客户来源', '1', '2023-10-28 23:00:34', '1', '2023-10-28 15:11:16', b'0', NULL); | ||
| 23 | -INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (187, '客户等级', 'crm_customer_level', 0, 'CRM 客户等级', '1', '2023-10-28 22:59:12', '1', '2023-10-28 15:11:16', b'0', NULL); | ||
| 24 | -INSERT INTO `system_dict_type` (`id`, `name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `deleted_time`) VALUES (186, '客户所属行业', 'crm_customer_industry', 0, 'CRM 客户所属行业', '1', '2023-10-28 22:57:07', '1', '2023-10-28 15:11:16', b'0', NULL); | ||
| 25 | - | ||
| 26 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1434, 10, '邮件咨询', '10', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:33', '1', '2023-10-28 23:10:33', b'0'); | ||
| 27 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1433, 9, '电话咨询', '9', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:18', '1', '2023-10-28 23:10:18', b'0'); | ||
| 28 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1432, 8, '陌拜', '8', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:10:04', '1', '2023-10-28 23:10:04', b'0'); | ||
| 29 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1431, 7, '预约上门', '7', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:39', '1', '2023-10-28 23:09:39', b'0'); | ||
| 30 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1430, 6, '线上咨询', '6', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:22', '1', '2023-10-28 23:09:22', b'0'); | ||
| 31 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1429, 5, '线上注册', '5', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:09:12', '1', '2023-10-28 23:09:12', b'0'); | ||
| 32 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1428, 4, '转介绍', '4', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:58', '1', '2023-10-28 23:08:58', b'0'); | ||
| 33 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1427, 3, '广告', '3', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:47', '1', '2023-10-28 23:08:47', b'0'); | ||
| 34 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1426, 2, '搜索引擎', '2', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:39', '1', '2023-10-28 23:08:39', b'0'); | ||
| 35 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1425, 1, '促销', '1', 'crm_customer_source', 0, 'default', '', '', '1', '2023-10-28 23:08:29', '1', '2023-10-28 23:08:29', b'0'); | ||
| 36 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1424, 3, 'C (非优先客户)', '3', 'crm_customer_level', 0, 'default', '', '', '1', '2023-10-28 23:07:53', '1', '2023-10-28 23:07:53', b'0'); | ||
| 37 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1423, 2, 'B (普通客户)', '2', 'crm_customer_level', 0, 'info', '', '', '1', '2023-10-28 23:07:35', '1', '2023-10-28 23:07:35', b'0'); | ||
| 38 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1422, 1, 'A (重点客户)', '1', 'crm_customer_level', 0, 'primary', '', '', '1', '2023-10-28 23:07:13', '1', '2023-10-28 23:07:13', b'0'); | ||
| 39 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1421, 20, 'T 国际组织', '20', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:06:15', '1', '2023-10-28 23:06:15', b'0'); | ||
| 40 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1420, 19, 'S 公共管理、社会保障和社会组织', '19', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:06:05', '1', '2023-10-28 23:06:05', b'0'); | ||
| 41 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1419, 18, 'R 文化、体育和娱乐业', '18', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:05:55', '1', '2023-10-28 23:05:55', b'0'); | ||
| 42 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1418, 17, 'Q 卫生和社会工作', '17', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:05:44', '1', '2023-10-28 23:05:44', b'0'); | ||
| 43 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1417, 16, 'P 教育', '16', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:05:15', '1', '2023-10-28 23:05:15', b'0'); | ||
| 44 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1416, 15, 'O 居民服务、修理和其他服务业', '15', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:05:05', '1', '2023-10-28 23:05:05', b'0'); | ||
| 45 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1415, 14, 'N 水利、环境和公共设施管理业', '14', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:04:53', '1', '2023-10-28 23:04:53', b'0'); | ||
| 46 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1414, 13, 'M 科学研究和技术服务业', '13', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:04:43', '1', '2023-10-28 23:04:43', b'0'); | ||
| 47 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1413, 12, 'L 租赁和商务服务业', '12', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:04:33', '1', '2023-10-28 23:04:33', b'0'); | ||
| 48 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1412, 11, 'K 房地产业', '11', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:04:15', '1', '2023-10-28 23:04:22', b'0'); | ||
| 49 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1411, 10, 'J 金融业', '10', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:57', '1', '2023-10-28 23:03:57', b'0'); | ||
| 50 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1410, 9, 'I 信息传输、软件和信息技术服务业', '9', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:47', '1', '2023-10-28 23:03:47', b'0'); | ||
| 51 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1409, 8, 'H 住宿和餐饮业', '8', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:37', '1', '2023-10-28 23:03:37', b'0'); | ||
| 52 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1408, 7, 'G 交通运输、仓储和邮政业', '7', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:27', '1', '2023-10-28 23:03:27', b'0'); | ||
| 53 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1407, 6, 'F 批发和零售业', '6', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:13', '1', '2023-10-28 23:03:13', b'0'); | ||
| 54 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1406, 5, 'E 建筑业', '5', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:03:03', '1', '2023-10-28 23:03:03', b'0'); | ||
| 55 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1405, 4, 'D 电力、热力、燃气及水生产和供应业', '4', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:54', '1', '2023-10-28 23:02:54', b'0'); | ||
| 56 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1404, 3, 'C 制造业', '3', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:41', '1', '2023-10-28 23:02:41', b'0'); | ||
| 57 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1403, 2, 'B 采矿业', '2', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:29', '1', '2023-10-28 23:02:29', b'0'); | ||
| 58 | -INSERT INTO `system_dict_data` (`id`, `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1402, 1, 'A 农、林、牧、渔业', '1', 'crm_customer_industry', 0, 'default', '', '', '1', '2023-10-28 23:02:15', '1', '2023-10-28 23:02:15', b'0'); | ||
| 59 | \ No newline at end of file | 21 | \ No newline at end of file |
sql/mysql/crm_menu.sql
| @@ -233,13 +233,6 @@ VALUES ( | @@ -233,13 +233,6 @@ VALUES ( | ||
| 233 | '', '', '', 0 | 233 | '', '', '', 0 |
| 234 | ); | 234 | ); |
| 235 | 235 | ||
| 236 | - | ||
| 237 | --- ---------------------------- | ||
| 238 | --- 客户管理菜单 | ||
| 239 | --- ---------------------------- | ||
| 240 | -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2375, '客户管理', '', 1, 0, 0, '/crm', 'ep:avatar', '', '', 0, b'1', b'1', b'1', '1', '2023-10-20 00:36:13', '1', '2023-10-19 16:37:24', b'0'); | ||
| 241 | - | ||
| 242 | - | ||
| 243 | -- ---------------------------- | 236 | -- ---------------------------- |
| 244 | -- 回款菜单 | 237 | -- 回款菜单 |
| 245 | -- ---------------------------- | 238 | -- ---------------------------- |
| @@ -360,63 +353,3 @@ VALUES ( | @@ -360,63 +353,3 @@ VALUES ( | ||
| 360 | '回款计划导出', 'crm:receivable-plan:export', 3, 5, @parentId, | 353 | '回款计划导出', 'crm:receivable-plan:export', 3, 5, @parentId, |
| 361 | '', '', '', 0 | 354 | '', '', '', 0 |
| 362 | ); | 355 | ); |
| 363 | - | ||
| 364 | --- ---------------------------- | ||
| 365 | --- 客户管理菜单 | ||
| 366 | --- ---------------------------- | ||
| 367 | - | ||
| 368 | --- 菜单 SQL | ||
| 369 | -INSERT INTO system_menu( | ||
| 370 | - name, permission, type, sort, parent_id, | ||
| 371 | - path, icon, component, status, component_name | ||
| 372 | -) | ||
| 373 | -VALUES ( | ||
| 374 | - '客户管理', '', 2, 0, 2375, | ||
| 375 | - 'customer', '', 'crm/customer/index', 0, 'CrmCustomer' | ||
| 376 | -); | ||
| 377 | - | ||
| 378 | --- 按钮父菜单ID | ||
| 379 | --- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码 | ||
| 380 | -SELECT @parentId := LAST_INSERT_ID(); | ||
| 381 | - | ||
| 382 | --- 按钮 SQL | ||
| 383 | -INSERT INTO system_menu( | ||
| 384 | - name, permission, type, sort, parent_id, | ||
| 385 | - path, icon, component, status | ||
| 386 | -) | ||
| 387 | -VALUES ( | ||
| 388 | - '客户查询', 'crm:customer:query', 3, 1, @parentId, | ||
| 389 | - '', '', '', 0 | ||
| 390 | -); | ||
| 391 | -INSERT INTO system_menu( | ||
| 392 | - name, permission, type, sort, parent_id, | ||
| 393 | - path, icon, component, status | ||
| 394 | -) | ||
| 395 | -VALUES ( | ||
| 396 | - '客户创建', 'crm:customer:create', 3, 2, @parentId, | ||
| 397 | - '', '', '', 0 | ||
| 398 | -); | ||
| 399 | -INSERT INTO system_menu( | ||
| 400 | - name, permission, type, sort, parent_id, | ||
| 401 | - path, icon, component, status | ||
| 402 | -) | ||
| 403 | -VALUES ( | ||
| 404 | - '客户更新', 'crm:customer:update', 3, 3, @parentId, | ||
| 405 | - '', '', '', 0 | ||
| 406 | -); | ||
| 407 | -INSERT INTO system_menu( | ||
| 408 | - name, permission, type, sort, parent_id, | ||
| 409 | - path, icon, component, status | ||
| 410 | -) | ||
| 411 | -VALUES ( | ||
| 412 | - '客户删除', 'crm:customer:delete', 3, 4, @parentId, | ||
| 413 | - '', '', '', 0 | ||
| 414 | -); | ||
| 415 | -INSERT INTO system_menu( | ||
| 416 | - name, permission, type, sort, parent_id, | ||
| 417 | - path, icon, component, status | ||
| 418 | -) | ||
| 419 | -VALUES ( | ||
| 420 | - '客户导出', 'crm:customer:export', 3, 5, @parentId, | ||
| 421 | - '', '', '', 0 | ||
| 422 | -); |
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/DictTypeConstants.java
yudao-module-crm/yudao-module-crm-api/src/main/java/cn/iocoder/yudao/module/crm/enums/customer/CrmCustomerLevelEnum.java
| @@ -15,12 +15,13 @@ import java.util.Arrays; | @@ -15,12 +15,13 @@ import java.util.Arrays; | ||
| 15 | @AllArgsConstructor | 15 | @AllArgsConstructor |
| 16 | public enum CrmCustomerLevelEnum implements IntArrayValuable { | 16 | public enum CrmCustomerLevelEnum implements IntArrayValuable { |
| 17 | 17 | ||
| 18 | - IMPORTANT(1, "A (重点客户)"), | ||
| 19 | - GENERAL(2, "B (普通客户)"), | ||
| 20 | - LOW_PRIORITY(3, "C (非优先客户)"); | 18 | + IMPORTANT(1, "A(重点客户)"), |
| 19 | + GENERAL(2, "B(普通客户)"), | ||
| 20 | + LOW_PRIORITY(3, "C(非优先客户)"); | ||
| 21 | 21 | ||
| 22 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmCustomerLevelEnum::getStatus).toArray(); | 22 | public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CrmCustomerLevelEnum::getStatus).toArray(); |
| 23 | 23 | ||
| 24 | + // TODO @wanwan:这里的 status 字段,可以考虑改成 level | ||
| 24 | /** | 25 | /** |
| 25 | * 状态 | 26 | * 状态 |
| 26 | */ | 27 | */ |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerBaseVO.java
| @@ -10,7 +10,6 @@ import org.springframework.format.annotation.DateTimeFormat; | @@ -10,7 +10,6 @@ import org.springframework.format.annotation.DateTimeFormat; | ||
| 10 | 10 | ||
| 11 | import javax.validation.constraints.Email; | 11 | import javax.validation.constraints.Email; |
| 12 | import javax.validation.constraints.NotEmpty; | 12 | import javax.validation.constraints.NotEmpty; |
| 13 | -import javax.validation.constraints.NotNull; | ||
| 14 | import javax.validation.constraints.Size; | 13 | import javax.validation.constraints.Size; |
| 15 | import java.time.LocalDateTime; | 14 | import java.time.LocalDateTime; |
| 16 | 15 | ||
| @@ -49,20 +48,20 @@ public class CrmCustomerBaseVO { | @@ -49,20 +48,20 @@ public class CrmCustomerBaseVO { | ||
| 49 | private String website; | 48 | private String website; |
| 50 | 49 | ||
| 51 | @Schema(description = "QQ", example = "123456789") | 50 | @Schema(description = "QQ", example = "123456789") |
| 52 | - @Size(max = 20, message = "QQ长度不能超过20个字符") | 51 | + @Size(max = 20, message = "QQ长度不能超过 20 个字符") |
| 53 | private String qq; | 52 | private String qq; |
| 54 | 53 | ||
| 55 | @Schema(description = "wechat", example = "123456789") | 54 | @Schema(description = "wechat", example = "123456789") |
| 56 | - @Size(max = 255, message = "微信长度不能超过255个字符") | 55 | + @Size(max = 255, message = "微信长度不能超过 255 个字符") |
| 57 | private String wechat; | 56 | private String wechat; |
| 58 | 57 | ||
| 59 | @Schema(description = "email", example = "123456789@qq.com") | 58 | @Schema(description = "email", example = "123456789@qq.com") |
| 60 | @Email(message = "邮箱格式不正确") | 59 | @Email(message = "邮箱格式不正确") |
| 61 | - @Size(max = 255, message = "邮箱长度不能超过255个字符") | 60 | + @Size(max = 255, message = "邮箱长度不能超过 255 个字符") |
| 62 | private String email; | 61 | private String email; |
| 63 | 62 | ||
| 64 | @Schema(description = "客户描述", example = "任意文字") | 63 | @Schema(description = "客户描述", example = "任意文字") |
| 65 | - @Size(max = 4096, message = "客户描述长度不能超过255个字符") | 64 | + @Size(max = 4096, message = "客户描述长度不能超过 4096 个字符") |
| 66 | private String description; | 65 | private String description; |
| 67 | 66 | ||
| 68 | @Schema(description = "备注", example = "随便") | 67 | @Schema(description = "备注", example = "随便") |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/controller/admin/customer/vo/CrmCustomerCreateReqVO.java
| @@ -11,4 +11,6 @@ import lombok.ToString; | @@ -11,4 +11,6 @@ import lombok.ToString; | ||
| 11 | @ToString(callSuper = true) | 11 | @ToString(callSuper = true) |
| 12 | public class CrmCustomerCreateReqVO extends CrmCustomerBaseVO { | 12 | public class CrmCustomerCreateReqVO extends CrmCustomerBaseVO { |
| 13 | 13 | ||
| 14 | + // TODO @wanwan:负责人 | ||
| 15 | + | ||
| 14 | } | 16 | } |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/dataobject/customer/CrmCustomerDO.java
| @@ -51,17 +51,20 @@ public class CrmCustomerDO extends BaseDO { | @@ -51,17 +51,20 @@ public class CrmCustomerDO extends BaseDO { | ||
| 51 | private Boolean dealStatus; | 51 | private Boolean dealStatus; |
| 52 | /** | 52 | /** |
| 53 | * 所属行业 | 53 | * 所属行业 |
| 54 | - * 对应字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_INDUSTRY} | 54 | + * |
| 55 | + * 对应字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants#CRM_CUSTOMER_INDUSTRY} | ||
| 55 | */ | 56 | */ |
| 56 | private Integer industryId; | 57 | private Integer industryId; |
| 57 | /** | 58 | /** |
| 58 | * 客户等级 | 59 | * 客户等级 |
| 59 | - * 对应字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_LEVEL} | 60 | + * |
| 61 | + * 对应字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants#CRM_CUSTOMER_LEVEL} | ||
| 60 | */ | 62 | */ |
| 61 | private Integer level; | 63 | private Integer level; |
| 62 | /** | 64 | /** |
| 63 | * 客户来源 | 65 | * 客户来源 |
| 64 | - * 对应字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants.CRM_CUSTOMER_SOURCE} | 66 | + * |
| 67 | + * 对应字典 {@link cn.iocoder.yudao.module.crm.enums.DictTypeConstants#CRM_CUSTOMER_SOURCE} | ||
| 65 | */ | 68 | */ |
| 66 | private Integer source; | 69 | private Integer source; |
| 67 | /** | 70 | /** |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/dal/mysql/customer/CrmCustomerMapper.java
| @@ -19,7 +19,7 @@ import java.util.List; | @@ -19,7 +19,7 @@ import java.util.List; | ||
| 19 | public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { | 19 | public interface CrmCustomerMapper extends BaseMapperX<CrmCustomerDO> { |
| 20 | 20 | ||
| 21 | default PageResult<CrmCustomerDO> selectPage(CrmCustomerPageReqVO reqVO) { | 21 | default PageResult<CrmCustomerDO> selectPage(CrmCustomerPageReqVO reqVO) { |
| 22 | - // TODO @Wanwan 填充负责人,所属部门字段 | 22 | + // TODO @Wanwan 填充负责人,所属部门字段;这个可以在 controller 填哈; |
| 23 | return selectPage(reqVO, new LambdaQueryWrapperX<CrmCustomerDO>() | 23 | return selectPage(reqVO, new LambdaQueryWrapperX<CrmCustomerDO>() |
| 24 | .likeIfPresent(CrmCustomerDO::getName, reqVO.getName()) | 24 | .likeIfPresent(CrmCustomerDO::getName, reqVO.getName()) |
| 25 | .eqIfPresent(CrmCustomerDO::getMobile, reqVO.getMobile()) | 25 | .eqIfPresent(CrmCustomerDO::getMobile, reqVO.getMobile()) |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerService.java
| @@ -75,8 +75,8 @@ public interface CrmCustomerService { | @@ -75,8 +75,8 @@ public interface CrmCustomerService { | ||
| 75 | /** | 75 | /** |
| 76 | * 校验客户是否存在 | 76 | * 校验客户是否存在 |
| 77 | * | 77 | * |
| 78 | - * @param customerId 客户id | ||
| 79 | - * @return | 78 | + * @param customerId 客户 id |
| 79 | + * @return 客户 | ||
| 80 | */ | 80 | */ |
| 81 | CrmCustomerDO validateCustomer(Long customerId); | 81 | CrmCustomerDO validateCustomer(Long customerId); |
| 82 | 82 |
yudao-module-crm/yudao-module-crm-biz/src/main/java/cn/iocoder/yudao/module/crm/service/customer/CrmCustomerServiceImpl.java
| 1 | package cn.iocoder.yudao.module.crm.service.customer; | 1 | package cn.iocoder.yudao.module.crm.service.customer; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.collection.CollUtil; | ||
| 4 | +import cn.hutool.core.collection.ListUtil; | ||
| 5 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 6 | +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerCreateReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerExportReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerPageReqVO; | ||
| 9 | +import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.CrmCustomerUpdateReqVO; | ||
| 10 | +import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; | ||
| 11 | +import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||
| 12 | +import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; | ||
| 3 | import cn.iocoder.yudao.module.system.api.dept.DeptApi; | 13 | import cn.iocoder.yudao.module.system.api.dept.DeptApi; |
| 4 | import org.springframework.stereotype.Service; | 14 | import org.springframework.stereotype.Service; |
| 5 | -import javax.annotation.Resource; | ||
| 6 | import org.springframework.validation.annotation.Validated; | 15 | import org.springframework.validation.annotation.Validated; |
| 7 | 16 | ||
| 8 | -import java.util.*; | ||
| 9 | -import cn.iocoder.yudao.module.crm.controller.admin.customer.vo.*; | ||
| 10 | -import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO; | ||
| 11 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 12 | - | ||
| 13 | -import cn.iocoder.yudao.module.crm.convert.customer.CrmCustomerConvert; | ||
| 14 | -import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper; | 17 | +import javax.annotation.Resource; |
| 18 | +import java.util.Collection; | ||
| 19 | +import java.util.List; | ||
| 20 | +import java.util.Objects; | ||
| 15 | 21 | ||
| 16 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 22 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 17 | -import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.*; | ||
| 18 | - | ||
| 19 | -import cn.hutool.core.collection.CollUtil; | ||
| 20 | -import cn.hutool.core.collection.ListUtil; | 23 | +import static cn.iocoder.yudao.module.crm.enums.ErrorCodeConstants.CUSTOMER_NOT_EXISTS; |
| 21 | 24 | ||
| 22 | /** | 25 | /** |
| 23 | * 客户 Service 实现类 | 26 | * 客户 Service 实现类 |
| @@ -31,7 +34,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | @@ -31,7 +34,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||
| 31 | @Resource | 34 | @Resource |
| 32 | private CrmCustomerMapper customerMapper; | 35 | private CrmCustomerMapper customerMapper; |
| 33 | @Resource | 36 | @Resource |
| 34 | - private DeptApi deptApi; | 37 | + private DeptApi deptApi; // TODO @wanwan:拼接数据,可以放到 controller;所以这里的引入,可以考虑放到 controller 哈; |
| 35 | 38 | ||
| 36 | @Override | 39 | @Override |
| 37 | public Long createCustomer(CrmCustomerCreateReqVO createReqVO) { | 40 | public Long createCustomer(CrmCustomerCreateReqVO createReqVO) { |
| @@ -46,6 +49,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | @@ -46,6 +49,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||
| 46 | public void updateCustomer(CrmCustomerUpdateReqVO updateReqVO) { | 49 | public void updateCustomer(CrmCustomerUpdateReqVO updateReqVO) { |
| 47 | // 校验存在 | 50 | // 校验存在 |
| 48 | validateCustomerExists(updateReqVO.getId()); | 51 | validateCustomerExists(updateReqVO.getId()); |
| 52 | + // TODO 芋艿:数据权限,校验是否可以操作 | ||
| 53 | + | ||
| 49 | // 更新 | 54 | // 更新 |
| 50 | CrmCustomerDO updateObj = CrmCustomerConvert.INSTANCE.convert(updateReqVO); | 55 | CrmCustomerDO updateObj = CrmCustomerConvert.INSTANCE.convert(updateReqVO); |
| 51 | customerMapper.updateById(updateObj); | 56 | customerMapper.updateById(updateObj); |
| @@ -55,6 +60,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | @@ -55,6 +60,8 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||
| 55 | public void deleteCustomer(Long id) { | 60 | public void deleteCustomer(Long id) { |
| 56 | // 校验存在 | 61 | // 校验存在 |
| 57 | validateCustomerExists(id); | 62 | validateCustomerExists(id); |
| 63 | + // TODO 芋艿:数据权限,校验是否可以操作 | ||
| 64 | + | ||
| 58 | // 删除 | 65 | // 删除 |
| 59 | customerMapper.deleteById(id); | 66 | customerMapper.deleteById(id); |
| 60 | } | 67 | } |
| @@ -80,6 +87,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | @@ -80,6 +87,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||
| 80 | 87 | ||
| 81 | @Override | 88 | @Override |
| 82 | public PageResult<CrmCustomerDO> getCustomerPage(CrmCustomerPageReqVO pageReqVO) { | 89 | public PageResult<CrmCustomerDO> getCustomerPage(CrmCustomerPageReqVO pageReqVO) { |
| 90 | + // TODO 芋艿:数据权限,是否可以查询到; | ||
| 83 | return customerMapper.selectPage(pageReqVO); | 91 | return customerMapper.selectPage(pageReqVO); |
| 84 | } | 92 | } |
| 85 | 93 | ||
| @@ -88,6 +96,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | @@ -88,6 +96,7 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||
| 88 | return customerMapper.selectList(exportReqVO); | 96 | return customerMapper.selectList(exportReqVO); |
| 89 | } | 97 | } |
| 90 | 98 | ||
| 99 | + // TODO wanwan:service 接口已经注释,实现类就不需要了。 | ||
| 91 | /** | 100 | /** |
| 92 | * 校验客户是否存在 | 101 | * 校验客户是否存在 |
| 93 | * | 102 | * |
| @@ -102,4 +111,5 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | @@ -102,4 +111,5 @@ public class CrmCustomerServiceImpl implements CrmCustomerService { | ||
| 102 | } | 111 | } |
| 103 | return customer; | 112 | return customer; |
| 104 | } | 113 | } |
| 114 | + | ||
| 105 | } | 115 | } |