activiti工作流委托功能的设计和实现
最近公司开发一个项目,客户提出了一个需求,用户在出差的时候,可以将自己的工作进行委托。可以指定委托时间、委托工作内容、指定委托人等等内容。
然后我就上网查询资料,发现activiti工作流本身并不支持这种委托功能,于是就自己参考一些资料,进行开发,基本实现客户所需的功能。
1.用户需求分析:
(1)不同任务流程委托给不同人
(2)全盘委托
(3)委托给多个人共同决策(一票否决,一票通过)
(4)委托时间
(5)本项目功能在SSM框架下开发,前端采用VUE框架
2.设计数据表
ACT_RU_DELEGATE //委托配置数据表
CREATE TABLE `act_ru_delegate` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`ASSIGNEE` varchar(200) DEFAULT NULL,
`ATTORNEY` varchar(200) DEFAULT NULL,
`START_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`END_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`PROCESS_DEFINITION_ID` varchar(100) DEFAULT NULL,
`STATUS` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=44 DEFAULT CHARSET=utf8;
ACT_HI_DELEGATE //委托配置数据表
CREATE TABLE `act_hi_delegate` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`ASSIGNEE` varchar(200) DEFAULT NULL,
`ATTORNEY` varchar(200) DEFAULT NULL,
`DELEGATE_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`TASK_ID` varchar(100) DEFAULT NULL,
`STATUS` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;
3.model模型实现
1.DelegateInfo类
package com.paomo.model;
import java.util.Date;
public class DelegateInfo {
private int id;
private String Assignee;
private String Attorney;
private Date Start_Time;
private Date End_Time;
private String Process_Definition_Id;
private Integer Status;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public DelegateInfo(){
super();
}
public DelegateInfo(int id, String assignee, String attorney, Date start_Time, Date end_Time,
String process_Definition_Id, Integer status) {
super();
this.id = id;
Assignee = assignee;
Attorney = attorney;
Start_Time = start_Time;
End_Time = end_Time;
Process_Definition_Id = process_Definition_Id;
Status = status;
}
public String getAssignee() {
return Assignee;
}
public void setAssignee(String assignee) {
Assignee = assignee;
}
public String getAttorney() {
return Attorney;
}
public void setAttorney(String attorney) {
Attorney = attorney;
}
public Date getStart_Time() {
return Start_Time;
}
public void setStart_Time(Date start_Time) {
Start_Time = start_Time;
}
public Date getEnd_Time() {
return End_Time;
}
public void setEnd_Time(Date end_Time) {
End_Time = end_Time;
}
public String getProcess_Definition_Id() {
return Process_Definition_Id;
}
public void setProcess_Definition_Id(String process_Definition_Id) {
Process_Definition_Id = process_Definition_Id;
}
public Integer getStatus() {
return Status;
}
public void setStatus(Integer status) {
Status = status;
}
}
2.DelegateHistory类
package com.paomo.model;
import java.util.Date;
public class DelegateHistory {
private int id;
private String Assignee;
private String Attorney;
private Date Delegate_Time;
private String TaskId;
private Integer Status;
public DelegateHistory(){
super();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAssignee() {
return Assignee;
}
public void setAssignee(String assignee) {
Assignee = assignee;
}
public String getAttorney() {
return Attorney;
}
public void setAttorney(String attorney) {
Attorney = attorney;
}
public Date getDelegate_Time() {
return Delegate_Time;
}
public void setDelegate_Time(Date delegate_Time) {
Delegate_Time = delegate_Time;
}
public String getTaskId() {
return TaskId;
}
public void setTaskId(String taskId) {
TaskId = taskId;
}
public Integer getStatus() {
return Status;
}
public void setStatus(Integer status) {
Status = status;
}
public DelegateHistory(int id, String assignee, String attorney, Date delegate_Time, String taskId,
Integer status) {
super();
this.id = id;
Assignee = assignee;
Attorney = attorney;
Delegate_Time = delegate_Time;
TaskId = taskId;
Status = status;
}
}
4.DelegateService层接口
package com.paomo.service; import java.util.List;
import java.util.Map; import com.paomo.model.DelegateInfo; public interface DelegateService { DelegateInfo getDelegateInfo(String targetAssignee,String targetProcessDefinitionId); void saveRecord(String assignee, String attorney, String taskId); void removeRecord(Long id); void removeRecord2(int id); void addDelegateInfo(String assignee, String attorney,String startTime, String endTime, String processDefinitionId); List<DelegateInfo> listAll(Map<String, Object> emap); List<Map<String,Object>> listAllDetail(Map<String, Object> emap); void update(Map<String,Object> resMap); List<Map<String, Object>> getProcessList(); int getCount(String userId); List<Map<String, Object>> listAllDetail2(Map<String, Object> emap); int getCount2(String userId);
}
5.DelegateServiceImpl实现类
package com.paomo.service.impl; import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.annotation.PostConstruct;
import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service; import com.paomo.dao.DelegateHistoryDao;
import com.paomo.dao.DelegateInfoDao;
import com.paomo.model.DelegateHistory;
import com.paomo.model.DelegateInfo;
import com.paomo.service.DelegateService;
@Service("DelegateService")
public class DelegateServiceImpl implements DelegateService {
@Resource
private DelegateInfoDao delegateInfoDao;
@Resource
private DelegateHistoryDao delegateHistoryDao; public static DelegateServiceImpl testUtils; @PostConstruct
public void init() {
testUtils = this;
} public DelegateInfo getDelegateInfo(String targetAssignee,String targetProcessDefinitionId) { Map<String,Object> map=new HashMap<String, Object>();
map.put("assignee", targetAssignee);
List<DelegateInfo> list=delegateInfoDao.listAll(map);
for (DelegateInfo delegateInfo : list) { String processDefinitionId = (String) delegateInfo.getProcess_Definition_Id();
Date startTime = (Date) delegateInfo.getStart_Time();
Date endTime = (Date) delegateInfo.getEnd_Time(); if (timeNotBetweenNow(startTime, endTime)) { continue;
} if ((processDefinitionId == null)|| processDefinitionId.equals(targetProcessDefinitionId)) {
return delegateInfo;
}
} return null;
} public void saveRecord(String assignee, String attorney, String taskId) {
DelegateHistory delegateHistory=new DelegateHistory();
delegateHistory.setAssignee(assignee);
delegateHistory.setAttorney(attorney);
delegateHistory.setTaskId(taskId);
delegateHistory.setDelegate_Time(new java.sql.Date(System.currentTimeMillis()));
delegateHistory.setStatus(1);
delegateHistoryDao.add(delegateHistory);
} public void removeRecord(Long id) { delegateInfoDao.delete(id);
} public void removeRecord2(int id) { delegateHistoryDao.delete(id);
} public void addDelegateInfo(String assignee, String attorney,String startTime, String endTime, String processDefinitionId) {
DelegateInfo delegateInfo=new DelegateInfo();
Map<String,Object> resMap = new HashMap<String,Object>();
resMap.put("assignee", assignee);
resMap.put("attorney", attorney);
resMap.put("endTime", endTime);
resMap.put("startTime", startTime);
resMap.put("processDefinitionId", processDefinitionId);
resMap.put("status", 1);
delegateInfoDao.save(resMap);
} private boolean timeNotBetweenNow(Date startTime, Date endTime) {
Date now = new Date(System.currentTimeMillis()); if (startTime != null) {
return now.before(startTime);
} if (endTime != null) {
return now.after(endTime);
} return false;
} @Override
public List<DelegateInfo> listAll(Map<String,Object> reMap) {
return delegateInfoDao.listAll(reMap);
} @Override
public void update(Map<String, Object> resMap) {
delegateInfoDao.update(resMap); } @Override
public List<Map<String, Object>> getProcessList() {
return delegateInfoDao.getProcessList();
} @Override
public int getCount(String userId) {
return delegateInfoDao.getCount(userId);
} @Override
public List<Map<String, Object>> listAllDetail(Map<String, Object> emap) {
return delegateInfoDao.listAllDetail(emap);
} @Override
public List<Map<String, Object>> listAllDetail2(Map<String, Object> emap) {
return delegateHistoryDao.listAllDetail(emap);
} @Override
public int getCount2(String userId) {
return delegateHistoryDao.getCount(userId);
}
}
6.DelegateInfoDao
package com.paomo.dao; import java.util.Date;
import java.util.List;
import java.util.Map; import com.paomo.model.DelegateInfo; public interface DelegateInfoDao {
DelegateInfo getDelegateInfo(String targetAssignee,String targetProcessDefinitionId); void saveRecord(String assignee, String attorney, String taskId); void removeRecord(Long id); void addDelegateInfo(String assignee, String attorney,Date startTime, Date endTime, String processDefinitionId); List<DelegateInfo> listAll(Map<String, Object> reMap); void delete(Long id); DelegateInfo getById(Long id); void save(Map<String, Object> resMap); void update(Map<String, Object> resMap); List<Map<String, Object>> getProcessList(); int getCount(String userId); List<Map<String,Object>> listAllDetail(Map<String, Object> emap); }
7.DelegateHistoryDao
package com.paomo.dao; import java.util.List;
import java.util.Map; import com.paomo.model.DelegateHistory; public interface DelegateHistoryDao { void update(DelegateHistory delegateHistory); void add(DelegateHistory delegateHistory); List<Map<String, Object>> listAllDetail(Map<String, Object> emap); int getCount(String assignee); void delete(int id); }
8.DelegateMapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.paomo.dao.DelegateInfoDao">
<insert id="save" parameterType="Map">
insert into act_ru_delegate(ASSIGNEE,ATTORNEY,START_TIME,END_TIME,PROCESS_DEFINITION_ID,STATUS) values(#{assignee},#{attorney},#{startTime},#{endTime},#{processDefinitionId},1)
</insert> <delete id="delete" parameterType="Long">
delete from act_ru_delegate where ID=#{id}
</delete> <select id="listAll" parameterType="Map" resultType="DelegateInfo">
select * from act_ru_delegate where STATUS=1 and ASSIGNEE=#{assignee}
</select> <select id="listAllDetail" parameterType="Map" resultType="Map">
select a.ID, a.START_TIME startTime,a.END_TIME endTime,b.NAME_ processName,c.`name` assignee,d.`name` attorney,a.ATTORNEY attorneyId,a.ASSIGNEE assigneeId from act_ru_delegate a
LEFT JOIN act_re_procdef b ON a.PROCESS_DEFINITION_ID=b.ID_
LEFT JOIN act_id_user c ON a.ASSIGNEE=c.id
LEFT JOIN act_id_user d ON a.ATTORNEY=d.id
where a.STATUS=1 and a.ASSIGNEE=#{assignee}
<if test="currentPage!=-1">
limit #{currentPage},#{pageSize}
</if>
</select> <select id="getCount" parameterType="String" resultType="Integer">
select count(*) from act_ru_delegate where STATUS=1 and ASSIGNEE=#{assignee} order by ID desc
</select> <select id="getProcessList" resultType="Map">
SELECT ID_,NAME_ FROM act_re_procdef GROUP BY NAME_ ORDER BY VERSION_ desc
</select> <update id="update" parameterType="Map">
update act_ru_delegate
<set>
<if test="assigneeId!=null and assigneeId!=''">
ASSIGNEE=#{assigneeId},
</if>
<if test="attorney!=null and attorney!=''">
ATTORNEY=#{attorney},
</if>
<if test="startTime!=null and startTime!='NaN-aN-aN aN:aN:aN'">
Start_Time=#{startTime},
</if>
<if test="endTime!=null and endTime!='NaN-aN-aN aN:aN:aN'">
End_Time=#{endTime},
</if>
<if test="processDefinitionId!=null and processDefinitionId!=''">
Process_Definition_Id=#{processDefinitionId},
</if>
</set>
where ID =#{ID}
</update> </mapper>
9.DelegateHistoryMapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.qajt.paomo.DelegateHistoryDao">
<insert id="add" parameterType="DelegateInfo">
insert into act_hi_delegate(ASSIGNEE,ATTORNEY,DELEGATE_TIME,TASK_ID,STATUS) values(
#{Assignee},#{Attorney},#{Delegate_Time},#{TaskId},#{Status})
</insert> <select id="listAllDetail" parameterType="Map" resultType="Map">
select a.ID,a.TASK_ID taskId, a.DELEGATE_TIME delegateTime,c.`name` assignee,d.`name` attorney,a.ATTORNEY attorneyId,a.ASSIGNEE assigneeId from act_hi_delegate a
LEFT JOIN act_id_user c ON a.ASSIGNEE=c.id
LEFT JOIN act_id_user d ON a.ATTORNEY=d.id
where a.STATUS=1 and a.ASSIGNEE=#{assignee}
<if test="currentPage!=-1">
limit #{currentPage},#{pageSize}
</if>
</select> <select id="getCount" parameterType="Map" resultType="Integer">
select count(*) from act_hi_delegate a
where a.STATUS=1 and a.ASSIGNEE=#{assignee}
</select> <delete id="delete" parameterType="Integer">
delete from act_hi_delegate where ID=#{id}
</delete> </mapper>
10.TaskAsigneeListenerImpl监听类的实现 对单一指派人 assignee
package com.paomo.service.impl; import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.annotation.PostConstruct;
import javax.annotation.Resource; import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service; import com.paomo.dao.DelegateInfoDao;
import com.paomo.model.DelegateInfo;
import com.paomo.service.DelegateService; @Component("TaskAsigneeListenerImpl")
public class TaskAsigneeListenerImpl implements TaskListener {
@Resource
private DelegateService delegateService; @Override
public void notify(DelegateTask delegateTask) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //ssm框架下直接注入service出错,所以这块要用XML的方式对service进行注入
DelegateService dsService = (DelegateService) ac.getBean("DelegateService");
//如果有委托,设置委托人
String assignee = delegateTask.getAssignee();
String processDefinitionId = delegateTask.getProcessDefinitionId();
DelegateInfo delegateInfo = dsService.getDelegateInfo(assignee,
processDefinitionId);
if (delegateInfo == null) {
return;
}
String attorney = delegateInfo.getAttorney();
delegateTask.setAssignee(attorney);
dsService.saveRecord(assignee, attorney, delegateTask.getId());
} }
11.在工作流流程图中配置监听类

12.新建委托,新建流程进行测试。


启动一个新流程,测试可得发给张刚的流程,最终发到了周星驰那里。
activiti工作流委托功能的设计和实现的更多相关文章
- 我的微型工作流引擎-功能解析及API设计
一.前言 上一篇我给大家介绍了我的工作流的模型和基本的设计,这篇我想详细说明下我这款工作流的功能及使用示例.这款工作流主要是面向开发者设计的,为了先让大家有个全局的认识,局部功能的设计实现就不细说了, ...
- Activiti工作流 安装myeclipse activiti设计插件并生成数据库表
从零开始学习Activiti工作流,记录下学习过程. 关于工作流的简介没什么好介绍了,只能说是个很有用的东西,数据库中23张表分别有什么用网上也有很详细的介绍,这里也不多加说明.activiti开发中 ...
- Activiti工作流学习-----基于5.19.0版本(6)
七. BPMN的简介 读者了解到这里,应付一般的工作流开发已经足够了.此处应该有华丽的分割线,在工作流项目中核心开发人员主要是对工作流业务设计以及实现,而初级开发人员是对业务功能的代码实现.以后将主要 ...
- 三分钟明白 Activiti工作流 -- java运用
原文地址:https://blog.csdn.net/jiangyu1013/article/details/73250902 一. 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打 ...
- Activiti工作流学习要点
1. 1个插件 在Eclipse中安装Activiti插件,让你可以在Eclipse中绘制Activiti工作流图 2. 1个引擎 ProcessEngine对象,Activiti工作流引擎.这是Ac ...
- 手把手教你如何玩转Activiti工作流
手把手教你如何玩转Activiti工作流 置顶 2018年01月30日 19:51:36 Cs_hnu_scw 阅读数:24023 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...
- Activiti工作流小序曲
一般涉及到OA.ERP等公司办公系统都必须有一套办公流程,这时候使用activiti工作流框架会大大减轻我们的工作量,提高我们的开发效率. Activiti工作流简单介绍: 工作流(workflow) ...
- Activiti工作流学习之流程图应用详解
Activiti工作流学习之流程图应用详解 1.目的 了解Activiti工作流是怎样应用流程图的. 2.环境准备2.1.相关软件及版本 jdk版本:Jdk1.7及以上 IDE:eclipse ...
- Activiti工作流引擎核心介绍
引言 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速.超稳定的 BPMN 2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更 ...
随机推荐
- Hexo+NexT(二):Hexo站点配置详解
阅读本篇之前,假定读者已经有了Node.js的基础,如需要补充Node.js知识的,请自行百度. Hexo是在Node.js框架下的一个项目,利用Node.js提供的强大功能,完成从Markdown到 ...
- 《Spring Cloud》学习(三) 容错保护!
在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间互相依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身间题出现调用故障或延迟,而 ...
- 100天搞定机器学习|Day1数据预处理
数据预处理是机器学习中最基础也最麻烦的一部分内容 在我们把精力扑倒各种算法的推导之前,最应该做的就是把数据预处理先搞定 在之后的每个算法实现和案例练手过程中,这一步都必不可少 同学们也不要嫌麻烦,动起 ...
- RABC权限控制(二级菜单实现)
目前大部分系统由于用户体验,基本上菜单不会做的很深,以二级菜单为例,做了一个简单的权限控制实现,可精确到按钮级别(基于django),下面具体看看实现 1.表结构的设计 无论开发什么都需要先梳理清楚需 ...
- C语言学习书籍推荐《学通C语言的24堂课》下载
下载地址:点我 编辑推荐 <学通C语言的24堂课>:用持续激励培养良好习惯以良好习惯铸就伟大梦想——致亲爱的读者朋友在开始学习<学通C语言的24堂课>的同时,强烈建议读者朋友同 ...
- watch 和 computed
<template> <div class="hello"> <h1>{{ msg }}</h1> <h2>Essent ...
- 剑指offer第二版-2.实现单例模式
面试题2:实现单例模式 题目要求: 设计一个类,只能生成该类的一个实例. /** * 单例模式 * 定义:指实现了特殊模式的类,该类仅能被实例化一次,产生唯一的一个对象 * 应用举例:windows的 ...
- 自己实现IOC容器,java代码实现简易版IOC容器,IOC容器实现的步骤分解
一.需求 实现一个简易的IOC容器,管理Bean,从IOC容器的BeanFactory中获取实例,从而取代自己new实例的做法. 二.实现步骤分析 三.具体代码实现 自定义注解类 MyComponen ...
- Java编程思想:嵌套类
public class Test { public static void main(String[] args) { // Parcell11.test(); // ClassInterface. ...
- Go语言解密上篇中用java aes实现的加密
上一篇java aes文件加解密中加密的梅须逊雪三分白,雪却输梅一段香.使用go语言解密. 解密代码如下: AESUtil.go package util import ( "crypto/ ...