# 1.产品使用手册

# 1.1.入口说明

# 1.2.功能说明

# 1.2.1.流程管理

流程管理的添加、删除、发布、撤销等操作,都需在第三方认证应用开发列表页中,点击对应应用的【进入控制台】--【流程中心组件】--【流程设计】中进行操作。

work

work2

1.2.1.1.添加流程

第⑥步不同节点说明: 1、流程节点:

基础信息

节点名称:流程的节点名称信息 审批意见:当前审批节点,审批意见的填写与否的选中。必填,审批时审批意见需填写后才能提交;非必填,审批时审批意见可填写,也可不填写。不显示,审批时,审批意见输入框隐藏;拒绝、退回必填,审批选中拒绝或者退回时必须填写意见。 节点打印:当前节点是否添加打印按钮。 审批类型:单人审批,当前节点只需一个人审批即可完成;会签,多人审批需多人都审批通过;或签,多人审批时,有一人审批完成即可。 审批人甚至:按用户审批,添加要审批的用户信息。按角色审批,添加审批的角色信息;按部门审批,添加审批的部门信息。

权限设置 别名:点击对应别名的编辑按钮,可修改审批按钮的名称。 节点权限,当前节点是否有该按钮权限。 允许刘表操作,当前节点的对应的审批按钮,是否展示在列表页中的操作列中。

业务事件 触发动作:添加触发器,设置触发动作。

超时提醒:设置审批结点的超时提醒配置

2、分支条件,用于设置审批的分支条件信息
第⑦步不同按钮说明: 保存流程图:保存流程但不发布,流程状态属于未发布状态。 保存并发布流程图:保存流程且发布,流程状态属于已发布状态。

1.2.1.2.删除流程
点击待删除流程的删除按钮。流程状态为未发布的才可删除。

1.2.1.3.发布流程
流程状态为未发布的流程,可进行发布操作。发布成功后对应表单自动添加流程。


1.2.1.4.撤销流程
已发布流程,可进行撤销操作。撤销后绑定流程的表单将自动解绑流程。

# 1.2.2 设计流程

1.2.2.1.基础信息
基础信息
节点名称:流程的节点名称信息
审批意见:当前审批节点,审批意见的填写与否的选中。必填,审批时审批意见需填写后才能提交;非必填,审批时审批意见可填写,也可不填写。不显示,审批时,审批意见输入框隐藏;拒绝、退回必填,审批选中拒绝或者退回时必须填写意见。
节点打印:当前节点是否添加打印按钮。
审批类型:单人审批,当前节点只需一个人审批即可完成;会签,多人审批需多人都审批通过;或签,多人审批时,有一人审批完成即可。
审批人甚至:按用户审批,添加要审批的用户信息。按角色审批,添加审批的角色信息;按部门审批,添加审批的部门信息。


1.2.2.2.权限设置
权限设置
别名:点击对应别名的编辑按钮,可修改审批按钮的名称。
节点权限,当前节点是否有该按钮权限。
允许刘表操作,当前节点的对应的审批按钮,是否展示在列表页中的操作列中。


1.2.2.3.业务事件

1.2.2.3.1.触发动作
业务事件
触发动作:添加触发器,设置触发动作。




1.2.2.3.2.超时提醒
超时提醒:设置审批结点的超时提醒配置

# 2.后端集成说明(程洋)

# 2.1.数据库设计

业务表中需要先添加这五个字段,为接入做准备。

PROCESS_INSTANCE_ID varchar(255) DEFAULT NULL COMMENT '流程实例id', TASK_ID varchar(255) DEFAULT NULL COMMENT '任务id', TASK_NAME varchar(255) DEFAULT NULL COMMENT '节点名称', CANDIDATE_USER varchar(255) DEFAULT NULL COMMENT '候选人员', CANDIDATE_ROLE varchar(255) DEFAULT NULL COMMENT '候选角色',

# 2.2.实体类说明

实体类额外加入几个字段
注意:成员变量authority名称不能修改

@TableField(exist = false)
@ApiModelProperty(value = "节点权限", required = false)
private TaskAuthority authority;


