package com.zwl.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.ZipInputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.model.ActivityCoordinates;
import org.jbpm.api.task.Task;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.zwl.util.ArrayTwo;
import com.zwl.util.CreateJbpmXml;
import com.zwl.util.Drawpng;
import com.zwl.util.ForJspDesign;
import com.zwl.util.ZipUtil;
import com.zwl.vo.ProcessVo;
public class DesignAction extends ActionSupport {
private ProcessEngine processEngine;
private RepositoryService repositoryService;
private ExecutionService executionService;
private TaskService taskService;
private String id;
private List<ProcessDefinition> processDefinitionList;
private List<ProcessInstance> processInstanceList;
private List<Task> taskList;
private ActivityCoordinates ac;
private ProcessVo processVo;
private Map<String, Object> map;
private String result;
private void init() {
repositoryService = processEngine.getRepositoryService();
executionService = processEngine.getExecutionService();
taskService = processEngine.getTaskService();
}
private static final long serialVersionUID = 1L;
public String design() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
ServletContext context = ServletActionContext.getServletContext();
String sb = request.getParameter("data");
ForJspDesign fjd = new ForJspDesign();
ArrayTwo two = fjd.fenli(sb);// 分离处理字符
CreateJbpmXml.geneXmlByDom(two.getState(), two.getPath());// 创建XML
Date date = new Date();
Drawpng.createPng(context.getRealPath("/") + "/jbpm/jbpm"
+ date.getYear() + date.getMonth() + date.getDate()
+ ".jpdl.xml");// 生成图片
ZipUtil z = new ZipUtil();
z.compress(
context.getRealPath("/") + "/jbpm",
context.getRealPath("/") + "/jbpm/jbpm" + date.getYear()
+ date.getMonth() + date.getDate() + ".zip", "", false);// 压缩成zip文件
request.getSession().setAttribute("zip", context.getRealPath("/") + "/jbpm/jbpm"
+ date.getYear() + date.getMonth() + date.getDate() + ".zip");
request.getSession().setAttribute("zipname",
"jbpm" + date.getYear() + date.getMonth() + date.getDate()
+ ".zip");
System.out.println(request.getSession().getAttribute("zipname") + "发革命化");
return "success";
}
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@SuppressWarnings("unchecked")
public String login() {
Map map = ActionContext.getContext().getSession();
map.put("user", userName);
return SUCCESS;
}
/**
* 加载首页
*
* @return
*/
public String loadIndexPage() {
init();
processDefinitionList = repositoryService
.createProcessDefinitionQuery().list();
processInstanceList = executionService.createProcessInstanceQuery()
.list();
// 这里模拟不同的角色登陆系统,会接到不同的待办任务
String manager = "zwllxs1,zwllxs2,zwllxs3,zwllxs4";
String boss = "zhangweilin,zhangweilin2,zhangweilin3,zhangweilin4";
String roleName = "";// 要按此名去查找它所在的节点
String name = getLoginedUserName();
// 经理登陆
if (manager.contains(name)) {
roleName = "manager";
}
// 老板登陆
else if (boss.contains(name)) {
roleName = "boss";
}
// 普通用户
else {
roleName = name;
}
System.out.println("roleName: " + roleName);
taskList = taskService.findPersonalTasks(roleName);
System.out.println("taskList: " + taskList);
return SUCCESS;
}
public String deploy() throws IOException {
System.out.println("部署");
init();
ServletContext context = ServletActionContext.getServletContext();
HttpServletRequest request = ServletActionContext.getRequest();
String name = (String)request.getSession().getAttribute("zip");
System.out.println(name + "发布名字");
Date date = new Date();
// ZipInputStream zis = new
// ZipInputStream(this.getClass().getResourceAsStream("/leave2.zip"));
if(name!=null){
InputStream is = new FileInputStream(new File(name));
ZipInputStream zis = new ZipInputStream(is);
String did = repositoryService.createDeployment().addResourcesFromZipInputStream(zis).deploy();
System.out.println("did: " + did);}
return SUCCESS;
}
/**
* 启动
*
* @return
*/
@SuppressWarnings("unchecked")
public String start() {
init();
Map map = new HashMap();
// 在启动任务时,等于就是一个用户要请假了,那么,此时,要把流程信息关联到此用户上,在开始的下一个节点(也就是第一个任务节点),是指派给。所以用户名要与其对应的变量关联起来
map.put("owner", getLoginedUserName());
System.out.println(getLoginedUserName()+"lSggggggggggggggggggggggg");
System.out.println("id_: " + id);
ProcessInstance processInstance = executionService
.startProcessInstanceById(id, map);
System.out.println("启动时processInstance: " + processInstance.getId());
return SUCCESS;
}
/**
*
* @return
*/
public String manager() {
init();
Task task = taskService.getTask(id);
String taskId = task.getId();
Set<String> strSet = new HashSet<String>();
strSet.add("owner");
strSet.add("day");
strSet.add("reason");
strSet.add("name");
// taskService.getVariable(taskId, "owner");
map = taskService.getVariables(taskId, strSet);
System.out.println("map: " + map);
return SUCCESS;
}
/**
* 老板来了
*
* @return
*/
public String boss() {
init();
Task task = taskService.getTask(id);
String taskId = task.getId();
Set<String> strSet = new HashSet<String>();
strSet.add("owner");
strSet.add("day");
strSet.add("reason");
strSet.add("name");
strSet.add("sex");
strSet.add("age");
// taskService.getVariable(taskId, "owner");
map = taskService.getVariables(taskId, strSet);
return SUCCESS;
}
/**
* 老板处理
*
* @return
*/
public String submitBoss() {
init();
taskService.completeTask(id);
return SUCCESS;
}
/**
* 经理提交
*
* @return
*/
public String submitManager() {
init();
taskService.completeTask(id, result);
return SUCCESS;
}
/**
* 移除
*
* @return
*/
public String remove() {
init();
repositoryService.deleteDeploymentCascade(id);
return SUCCESS;
}
/**
* 显示
*
* @return
*/
public String view() {
init();
// 通过id查到流程实例
ProcessInstance processInstance = executionService
.findProcessInstanceById(id);
Set<String> activityNames = processInstance.findActiveActivityNames();
// Coordinates为相依衣物
ac = repositoryService.getActivityCoordinates(processInstance
.getProcessDefinitionId(), activityNames.iterator().next());
return SUCCESS;
}
/**
* 显示图片
*
* @throws IOException
*/
public void pic() throws IOException {
init();
ProcessInstance processInstance = executionService
.findProcessInstanceById(id);
String processDefinitionId = processInstance.getProcessDefinitionId();
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).uniqueResult();
ServletContext context = ServletActionContext.getServletContext();
Date date = new Date();
String filePath = context.getRealPath("/") + "/jbpm/jbpm"
+ date.getYear() + date.getMonth() + date.getDate() + ".png";
System.out.println("filePath: " + filePath);
File file = new File(filePath);
System.out.println("存在么: " + file.exists());
InputStream inputStream = new FileInputStream(new File(filePath));
System.out.println("inputStream2: " + inputStream);
byte[] b = new byte[1024];
int len = -1;
ServletOutputStream sos = ServletActionContext.getResponse()
.getOutputStream();
while ((len = inputStream.read(b, 0, 1024)) != -1) {
sos.write(b, 0, len);
}
sos.close();
}
/**
* 提交
*
* @return
*/
@SuppressWarnings("unchecked")
public String submit() {
init();
Map map = new HashMap();
// 此day,
// 在xml文件中,有一个decision标签,里面有一个表达式:expr="#{day > 3 ? '老板审批' : '结束'}"
// 即它与表达式中的day关联
map.put("day", processVo.getDay());
map.put("reason", processVo.getReason());
map.put("name", "张伟林submit");
// 如果第二个参数为字符串,则是指定要向哪个方向完成,此是指定要向testhaha完成,并且如果线条上指定了文字,
// 就只能按着文字去指定方向,如果没有文字,才能用map,
// 也就是说,如果传递的参数为map,则流程会去寻找没定义名称的线条走,如果没找到。就抛出No unnamed transitions
// were found for the task 异常
// taskService.completeTask(taskId, "testhaha");
// 如果第二个参数为map,则表示只是传递参数而已
System.out.println("提交完毕");
taskService.completeTask(processVo.getTaskId(), map);
return SUCCESS;
}
public String getLoginedUserName() {
return (String) ActionContext.getContext().getSession().get("user");
}
public ProcessEngine getProcessEngine() {
return processEngine;
}
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
public RepositoryService getRepositoryService() {
return repositoryService;
}
public void setRepositoryService(RepositoryService repositoryService) {
this.repositoryService = repositoryService;
}
public ExecutionService getExecutionService() {
return executionService;
}
public void setExecutionService(ExecutionService executionService) {
this.executionService = executionService;
}
public TaskService getTaskService() {
return taskService;
}
public void setTaskService(TaskService taskService) {
this.taskService = taskService;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<ProcessDefinition> getProcessDefinitionList() {
return processDefinitionList;
}
public void setProcessDefinitionList(
List<ProcessDefinition> processDefinitionList) {
this.processDefinitionList = processDefinitionList;
}
public List<ProcessInstance> getProcessInstanceList() {
return processInstanceList;
}
public void setProcessInstanceList(List<ProcessInstance> processInstanceList) {
this.processInstanceList = processInstanceList;
}
public List<Task> getTaskList() {
return taskList;
}
public void setTaskList(List<Task> taskList) {
this.taskList = taskList;
}
public ActivityCoordinates getAc() {
return ac;
}
public void setAc(ActivityCoordinates ac) {
this.ac = ac;
}
public ProcessVo getProcessVo() {
return processVo;
}
public void setProcessVo(ProcessVo processVo) {
this.processVo = processVo;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
}