首页>代码>集成了微信公众号、工作流(activiti)可视化界面的OA开发框架,SSM>/javaaciviti/src/com/fh/controller/activiti/AcBusinessController.java
package com.fh.controller.activiti;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.image.ProcessDiagramGenerator;
import org.springframework.beans.factory.annotation.Autowired;

import com.fh.controller.activiti.util.BpmsActivityTypeEnum;
import com.fh.controller.activiti.util.UtilMisc;
import com.fh.controller.base.BaseController;
import com.fh.util.Const;
import com.fh.util.DelAllFile;
import com.fh.util.FileUpload;
import com.fh.util.PathUtil;

/** 
 * 类名称:流程业务相关
 * 创建人:jocker
 * 更新时间:2018年1月31日
 * @version
 */
public class AcBusinessController extends BaseController {
	
	@Autowired
	private ProcessEngine processEngine;		 //流程引擎对象
	
	@Autowired
	private RepositoryService repositoryService; //管理流程定义  与流程定义和部署对象相关的Service
	
	@Autowired
	private RuntimeService runtimeService; 		//与正在执行的流程实例和执行对象相关的Service(执行管理,包括启动、推进、删除流程实例等操作)
	
	@Autowired
	private TaskService taskService; 			//任务管理 与正在执行的任务管理相关的Service
	
	@Autowired
	private HistoryService historyService; 		//历史管理(执行完的数据的管理)
	
	/**指派任务的代理人
	 * @param Assignee	//代理人
	 * @param taskId	//任务ID
	 */
	protected void setAssignee(String taskId,String Assignee){
		taskService.setAssignee(taskId, Assignee);
	}
	
	/**设置流程变量(绑定任务)用Map形式
	 * @param taskId	//任务ID
	 * @param map
	 */
	protected void setVariablesByTaskIdAsMap(String taskId,Map<String,Object> map){
		taskService.setVariablesLocal(taskId,map);
	}
	
	/**获取流程变量
	 * @param taskId	//任务ID
	 * @param key		//键
	 * @param map
	 */
	protected Object getVariablesByTaskIdAsMap(String taskId,String key){
		return taskService.getVariable(taskId, key);
	}
	
	/**设置流程变量(不绑定任务)
	 * @param taskId	//任务ID
	 * @param map
	 */
	protected void setVariablesByTaskId(String taskId,String key,String value){
		taskService.setVariable(taskId,key,value);
	}
	
	/**移除流程变量(从正在运行中)
	 * @param PROC_INST_ID_	//流程实例ID
	 * @param map
	 */
	protected void removeVariablesByPROC_INST_ID_(String PROC_INST_ID_,String key){
		runtimeService.removeVariable(PROC_INST_ID_, key);
	}
	
	/**查询我的任务
	 * @param USERNAME
	 * @return 返回任务列表
	 */
	protected List<Task> findMyPersonalTask(String USERNAME){
		return taskService.createTaskQuery()		//创建查询对象
						  .taskAssignee(USERNAME)	//指定办理人
						  .list();					//读出列表(比如从0到10)
	}
	
	/**完成任务
	 * @param taskId 任务ID
	 */
	protected void completeMyPersonalTask(String taskId){
		taskService.complete(taskId); 
	}
	
	/**作废流程
	 * @param processId	//流程实例ID
	 * @param reason	//作废原因
	 * @throws Exception
	 */
	protected void deleteProcessInstance(String processId,String reason) throws Exception{
		runtimeService.deleteProcessInstance(processId, reason);
	}
	
	/**删除历史流程
	 * @param PROC_INST_ID_	//流程实例ID
	 * @throws Exception
	 */
	protected void deleteHiProcessInstance(String PROC_INST_ID_) throws Exception{
		historyService.deleteHistoricProcessInstance(PROC_INST_ID_);
	}
	
	/**生成当前任务节点流程图片PNG
	 * @param PROC_INST_ID_ //流程实例ID
	 * @param FILENAME 		//图片名称
	 * @throws IOException 
	 */
	protected void createXmlAndPngAtNowTask(String PROC_INST_ID_, String FILENAME) throws IOException{
		DelAllFile.delFolder(PathUtil.getClasspath()+"uploadFiles/activitiFile"); 	//生成先清空之前生成的文件
        InputStream in = getResourceDiagramInputStream(PROC_INST_ID_); 
        FileUpload.copyFile(in,PathUtil.getClasspath()+Const.FILEACTIVITI,FILENAME);//把文件上传到文件目录里面
        in.close();  
	}
	
