Files
workspace/code/fms/sql/fms_workflow_runtime_mock.sql
T
2026-09-27 21:59:13 +08:00

742 lines
51 KiB
Transact-SQL
Raw 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.
/* ============================================================================
FMS 工作流运行态模拟数据 —— 费用报销审批(expense_approval v1)
用途:给「流程管理 → 运行监控」与「审批中心(我的待办 / 我发起的 / 我已处理 /
抄送我的)」造一批可直接查看、可继续操作的运行数据。
前置条件:
1. 已执行 sql/fms_workflow.sql(wf_* 建表)。
2. 已执行 sql/fms_workflow_mock.sql(流程定义 expense_approval + 已发布版本
expense_approval_v1)。本脚本以该版本为模板,不重复定义流程。
3. 已执行 sql/fms_workflow_org_ext.sql(岗位 / 组织角色等组织主数据表)。
本脚本写入:
- 演示组织数据:1 个部门 + 4 个演示用户 + 5 个岗位 + 4 个组织角色 + 授权
(演示用户密码与账号相同,仅供演示环境登录)
- 1 条停用的流程绑定(给运行数据一个真实出处,不拦截真实送审)
- 6 条流程实例及其节点运行 / 待办任务 / 动作流水 / 抄送记录
- 把 mock 脚本里的占位用户 U001 / U002 / U003 就地替换为演示用户
覆盖的场景(6 条实例):
模拟-费用报销-001 运行中 · 部门负责人审批(或签,两条待办)
模拟-费用报销-002 运行中 · 并行分支(法务串行会签第 2 签 + 风控按比例 2/3 + 抄送)
模拟-费用报销-003 运行中 · 总经理审批(金额 > 1 万分支)
模拟-费用报销-004 已通过 · 完整链路(会签 → 并行 → 董事长 N 人通过 → 归档 → 结束)
模拟-费用报销-005 已驳回 · 总经理终止(reject_mode = terminate)
模拟-费用报销-006 已退回 · 部门负责人退回发起人(return_initiator)
用 g3soft 登录后的预期结果:
我的待办 2 条(002 法务串行会签、003 总经理审批)
我发起的 2 条(001 运行中、006 已退回)
我已处理 2 条(004 董事长审批通过、005 总经理驳回)
抄送我的 2 条(002 未读、004 已读)
运行监控 6 条实例,其中 3 条运行中
可重复执行:先按业务单号前缀「模拟-」清理旧运行数据,再重建;
组织数据 / 绑定 / 规则补丁都按「不存在才写入」处理。
全部清理(含演示组织数据)见文件末尾注释。
说明:只写运行表与演示组织数据;不写 wf_outbox(避免触发通知派发),
不写任何业务表(运行监控与审批中心都不依赖业务表数据)。
============================================================================ */
SET NOCOUNT ON;
GO
/* ----------------------------------------------------------------------------
0. 前置检查与清理
---------------------------------------------------------------------------- */
if not exists (select 1 from dbo.wf_version where b_id = 'expense_approval_v1' and b_status = 'published')
begin
raiserror (N'缺少已发布版本 expense_approval_v1:请先执行 sql/fms_workflow_mock.sql', 16, 1);
return;
end
GO
if not exists (select 1 from dbo.wf_definition where b_id = 'expense_approval')
begin
raiserror (N'缺少流程定义 expense_approval:请先执行 sql/fms_workflow_mock.sql', 16, 1);
return;
end
GO
/* 清理本脚本上一次造出来的运行数据(业务单号前缀「模拟-」是识别标记) */
declare @old table (b_id uniqueidentifier primary key);
insert into @old (b_id)
select b_id from dbo.wf_instance where b_business_no like N'模拟-%';
delete from dbo.wf_action where b_instance_id in (select b_id from @old);
delete from dbo.wf_cc where b_instance_id in (select b_id from @old);
delete from dbo.wf_task where b_instance_id in (select b_id from @old);
delete from dbo.wf_node_run where b_instance_id in (select b_id from @old);
delete from dbo.wf_instance where b_id in (select b_id from @old);
GO
/* ----------------------------------------------------------------------------
1. 演示组织数据
演示用户的身兼数职只为把 mock 流程的审批人规则解析完整,不代表真实职务设计:
张伟 demo_zhangwei 演示事业部负责人(dept_manager)+ 财务经理 + 法务负责人
李强 demo_liqiang 分管副总(vice_president)
g3soft 总经理(gm)+ 指定审批人 U001
王芳 demo_wangfang 财务 + 财务总监(抄送对象)+ 法务专员
刘敏 demo_liumin 风控 + 风控经理 + 指定审批人 U003
---------------------------------------------------------------------------- */
/* 1.1 部门:演示事业部 */
declare @now datetime2 = sysutcdatetime();
if not exists (select 1 from dbo.b_dept where b_id = 'demo_dept')
begin
insert into dbo.b_dept (b_id, b_parent_id, b_depth, b_path, b_name, b_i18n, b_canuse, b_xh, b_bz, b_manager_id,
b_created_by, b_created_at, b_updated_by, b_updated_at)
values ('demo_dept', null, 0, '/demo_dept/', N'演示事业部', null, 1, 10, N'工作流模拟数据:演示用部门', null,
'g3soft', @now, 'g3soft', @now);
end
update dbo.b_dept
set b_manager_id = 'demo_zhangwei', b_updated_by = 'g3soft', b_updated_at = @now
where b_id = 'demo_dept'
and (b_manager_id is null or b_manager_id <> 'demo_zhangwei');
/* 1.2 演示用户(密码与账号相同) */
declare @users table (b_id varchar(50) primary key, b_name nvarchar(200) not null, b_bz nvarchar(800));
insert into @users (b_id, b_name, b_bz)
values ('demo_zhangwei', N'张伟', N'工作流模拟数据:演示事业部负责人 / 财务经理 / 法务负责人'),
('demo_liqiang', N'李强', N'工作流模拟数据:分管副总'),
('demo_wangfang', N'王芳', N'工作流模拟数据:财务 / 财务总监 / 法务专员'),
('demo_liumin', N'刘敏', N'工作流模拟数据:风控 / 风控经理');
insert into dbo.b_user (b_id, b_name, b_dept_id, b_bz, b_password, b_canuse, b_logincount,
b_created_by, b_created_at, b_updated_by, b_updated_at)
select u.b_id, u.b_name, 'demo_dept', u.b_bz, u.b_id, 1, 0, 'g3soft', @now, 'g3soft', @now
from @users u
where not exists (select 1 from dbo.b_user x where x.b_id = u.b_id);
GO
/* 1.3 岗位 */
declare @now datetime2 = sysutcdatetime();
declare @positions table (b_id varchar(50) primary key, b_name nvarchar(200) not null, b_xh int);
insert into @positions (b_id, b_name, b_xh)
values ('gm', N'总经理', 10),
('vice_president', N'分管副总', 20),
('finance_manager', N'财务经理', 30),
('legal_staff', N'法务专员', 40),
('risk_manager', N'风控经理', 50);
insert into dbo.b_position (b_id, b_name, b_canuse, b_xh, b_bz, b_created_by, b_created_at, b_updated_by, b_updated_at)
select p.b_id, p.b_name, 1, p.b_xh, N'工作流模拟数据', 'g3soft', @now, 'g3soft', @now
from @positions p
where not exists (select 1 from dbo.b_position x where x.b_id = p.b_id);
/* 1.4 组织角色 */
declare @roles table (b_id varchar(50) primary key, b_name nvarchar(200) not null, b_xh int);
insert into @roles (b_id, b_name, b_xh)
values ('finance', N'财务', 10),
('legal_lead', N'法务负责人', 20),
('cfo', N'财务总监', 30),
('risk', N'风控', 40);
insert into dbo.b_org_role (b_id, b_name, b_canuse, b_xh, b_bz, b_created_by, b_created_at, b_updated_by, b_updated_at)
select r.b_id, r.b_name, 1, r.b_xh, N'工作流模拟数据', 'g3soft', @now, 'g3soft', @now
from @roles r
where not exists (select 1 from dbo.b_org_role x where x.b_id = r.b_id);
/* 1.5 用户岗位 */
declare @userPositions table (b_user_id varchar(50), b_position_id varchar(50));
insert into @userPositions (b_user_id, b_position_id)
values ('demo_zhangwei', 'finance_manager'),
('demo_liqiang', 'vice_president'),
('g3soft', 'gm'),
('demo_wangfang', 'legal_staff'),
('demo_wangfang', 'risk_manager'),
('demo_liumin', 'risk_manager');
insert into dbo.b_user_position (b_user_id, b_position_id, b_canuse, b_created_by, b_created_at, b_updated_by, b_updated_at)
select up.b_user_id, up.b_position_id, 1, 'g3soft', @now, 'g3soft', @now
from @userPositions up
where not exists (select 1 from dbo.b_user_position x
where x.b_user_id = up.b_user_id and x.b_position_id = up.b_position_id);
/* 1.6 用户组织角色 */
declare @userRoles table (b_user_id varchar(50), b_role_id varchar(50));
insert into @userRoles (b_user_id, b_role_id)
values ('demo_zhangwei', 'legal_lead'),
('demo_wangfang', 'finance'),
('demo_wangfang', 'cfo'),
('demo_liumin', 'risk');
insert into dbo.b_user_org_role (b_user_id, b_role_id, b_canuse, b_created_by, b_created_at, b_updated_by, b_updated_at)
select ur.b_user_id, ur.b_role_id, 1, 'g3soft', @now, 'g3soft', @now
from @userRoles ur
where not exists (select 1 from dbo.b_user_org_role x
where x.b_user_id = ur.b_user_id and x.b_role_id = ur.b_role_id);
GO
/* 1.7 演示用户授权:审批中心菜单 + 审批动作(演示用户登录后要能处理待办) */
declare @now datetime2 = sysutcdatetime();
insert into dbo.s_user_power (b_user_id, b_power_id, b_canuse, b_created_by, b_created_at, b_updated_by, b_updated_at)
select u.b_id, p.b_id, 1, 'g3soft', @now, 'g3soft', @now
from (values ('demo_zhangwei'), ('demo_liqiang'), ('demo_wangfang'), ('demo_liumin')) as u(b_id)
cross join dbo.s_power p
where (p.b_id like 'menu.approval%' or p.b_id like 'action.v_b_othercompany.%')
and not exists (select 1 from dbo.s_user_power x where x.b_user_id = u.b_id and x.b_power_id = p.b_id);
GO
/* ----------------------------------------------------------------------------
2. 流程绑定与审批人规则补丁
---------------------------------------------------------------------------- */
/*
2.1 演示绑定:故意 b_canuse = 0(停用)。
绑定的作用是给运行数据一个真实出处;停用是为了不让「合作伙伴」模块的真实送审
命中这个演示流程(expense_approval 的条件引用 b_amount,合作伙伴表没有该字段,
真送审会走成「条件出线没有一条命中」)。要真实跑通送审,请另建启用绑定,
并把流程条件字段对准业务模块自己的列。
*/
if not exists (select 1 from dbo.wf_binding where b_id = 'demo_expense_binding')
begin
insert into dbo.wf_binding (b_id, b_module_id, b_event, b_version_id, b_match_json, b_org_scope_json,
b_status_field, b_status_map_json, b_priority, b_effective_from, b_effective_to,
b_canuse, b_bz, b_created_by, b_created_at, b_updated_by, b_updated_at)
values ('demo_expense_binding', 'v_b_othercompany', 'submit', 'expense_approval_v1', null, null,
null, null, 10, null, null,
0, N'工作流模拟数据:停用的演示绑定,仅为运行数据提供出处', 'g3soft', sysutcdatetime(), 'g3soft', sysutcdatetime());
end
/*
2.2 审批人规则补丁:fms_workflow_mock.sql 里的 U001 / U002 / U003 是占位用户,
库里并不存在,解析时会被剔除。这里替换为本脚本的演示用户,让后续流转解析得到人:
U001 → g3soft(总经理)
U002 → demo_zhangwei(张伟)
U003 → demo_liqiang(李强)
*/
update dbo.wf_actor_rule
set b_actor_ref = 'g3soft'
where b_version_id = 'expense_approval_v1' and b_actor_ref = 'U001' and b_actor_type = 'user';
update dbo.wf_actor_rule
set b_actor_ref = 'demo_zhangwei'
where b_version_id = 'expense_approval_v1' and b_actor_ref = 'U002' and b_actor_type = 'user';
update dbo.wf_actor_rule
set b_actor_ref = 'demo_liqiang'
where b_version_id = 'expense_approval_v1' and b_actor_ref = 'U003' and b_actor_type = 'user';
GO
/* ============================================================================
3. 实例 A:运行中 · 部门负责人审批(或签)
模拟-费用报销-001 发起人 g3soft 金额 3,200 两小时前送审
或签两名候选人(部门负责人张伟 / 分管副总李强)各有一条待办。
============================================================================ */
declare @now datetime2 = sysutcdatetime();
declare @inst uniqueidentifier = newid();
declare @runStart uniqueidentifier = newid();
declare @runDm uniqueidentifier = newid();
declare @t0 datetime2 = dateadd(hour, -2, @now);
declare @due datetime2 = dateadd(hour, 22, @now);
declare @snap nvarchar(max) = N'{"rules":[{"b_actor_type":"dept_manager","b_actor_ref":null,"b_priority":10},{"b_actor_type":"position","b_actor_ref":"vice_president","b_priority":20}],"resolvedUsers":["demo_zhangwei","demo_liqiang"],"notes":[]}';
insert into dbo.wf_instance (b_id, b_definition_id, b_version_id, b_binding_id, b_module_id, b_event,
b_business_id, b_business_no, b_org_id, b_initiator_id, b_initiator_dept_id, b_status,
b_context_json, b_snapshot_json, b_current_summary_json, b_row_version,
b_idempotency_key, b_started_at, b_completed_at,
b_created_by, b_created_at, b_updated_by, b_updated_at)
values (@inst, 'expense_approval', 'expense_approval_v1', 'demo_expense_binding', 'v_b_othercompany', 'submit',
'MOCK-EXP-001', N'模拟-费用报销-001', 'G3HD', 'g3soft', 'demo_dept', 'running',
N'{"b_amount":3200,"b_dept_id":"demo_dept","b_initiator_dept_id":"demo_dept"}',
N'{"b_business_no":"模拟-费用报销-001","b_amount":3200,"b_reason":"客户拜访差旅费","b_dept_id":"demo_dept"}',
N'{"summary":"待审批:部门负责人审批"}', 1,
null, @t0, null,
'g3soft', @t0, 'g3soft', @t0);
insert into dbo.wf_node_run (b_id, b_instance_id, b_node_key, b_run_no, b_status, b_required_count,
b_completed_count, b_rejected_count, b_entered_at, b_exited_at,
b_actor_snapshot_json, b_created_at)
values (@runStart, @inst, 'start', 1, 'completed', null, 0, 0, @t0, @t0, null, @t0),
(@runDm, @inst, 'dept_manager', 1, 'running', 1, 0, 0, @t0, null, @snap, @t0);
insert into dbo.wf_task (b_id, b_instance_id, b_node_run_id, b_node_key, b_actor_rule_id, b_assignee_type,
b_assignee_id, b_seq, b_status, b_due_at, b_claimed_by, b_claimed_at,
b_completed_by, b_completed_at, b_rule_snapshot_json, b_created_at, b_updated_at)
values (newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_zhangwei', 10, 'pending', @due, null, null, null, null, @snap, @t0, @t0),
(newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_liqiang', 20, 'pending', @due, null, null, null, null, @snap, @t0, @t0);
insert into dbo.wf_action (b_id, b_instance_id, b_node_run_id, b_task_id, b_action, b_operator_id,
b_from_status, b_to_status, b_comment, b_payload_json, b_request_id, b_trace_id,
b_occurdatetime)
values (newid(), @inst, null, null, 'submit', 'g3soft', null, 'running', N'提交审批', null, null, null, @t0);
GO
/* ============================================================================
4. 实例 B:运行中 · 并行分支
模拟-费用报销-002 发起人 刘敏 金额 30,000 30 小时前送审
已过:部门负责人(或签)→ 金额判断(> 1 万)→ 总经理审批 → 并行分支
进行中:法务串行会签(第 1 签已过,第 2 签 g3soft 待办,第 3 签未激活)、
风控按比例通过(3 人过 2 人,已过 1 票)、抄送财务总监已发出
============================================================================ */
declare @now datetime2 = sysutcdatetime();
declare @inst uniqueidentifier = newid();
declare @runStart uniqueidentifier = newid();
declare @runDm uniqueidentifier = newid();
declare @runGateway uniqueidentifier = newid();
declare @runGm uniqueidentifier = newid();
declare @runSplit uniqueidentifier = newid();
declare @runLegal uniqueidentifier = newid();
declare @runCc uniqueidentifier = newid();
declare @runRisk uniqueidentifier = newid();
declare @t0 datetime2 = dateadd(hour, -30, @now);
declare @t1 datetime2 = dateadd(minute, 30, @t0);
declare @t2 datetime2 = dateadd(hour, 4, @t1);
declare @t3 datetime2 = dateadd(hour, 1, @t2);
declare @snapDm nvarchar(max) = N'{"rules":[{"b_actor_type":"dept_manager","b_actor_ref":null,"b_priority":10},{"b_actor_type":"position","b_actor_ref":"vice_president","b_priority":20}],"resolvedUsers":["demo_zhangwei","demo_liqiang"],"notes":[]}';
declare @snapGm nvarchar(max) = N'{"rules":[{"b_actor_type":"position","b_actor_ref":"gm","b_priority":10}],"resolvedUsers":["g3soft"],"notes":[]}';
declare @snapLegal nvarchar(max) = N'{"rules":[{"b_actor_type":"org_role","b_actor_ref":"legal_lead","b_priority":10},{"b_actor_type":"user","b_actor_ref":"g3soft","b_priority":20},{"b_actor_type":"position","b_actor_ref":"legal_staff","b_priority":30}],"resolvedUsers":["demo_zhangwei","g3soft","demo_wangfang"],"notes":[]}';
declare @snapRisk nvarchar(max) = N'{"rules":[{"b_actor_type":"org_role","b_actor_ref":"risk","b_priority":10},{"b_actor_type":"position","b_actor_ref":"risk_manager","b_priority":20},{"b_actor_type":"user","b_actor_ref":"demo_zhangwei","b_priority":30}],"resolvedUsers":["demo_liumin","demo_wangfang","demo_zhangwei"],"notes":[]}';
declare @snapCc nvarchar(max) = N'{"rules":[{"b_actor_type":"org_role","b_actor_ref":"cfo","b_priority":10}],"resolvedUsers":["demo_wangfang","g3soft"],"notes":["演示数据额外抄送 g3soft,便于管理员账号直接看到抄送页"]}';
insert into dbo.wf_instance (b_id, b_definition_id, b_version_id, b_binding_id, b_module_id, b_event,
b_business_id, b_business_no, b_org_id, b_initiator_id, b_initiator_dept_id, b_status,
b_context_json, b_snapshot_json, b_current_summary_json, b_row_version,
b_idempotency_key, b_started_at, b_completed_at,
b_created_by, b_created_at, b_updated_by, b_updated_at)
values (@inst, 'expense_approval', 'expense_approval_v1', 'demo_expense_binding', 'v_b_othercompany', 'submit',
'MOCK-EXP-002', N'模拟-费用报销-002', 'G3HD', 'demo_liumin', 'demo_dept', 'running',
N'{"b_amount":30000,"b_dept_id":"demo_dept","b_initiator_dept_id":"demo_dept"}',
N'{"b_business_no":"模拟-费用报销-002","b_amount":30000,"b_reason":"季度团建费用","b_dept_id":"demo_dept"}',
N'{"summary":"审批中:风控按比例通过"}', 5,
null, @t0, null,
'demo_liumin', @t0, 'demo_liumin', @t3);
insert into dbo.wf_node_run (b_id, b_instance_id, b_node_key, b_run_no, b_status, b_required_count,
b_completed_count, b_rejected_count, b_entered_at, b_exited_at,
b_actor_snapshot_json, b_created_at)
values (@runStart, @inst, 'start', 1, 'completed', null, 0, 0, @t0, @t0, null, @t0),
(@runDm, @inst, 'dept_manager', 1, 'completed', 1, 1, 0, @t0, @t1, @snapDm, @t0),
(@runGateway,@inst, 'amount_gateway', 1, 'completed', null, 0, 0, @t1, @t1, null, @t1),
(@runGm, @inst, 'gm_approve', 1, 'completed', 1, 1, 0, @t1, @t2, @snapGm, @t1),
(@runSplit, @inst, 'parallel_split', 1, 'completed', null, 0, 0, @t2, @t2, null, @t2),
(@runLegal, @inst, 'legal_countersign', 1, 'running', 3, 1, 0, @t2, null, @snapLegal, @t2),
(@runCc, @inst, 'cc_cfo', 1, 'completed', 1, 0, 0, @t2, @t2, @snapCc, @t2),
(@runRisk, @inst, 'risk_review', 1, 'running', 2, 1, 0, @t2, null, @snapRisk, @t2);
insert into dbo.wf_task (b_id, b_instance_id, b_node_run_id, b_node_key, b_actor_rule_id, b_assignee_type,
b_assignee_id, b_seq, b_status, b_due_at, b_claimed_by, b_claimed_at,
b_completed_by, b_completed_at, b_rule_snapshot_json, b_created_at, b_updated_at)
values
-- 部门负责人(或签):张伟通过,李强被自动取消
(newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_zhangwei', 10, 'approved',
dateadd(hour, 24, @t0), null, null, 'demo_zhangwei', @t1, @snapDm, @t0, @t1),
(newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_liqiang', 20, 'cancelled',
dateadd(hour, 24, @t0), null, null, null, null, @snapDm, @t0, @t1),
-- 总经理(单人):g3soft 通过
(newid(), @inst, @runGm, 'gm_approve', null, 'user', 'g3soft', 10, 'approved',
dateadd(hour, 48, @t1), null, null, 'g3soft', @t2, @snapGm, @t1, @t2),
-- 法务串行会签:第 1 签张伟已过,第 2 签 g3soft 待办,第 3 签王芳未激活
(newid(), @inst, @runLegal, 'legal_countersign', null, 'user', 'demo_zhangwei', 10, 'approved',
dateadd(hour, 72, @t2), null, null, 'demo_zhangwei', @t2, @snapLegal, @t2, @t2),
(newid(), @inst, @runLegal, 'legal_countersign', null, 'user', 'g3soft', 20, 'pending',
dateadd(hour, 72, @t2), null, null, null, null, @snapLegal, @t2, @t2),
(newid(), @inst, @runLegal, 'legal_countersign', null, 'user', 'demo_wangfang', 30, 'waiting',
dateadd(hour, 72, @t2), null, null, null, null, @snapLegal, @t2, @t2),
-- 风控按比例通过(3 人需过 2 人):刘敏已过 1 票,王芳已抢占,张伟待办
(newid(), @inst, @runRisk, 'risk_review', null, 'user', 'demo_liumin', 10, 'approved',
dateadd(hour, 48, @t2), null, null, 'demo_liumin', @t3, @snapRisk, @t2, @t3),
(newid(), @inst, @runRisk, 'risk_review', null, 'user', 'demo_wangfang', 20, 'claimed',
dateadd(hour, 48, @t2), 'demo_wangfang', @t3, null, null, @snapRisk, @t2, @t3),
(newid(), @inst, @runRisk, 'risk_review', null, 'user', 'demo_zhangwei', 30, 'pending',
dateadd(hour, 48, @t2), null, null, null, null, @snapRisk, @t2, @t2);
insert into dbo.wf_cc (b_id, b_instance_id, b_node_run_id, b_node_key, b_recipient_id, b_actor_rule_id,
b_status, b_read_at, b_rule_snapshot_json, b_created_at)
values (newid(), @inst, @runCc, 'cc_cfo', 'demo_wangfang', null, 'unread', null, @snapCc, @t2),
(newid(), @inst, @runCc, 'cc_cfo', 'g3soft', null, 'unread', null, @snapCc, @t2);
insert into dbo.wf_action (b_id, b_instance_id, b_node_run_id, b_task_id, b_action, b_operator_id,
b_from_status, b_to_status, b_comment, b_payload_json, b_request_id, b_trace_id,
b_occurdatetime)
values (newid(), @inst, null, null, 'submit', 'demo_liumin', null, 'running', N'提交审批', null, null, null, @t0),
(newid(), @inst, @runDm, null, 'approve', 'demo_zhangwei', 'pending', 'approved', N'费用在季度预算内,同意', null, null, null, @t1),
(newid(), @inst, @runDm, null, 'cancel', null, 'pending', 'cancelled', N'同节点其余待办已自动取消(1 条)', null, null, null, dateadd(second, 1, @t1)),
(newid(), @inst, @runGm, null, 'approve', 'g3soft', 'pending', 'approved', N'金额属实,同意', null, null, null, @t2),
(newid(), @inst, @runCc, null, 'cc', null, 'running', 'running', N'抄送「抄送财务总监」共 2 人', null, null, null, dateadd(second, 1, @t2)),
(newid(), @inst, @runLegal, null, 'approve', 'demo_zhangwei', 'pending', 'approved', N'合同条款已确认', null, null, null, dateadd(second, 2, @t2)),
(newid(), @inst, @runRisk, null, 'approve', 'demo_liumin', 'pending', 'approved', N'风险可控,同意', null, null, null, @t3);
GO
/* ============================================================================
5. 实例 C:运行中 · 总经理审批
模拟-费用报销-003 发起人 王芳 金额 15,000 6 小时前送审
金额 > 1 万走总经理;部门负责人已通过,总经理(g3soft)有一条待办。
============================================================================ */
declare @now datetime2 = sysutcdatetime();
declare @inst uniqueidentifier = newid();
declare @runStart uniqueidentifier = newid();
declare @runDm uniqueidentifier = newid();
declare @runGateway uniqueidentifier = newid();
declare @runGm uniqueidentifier = newid();
declare @t0 datetime2 = dateadd(hour, -6, @now);
declare @t1 datetime2 = dateadd(hour, 1, @t0);
declare @snapDm nvarchar(max) = N'{"rules":[{"b_actor_type":"dept_manager","b_actor_ref":null,"b_priority":10},{"b_actor_type":"position","b_actor_ref":"vice_president","b_priority":20}],"resolvedUsers":["demo_zhangwei","demo_liqiang"],"notes":[]}';
declare @snapGm nvarchar(max) = N'{"rules":[{"b_actor_type":"position","b_actor_ref":"gm","b_priority":10}],"resolvedUsers":["g3soft"],"notes":[]}';
insert into dbo.wf_instance (b_id, b_definition_id, b_version_id, b_binding_id, b_module_id, b_event,
b_business_id, b_business_no, b_org_id, b_initiator_id, b_initiator_dept_id, b_status,
b_context_json, b_snapshot_json, b_current_summary_json, b_row_version,
b_idempotency_key, b_started_at, b_completed_at,
b_created_by, b_created_at, b_updated_by, b_updated_at)
values (@inst, 'expense_approval', 'expense_approval_v1', 'demo_expense_binding', 'v_b_othercompany', 'submit',
'MOCK-EXP-003', N'模拟-费用报销-003', 'G3HD', 'demo_wangfang', 'demo_dept', 'running',
N'{"b_amount":15000,"b_dept_id":"demo_dept","b_initiator_dept_id":"demo_dept"}',
N'{"b_business_no":"模拟-费用报销-003","b_amount":15000,"b_reason":"部门年度体检费用","b_dept_id":"demo_dept"}',
N'{"summary":"待审批:总经理审批"}', 2,
null, @t0, null,
'demo_wangfang', @t0, 'demo_wangfang', dateadd(second, 1, @t1));
insert into dbo.wf_node_run (b_id, b_instance_id, b_node_key, b_run_no, b_status, b_required_count,
b_completed_count, b_rejected_count, b_entered_at, b_exited_at,
b_actor_snapshot_json, b_created_at)
values (@runStart, @inst, 'start', 1, 'completed', null, 0, 0, @t0, @t0, null, @t0),
(@runDm, @inst, 'dept_manager', 1, 'completed', 1, 1, 0, @t0, @t1, @snapDm, @t0),
(@runGateway,@inst, 'amount_gateway', 1, 'completed', null, 0, 0, @t1, @t1, null, @t1),
(@runGm, @inst, 'gm_approve', 1, 'running', 1, 0, 0, @t1, null, @snapGm, @t1);
insert into dbo.wf_task (b_id, b_instance_id, b_node_run_id, b_node_key, b_actor_rule_id, b_assignee_type,
b_assignee_id, b_seq, b_status, b_due_at, b_claimed_by, b_claimed_at,
b_completed_by, b_completed_at, b_rule_snapshot_json, b_created_at, b_updated_at)
values (newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_zhangwei', 10, 'approved',
dateadd(hour, 24, @t0), null, null, 'demo_zhangwei', @t1, @snapDm, @t0, @t1),
(newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_liqiang', 20, 'cancelled',
dateadd(hour, 24, @t0), null, null, null, null, @snapDm, @t0, @t1),
(newid(), @inst, @runGm, 'gm_approve', null, 'user', 'g3soft', 10, 'pending',
dateadd(hour, 48, @t1), null, null, null, null, @snapGm, @t1, @t1);
insert into dbo.wf_action (b_id, b_instance_id, b_node_run_id, b_task_id, b_action, b_operator_id,
b_from_status, b_to_status, b_comment, b_payload_json, b_request_id, b_trace_id,
b_occurdatetime)
values (newid(), @inst, null, null, 'submit', 'demo_wangfang', null, 'running', N'提交审批', null, null, null, @t0),
(newid(), @inst, @runDm, null, 'approve', 'demo_zhangwei', 'pending', 'approved', N'同意', null, null, null, @t1),
(newid(), @inst, @runDm, null, 'cancel', null, 'pending', 'cancelled', N'同节点其余待办已自动取消(1 条)', null, null, null, dateadd(second, 1, @t1));
GO
/* ============================================================================
6. 实例 D:已通过 · 完整链路
模拟-费用报销-004 发起人 刘敏 金额 60,000 六天前送审、五天前通过
完整走了:部门负责人(或签)→ 金额判断(> 1 万)→ 总经理 →
并行(法务串行会签 3 人 / 抄送财务总监 / 风控按比例 3 人过 2 人)→ 并行汇合 →
是否超阈值(>= 5 万)→ 董事长 N 人通过(3 人过 2 人)→ 结束
============================================================================ */
declare @now datetime2 = sysutcdatetime();
declare @inst uniqueidentifier = newid();
declare @runStart uniqueidentifier = newid();
declare @runDm uniqueidentifier = newid();
declare @runGateway uniqueidentifier = newid();
declare @runGm uniqueidentifier = newid();
declare @runSplit uniqueidentifier = newid();
declare @runLegal uniqueidentifier = newid();
declare @runCc uniqueidentifier = newid();
declare @runRisk uniqueidentifier = newid();
declare @runJoin uniqueidentifier = newid();
declare @runBigGateway uniqueidentifier = newid();
declare @runChairman uniqueidentifier = newid();
declare @runEnd uniqueidentifier = newid();
declare @t0 datetime2 = dateadd(day, -6, @now);
declare @t1 datetime2 = dateadd(hour, 2, @t0);
declare @t2 datetime2 = dateadd(hour, 14, @t1);
declare @t3 datetime2 = dateadd(hour, 1, @t2);
declare @t4 datetime2 = dateadd(hour, 1, @t3);
declare @t5 datetime2 = dateadd(hour, 1, @t4);
declare @t6 datetime2 = dateadd(hour, 1, @t5);
declare @t7 datetime2 = dateadd(hour, 2, @t6);
declare @t8 datetime2 = dateadd(hour, 1, @t7);
declare @t9 datetime2 = dateadd(hour, 3, @t8);
declare @snapDm nvarchar(max) = N'{"rules":[{"b_actor_type":"dept_manager","b_actor_ref":null,"b_priority":10},{"b_actor_type":"position","b_actor_ref":"vice_president","b_priority":20}],"resolvedUsers":["demo_zhangwei","demo_liqiang"],"notes":[]}';
declare @snapGm nvarchar(max) = N'{"rules":[{"b_actor_type":"position","b_actor_ref":"gm","b_priority":10}],"resolvedUsers":["g3soft"],"notes":[]}';
declare @snapLegal nvarchar(max) = N'{"rules":[{"b_actor_type":"org_role","b_actor_ref":"legal_lead","b_priority":10},{"b_actor_type":"user","b_actor_ref":"g3soft","b_priority":20},{"b_actor_type":"position","b_actor_ref":"legal_staff","b_priority":30}],"resolvedUsers":["demo_zhangwei","g3soft","demo_wangfang"],"notes":[]}';
declare @snapRisk nvarchar(max) = N'{"rules":[{"b_actor_type":"org_role","b_actor_ref":"risk","b_priority":10},{"b_actor_type":"position","b_actor_ref":"risk_manager","b_priority":20},{"b_actor_type":"user","b_actor_ref":"demo_zhangwei","b_priority":30}],"resolvedUsers":["demo_liumin","demo_wangfang","demo_zhangwei"],"notes":[]}';
declare @snapCc nvarchar(max) = N'{"rules":[{"b_actor_type":"org_role","b_actor_ref":"cfo","b_priority":10}],"resolvedUsers":["demo_wangfang","g3soft"],"notes":["演示数据额外抄送 g3soft,便于管理员账号直接看到抄送页"]}';
declare @snapChairman nvarchar(max) = N'{"rules":[{"b_actor_type":"user","b_actor_ref":"g3soft","b_priority":10},{"b_actor_type":"user","b_actor_ref":"demo_zhangwei","b_priority":20},{"b_actor_type":"user","b_actor_ref":"demo_liqiang","b_priority":30}],"resolvedUsers":["g3soft","demo_zhangwei","demo_liqiang"],"notes":[]}';
insert into dbo.wf_instance (b_id, b_definition_id, b_version_id, b_binding_id, b_module_id, b_event,
b_business_id, b_business_no, b_org_id, b_initiator_id, b_initiator_dept_id, b_status,
b_context_json, b_snapshot_json, b_current_summary_json, b_row_version,
b_idempotency_key, b_started_at, b_completed_at,
b_created_by, b_created_at, b_updated_by, b_updated_at)
values (@inst, 'expense_approval', 'expense_approval_v1', 'demo_expense_binding', 'v_b_othercompany', 'submit',
'MOCK-EXP-004', N'模拟-费用报销-004', 'G3HD', 'demo_liumin', 'demo_dept', 'approved',
N'{"b_amount":60000,"b_dept_id":"demo_dept","b_initiator_dept_id":"demo_dept"}',
N'{"b_business_no":"模拟-费用报销-004","b_amount":60000,"b_reason":"办公设备采购","b_dept_id":"demo_dept"}',
N'{"summary":"已通过","node":"结束"}', 14,
null, @t0, dateadd(second, 2, @t9),
'demo_liumin', @t0, 'demo_liumin', dateadd(second, 2, @t9));
insert into dbo.wf_node_run (b_id, b_instance_id, b_node_key, b_run_no, b_status, b_required_count,
b_completed_count, b_rejected_count, b_entered_at, b_exited_at,
b_actor_snapshot_json, b_created_at)
values (@runStart, @inst, 'start', 1, 'completed', null, 0, 0, @t0, @t0, null, @t0),
(@runDm, @inst, 'dept_manager', 1, 'completed', 1, 1, 0, @t0, @t1, @snapDm, @t0),
(@runGateway, @inst, 'amount_gateway', 1, 'completed', null, 0, 0, @t1, @t1, null, @t1),
(@runGm, @inst, 'gm_approve', 1, 'completed', 1, 1, 0, @t1, @t2, @snapGm, @t1),
(@runSplit, @inst, 'parallel_split', 1, 'completed', null, 0, 0, @t2, @t2, null, @t2),
(@runLegal, @inst, 'legal_countersign', 1, 'completed', 3, 3, 0, @t2, @t5, @snapLegal, @t2),
(@runCc, @inst, 'cc_cfo', 1, 'completed', 2, 0, 0, @t2, @t2, @snapCc, @t2),
(@runRisk, @inst, 'risk_review', 1, 'completed', 2, 2, 0, @t2, @t7, @snapRisk, @t2),
(@runJoin, @inst, 'parallel_join', 1, 'completed', null, 0, 0, @t7, @t7, null, @t7),
(@runBigGateway,@inst,'big_amount_gateway',1, 'completed', null, 0, 0, @t7, @t7, null, @t7),
(@runChairman, @inst, 'chairman_approve', 1, 'completed', 2, 2, 0, @t7, @t9, @snapChairman, @t7),
(@runEnd, @inst, 'end', 1, 'completed', null, 0, 0, @t9, @t9, null, @t9);
insert into dbo.wf_task (b_id, b_instance_id, b_node_run_id, b_node_key, b_actor_rule_id, b_assignee_type,
b_assignee_id, b_seq, b_status, b_due_at, b_claimed_by, b_claimed_at,
b_completed_by, b_completed_at, b_rule_snapshot_json, b_created_at, b_updated_at)
values
-- 部门负责人(或签)
(newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_zhangwei', 10, 'approved',
dateadd(hour, 24, @t0), null, null, 'demo_zhangwei', @t1, @snapDm, @t0, @t1),
(newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_liqiang', 20, 'cancelled',
dateadd(hour, 24, @t0), null, null, null, null, @snapDm, @t0, @t1),
-- 总经理(单人)
(newid(), @inst, @runGm, 'gm_approve', null, 'user', 'g3soft', 10, 'approved',
dateadd(hour, 48, @t1), null, null, 'g3soft', @t2, @snapGm, @t1, @t2),
-- 法务串行会签(3 人全部通过)
(newid(), @inst, @runLegal, 'legal_countersign', null, 'user', 'demo_zhangwei', 10, 'approved',
dateadd(hour, 72, @t2), null, null, 'demo_zhangwei', @t3, @snapLegal, @t2, @t3),
(newid(), @inst, @runLegal, 'legal_countersign', null, 'user', 'g3soft', 20, 'approved',
dateadd(hour, 72, @t2), null, null, 'g3soft', @t4, @snapLegal, @t2, @t4),
(newid(), @inst, @runLegal, 'legal_countersign', null, 'user', 'demo_wangfang', 30, 'approved',
dateadd(hour, 72, @t2), null, null, 'demo_wangfang', @t5, @snapLegal, @t2, @t5),
-- 风控按比例通过(3 人过 2 人:刘敏、王芳通过,张伟被自动取消)
(newid(), @inst, @runRisk, 'risk_review', null, 'user', 'demo_liumin', 10, 'approved',
dateadd(hour, 48, @t2), null, null, 'demo_liumin', @t6, @snapRisk, @t2, @t6),
(newid(), @inst, @runRisk, 'risk_review', null, 'user', 'demo_wangfang', 20, 'approved',
dateadd(hour, 48, @t2), null, null, 'demo_wangfang', @t7, @snapRisk, @t2, @t7),
(newid(), @inst, @runRisk, 'risk_review', null, 'user', 'demo_zhangwei', 30, 'cancelled',
dateadd(hour, 48, @t2), null, null, null, null, @snapRisk, @t2, @t7),
-- 董事长审批(N 人通过,3 人过 2 人:g3soft、张伟通过,李强被自动取消)
(newid(), @inst, @runChairman, 'chairman_approve', null, 'user', 'g3soft', 10, 'approved',
dateadd(hour, 72, @t7), null, null, 'g3soft', @t8, @snapChairman, @t7, @t8),
(newid(), @inst, @runChairman, 'chairman_approve', null, 'user', 'demo_zhangwei', 20, 'approved',
dateadd(hour, 72, @t7), null, null, 'demo_zhangwei', @t9, @snapChairman, @t7, @t9),
(newid(), @inst, @runChairman, 'chairman_approve', null, 'user', 'demo_liqiang', 30, 'cancelled',
dateadd(hour, 72, @t7), null, null, null, null, @snapChairman, @t7, @t9);
insert into dbo.wf_cc (b_id, b_instance_id, b_node_run_id, b_node_key, b_recipient_id, b_actor_rule_id,
b_status, b_read_at, b_rule_snapshot_json, b_created_at)
values (newid(), @inst, @runCc, 'cc_cfo', 'demo_wangfang', null, 'read', @t9, @snapCc, @t2),
(newid(), @inst, @runCc, 'cc_cfo', 'g3soft', null, 'read', @t9, @snapCc, @t2);
insert into dbo.wf_action (b_id, b_instance_id, b_node_run_id, b_task_id, b_action, b_operator_id,
b_from_status, b_to_status, b_comment, b_payload_json, b_request_id, b_trace_id,
b_occurdatetime)
values (newid(), @inst, null, null, 'submit', 'demo_liumin', null, 'running', N'提交审批', null, null, null, @t0),
(newid(), @inst, @runDm, null, 'approve', 'demo_zhangwei', 'pending', 'approved', N'采购必要性确认,同意', null, null, null, @t1),
(newid(), @inst, @runDm, null, 'cancel', null, 'pending', 'cancelled', N'同节点其余待办已自动取消(1 条)', null, null, null, dateadd(second, 1, @t1)),
(newid(), @inst, @runGm, null, 'approve', 'g3soft', 'pending', 'approved', N'预算内,同意', null, null, null, @t2),
(newid(), @inst, @runCc, null, 'cc', null, 'running', 'running', N'抄送「抄送财务总监」共 2 人', null, null, null, dateadd(second, 1, @t2)),
(newid(), @inst, @runLegal, null, 'approve', 'demo_zhangwei', 'pending', 'approved', N'法务条款已审核', null, null, null, @t3),
(newid(), @inst, @runLegal, null, 'approve', 'g3soft', 'pending', 'approved', N'用印流程已确认', null, null, null, @t4),
(newid(), @inst, @runLegal, null, 'approve', 'demo_wangfang', 'pending', 'approved', N'法务复核完成', null, null, null, @t5),
(newid(), @inst, @runRisk, null, 'approve', 'demo_liumin', 'pending', 'approved', N'风险可控', null, null, null, @t6),
(newid(), @inst, @runRisk, null, 'approve', 'demo_wangfang', 'pending', 'approved', N'同意采购', null, null, null, @t7),
(newid(), @inst, @runRisk, null, 'cancel', null, 'pending', 'cancelled', N'同节点其余待办已自动取消(1 条)', null, null, null, dateadd(second, 1, @t7)),
(newid(), @inst, @runChairman, null, 'approve', 'g3soft', 'pending', 'approved', N'同意', null, null, null, @t8),
(newid(), @inst, @runChairman, null, 'approve', 'demo_zhangwei', 'pending', 'approved', N'同意', null, null, null, @t9),
(newid(), @inst, @runChairman, null, 'cancel', null, 'pending', 'cancelled', N'同节点其余待办已自动取消(1 条)', null, null, null, dateadd(second, 1, @t9)),
(newid(), @inst, null, null, 'approve', null, 'running', 'approved', N'已通过', null, null, null, dateadd(second, 2, @t9));
GO
/* ============================================================================
7. 实例 E:已驳回 · 总经理终止
模拟-费用报销-005 发起人 王芳 金额 45,000 四天前送审,当天被驳回
部门负责人已通过,总经理(g3soft)驳回;reject_mode = terminate,实例直接结束。
============================================================================ */
declare @now datetime2 = sysutcdatetime();
declare @inst uniqueidentifier = newid();
declare @runStart uniqueidentifier = newid();
declare @runDm uniqueidentifier = newid();
declare @runGateway uniqueidentifier = newid();
declare @runGm uniqueidentifier = newid();
declare @t0 datetime2 = dateadd(day, -4, @now);
declare @t1 datetime2 = dateadd(hour, 2, @t0);
declare @t2 datetime2 = dateadd(hour, 2, @t1);
declare @snapDm nvarchar(max) = N'{"rules":[{"b_actor_type":"dept_manager","b_actor_ref":null,"b_priority":10},{"b_actor_type":"position","b_actor_ref":"vice_president","b_priority":20}],"resolvedUsers":["demo_zhangwei","demo_liqiang"],"notes":[]}';
declare @snapGm nvarchar(max) = N'{"rules":[{"b_actor_type":"position","b_actor_ref":"gm","b_priority":10}],"resolvedUsers":["g3soft"],"notes":[]}';
insert into dbo.wf_instance (b_id, b_definition_id, b_version_id, b_binding_id, b_module_id, b_event,
b_business_id, b_business_no, b_org_id, b_initiator_id, b_initiator_dept_id, b_status,
b_context_json, b_snapshot_json, b_current_summary_json, b_row_version,
b_idempotency_key, b_started_at, b_completed_at,
b_created_by, b_created_at, b_updated_by, b_updated_at)
values (@inst, 'expense_approval', 'expense_approval_v1', 'demo_expense_binding', 'v_b_othercompany', 'submit',
'MOCK-EXP-005', N'模拟-费用报销-005', 'G3HD', 'demo_wangfang', 'demo_dept', 'rejected',
N'{"b_amount":45000,"b_dept_id":"demo_dept","b_initiator_dept_id":"demo_dept"}',
N'{"b_business_no":"模拟-费用报销-005","b_amount":45000,"b_reason":"市场推广物料制作费","b_dept_id":"demo_dept"}',
N'{"summary":"已驳回","node":"总经理审批"}', 3,
null, @t0, dateadd(second, 1, @t2),
'demo_wangfang', @t0, 'demo_wangfang', dateadd(second, 1, @t2));
insert into dbo.wf_node_run (b_id, b_instance_id, b_node_key, b_run_no, b_status, b_required_count,
b_completed_count, b_rejected_count, b_entered_at, b_exited_at,
b_actor_snapshot_json, b_created_at)
values (@runStart, @inst, 'start', 1, 'completed', null, 0, 0, @t0, @t0, null, @t0),
(@runDm, @inst, 'dept_manager', 1, 'completed', 1, 1, 0, @t0, @t1, @snapDm, @t0),
(@runGateway,@inst, 'amount_gateway', 1, 'completed', null, 0, 0, @t1, @t1, null, @t1),
(@runGm, @inst, 'gm_approve', 1, 'completed', 1, 0, 1, @t1, @t2, @snapGm, @t1);
insert into dbo.wf_task (b_id, b_instance_id, b_node_run_id, b_node_key, b_actor_rule_id, b_assignee_type,
b_assignee_id, b_seq, b_status, b_due_at, b_claimed_by, b_claimed_at,
b_completed_by, b_completed_at, b_rule_snapshot_json, b_created_at, b_updated_at)
values (newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_zhangwei', 10, 'approved',
dateadd(hour, 24, @t0), null, null, 'demo_zhangwei', @t1, @snapDm, @t0, @t1),
(newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_liqiang', 20, 'cancelled',
dateadd(hour, 24, @t0), null, null, null, null, @snapDm, @t0, @t1),
(newid(), @inst, @runGm, 'gm_approve', null, 'user', 'g3soft', 10, 'rejected',
dateadd(hour, 48, @t1), null, null, 'g3soft', @t2, @snapGm, @t1, @t2);
insert into dbo.wf_action (b_id, b_instance_id, b_node_run_id, b_task_id, b_action, b_operator_id,
b_from_status, b_to_status, b_comment, b_payload_json, b_request_id, b_trace_id,
b_occurdatetime)
values (newid(), @inst, null, null, 'submit', 'demo_wangfang', null, 'running', N'提交审批', null, null, null, @t0),
(newid(), @inst, @runDm, null, 'approve', 'demo_zhangwei', 'pending', 'approved', N'同意', null, null, null, @t1),
(newid(), @inst, @runDm, null, 'cancel', null, 'pending', 'cancelled', N'同节点其余待办已自动取消(1 条)', null, null, null, dateadd(second, 1, @t1)),
(newid(), @inst, @runGm, null, 'reject', 'g3soft', 'pending', 'rejected', N'费用超出季度预算,请拆分后重新提交', N'{"rejectMode":"terminate"}', null, null, @t2),
(newid(), @inst, null, null, 'reject', null, 'running', 'rejected', N'已驳回', null, null, null, dateadd(second, 1, @t2));
GO
/* ============================================================================
8. 实例 F:已退回 · 部门负责人退回发起人
模拟-费用报销-006 发起人 g3soft 金额 2,800 三天前送审,一小时后退回
部门负责人(张伟)执行退回(return_initiator),实例直接结束。
节点运行的 b_rejected_count = 1 与真实实现一致(退回同样计入驳回计数)。
============================================================================ */
declare @now datetime2 = sysutcdatetime();
declare @inst uniqueidentifier = newid();
declare @runStart uniqueidentifier = newid();
declare @runDm uniqueidentifier = newid();
declare @t0 datetime2 = dateadd(day, -3, @now);
declare @t1 datetime2 = dateadd(hour, 1, @t0);
declare @snapDm nvarchar(max) = N'{"rules":[{"b_actor_type":"dept_manager","b_actor_ref":null,"b_priority":10},{"b_actor_type":"position","b_actor_ref":"vice_president","b_priority":20}],"resolvedUsers":["demo_zhangwei","demo_liqiang"],"notes":[]}';
insert into dbo.wf_instance (b_id, b_definition_id, b_version_id, b_binding_id, b_module_id, b_event,
b_business_id, b_business_no, b_org_id, b_initiator_id, b_initiator_dept_id, b_status,
b_context_json, b_snapshot_json, b_current_summary_json, b_row_version,
b_idempotency_key, b_started_at, b_completed_at,
b_created_by, b_created_at, b_updated_by, b_updated_at)
values (@inst, 'expense_approval', 'expense_approval_v1', 'demo_expense_binding', 'v_b_othercompany', 'submit',
'MOCK-EXP-006', N'模拟-费用报销-006', 'G3HD', 'g3soft', 'demo_dept', 'returned',
N'{"b_amount":2800,"b_dept_id":"demo_dept","b_initiator_dept_id":"demo_dept"}',
N'{"b_business_no":"模拟-费用报销-006","b_amount":2800,"b_reason":"市内交通费","b_dept_id":"demo_dept"}',
N'{"summary":"已退回","node":"部门负责人审批"}', 2,
null, @t0, dateadd(second, 2, @t1),
'g3soft', @t0, 'g3soft', dateadd(second, 2, @t1));
insert into dbo.wf_node_run (b_id, b_instance_id, b_node_key, b_run_no, b_status, b_required_count,
b_completed_count, b_rejected_count, b_entered_at, b_exited_at,
b_actor_snapshot_json, b_created_at)
values (@runStart, @inst, 'start', 1, 'completed', null, 0, 0, @t0, @t0, null, @t0),
(@runDm, @inst, 'dept_manager', 1, 'completed', 1, 0, 1, @t0, @t1, @snapDm, @t0);
insert into dbo.wf_task (b_id, b_instance_id, b_node_run_id, b_node_key, b_actor_rule_id, b_assignee_type,
b_assignee_id, b_seq, b_status, b_due_at, b_claimed_by, b_claimed_at,
b_completed_by, b_completed_at, b_rule_snapshot_json, b_created_at, b_updated_at)
values (newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_zhangwei', 10, 'cancelled',
dateadd(hour, 24, @t0), null, null, 'demo_zhangwei', @t1, @snapDm, @t0, @t1),
(newid(), @inst, @runDm, 'dept_manager', null, 'user', 'demo_liqiang', 20, 'cancelled',
dateadd(hour, 24, @t0), null, null, null, null, @snapDm, @t0, @t1);
insert into dbo.wf_action (b_id, b_instance_id, b_node_run_id, b_task_id, b_action, b_operator_id,
b_from_status, b_to_status, b_comment, b_payload_json, b_request_id, b_trace_id,
b_occurdatetime)
values (newid(), @inst, null, null, 'submit', 'g3soft', null, 'running', N'提交审批', null, null, null, @t0),
(newid(), @inst, @runDm, null, 'return', 'demo_zhangwei', 'pending', 'returned', N'发票信息不全,请补充后重新提交', null, null, null, @t1),
(newid(), @inst, @runDm, null, 'cancel', null, 'pending', 'cancelled', N'同节点其余待办已自动取消(1 条)', null, null, null, dateadd(second, 1, @t1)),
(newid(), @inst, null, null, 'reject', null, 'running', 'returned', N'已退回', null, null, null, dateadd(second, 2, @t1));
GO
/* ============================================================================
9. 自检
============================================================================ */
select N'实例' as 项, count(1) as 行数 from dbo.wf_instance where b_business_no like N'模拟-%'
union all
select N' 运行中', count(1) from dbo.wf_instance where b_business_no like N'模拟-%' and b_status = 'running'
union all
select N'节点运行', count(1) from dbo.wf_node_run
where b_instance_id in (select b_id from dbo.wf_instance where b_business_no like N'模拟-%')
union all
select N'任务', count(1) from dbo.wf_task
where b_instance_id in (select b_id from dbo.wf_instance where b_business_no like N'模拟-%')
union all
select N' 待办(g3soft)', count(1) from dbo.wf_task
where b_assignee_id = 'g3soft' and b_status in ('pending', 'claimed')
and b_instance_id in (select b_id from dbo.wf_instance where b_business_no like N'模拟-%')
union all
select N'动作流水', count(1) from dbo.wf_action
where b_instance_id in (select b_id from dbo.wf_instance where b_business_no like N'模拟-%')
union all
select N'抄送', count(1) from dbo.wf_cc
where b_instance_id in (select b_id from dbo.wf_instance where b_business_no like N'模拟-%')
union all
select N'演示用户', count(1) from dbo.b_user where b_id like 'demo\_%' escape '\'
union all
select N'演示部门', count(1) from dbo.b_dept where b_id = 'demo_dept'
union all
select N'演示绑定(停用)', count(1) from dbo.wf_binding where b_id = 'demo_expense_binding' and b_canuse = 0;
GO
/* ============================================================================
10. 清理(需要时手动执行)
删除本脚本造出的运行数据(按业务单号前缀识别):
declare @old table (b_id uniqueidentifier primary key);
insert into @old (b_id) select b_id from dbo.wf_instance where b_business_no like N'模拟-%';
delete from dbo.wf_action where b_instance_id in (select b_id from @old);
delete from dbo.wf_cc where b_instance_id in (select b_id from @old);
delete from dbo.wf_task where b_instance_id in (select b_id from @old);
delete from dbo.wf_node_run where b_instance_id in (select b_id from @old);
delete from dbo.wf_instance where b_id in (select b_id from @old);
删除演示组织数据(确认这些用户 / 岗位 / 角色没有别的用途后再执行):
delete from dbo.s_user_power where b_user_id like 'demo\_%' escape '\';
delete from dbo.b_user_position where b_user_id like 'demo\_%' escape '\';
delete from dbo.b_user_org_role where b_user_id like 'demo\_%' escape '\';
delete from dbo.b_user where b_id like 'demo\_%' escape '\';
delete from dbo.b_dept where b_id = 'demo_dept';
delete from dbo.b_user_position where b_position_id in ('gm', 'vice_president', 'finance_manager', 'legal_staff', 'risk_manager');
delete from dbo.b_user_org_role where b_role_id in ('finance', 'legal_lead', 'cfo', 'risk');
delete from dbo.b_position where b_id in ('gm', 'vice_president', 'finance_manager', 'legal_staff', 'risk_manager');
delete from dbo.b_org_role where b_id in ('finance', 'legal_lead', 'cfo', 'risk');
delete from dbo.wf_binding where b_id = 'demo_expense_binding';
删除演示绑定与规则补丁(把 U001 / U002 / U003 还原为 mock 脚本的占位值):
update dbo.wf_actor_rule set b_actor_ref = 'U001' where b_version_id = 'expense_approval_v1' and b_actor_ref = 'g3soft' and b_actor_type = 'user';
update dbo.wf_actor_rule set b_actor_ref = 'U002' where b_version_id = 'expense_approval_v1' and b_actor_ref = 'demo_zhangwei' and b_actor_type = 'user';
update dbo.wf_actor_rule set b_actor_ref = 'U003' where b_version_id = 'expense_approval_v1' and b_actor_ref = 'demo_liqiang' and b_actor_type = 'user';
注:g3soft 岗位(b_user_position 的 gm 行)在清理演示用户时会一并删除;
如需保留请自行调整上面语句。
============================================================================ */