first commit

This commit is contained in:
Your Name
2026-09-08 11:40:15 +08:00
commit a5353f7eb5
9568 changed files with 1646214 additions and 0 deletions
@@ -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
parent.id,
'A',
'删除',
'',
4,
'finance.account_cost/delete',
'',
'',
'',
'',
1,
0,
UNIX_TIMESTAMP(),
UNIX_TIMESTAMP()
FROM `zyt_system_menu` parent
WHERE parent.perms = 'finance.account_cost/lists'
AND NOT EXISTS (
SELECT 1
FROM `zyt_system_menu` child
WHERE child.pid = parent.id
AND child.perms = 'finance.account_cost/delete'
);
@@ -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,32 @@
CREATE TABLE IF NOT EXISTS `zyt_qywx_media_channel` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`channel_code` varchar(80) NOT NULL DEFAULT '' COMMENT '渠道编码:由 tag_id 或 tag_name 生成',
`channel_name` varchar(100) NOT NULL DEFAULT '' COMMENT '渠道名称(展示名)',
`source_tag_id` varchar(64) NOT NULL DEFAULT '' COMMENT '企微标签ID',
`source_tag_name` varchar(100) NOT NULL DEFAULT '' COMMENT '企微标签名',
`source_group_name` varchar(100) NOT NULL DEFAULT '' COMMENT '企微标签组名',
`tag_uniq_key` varchar(120) NOT NULL DEFAULT '' COMMENT '标签唯一键:优先 tag_id,否则 tag_name 哈希',
`status` tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT '状态:1=启用',
`last_seen_time` int(11) unsigned NOT NULL DEFAULT 0 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_channel_code` (`channel_code`),
UNIQUE KEY `uk_tag_uniq_key` (`tag_uniq_key`),
KEY `idx_status` (`status`),
KEY `idx_last_seen_time` (`last_seen_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='企微渠道标签源表';
ALTER TABLE `zyt_account_cost`
ADD COLUMN `media_channel_code` varchar(80) NOT NULL DEFAULT '' COMMENT '渠道编码' AFTER `cost_date`,
ADD COLUMN `media_channel_name` varchar(100) NOT NULL DEFAULT '' COMMENT '渠道名称' AFTER `media_channel_code`,
ADD COLUMN `dept_id` int(11) unsigned NOT NULL DEFAULT 0 COMMENT '绑定部门ID' AFTER `media_channel_name`,
ADD COLUMN `dept_name` varchar(100) NOT NULL DEFAULT '' COMMENT '绑定部门名称' AFTER `dept_id`;
ALTER TABLE `zyt_account_cost`
DROP INDEX `uk_cost_date`,
ADD UNIQUE KEY `uk_cost_date_channel_dept` (`cost_date`, `media_channel_code`, `dept_id`),
ADD KEY `idx_cost_date_channel_dept` (`cost_date`, `media_channel_code`, `dept_id`);
-- 初始化渠道源
-- php think qywx:scan-media-channel