This commit is contained in:
Your Name
2026-04-30 09:27:42 +08:00
parent dc899e4af4
commit eb782305e6
460 changed files with 10785 additions and 928 deletions
@@ -0,0 +1,43 @@
-- 企微外部联系人 ↔ 标签 关系表
--
-- 行粒度:(external_userid, follow_user_id, tag_id) 三元组 —— 即"某客户被某员工打的某标签"。
-- 这样能区分同一个标签是哪个员工打的,便于按员工维度统计;同时按 (external_userid, tag_id) 聚合可得"客户去重后的标签集合"。
--
-- 字段冗余说明:tag_name / group_name / type 直接落在关系行,列表筛选 / 统计 SQL 不必再 JOIN 标签字典表
-- (企微侧标签改名时,UPSERT 时会同步刷新这些冗余字段,create_time 保持不变)。
--
-- 与 zyt_qywx_external_contact.tagsJSON 字段)的分工:
-- - tags JSON:详情页直接渲染,不需要 JOIN
-- - 本关系表:列表筛选 / 多标签 AND/OR / GROUP BY 统计 / 漏斗分析
SET @t := (
SELECT COUNT(*)
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'zyt_qywx_external_contact_tag'
);
SET @sql := IF(
@t = 0,
"CREATE TABLE `zyt_qywx_external_contact_tag` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`external_userid` varchar(64) NOT NULL DEFAULT '' COMMENT '客户外部IDzyt_qywx_external_contact.external_userid',
`follow_user_id` varchar(64) NOT NULL DEFAULT '' COMMENT '打这个标签的跟进员工 userid(企微 follow_user.userid',
`tag_id` varchar(64) NOT NULL DEFAULT '' COMMENT '标签ID(企微 tag_id',
`tag_name` varchar(128) NOT NULL DEFAULT '' COMMENT '标签名快照',
`group_name` varchar(128) NOT NULL DEFAULT '' COMMENT '标签分组名快照',
`type` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '1=企业标签 / 2=其他标签',
`create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_ext_user_tag` (`external_userid`, `follow_user_id`, `tag_id`),
KEY `idx_tag` (`tag_id`),
KEY `idx_ext` (`external_userid`),
KEY `idx_group` (`group_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企业微信客户-标签关系表'",
'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
@@ -0,0 +1,26 @@
-- 给「企业微信外部联系人」表加 tags 字段:
-- 直接把 /externalcontact/get 返回的 follow_user[].tags 合并去重(按 tag_id)后存 JSON 字符串,
-- 便于后台无需解析 follow_users 大 JSON 即可快速查看/筛选客户标签。
--
-- 示例值:
-- [{"group_name":"自媒体1","tag_name":"自媒体1","type":1,"tag_id":"etRr2rJQAABTrZUYkJRuP06BX0GUCaaA"}]
--
-- 通过 information_schema 兼容多次执行(不存在再加),避免重复执行报错。
SET @col := (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'zyt_qywx_external_contact'
AND COLUMN_NAME = 'tags'
);
SET @sql := IF(
@col = 0,
'ALTER TABLE `zyt_qywx_external_contact` ADD COLUMN `tags` TEXT NULL COMMENT ''follow_user 标签合并去重(JSON[{tag_id,tag_name,group_name,type}])'' AFTER `follow_users`',
'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
@@ -0,0 +1,59 @@
-- 业绩看板(fans/yeji):把 3 个后端接口权限挂到现有菜单 id=293name='数据统计', component='fans/yeji')下
-- 已存在则跳过,幂等
-- 1) 标准化页面菜单本身:补 perms 占位(保持页面权限码与 component 对应,便于后续按页面授权)
UPDATE `zyt_system_menu`
SET `perms` = 'fans/yeji'
WHERE `id` = 293 AND (`perms` IS NULL OR `perms` = '');
-- 2) 接口:业绩看板单区间 overview
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
293, 'A', '业绩-单区间', '', 1,
'stats.yejiStats/overview', '', '', '', '',
1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM `zyt_system_menu` m
WHERE m.pid = 293 AND m.perms = 'stats.yejiStats/overview'
);
-- 3) 接口:业绩看板多区间 multi(默认 月/周/今日/昨日)
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
293, 'A', '业绩-多区间', '', 2,
'stats.yejiStats/multi', '', '', '', '',
1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM `zyt_system_menu` m
WHERE m.pid = 293 AND m.perms = 'stats.yejiStats/multi'
);
-- 4) 接口:业绩看板部门下拉
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
293, 'A', '业绩-部门下拉', '', 3,
'stats.yejiStats/deptOptions', '', '', '', '',
1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM `zyt_system_menu` m
WHERE m.pid = 293 AND m.perms = 'stats.yejiStats/deptOptions'
);
-- 5) 接口:业绩看板渠道下拉
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
293, 'A', '业绩-渠道下拉', '', 4,
'stats.yejiStats/channelOptions', '', '', '', '',
1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM `zyt_system_menu` m
WHERE m.pid = 293 AND m.perms = 'stats.yejiStats/channelOptions'
);
@@ -0,0 +1,14 @@
-- 业绩看板医助排行榜接口权限(fans/yeji · pid=293
-- 已存在则跳过,幂等
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
293, 'A', '业绩-医助排行榜', '', 5,
'stats.yejiStats/leaderboard', '', '', '', '',
1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM `zyt_system_menu` m
WHERE m.pid = 293 AND m.perms = 'stats.yejiStats/leaderboard'
);
@@ -0,0 +1,25 @@
-- 财务管理:制定业绩(按月维护各部门目标)幂等
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
166, 'C', '制定业绩', 'el-icon-Flag', 25,
'finance.dept_performance_target/monthMatrix', 'mubiao', 'finance/mubiao', '', '',
1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM dual
WHERE NOT EXISTS (
SELECT 1 FROM `zyt_system_menu` m WHERE m.paths = 'mubiao' OR m.perms = 'finance.dept_performance_target/monthMatrix'
);
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
m.id, 'A', '保存业绩目标', '', 1,
'finance.dept_performance_target/batchSave', '', '', '', '',
1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM `zyt_system_menu` m
WHERE m.paths = 'mubiao' AND m.type = 'C'
AND NOT EXISTS (
SELECT 1 FROM `zyt_system_menu` x WHERE x.perms = 'finance.dept_performance_target/batchSave'
)
LIMIT 1;
@@ -0,0 +1,18 @@
-- 各部门月度业绩目标(制定业绩)
CREATE TABLE IF NOT EXISTS `zyt_dept_performance_target` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`dept_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '部门ID',
`dept_name` varchar(100) NOT NULL DEFAULT '' COMMENT '部门名称快照',
`year_month` char(7) NOT NULL DEFAULT '' COMMENT '目标月份 YYYY-MM',
`target_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '目标业绩金额(元)',
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
`creator_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建人',
`creator_name` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人姓名',
`updater_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '最后修改人',
`updater_name` varchar(64) NOT NULL DEFAULT '' COMMENT '最后修改人姓名',
`create_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '创建时间',
`update_time` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_dept_year_month` (`dept_id`, `year_month`),
KEY `idx_year_month` (`year_month`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门月度业绩目标';