package cn.axzo.workflow.common.model.request.bpmn.process;

import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.Map;

/**
 * 创建流程实例的入参模型
 */
@ApiModel("创建流程实例的入参模型")
@Data
public class BpmnProcessInstanceCreateDTO {

    /**
     * 废弃
     * 流程定义的 id
     */
    @Deprecated
    private String processDefinitionId;
    /**
     * 流程定义的标识
     * <p>
     * [对应业务分类的 businessId]
     */
    @NotEmpty(message = "流程定义的标识不能为空")
    private String processDefinitionKey;

    /**
     * 模型归属租户 ID
     * <p>
     * 为空时,默认是编辑公共流程模型, 如果是代运营创建,则必填
     */
    @ApiModelProperty(value = "发起的模型是属于哪个租户")
    private String tenantId = "";

    /**
     * 流程实例关联的变量
     */
    private Map<String, Object> variables = new HashMap<>();

    /**
     * 待办相关的变量,如路由参数, 模板参数等等
     */
    private Map<String, Object> pendingVariables = new HashMap<>();

    /**
     * 组织关系
     * <p>
     * 用于流程引擎计算对应节点的审批人, 例如第一个审批节点配置的是劳务分包的岗位,第二个审批节点配置的专业分包的角色,
     * 那么, 组织关系就需要传入劳务分包的信息以及专业分包的信息,如果还有更多的审批节点配置,以此类推.
     */
    @ApiModelProperty(value = "组织关系")
    @NotNull(message = "组织关系不能为空")
    private CooperationOrgDTO cooperationOrg;

    /**
     * 业务的唯一标识
     * <p>
     * 例如说，请假申请的编号。通过它，可以查询到对应的实例
     */
    @NotEmpty(message = "业务的唯一标识不能为空")
    private String businessKey;

    @ApiModelProperty(value = "发起人信息")
    @Valid
    @NotNull(message = "发起人不能为空")
    private BpmnTaskDelegateAssigner initiator;

    /**
     * 自定义的流程实例名称, 可为空, 默认使用模型名称
     */
    @ApiModelProperty(value = "自定义的流程实例名称")
    private String customProcessInstanceName;

    /**
     * 是否异步执行
     */
    @ApiModelProperty(value = "是否异步", notes = "异步时,只接收请求便返回数据")
    private Boolean async = true;

    /**
     * 废弃
     * 下级审批人
     */
    //    @ApiModelProperty(value = "下级审批人", notes = "可为空,定义选择审批人,如果不为空,则覆盖下一级任务的审核人")
    //    @Deprecated
    //    private BpmnTaskDelegateAssigner nextApprover;

}
