SpringBoot集成Flowable_Jsite已办任务菜单报500

JSite 快速开发框架,内置Flowable工作流引擎 · 五大基础模块 · 前后端基础代码自动生成 · 权限精确控制。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

说明:此版本我已经调通,最新版本正在更新,页面未处理好,因此采用历史版本。

一、克隆/打开项目

1.1. 搜索项目

1.2. 复制ssh地址

在这里插入图片描述

1.3. 将项目克隆到本地

git clone git@gitee.com:baseweb/JSite.git

在这里插入图片描述

1.4. idea打开项目JSite

在这里插入图片描述

二、配置项目

2.1. 解决依赖

2.1.1. 配置maven本地仓库

在这里插入图片描述

2.1.2. 配置阿里云镜像地址镜像

在这里插入图片描述

2.2. 切换到历史节点

在这里插入图片描述

 git checkout 47c0d6c8

在这里插入图片描述

2.3. 修改数据库连接信息

  • 前提:在mysql中创建jsite数据库
    在这里插入图片描述

2.4. 初始化数据库脚本

模块数据库脚本
文件模块jsite_file_mysql.sql
代码生成模块jsite_gen_mysql.sql
oa工作流模块jsite_oa_mysql.sql
系统模块jsite_sys_mysql.sql
定时器模块jsite_sys_qrtz_mysql.sql
测试模块jsite_test_mysql.sql
初始化数据jsite-init.sql

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
项目启动后截图:
在这里插入图片描述

2.5. 配置Redis

在这里插入图片描述

2.6. 启动Redis

在这里插入图片描述
双击运行即可
在这里插入图片描述

2.7. 关闭演示模式

2.7.1. 关闭演示模式开关

在这里插入图片描述

2.7.2. 切换正常模式

static/modler/scripts/controllers/processes.js
  • 在119行
    在这里插入图片描述在这里插入图片描述

三、启动项目

3.1. 启动类报错

  • 问题现象
    在这里插入图片描述
  • 问题定位
  • 再启动类中,PropertiesUtils这个工具类是com.jsite.common.io.PropertiesUtils中的类,初步判断是,jsite-common模块没有安装板本地仓库,导致jsite-web项目以来失败。
    在这里插入图片描述
  • 深一步追根溯源
  • 在jsite-web的pom.xml中,依赖了jsite-framework模块
    在这里插入图片描述
  • 进入jsite-framework模块的pom中

在这里插入图片描述
从上面可以看出,我们的初步判断是正确的,那就好解决了,没有安装到本地仓库,那就让我们借助maven打包编译插件帮我们安装jsite-common到本地仓库就好了。

3.2. 重新编译打包

  • 执行命令
mvn clean install -DTests=true

或者
idea插件操作
在这里插入图片描述

演示系统账号密码
jsiteadmin
dept123456
jsitehr123456
jsiteuser123456
  • 部署流程,只能由系统管理员
  • 发起流程:都可以,前提是由系统管理员部署流程成功后,在发起流程的类表中才会显示,然后每个人选择对应的流程,进行节点流转。

说明:上面3个账号角色分别为系统管理员、部门经理、HR,普通员工。
请假流程发起后,流程下一步自动流转到“部门经理”角色账号下,部门经理审批后自动流转到“hr角色账号下”。测试时,需要登录不同角色账号,在代办任务中查看流程代办任务。
在这里插入图片描述

  • 刷新页面即可登陆成功
    在这里插入图片描述

四、请假实战

4.1. 部署流程

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

4.2. 发起流程

在这里插入图片描述在这里插入图片描述在这里插入图片描述

4.3. 已发任务查看

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.4. 部门经理流转

4.4.1. 登录dept账号

在这里插入图片描述

4.4.2. 在待办任务中,签收任务

在这里插入图片描述
在这里插入图片描述

4.4.3. 在待办任务中,办理任务

在这里插入图片描述
响应码500
在这里插入图片描述

  • 请求的url
    在这里插入图片描述
  • 页面传递的参数
    在这里插入图片描述
  • 控制台报错信息提取
    在这里插入图片描述
    在获取代办列表FlowTaskService的104行
    在这里插入图片描述
    在获取代办列表FlowTaskService的105行
e.setProcDefId(pd.getId());

