Commit 91ca57bb by yuwei

项目初始化

parent 52c2029f
...@@ -5,8 +5,23 @@ package cn.datax.service.workflow.api.enums; ...@@ -5,8 +5,23 @@ package cn.datax.service.workflow.api.enums;
*/ */
public enum VariablesEnum { public enum VariablesEnum {
/** 用户编号 */ /** 开始 */
userId, start,
/** 提交节点 */
submitNode,
/** 初审节点 */
initialAuditNode,
/** 终审节点 */
finalAuditNode,
/** 通过结束节点 */
approveEnd,
/** 不通过结束节点 */
rejectEnd,
/** 活动主题*/ /** 活动主题*/
businessName, businessName,
...@@ -15,8 +30,5 @@ public enum VariablesEnum { ...@@ -15,8 +30,5 @@ public enum VariablesEnum {
businessType, businessType,
/** 主键id*/ /** 主键id*/
businessKey, businessKey;
/** 审批状态*/
auditStatus;
} }
...@@ -12,10 +12,11 @@ public class FlowDefinitionVo implements Serializable { ...@@ -12,10 +12,11 @@ public class FlowDefinitionVo implements Serializable {
private String id; private String id;
private String Key; private String Key;
private String name; private String name;
private int version; private String description;
private Integer version;
private String category; private String category;
private String deploymentId; private String deploymentId;
private String resourceName; private String resourceName;
private String diagramResourceName; private String diagramResourceName;
private int suspensionState; private Integer suspensionState;
} }
package cn.datax.service.workflow.api.vo;
import cn.datax.service.workflow.api.enums.VariablesEnum;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.Map;
@Data
public class FlowHistTaskVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private Integer revision;
private String executionId;
private String processInstanceId;
private String processDefinitionId;
private String taskDefinitionId;
private String scopeId;
private String subScopeId;
private String scopeType;
private String scopeDefinitionId;
private Date createTime;
private Date endTime;
private String durationInMillis;
private String deleteReason;
private String name;
private String parentTaskId;
private String description;
private String owner;
private String assignee;
private String taskDefinitionKey;
private String formKey;
private Integer priority;
private String dueDate;
private Date claimTime;
private String category;
private String tenantId;
private Date lastUpdateTime;
private String queryVariables;
private Date time;
private Date startTime;
private String workTimeInMillis;
private Boolean inserted;
private String idPrefix;
private Boolean updated;
private Boolean deleted;
private Integer revisionNext;
/**
* 业务相关
*/
private String businessKey;
private String businessType;
private String businessName;
private Map<String,Object> variables;
public void setVariables(Map<String, Object> variables) {
this.variables = variables;
if(null != variables){
//放入业务常量
this.businessKey = (String) variables.get(VariablesEnum.businessKey.toString());
this.businessType = (String) variables.get(VariablesEnum.businessType.toString());
this.businessName = (String) variables.get(VariablesEnum.businessName.toString());
}
}
}
...@@ -3,9 +3,61 @@ package cn.datax.service.workflow.api.vo; ...@@ -3,9 +3,61 @@ package cn.datax.service.workflow.api.vo;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
import java.util.Map;
@Data @Data
public class FlowInstanceVo implements Serializable { public class FlowInstanceVo implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
private String id;
private String processDefinitionKey;
private String processDefinitionId;
private String businessKey;
private String processDefinitionName;
private Date startTime;
private String deploymentId;
private String description;
private String name;
private Integer processDefinitionVersion;
private Map<String, Object> processVariables;
private String startUserId;
private String callbackId;
private String callbackType;
private String tenantId;
private String localizedDescription;
private String localizedName;
private String processInstanceId;
private String activityId;
private String parentId;
private String rootProcessInstanceId;
private String superExecutionId;
private Integer suspensionState;
private Boolean isSuspended;
private Boolean isEnded;
} }
package cn.datax.service.workflow.api.vo; package cn.datax.service.workflow.api.vo;
import cn.datax.service.workflow.api.enums.VariablesEnum;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
import java.util.Map;
@Data @Data
public class FlowTaskVo implements Serializable { public class FlowTaskVo implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
private String id;
private String owner;
private Integer assigneeUpdatedCount;
private String originalAssignee;
private String assignee;
private String parentTaskId;
private String name;
private String localizedName;
private String description;
private String localizedDescription;
private Integer priority;
private Date createTime;
private Date dueDate;
private Integer suspensionState;
private String category;
private Boolean isIdentityLinksInitialized;
private String executionId;
private String processInstanceId;
private String processDefinitionId;
private String taskDefinitionId;
private String scopeId;
private String subScopeId;
private String scopeType;
private String scopeDefinitionId;
private String taskDefinitionKey;
private String formKey;
private Boolean isCanceled;
private Boolean isCountEnabled;
private Integer variableCount;
private Integer identityLinkCount;
private Integer subTaskCount;
private Date claimTime;
private String tenantId;
private String eventName;
private String eventHandlerId;
private String idPrefix;
private Boolean forcedUpdate;
private Boolean isInserted;
private Boolean isUpdated;
private Boolean isDeleted;
/**
* 业务相关
*/
private String businessKey;
private String businessType;
private String businessName;
private Map<String,Object> variables;
public void setVariables(Map<String, Object> variables) {
this.variables = variables;
if(null != variables){
//放入业务常量
this.businessKey = (String) variables.get(VariablesEnum.businessKey.toString());
this.businessType = (String) variables.get(VariablesEnum.businessType.toString());
this.businessName = (String) variables.get(VariablesEnum.businessName.toString());
}
}
} }
package cn.datax.service.workflow.controller; package cn.datax.service.workflow.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.service.workflow.api.query.FlowDefinitionQuery; import cn.datax.service.workflow.api.query.FlowDefinitionQuery;
import cn.datax.service.workflow.api.vo.FlowDefinitionVo;
import cn.datax.service.workflow.service.FlowDefinitionService; import cn.datax.service.workflow.service.FlowDefinitionService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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;
...@@ -34,8 +35,9 @@ public class FlowDefinitionController extends BaseController { ...@@ -34,8 +35,9 @@ public class FlowDefinitionController extends BaseController {
}) })
@GetMapping("/page") @GetMapping("/page")
public R page(FlowDefinitionQuery flowDefinitionQuery) { public R page(FlowDefinitionQuery flowDefinitionQuery) {
Page<ProcessDefinition> page = flowDefinitionService.page(flowDefinitionQuery); Page<FlowDefinitionVo> page = flowDefinitionService.page(flowDefinitionQuery);
return R.ok().setData(page); JsonPage<FlowDefinitionVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), page.getRecords());
return R.ok().setData(jsonPage);
} }
@PostMapping("/import/file") @PostMapping("/import/file")
......
package cn.datax.service.workflow.controller; package cn.datax.service.workflow.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.service.workflow.api.dto.ProcessInstanceCreateRequest; import cn.datax.service.workflow.api.dto.ProcessInstanceCreateRequest;
import cn.datax.service.workflow.api.query.FlowInstanceQuery; import cn.datax.service.workflow.api.query.FlowInstanceQuery;
import cn.datax.service.workflow.api.vo.FlowInstanceVo;
import cn.datax.service.workflow.service.FlowInstanceService; import cn.datax.service.workflow.service.FlowInstanceService;
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;
...@@ -12,6 +15,9 @@ import io.swagger.annotations.ApiOperation; ...@@ -12,6 +15,9 @@ import io.swagger.annotations.ApiOperation;
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 javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
@Api(tags = {"流程实例"}) @Api(tags = {"流程实例"})
@RestController @RestController
@RequestMapping("/instances") @RequestMapping("/instances")
...@@ -34,8 +40,9 @@ public class FlowInstanceController extends BaseController { ...@@ -34,8 +40,9 @@ public class FlowInstanceController extends BaseController {
}) })
@GetMapping("/page") @GetMapping("/page")
public R page(FlowInstanceQuery flowInstanceQuery) { public R page(FlowInstanceQuery flowInstanceQuery) {
flowInstanceService.page(flowInstanceQuery); Page<FlowInstanceVo> page = flowInstanceService.page(flowInstanceQuery);
return R.ok(); JsonPage<FlowInstanceVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), page.getRecords());
return R.ok().setData(jsonPage);
} }
@ApiOperation(value = "激活流程实例", notes = "根据url的id来指定激活流程实例") @ApiOperation(value = "激活流程实例", notes = "根据url的id来指定激活流程实例")
...@@ -61,4 +68,16 @@ public class FlowInstanceController extends BaseController { ...@@ -61,4 +68,16 @@ public class FlowInstanceController extends BaseController {
flowInstanceService.deleteProcessInstance(processInstanceId, null); flowInstanceService.deleteProcessInstance(processInstanceId, null);
return R.ok(); return R.ok();
} }
@ApiOperation(value = "流程追踪")
@ApiImplicitParam(name = "processInstanceId", value = "流程实例ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/track")
public void track(String processInstanceId, HttpServletResponse response) throws Exception {
InputStream resourceAsStream = flowInstanceService.createImage(processInstanceId);
byte[] b = new byte[1024];
int len = -1;
while ((len = resourceAsStream.read(b, 0, 1024)) != -1) {
response.getOutputStream().write(b, 0, len);
}
}
} }
package cn.datax.service.workflow.controller; package cn.datax.service.workflow.controller;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.service.workflow.api.query.FlowTaskQuery; import cn.datax.service.workflow.api.query.FlowTaskQuery;
import cn.datax.service.workflow.api.vo.FlowHistTaskVo;
import cn.datax.service.workflow.api.vo.FlowTaskVo;
import cn.datax.service.workflow.service.FlowTaskService; import cn.datax.service.workflow.service.FlowTaskService;
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;
...@@ -21,14 +25,15 @@ public class FlowTaskController extends BaseController { ...@@ -21,14 +25,15 @@ public class FlowTaskController extends BaseController {
@Autowired @Autowired
private FlowTaskService flowTaskService; private FlowTaskService flowTaskService;
@ApiOperation(value = "分页查询办任务") @ApiOperation(value = "分页查询办任务")
@ApiImplicitParams({ @ApiImplicitParams({
@ApiImplicitParam(name = "flowTaskQuery", value = "查询实体flowTaskQuery", required = true, dataTypeClass = FlowTaskQuery.class) @ApiImplicitParam(name = "flowTaskQuery", value = "查询实体flowTaskQuery", required = true, dataTypeClass = FlowTaskQuery.class)
}) })
@GetMapping("/pageTodo") @GetMapping("/pageTodo")
public R pageTodo(FlowTaskQuery flowTaskQuery) { public R pageTodo(FlowTaskQuery flowTaskQuery) {
flowTaskService.pageTodo(flowTaskQuery); Page<FlowTaskVo> page = flowTaskService.pageTodo(flowTaskQuery);
return R.ok(); JsonPage<FlowTaskVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), page.getRecords());
return R.ok().setData(jsonPage);
} }
@ApiOperation(value = "分页查询已办任务") @ApiOperation(value = "分页查询已办任务")
...@@ -37,7 +42,8 @@ public class FlowTaskController extends BaseController { ...@@ -37,7 +42,8 @@ public class FlowTaskController extends BaseController {
}) })
@GetMapping("/pageDone") @GetMapping("/pageDone")
public R pageDone(FlowTaskQuery flowTaskQuery) { public R pageDone(FlowTaskQuery flowTaskQuery) {
flowTaskService.pageDone(flowTaskQuery); Page<FlowHistTaskVo> page = flowTaskService.pageDone(flowTaskQuery);
return R.ok(); JsonPage<FlowHistTaskVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), page.getRecords());
return R.ok().setData(jsonPage);
} }
} }
package cn.datax.service.workflow.service; package cn.datax.service.workflow.service;
import cn.datax.service.workflow.api.query.FlowDefinitionQuery; import cn.datax.service.workflow.api.query.FlowDefinitionQuery;
import cn.datax.service.workflow.api.vo.FlowDefinitionVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.repository.ProcessDefinition;
...@@ -14,7 +15,7 @@ public interface FlowDefinitionService { ...@@ -14,7 +15,7 @@ public interface FlowDefinitionService {
* @param flowDefinitionQuery * @param flowDefinitionQuery
* @return * @return
*/ */
Page<ProcessDefinition> page(FlowDefinitionQuery flowDefinitionQuery); Page<FlowDefinitionVo> page(FlowDefinitionQuery flowDefinitionQuery);
/** /**
* 部署流程资源 * 部署流程资源
......
...@@ -2,6 +2,8 @@ package cn.datax.service.workflow.service; ...@@ -2,6 +2,8 @@ package cn.datax.service.workflow.service;
import cn.datax.service.workflow.api.dto.ProcessInstanceCreateRequest; import cn.datax.service.workflow.api.dto.ProcessInstanceCreateRequest;
import cn.datax.service.workflow.api.query.FlowInstanceQuery; import cn.datax.service.workflow.api.query.FlowInstanceQuery;
import cn.datax.service.workflow.api.vo.FlowInstanceVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.io.InputStream; import java.io.InputStream;
...@@ -10,8 +12,9 @@ public interface FlowInstanceService { ...@@ -10,8 +12,9 @@ public interface FlowInstanceService {
/** /**
* 分页查询流程实例 * 分页查询流程实例
* @param flowInstanceQuery * @param flowInstanceQuery
* @return
*/ */
void page(FlowInstanceQuery flowInstanceQuery); Page<FlowInstanceVo> page(FlowInstanceQuery flowInstanceQuery);
/** /**
* 激活流程实例 * 激活流程实例
...@@ -48,5 +51,19 @@ public interface FlowInstanceService { ...@@ -48,5 +51,19 @@ public interface FlowInstanceService {
* 终止流程 * 终止流程
* @param processInstanceId * @param processInstanceId
*/ */
void stopProcessInstanceById(String processInstanceId) ; void stopProcessInstanceById(String processInstanceId);
/**
* 本人发起的流程实例
* @param flowInstanceQuery
* @return
*/
void pageMyStartedProcessInstance(FlowInstanceQuery flowInstanceQuery);
/**
* 本人参与的流程实例
* @param flowInstanceQuery
* @return
*/
void pageMyInvolvedProcessInstance(FlowInstanceQuery flowInstanceQuery);
} }
package cn.datax.service.workflow.service; package cn.datax.service.workflow.service;
import cn.datax.service.workflow.api.query.FlowTaskQuery; import cn.datax.service.workflow.api.query.FlowTaskQuery;
import cn.datax.service.workflow.api.vo.FlowHistTaskVo;
import cn.datax.service.workflow.api.vo.FlowTaskVo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
public interface FlowTaskService { public interface FlowTaskService {
/** /**
* 分页查询办任务 * 分页查询办任务
* @param flowTaskQuery * @param flowTaskQuery
* @return
*/ */
void pageTodo(FlowTaskQuery flowTaskQuery); Page<FlowTaskVo> pageTodo(FlowTaskQuery flowTaskQuery);
/** /**
* 分页查询已办任务 * 分页查询已办任务
* @param flowTaskQuery * @param flowTaskQuery
* @return
*/ */
void pageDone(FlowTaskQuery flowTaskQuery); Page<FlowHistTaskVo> pageDone(FlowTaskQuery flowTaskQuery);
} }
package cn.datax.service.workflow.service.impl; package cn.datax.service.workflow.service.impl;
import cn.datax.service.workflow.api.query.FlowDefinitionQuery; import cn.datax.service.workflow.api.query.FlowDefinitionQuery;
import cn.datax.service.workflow.api.vo.FlowDefinitionVo;
import cn.datax.service.workflow.service.FlowDefinitionService; import cn.datax.service.workflow.service.FlowDefinitionService;
import cn.datax.service.workflow.utils.BeanCopyUtil;
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 lombok.extern.slf4j.Slf4j; 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.*;
import org.flowable.engine.repository.DeploymentBuilder;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.repository.ProcessDefinitionQuery;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -29,22 +28,40 @@ public class FlowDefinitionServiceImpl implements FlowDefinitionService { ...@@ -29,22 +28,40 @@ public class FlowDefinitionServiceImpl implements FlowDefinitionService {
public static final String RESOURCE_TYPE_XML = "xml"; public static final String RESOURCE_TYPE_XML = "xml";
@Override @Override
public Page<ProcessDefinition> page(FlowDefinitionQuery flowDefinitionQuery) { public Page<FlowDefinitionVo> page(FlowDefinitionQuery flowDefinitionQuery) {
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); NativeProcessDefinitionQuery nativeProcessDefinitionQuery = repositoryService.createNativeProcessDefinitionQuery();
String sqlCount = "SELECT COUNT(RES.ID_) FROM ACT_RE_PROCDEF RES " +
"LEFT JOIN ACT_RE_DEPLOYMENT RED ON RES.DEPLOYMENT_ID_ = RED.ID_ " +
"WHERE 1=1 ";
String sqlList = "SELECT RES.* FROM ACT_RE_PROCDEF RES " +
"LEFT JOIN ACT_RE_DEPLOYMENT RED ON RES.DEPLOYMENT_ID_ = RED.ID_ " +
"WHERE 1=1 ";
if (StrUtil.isNotBlank(flowDefinitionQuery.getName())) { if (StrUtil.isNotBlank(flowDefinitionQuery.getName())) {
processDefinitionQuery.processDefinitionNameLike(flowDefinitionQuery.getName()); sqlCount += "AND RES.NAME_ like #{name} ";
sqlList += "AND RES.NAME_ like #{name} ";
} }
if(StrUtil.isNotBlank(flowDefinitionQuery.getKey())){ if(StrUtil.isNotBlank(flowDefinitionQuery.getKey())){
processDefinitionQuery.processDefinitionKeyLike(flowDefinitionQuery.getKey()); sqlCount += "AND RES.KEY_ like #{key} ";
sqlList += "AND RES.KEY_ like #{key} ";
} }
if(StrUtil.isNotBlank(flowDefinitionQuery.getCategoryId())){ if(StrUtil.isNotBlank(flowDefinitionQuery.getCategoryId())){
processDefinitionQuery.processDefinitionCategory(flowDefinitionQuery.getCategoryId()); sqlCount += "AND RED.CATEGORY_ = #{category} ";
sqlList += "AND RED.CATEGORY_ = #{category} ";
} }
long count = processDefinitionQuery.count(); sqlList += "ORDER BY RES.ID_ ASC ";
List<ProcessDefinition> processDefinitionList = processDefinitionQuery.listPage((flowDefinitionQuery.getPageNum() - 1) * flowDefinitionQuery.getPageSize(), flowDefinitionQuery.getPageSize()); long count = nativeProcessDefinitionQuery.sql(sqlCount)
ProcessDefinition processDefinition = processDefinitionList.get(0); .parameter("name", flowDefinitionQuery.getName())
Page<ProcessDefinition> page = new Page<>(flowDefinitionQuery.getPageNum(), flowDefinitionQuery.getPageSize()); .parameter("key", flowDefinitionQuery.getKey())
page.setRecords(processDefinitionList); .parameter("category", flowDefinitionQuery.getCategoryId())
.count();
List<ProcessDefinition> processDefinitionList = nativeProcessDefinitionQuery.sql(sqlList)
.parameter("name", flowDefinitionQuery.getName())
.parameter("key", flowDefinitionQuery.getKey())
.parameter("category", flowDefinitionQuery.getCategoryId())
.listPage((flowDefinitionQuery.getPageNum() - 1) * flowDefinitionQuery.getPageSize(), flowDefinitionQuery.getPageSize());
List<FlowDefinitionVo> flowDefinitionVoList = BeanCopyUtil.copyListProperties(processDefinitionList, FlowDefinitionVo::new);
Page<FlowDefinitionVo> page = new Page<>(flowDefinitionQuery.getPageNum(), flowDefinitionQuery.getPageSize());
page.setRecords(flowDefinitionVoList);
page.setTotal(count); page.setTotal(count);
return page; return page;
} }
......
...@@ -3,7 +3,9 @@ package cn.datax.service.workflow.service.impl; ...@@ -3,7 +3,9 @@ package cn.datax.service.workflow.service.impl;
import cn.datax.common.utils.SecurityUtil; import cn.datax.common.utils.SecurityUtil;
import cn.datax.service.workflow.api.dto.ProcessInstanceCreateRequest; import cn.datax.service.workflow.api.dto.ProcessInstanceCreateRequest;
import cn.datax.service.workflow.api.query.FlowInstanceQuery; import cn.datax.service.workflow.api.query.FlowInstanceQuery;
import cn.datax.service.workflow.api.vo.FlowInstanceVo;
import cn.datax.service.workflow.service.FlowInstanceService; import cn.datax.service.workflow.service.FlowInstanceService;
import cn.datax.service.workflow.utils.BeanCopyUtil;
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 lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -15,6 +17,7 @@ import org.flowable.engine.RepositoryService; ...@@ -15,6 +17,7 @@ import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService; import org.flowable.engine.RuntimeService;
import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.flowable.engine.runtime.ProcessInstance; import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.runtime.ProcessInstanceBuilder; import org.flowable.engine.runtime.ProcessInstanceBuilder;
import org.flowable.engine.runtime.ProcessInstanceQuery; import org.flowable.engine.runtime.ProcessInstanceQuery;
...@@ -44,16 +47,18 @@ public class FlowInstanceServiceImpl implements FlowInstanceService { ...@@ -44,16 +47,18 @@ public class FlowInstanceServiceImpl implements FlowInstanceService {
private static final String FONT_NAME = "宋体"; private static final String FONT_NAME = "宋体";
@Override @Override
public void page(FlowInstanceQuery flowInstanceQuery) { public Page<FlowInstanceVo> page(FlowInstanceQuery flowInstanceQuery) {
ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery(); ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery();
if(StrUtil.isNotBlank(flowInstanceQuery.getName())){ if(StrUtil.isNotBlank(flowInstanceQuery.getName())){
processInstanceQuery.processInstanceNameLike(flowInstanceQuery.getName()); processInstanceQuery.processInstanceNameLike(flowInstanceQuery.getName());
} }
long count = processInstanceQuery.count(); long count = processInstanceQuery.count();
List<ProcessInstance> processInstanceList = processInstanceQuery.orderByStartTime().desc().listPage((flowInstanceQuery.getPageNum() - 1) * flowInstanceQuery.getPageSize(), flowInstanceQuery.getPageSize()); List<ProcessInstance> processInstanceList = processInstanceQuery.orderByStartTime().desc().listPage((flowInstanceQuery.getPageNum() - 1) * flowInstanceQuery.getPageSize(), flowInstanceQuery.getPageSize());
Page<ProcessInstance> page = new Page<>(flowInstanceQuery.getPageNum(), flowInstanceQuery.getPageSize()); List<FlowInstanceVo> flowInstanceVoList = BeanCopyUtil.copyListProperties(processInstanceList, FlowInstanceVo::new);
page.setRecords(processInstanceList); Page<FlowInstanceVo> page = new Page<>(flowInstanceQuery.getPageNum(), flowInstanceQuery.getPageSize());
page.setRecords(flowInstanceVoList);
page.setTotal(count); page.setTotal(count);
return page;
} }
@Override @Override
...@@ -142,8 +147,21 @@ public class FlowInstanceServiceImpl implements FlowInstanceService { ...@@ -142,8 +147,21 @@ public class FlowInstanceServiceImpl implements FlowInstanceService {
} }
} }
// // 本人参与的流程实例 @Override
// historyService.createHistoricProcessInstanceQuery().involvedUser(SecurityUtil.getUserId()).orderByProcessInstanceStartTime().desc().list(); public void pageMyStartedProcessInstance(FlowInstanceQuery flowInstanceQuery) {
// // 本人发起的流程实例 HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery();
// historyService.createHistoricProcessInstanceQuery().startedBy(SecurityUtil.getUserId()).orderByProcessInstanceStartTime().desc().list(); historicProcessInstanceQuery.startedBy(SecurityUtil.getUserId());
long count = historicProcessInstanceQuery.count();
List<HistoricProcessInstance> historicProcessInstanceList = historicProcessInstanceQuery.orderByProcessInstanceStartTime().desc()
.listPage((flowInstanceQuery.getPageNum() - 1) * flowInstanceQuery.getPageSize(), flowInstanceQuery.getPageSize());
}
@Override
public void pageMyInvolvedProcessInstance(FlowInstanceQuery flowInstanceQuery) {
HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery();
historicProcessInstanceQuery.involvedUser(SecurityUtil.getUserId());
long count = historicProcessInstanceQuery.count();
List<HistoricProcessInstance> historicProcessInstanceList = historicProcessInstanceQuery.orderByProcessInstanceStartTime().desc()
.listPage((flowInstanceQuery.getPageNum() - 1) * flowInstanceQuery.getPageSize(), flowInstanceQuery.getPageSize());
}
} }
package cn.datax.service.workflow.service.impl; package cn.datax.service.workflow.service.impl;
import cn.datax.common.utils.SecurityUtil;
import cn.datax.service.workflow.api.enums.VariablesEnum; import cn.datax.service.workflow.api.enums.VariablesEnum;
import cn.datax.service.workflow.api.query.FlowTaskQuery; import cn.datax.service.workflow.api.query.FlowTaskQuery;
import cn.datax.service.workflow.api.vo.FlowHistTaskVo;
import cn.datax.service.workflow.api.vo.FlowTaskVo;
import cn.datax.service.workflow.service.FlowTaskService; import cn.datax.service.workflow.service.FlowTaskService;
import cn.hutool.core.bean.BeanUtil;
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 org.flowable.engine.HistoryService; import org.flowable.engine.HistoryService;
import org.flowable.engine.TaskService; import org.flowable.engine.TaskService;
import org.flowable.task.api.Task; import org.flowable.task.api.Task;
...@@ -15,6 +18,7 @@ import org.flowable.task.api.history.HistoricTaskInstanceQuery; ...@@ -15,6 +18,7 @@ import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Service @Service
...@@ -27,9 +31,9 @@ public class FlowTaskServiceImpl implements FlowTaskService { ...@@ -27,9 +31,9 @@ public class FlowTaskServiceImpl implements FlowTaskService {
private HistoryService historyService; private HistoryService historyService;
@Override @Override
public void pageTodo(FlowTaskQuery flowTaskQuery) { public Page<FlowTaskVo> pageTodo(FlowTaskQuery flowTaskQuery) {
TaskQuery taskQuery = taskService.createTaskQuery(); TaskQuery taskQuery = taskService.createTaskQuery();
taskQuery.taskCandidateOrAssigned(flowTaskQuery.getUserId()).taskCandidateGroupIn(flowTaskQuery.getGroupIds()); taskQuery.taskCandidateOrAssigned(SecurityUtil.getUserId()).taskCandidateGroupIn(SecurityUtil.getUserRoleIds());
if(StrUtil.isNotBlank(flowTaskQuery.getBusinessKey())){ if(StrUtil.isNotBlank(flowTaskQuery.getBusinessKey())){
taskQuery.processInstanceBusinessKey(flowTaskQuery.getBusinessKey()); taskQuery.processInstanceBusinessKey(flowTaskQuery.getBusinessKey());
} }
...@@ -43,41 +47,49 @@ public class FlowTaskServiceImpl implements FlowTaskService { ...@@ -43,41 +47,49 @@ public class FlowTaskServiceImpl implements FlowTaskService {
.orderByTaskPriority().desc() .orderByTaskPriority().desc()
.orderByTaskCreateTime().desc() .orderByTaskCreateTime().desc()
.listPage((flowTaskQuery.getPageNum() - 1) * flowTaskQuery.getPageSize(), flowTaskQuery.getPageSize()); .listPage((flowTaskQuery.getPageNum() - 1) * flowTaskQuery.getPageSize(), flowTaskQuery.getPageSize());
List<FlowTaskVo> list = new ArrayList<>();
taskList.stream().forEach(task -> { taskList.stream().forEach(task -> {
System.out.println(task); FlowTaskVo flowTaskVo = new FlowTaskVo();
System.out.println(task.getProcessVariables()); BeanUtil.copyProperties(task, flowTaskVo, "variables");
System.out.println("-----------------"); //放入流程参数
flowTaskVo.setVariables(task.getProcessVariables());
list.add(flowTaskVo);
}); });
long count = taskQuery.count(); long count = taskQuery.count();
Page<Task> page = new Page<>(flowTaskQuery.getPageNum(), flowTaskQuery.getPageSize()); Page<FlowTaskVo> page = new Page<>(flowTaskQuery.getPageNum(), flowTaskQuery.getPageSize());
page.setRecords(taskList); page.setRecords(list);
page.setTotal(count); page.setTotal(count);
return page;
} }
@Override @Override
public void pageDone(FlowTaskQuery flowTaskQuery) { public Page<FlowHistTaskVo> pageDone(FlowTaskQuery flowTaskQuery) {
HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery(); HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery();
historicTaskInstanceQuery.taskAssignee(flowTaskQuery.getUserId()); historicTaskInstanceQuery.taskAssignee(SecurityUtil.getUserId());
if (StringUtils.isNotBlank(flowTaskQuery.getBusinessKey())) { if (StrUtil.isNotBlank(flowTaskQuery.getBusinessKey())) {
historicTaskInstanceQuery.processInstanceBusinessKey(flowTaskQuery.getBusinessKey()); historicTaskInstanceQuery.processInstanceBusinessKey(flowTaskQuery.getBusinessKey());
} }
if (StringUtils.isNotBlank(flowTaskQuery.getBusinessName())) { if (StrUtil.isNotBlank(flowTaskQuery.getBusinessName())) {
historicTaskInstanceQuery.processVariableValueEquals(VariablesEnum.businessType.toString(), flowTaskQuery.getBusinessName()); historicTaskInstanceQuery.processVariableValueEquals(VariablesEnum.businessType.toString(), flowTaskQuery.getBusinessName());
} }
if (StringUtils.isNotBlank(flowTaskQuery.getBusinessType())) { if (StrUtil.isNotBlank(flowTaskQuery.getBusinessType())) {
historicTaskInstanceQuery.processVariableValueLike(VariablesEnum.businessName.toString(), flowTaskQuery.getBusinessType()); historicTaskInstanceQuery.processVariableValueLike(VariablesEnum.businessName.toString(), flowTaskQuery.getBusinessType());
} }
List<HistoricTaskInstance> historicTaskInstanceList = historicTaskInstanceQuery.finished() List<HistoricTaskInstance> historicTaskInstanceList = historicTaskInstanceQuery.finished()
.includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc() .includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc()
.listPage((flowTaskQuery.getPageNum() - 1) * flowTaskQuery.getPageSize(), flowTaskQuery.getPageSize()); .listPage((flowTaskQuery.getPageNum() - 1) * flowTaskQuery.getPageSize(), flowTaskQuery.getPageSize());
List<FlowHistTaskVo> list = new ArrayList<>();
historicTaskInstanceList.stream().forEach(task -> { historicTaskInstanceList.stream().forEach(task -> {
System.out.println(task); FlowHistTaskVo flowHistTaskVo = new FlowHistTaskVo();
System.out.println(task.getProcessVariables()); BeanUtil.copyProperties(task, flowHistTaskVo, "variables");
System.out.println("-----------------"); //放入流程参数
flowHistTaskVo.setVariables(task.getProcessVariables());
list.add(flowHistTaskVo);
}); });
long count = historicTaskInstanceQuery.count(); long count = historicTaskInstanceQuery.count();
Page<HistoricTaskInstance> page = new Page<>(flowTaskQuery.getPageNum(), flowTaskQuery.getPageSize()); Page<FlowHistTaskVo> page = new Page<>(flowTaskQuery.getPageNum(), flowTaskQuery.getPageSize());
page.setRecords(historicTaskInstanceList); page.setRecords(list);
page.setTotal(count); page.setTotal(count);
return page;
} }
} }
package cn.datax.service.workflow.utils;
import cn.datax.service.workflow.utils.functional.BeanCopyUtilCallBack;
import cn.hutool.core.bean.BeanUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
/**
* BeanUtil 扩展
*/
public class BeanCopyUtil extends BeanUtil {
/**
* 集合数据的拷贝
* @param sources: 数据源类
* @param target: 目标类::new(eg: UserVO::new)
* @return
*/
public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target) {
return copyListProperties(sources, target, null, null);
}
/**
* 集合数据的拷贝
* @param sources: 数据源类
* @param target: 目标类::new(eg: UserVO::new)
* @param ignoreProperties 忽略属性
* @return
*/
public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target, String... ignoreProperties) {
return copyListProperties(sources, target, null, ignoreProperties);
}
/**
* 带回调函数的集合数据的拷贝(可自定义字段拷贝规则)
* @param sources: 数据源类
* @param target: 目标类::new(eg: UserVO::new)
* @param callBack: 回调函数 属性字段要借助回调函数拷贝
* @param ignoreProperties 忽略属性
* @return
*/
public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target, BeanCopyUtilCallBack<S, T> callBack, String... ignoreProperties) {
List<T> list = new ArrayList<>(sources.size());
for (S source : sources) {
T t = target.get();
copyProperties(source, t, ignoreProperties);
list.add(t);
if (callBack != null) {
// 回调
callBack.callBack(source, t);
}
}
return list;
}
}
package cn.datax.service.workflow.utils.functional;
/**
* 拷贝函数
* @param <S>
* @param <T>
*/
@FunctionalInterface
public interface BeanCopyUtilCallBack<S, T> {
/**
* 定义默认回调方法
* @param t
* @param s
*/
void callBack(S t, T s);
}
...@@ -28,3 +28,12 @@ export function suspendInstance(processInstanceId) { ...@@ -28,3 +28,12 @@ export function suspendInstance(processInstanceId) {
method: 'put' method: 'put'
}) })
} }
export function flowTrack(processInstanceId) {
return request({
url: '/workflow/instances/track',
method: 'get',
responseType: 'blob',
params: { processInstanceId: processInstanceId }
})
}
...@@ -145,12 +145,14 @@ ...@@ -145,12 +145,14 @@
@click="handleResource(scope.row)" @click="handleResource(scope.row)"
>流程图</el-button> >流程图</el-button>
<el-button <el-button
v-if="scope.row.suspensionState === 2"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-view" icon="el-icon-view"
@click="handleActivate(scope.row)" @click="handleActivate(scope.row)"
>激活</el-button> >激活</el-button>
<el-button <el-button
v-if="scope.row.suspensionState === 1"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-view" icon="el-icon-view"
...@@ -208,7 +210,7 @@ ...@@ -208,7 +210,7 @@
</div> </div>
</el-dialog> </el-dialog>
<!-- 流程图对话框 --> <!-- 流程图对话框 -->
<el-dialog :title="dialog.title" :visible.sync="dialog.resource" width="400px" append-to-body> <el-dialog :title="dialog.title" :visible.sync="dialog.resource" width="600px" append-to-body>
<el-image :src="flowSrc"> <el-image :src="flowSrc">
<div slot="error" class="image-slot"> <div slot="error" class="image-slot">
<i class="el-icon-picture-outline"></i> <i class="el-icon-picture-outline"></i>
...@@ -244,16 +246,15 @@ export default { ...@@ -244,16 +246,15 @@ export default {
multiple: true, multiple: true,
// 表格头 // 表格头
tableColumns: [ tableColumns: [
{ prop: 'gbTypeCode', label: '标准类别编码', show: true }, { prop: 'id', label: '流程定义ID', show: true },
{ prop: 'gbTypeName', label: '标准类别名称', show: true }, { prop: 'description', label: '流程名称', show: true },
{ prop: 'gbCode', label: '标准编码', show: true }, { prop: 'version', label: '版本', show: true },
{ prop: 'gbName', label: '标准名称', show: true },
{ {
prop: 'status', prop: 'suspensionState',
label: '状态', label: '状态',
show: true show: true,
}, formatter: this.statusFormatter
{ prop: 'createTime', label: '创建时间', show: true } }
], ],
// 默认选择中表格头 // 默认选择中表格头
checkedTableColumns: [], checkedTableColumns: [],
...@@ -293,7 +294,7 @@ export default { ...@@ -293,7 +294,7 @@ export default {
dialogDefinitionForm: {}, dialogDefinitionForm: {},
dialogDefinitionRules: { dialogDefinitionRules: {
name: [ name: [
{ required: true, message: '分类名称不能为空', trigger: 'blur' } { required: true, message: '模板名称不能为空', trigger: 'blur' }
] ]
}, },
flowSrc: '' flowSrc: ''
...@@ -420,7 +421,7 @@ export default { ...@@ -420,7 +421,7 @@ export default {
if (response.success) { if (response.success) {
this.$message.success('部署成功') this.$message.success('部署成功')
this.dialog.definition = false this.dialog.definition = false
this.getTree() this.getList()
} else { } else {
this.$message.error('部署失败') this.$message.error('部署失败')
} }
...@@ -485,6 +486,7 @@ export default { ...@@ -485,6 +486,7 @@ export default {
flowResource(row.id).then(response => { flowResource(row.id).then(response => {
const blob = new Blob([response]) const blob = new Blob([response])
this.flowSrc = window.URL.createObjectURL(blob) this.flowSrc = window.URL.createObjectURL(blob)
this.dialog.title = '流程部署资源'
this.dialog.resource = true this.dialog.resource = true
}) })
}, },
...@@ -543,6 +545,13 @@ export default { ...@@ -543,6 +545,13 @@ export default {
console.log(`当前页: ${val}`) console.log(`当前页: ${val}`)
this.queryParams.pageNum = val this.queryParams.pageNum = val
this.getList() this.getList()
},
statusFormatter(row, column, cellValue, index) {
if (cellValue === 1) {
return <el-tag type='success'>激活</el-tag>
} else if (cellValue === 2) {
return <el-tag type='warning'>挂起</el-tag>
}
} }
} }
} }
......
...@@ -52,9 +52,17 @@ ...@@ -52,9 +52,17 @@
size="mini" size="mini"
type="text" type="text"
icon="el-icon-view" icon="el-icon-view"
@click="handleTrack(scope.row)"
>流程追踪</el-button>
<el-button
v-if="scope.row.suspensionState === 2"
size="mini"
type="text"
icon="el-icon-view"
@click="handleActivate(scope.row)" @click="handleActivate(scope.row)"
>激活</el-button> >激活</el-button>
<el-button <el-button
v-if="scope.row.suspensionState === 1"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-view" icon="el-icon-view"
...@@ -81,11 +89,22 @@ ...@@ -81,11 +89,22 @@
@size-change="handleSizeChange" @size-change="handleSizeChange"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
/> />
<!-- 流程图对话框 -->
<el-dialog :title="dialog.title" :visible.sync="dialog.track" width="600px" 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.track = false">取 消</el-button>
</div>
</el-dialog>
</el-card> </el-card>
</template> </template>
<script> <script>
import { pageInstance, delInstance, activateInstance, suspendInstance } from '@/api/workflow/instance' import { pageInstance, delInstance, activateInstance, suspendInstance, flowTrack } from '@/api/workflow/instance'
export default { export default {
name: 'InstanceList', name: 'InstanceList',
...@@ -124,7 +143,14 @@ export default { ...@@ -124,7 +143,14 @@ export default {
pageNum: 1, pageNum: 1,
pageSize: 20, pageSize: 20,
name: '' name: ''
} },
dialog: {
// 是否显示弹出层
track: false,
// 弹出层标题
title: ''
},
flowSrc: ''
} }
}, },
created() { created() {
...@@ -163,6 +189,14 @@ export default { ...@@ -163,6 +189,14 @@ export default {
this.single = selection.length !== 1 this.single = selection.length !== 1
this.multiple = !selection.length this.multiple = !selection.length
}, },
handleTrack(row) {
flowTrack(row.id).then(response => {
const blob = new Blob([response])
this.flowSrc = window.URL.createObjectURL(blob)
this.dialog.title = '流程追踪'
this.dialog.track = true
})
},
handleActivate(row) { handleActivate(row) {
this.$confirm('激活流程实例?', '提示', { this.$confirm('激活流程实例?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
......
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