原子标记的意义

可以通过两个场景来说明原子标记的意义

不使用原子标记

定义一种场景需求,其流程及权限设计如下:

  1. 用户新建party原子条目,此时处于草稿状态
  2. 提交原子条目后,处于正常状态
  3. 正常状态下,被授予read权限的用户可以查看此原子条目
  4. 正常状态下,被授予print权限的用户可以print此原子条目

对于扩展指令 print而言,就不需要设置原子标记

使用原子标记

在前面定义的场景需求中增加一个环节,当原子转为正常状态时,需要review之后,才允许print

  1. 用户新建party原子条目,此时处于草稿状态
  2. 提交原子条目后,处于正常状态,此时设原子标记=1
  3. 原子标记=1时,被授予review权限的用户可以review此原子条目
  4. review完成后,设原子标记=2
  5. 原子标记=2时,被授予print权限的用户可以打印此原子条目
名称 说明
原子标记=1 等待review
原子标记=2 已经review

原子标记的特性

  1. 原子指令原子标记关联
  2. 如果原子指令没有指定原子标记:在正常状态下,凡是被授予权限的原子指令均有效
  3. 如果原子指令指定了原子标记:在正常状态下,先匹配与当前原子标记对应的原子指令,再判断用户针对此原子指令是否有授权
  4. 原子指令可以关联多个原子标记

原子标记的定义

如模块test-party中原子类型party相关的指令及标记配置如下:

modules/test-party/backend/src/meta.js

const meta = {
  base: {
    atoms: {
      party: {
        actions: {
          review: {
            code: 101,
            title: 'Review',
            flag: '1',
          },
        },
        flags: {
          1: {
            title: 'Reviewing',
          },
          2: {
            title: 'Reviewed',
          },
        },
      },
    },
  },
};
名称 说明
review.code 扩展指令代码,从101开始分配
review.title 扩展指令标题
review.flag 原子标记:当原子标记等于1时,指令review才有效。支持多个原子标记
flags 原子标记定义

简单流程

原子标记原子指令的配合可以实现简单流程,但还有一个细节需要处理:

在前面的场景二中,当原子条目提交到正常状态时,需要进行review操作,但此时,拥有read权限的用户是否允许read此原子条目?

  • 通过开启简单流程,就可以确保在指令review完成之后,原子才可以被拥有read权限的用户read此原子条目

简单流程配置

默认情况下不开启简单流程,开启简单流程如下:

src/module/test-party/backend/src/meta.js

base: {
  atoms: {
    party: {
      info: {
        title: 'Party',
        tableName: 'testPartyView',
        flow: 1,
      },
    },
  },
},
名称 说明
info.flow=1 开启简单流程

简单流程逻辑

开启简单流程的原子类型,其流程逻辑如下:

  1. 当新建原子时,原子字段atomFlow值自动设置为1
  2. 原子提交到正常状态后,自动进入简单流程处理环节
  3. 原子标记标记了当前流程需要处理的原子指令
  4. 此时,只有经过授权的用户可以操作与原子标记相对应的原子指令
  5. 当最后一个原子指令执行完毕,需要将原子字段atomFlow值设置为0,从而标识流程已经处理完毕
  6. 此时,授予read权限的用户才可以read此原子条目

简单流程开发

我们需要在enableaction这两个业务逻辑中做少量的处理,从而将整个简单流程串起来

src/module/test-party/backend/src/service/party.js

module.exports = app => {

  class Party extends app.Service {

    async enable({ atomClass, key, atom, user }) {
      // 将`原子标记`设置为1
      await this.ctx.meta.atom.flag({
        key,
        atom: { atomFlag: 1 },
        user,
      });
    }

    async action({ action, atomClass, key, user }) {
      // 原子指令:review
      if (action === 101) {
        // 将`原子标记`设置为2
        await this.ctx.meta.atom.flag({
          key,
          atom: { atomFlag: 2 },
          user,
        });
        // 将`简单流程`设为0,表示已完成`流程`处理
        await this.ctx.meta.atom.flow({
          key,
          atom: { atomFlow: 0 },
          user,
        });
      }
    }

  }

  return Party;
};