feat: restore learning feedback and knowledge capabilities
This commit is contained in:
@@ -5,7 +5,7 @@ CREATE TABLE IF NOT EXISTS `aihr_knowledge_info` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户编号',
|
||||
`name` varchar(100) NOT NULL COMMENT '知识库名称',
|
||||
`code` varchar(100) NOT NULL COMMENT '租户内稳定空间编码',
|
||||
`code` varchar(100) DEFAULT NULL COMMENT '租户内稳定空间编码;平台迁移会回填 legacy 编码并改为必填',
|
||||
`space_type` varchar(30) NOT NULL DEFAULT 'BUSINESS' COMMENT 'PUBLIC/BUSINESS/MANAGEMENT/EXTERNAL',
|
||||
`sensitivity_level` varchar(30) NOT NULL DEFAULT 'INTERNAL' COMMENT 'PUBLIC/INTERNAL/CONFIDENTIAL',
|
||||
`status` varchar(20) NOT NULL DEFAULT 'ACTIVE' COMMENT 'DRAFT/ACTIVE/DISABLED',
|
||||
@@ -230,3 +230,17 @@ CREATE TABLE IF NOT EXISTS `aihr_knowledge_query_log` (
|
||||
KEY `idx_aihr_query_tenant_app` (`tenant_id`, `app_id`, `create_time`),
|
||||
KEY `idx_aihr_query_status` (`tenant_id`, `status`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='知识问答最小化审计日志';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_knowledge_admin_audit` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
|
||||
`operator_id` bigint DEFAULT NULL COMMENT '操作人',
|
||||
`action` varchar(50) NOT NULL COMMENT '操作动作',
|
||||
`object_type` varchar(30) NOT NULL COMMENT 'SPACE/GRANT/APP/APP_SPACE/TOKEN',
|
||||
`object_id` bigint DEFAULT NULL COMMENT '对象ID',
|
||||
`before_summary` varchar(1000) DEFAULT NULL COMMENT '变更前摘要',
|
||||
`after_summary` varchar(1000) DEFAULT NULL COMMENT '变更后摘要',
|
||||
`create_time` datetime NOT NULL COMMENT '操作时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_aihr_admin_audit_tenant` (`tenant_id`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='知识平台管理变更审计';
|
||||
|
||||
@@ -119,6 +119,8 @@ CREATE TABLE IF NOT EXISTS `aihr_practice_assignment` (
|
||||
`source` varchar(30) NOT NULL DEFAULT 'manual' COMMENT '来源 daily/camp/retry/manual',
|
||||
`reason` varchar(500) DEFAULT NULL COMMENT '派发原因',
|
||||
`status` varchar(30) NOT NULL DEFAULT '待训练' COMMENT '状态',
|
||||
`due_date` date DEFAULT NULL COMMENT '训练截止日期',
|
||||
`request_key` varchar(100) DEFAULT NULL COMMENT '客户端幂等请求ID',
|
||||
`answer_text` varchar(1000) DEFAULT NULL COMMENT '每日三题作答',
|
||||
`answer_audio_url` varchar(500) DEFAULT NULL COMMENT '每日三题语音回放地址',
|
||||
`answer_audio_oss_id` bigint DEFAULT NULL COMMENT '每日三题语音OSS编号',
|
||||
@@ -130,6 +132,7 @@ CREATE TABLE IF NOT EXISTS `aihr_practice_assignment` (
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_assignment_request` (`tenant_id`, `request_key`, `ext_party_id`),
|
||||
KEY `idx_aihr_assignment_party` (`tenant_id`, `ext_party_id`, `status`, `create_time`),
|
||||
KEY `idx_aihr_assignment_source` (`tenant_id`, `source`, `status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AI HR 对练派发任务';
|
||||
|
||||
@@ -1,15 +1,50 @@
|
||||
-- AIHR BRD 住宅 SOP 补充迁移(MySQL 8.x)
|
||||
-- 补齐服务推介与日常服务两类可检索 SOP;不写入正式评审数据,可重复执行。
|
||||
|
||||
INSERT INTO `aihr_knowledge_info`
|
||||
(`id`, `tenant_id`, `name`, `description`, `separator`, `overlap_char`, `retrieve_limit`, `similarity_threshold`, `text_block_size`, `vector_model`, `embedding_model`, `enable_hybrid`, `hybrid_alpha`, `system_prompt`, `create_time`, `update_time`, `remark`)
|
||||
CREATE TEMPORARY TABLE IF NOT EXISTS `_aihr_brd_sop_space_seed` (
|
||||
`id` bigint NOT NULL,
|
||||
`tenant_id` varchar(20) NOT NULL,
|
||||
`code` varchar(100) NOT NULL,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`description` varchar(500) DEFAULT NULL,
|
||||
`separator` varchar(20) DEFAULT NULL,
|
||||
`overlap_char` int DEFAULT NULL,
|
||||
`retrieve_limit` int DEFAULT NULL,
|
||||
`similarity_threshold` decimal(6,4) DEFAULT NULL,
|
||||
`text_block_size` int DEFAULT NULL,
|
||||
`vector_model` varchar(100) DEFAULT NULL,
|
||||
`embedding_model` varchar(100) DEFAULT NULL,
|
||||
`enable_hybrid` tinyint DEFAULT NULL,
|
||||
`hybrid_alpha` decimal(6,4) DEFAULT NULL,
|
||||
`system_prompt` text,
|
||||
`create_time` datetime DEFAULT NULL,
|
||||
`update_time` datetime DEFAULT NULL,
|
||||
`remark` varchar(500) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
|
||||
DELETE FROM `_aihr_brd_sop_space_seed`;
|
||||
|
||||
INSERT INTO `_aihr_brd_sop_space_seed`
|
||||
(`id`, `tenant_id`, `code`, `name`, `description`, `separator`, `overlap_char`, `retrieve_limit`, `similarity_threshold`, `text_block_size`, `vector_model`, `embedding_model`, `enable_hybrid`, `hybrid_alpha`, `system_prompt`, `create_time`, `update_time`, `remark`)
|
||||
VALUES
|
||||
(1201, '000000', '增值服务需求识别 SOP', '基于业主真实需求介绍增值服务,明确适用范围、价格和取消规则。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '只能基于已确认的服务目录和价目口径回答,不得编造优惠或效果承诺。', NOW(), NOW(), 'seed:sop:brd-supplement'),
|
||||
(1202, '000000', '日常服务回访 SOP', '服务完成后的满意度确认、遗留问题记录、责任人和回访节点。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '已完成不等于已闭环,回答必须包含满意度确认、责任人和下一次回访节点。', NOW(), NOW(), 'seed:sop:brd-supplement')
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`description` = VALUES(`description`),
|
||||
`system_prompt` = VALUES(`system_prompt`),
|
||||
`update_time` = NOW();
|
||||
(1201, '000000', 'sop_service_promotion', '增值服务需求识别 SOP', '基于业主真实需求介绍增值服务,明确适用范围、价格和取消规则。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '只能基于已确认的服务目录和价目口径回答,不得编造优惠或效果承诺。', NOW(), NOW(), 'seed:sop:brd-supplement'),
|
||||
(1202, '000000', 'sop_daily_service', '日常服务回访 SOP', '服务完成后的满意度确认、遗留问题记录、责任人和回访节点。', '\n\n', 120, 5, 0.5, 800, NULL, NULL, 1, 1.0, '已完成不等于已闭环,回答必须包含满意度确认、责任人和下一次回访节点。', NOW(), NOW(), 'seed:sop:brd-supplement');
|
||||
|
||||
SET @aihr_space_code_exists := (
|
||||
SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'aihr_knowledge_info' AND COLUMN_NAME = 'code'
|
||||
);
|
||||
SET @aihr_brd_sop_space_upsert := IF(
|
||||
@aihr_space_code_exists = 1,
|
||||
'INSERT INTO `aihr_knowledge_info` (`id`, `tenant_id`, `code`, `name`, `description`, `separator`, `overlap_char`, `retrieve_limit`, `similarity_threshold`, `text_block_size`, `vector_model`, `embedding_model`, `enable_hybrid`, `hybrid_alpha`, `system_prompt`, `create_time`, `update_time`, `remark`) SELECT `id`, `tenant_id`, `code`, `name`, `description`, `separator`, `overlap_char`, `retrieve_limit`, `similarity_threshold`, `text_block_size`, `vector_model`, `embedding_model`, `enable_hybrid`, `hybrid_alpha`, `system_prompt`, `create_time`, `update_time`, `remark` FROM `_aihr_brd_sop_space_seed` ON DUPLICATE KEY UPDATE `code` = VALUES(`code`), `description` = VALUES(`description`), `system_prompt` = VALUES(`system_prompt`), `update_time` = NOW()',
|
||||
'INSERT INTO `aihr_knowledge_info` (`id`, `tenant_id`, `name`, `description`, `separator`, `overlap_char`, `retrieve_limit`, `similarity_threshold`, `text_block_size`, `vector_model`, `embedding_model`, `enable_hybrid`, `hybrid_alpha`, `system_prompt`, `create_time`, `update_time`, `remark`) SELECT `id`, `tenant_id`, `name`, `description`, `separator`, `overlap_char`, `retrieve_limit`, `similarity_threshold`, `text_block_size`, `vector_model`, `embedding_model`, `enable_hybrid`, `hybrid_alpha`, `system_prompt`, `create_time`, `update_time`, `remark` FROM `_aihr_brd_sop_space_seed` ON DUPLICATE KEY UPDATE `description` = VALUES(`description`), `system_prompt` = VALUES(`system_prompt`), `update_time` = NOW()'
|
||||
);
|
||||
PREPARE aihr_brd_sop_space_stmt FROM @aihr_brd_sop_space_upsert;
|
||||
EXECUTE aihr_brd_sop_space_stmt;
|
||||
DEALLOCATE PREPARE aihr_brd_sop_space_stmt;
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS `_aihr_brd_sop_space_seed`;
|
||||
|
||||
INSERT INTO `aihr_knowledge_attach`
|
||||
(`id`, `tenant_id`, `knowledge_id`, `doc_id`, `name`, `type`, `status`, `create_time`, `update_time`, `remark`)
|
||||
|
||||
@@ -68,7 +68,10 @@ INSERT INTO aihr_brd_rubric_codes (tenant_id, rubric_code)
|
||||
SELECT r.tenant_id, r.rubric_code
|
||||
FROM aihr_practice_rubric r
|
||||
JOIN aihr_practice_scenario s
|
||||
ON s.tenant_id = r.tenant_id AND s.scenario_code = r.scenario_code
|
||||
ON CONVERT(s.tenant_id USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
= CONVERT(r.tenant_id USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
AND CONVERT(s.scenario_code USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
= CONVERT(r.scenario_code USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
JOIN (
|
||||
SELECT tenant_id, rubric_code
|
||||
FROM aihr_practice_rubric_dimension
|
||||
@@ -76,14 +79,20 @@ JOIN (
|
||||
GROUP BY tenant_id, rubric_code
|
||||
HAVING COUNT(*) = 4
|
||||
) old_dimensions
|
||||
ON old_dimensions.tenant_id = r.tenant_id AND old_dimensions.rubric_code = r.rubric_code
|
||||
ON CONVERT(old_dimensions.tenant_id USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
= CONVERT(r.tenant_id USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
AND CONVERT(old_dimensions.rubric_code USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
= CONVERT(r.rubric_code USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
WHERE r.tenant_id = '000000'
|
||||
AND s.position = '生活顾问';
|
||||
|
||||
DELETE d
|
||||
FROM aihr_practice_rubric_dimension d
|
||||
JOIN aihr_brd_rubric_codes r
|
||||
ON r.tenant_id = d.tenant_id AND r.rubric_code = d.rubric_code;
|
||||
ON CONVERT(r.tenant_id USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
= CONVERT(d.tenant_id USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
AND CONVERT(r.rubric_code USING utf8mb4) COLLATE utf8mb4_0900_ai_ci
|
||||
= CONVERT(d.rubric_code USING utf8mb4) COLLATE utf8mb4_0900_ai_ci;
|
||||
|
||||
INSERT INTO aihr_practice_rubric_dimension
|
||||
(tenant_id, rubric_code, dimension_code, dimension_name, weight, description, sort_order, create_time, update_time)
|
||||
|
||||
@@ -152,3 +152,17 @@ CREATE TABLE IF NOT EXISTS `aihr_knowledge_query_log` (
|
||||
KEY `idx_aihr_query_tenant_app` (`tenant_id`, `app_id`, `create_time`),
|
||||
KEY `idx_aihr_query_status` (`tenant_id`, `status`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='知识问答最小化审计日志';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_knowledge_admin_audit` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` varchar(20) NOT NULL,
|
||||
`operator_id` bigint DEFAULT NULL,
|
||||
`action` varchar(50) NOT NULL,
|
||||
`object_type` varchar(30) NOT NULL,
|
||||
`object_id` bigint DEFAULT NULL,
|
||||
`before_summary` varchar(1000) DEFAULT NULL,
|
||||
`after_summary` varchar(1000) DEFAULT NULL,
|
||||
`create_time` datetime NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_aihr_admin_audit_tenant` (`tenant_id`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='知识平台管理变更审计';
|
||||
|
||||
@@ -0,0 +1,201 @@
|
||||
-- 学习闭环:训练题快照/反馈、岗位题库、入职考试(MySQL 8.x)。
|
||||
-- 可重复执行;先于 aihr_20260717_practice_five_position_catalog_mysql8.sql 执行。
|
||||
|
||||
SET @aihr_schema = DATABASE();
|
||||
|
||||
SET @content_version_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @aihr_schema AND table_name = 'aihr_practice_assignment' AND column_name = 'content_version'
|
||||
);
|
||||
SET @content_version_ddl = IF(@content_version_exists = 0,
|
||||
'ALTER TABLE aihr_practice_assignment ADD COLUMN content_version varchar(30) DEFAULT ''v1'' COMMENT ''派发内容版本'' AFTER request_key',
|
||||
'SELECT 1');
|
||||
PREPARE aihr_content_version_stmt FROM @content_version_ddl;
|
||||
EXECUTE aihr_content_version_stmt;
|
||||
DEALLOCATE PREPARE aihr_content_version_stmt;
|
||||
|
||||
SET @question_snapshot_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @aihr_schema AND table_name = 'aihr_practice_assignment' AND column_name = 'question_snapshot'
|
||||
);
|
||||
SET @question_snapshot_ddl = IF(@question_snapshot_exists = 0,
|
||||
'ALTER TABLE aihr_practice_assignment ADD COLUMN question_snapshot varchar(1000) DEFAULT NULL COMMENT ''派发时题目快照'' AFTER content_version',
|
||||
'SELECT 1');
|
||||
PREPARE aihr_question_snapshot_stmt FROM @question_snapshot_ddl;
|
||||
EXECUTE aihr_question_snapshot_stmt;
|
||||
DEALLOCATE PREPARE aihr_question_snapshot_stmt;
|
||||
|
||||
SET @reference_snapshot_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @aihr_schema AND table_name = 'aihr_practice_assignment' AND column_name = 'reference_answer_snapshot'
|
||||
);
|
||||
SET @reference_snapshot_ddl = IF(@reference_snapshot_exists = 0,
|
||||
'ALTER TABLE aihr_practice_assignment ADD COLUMN reference_answer_snapshot varchar(2000) DEFAULT NULL COMMENT ''派发时参考答案快照'' AFTER question_snapshot',
|
||||
'SELECT 1');
|
||||
PREPARE aihr_reference_snapshot_stmt FROM @reference_snapshot_ddl;
|
||||
EXECUTE aihr_reference_snapshot_stmt;
|
||||
DEALLOCATE PREPARE aihr_reference_snapshot_stmt;
|
||||
|
||||
SET @content_hash_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @aihr_schema AND table_name = 'aihr_practice_assignment' AND column_name = 'content_hash'
|
||||
);
|
||||
SET @content_hash_ddl = IF(@content_hash_exists = 0,
|
||||
'ALTER TABLE aihr_practice_assignment ADD COLUMN content_hash char(64) DEFAULT NULL COMMENT ''版本化内容哈希'' AFTER reference_answer_snapshot',
|
||||
'SELECT 1');
|
||||
PREPARE aihr_content_hash_stmt FROM @content_hash_ddl;
|
||||
EXECUTE aihr_content_hash_stmt;
|
||||
DEALLOCATE PREPARE aihr_content_hash_stmt;
|
||||
|
||||
SET @content_hash_index_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = @aihr_schema AND table_name = 'aihr_practice_assignment' AND index_name = 'idx_aihr_assignment_recent_content'
|
||||
);
|
||||
SET @content_hash_index_ddl = IF(@content_hash_index_exists = 0,
|
||||
'ALTER TABLE aihr_practice_assignment ADD KEY idx_aihr_assignment_recent_content (tenant_id, ext_party_id, source, content_hash, create_time)',
|
||||
'SELECT 1');
|
||||
PREPARE aihr_content_hash_index_stmt FROM @content_hash_index_ddl;
|
||||
EXECUTE aihr_content_hash_index_stmt;
|
||||
DEALLOCATE PREPARE aihr_content_hash_index_stmt;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_learning_question` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
|
||||
`question_code` varchar(120) NOT NULL COMMENT '题目编码',
|
||||
`scenario_code` varchar(80) NOT NULL COMMENT '场景编码',
|
||||
`position_code` varchar(80) NOT NULL COMMENT '岗位编码',
|
||||
`question_type` varchar(20) NOT NULL DEFAULT 'daily' COMMENT 'daily/special',
|
||||
`question_text` varchar(1000) NOT NULL COMMENT '题干',
|
||||
`reference_answer` varchar(2000) NOT NULL COMMENT '参考答案',
|
||||
`content_version` varchar(30) NOT NULL DEFAULT 'v1' COMMENT '内容版本',
|
||||
`content_hash` char(64) NOT NULL COMMENT '题目内容哈希',
|
||||
`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '是否启用',
|
||||
`sort_order` int NOT NULL DEFAULT 0 COMMENT '排序',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_learning_question` (`tenant_id`, `question_code`),
|
||||
KEY `idx_aihr_learning_question_matrix` (`tenant_id`, `position_code`, `question_type`, `enabled`, `sort_order`),
|
||||
KEY `idx_aihr_learning_question_hash` (`tenant_id`, `content_hash`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='岗位场景学习题库';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_practice_question_feedback` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
|
||||
`assignment_id` bigint NOT NULL COMMENT '训练题派发ID',
|
||||
`ext_party_id` varchar(100) NOT NULL COMMENT '员工身份',
|
||||
`verdict` varchar(20) NOT NULL COMMENT 'useful/not_useful',
|
||||
`comment` varchar(500) DEFAULT NULL COMMENT '反馈说明',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_question_feedback` (`tenant_id`, `assignment_id`, `ext_party_id`),
|
||||
KEY `idx_aihr_question_feedback_verdict` (`tenant_id`, `verdict`, `update_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='每日题和专项题有用性反馈';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_onboard_exam` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
|
||||
`title` varchar(200) NOT NULL COMMENT '考试名称',
|
||||
`project_code` varchar(100) NOT NULL DEFAULT '' COMMENT '适用项目,空为全部',
|
||||
`position_code` varchar(80) NOT NULL DEFAULT '' COMMENT '适用岗位,空为全部',
|
||||
`status` varchar(20) NOT NULL DEFAULT 'DRAFT' COMMENT 'DRAFT/PUBLISHED',
|
||||
`total_score` int NOT NULL DEFAULT 100 COMMENT '总分',
|
||||
`pass_score` int NOT NULL DEFAULT 80 COMMENT '及格分',
|
||||
`due_date` date DEFAULT NULL COMMENT '截止日期',
|
||||
`created_by` varchar(100) NOT NULL COMMENT '创建人身份',
|
||||
`publish_request_key` varchar(100) DEFAULT NULL COMMENT '发布幂等键',
|
||||
`published_time` datetime DEFAULT NULL COMMENT '发布时间',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_onboard_exam_publish_request` (`tenant_id`, `created_by`, `publish_request_key`),
|
||||
KEY `idx_aihr_onboard_exam_scope` (`tenant_id`, `status`, `project_code`, `position_code`, `due_date`),
|
||||
KEY `idx_aihr_onboard_exam_owner` (`tenant_id`, `created_by`, `id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='主管创建的岗前/入职考试';
|
||||
|
||||
SET @publish_request_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @aihr_schema AND table_name = 'aihr_onboard_exam' AND column_name = 'publish_request_key'
|
||||
);
|
||||
SET @publish_request_ddl = IF(@publish_request_exists = 0,
|
||||
'ALTER TABLE aihr_onboard_exam ADD COLUMN publish_request_key varchar(100) DEFAULT NULL COMMENT ''发布幂等键'' AFTER created_by',
|
||||
'SELECT 1');
|
||||
PREPARE aihr_publish_request_stmt FROM @publish_request_ddl;
|
||||
EXECUTE aihr_publish_request_stmt;
|
||||
DEALLOCATE PREPARE aihr_publish_request_stmt;
|
||||
|
||||
SET @publish_request_index_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.statistics
|
||||
WHERE table_schema = @aihr_schema AND table_name = 'aihr_onboard_exam'
|
||||
AND index_name = 'uk_aihr_onboard_exam_publish_request'
|
||||
);
|
||||
SET @publish_request_index_ddl = IF(@publish_request_index_exists = 0,
|
||||
'ALTER TABLE aihr_onboard_exam ADD UNIQUE KEY uk_aihr_onboard_exam_publish_request (tenant_id, created_by, publish_request_key)',
|
||||
'SELECT 1');
|
||||
PREPARE aihr_publish_request_index_stmt FROM @publish_request_index_ddl;
|
||||
EXECUTE aihr_publish_request_index_stmt;
|
||||
DEALLOCATE PREPARE aihr_publish_request_index_stmt;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_onboard_exam_target` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
|
||||
`exam_id` bigint NOT NULL COMMENT '考试ID',
|
||||
`ext_party_id` varchar(100) NOT NULL COMMENT '真实员工外部身份',
|
||||
`trainee_name` varchar(100) NOT NULL COMMENT '派发时员工姓名快照',
|
||||
`project_code` varchar(100) NOT NULL DEFAULT '' COMMENT '派发时项目快照',
|
||||
`position_name` varchar(100) NOT NULL DEFAULT '' COMMENT '派发时岗位快照',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_onboard_exam_target` (`tenant_id`, `exam_id`, `ext_party_id`),
|
||||
KEY `idx_aihr_onboard_exam_target_party` (`tenant_id`, `ext_party_id`, `exam_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='入职考试定向人员(最多100人)';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_onboard_exam_question` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
|
||||
`exam_id` bigint NOT NULL COMMENT '考试ID',
|
||||
`question_type` varchar(20) NOT NULL COMMENT 'single/multiple/judge/short',
|
||||
`stem` varchar(1000) NOT NULL COMMENT '题干',
|
||||
`options_json` text COMMENT '选项JSON',
|
||||
`correct_answers_json` text NOT NULL COMMENT '正确答案或关键词JSON',
|
||||
`score` int NOT NULL COMMENT '分值',
|
||||
`explanation` varchar(1000) DEFAULT NULL COMMENT '解析',
|
||||
`sort_order` int NOT NULL DEFAULT 0 COMMENT '排序',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_aihr_onboard_exam_question` (`tenant_id`, `exam_id`, `sort_order`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='入职考试题目';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_onboard_exam_attempt` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
|
||||
`exam_id` bigint NOT NULL COMMENT '考试ID',
|
||||
`ext_party_id` varchar(100) NOT NULL COMMENT '员工身份',
|
||||
`request_key` varchar(100) NOT NULL COMMENT '提交幂等键',
|
||||
`status` varchar(20) NOT NULL DEFAULT 'SUBMITTED' COMMENT '提交状态',
|
||||
`score` int NOT NULL DEFAULT 0 COMMENT '得分',
|
||||
`passed` tinyint NOT NULL DEFAULT 0 COMMENT '是否通过',
|
||||
`submitted_time` datetime NOT NULL COMMENT '提交时间',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_onboard_exam_attempt_request` (`tenant_id`, `exam_id`, `ext_party_id`, `request_key`),
|
||||
KEY `idx_aihr_onboard_exam_attempt_result` (`tenant_id`, `exam_id`, `score`, `submitted_time`),
|
||||
KEY `idx_aihr_onboard_exam_attempt_party` (`tenant_id`, `ext_party_id`, `submitted_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='入职考试作答记录';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_onboard_exam_answer` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
|
||||
`attempt_id` bigint NOT NULL COMMENT '作答记录ID',
|
||||
`question_id` bigint NOT NULL COMMENT '题目ID',
|
||||
`answer_json` text COMMENT '员工答案JSON',
|
||||
`correct` tinyint NOT NULL DEFAULT 0 COMMENT '是否正确',
|
||||
`earned_score` int NOT NULL DEFAULT 0 COMMENT '本题得分',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_onboard_exam_answer` (`tenant_id`, `attempt_id`, `question_id`),
|
||||
KEY `idx_aihr_onboard_exam_answer_question` (`tenant_id`, `question_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='入职考试逐题答案';
|
||||
@@ -0,0 +1,42 @@
|
||||
-- 主管专项批量派发:截止日期与客户端幂等键。
|
||||
-- request_key 对历史/单人旧调用保持 NULL;MySQL 唯一索引允许多行 NULL。
|
||||
|
||||
SET @has_due_date := (
|
||||
SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE table_schema = DATABASE() AND table_name = 'aihr_practice_assignment' AND column_name = 'due_date'
|
||||
);
|
||||
SET @ddl_due_date := IF(
|
||||
@has_due_date = 0,
|
||||
'ALTER TABLE aihr_practice_assignment ADD COLUMN due_date date DEFAULT NULL COMMENT ''训练截止日期'' AFTER status',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt_due_date FROM @ddl_due_date;
|
||||
EXECUTE stmt_due_date;
|
||||
DEALLOCATE PREPARE stmt_due_date;
|
||||
|
||||
SET @has_request_key := (
|
||||
SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE table_schema = DATABASE() AND table_name = 'aihr_practice_assignment' AND column_name = 'request_key'
|
||||
);
|
||||
SET @ddl_request_key := IF(
|
||||
@has_request_key = 0,
|
||||
'ALTER TABLE aihr_practice_assignment ADD COLUMN request_key varchar(100) DEFAULT NULL COMMENT ''客户端幂等请求ID'' AFTER due_date',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt_request_key FROM @ddl_request_key;
|
||||
EXECUTE stmt_request_key;
|
||||
DEALLOCATE PREPARE stmt_request_key;
|
||||
|
||||
SET @has_request_index := (
|
||||
SELECT COUNT(*) FROM information_schema.STATISTICS
|
||||
WHERE table_schema = DATABASE() AND table_name = 'aihr_practice_assignment'
|
||||
AND index_name = 'uk_aihr_assignment_request'
|
||||
);
|
||||
SET @ddl_request_index := IF(
|
||||
@has_request_index = 0,
|
||||
'ALTER TABLE aihr_practice_assignment ADD UNIQUE KEY uk_aihr_assignment_request (tenant_id, request_key, ext_party_id)',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt_request_index FROM @ddl_request_index;
|
||||
EXECUTE stmt_request_index;
|
||||
DEALLOCATE PREPARE stmt_request_index;
|
||||
@@ -0,0 +1,277 @@
|
||||
-- 五岗位训练内容目录(MySQL 8.x)。
|
||||
-- 生活顾问/保安/保洁/保修/客服各 20 个场景,并为每个场景生成 daily、special 两类版本化题目。
|
||||
-- 本脚本是内置内容,不代表高风险作业已获得业务、安全或法务审核;未完成正式审核的高风险行保持 enabled=0。
|
||||
-- 依赖:先执行 aihr_20260714_practice_catalog_schema_mysql8.sql。脚本可重复执行。
|
||||
|
||||
SET @db_name = DATABASE();
|
||||
|
||||
SET @scenario_version_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @db_name AND table_name = 'aihr_practice_scenario' AND column_name = 'content_version'
|
||||
);
|
||||
SET @scenario_version_ddl = IF(
|
||||
@scenario_version_exists = 0,
|
||||
'ALTER TABLE aihr_practice_scenario ADD COLUMN content_version varchar(30) NOT NULL DEFAULT ''v1.0'' COMMENT ''内容版本'' AFTER rounds_json',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE scenario_version_stmt FROM @scenario_version_ddl;
|
||||
EXECUTE scenario_version_stmt;
|
||||
DEALLOCATE PREPARE scenario_version_stmt;
|
||||
|
||||
SET @scenario_hash_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @db_name AND table_name = 'aihr_practice_scenario' AND column_name = 'content_hash'
|
||||
);
|
||||
SET @scenario_hash_ddl = IF(
|
||||
@scenario_hash_exists = 0,
|
||||
'ALTER TABLE aihr_practice_scenario ADD COLUMN content_hash char(64) DEFAULT NULL COMMENT ''内容快照哈希'' AFTER content_version',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE scenario_hash_stmt FROM @scenario_hash_ddl;
|
||||
EXECUTE scenario_hash_stmt;
|
||||
DEALLOCATE PREPARE scenario_hash_stmt;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_learning_question` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
|
||||
`question_code` varchar(120) NOT NULL COMMENT '题目编码',
|
||||
`scenario_code` varchar(80) NOT NULL COMMENT '场景编码',
|
||||
`position_code` varchar(80) NOT NULL COMMENT '岗位编码',
|
||||
`question_type` varchar(20) NOT NULL DEFAULT 'daily' COMMENT 'daily/special',
|
||||
`question_text` varchar(1000) NOT NULL COMMENT '题干',
|
||||
`reference_answer` varchar(2000) NOT NULL COMMENT '参考答案',
|
||||
`content_version` varchar(30) NOT NULL DEFAULT 'v1.0' COMMENT '内容版本',
|
||||
`content_hash` char(64) NOT NULL COMMENT '题目内容哈希',
|
||||
`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '是否启用',
|
||||
`sort_order` int NOT NULL DEFAULT 0 COMMENT '排序',
|
||||
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
||||
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_learning_question` (`tenant_id`, `question_code`),
|
||||
KEY `idx_aihr_learning_question_hash` (`tenant_id`, `content_hash`),
|
||||
KEY `idx_aihr_learning_question_pick` (`tenant_id`, `position_code`, `question_type`, `enabled`, `sort_order`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='岗位学习题库';
|
||||
|
||||
SET @question_type_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @db_name AND table_name = 'aihr_learning_question' AND column_name = 'question_type'
|
||||
);
|
||||
SET @question_type_ddl = IF(
|
||||
@question_type_exists = 0,
|
||||
'ALTER TABLE aihr_learning_question ADD COLUMN question_type varchar(20) NOT NULL DEFAULT ''daily'' COMMENT ''daily/special'' AFTER position_code',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE question_type_stmt FROM @question_type_ddl;
|
||||
EXECUTE question_type_stmt;
|
||||
DEALLOCATE PREPARE question_type_stmt;
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS `_aihr_five_position_catalog`;
|
||||
CREATE TEMPORARY TABLE `_aihr_five_position_catalog` (
|
||||
`position` varchar(80) NOT NULL,
|
||||
`scenario_code` varchar(80) NOT NULL,
|
||||
`scenario_name` varchar(100) NOT NULL,
|
||||
`scenario_type` varchar(50) NOT NULL,
|
||||
`sop_code` varchar(80) NOT NULL,
|
||||
`opening_text` varchar(500) NOT NULL,
|
||||
`difficulty` tinyint NOT NULL,
|
||||
`enabled` tinyint NOT NULL,
|
||||
PRIMARY KEY (`scenario_code`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
|
||||
INSERT INTO `_aihr_five_position_catalog`
|
||||
(`position`, `scenario_code`, `scenario_name`, `scenario_type`, `sop_code`, `opening_text`, `difficulty`, `enabled`)
|
||||
VALUES
|
||||
('生活顾问', 'complaint-water', '客服应对投诉', '投诉处理', 'SOP-LG-001', '你们说今天处理,到现在都没人联系我,这个车库还怎么停?', 2, 1),
|
||||
('生活顾问', 'complaint-noise', '楼上噪音投诉', '投诉处理', 'SOP-LG-002', '楼上每天晚上拖椅子,你们物业到底管不管?', 2, 1),
|
||||
('生活顾问', 'complaint-attitude', '服务态度投诉', '投诉处理', 'SOP-LG-003', '你们前台刚才那是什么态度?我要投诉。', 1, 1),
|
||||
('生活顾问', 'fee-collection', '催缴沟通技巧', '催费/停车费', 'SOP-LG-004', '服务做成这样还让我缴费?你先把问题解决了再说。', 2, 1),
|
||||
('生活顾问', 'fee-parking', '停车费催缴', '催费/停车费', 'SOP-LG-005', '停车费又催,我车位入口问题一直没解决,凭什么交?', 2, 1),
|
||||
('生活顾问', 'fee-prepay-discount', '预交折扣沟通', '催费/停车费', 'SOP-LG-006', '你们说预交有折扣,那我以前欠的怎么算?', 2, 1),
|
||||
('生活顾问', 'repair-leak-followup', '漏水报修跟进', '报修跟进', 'SOP-LG-007', '我家天花还在滴水,报修两天了怎么没人来?', 2, 1),
|
||||
('生活顾问', 'repair-elevator-delay', '电梯故障跟进', '报修跟进', 'SOP-LG-008', '电梯坏了一上午,老人怎么下楼?你们给个准话。', 3, 1),
|
||||
('生活顾问', 'repair-public-light', '公区照明维修', '报修跟进', 'SOP-LG-009', '楼道灯坏了三天,晚上黑漆漆的。', 1, 1),
|
||||
('生活顾问', 'emergency-water-outage', '突发停水求助', '突发求助', 'SOP-LG-010', '家里突然没水了,孩子还要洗澡,怎么回事?', 2, 1),
|
||||
('生活顾问', 'emergency-elder-fall', '老人摔倒求助', '突发求助', 'SOP-LG-011', '我爸在楼下摔倒了,你们快来帮忙!', 3, 1),
|
||||
('生活顾问', 'emergency-security', '陌生人尾随求助', '突发求助', 'SOP-LG-012', '我刚进小区感觉有人跟着我,你们保安在哪里?', 3, 1),
|
||||
('生活顾问', 'service-promotion-needs', '增值服务需求识别与推介', '服务推介/增值', 'SOP-LG-013', '家里老人要长期出门,社区有没有适合的生活服务?', 2, 1),
|
||||
('生活顾问', 'daily-service-followup', '日常服务主动回访', '日常服务', 'SOP-LG-014', '上次问题处理完了,后续还会有人联系我吗?', 1, 1),
|
||||
('生活顾问', 'LG-RENOVATION-REGISTER', '装修登记引导', '装修服务', 'SOP-LG-015', '我家准备装修,需要先办哪些手续?', 2, 1),
|
||||
('生活顾问', 'LG-MOVE-IN', '入住服务办理', '入住服务', 'SOP-LG-016', '我明天搬进来,钥匙和门禁怎么办理?', 1, 1),
|
||||
('生活顾问', 'LG-ACTIVITY-CONSULT', '社区活动咨询', '社区运营', 'SOP-LG-017', '本周社区活动怎么报名,老人可以参加吗?', 1, 1),
|
||||
('生活顾问', 'LG-PARKING-CONSULT', '车位使用咨询', '停车服务', 'SOP-LG-018', '临时车辆怎么收费,车位可以共享吗?', 1, 1),
|
||||
('生活顾问', 'LG-INFO-CHANGE', '业主信息变更', '资料维护', 'SOP-LG-019', '我的联系电话换了,在哪里更新业主资料?', 1, 1),
|
||||
('生活顾问', 'LG-VISITOR-REGISTER', '访客登记协同', '客户接待', 'SOP-LG-020', '家里今天有客人来,门岗说还需要登记,我该怎么办?', 1, 1),
|
||||
|
||||
('保安', 'BA-VEHICLE-ENTRY', '临时车辆入场核验', '门岗管理', 'SOP-BA-001', '我是来访车辆,业主已经同意了,为什么还不能进?', 1, 1),
|
||||
('保安', 'BA-VISITOR-ENTRY', '访客入场核验', '门岗管理', 'SOP-BA-002', '我来找朋友但联系不上他,可以先让我进去吗?', 2, 1),
|
||||
('保安', 'BA-DELIVERY-ENTRY', '配送人员入场引导', '门岗管理', 'SOP-BA-003', '我要给业主送货,东西很多,需要从哪里进入?', 1, 1),
|
||||
('保安', 'BA-NIGHT-PATROL', '夜间巡逻异常记录', '巡逻管理', 'SOP-BA-004', '巡逻时发现单元门长时间敞开且附近无人。', 2, 1),
|
||||
('保安', 'BA-SUSPICIOUS-PERSON', '可疑人员信息核查', '异常处置', 'SOP-BA-005', '有陌生人在楼栋附近反复徘徊,我有点担心。', 2, 1),
|
||||
('保安', 'BA-LOST-CHILD', '走失儿童协查', '人员协查', 'SOP-BA-006', '孩子在小区里走丢了,已经十分钟没找到。', 3, 1),
|
||||
('保安', 'BA-DRUNK-PERSON', '醉酒人员现场协同', '异常处置', 'SOP-BA-007', '有人醉倒在单元门口,还在大声吵闹。', 3, 1),
|
||||
('保安', 'BA-PARKING-CONFLICT', '停车纠纷降级沟通', '停车秩序', 'SOP-BA-008', '对方占了我的车位,我们已经吵起来了。', 3, 1),
|
||||
('保安', 'BA-ILLEGAL-PARKING', '消防通道违停劝离', '停车秩序', 'SOP-BA-009', '有车辆堵住通道,怎么联系车主处理?', 2, 1),
|
||||
('保安', 'BA-GATE-FAILURE', '门岗设备故障登记', '设备异常', 'SOP-BA-010', '闸机无法识别车辆,后面已经排起长队。', 2, 1),
|
||||
('保安', 'BA-CCTV-REQUEST', '监控查看申请引导', '信息合规', 'SOP-BA-011', '我的东西丢了,能不能直接把监控录像给我?', 2, 1),
|
||||
('保安', 'BA-KEYS-FOUND', '拾获钥匙登记', '失物招领', 'SOP-BA-012', '我在地库捡到一串钥匙,应该交给谁?', 1, 1),
|
||||
('保安', 'BA-LARGE-ITEM-EXIT', '大件物品出门核验', '门岗管理', 'SOP-BA-013', '搬家公司要把家具运出去,需要什么凭证?', 2, 1),
|
||||
('保安', 'BA-EVENT-CROWD', '活动人流秩序引导', '活动保障', 'SOP-BA-014', '活动结束后门口人员集中,请安排疏导。', 2, 1),
|
||||
('保安', 'BA-EMERGENCY-ACCESS', '救援车辆通道保障', '应急协同', 'SOP-BA-015', '救护车马上到,请确认最快的进入路线。', 3, 1),
|
||||
('保安', 'BA-FIRE-ALARM', '消防报警首响与升级', '高风险应急', 'SOP-BA-016', '消防报警器持续响起并闻到焦糊味。', 3, 0),
|
||||
('保安', 'BA-ELEVATOR-TRAPPED', '电梯困人信息收集与升级', '高风险应急', 'SOP-BA-017', '有人被困在电梯里,情绪很紧张。', 3, 0),
|
||||
('保安', 'BA-VIOLENT-CONFLICT', '暴力冲突报警与隔离边界', '高风险应急', 'SOP-BA-018', '两个人正在发生肢体冲突,现场有人围观。', 3, 0),
|
||||
('保安', 'BA-FLOOD-CONTROL', '地库积水应急边界', '高风险应急', 'SOP-BA-019', '地库入口积水上涨,车辆仍在进入。', 3, 0),
|
||||
('保安', 'BA-HAZARDOUS-ITEM', '疑似危险物品隔离与上报', '高风险应急', 'SOP-BA-020', '公共区域发现来源不明且有刺激气味的容器。', 3, 0),
|
||||
|
||||
('保洁', 'BJ-LOBBY-CLEANING', '大堂日常保洁', '日常保洁', 'SOP-BJ-001', '大堂地面有脚印和灰尘,请尽快恢复整洁。', 1, 1),
|
||||
('保洁', 'BJ-CORRIDOR-CLEANING', '楼道日常保洁', '日常保洁', 'SOP-BJ-002', '楼道角落积灰比较明显,今天能处理吗?', 1, 1),
|
||||
('保洁', 'BJ-ELEVATOR-CAR', '电梯轿厢日常保洁', '日常保洁', 'SOP-BJ-003', '电梯轿厢有污渍和异味,请安排清洁。', 1, 1),
|
||||
('保洁', 'BJ-WASTE-CLASSIFY', '生活垃圾分类引导', '垃圾管理', 'SOP-BJ-004', '这个垃圾应该投放在哪一类垃圾桶?', 1, 1),
|
||||
('保洁', 'BJ-BIN-OVERFLOW', '垃圾桶满溢处理', '垃圾管理', 'SOP-BJ-005', '垃圾桶已经满了,周围也有散落垃圾。', 2, 1),
|
||||
('保洁', 'BJ-PET-WASTE', '宠物排泄物清理', '专项清洁', 'SOP-BJ-006', '草坪边有宠物排泄物,影响大家通行。', 1, 1),
|
||||
('保洁', 'BJ-SPILL-SLIP', '地面泼洒防滑处置', '专项清洁', 'SOP-BJ-007', '走廊地面有水,已经有人差点滑倒。', 2, 1),
|
||||
('保洁', 'BJ-ODOR-COMPLAINT', '公共区域异味排查', '专项清洁', 'SOP-BJ-008', '楼道一直有异味,但找不到来源。', 2, 1),
|
||||
('保洁', 'BJ-WASHROOM', '公共卫生间保洁', '日常保洁', 'SOP-BJ-009', '公共卫生间需要补充耗材并清洁。', 1, 1),
|
||||
('保洁', 'BJ-GLASS-DOOR', '低位玻璃门清洁', '日常保洁', 'SOP-BJ-010', '一楼玻璃门有很多手印,影响观感。', 1, 1),
|
||||
('保洁', 'BJ-PUBLIC-DISINFECTION', '公共接触面消洁', '消洁作业', 'SOP-BJ-011', '请按计划完成门把手和按钮的消洁记录。', 2, 1),
|
||||
('保洁', 'BJ-EVENT-CLEANUP', '社区活动后保洁', '活动保障', 'SOP-BJ-012', '活动刚结束,场地有纸屑和桌椅需要恢复。', 2, 1),
|
||||
('保洁', 'BJ-RENOVATION-DUST', '装修扬尘清洁协同', '专项清洁', 'SOP-BJ-013', '装修搬运后楼道都是灰,请协调清理。', 2, 1),
|
||||
('保洁', 'BJ-RAINY-ENTRANCE', '雨天入口防滑保障', '天气保障', 'SOP-BJ-014', '外面下大雨,大堂入口地面很湿。', 2, 1),
|
||||
('保洁', 'BJ-LEAF-CLEANUP', '落叶集中清理', '室外保洁', 'SOP-BJ-015', '园区步道落叶较多,影响通行和观感。', 1, 1),
|
||||
('保洁', 'BJ-PEST-SIGHTING', '虫害线索登记上报', '虫害协同', 'SOP-BJ-016', '垃圾房附近发现较多虫害,请记录并报处理。', 2, 1),
|
||||
('保洁', 'BJ-MEDICAL-WASTE', '疑似医疗废弃物隔离边界', '高风险作业', 'SOP-BJ-017', '垃圾桶旁发现疑似使用过的医疗针具。', 3, 0),
|
||||
('保洁', 'BJ-CHEMICAL-SPILL', '不明化学品泼洒处置边界', '高风险作业', 'SOP-BJ-018', '储物间有不明液体泄漏并伴随刺激气味。', 3, 0),
|
||||
('保洁', 'BJ-HIGH-RISE-EXTERIOR', '高空外墙保洁边界', '高风险作业', 'SOP-BJ-019', '需要安排高空外墙玻璃清洗,请确认作业条件。', 3, 0),
|
||||
('保洁', 'BJ-SHARP-OBJECT', '锐器垃圾隔离处置边界', '高风险作业', 'SOP-BJ-020', '垃圾袋内有裸露碎玻璃,存在割伤风险。', 3, 0),
|
||||
|
||||
('保修', 'BX-WATER-LEAK', '室内漏水报修初判', '给排水维修', 'SOP-BX-001', '天花板一直滴水,不知道是不是楼上漏下来的。', 2, 1),
|
||||
('保修', 'BX-DRAIN-BLOCK', '排水堵塞报修', '给排水维修', 'SOP-BX-002', '厨房下水很慢,还有返水现象。', 2, 1),
|
||||
('保修', 'BX-DOOR-LOCK', '公共门锁故障处理', '门窗维修', 'SOP-BX-003', '单元门锁不上,晚上让人不放心。', 2, 1),
|
||||
('保修', 'BX-LAMP-REPLACE', '公共照明更换', '电气维修', 'SOP-BX-004', '楼道灯坏了,晚上比较暗。', 1, 1),
|
||||
('保修', 'BX-PUBLIC-LIGHT', '园区照明异常排查', '电气维修', 'SOP-BX-005', '园区有一排路灯都不亮,请安排检查。', 2, 1),
|
||||
('保修', 'BX-ACCESS-CONTROL', '门禁设备故障报修', '弱电维修', 'SOP-BX-006', '门禁刷卡没有反应,居民进出不方便。', 2, 1),
|
||||
('保修', 'BX-INTERCOM', '楼宇对讲故障报修', '弱电维修', 'SOP-BX-007', '家里的可视对讲听不到声音。', 2, 1),
|
||||
('保修', 'BX-PARKING-GATE', '停车道闸故障协同', '设备维修', 'SOP-BX-008', '出口道闸不抬杆,车辆已经排队。', 2, 1),
|
||||
('保修', 'BX-PUMP-NOISE', '水泵异响工单处理', '设备维修', 'SOP-BX-009', '设备房附近晚上持续有明显异响。', 2, 1),
|
||||
('保修', 'BX-COMMON-AC', '公共空调异常报修', '暖通维修', 'SOP-BX-010', '会所公共区域空调不制冷。', 2, 1),
|
||||
('保修', 'BX-WALL-CRACK', '墙面裂缝登记勘查', '土建维修', 'SOP-BX-011', '公共走廊墙面出现裂缝,是否有安全问题?', 2, 1),
|
||||
('保修', 'BX-WATERPROOF', '渗水返修跟进', '土建维修', 'SOP-BX-012', '上次做过防水,现在又开始渗水了。', 2, 1),
|
||||
('保修', 'BX-APPLIANCE-BOUNDARY', '业主家电维修边界说明', '服务边界', 'SOP-BX-013', '家里的冰箱坏了,物业能不能上门维修?', 1, 1),
|
||||
('保修', 'BX-METER-QUERY', '水电表读数疑问协查', '计量协查', 'SOP-BX-014', '这个月用量异常,能否帮我核对表计?', 2, 1),
|
||||
('保修', 'BX-SAFE-SHUTDOWN', '设备异常停用与围挡', '故障隔离', 'SOP-BX-015', '公共设施出现异响,是否需要先停用并围挡?', 3, 1),
|
||||
('保修', 'BX-LIVE-ELECTRICAL', '带电故障处置边界', '高风险作业', 'SOP-BX-016', '配电箱出现火花,现场是否可以直接检查?', 3, 0),
|
||||
('保修', 'BX-GAS-LEAK', '疑似燃气泄漏升级边界', '高风险作业', 'SOP-BX-017', '家中闻到明显燃气味,请问应该怎么处理?', 3, 0),
|
||||
('保修', 'BX-ELEVATOR-REPAIR', '电梯故障维修边界', '高风险作业', 'SOP-BX-018', '电梯运行时抖动,能否马上打开设备检查?', 3, 0),
|
||||
('保修', 'BX-FIRE-SYSTEM', '消防设施故障维修边界', '高风险作业', 'SOP-BX-019', '消防泵控制柜报故障,需要立即检修。', 3, 0),
|
||||
('保修', 'BX-CONFINED-SPACE', '有限空间作业边界', '高风险作业', 'SOP-BX-020', '污水井需要下井检查,请确认作业准备。', 3, 0),
|
||||
|
||||
('客服', 'KF-PHONE-FIRST', '电话咨询首次响应', '电话服务', 'SOP-KF-001', '我第一次打电话咨询,请告诉我该找哪个部门。', 1, 1),
|
||||
('客服', 'KF-ONLINE-FIRST', '在线咨询首次响应', '在线服务', 'SOP-KF-002', '我在小程序留言了,能否现在帮我查询?', 1, 1),
|
||||
('客服', 'KF-COMPLAINT-REGISTER', '投诉信息完整登记', '投诉受理', 'SOP-KF-003', '我要正式投诉,请把我的诉求完整记录下来。', 2, 1),
|
||||
('客服', 'KF-REPAIR-DISPATCH', '报修信息登记派单', '工单受理', 'SOP-KF-004', '家里漏水,请尽快安排师傅上门。', 2, 1),
|
||||
('客服', 'KF-PROGRESS-QUERY', '工单进度查询', '工单受理', 'SOP-KF-005', '我的工单已经两天了,现在处理到哪一步?', 2, 1),
|
||||
('客服', 'KF-RETURN-CALL', '未接来电回呼', '电话服务', 'SOP-KF-006', '刚才你们打电话我没接到,请问是什么事情?', 1, 1),
|
||||
('客服', 'KF-SATISFACTION', '服务满意度回访', '回访服务', 'SOP-KF-007', '问题已经处理了,你们还要了解哪些情况?', 1, 1),
|
||||
('客服', 'KF-FEE-QUERY', '费用明细查询受理', '费用咨询', 'SOP-KF-008', '我对账单有疑问,请帮我核对收费项目。', 2, 1),
|
||||
('客服', 'KF-INVOICE', '发票申请引导', '费用服务', 'SOP-KF-009', '物业费发票在哪里申请,需要提供什么信息?', 1, 1),
|
||||
('客服', 'KF-ACCESS-CARD', '门禁卡业务受理', '便民服务', 'SOP-KF-010', '门禁卡丢了,怎么挂失和补办?', 1, 1),
|
||||
('客服', 'KF-PARKING-RENEW', '停车服务续费咨询', '停车服务', 'SOP-KF-011', '停车服务快到期了,如何续费?', 1, 1),
|
||||
('客服', 'KF-INFO-CHANGE', '客户资料变更受理', '资料维护', 'SOP-KF-012', '我需要修改联系电话,请告诉我验证流程。', 1, 1),
|
||||
('客服', 'KF-OUTAGE-INQUIRY', '停水停电信息查询', '突发咨询', 'SOP-KF-013', '现在停水了,预计什么时候恢复?', 2, 1),
|
||||
('客服', 'KF-NOISE-COMPLAINT', '噪音投诉受理', '投诉受理', 'SOP-KF-014', '隔壁夜间噪音很大,请帮我登记处理。', 2, 1),
|
||||
('客服', 'KF-LOST-FOUND', '失物招领查询', '便民服务', 'SOP-KF-015', '我可能把证件落在园区里了,怎么查询?', 1, 1),
|
||||
('客服', 'KF-ACTIVITY-REGISTER', '社区活动报名受理', '社区运营', 'SOP-KF-016', '我想报名周末活动,还有名额吗?', 1, 1),
|
||||
('客服', 'KF-SERVICE-BOOKING', '增值服务预约受理', '服务预约', 'SOP-KF-017', '我想预约上门服务,请说明时间和费用。', 2, 1),
|
||||
('客服', 'KF-PRIVACY-REQUEST', '个人信息查询申请引导', '信息合规', 'SOP-KF-018', '我想查看物业保存了我的哪些个人信息。', 2, 1),
|
||||
('客服', 'KF-ABUSIVE-CALLER', '辱骂来电情绪降级', '困难沟通', 'SOP-KF-019', '客户持续辱骂并拒绝提供工单信息。', 3, 1),
|
||||
('客服', 'KF-EMERGENCY-TRANSFER', '紧急来电识别与转接', '紧急协同', 'SOP-KF-020', '现场有人受伤,请马上告诉我应该联系谁。', 3, 1);
|
||||
|
||||
-- 兼容历史库以显式 id 导入 seed、但 AUTO_INCREMENT 仍停留在 1 的情况。
|
||||
-- 不先推进游标时,INSERT ... SELECT 的前若干行可能撞主键并错误进入 ON DUPLICATE 分支。
|
||||
SET @next_scenario_id = (SELECT COALESCE(MAX(`id`), 0) + 1 FROM `aihr_practice_scenario`);
|
||||
SET @scenario_auto_increment_ddl = CONCAT(
|
||||
'ALTER TABLE aihr_practice_scenario AUTO_INCREMENT = ', @next_scenario_id
|
||||
);
|
||||
PREPARE scenario_auto_increment_stmt FROM @scenario_auto_increment_ddl;
|
||||
EXECUTE scenario_auto_increment_stmt;
|
||||
DEALLOCATE PREPARE scenario_auto_increment_stmt;
|
||||
|
||||
INSERT INTO `aihr_practice_scenario`
|
||||
(`tenant_id`, `scenario_code`, `scenario_name`, `position`, `scenario_type`, `project_type`, `difficulty`,
|
||||
`customer_persona`, `opening_text`, `explicit_need`, `hidden_need`, `irritants`, `delights`, `sop_refs`,
|
||||
`success_criteria`, `strategy`, `goal`, `trainee_name`, `trust_start`, `trust_end`, `rounds_json`,
|
||||
`content_version`, `content_hash`, `enabled`, `sort_order`, `create_time`, `update_time`)
|
||||
SELECT
|
||||
'000000', c.`scenario_code`, c.`scenario_name`, c.`position`, c.`scenario_type`, '住宅', c.`difficulty`,
|
||||
'关注响应速度、事实准确和处理闭环的业主或现场相关人员', c.`opening_text`,
|
||||
CONCAT('依据 ', c.`sop_code`, ' 完成信息确认、边界说明和后续动作'),
|
||||
'希望得到明确责任人、处理节点和可追溯记录',
|
||||
'未经核实直接承诺结果、遗漏记录、越权处置或使用刺激性表达',
|
||||
'先确认事实和风险,再说明权限边界、责任人、时限和回访方式',
|
||||
c.`sop_code`,
|
||||
CONCAT('正确引用 ', c.`sop_code`, ',形成受理、处理、升级、回访闭环'),
|
||||
'保持承接情绪,优先识别安全风险;不确定时停止越权操作并升级',
|
||||
CONCAT('训练', c.`position`, '在“', c.`scenario_name`, '”场景中按SOP完成服务闭环。'),
|
||||
'试点学员', 60, 82,
|
||||
JSON_ARRAY(
|
||||
JSON_OBJECT('customer', c.`opening_text`, 'coachHint', CONCAT('先确认事实,再按 ', c.`sop_code`, ' 说明下一步。'), 'emotion', 68, 'trust', 68),
|
||||
JSON_OBJECT('customer', '如果现在还不能解决,请明确谁负责、什么时候反馈。', 'coachHint', '说明权限边界、升级对象、时间节点和记录方式。', 'emotion', 58, 'trust', 82)
|
||||
),
|
||||
'v1.0',
|
||||
SHA2(CONCAT_WS('|', c.`position`, c.`scenario_code`, c.`scenario_name`, c.`scenario_type`, c.`sop_code`, c.`opening_text`, 'v1.0'), 256),
|
||||
c.`enabled`,
|
||||
CASE c.`position` WHEN '生活顾问' THEN 100 WHEN '保安' THEN 200 WHEN '保洁' THEN 300 WHEN '保修' THEN 400 ELSE 500 END
|
||||
+ CAST(RIGHT(c.`sop_code`, 3) AS UNSIGNED),
|
||||
NOW(), NOW()
|
||||
FROM `_aihr_five_position_catalog` c
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`sop_refs` = VALUES(`sop_refs`),
|
||||
`content_version` = VALUES(`content_version`),
|
||||
`content_hash` = VALUES(`content_hash`),
|
||||
`enabled` = VALUES(`enabled`),
|
||||
`sort_order` = VALUES(`sort_order`),
|
||||
`update_time` = VALUES(`update_time`);
|
||||
|
||||
INSERT INTO `aihr_learning_question`
|
||||
(`tenant_id`, `question_code`, `scenario_code`, `position_code`, `question_type`, `question_text`,
|
||||
`reference_answer`, `content_version`, `content_hash`, `enabled`, `sort_order`, `create_time`, `update_time`)
|
||||
SELECT
|
||||
'000000',
|
||||
CONCAT(c.`scenario_code`, '-', q.`question_type`, '-v1'),
|
||||
c.`scenario_code`,
|
||||
c.`position`,
|
||||
q.`question_type`,
|
||||
CASE q.`question_type`
|
||||
WHEN 'daily' THEN CONCAT('面对“', c.`scenario_name`, '”场景,收到“', c.`opening_text`, '”后,你的第一轮回应和后续闭环动作是什么?')
|
||||
ELSE CONCAT('专项题:在“', c.`scenario_name`, '”场景中,如果对方情绪升级且你无法当场解决,如何依据 ', c.`sop_code`, ' 控制风险、升级并留痕?')
|
||||
END,
|
||||
CASE q.`question_type`
|
||||
WHEN 'daily' THEN CONCAT('先复述并确认事实与诉求,检查是否存在安全风险;依据 ', c.`sop_code`, ' 说明权限边界、责任人和处理时限,记录工单并约定回访。不得编造承诺或越权操作。')
|
||||
ELSE CONCAT('保持承接情绪,明确当前已知与未知信息;按 ', c.`sop_code`, ' 停止越权处置,隔离或提醒风险,升级到授权责任人,记录时间、对象、证据和反馈节点,并持续回访直至闭环。')
|
||||
END,
|
||||
'v1.0',
|
||||
SHA2(CONCAT_WS('|', c.`scenario_code`, q.`question_type`, c.`scenario_name`, c.`opening_text`, c.`sop_code`, 'v1.0'), 256),
|
||||
c.`enabled`,
|
||||
CASE q.`question_type` WHEN 'daily' THEN 1000 ELSE 2000 END
|
||||
+ CASE c.`position` WHEN '生活顾问' THEN 100 WHEN '保安' THEN 200 WHEN '保洁' THEN 300 WHEN '保修' THEN 400 ELSE 500 END
|
||||
+ CAST(RIGHT(c.`sop_code`, 3) AS UNSIGNED),
|
||||
NOW(), NOW()
|
||||
FROM `_aihr_five_position_catalog` c
|
||||
CROSS JOIN (
|
||||
SELECT 'daily' AS `question_type`
|
||||
UNION ALL SELECT 'special'
|
||||
) q
|
||||
WHERE 1 = 1
|
||||
ON DUPLICATE KEY UPDATE
|
||||
`scenario_code` = VALUES(`scenario_code`),
|
||||
`position_code` = VALUES(`position_code`),
|
||||
`question_type` = VALUES(`question_type`),
|
||||
`question_text` = VALUES(`question_text`),
|
||||
`reference_answer` = VALUES(`reference_answer`),
|
||||
`content_version` = VALUES(`content_version`),
|
||||
`content_hash` = VALUES(`content_hash`),
|
||||
`enabled` = VALUES(`enabled`),
|
||||
`sort_order` = VALUES(`sort_order`),
|
||||
`update_time` = VALUES(`update_time`);
|
||||
|
||||
DROP TEMPORARY TABLE IF EXISTS `_aihr_five_position_catalog`;
|
||||
@@ -0,0 +1,150 @@
|
||||
-- 问 AI(全网)查询审计:只记录来源数量和状态,不写入密钥。
|
||||
CREATE TABLE IF NOT EXISTS `aihr_web_search_provider` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
|
||||
`provider_name` varchar(100) NOT NULL COMMENT '提供方名称',
|
||||
`provider_code` varchar(40) NOT NULL DEFAULT 'tavily' COMMENT '提供方编码',
|
||||
`endpoint` varchar(500) NOT NULL COMMENT '公开检索接口',
|
||||
`api_key` varchar(1000) DEFAULT NULL COMMENT '加密访问密钥,接口永不回传',
|
||||
`enabled` tinyint NOT NULL DEFAULT 0 COMMENT '是否启用',
|
||||
`last_test_ok` tinyint NOT NULL DEFAULT 0 COMMENT '当前配置最近一次连接测试是否成功',
|
||||
`last_test_time` datetime DEFAULT NULL COMMENT '当前配置最近一次连接测试时间',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_web_search_provider` (`tenant_id`, `provider_name`),
|
||||
KEY `idx_aihr_web_search_enabled` (`tenant_id`, `enabled`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='全网检索提供方';
|
||||
|
||||
-- 兼容已执行过旧版脚本的环境;新增字段默认未测试,避免未经测试的配置被启用。
|
||||
SET @aihr_schema = DATABASE();
|
||||
SET @web_last_test_ok_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @aihr_schema AND table_name = 'aihr_web_search_provider' AND column_name = 'last_test_ok'
|
||||
);
|
||||
SET @web_last_test_ok_ddl = IF(@web_last_test_ok_exists = 0,
|
||||
'ALTER TABLE aihr_web_search_provider ADD COLUMN last_test_ok tinyint NOT NULL DEFAULT 0 COMMENT ''当前配置最近一次连接测试是否成功'' AFTER enabled',
|
||||
'SELECT 1');
|
||||
PREPARE aihr_web_last_test_ok_stmt FROM @web_last_test_ok_ddl;
|
||||
EXECUTE aihr_web_last_test_ok_stmt;
|
||||
DEALLOCATE PREPARE aihr_web_last_test_ok_stmt;
|
||||
|
||||
SET @web_last_test_time_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @aihr_schema AND table_name = 'aihr_web_search_provider' AND column_name = 'last_test_time'
|
||||
);
|
||||
SET @web_last_test_time_ddl = IF(@web_last_test_time_exists = 0,
|
||||
'ALTER TABLE aihr_web_search_provider ADD COLUMN last_test_time datetime DEFAULT NULL COMMENT ''当前配置最近一次连接测试时间'' AFTER last_test_ok',
|
||||
'SELECT 1');
|
||||
PREPARE aihr_web_last_test_time_stmt FROM @web_last_test_time_ddl;
|
||||
EXECUTE aihr_web_last_test_time_stmt;
|
||||
DEALLOCATE PREPARE aihr_web_last_test_time_stmt;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_web_ai_query_audit` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
|
||||
`user_id` bigint NOT NULL COMMENT '服务端登录用户ID',
|
||||
`ext_party_id` varchar(80) DEFAULT NULL COMMENT '组织人员外部ID',
|
||||
`question` varchar(600) NOT NULL COMMENT '查询内容',
|
||||
`provider` varchar(40) NOT NULL COMMENT '外部检索提供方',
|
||||
`query_status` varchar(24) NOT NULL COMMENT 'DISABLED/OK/NO_SOURCES/NO_ANSWER/FAILED',
|
||||
`source_count` int NOT NULL DEFAULT 0 COMMENT '可公开访问来源数',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_aihr_web_ai_user` (`tenant_id`, `user_id`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='全网AI查询审计';
|
||||
|
||||
-- 开放问题榜。奖励只进入系统积分或学习学分账户,最终值由服务端配置约束。
|
||||
CREATE TABLE IF NOT EXISTS `aihr_community_question` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
|
||||
`author_user_id` bigint NOT NULL COMMENT '提问用户ID',
|
||||
`author_ext_party_id` varchar(80) DEFAULT NULL COMMENT '组织人员外部ID',
|
||||
`author_name` varchar(100) NOT NULL COMMENT '展示名',
|
||||
`title` varchar(160) NOT NULL COMMENT '标题',
|
||||
`content` text NOT NULL COMMENT '问题内容',
|
||||
`question_type` varchar(24) NOT NULL DEFAULT 'OPEN' COMMENT 'OPEN/BOUNTY',
|
||||
`category` varchar(40) NOT NULL DEFAULT '工作求助' COMMENT '问题分类',
|
||||
`reward_rule_code` varchar(60) NOT NULL DEFAULT 'BEST_ANSWER' COMMENT '奖励规则编码',
|
||||
`reward_points` int NOT NULL DEFAULT 10 COMMENT '最佳回答积分',
|
||||
`deadline` datetime DEFAULT NULL COMMENT '截止时间',
|
||||
`question_status` varchar(24) NOT NULL DEFAULT 'PENDING' COMMENT 'PENDING/PUBLISHED/REJECTED/CLOSED',
|
||||
`best_answer_id` bigint DEFAULT NULL COMMENT '最佳回答ID',
|
||||
`moderator_user_id` bigint DEFAULT NULL COMMENT '审核人ID',
|
||||
`moderation_note` varchar(300) DEFAULT NULL COMMENT '审核说明',
|
||||
`moderated_time` datetime DEFAULT NULL COMMENT '审核时间',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_aihr_community_question_board` (`tenant_id`, `question_status`, `create_time`),
|
||||
KEY `idx_aihr_community_question_author` (`tenant_id`, `author_user_id`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='开放问题榜';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_community_answer` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
|
||||
`question_id` bigint NOT NULL COMMENT '问题ID',
|
||||
`author_user_id` bigint NOT NULL COMMENT '回答用户ID',
|
||||
`author_ext_party_id` varchar(80) DEFAULT NULL COMMENT '组织人员外部ID',
|
||||
`author_name` varchar(100) NOT NULL COMMENT '展示名',
|
||||
`content` text NOT NULL COMMENT '回答内容',
|
||||
`answer_status` varchar(24) NOT NULL DEFAULT 'PENDING' COMMENT 'PENDING/PUBLISHED/REJECTED',
|
||||
`is_best` tinyint NOT NULL DEFAULT 0 COMMENT '是否最佳回答',
|
||||
`moderator_user_id` bigint DEFAULT NULL COMMENT '审核人ID',
|
||||
`moderation_note` varchar(300) DEFAULT NULL COMMENT '审核说明',
|
||||
`moderated_time` datetime DEFAULT NULL COMMENT '审核时间',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_aihr_community_answer_question` (`tenant_id`, `question_id`, `answer_status`, `create_time`),
|
||||
KEY `idx_aihr_community_answer_author` (`tenant_id`, `author_user_id`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='开放问题回答';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_incentive_rule` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
|
||||
`rule_code` varchar(60) NOT NULL COMMENT '规则编码',
|
||||
`display_name` varchar(100) NOT NULL COMMENT '规则名称',
|
||||
`account_type` varchar(20) NOT NULL DEFAULT 'POINTS' COMMENT 'POINTS/STUDY_CREDIT',
|
||||
`rule_value` int NOT NULL DEFAULT 0 COMMENT '奖励数值',
|
||||
`daily_cap` int NOT NULL DEFAULT 0 COMMENT '单人每日上限,0为不限制',
|
||||
`enabled` tinyint NOT NULL DEFAULT 1 COMMENT '是否启用',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_incentive_rule` (`tenant_id`, `rule_code`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='积分和奖品激励规则';
|
||||
|
||||
INSERT IGNORE INTO `aihr_incentive_rule`
|
||||
(`tenant_id`, `rule_code`, `display_name`, `account_type`, `rule_value`, `daily_cap`, `enabled`)
|
||||
VALUES
|
||||
('000000', 'BEST_ANSWER', '最佳回答积分', 'POINTS', 10, 100, 1);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_points_ledger` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
|
||||
`user_id` bigint NOT NULL COMMENT '积分用户ID',
|
||||
`ext_party_id` varchar(80) DEFAULT NULL COMMENT '组织人员外部ID',
|
||||
`business_type` varchar(40) NOT NULL COMMENT '业务类型',
|
||||
`business_id` bigint NOT NULL COMMENT '业务记录ID',
|
||||
`account_type` varchar(20) NOT NULL DEFAULT 'POINTS' COMMENT 'POINTS/STUDY_CREDIT',
|
||||
`points` int NOT NULL COMMENT '账户数值变动',
|
||||
`reason` varchar(200) NOT NULL COMMENT '变动原因',
|
||||
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_points_business` (`tenant_id`, `user_id`, `business_type`, `business_id`),
|
||||
KEY `idx_aihr_points_user` (`tenant_id`, `user_id`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工奖励账户流水';
|
||||
|
||||
-- 兼容已经执行过旧版脚本的环境:旧流水全部归入 POINTS,保持原积分余额不变。
|
||||
SET @aihr_schema = DATABASE();
|
||||
SET @account_type_exists = (
|
||||
SELECT COUNT(*) FROM information_schema.columns
|
||||
WHERE table_schema = @aihr_schema AND table_name = 'aihr_points_ledger' AND column_name = 'account_type'
|
||||
);
|
||||
SET @account_type_ddl = IF(@account_type_exists = 0,
|
||||
'ALTER TABLE aihr_points_ledger ADD COLUMN account_type varchar(20) NOT NULL DEFAULT ''POINTS'' COMMENT ''POINTS/STUDY_CREDIT'' AFTER business_id',
|
||||
'SELECT 1');
|
||||
PREPARE aihr_account_type_stmt FROM @account_type_ddl;
|
||||
EXECUTE aihr_account_type_stmt;
|
||||
DEALLOCATE PREPARE aihr_account_type_stmt;
|
||||
Reference in New Issue
Block a user