电子签基础功能

This commit is contained in:
fuenmao
2026-09-07 16:17:49 +08:00
parent 384eaff444
commit da777327f5
31 changed files with 3992 additions and 61 deletions
@@ -0,0 +1,110 @@
-- OnboardX 契约锁电子签流程表
-- 适用数据库:MySQL 8.0+
-- 说明:
-- 1. 一条电子签流程可以包含同一入职任务下的多份合同。
-- 2. ProviderContractId、ProviderDocumentId 一律使用 VARCHAR,避免第三方 19 位 Id 在前端精度丢失。
-- 3. 回调事件通过 PayloadHash 幂等处理,可安全接收契约锁重复通知。
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS `ob_electronic_sign_process` (
`Id` BIGINT NOT NULL COMMENT '主键',
`TaskId` BIGINT NOT NULL COMMENT '入职任务Id',
`EmployeeId` BIGINT NOT NULL COMMENT '正式员工Id',
`Provider` VARCHAR(30) NOT NULL DEFAULT 'qiyuesuo' COMMENT '电子签服务商',
`BizId` VARCHAR(100) NOT NULL COMMENT '本系统幂等业务编号',
`IsCurrent` TINYINT(1) NULL DEFAULT 1 COMMENT '是否为任务当前电子签流程,历史流程为空',
`ProviderContractId` VARCHAR(100) NULL COMMENT '契约锁合同流程Id',
`CategoryId` VARCHAR(100) NOT NULL COMMENT '契约锁业务分类Id快照',
`SealId` VARCHAR(100) NOT NULL COMMENT '契约锁印章Id快照',
`Subject` VARCHAR(300) NOT NULL COMMENT '电子签流程标题',
`EmployeeName` VARCHAR(100) NOT NULL COMMENT '员工姓名快照',
`EmployeeMobile` VARCHAR(30) NOT NULL COMMENT '员工手机号快照',
`EmployeeIdCardNumber` VARCHAR(30) NULL COMMENT '员工身份证号码快照',
`CreatorName` VARCHAR(100) NOT NULL COMMENT '创建人姓名快照',
`CreatorMobile` VARCHAR(30) NOT NULL COMMENT '创建人手机号快照',
`SignStatus` VARCHAR(40) NOT NULL COMMENT '本系统电子签状态',
`ProviderStatus` VARCHAR(60) NULL COMMENT '契约锁原始合同状态',
`SignUrl` LONGTEXT NULL COMMENT '员工签署页面地址',
`SignUrlExpireAt` DATETIME(3) NULL COMMENT '签署页面地址到期时间',
`StartedAt` DATETIME(3) NOT NULL COMMENT '管理员发起时间',
`SentAt` DATETIME(3) NULL COMMENT '合同发送时间',
`CompletedAt` DATETIME(3) NULL COMMENT '全部签署完成时间',
`ArchivedAt` DATETIME(3) NULL COMMENT '归档完成时间',
`ArchiveFileId` BIGINT NULL COMMENT '完整归档ZIP文件Id',
`LastSyncedAt` DATETIME(3) NULL COMMENT '最后主动同步时间',
`LastCallbackAt` DATETIME(3) NULL COMMENT '最后回调时间',
`LastError` LONGTEXT NULL COMMENT '最近一次失败原因',
`RetryCount` INT NOT NULL DEFAULT 0 COMMENT '失败重试次数',
`ReissueReason` VARCHAR(500) NULL COMMENT '重新发起原因',
`ReissuedAt` DATETIME(3) NULL COMMENT '被新流程替代时间',
`ReissuedByProcessId` BIGINT NULL COMMENT '替代当前流程的新流程Id',
`ExtJson` LONGTEXT NULL COMMENT '扩展信息',
`Status` VARCHAR(20) NULL DEFAULT 'enable' COMMENT '启用状态',
`CreateTime` DATETIME(3) NULL COMMENT '创建时间',
`UpdateTime` DATETIME(3) NULL COMMENT '更新时间',
`CreateUserId` BIGINT NULL COMMENT '创建者Id',
`UpdateUserId` BIGINT NULL COMMENT '修改者Id',
`CreateUser` VARCHAR(200) NULL COMMENT '创建人',
`UpdateUser` VARCHAR(200) NULL COMMENT '更新人',
`IsDelete` TINYINT(1) NULL DEFAULT 0 COMMENT '软删除',
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_ob_esign_process_biz` (`BizId`),
UNIQUE KEY `uk_ob_esign_process_current` (`TaskId`, `IsCurrent`),
UNIQUE KEY `uk_ob_esign_process_provider_contract` (`ProviderContractId`),
KEY `idx_ob_esign_process_task` (`TaskId`, `StartedAt`),
KEY `idx_ob_esign_process_status` (`SignStatus`, `UpdateTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='入职电子签流程';
CREATE TABLE IF NOT EXISTS `ob_electronic_sign_document` (
`Id` BIGINT NOT NULL COMMENT '主键',
`SignProcessId` BIGINT NOT NULL COMMENT '电子签流程Id',
`TaskContractId` BIGINT NOT NULL COMMENT '任务合同Id',
`ProviderDocumentId` VARCHAR(100) NOT NULL COMMENT '契约锁文档Id',
`DocumentName` VARCHAR(300) NOT NULL COMMENT '文档名称快照',
`DocumentSort` INT NOT NULL DEFAULT 1 COMMENT '文档顺序',
`OriginalDocxFileId` BIGINT NOT NULL COMMENT '原始DOCX文件Id',
`SignedPdfFileId` BIGINT NULL COMMENT '签署完成PDF文件Id',
`EmployeeSignKeyword` VARCHAR(200) NOT NULL COMMENT '员工签名关键字快照',
`CompanySealKeyword` VARCHAR(200) NOT NULL COMMENT '企业盖章关键字快照',
`EmployeeActionId` VARCHAR(100) NULL COMMENT '员工签署动作Id',
`CompanyActionId` VARCHAR(100) NULL COMMENT '企业盖章动作Id',
`ExtJson` LONGTEXT NULL COMMENT '扩展信息',
`Status` VARCHAR(20) NULL DEFAULT 'enable' COMMENT '启用状态',
`CreateTime` DATETIME(3) NULL COMMENT '创建时间',
`UpdateTime` DATETIME(3) NULL COMMENT '更新时间',
`CreateUserId` BIGINT NULL COMMENT '创建者Id',
`UpdateUserId` BIGINT NULL COMMENT '修改者Id',
`CreateUser` VARCHAR(200) NULL COMMENT '创建人',
`UpdateUser` VARCHAR(200) NULL COMMENT '更新人',
`IsDelete` TINYINT(1) NULL DEFAULT 0 COMMENT '软删除',
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_ob_esign_document_task_contract` (`SignProcessId`, `TaskContractId`),
UNIQUE KEY `uk_ob_esign_document_provider` (`ProviderDocumentId`),
KEY `idx_ob_esign_document_process_sort` (`SignProcessId`, `DocumentSort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='入职电子签文档';
CREATE TABLE IF NOT EXISTS `ob_electronic_sign_event` (
`Id` BIGINT NOT NULL COMMENT '主键',
`SignProcessId` BIGINT NULL COMMENT '电子签流程Id',
`PayloadHash` VARCHAR(64) NOT NULL COMMENT '回调内容SHA-256',
`EventSource` VARCHAR(30) NOT NULL COMMENT '事件来源',
`EventType` VARCHAR(100) NULL COMMENT '契约锁事件类型',
`ProviderStatus` VARCHAR(60) NULL COMMENT '契约锁状态',
`PayloadJson` LONGTEXT NULL COMMENT '事件原始内容',
`ProcessResult` VARCHAR(500) NULL COMMENT '处理结果',
`ReceivedAt` DATETIME(3) NOT NULL COMMENT '接收时间',
`ProcessedAt` DATETIME(3) NULL COMMENT '处理完成时间',
`ExtJson` LONGTEXT NULL COMMENT '扩展信息',
`Status` VARCHAR(20) NULL DEFAULT 'enable' COMMENT '启用状态',
`CreateTime` DATETIME(3) NULL COMMENT '创建时间',
`UpdateTime` DATETIME(3) NULL COMMENT '更新时间',
`CreateUserId` BIGINT NULL COMMENT '创建者Id',
`UpdateUserId` BIGINT NULL COMMENT '修改者Id',
`CreateUser` VARCHAR(200) NULL COMMENT '创建人',
`UpdateUser` VARCHAR(200) NULL COMMENT '更新人',
`IsDelete` TINYINT(1) NULL DEFAULT 0 COMMENT '软删除',
PRIMARY KEY (`Id`),
UNIQUE KEY `uk_ob_esign_event_payload_hash` (`PayloadHash`),
KEY `idx_ob_esign_event_process` (`SignProcessId`, `ReceivedAt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='入职电子签事件';
@@ -0,0 +1,33 @@
-- 增加入职电子签“作废后重新发起”能力。
-- 已执行 20260903_qiyuesuo_electronic_sign.sql 的数据库需要单独执行本文件。
SET NAMES utf8mb4;
ALTER TABLE `ob_electronic_sign_process`
ADD COLUMN `IsCurrent` TINYINT(1) NULL DEFAULT NULL
COMMENT '是否为任务当前电子签流程,历史流程为空'
AFTER `BizId`;
ALTER TABLE `ob_electronic_sign_process`
ADD COLUMN `ReissueReason` VARCHAR(500) NULL
COMMENT '重新发起原因'
AFTER `RetryCount`,
ADD COLUMN `ReissuedAt` DATETIME(3) NULL
COMMENT '被新流程替代时间'
AFTER `ReissueReason`,
ADD COLUMN `ReissuedByProcessId` BIGINT NULL
COMMENT '替代当前流程的新流程Id'
AFTER `ReissuedAt`;
-- 雪花 Id 与创建时间同序,每个任务只把最新一条流程标记为当前流程。
UPDATE `ob_electronic_sign_process` process
INNER JOIN (
SELECT `TaskId`, MAX(`Id`) AS `LatestProcessId`
FROM `ob_electronic_sign_process`
GROUP BY `TaskId`
) latest ON latest.`LatestProcessId` = process.`Id`
SET process.`IsCurrent` = 1;
ALTER TABLE `ob_electronic_sign_process`
ADD UNIQUE KEY `uk_ob_esign_process_current` (`TaskId`, `IsCurrent`);
@@ -0,0 +1,9 @@
-- 补充电子签署人实名快照。
-- 已执行 20260903_qiyuesuo_electronic_sign.sql 的数据库需要单独执行本文件。
SET NAMES utf8mb4;
ALTER TABLE `ob_electronic_sign_process`
ADD COLUMN `EmployeeIdCardNumber` VARCHAR(30) NULL
COMMENT '员工身份证号码快照'
AFTER `EmployeeMobile`;
@@ -0,0 +1,398 @@
-- ============================================================================
-- 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`;