	/**获取当前任务流程图片的输入流
	 * @param PROC_INST_ID_	//流程实例ID
	 * @return
	 */
	private InputStream getResourceDiagramInputStream(String PROC_INST_ID_){
        try {
            HistoricProcessInstance hip = historyService.createHistoricProcessInstanceQuery().processInstanceId(PROC_INST_ID_).singleResult(); 			//获取历史流程实例
            List<HistoricActivityInstance> hai = historyService.createHistoricActivityInstanceQuery().processInstanceId(PROC_INST_ID_)
            																						 .orderByHistoricActivityInstanceId().asc().list();	//获取流程中已经执行的节点,按照执行先后顺序排序
            List<String> executedActivityIdList = new ArrayList<String>();						// 构造已执行的节点ID集合
            for (HistoricActivityInstance activityInstance : hai) {
                executedActivityIdList.add(activityInstance.getActivityId());
            }
            BpmnModel bpmnModel = repositoryService.getBpmnModel(hip.getProcessDefinitionId()); // 获取bpmnModel
            List<String> flowIds = this.getExecutedFlows(bpmnModel, hai);						// 获取流程已发生流转的线ID集合
            ProcessDiagramGenerator processDiagramGenerator = processEngine.getProcessEngineConfiguration().getProcessDiagramGenerator();	
            InputStream imageStream = processDiagramGenerator.generateDiagram(bpmnModel, "png", executedActivityIdList, flowIds, "宋体", "微软雅黑", "黑体", null, 2.0);	//使用默认配置获得流程图表生成器,并生成追踪图片字符流
            return imageStream;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
	   
   /**获取流程已发生流转的线ID集合
	 * @param bpmnModel
	 * @param historicActivityInstances //历史流程实例list
	 * @return
	 */
   private List<String> getExecutedFlows(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances) {
        List<String> flowIdList = new ArrayList<String>();					//流转线ID集合
        List<FlowNode> historicFlowNodeList = new LinkedList<FlowNode>();	//全部活动实例
        List<HistoricActivityInstance> finishedActivityInstanceList = new LinkedList<HistoricActivityInstance>();	//已完成的历史活动节点
        for(HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
            historicFlowNodeList.add((FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true));
            if(historicActivityInstance.getEndTime() != null) {
                finishedActivityInstanceList.add(historicActivityInstance);
            }
        }
        /**遍历已完成的活动实例,从每个实例的outgoingFlows中找到已执行的*/
        FlowNode currentFlowNode = null;
        for(HistoricActivityInstance currentActivityInstance : finishedActivityInstanceList) {
        	/**获得当前活动对应的节点信息及outgoingFlows信息*/
            currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true);
            List<SequenceFlow> sequenceFlowList = currentFlowNode.getOutgoingFlows();
            /**
             * 遍历outgoingFlows并找到已流转的
             * 满足如下条件任务已流转:
             * 1.当前节点是并行网关或包含网关,则通过outgoingFlows能够在历史活动中找到的全部节点均为已流转
             * 2.当前节点是以上两种类型之外的,通过outgoingFlows查找到的时间最近的流转节点视为有效流转
             */
            FlowNode targetFlowNode = null;
            if(BpmsActivityTypeEnum.PARALLEL_GATEWAY.getType().equals(currentActivityInstance.getActivityType())
                    || BpmsActivityTypeEnum.INCLUSIVE_GATEWAY.getType().equals(currentActivityInstance.getActivityType())) {
                for(SequenceFlow sequenceFlow : sequenceFlowList) { //遍历历史活动节点,找到匹配Flow目标节点的
                    targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true);
                    if(historicFlowNodeList.contains(targetFlowNode)) {
                        flowIdList.add(sequenceFlow.getId());
                    }
                }
            }else{
                List<Map<String, String>> tempMapList = new LinkedList<Map<String,String>>();
                for(SequenceFlow sequenceFlow : sequenceFlowList) {	 //遍历历史活动节点,找到匹配Flow目标节点的
                    for(HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
                        if(historicActivityInstance.getActivityId().equals(sequenceFlow.getTargetRef())) {
                            tempMapList.add(UtilMisc.toMap("flowId", sequenceFlow.getId(), "activityStartTime", String.valueOf(historicActivityInstance.getStartTime().getTime())));
                        }
                    }
                }
                String flowId = null;
                for (Map<String, String> map : tempMapList) {
                    flowId = map.get("flowId");
                    flowIdList.add(flowId);
                }
             	/**遍历匹配的集合,取得开始时间最早的一个*/
                /*long earliestStamp = 0L;
                String flowId = null;
                for (Map<String, String> map : tempMapList) {
                    long activityStartTime = Long.valueOf(map.get("activityStartTime"));
                    if (earliestStamp == 0 || earliestStamp >= activityStartTime) {
                        earliestStamp = activityStartTime;
                        flowId = map.get("flowId");
                    }
                }
                flowIdList.add(flowId);*/
            }
        }
        return flowIdList;
    }
   
   /**获取发起人
	 * @param PROC_INST_ID_ //流程实例ID
	 * @return
	 */
   protected String getInitiator(String PROC_INST_ID_) {
		HistoricProcessInstance hip = historyService.createHistoricProcessInstanceQuery().processInstanceId(PROC_INST_ID_).singleResult(); 			//获取历史流程实例
		List<HistoricActivityInstance> hais = historyService.createHistoricActivityInstanceQuery().processInstanceId(PROC_INST_ID_)
		   																						 .orderByHistoricActivityInstanceId().asc().list();	//获取流程中已经执行的节点,按照执行先后顺序排序
		BpmnModel bpmnModel = repositoryService.getBpmnModel(hip.getProcessDefinitionId()); // 获取bpmnModel
		List<FlowNode> historicFlowNodeList = new LinkedList<FlowNode>();					//全部活动实例
		for(HistoricActivityInstance hai : hais) {
		    historicFlowNodeList.add((FlowNode) bpmnModel.getMainProcess().getFlowElement(hai.getActivityId(), true));
		    if(hai.getAssignee() != null) {
		    	return hai.getAssignee();	//不为空的第一个节点办理人就是发起人
		    }
		}
		return null;
    }
   
}
最近下载更多
educationAAA  LV10 9月26日
最代码官方  LV168 9月22日
最近浏览更多
interface  LV22 昨天
abdkfksdkf  LV16 9月29日
CrystalQ  LV8 9月29日
yfb790910  LV2 9月29日
Gin19960217  LV4 9月29日
带羽abcd 9月28日
暂无贡献等级
whfuai  LV14 9月28日
xiaozhi丶  LV15 9月26日
educationAAA  LV10 9月26日
y1214435276  LV9 9月26日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友