2

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

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

我还不明白如何让进程与其变量之间的这种 1:n 关系起作用。我需要为每个项目启动子流程吗?还是我必须使用自定义 Java 对象?如果是这样,我如何从任务列表中将表单元素映射到这样的对象?

4

1 回答 1

5

在 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>

有两件事还没有奏效:

  • 字段验证,例如数字字段
  • 添加/删除行时,“保存”按钮上使用的脏标志不会更新
于 2015-08-13T12:53:18.557 回答