/**
* 流程实例id
*/
@TableField(strategy = FieldStrategy.IGNORED)
@ApiModelProperty(value = "流程实例id", required = false)
private String processInstanceId;
/**
* 任务id
*/
@TableField(strategy = FieldStrategy.IGNORED)
@ApiModelProperty(value = "任务id", required = false)
private String taskId;
/**
* 任务名称
*/
@TableField(strategy = FieldStrategy.IGNORED)
@ApiModelProperty(value = "任务名称", required = false)
private String taskName;
/**
* 审批人
*/
@TableField(strategy = FieldStrategy.IGNORED)
@ApiModelProperty(value = "审批人", required = false)
private String candidateUser;
/**
* 审批角色
*/
@TableField(strategy = FieldStrategy.IGNORED)
@ApiModelProperty(value = "审批角色", required = false)
private String candidateRole;

/**
* 审批参数
*/
@TableField(exist = false)
@ApiModelProperty(value = "审批参数", required = false)
private TaskCompleteVo processParam;

# 2.3.能力调用

# 2.3.1.发起流程

2.3.1.1.说明
业务数据接入并发起一条工作流
2.3.1.2.包名方法名
com.bywin.activiti.api.RemoteActivitiService#taskAction
@PostMapping("/workFlow/taskAction")
R<TaskMeta> taskAction(@RequestBody TaskCompleteVo taskCompleteVo);

2.3.1.3.参数说明
需要传递的流程的参数:

procDefKey: 流程唯一标识
action: 0 保存成草稿   9 提交
assigneeList   下一节点审批人
ccList	抄送人员工号
variables  流程分支变量
businessKey	必填    命名格式为 模块缩写:业务id
2.3.1.4.代码实例
//发起流程审批
TaskCompleteVo processParam = tGxxxzxKycgglXshy.getProcessParam();
processParam.setId(tGxxxzxKycgglXshy.getId());
processParam.setBusinessKey("kyxshy:" + tGxxxzxKycgglXshy.getId());
processParam.setCcList(ccList);
Map<String, Object> variables = new HashMap<>();
variables.put("lx", "kyxshy");
processParam.setVariables(variables);
kycgService.taskAction(processParam);

/**
* 审批:1. 通过 2.拒绝 3.撤回 4.退回 5.转发 0.草稿
*/
@Override
public R<String> taskAction(TaskCompleteVo taskCompleteVo) {
    TGxxxzxKycgglXshy info = getById(taskCompleteVo.getId());
    R<TaskMeta> ret = activitiService.taskAction(taskCompleteVo);
    if (ret.getCode() != 0) {
        return R.fail(ret.getMsg());
    }
    // 获取当前节点的审批信息,存储到业务表中
    TaskMeta taskMeta = ret.getData();
    BeanUtil.copyBeanProp(info, taskMeta);
    updateById(info);
    return R.ok();
}

# 2.3.2.审批流程

2.3.2.1.说明
审批某条流程:传入对应的参数进行审批,接口返回审批完成后的节点信息(审批人/节点名称等),再将其设置到业务表中进行存储
2.3.2.2.包名方法名
com.bywin.activiti.api.RemoteActivitiService#taskAction
@PostMapping("/workFlow/taskAction")
R<TaskMeta> taskAction(@RequestBody TaskCompleteVo taskCompleteVo);

2.3.2.3.参数说明
需要传递的流程字段:
// 发起:    assigneeList action procDefKey ccList  variables  businessKey startUsername
// 同意/拒绝    id  taskId  comment assigneeList    action
// 撤回       id  taskId  action
// 退回       id  taskId  action  assigneeList

实体类:
public class TaskCompleteVo implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty("业务表id")
    private Long id;
    @ApiModelProperty("任务id")
    private String taskId;
    @ApiModelProperty("审批意见")
    private String comment;
    @ApiModelProperty("下一审批人")
    private List<String> assigneeList;
    @ApiModelProperty("审批动作(1. 通过 2.拒绝 3.撤回 4.退回 5.转发 9.提交 0.保存)")
    private Integer action;
    @ApiModelProperty("退回到的任务节点")
    private String rejectTaskKey;
    @ApiModelProperty("流程key")
    private String procDefKey;
    @ApiModelProperty("抄送列表工号")
    private List<String> ccList;
    @ApiModelProperty("实例id")
    private String processInstanceId;
    @ApiModelProperty("转发给的用户职工号")
    private String forwardName;
    @ApiModelProperty("流程分支变量")
    private Map<String, Object> variables;
    @ApiModelProperty("工作流查询业务表的标识   格式  标识:业务表id    例 xshy:1")
    private String businessKey;
    @ApiModelProperty("发起用户工号,不传默认为当前登陆用户")
    private String startUsername;
    @ApiModelProperty("表单信息")
    private DynamicFormVo dynamicFormVo;
    @ApiModelProperty("操作人员工号")
    private String operUsername;
    @ApiModelProperty("是否直接结束")
    private Boolean finish;
    @ApiModelProperty("是否异步")
    private Boolean async;
    @ApiModelProperty("异步处理获取数据标识")
    private String processingNo;
    @ApiModelProperty("当前处理用户")
    private LoginUser loginUser;

    private Boolean result;
    @ApiModelProperty("api应用标识")
    private String appKey;
    @ApiModelProperty("应用id")
    private String clientId;


    @ApiModelProperty("电子签章数据")
    private ActDynamicFormSignatureVo signature;
}

