引入
当我们流程启动后,会产生对应私人任务或公有任务,只要对应的办理者或候选人,查看任务后,进行认领,办理等操作。整个流程才能走完。我们先来看查看任务。
分析
当用户登录系统后,要有个地方查询自己的任务,这时我们专门准备一个菜单来展示任务,当然任务又分私人任务和公有任务。需要区分对待。
1、提供一个“任务管理”的一级菜单,在该菜单下面有“待办任务(私人任务)”和“可接任务(公共任务)”
2、需要通过Controller跳转页面
3、每个二级菜单需要调整一个管理界面
实现
菜单:
菜单,Controller,页面
列表:
返回值List
注意:在CommonUtil中针对任务创建日期的创建日期做格式化。
跳转到代办任务首页
核心代码如下:
//跳转到待办任务的管理界面
///workFlow/personalTask/index
@RequestMapping("/personalTask/index")
public String personalTask()
{
return "workFlow/personalTask";
}
查询代办任务列表
代码如下:
@RequestMapping("/listPersonalTasks")
@ResponseBody
public List<Map<String,Object>> listPersonalTasks() {
//把Session里面用户传入Service,降低Service与web层耦合
String assignee = UserContext.getUser().getNickname();
return workFlowService.listPersonalTasks(assignee);
}
service层代码:
@Override
public List<Map<String, Object>> listPersonalTasks(String assignee) {
//创建查询对象
TaskQuery query = taskService.createTaskQuery();
//设置查询条件
query.taskAssignee(assignee);
query.orderByProcessDefinitionId().desc();//相同规则放到一起
query.orderByTaskCreateTime().desc();//按时间倒序
//做查询-List<Task>
List<Task> list = query.list();
//声明要返回类型
List<Map<String, Object>> result = new ArrayList<>();
//转换
for (Task task : list) {
//一个task就是一个map
result.add(task2map(task));
}
//返回
return result;
}
private Map<String, Object> task2map(Task task) {
Map<String, Object> obj2map = CommUtil
.obj2map(task, new String[] { "id", "name", "assignee", "createTime", "description" });
//为了构造动态表单,需要将formKey businessObjType businessObjId这三个参数和task属性一起返回
obj2map.put("businessObjType", getBusinessObjType(task));
obj2map.put("businessObjId", getBusinessObjId(task));
obj2map.put("formKey", getFormKey(task));
return obj2map;
}
private String getFormKey(Task task) {
String formKey = task.getFormKey();
return formKey;
}
private Long getBusinessObjId(Task task) {
return taskService.getVariable(task.getId(), "businessObjId", Long.class);
}
private String getBusinessObjType(Task task) {
String businessObjType = taskService.getVariable(task.getId(), "businessObjType", String.class);
businessObjType = businessObjType.substring(0, 1).toLowerCase()+businessObjType.substring(1);
return businessObjType;
}
工具类时间转换:
//获取到的值,其中就有Date
Object value = readMethod.invoke(source, new Object[0]);
if (value instanceof Date) {
//日期类型
Date dateValue = (Date) value;
DateFormat df = new SimpleDateFormat(PATTERN);
String dateStr = df.format(dateValue);
map.put(p, dateStr);
}else{
map.put(p, value);
}