
# Workflow API 文档
## 流程示意
![流程示意图](/assets/process.png)

## 目录

- [流程图管理](#流程图管理)
- [流程实例管理](#流程实例管理)
- [任务管理](#任务管理)
- [表单管理](#表单管理)
- [Camunda部署-Docker](#Camunda部署-Docker)

## 项目导入
```javascript
import { 
    getProcessList, 
    getProcessInfo
    //...其他
} from '/api/workflow'
```
## 流程图管理

### 获取流程图列表
```javascript
getProcessList({
  firstResult = 0,    // 起始索引
  maxResults = 8,     // 最大结果数
  latestVersion = true // 是否最新版本
})
```

### 获取流程图信息
```javascript
getProcessInfo(processId)  // processId: 流程图ID
```

### 获取流程图 XML
```javascript
getProcessXml(processId)  // processId: 流程图ID
```


### 上传流程图
```javascript
const bpmnContent = '...';  // 流程图内容
const formData = new FormData()
const bpmnBlob = new Blob([bpmnContent], { type: 'application/octet-stream' });
formData.append('content', bpmnBlob, 'process.bpmn');    // 文件名应以 .bpmn 结尾
addModeler(formData)
```


### 删除流程图
```javascript
deleteProcess(processId)  // processId: 流程图ID
```

### 创建流程实例
```javascript
start({
  processKey: string,  // 流程图key
  formId: string,      // 表单ID
  createUser: string,  // 创建人
  formValues: object   // 填写的表单数据
})
```

## 流程实例管理

### 获取流程实例列表
```javascript
getProcessInstanceList({
  firstResult = 0,           // 起始索引
  maxResults = 8,            // 最大结果数
  processDefinitionKey,      // 流程图key
  sortOrder = "desc",        // 排序方式：asc/desc
  sortBy = "startTime"       // 排序字段
})
```

### 删除流程实例
```javascript
deleteProcessInstance(processInstanceId)  // processInstanceId: 流程实例ID
```

## 任务管理

### 获取流程实例任务列表
```javascript
getInstanceTaskList({
  firstResult = 0,      // 起始索引
  maxResults = 8,       // 最大结果数
  processInstanceId     // 流程实例ID
})
```

### 获取用户任务列表
```javascript
getUserTaskList({
  firstResult = 0,    // 起始索引
  maxResults = 8,     // 最大结果数
  assignee,           // 执行人ID
  candidateUser,      // 候选人ID
  candidateGroup      // 候选组ID
})
```

### 任务候选人管理
```javascript
// 查询任务节点候选人/组
getTaskCandidate(taskId)

// 添加节点候选人/组
addTaskCandidate({
  taskId,             // 任务ID
  type,               // 类型：candidate/assignee
  userId,             // 用户ID（与groupId二选一）
  groupId             // 组ID（与userId二选一）
})

// 删除节点候选人/组
deleteTaskCandidate({
  taskId,             // 任务ID
  type,               // 类型：candidate/assignee
  userId,             // 用户ID（与groupId二选一）
  groupId             // 组ID（与userId二选一）
})
```

### 任务操作
```javascript
// 认领任务
claim({
  taskId,    // 任务ID
  userId     // 用户ID
})

// 取消认领任务
unclaim(taskId)

// 完成任务
complete({
  taskId,    // 任务ID
  variables: {
    approvalResult: {
      value: "approved" | "rejected",  // 审批结果
      type: "String"
    }
  }
})

// 添加任务评论---记录审批结果
setComment({
  taskId,     // 任务ID
  message     // 评论内容（JSON字符串） JSON.stringify({message: '执行成功',id: '其他的测试信息'})
  
})
```

## 表单管理

### 表单查询
```javascript
// 获取表单列表
getFormList({
  page,    // 页码
  start,   // 起始索引
  limit    // 最大结果数
})

// 获取表单详情
getFormDetail(formId)

// 获取表单字段
getFormFields(path)
```

### 表单操作
表单内容，暂不支持上传文件，手动填写在node服务端- /server/form下,写法与动态Form一致
```javascript
var config = require('../config'); //配置动态请求的基础路径
const formFields = [
    {
        tag: 'el-input',
        label: '申请原因:',
        key: 'reason',
        value: '',
        default: '',
        attribute: {
            clearable: true,
            placeholder: '请输入申请原因',
        },
    },
    {
        tag: 'BaseSelect',
        label: '申请人:',
        key: 'user',
        value: '',
        default: '',
        attribute: {//配置项内容
            placeholder: '请选择申请人',
            fetchOptions: {//动态请求配置
                baseURL: config.env[process.env.NODE_ENV].formBaseURL, //请求的基础路径
                url: `/system/user/list`,
                method: "get",
                data: {
                    page: 1,
                    limit: 999,
                },
                dataType: "json",
                dataPath: "data.list",//默认值-data.list，可不指定
                labelKey: "nickName",//默认值-name，可不指定
                valueKey: "userId",//默认值-id，可不指定
            }
        }
    }
];
module.exports = {
    formFields
};

```
```javascript
// 添加表单
addForm({
  formName: string,   // 表单名称
  formDesc: string,   // 表单描述
  formPath: string,   // 表单内容--/form/test.js
  userId: string      // 创建人ID
})

// 更新表单
updateForm({
  id: string,         // 表单ID
  formName: string,   // 表单名称
  formDesc: string,   // 表单描述
  formPath: string    // 表单内容
})

// 删除表单
deleteForm(formId)
```

注意：所有 API 都返回 Promise 对象，可使用 async/await 处理异步请求。API 的基础 URL 由环境变量 `VITE_APP_BASE_PROCESS_API` 指定。

## Camunda部署-Docker
### 1.更改docker的镜像源
vi /etc/docker/daemon.json
```shell
{
    "registry-mirrors": [
        "https://docker.registry.cyou",
        "https://docker-cf.registry.cyou",
        "https://dockercf.jsdelivr.fyi",
        "https://docker.jsdelivr.fyi",
        "https://dockertest.jsdelivr.fyi",
        "https://mirror.aliyuncs.com",
        "https://dockerproxy.com",
        "https://mirror.baidubce.com",
        "https://docker.m.daocloud.io",
        "https://docker.nju.edu.cn",
        "https://docker.mirrors.sjtug.sjtu.edu.cn",
        "https://docker.mirrors.ustc.edu.cn",
        "https://mirror.iscas.ac.cn",
        "https://docker.rainbond.cc"
    ]
}
```

```shell
systemctl daemon-reload
systemctl restart docker  
```
### 2.拉取镜像
```shell
docker pull camunda/camunda-bpm-platform:latest
```
### 3.添加启动脚本
vi /data/camunda/docker-compose.yml
```shell
# 其中ports 1111为宿主机端口，8080为容器内部端口
version: '3'
services:
  camunda:
    image: camunda/camunda-bpm-platform:latest
    ports:
      - "1111:8080"
    volumes:
      - ./camunda-data:/camunda/data
      
```
```shell
#启动服务
docker-compose up -d
```