feat(work-report): add voice-first reporting flow

This commit is contained in:
2026-07-19 12:17:11 +08:00
parent 24da833fa6
commit 925b48e436
15 changed files with 2813 additions and 451 deletions
@@ -0,0 +1,109 @@
-- 工作上报正式提交幂等:首次部署可建表,已有表仅补请求键、载荷哈希和唯一索引。
-- 历史行保留 NULL;MySQL 唯一索引允许多行 NULL。
CREATE TABLE IF NOT EXISTS `aihr_work_report` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`report_type` varchar(20) NOT NULL COMMENT '类型 CASE/VIDEO/SOP/KNOWLEDGE',
`title` varchar(100) NOT NULL COMMENT '标题',
`content` varchar(2000) NOT NULL COMMENT '说明',
`attachment_oss_id` bigint DEFAULT NULL COMMENT '附件OSS编号',
`attachment_name` varchar(200) DEFAULT NULL COMMENT '附件名',
`status` varchar(20) NOT NULL DEFAULT 'PENDING' COMMENT '状态 PENDING/APPROVED/REJECTED',
`submitter_user_id` bigint NOT NULL COMMENT '提交人用户ID',
`submitter_identity` varchar(100) DEFAULT NULL COMMENT '提交人身份',
`submitter_name` varchar(100) DEFAULT NULL COMMENT '提交人显示名',
`reviewer_user_id` bigint DEFAULT NULL COMMENT '审核人用户ID',
`reviewer_name` varchar(100) DEFAULT NULL COMMENT '审核人显示名',
`review_note` varchar(500) DEFAULT NULL COMMENT '审核意见',
`review_time` datetime DEFAULT NULL COMMENT '审核时间',
`request_key` varchar(100) NOT NULL COMMENT '提交幂等键',
`request_hash` char(64) NOT NULL COMMENT '提交载荷SHA-256',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_aihr_work_report_request` (`tenant_id`, `submitter_user_id`, `request_key`),
KEY `idx_aihr_work_report_submitter` (`tenant_id`, `submitter_user_id`, `id`),
KEY `idx_aihr_work_report_status` (`tenant_id`, `status`, `id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='工作上报';
SET @has_work_report_request_key := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE table_schema = DATABASE() AND table_name = 'aihr_work_report' AND column_name = 'request_key'
);
SET @ddl_work_report_request_key := IF(
@has_work_report_request_key = 0,
'ALTER TABLE aihr_work_report ADD COLUMN request_key varchar(100) DEFAULT NULL COMMENT ''提交幂等键'' AFTER review_time',
'SELECT 1'
);
PREPARE stmt_work_report_request_key FROM @ddl_work_report_request_key;
EXECUTE stmt_work_report_request_key;
DEALLOCATE PREPARE stmt_work_report_request_key;
SET @has_work_report_request_hash := (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE table_schema = DATABASE() AND table_name = 'aihr_work_report' AND column_name = 'request_hash'
);
SET @ddl_work_report_request_hash := IF(
@has_work_report_request_hash = 0,
'ALTER TABLE aihr_work_report ADD COLUMN request_hash char(64) DEFAULT NULL COMMENT ''提交载荷SHA-256'' AFTER request_key',
'SELECT 1'
);
PREPARE stmt_work_report_request_hash FROM @ddl_work_report_request_hash;
EXECUTE stmt_work_report_request_hash;
DEALLOCATE PREPARE stmt_work_report_request_hash;
SET @has_work_report_request_index := (
SELECT COUNT(*) FROM information_schema.STATISTICS
WHERE table_schema = DATABASE() AND table_name = 'aihr_work_report'
AND index_name = 'uk_aihr_work_report_request'
);
SET @work_report_request_index_valid := (
SELECT COUNT(*) FROM (
SELECT index_name
FROM information_schema.STATISTICS
WHERE table_schema = DATABASE() AND table_name = 'aihr_work_report'
AND index_name = 'uk_aihr_work_report_request'
GROUP BY index_name
HAVING MIN(non_unique) = 0
AND COUNT(*) = 3
AND SUM(sub_part IS NOT NULL) = 0
AND GROUP_CONCAT(column_name ORDER BY seq_in_index SEPARATOR ',') =
'tenant_id,submitter_user_id,request_key'
) valid_work_report_request_index
);
SET @ddl_work_report_request_index := CASE
WHEN @work_report_request_index_valid > 0 THEN 'SELECT 1'
WHEN @has_work_report_request_index > 0 THEN
'ALTER TABLE aihr_work_report DROP INDEX uk_aihr_work_report_request, ADD UNIQUE KEY uk_aihr_work_report_request (tenant_id, submitter_user_id, request_key)'
ELSE
'ALTER TABLE aihr_work_report ADD UNIQUE KEY uk_aihr_work_report_request (tenant_id, submitter_user_id, request_key)'
END;
PREPARE stmt_work_report_request_index FROM @ddl_work_report_request_index;
EXECUTE stmt_work_report_request_index;
DEALLOCATE PREPARE stmt_work_report_request_index;
-- 与租户事实表保持同一排序规则,兼容旧库 general_ci 与新 MySQL 8 库 0900_ai_ci。
SET @work_report_target_collation := (
SELECT collation_name FROM information_schema.COLUMNS
WHERE table_schema = DATABASE() AND table_name = 'aihr_knowledge_info' AND column_name = 'tenant_id'
LIMIT 1
);
SET @work_report_target_collation := COALESCE(@work_report_target_collation, @@collation_database);
SET @work_report_current_collation := (
SELECT table_collation FROM information_schema.TABLES
WHERE table_schema = DATABASE() AND table_name = 'aihr_work_report'
LIMIT 1
);
SET @ddl_work_report_collation := IF(
@work_report_current_collation = @work_report_target_collation,
'SELECT 1',
CONCAT('ALTER TABLE aihr_work_report CONVERT TO CHARACTER SET utf8mb4 COLLATE ', @work_report_target_collation)
);
PREPARE stmt_work_report_collation FROM @ddl_work_report_collation;
EXECUTE stmt_work_report_collation;
DEALLOCATE PREPARE stmt_work_report_collation;
SET @work_report_target_collation := NULL;
SET @work_report_current_collation := NULL;
SET @ddl_work_report_collation := NULL;