Commit 2e6edd46 by yuwei

项目初始化

parent e01692fe
package cn.datax.common.utils;
import cn.datax.common.core.DataRole;
import cn.datax.common.core.DataUser;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import java.util.List;
import java.util.stream.Collectors;
public class SecurityUtil {
/**
......@@ -61,4 +65,18 @@ public class SecurityUtil {
}
return null;
}
/**
* 获取用户角色
*
* @return username
*/
public static List<String> getUserRoleIds() {
DataUser user = getDataUser();
if (user != null){
List<String> roles = user.getRoles().stream().map(DataRole::getId).collect(Collectors.toList());
return roles;
}
return null;
}
}
package cn.datax.service.workflow.api.dto;
import cn.datax.service.workflow.api.enums.VariablesEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
@ApiModel(value = "创建流程实例Model")
@Data
public class ProcessInstanceCreateRequest implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "流程定义ID")
private String processDefinitionId;
@ApiModelProperty(value = "业务ID")
private String businessKey;
@ApiModelProperty(value = "业务类型")
private String businessType;
@ApiModelProperty(value = "业务名称")
private String businessName;
@ApiModelProperty(value = "流程参数")
private Map<String, Object> variables = new HashMap<>();
public ProcessInstanceCreateRequest() {}
public ProcessInstanceCreateRequest(String processDefinitionId, String businessKey, String businessType, String businessName, Map<String, Object> var){
setProcessDefinitionId(processDefinitionId);
setBusinessKey(businessKey);
setBusinessType(businessType);
setBusinessName(businessName);
variables.putAll(var);
variables.put(VariablesEnum.businessKey.toString(), businessKey);
variables.put(VariablesEnum.businessType.toString(), businessType);
variables.put(VariablesEnum.businessName.toString(), businessName);
}
}
package cn.datax.service.workflow.api.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 任务类型
*/
@Getter
@AllArgsConstructor
public enum ActionEnum {
COMPLETE("complete","完成任务成功"),
CLAIM("claim","任务签收成功"),
UNCLAIM("unclaim","任务反签收成功"),
DELEGATE("delegate","任务委派成功"),
RESOLVE("resolve"," 任务签收完成,返回任务人完成"),
ASSIGNEE("assignee","任务转办成功"),
SUSPEND("suspend","挂起流程成功"),
ACTIVATE("activate","激活流程成功");
private String action;
private String title;
public static ActionEnum actionOf(String action) {
for(ActionEnum actionEnum : values()){
if(actionEnum.getAction().equals(action)){
return actionEnum;
}
}
throw new RuntimeException("没有找到对应的枚举");
}
}
package cn.datax.service.workflow.api.enums;
/**
* 流程参数 常量
*/
public enum VariablesEnum {
/** 用户编号 */
userId,
/** 活动主题*/
businessName,
/** 活动类型*/
businessType,
/** 主键id*/
businessKey,
/** 审批状态*/
auditStatus;
}
......@@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class DefinitionQuery extends BaseQueryParams {
public class FlowDefinitionQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
......
package cn.datax.service.workflow.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class FlowInstanceQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String name;
}
package cn.datax.service.workflow.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
public class FlowTaskQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String taskId;
private String userId;
private List<String> groupIds;
private String name;
private String businessKey;
private String businessType;
private String businessName;
private String taskDefinitionKey;
private String processInstanceId;
}
package cn.datax.service.workflow.controller;
import cn.datax.common.core.DataConstant;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups;
......@@ -58,6 +59,16 @@ public class CategoryController extends BaseController {
return R.ok().setData(categoryMapper.toVO(categoryEntity));
}
@ApiOperation(value = "获取列表", notes = "")
@GetMapping("/list")
public R getCategoryList() {
QueryWrapper<CategoryEntity> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", DataConstant.EnableState.ENABLE.getKey());
List<CategoryEntity> list = categoryService.list(queryWrapper);
List<CategoryVo> collect = list.stream().map(categoryMapper::toVO).collect(Collectors.toList());
return R.ok().setData(collect);
}
/**
* 分页查询信息
*
......
......@@ -2,13 +2,14 @@ package cn.datax.service.workflow.controller;
import cn.datax.common.base.BaseController;
import cn.datax.common.core.R;
import cn.datax.service.workflow.api.query.CategoryQuery;
import cn.datax.service.workflow.api.query.DefinitionQuery;
import cn.datax.service.workflow.service.ProcessDefinitionService;
import cn.datax.service.workflow.api.query.FlowDefinitionQuery;
import cn.datax.service.workflow.service.FlowDefinitionService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.flowable.engine.repository.ProcessDefinition;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
......@@ -22,19 +23,19 @@ import java.util.zip.ZipInputStream;
@Api(tags = {"流程定义"})
@RestController
@RequestMapping("/definitions")
public class DefinitionController extends BaseController {
public class FlowDefinitionController extends BaseController {
@Autowired
private ProcessDefinitionService processDefinitionService;
private FlowDefinitionService flowDefinitionService;
@ApiOperation(value = "分页查询")
@ApiImplicitParams({
@ApiImplicitParam(name = "categoryQuery", value = "查询实体categoryQuery", required = true, dataTypeClass = CategoryQuery.class)
@ApiImplicitParam(name = "categoryQuery", value = "查询实体flowDefinitionQuery", required = true, dataTypeClass = FlowDefinitionQuery.class)
})
@GetMapping("/page")
public R page(DefinitionQuery definitionQuery) {
processDefinitionService.page(definitionQuery);
return R.ok();
public R page(FlowDefinitionQuery flowDefinitionQuery) {
Page<ProcessDefinition> page = flowDefinitionService.page(flowDefinitionQuery);
return R.ok().setData(page);
}
@PostMapping("/import/file")
......@@ -42,12 +43,12 @@ public class DefinitionController extends BaseController {
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "模板名称(模板name)", required = true, dataType = "String"),
@ApiImplicitParam(name = "category", value = "模板类别", required = false, dataType = "String"),
@ApiImplicitParam(name = "tenantId", value = "系统标识", required = false, dataType = "String"),
@ApiImplicitParam(name = "tenantId", value = "租户ID", required = false, dataType = "String"),
@ApiImplicitParam(name = "file", value = "模板文件", required = true, dataType = "__file")
})
public R deployByInputStream(String name, String category, String tenantId, @RequestParam("file") MultipartFile file) {
try (InputStream in = file.getInputStream()) {
processDefinitionService.deploy(name, category, tenantId, in);
flowDefinitionService.deploy(name, category, tenantId, in);
} catch (IOException e) {
e.printStackTrace();
}
......@@ -59,12 +60,12 @@ public class DefinitionController extends BaseController {
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "模板名称(模板name)", required = true, dataType = "String"),
@ApiImplicitParam(name = "category", value = "模板类别", required = false, dataType = "String"),
@ApiImplicitParam(name = "tenantId", value = "系统标识", required = false, dataType = "String"),
@ApiImplicitParam(name = "tenantId", value = "租户ID", required = false, dataType = "String"),
@ApiImplicitParam(name = "file", value = "模板文件", required = true, dataType = "__file")
})
public R deployByZip(String name, String category, String tenantId, @RequestParam("file") MultipartFile file) {
try (ZipInputStream zipIn = new ZipInputStream(file.getInputStream(), Charset.forName("UTF-8"))) {
processDefinitionService.deploy(name, category, tenantId, zipIn);
flowDefinitionService.deploy(name, category, tenantId, zipIn);
} catch (IOException e) {
e.printStackTrace();
}
......@@ -75,7 +76,7 @@ public class DefinitionController extends BaseController {
@ApiImplicitParam(name = "processDefinitionId", value = "流程定义ID", required = true, dataType = "String", paramType = "path")
@PutMapping("/activate/{processDefinitionId}")
public R activate(@PathVariable String processDefinitionId) {
processDefinitionService.activateProcessDefinitionById(processDefinitionId);
flowDefinitionService.activateProcessDefinitionById(processDefinitionId);
return R.ok();
}
......@@ -83,7 +84,7 @@ public class DefinitionController extends BaseController {
@ApiImplicitParam(name = "processDefinitionId", value = "流程定义ID", required = true, dataType = "String", paramType = "path")
@PutMapping("/suspend/{processDefinitionId}")
public R suspend(@PathVariable String processDefinitionId) {
processDefinitionService.suspendProcessDefinitionById(processDefinitionId);
flowDefinitionService.suspendProcessDefinitionById(processDefinitionId);
return R.ok();
}
......@@ -91,7 +92,7 @@ public class DefinitionController extends BaseController {
@ApiImplicitParam(name = "deploymentId", value = "流程部署ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/delete/{deploymentId}")
public R delete(@PathVariable String deploymentId) {
processDefinitionService.deleteDeployment(deploymentId);
flowDefinitionService.deleteDeployment(deploymentId);
return R.ok();
}
......@@ -102,7 +103,7 @@ public class DefinitionController extends BaseController {
@ApiImplicitParam(name = "resType", value = "资源类型(xml|image)", required = true, dataType = "String")
})
public void resource(String processDefinitionId, String resType, HttpServletResponse response) throws Exception {
InputStream resourceAsStream = processDefinitionService.resource(processDefinitionId, resType);
InputStream resourceAsStream = flowDefinitionService.resource(processDefinitionId, resType);
byte[] b = new byte[1024];
int len = -1;
while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
......
package cn.datax.service.workflow.controller;
import cn.datax.common.base.BaseController;
import cn.datax.common.core.R;
import cn.datax.service.workflow.api.dto.ProcessInstanceCreateRequest;
import cn.datax.service.workflow.api.query.FlowInstanceQuery;
import cn.datax.service.workflow.service.FlowInstanceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Api(tags = {"流程实例"})
@RestController
@RequestMapping("/instances")
public class FlowInstanceController extends BaseController {
@Autowired
private FlowInstanceService flowInstanceService;
@PostMapping
@ApiOperation(value = "启动通过流程定义ID流程实例")
@ApiImplicitParam(name = "request", value = "详细实体request", required = true, dataType = "ProcessInstanceCreateRequest")
public R startById(@RequestBody ProcessInstanceCreateRequest request) {
flowInstanceService.startProcessInstanceById(request);
return R.ok();
}
@ApiOperation(value = "分页查询")
@ApiImplicitParams({
@ApiImplicitParam(name = "flowInstanceQuery", value = "查询实体flowInstanceQuery", required = true, dataTypeClass = FlowInstanceQuery.class)
})
@GetMapping("/page")
public R page(FlowInstanceQuery flowInstanceQuery) {
flowInstanceService.page(flowInstanceQuery);
return R.ok();
}
@ApiOperation(value = "激活流程实例", notes = "根据url的id来指定激活流程实例")
@ApiImplicitParam(name = "processInstanceId", value = "流程实例ID", required = true, dataType = "String", paramType = "path")
@PutMapping("/activate/{processInstanceId}")
public R activate(@PathVariable String processInstanceId) {
flowInstanceService.activateProcessInstanceById(processInstanceId);
return R.ok();
}
@ApiOperation(value = "挂起流程实例", notes = "根据url的id来指定挂起流程实例")
@ApiImplicitParam(name = "processInstanceId", value = "流程实例ID", required = true, dataType = "String", paramType = "path")
@PutMapping("/suspend/{processInstanceId}")
public R suspend(@PathVariable String processInstanceId) {
flowInstanceService.suspendProcessInstanceById(processInstanceId);
return R.ok();
}
@ApiOperation(value = "删除流程实例", notes = "根据url的id来指定删除流程实例")
@ApiImplicitParam(name = "processInstanceId", value = "流程实例ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/delete/{processInstanceId}")
public R delete(@PathVariable String processInstanceId) {
flowInstanceService.deleteProcessInstance(processInstanceId, null);
return R.ok();
}
}
package cn.datax.service.workflow.controller;
import cn.datax.common.base.BaseController;
import cn.datax.common.core.R;
import cn.datax.service.workflow.api.query.FlowTaskQuery;
import cn.datax.service.workflow.service.FlowTaskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
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;
@Api(tags = {"流程任务"})
@RestController
@RequestMapping("/tasks")
public class FlowTaskController extends BaseController {
@Autowired
private FlowTaskService flowTaskService;
@ApiOperation(value = "分页查询代办任务")
@ApiImplicitParams({
@ApiImplicitParam(name = "flowTaskQuery", value = "查询实体flowTaskQuery", required = true, dataTypeClass = FlowTaskQuery.class)
})
@GetMapping("/pageTodo")
public R pageTodo(FlowTaskQuery flowTaskQuery) {
flowTaskService.pageTodo(flowTaskQuery);
return R.ok();
}
@ApiOperation(value = "分页查询已办任务")
@ApiImplicitParams({
@ApiImplicitParam(name = "flowTaskQuery", value = "查询实体flowTaskQuery", required = true, dataTypeClass = FlowTaskQuery.class)
})
@GetMapping("/pageDone")
public R pageDone(FlowTaskQuery flowTaskQuery) {
flowTaskService.pageDone(flowTaskQuery);
return R.ok();
}
}
package cn.datax.service.workflow.controller;
import cn.datax.common.base.BaseController;
import cn.datax.service.workflow.service.ProcessInstanceService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = {"流程实例"})
@RestController
@RequestMapping("/definitions")
public class InstanceController extends BaseController {
@Autowired
private ProcessInstanceService processInstanceService;
}
package cn.datax.service.workflow.controller;
import cn.datax.common.base.BaseController;
import cn.datax.service.workflow.service.ProcessTaskService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = {"流程任务"})
@RestController
@RequestMapping("/definitions")
public class TaskController extends BaseController {
@Autowired
private ProcessTaskService processTaskService;
}
package cn.datax.service.workflow.service;
import cn.datax.service.workflow.api.query.DefinitionQuery;
import cn.datax.service.workflow.api.query.FlowDefinitionQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.flowable.engine.repository.ProcessDefinition;
import java.io.InputStream;
import java.util.zip.ZipInputStream;
public interface ProcessDefinitionService {
public interface FlowDefinitionService {
/**
* 分页查询流程定义
* @param flowDefinitionQuery
* @return
*/
Page<ProcessDefinition> page(FlowDefinitionQuery flowDefinitionQuery);
/**
* 部署流程资源
*
* @param name 流程模板文件名字
* @param category 流程模板文件类别
* @param tenantId 租户ID
* @param in 流程模板文件流
* @return
*/
......@@ -22,7 +32,7 @@ public interface ProcessDefinitionService {
*
* @param name 流程模板文件名字
* @param category 流程模板文件类别
* @param tenantId 业务系统标识
* @param tenantId 租户ID
* @param zipInputStream
* @return
*/
......@@ -53,10 +63,4 @@ public interface ProcessDefinitionService {
* @return
*/
InputStream resource(String processDefinitionId, String resType);
/**
* 分页查询流程定义实例
* @param definitionQuery
*/
void page(DefinitionQuery definitionQuery);
}
package cn.datax.service.workflow.service;
import cn.datax.service.workflow.api.dto.ProcessInstanceCreateRequest;
import cn.datax.service.workflow.api.query.FlowInstanceQuery;
public interface FlowInstanceService {
/**
* 分页查询流程实例
* @param flowInstanceQuery
*/
void page(FlowInstanceQuery flowInstanceQuery);
/**
* 激活流程实例
* @param processInstanceId
*/
void activateProcessInstanceById(String processInstanceId);
/**
* 挂起流程实例
* @param processInstanceId
*/
void suspendProcessInstanceById(String processInstanceId);
/**
* 删除流程实例
* @param processInstanceId
* @param deleteReason
*/
void deleteProcessInstance(String processInstanceId, String deleteReason);
/**
* 启动流程实例
* @param request
*/
void startProcessInstanceById(ProcessInstanceCreateRequest request);
}
package cn.datax.service.workflow.service;
import cn.datax.service.workflow.api.query.FlowTaskQuery;
public interface FlowTaskService {
/**
* 分页查询代办任务
* @param flowTaskQuery
*/
void pageTodo(FlowTaskQuery flowTaskQuery);
/**
* 分页查询已办任务
* @param flowTaskQuery
*/
void pageDone(FlowTaskQuery flowTaskQuery);
}
package cn.datax.service.workflow.service.impl;
import cn.datax.service.workflow.api.query.DefinitionQuery;
import cn.datax.service.workflow.service.ProcessDefinitionService;
import cn.datax.service.workflow.api.query.FlowDefinitionQuery;
import cn.datax.service.workflow.service.FlowDefinitionService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.DeploymentBuilder;
......@@ -17,8 +17,9 @@ import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;
@Slf4j
@Service
public class ProcessDefinitionServiceImpl implements ProcessDefinitionService {
public class FlowDefinitionServiceImpl implements FlowDefinitionService {
@Autowired
private RepositoryService repositoryService;
......@@ -28,22 +29,23 @@ public class ProcessDefinitionServiceImpl implements ProcessDefinitionService {
public static final String RESOURCE_TYPE_XML = "xml";
@Override
public void page(DefinitionQuery definitionQuery) {
public Page<ProcessDefinition> page(FlowDefinitionQuery flowDefinitionQuery) {
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
if (StrUtil.isNotBlank(definitionQuery.getName())) {
processDefinitionQuery.processDefinitionNameLike(definitionQuery.getName());
if (StrUtil.isNotBlank(flowDefinitionQuery.getName())) {
processDefinitionQuery.processDefinitionNameLike(flowDefinitionQuery.getName());
}
if(StringUtils.isNotBlank(definitionQuery.getKey())){
processDefinitionQuery.processDefinitionKeyLike(definitionQuery.getKey());
if(StrUtil.isNotBlank(flowDefinitionQuery.getKey())){
processDefinitionQuery.processDefinitionKeyLike(flowDefinitionQuery.getKey());
}
if(StringUtils.isNotBlank(definitionQuery.getCategoryId())){
processDefinitionQuery.processDefinitionCategory(definitionQuery.getCategoryId());
if(StrUtil.isNotBlank(flowDefinitionQuery.getCategoryId())){
processDefinitionQuery.processDefinitionCategory(flowDefinitionQuery.getCategoryId());
}
long count = processDefinitionQuery.count();
List<ProcessDefinition> processDefinitionList = processDefinitionQuery.listPage((definitionQuery.getPageNum() - 1) * definitionQuery.getPageSize(), definitionQuery.getPageSize());
Page<ProcessDefinition> page = new Page<>(definitionQuery.getPageNum(), definitionQuery.getPageSize());
List<ProcessDefinition> processDefinitionList = processDefinitionQuery.listPage((flowDefinitionQuery.getPageNum() - 1) * flowDefinitionQuery.getPageSize(), flowDefinitionQuery.getPageSize());
Page<ProcessDefinition> page = new Page<>(flowDefinitionQuery.getPageNum(), flowDefinitionQuery.getPageSize());
page.setRecords(processDefinitionList);
page.setTotal(count);
return page;
}
@Override
......@@ -76,16 +78,19 @@ public class ProcessDefinitionServiceImpl implements ProcessDefinitionService {
@Override
public void activateProcessDefinitionById(String processDefinitionId) {
log.info("成功激活流程定义ID:{}", processDefinitionId);
repositoryService.activateProcessDefinitionById(processDefinitionId, true, null);
}
@Override
public void suspendProcessDefinitionById(String processDefinitionId) {
log.info("成功激活流程定义ID:{}", processDefinitionId);
repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null);
}
@Override
public void deleteDeployment(String deploymentId) {
log.info("成功删除流程部署ID:{}", deploymentId);
repositoryService.deleteDeployment(deploymentId, true);
}
......
package cn.datax.service.workflow.service.impl;
import cn.datax.common.utils.SecurityUtil;
import cn.datax.service.workflow.api.dto.ProcessInstanceCreateRequest;
import cn.datax.service.workflow.api.query.FlowInstanceQuery;
import cn.datax.service.workflow.service.FlowInstanceService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.runtime.ProcessInstanceBuilder;
import org.flowable.engine.runtime.ProcessInstanceQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.List;
@Slf4j
@Service
public class FlowInstanceServiceImpl implements FlowInstanceService {
@Autowired
private RuntimeService runtimeService;
@Autowired
private HistoryService historyService;
@Override
public void page(FlowInstanceQuery flowInstanceQuery) {
ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
if(StrUtil.isNotBlank(flowInstanceQuery.getName())){
processInstanceQuery.processInstanceNameLike(flowInstanceQuery.getName());
}
long count = processInstanceQuery.count();
List<ProcessInstance> processInstanceList = processInstanceQuery.orderByStartTime().desc().listPage((flowInstanceQuery.getPageNum() - 1) * flowInstanceQuery.getPageSize(), flowInstanceQuery.getPageSize());
Page<ProcessInstance> page = new Page<>(flowInstanceQuery.getPageNum(), flowInstanceQuery.getPageSize());
page.setRecords(processInstanceList);
page.setTotal(count);
}
@Override
public void activateProcessInstanceById(String processInstanceId) {
log.info("成功激活流程实例ID:{}", processInstanceId);
runtimeService.activateProcessInstanceById(processInstanceId);
}
@Override
public void suspendProcessInstanceById(String processInstanceId) {
log.info("成功挂起流程实例ID:{}", processInstanceId);
runtimeService.suspendProcessInstanceById(processInstanceId);
}
@Override
public void deleteProcessInstance(String processInstanceId, String deleteReason) {
log.info("成功删除流程实例ID:{}", processInstanceId);
runtimeService.deleteProcessInstance(processInstanceId, deleteReason);
}
@Override
public void startProcessInstanceById(ProcessInstanceCreateRequest request) {
Assert.notNull(request.getBusinessKey(), "请输入业务id");
Assert.notNull(request.getBusinessType(), "请输入业务类型");
Assert.notNull(request.getProcessDefinitionId(), "请输入流程定义ID");
ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder();
if(StrUtil.isNotBlank(request.getProcessDefinitionId())){
processInstanceBuilder.processDefinitionId(request.getProcessDefinitionId());
}
if(StrUtil.isNotBlank(request.getBusinessKey())){
processInstanceBuilder.businessKey(request.getBusinessKey());
}
processInstanceBuilder.variables(request.getVariables());
// 流程实例标题(动态拼接)
if(StrUtil.isNotBlank(request.getBusinessName())){
processInstanceBuilder.name(request.getBusinessName());
}
Authentication.setAuthenticatedUserId(SecurityUtil.getUserId());
ProcessInstance processInstance = processInstanceBuilder.start();
Authentication.setAuthenticatedUserId(null);
log.info("发起流程成功,流程ID:{}", processInstance.getId());
}
// // 本人参与的流程实例
// historyService.createHistoricProcessInstanceQuery().involvedUser(SecurityUtil.getUserId()).orderByProcessInstanceStartTime().desc().list();
// // 本人发起的流程实例
// historyService.createHistoricProcessInstanceQuery().startedBy(SecurityUtil.getUserId()).orderByProcessInstanceStartTime().desc().list();
}
package cn.datax.service.workflow.service.impl;
import cn.datax.service.workflow.api.enums.VariablesEnum;
import cn.datax.service.workflow.api.query.FlowTaskQuery;
import cn.datax.service.workflow.service.FlowTaskService;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.HistoryService;
import org.flowable.engine.TaskService;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class FlowTaskServiceImpl implements FlowTaskService {
@Autowired
private TaskService taskService;
@Autowired
private HistoryService historyService;
@Override
public void pageTodo(FlowTaskQuery flowTaskQuery) {
TaskQuery taskQuery = taskService.createTaskQuery();
taskQuery.taskCandidateOrAssigned(flowTaskQuery.getUserId()).taskCandidateGroupIn(flowTaskQuery.getGroupIds());
if(StrUtil.isNotBlank(flowTaskQuery.getBusinessKey())){
taskQuery.processInstanceBusinessKey(flowTaskQuery.getBusinessKey());
}
if(StrUtil.isNotBlank(flowTaskQuery.getBusinessType())){
taskQuery.processVariableValueEquals(VariablesEnum.businessType.toString(), flowTaskQuery.getBusinessType());
}
if(StrUtil.isNotBlank(flowTaskQuery.getBusinessName())){
taskQuery.processVariableValueLike(VariablesEnum.businessName.toString(), flowTaskQuery.getBusinessName());
}
List<Task> taskList = taskQuery.includeProcessVariables()
.orderByTaskPriority().desc()
.orderByTaskCreateTime().desc()
.listPage((flowTaskQuery.getPageNum() - 1) * flowTaskQuery.getPageSize(), flowTaskQuery.getPageSize());
taskList.stream().forEach(task -> {
System.out.println(task);
System.out.println(task.getProcessVariables());
System.out.println("-----------------");
});
long count = taskQuery.count();
Page<Task> page = new Page<>(flowTaskQuery.getPageNum(), flowTaskQuery.getPageSize());
page.setRecords(taskList);
page.setTotal(count);
}
@Override
public void pageDone(FlowTaskQuery flowTaskQuery) {
HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery();
historicTaskInstanceQuery.taskAssignee(flowTaskQuery.getUserId());
if (StringUtils.isNotBlank(flowTaskQuery.getBusinessKey())) {
historicTaskInstanceQuery.processInstanceBusinessKey(flowTaskQuery.getBusinessKey());
}
if (StringUtils.isNotBlank(flowTaskQuery.getBusinessName())) {
historicTaskInstanceQuery.processVariableValueEquals(VariablesEnum.businessType.toString(), flowTaskQuery.getBusinessName());
}
if (StringUtils.isNotBlank(flowTaskQuery.getBusinessType())) {
historicTaskInstanceQuery.processVariableValueLike(VariablesEnum.businessName.toString(), flowTaskQuery.getBusinessType());
}
List<HistoricTaskInstance> historicTaskInstanceList = historicTaskInstanceQuery.finished()
.includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc()
.listPage((flowTaskQuery.getPageNum() - 1) * flowTaskQuery.getPageSize(), flowTaskQuery.getPageSize());
historicTaskInstanceList.stream().forEach(task -> {
System.out.println(task);
System.out.println(task.getProcessVariables());
System.out.println("-----------------");
});
long count = historicTaskInstanceQuery.count();
Page<HistoricTaskInstance> page = new Page<>(flowTaskQuery.getPageNum(), flowTaskQuery.getPageSize());
page.setRecords(historicTaskInstanceList);
page.setTotal(count);
}
}
package cn.datax.service.workflow.service.impl;
import cn.datax.service.workflow.service.ProcessInstanceService;
import org.springframework.stereotype.Service;
@Service
public class ProcessInstanceServiceImpl implements ProcessInstanceService {
}
package cn.datax.service.workflow.service.impl;
import cn.datax.service.workflow.service.ProcessTaskService;
import org.springframework.stereotype.Service;
@Service
public class ProcessTaskServiceImpl implements ProcessTaskService {
}
import request from '@/utils/request'
export function listCategory(data) {
return request({
url: '/workflow/categorys/list',
method: 'get',
params: data
})
}
export function addCategory(data) {
return request({
url: '/workflow/categorys',
method: 'post',
data: data
})
}
export function updateCategory(data) {
return request({
url: '/workflow/categorys/' + data.id,
method: 'put',
data: data
})
}
export function delCategory(id) {
return request({
url: '/workflow/categorys/' + id,
method: 'delete'
})
}
export function pageDefinition(data) {
return request({
url: '/workflow/definitions/page',
method: 'get',
params: data
})
}
export function delDefinition(deploymentId) {
return request({
url: '/workflow/definitions/delete/' + deploymentId,
method: 'delete'
})
}
export function activateDefinition(processDefinitionId) {
return request({
url: '/workflow/definitions/activate/' + processDefinitionId,
method: 'put'
})
}
export function suspendDefinition(processDefinitionId) {
return request({
url: '/workflow/definitions/suspend/' + processDefinitionId,
method: 'put'
})
}
export function deployDefinition(data) {
return request({
url: '/workflow/definitions/import/file',
method: 'post',
headers: {
'Content-Type': 'multipart/form-data'
},
data: data
})
}
export function flowResource(processDefinitionId) {
return request({
url: '/workflow/definitions/resource',
method: 'get',
responseType: 'blob',
params: { processDefinitionId: processDefinitionId, resType: 'image' }
})
}
import request from '@/utils/request'
export function pageInstance(data) {
return request({
url: '/workflow/instances/page',
method: 'get',
params: data
})
}
export function delInstance(processInstanceId) {
return request({
url: '/workflow/instances/delete/' + processInstanceId,
method: 'delete'
})
}
export function activateInstance(processInstanceId) {
return request({
url: '/workflow/instances/activate/' + processInstanceId,
method: 'put'
})
}
export function suspendInstance(processInstanceId) {
return request({
url: '/workflow/instances/suspend/' + processInstanceId,
method: 'put'
})
}
......@@ -93,7 +93,7 @@
border
tooltip-effect="dark"
:size="tableSize"
height="calc(100vh - 50%)"
:height="tableHeight"
style="width: 100%;margin: 15px 0;"
@selection-change="handleSelectionChange"
>
......@@ -163,7 +163,7 @@ export default {
name: 'DataSetList',
data() {
return {
tableHeight: document.body.offsetHeight - 340 + 'px',
tableHeight: document.body.offsetHeight - 310 + 'px',
// 展示切换
showOptions: {
data: {},
......
<template>
<el-row :gutter="20">
<el-col :span="6">
<el-card class="box-card tree-wrapper" shadow="always">
<div class="body-wrapper">
<el-tree
ref="category"
:data="categoryOptions"
node-key="id"
empty-text="加载中,请稍后"
:props="defaultProps"
default-expand-all
highlight-current
:expand-on-click-node="false"
@node-click="handleNodeClick"
>
<template slot-scope="{ node, data }">
<span class="custom-tree-node" @mouseenter="mouseenter(data)" @mouseleave="mouseleave(data)">
<span><i v-if="node.level === 1" class="iconfont icon-zuzhi tree-folder" />{{ node.label }}</span>
<span class="tree-bts">
<i v-show="!data.id && data.show" class="el-icon-circle-plus-outline bt-add" @click="() => handleAddCategory()" />
<i v-show="data.id && data.show" class="el-icon-edit-outline bt-edit" @click="() => handleEditCategory(data)" />
<i v-show="data.id && data.show" class="el-icon-delete bt-delete" @click="() => handleDelCategory(data)" />
</span>
</span>
</template>
</el-tree>
</div>
</el-card>
</el-col>
<el-col :span="18">
<el-card class="box-card" shadow="always">
<el-form ref="queryForm" :model="queryParams" :inline="true">
<el-form-item label="流程定义名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入流程定义名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="流程定义KEY" prop="key">
<el-input
v-model="queryParams.key"
placeholder="请输入流程定义KEY"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row type="flex" justify="space-between">
<el-col :span="12">
<el-button-group>
<el-button
type="primary"
icon="el-icon-plus"
size="mini"
@click="handleImport"
>导入</el-button>
</el-button-group>
</el-col>
<el-col :span="12">
<div class="right-toolbar">
<el-tooltip content="密度" effect="dark" placement="top">
<el-dropdown trigger="click" @command="handleCommand">
<el-button circle size="mini">
<svg-icon class-name="size-icon" icon-class="colum-height" />
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="medium">正常</el-dropdown-item>
<el-dropdown-item command="small">中等</el-dropdown-item>
<el-dropdown-item command="mini">紧凑</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</el-tooltip>
<el-tooltip content="刷新" effect="dark" placement="top">
<el-button circle size="mini" @click="handleRefresh">
<svg-icon class-name="size-icon" icon-class="shuaxin" />
</el-button>
</el-tooltip>
<el-tooltip content="列设置" effect="dark" placement="top">
<el-popover placement="bottom" width="100" trigger="click">
<el-checkbox-group v-model="checkedTableColumns" @change="handleCheckedColsChange">
<el-checkbox
v-for="(item, index) in tableColumns"
:key="index"
:label="item.prop"
>{{ item.label }}</el-checkbox>
</el-checkbox-group>
<span slot="reference">
<el-button circle size="mini">
<svg-icon class-name="size-icon" icon-class="shezhi" />
</el-button>
</span>
</el-popover>
</el-tooltip>
</div>
</el-col>
</el-row>
<el-table
v-loading="loading"
:data="tableDataList"
border
tooltip-effect="dark"
:size="tableSize"
:height="tableHeight"
style="width: 100%;margin: 15px 0;"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="55" align="center">
<template slot-scope="scope">
<span>{{ scope.$index +1 }}</span>
</template>
</el-table-column>
<template v-for="(item, index) in tableColumns">
<el-table-column
v-if="item.show"
:key="index"
:prop="item.prop"
:label="item.label"
:formatter="item.formatter"
align="center"
show-overflow-tooltip
/>
</template>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-popover
placement="left"
trigger="click"
>
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleResource(scope.row)"
>流程图</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleActivate(scope.row)"
>激活</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleSuspend(scope.row)"
>挂起</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button>
<el-button slot="reference">操作</el-button>
</el-popover>
</template>
</el-table-column>
</el-table>
<el-pagination
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="queryParams.pageNum"
:page-size.sync="queryParams.pageSize"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</el-card>
</el-col>
<!-- 流程分类对话框 -->
<el-dialog :title="dialog.title" :visible.sync="dialog.category" width="400px" append-to-body>
<el-form ref="dialogCategoryForm" :model="dialogCategoryForm" :rules="dialogCategoryRules" label-width="80px">
<el-form-item label="分类名称" prop="name">
<el-input v-model="dialogCategoryForm.name" placeholder="请输入分类名称" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitDialogCategoryForm">确 定</el-button>
<el-button @click="dialog.category = false">取 消</el-button>
</div>
</el-dialog>
<!-- 部署流程模板文件对话框 -->
<el-dialog :title="dialog.title" :visible.sync="dialog.definition" width="400px" append-to-body>
<el-form ref="dialogDefinitionForm" :model="dialogDefinitionForm" :rules="dialogDefinitionRules" label-width="80px">
<el-form-item label="模板名称" prop="name">
<el-input v-model="dialogDefinitionForm.name" placeholder="请输入模板名称" />
</el-form-item>
<el-form-item label="模板文件">
<input type="file" @change="getDefinitionFile($event)" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitDialogDefinitionForm">确 定</el-button>
<el-button @click="dialog.definition = false">取 消</el-button>
</div>
</el-dialog>
<!-- 流程图对话框 -->
<el-dialog :title="dialog.title" :visible.sync="dialog.resource" width="400px" append-to-body>
<el-image :src="flowSrc">
<div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i>
</div>
</el-image>
<div slot="footer" class="dialog-footer">
<el-button @click="dialog.resource = false">取 消</el-button>
</div>
</el-dialog>
</el-row>
</template>
<script>
import { listCategory, addCategory, updateCategory, delCategory, pageDefinition, delDefinition, deployDefinition, flowResource, activateDefinition, suspendDefinition } from '@/api/workflow/definition'
export default {
name: 'DefinitionList',
data() {
return {
tableHeight: document.body.offsetHeight - 310 + 'px',
// 展示切换
showOptions: {
data: {},
showList: true
},
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 表格头
tableColumns: [
{ prop: 'gbTypeCode', label: '标准类别编码', show: true },
{ prop: 'gbTypeName', label: '标准类别名称', show: true },
{ prop: 'gbCode', label: '标准编码', show: true },
{ prop: 'gbName', label: '标准名称', show: true },
{
prop: 'status',
label: '状态',
show: true
},
{ prop: 'createTime', label: '创建时间', show: true }
],
// 默认选择中表格头
checkedTableColumns: [],
tableSize: 'medium',
// 表格数据
tableDataList: [],
// 总数据条数
total: 0,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 20,
name: '',
key: '',
categoryId: ''
},
// 左侧树
categoryOptions: [],
defaultProps: {
children: 'children',
label: 'name'
},
dialog: {
// 是否显示弹出层
category: false,
definition: false,
resource: false,
// 弹出层标题
title: ''
},
dialogCategoryForm: {},
dialogCategoryRules: {
name: [
{ required: true, message: '分类名称不能为空', trigger: 'blur' }
]
},
dialogDefinitionForm: {},
dialogDefinitionRules: {
name: [
{ required: true, message: '分类名称不能为空', trigger: 'blur' }
]
},
flowSrc: ''
}
},
created() {
this.getTree()
this.getList()
},
mounted() {
this.initCols()
},
methods: {
getTree() {
listCategory().then(response => {
if (response.success) {
const { data } = response
const tree = {}
tree.name = '流程分类'
tree.children = data
this.categoryOptions = []
this.categoryOptions.push(tree)
}
})
},
/** 节点单击事件 */
handleNodeClick(data) {
if (data.id) {
this.queryParams.categoryId = data.id
this.getList()
}
},
handleAddCategory() {
this.dialog.category = true
this.dialog.title = '流程分类'
this.dialogCategoryForm = {
name: ''
}
},
submitDialogCategoryForm() {
this.$refs['dialogCategoryForm'].validate(valid => {
if (valid) {
if (this.dialogCategoryForm.id) {
updateCategory(this.dialogCategoryForm).then(response => {
if (response.success) {
this.$message.success('保存成功')
this.dialog.category = false
this.getTree()
} else {
this.$message.error('保存失败')
}
}).catch(error => {
this.$message.error(error.msg || '保存失败')
})
} else {
addCategory(this.dialogCategoryForm).then(response => {
if (response.success) {
this.$message.success('保存成功')
this.dialog.category = false
this.getTree()
} else {
this.$message.error('保存失败')
}
}).catch(error => {
this.$message.error(error.msg || '保存失败')
})
}
}
})
},
/** 树节点鼠标移入移出 */
mouseenter(data) {
this.$set(data, 'show', true)
},
mouseleave(data) {
this.$set(data, 'show', false)
},
handleEditCategory(data) {
this.dialog.category = true
this.dialog.title = '流程分类'
this.dialogCategoryForm = {
id: data.id,
name: data.name
}
},
handleDelCategory(data) {
this.$confirm('选中数据将被永久删除, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delCategory(data.id).then(response => {
if (response.success) {
this.$message.success('删除成功')
this.getTree()
}
})
}).catch(() => {
})
},
handleImport() {
const node = this.$refs.category.getCurrentNode()
if (node && node.id) {
this.dialog.definition = true
this.dialog.title = '部署流程模板文件'
this.dialogDefinitionForm = {
name: '',
category: node.id,
file: ''
}
} else {
this.$message.warning('请先选择流程分类')
}
},
getDefinitionFile(event) {
this.dialogDefinitionForm.file = event.target.files[0]
},
submitDialogDefinitionForm() {
const formData = new FormData()
formData.append('name', this.dialogDefinitionForm.name)
formData.append('category', this.dialogDefinitionForm.category)
formData.append('file', this.dialogDefinitionForm.file)
deployDefinition(formData).then(response => {
if (response.success) {
this.$message.success('部署成功')
this.dialog.definition = false
this.getTree()
} else {
this.$message.error('部署失败')
}
}).catch(error => {
this.$message.error(error.msg || '部署失败')
})
},
/** 查询数据源列表 */
getList() {
this.loading = true
pageDefinition(this.queryParams).then(response => {
this.loading = false
if (response.success) {
const { data } = response
this.tableDataList = data.data
this.total = data.total
}
})
},
initCols() {
this.checkedTableColumns = this.tableColumns.map(col => col.prop)
},
handleCheckedColsChange(val) {
this.tableColumns.forEach(col => {
if (!this.checkedTableColumns.includes(col.prop)) {
col.show = false
} else {
col.show = true
}
})
},
handleCommand(command) {
this.tableSize = command
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams = {
pageNum: 1,
pageSize: 20,
name: '',
key: '',
categoryId: ''
}
this.handleQuery()
},
/** 刷新列表 */
handleRefresh() {
this.getList()
},
/** 多选框选中数据 */
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
handleResource(row) {
flowResource(row.id).then(response => {
const blob = new Blob([response])
this.flowSrc = window.URL.createObjectURL(blob)
this.dialog.resource = true
})
},
handleActivate(row) {
this.$confirm('激活流程定义?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
activateDefinition(row.id).then(response => {
if (response.success) {
this.$message.success('删除成功')
this.getList()
}
})
}).catch(() => {
})
},
handleSuspend(row) {
this.$confirm('挂起流程定义?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
suspendDefinition(row.id).then(response => {
if (response.success) {
this.$message.success('删除成功')
this.getList()
}
})
}).catch(() => {
})
},
handleDelete(row) {
this.$confirm('选中数据将被永久删除, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delDefinition(row.deploymentId).then(response => {
if (response.success) {
this.$message.success('删除成功')
this.getList()
}
})
}).catch(() => {
})
},
handleSizeChange(val) {
console.log(`每页 ${val} 条`)
this.queryParams.pageNum = 1
this.queryParams.pageSize = val
this.getList()
},
handleCurrentChange(val) {
console.log(`当前页: ${val}`)
this.queryParams.pageNum = val
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.right-toolbar {
float: right;
}
.el-card ::v-deep .el-card__body {
height: calc(100vh - 170px);
}
.tree-wrapper {
overflow-y: auto;
.body-wrapper {
margin: -10px;
::v-deep .custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
.tree-folder {
margin-right: 5px;
color: #f6cf07;
}
.tree-bts {
.bt-add {
color: #409eff;
}
.bt-edit {
color: #67c23a;
}
.bt-delete {
color: #f56c6c;
}
i {
margin-right: 10px;
padding: 0px;
}
}
}
}
}
</style>
<template>
<div class="app-container">
<transition name="el-zoom-in-center">
<definition-list v-if="options.showList" @showCard="showCard" />
</transition>
</div>
</template>
<script>
import DefinitionList from './DefinitionList'
export default {
name: 'Definition',
components: { DefinitionList },
data() {
return {
options: {
data: {},
showList: true
}
}
},
methods: {
showCard(data) {
Object.assign(this.options, data)
}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div class="app-container">
Workflow
</div>
</template>
<script>
export default {
name: 'Workflow'
}
</script>
<style lang="scss" scoped>
</style>
<template>
<el-card class="box-card" shadow="always">
<el-form ref="queryForm" :model="queryParams" :inline="true">
<el-form-item label="流程实例名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入流程实例名称"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-table
v-loading="loading"
:data="tableDataList"
border
tooltip-effect="dark"
:height="tableHeight"
style="width: 100%;margin: 15px 0;"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="55" align="center">
<template slot-scope="scope">
<span>{{ scope.$index +1 }}</span>
</template>
</el-table-column>
<template v-for="(item, index) in tableColumns">
<el-table-column
v-if="item.show"
:key="index"
:prop="item.prop"
:label="item.label"
:formatter="item.formatter"
align="center"
show-overflow-tooltip
/>
</template>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-popover
placement="left"
trigger="click"
>
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleActivate(scope.row)"
>激活</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleSuspend(scope.row)"
>挂起</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button>
<el-button slot="reference">操作</el-button>
</el-popover>
</template>
</el-table-column>
</el-table>
<el-pagination
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:current-page.sync="queryParams.pageNum"
:page-size.sync="queryParams.pageSize"
:total="total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</el-card>
</template>
<script>
import { pageInstance, delInstance, activateInstance, suspendInstance } from '@/api/workflow/instance'
export default {
name: 'InstanceList',
data() {
return {
tableHeight: document.body.offsetHeight - 310 + 'px',
// 展示切换
showOptions: {
data: {},
showList: true
},
// 遮罩层
loading: true,
// 选中数组
ids: [],
// 非单个禁用
single: true,
// 非多个禁用
multiple: true,
// 表格头
tableColumns: [
{ prop: 'setName', label: '数据集名称', show: true },
{
prop: 'status',
label: '状态',
show: true
},
{ prop: 'createTime', label: '创建时间', show: true }
],
// 表格数据
tableDataList: [],
// 总数据条数
total: 0,
// 查询参数
queryParams: {
pageNum: 1,
pageSize: 20,
name: ''
}
}
},
created() {
this.getList()
},
methods: {
/** 查询数据集列表 */
getList() {
this.loading = true
pageInstance(this.queryParams).then(response => {
this.loading = false
if (response.success) {
const { data } = response
this.tableDataList = data.data
this.total = data.total
}
})
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.queryParams = {
pageNum: 1,
pageSize: 20,
name: ''
}
this.handleQuery()
},
/** 多选框选中数据 */
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
handleActivate(row) {
this.$confirm('激活流程实例?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
activateInstance(row.id).then(response => {
if (response.success) {
this.$message.success('激活流程实例成功')
this.getList()
}
})
}).catch(() => {
})
},
handleSuspend(row) {
this.$confirm('挂起流程实例?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
suspendInstance(row.id).then(response => {
if (response.success) {
this.$message.success('挂起流程实例成功')
this.getList()
}
})
}).catch(() => {
})
},
/** 删除按钮操作 */
handleDelete(row) {
this.$confirm('选中数据将被永久删除, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
delInstance(row.id).then(response => {
if (response.success) {
this.$message.success('删除成功')
this.getList()
}
})
}).catch(() => {
})
},
handleSizeChange(val) {
console.log(`每页 ${val} 条`)
this.queryParams.pageNum = 1
this.queryParams.pageSize = val
this.getList()
},
handleCurrentChange(val) {
console.log(`当前页: ${val}`)
this.queryParams.pageNum = val
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.right-toolbar {
float: right;
}
.el-card ::v-deep .el-card__body {
height: calc(100vh - 170px);
}
</style>
<template>
<div class="app-container">
<transition name="el-zoom-in-center">
<instance-list v-if="options.showList" @showCard="showCard" />
</transition>
</div>
</template>
<script>
import InstanceList from './InstanceList'
export default {
name: 'Instance',
components: { InstanceList },
data() {
return {
options: {
data: {},
showList: true
}
}
},
methods: {
showCard(data) {
Object.assign(this.options, data)
}
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div class="app-container">
Task
</div>
</template>
<script>
export default {
name: 'Task'
}
</script>
<style lang="scss" scoped>
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment