Skip to content

配置业务流程

工作流

  • 工作流可以理解为在有向图中从一个节点出发,一步步将业务走下去的箭头。

  • 通过编写工作流,可以将业务表示得更清晰

  • 调用d.startWorkflow('流程名'),即为开始一个新的工作流,它同时标志着上一个工作流的结束(如果有上一个)

  • 任何写在工作流下面节点对节点的链式调用,都会被顺序记录下来,最终反映在 Web 动画上

    • 是的,用链式就连上了,让人忍俊不禁
  • 链式调用可以断开,对应着流程可以分叉,如下示例代码

工作流示例

ts
const 管理员 = d.actor(/* ... */)
const 用户前置检查服务 = d.service(/* ... */)
const 用户已创建 = d.event(/* ... */)
const 用户创建失败了 = d.event(/* ... */)
const 创建用户外观命令 = d.facadeCmd(/* ... */)
const 创建用户命令 = d.command(/* ... */)
const 用户聚合 = d.agg(/* ... */)

const 创建用户流程 = d.startWorkflow('创建用户流程')
管理员
  .facadeCmd(创建用户外观命令)
  .service(用户前置检查服务)
  .command(创建用户命令)
  .agg(用户聚合)
用户聚合.event(用户已创建)
用户聚合.event(用户创建失败了)
其中涉及到的节点也可以和声明同时进行(不推荐)
  • 存在缺陷

  • 难以阅读、难以管理,容易写出一大坨复杂的参数

ts
const 创建用户流程 = d.startWorkflow('创建用户流程')
管理员
  .command(
    'CreateUserCommand',
    [
      /* ... */
    ],
    '创建用户命令'
  )
  .agg(
    'UserAgg',
    [
      /* ... */
    ],
    '用户聚合'
  )
  .event(
    'UserCreatedEvent',
    [
      /* ... */
    ],
    '用户已创建'
  )
// 这里将无法再调用`用户聚合.event(用户创建失败了)`,因为`用户聚合`是匿名的

用户故事

实验性功能

我意识到工作流与用户侧视角的“业务”贴合度不足。

设计用户故事,是帮助技术人员贴合用户思维的一种尝试,欢迎批评指正。

  • 一个用户故事由若干个关系高度密切有逻辑先后关系的工作流组成

  • 用户故事在一开始时不是必要的,但如果一个系统演变得足够复杂了,维护良好的用户故事能够加快技术人员理解业务的速度

  • 用户故事的划分粒度,视系统的复杂度而逐渐演化

用户故事示例

ts
const Shibor基准浮息类个人贷款流程 =
  d.startWorkflow('Shibor基准浮息类个人贷款流程')
// ...
const 一般个人贷款流程 = d.startWorkflow('一般个人贷款流程')
// ...
const 逆回购流程 = d.startWorkflow('逆回购流程')
// ...
const 银行拆借流程 = d.startWorkflow('银行拆借流程')
// ...
const 个人贷合同重定价流程 = d.startWorkflow('外币收款结汇流程')
// ...

d.userStory('作为高贵的用户,我要办理Shibor基准浮息类个人贷款', [
  银行拆借流程,
  个人贷合同重定价流程,
  Shibor基准浮息类个人贷款流程,
])
d.userStory('作为高贵的用户,我要办理一般个人贷款', [
  个人贷合同重定价流程,
  一般个人贷款流程,
])

现在我们胡编了一些流程。

假设现在新来了一个维护者,在金融专业知识方面储备不足,他可以通过阅读用户故事来快速了解“有前因后果的业务”。同时也能看出来Shibor基准浮息类个人贷款到底“不一般在哪”。

如果让他去看各种节点的定义、各种 policy,工作量会比这大得多、难得多。