# 在项目中如何接入工作流
## 1. 数据库
需要接入工作流程的业务表都需要加入三个流程有关字段:
| 字段值 | 字段描述 |
| --- | --- |
| `PROCESS_INSTANCE_ID` | 流程id |
| `PROCESS_NAME` | 流程名称 |
| `PROCESS_STATUS` | 流程状态 |
* * *
## 2. 后端
### 2.1. 实体部分
所有需要接入流程的业务实体都需要去继承 **工作流程实体类**:**`BaseProcessEntity`**,例如:
```java
public class GyslhProjectEntity extends BaseProcessEntity {}
```
其中有加入 **流程实例ID、流程实例名称、流程实例状态、流程信息实体**
```java
@Data
public abstract class BaseProcessEntity extends BaseEntity {
@ApiModelProperty(value = "流程实例ID")
private String processInstanceId;
@ApiModelProperty(value = "流程名称")
private String processName;
@ApiModelProperty(value = "流程实例状态:CG草稿 SHZ审核中 YSH已审核 ZZ终止")
private String processStatus;
@Transient
@TableField(exist = false)
@ApiModelProperty(value = "流程信息")
private ActBusiness actBusiness;
}
```
### 2.2. 流程方法
业务中有关流程的接口有以下几个基础实现:
* 提交申请 启动流程
* 保存草稿
* 删除草稿
* 删除流程
* 注入条件参数
接入工作流时,需要在业务方法中调用对应的流程方法。
#### 2.2.1. 提交流程申请
```java
/**
* 提交申请 启动流程
*
* @param act 流程信息实体
* @param tableId 业务主键值
*/
void applyProcess(String tableId, ActBusiness act);
```
调用示例:
```java
@Resource
private ActBusinessService actBusinessService;
actBusinessService.applyProcess(tableId, act);
```
#### 2.2.2. 保存草稿
```java
@Resource
private ActBusinessService actBusinessService;
/**
* 保存草稿
*
* @param tableId 业务表id
* @param actBusiness 流程信息实体
*/
void saveDraft(String tableId, ActBusiness actBusiness);
```
调用示例:
```java
@Resource
private ActBusinessService actBusinessService;
actBusinessService.saveDraft(tableId, act);
```
#### 2.2.3. 删除草稿
```java
@Resource
private ActBusinessService actBusinessService;
/**
* 根据业务主键值对流程进行删除(草稿才可删除)
*
* @param tableId 业务主键值
*/
void deleteByTableId(String tableId);
```
调用示例:
```java
@Resource
private ActBusinessService actBusinessService;
actBusinessService.deleteByTableId(tableId);
```
#### 2.2.4. 删除流程
```java
@Resource
private ActBusinessService actBusinessService;
/**
* 流程删除接口
*
* @param id 流程实例id
* @param isTrueDeleteOrFalse 是否为真删除 true为真删除 false为假删除
*/
void deleteProcessInstById(String id, boolean isTrueDeleteOrFalse);
/**
* 流程批量删除接口
*
* @param ids 流程实例id数组
* @param isTrueDeleteOrFalse 是否为真删除 true为真删除 false为假删除
*/
void deleteProcessInstByIds(String[] ids, boolean isTrueDeleteOrFalse);
/**
* 根据用户id删除所有与该用户有关的流程和流程历史记录
*
* @param userId 用户id
*/
void deleteByUserId(String userId);
```
调用示例:
```java
@Resource
private ActBusinessService actBusinessService;
actBusinessService.deleteProcessInstById(id, isTrueDeleteOrFalse);
actBusinessService.deleteProcessInstByIds(ids, isTrueDeleteOrFalse);
actBusinessService.deleteByUserId(userId);
```
#### 2.2.5. 注入条件参数
在流程启动后,都可以进行参数的注入,主要用于带条件的流程。
```java
/**
* 设置工作流条件全局变量单个值,支持整个实体设置
*
* @param processId 流程实例id
* @param name 变量名
* @param objVal 变量值
*/
void setConditionByVariable(String processId, String name, Object objVal);
```
调用示例:
```java
@Resource
private DataInjectionUtil dataInjectionUtil;
dataInjectionUtil.setConditionByVariable(processId, name, objVal);
```
## 3. 前端
### 3.1. index页面
* 引入工作流程有关`mixin`
```javascript
import { processFormMixin } from "@/core/mixins";
```
* 用到一下几个`mixin`:
**方法一(旧):**
| 描述 | 方法名 |
| --- | --- |
| 新增流程 | `addProcess(title, model, processType, form, width, height)` |
| 编辑(流程已结束) | `editForm(title, model, from, width, height)` |
| 编辑(草稿) | `editDraftProcess(title, model, processType, form, width, height)` |
| 详情 | `infoProcess(title, model, form, width, height)` |
| 删除草稿 | `deleteProcessDraft(tableId, url)` |
* * *
**有关参数详解:**
| 参数名 | 详细 |
| --- | --- |
| `title` | 必填,弹窗标题 |
| `model` | 必填,业务实体数据 |
| `processType` | 必填,流程类型(字典中配置的流程标识) |
| `form` | 必填,业务表单组件 |
| `width` | 可选,弹窗宽度,默认宽度1000 |
| `height` | 可选,弹窗高度,默认高度600 |
| `tableId` | 必填,业务主键id |
| `url` | 必填,删除方法url |
* * *
**方法二(新):**
| 描述 | 方法名 |
| --- | --- |
| 新增流程 | `addProcess(title, form, props, config)` |
| 编辑(流程已结束) | `editForm(title, model, from, config)` |
| 编辑(草稿) | `editDraftProcess(title, form, props, config)` |
| 详情 | `infoProcess(title, form, props, config)` |
| 删除草稿 | `deleteProcessDraft(tableId, url)` |
* * *
**有关参数详解:**
| 参数名 | 详细 |
| --- | --- |
| `title` | 必填,弹窗标题 |
| `props` | 必填,传入参数,主要是 `processType` |
| `config` | 选填,传入参数, `width`、`height` |
| `model` | 必填,业务实体数据 |
| `form` | 必填,业务表单组件 |
| `tableId` | 必填,业务主键id |
| `url` | 必填,删除方法url |
* * *
### 3.2. form页面
* 在`props`中加入`mode`和`model`
```javascript
props: {
mode: {
type: String,
default: "add"
},
model: {
type: Object,
default: () => {
return {}
}
}
}
```
* `methods`需要提供四个方法
| 描述 | 方法名 | 备注 |
| --- | --- | --- |
| 提交申请 | `handleApply(callback, failCallback) {}` | 必选,启动流程用 |
| 审核提交 | `handleSubmit(callback, failCallback) {}` | 必选,进行审核时默认调用,可在此方法中对流程状态进行判断 |
| 表单编辑保存 | `handleEdit(callback, failCallback) {}` | 可选,当没有该方法时,编辑保存默认走 `handleSubmit()` |
| 保存草稿 | `handleSaveDraft(callback, failCallback) {}` | 必选,保存流程草稿用 |
| 设置下一节点ID | `setNextNodeID(returnNodeId) {}` | 可选,流程设置中有网关的情况下使用。用于设置带有网关的流程,设置下一节点ID告诉系统设置哪一节点审批人。 |
> 注:
>
> * `callback` 为业务表单验证成功之后返回的回调函数,入参中需包括 `{ success: false/true }`。 `failCallback` 为表单验证失败后回调,没有入参。
>
> * `returnNodeId` 为设置节点ID回调函数,入参结构为:`{ nodeId }` (即传入ID字符串即可)
>
> * 使用 `setNextNodeID` 时,建议在模型设置中设置自定义节点ID值,方便使用(不设置节点ID则是系统配置随机ID)
#### 3.2.1. model参数详解
数据都由 `model` 进行传输,`model` 中除了存储所有业务数据,在走流程期间也会将流程数据传递进 `model`,方便开发人员操作。
| 用法 | 描述 |
| --- | --- |
| `this.model.getActBusinessData(data)` | 该方法将流程信息数据挂接到表单数据中,`data`为表单验证后的表单参数(配合`gis-form`有关方法使用) |
| `this.model.isFinishNode` | 是否为最后一个审核节点 |
| `this.model.isCancel` | 是否为撤销操作 |
#### 3.2.2. 调用示例
* 提交申请
```javascript
// 启动流程
handleApply(callback, failCallback) {
this.$refs.gisForm.handleSubmit(data => {
// 该方法将流程信息数据挂接到表单数据中
this.model.getActBusinessData(data)
this.post(callback, data, projectApi.apply);
}, () => { failCallback() });
}
```
* 审核提交
```javascript
// 进行审核时默认调用,可在此方法中对流程状态进行判断
handleSubmit(callback, failCallback) {
this.$refs.gisForm.handleSubmit(data => {
// isFinishNode参数判断是否为结束节点
if(this.model.isFinishNode) {
data.processStatus = "YSH";
}
// isCancel参数判断是否为撤回操作
if(this.model.isCancel) {
data.processStatus = "ZZ"
}
// 是否对后台进行请求由开发人员自行决定
// this.post(callback, data, projectApi.edit);
}, () => { failCallback() });
}
```
* 表单编辑保存(可选)
```javascript
// 当没有该方法时,编辑保存默认走 handleSubmit()。
handleEdit(callback, failCallback) {
this.handleSubmit(callback, failCallback)
},
```
* 保存草稿
```javascript
// 保存草稿(不需要表单验证)
handleSaveDraft(callback, failCallback) {
this.model.getActBusinessData(this.data)
this.post(callback, this.data, projectApi.saveDraft);
}
```
* 设置下一节点ID
```javascript
// 设置下一节点ID
setNextNodeID(returnNodeId) {
returnNodeId("ceshiId")
}
```
#### 3.2.3. 自定义标题填入(扩展功能)
**form页面需要与自定义标题绑定的字段调用示例:**
```javascript
{
type: 'input',
title: '项目名称',
field: 'xmmc',
validate: true,
on: {
// 字段值改变触发事件
'on-change': () => {
// 实现标题的自动填入
// 方法1:调用 this.onSetTitle(title) 方法设置标题名称(流程组件加载完之后可用)
this.onSetTitle(this.data[0].xmmc)
// 方法2:调用this.$emit("onSetTitle", title)方法设置标题名称(通用)
this.$emit("onSetTitle", this.data[0].xmmc)
}
}
}
```
## 4. 页面配置
### 4.1. 模型创建与发布
在【模型管理】模块中进行流程模型的创建和流程的在线设计,设计完成之后对流程进行部署发布,具体使用方法开发文档中有,不再赘述。
### 4.2. 字典配置
| 字典名称 | 字典类型 | 备注 |
| --- | --- | --- |
| 工作流_流程节点类型 | `process_node_type` | 暂时没有用到,可不配 |
| 工作流_优先级 | `priority` | 0:普通 1:重要 2:紧急 |
| 工作流_状态 | `process_status` | CG:草稿 SHZ:审核中 YSH:已审核 ZZ:终止 |
| 工作流_业务表标识 | `business_form` | 配置业务唯一标识,如项目管理标识:`projectManage` |
| 工作流_业务表 | `business_table` | 数据库中业务表名,如项目管理表:`gyslh_project` |
| 工作流_业务表路由 | `business_touter` | 配置表单路由,名称为业务表标识,数据值为当前项目view文件夹下表单的相对路径,比如项目管理表单路由配置:名称:`projectManage`,数据值:`project-manage/form` |
* * *
### 4.3. 流程配置
* 基本配置
主要配置业务标识、关联业务表名、业务主键名。前两个根据字典获取。
* 节点配置
主要对节点的审批人选进行配置。可根据角色、部门负责人、人员进行指定配置。
## 5. 扩展
### 5.1. 工作流嵌入Tab弹窗
**1. 引入Tab弹窗有关mixin**
```
import { formMixin } from "@/core/mixins";
```
**2、Tab弹窗使用方法以及参数详解**
```
this.infoTabs("这里是弹窗标题", tabsConfigDemo)
```
```
/**
* 带tabs页的详情弹窗
*
* @param {*} title 必填,弹窗标题
* @param {*} tabsConfig 必填,tab配置参数
* @param {*} width 选填,弹窗宽度,默认1000
* @param {*} height 选填,弹窗高度,默认600
*/
infoTabs(title, tabsConfig, width, height) {
this.openTabsForm(title, tabsConfig, width, height);
}
```
**`tabsConfig` 参数demo**
```
let tabsDemo = [
{
title:"基本信息", // tab的title
icon: "", // tab页面icon
component: projectForm, // 自定义组件。
isProcess: true, // 标明该组件为流程组件
// 流程组件传参
model: e
},
{
title:"表单页面",
component: projectForm, // 自定义组件
// 自定义参数,需要在自定义组件中自行接收。
mode: "add",
param: {}
},
{
title:"测试页面1",
component: "Input",
placeholder: "支持简单使用iview的组件和传递参数"
},
{
title:"测试页面2",
component: "Alert",
type: "warning",
label: "iview组件标签中的文字放在label中。这是消息提醒。Alert标签上的参数可配置在json对象中。",
showIcon: true
}
]
```
- 一、 开发环境
- 二、系统开发规范
- 1. 工程目录规范
- 1.1根目录规范
- 1.2.通用组件目录规范
- 1.3.自定义模块、项目目录规范
- 1.4.资源目录规范
- 1.5.文件命名规范
- 1.6.变量命名规范(小写驼峰)
- 1.7.函数命名规范(小写驼峰)
- 1.8.代码规范
- 1.9.参考文档
- 2. 前端编码规范
- 2.1.代码检查工具及常见规范
- 2.2.结构规范及编码逻辑
- 3. 后端编码规范
- 3.1.代码检测工具及常见规范
- 3.2.结构规范及编码逻辑
- 4. 数据库设计规范
- 4.1.参考文档
- 4.2.主流数据库字段命名长度限制
- 4.3.命名规范
- 4.4.使用规范
- 5. 系统运维规范
- 6. 安装部署规范
- 7. 组件版本规范
- 1.目标
- 2.组件概念
- 3.文件格式
- 4.组件规范
- 5.Vue 中函数的使用
- 6.提供组件 API 文档
- 7.使用 mixins
- 8、表单设计规范
- 三、自定义表单组件
- 1.设计思路
- 1.1 解决了哪些痛点
- 1.2 核心思路
- 2.1全局配置
- 2.2双向绑定
- 1.3 如何快速上手
- 2.gis-plugin基础使用说明
- 2.1 观前须知
- 2.2 基础配置
- 3. Form组件
- 3.1 基本使用
- 3.2 API说明
- 2.1 props
- 2.2 events
- 3.3 示例代码
- 3.4 常见问题
- 4.1 gis-tag-form的使用
- 4.2 gis-form配套组件的使用
- 4.2.1 gis-form-table 表单内置表格
- 4.2.2 gis-form-editor 表单内置富文本编辑器
- 4.2.3 gis-form-upload 表单内置上传组件
- 4.3 表单初始化常见问题
- 4.Table组件
- 4.1 基本使用
- 4.2 API说明
- 2.1 props
- 2.2 events
- 4.3 示例代码
- 4.4 常见问题
- 4.1 我有隐藏的查询条件,不在查询框上显示,该怎么办?
- 4.2 通过接口获取到的数据我要进一步做处理,该怎么办?
- 4.3 我使用了render,为什么字典值(dict)就无效了?
- 5.Model组件
- 5.1 基本使用
- 5.2 API说明
- 2.2 prop
- 2.2 events
- 5.3 示例代码
- 5.4 常见问题
- 6.附件上传
- 6.1 附件上传组件
- 6.2 图片上传组件
- 7. 文档处理
- Excel组件(基于POI实现)
- Word组件(基于POI实现)
- Pdf组件(基于POI实现)
- 8. 级联选择表单
- 四、自定义ArcGIS通用工具Exe
- 01. EXE接口说明
- 02. CAD转JSON接口
- 03. SHAPE转JSON接口
- 04. 从工作空间中导出文件
- 05. 从ESRIJSON导出文件
- 06. 坐标转换-ESRIJSON
- 07. 坐标转换-文件
- 08. 数据编辑-ESRIJSON
- 09. 数据编辑-新增-从CAD文件导入
- 10. 数据编辑-删除
- 11. 数据编辑-编辑-从CAD文件编辑
- 12. 面积&长度计算
- 13. 空间分析-ESRIJSON
- 14. 空间分析-工作空间
- 15. 数据编辑-从工作空间中导入
- 16. 空间分析-地图服务(一维)
- 17. 空间分析-地图服务(二维)
- 18. 空间分析-地图服务(多个)
- 19.数据编辑-从CAD文件导入(92坐标系CAD,双图层)
- 20.空间分析-验证是否闭合、是否自相交
- 21.WMF转PDF
- 22.数据统计-地图服务
- 五、项目建设规范
- 六、注意事项
- 七、常见问题
- 八、 WebGIS核心组件库
- 01.后台管理端
- 02.图形端
- 03.移动端
- 04.接口
- 九、工作流开发
- 1.前期工作
- 1.1 禁用Activiti自带登录验证
- 1.2 设置应用部署域名
- 2.流程审批步骤
- 2.1.创建模型
- 2.2.在线流程设计
- 2.3.部署发布
- 2.4.流程配置
- 2.5.流程申请
- 2.6.流程审核
- 3.流程设计demo
- 3.1.一般流程
- 3.2.带条件流程
- 3.3.会签流程
- 4.其他一些开发详解
- 4.1.关于内嵌Activiti在线流程设计器
- 4.2.关于对原框架中流程设计代码的调优
- 4.3.关于DelegateExecution对象的常用方法
- 5.工作流接入文档
- 十、框架更新日志
- 其它
- 代码生成器
- 短信平台管理与接口
- 单据编码管理与接口
- 定时任务管理与接口
- 文件管理与接口
- 地图打印管理与接口
- Excel文件导出接口
- 经典SQL语句
- 多实例运行Redis
- 多数据库操作
- 消息通知管理与接口
- 工作流数据清理
- 其他技术总结
- 发布/订阅功能使用说明
- 学习资料
- 十一、多数据源-dynamic-datasource
- 基础必读
- 连接池集成
- 连接池必读
- 集成Druid
- 集成HikariCP
- 集成BeeCP
- 集成DBCP2
- 集成Jndi
- 第三方集成
- 集成MybatisPlus
- 集成P6spy
- 集成Quartz
- 集成ShardingJdbc
- 进阶使用
- 动态添加移除数据源
- 动态解析数据源
- 数据库加密
- 启动初始化执行脚本
- 自动读写分离
- 懒启动数据源
- 无数据源启动
- 手动切换数据源
- 自定义
- 自定义注解
- 自定义数据源来源
- 自定义负载均衡策略
- 自定义切面
- 事务专栏
- 基础知识
- 本地事务
- seata事务
- 调试源码
- 常见问题
- 不可用版本
- 注意事项
- dynamic-datasource参考资料
