优化线索、商机、项目相关开发

This commit is contained in:
2026-09-11 17:00:23 +08:00
parent 9c07af2b59
commit 840673bda5
55 changed files with 4866 additions and 625 deletions
+1 -1
View File
@@ -9,7 +9,7 @@
-- - 若两表并存,则去重合并进新表,旧表改名为 *_bak 备份保留;
-- 3. 迁移历史死表 `yz_tenant_crm_contact`(若存在且有数据):去重并入新表,
-- 原表改名为 `yz_tenant_crm_contact_bak` 保留;
-- 4. 线索/商机联系人仍然只存过程库 `yz_tenant_crm_entity_contact`(本脚本不动)。
-- 4. 线索/商机联系人仍然只存过程库 `yz_backend_crm_entity_contact`(本脚本不动)。
--
-- 去重键(判定为同一联系人):tenant_id + company_type + company_id + name + mobiles
-- 说明:
+40
View File
@@ -0,0 +1,40 @@
-- =============================================================================
-- 跟进记录(回访)增加「创建阶段」字段 stage
--
-- 目的:
-- 过程数据(跟进记录)不做搬迁,按 线索 → 商机 → 项目 链路累积展示;
-- stage 记录该条记录创建时所处的阶段,用于详情列表标明数据来自哪个阶段。
--
-- 取值:1=线索,2=商机,3=项目
-- 说明:
-- - 脚本幂等:列已存在则跳过新增;
-- - 回填只在首次新增列时执行一次(历史数据按当前 related_type 近似回填)。
-- =============================================================================
SET NAMES utf8mb4;
SET @has_stage := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'yz_backend_crm_follow'
AND COLUMN_NAME = 'stage'
);
-- 1. 新增列(已存在则跳过)
SET @sql := IF(@has_stage = 0,
'ALTER TABLE `yz_backend_crm_follow` ADD COLUMN `stage` tinyint(4) NOT NULL DEFAULT 1 COMMENT ''创建阶段:1线索/2商机/3项目'' AFTER `related_name`',
'SELECT ''skip: stage 列已存在'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 2. 历史数据回填(仅在首次新增列时执行;按当前 related_type 近似推断)
SET @sql := IF(@has_stage = 0,
'UPDATE `yz_backend_crm_follow` SET `stage` = `related_type` WHERE `related_type` IN (2, 3)',
'SELECT ''skip: 回填已完成过'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 3. 核对:各阶段记录数
SELECT `stage`, COUNT(*) AS `cnt`
FROM `yz_backend_crm_follow`
WHERE `delete_time` IS NULL
GROUP BY `stage`
ORDER BY `stage`;
+39 -10
View File
@@ -1,13 +1,42 @@
-- 为 CRM 业务管线(线索/商机/项目)增加「对接人职位」字段 contact_position。
-- 若已执行过 yz_backend_crm_pipeline.sql(表已存在),执行本脚本即可;
-- 若尚未建表,直接执行 yz_backend_crm_pipeline.sql 已包含该字段,无需本脚本。
-- 脚本可重复执行:列已存在时 MySQL 报 duplicate column,忽略即可。
-- =============================================================================
-- 为 CRM 业务管线(线索/商机/项目)增加「对接人职位」字段 contact_position
--
-- 说明:
-- - 幂等:列已存在时自动跳过,不会报 Duplicate column 错误;
-- - 只增加字段,不改动任何已有数据;
-- - 若尚未建表,直接执行 yz_backend_crm_pipeline.sql 已包含该字段,无需本脚本。
-- =============================================================================
ALTER TABLE `yz_tenant_crm_clue`
ADD COLUMN `contact_position` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人职位' AFTER `contact_person`;
SET NAMES utf8mb4;
ALTER TABLE `yz_tenant_crm_business`
ADD COLUMN `contact_position` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人职位' AFTER `contact_person`;
-- 1. 线索
SET @has_col := (SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_crm_clue' AND COLUMN_NAME = 'contact_position');
SET @sql := IF(@has_col = 0,
'ALTER TABLE `yz_backend_crm_clue` ADD COLUMN `contact_position` varchar(50) NOT NULL DEFAULT '''' COMMENT ''对接人职位'' AFTER `contact_person`',
'SELECT ''skip: yz_backend_crm_clue.contact_position 已存在'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
ALTER TABLE `yz_tenant_crm_project`
ADD COLUMN `contact_position` varchar(50) NOT NULL DEFAULT '' COMMENT '对接人职位' AFTER `contact_person`;
-- 2. 商机
SET @has_col := (SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_crm_business' AND COLUMN_NAME = 'contact_position');
SET @sql := IF(@has_col = 0,
'ALTER TABLE `yz_backend_crm_business` ADD COLUMN `contact_position` varchar(50) NOT NULL DEFAULT '''' COMMENT ''对接人职位'' AFTER `contact_person`',
'SELECT ''skip: yz_backend_crm_business.contact_position 已存在'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 3. 项目
SET @has_col := (SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_crm_project' AND COLUMN_NAME = 'contact_position');
SET @sql := IF(@has_col = 0,
'ALTER TABLE `yz_backend_crm_project` ADD COLUMN `contact_position` varchar(50) NOT NULL DEFAULT '''' COMMENT ''对接人职位'' AFTER `contact_person`',
'SELECT ''skip: yz_backend_crm_project.contact_position 已存在'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 4. 核对:三张表的 contact_position 字段
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, COLUMN_COMMENT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ('yz_backend_crm_clue', 'yz_backend_crm_business', 'yz_backend_crm_project')
AND COLUMN_NAME = 'contact_position'
ORDER BY TABLE_NAME;
@@ -0,0 +1,14 @@
-- -----------------------------------------------------------------------------
-- 项目文档(CRM 项目 ↔ OA 文档库绑定)
--
-- 在项目表上增加文档库文件夹分类ID:
-- 指向 yz_backend_oa_doc_category 中「共享文档 / 项目文档 / {项目名称}」这条分类。
-- 项目建立时自动在文档库中创建同名文件夹并回写该列;
-- 存量项目(为 0)在打开「项目文档」或项目详情时自动补建。
-- 项目改名时同步重命名文档库文件夹。
--
-- 注:新建库时该列已包含在 yz_backend_crm_pipeline.sql 中,此脚本用于已有库升级。
-- 后端启动时也会自动补列(models.EnsureCrmProjectDocColumn),可不必手工执行。
-- -----------------------------------------------------------------------------
ALTER TABLE `yz_backend_crm_project`
ADD COLUMN `doc_category_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联OA文档库项目文件夹分类ID(共享文档/项目文档/{项目名称})';
@@ -0,0 +1,69 @@
-- =============================================================================
-- CRM 业务管线表名规范化:yz_tenant_crm_* → yz_backend_crm_*
--
-- 目的:与 yz_backend_erp_*、yz_backend_contact_company 等保持统一前缀,便于查找维护。
--
-- 映射:
-- yz_tenant_crm_clue → yz_backend_crm_clue
-- yz_tenant_crm_business → yz_backend_crm_business
-- yz_tenant_crm_project → yz_backend_crm_project
-- yz_tenant_crm_follow → yz_backend_crm_follow
-- yz_tenant_crm_attach → yz_backend_crm_attach
-- yz_tenant_crm_entity_contact → yz_backend_crm_entity_contact
-- yz_tenant_crm_operate_log → yz_backend_crm_operate_log
--
-- 说明:
-- - RENAME TABLE 是原子改名,数据、索引、自增全部原样保留,不会丢数据;
-- - 幂等:新表已存在或旧表不存在时自动跳过;
-- - 注意:需与新版后端一起发布(模型表名已指向 yz_backend_crm_*)。
-- =============================================================================
SET NAMES utf8mb4;
-- 1. 线索
SET @has_old := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_tenant_crm_clue');
SET @has_new := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_crm_clue');
SET @sql := IF(@has_old > 0 AND @has_new = 0, 'RENAME TABLE `yz_tenant_crm_clue` TO `yz_backend_crm_clue`', 'SELECT ''skip: clue'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 2. 商机
SET @has_old := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_tenant_crm_business');
SET @has_new := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_crm_business');
SET @sql := IF(@has_old > 0 AND @has_new = 0, 'RENAME TABLE `yz_tenant_crm_business` TO `yz_backend_crm_business`', 'SELECT ''skip: business'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 3. 项目
SET @has_old := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_tenant_crm_project');
SET @has_new := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_crm_project');
SET @sql := IF(@has_old > 0 AND @has_new = 0, 'RENAME TABLE `yz_tenant_crm_project` TO `yz_backend_crm_project`', 'SELECT ''skip: project'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 4. 回访/跟进记录
SET @has_old := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_tenant_crm_follow');
SET @has_new := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_crm_follow');
SET @sql := IF(@has_old > 0 AND @has_new = 0, 'RENAME TABLE `yz_tenant_crm_follow` TO `yz_backend_crm_follow`', 'SELECT ''skip: follow'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 5. 附件
SET @has_old := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_tenant_crm_attach');
SET @has_new := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_crm_attach');
SET @sql := IF(@has_old > 0 AND @has_new = 0, 'RENAME TABLE `yz_tenant_crm_attach` TO `yz_backend_crm_attach`', 'SELECT ''skip: attach'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 6. 联系人
SET @has_old := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_tenant_crm_entity_contact');
SET @has_new := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_crm_entity_contact');
SET @sql := IF(@has_old > 0 AND @has_new = 0, 'RENAME TABLE `yz_tenant_crm_entity_contact` TO `yz_backend_crm_entity_contact`', 'SELECT ''skip: entity_contact'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 7. 操作日志
SET @has_old := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_tenant_crm_operate_log');
SET @has_new := (SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'yz_backend_crm_operate_log');
SET @sql := IF(@has_old > 0 AND @has_new = 0, 'RENAME TABLE `yz_tenant_crm_operate_log` TO `yz_backend_crm_operate_log`', 'SELECT ''skip: operate_log'' AS note');
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
-- 8. 核对结果
SELECT TABLE_NAME, TABLE_ROWS, CREATE_TIME
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME LIKE 'yz_%crm_%'
ORDER BY TABLE_NAME;
+102
View File
@@ -0,0 +1,102 @@
-- =============================================================================
-- 修正「负责人 / 回访人 / 上传人」姓名:把登录账号刷成真实姓名
--
-- 背景:
-- 历史代码把 JWT 里的 Username(登录账号,如 hero920103)写进了
-- owner_user_name / last_owner_name 等字段,导致界面显示账号而不是人名。
-- 后端已改为按 uid 查 yz_system_tenant_user.name 写入真实姓名,
-- 本脚本用于修正存量数据。
--
-- 说明:
-- - 按 tenant_id + owner_user_id(uid) 关联 yz_system_tenant_user 取 name;
-- - 只更新「能匹配到用户且姓名非空」的记录,不动其它数据;
-- - 幂等,可重复执行(姓名已一致的行不会被更新)。
-- =============================================================================
SET NAMES utf8mb4;
-- 1. 客户:负责人姓名
UPDATE `yz_backend_erp_customer` c
JOIN `yz_system_tenant_user` u
ON u.`tid` = CAST(c.`tenant_id` AS UNSIGNED)
AND u.`uid` = CAST(c.`owner_user_id` AS UNSIGNED)
SET c.`owner_user_name` = u.`name`
WHERE c.`owner_user_id` IS NOT NULL AND c.`owner_user_id` <> ''
AND u.`name` IS NOT NULL AND u.`name` <> ''
AND (c.`owner_user_name` IS NULL OR c.`owner_user_name` <> u.`name`);
-- 2. 客户:公海记录里的「原负责人」姓名
UPDATE `yz_backend_erp_customer` c
JOIN `yz_system_tenant_user` u
ON u.`tid` = CAST(c.`tenant_id` AS UNSIGNED)
AND u.`uid` = CAST(c.`owner_user_id` AS UNSIGNED)
SET c.`last_owner_name` = u.`name`
WHERE c.`owner_user_id` IS NOT NULL AND c.`owner_user_id` <> ''
AND u.`name` IS NOT NULL AND u.`name` <> ''
AND c.`last_owner_name` IS NOT NULL AND c.`last_owner_name` <> ''
AND c.`last_owner_name` <> u.`name`;
-- 3. 线索:负责人姓名
UPDATE `yz_backend_crm_clue` c
JOIN `yz_system_tenant_user` u
ON u.`tid` = CAST(c.`tenant_id` AS UNSIGNED)
AND u.`uid` = CAST(c.`owner_user_id` AS UNSIGNED)
SET c.`owner_user_name` = u.`name`
WHERE c.`owner_user_id` <> ''
AND u.`name` IS NOT NULL AND u.`name` <> ''
AND (c.`owner_user_name` IS NULL OR c.`owner_user_name` <> u.`name`);
-- 4. 商机:负责人姓名
UPDATE `yz_backend_crm_business` c
JOIN `yz_system_tenant_user` u
ON u.`tid` = CAST(c.`tenant_id` AS UNSIGNED)
AND u.`uid` = CAST(c.`owner_user_id` AS UNSIGNED)
SET c.`owner_user_name` = u.`name`
WHERE c.`owner_user_id` <> ''
AND u.`name` IS NOT NULL AND u.`name` <> ''
AND (c.`owner_user_name` IS NULL OR c.`owner_user_name` <> u.`name`);
-- 5. 项目:负责人姓名
UPDATE `yz_backend_crm_project` c
JOIN `yz_system_tenant_user` u
ON u.`tid` = CAST(c.`tenant_id` AS UNSIGNED)
AND u.`uid` = CAST(c.`owner_user_id` AS UNSIGNED)
SET c.`owner_user_name` = u.`name`
WHERE c.`owner_user_id` <> ''
AND u.`name` IS NOT NULL AND u.`name` <> ''
AND (c.`owner_user_name` IS NULL OR c.`owner_user_name` <> u.`name`);
-- 6. 回访记录:回访人姓名
UPDATE `yz_backend_crm_follow` c
JOIN `yz_system_tenant_user` u
ON u.`tid` = CAST(c.`tenant_id` AS UNSIGNED)
AND u.`uid` = CAST(c.`owner_user_id` AS UNSIGNED)
SET c.`owner_user_name` = u.`name`
WHERE c.`owner_user_id` <> ''
AND u.`name` IS NOT NULL AND u.`name` <> ''
AND (c.`owner_user_name` IS NULL OR c.`owner_user_name` <> u.`name`);
-- 7. 附件:上传人姓名
UPDATE `yz_backend_crm_attach` c
JOIN `yz_system_tenant_user` u
ON u.`tid` = CAST(c.`tenant_id` AS UNSIGNED)
AND u.`uid` = CAST(c.`uploader_id` AS UNSIGNED)
SET c.`uploader_name` = u.`name`
WHERE c.`uploader_id` <> ''
AND u.`name` IS NOT NULL AND u.`name` <> ''
AND (c.`uploader_name` IS NULL OR c.`uploader_name` <> u.`name`);
-- 8. 操作日志:操作人姓名
UPDATE `yz_backend_crm_operate_log` c
JOIN `yz_system_tenant_user` u
ON u.`tid` = CAST(c.`tenant_id` AS UNSIGNED)
AND u.`uid` = CAST(c.`operator_id` AS UNSIGNED)
SET c.`operator_name` = u.`name`
WHERE c.`operator_id` <> ''
AND u.`name` IS NOT NULL AND u.`name` <> ''
AND (c.`operator_name` IS NULL OR c.`operator_name` <> u.`name`);
-- 9. 核对:客户负责人分布
SELECT `owner_user_id`, `owner_user_name`, COUNT(*) AS `cnt`
FROM `yz_backend_erp_customer`
GROUP BY `owner_user_id`, `owner_user_name`;
+13 -17
View File
@@ -6,19 +6,19 @@
-- 线索转化为商机时才把客户名称落地为正式客户(yz_backend_erp_customer)。
-- 2. 线索转化商机后会被锁定(locked=1),后续操作都在商机进行。
-- 3. 商机转化项目后同样锁定(locked=1)。
-- 4. 回访/跟进记录(yz_tenant_crm_follow)与附件、联系人、操作日志均为通用多态表,
-- 4. 回访/跟进记录(yz_backend_crm_follow)与附件、联系人、操作日志均为通用多态表,
-- 通过 related_type(1线索/2商机/3项目) + related_id 关联。
-- 可重复执行(DROP TABLE IF EXISTS)。
-- ⚠️ 安全说明(重要):
-- 本脚本只做 CREATE TABLE IF NOT EXISTS,**不会删除或覆盖任何已有数据**,可重复执行。
-- 如需给已存在的表新增字段,请勿重跑本脚本,改用对应的 alter_*.sql 增量脚本。
-- =============================================================================
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- -----------------------------------------------------------------------------
-- 线索表
-- -----------------------------------------------------------------------------
DROP TABLE IF EXISTS `yz_tenant_crm_clue`;
CREATE TABLE `yz_tenant_crm_clue` (
CREATE TABLE IF NOT EXISTS `yz_backend_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 '线索名称',
@@ -55,8 +55,7 @@ CREATE TABLE `yz_tenant_crm_clue` (
-- -----------------------------------------------------------------------------
-- 商机表
-- -----------------------------------------------------------------------------
DROP TABLE IF EXISTS `yz_tenant_crm_business`;
CREATE TABLE `yz_tenant_crm_business` (
CREATE TABLE IF NOT EXISTS `yz_backend_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 '商机名称',
@@ -100,8 +99,7 @@ CREATE TABLE `yz_tenant_crm_business` (
-- -----------------------------------------------------------------------------
-- 项目表
-- -----------------------------------------------------------------------------
DROP TABLE IF EXISTS `yz_tenant_crm_project`;
CREATE TABLE `yz_tenant_crm_project` (
CREATE TABLE IF NOT EXISTS `yz_backend_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 '项目名称',
@@ -121,6 +119,7 @@ CREATE TABLE `yz_tenant_crm_project` (
`contact_phone` varchar(20) NOT NULL DEFAULT '' COMMENT '对接人手机',
`address` varchar(255) NOT NULL DEFAULT '' COMMENT '项目地址',
`remark` text COMMENT '备注',
`doc_category_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联OA文档库项目文件夹分类ID(共享文档/项目文档/{项目名称})',
`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 '更新时间',
@@ -137,13 +136,13 @@ CREATE TABLE `yz_tenant_crm_project` (
-- -----------------------------------------------------------------------------
-- 回访/跟进记录表(贯穿线索、商机、项目)
-- -----------------------------------------------------------------------------
DROP TABLE IF EXISTS `yz_tenant_crm_follow`;
CREATE TABLE `yz_tenant_crm_follow` (
CREATE TABLE IF NOT EXISTS `yz_backend_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 '关联对象名称(冗余,便于回访列表展示)',
`stage` tinyint(4) NOT NULL DEFAULT '1' COMMENT '创建阶段:1线索/2商机/3项目',
`follow_type` varchar(20) NOT NULL DEFAULT '1' COMMENT '回访方式:1电话/2微信/3上门/4邮件/5其他',
`follow_time` datetime DEFAULT NULL COMMENT '回访时间',
`content` text COMMENT '回访内容',
@@ -163,8 +162,7 @@ CREATE TABLE `yz_tenant_crm_follow` (
-- -----------------------------------------------------------------------------
-- 附件表(多态:线索/商机/项目的资料)
-- -----------------------------------------------------------------------------
DROP TABLE IF EXISTS `yz_tenant_crm_attach`;
CREATE TABLE `yz_tenant_crm_attach` (
CREATE TABLE IF NOT EXISTS `yz_backend_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项目',
@@ -187,8 +185,7 @@ CREATE TABLE `yz_tenant_crm_attach` (
-- -----------------------------------------------------------------------------
-- 联系人表(多态:线索/商机/项目的对接人列表)
-- -----------------------------------------------------------------------------
DROP TABLE IF EXISTS `yz_tenant_crm_entity_contact`;
CREATE TABLE `yz_tenant_crm_entity_contact` (
CREATE TABLE IF NOT EXISTS `yz_backend_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项目',
@@ -213,8 +210,7 @@ CREATE TABLE `yz_tenant_crm_entity_contact` (
-- -----------------------------------------------------------------------------
-- 操作日志表(多态:记录线索/商机/项目的关键操作,用于详情页操作日志 Tab)
-- -----------------------------------------------------------------------------
DROP TABLE IF EXISTS `yz_tenant_crm_operate_log`;
CREATE TABLE `yz_tenant_crm_operate_log` (
CREATE TABLE IF NOT EXISTS `yz_backend_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项目',