Files
OnboardXAdmin/database/scripts/20260907_seed_onboarding_demo_base_data.sql
2026-09-07 16:17:49 +08:00

399 lines
18 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================================
-- 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`;