当前位置: 首页 > 知识库问答 >
问题:

如何在Camunda中处理可变数量的过程变量

饶明亮
2023-03-14

我是Camunda的新手,没有找到任何教程或参考来解释如何实现以下目标:

当开始一个过程时,我希望用户在发票中添加任意数量的项目。在下一个用户任务中,所有这些项目及其数量都应该打印给批准数据的人。

我还不知道如何在一个过程和它的变量之间建立1:n的关系。我需要为每个项目启动子流程吗?或者我必须使用自定义Java对象吗?如果是这样,我如何从任务列表中将表单元素映射到这样的对象?

共有1个答案

严峰
2023-03-14

我在Thorben提供的链接的帮助下工作。

诀窍是使用JSON过程变量来存储更复杂的数据结构。我在我的“开始事件”中初始化此类列表。这可以在表单中完成,也可以在我的情况下在侦听器中完成:

execution.setVariable("items", Variables.objectValue(Arrays.asList(dummyItem)).serializationDataFormat("application/json").create());

请注意,我添加了一个DummyItem,因为空列表在序列化过程中会丢失其类型信息。

接下来,在我的自定义表单中,我加载这个列表,并可以添加/删除项目。使用camForm回调可以持久化列表。

<form role="form" name="form">
    <script cam-script type="text/form-script">
    /*<![CDATA[*/
    $scope.items = [];

    $scope.addItem = function() {
        $scope.items.push({name: '', count: 0, price: 0.0});
    };

    $scope.removeItem = function(index) {
        $scope.items.splice(index, 1);
    };

    camForm.on('form-loaded', function() {
        camForm.variableManager.fetchVariable('items');
    });

    // variables-fetched is not working with "saved" forms, so we need to use variables-restored, which gets called after variables-fetched
    camForm.on('variables-restored', function() {
        $scope.items = camForm.variableManager.variableValue('items');
    });

    camForm.on('store', function() {
        camForm.variableManager.variableValue('items', $scope.items);
    });
    /*]]>*/
    </script>


    <table class="table">
        <thead>
            <tr><th>Name</th><th>Count</th><th>Price</th><th></th></tr>
        </thead>
        <tbody>
            <tr ng-repeat="i in items">
                <td><input type="text" ng-model="i.name"/></td>
                <td><input type="number" ng-model="i.count"/></td>
                <td><input type="number" ng-model="i.price"/></td>
                <td>
                    <button class="btn btn-default" ng-click="removeItem($index)">
                        <span class="glyphicon glyphicon-minus"></span>
                    </button>
                </td>
            </tr>
        </tbody>
        <tfoot>
            <tr>
                <td colspan="4">
                    <button class="btn btn-default" ng-click="addItem()">
                        <span class="glyphicon glyphicon-plus"></span>
                    </button>
                </td>
            </tr>
        </tfoot>
    </table>

</form>

有两件事尚不奏效:

  • 字段验证,例如数字字段
  • 添加/删除行时,“保存”按钮上使用的脏标志不会更新
 类似资料:
  • 在阅读(https://docs.camunda.org/manual/7.5/user-guide/process-engine/variables/)时,我不知道如何检索变量? 目前,我正在努力找出如何访问以前设置的过程变量。我尝试的是: 我有一个简单的bpmn流程,其中有start事件、1个服务任务和end事件,我通过传递2个变量(a&B)来启动我的流程,我的服务任务实现如下java类: 有

  • 当我呈现视图时,是,因为是我这样插入它。 如果我提交表单,我将执行以下处理程序: 所以基本上我总是要添加一个`stopmessage,不管是成功还是失败。 如何检索设置到另一个处理程序中的属性值?用胸腺嘧啶有可能吗? 注意:暂时,我将设置为控制器类的一个字段,并在处理程序周围设置/not null,以便始终能够看到它的值。这是一个解决办法,但似乎不是正确的做法。因为我是个新手,所以我很乐意听到处理

  • 在camunda rest api中,有一种方法可以一次性删除所有流程实例变量。 如果我添加了一个变量id,我可以一个接一个地删除,但这不是我想要的。 谢谢

  • 主要内容:命令行参数,set命令,使用数字值,局部与全局变量,使用环境变量批处理文件中有两种类型的变量。 其中一个参数是在调用批处理文件时可以传递的参数,另一个是通过命令完成的。 命令行参数 批处理脚本支持命令行参数的概念,其中参数可以在被调用时传递给批处理文件。参数可以通过变量,,等从批处理文件中调用。 以下示例显示了一个批处理文件,它接受3个命令行参数,并将它们回显到命令行屏幕。 如果上面的批处理脚本存储在一个名为的文件中,我们将运行该批处理 - 以下是批处理文件执

  • 我想在独占网关检查processInstance是否存在。我可以检查processInstance的值是否设置为null。

  • 问题内容: 我想知道是否存在一种实现类似于map getter的功能的方法:它返回返回值作为第一个参数,(可选地分配)第二个值作为第二个参数。因此,我需要可以通过以下方式调用的函数: 问题答案: 不,它无法完成,唯一的选择是返回一个指针并检查它是否为nil。