Flowable 外部表单

news/2025/1/16 6:45:01/
  • 内置表单需要在每个节点中去配置,当如果多个节点使用同一套表单属性就要配置多次比较麻烦,修改的时候也要修改多次,外部表单可以定义一次,然后其它节点都去引用同一个表单属性。

  • 外部表单需要定义一个.form后缀的文件。

  • 外部表单不需要在每个节点去指定From属性,而是在每个节点指定Form Key属性即可。

在这里插入图片描述

定义.form

FormLeaveProcess.form

{"key":"FormLeaveProcess","name": "请假流程外部表单","fields": [{"id": "startTime","name": "请假开始时间","type": "date","required": true,"placeholder": "empty"},{"id": "endTime","name": "请假结束时间","type": "date","required": true,"placeholder": "empty"},{"id": "reason","name": "请假原因","type": "string","required": false,"placeholder": "empty"}]
}

配置Form Key

在这里插入图片描述

部署流程和部署表单

@Autowired
private RepositoryService repositoryService;@Autowired
private FormRepositoryService formRepositoryService;@Test
void deployFormProcess() {// 1.部署流程Deployment deploy = repositoryService.createDeployment().addClasspathResource("processes/FormLeaveProcess.bpmn20.xml").name("外部表单请假流程").deploy();// 2.部署表单formRepositoryService.createDeployment().addClasspathResource("processes/FormLeaveProcess.form").name("请假流程外部表单").parentDeploymentId(deploy.getId()).deploy();
}

在这里插入图片描述

在这里插入图片描述

启动流程

@Autowired
private RuntimeService runtimeService;@Test
void startProcess() {String processDefinitionId = "FormLeaveProcess:2:48920686-8145-11ee-b7ee-0a0a3d6982e3";runtimeService.startProcessInstanceWithForm(processDefinitionId, "表单请假流程outcome", null, "huihui的请假流程");
}

请添加图片描述

完成表单任务

@Test
void completeFormTask() {Map<String, Object> variables = new HashMap<>();variables.put("startTime", "20221111");variables.put("endTime", "20231110");variables.put("reason", "活着不是为了工作,工作是为了活得更有意义");String taskId = "0f273f73-8149-11ee-b15c-0a0a3d6982e3";String formDefinitionId = "652cb868-8145-11ee-a2f0-0a0a3d6982e3";taskService.completeTaskWithForm(taskId, formDefinitionId, "huihui", variables);
}

在这里插入图片描述

获取任务对应的表单数据

@Test
void getTaskFormData() {FormInfo taskFormModel = taskService.getTaskFormModel("0f273f73-8149-11ee-b15c-0a0a3d6982e3");System.out.println(taskFormModel.getId() + "-" + taskFormModel.getName() + "-" + taskFormModel.getKey());SimpleFormModel simpleFormModel = (SimpleFormModel)taskFormModel.getFormModel();List<FormField> fields = simpleFormModel.getFields();for (FormField field : fields) {System.out.println(field.getId() + ":" + field.getType() + ":" + field.getName() + ":" + field.getValue());}
}

在这里插入图片描述


http://www.ppmy.cn/news/1212834.html

相关文章

C++自动注册的工厂与--whole-archive

上篇文章《静态库和链接选项--whole-archive》提到--whole-archive的一个应用场景&#xff1a;C自动注册的工厂&#xff0c;这篇文章来填坑。 预备知识 我们经常用工厂类或工厂方法统一管理资源&#xff0c;实现资源的创建和使用之间的解耦&#xff0c;调用者无需关心资源创建的…

使用Nodejs搭建简单的Web网页并实现公网访问

目录 前言 1. 安装Node.js环境 2. 创建Node.js应用 3. 安装Cpolar内网穿透实现公网访问Nodejs服务 3.1 注册cpolar账号 3.2 下载cpolar客户端 3.3 创建隧道映射本地端口 4. 固定公网远程地址 前言 Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架…

springboot全局拦截sql异常

起因:非法用户可通过特定的输入(如输入内容超长)等操作,使后台逻辑发生错误,从而使后台sql语句暴露至前台,进而为sql攻击提供条件 处理流程:经查找com.mysql.cj.jdbc.exceptions的父类为SQLException,在全局异常处理类中增加如下配置,经测试不起作用 ExceptionHandler(SQLExce…

【数据库】【sql】如何用SQL实现跨行计算

【背景】 这里的跨行计算不是指整体聚合类的函数比如SUM等的功能&#xff0c;而是指递归算法。 比如我接到有需求&#xff0c;有一个结果字段需要是目前所有行该字段的和&#xff0c;这是属于递归类的算法&#xff0c;SQL中如何实现呢&#xff1f; 【方法】 可以使用窗口函数…

xsschallenge通关攻略详解

xsschallenge通过攻略 文章目录 xsschallenge通过攻略第一关第二关第三关第四关第五关第六关第七关第八关第九关第十关第十一关第十二关第十三关 简述 xsschallenge挑战攻略 ps: 终极测试代码 <sCr<ScRiPt>IPT>OonN"\/(hrHRefEF)</sCr</ScRiPt>IPT&g…

gma 2.0.3 (2023.11.12) 更新日志

安装 gma 2.0.3 pip install gma2.0.3新增 此版本为 gma 2 功能更新最大的版本&#xff0c;且主要集中在矢量数据处理上。 0.1 io.ReadVector&#xff1a;直接打开矢量数据为Layer&#xff0c;用以简化io.Open.GetLayer 过程。Layer的新增功能如下&#xff1a; 序号功能性质说…

【见缝插针】射击类游戏-微信小程序项目开发流程详解

还记得小时候玩过的见缝插针游戏吗&#xff0c;比一比看谁插得针比较多&#xff0c;可有趣了&#xff0c;当然了&#xff0c;通过它可以训练自己的手速反应&#xff0c;以及射击水平&#xff0c;把握时机&#xff0c;得分越高就越有成就感&#xff0c;相信小朋友们会喜欢它的&a…

数据库加密的常用方法 安当加密

数据库加密的方法主要有以下几种&#xff1a; 前置代理及加密网关技术&#xff1a;在数据库之前增加一道安全代理服务&#xff0c;对数据库访问的用户都必须经过该安全代理服务&#xff0c;在此服务中实现如数据加解密、存取控制等安全策略。加密数据存储在安全代理服务中。但…