这里需要tProcDefId对吧,程序中写的是从pd中获取,但是里面,没有
在这里插入图片描述
其实这个tProcDefId在task中,因此需要修改代码。
在这里插入图片描述

  • 点击办理,procDefId=undefined
    在这里插入图片描述
    第一步进FlowTaskController的form方法,调用getFormKey的service进行业务处理

在这里插入图片描述
在这里插入图片描述
从上图可以看出很明显,没有获取到procDefId

,清除缓存,再次测试,点击待办任务菜单,debbug看程序,

procDefId=leave:1:b74aaad7-15d6-11ea-9f45-4a5ab6e330e5

在这里插入图片描述
在这里插入图片描述

  • 点击办理
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    很明显获取到值了!!!
    f8跳过,页面又抛出403,权限的错了,真是一波未平一波又起啊。
    在这里插入图片描述
    从页面很明显是没有办理权限,导致403错误,情有可原,对吧,那就给dept用户配置权限呗,
    登录jsite系统管理员账号,给dept用户配置权限
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    角色授权既然是空的,我想静静。看看控制台报错信息再定位问题吧?
    在这里插入图片描述
    从控制台中可以看出,由2条信息比较醒目:
java.lang.ClassNotFoundException: com.jsite.modules.sys.utils.AreaOfficeUtils
at com.jsite.modules.sys.web.RoleController.form(RoleController.java:74)

异常信息很明晰那说AreaOfficeUtils类,RoleController.java:74,既然有文件位置,那咱们就去看看吧,
从以下图中可以看出,通过反射区找 com.jsite.modules.sys.utils.AreaOfficeUtils类,那就在程序中找找有这个类吗?
在这里插入图片描述
程序我是看明白了,他想调用AreaOfficeUtils类的getOfficeList(获取当前用户有权限访问的部门方法),再utils包下就3个工具类,经过查找,UserUtils类中,有getOfficeList(获取当前用户有权限访问的部门方法),那就好办了,类名修改一下即可,再次测试。
在这里插入图片描述
校色授权,就显示了。
在这里插入图片描述
但是,我就不明白了,想获取一个工具类的方法,直接调用不就行了,如果是静态的方法,直接用类名.调用不更方便。代码还写了折磨多行,浪费。
代用的方法和我们预期的一样静态的,那就轻松+快乐了。
在这里插入图片描述
在这里插入图片描述
一行代码就搞定了。哈哈哈!!!
测试一下,好不好使,对吧
在这里插入图片描述
从上图可以看出,也好使。

dept用户的办理权限,我也配置好了,再去待办任务菜单中,去办理任务应该就好了,光预测也不行,测试一下保险。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

任务办理完了,在已办任务菜单中,查看一下任务办理的详情不为过吧,
这里演示以,下面查看当前节点信息,debug断点调试了。
在这里插入图片描述
在这里插入图片描述
其实,也是那个definitionId=undefined导致的,也是由于获取的对象不对,这里我直接修改程序。
在这里插入图片描述
在这里插入图片描述
解决方案:

//修改后的程序
e.setProcDefId(histTask.getProcessDefinitionId());

在这里插入图片描述
再次测试
在这里插入图片描述

任务办理完了,在已办任务(历史)菜单中,查看一下任务办理的节点信息不为过吧,
在这里插入图片描述
其实,也是那个definitionId=undefined导致的,也是由于获取的对象不对,这里我直接修改程序。
在这里插入图片描述
在这里插入图片描述
解决方案:

//修改后的程序
e.setProcDefId(histTask.getProcessDefinitionId());

在这里插入图片描述
再次测试
在这里插入图片描述
下一个节点是hr,同理hr也需要权限
在这里插入图片描述
jsitehr登录
在这里插入图片描述
在待办任务菜单中,先对待办任务进行签收,签收之后进行办理。

在这里插入图片描述
在已办任务菜单中,查看当前节点信息
在这里插入图片描述

在已办任务菜单中,查看详情在这里插入图片描述
节点流转结束了,jsite发起流程的执行人,查看一下历史任务应该吧。
在这里插入图片描述
先追踪一下流程详情
在这里插入图片描述
在这里插入图片描述

很明显又是这个问题,大家应该知道怎末改了吧,
在这里插入图片描述

在这里插入图片描述

再次测试
在这里插入图片描述
在这里插入图片描述

总上,异常现象有2种:

  1. 在待办任务/已办任务/已发任务都会抛出异常,都是由于definitionId=undefined导致的
  2. 由于没有办理权限导致的403
    到此,一个完整的工作流走完了。

