单流程关联多表单

1.场景介绍

以财务报销审批流程为例,在"报销填报"和"财务审核"环节,根据发起人与审核人的身份不同,绑定不同表单。

#2.效果展示

流程发起后不同的活动节点可设置不同的表单状态。

img-ProcessMultiForm-07.png

img-ProcessMultiForm-01.png

img-ProcessMultiForm-02.png

#3.实现思路

流程审批时通过根据场景在不同的活动节点设置不同的表单。

#4.操作步骤

#4.1 报销填报图元设置

  • 创建流程时绑定流程启动表单,拖动右侧图元构建流程图,双击第一个人工图元报销填报(即发起环节),打开图元属性修改弹窗,选择表单tab页,点击在线表单下拉框选择表单,选择表单状态为新增,点击确定关闭弹窗完成报销发起环节表单配置。

    img-ProcessMultiForm-03.png

#4.2 财务归集单填报图元设置

  • 双击财务归集单填报图元,打开图元属性修改弹窗,选择表单tab页,点击在线表单下拉框选择表单,选择表单状态为新增,点击确定关闭弹窗完成财务归集单填报环节表单配置。

    img-ProcessMultiForm-04.png

#4.3 财务审核与财务总监审批图元设置

  • 财务审核与财务总监审批环节图元只需配置报销表单与财务归集表单的查看状态即可完成流程多表单配置。

img-ProcessMultiForm-05.png

img-ProcessMultiForm-06.png

更多请参见EOS Low-Code Platform 8 

### 实现Flowable流程表单与Redis数据关联的方式 在实现Flowable流程表单与Redis数据的关联时,可以结合引用中的信息以及Flowable框架的功能特点来设计解决方案。以下是具体实现方式: #### 1. **使用Redis作为缓存存储表单数据** Redis是一个高性能的键值对存储系统,适合用于缓存和快速读取数据。可以通过以下方式将Flowable表单数据与Redis进行关联: - 在Flowable表单提交时,将表单数据序列化为JSON格式,并存储到Redis中[^3]。 - 使用唯一的任务ID或流程实例ID作为Redis的Key,以便在后续步骤中快速检索表单数据。 - 示例代码如下: ```python import redis import json # 初始化Redis连接 redis_client = redis.StrictRedis(host='localhost', port=6379, db=0) # 表单数据示例 form_data = { "name": "张三", "phone": "1234567890", "employee_id": "E001", "department": "技术部" } # 将表单数据存储到Redis中 task_id = "TASK_12345" # 假设这是任务ID redis_client.set(task_id, json.dumps(form_data)) ``` #### 2. **通过事件监听器捕获表单提交事件** Flowable提供了事件监听器机制,可以在流程的不同阶段捕获事件并执行自定义逻辑。可以通过以下方式捕获表单提交事件并将数据存储到Redis中: - 在Flowable流程定义中配置事件监听器。 - 当表单提交时,触发监听器逻辑,将表单数据存储到Redis中[^2]。 - 示例代码如下: ```java import org.flowable.engine.delegate.TaskListener; import org.flowable.task.service.delegate.DelegateTask; public class FormSubmitListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { // 获取表单数据 String formData = (String) delegateTask.getVariable("formData"); // 将表单数据存储到Redis中 RedisUtil.saveToRedis(delegateTask.getId(), formData); } } ``` #### 3. **在流程中动态加载Redis数据** 当需要在流程中使用之前存储的表单数据时,可以从Redis中动态加载数据: - 使用任务ID或流程实例ID作为Key,从Redis中获取对应的表单数据。 - 将数据解析为Java对象或其他格式以供流程使用。 - 示例代码如下: ```java import redis.clients.jedis.Jedis; public class RedisUtil { public static String getFormData(String taskId) { Jedis jedis = new Jedis("localhost", 6379); return jedis.get(taskId); } } ``` #### 4. **结合分布式锁确保数据一致性** 在分布式环境下,多个节点可能同时访问同一份表单数据。为了确保数据的一致性,可以使用Redis分布式锁: - 在操作Redis数据前,先获取分布式锁。 - 完成操作后释放锁,避免并发冲突。 - 示例代码如下: ```java import redis.clients.jedis.Jedis; public class RedisLockUtil { public static boolean acquireLock(String lockKey, int timeout) { Jedis jedis = new Jedis("localhost", 6379); return "OK".equals(jedis.set(lockKey, "locked", "NX", "EX", timeout)); } public static void releaseLock(String lockKey) { Jedis jedis = new Jedis("localhost", 6379); jedis.del(lockKey); } } ``` #### 5. **使用消息队列实现异步数据同步** 如果需要在多个节点之间同步表单数据,可以结合消息队列(如RabbitMQ、Kafka)实现异步数据同步: - 当表单数据更新时,将更新事件发布到消息队列中。 - 其他节点订阅该消息并更新本地Redis数据。 - 示例代码如下: ```java import com.rabbitmq.client.Channel; public class FormDataProducer { public static void publishUpdateEvent(String taskId, String formData) throws Exception { Channel channel = RabbitMqUtil.createChannel(); channel.basicPublish("", "form-data-update", null, formData.getBytes()); } } ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值