1.7.2. 合同编辑界面控制器

打开 ContractEdit 界面控制器,并使用以下代码替换其内容:

package com.company.bpmdemo.web.contract;

import com.haulmont.bpm.entity.ProcAttachment;
import com.haulmont.bpm.gui.procactionsfragment.ProcActionsFragment;
import com.haulmont.cuba.gui.app.core.file.FileDownloadHelper;
import com.haulmont.cuba.gui.components.Table;
import com.haulmont.cuba.gui.model.CollectionLoader;
import com.haulmont.cuba.gui.model.InstanceContainer;
import com.haulmont.cuba.gui.model.InstanceLoader;
import com.haulmont.cuba.gui.screen.*;
import com.company.bpmdemo.entity.Contract;

import javax.inject.Inject;

@UiController("demo_Contract.edit")
@UiDescriptor("contract-edit.xml")
@EditedEntityContainer("contractDc")
public class ContractEdit extends StandardEditor<Contract> {
    private static final String PROCESS_CODE = "contractApproval";

    @Inject
    private CollectionLoader<ProcAttachment> procAttachmentsDl;

    @Inject
    private InstanceContainer<Contract> contractDc;

    @Inject
    protected ProcActionsFragment procActionsFragment;

    @Inject
    private Table<ProcAttachment> attachmentsTable;

    @Inject
    private InstanceLoader<Contract> contractDl;

    @Subscribe
    private void onBeforeShow(BeforeShowEvent event) {
        contractDl.load();
        procAttachmentsDl.setParameter("entityId",contractDc.getItem().getId());
        procAttachmentsDl.load();
        procActionsFragment.initializer()
                .standard()
                .init(PROCESS_CODE, getEditedEntity());

        FileDownloadHelper.initGeneratedColumn(attachmentsTable, "file");
    }
}

我们详细了解一下控制器代码。

ProcessActionsFragment 是显示用户当前可用的流程操作的 fragment。在初始化时,fragment 通过两个参数搜索相关的 ProcInstance 对象:流程代码和实体实例。如果未找到 ProcInstance 对象,则创建一个新实例,该界面显示开始流程按钮。如果找到相关的流程实例,则 fragment 将搜索当前用户的未完成的流程任务,并显示流程任务的操作按钮。有关详细信息,请参阅 ProcActionsFragment

在合同编辑界面中,流程操作 fragment 的初始化在 onBeforeShow() 方法中执行。该方法的关键部分是调用 init(PROCESS_CODE, getEditedEntity())PROCESS_CODE 保存了一个流程代码(contractApproval - 我们在模型部署期间看到了这个值,参阅(流程模型部署)。第二个参数 getEditedEntity() 是当前合同实体实例。

standard() 方法返回的初始化器执行以下操作:

  • 初始化标准流程操作断言(predicate),这个断言在流程启动前和流程任务完成之前调用。断言提交实体编辑界面。

  • 初始化标准监听器,用于显示 "流程开始" 或 "任务完成" 等通知,并在流程启动或流程任务完成后刷新 procActionsFragment