补充,在待办任务菜单中会出现2种业务场景,上明只讲了一种,直接在待办任务列表中签收任务,然后办理,已经签收的任务,另外一种情况就是,我还未签收,但是,我想先不签收,先查看一下节点信息和流程详情,也符合业务需要,这样需要在待办任务中添加这种业务场景。

当前属于未签收的业务场景:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解决方案:

	//源程序
	// e.setProcDefId(pd.getId());
	//修改后
	e.setProcDefId(task.getProcessDefinitionId());

在这里插入图片描述
在这里插入图片描述
源码附上:

/**
	 * 获取待办列表
	 * @param procDefKey 流程定义标识
	 * @return
	 */
	public Page<Flow> todoList(Flow act){
		String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId());
		
		Page<Flow> result = new Page<Flow>();
		
		List<Flow> flowList = new ArrayList<Flow>();
		
		// =============== 已经签收的任务  ===============
		TaskQuery todoTaskQuery = taskService.createTaskQuery().taskAssignee(userId).active()
				.includeProcessVariables().orderByTaskCreateTime().desc();
		
		// 设置查询条件
		if (StringUtils.isNotBlank(act.getProcDefKey())){
			todoTaskQuery.processDefinitionKey(act.getProcDefKey());
		}
		if (act.getBeginDate() != null){
			todoTaskQuery.taskCreatedAfter(act.getBeginDate());
		}
		if (act.getEndDate() != null){
			todoTaskQuery.taskCreatedBefore(act.getEndDate());
		}
		
		result.setCount(todoTaskQuery.count());
		// 查询列表
		List<Task> todoList = todoTaskQuery.list();
		for (Task task : todoList) {
			Flow e = new Flow();
			e.setTaskId(task.getId());
			e.setTaskDefKey(task.getTaskDefinitionKey());
			e.setTaskName(task.getName());
			e.setAssignee(task.getAssignee());
			e.setCreateTime(task.getCreateTime());
			e.setExecutionId(task.getExecutionId());
			e.setVars(task.getProcessVariables());
			
			ProcessDefinition pd = ProcessDefCache.get(task.getProcessDefinitionId());
			//源程序
			// e.setProcDefId(pd.getId());
			//修改后
			e.setProcDefId(task.getProcessDefinitionId());
			e.setProcDefname(pd.getName());
			e.setProcDefKey(pd.getKey());
			e.setProcDefversion(pd.getVersion());
			
			e.setProcInsId(task.getProcessInstanceId());
			e.setStatus("todo");
			flowList.add(e);
		}
		
		// =============== 等待签收的任务  ===============
		TaskQuery toClaimQuery = taskService.createTaskQuery().taskCandidateUser(userId)
				.includeProcessVariables().active().orderByTaskCreateTime().desc();
		
		// 设置查询条件
		if (StringUtils.isNotBlank(act.getProcDefKey())){
			toClaimQuery.processDefinitionKey(act.getProcDefKey());
		}
		if (act.getBeginDate() != null){
			toClaimQuery.taskCreatedAfter(act.getBeginDate());
		}
		if (act.getEndDate() != null){
			toClaimQuery.taskCreatedBefore(act.getEndDate());
		}
		
		// 查询列表
		List<Task> toClaimList = toClaimQuery.list();
		for (Task task : toClaimList) {
			Flow e = new Flow();
			e.setTaskId(task.getId());
			e.setTaskDefKey(task.getTaskDefinitionKey());
			e.setTaskName(task.getName());
			e.setAssignee(task.getAssignee());
			e.setCreateTime(task.getCreateTime());
			e.setExecutionId(task.getExecutionId());
			e.setVars(task.getProcessVariables());
			
			ProcessDefinition pd = ProcessDefCache.get(task.getProcessDefinitionId());
			//源程序
			// e.setProcDefId(pd.getId());
			//修改后
			e.setProcDefId(task.getProcessDefinitionId());
			e.setProcDefname(pd.getName());
			e.setProcDefKey(pd.getKey());
			e.setProcDefversion(pd.getVersion());
			
			e.setProcInsId(task.getProcessInstanceId());
			e.setStatus("claim");
			flowList.add(e);
		}
		logger.info("==FLOWABLE LIST=="+JsonMapper.toJsonString(flowList));
		result.setList(flowList);
		return result;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gblfy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值