package com.slcf.service.impl; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.activiti.bpmn.model.BpmnModel; import org.activiti.engine.ProcessEngine; import org.activiti.engine.RepositoryService; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; import org.activiti.engine.impl.pvm.PvmTransition; import org.activiti.engine.impl.pvm.process.ActivityImpl; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.DeploymentBuilder; import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.repository.ProcessDefinitionQuery; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.image.impl.DefaultProcessDiagramGenerator; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.slcf.dao.ActivitiDao; import com.slcf.pojo.BillNote; import com.slcf.pojo.DefinitionBean; import com.slcf.pojo.PersonTask; import com.slcf.pojo.UserBean; import com.slcf.service.ActivitiService; @Service public class ActivitiServiceImpl implements ActivitiService { @Autowired ActivitiDao activitiDao; /** * 添加请假单,并启动流程 * @param note * @return */ // @Override public int saveBill(BillNote note,RuntimeService runtimeService,HttpServletRequest request) { //获取申请人名称 String name=(String)request.getSession().getAttribute("NAME"); String account=(String)request.getSession().getAttribute("ACCOUNT"); Integer idStr=(Integer)request.getSession().getAttribute("ID"); note.setStatus("初始录入"); note.setName(name); note.setUser_id(idStr); int i=activitiDao.saveBill(note); if(i>0){ BillNote newNote=activitiDao.singleResult(idStr); Map variables = new HashMap(); String objId=newNote.getClass().getSimpleName()+"."+newNote.getBill_id(); String key=newNote.getClass().getSimpleName(); System.out.println(key); //流程变量 指派下一节点任务人 variables.put("user", account);//用登陆账号表示惟一用户 variables.put("objId", objId); runtimeService.startProcessInstanceByKey(key, objId,variables);//启动 } return i; } /** * 部署流程定义 * @param fileName * @param file * @param processEngine * @return */ // @Override public boolean saveAct(String fileName, MultipartFile file, ProcessEngine processEngine) { boolean flag=false; //ZipInputStream zipInputStream; //1)     部署,也是往数据库中存储流程定义的过程。 //2)     这一步在数据库中将操作三张表: //    a) act_re_deployment //      存放流程定义的显示名和部署时间,每部署一次增加一条记录 //    b) act_re_procdef //      存放流程定义的属性信息,部署每个新的流程定义都会在这张表中增加一条记录。 //    c) act_ge_bytearray DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment(); ZipInputStream zipInputStream; try { zipInputStream = new ZipInputStream(file.getInputStream()); deploymentBuilder.addZipInputStream(zipInputStream); Deployment deployment=deploymentBuilder.deploy(); System.out.println(deployment.getId()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } flag=true; return flag; } /** * 查看流程定义 * @param pageNumber * @param pageSize * @return */ // @Override public Map queryProcessDefinition(int pageNumber, int pageSize,RepositoryService repositoryService) { Map map=new HashMap(); SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List list=new ArrayList(); // 获取流程定义查询对象 ProcessDefinitionQuery processDefinitionQuery=repositoryService.createProcessDefinitionQuery(); // 配置查询对象 processDefinitionQuery //添加过滤条件 // .processDefinitionName(processDefinitionName) // .processDefinitionId(processDefinitionId) // .processDefinitionKey(processDefinitionKey) //分页条件 // .listPage(firstResult, maxResults) //排序条件 .orderByProcessDefinitionVersion().desc(); //执行查询 List pds = processDefinitionQuery.listPage((pageNumber-1)*pageSize, pageNumber*pageSize); Long count=processDefinitionQuery.count(); for (ProcessDefinition processDefinition : pds) { // 流程定义的key+版本+随机生成数 System.out.println("流程定义ID:" + processDefinition.getId()); // 对应hello.bpmn文件中的name属性值 System.out.println("流程定义的名称:" + processDefinition.getName()); // 对应hello.bpmn文件中的id属性值 System.out.println("流程定义的key:" + processDefinition.getKey()); // 当流程定义的key值相同的相同下,版本升级,默认1 System.out.println("流程定义的版本:" + processDefinition.getVersion()); System.out.println("资源名称bpmn文件:" + processDefinition.getResourceName()); System.out.println("资源名称png文件:" + processDefinition.getDiagramResourceName()); System.out.println("部署对象ID:" + processDefinition.getDeploymentId()); DefinitionBean definitionBean = new DefinitionBean(); Deployment singleResult = repositoryService.createDeploymentQuery().deploymentId(processDefinition.getDeploymentId()).singleResult(); definitionBean.setId(processDefinition.getId()); definitionBean.setKey(processDefinition.getKey()); definitionBean.setPro_defi_name(processDefinition.getName()); definitionBean.setPro_devl_name(singleResult.getName()); definitionBean.setPro_devl_time(s.format(singleResult.getDeploymentTime())); definitionBean.setVersion(processDefinition.getVersion()+""); definitionBean.setDeployment_id(processDefinition.getDeploymentId()); definitionBean.setResourcename(processDefinition.getDiagramResourceName()); list.add(definitionBean); } map.put("rows", list); map.put("total", count); return map; } /** * 查看流程图 */ // @Override public Map getImg(String deployment_id, HttpServletResponse response, HttpServletRequest request, RepositoryService repositoryService) { //根据流程部署id 获取流程定义查询对象 ProcessDefinition processDefinition=repositoryService.createProcessDefinitionQuery().deploymentId(deployment_id).singleResult(); //根据流程部署id和png文件名称查询 InputStream in=repositoryService.getResourceAsStream(deployment_id, processDefinition.getDiagramResourceName()); // 获取项目所在服务器的路径 String path = request.getSession().getServletContext().getRealPath("/"); System.out.println(path); // 获取服务器的webapps文件夹 String newpath = new File(path).getParent() + "/activitiImgs/"; System.out.println(newpath); // 获取上文件名 String newfilename = processDefinition.getDiagramResourceName(); String uploadpath = newpath + newfilename; // 判断上传文件夹是否存在 // 如果上传文件夹不存在 File ff = new File(uploadpath); if (!ff.getParentFile().exists()) { // 创建applicants文件夹 ff.getParentFile().mkdirs(); } File end = new File(uploadpath); if(in!=null){ byte[] bt = new byte[1024]; int len=-1; try { FileOutputStream fo = new FileOutputStream(end); while((len=(in.read(bt))) != -1) { fo.write(bt,0,len); } fo.flush(); fo.close(); in.close(); } catch (IOException e) { e.printStackTrace(); } } Mapmap=new HashMap(); map.put("msg", "../activitiImgs/"+newfilename); return map; } /** * 根据用户id查询用户请假单 * @param request * @param pageNumber * @param pageSize * @return */ // @Override public Map getMyReq(HttpServletRequest request, int pageNumber, int pageSize, TaskService taskService,RuntimeService runtimeService) { Integer idStr=(Integer)request.getSession().getAttribute("ID"); String account=(String)request.getSession().getAttribute("ACCOUNT"); Listlist=activitiDao.getMyReq(idStr, (pageNumber-1)*pageSize, pageNumber*pageSize); int count =activitiDao.getCountByUserId(idStr); ListtaskList=taskService.createTaskQuery().taskAssignee(account).list(); for(BillNote b:list){ for(org.activiti.engine.task.Task t:taskList){ //流程实例id String processInstanceId=t.getProcessInstanceId(); ProcessInstance processInstance=runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); String businessKey=processInstance.getBusinessKey(); String[] s=businessKey.split("\\."); int billId=Integer.parseInt(s[1]); if(b.getBill_id().equals(billId)){ b.setTaskId(t.getId()); continue; }else{ continue; } } } Mapmap=new HashMap(); map.put("total", count); map.put("rows", list); return map; } /** * 提交请假单 * @param taskId * @param bid * @return */ // @Override public boolean submitMyReq(String taskId, int bid,TaskService taskService,HttpServletRequest request) { boolean flag=false; Integer uid=(Integer)request.getSession().getAttribute("ID"); String account=(String)request.getSession().getAttribute("ACCOUNT"); int i=activitiDao.upBill("审核中", bid); if(i>0){ Mapmap=new HashMap(); //查询用户所在部门的部门经理 UserBean user=activitiDao.queryUserSingleResult(activitiDao.queryDeptId(uid)); if(user!=null){//如果有部门经理就指派经理 map.put("deptMag", user.getUser_account()); }else{//如果没有部门经理就指自己 map.put("deptMag",account); } taskService.complete(taskId,map);//完成任务,指派下一任务人variables flag=true; } return flag; } // @Override public Map delMyReq( int bid,RuntimeService runtimeService) { Mapmap=new HashMap(); boolean flag=false; BillNote note=activitiDao.queryBillById(bid); if(note.getStatus().equals("初始录入")||note.getStatus().equals("审核完成")||note.getStatus().contains("驳回")){ flag=true; if(note.getStatus().equals("初始录入")||note.getStatus().contains("驳回")){ String processInstanceBusinessKey=activitiDao.queryBillById(bid).getClass().getSimpleName()+"."+bid; String processInstanceId =runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(processInstanceBusinessKey).singleResult().getProcessInstanceId(); runtimeService.deleteProcessInstance(processInstanceId, "删除原因");//删除一个流程实例 } activitiDao.delBillById(bid); }else{ map.put("msg", "正在审核中,您无法删除"); } map.put("flag", flag); return map; } // @Override public Map getMyTask(TaskService taskService,HttpServletRequest request,int pageNumber,int pageSize) { String account=(String)request.getSession().getAttribute("ACCOUNT"); Listlist=taskService.createTaskQuery().taskAssignee(account).listPage((pageNumber-1)*pageSize, pageNumber*pageSize); Long count=taskService.createTaskQuery().taskAssignee(account).count(); ListtaskList=new ArrayList(); for(Task t:list){ PersonTask task=new PersonTask(); task.setId(t.getId()); task.setName(t.getName()); task.setAssignee(t.getAssignee()); SimpleDateFormat sm=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); task.setCreatetime(sm.format(t.getCreateTime())); task.setExcutionId(t.getExecutionId()); task.setProcessDefinitionId(t.getProcessDefinitionId()); task.setProcessInstanceId(t.getProcessInstanceId()); taskList.add(task); } Mapmap=new HashMap(); map.put("total", count); map.put("rows", taskList); return map; } // @Override public Map getDetailTask(RepositoryService repositoryService,RuntimeService runtimeService,TaskService taskService,String taskId) { List list =new ArrayList(); Task task=taskService.createTaskQuery().taskId(taskId).singleResult(); String processInstanceId=task.getProcessInstanceId(); ProcessInstance processInstance=runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); String businessKey=processInstance.getBusinessKey(); String strs[]=businessKey.split("\\."); //请假人信息 BillNote note=activitiDao.queryBillById(Integer.parseInt(strs[1])); String activityId=processInstance.getActivityId(); ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(task.getProcessDefinitionId()); //当前活动对象 ActivityImpl activityImpl = processDefinitionEntity.findActivity(activityId); // 通过活动对象找当前活动的所有出口 List transitions = activityImpl.getOutgoingTransitions(); // 提取所有出口的名称,封装成集合 // 提取所有出口的名称,封装成集合 for (PvmTransition trans : transitions) { String transName = (String) trans.getProperty("name"); if(StringUtils.isNotBlank(transName)){ list.add(transName); } } if(list.size()==0){ list.add("批准");//默认 } Mapvalmap=new HashMap(); valmap.put("note", note); valmap.put("list", list); return valmap; } // @Override public boolean magDelTask(String buttonValue,String taskId, String comments, RuntimeService runtimeService, TaskService taskService, HttpServletRequest request) { String userName=(String)request.getSession().getAttribute("NAME"); boolean flag=false; String msg=""; if(buttonValue.equals("批准")){ if(userName.equals(activitiDao.getAdmin().getUser_name())){ msg="审核完成"; }else if(userName.equals(activitiDao.getPersonel().getUser_name())){ msg="审核完成"; }else{ msg="部门经理已批准"; } }else{ if(userName.equals(activitiDao.getAdmin().getUser_name())){ msg="总经理已驳回"; }else if(userName.equals(activitiDao.getPersonel().getUser_name())){ msg="人事经理已驳回"; }else{ msg="部门经理已驳回"; } } Task task=taskService.createTaskQuery().taskId(taskId).singleResult(); //流程实例id String processInstanceId=task.getProcessInstanceId(); //任务ID,根据流程实例ID,评论的消息,保存申请的评论信息 taskService.addComment(taskId, processInstanceId, comments); ProcessInstance processInstance=runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); String businessKey=processInstance.getBusinessKey(); String strs[]=businessKey.split("\\."); BillNote note=activitiDao.queryBillById(Integer.parseInt(strs[1])); int i=activitiDao.upBillByTask(userName, Integer.parseInt(strs[1]), msg); if(i>0){ flag=true; } Map variables=new HashMap(); Date date1=null,date2=null; try { date1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(note.getStartTime()); date2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(note.getEndTime()); //日期相减得到相差的日期 long day = 1+(date1.getTime()-date2.getTime())/(24*60*60*1000)>0 ? (date1.getTime()-date2.getTime())/(24*60*60*1000):(date2.getTime()-date1.getTime())/(24*60*60*1000); variables.put("days", day); if(day<=3){//人事经理 variables.put("personnel", activitiDao.getPersonel().getUser_account()); }else{//总经理 variables.put("admins", activitiDao.getAdmin().getUser_account()); } } catch (java.text.ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } variables.put("outcome", buttonValue); taskService.complete(taskId, variables); return flag; } // @Override public InputStream getProcessPic(String procDefId,RepositoryService repositoryService) { ProcessDefinition procDef = repositoryService.createProcessDefinitionQuery().processDefinitionId(procDefId).singleResult(); String diagramResourceName = procDef.getDiagramResourceName(); InputStream inputStream = repositoryService.getResourceAsStream(procDef.getDeploymentId(), diagramResourceName); return inputStream; } // @Override public InputStream getDiagram(String processInstanceId,RuntimeService runtimeService,RepositoryService repositoryService) { // 查询流程实例 ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId()); // 得到正在执行的环节 List activeIds = runtimeService.getActiveActivityIds(pi.getId()); InputStream is = new DefaultProcessDiagramGenerator().generateDiagram(bpmnModel, "png", activeIds, Collections. emptyList(),"黑体", "黑体", null,null, 1.0); return is; } // @Override public Map outProcessPic(InputStream inputStream, HttpServletRequest request, String bid) { Mapmap=new HashMap(); // 获取项目所在服务器的路径 String path = request.getSession().getServletContext().getRealPath("/"); // 获取服务器的webapps文件夹 String newpath = new File(path).getParent() + "/taskProgress/"; // 获取上文件名 String name=bid+".png"; String newfilename = newpath + bid+".png"; // 判断上传文件夹是否存在 // 如果上传文件夹不存在 File ff = new File(newfilename); if (!ff.getParentFile().exists()) { // 创建applicants文件夹 ff.getParentFile().mkdirs(); } File end = new File(newfilename); if(inputStream!=null){ byte[] bt = new byte[1024]; int len=-1; try { FileOutputStream fo = new FileOutputStream(end); while((len=(inputStream.read(bt))) != -1) { fo.write(bt,0,len); } fo.flush(); fo.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } map.put("msg", "../taskProgress/"+ name); return map; } // @Override public BillNote getBillNoteByBid(int bid) { // TODO Auto-generated method stub return activitiDao.queryBillById(bid); } }