提交 746b5e9a 编写于 作者: jwxkk's avatar jwxkk

完善系统功能

上级 5262cbec
......@@ -11,3 +11,24 @@ public class ActivitiwebApplication {
}
}
/*
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication(scanBasePackages = {"com.imooc.activitiweb"})
public class ActivitiwebApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(ActivitiwebApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(ActivitiwebApplication.class, args);
}
}*/
......@@ -2,8 +2,6 @@ package com.imooc.activitiweb;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
......
package com.imooc.activitiweb.controller;
import com.imooc.activitiweb.SecurityUtil;
import com.imooc.activitiweb.pojo.UserInfoBean;
import com.imooc.activitiweb.util.AjaxResponse;
import com.imooc.activitiweb.util.GlobalConfig;
import org.activiti.bpmn.model.*;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.*;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.history.HistoricTaskInstanceQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
......@@ -69,112 +73,125 @@ public class ActivitiHistoryController {
}
//流程图高亮
@RequestMapping("/highLine")
@ResponseBody
public Map<String,Object> getApplyStatus(String instanceId){
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(instanceId).singleResult();
//获取bpmnModel对象
BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());
//因为我们这里只定义了一个Process 所以获取集合中的第一个即可
Process process = bpmnModel.getProcesses().get(0);
//获取所有的FlowElement信息
Collection<FlowElement> flowElements = process.getFlowElements();
Map<String,String> map = new HashMap<>();
for (FlowElement flowElement : flowElements) {
//判断是否是连线
if (flowElement instanceof SequenceFlow) {
SequenceFlow sequenceFlow = (SequenceFlow) flowElement;
String ref = sequenceFlow.getSourceRef();
String targetRef = sequenceFlow.getTargetRef();
map.put(ref+targetRef,sequenceFlow.getId());
//流程图高亮
@GetMapping("/gethighLine")
public AjaxResponse gethighLine(@RequestParam("instanceId") String instanceId, @AuthenticationPrincipal UserInfoBean UuserInfoBean) {
try {
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(instanceId).singleResult();
//获取bpmnModel对象
BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());
//因为我们这里只定义了一个Process 所以获取集合中的第一个即可
Process process = bpmnModel.getProcesses().get(0);
//获取所有的FlowElement信息
Collection<FlowElement> flowElements = process.getFlowElements();
Map<String, String> map = new HashMap<>();
for (FlowElement flowElement : flowElements) {
//判断是否是连线
if (flowElement instanceof SequenceFlow) {
SequenceFlow sequenceFlow = (SequenceFlow) flowElement;
String ref = sequenceFlow.getSourceRef();
String targetRef = sequenceFlow.getTargetRef();
map.put(ref + targetRef, sequenceFlow.getId());
}
}
}
//获取流程实例 历史节点(全部)
List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.list();
//各个历史节点 两两组合 key
Set<String> keyList = new HashSet<>();
for (HistoricActivityInstance i: list) {
for(HistoricActivityInstance j : list){
if(i!=j){
keyList.add(i.getActivityId()+j.getActivityId());
//获取流程实例 历史节点(全部)
List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.list();
//各个历史节点 两两组合 key
Set<String> keyList = new HashSet<>();
for (HistoricActivityInstance i : list) {
for (HistoricActivityInstance j : list) {
if (i != j) {
keyList.add(i.getActivityId() + j.getActivityId());
}
}
}
}
//高亮连线ID
Set<String> highLine = new HashSet<>();
keyList.forEach(s->highLine.add(map.get(s)));
//获取流程实例 历史节点(已完成)
List<HistoricActivityInstance> listFinished = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.finished()
.list();
//高亮节点ID
Set<String> highPoint = new HashSet<>();
listFinished.forEach(s->highPoint.add(s.getActivityId()));
//获取流程实例 历史节点(待办节点)
List<HistoricActivityInstance> listUnFinished = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.unfinished()
.list();
//需要移除的高亮连线
Set<String> set = new HashSet<>();
//待办高亮节点
Set<String> waitingToDo = new HashSet<>();
listUnFinished.forEach(s->{
waitingToDo.add(s.getActivityId());
//高亮连线ID
Set<String> highLine = new HashSet<>();
keyList.forEach(s -> highLine.add(map.get(s)));
for (FlowElement flowElement : flowElements) {
//判断是否是 用户节点
if (flowElement instanceof UserTask) {
UserTask userTask = (UserTask) flowElement;
if(userTask.getId().equals(s.getActivityId())){
List<SequenceFlow> outgoingFlows = userTask.getOutgoingFlows();
//因为 高亮连线查询的是所有节点 两两组合 把待办 之后 往外发出的连线 也包含进去了 所以要把高亮待办节点 之后 即出的连线去掉
if(outgoingFlows!=null&& outgoingFlows.size()>0){
outgoingFlows.forEach(a-> {
if(a.getSourceRef().equals(s.getActivityId())){
set.add(a.getId());
}
});
//获取流程实例 历史节点(已完成)
List<HistoricActivityInstance> listFinished = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.finished()
.list();
//高亮节点ID
Set<String> highPoint = new HashSet<>();
listFinished.forEach(s -> highPoint.add(s.getActivityId()));
//获取流程实例 历史节点(待办节点)
List<HistoricActivityInstance> listUnFinished = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId)
.unfinished()
.list();
//需要移除的高亮连线
Set<String> set = new HashSet<>();
//待办高亮节点
Set<String> waitingToDo = new HashSet<>();
listUnFinished.forEach(s -> {
waitingToDo.add(s.getActivityId());
for (FlowElement flowElement : flowElements) {
//判断是否是 用户节点
if (flowElement instanceof UserTask) {
UserTask userTask = (UserTask) flowElement;
if (userTask.getId().equals(s.getActivityId())) {
List<SequenceFlow> outgoingFlows = userTask.getOutgoingFlows();
//因为 高亮连线查询的是所有节点 两两组合 把待办 之后 往外发出的连线 也包含进去了 所以要把高亮待办节点 之后 即出的连线去掉
if (outgoingFlows != null && outgoingFlows.size() > 0) {
outgoingFlows.forEach(a -> {
if (a.getSourceRef().equals(s.getActivityId())) {
set.add(a.getId());
}
});
}
}
}
}
}
});
});
highLine.removeAll(set);
highLine.removeAll(set);
//获取当前用户
//User sysUser = getSysUser();
Set<String> iDo = new HashSet<>(); //存放 高亮 我的办理节点
//当前用户已完成的任务
List<HistoricTaskInstance> taskInstanceList = historyService.createHistoricTaskInstanceQuery()
.taskAssignee("bajie")
.finished()
.processInstanceId(instanceId).list();
//获取当前用户
//User sysUser = getSysUser();
Set<String> iDo = new HashSet<>(); //存放 高亮 我的办理节点
//当前用户已完成的任务
String AssigneeName = null;
if (GlobalConfig.Test) {
AssigneeName = "bajie";
} else {
AssigneeName = UuserInfoBean.getUsername();
}
List<HistoricTaskInstance> taskInstanceList = historyService.createHistoricTaskInstanceQuery()
.taskAssignee(AssigneeName)
.finished()
.processInstanceId(instanceId).list();
taskInstanceList.forEach(a->iDo.add(a.getTaskDefinitionKey()));
taskInstanceList.forEach(a -> iDo.add(a.getTaskDefinitionKey()));
Map<String,Object> reMap = new HashMap<>();
reMap.put("highPoint",highPoint);
reMap.put("highLine",highLine);
reMap.put("waitingToDo",waitingToDo);
reMap.put("iDo",iDo);
Map<String, Object> reMap = new HashMap<>();
reMap.put("highPoint", highPoint);
reMap.put("highLine", highLine);
reMap.put("waitingToDo", waitingToDo);
reMap.put("iDo", iDo);
return reMap;
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
GlobalConfig.ResponseCode.SUCCESS.getDesc(), reMap);
} catch (Exception e) {
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(),
"渲染历史流程失败", e.toString());
}
}
......
......@@ -3,8 +3,8 @@ package com.imooc.activitiweb.controller;
import com.imooc.activitiweb.SecurityUtil;
import com.imooc.activitiweb.mapper.ActivitiMapper;
import com.imooc.activitiweb.pojo.UserInfoBean;
import com.imooc.activitiweb.pojo.Act_ru_task;
import com.imooc.activitiweb.pojo.UserInfoBean;
import com.imooc.activitiweb.util.AjaxResponse;
import com.imooc.activitiweb.util.GlobalConfig;
import org.activiti.api.process.model.ProcessInstance;
......@@ -13,11 +13,11 @@ import org.activiti.api.process.runtime.ProcessRuntime;
import org.activiti.api.runtime.shared.query.Page;
import org.activiti.api.runtime.shared.query.Pageable;
import org.activiti.api.task.model.Task;
import org.activiti.api.task.model.builders.TaskPayloadBuilder;
import org.activiti.api.task.runtime.TaskRuntime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import java.util.List;
......@@ -37,6 +37,8 @@ public class HelloController {
private ProcessRuntime processRuntime;
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String say() {
return "你好";
......@@ -94,6 +96,7 @@ public class HelloController {
.withProcessDefinitionKey(processDefinitionKey)
.withName(instanceName)
.withVariable("assignee", "bajie")
.withVariable("day", "4")
.withBusinessKey("自定义BusinessKey")
.build());
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
......@@ -104,4 +107,27 @@ public class HelloController {
}
}
//完成待办任务带参数
@GetMapping(value = "/testcompleteTask")
public AjaxResponse testcompleteTask(@RequestParam("taskID") String taskID) {
try {
if (GlobalConfig.Test) {
securityUtil.logInAs("bajie");
}
Task task = taskRuntime.task(taskID);
taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId())
.withVariable("day", "2")//执行环节设置变量
.build());
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
GlobalConfig.ResponseCode.SUCCESS.getDesc(), null);
} catch (Exception e) {
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(),
"完成失败", e.toString());
}
}
}
package com.imooc.activitiweb.controller;
import com.imooc.activitiweb.SecurityUtil;
import com.imooc.activitiweb.mapper.ActivitiMapper;
import com.imooc.activitiweb.util.AjaxResponse;
import com.imooc.activitiweb.util.GlobalConfig;
import org.activiti.api.process.runtime.ProcessRuntime;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
......@@ -12,9 +12,11 @@ import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
......@@ -23,10 +25,6 @@ import java.util.UUID;
import java.util.zip.ZipInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("/processDefinition")
public class ProcessDefinitionController {
......@@ -40,6 +38,9 @@ public class ProcessDefinitionController {
@Autowired
private SecurityUtil securityUtil;
@Autowired
ActivitiMapper mapper;
@PostMapping(value = "/uploadStreamAndDeployment")
public AjaxResponse uploadStreamAndDeployment(@RequestParam("processFile") MultipartFile multipartFile) {
......@@ -118,14 +119,14 @@ public class ProcessDefinitionController {
* @return
*/
@PostMapping(value = "/addDeploymentByFileNameBPMN")
public AjaxResponse addDeploymentByFileNameBPMN(@RequestParam("deploymentFileUUID") String deploymentFileUUID,@RequestParam("deploymentName") String deploymentName) {
public AjaxResponse addDeploymentByFileNameBPMN(@RequestParam("deploymentFileUUID") String deploymentFileUUID, @RequestParam("deploymentName") String deploymentName) {
try {
String filename = "resources/bpmn/" + deploymentFileUUID;
Deployment deployment = repositoryService.createDeployment()//初始化流程
.addClasspathResource(filename)
.name(deploymentName)
.deploy();
System.out.println(deployment.getName());
//System.out.println(deployment.getName());
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
GlobalConfig.ResponseCode.SUCCESS.getDesc(), deployment.getId());
} catch (Exception e) {
......@@ -136,13 +137,13 @@ public class ProcessDefinitionController {
}
@PostMapping(value = "/addDeploymentByString")
public AjaxResponse addDeploymentByString(@RequestParam("stringBPMN") String stringBPMN,@RequestParam("deploymentName") String deploymentName) {
public AjaxResponse addDeploymentByString(@RequestParam("stringBPMN") String stringBPMN) {
try {
Deployment deployment = repositoryService.createDeployment()
.addString("OnLine.bpmn",stringBPMN)
.name(deploymentName)
.addString("CreateWithBPMNJS.bpmn",stringBPMN)
.name("不知道在哪显示的部署名称")
.deploy();
System.out.println(deployment.getName());
//System.out.println(deployment.getName());
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
GlobalConfig.ResponseCode.SUCCESS.getDesc(), deployment.getId());
} catch (Exception e) {
......@@ -190,12 +191,13 @@ public class ProcessDefinitionController {
for (ProcessDefinition pd : list) {
HashMap<String, Object> hashMap = new HashMap<>();
System.out.println("流程定义ID:"+pd.getId());
hashMap.put("Name", pd.getName());
hashMap.put("Key", pd.getKey());
hashMap.put("ResourceName", pd.getResourceName());
hashMap.put("DeploymentId", pd.getDeploymentId());
hashMap.put("Version", pd.getVersion());
//System.out.println("流程定义ID:"+pd.getId());
hashMap.put("processDefinitionID", pd.getId());
hashMap.put("name", pd.getName());
hashMap.put("key", pd.getKey());
hashMap.put("resourceName", pd.getResourceName());
hashMap.put("deploymentID", pd.getDeploymentId());
hashMap.put("version", pd.getVersion());
listMap.add(hashMap);
}
......@@ -235,13 +237,14 @@ public class ProcessDefinitionController {
@GetMapping(value = "/getDeployments")
public AjaxResponse getDeployments() {
try {
List<HashMap<String, Object>> listMap= new ArrayList<HashMap<String, Object>>();
List<Deployment> list = repositoryService.createDeploymentQuery().list();
for (Deployment dep : list) {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("ID", dep.getId());
hashMap.put("Name", dep.getName());
hashMap.put("DeploymentTime", dep.getDeploymentTime());
hashMap.put("id", dep.getId());
hashMap.put("name", dep.getName());
hashMap.put("deploymentTime", dep.getDeploymentTime());
listMap.add(hashMap);
}
......@@ -258,10 +261,13 @@ public class ProcessDefinitionController {
//删除流程定义
@GetMapping(value = "/delDefinition")
public AjaxResponse delDefinition(@RequestParam("pdID") String pdID) {
public AjaxResponse delDefinition(@RequestParam("depID") String depID, @RequestParam("pdID") String pdID) {
try {
repositoryService.deleteDeployment(pdID, true);
//删除数据
int result = mapper.DeleteFormData(pdID);
repositoryService.deleteDeployment(depID, true);
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
"删除成功", null);
......
package com.imooc.activitiweb.controller;
import com.imooc.activitiweb.SecurityUtil;
import com.imooc.activitiweb.pojo.UserInfoBean;
import com.imooc.activitiweb.util.AjaxResponse;
import com.imooc.activitiweb.util.GlobalConfig;
import com.imooc.activitiweb.pojo.UserInfoBean;
import org.activiti.api.model.shared.model.VariableInstance;
import org.activiti.api.process.model.ProcessInstance;
import org.activiti.api.process.model.builders.ProcessPayloadBuilder;
import org.activiti.api.process.runtime.ProcessRuntime;
import org.activiti.api.runtime.shared.query.Page;
import org.activiti.api.runtime.shared.query.Pageable;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@RestController
......@@ -27,6 +34,9 @@ public class ProcessInstanceController {
@Autowired
private SecurityUtil securityUtil;
@Autowired
private RepositoryService repositoryService;
......@@ -42,22 +52,32 @@ public class ProcessInstanceController {
// securityUtil.logInAs(userInfoBean.getUsername());//这句不需要
// }
processInstances=processRuntime.processInstances(Pageable.of(0, 50));
System.out.println("流程实例数量: " + processInstances.getTotalItems());
//System.out.println("流程实例数量: " + processInstances.getTotalItems());
List<ProcessInstance> list = processInstances.getContent();
//list.sort((y,x)->x.getProcessDefinitionVersion()-y.getProcessDefinitionVersion());
list.sort((y,x)->x.getStartDate().toString().compareTo(y.getStartDate().toString()));
List<HashMap<String, Object>> listMap = new ArrayList<HashMap<String, Object>>();
for(ProcessInstance pi:list){
System.out.println("getId:"+pi.getId());
System.out.println("getName:"+pi.getName());
System.out.println("getStatus:"+pi.getStatus());
System.out.println("getProcessDefinitionId:"+pi.getProcessDefinitionId());
System.out.println("getProcessDefinitionKey:"+pi.getProcessDefinitionKey());
System.out.println("getStartDate:"+pi.getStartDate());
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("id", pi.getId());
hashMap.put("name", pi.getName());
hashMap.put("status", pi.getStatus());
hashMap.put("processDefinitionId", pi.getProcessDefinitionId());
hashMap.put("processDefinitionKey", pi.getProcessDefinitionKey());
hashMap.put("startDate", pi.getStartDate());
hashMap.put("processDefinitionVersion", pi.getProcessDefinitionVersion());
//因为processRuntime.processDefinition("流程部署ID")查询的结果没有部署流程与部署ID,所以用repositoryService查询
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(pi.getProcessDefinitionId())
.singleResult();
hashMap.put("resourceName", pd.getResourceName());
hashMap.put("deploymentId", pd.getDeploymentId());
listMap.add(hashMap);
}
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
GlobalConfig.ResponseCode.SUCCESS.getDesc(),processInstances.getContent());
GlobalConfig.ResponseCode.SUCCESS.getDesc(),listMap);
} catch (Exception e) {
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(),
"获取流程实例失败", e.toString());
......@@ -78,13 +98,12 @@ public class ProcessInstanceController {
}else{
securityUtil.logInAs(SecurityContextHolder.getContext().getAuthentication().getName());
}
ProcessInstance processInstance = processRuntime.start(ProcessPayloadBuilder
.start()
.withProcessDefinitionKey(processDefinitionKey)
.withName(instanceName)
.withVariable("content", instanceVariable)
.withVariable("参数2", "参数2的值")
//.withVariable("content", instanceVariable)
//.withVariable("参数2", "参数2的值")
.withBusinessKey("自定义BusinessKey")
.build());
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
......
package com.imooc.activitiweb.controller;
import com.imooc.activitiweb.SecurityUtil;
import com.imooc.activitiweb.mapper.ActivitiMapper;
import com.imooc.activitiweb.util.AjaxResponse;
import com.imooc.activitiweb.util.GlobalConfig;
import org.activiti.api.process.model.ProcessInstance;
......@@ -10,16 +11,19 @@ import org.activiti.api.runtime.shared.query.Pageable;
import org.activiti.api.task.model.Task;
import org.activiti.api.task.model.builders.TaskPayloadBuilder;
import org.activiti.api.task.runtime.TaskRuntime;
import org.activiti.bpmn.model.FormProperty;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.RepositoryService;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@RestController
@RequestMapping("/task")
public class TaskController {
......@@ -32,6 +36,12 @@ public class TaskController {
@Autowired
private ProcessRuntime processRuntime;
@Autowired
private RepositoryService repositoryService;
@Autowired
ActivitiMapper mapper;
//获取我的代办任务
@GetMapping(value = "/getTasks")
public AjaxResponse getTasks() {
......@@ -46,17 +56,17 @@ public class TaskController {
for (Task tk : tasks.getContent()) {
ProcessInstance processInstance = processRuntime.processInstance(tk.getProcessInstanceId());
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("ID", tk.getId());
hashMap.put("Name", tk.getName());
hashMap.put("Status", tk.getStatus());
hashMap.put("CreatedDate", tk.getCreatedDate());
if(tk.getAssignee() == null){//执行人,null时前台显示未拾取
hashMap.put("Assignee", "待拾取任务");
}else {
hashMap.put("Assignee", tk.getAssignee());//
hashMap.put("id", tk.getId());
hashMap.put("name", tk.getName());
hashMap.put("status", tk.getStatus());
hashMap.put("createdDate", tk.getCreatedDate());
if (tk.getAssignee() == null) {//执行人,null时前台显示未拾取
hashMap.put("assignee", "待拾取任务");
} else {
hashMap.put("assignee", tk.getAssignee());//
}
hashMap.put("InstanceName", processInstance.getName());
hashMap.put("instanceName", processInstance.getName());
listMap.add(hashMap);
}
......@@ -84,7 +94,9 @@ public class TaskController {
if (task.getAssignee() == null) {
taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());
}
taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()).build());
taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId())
//.withVariable("num", "2")//执行环节设置变量
.build());
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
......@@ -127,4 +139,165 @@ public class TaskController {
}
}
//渲染表单
@GetMapping(value = "/formDataShow")
public AjaxResponse formDataShow(@RequestParam("taskID") String taskID) {
try {
if (GlobalConfig.Test) {
securityUtil.logInAs("bajie");
}
Task task = taskRuntime.task(taskID);
//-----------------------构建表单控件历史数据字典------------------------------------------------
//本实例所有保存的表单数据HashMap,为了快速读取控件以前环节存储的值
HashMap<String, String> controlistMap = new HashMap<>();
//本实例所有保存的表单数据
List<HashMap<String, Object>> tempControlList = mapper.selectFormData(task.getProcessInstanceId());
for (HashMap ls : tempControlList) {
//String Control_ID = ls.get("Control_ID_").toString();
//String Control_VALUE = ls.get("Control_VALUE_").toString();
controlistMap.put(ls.get("Control_ID_").toString(), ls.get("Control_VALUE_").toString());
}
//String controlistMapValue = controlistMap.get("控件ID");
//controlistMap.containsKey()
//
/* ------------------------------------------------------------------------------
FormProperty_0ueitp2-_!类型-_!名称-_!默认值-_!是否参数
例子:
FormProperty_0lovri0-_!string-_!姓名-_!请输入姓名-_!f
FormProperty_1iu6onu-_!int-_!年龄-_!请输入年龄-_!s
默认值:无、字符常量、FormProperty_开头定义过的控件ID
是否参数:f为不是参数,s是字符,t是时间(不需要int,因为这里int等价于string)
注:类型是可以获取到的,但是为了统一配置原则,都配置到
*/
//注意!!!!!!!!:表单Key必须要任务编号一模一样,因为参数需要任务key,但是无法获取,只能获取表单key“task.getFormKey()”当做任务key
UserTask userTask = (UserTask) repositoryService.getBpmnModel(task.getProcessDefinitionId())
.getFlowElement(task.getFormKey());
if (userTask == null) {
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
GlobalConfig.ResponseCode.SUCCESS.getDesc(), "无表单");
}
List<FormProperty> formProperties = userTask.getFormProperties();
List<HashMap<String, Object>> listMap = new ArrayList<HashMap<String, Object>>();
for (FormProperty fp : formProperties) {
String[] splitFP = fp.getId().split("-_!");
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("id", splitFP[0]);
hashMap.put("controlType", splitFP[1]);
hashMap.put("controlLable", splitFP[2]);
//默认值如果是表单控件ID
if (splitFP[3].startsWith("FormProperty_")) {
//控件ID存在
if (controlistMap.containsKey(splitFP[3])) {
hashMap.put("controlDefValue", controlistMap.get(splitFP[3]));
} else {
//控件ID不存在
hashMap.put("controlDefValue", "读取失败,检查" + splitFP[0] + "配置");
}
} else {
//默认值如果不是表单控件ID则写入默认值
hashMap.put("controlDefValue", splitFP[3]);
}
hashMap.put("controlIsParam", splitFP[4]);
listMap.add(hashMap);
}
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
GlobalConfig.ResponseCode.SUCCESS.getDesc(), listMap);
} catch (Exception e) {
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(),
"失败", e.toString());
}
}
//保存表单
@PostMapping(value = "/formDataSave")
public AjaxResponse formDataSave(@RequestParam("taskID") String taskID,
@RequestParam("formData") String formData) {
try {
if (GlobalConfig.Test) {
securityUtil.logInAs("bajie");
}
Task task = taskRuntime.task(taskID);
//formData:控件id-_!控件值-_!是否参数!_!控件id-_!控件值-_!是否参数
//FormProperty_0lovri0-_!不是参数-_!f!_!FormProperty_1iu6onu-_!数字参数-_!s
HashMap<String, Object> variables = new HashMap<String, Object>();
Boolean hasVariables = false;//没有任何参数
List<HashMap<String, Object>> listMap = new ArrayList<>();
//前端传来的字符串,拆分成每个控件
String[] formDataList = formData.split("!_!");//
for (String controlItem : formDataList) {
String[] formDataItem = controlItem.split("-_!");
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("PROC_DEF_ID_", task.getProcessDefinitionId());
hashMap.put("PROC_INST_ID_", task.getProcessInstanceId());
hashMap.put("FORM_KEY_", task.getFormKey());
hashMap.put("Control_ID_", formDataItem[0]);
hashMap.put("Control_VALUE_", formDataItem[1]);
listMap.add(hashMap);
//构建参数集合
switch (formDataItem[2]) {
case "f":
System.out.println("控件值不作为参数");
break;
case "s":
variables.put(formDataItem[0], formDataItem[1]);
hasVariables = true;
break;
case "t":
SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
variables.put(formDataItem[0], timeFormat.parse(formDataItem[2]));
hasVariables = true;
break;
case "b":
variables.put(formDataItem[0], BooleanUtils.toBoolean(formDataItem[2]));
hasVariables = true;
break;
default:
System.out.println("控件参数类型配置错误:" + formDataItem[0] + "的参数类型不存在," + formDataItem[2]);
}
}//for结束
if (hasVariables) {
//带参数完成任务
taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskID)
.withVariables(variables)
.build());
} else {
taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskID)
.build());
}
//写入数据库
int result = mapper.insertFormData(listMap);
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
GlobalConfig.ResponseCode.SUCCESS.getDesc(), listMap);
} catch (Exception e) {
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(),
"失败", e.toString());
}
}
}
package com.imooc.activitiweb.controller;
import com.imooc.activitiweb.mapper.ActivitiMapper;
import com.imooc.activitiweb.util.AjaxResponse;
import com.imooc.activitiweb.util.GlobalConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
ActivitiMapper mapper;
//获取用户
@GetMapping(value = "/getUsers")
public AjaxResponse getUsers() {
try {
List<HashMap<String, Object>> userList = mapper.selectUser();
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.SUCCESS.getCode(),
GlobalConfig.ResponseCode.SUCCESS.getDesc(), userList);
} catch (Exception e) {
return AjaxResponse.AjaxData(GlobalConfig.ResponseCode.ERROR.getCode(),
"获取用户列表失败", e.toString());
}
}
}
package com.imooc.activitiweb.listener;
import org.activiti.engine.delegate.BpmnError;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
public class ErrServiceTaskListener implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
throw new BpmnError("Error_21ldg70");
}
}
package com.imooc.activitiweb.listener;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import java.util.ArrayList;
public class MultInstancesStartListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) {
ArrayList<String> assigneeList = new ArrayList<>();
assigneeList.add("bajie");
assigneeList.add("wukong");
assigneeList.add("salaboy");
execution.setVariable("assigneeList",assigneeList);
//execution.setVariable("isPass",0);
}
}
package com.imooc.activitiweb.listener;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class MultInstancesTKListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("执行人:"+delegateTask.getAssignee());
//根据任务节点逻辑查询实际需要的执行人是谁
delegateTask.setAssignee("wukong");
}
}
package com.imooc.activitiweb.listener;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.delegate.Expression;
import org.springframework.beans.factory.annotation.Autowired;
public class PiListener implements ExecutionListener {
@Autowired
private Expression sendType;
@Override
public void notify(DelegateExecution execution) {
System.out.println(execution.getEventName());
System.out.println(execution.getProcessDefinitionId());
if("start".equals(execution.getEventName())){
//记录节点开始时间
}else if("end".equals(execution.getEventName())){
//记录节点结束时间
}
System.out.println("sendType:"+sendType.getValue(execution).toString());
}
}
package com.imooc.activitiweb.listener;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
public class ServiceTaskListener1 implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
System.out.println(execution.getEventName());
System.out.println(execution.getProcessDefinitionId());
System.out.println(execution.getProcessInstanceId());
execution.setVariable("aa","bb");
}
}
package com.imooc.activitiweb.listener;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
public class ServiceTaskListener2 implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) {
execution.getVariable("aa");
System.out.println(execution.getVariable("aa"));
}
}
package com.imooc.activitiweb.listener;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class TkListener1 implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("执行人:"+delegateTask.getAssignee());
//根据用户名查询用户电话并调用发送短信接口
delegateTask.setVariable("delegateAssignee",delegateTask.getAssignee());
}
}
package com.imooc.activitiweb.listener;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
public class TkListener2 implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
System.out.println("执行人2:"+delegateTask.getVariable("delegateAssignee"));
//根据执行人username获取组织机构代码,加工后得到领导是wukong
delegateTask.setAssignee("wukong");
}
}
......@@ -3,10 +3,10 @@ package com.imooc.activitiweb.mapper;
import com.imooc.activitiweb.pojo.Act_ru_task;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
......@@ -14,6 +14,42 @@ import java.util.List;
@Component
public interface ActivitiMapper {
//读取表单
@Select("SELECT Control_ID_,Control_VALUE_ from formdata where PROC_INST_ID_ = #{PROC_INST_ID}")
List<HashMap<String, Object>> selectFormData(@Param("PROC_INST_ID") String PROC_INST_ID);
//写入表单
@Insert("<script> insert into formdata (PROC_DEF_ID_,PROC_INST_ID_,FORM_KEY_,Control_ID_,Control_VALUE_)" +
" values" +
" <foreach collection=\"maps\" item=\"formData\" index=\"index\" separator=\",\">" +
" (#{formData.PROC_DEF_ID_,jdbcType=VARCHAR},#{formData.PROC_INST_ID_,jdbcType=VARCHAR}," +
" #{formData.FORM_KEY_,jdbcType=VARCHAR}, #{formData.Control_ID_,jdbcType=VARCHAR},#{formData.Control_VALUE_,jdbcType=VARCHAR})" +
" </foreach> </script>")
int insertFormData(@Param("maps") List<HashMap<String, Object>> maps);
//删除表单
@Delete("DELETE FROM formdata WHERE PROC_DEF_ID_ = #{PROC_DEF_ID}")
int DeleteFormData(@Param("PROC_DEF_ID") String PROC_DEF_ID);
//获取用户名
@Select("SELECT name,username from user")
List<HashMap<String, Object>> selectUser();
//测试
@Select("select NAME_,TASK_DEF_KEY_ from act_ru_task")
List<Act_ru_task> selectName();
//流程定义数
//SELECT COUNT(ID_) from ACT_RE_PROCDEF
//进行中的流程实例
//SELECT COUNT(DISTINCT PROC_INST_ID_) from act_ru_execution
//查询流程定义产生的流程实例数
/* SELECT p.NAME_,COUNT(DISTINCT e.PROC_INST_ID_) as PiNUM from act_ru_execution AS e
RIGHT JOIN ACT_RE_PROCDEF AS p on e.PROC_DEF_ID_ = p.ID_
WHERE p.NAME_ IS NOT NULL GROUP BY p.NAME_*/
}
......@@ -6,7 +6,7 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
public class ActivitiSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private LoginSuccessHandler loginSuccessHandler;
......
......@@ -15,7 +15,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
public class BrowserSecurityController {
public class ActivitiSecurityController {
private Logger logger = LoggerFactory.getLogger(getClass());
private RequestCache requestCache = new HttpSessionRequestCache();
private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
......
package com.imooc.activitiweb.security;
import com.imooc.activitiweb.pojo.UserInfoBean;
import com.imooc.activitiweb.mapper.UserInfoBeanMapper;
import com.imooc.activitiweb.pojo.UserInfoBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -15,7 +15,7 @@ public class SimpleResponse {
this.content = content;
}
private Object content;
private Object content;
}
......@@ -2,11 +2,13 @@ server:
port: 8080
servlet:
context-path: /
session:
timeout: 9000
spring:
datasource:
username: root
password: YourPassWord_NiDeMiMa
url: jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true
password: 666666
url: jdbc:mysql://192.168.1.196:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
#日志的相关配置
logging:
......@@ -17,5 +19,4 @@ spring.activiti.history-level: full
spring.activiti.db-history-used: true
# spring-activiti
# 自动部署验证设置:true-开启(默认)、false-关闭
spring.activiti.check-process-definitions: false
spring.activiti.check-process-definitions: false
\ No newline at end of file
node_modules/
tmp/
\ No newline at end of file
tmp/
dist/
\ No newline at end of file
......@@ -12,6 +12,7 @@
<style>
.item{
display: none;
cursor: pointer;
}
.bjs-powered-by {
display: none;
......@@ -78,28 +79,29 @@
<li class="item upload">
<form id="form1" name="myForm" onsubmit="return false" method="post" enctype="multipart/form-data" title="上传文件">
<input type="file" name="uploadFile" id="uploadFile" accept=".bpmn" style="display: none">
<label class="label" for="uploadFile" >打开</label>
<label class="label" for="uploadFile" >导入</label>
</form>
</li>
<li class="item download">
<a class="btn" href id="downloadBpmn">导出</a>
</li>
<li class="item submit">
<a class="btn" id="js-download-diagram">
提交
部署
</a>
</li>
<li class="item download">
<a class="btn" href id="saveBpmn">下载</a>
</li>
</ul>
<div class="sy-alert sy-alert-model animated" sy-enter="zoomIn" sy-leave="zoomOut" sy-type="confirm" sy-mask="true" id="alert" >
<div class="sy-title">新增流程</div>
<div class="sy-title">部署流程</div>
<div class="sy-content">
<div class="form">
<p class="input-item"><input id="deploymentName" type="text" placeholder="请输入流程名称"></p>
</div>
确认是否部署该流程
<!-- <div class="form">-->
<!-- <p class="input-item"><input id="deploymentName" type="text" placeholder="请输入流程名称"></p>-->
<!-- </div>-->
</div>
<div class="sy-btn">
<button class="cancel" >取消</button>
<button id="sure">确定</button>
<button class="cancel" >取消</button>
</div>
</div>
<div class="sy-mask cancel"></div>
......
......@@ -18,16 +18,7 @@ const publicurl = proHost + key;
var customTranslateModule = {
translate: ['value', customTranslate]
};
var ColorJson = [{
'name': 'test1',
'stroke': 'green',
'fill': 'yellow'
}, {
'name': 'test2',
'stroke': 'blue',
'fill': 'red'
}]
debugger
var container = $('#js-drop-zone');
var canvas = $('#js-canvas');
var bpmnModeler = new BpmnModeler({
......@@ -61,34 +52,69 @@ $(function () {
if (param.type === 'addBpmn') {
tools.createDiagram(diagramXML, bpmnModeler, container);
} else if (param.type === 'lookBpmn') { //编辑bpmn
debugger
$('.item').hide()
$('.download').show()
const Id = param.deploymentFileUUID || '6d4af2dc-bab0-11ea-b584-3cf011eaafca'
const Name=param.deploymentName || 'String.bpmn'
//加载后台方法获取xml
const instanceId=param.instanceId
var param={
"deploymentId":Id,
"resourceName":Name
"resourceName":decodeURI(Name)
}
$.ajax({
url: publicurl+'processDefinition/getDefinitionXML',
type: 'GET',
data: param,
dataType:'text',
success: function (result) {
var newXmlData = result
tools.createDiagram(newXmlData, bpmnModeler, container);
setTimeout(function () {
for (var i in ColorJson) {
tools.setColor(ColorJson[i],bpmnModeler)
}
}, 200)
},
error: function (err) {
console.log(err)
if(instanceId){
var param1={
instanceId
}
});
$.ajax({
url: publicurl+'activitiHistory/gethighLine',
type: 'GET',
data: param1,
dataType:'json',
success: function (result) {
var ColorJson=tools.getByColor(result.obj)
$.ajax({
url: publicurl+'processDefinition/getDefinitionXML',
type: 'GET',
data: param,
dataType:'text',
success: function (result) {
var newXmlData = result
tools.createDiagram(newXmlData, bpmnModeler, container);
setTimeout(function () {
for (var i in ColorJson) {
tools.setColor(ColorJson[i],bpmnModeler)
}
}, 200)
},
error: function (err) {
console.log(err)
}
});
},
error: function (err) {
console.log(err)
}
});
}else{
//加载后台方法获取xml
$.ajax({
url: publicurl+'processDefinition/getDefinitionXML',
type: 'GET',
data: param,
dataType:'text',
success: function (result) {
var newXmlData = result
tools.createDiagram(newXmlData, bpmnModeler, container);
},
error: function (err) {
console.log(err)
}
});
}
} else if(param.type === "historyBpmn") { // bpmn历史
$('.item').hide()
$('.download').show()
}
// 点击新增
$('#js-download-diagram').on("click", function () {
......@@ -101,14 +127,14 @@ $(function () {
})
// 点击确定
$('#sure').on('click',function(){
const text=$("#deploymentName").val()
tools.saveBpmn(bpmnModeler,text)
// const text=$("#deploymentName").val()
tools.saveBpmn(bpmnModeler)
})
// 点击下载
$("#saveBpmn").on("click", function () {
$("#downloadBpmn").on("click", function () {
tools.downLoad(bpmnModeler)
})
// 点击上传
......
......@@ -12,6 +12,7 @@
<style>
.item{
display: none;
cursor: pointer;
}
.bjs-powered-by {
display: none;
......@@ -78,28 +79,29 @@
<li class="item upload">
<form id="form1" name="myForm" onsubmit="return false" method="post" enctype="multipart/form-data" title="上传文件">
<input type="file" name="uploadFile" id="uploadFile" accept=".bpmn" style="display: none">
<label class="label" for="uploadFile" >打开</label>
<label class="label" for="uploadFile" >导入</label>
</form>
</li>
<li class="item download">
<a class="btn" href id="downloadBpmn">导出</a>
</li>
<li class="item submit">
<a class="btn" id="js-download-diagram">
提交
部署
</a>
</li>
<li class="item download">
<a class="btn" href id="saveBpmn">下载</a>
</li>
</ul>
<div class="sy-alert sy-alert-model animated" sy-enter="zoomIn" sy-leave="zoomOut" sy-type="confirm" sy-mask="true" id="alert" >
<div class="sy-title">新增流程</div>
<div class="sy-title">部署流程</div>
<div class="sy-content">
<div class="form">
<p class="input-item"><input id="deploymentName" type="text" placeholder="请输入流程名称"></p>
</div>
确认是否部署该流程
<!-- <div class="form">-->
<!-- <p class="input-item"><input id="deploymentName" type="text" placeholder="请输入流程名称"></p>-->
<!-- </div>-->
</div>
<div class="sy-btn">
<button class="cancel" >取消</button>
<button id="sure">确定</button>
<button class="cancel" >取消</button>
</div>
</div>
<div class="sy-mask cancel"></div>
......
......@@ -267,7 +267,7 @@
],
"properties": [
{
"name": "candidateStarterGroups",
"name": "candidateStarterConfiguration",
"isAttr": true,
"type": "String"
},
......@@ -291,6 +291,12 @@
"isAttr": true,
"type": "Boolean",
"default": true
},
{
"name": "process-is-executable",
"isAttr": true,
"type": "Boolean",
"default": true
}
]
},
......
<?xml version="1.0" encoding="UTF-8"?>
<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd" id="sample-diagram" targetNamespace="http://activiti.org/bpmn">
<bpmn2:process id="Process_1" isExecutable="false">
<bpmn2:process id="Process_1" isExecutable="true">
<bpmn2:startEvent id="StartEvent_1"/>
</bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
......
......@@ -91,10 +91,6 @@ const tools = {
return console.error('保存失败,请重试', err);
}
console.log(xml)
// const jsonObj = $x2j.xml2js(xml);
// console.log(jsonObj)
// let newXml = tools.camundaChangeActiviti(xml);
// console.log(newXml)
var param={
"deploymentName":text,
"stringBPMN":xml
......@@ -242,27 +238,6 @@ const tools = {
camundaChangeActiviti(xmlfile){
const objXML = xmlfile.replace(/camunda/gi,"activiti");
return objXML;
// for(let e in json){
// if(e=='extensionElements'&&json.extensionElements.formData&&json.extensionElements.formData.formField){
// json.extensionElements._businessKey=json.extensionElements.formData._businessKey
// let formProperty = JSON.parse(JSON.stringify(json.extensionElements.formData.formField))
// if(tools.isArrayFn(formProperty)){
// formProperty.forEach(x=>{
// x.__prefix='activiti'
// })
// } else {
// formProperty.__prefix='activiti'
// }
// json.extensionElements.formProperty = formProperty
// delete json.extensionElements.formData
// } else if(e.includes('camunda')){
// let str = e.replace('camunda','activiti')
// json[str] = json[e]
// delete json[e]
// } else if(typeof json[e] == 'object'){
// tools.camundaChangeActiviti(json[e])
// }
// }
},
/**
* 修改activiti为camunda
......@@ -271,26 +246,6 @@ const tools = {
acitvitiChangeCamunda(xmlfile){
const objXML = xmlfile.replace(/activiti/gi,"camunda");
return objXML;
// for(let e in json){
// if(e=='extensionElements'&&json.extensionElements.formProperty){
// let formField = JSON.parse(JSON.stringify(json.extensionElements.formProperty))
// if(tools.isArrayFn(formField)){
// formField.forEach(x=>{
// x.__prefix='camunda'
// })
// } else {
// formField.__prefix='camunda'
// }
// json.extensionElements.formData = {
// formField,
// _businessKey:json.extensionElements._businessKey,
// __prefix:"camunda"
// }
// delete json.extensionElements.formProperty
// } else if(typeof json[e] == 'object'){
// tools.acitvitiChangeCamunda(json[e])
// }
// }
},
/**
......@@ -304,6 +259,60 @@ const tools = {
}else{
return Object.prototype.toString.call(value) === "[object Array]";
}
},
/**
* 根据数据设置颜色
* @param data
* @returns {Array}
*/
getByColor(data){
var ColorJson=[]
for(var i in data){
switch (i) {
case "waitingToDo":
for(var k in data[i]){
var par={
"name": data[i][k],
"stroke":"green",
"fill":"yellow"
}
ColorJson.push(par)
}
break
case "highPoint":
for(var k in data[i]){
var par={
"name": data[i][k],
"stroke":"gray",
"fill":"#eae9e9"
}
ColorJson.push(par)
}
break
case "iDo":
for(var k in data[i]){
var par={
"name": data[i][k],
"stroke":"green",
"fill":"#a3d68e"
}
ColorJson.push(par)
}
break
case "highLine":
for(var k in data[i]){
var par={
"name": data[i][k],
"stroke":"green",
"fill":"green"
}
ColorJson.push(par)
}
break
}
}
return ColorJson
}
}
......
......@@ -4,7 +4,7 @@
"href": "page/welcome-2.html?t=1"
},
"logoInfo": {
"title": "慕课工作流",
"title": "工作流",
"image": "images/logo.png",
"href": ""
},
......@@ -23,13 +23,13 @@
},
{
"title": "流程部署列表",
"href": "page/ProcessDeployments.html",
"href": "page/ProcessDefinition.html",
"icon": "fa fa-calendar",
"target": "_self"
},
{
"title": "流程实例列表",
"href": "page/ProcessDefinition.html",
"href": "page/ProcessInstance.html",
"icon": "fa fa-calendar",
"target": "_self"
},
......
......@@ -75,6 +75,9 @@ body {
.layui-table-tool-temp{
padding-right: 0;
}
.layui-table{
width: 100% !important;
}
.floatR{
float: right;
}
......
......@@ -2,9 +2,9 @@
<html>
<head>
<meta charset="utf-8">
<title> 慕课工作流</title>
<meta name="keywords" content=" 慕课工作流">
<meta name="description" content=" 慕课工作流">
<title> 工作流</title>
<meta name="keywords" content=" 工作流">
<meta name="description" content=" 工作流">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Access-Control-Allow-Origin" content="*">
......
......@@ -60,7 +60,7 @@
}
}
return {
"code": res.status === 1 ? 0 : res.status, //解析接口状态,默认成功是0
"code": res.status, //解析接口状态,默认成功是0
"msg": res.msg, //解析提示文本
"count": res.obj.length, //解析数据长度
"data": res.obj //解析数据列表
......@@ -75,7 +75,6 @@
{field: 'createTime', title: '创建时间', minWidth: 170,align:"center"},
{field: 'startTime', title: '开始时间', minWidth: 170,align:"center"},
{field: 'assignee', title: '办理人', minWidth: 90,align:"center"},
{title: '操作', minWidth: 200, toolbar: '#currentTableBar', align: "center"}
]],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
......@@ -83,6 +82,12 @@
skin: 'line',
// id:'HistoryTasksTableId',
done:function (res, curr, count) {
if(res.code==1){
layer.alert(res.msg+'<br>'+res.data, {
icon: 2,
title:"提示"
});
}
if(count>0){
goPage(1);
}
......
......@@ -7,59 +7,117 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="../lib/layui-v2.5.5/css/layui.css" media="all">
<link rel="stylesheet" href="../css/admins.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
</head>
<style>
.layui-upload-file{
display: block !important;
position: absolute;
left: 52%;
top: 0;
width: 103px;
height: 38px;
z-index: 99;
}
</style>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<span class="layui-card-header"><i class="layui-icon layui-icon-form"></i>&nbsp;流程实例列表</span>
<span class="layui-card-header"><i class="layui-icon layui-icon-form"></i>&nbsp;流程部署列表</span>
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn floatR" lay-event="draw"> 在线绘制流程 </button>
<button class="layui-btn layui-btn-normal layui-btn-sm data-add-btn floatR" lay-event="add"> 上传流程文件 </button>
</div>
</script>
<table class="layui-hide" id="ProcessDefinitionTableId" lay-filter="currentTableFilter"></table>
<table class="layui-hide" id="ProcessDeploymentsTableId" lay-filter="currentTableFilter"></table>
<!--分页-->
<div class="layui-table-page layui-border-box">
<div id="barcon" class="page_div" name="barcon"></div>
</div>
<script type="text/html" id="currentTableBar">
{{# if(d.status == 'RUNNING'){ }}
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-hangUp" lay-event="hangUp">挂起</a>
{{# }else{ }}
<a class="layui-btn layui-btn-success layui-btn-xs data-count-active" lay-event="active">激活</a>
{{# } }}
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-start" lay-event="start">启动实例</a>
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-look" lay-event="look">查看</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除部署</a>
</script>
</div>
</div>
<!-- 表单添加bpmn弹窗 -->
<script type="text/html" id="ProcessDepEditDialog">
<form id="ProcessDepForm" lay-filter="ProcessDepForm" class="layui-form model-form" enctype="multipart/form-data">
<div class="layui-form-item">
<label class="layui-form-label layui-form-required">上传文件:</label>
<div class="layui-input-block">
<input id="fileName" placeholder="" class="layui-input DialogInput"
lay-verType="tips" disabled/>
<button type="button" class="layui-btn DialogBtn" id="uploadBpmn"><i class="layui-icon"></i>上传BPMN</button>
<input class="layui-upload-file" type="file" accept="" name="processFile" id="uploadFile">
</div>
</div>
<!-- <div class="layui-form-item">-->
<!-- <label class="layui-form-label layui-form-required">流程名称:</label>-->
<!-- <div class="layui-input-block">-->
<!-- <input name="deploymentName" id="deploymentName" placeholder="请输入流程名称" class="layui-input"-->
<!-- lay-verType="tips" lay-verify="required" required/>-->
<!-- </div>-->
<!-- </div>-->
<div class="layui-form-item text-center">
<button class="layui-btn" lay-filter="ProcessDepEditSubmit" lay-submit id="submit">提交</button>
<button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">返回</button>
</div>
</form>
</script>
<!--启动实例弹窗-->
<script type="text/html" id="stratProcessDepEditDialog">
<form id="strarProcessDepForm" lay-filter="strarProcessDepForm" class="layui-form model-form">
<div class="layui-form-item">
<label class="layui-form-label layui-form-required">实例名称:</label>
<div class="layui-input-block">
<input name="deploymentName" id="instanceName" placeholder="请输入实例名称" class="layui-input"
lay-verType="tips" lay-verify="required" required/>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label layui-form-required">实例描述:</label>
<div class="layui-input-block">
<input name="deploymentName" id="instanceVariable" placeholder="请输入实例描述" class="layui-input"
lay-verType="tips" lay-verify="required" required/>
</div>
</div>
<div class="layui-form-item text-center">
<button class="layui-btn" lay-filter="startProcessDepEditSubmit" lay-submit id="submit2">提交</button>
<button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">返回</button>
</div>
</form>
</script>
<script src="../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
<script src="../lib/jquery-3.4.1/jquery-3.4.1.min.js"></script>
<script src="../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script src="../js/ManualPaging.js"></script>
<script>
layui.use(['form', 'table'], function () {
layui.use(['form', 'table','admin','upload','laypage'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table;
table = layui.table,
upload = layui.upload,
laypage = layui.laypage,
admin = layui.admin;
/*渲染列表*/
var limitcount = 10;
var curnum = 1;
var insTb = table.render({
elem: '#ProcessDefinitionTableId',
elem: '#ProcessDeploymentsTableId',
toolbar: '#toolbarDemo',
defaultToolbar: [''],
url: ''+publicurl+'processInstance/getInstances',
defaultToolbar: [],
url: ''+publicurl+'processDefinition/getDefinitions',
parseData: function(res){ //res 即为原始返回的数据
// console.log(res.obj.length,"数据长度")
//处理时间
for(var i = 0 ; i< res.obj.length ; i++){
for(k in res.obj[i]) {
res.obj[i]["startDate"] = renderTime(res.obj[i].startDate)
}
}
return {
"code": res.status === 1 ? 0 : res.status, //解析接口状态,默认成功是0
"code": res.status, //解析接口状态,默认成功是0
"msg": res.msg, //解析提示文本
"count": res.obj.length, //解析数据长度
"data": res.obj //解析数据列表
......@@ -67,100 +125,129 @@
},
cols: [[
{type: "checkbox", width:'5%',align:"center"},
{field: 'id', width:'22%', title: 'ID',align:"center"},
{field: 'processDefinitionKey', width:'12%', title: '实例名称',align:"center"},
{field: 'startDate', title: '实例创建时间', width:'15%',align:"center"},
{field: 'initiator', width:'8%', title: '创建人',align:"center"},
{field: 'processDefinitionId', title: '流程定义编号', width:'20%',align:"center"},
{field: 'processDefinitionVersion', width:'6%', title: '版本',align:"center"},
{title: '操作', width:'12%', toolbar: '#currentTableBar', align: "center"}
{field: 'processDefinitionID', width:'12%', title: '流程定义ID', sort: true,align:"center"},
{field: 'deploymentID', width:'10%', title: '部署ID', sort: true,align:"center"},
{field: 'name', width:'15%', title: '流程定义名称',align:"center"},
{field: 'resourceName',width:'15%', title: '流程文件名称',align:"center"},
{field: 'key',width:'14%', title: 'KEY',align:"center"},
{field: 'version', width:'9%', title: '部署版本',align:"center"},
{title: '操作', width:'20%', toolbar: '#currentTableBar', align: "center"}
]],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: false,
skin: 'line',
// id:'ProcessDefinitionTableId',
// id:'ProcessDeploymentsTableId',
done:function (res, curr, count) {
if(res.code==1){
layer.alert(res.msg+'<br>'+res.data, {
icon: 2,
title:"提示"
});
}
if(count>0){
goPage(1);
}
}
});
insTb.reload();
/**
* toolbar监听事件
* toolbar添加bpmn事件
* 新增 ?type=addBpmn
编辑 ?type=editBpmn&id=xxx
*/
table.on('toolbar(currentTableFilter)', function (obj) {
if (obj.event === 'add') { // 监听添加操作
showEditModel();
}else if(obj.event === 'draw'){
window.open(''+publicurl+'bpmnjs/dist/index.html?type=addBpmn');
}
});
/*表格启动 删除事件*/
table.on('tool(currentTableFilter)', function (obj) {
if (obj.event === 'hangUp') { // 监听挂起操作
doHangUp(obj);
} else if (obj.event === 'active'){// 监听激活操作
doActive(obj);
}else if (obj.event === 'delete') { // 监听删除操作
var data = obj.data;
var editData = JSON.stringify(data);
if (obj.event === 'start') {
stratProcessDepEditDialog(obj);
} else if (obj.event === 'delete') {
doDel(obj);
}else if(obj.event === 'look'){
window.open(''+publicurl+'bpmnjs/dist/index.html?type=lookBpmn&deploymentFileUUID='+data.deploymentID+'&deploymentName='+ encodeURI(data.resourceName)+'');
}
});
function renderTime(date) {
var dateee = new Date(date).toJSON();
return new Date(+new Date(dateee) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')
}
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {
console.log(obj)
});
/* 挂起流程定义 */
function doHangUp(obj) {
console.log(obj,"单条数据");
layer.confirm('确定要挂起该流程吗?', {
skin: 'layui-layer-admin',
shade: .1
}, function (i) {
layer.close(i);
var loadIndex = layer.load(2);
$.get( ''+publicurl+'processInstance/suspendInstance', {
instanceID: obj.data ? obj.data.id : '',
}, function (res) {
layer.close(loadIndex);
if (res.status === 0) {
layer.msg(res.msg, {icon: 1});
insTb.reload();
} else {
layer.alert(res.msg+'<br>'+res.obj, {icon: 2});
}
}, 'json');
});
};
/* 激活流程定义 */
function doActive(obj) {
layer.confirm('确定要激活该流程吗?', {
skin: 'layui-layer-admin',
shade: .1
}, function (i) {
layer.close(i);
var loadIndex = layer.load(2);
$.get( ''+publicurl+'processInstance/resumeInstance', {
instanceID: obj.data ? obj.data.id : '',
}, function (res) {
layer.close(loadIndex);
if (res.status === 0) {
layer.msg(res.msg, {icon: 1});
insTb.reload();
} else {
layer.alert(res.msg+'<br>'+res.obj, {icon: 2});
}
}, 'json');
/* 上传流程文件 */
function showEditModel(mData) {
admin.open({
type: 1,
title: (mData ? '修改' : '添加') + '信息',
content: $('#ProcessDepEditDialog').html(),
success: function (layero, dIndex) {
//上传BPMN-输入框赋值
var $fileName =$("#fileName");
$fileName.val("");
$("#uploadFile").on("change",function (e) {
var e = e || window.event;
var files = e.target.files;
if(files.length>0){
// 获取文件名 并显示文件名
var fileName = files[0].name;
$fileName.val(fileName);
}else{
//清空文件名
$fileName.val("");
}
});
// 表单提交事件
form.on('submit(ProcessDepEditSubmit)', function (data) {
layer.close(dIndex);
var fileObj = document.getElementById("uploadFile").files[0];
if (typeof (fileObj) == "undefined" || fileObj.size <= 0) {
layer.msg('请选择文件');
return;
};
var formFile = new FormData();
formFile.append('processFile',fileObj);
// formFile.append('deploymentName',$('input[name="deploymentName"]').val());
// var data = formFile;
var loadIndex = layer.load(2);
$.ajax({
cache : true,
type : "post",
url : ''+publicurl+'processDefinition/uploadStreamAndDeployment',
async : false,
data : formFile,
contentType: false,
processData: false,
success : function(res) {
layer.close(loadIndex);
layer.msg(res.msg, {icon: 1});
insTb.reload();
},
error : function(res) {
layer.close(dIndex);
layer.alert(res.msg+'<br>'+res.obj, {
icon: 2,
title:"提示"
});
}
});
return false;
});
// 禁止弹窗出现滚动条
$(layero).children('.layui-layer-content').css('overflow', 'visible');
}
});
};
/* 删除流程定义 */
}
/* 删除部署 */
function doDel(obj) {
layer.confirm('确定要删除该流程吗?', {
layer.confirm('确定要删除选中数据吗?', {
skin: 'layui-layer-admin',
shade: .1
}, function (i) {
layer.close(i);
var loadIndex = layer.load(2);
$.get( ''+publicurl+'processDefinition/delDefinition', {
pdID: obj.data ? obj.data.id : '',
depID: obj.data ? obj.data.deploymentID : '',
pdID: obj.data ? obj.data.processDefinitionID : ''
}, function (res) {
layer.close(loadIndex);
if (res.status === 0) {
......@@ -174,6 +261,39 @@
}, 'json');
});
};
/* 启动实例*/
function stratProcessDepEditDialog(obj) {
admin.open({
type: 1,
title: '启动流程部署信息',
content: $('#stratProcessDepEditDialog').html(),
success:function(layero, dIndex){
form.on('submit(strarProcessDepForm)', function (data) {
var loadIndex = layer.load(2);
$.get( ''+publicurl+'processInstance/startProcess',
{
processDefinitionKey:obj.data.key,
instanceName:$("#instanceName").val(),
instanceVariable:$("#instanceVariable").val()
}, function (res) {
layer.close(loadIndex);
if (res.status === 0) {
layer.close(dIndex);
layer.msg(res.msg, {icon: 1});
insTb.reload();
} else {
layer.close(dIndex);
layer.alert(res.msg+'<br>'+res.obj, {icon: 2});
}
}, 'json');
layer.close(loadIndex);
return false;
})
}
})
}
});
</script>
......
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="../lib/layui-v2.5.5/css/layui.css" media="all">
<link rel="stylesheet" href="../css/public.css" media="all">
</head>
<body>
<div class="layuimini-container">
<div class="layuimini-main">
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<span class="layui-card-header"><i class="layui-icon layui-icon-form"></i>&nbsp;流程实例列表</span>
</div>
</script>
<table class="layui-hide" id="ProcessDefinitionTableId" lay-filter="currentTableFilter"></table>
<!--分页-->
<div class="layui-table-page layui-border-box">
<div id="barcon" class="page_div" name="barcon"></div>
</div>
<script type="text/html" id="currentTableBar">
{{# if(d.status == 'RUNNING'){ }}
<a class="layui-btn layui-btn-normal layui-btn-xs data-count-hangUp" lay-event="hangUp">挂起</a>
{{# }else{ }}
<a class="layui-btn layui-btn-success layui-btn-xs data-count-active" lay-event="active">激活</a>
{{# } }}
<a class="layui-btn layui-btn-xs layui-btn-info data-count-look" lay-event="look">历史</a>
<a class="layui-btn layui-btn-xs layui-btn-danger data-count-delete" lay-event="delete">删除</a>
</script>
</div>
</div>
<script src="../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
<script src="../lib/jquery-3.4.1/jquery-3.4.1.min.js"></script>
<script src="../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script src="../js/ManualPaging.js"></script>
<script>
layui.use(['form', 'table'], function () {
var $ = layui.jquery,
form = layui.form,
table = layui.table;
var insTb = table.render({
elem: '#ProcessDefinitionTableId',
toolbar: '#toolbarDemo',
defaultToolbar: [''],
url: ''+publicurl+'processInstance/getInstances',
parseData: function(res){ //res 即为原始返回的数据
// console.log(res.obj.length,"数据长度")
//处理时间
for(var i = 0 ; i< res.obj.length ; i++){
for(k in res.obj[i]) {
res.obj[i]["startDate"] = renderTime(res.obj[i].startDate)
}
}
return {
"code": res.status, //解析接口状态,默认成功是0
"msg": res.msg, //解析提示文本
"count": res.obj.length, //解析数据长度
"data": res.obj //解析数据列表
};
},
cols: [[
{type: "checkbox", width:'5%',align:"center"},
{field: 'id', width:'10%', title: 'ID',align:"center"},
{field: 'name', width:'18%', title: '实例名称',align:"center"},
{field: 'startDate', title: '实例创建时间', width:'15%',align:"center"},
{field: 'processDefinitionId', title: '流程定义编号', width:'18%',align:"center"},
{field: 'processDefinitionKey', width:'12%', title: '流程定义KEY',align:"center"},
{field: 'processDefinitionVersion', width:'5%', title: '版本',align:"center"},
{title: '操作', width:'16%', toolbar: '#currentTableBar', align: "center"}
]],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
page: false,
skin: 'line',
// id:'ProcessDefinitionTableId',
done:function (res, curr, count) {
if(res.code==1){
layer.alert(res.msg+'<br>'+res.data, {
icon: 2,
title:"提示"
});
}
if(count>0){
goPage(1);
}
}
});
insTb.reload();
/**
* toolbar监听事件
*/
table.on('tool(currentTableFilter)', function (obj) {
var data = obj.data;
if (obj.event === 'hangUp') { // 监听挂起操作
doHangUp(obj);
} else if (obj.event === 'active'){// 监听激活操作
doActive(obj);
}else if (obj.event === 'delete') { // 监听删除操作
doDel(obj);
}else if(obj.event === 'look'){
window.open(''+publicurl+'bpmnjs/dist/index.html?type=lookBpmn&instanceId='+data.id+'&deploymentFileUUID='+data.deploymentId+'&deploymentName='+ encodeURI(data.resourceName)+'');
}
});
function renderTime(date) {
var dateee = new Date(date).toJSON();
return new Date(+new Date(dateee) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')
}
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {
console.log(obj)
});
/* 挂起流程定义 */
function doHangUp(obj) {
console.log(obj,"单条数据");
layer.confirm('确定要挂起该流程吗?', {
skin: 'layui-layer-admin',
shade: .1
}, function (i) {
layer.close(i);
var loadIndex = layer.load(2);
$.get( ''+publicurl+'processInstance/suspendInstance', {
instanceID: obj.data ? obj.data.id : '',
}, function (res) {
layer.close(loadIndex);
if (res.status === 0) {
layer.msg(res.msg, {icon: 1});
insTb.reload();
} else {
layer.alert(res.msg+'<br>'+res.obj, {icon: 2});
}
}, 'json');
});
};
/* 激活流程定义 */
function doActive(obj) {
layer.confirm('确定要激活该流程吗?', {
skin: 'layui-layer-admin',
shade: .1
}, function (i) {
layer.close(i);
var loadIndex = layer.load(2);
$.get( ''+publicurl+'processInstance/resumeInstance', {
instanceID: obj.data ? obj.data.id : '',
}, function (res) {
layer.close(loadIndex);
if (res.status === 0) {
layer.msg(res.msg, {icon: 1});
insTb.reload();
} else {
layer.alert(res.msg+'<br>'+res.obj, {icon: 2});
}
}, 'json');
});
};
/* 删除流程定义 */
function doDel(obj) {
layer.confirm('确定要删除该流程吗?', {
skin: 'layui-layer-admin',
shade: .1
}, function (i) {
layer.close(i);
var loadIndex = layer.load(2);
$.get( ''+publicurl+'processInstance/deleteInstance', {
instanceID: obj.data ? obj.data.id : '',
}, function (res) {
layer.close(loadIndex);
if (res.status === 0) {
layer.msg(res.msg, {icon: 1});
obj.del();
console.log(obj,"删除数据");
insTb.reload();
} else {
layer.alert(res.msg+'<br>'+res.obj, {icon: 2});
}
}, 'json');
});
};
});
</script>
</body>
</html>
\ No newline at end of file
......@@ -49,11 +49,12 @@
//处理时间
for(var i = 0 ; i< res.obj.length ; i++){
for(k in res.obj[i]) {
res.obj[i]["CreatedDate"] = renderTime(res.obj[i].CreatedDate)
res.obj[i]["createdDate"] = renderTime(res.obj[i].createdDate);
res.obj[i]['status']=judgeState(res.obj[i].status)
}
}
return {
"code": res.status === 1 ? 0 : res.status, //解析接口状态,默认成功是0
"code": res.status, //解析接口状态,默认成功是0
"msg": res.msg, //解析提示文本
"count": res.obj.length, //解析数据长度
"data": res.obj //解析数据列表
......@@ -61,11 +62,13 @@
},
cols: [[
{type: "checkbox", width:'5%',align:"center"},
{field: 'ID', width:'25%', title: 'ID',align:"center"},
{field: 'InstanceName', width:'25%', title: '流程名称',align:"center"},
{field: 'Assignee', width:'15%', title: '办理人',align:"center"},
{field: 'CreatedDate', title: '创建时间', width:'15%',align:"center"},
{title: '操作', width:'15%', toolbar: '#currentTableBar', align: "center"}
{field: 'id', width:'13%', title: 'ID',align:"center"},
{field: 'instanceName', width:'22%', title: '流程名称',align:"center"},
{field: 'name', width:'15%', title: '任务节点名称',align:"center"},
{field: 'status', width:'12%', title: '任务状态',align:"center"},
{field: 'assignee', width:'8%', title: '办理人',align:"center"},
{field: 'createdDate', title: '创建时间', width:'15%',align:"center"},
{title: '操作', width:'10%', toolbar: '#currentTableBar', align: "center"}
]],
limits: [10, 15, 20, 25, 50, 100],
limit: 10,
......@@ -73,6 +76,13 @@
skin: 'line',
// id:'ToDoTasksTableId',
done:function (res, curr, count) {
if(res.code==1){
layer.alert(res.msg+'<br>'+res.data, {
icon: 2,
title:"提示"
});
}
if(count>0){
goPage(1);
}
......@@ -84,7 +94,8 @@
*/
table.on('tool(currentTableFilter)', function (obj) {
if (obj.event === 'handle') { // 监听办理操作
doHandle(obj);
// console.log(obj);
creatFormTable(obj);
}
});
......@@ -92,10 +103,58 @@
var dateee = new Date(date).toJSON();
return new Date(+new Date(dateee) + 8 * 3600 * 1000).toISOString().replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '')
}
function judgeState(state) {
var stateText='';
if(state == 'ASSIGNED'){
stateText='执行中';
}else {
stateText = state
}
return stateText
}
//监听表格复选框选择
table.on('checkbox(currentTableFilter)', function (obj) {
console.log(obj)
});
//动态生成表单
function creatFormTable(obj) {
var loadIndex = layer.load(2);
$.get( ''+publicurl+'task/formDataShow', {
taskID: obj.data ? obj.data.id : '',
}, function (res) {
layer.close(loadIndex);
if (res.obj != '无表单' && res.status == 0) {
var index = layer.open({
title: '办理任务',
type: 2,
shade: 0.2,
maxmin:true,
shadeClose: true,
area: ['100%', '100%'],
content: '../page/table/FormDataShow.html',
success: function (layero, index) {
var iframe = window['layui-layer-iframe' + index];
iframe.child(JSON.stringify(res.obj),obj.data.id)
localStorage.setItem("ID",obj.data.id);
},
end:function(){
insTb.reload();
}
});
$(window).on("resize", function () {
layer.full(index);
});
} else if(res.status == 1){
parent.layer.msg(res.obj, {
icon: 0,
time: 2000
});
}else {
doHandle(obj);
}
}, 'json');
}
/* 挂起流程定义 */
function doHandle(obj) {
console.log(obj,"单条数据");
......@@ -106,7 +165,7 @@
layer.close(i);
var loadIndex = layer.load(2);
$.get( ''+publicurl+'task/completeTask', {
taskID: obj.data ? obj.data.ID : '',
taskID: obj.data ? obj.data.id : '',
}, function (res) {
layer.close(loadIndex);
if (res.status === 0) {
......
......@@ -37,7 +37,7 @@
<div class="layui-form login-form">
<form class="layui-form" action="">
<div class="layui-form-item logo-title">
<h1>慕课工作流后台登录</h1>
<h1>工作流后台登录</h1>
</div>
<div class="layui-form-item">
<label class="layui-icon layui-icon-username" for="username"></label>
......
......@@ -39,7 +39,7 @@
<div></div>
<div class="admin-login-background">
<div class="admin-header">
<span> 慕课工作流后台登录</span>
<span> 工作流后台登录</span>
</div>
<form class="layui-form" action="">
<div>
......
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>layui</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<link rel="stylesheet" href="../../lib/layui-v2.5.5/css/layui.css" media="all">
<link rel="stylesheet" href="../../css/public.css" media="all">
<style>
body {
background-color: #ffffff;
}
.layui-input, .layui-textarea{
width: 45% !important;
}
.layui-unselect , .layui-form-select{
width: 45% !important;
}
.layui-select-title input{
width: 100% !important;
}
.layui-form-select .layui-input {
padding-right: 30px;
cursor: pointer;
}
.yellowBg{
background: #faffbd;
}
#cancelBtn{
z-index: 99;
}
</style>
</head>
<body>
<div class="layui-form layuimini-form" id="defineForm">
</div>
<script src="../../lib/layui-v2.5.5/layui.js" charset="utf-8"></script>
<script src="../../lib/jquery-3.4.1/jquery-3.4.1.min.js"></script>
<script src="../../js/lay-config.js?v=1.0.4" charset="utf-8"></script>
<script>
var ids;
function child(obj,id){
var dataObj = JSON.parse(obj);
ids = id;
// console.log(dataObj,ids);//获取父界面的传值
layui.use(['form'], function (id) {
var form = layui.form,
layer = layui.layer,
$ = layui.$,
param='';
formTable(dataObj);
form.render();
//监听提交
form.on('submit(saveBtn)',function () {
var index = layer.confirm('确定要提交吗?', {
skin: 'layui-layer-admin',
shade: .1
}, function (i) {
layer.close(i);
var loadIndex = layer.load(2);
param='';
$(".js_val").each(function () {
var isParm = $(this).attr("isParm");
var id = $(this).attr("name");
var val = $(this).val();
var str = id+'-_!'+val+'-_!'+isParm;
param+=str+'!_!'
});
var params = param.slice(0,param.length-3);
console.log(params,"传参");
$.post( ''+publicurl+'task/formDataSave', {
taskID: localStorage.getItem("ID"),
formData:params
}, function (res) {
layer.close(loadIndex);
if (res.status === 0) {
layer.msg(res.msg, {icon: 1});
// 关闭弹出层
layer.close(index);
var iframeIndex = parent.layer.getFrameIndex(window.name);
setTimeout(function () {
parent.layer.close(iframeIndex);
},1500);
} else {
layer.alert(res.msg+'<br>'+res.obj, {icon: 2});
}
});
});
return false;
});
//渲染动态表单
function formTable(res){
for(var i = 0 ; i < res.length ; i++) {
var formItem;
var input;
switch(res[i].controlType){
case 'long':
if(res[i].controlDefValue == ''){
input = '<input lay-verify="required|number" type="text" isParm="'+res[i].controlIsParam+'" name="' + res[i].id + '" placeholder="" value="" class="layui-input yellowBg js_val" onkeyup="this.value=this.value.replace(/\\D|^0/g,\'\')" onafterpaste="this.value=this.value.replace(/\\D|^0/g,\'\')">' ;
}else {
input = '<input lay-verify="required|number" type="text" isParm="'+res[i].controlIsParam+'" name="' + res[i].id + '" value="' + res[i].controlDefValue + '" class="layui-input yellowBg js_val" onkeyup="this.value=this.value.replace(/\\D|^0/g,\'\')" onafterpaste="this.value=this.value.replace(/\\D|^0/g,\'\')">' ;
}
break;
case 'cUser':
input = '<select name="' + res[i].id + '" isParm="'+res[i].controlIsParam+'" lay-filter="aihao" id="' + res[i].id + '" type="cUser" class="js_val js_select"></select>'
break;
case 'string':
if(res[i].controlDefValue == ''){
input = '<input lay-verify="required" type="text" isParm="'+res[i].controlIsParam+'" name="' + res[i].id + '" placeholder="" value="" class="layui-input js_val">' ;
}else {
input = '<input lay-verify="required" type="text" isParm="'+res[i].controlIsParam+'" name="' + res[i].id + '" value="' + res[i].controlDefValue + '" placeholder="" class="layui-input js_val">' ;
}
break;
}
formItem = '<div class="layui-form-item">' +
' <label class="layui-form-label required">' + res[i].controlLable + ':</label>' +
' <div class="layui-input-block">' +
input+
' </div>' +
' </div>';
$("#defineForm").append(formItem);
}
$("#defineForm").append('<div class="layui-form-item">\n' +
' <div class="layui-input-block">\n' +
' <button class="layui-btn layui-btn-normal" lay-submit lay-filter="saveBtn">提交任务</button>' +
' </div>' +
' </div>');
$(".js_select").each(function () {
var id = $(this).attr("id");
creatSelect(id);
});
};
//生成下拉框接口
function creatSelect(id) {
var loadIndex = layer.load(2);
$.get( ''+publicurl+'user/getUsers', {}, function (res) {
layer.close(loadIndex);
if (res.status === 0) {
// layer.msg(res.msg, {icon: 1});
CreateDropdown(id,res.obj);
form.render();
} else {
layer.alert(res.msg+'<br>'+res.obj, {icon: 2});
}
});
};
//动态生成下拉框
function CreateDropdown(id, data) {
// $("#" + id).html("").append('<option value="">-请选择-</option>');
for (var key in data) {
var publicOption = '<option value="' + data[key].username + '">' + data[key].name+ '</option>';
$("#" + id).append(publicOption);
}
}
});
}
</script>
</body>
</html>
\ No newline at end of file
......@@ -27,3 +27,15 @@ INSERT INTO `user` VALUES ('4', 'salaboycn', 'beijing', 'salaboy', '$2a$10$gw46p
-- ----------------------------
alter table ACT_RE_DEPLOYMENT add column PROJECT_RELEASE_VERSION_ varchar(255) DEFAULT NULL;
alter table ACT_RE_DEPLOYMENT add column VERSION_ varchar(255) DEFAULT NULL;
-- ----------------------------
-- 动态表单数据存储
-- ----------------------------
DROP TABLE IF EXISTS `formdata`;
CREATE TABLE `formdata` (
`PROC_DEF_ID_` varchar(64) DEFAULT NULL,
`PROC_INST_ID_` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`FORM_KEY_` varchar(255) DEFAULT NULL,
`Control_ID_` varchar(100) DEFAULT NULL,
`Control_VALUE_` varchar(2000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册