2.3.2.4.代码实例
/**
* 审批:1. 通过 2.拒绝 3.撤回 4.退回 5.转发 0.草稿
*/
@Override
public R<String> taskAction(TaskCompleteVo taskCompleteVo) {
    TGxxxzxKycgglXshy info = getById(taskCompleteVo.getId());
    R<TaskMeta> ret = activitiService.taskAction(taskCompleteVo);
    if (ret.getCode() != 0) {
        return R.fail(ret.getMsg());
    }
    // 获取当前节点的审批信息,存储到业务表中
    TaskMeta taskMeta = ret.getData();
    BeanUtil.copyBeanProp(info, taskMeta);
    updateById(info);
    return R.ok();
}

# 2.3.3.列表查询

2.3.3.1.说明
列表查询
先查询出登陆用户待办已办的流程实例id,再根据任务实例ids在业务表中进行筛选得到列表数据

2.3.3.2.包名方法名
com.bywin.activiti.api.RemoteActivitiService#listYw
/**
* 查询列表
*
* @param params listType:  1.待办 2.已办 3.关于我的 4.我的发起
*               params typeName:  流程类型
*               params pageNum
*               params pageSize
*/
@GetMapping("/workFlow/listYw")
R<List<String>> listYw(@RequestParam Map<String, Object> params);

2.3.3.3.参数说明
listType:  1.待办 2.已办 3.关于我的 4.我的发起

2.3.3.4.代码实例
注解版(推荐)
注意:value = "表源授权申请" 这个值是流程分类名

@WorkFlowList(value = "表源授权申请", authority = false)
@Override
public TableDataInfo<?> authedList(Map<String, Object> params) {
    QueryWrapper<TableSourceAuthApply> qw = new QueryWrapper<>();
                .in(params.get(FlowConstants.PROCESS_INSTANCE_IDS_FIELD) != null && !((ArrayList) params.get(FlowConstants.PROCESS_INSTANCE_IDS_FIELD)).isEmpty(), "PROCESS_INSTANCE_ID", (ArrayList) params.get(FlowConstants.PROCESS_INSTANCE_IDS_FIELD));

    IPage<TableSourceAuthApply> page = page(
            new Query<TableSourceAuthApply>().getPage(params),
            qw
    );
    return new TableDataInfo<>(page);
}

普通版(旧版)
params.put("typeName","学术会议审批");
List<TaskListYwVo> taskList = activitiService.listYw(params).getData();
List<String> processInstanceIds = taskList.stream().map(TaskListYwVo::getProcessInstanceId).collect(Collectors.toList());
params.put("processInstanceIds", processInstanceIds);

# 2.3.4.列表查询 带出工作流节点权限

2.3.4.1.说明
列表数据 批量带出每条数据的工作流节点权限
2.3.4.2.包名方法名
无
2.3.4.3.参数说明(实体类字段说明)
public class TaskAuthority implements Serializable {

    @ApiModelProperty("审批")
    private Boolean canApproval;
    @ApiModelProperty("撤回")
    private String canChe;
    @ApiModelProperty("退回")
    private String canTui;
    @ApiModelProperty("重新发起")
    private String canAgain;
    @ApiModelProperty("加签")
    private String canAddSign;
    @ApiModelProperty("编辑")
    private String canEdit;
    @ApiModelProperty("转发")
    private String canForward;
    @ApiModelProperty("抄送")
    private String canCc;
    @ApiModelProperty("通过")
    private String canPass;
    @ApiModelProperty("拒绝")
    private String canRefuse;
    @ApiModelProperty("列表审批")
    private String canListApproval;
    @ApiModelProperty("是否可以打印,默认为是")
    private Boolean print = Boolean.TRUE;

}

