-- 审核管理模块迁移 SQL -- 适用:MySQL 8 / InnoDB / utf8mb4 -- 说明:当前项目生产环境 typeorm.synchronize=false,请先在目标库执行本文件。 -- 注意:本文件用于新库初始化;若目标库已存在旧版审核表,请按实际表结构另行补充 ALTER TABLE 升级语句。 CREATE TABLE IF NOT EXISTS `audit_order` ( `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID', `createTime` varchar(255) NOT NULL COMMENT '创建时间', `updateTime` varchar(255) NOT NULL COMMENT '更新时间', `tenantId` int NULL COMMENT '租户ID', `orderNo` varchar(64) NOT NULL COMMENT 'TYCM订单号', `orderType` varchar(20) NOT NULL COMMENT '订单类型 insure=投保 claim=理赔', `oemId` int NULL COMMENT '主机厂ID', `agentId` int NULL COMMENT '使用的Agent ID(关联netaclaw_agent)', `sessionId` varchar(64) NULL COMMENT 'Agent会话ID(关联netaclaw会话)', `requestId` varchar(64) NOT NULL COMMENT '请求唯一标识', `status` varchar(20) NOT NULL DEFAULT 'pending' COMMENT '审核状态 pending=待处理 processing=审核中 approved=通过 rejected=驳回 manual_review=转人工 failed=失败', `inputData` json NULL COMMENT 'TYCM传入的原始订单数据(证件URL、录入信息等)', `auditResult` json NULL COMMENT '最终审核结果(通过/驳回+原因+评分)', `skillResults` json NULL COMMENT '各Skill执行结果汇总', `oemName` varchar(50) NULL COMMENT '主机厂名称', `productName` varchar(100) NULL COMMENT '产品名称', `productNo` varchar(64) NULL COMMENT '产品编号', `salesPrice` varchar(20) NULL COMMENT '销售价格', `policyFee` varchar(20) NULL COMMENT '保费', `insuranceCompany` varchar(50) NULL COMMENT '保险公司', `dealerCode` varchar(64) NULL COMMENT '经销商代码', `factoryName` varchar(100) NULL COMMENT '经销商名称', `creator` varchar(50) NULL COMMENT '录单人', `createPhone` varchar(20) NULL COMMENT '录单人手机号', `orderSource` varchar(20) NULL COMMENT '订单来源', `cardName` varchar(50) NULL COMMENT '车主姓名', `cardNumber` varchar(30) NULL COMMENT '身份证号', `phone` varchar(20) NULL COMMENT '手机号', `carHost` varchar(50) NULL COMMENT '行驶证车主', `carFrame` varchar(30) NULL COMMENT '车架号', `carPlate` varchar(20) NULL COMMENT '车牌号', `brandName` varchar(50) NULL COMMENT '品牌', `modelName` varchar(100) NULL COMMENT '车型', `vehiclePrice` varchar(20) NULL COMMENT '车辆价格', `policyNo` varchar(64) NULL COMMENT '保单号', `carPurchaseTime` varchar(30) NULL COMMENT '购车时间', `serviceStart` varchar(30) NULL COMMENT '服务开始时间', `auditScore` decimal(5,2) NULL COMMENT '审核评分', `auditDecision` varchar(20) NULL COMMENT '审核结论', `packageType` varchar(50) NULL COMMENT '套餐类型', `serviceDuration` varchar(20) NULL COMMENT '服务期限(年)', `serviceEnd` varchar(30) NULL COMMENT '服务结束时间', `carPower` varchar(20) NULL COMMENT '动力类型', `carType` varchar(10) NULL COMMENT '车辆类型(新车/在用车)', `fee` varchar(20) NULL COMMENT '产品售价', `claimAmount` decimal(12,2) NULL COMMENT '理赔金额', `repairType` varchar(30) NULL COMMENT '理赔类型(维修/代步/置换)', `relatedPolicyNo` varchar(64) NULL COMMENT '关联投保保单号', `repairFactoryName` varchar(100) NULL COMMENT '报修机构', `repairItems` varchar(200) NULL COMMENT '报修类型/项目', `repairStatus` varchar(30) NULL COMMENT '报修状态', `reportNo` varchar(64) NULL COMMENT '报案号', `callbackUrl` varchar(500) NULL COMMENT 'TYCM回调地址', `callbackStatus` varchar(20) NULL COMMENT '回调状态 pending/success/failed', `callbackRetryCount` int NOT NULL DEFAULT 0 COMMENT '回调重试次数', `duration` int NULL COMMENT '审核耗时(ms)', `remark` text NULL COMMENT '备注', PRIMARY KEY (`id`), UNIQUE KEY `IDX_audit_order_orderNo` (`orderNo`), UNIQUE KEY `IDX_audit_order_requestId` (`requestId`), KEY `IDX_audit_order_createTime` (`createTime`), KEY `IDX_audit_order_updateTime` (`updateTime`), KEY `IDX_audit_order_tenantId` (`tenantId`), KEY `IDX_audit_order_status` (`status`), KEY `IDX_audit_order_type_status_time` (`orderType`, `status`, `createTime`), KEY `IDX_audit_order_oem_time` (`oemId`, `createTime`), KEY `IDX_audit_order_agent_time` (`agentId`, `createTime`), KEY `IDX_audit_order_decision_time` (`auditDecision`, `createTime`), KEY `IDX_audit_order_policyNo` (`policyNo`), KEY `IDX_audit_order_dealer_time` (`factoryName`, `createTime`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='审核订单主表'; CREATE TABLE IF NOT EXISTS `audit_order_detail` ( `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID', `createTime` varchar(255) NOT NULL COMMENT '创建时间', `updateTime` varchar(255) NOT NULL COMMENT '更新时间', `tenantId` int NULL COMMENT '租户ID', `orderId` int NOT NULL COMMENT '关联审核订单ID(audit_order.id)', `stepType` varchar(30) NOT NULL COMMENT '步骤类型 id_card_ocr/vehicle_invoice_ocr/driving_license_ocr/data_compare/rule_check/insure_audit/claim_audit/damage_detect/audit_report/oem_audit_router/llm_judge', `stepName` varchar(100) NOT NULL COMMENT '步骤名称(中文展示用)', `skillName` varchar(50) NULL COMMENT '调用的Skill标识', `inputData` json NULL COMMENT 'Skill输入数据', `outputData` json NULL COMMENT 'Skill输出结果(OCR字段、比对结果等)', `score` decimal(5,2) NULL COMMENT '该步骤评分(0-100)', `passed` tinyint NULL COMMENT '该步骤是否通过 0=否 1=是 2=警告', `remark` text NULL COMMENT '备注/原因', `duration` int NULL COMMENT '该步骤耗时(ms)', PRIMARY KEY (`id`), KEY `IDX_audit_order_detail_createTime` (`createTime`), KEY `IDX_audit_order_detail_updateTime` (`updateTime`), KEY `IDX_audit_order_detail_tenantId` (`tenantId`), KEY `IDX_audit_order_detail_orderId` (`orderId`), KEY `IDX_audit_order_detail_order_step` (`orderId`, `stepType`), KEY `IDX_audit_order_detail_skill` (`skillName`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='审核步骤明细表'; CREATE TABLE IF NOT EXISTS `audit_config` ( `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID', `createTime` varchar(255) NOT NULL COMMENT '创建时间', `updateTime` varchar(255) NOT NULL COMMENT '更新时间', `tenantId` int NULL COMMENT '租户ID', `name` varchar(100) NOT NULL COMMENT '规则名称', `orderType` varchar(20) NULL COMMENT '订单类型 insure=投保 claim=理赔, 为空表示匹配所有', `oemId` int NULL COMMENT '主机厂ID, 为空表示匹配所有', `oemName` varchar(100) NULL COMMENT '主机厂名称(展示用)', `productKeyword` varchar(200) NULL COMMENT '产品名称关键词, 为空表示匹配所有, 支持模糊匹配', `productNo` varchar(100) NULL COMMENT '产品编号, 为空表示匹配所有', `productName` varchar(200) NULL COMMENT '产品名称(展示用)', `carType` varchar(10) NULL COMMENT '车辆类型 0=新车 1=在用车, 为空表示匹配所有', `carPower` varchar(20) NULL COMMENT '动力类型 1=燃油 2=新能源, 长安专用, 为空表示匹配所有', `agentId` int NOT NULL COMMENT '关联的Agent ID', `agentIds` json NULL COMMENT '关联的Agent ID列表', `agentName` varchar(200) NULL COMMENT 'Agent名称(展示用)', `priority` int NOT NULL DEFAULT 0 COMMENT '优先级, 数字越大越优先', `status` int NOT NULL DEFAULT 1 COMMENT '状态 0=禁用 1=启用', `remark` text NULL COMMENT '备注', PRIMARY KEY (`id`), KEY `IDX_audit_config_createTime` (`createTime`), KEY `IDX_audit_config_updateTime` (`updateTime`), KEY `IDX_audit_config_tenantId` (`tenantId`), KEY `IDX_audit_config_agentId` (`agentId`), KEY `IDX_audit_config_priority` (`priority`), KEY `IDX_audit_config_status` (`status`), KEY `IDX_audit_config_match` (`status`, `orderType`, `oemId`, `carType`, `carPower`, `priority`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='审核配置规则表'; -- 已存在 audit_config 表的升级 SQL: -- ALTER TABLE `audit_config` ADD COLUMN `carType` varchar(10) NULL COMMENT '车辆类型 0=新车 1=在用车, 为空表示匹配所有' AFTER `productKeyword`; -- ALTER TABLE `audit_config` ADD COLUMN `productNo` varchar(100) NULL COMMENT '产品编号, 为空表示匹配所有' AFTER `productKeyword`; -- ALTER TABLE `audit_config` ADD COLUMN `productName` varchar(200) NULL COMMENT '产品名称(展示用)' AFTER `productNo`; -- ALTER TABLE `audit_config` ADD COLUMN `carPower` varchar(20) NULL COMMENT '动力类型 1=燃油 2=新能源, 长安专用, 为空表示匹配所有' AFTER `carType`; -- ALTER TABLE `audit_config` ADD COLUMN `agentIds` json NULL COMMENT '关联的Agent ID列表' AFTER `agentId`; -- ALTER TABLE `audit_config` DROP INDEX `IDX_audit_config_match`; -- ALTER TABLE `audit_config` ADD INDEX `IDX_audit_config_match` (`status`, `orderType`, `oemId`, `carType`, `carPower`, `priority`); -- 菜单权限:审核管理 / 审核订单 / 审核统计 / 审核配置 / 审核详情(隐藏) -- 使用 router 做幂等判断;若已有同 router 菜单,本段不会重复插入。 SET @now = DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); INSERT INTO `base_sys_menu` (`parentId`, `name`, `router`, `perms`, `type`, `icon`, `orderNum`, `viewPath`, `keepAlive`, `isShow`, `createTime`, `updateTime`, `tenantId`) SELECT NULL, '审核管理', NULL, NULL, 0, 'icon-dict', 95, NULL, 1, 1, @now, @now, NULL WHERE NOT EXISTS ( SELECT 1 FROM `base_sys_menu` WHERE `name` = '审核管理' AND `parentId` IS NULL ); SET @audit_parent_id = ( SELECT `id` FROM `base_sys_menu` WHERE `name` = '审核管理' AND `parentId` IS NULL ORDER BY `id` DESC LIMIT 1 ); INSERT INTO `base_sys_menu` (`parentId`, `name`, `router`, `perms`, `type`, `icon`, `orderNum`, `viewPath`, `keepAlive`, `isShow`, `createTime`, `updateTime`, `tenantId`) SELECT @audit_parent_id, '审核订单', '/audit/orders', NULL, 1, 'icon-menu', 0, 'modules/audit/views/order-list.vue', 1, 1, @now, @now, NULL WHERE NOT EXISTS (SELECT 1 FROM `base_sys_menu` WHERE `router` = '/audit/orders'); INSERT INTO `base_sys_menu` (`parentId`, `name`, `router`, `perms`, `type`, `icon`, `orderNum`, `viewPath`, `keepAlive`, `isShow`, `createTime`, `updateTime`, `tenantId`) SELECT @audit_parent_id, '审核统计', '/audit/dashboard', NULL, 1, 'icon-count', 1, 'modules/audit/views/dashboard.vue', 1, 1, @now, @now, NULL WHERE NOT EXISTS (SELECT 1 FROM `base_sys_menu` WHERE `router` = '/audit/dashboard'); INSERT INTO `base_sys_menu` (`parentId`, `name`, `router`, `perms`, `type`, `icon`, `orderNum`, `viewPath`, `keepAlive`, `isShow`, `createTime`, `updateTime`, `tenantId`) SELECT @audit_parent_id, '审核配置', '/audit/config', NULL, 1, 'icon-params', 2, 'modules/audit/views/config.vue', 1, 1, @now, @now, NULL WHERE NOT EXISTS (SELECT 1 FROM `base_sys_menu` WHERE `router` = '/audit/config'); INSERT INTO `base_sys_menu` (`parentId`, `name`, `router`, `perms`, `type`, `icon`, `orderNum`, `viewPath`, `keepAlive`, `isShow`, `createTime`, `updateTime`, `tenantId`) SELECT @audit_parent_id, '审核详情', '/audit/detail', NULL, 1, 'icon-menu', 3, 'modules/audit/views/order-detail.vue', 0, 0, @now, @now, NULL WHERE NOT EXISTS (SELECT 1 FROM `base_sys_menu` WHERE `router` = '/audit/detail'); SET @audit_order_menu_id = (SELECT `id` FROM `base_sys_menu` WHERE `router` = '/audit/orders' ORDER BY `id` DESC LIMIT 1); SET @audit_dashboard_menu_id = (SELECT `id` FROM `base_sys_menu` WHERE `router` = '/audit/dashboard' ORDER BY `id` DESC LIMIT 1); SET @audit_config_menu_id = (SELECT `id` FROM `base_sys_menu` WHERE `router` = '/audit/config' ORDER BY `id` DESC LIMIT 1); INSERT INTO `base_sys_menu` (`parentId`, `name`, `router`, `perms`, `type`, `icon`, `orderNum`, `viewPath`, `keepAlive`, `isShow`, `createTime`, `updateTime`, `tenantId`) SELECT @audit_order_menu_id, '查询', NULL, 'audit:audit:page,audit:audit:list,audit:audit:info,audit:audit:detail', 2, NULL, 0, NULL, 1, 1, @now, @now, NULL WHERE NOT EXISTS (SELECT 1 FROM `base_sys_menu` WHERE `parentId` = @audit_order_menu_id AND `name` = '查询'); INSERT INTO `base_sys_menu` (`parentId`, `name`, `router`, `perms`, `type`, `icon`, `orderNum`, `viewPath`, `keepAlive`, `isShow`, `createTime`, `updateTime`, `tenantId`) SELECT @audit_order_menu_id, '操作', NULL, 'audit:audit:retry,audit:audit:manual,audit:audit:remove,audit:audit:stats', 2, NULL, 1, NULL, 1, 1, @now, @now, NULL WHERE NOT EXISTS (SELECT 1 FROM `base_sys_menu` WHERE `parentId` = @audit_order_menu_id AND `name` = '操作'); INSERT INTO `base_sys_menu` (`parentId`, `name`, `router`, `perms`, `type`, `icon`, `orderNum`, `viewPath`, `keepAlive`, `isShow`, `createTime`, `updateTime`, `tenantId`) SELECT @audit_dashboard_menu_id, '查询', NULL, 'audit:audit:statsOverview,audit:audit:statsByProduct,audit:audit:statsByDealer,audit:audit:statsByOem,audit:audit:statsByInsurance,audit:audit:filterOptions,audit:audit:searchDealers,audit:audit:searchProducts,audit:audit:exportData', 2, NULL, 0, NULL, 1, 1, @now, @now, NULL WHERE NOT EXISTS (SELECT 1 FROM `base_sys_menu` WHERE `parentId` = @audit_dashboard_menu_id AND `name` = '查询'); INSERT INTO `base_sys_menu` (`parentId`, `name`, `router`, `perms`, `type`, `icon`, `orderNum`, `viewPath`, `keepAlive`, `isShow`, `createTime`, `updateTime`, `tenantId`) SELECT @audit_config_menu_id, '管理', NULL, 'audit:config:add,audit:config:delete,audit:config:update,audit:config:info,audit:config:list,audit:config:page,audit:config:agents,audit:config:testMatch', 2, NULL, 0, NULL, 1, 1, @now, @now, NULL WHERE NOT EXISTS (SELECT 1 FROM `base_sys_menu` WHERE `parentId` = @audit_config_menu_id AND `name` = '管理');