Commit 2e6edd46 by yuwei

项目初始化

parent e01692fe
package cn.datax.common.utils; package cn.datax.common.utils;
import cn.datax.common.core.DataRole;
import cn.datax.common.core.DataUser; import cn.datax.common.core.DataUser;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import java.util.List;
import java.util.stream.Collectors;
public class SecurityUtil { public class SecurityUtil {
/** /**
...@@ -61,4 +65,18 @@ public class SecurityUtil { ...@@ -61,4 +65,18 @@ public class SecurityUtil {
} }
return null; 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; ...@@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class DefinitionQuery extends BaseQueryParams { public class FlowDefinitionQuery extends BaseQueryParams {
private static final long serialVersionUID=1L; 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; package cn.datax.service.workflow.controller;
import cn.datax.common.core.DataConstant;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups; import cn.datax.common.validate.ValidationGroups;
...@@ -58,6 +59,16 @@ public class CategoryController extends BaseController { ...@@ -58,6 +59,16 @@ public class CategoryController extends BaseController {
return R.ok().setData(categoryMapper.toVO(categoryEntity)); 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; ...@@ -2,13 +2,14 @@ package cn.datax.service.workflow.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.service.workflow.api.query.CategoryQuery; import cn.datax.service.workflow.api.query.FlowDefinitionQuery;
import cn.datax.service.workflow.api.query.DefinitionQuery; import cn.datax.service.workflow.service.FlowDefinitionService;
import cn.datax.service.workflow.service.ProcessDefinitionService; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.flowable.engine.repository.ProcessDefinition;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -22,19 +23,19 @@ import java.util.zip.ZipInputStream; ...@@ -22,19 +23,19 @@ import java.util.zip.ZipInputStream;
@Api(tags = {"流程定义"}) @Api(tags = {"流程定义"})
@RestController @RestController
@RequestMapping("/definitions") @RequestMapping("/definitions")
public class DefinitionController extends BaseController { public class FlowDefinitionController extends BaseController {
@Autowired @Autowired
private ProcessDefinitionService processDefinitionService; private FlowDefinitionService flowDefinitionService;
@ApiOperation(value = "分页查询") @ApiOperation(value = "分页查询")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "categoryQuery", value = "查询实体categoryQuery", required = true, dataTypeClass = CategoryQuery.class) @ApiImplicitParam(name = "categoryQuery", value = "查询实体flowDefinitionQuery", required = true, dataTypeClass = FlowDefinitionQuery.class)
}) })
@GetMapping("/page") @GetMapping("/page")
public R page(DefinitionQuery definitionQuery) { public R page(FlowDefinitionQuery flowDefinitionQuery) {
processDefinitionService.page(definitionQuery); Page<ProcessDefinition> page = flowDefinitionService.page(flowDefinitionQuery);
return R.ok(); return R.ok().setData(page);
} }
@PostMapping("/import/file") @PostMapping("/import/file")
...@@ -42,12 +43,12 @@ public class DefinitionController extends BaseController { ...@@ -42,12 +43,12 @@ public class DefinitionController extends BaseController {
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "模板名称(模板name)", required = true, dataType = "String"), @ApiImplicitParam(name = "name", value = "模板名称(模板name)", required = true, dataType = "String"),
@ApiImplicitParam(name = "category", value = "模板类别", required = false, 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") @ApiImplicitParam(name = "file", value = "模板文件", required = true, dataType = "__file")
}) })
public R deployByInputStream(String name, String category, String tenantId, @RequestParam("file") MultipartFile file) { public R deployByInputStream(String name, String category, String tenantId, @RequestParam("file") MultipartFile file) {
try (InputStream in = file.getInputStream()) { try (InputStream in = file.getInputStream()) {
processDefinitionService.deploy(name, category, tenantId, in); flowDefinitionService.deploy(name, category, tenantId, in);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
...@@ -59,12 +60,12 @@ public class DefinitionController extends BaseController { ...@@ -59,12 +60,12 @@ public class DefinitionController extends BaseController {
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "模板名称(模板name)", required = true, dataType = "String"), @ApiImplicitParam(name = "name", value = "模板名称(模板name)", required = true, dataType = "String"),
@ApiImplicitParam(name = "category", value = "模板类别", required = false, 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") @ApiImplicitParam(name = "file", value = "模板文件", required = true, dataType = "__file")
}) })
public R deployByZip(String name, String category, String tenantId, @RequestParam("file") MultipartFile 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"))) { 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) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
...@@ -75,7 +76,7 @@ public class DefinitionController extends BaseController { ...@@ -75,7 +76,7 @@ public class DefinitionController extends BaseController {
@ApiImplicitParam(name = "processDefinitionId", value = "流程定义ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "processDefinitionId", value = "流程定义ID", required = true, dataType = "String", paramType = "path")
@PutMapping("/activate/{processDefinitionId}") @PutMapping("/activate/{processDefinitionId}")
public R activate(@PathVariable String processDefinitionId) { public R activate(@PathVariable String processDefinitionId) {
processDefinitionService.activateProcessDefinitionById(processDefinitionId); flowDefinitionService.activateProcessDefinitionById(processDefinitionId);
return R.ok(); return R.ok();
} }
...@@ -83,7 +84,7 @@ public class DefinitionController extends BaseController { ...@@ -83,7 +84,7 @@ public class DefinitionController extends BaseController {
@ApiImplicitParam(name = "processDefinitionId", value = "流程定义ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "processDefinitionId", value = "流程定义ID", required = true, dataType = "String", paramType = "path")
@PutMapping("/suspend/{processDefinitionId}") @PutMapping("/suspend/{processDefinitionId}")
public R suspend(@PathVariable String processDefinitionId) { public R suspend(@PathVariable String processDefinitionId) {
processDefinitionService.suspendProcessDefinitionById(processDefinitionId); flowDefinitionService.suspendProcessDefinitionById(processDefinitionId);
return R.ok(); return R.ok();
} }
...@@ -91,7 +92,7 @@ public class DefinitionController extends BaseController { ...@@ -91,7 +92,7 @@ public class DefinitionController extends BaseController {
@ApiImplicitParam(name = "deploymentId", value = "流程部署ID", required = true, dataType = "String", paramType = "path") @ApiImplicitParam(name = "deploymentId", value = "流程部署ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/delete/{deploymentId}") @DeleteMapping("/delete/{deploymentId}")
public R delete(@PathVariable String deploymentId) { public R delete(@PathVariable String deploymentId) {
processDefinitionService.deleteDeployment(deploymentId); flowDefinitionService.deleteDeployment(deploymentId);
return R.ok(); return R.ok();
} }
...@@ -102,7 +103,7 @@ public class DefinitionController extends BaseController { ...@@ -102,7 +103,7 @@ public class DefinitionController extends BaseController {
@ApiImplicitParam(name = "resType", value = "资源类型(xml|image)", required = true, dataType = "String") @ApiImplicitParam(name = "resType", value = "资源类型(xml|image)", required = true, dataType = "String")
}) })
public void resource(String processDefinitionId, String resType, HttpServletResponse response) throws Exception { 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]; byte[] b = new byte[1024];
int len = -1; int len = -1;
while ((len = resourceAsStream.read(b, 0, 1024)) != -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; 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.io.InputStream;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
public interface ProcessDefinitionService { public interface FlowDefinitionService {
/**
* 分页查询流程定义
* @param flowDefinitionQuery
* @return
*/
Page<ProcessDefinition> page(FlowDefinitionQuery flowDefinitionQuery);
/** /**
* 部署流程资源 * 部署流程资源
* *
* @param name 流程模板文件名字 * @param name 流程模板文件名字
* @param category 流程模板文件类别 * @param category 流程模板文件类别
* @param tenantId 租户ID
* @param in 流程模板文件流 * @param in 流程模板文件流
* @return * @return
*/ */
...@@ -22,7 +32,7 @@ public interface ProcessDefinitionService { ...@@ -22,7 +32,7 @@ public interface ProcessDefinitionService {
* *
* @param name 流程模板文件名字 * @param name 流程模板文件名字
* @param category 流程模板文件类别 * @param category 流程模板文件类别
* @param tenantId 业务系统标识 * @param tenantId 租户ID
* @param zipInputStream * @param zipInputStream
* @return * @return
*/ */
...@@ -53,10 +63,4 @@ public interface ProcessDefinitionService { ...@@ -53,10 +63,4 @@ public interface ProcessDefinitionService {
* @return * @return
*/ */
InputStream resource(String processDefinitionId, String resType); 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; package cn.datax.service.workflow.service.impl;
import cn.datax.service.workflow.api.query.DefinitionQuery; import cn.datax.service.workflow.api.query.FlowDefinitionQuery;
import cn.datax.service.workflow.service.ProcessDefinitionService; import cn.datax.service.workflow.service.FlowDefinitionService;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.RepositoryService;
import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.DeploymentBuilder; import org.flowable.engine.repository.DeploymentBuilder;
...@@ -17,8 +17,9 @@ import java.io.InputStream; ...@@ -17,8 +17,9 @@ import java.io.InputStream;
import java.util.List; import java.util.List;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
@Slf4j
@Service @Service
public class ProcessDefinitionServiceImpl implements ProcessDefinitionService { public class FlowDefinitionServiceImpl implements FlowDefinitionService {
@Autowired @Autowired
private RepositoryService repositoryService; private RepositoryService repositoryService;
...@@ -28,22 +29,23 @@ public class ProcessDefinitionServiceImpl implements ProcessDefinitionService { ...@@ -28,22 +29,23 @@ public class ProcessDefinitionServiceImpl implements ProcessDefinitionService {
public static final String RESOURCE_TYPE_XML = "xml"; public static final String RESOURCE_TYPE_XML = "xml";
@Override @Override
public void page(DefinitionQuery definitionQuery) { public Page<ProcessDefinition> page(FlowDefinitionQuery flowDefinitionQuery) {
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
if (StrUtil.isNotBlank(definitionQuery.getName())) { if (StrUtil.isNotBlank(flowDefinitionQuery.getName())) {
processDefinitionQuery.processDefinitionNameLike(definitionQuery.getName()); processDefinitionQuery.processDefinitionNameLike(flowDefinitionQuery.getName());
} }
if(StringUtils.isNotBlank(definitionQuery.getKey())){ if(StrUtil.isNotBlank(flowDefinitionQuery.getKey())){
processDefinitionQuery.processDefinitionKeyLike(definitionQuery.getKey()); processDefinitionQuery.processDefinitionKeyLike(flowDefinitionQuery.getKey());
} }
if(StringUtils.isNotBlank(definitionQuery.getCategoryId())){ if(StrUtil.isNotBlank(flowDefinitionQuery.getCategoryId())){
processDefinitionQuery.processDefinitionCategory(definitionQuery.getCategoryId()); processDefinitionQuery.processDefinitionCategory(flowDefinitionQuery.getCategoryId());
} }
long count = processDefinitionQuery.count(); long count = processDefinitionQuery.count();
List<ProcessDefinition> processDefinitionList = processDefinitionQuery.listPage((definitionQuery.getPageNum() - 1) * definitionQuery.getPageSize(), definitionQuery.getPageSize()); List<ProcessDefinition> processDefinitionList = processDefinitionQuery.listPage((flowDefinitionQuery.getPageNum() - 1) * flowDefinitionQuery.getPageSize(), flowDefinitionQuery.getPageSize());
Page<ProcessDefinition> page = new Page<>(definitionQuery.getPageNum(), definitionQuery.getPageSize()); Page<ProcessDefinition> page = new Page<>(flowDefinitionQuery.getPageNum(), flowDefinitionQuery.getPageSize());
page.setRecords(processDefinitionList); page.setRecords(processDefinitionList);
page.setTotal(count); page.setTotal(count);
return page;
} }
@Override @Override
...@@ -76,16 +78,19 @@ public class ProcessDefinitionServiceImpl implements ProcessDefinitionService { ...@@ -76,16 +78,19 @@ public class ProcessDefinitionServiceImpl implements ProcessDefinitionService {
@Override @Override
public void activateProcessDefinitionById(String processDefinitionId) { public void activateProcessDefinitionById(String processDefinitionId) {
log.info("成功激活流程定义ID:{}", processDefinitionId);
repositoryService.activateProcessDefinitionById(processDefinitionId, true, null); repositoryService.activateProcessDefinitionById(processDefinitionId, true, null);
} }
@Override @Override
public void suspendProcessDefinitionById(String processDefinitionId) { public void suspendProcessDefinitionById(String processDefinitionId) {
log.info("成功激活流程定义ID:{}", processDefinitionId);
repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null); repositoryService.suspendProcessDefinitionById(processDefinitionId, true, null);
} }
@Override @Override
public void deleteDeployment(String deploymentId) { public void deleteDeployment(String deploymentId) {
log.info("成功删除流程部署ID:{}", deploymentId);
repositoryService.deleteDeployment(deploymentId, true); 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 @@ ...@@ -93,7 +93,7 @@
border border
tooltip-effect="dark" tooltip-effect="dark"
:size="tableSize" :size="tableSize"
height="calc(100vh - 50%)" :height="tableHeight"
style="width: 100%;margin: 15px 0;" style="width: 100%;margin: 15px 0;"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
...@@ -163,7 +163,7 @@ export default { ...@@ -163,7 +163,7 @@ export default {
name: 'DataSetList', name: 'DataSetList',
data() { data() {
return { return {
tableHeight: document.body.offsetHeight - 340 + 'px', tableHeight: document.body.offsetHeight - 310 + 'px',
// 展示切换 // 展示切换
showOptions: { showOptions: {
data: {}, data: {},
......
<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