2.3.4.4.代码实例
注解版
authority = true

@WorkFlowList(value = "表源授权申请", authority = true)
@Override
public TableDataInfo<?> authedList(Map<String, Object> params) {
    QueryWrapper<TableSourceAuthApply> qw = new QueryWrapper<>();
                .in(params.get(FlowConstants.PROCESS_INSTANCE_IDS_FIELD) != null && !((ArrayList) params.get(FlowConstants.PROCESS_INSTANCE_IDS_FIELD)).isEmpty(), "PROCESS_INSTANCE_ID", (ArrayList) params.get(FlowConstants.PROCESS_INSTANCE_IDS_FIELD));

    IPage<TableSourceAuthApply> page = page(
            new Query<TableSourceAuthApply>().getPage(params),
            qw
    );
    return new TableDataInfo<>(page);
}


普通版

# 2.3.5.单条查询 带出工作流节点权限校验

2.3.5.1.说明
查询目前某条数据的节点工作流权限

2.3.5.2.包名方法名
com.bywin.activiti.api.RemoteActivitiService#authority
@PostMapping("/workFlow/authority")
R<TaskAuthority> authority(@RequestParam(FlowConstants.PROCESS_INSTANCE_ID_FIELD) String processInstanceId,
                        @RequestParam(FlowConstants.KEY_LIST_TYPE) Object listType);

2.3.5.3.参数说明(实体类字段说明)
public class TaskAuthority implements Serializable {

    @ApiModelProperty("审批")
    private Boolean canApproval;
    @ApiModelProperty("撤回")
    private String canChe;
    @ApiModelProperty("退回")
    private String canTui;
    @ApiModelProperty("重新发起")
    private String canAgain;
    @ApiModelProperty("加签")
    private String canAddSign;
    @ApiModelProperty("编辑")
    private String canEdit;
    @ApiModelProperty("转发")
    private String canForward;
    @ApiModelProperty("抄送")
    private String canCc;
    @ApiModelProperty("通过")
    private String canPass;
    @ApiModelProperty("拒绝")
    private String canRefuse;
    @ApiModelProperty("列表审批")
    private String canListApproval;
    @ApiModelProperty("是否可以打印,默认为是")
    private Boolean print = Boolean.TRUE;

}

2.3.5.4.代码实例
TGxxxzxKycgglRjzzqVo info = tGxxxzxKycgglRjzzqService.getRjzzqInfo(id);
R<TaskAuthority> authority = activitiService.authority(info.getProcessInstanceId(), FlowList.ALL.getCode());
if (authority != null) {
    TaskAuthority authorityData = authority.getData();
    info.setAuthority(authorityData);
} else {
    TaskAuthority authorityData = new TaskAuthority();
    authorityData.setCanEdit("true");
    info.setAuthority(authorityData);
}
return R.ok(info);

# 2.3.6.删除流程数据

2.3.6.1.说明
删除某条工作流
2.3.6.2.包名方法名
com.bywin.activiti.api.RemoteActivitiService#delTask
@PostMapping("/workFlow/delTask")
R<TaskMeta> delTask(@RequestParam(FlowConstants.PROCESS_INSTANCE_ID_FIELD) String processInstanceId);
2.3.6.3.参数说明
processInstanceId 流程示例id
2.3.6.4.代码实例
for (Long id : ids) {
    TJwCjglCjbgsq info = getById(id);
    activitiService.delTask(info.getProcessInstanceId());
}

# 2.3.7.流程设置本部门筛选

若使用本部门过滤查询,在查询审批人的接口,/chooseAssignee  提交的参数formData需要添加 dept_id,查询角色在该部门下的数据,若提交参数中不存在dept_id,那么当前用户的主部门将会作为本部过滤条件进行查询
例如:
{
"procDefKey": "_3d0c3b07-f652-419d-b2c2-063aef5e38d5",
 "formData": {
        "dept_id":"17999"
    }
}

# 3.前端集成说明(花姐)

3.1.工作流审批弹框
src/components/activiti/ApprovalModal.vue(代码位置)


3.2.工作流审批按钮
src/components/activiti/ApprovalButtons.vue
3.3.工作流审批流程
src/components/activiti/ApprovalProcess.vue
3.4.代码示例
src/components/activiti/ApprovalProcess.vue

# 4.常见问题说明