20260923165454
This commit is contained in:
1 parent
0abe3706c8
commit
e6935b8fa4
173 files changed
+14975
-2295
No files matched your search
@@ -0,0 +1,273 @@
|
||||
/* ============================================================================
|
||||
FMS 工作流模拟数据 —— 费用报销审批(expense_approval)
|
||||
|
||||
用途:给流程设计器 / 流程管理页造一份「够复杂」的样本,用来测试编辑体验。
|
||||
不是业务模板,也不代表任何一家公司的真实审批制度。
|
||||
|
||||
刻意覆盖到的能力(对照《FMS工作流与审批设计》):
|
||||
- 7 种节点类型全用到:start / user_task / cc_task / exclusive_gateway
|
||||
/ parallel_gateway / service_task / end(§4.4)
|
||||
- 6 种审批方式全用到:single / any / all / serial / n_of_m / percentage(§6.4)
|
||||
- 条件分支 + 默认出口(§6.5)、并行分支与汇合、抄送节点(§9.9)
|
||||
- 8 种审批人解析类型中的 5 种:dept_manager / position / org_role / user(§6.6)
|
||||
- 节点扩展配置:requiredCount(n_of_m)、requiredRatio(percentage)、
|
||||
formPolicy(只读/必填字段)、dueHours、allowClaim、commentRequired
|
||||
|
||||
前置条件:wf_* 表已由 fms_workflow.sql 建好。
|
||||
使用说明:
|
||||
1. 执行前先切换到目标数据库(USE FMS)。
|
||||
2. 本脚本可重复执行:先按流程编码清理本流程的版本/节点/连线/规则,再重建。
|
||||
3. 只写 wf_definition / wf_version / wf_node / wf_edge / wf_actor_rule;
|
||||
不写 wf_binding(绑哪个模块是实施决定),也不写任何运行表。
|
||||
|
||||
流程走向:
|
||||
开始 → 部门负责人审批(或签) → 金额判断
|
||||
├─ 金额 > 10000 → 总经理审批(单人) ┐
|
||||
└─ 默认出口 ─────────────────────┴→ 财务复核(会签) → 并行分支
|
||||
├→ 法务串行会签(串行)
|
||||
├→ 抄送财务总监(抄送,自动完成)
|
||||
└→ 风控按比例通过(比例 0.6)
|
||||
↓ 并行汇合
|
||||
是否超阈值 → 董事长审批(N 人通过,2 人)
|
||||
├─ 金额 >= 50000 ┘
|
||||
└─ 默认出口 → 归档 → 结束
|
||||
============================================================================ */
|
||||
|
||||
SET NOCOUNT ON;
|
||||
|
||||
declare @def varchar(50) = 'expense_approval';
|
||||
declare @ver varchar(50) = 'expense_approval_v1';
|
||||
declare @by varchar(50) = 'g3soft';
|
||||
declare @now datetime2 = sysdatetime();
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
1. 清理(脚本可重复执行):只动本流程自己的行
|
||||
---------------------------------------------------------------------------- */
|
||||
|
||||
delete from dbo.wf_actor_rule
|
||||
where b_version_id in (select b_id from dbo.wf_version where b_definition_id = @def);
|
||||
|
||||
delete from dbo.wf_edge
|
||||
where b_version_id in (select b_id from dbo.wf_version where b_definition_id = @def);
|
||||
|
||||
delete from dbo.wf_node
|
||||
where b_version_id in (select b_id from dbo.wf_version where b_definition_id = @def);
|
||||
|
||||
delete from dbo.wf_binding
|
||||
where b_version_id in (select b_id from dbo.wf_version where b_definition_id = @def);
|
||||
|
||||
delete from dbo.wf_version where b_definition_id = @def;
|
||||
delete from dbo.wf_definition where b_id = @def;
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
2. 流程定义 + 版本
|
||||
|
||||
b_canvas_json 只放界面布局(节点坐标),不参与执行(§6.2)。
|
||||
格式与设计器 domain 层约定一致:{ schemaVersion, nodes: { <nodeKey>: {x,y} } }
|
||||
---------------------------------------------------------------------------- */
|
||||
|
||||
insert into dbo.wf_definition (b_id, b_name, b_i18n, b_canuse, b_bz,
|
||||
b_created_by, b_created_at, b_updated_by, b_updated_at)
|
||||
values (@def, N'费用报销审批', 'workflow.expense_approval', 1,
|
||||
N'模拟数据:覆盖条件分支、并行、会签、串行会签、N 人通过、按比例通过与抄送',
|
||||
@by, @now, @by, @now);
|
||||
|
||||
insert into dbo.wf_version (b_id, b_definition_id, b_version_no, b_status, b_schema_version,
|
||||
b_canvas_json, b_checksum, b_published_by, b_published_at, b_bz,
|
||||
b_created_by, b_created_at, b_updated_by, b_updated_at)
|
||||
values (@ver, @def, 1, 'published', 1,
|
||||
N'{
|
||||
"schemaVersion": 1,
|
||||
"nodes": {
|
||||
"start": { "x": 120, "y": 320 },
|
||||
"dept_manager": { "x": 320, "y": 320 },
|
||||
"amount_gateway": { "x": 520, "y": 320 },
|
||||
"gm_approve": { "x": 720, "y": 180 },
|
||||
"finance_review": { "x": 920, "y": 320 },
|
||||
"parallel_split": { "x": 1120, "y": 320 },
|
||||
"legal_countersign": { "x": 1320, "y": 160 },
|
||||
"cc_cfo": { "x": 1320, "y": 320 },
|
||||
"risk_review": { "x": 1320, "y": 480 },
|
||||
"parallel_join": { "x": 1520, "y": 320 },
|
||||
"big_amount_gateway":{ "x": 1720, "y": 320 },
|
||||
"chairman_approve": { "x": 1920, "y": 180 },
|
||||
"archive": { "x": 2120, "y": 320 },
|
||||
"end": { "x": 2320, "y": 320 }
|
||||
}
|
||||
}',
|
||||
'mock-checksum-expense_approval_v1', @by, @now, N'模拟数据:已发布版本',
|
||||
@by, @now, @by, @now);
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
3. 节点(14 个)
|
||||
|
||||
b_approval_mode / b_reject_mode / b_due_hours 是常用列;
|
||||
requiredCount、requiredRatio、formPolicy 等低频配置进 b_config_json(§6.4)。
|
||||
---------------------------------------------------------------------------- */
|
||||
|
||||
insert into dbo.wf_node (b_id, b_version_id, b_node_key, b_name, b_node_type,
|
||||
b_approval_mode, b_reject_mode, b_due_hours, b_config_json, b_xh, b_canuse)
|
||||
values
|
||||
-- 开始
|
||||
('n_exp_start', @ver, 'start', N'开始', 'start',
|
||||
null, null, null, null, 10, 1),
|
||||
|
||||
-- 部门负责人审批:或签(部门负责人 或 分管副总 任一人通过即可)
|
||||
('n_exp_dept_manager', @ver, 'dept_manager', N'部门负责人审批', 'user_task',
|
||||
'any', 'return_initiator', 24,
|
||||
N'{"schemaVersion":1,"allowInitiator":false,"excludePreviousActors":true,"allowClaim":true,"commentRequired":false,"formPolicy":{"readonly":[],"required":["b_reason"]}}',
|
||||
20, 1),
|
||||
|
||||
-- 条件分支:金额判断
|
||||
('n_exp_amount_gateway', @ver, 'amount_gateway', N'金额判断', 'exclusive_gateway',
|
||||
null, null, null, null, 30, 1),
|
||||
|
||||
-- 总经理审批:单人
|
||||
('n_exp_gm_approve', @ver, 'gm_approve', N'总经理审批', 'user_task',
|
||||
'single', 'terminate', 48,
|
||||
N'{"schemaVersion":1,"allowInitiator":false,"excludePreviousActors":true,"allowClaim":false,"commentRequired":true,"formPolicy":{"readonly":["b_amount","b_dept_id"],"required":[]}}',
|
||||
40, 1),
|
||||
|
||||
-- 财务复核:会签(全部通过)
|
||||
('n_exp_finance_review', @ver, 'finance_review', N'财务复核', 'user_task',
|
||||
'all', 'terminate', 24,
|
||||
N'{"schemaVersion":1,"allowInitiator":false,"excludePreviousActors":true,"allowClaim":false,"commentRequired":false,"formPolicy":{"readonly":["b_amount"],"required":[]}}',
|
||||
50, 1),
|
||||
|
||||
-- 并行分支
|
||||
('n_exp_parallel_split', @ver, 'parallel_split', N'并行分支', 'parallel_gateway',
|
||||
null, null, null, null, 60, 1),
|
||||
|
||||
-- 法务串行会签:按 wf_actor_rule.b_priority 逐个激活
|
||||
('n_exp_legal_countersign', @ver, 'legal_countersign', N'法务串行会签', 'user_task',
|
||||
'serial', 'return_previous', 72,
|
||||
N'{"schemaVersion":1,"allowInitiator":false,"excludePreviousActors":true,"allowClaim":false,"commentRequired":true,"formPolicy":{"readonly":[],"required":[]}}',
|
||||
70, 1),
|
||||
|
||||
-- 抄送财务总监:不产生待办,节点激活即完成
|
||||
('n_exp_cc_cfo', @ver, 'cc_cfo', N'抄送财务总监', 'cc_task',
|
||||
null, null, null,
|
||||
N'{"schemaVersion":1,"commentRequired":false}', 80, 1),
|
||||
|
||||
-- 风控按比例通过:requiredRatio 在节点激活时换算成应签人数
|
||||
('n_exp_risk_review', @ver, 'risk_review', N'风控按比例通过', 'user_task',
|
||||
'percentage', 'terminate', 48,
|
||||
N'{"schemaVersion":1,"allowInitiator":false,"excludePreviousActors":true,"allowClaim":false,"commentRequired":false,"requiredRatio":0.6,"formPolicy":{"readonly":[],"required":[]}}',
|
||||
90, 1),
|
||||
|
||||
-- 并行汇合
|
||||
('n_exp_parallel_join', @ver, 'parallel_join', N'并行汇合', 'parallel_gateway',
|
||||
null, null, null, null, 100, 1),
|
||||
|
||||
-- 条件分支:是否超阈值
|
||||
('n_exp_big_amount_gateway', @ver, 'big_amount_gateway', N'是否超阈值', 'exclusive_gateway',
|
||||
null, null, null, null, 110, 1),
|
||||
|
||||
-- 董事长审批:N 人通过(3 个候选人里 2 人通过即完成)
|
||||
('n_exp_chairman_approve', @ver, 'chairman_approve', N'董事长审批', 'user_task',
|
||||
'n_of_m', 'terminate', 72,
|
||||
N'{"schemaVersion":1,"allowInitiator":false,"excludePreviousActors":true,"allowClaim":false,"commentRequired":true,"requiredCount":2,"formPolicy":{"readonly":[],"required":[]}}',
|
||||
120, 1),
|
||||
|
||||
-- 服务节点:归档(第一阶段只占位,不执行)
|
||||
('n_exp_archive', @ver, 'archive', N'归档', 'service_task',
|
||||
null, null, null,
|
||||
N'{"schemaVersion":1,"serviceKey":"expense_archive"}', 130, 1),
|
||||
|
||||
-- 结束
|
||||
('n_exp_end', @ver, 'end', N'结束', 'end',
|
||||
null, null, null, null, 140, 1);
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
4. 连线(17 条)
|
||||
|
||||
b_condition_json 为 null 表示默认出口;条件分支节点必须至少有一条(§6.5)。
|
||||
条件用结构化 AST(§7.1):{ all: [ {field, operator, value} ] } / { any: [...] },
|
||||
叶子字段必须来自模块 s_field,SQL 由后端编译为参数化查询。
|
||||
b_priority 小的先判断。
|
||||
---------------------------------------------------------------------------- */
|
||||
|
||||
insert into dbo.wf_edge (b_id, b_version_id, b_from_node_key, b_to_node_key, b_name,
|
||||
b_condition_json, b_priority, b_canuse, b_bz)
|
||||
values
|
||||
('e_exp_01', @ver, 'start', 'dept_manager', null, null, 10, 1, null),
|
||||
('e_exp_02', @ver, 'dept_manager', 'amount_gateway', null, null, 10, 1, null),
|
||||
|
||||
-- 金额判断:> 10000 走总经理,否则直接进财务复核(默认出口)
|
||||
('e_exp_03', @ver, 'amount_gateway', 'gm_approve', N'金额大于 1 万',
|
||||
N'{"all":[{"field":"b_amount","operator":"gt","value":10000}]}', 10, 1, null),
|
||||
('e_exp_04', @ver, 'amount_gateway', 'finance_review', N'默认出口', null, 20, 1, N'金额不大于 10000'),
|
||||
('e_exp_05', @ver, 'gm_approve', 'finance_review', null, null, 10, 1, null),
|
||||
('e_exp_06', @ver, 'finance_review', 'parallel_split', null, null, 10, 1, null),
|
||||
|
||||
-- 并行分支:三条出线同时激活
|
||||
('e_exp_07', @ver, 'parallel_split', 'legal_countersign', null, null, 10, 1, null),
|
||||
('e_exp_08', @ver, 'parallel_split', 'cc_cfo', null, null, 20, 1, null),
|
||||
('e_exp_09', @ver, 'parallel_split', 'risk_review', null, null, 30, 1, null),
|
||||
|
||||
-- 并行汇合:三条支线全部到达后才继续
|
||||
('e_exp_10', @ver, 'legal_countersign', 'parallel_join', null, null, 10, 1, null),
|
||||
('e_exp_11', @ver, 'cc_cfo', 'parallel_join', null, null, 10, 1, null),
|
||||
('e_exp_12', @ver, 'risk_review', 'parallel_join', null, null, 10, 1, null),
|
||||
('e_exp_13', @ver, 'parallel_join', 'big_amount_gateway',null, null, 10, 1, null),
|
||||
|
||||
-- 是否超阈值:>= 50000 要董事长,否则直接归档(默认出口)
|
||||
('e_exp_14', @ver, 'big_amount_gateway','chairman_approve', N'金额大于等于 5 万',
|
||||
N'{"all":[{"field":"b_amount","operator":"ge","value":50000}]}', 10, 1, null),
|
||||
('e_exp_15', @ver, 'big_amount_gateway','archive', N'默认出口', null, 20, 1, N'金额小于 50000'),
|
||||
('e_exp_16', @ver, 'chairman_approve', 'archive', null, null, 10, 1, null),
|
||||
('e_exp_17', @ver, 'archive', 'end', null, null, 10, 1, null);
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
5. 审批人 / 抄送人规则
|
||||
|
||||
解析规则执行后必须把规则快照写进运行表(§6.6);这里只配规则本身。
|
||||
b_priority 既是串行会签的顺序来源,也是同类型规则的判断顺序。
|
||||
---------------------------------------------------------------------------- */
|
||||
|
||||
insert into dbo.wf_actor_rule (b_id, b_version_id, b_node_key, b_actor_type, b_actor_ref,
|
||||
b_resolve_json, b_condition_json, b_fallback_type, b_fallback_ref,
|
||||
b_priority, b_canuse, b_bz)
|
||||
values
|
||||
-- 部门负责人审批(或签):发起人所属部门负责人 或 分管副总
|
||||
('r_exp_dm_1', @ver, 'dept_manager', 'dept_manager', null, null, null, 'admin', null, 10, 1, N'发起人或业务归属部门负责人'),
|
||||
('r_exp_dm_2', @ver, 'dept_manager', 'position', 'vice_president', null, null, 'admin', null, 20, 1, N'分管副总'),
|
||||
|
||||
-- 总经理审批(单人)
|
||||
('r_exp_gm_1', @ver, 'gm_approve', 'position', 'gm', null, null, 'admin', null, 10, 1, N'总经理岗'),
|
||||
|
||||
-- 财务复核(会签):两条规则 → 两名审批人都必须通过
|
||||
('r_exp_fr_1', @ver, 'finance_review', 'org_role', 'finance', null, null, 'admin', null, 10, 1, N'财务组织角色'),
|
||||
('r_exp_fr_2', @ver, 'finance_review', 'position', 'finance_manager', null, null, 'admin', null, 20, 1, N'财务经理岗'),
|
||||
|
||||
-- 法务串行会签(串行):按 priority 10 → 20 → 30 逐个激活
|
||||
('r_exp_lc_1', @ver, 'legal_countersign', 'org_role', 'legal_lead', null, null, 'admin', null, 10, 1, N'法务负责人(第一个签)'),
|
||||
('r_exp_lc_2', @ver, 'legal_countersign', 'user', 'U001', null, null, 'admin', null, 20, 1, N'指定用户(第二个签)'),
|
||||
('r_exp_lc_3', @ver, 'legal_countersign', 'position', 'legal_staff', null, null, 'admin', null, 30, 1, N'法务专员(第三个签)'),
|
||||
|
||||
-- 抄送财务总监(抄送):不产生待办
|
||||
('r_exp_cc_1', @ver, 'cc_cfo', 'org_role', 'cfo', null, null, 'none', null, 10, 1, N'财务总监'),
|
||||
|
||||
-- 风控按比例通过(3 名候选人里过 60% → 2 人)
|
||||
('r_exp_rr_1', @ver, 'risk_review', 'org_role', 'risk', null, null, 'admin', null, 10, 1, N'风控组织角色'),
|
||||
('r_exp_rr_2', @ver, 'risk_review', 'position', 'risk_manager', null, null, 'admin', null, 20, 1, N'风控经理岗'),
|
||||
('r_exp_rr_3', @ver, 'risk_review', 'user', 'U002', null, null, 'admin', null, 30, 1, N'指定用户'),
|
||||
|
||||
-- 董事长审批(N 人通过,requiredCount = 2)
|
||||
('r_exp_ca_1', @ver, 'chairman_approve', 'user', 'U001', null, null, 'admin', null, 10, 1, N'候选人一'),
|
||||
('r_exp_ca_2', @ver, 'chairman_approve', 'user', 'U002', null, null, 'admin', null, 20, 1, N'候选人二'),
|
||||
('r_exp_ca_3', @ver, 'chairman_approve', 'user', 'U003', null, null, 'admin', null, 30, 1, N'候选人三');
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
6. 自检
|
||||
---------------------------------------------------------------------------- */
|
||||
|
||||
select N'流程定义' as 项, count(*) as 行数 from dbo.wf_definition where b_id = @def
|
||||
union all
|
||||
select N'流程版本', count(*) from dbo.wf_version where b_definition_id = @def
|
||||
union all
|
||||
select N'节点', count(*) from dbo.wf_node where b_version_id = @ver
|
||||
union all
|
||||
select N'连线', count(*) from dbo.wf_edge where b_version_id = @ver
|
||||
union all
|
||||
select N'审批人规则', count(*) from dbo.wf_actor_rule where b_version_id = @ver;
|
||||
Reference in new issue
Block a user