feat: add project-scoped work assistant results
This commit is contained in:
@@ -237,6 +237,7 @@ CREATE TABLE IF NOT EXISTS `aihr_knowledge_conversation` (
|
||||
`app_id` bigint NOT NULL COMMENT '内部调用应用ID',
|
||||
`user_id` bigint NOT NULL COMMENT '内部用户ID',
|
||||
`conversation_id` varchar(64) NOT NULL COMMENT '客户端随机会话ID',
|
||||
`project_code` varchar(100) DEFAULT NULL COMMENT '当前项目编码;多项目会话严格隔离',
|
||||
`version` bigint NOT NULL DEFAULT 0 COMMENT '乐观并发版本',
|
||||
`context_json` json DEFAULT NULL COMMENT '最近六轮脱敏短期上下文',
|
||||
`expires_time` datetime NOT NULL COMMENT '不活跃过期时间',
|
||||
|
||||
@@ -20,7 +20,8 @@ CREATE TABLE `aihr_org_snapshot` (
|
||||
`snapshot_date` date DEFAULT NULL COMMENT '快照日期',
|
||||
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_org_party` (`tenant_id`, `ext_party_id`),
|
||||
UNIQUE KEY `uk_aihr_org_party` (`tenant_id`, `project_code`, `ext_party_id`),
|
||||
KEY `idx_aihr_org_party` (`tenant_id`, `ext_party_id`),
|
||||
KEY `idx_aihr_org_phone` (`tenant_id`, `person_phone`),
|
||||
KEY `idx_aihr_org_project` (`tenant_id`, `project_code`, `position_level`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='组织人员静态快照(Demo)';
|
||||
|
||||
@@ -8,11 +8,13 @@ CREATE TABLE IF NOT EXISTS `aihr_memory_candidate` (
|
||||
`source_request_id` varchar(64) NOT NULL COMMENT '来源问答请求ID',
|
||||
`candidate_hash` char(64) NOT NULL COMMENT '规范化候选SHA-256',
|
||||
`project_code` varchar(100) DEFAULT NULL COMMENT '经当前身份解析的真实项目编码',
|
||||
`work_date` date DEFAULT NULL COMMENT 'Asia/Shanghai 自然工作日期',
|
||||
`memory_type` varchar(30) NOT NULL COMMENT 'RESIDENT_NEED/FOLLOW_UP',
|
||||
`target_domain` varchar(30) NOT NULL DEFAULT 'PROJECT_SERVICE' COMMENT '目标记忆域',
|
||||
`status` varchar(20) NOT NULL COMMENT 'NEEDS_INPUT/DRAFT/CONFIRMED/DISMISSED/EXPIRED',
|
||||
`draft_json` json DEFAULT NULL COMMENT '可编辑的结构化草稿,不保存模型原始输出',
|
||||
`missing_fields_json` json DEFAULT NULL COMMENT '待补充字段',
|
||||
`source_snapshot_json` json DEFAULT NULL COMMENT '最小必要来源快照与受保护OSS引用',
|
||||
`confidence` decimal(5,4) NOT NULL DEFAULT 0 COMMENT '只用于展示建议',
|
||||
`target_id` bigint DEFAULT NULL COMMENT '确认后项目记忆ID',
|
||||
`target_version` int DEFAULT NULL COMMENT '确认结果版本',
|
||||
@@ -83,6 +85,7 @@ CREATE TABLE IF NOT EXISTS `aihr_assistant_capture` (
|
||||
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
|
||||
`owner_user_id` bigint NOT NULL COMMENT '记录员工',
|
||||
`project_code` varchar(100) DEFAULT NULL COMMENT '经当前身份确认的项目编码',
|
||||
`work_date` date DEFAULT NULL COMMENT 'Asia/Shanghai 自然工作日期',
|
||||
`save_scope` varchar(20) NOT NULL COMMENT 'PRIVATE/COMPANY',
|
||||
`suggested_type` varchar(30) NOT NULL COMMENT 'SERVICE_LEAD/RESIDENT_PROFILE/CASE/PERSONAL_NOTE/FOLLOW_UP/PROJECT_NOTE',
|
||||
`building_name` varchar(100) DEFAULT NULL COMMENT '可选楼栋',
|
||||
@@ -95,6 +98,8 @@ CREATE TABLE IF NOT EXISTS `aihr_assistant_capture` (
|
||||
`follow_up_at` datetime DEFAULT NULL COMMENT '用户确认的跟进时间',
|
||||
`source_conversation_id` varchar(64) NOT NULL DEFAULT '' COMMENT '来源会话ID',
|
||||
`source_request_id` varchar(64) NOT NULL COMMENT '来源问答请求ID',
|
||||
`source_snapshot_json` json DEFAULT NULL COMMENT '最小必要来源快照与受保护OSS引用',
|
||||
`business_status` varchar(30) NOT NULL DEFAULT 'RECORDED' COMMENT 'RECORDED/PENDING/IN_PROGRESS/COMPLETED/VOID',
|
||||
`delivery_status` varchar(20) NOT NULL COMMENT 'NOT_REQUIRED/PENDING/DELIVERED/FAILED',
|
||||
`delivery_attempts` int NOT NULL DEFAULT 0 COMMENT '企业流转尝试次数',
|
||||
`next_delivery_at` datetime DEFAULT NULL COMMENT '下次流转时间',
|
||||
@@ -108,9 +113,44 @@ CREATE TABLE IF NOT EXISTS `aihr_assistant_capture` (
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_assistant_capture_confirm` (`tenant_id`, `owner_user_id`, `confirm_idempotency_key`),
|
||||
KEY `idx_aihr_assistant_capture_owner` (`tenant_id`, `owner_user_id`, `save_scope`, `create_time`),
|
||||
KEY `idx_aihr_assistant_capture_daily` (`tenant_id`, `project_code`, `work_date`, `owner_user_id`),
|
||||
KEY `idx_aihr_assistant_capture_delivery` (`delivery_status`, `next_delivery_at`, `id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工作助手确认式统一采集记录';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_assistant_capture_status_log` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '状态变更ID',
|
||||
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
|
||||
`capture_id` bigint NOT NULL COMMENT '统一采集记录ID',
|
||||
`project_code` varchar(100) DEFAULT NULL COMMENT '项目编码',
|
||||
`from_status` varchar(30) NOT NULL COMMENT '变更前业务状态',
|
||||
`to_status` varchar(30) NOT NULL COMMENT '变更后业务状态',
|
||||
`note` varchar(500) DEFAULT NULL COMMENT '处理备注',
|
||||
`operator_user_id` bigint NOT NULL COMMENT '操作人',
|
||||
`idempotency_key` varchar(100) NOT NULL COMMENT '状态更新幂等键',
|
||||
`create_time` datetime NOT NULL COMMENT '操作时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_capture_status_idempotency` (`tenant_id`, `operator_user_id`, `idempotency_key`),
|
||||
KEY `idx_aihr_capture_status_capture` (`tenant_id`, `capture_id`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工作助手业务状态变更历史';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_daily_work_result` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '今日工作成果ID',
|
||||
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
|
||||
`owner_user_id` bigint NOT NULL COMMENT '员工用户ID',
|
||||
`project_code` varchar(100) NOT NULL COMMENT '项目编码',
|
||||
`work_date` date NOT NULL COMMENT 'Asia/Shanghai 自然工作日期',
|
||||
`report_json` json NOT NULL COMMENT '确定性聚合后的成果快照',
|
||||
`source_capture_ids_json` json NOT NULL COMMENT '来源采集记录ID',
|
||||
`content_hash` char(64) NOT NULL DEFAULT '' COMMENT '忽略生成时间和版本的成果内容指纹',
|
||||
`version` int NOT NULL DEFAULT 1 COMMENT '重新生成版本',
|
||||
`generated_at` datetime NOT NULL COMMENT '生成时间',
|
||||
`create_time` datetime NOT NULL COMMENT '创建时间',
|
||||
`update_time` datetime NOT NULL COMMENT '更新时间',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_daily_work_result` (`tenant_id`, `owner_user_id`, `project_code`, `work_date`),
|
||||
KEY `idx_aihr_daily_work_result_project` (`tenant_id`, `project_code`, `work_date`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工按项目按自然日工作成果快照';
|
||||
|
||||
-- 生产旧库与 MySQL 8 新库的排序规则可能不同;以现有租户主表为事实源动态对齐。
|
||||
SET @aihr_memory_collation := (
|
||||
SELECT collation_name
|
||||
|
||||
@@ -6,6 +6,7 @@ CREATE TABLE IF NOT EXISTS `aihr_knowledge_conversation` (
|
||||
`app_id` bigint NOT NULL COMMENT '内部调用应用ID',
|
||||
`user_id` bigint NOT NULL COMMENT '内部用户ID',
|
||||
`conversation_id` varchar(64) NOT NULL COMMENT '客户端随机会话ID',
|
||||
`project_code` varchar(100) DEFAULT NULL COMMENT '当前项目编码;多项目会话严格隔离',
|
||||
`version` bigint NOT NULL DEFAULT 0 COMMENT '乐观并发版本',
|
||||
`context_json` json DEFAULT NULL COMMENT '最近六轮脱敏短期上下文',
|
||||
`expires_time` datetime NOT NULL COMMENT '不活跃过期时间',
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
-- 同一员工可属于多个项目;身份仍以 ext_party_id 为主,成员关系以项目隔离。
|
||||
-- 可重复执行,先替换旧的 tenant+ext_party_id 唯一键,再补身份查询索引。
|
||||
|
||||
SET @aihr_org_table_exists := (
|
||||
SELECT COUNT(*) FROM information_schema.tables
|
||||
WHERE table_schema = DATABASE() AND table_name = 'aihr_org_snapshot'
|
||||
);
|
||||
SET @aihr_org_unique_columns := (
|
||||
SELECT GROUP_CONCAT(column_name ORDER BY seq_in_index)
|
||||
FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE() AND table_name = 'aihr_org_snapshot'
|
||||
AND index_name = 'uk_aihr_org_party'
|
||||
);
|
||||
SET @ddl := IF(
|
||||
@aihr_org_table_exists = 1 AND COALESCE(@aihr_org_unique_columns, '') <> 'tenant_id,project_code,ext_party_id',
|
||||
IF(
|
||||
@aihr_org_unique_columns IS NULL,
|
||||
'ALTER TABLE `aihr_org_snapshot` ADD UNIQUE KEY `uk_aihr_org_party` (`tenant_id`, `project_code`, `ext_party_id`)',
|
||||
'ALTER TABLE `aihr_org_snapshot` DROP INDEX `uk_aihr_org_party`, ADD UNIQUE KEY `uk_aihr_org_party` (`tenant_id`, `project_code`, `ext_party_id`)'
|
||||
),
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @ddl := IF(
|
||||
@aihr_org_table_exists = 1 AND NOT EXISTS(
|
||||
SELECT 1 FROM information_schema.statistics
|
||||
WHERE table_schema = DATABASE() AND table_name = 'aihr_org_snapshot'
|
||||
AND index_name = 'idx_aihr_org_party'
|
||||
),
|
||||
'ALTER TABLE `aihr_org_snapshot` ADD KEY `idx_aihr_org_party` (`tenant_id`, `ext_party_id`)',
|
||||
'SELECT 1'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @ddl := NULL;
|
||||
SET @aihr_org_table_exists := NULL;
|
||||
SET @aihr_org_unique_columns := NULL;
|
||||
@@ -0,0 +1,118 @@
|
||||
-- 工作助手项目隔离、自然日成果、来源追溯与本地状态闭环。
|
||||
-- 可重复执行;外部流转仍沿用 PENDING,不在本迁移中伪造 DELIVERED。
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_knowledge_conversation` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` varchar(20) NOT NULL,
|
||||
`app_id` bigint NOT NULL,
|
||||
`user_id` bigint NOT NULL,
|
||||
`conversation_id` varchar(64) NOT NULL,
|
||||
`project_code` varchar(100) DEFAULT NULL,
|
||||
`version` bigint NOT NULL DEFAULT 0,
|
||||
`context_json` json DEFAULT NULL,
|
||||
`expires_time` datetime NOT NULL,
|
||||
`create_time` datetime NOT NULL,
|
||||
`update_time` datetime NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_knowledge_conversation` (`tenant_id`, `app_id`, `user_id`, `conversation_id`),
|
||||
KEY `idx_aihr_knowledge_conversation_expire` (`tenant_id`, `expires_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='知识问答短期会话';
|
||||
|
||||
SET @ddl := IF(
|
||||
EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'aihr_knowledge_conversation' AND column_name = 'project_code'),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `aihr_knowledge_conversation` ADD COLUMN `project_code` varchar(100) DEFAULT NULL COMMENT ''当前项目编码;多项目会话严格隔离'' AFTER `conversation_id`'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @ddl := IF(
|
||||
EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'aihr_memory_candidate' AND column_name = 'work_date'),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `aihr_memory_candidate` ADD COLUMN `work_date` date DEFAULT NULL COMMENT ''Asia/Shanghai 自然工作日期'' AFTER `project_code`'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @ddl := IF(
|
||||
EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'aihr_memory_candidate' AND column_name = 'source_snapshot_json'),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `aihr_memory_candidate` ADD COLUMN `source_snapshot_json` json DEFAULT NULL COMMENT ''最小必要来源快照与受保护OSS引用'' AFTER `missing_fields_json`'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @ddl := IF(
|
||||
EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'aihr_assistant_capture' AND column_name = 'work_date'),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `aihr_assistant_capture` ADD COLUMN `work_date` date DEFAULT NULL COMMENT ''Asia/Shanghai 自然工作日期'' AFTER `project_code`'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @ddl := IF(
|
||||
EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'aihr_assistant_capture' AND column_name = 'source_snapshot_json'),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `aihr_assistant_capture` ADD COLUMN `source_snapshot_json` json DEFAULT NULL COMMENT ''最小必要来源快照与受保护OSS引用'' AFTER `source_request_id`'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @ddl := IF(
|
||||
EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'aihr_assistant_capture' AND column_name = 'business_status'),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `aihr_assistant_capture` ADD COLUMN `business_status` varchar(30) NOT NULL DEFAULT ''RECORDED'' COMMENT ''RECORDED/PENDING/IN_PROGRESS/COMPLETED/VOID'' AFTER `source_snapshot_json`'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
UPDATE `aihr_memory_candidate`
|
||||
SET `work_date` = DATE(`create_time`)
|
||||
WHERE `work_date` IS NULL;
|
||||
UPDATE `aihr_assistant_capture`
|
||||
SET `work_date` = DATE(COALESCE(`occurred_at`, `create_time`))
|
||||
WHERE `work_date` IS NULL;
|
||||
|
||||
SET @ddl := IF(
|
||||
EXISTS(SELECT 1 FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'aihr_assistant_capture' AND index_name = 'idx_aihr_assistant_capture_daily'),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `aihr_assistant_capture` ADD KEY `idx_aihr_assistant_capture_daily` (`tenant_id`, `project_code`, `work_date`, `owner_user_id`)'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_assistant_capture_status_log` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` varchar(20) NOT NULL,
|
||||
`capture_id` bigint NOT NULL,
|
||||
`project_code` varchar(100) DEFAULT NULL,
|
||||
`from_status` varchar(30) NOT NULL,
|
||||
`to_status` varchar(30) NOT NULL,
|
||||
`note` varchar(500) DEFAULT NULL,
|
||||
`operator_user_id` bigint NOT NULL,
|
||||
`idempotency_key` varchar(100) NOT NULL,
|
||||
`create_time` datetime NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_capture_status_idempotency` (`tenant_id`, `operator_user_id`, `idempotency_key`),
|
||||
KEY `idx_aihr_capture_status_capture` (`tenant_id`, `capture_id`, `create_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工作助手业务状态变更历史';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `aihr_daily_work_result` (
|
||||
`id` bigint NOT NULL AUTO_INCREMENT,
|
||||
`tenant_id` varchar(20) NOT NULL,
|
||||
`owner_user_id` bigint NOT NULL,
|
||||
`project_code` varchar(100) NOT NULL,
|
||||
`work_date` date NOT NULL,
|
||||
`report_json` json NOT NULL,
|
||||
`source_capture_ids_json` json NOT NULL,
|
||||
`content_hash` char(64) NOT NULL DEFAULT '',
|
||||
`version` int NOT NULL DEFAULT 1,
|
||||
`generated_at` datetime NOT NULL,
|
||||
`create_time` datetime NOT NULL,
|
||||
`update_time` datetime NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_aihr_daily_work_result` (`tenant_id`, `owner_user_id`, `project_code`, `work_date`),
|
||||
KEY `idx_aihr_daily_work_result_project` (`tenant_id`, `project_code`, `work_date`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工按项目按自然日工作成果快照';
|
||||
|
||||
SET @ddl := IF(
|
||||
EXISTS(SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'aihr_daily_work_result' AND column_name = 'content_hash'),
|
||||
'SELECT 1',
|
||||
'ALTER TABLE `aihr_daily_work_result` ADD COLUMN `content_hash` char(64) NOT NULL DEFAULT '''' COMMENT ''成果内容指纹;用于幂等生成'' AFTER `source_capture_ids_json`'
|
||||
);
|
||||
PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
|
||||
|
||||
SET @ddl := NULL;
|
||||
Reference in New Issue
Block a user