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,145 @@
-- 自录数据统计菜单(挂在「数据统计」目录下)
-- 目录: /stats/self_input(自录数据统计)
-- 子菜单:
-- 自录转化统计 -> /stats/self_input
-- 账户消耗录入 -> /stats/self_input/account_cost
-- 子菜单 paths 为相对父级目录的路径片段。
-- ========== 已执行旧版 SQL 的环境:迁移到「自录数据统计」目录 ==========
SET @stats_root_id = (
SELECT `id` FROM `zyt_system_menu`
WHERE `paths` = '/stats' AND `type` = 'M'
ORDER BY `id` ASC
LIMIT 1
);
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
@stats_root_id, 'M', '自录数据统计', '', 5, '', 'self_input', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE @stats_root_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM `zyt_system_menu`
WHERE `pid` = @stats_root_id AND `type` = 'M' AND `name` = '自录数据统计'
);
SET @self_input_group_id = (
SELECT `id` FROM `zyt_system_menu`
WHERE `pid` = @stats_root_id AND `type` = 'M' AND `name` = '自录数据统计'
ORDER BY `id` ASC
LIMIT 1
);
UPDATE `zyt_system_menu`
SET `pid` = @self_input_group_id,
`paths` = '',
`component` = 'stats/self_input/index',
`sort` = 1
WHERE `perms` = 'stats.self_input/overview'
AND @self_input_group_id IS NOT NULL;
UPDATE `zyt_system_menu`
SET `pid` = @self_input_group_id,
`paths` = 'account_cost',
`component` = 'stats/self_input/account_cost',
`sort` = 2
WHERE `perms` = 'stats.personal_account_cost/lists'
AND @self_input_group_id IS NOT NULL;
-- ========== 全新安装:目录 + 子菜单 + 按钮权限 ==========
SET @stats_root_id = (
SELECT `id` FROM `zyt_system_menu`
WHERE `paths` = '/stats' AND `type` = 'M'
ORDER BY `id` ASC
LIMIT 1
);
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
@stats_root_id, 'M', '自录数据统计', '', 5, '', 'self_input', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE @stats_root_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM `zyt_system_menu`
WHERE `pid` = @stats_root_id AND `type` = 'M' AND `name` = '自录数据统计'
);
SET @self_input_group_id = (
SELECT `id` FROM `zyt_system_menu`
WHERE `pid` = @stats_root_id AND `type` = 'M' AND `name` = '自录数据统计'
ORDER BY `id` ASC
LIMIT 1
);
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
@self_input_group_id, 'C', '自录转化统计', '', 1, 'stats.self_input/overview', '', 'stats/self_input/index', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE @self_input_group_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM `zyt_system_menu`
WHERE `perms` = 'stats.self_input/overview'
);
SET @self_input_menu_id = (
SELECT `id` FROM `zyt_system_menu`
WHERE `perms` = 'stats.self_input/overview'
LIMIT 1
);
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT @self_input_menu_id, 'A', '查看业绩', '', 1, 'stats.personal_yeji/lists', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE @self_input_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'stats.personal_yeji/lists');
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT @self_input_menu_id, 'A', '新增业绩', '', 2, 'stats.personal_yeji/add', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE @self_input_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'stats.personal_yeji/add');
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT @self_input_menu_id, 'A', '编辑业绩', '', 3, 'stats.personal_yeji/edit', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE @self_input_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'stats.personal_yeji/edit');
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT @self_input_menu_id, 'A', '删除业绩', '', 4, 'stats.personal_yeji/delete', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE @self_input_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'stats.personal_yeji/delete');
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT
@self_input_group_id, 'C', '账户消耗录入', '', 2, 'stats.personal_account_cost/lists', 'account_cost', 'stats/self_input/account_cost', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL
WHERE @self_input_group_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM `zyt_system_menu`
WHERE `perms` = 'stats.personal_account_cost/lists'
);
SET @personal_cost_menu_id = (
SELECT `id` FROM `zyt_system_menu`
WHERE `perms` = 'stats.personal_account_cost/lists'
LIMIT 1
);
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT @personal_cost_menu_id, 'A', '新增消耗', '', 1, 'stats.personal_account_cost/add', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE @personal_cost_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'stats.personal_account_cost/add');
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT @personal_cost_menu_id, 'A', '编辑消耗', '', 2, 'stats.personal_account_cost/edit', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE @personal_cost_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'stats.personal_account_cost/edit');
INSERT INTO `zyt_system_menu`
(`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`)
SELECT @personal_cost_menu_id, 'A', '删除消耗', '', 3, 'stats.personal_account_cost/delete', '', '', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
FROM DUAL WHERE @personal_cost_menu_id IS NOT NULL AND NOT EXISTS (SELECT 1 FROM `zyt_system_menu` WHERE `perms` = 'stats.personal_account_cost/delete');
-- 角色需勾选新目录「自录数据统计」后,子菜单权限才会一并生效(与 likeadmin 菜单树授权一致)
@@ -0,0 +1,83 @@
-- 自录业绩/账户消耗:把唯一索引补上 delete_time,使软删后可重新录入。
--
-- 背景:
-- 旧索引 uk_creator_date_media = (creator_id, date, media_source) 不含 delete_time
-- 软删的历史记录会继续占用唯一键,导致同账号同日同渠道再次新增触发 MySQL 1062。
--
-- 新索引 uk_creator_date_media = (creator_id, date, media_source, delete_time)
-- MySQL 中 NULL ≠ NULL
-- - 活跃记录 delete_time = NULL,最多 1 条(行为不变,仍唯一)
-- - 软删后 delete_time 变成时间戳,与新插入的 NULL 不冲突 → 允许重新录入
--
-- 可重复执行:先检查再操作,避免 1091/1061 报错。
-- ========== 查看当前索引(可选) ==========
SELECT
TABLE_NAME,
INDEX_NAME,
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS COLUMNS
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ('zyt_personal_yeji', 'zyt_personal_account_cost')
AND INDEX_NAME IN ('uk_date_media', 'uk_creator_date_media')
GROUP BY TABLE_NAME, INDEX_NAME
ORDER BY TABLE_NAME, INDEX_NAME;
-- ========== zyt_personal_yeji ==========
-- 清理可能存在的旧版「全局唯一」索引
SET @sql = IF(
(SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'zyt_personal_yeji'
AND INDEX_NAME = 'uk_date_media') > 0,
'ALTER TABLE `zyt_personal_yeji` DROP INDEX `uk_date_media`',
'SELECT ''zyt_personal_yeji: 无 uk_date_media,跳过删除'' AS message'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 删除旧的 3 列唯一索引(若存在)
SET @sql = IF(
(SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'zyt_personal_yeji'
AND INDEX_NAME = 'uk_creator_date_media') > 0,
'ALTER TABLE `zyt_personal_yeji` DROP INDEX `uk_creator_date_media`',
'SELECT ''zyt_personal_yeji: 无 uk_creator_date_media,跳过删除'' AS message'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 添加 4 列唯一索引(包含 delete_time
ALTER TABLE `zyt_personal_yeji`
ADD UNIQUE KEY `uk_creator_date_media` (`creator_id`, `yeji_date`, `media_source`, `delete_time`);
-- ========== zyt_personal_account_cost ==========
SET @sql = IF(
(SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'zyt_personal_account_cost'
AND INDEX_NAME = 'uk_date_media') > 0,
'ALTER TABLE `zyt_personal_account_cost` DROP INDEX `uk_date_media`',
'SELECT ''zyt_personal_account_cost: 无 uk_date_media,跳过删除'' AS message'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @sql = IF(
(SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'zyt_personal_account_cost'
AND INDEX_NAME = 'uk_creator_date_media') > 0,
'ALTER TABLE `zyt_personal_account_cost` DROP INDEX `uk_creator_date_media`',
'SELECT ''zyt_personal_account_cost: 无 uk_creator_date_media,跳过删除'' AS message'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
ALTER TABLE `zyt_personal_account_cost`
ADD UNIQUE KEY `uk_creator_date_media` (`creator_id`, `cost_date`, `media_source`, `delete_time`);
@@ -0,0 +1,20 @@
CREATE TABLE IF NOT EXISTS `zyt_personal_account_cost` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`cost_date` date NOT NULL COMMENT '消耗日期',
`media_source` varchar(120) NOT NULL DEFAULT '' COMMENT '自媒体来源',
`amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '账户消耗金额',
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
`creator_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '录入人ID',
`creator_name` varchar(64) NOT NULL DEFAULT '' COMMENT '录入人姓名',
`updater_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '最后修改人ID',
`updater_name` varchar(64) NOT NULL DEFAULT '' COMMENT '最后修改人姓名',
`dept_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '录入时部门ID快照',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
`delete_time` int(11) unsigned DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_creator_date_media` (`creator_id`, `cost_date`, `media_source`, `delete_time`),
KEY `idx_cost_date` (`cost_date`),
KEY `idx_creator_id` (`creator_id`),
KEY `idx_dept_id` (`dept_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='个人账户消耗录入表';
@@ -0,0 +1,27 @@
CREATE TABLE IF NOT EXISTS `zyt_personal_yeji` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`yeji_date` date NOT NULL COMMENT '业绩日期',
`media_source` varchar(120) NOT NULL DEFAULT '' COMMENT '自媒体来源',
`add_fans_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '加粉数',
`total_open_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '总开口',
`unreplied_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '未回复',
`paid_appointment_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '付费挂号',
`free_appointment_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '免费挂号',
`interview_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '面诊',
`order_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '订单金额',
`completed_order_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '接诊诊单',
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '备注',
`creator_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '录入人ID',
`creator_name` varchar(64) NOT NULL DEFAULT '' COMMENT '录入人姓名',
`updater_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '最后修改人ID',
`updater_name` varchar(64) NOT NULL DEFAULT '' COMMENT '最后修改人姓名',
`dept_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '录入时部门ID快照',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
`delete_time` int(11) unsigned DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_creator_date_media` (`creator_id`, `yeji_date`, `media_source`, `delete_time`),
KEY `idx_yeji_date` (`yeji_date`),
KEY `idx_creator_id` (`creator_id`),
KEY `idx_dept_id` (`dept_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='个人业绩录入表';