聊聊最近的一个项目/你做了什么/你印象最深的功能点

工作流系统

我最近的这个项目是一个工作流平台,本质上它就是一个有限状态机,使用它的目的就是为了应对频繁变更的公司审批流程,基本上有用户模块、工单模块、消息模块、审批模块、客服模块等等,我或多或少都有参与,但其实这个系统的灵魂,也就是最核心的功能是工作流的流转,是我自己独立设计的,我采用队列的数据结构,遵循fifo(first in first out)原则,也就是先进先出原则,当有平台用户创建工单之后,读取审批人列表,审批人uid就会依次入队,每一次审批都会有两种情况,即审批拒绝或者审批通过,如果通过则会将该审批人uid所在的索引加1,流转到下一个审批人,反之则减1,进行流转的回退操作,当然了,索引肯定不能无脑加减,所以需要判断或者异常捕获机制,每一次流转我都会使用websocket协议进行无刷新提示,既可以提醒工作流发起人,也可以提醒下一个审批人,这样基于长连接的操作既可以节约带宽,也能及时将消息告知操作人。

当然了,这种队列级别的流转也会有阻塞的问题,即如果单审批人没有及时进行审批操作,工作流就会停滞,所以我又加入了并申的逻辑,即并行审批,在单个或多个审批节点上,可以设置多个审批人,这些人只要有一人审批通过或者拒绝,工作流就会继续进行流转,实现方式也很简单,即队列中可以嵌套其他数据结构,这个结构由于是并行的概念,所以不存在顺序,这里嵌套的是集合,利用流转后判断节点数据类型的操作,我们就可以知道下一次流转是串申还是并申。

最后呢,即使加入了并申机制,这套系统我个人认为也并非完美,因为队列这种数据结构有自身的局限性,也就是说一旦入队,就得按照既有顺序进行审批流转,如果出现特例,比如公司高层有特殊的加急审批需求,传统队列就无法满足,所以我在队列上加了一点功能,不知道您有没有听说过加权队列?我在审批节点中加一个字段,level等级,普通审批需求的等级是0,一旦有加急需求,我会将level字段设置为1,更加急的则会进行累加,同时针对这个队列进行倒序排列,这样既不会影响原队列普通审批逻辑的顺序,还可以对加急审批进行优先级操作,一举两得。

还可以引申动态表单机制

这种业务场景中我认为最常见的操作就是对字段的处理(例如查询、编辑等区域的表单、图表的列名、表格的列名),而字段恰恰是最为 '规范的',它有自己的名称、类型

例如
1. name 它代表名称,类型为字符串,在页面中应该是一个文本框
2. sex 它代表性别,类型为数值型,当它为0的时候代表男、为1的时候代表女,在页面中应该是一个下拉框

我们可以通过程序语言来描述这种数据结构 用对象或者说map这种结构而不用数组是为了可以精准对某个字段进行设置 而数组需要先遍历查找到这个字段再进行设置

let fieldMap = {
  name: {
    name: 'name',
    label: '名称',
    type: 'text'
  },
  sex: {
    name: 'sex',
    label: '性别',
    type: 'select',
    options: {
      list: [
        {
          label: '男', value: 0
        },
        {
          label: '女', value: 1
        }
      ]
    }
  }
}

实际上需求是非常复杂多变的,场景可以说是无限的甚至是相互交织关联的、我们可能会根据用户的操作动态显示字段的显示隐藏,例如提交后显示提交人、提交时间等字段、撤销了就不予显示

更加深入的理解

既然是状态机,就涉及到状态节点的切换,即触发了什么事件(输入)导致状态进入到下一个状态(输出),每一个状态节点拥有生命周期,hook 节点生命周期的不同阶段用来处理自定义的逻辑,并且可以控制状态机的走向。节点有不同的类型,有些内置类型的节点,例如进入到这个节点就发送一封邮件(短信),发送完以后进入到下一个节点。

results matching ""

    No results matching ""