-- ============================================================================ -- OnboardX 基础业务假数据初始化脚本(MySQL 8.0+) -- -- 使用: -- 1. 先执行 20260828_reset_onboarding_business_data_v2.sql; -- 2. 再执行本脚本; -- 3. 发起任务时选择: -- 重庆示例科技有限公司 / 技术部 / 后端开发工程师 / -- 技术岗位标准入职模板(测试)。 -- -- 特点: -- - 不删除任何数据; -- - 不覆盖保留的 ob_variable_definition 和 ob_material_type; -- - 只生成基础配置,不生成任务、员工或电子签约流程; -- - 固定业务 Id + ON DUPLICATE KEY UPDATE,可重复执行。 -- -- 合同源文件默认自动选择 sys_file 中最近的 DOCX,并优先排除 OB20 开头的 -- 已生成任务合同。若自动选择不对,把 NULL 改为正确的源 DOCX 文件 Id。 -- 例如:SET @ob_seed_source_docx_file_id := 842701790859333; -- ============================================================================ USE `OnboardX`; SET NAMES utf8mb4; SET @ob_seed_source_docx_file_id := NULL; SET @ob_seed_source_docx_file_id := COALESCE( @ob_seed_source_docx_file_id, ( SELECT file.`Id` FROM `sys_file` file WHERE LOWER(TRIM(LEADING '.' FROM COALESCE(file.`Suffix`, ''))) = 'docx' AND COALESCE(file.`IsDelete`, 0) = 0 ORDER BY CASE WHEN UPPER(COALESCE(file.`Name`, '')) LIKE 'OB20%' THEN 1 ELSE 0 END, file.`CreateTime` DESC, file.`Id` DESC LIMIT 1 ) ); DROP PROCEDURE IF EXISTS `ob_assert_seed_prerequisites`; DELIMITER $$ CREATE PROCEDURE `ob_assert_seed_prerequisites`() BEGIN IF NOT EXISTS ( SELECT 1 FROM `ob_variable_definition` WHERE COALESCE(`IsDelete`, 0) = 0 AND LOWER(COALESCE(`Status`, 'enable')) = 'enable' ) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '初始化失败:ob_variable_definition 没有启用数据'; END IF; IF NOT EXISTS ( SELECT 1 FROM `ob_material_type` WHERE COALESCE(`IsDelete`, 0) = 0 AND LOWER(COALESCE(`Status`, 'enable')) = 'enable' ) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '初始化失败:ob_material_type 没有启用数据'; END IF; IF @ob_seed_source_docx_file_id IS NULL OR NOT EXISTS ( SELECT 1 FROM `sys_file` WHERE `Id` = @ob_seed_source_docx_file_id AND LOWER(TRIM(LEADING '.' FROM COALESCE(`Suffix`, ''))) = 'docx' AND COALESCE(`IsDelete`, 0) = 0 ) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '初始化失败:没有可用的合同源 DOCX,请在脚本顶部指定文件 Id'; END IF; END$$ DELIMITER ; CALL `ob_assert_seed_prerequisites`(); DROP PROCEDURE IF EXISTS `ob_assert_seed_prerequisites`; START TRANSACTION; -- 1. 公司 INSERT INTO `ob_company` (`Id`, `CompanyCode`, `CompanyName`, `LegalName`, `UnifiedSocialCreditCode`, `LegalRepresentative`, `RegisteredAddress`, `ContactPhone`, `Remark`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) VALUES (8800000000000001, 'DEMO-COMPANY-001', '重庆示例科技有限公司', '重庆示例科技有限公司', '91500000MA5UDEMO01', '张示例', '重庆市渝北区示例大道 100 号', '023-88886666', '测试公司,可在后台修改', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0) ON DUPLICATE KEY UPDATE `CompanyCode` = VALUES(`CompanyCode`), `CompanyName` = VALUES(`CompanyName`), `LegalName` = VALUES(`LegalName`), `UnifiedSocialCreditCode` = VALUES(`UnifiedSocialCreditCode`), `LegalRepresentative` = VALUES(`LegalRepresentative`), `RegisteredAddress` = VALUES(`RegisteredAddress`), `ContactPhone` = VALUES(`ContactPhone`), `Remark` = VALUES(`Remark`), `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; -- 2. 部门 INSERT INTO `ob_department` (`Id`, `CompanyId`, `DepartmentCode`, `DepartmentName`, `SortCode`, `Remark`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) VALUES (8800000000000101, 8800000000000001, 'DEMO-DEPT-HR', '人事部', 10, '负责招聘、入职和员工关系', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0), (8800000000000102, 8800000000000001, 'DEMO-DEPT-TECH', '技术部', 20, '负责产品研发和质量保障', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0), (8800000000000103, 8800000000000001, 'DEMO-DEPT-OPERATION', '运营部', 30, '负责产品运营和客户服务', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0) ON DUPLICATE KEY UPDATE `CompanyId` = VALUES(`CompanyId`), `DepartmentCode` = VALUES(`DepartmentCode`), `DepartmentName` = VALUES(`DepartmentName`), `SortCode` = VALUES(`SortCode`), `Remark` = VALUES(`Remark`), `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; -- 3. 岗位及默认人事合同参数 INSERT INTO `ob_position` (`Id`, `CompanyId`, `DepartmentId`, `PositionCode`, `PositionName`, `DefaultContractYears`, `DefaultProbationMonths`, `DefaultParamsJson`, `Remark`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) VALUES (8800000000000201, 8800000000000001, 8800000000000101, 'DEMO-HR-SPECIALIST', '人事专员', 3, 3, JSON_OBJECT('hr.BaseSalary', '4500', 'hr.PositionSalary', '1000', 'hr.PerformanceAllowance', '500', 'hr.AttendanceBonus', '200', 'hr.RegularSalary', '6200', 'hr.WorkCity', '重庆', 'hr.PositionName', '人事专员', 'hr.ContractTerm', '3', 'hr.ProbationTerm', '3'), '测试岗位', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0), (8800000000000202, 8800000000000001, 8800000000000102, 'DEMO-BACKEND-ENGINEER', '后端开发工程师', 3, 3, JSON_OBJECT('hr.BaseSalary', '6500', 'hr.PositionSalary', '2500', 'hr.PerformanceAllowance', '1000', 'hr.AttendanceBonus', '200', 'hr.RegularSalary', '10200', 'hr.WorkCity', '重庆', 'hr.PositionName', '后端开发工程师', 'hr.ContractTerm', '3', 'hr.ProbationTerm', '3'), '完整流程推荐使用此岗位', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0), (8800000000000203, 8800000000000001, 8800000000000102, 'DEMO-FRONTEND-ENGINEER', '前端开发工程师', 3, 3, JSON_OBJECT('hr.BaseSalary', '6200', 'hr.PositionSalary', '2300', 'hr.PerformanceAllowance', '1000', 'hr.AttendanceBonus', '200', 'hr.RegularSalary', '9700', 'hr.WorkCity', '重庆', 'hr.PositionName', '前端开发工程师', 'hr.ContractTerm', '3', 'hr.ProbationTerm', '3'), '测试岗位', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0), (8800000000000204, 8800000000000001, 8800000000000102, 'DEMO-QA-ENGINEER', '测试工程师', 3, 3, JSON_OBJECT('hr.BaseSalary', '5500', 'hr.PositionSalary', '1800', 'hr.PerformanceAllowance', '800', 'hr.AttendanceBonus', '200', 'hr.RegularSalary', '8300', 'hr.WorkCity', '重庆', 'hr.PositionName', '测试工程师', 'hr.ContractTerm', '3', 'hr.ProbationTerm', '3'), '测试岗位', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0), (8800000000000205, 8800000000000001, 8800000000000103, 'DEMO-OPERATION-SPECIALIST', '运营专员', 3, 3, JSON_OBJECT('hr.BaseSalary', '4500', 'hr.PositionSalary', '1200', 'hr.PerformanceAllowance', '800', 'hr.AttendanceBonus', '200', 'hr.RegularSalary', '6700', 'hr.WorkCity', '重庆', 'hr.PositionName', '运营专员', 'hr.ContractTerm', '3', 'hr.ProbationTerm', '3'), '测试岗位', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0) ON DUPLICATE KEY UPDATE `CompanyId` = VALUES(`CompanyId`), `DepartmentId` = VALUES(`DepartmentId`), `PositionCode` = VALUES(`PositionCode`), `PositionName` = VALUES(`PositionName`), `DefaultContractYears` = VALUES(`DefaultContractYears`), `DefaultProbationMonths` = VALUES(`DefaultProbationMonths`), `DefaultParamsJson` = VALUES(`DefaultParamsJson`), `Remark` = VALUES(`Remark`), `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; -- 4. 技术部合同模板及适用岗位 INSERT INTO `ob_contract_template` (`Id`, `CompanyId`, `DepartmentId`, `TemplateCode`, `TemplateName`, `ContractType`, `Description`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) VALUES (8800000000000301, 8800000000000001, 8800000000000102, 'DEMO-LABOR-CONTRACT-001', '技术岗位劳动合同(测试)', '劳动合同', '测试合同模板,源 DOCX 由脚本顶部变量决定', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0) ON DUPLICATE KEY UPDATE `CompanyId` = VALUES(`CompanyId`), `DepartmentId` = VALUES(`DepartmentId`), `TemplateCode` = VALUES(`TemplateCode`), `TemplateName` = VALUES(`TemplateName`), `ContractType` = VALUES(`ContractType`), `Description` = VALUES(`Description`), `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; INSERT INTO `ob_contract_template_position` (`Id`, `ContractTemplateId`, `PositionId`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) VALUES (8800000000000401, 8800000000000301, 8800000000000202, 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0), (8800000000000402, 8800000000000301, 8800000000000203, 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0), (8800000000000403, 8800000000000301, 8800000000000204, 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0) ON DUPLICATE KEY UPDATE `ContractTemplateId` = VALUES(`ContractTemplateId`), `PositionId` = VALUES(`PositionId`), `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; -- 5. 已启用合同版本 INSERT INTO `ob_contract_template_version` (`Id`, `TemplateId`, `VersionNo`, `SourceDocxFileId`, `FileHash`, `EffectiveDate`, `ExpiryDate`, `VersionStatus`, `Remark`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) VALUES (8800000000000311, 8800000000000301, '1.0', @ob_seed_source_docx_file_id, CONCAT('seed-file-', @ob_seed_source_docx_file_id), CURDATE(), DATE_ADD(CURDATE(), INTERVAL 10 YEAR), 'enabled', '测试合同版本', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0) ON DUPLICATE KEY UPDATE `TemplateId` = VALUES(`TemplateId`), `VersionNo` = VALUES(`VersionNo`), `SourceDocxFileId` = VALUES(`SourceDocxFileId`), `FileHash` = VALUES(`FileHash`), `EffectiveDate` = VALUES(`EffectiveDate`), `ExpiryDate` = VALUES(`ExpiryDate`), `VersionStatus` = 'enabled', `Remark` = VALUES(`Remark`), `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; -- SQL 不能解压 DOCX 识别占位符,因此复制当前启用的四类变量字典。 -- DOCX 未使用的变量不会改变文件;这样能避免实际占位符初始化时遗漏。 INSERT INTO `ob_template_variable` (`Id`, `TemplateVersionId`, `VariableCode`, `VariableName`, `VariableType`, `DataType`, `EmployeeField`, `DefaultValue`, `Required`, `HrEditable`, `SortCode`, `Remark`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) SELECT 8000000000000000 + definition.`Id`, 8800000000000311, definition.`VariableCode`, definition.`VariableName`, CASE LOWER(definition.`VariableCategory`) WHEN 'employee' THEN 'employee' WHEN 'hr' THEN 'contract' WHEN 'company' THEN 'company' WHEN 'system' THEN 'system' END, COALESCE(NULLIF(definition.`DataType`, ''), 'string'), CASE WHEN LOWER(definition.`VariableCategory`) IN ('employee', 'company') THEN SUBSTRING_INDEX(definition.`VariableCode`, '.', -1) ELSE NULL END, definition.`DefaultValue`, COALESCE(definition.`Required`, 0), CASE WHEN LOWER(definition.`VariableCategory`) = 'hr' THEN 1 ELSE 0 END, COALESCE(definition.`SortCode`, 100), definition.`Remark`, 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0 FROM `ob_variable_definition` definition WHERE COALESCE(definition.`IsDelete`, 0) = 0 AND LOWER(COALESCE(definition.`Status`, 'enable')) = 'enable' AND LOWER(definition.`VariableCategory`) IN ('employee', 'hr', 'company', 'system') AND definition.`Id` BETWEEN 1 AND 1007199254740991 ON DUPLICATE KEY UPDATE `VariableName` = VALUES(`VariableName`), `VariableType` = VALUES(`VariableType`), `DataType` = VALUES(`DataType`), `EmployeeField` = VALUES(`EmployeeField`), `DefaultValue` = VALUES(`DefaultValue`), `Required` = VALUES(`Required`), `HrEditable` = VALUES(`HrEditable`), `SortCode` = VALUES(`SortCode`), `Remark` = VALUES(`Remark`), `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; -- 6. 可直接发起任务的入职模板 INSERT INTO `ob_onboarding_template` (`Id`, `TemplateCode`, `TemplateName`, `CompanyId`, `DepartmentId`, `Description`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) VALUES (8800000000000501, 'DEMO-ONBOARDING-TECH', '技术岗位标准入职模板(测试)', 8800000000000001, 8800000000000102, '适用于后端、前端和测试工程师,可用于完整入职流程测试', 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0) ON DUPLICATE KEY UPDATE `TemplateCode` = VALUES(`TemplateCode`), `TemplateName` = VALUES(`TemplateName`), `CompanyId` = VALUES(`CompanyId`), `DepartmentId` = VALUES(`DepartmentId`), `Description` = VALUES(`Description`), `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; INSERT INTO `ob_onboarding_template_position` (`Id`, `OnboardingTemplateId`, `PositionId`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) VALUES (8800000000000601, 8800000000000501, 8800000000000202, 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0), (8800000000000602, 8800000000000501, 8800000000000203, 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0), (8800000000000603, 8800000000000501, 8800000000000204, 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0) ON DUPLICATE KEY UPDATE `OnboardingTemplateId` = VALUES(`OnboardingTemplateId`), `PositionId` = VALUES(`PositionId`), `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; INSERT INTO `ob_onboarding_template_contract` (`Id`, `OnboardingTemplateId`, `ContractTemplateId`, `ContractTemplateVersionId`, `Required`, `PrintCopies`, `SortCode`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) VALUES (8800000000000701, 8800000000000501, 8800000000000301, 8800000000000311, 1, 1, 10, 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0) ON DUPLICATE KEY UPDATE `OnboardingTemplateId` = VALUES(`OnboardingTemplateId`), `ContractTemplateId` = VALUES(`ContractTemplateId`), `ContractTemplateVersionId` = VALUES(`ContractTemplateVersionId`), `Required` = 1, `PrintCopies` = 1, `SortCode` = 10, `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; -- 所有启用资料类型都会显示;一寸白底证件照必传,其余选传。 INSERT INTO `ob_onboarding_template_material` (`Id`, `OnboardingTemplateId`, `MaterialTypeId`, `Required`, `SortCode`, `Status`, `CreateTime`, `UpdateTime`, `CreateUser`, `UpdateUser`, `IsDelete`) SELECT 7000000000000000 + material.`Id`, 8800000000000501, material.`Id`, CASE WHEN material.`MaterialName` LIKE '%一寸白底%' OR LOWER(material.`MaterialCode`) IN ('photo', 'id_photo', 'head_photo') THEN 1 ELSE 0 END, ROW_NUMBER() OVER (ORDER BY material.`Id`) * 10, 'ENABLE', NOW(3), NOW(3), 'seed-script', 'seed-script', 0 FROM `ob_material_type` material WHERE COALESCE(material.`IsDelete`, 0) = 0 AND LOWER(COALESCE(material.`Status`, 'enable')) = 'enable' AND material.`Id` BETWEEN 1 AND 2007199254740991 ON DUPLICATE KEY UPDATE `Required` = VALUES(`Required`), `SortCode` = VALUES(`SortCode`), `Status` = 'ENABLE', `UpdateTime` = NOW(3), `UpdateUser` = 'seed-script', `IsDelete` = 0; COMMIT; -- 执行结果:先核对自动选中的源 DOCX,再核对初始化数量。 SELECT 'SUCCESS' AS `Result`, @ob_seed_source_docx_file_id AS `SourceDocxFileId`, (SELECT `Name` FROM `sys_file` WHERE `Id` = @ob_seed_source_docx_file_id LIMIT 1) AS `SourceDocxFileName`, 8800000000000001 AS `CompanyId`, 8800000000000102 AS `DepartmentId`, 8800000000000202 AS `RecommendedPositionId`, 8800000000000501 AS `OnboardingTemplateId`; SELECT (SELECT COUNT(*) FROM `ob_company` WHERE `Id` = 8800000000000001 AND COALESCE(`IsDelete`, 0) = 0) AS `CompanyCount`, (SELECT COUNT(*) FROM `ob_department` WHERE `CompanyId` = 8800000000000001 AND COALESCE(`IsDelete`, 0) = 0) AS `DepartmentCount`, (SELECT COUNT(*) FROM `ob_position` WHERE `CompanyId` = 8800000000000001 AND COALESCE(`IsDelete`, 0) = 0) AS `PositionCount`, (SELECT COUNT(*) FROM `ob_template_variable` WHERE `TemplateVersionId` = 8800000000000311 AND COALESCE(`IsDelete`, 0) = 0) AS `ContractVariableCount`, (SELECT COUNT(*) FROM `ob_onboarding_template_material` WHERE `OnboardingTemplateId` = 8800000000000501 AND COALESCE(`IsDelete`, 0) = 0) AS `MaterialCount`;