企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
# 在项目中如何接入工作流 ## 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 } ] ```