• 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.新建委托,新建流程进行测试。

    启动一个新流程,测试可得发给张刚的流程,最终发到了周星驰那里。

  • 相关阅读:
    Completely disable mousewheel on a WinForm
    C# Form内存回收
    解锁用户
    CentOS7+JDK8编译Hadoop2.6.4
    网址收藏
    pvresize
    Linux crontab 命令格式与详细例子
    在CentOS 7中安装与配置JDK8
    Disable SELinux CentOS 7
    Python3标准库:math数学函数
  • 原文地址:https://www.cnblogs.com/noahpk/p/10033474.html
Copyright © 2020-2023  润新知