Skip to content
marstone edited this page Jul 16, 2019 · 32 revisions

0. 概述

  • 任务中心API,用于任务源头系统和任务中心系统进行集成
  • 任务源头系统通过推或者拉的方式,将任务同步到任务中心系统中

1. 技术规范

1.1. OAuth2授权

1.2. GraphQL接口

  • 协议参考:https://graphql.org/
  • App、Process、Task三级类型定义,具体定义参考后面附录。

变更定义:

type Mutation {
  # Mutation【1】:全量同步一个流程实例,待办中心会最终与传入Process及其Tasks信息保持一致 
  syncProcess(process:Process!, timestamp:Long):Process
  # Mutation【2】:增量同步一个流程实例及其的Tasks列表,Tasks列表内容按Id视为新增或更新  
  pushProcess(process:Process!, timestamp:Long):Process
  # Mutation【3】:增量删除一个流程实例的Tasks列表,Tasks列表仅需给出Id即可   
  deleteTasks(process:Process!, timestamp:Long):Process  
  # Mutation【4】:删除一个流程实例,仅需给出Id(或entry+system)即可   
  deleteProcess(process:Process!, timestamp:Long):Process
}
  • timestamp给出该Process变更的毫秒级Unix时间戳。待办中心按照此时间戳保障任务级的时间箭头的一致性

查询定义:

type Query {
  # Query【1】:根据流程Id或“流水号+系统”查询给定流程实例及其任务详情  
  process(id:Long, entry:Long, system:String):Process 
  # Query【2】:查询用户的任务列表,cate可选范围:[todo],含义:[待办]   
  tasks(cate:String!, userId:String):[Tasks] 
  # Query【3】:查询用户的流程实例列表,cate可选范围:[doing|done|completed],含义:[进行中]已完成|doing+done]
  processes(cate:String!, userId:String):[Process] 
}

1.3. 推送接口(WebSocket)

  • 用于实现 Web 页面的实时刷新。尚待完善

2. 方案

  • 每个应用(任务源)可根据自身的特性,选择推、拉等方式或者其组合。

2.1. 方案比较

| 方案 | 实现难度 | 实时性 | 页面性能 | 压力 | 统计分析 | 待办通知 |
|:--------- -|:--------|:--------|:---------|:------|:--------|:-------|
| 拉模式 | 简单 | 实时 | 低 | 低 | 不支持 | 不支持 |
| 按实例全量推 | 中等 | 较差 | 高 | 高 | 支持 | 可支持 |
| 按实例增量推 | 复杂 | 中等 | 高 | 中 | 支持 | 可支持 |

拉模式

按实例全量推

  • 任务源通过调用 Mutation【1】【4】实现

按实例增量推

  • 任务源通过调用 Mutation【2】【3】【4】实现,为保障数据一致性,需辅助使用Query【1】对比。

数据结构定义

  • 本节定义本组API的 GraphQL Schema

类型定义:App

  • 指代一类可办事项
// TYPE {app} 
{
    "id":{guid},               // 无意义的唯一id
    "name":{string},           // 可办事项名称
    "uri":{string},            // 启动uri
    "code":{string},           // 应用代码,可用于部分api调用,表示该app的发布版
    "abbreviation":{string},   // 缩略名
    "description":{string},    // 服务摘要
    "tags":{string},           // 应用标签,可以有多个,以逗号分隔,第一个作为主分类
    "icon":{uri},              // 图标uri
    "palette":{string},        // 调色板颜色,形如:#ff0000
    "department":{string},     // 负责院系
    "contact":{string},        // 联系人及其方式描述
    "recommend":{integer},     // 推荐度,整数 
    "rating":{integer},        // 评价汇总,0到100分
    "rated":{integer},         // 评价次数
    "system":{string},         // 所属系统 
}

类型定义:Process

  • 工作流应用的实例。一个App可以被发起多个Process
// TYPE {process} 
{
    "id":{guid},                // 无意义的唯一id 
    "name":{string},            // 流程实例名称
    "uri":{string},             // 查看流程实例用到的uri 
    "tags":{string},            // 该流程实例的标签,可以有多个,以逗号分隔
    "entry":{string},           // 流程实例流水号
    "create":{long},            // 流程实例创建时间
    "update":{long},            // 流程实例最后操作时间  
    "sort":{long},              // 排序值,会根据排序方式而不同,可参考order参数,目前均为时间戳。 
    "app":{app},                // 所属应用
    "owner":{profile},          // 流程实例所有者,用于区分是我的事宜还是别人的事宜
    "actualUser":{profile},     // 委托发起的流程的实际发起人
    "status":{string},          // 流程状态:doing、suspended、done、killed
    "stateEx":{string},         // 流程终止节点状态 
    "version":{long},           // 所属App版本的创建时间戳 
    "rating":{int},             // 评价星级,1-5
    "review":{string},          // 评价内容 
    "pendingTasks":{string},    // 当前的待办任务名称列表,逗号分割 
    "priority":{string},        // 优先级:normal、important,可为空默认normal
    "tasks":[{task}]            // 任务列表 
}

类型定义:Task

  • 需要用户办理的任务,每个Process由1或多个Task组成。
// Type: {task} 
{
    "id":{guid},
    "name":{string},              // 当前任务名,如:"待审核"、"申请单填写"
    "uri":{string},               // 展示本任务表单所需的url
    "description":{string},       // 摘要
    "process":{process},          // 所属流程实例
    "subProcess":{process},       // 对应的子流程,仅对子流程任务有效
    "assignUser":{profile},       // 指派给的用户,可能为空,表示未指定具体用户
    "actionUser":{profile},       // 办理用户,仅对doing|done有效
    "actualUser":{profile},       // 实际操作的用户,"被委托人" 
    "assignTime":{long},          // 指派时间
    "actionTime":{long},          // 办理时间
    "actionName":{string},        // 办理时选择的动作名称
    "expireTime":{long},          // 承诺办理时间 
    "renderTime":{long},          // 此任务表单第一次渲染的时间,用于标记该任务“已读” 
    "remark":{string},            // 办理用户填写的备注信息 
    "status":{string},            // 状态:[todo|done|sub]  
    "actioners": [{profile}],      // 可办理人列表 
    "reviewers": [{profile}],      // 被抄送人列表 
}

类型定义:Profile

  • 表示一个用户
// TYPE {profile} 
{
    "id":{guid},                    // 无意义的唯一id
    "name":{string},                // 实名
    "account":{string},             // 租户内的用户id,租户唯一  
} 

Clone this wiki locally