增加商机线索管理修复若干bug
This commit is contained in:
@@ -0,0 +1,198 @@
|
||||
-- =============================================================================
|
||||
-- 联系人正式库统一:正式客户/供应商联系人通用表 yz_backend_contact_company
|
||||
--
|
||||
-- 目标:
|
||||
-- 1. 正式客户/供应商联系人统一到 `yz_backend_contact_company`
|
||||
-- (backend 端「公司联系人」通用表,命名与 yz_backend_contact 保持一致);
|
||||
-- 2. 兼容历史表名 `yz_backend_erp_company_contact`:
|
||||
-- - 若新表不存在、旧表存在,直接 RENAME(结构与数据 100% 保留);
|
||||
-- - 若两表并存,则去重合并进新表,旧表改名为 *_bak 备份保留;
|
||||
-- 3. 迁移历史死表 `yz_tenant_crm_contact`(若存在且有数据):去重并入新表,
|
||||
-- 原表改名为 `yz_tenant_crm_contact_bak` 保留;
|
||||
-- 4. 线索/商机联系人仍然只存过程库 `yz_tenant_crm_entity_contact`(本脚本不动)。
|
||||
--
|
||||
-- 去重键(判定为同一联系人):tenant_id + company_type + company_id + name + mobiles
|
||||
-- 说明:
|
||||
-- - 脚本幂等,可重复执行;
|
||||
-- - 任何迁移都是「先备份原表 / 或直接改名」再按去重键补插,绝不删除数据;
|
||||
-- - 执行本脚本的同时需要部署新版后端(模型表名已指向 yz_backend_contact_company)。
|
||||
-- =============================================================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
|
||||
-- 记录初始状态
|
||||
SET @has_new := (
|
||||
SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_contact_company'
|
||||
);
|
||||
SET @has_old_company := (
|
||||
SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_erp_company_contact'
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 1. 新表不存在、旧表存在 → 直接改名(保留全部结构、索引、自增、数据)
|
||||
-- -----------------------------------------------------------------------------
|
||||
SET @sql := IF(@has_new = 0 AND @has_old_company > 0,
|
||||
'RENAME TABLE `yz_backend_erp_company_contact` TO `yz_backend_contact_company`',
|
||||
'SELECT ''step1: 跳过直接改名'' AS note');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- 重新计算状态
|
||||
SET @has_new := (
|
||||
SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_contact_company'
|
||||
);
|
||||
SET @has_old_company := (
|
||||
SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_erp_company_contact'
|
||||
);
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 2. 确保正式表存在(新表也不存在、旧表也不存在时创建)
|
||||
-- -----------------------------------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `yz_backend_contact_company` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||||
`tenant_id` varchar(64) NOT NULL DEFAULT '' COMMENT '租户ID',
|
||||
`company_type` varchar(20) NOT NULL DEFAULT '' COMMENT '公司类型:customer=客户,supplier=供应商',
|
||||
`company_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '公司ID(客户/供应商ID)',
|
||||
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '联系人姓名',
|
||||
`gender` tinyint(4) NOT NULL DEFAULT 0 COMMENT '性别:0-未知 1-男 2-女',
|
||||
`phone` varchar(20) NOT NULL DEFAULT '' COMMENT '座机',
|
||||
`mobiles` text COMMENT '手机号,JSON数组,最多5个',
|
||||
`wechat` varchar(50) NOT NULL DEFAULT '' COMMENT '微信',
|
||||
`qq` varchar(50) NOT NULL DEFAULT '' COMMENT 'QQ',
|
||||
`dingtalk` varchar(50) NOT NULL DEFAULT '' COMMENT '钉钉',
|
||||
`email` varchar(100) NOT NULL DEFAULT '' COMMENT '邮箱',
|
||||
`department` varchar(50) NOT NULL DEFAULT '' COMMENT '部门',
|
||||
`position` varchar(50) NOT NULL DEFAULT '' COMMENT '职位',
|
||||
`home_address` varchar(255) NOT NULL DEFAULT '' COMMENT '家庭住址',
|
||||
`is_primary` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否主联系人:0-否 1-是',
|
||||
`status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '状态:0-离职 1-在职',
|
||||
`remark` text COMMENT '备注',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant_company` (`tenant_id`,`company_type`,`company_id`) COMMENT '按公司查询联系人',
|
||||
KEY `idx_name` (`tenant_id`,`name`) COMMENT '按姓名查询',
|
||||
KEY `idx_delete_time` (`delete_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='正式客户/供应商联系人通用表(backend 公司联系人)';
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 3. 两表并存时:旧表 yz_backend_erp_company_contact 去重并入新表,再改名备份
|
||||
-- -----------------------------------------------------------------------------
|
||||
SET @sql := IF(@has_old_company > 0,
|
||||
'INSERT INTO `yz_backend_contact_company`
|
||||
(`tenant_id`,`company_type`,`company_id`,`name`,`gender`,`phone`,`mobiles`,`wechat`,`qq`,`dingtalk`,`email`,`department`,`position`,`home_address`,`is_primary`,`status`,`remark`,`create_time`,`update_time`,`delete_time`)
|
||||
SELECT
|
||||
CAST(o.`tenant_id` AS CHAR), o.`company_type`, o.`company_id`, o.`name`, o.`gender`, o.`phone`, o.`mobiles`,
|
||||
IFNULL(o.`wechat`, ''''), IFNULL(o.`qq`, ''''), IFNULL(o.`dingtalk`, ''''), IFNULL(o.`email`, ''''),
|
||||
IFNULL(o.`department`, ''''), IFNULL(o.`position`, ''''), IFNULL(o.`home_address`, ''''),
|
||||
IFNULL(o.`is_primary`, 0), IFNULL(o.`status`, 1), o.`remark`,
|
||||
IFNULL(o.`create_time`, NOW()), IFNULL(o.`update_time`, NOW()), o.`delete_time`
|
||||
FROM `yz_backend_erp_company_contact` o
|
||||
WHERE NOT EXISTS (
|
||||
SELECT 1 FROM `yz_backend_contact_company` n
|
||||
WHERE n.`tenant_id` = CAST(o.`tenant_id` AS CHAR)
|
||||
AND n.`company_type` = o.`company_type`
|
||||
AND n.`company_id` = o.`company_id`
|
||||
AND n.`name` = o.`name`
|
||||
AND IFNULL(n.`mobiles`, '''') = IFNULL(o.`mobiles`, '''')
|
||||
)',
|
||||
'SELECT ''step3: 无并存旧公司联系人表,跳过合并'' AS note');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @bak_company_exists := (
|
||||
SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_erp_company_contact_bak'
|
||||
);
|
||||
SET @sql := IF(@has_old_company > 0 AND @bak_company_exists = 0,
|
||||
'RENAME TABLE `yz_backend_erp_company_contact` TO `yz_backend_erp_company_contact_bak`',
|
||||
'SELECT ''step3: 跳过改名备份'' AS note');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 4. 历史死表 yz_tenant_crm_contact(related_type 1=客户/2=供应商)→ 新表,原表备份
|
||||
-- mobiles 由单个 mobile 转为 JSON 数组;相关字段做空值兜底。
|
||||
-- -----------------------------------------------------------------------------
|
||||
SET @has_dead := (
|
||||
SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_tenant_crm_contact'
|
||||
);
|
||||
|
||||
SET @sql := IF(@has_dead > 0,
|
||||
'INSERT INTO `yz_backend_contact_company`
|
||||
(`tenant_id`,`company_type`,`company_id`,`name`,`gender`,`phone`,`mobiles`,`wechat`,`qq`,`dingtalk`,`email`,`department`,`position`,`home_address`,`is_primary`,`status`,`remark`,`create_time`,`update_time`,`delete_time`)
|
||||
SELECT
|
||||
CAST(o.`tenant_id` AS CHAR),
|
||||
IF(o.`related_type` = 2, ''supplier'', ''customer''),
|
||||
o.`related_id`, o.`contact_name`, IFNULL(o.`gender`, 0), IFNULL(o.`phone`, ''''),
|
||||
CASE WHEN o.`mobile` IS NULL OR o.`mobile` = '''' THEN NULL ELSE CONCAT(''["'', o.`mobile`, ''"]'') END,
|
||||
'''', '''', '''', IFNULL(o.`email`, ''''), IFNULL(o.`department`, ''''), IFNULL(o.`position`, ''''), '''',
|
||||
IFNULL(o.`is_primary`, 0), 1, IFNULL(o.`remark`, ''''),
|
||||
IFNULL(o.`create_time`, NOW()), IFNULL(o.`update_time`, NOW()),
|
||||
CASE WHEN IFNULL(o.`is_deleted`, 0) = 1 THEN NOW() ELSE NULL END
|
||||
FROM `yz_tenant_crm_contact` o
|
||||
WHERE o.`contact_name` IS NOT NULL AND o.`contact_name` <> ''''
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM `yz_backend_contact_company` n
|
||||
WHERE n.`tenant_id` = CAST(o.`tenant_id` AS CHAR)
|
||||
AND n.`company_type` = IF(o.`related_type` = 2, ''supplier'', ''customer'')
|
||||
AND n.`company_id` = o.`related_id`
|
||||
AND n.`name` = o.`contact_name`
|
||||
AND IFNULL(n.`mobiles`, '''') = IFNULL(
|
||||
CASE WHEN o.`mobile` IS NULL OR o.`mobile` = '''' THEN NULL ELSE CONCAT(''["'', o.`mobile`, ''"]'') END, '''')
|
||||
)',
|
||||
'SELECT ''步骤4: 无 yz_tenant_crm_contact,跳过'' AS note');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @bak_dead_exists := (
|
||||
SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_tenant_crm_contact_bak'
|
||||
);
|
||||
SET @sql := IF(@has_dead > 0 AND @bak_dead_exists = 0,
|
||||
'RENAME TABLE `yz_tenant_crm_contact` TO `yz_tenant_crm_contact_bak`',
|
||||
'SELECT ''步骤4: 跳过改名备份'' AS note');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 5. 重复数据检测(只查询、不修改/不删除,供人工核对)
|
||||
-- -----------------------------------------------------------------------------
|
||||
SELECT
|
||||
`tenant_id`,
|
||||
`company_type`,
|
||||
`company_id`,
|
||||
`name`,
|
||||
IFNULL(`mobiles`, '') AS `mobiles`,
|
||||
COUNT(*) AS `dup_count`,
|
||||
GROUP_CONCAT(`id` ORDER BY `id`) AS `dup_ids`
|
||||
FROM `yz_backend_contact_company`
|
||||
WHERE `delete_time` IS NULL
|
||||
GROUP BY `tenant_id`, `company_type`, `company_id`, `name`, IFNULL(`mobiles`, '')
|
||||
HAVING COUNT(*) > 1;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 6. 迁移结果核对(新表与备份表条数)
|
||||
-- -----------------------------------------------------------------------------
|
||||
SET @bak_company_exists2 := (
|
||||
SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_erp_company_contact_bak'
|
||||
);
|
||||
SET @bak_dead_exists2 := (
|
||||
SELECT COUNT(*) FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_tenant_crm_contact_bak'
|
||||
);
|
||||
|
||||
SELECT 'yz_backend_contact_company' AS `table_name`, COUNT(*) AS `row_count`
|
||||
FROM `yz_backend_contact_company`;
|
||||
|
||||
SET @sql := IF(@bak_company_exists2 > 0,
|
||||
'SELECT ''yz_backend_erp_company_contact_bak'' AS `table_name`, COUNT(*) AS `row_count` FROM `yz_backend_erp_company_contact_bak`',
|
||||
'SELECT ''yz_backend_erp_company_contact_bak(不存在)'' AS `table_name`, 0 AS `row_count`');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @sql := IF(@bak_dead_exists2 > 0,
|
||||
'SELECT ''yz_tenant_crm_contact_bak'' AS `table_name`, COUNT(*) AS `row_count` FROM `yz_tenant_crm_contact_bak`',
|
||||
'SELECT ''yz_tenant_crm_contact_bak(不存在)'' AS `table_name`, 0 AS `row_count`');
|
||||
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
@@ -0,0 +1,13 @@
|
||||
-- 为 CRM 业务管线(线索/商机/项目)增加「对接人职位」字段 contact_position。
|
||||
-- 若已执行过 yz_backend_crm_pipeline.sql(表已存在),执行本脚本即可;
|
||||
-- 若尚未建表,直接执行 yz_backend_crm_pipeline.sql 已包含该字段,无需本脚本。
|
||||
-- 脚本可重复执行:列已存在时 MySQL 报 duplicate column,忽略即可。
|
||||
|
||||
ALTER TABLE `yz_tenant_crm_clue`
|
||||
ADD COLUMN `contact_position` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人职位' AFTER `contact_person`;
|
||||
|
||||
ALTER TABLE `yz_tenant_crm_business`
|
||||
ADD COLUMN `contact_position` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人职位' AFTER `contact_person`;
|
||||
|
||||
ALTER TABLE `yz_tenant_crm_project`
|
||||
ADD COLUMN `contact_position` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人职位' AFTER `contact_person`;
|
||||
@@ -0,0 +1,233 @@
|
||||
-- =============================================================================
|
||||
-- CRM 业务管线:线索 → 商机 → 项目,回访贯穿全流程
|
||||
-- 对应租户端 backend 页面:/apps/crm/clue、/apps/crm/business、/apps/crm/project、/apps/crm/follow
|
||||
-- 说明:
|
||||
-- 1. 线索的「客户名称」暂不关联客户管理(线索阶段尚无价值),
|
||||
-- 线索转化为商机时才把客户名称落地为正式客户(yz_backend_erp_customer)。
|
||||
-- 2. 线索转化商机后会被锁定(locked=1),后续操作都在商机进行。
|
||||
-- 3. 商机转化项目后同样锁定(locked=1)。
|
||||
-- 4. 回访/跟进记录(yz_tenant_crm_follow)与附件、联系人、操作日志均为通用多态表,
|
||||
-- 通过 related_type(1线索/2商机/3项目) + related_id 关联。
|
||||
-- 可重复执行(DROP TABLE IF EXISTS)。
|
||||
-- =============================================================================
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SET FOREIGN_KEY_CHECKS = 0;
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 线索表
|
||||
-- -----------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `yz_tenant_crm_clue`;
|
||||
CREATE TABLE `yz_tenant_crm_clue` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||||
`tenant_id` varchar(64) NOT NULL COMMENT '租户ID',
|
||||
`clue_name` varchar(100) NOT NULL COMMENT '线索名称',
|
||||
`customer_name` varchar(100) NOT NULL DEFAULT '' COMMENT '客户名称(线索阶段不关联客户管理)',
|
||||
`source` varchar(50) NOT NULL DEFAULT '' COMMENT '客户来源(1官网咨询/2电话咨询/3朋友介绍/4展会/5广告投放/6陌生拜访/7其他)',
|
||||
`owner_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '负责人用户ID',
|
||||
`owner_user_name` varchar(128) NOT NULL DEFAULT '' COMMENT '负责人姓名',
|
||||
`industry` varchar(50) NOT NULL DEFAULT '' COMMENT '客户行业',
|
||||
`next_contact_time` datetime DEFAULT NULL COMMENT '下次联系时间',
|
||||
`clue_level` varchar(20) NOT NULL DEFAULT '2' COMMENT '客户级别:1重点/2普通/3非优先',
|
||||
`contact_person` varchar(50) NOT NULL DEFAULT '' COMMENT '客户对接人',
|
||||
`contact_position` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人职位',
|
||||
`contact_phone` varchar(20) NOT NULL DEFAULT '' COMMENT '对接人手机',
|
||||
`contact_wechat` varchar(64) NOT NULL DEFAULT '' COMMENT '对接人微信',
|
||||
`contact_qq` varchar(20) NOT NULL DEFAULT '' COMMENT '对接人QQ',
|
||||
`address` varchar(255) NOT NULL DEFAULT '' COMMENT '公司地址',
|
||||
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:1跟进中/2已转化/3已关闭',
|
||||
`locked` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否锁定:0否/1是(转化后锁定不可编辑)',
|
||||
`business_id` bigint(20) DEFAULT NULL COMMENT '转化后的商机ID',
|
||||
`convert_time` datetime DEFAULT NULL COMMENT '转化时间',
|
||||
`remark` text COMMENT '备注',
|
||||
`create_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人用户ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant_id` (`tenant_id`),
|
||||
KEY `idx_clue_name` (`tenant_id`,`clue_name`),
|
||||
KEY `idx_owner` (`tenant_id`,`owner_user_id`),
|
||||
KEY `idx_status` (`tenant_id`,`status`),
|
||||
KEY `idx_delete_time` (`delete_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户CRM线索表';
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 商机表
|
||||
-- -----------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `yz_tenant_crm_business`;
|
||||
CREATE TABLE `yz_tenant_crm_business` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||||
`tenant_id` varchar(64) NOT NULL COMMENT '租户ID',
|
||||
`business_name` varchar(100) NOT NULL COMMENT '商机名称',
|
||||
`clue_id` bigint(20) DEFAULT NULL COMMENT '来源线索ID',
|
||||
`customer_id` bigint(20) DEFAULT NULL COMMENT '正式客户ID(yz_backend_erp_customer.id)',
|
||||
`customer_name` varchar(100) NOT NULL DEFAULT '' COMMENT '客户名称',
|
||||
`source` varchar(50) NOT NULL DEFAULT '' COMMENT '客户来源',
|
||||
`owner_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '负责人用户ID',
|
||||
`owner_user_name` varchar(128) NOT NULL DEFAULT '' COMMENT '负责人姓名',
|
||||
`industry` varchar(50) NOT NULL DEFAULT '' COMMENT '客户行业',
|
||||
`stage` varchar(20) NOT NULL DEFAULT '1' COMMENT '商机阶段:1初步接洽/2需求确认/3方案报价/4商务谈判/5赢单/6输单',
|
||||
`amount` decimal(14,2) NOT NULL DEFAULT '0.00' COMMENT '预计金额(元)',
|
||||
`expect_deal_date` date DEFAULT NULL COMMENT '预计成交日期',
|
||||
`next_contact_time` datetime DEFAULT NULL COMMENT '下次联系时间',
|
||||
`level` varchar(20) NOT NULL DEFAULT '2' COMMENT '商机级别:1重点/2普通/3非优先',
|
||||
`contact_person` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人',
|
||||
`contact_position` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人职位',
|
||||
`contact_phone` varchar(20) NOT NULL DEFAULT '' COMMENT '对接人手机',
|
||||
`contact_wechat` varchar(64) NOT NULL DEFAULT '' COMMENT '对接人微信',
|
||||
`contact_qq` varchar(20) NOT NULL DEFAULT '' COMMENT '对接人QQ',
|
||||
`address` varchar(255) NOT NULL DEFAULT '' COMMENT '客户地址',
|
||||
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:1跟进中/2已转化项目/3已关闭',
|
||||
`locked` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否锁定:0否/1是(转化项目后锁定不可编辑)',
|
||||
`project_id` bigint(20) DEFAULT NULL COMMENT '转化后的项目ID',
|
||||
`convert_time` datetime DEFAULT NULL COMMENT '转化时间',
|
||||
`remark` text COMMENT '备注',
|
||||
`create_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人用户ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant_id` (`tenant_id`),
|
||||
KEY `idx_business_name` (`tenant_id`,`business_name`),
|
||||
KEY `idx_clue` (`clue_id`),
|
||||
KEY `idx_customer` (`customer_id`),
|
||||
KEY `idx_owner` (`tenant_id`,`owner_user_id`),
|
||||
KEY `idx_status` (`tenant_id`,`status`),
|
||||
KEY `idx_delete_time` (`delete_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户CRM商机表';
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 项目表
|
||||
-- -----------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `yz_tenant_crm_project`;
|
||||
CREATE TABLE `yz_tenant_crm_project` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||||
`tenant_id` varchar(64) NOT NULL COMMENT '租户ID',
|
||||
`project_name` varchar(100) NOT NULL COMMENT '项目名称',
|
||||
`project_no` varchar(50) NOT NULL DEFAULT '' COMMENT '项目编号',
|
||||
`business_id` bigint(20) DEFAULT NULL COMMENT '来源商机ID',
|
||||
`customer_id` bigint(20) DEFAULT NULL COMMENT '客户ID',
|
||||
`customer_name` varchar(100) NOT NULL DEFAULT '' COMMENT '客户名称',
|
||||
`owner_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '负责人用户ID',
|
||||
`owner_user_name` varchar(128) NOT NULL DEFAULT '' COMMENT '负责人姓名',
|
||||
`industry` varchar(50) NOT NULL DEFAULT '' COMMENT '客户行业',
|
||||
`amount` decimal(14,2) NOT NULL DEFAULT '0.00' COMMENT '项目金额(元)',
|
||||
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:1未开始/2进行中/3已完成/4已暂停',
|
||||
`start_date` date DEFAULT NULL COMMENT '开始日期',
|
||||
`end_date` date DEFAULT NULL COMMENT '结束日期',
|
||||
`contact_person` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人',
|
||||
`contact_position` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人职位',
|
||||
`contact_phone` varchar(20) NOT NULL DEFAULT '' COMMENT '对接人手机',
|
||||
`address` varchar(255) NOT NULL DEFAULT '' COMMENT '项目地址',
|
||||
`remark` text COMMENT '备注',
|
||||
`create_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人用户ID',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant_id` (`tenant_id`),
|
||||
KEY `idx_project_name` (`tenant_id`,`project_name`),
|
||||
KEY `idx_business` (`business_id`),
|
||||
KEY `idx_owner` (`tenant_id`,`owner_user_id`),
|
||||
KEY `idx_status` (`tenant_id`,`status`),
|
||||
KEY `idx_delete_time` (`delete_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户CRM项目表';
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 回访/跟进记录表(贯穿线索、商机、项目)
|
||||
-- -----------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `yz_tenant_crm_follow`;
|
||||
CREATE TABLE `yz_tenant_crm_follow` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||||
`tenant_id` varchar(64) NOT NULL COMMENT '租户ID',
|
||||
`related_type` tinyint(4) NOT NULL COMMENT '关联类型:1线索/2商机/3项目',
|
||||
`related_id` bigint(20) NOT NULL COMMENT '关联记录ID',
|
||||
`related_name` varchar(100) NOT NULL DEFAULT '' COMMENT '关联对象名称(冗余,便于回访列表展示)',
|
||||
`follow_type` varchar(20) NOT NULL DEFAULT '1' COMMENT '回访方式:1电话/2微信/3上门/4邮件/5其他',
|
||||
`follow_time` datetime DEFAULT NULL COMMENT '回访时间',
|
||||
`content` text COMMENT '回访内容',
|
||||
`next_contact_time` datetime DEFAULT NULL COMMENT '下次联系时间',
|
||||
`owner_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '回访人用户ID',
|
||||
`owner_user_name` varchar(128) NOT NULL DEFAULT '' COMMENT '回访人姓名',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant_id` (`tenant_id`),
|
||||
KEY `idx_related` (`tenant_id`,`related_type`,`related_id`),
|
||||
KEY `idx_follow_time` (`tenant_id`,`follow_time`),
|
||||
KEY `idx_delete_time` (`delete_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户CRM回访/跟进记录表';
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 附件表(多态:线索/商机/项目的资料)
|
||||
-- -----------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `yz_tenant_crm_attach`;
|
||||
CREATE TABLE `yz_tenant_crm_attach` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||||
`tenant_id` varchar(64) NOT NULL COMMENT '租户ID',
|
||||
`related_type` tinyint(4) NOT NULL COMMENT '关联类型:1线索/2商机/3项目',
|
||||
`related_id` bigint(20) NOT NULL COMMENT '关联记录ID',
|
||||
`file_id` bigint(20) DEFAULT NULL COMMENT '文件ID(yz_system_file.id,可空)',
|
||||
`file_name` varchar(255) NOT NULL DEFAULT '' COMMENT '文件名',
|
||||
`file_url` varchar(500) NOT NULL DEFAULT '' COMMENT '文件访问地址',
|
||||
`file_size` bigint(20) NOT NULL DEFAULT '0' COMMENT '文件大小(字节)',
|
||||
`uploader_id` varchar(64) NOT NULL DEFAULT '' COMMENT '上传人用户ID',
|
||||
`uploader_name` varchar(128) NOT NULL DEFAULT '' COMMENT '上传人姓名',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant_id` (`tenant_id`),
|
||||
KEY `idx_related` (`tenant_id`,`related_type`,`related_id`),
|
||||
KEY `idx_delete_time` (`delete_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户CRM附件表';
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 联系人表(多态:线索/商机/项目的对接人列表)
|
||||
-- -----------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `yz_tenant_crm_entity_contact`;
|
||||
CREATE TABLE `yz_tenant_crm_entity_contact` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||||
`tenant_id` varchar(64) NOT NULL COMMENT '租户ID',
|
||||
`related_type` tinyint(4) NOT NULL COMMENT '关联类型:1线索/2商机/3项目',
|
||||
`related_id` bigint(20) NOT NULL COMMENT '关联记录ID',
|
||||
`contact_name` varchar(50) NOT NULL COMMENT '联系人姓名',
|
||||
`position` varchar(50) NOT NULL DEFAULT '' COMMENT '职位',
|
||||
`mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号',
|
||||
`wechat` varchar(64) NOT NULL DEFAULT '' COMMENT '微信',
|
||||
`qq` varchar(20) NOT NULL DEFAULT '' COMMENT 'QQ',
|
||||
`email` varchar(100) NOT NULL DEFAULT '' COMMENT '邮箱',
|
||||
`is_primary` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否主联系人:0否/1是',
|
||||
`remark` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
`delete_time` datetime DEFAULT NULL COMMENT '删除时间(软删除)',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant_id` (`tenant_id`),
|
||||
KEY `idx_related` (`tenant_id`,`related_type`,`related_id`),
|
||||
KEY `idx_delete_time` (`delete_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户CRM联系人表(线索/商机/项目)';
|
||||
|
||||
-- -----------------------------------------------------------------------------
|
||||
-- 操作日志表(多态:记录线索/商机/项目的关键操作,用于详情页操作日志 Tab)
|
||||
-- -----------------------------------------------------------------------------
|
||||
DROP TABLE IF EXISTS `yz_tenant_crm_operate_log`;
|
||||
CREATE TABLE `yz_tenant_crm_operate_log` (
|
||||
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键ID',
|
||||
`tenant_id` varchar(64) NOT NULL COMMENT '租户ID',
|
||||
`related_type` tinyint(4) NOT NULL COMMENT '关联类型:1线索/2商机/3项目',
|
||||
`related_id` bigint(20) NOT NULL COMMENT '关联记录ID',
|
||||
`action` varchar(50) NOT NULL DEFAULT '' COMMENT '操作动作:create/update/convert/delete 等',
|
||||
`content` varchar(500) NOT NULL DEFAULT '' COMMENT '操作描述',
|
||||
`operator_id` varchar(64) NOT NULL DEFAULT '' COMMENT '操作人用户ID',
|
||||
`operator_name` varchar(128) NOT NULL DEFAULT '' COMMENT '操作人姓名',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_tenant_id` (`tenant_id`),
|
||||
KEY `idx_related` (`tenant_id`,`related_type`,`related_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户CRM操作日志表';
|
||||
|
||||
SET FOREIGN_KEY_CHECKS = 1;
|
||||
|
||||
Reference in New Issue
Block a user