Compare commits

...

No commits in common. 'main' and 'master' have entirely different histories.
main ... master

@ -1,2 +0,0 @@
# MinSu

@ -1,38 +0,0 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

@ -1,10 +0,0 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# 依赖于环境的 Maven 主目录路径
/mavenHomeManager.xml
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

@ -1,6 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/huacai-homestay.iml" filepath="$PROJECT_DIR$/.idea/huacai-homestay.iml" />
</modules>
</component>
</project>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/MinSu" vcs="Git" />
</component>
</project>

File diff suppressed because one or more lines are too long

@ -1,12 +0,0 @@
@echo off
echo.
echo [信息] 清理工程target生成路径。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean
pause

@ -1,12 +0,0 @@
@echo off
echo.
echo [信息] 打包Web工程生成war/jar包文件。
echo.
%~d0
cd %~dp0
cd ..
call mvn clean package -Dmaven.test.skip=true
pause

@ -1,14 +0,0 @@
@echo off
echo.
echo [信息] 使用Jar命令运行Web工程。
echo.
cd %~dp0
cd ../ruoyi-admin/target
set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
java -jar %JAVA_OPTS% ruoyi-admin.jar
cd bin
pause

@ -1,70 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>huacai</artifactId>
<groupId>com.huacai</groupId>
<version>3.8.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>huacai-activiti</artifactId>
<description>
流程模块
</description>
<dependencies>
<!-- 通用工具-->
<dependency>
<groupId>com.huacai</groupId>
<artifactId>huacai-common</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- activiti图片生成 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-image-generator</artifactId>
<version>7.1.0.M6</version>
</dependency>
<dependency>
<groupId>com.huacai</groupId>
<artifactId>huacai-framework</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

@ -1,381 +0,0 @@
package com.huacai.activiti.controller;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import com.huacai.activiti.domain.DefineProcessVo;
import com.huacai.activiti.domain.DefineVo;
import com.huacai.activiti.exception.CustomException;
import com.huacai.activiti.mapper.MyProcessMapper;
import com.huacai.activiti.util.ProcessImageManager;
import com.huacai.activiti.vo.ActivitiVo;
import com.huacai.activiti.vo.ProcessHighlightEntity;
import com.huacai.common.annotation.Log;
import com.huacai.common.constant.ActivitiConstants;
import com.huacai.common.core.controller.BaseController;
import com.huacai.common.core.domain.AjaxResult;
import com.huacai.common.core.domain.entity.SysUser;
import com.huacai.common.core.page.TableDataInfo;
import com.huacai.common.enums.BusinessType;
import com.huacai.system.service.ISysUserService;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.ProcessInstanceHistoryLog;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.List;
/**
* ()
* :2020/10/22-15:16
*
* 1.0 Danny 2020/10/22
*/
@RestController
@RequestMapping("/processDefinition")
public class ProcessDefinitionController extends BaseController {
@Autowired
private RepositoryService repositoryService;
@Resource
private MyProcessMapper myProcessMapper;
@Autowired
private HistoryService historyService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private ISysUserService userService;
/**
*
*
* @param
* @return
*/
@GetMapping(value = "/list")
public TableDataInfo list(DefineVo defineVo) {
startPage();
List<DefineVo> defineVos = myProcessMapper.listData(defineVo);
return getDataTable(defineVos);
}
/**
* stringBPMN
*
* @param processVo
* @return
*/
@PostMapping(value = "/myAddDeploymentByString")
public AjaxResult myAddDeploymentByString(@RequestBody DefineProcessVo processVo, HttpServletRequest request) {
String stringBPMN = processVo.getStringBPMN();
//类型
String type = processVo.getType();
Deployment deploy = repositoryService.createDeployment()
.addString("CreateWithBPMNJS.bpmn", stringBPMN)
.category(type)
.deploy();
return AjaxResult.success();
}
/**
* XML
*
* @param response
* @param deploymentId
* @param resourceName
*/
@GetMapping(value = "/getDefinitionXML")
public void getProcessDefineXML(HttpServletResponse response,
@RequestParam("deploymentId") String deploymentId,
@RequestParam("resourceName") String resourceName) throws IOException {
InputStream inputStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
int count = inputStream.available();
byte[] bytes = new byte[count];
response.setContentType("text/xml");
OutputStream outputStream = response.getOutputStream();
while (inputStream.read(bytes) != -1) {
outputStream.write(bytes);
}
inputStream.close();
}
/**
*
*
* @param deploymentId
* @return
*/
@Log(title = "流程定义管理", businessType = BusinessType.DELETE)
@DeleteMapping(value = "/remove/{deploymentId}/{category}")
public AjaxResult delDefinition(@PathVariable("deploymentId") String deploymentId,
@PathVariable("category") Integer category) {
Deployment deployment = repositoryService.createDeploymentQuery()
.deploymentId(deploymentId).singleResult();
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantId(deployment.getTenantId())
.processDefinitionCategory(String.valueOf(category)).list();
//删除流程定义
repositoryService.deleteDeployment(deploymentId, true);
return AjaxResult.success();
}
@Autowired
ProcessImageManager processImageManager;
@RequestMapping(value = "/findPicture", method = RequestMethod.GET)
public void findPicture(@RequestParam(value = "processInstanceId") String processInstanceId,
HttpServletResponse response) throws Exception {
InputStream imageStream = processImageManager.getFlowImgByProcInstId(processInstanceId);
try {
// 输出资源内容到相应对象
byte[] b = new byte[1024];
int len;
while ((len = imageStream.read(b, 0, 1024)) != -1) {
response.getOutputStream().write(b, 0, len);
}
response.getOutputStream().flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (imageStream != null) {
try {
imageStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public BpmnModel getBpmnModel(String procDefId) throws CustomException {
try {
return repositoryService.getBpmnModel(procDefId);
} catch (ActivitiObjectNotFoundException e) {
throw new CustomException("流程定义数据不存在");
}
}
public ProcessDefinition getProcessDefinition(String procDefId, String instanceId) throws CustomException {
if (StrUtil.isBlank(procDefId)) {
if (StrUtil.isBlank(instanceId)) {
throw new CustomException("流程实例id流程定义id 两者不能都为空");
}
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(instanceId)
.singleResult();
if (processInstance == null) {
HistoricProcessInstance histProcInst = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(instanceId)
.singleResult();
if (histProcInst == null) {
throw new CustomException("查询失败,请检查传入的 instanceId 是否正确");
}
procDefId = histProcInst.getProcessDefinitionId();
} else {
procDefId = processInstance.getProcessDefinitionId();
}
}
try {
return repositoryService.getProcessDefinition(procDefId);
} catch (ActivitiObjectNotFoundException e) {
throw new CustomException("该流程属于之前流程,已删除");
}
}
@RequestMapping(method = RequestMethod.GET,value = "/getHighLightedNodeVoByProcessInstanceId")
public AjaxResult getActivitiProcessHighlight(String instanceId, String procDefId) throws CustomException {
ProcessDefinition processDefinition = getProcessDefinition(procDefId, instanceId);
procDefId = processDefinition.getId();
BpmnModel bpmnModel = getBpmnModel(procDefId);
List<HistoricActivityInstance> histActInstances = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(instanceId).orderByHistoricActivityInstanceId().asc().list();
ProcessHighlightEntity highlightEntity = getHighLightedData(bpmnModel.getMainProcess(), histActInstances);
highlightEntity.setModelName(processDefinition.getName());
// Map缓存提高获取流程文件速度
if (ActivitiConstants.BPMN_XML_MAP.containsKey(procDefId)) {
highlightEntity.setModelXml(ActivitiConstants.BPMN_XML_MAP.get(procDefId));
} else {
InputStream bpmnStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName());
try (Reader reader = new InputStreamReader(bpmnStream, StandardCharsets.UTF_8)) {
String xmlString = IoUtil.read(reader);
highlightEntity.setModelXml(xmlString);
ActivitiConstants.BPMN_XML_MAP.put(procDefId, xmlString);
} catch (IOException e) {
System.err.println("[获取流程数据] 失败."+ e.getMessage());
// throw new CustomException("获取流程数据失败,请稍后重试");
return error("获取流程数据失败,请稍后重试");
}
}
return success(highlightEntity);
}
private ProcessHighlightEntity getHighLightedData(Process process,
List<HistoricActivityInstance> historicActInstances) {
ProcessHighlightEntity entity = new ProcessHighlightEntity();
// 已执行的节点id
Set<String> executedActivityIds = new HashSet<>();
// 正在执行的节点id
Set<String> activeActivityIds = new HashSet<>();
// 高亮流程已发生流转的线id集合
Set<String> highLightedFlowIds = new HashSet<>();
// 全部活动节点
List<FlowNode> historicActivityNodes = new ArrayList<>();
// 已完成的历史活动节点
List<HistoricActivityInstance> finishedActivityInstances = new ArrayList<>();
for (HistoricActivityInstance historicActivityInstance : historicActInstances) {
FlowNode flowNode = (FlowNode) process.getFlowElement(historicActivityInstance.getActivityId(), true);
historicActivityNodes.add(flowNode);
if (historicActivityInstance.getEndTime() != null) {
finishedActivityInstances.add(historicActivityInstance);
executedActivityIds.add(historicActivityInstance.getActivityId());
} else {
activeActivityIds.add(historicActivityInstance.getActivityId());
}
}
FlowNode currentFlowNode = null;
FlowNode targetFlowNode = null;
// 遍历已完成的活动实例从每个实例的outgoingFlows中找到已执行的
for (HistoricActivityInstance currentActivityInstance : finishedActivityInstances) {
// 获得当前活动对应的节点信息及outgoingFlows信息
currentFlowNode = (FlowNode) process.getFlowElement(currentActivityInstance.getActivityId(), true);
List<SequenceFlow> sequenceFlows = currentFlowNode.getOutgoingFlows();
/**
* outgoingFlows
* 1.outgoingFlows
* 2.outgoingFlows
*/
if ("parallelGateway".equals(currentActivityInstance.getActivityType()) || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) {
// 遍历历史活动节点,找到匹配流程目标节点的
for (SequenceFlow sequenceFlow : sequenceFlows) {
targetFlowNode = (FlowNode) process.getFlowElement(sequenceFlow.getTargetRef(), true);
if (historicActivityNodes.contains(targetFlowNode)) {
highLightedFlowIds.add(sequenceFlow.getId());
}
}
} else {
List<Map<String, Object>> tempMapList = new ArrayList<>();
for (SequenceFlow sequenceFlow : sequenceFlows) {
for (HistoricActivityInstance historicActivityInstance : historicActInstances) {
if (historicActivityInstance.getActivityId().equals(sequenceFlow.getTargetRef())) {
Map<String, Object> map = new HashMap<>();
map.put("highLightedFlowId", sequenceFlow.getId());
map.put("highLightedFlowStartTime", historicActivityInstance.getStartTime().getTime());
tempMapList.add(map);
}
}
}
if (!CollectionUtils.isEmpty(tempMapList)) {
// 遍历匹配的集合,取得开始时间最早的一个
long earliestStamp = 0L;
String highLightedFlowId = null;
for (Map<String, Object> map : tempMapList) {
long highLightedFlowStartTime = Long.parseLong(map.get("highLightedFlowStartTime").toString());
if (earliestStamp == 0 || earliestStamp >= highLightedFlowStartTime) {
highLightedFlowId = map.get("highLightedFlowId").toString();
earliestStamp = highLightedFlowStartTime;
}
}
highLightedFlowIds.add(highLightedFlowId);
}
}
}
entity.setActiveActivityIds(activeActivityIds);
entity.setExecutedActivityIds(executedActivityIds);
entity.setHighlightedFlowIds(highLightedFlowIds);
return entity;
}
@RequestMapping(value = "/getOneActivityVoByProcessInstanceIdAndActivityId", method = RequestMethod.GET)
public AjaxResult selectHistory(@RequestParam("procInstId") String processInstanceId,
@RequestParam("elementId") String elementId) {
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
SysUser user = null;
HistoricActivityInstance historicActivityInstances = null;
if (historicProcessInstance != null) {
// 获取当前活动的ActivityId
// String currentActivityId = historyService.createHistoricActivityInstanceQuery()
// .processInstanceId(processInstanceId)
// .activityType("userTask") // 可以指定活动类型,例如用户任务
// .unfinished() // 查询当前正在执行的活动
// .singleResult()
// .getActivityId();
System.out.println("当前活动的ActivityId: " + elementId);
// 查询所有历史活动实例
historicActivityInstances = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.activityId(elementId)
.singleResult();
if(historicActivityInstances.getAssignee()!=null){
user = userService.selectUserById(Long.parseLong(historicActivityInstances.getAssignee()));
}
ProcessInstanceHistoryLog pi = historyService.createProcessInstanceHistoryLogQuery(processInstanceId).singleResult();
} else {
System.out.println("流程实例未找到或已结束");
}
ActivitiVo activitiVo = new ActivitiVo();
if(user!=null){ //当前节点没审批人
activitiVo.setActivityName(historicActivityInstances.getActivityName());
activitiVo.setApprover(user.getUserName());
activitiVo.setEndTime(historicActivityInstances.getEndTime().toString());
}
return success(activitiVo);
}
@RequestMapping(value = "/findNodeInfo", method = RequestMethod.GET)
public AjaxResult findNodeInfo(@RequestParam(value = "processInstanceId") String processInstanceId,@RequestParam(value = "activityId") String activityId) throws Exception {
return AjaxResult.success(processImageManager.getActivityInfo(activityId,processInstanceId));
}
}

@ -1,175 +0,0 @@
package com.huacai.activiti.controller;
import cn.hutool.json.JSONArray;
import com.huacai.activiti.service.MyTaskService;
import com.huacai.activiti.util.ActivitiUtil;
import com.huacai.activiti.vo.ApplyVo;
import com.huacai.activiti.vo.HistoryVo;
import com.huacai.activiti.vo.MyTaskVo;
import com.huacai.common.core.controller.BaseController;
import com.huacai.common.core.domain.AjaxResult;
import com.huacai.common.core.page.TableDataInfo;
import org.activiti.api.task.runtime.TaskRuntime;
import org.activiti.engine.TaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/task")
public class TaskController extends BaseController {
@Autowired
private MyTaskService myTaskService;
@Autowired
private TaskService taskService;
@Autowired
private TaskRuntime taskRuntime;
@Autowired
private ActivitiUtil activitiUtil;
/**
*
*
* @param businessKey
* @param businessType
* @return
*/
@RequestMapping(value = "/startTask", method = RequestMethod.GET)
public AjaxResult startTask(@RequestParam("businessKey") String businessKey, @RequestParam("businessType") Integer businessType) {
int i = myTaskService.startTask(businessKey, businessType);
return toAjax(i);
}
/**
*
*
* @param processInstanceId id
* @return
*/
@RequestMapping(value = "/revokeProcess", method = RequestMethod.GET)
public AjaxResult revokeProcess(@RequestParam("processInstanceId") String processInstanceId, @RequestParam("businessKey") String businessKey, @RequestParam("businessType") Integer businessType) {
int i = myTaskService.revokeProcess(processInstanceId, businessKey, businessType);
return toAjax(i);
}
/**
*
*
* @param myTaskVo
* @return
*/
@RequestMapping(value = "/selectMyTask", method = RequestMethod.GET)
public TableDataInfo selectMyTask(MyTaskVo myTaskVo) {
myTaskVo.setAssignee(String.valueOf(getUserId()));
startPage();
List<MyTaskVo> myTaskVos = myTaskService.selectMyTask(myTaskVo);
return getDataTable(myTaskVos);
}
/**
*
*
* @param myTaskVo
* @return
*/
@RequestMapping(value = "/selectGroupTask", method = RequestMethod.GET)
public TableDataInfo selectGroupTask(MyTaskVo myTaskVo) {
myTaskVo.setAssignee(String.valueOf(getUserId()));
startPage();
List<MyTaskVo> myTaskVos = myTaskService.selectGroupTask(myTaskVo);
return getDataTable(myTaskVos);
}
/**
*
*
* @param applyVo
* @return
*/
@RequestMapping(value = "/passTask", method = RequestMethod.POST)
public AjaxResult passTask(@RequestBody ApplyVo applyVo) {
int i = myTaskService.passTask(applyVo);
return AjaxResult.success(i);
}
/**
* 退
*
* @param applyVo
* @return
*/
@RequestMapping(value = "/fallBackTask", method = RequestMethod.POST)
public AjaxResult fallBackTask(@RequestBody ApplyVo applyVo) {
int i = myTaskService.fallBackTask(applyVo);
return toAjax(i);
}
/**
*
*
* @param taskId
* @return
*/
@RequestMapping(value = "/claimTask", method = RequestMethod.GET)
public AjaxResult claimTask(@RequestParam("taskId") String taskId) {
taskService.claim(taskId, getUserId() + "");
return AjaxResult.success();
}
/**
*
*
* @param taskId
* @return
*/
@RequestMapping(value = "/unClaimTask", method = RequestMethod.GET)
public AjaxResult unClaimTask(@RequestParam("taskId") String taskId) {
taskService.unclaim(taskId);
return AjaxResult.success();
}
/**
*
*
* @param processInstanceId
* @return
*/
@RequestMapping(value = "/selectHistory", method = RequestMethod.GET)
public AjaxResult selectHistory(@RequestParam("processInstanceId") String processInstanceId) {
List<HistoryVo> historyVos = myTaskService.selectHistory(processInstanceId);
return AjaxResult.success(historyVos);
}
/**
* 退
*
* @param
* @return
*/
@RequestMapping(value = "/selectBefore", method = RequestMethod.GET)
public AjaxResult selectBefore(ApplyVo applyVo) {
JSONArray result = myTaskService.selectBefore(applyVo);
return AjaxResult.success(result);
}
/**
* 退
*
* @param
* @return
*/
@RequestMapping(value = "/fallBackTaskByTaskDefinitionKey", method = RequestMethod.GET)
public AjaxResult fallBackTaskByTaskDefinitionKey(ApplyVo applyVo, String taskDefinitionKey) {
String result = myTaskService.fallBackTaskByTaskDefinitionKey(applyVo,taskDefinitionKey);
return AjaxResult.success(result);
}
}

@ -1,48 +0,0 @@
package com.huacai.activiti.controller;
import com.huacai.activiti.domain.RoleVo;
import com.huacai.activiti.domain.UserVo;
import com.huacai.activiti.mapper.UserMapper;
import com.huacai.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
*
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
/**
*
*
* @return
*/
@RequestMapping(value = "/listUsersToWorkflow", method = RequestMethod.GET)
public AjaxResult listUsersToWorkflow() {
List<UserVo> userVos = userMapper.listUsersToWorkflow();
return AjaxResult.success(userVos);
}
/**
*
*
* @return
*/
@RequestMapping(value = "/queryAllSysRole", method = RequestMethod.GET)
public AjaxResult queryAllSysRole() {
List<RoleVo> roleVos = userMapper.queryAllSysRole();
return AjaxResult.success(roleVos);
}
}

@ -1,15 +0,0 @@
package com.huacai.activiti.domain;
import lombok.Data;
import java.io.Serializable;
/**
* vo
*/
@Data
public class DefineProcessVo implements Serializable {
private String type;
private String stringBPMN;
}

@ -1,22 +0,0 @@
package com.huacai.activiti.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class DefineVo implements Serializable {
private String deploymentId;
private String processDefinitionId;
private String processDefinitionName;
private String processDefinitionKey;
private String processDefinitionVersion;
private String processDefinitionType;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date deployTime;
private String resourceName;
}

@ -1,14 +0,0 @@
package com.huacai.activiti.domain;
import lombok.Data;
import java.io.Serializable;
/**
*
*/
@Data
public class RoleVo implements Serializable {
private String roleName;
private String roleKey;
}

@ -1,15 +0,0 @@
package com.huacai.activiti.domain;
import lombok.Data;
import java.io.Serializable;
/**
*
*/
@Data
public class UserVo implements Serializable {
private String userId;
private String nickName;
private String deptName;
}

@ -1,24 +0,0 @@
package com.huacai.activiti.exception;
import lombok.Data;
import org.activiti.bpmn.model.BpmnModel;
/**
* @projectName: haucai-activiti-kjglxt
* @package: com.huacai.activiti.exception
* @className: CustomException
* @author:
* @description: TODO
* @date: 2024/6/23 20:49
* @version: 1.0
*/
@Data
public class CustomException extends Throwable {
String errMsg;
BpmnModel model;
public CustomException(String errMsg) {
this.errMsg = errMsg;
}
}

@ -1,39 +0,0 @@
package com.huacai.activiti.mapper;
import com.huacai.activiti.domain.DefineVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface MyProcessMapper {
/**
*
* @param defineVo
* @return
*/
List<DefineVo> listData(DefineVo defineVo);
/**
* key
* @param processType
* @return
*/
String selectLastVersionProcessDefineKey(Integer processType);
/**
*
*
* @param id
*/
void deleteHisTaskById(@Param("id") String id);
/**
*
*
* @param processInstanceId
* @param taskDefKey
*/
void deleteHisTask(@Param("processInstanceId") String processInstanceId,
@Param("taskDefKey") String taskDefKey);
}

@ -1,30 +0,0 @@
package com.huacai.activiti.mapper;
import com.huacai.activiti.vo.HistoryVo;
import com.huacai.activiti.vo.MyTaskVo;
import java.util.List;
public interface MyTaskMapper {
/**
*
* @param myTaskVo
* @return
*/
List<MyTaskVo> selectMyTask(MyTaskVo myTaskVo);
/**
*
* @param myTaskVo
* @return
*/
List<MyTaskVo> selectGroupTask(MyTaskVo myTaskVo);
/**
*
* @param processInstanceId
* @return
*/
List<HistoryVo> selectHistory(String processInstanceId);
}

@ -1,21 +0,0 @@
package com.huacai.activiti.mapper;
import com.huacai.activiti.domain.RoleVo;
import com.huacai.activiti.domain.UserVo;
import java.util.List;
public interface UserMapper {
/**
*
* @return
*/
List<UserVo> listUsersToWorkflow();
/**
*
* @return
*/
List<RoleVo> queryAllSysRole();
}

@ -1,69 +0,0 @@
package com.huacai.activiti.service;
import cn.hutool.json.JSONArray;
import com.huacai.activiti.vo.ApplyVo;
import com.huacai.activiti.vo.HistoryVo;
import com.huacai.activiti.vo.MyTaskVo;
import java.util.List;
public interface MyTaskService {
/**
*
*
* @param businessKey
* @param businessType
* @return
*/
int startTask(String businessKey, Integer businessType);
/**
*
*
* @param processInstanceId
* @return
*/
int revokeProcess(String processInstanceId, String businessKey, Integer businessType);
/**
*
*
* @param myTaskVo
* @return
*/
List<MyTaskVo> selectMyTask(MyTaskVo myTaskVo);
/**
*
*
* @param applyVo
* @return
*/
int passTask(ApplyVo applyVo);
/**
* 退
*/
int fallBackTask(ApplyVo applyVo);
/**
*
* @param myTaskVo
* @return
*/
List<MyTaskVo> selectGroupTask(MyTaskVo myTaskVo);
/**
*
* @param processInstanceId
* @return
*/
List<HistoryVo> selectHistory(String processInstanceId);
JSONArray selectBefore(ApplyVo applyVo);
String fallBackTaskByTaskDefinitionKey(ApplyVo applyVo, String taskDefinitionKey);
}

@ -1,306 +0,0 @@
package com.huacai.activiti.service.impl;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.huacai.activiti.mapper.MyProcessMapper;
import com.huacai.activiti.mapper.MyTaskMapper;
import com.huacai.activiti.service.MyTaskService;
import com.huacai.activiti.util.ActivitiUtil;
import com.huacai.activiti.vo.ApplyVo;
import com.huacai.activiti.vo.HistoryVo;
import com.huacai.activiti.vo.MyTaskVo;
import com.huacai.common.core.domain.model.LoginUser;
import com.huacai.common.utils.SecurityUtils;
import com.huacai.common.utils.StringUtils;
import com.huacai.common.utils.spring.SpringUtils;
import com.huacai.infoHiComment.domain.InfoHiComment;
import com.huacai.infoHiComment.mapper.InfoHiCommentMapper;
import com.huacai.infoRunTaskData.mapper.InfoRunTaskDataMapper;
import com.huacai.infoRunTaskData.service.IInfoRunTaskDataService;
import org.activiti.bpmn.model.*;
import org.activiti.bpmn.model.Process;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.*;
@Service
public class MyTaskServiceImpl implements MyTaskService {
@Resource
private RuntimeService runtimeService;
@Resource
private MyProcessMapper myProcessMapper;
@Resource
private IInfoRunTaskDataService infoRunTaskDataService;
@Resource
private MyTaskMapper myTaskMapper;
@Resource
private TaskService taskService;
@Resource
private ActivitiUtil activitiUtil;
@Resource
private RepositoryService repositoryService;
@Resource
private InfoHiCommentMapper infoHiCommentMapper;
@Resource
private InfoRunTaskDataMapper infoRunTaskDataMapper;
@Transactional
@Override
public int startTask(String businessKey, Integer businessType) {
//1.查询最新部署的一条流程
String processDefineKey = myProcessMapper.selectLastVersionProcessDefineKey(businessType);
if (StringUtils.isEmpty(processDefineKey)) {
throw new RuntimeException("未找到相应流程,请联系管理员");
}
// //获取runtimeService
// ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// RuntimeService runtimeService = processEngine.getRuntimeService();
//启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefineKey,processDefineKey);
Task currentTask = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).singleResult();
//taskService.setAssignee(currentTask.getId(), "1,2,100");
//获取候选人
String targetUserTaskId= currentTask.getId();
BpmnModel bpmnModel = repositoryService.getBpmnModel(currentTask.getProcessDefinitionId());
List<Process> processes = bpmnModel.getProcesses();
for (Process process : processes) {
List<UserTask> userTaskList = process.findFlowElementsOfType(UserTask.class);
for (UserTask userTask : userTaskList) {
//if(userTask.getId().equals(targetUserTaskId)){
userTask.getCandidateGroups();
List<String> candidateUsers = userTask.getCandidateUsers();
if (!CollectionUtils.isEmpty(candidateUsers)) {
// userTask.setAssignee("1");
}
/*String[] assingneeArray=complateDto.getUserIds().split(",");
variables.put("assigneeList", Arrays.asList(assingneeArray));*/
System.out.println("candidateUsers:"+candidateUsers+"; group:"+userTask.getCandidateGroups().toString());
//}
}
}
//修改业务数据 //修改成审核中
infoRunTaskDataService.updateStatus(businessKey, businessType, 2, processInstance.getProcessInstanceId());
//新增历史记录
InfoHiComment infoHiComment = new InfoHiComment();
infoHiComment.setCreateTime(new Date());
// 获取当前的用户
LoginUser loginUser = SecurityUtils.getLoginUser();
infoHiComment.setTaskName(loginUser.getUser().getNickName() + "-提交审批");
infoHiComment.setCreateName(SecurityUtils.getLoginUser().getUser().getNickName());
infoHiComment.setMessage("发起申请");
infoHiComment.setProcessInstanceId(processInstance.getProcessInstanceId());
infoHiCommentMapper.insertInfoHiComment(infoHiComment);
return 1;
}
@Transactional
@Override
public int revokeProcess(String processInstanceId, String businessKey, Integer businessType) {
runtimeService.deleteProcessInstance(processInstanceId, "主动撤销流程");
//修改业务状态 为未提交
infoRunTaskDataService.updateStatus(businessKey, businessType, 1);
return 1;
}
@Override
public List<MyTaskVo> selectMyTask(MyTaskVo myTaskVo) {
List<MyTaskVo> myTaskVos = myTaskMapper.selectMyTask(myTaskVo);
return myTaskVos;
}
@Transactional
@Override
public int passTask(ApplyVo applyVo) {
Map<String, Object> variables = new HashMap<>();
if (!Objects.isNull(applyVo.getParams())) {
variables.putAll(applyVo.getParams());
}
Task currentTask = taskService.createTaskQuery().taskId(applyVo.getTaskId()).singleResult();
taskService.addComment(applyVo.getTaskId(), applyVo.getProcessInstanceId(), applyVo.getComment());
taskService.complete(applyVo.getTaskId(), variables);
//查询这个任务是否还存在
List<Task> list = taskService.createTaskQuery().processInstanceId(applyVo.getProcessInstanceId()).list();
//新增历史记录
if (!list.isEmpty()) {
//新增历史记录
InfoHiComment infoHiComment = new InfoHiComment();
infoHiComment.setCreateTime(new Date());
infoHiComment.setCreateName(SecurityUtils.getLoginUser().getUser().getNickName());
infoHiComment.setMessage(applyVo.getComment());
infoHiComment.setTaskName(currentTask.getName());
infoHiComment.setProcessInstanceId(applyVo.getProcessInstanceId());
infoHiCommentMapper.insertInfoHiComment(infoHiComment);
} else {
//说明所有的任务已经完成 修改业务数据状态为完成 3审核通过
infoRunTaskDataService.updateStatus(applyVo.getBusinessKey(), applyVo.getBusinessType(), 3);
InfoHiComment infoHiComment = new InfoHiComment();
infoHiComment.setCreateTime(new Date());
infoHiComment.setCreateName(SecurityUtils.getLoginUser().getUser().getNickName());
infoHiComment.setMessage(applyVo.getComment());
infoHiComment.setTaskName("审批流程通过");
infoHiComment.setProcessInstanceId(applyVo.getProcessInstanceId());
infoHiCommentMapper.insertInfoHiComment(infoHiComment);
}
return 1;
}
@Transactional
@Override
public int fallBackTask(ApplyVo applyVo) {
taskService.addComment(applyVo.getTaskId(), applyVo.getProcessInstanceId(), applyVo.getComment());
// 获取当前任务信息
Task currentTask = taskService.createTaskQuery().taskId(applyVo.getTaskId()).singleResult();
if (Objects.isNull(currentTask)) {
throw new RuntimeException("当前任务不存在");
}
//判断是不是开始节点
boolean startEvent = activitiUtil.isStartEvent(currentTask);
if (startEvent) {
//说明已经退回到开始节点 修改业务数据状态为完成 4审核不通过
infoRunTaskDataService.updateStatus(applyVo.getBusinessKey(), applyVo.getBusinessType(), 4);
//删除流程
runtimeService.deleteProcessInstance(currentTask.getProcessInstanceId(), "退回到开始节点");
} else {
//退回任务
activitiUtil.backProcess(currentTask);
}
//新增历史记录
InfoHiComment infoHiComment = new InfoHiComment();
infoHiComment.setCreateTime(new Date());
infoHiComment.setCreateName(SecurityUtils.getLoginUser().getUser().getNickName());
infoHiComment.setMessage(applyVo.getComment());
infoHiComment.setProcessInstanceId(applyVo.getProcessInstanceId());
infoHiComment.setTaskName(currentTask.getName() + "-退回");
infoHiCommentMapper.insertInfoHiComment(infoHiComment);
return 1;
}
@Override
public List<MyTaskVo> selectGroupTask(MyTaskVo myTaskVo) {
return myTaskMapper.selectGroupTask(myTaskVo);
}
@Override
public List<HistoryVo> selectHistory(String processInstanceId) {
return myTaskMapper.selectHistory(processInstanceId);
}
@Override
public JSONArray selectBefore(ApplyVo applyVo) {
JSONArray beforeList = new JSONArray();
// 获取当前任务信息
Task currentTask = taskService.createTaskQuery().taskId(applyVo.getTaskId()).singleResult();
boolean startEvent = activitiUtil.isStartEvent(currentTask);
JSONObject startObj = new JSONObject();
startObj.putOnce("dkey", "0");
startObj.putOnce("taskName", "不予通过");
if (startEvent) {
beforeList.add(startObj);
return beforeList;
}
String processInstanceId = currentTask.getProcessInstanceId();
// 取得所有历史任务按时间降序排序
HistoryService historyService = SpringUtils.getBean(HistoryService.class);
List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByTaskCreateTime()
.asc()
.list();
if (ObjectUtils.isEmpty(htiList) || htiList.size() < 2) {
beforeList.add(startObj);
return beforeList;
}
// list里的第二条代表上一个任务
// HistoricTaskInstance lastTask = htiList.get(1);
// // list里第二条代表当前任务
// HistoricTaskInstance curTask = htiList.get(0);
// // 当前节点的executionId
// String curExecutionId = curTask.getExecutionId();
// // 上个节点的taskId
// String lastTaskId = lastTask.getId();
// // 上个节点的executionId
// String lastExecutionId = lastTask.getExecutionId();
// if (null == lastTaskId) {
// throw new RuntimeException("上一任务不存在");
// }
for (int i = 0; i < htiList.size() - 1; i++) {
HistoricTaskInstance historicTaskInstance = htiList.get(i);
JSONObject jo = new JSONObject();
jo.putOnce("dkey", historicTaskInstance.getTaskDefinitionKey());
jo.putOnce("taskName", historicTaskInstance.getName());
beforeList.add(jo);
}
// for(HistoricTaskInstance historicTaskInstance : htiList){
// JSONObject jo = new JSONObject();
// jo.append("taskId", historicTaskInstance.getId());
// jo.append("taskName", historicTaskInstance.getName());
// beforeList.add(jo);
// }
beforeList.add(startObj);
System.out.println(beforeList.toString());
return beforeList;
}
@Override
public String fallBackTaskByTaskDefinitionKey(ApplyVo applyVo, String taskDefinitionKey) {
// 获取当前任务信息
Task currentTask = taskService.createTaskQuery().taskId(applyVo.getTaskId()).singleResult();
if(taskDefinitionKey.equals("0")){
//说明选择退回到开始节点 修改业务数据状态为完成 4审核不通过
infoRunTaskDataService.updateStatus(applyVo.getBusinessKey(), applyVo.getBusinessType(), 4);
//删除流程
runtimeService.deleteProcessInstance(currentTask.getProcessInstanceId(), "退回到开始节点");
}else if (StringUtils.isNotEmpty(applyVo.getTaskId())) {
Task task = taskService.createTaskQuery().taskId(applyVo.getTaskId()).singleResult();
activitiUtil.jumpToTask(task, taskDefinitionKey);
}
//新增历史记录
InfoHiComment infoHiComment = new InfoHiComment();
infoHiComment.setCreateTime(new Date());
infoHiComment.setCreateName(SecurityUtils.getLoginUser().getUser().getNickName());
infoHiComment.setMessage(applyVo.getComment());
infoHiComment.setProcessInstanceId(applyVo.getProcessInstanceId());
infoHiComment.setTaskName(currentTask.getName() + "-退回");
infoHiCommentMapper.insertInfoHiComment(infoHiComment);
return "success";
}
}

@ -1,335 +0,0 @@
package com.huacai.activiti.util;
import com.huacai.activiti.mapper.MyProcessMapper;
import com.huacai.common.utils.spring.SpringUtils;
import org.activiti.bpmn.model.*;
import org.activiti.bpmn.model.Process;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.task.Task;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.util.*;
/**
*
*/
@Component
public class ActivitiUtil {
@Resource
private MyProcessMapper myProcessMapper;
@Resource
private RepositoryService repositoryService;
public void backProcess(Task task) {
String processInstanceId = task.getProcessInstanceId();
// 取得所有历史任务按时间降序排序
HistoryService historyService = SpringUtils.getBean(HistoryService.class);
List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByTaskCreateTime()
.desc()
.list();
if (ObjectUtils.isEmpty(htiList) || htiList.size() < 2) {
return;
}
// list里的第二条代表上一个任务
HistoricTaskInstance lastTask = htiList.get(1);
// list里第二条代表当前任务
HistoricTaskInstance curTask = htiList.get(0);
// 当前节点的executionId
String curExecutionId = curTask.getExecutionId();
// 上个节点的taskId
String lastTaskId = lastTask.getId();
// 上个节点的executionId
String lastExecutionId = lastTask.getExecutionId();
if (null == lastTaskId) {
throw new RuntimeException("上一任务不存在");
}
String processDefinitionId = lastTask.getProcessDefinitionId();
RepositoryService repositoryService = SpringUtils.getBean(RepositoryService.class);
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
String lastActivityId = null;
List<HistoricActivityInstance> haiFinishedList = historyService.createHistoricActivityInstanceQuery()
.executionId(lastExecutionId).finished().list();
for (HistoricActivityInstance hai : haiFinishedList) {
if (lastTaskId.equals(hai.getTaskId())) {
// 得到ActivityId只有HistoricActivityInstance对象里才有此方法
lastActivityId = hai.getActivityId();
break;
}
}
// 得到上个节点的信息
FlowNode lastFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(lastActivityId);
// 取得当前节点的信息
RuntimeService runtimeService = SpringUtils.getBean(RuntimeService.class);
Execution execution = runtimeService.createExecutionQuery().executionId(curExecutionId).singleResult();
String curActivityId = execution.getActivityId();
FlowNode curFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(curActivityId);
//记录当前节点的原活动方向
List oriSequenceFlows = new ArrayList<>();
oriSequenceFlows.addAll(curFlowNode.getOutgoingFlows());
//清理活动方向
curFlowNode.getOutgoingFlows().clear();
//建立新方向
List newSequenceFlowList = new ArrayList<>();
SequenceFlow newSequenceFlow = new SequenceFlow();
newSequenceFlow.setId("newSequenceFlowId");
newSequenceFlow.setSourceFlowElement(curFlowNode);
newSequenceFlow.setTargetFlowElement(lastFlowNode);
newSequenceFlowList.add(newSequenceFlow);
curFlowNode.setOutgoingFlows(newSequenceFlowList);
// 完成任务
TaskService taskService = SpringUtils.getBean(TaskService.class);
//获取任务处理人
Map<String, Object> map = new HashMap<>();
for (HistoricTaskInstance historicTaskInstance : htiList) {
String taskDefinitionKey = historicTaskInstance.getTaskDefinitionKey();
if (lastActivityId.equals(taskDefinitionKey)) {
String assignee = historicTaskInstance.getAssignee();
map.put("assignee", assignee);
break;
}
}
taskService.complete(task.getId(), map, true);
//恢复原方向
curFlowNode.setOutgoingFlows(oriSequenceFlows);
org.activiti.engine.task.Task nextTask = taskService
.createTaskQuery().processInstanceId(processInstanceId).singleResult();
// 设置执行人
if (nextTask != null) {
taskService.setAssignee(nextTask.getId(), lastTask.getAssignee());
}
//删除历史节点
List<HistoricTaskInstance> newHtiList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByTaskCreateTime()
.desc()
.list();
if (newHtiList.size() > 1) {
for (int i = 1; i < newHtiList.size(); i++) {
HistoricTaskInstance historicTaskInstance = newHtiList.get(i);
if (historicTaskInstance.getTaskDefinitionKey().equals(lastActivityId)) {
//删除
System.out.println("===" + historicTaskInstance.getTaskDefinitionKey());
myProcessMapper.deleteHisTaskById(lastTask.getId());
}
if (historicTaskInstance.getTaskDefinitionKey().equals(task.getTaskDefinitionKey())) {
myProcessMapper.deleteHisTask(processInstanceId, task.getTaskDefinitionKey());
}
}
}
}
public boolean isStartEvent(Task currentTask) {
BpmnModel bpmnModel = repositoryService.getBpmnModel(currentTask.getProcessDefinitionId());
List<Process> processes = bpmnModel.getProcesses();
for (Process process : processes) {
ArrayList<FlowElement> flowElements = new ArrayList<>(process.getFlowElements());
for (int i = 0; i < flowElements.size(); i++) {
FlowElement flowElement = flowElements.get(i);
//usertask类型
if (flowElement instanceof UserTask) {
UserTask userTask = (UserTask) flowElement;
if (userTask.getId().equals(currentTask.getTaskDefinitionKey())) {
List<SequenceFlow> incomingFlows = userTask.getIncomingFlows();
for (SequenceFlow incomingFlow : incomingFlows) {
FlowElement sourceFlowElement1 = incomingFlow.getSourceFlowElement();
if (sourceFlowElement1 instanceof StartEvent) {
//是开始节点
return true;
}
}
}
}
}
}
return false;
}
/**
* 线
* @param bpmnModel
* @param historicActivityInstances
*/
public static List<String> getHighLightedFlows(BpmnModel bpmnModel, List<HistoricActivityInstance> historicActivityInstances) {
// 高亮流程已发生流转的线id集合
List<String> highLightedFlowIds = new ArrayList<>();
// 全部活动节点
List<FlowNode> historicActivityNodes = new ArrayList<>();
// 已完成的历史活动节点
List<HistoricActivityInstance> finishedActivityInstances = new ArrayList<>();
for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true);
historicActivityNodes.add(flowNode);
if (historicActivityInstance.getEndTime() != null) {
finishedActivityInstances.add(historicActivityInstance);
}
}
FlowNode currentFlowNode = null;
FlowNode targetFlowNode = null;
// 遍历已完成的活动实例从每个实例的outgoingFlows中找到已执行的
for (HistoricActivityInstance currentActivityInstance : finishedActivityInstances) {
// 获得当前活动对应的节点信息及outgoingFlows信息
currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true);
List<SequenceFlow> sequenceFlows = currentFlowNode.getOutgoingFlows();
/**
* outgoingFlows 1.outgoingFlows 2.outgoingFlows
*/
if ("parallelGateway".equals(currentActivityInstance.getActivityType()) || "inclusiveGateway".equals(currentActivityInstance.getActivityType())) {
// 遍历历史活动节点,找到匹配流程目标节点的
for (SequenceFlow sequenceFlow : sequenceFlows) {
targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sequenceFlow.getTargetRef(), true);
if (historicActivityNodes.contains(targetFlowNode)) {
highLightedFlowIds.add(targetFlowNode.getId());
}
}
} else {
List<Map<String, Object>> tempMapList = new ArrayList<>();
for (SequenceFlow sequenceFlow : sequenceFlows) {
for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
if (historicActivityInstance.getActivityId().equals(sequenceFlow.getTargetRef())) {
Map<String, Object> map = new HashMap<>();
map.put("highLightedFlowId", sequenceFlow.getId());
map.put("highLightedFlowStartTime", historicActivityInstance.getStartTime().getTime());
tempMapList.add(map);
}
}
}
if (!CollectionUtils.isEmpty(tempMapList)) {
// 遍历匹配的集合,取得开始时间最早的一个
long earliestStamp = 0L;
String highLightedFlowId = null;
for (Map<String, Object> map : tempMapList) {
long highLightedFlowStartTime = Long.parseLong(map.get("highLightedFlowStartTime").toString());
if (earliestStamp == 0 || earliestStamp >= highLightedFlowStartTime) {
highLightedFlowId = map.get("highLightedFlowId").toString();
earliestStamp = highLightedFlowStartTime;
}
}
highLightedFlowIds.add(highLightedFlowId);
}
}
}
return highLightedFlowIds;
}
/**
*
* @param sourceTask
* @param targetTaskDefinitionKey id
*/
public void jumpToTask(Task sourceTask,String targetTaskDefinitionKey) {
String processInstanceId = sourceTask.getProcessInstanceId();
// 取得所有历史任务按时间降序排序
HistoryService historyService = SpringUtils.getBean(HistoryService.class);
List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
// .processDefinitionId(targetTaskDefinitionKey)
.taskDefinitionKey(targetTaskDefinitionKey)
.orderByTaskCreateTime()
.desc()
.list();
HistoricTaskInstance lastTask = htiList.get(0);
//取得当前节点的信息
//取得指定节点的信息TaskDefinitionKey
//保存当前节点的流向
//新建流向,由当前节点指向新节点(指定节点)
//当前节点完成任务=流行指定节点
//将当前节点的流向还原
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
String lastActivityId = lastTask.getTaskDefinitionKey();
//获取该工作流的bpmn模板
BpmnModel bpmnModel = repositoryService.getBpmnModel(sourceTask.getProcessDefinitionId());
// 获取当前活动节点
FlowNode currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(sourceTask.getTaskDefinitionKey());
// 获取指定活动节点
FlowNode lastFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(targetTaskDefinitionKey);
// 临时保存当前活动的原始方向 ,最后需要用到他恢复正确的方向
List<SequenceFlow> originalSequenceFlowList = new ArrayList<>();
originalSequenceFlowList.addAll(currentFlowNode.getOutgoingFlows());
// 清理当前活动方向
currentFlowNode.getOutgoingFlows().clear();
// 建立新方向
SequenceFlow newSequenceFlow = new SequenceFlow();
newSequenceFlow.setId("newSequenceFlowId");
newSequenceFlow.setSourceFlowElement(currentFlowNode);//源
newSequenceFlow.setTargetFlowElement(lastFlowNode);//目标
List<SequenceFlow> newSequenceFlowList = new ArrayList<>();
newSequenceFlowList.add(newSequenceFlow);
// 当前节点指向新的方向
currentFlowNode.setOutgoingFlows(newSequenceFlowList);
//获取任务处理人
Map<String, Object> map = new HashMap<>();
for (HistoricTaskInstance historicTaskInstance : htiList) {
String taskDefinitionKey = historicTaskInstance.getTaskDefinitionKey();
if (lastActivityId.equals(taskDefinitionKey)) {
String assignee = historicTaskInstance.getAssignee();
map.put("assignee", assignee);
break;
}
}
// 完成当前任务 = 跳转到指定的节点任务
taskService.complete(sourceTask.getId(), map, true);
// 恢复原始方向
currentFlowNode.setOutgoingFlows(originalSequenceFlowList);
org.activiti.engine.task.Task nextTask = taskService
.createTaskQuery().processInstanceId(processInstanceId).singleResult();
// 设置执行人
if (nextTask != null) {
taskService.setAssignee(nextTask.getId(), lastTask.getAssignee());
}
//删除历史节点
List<HistoricTaskInstance> newHtiList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByTaskCreateTime()
.desc()
.list();
if (newHtiList.size() > 1) {
for (int i = 1; i < newHtiList.size(); i++) {
HistoricTaskInstance historicTaskInstance = newHtiList.get(i);
if (historicTaskInstance.getTaskDefinitionKey().equals(lastActivityId)) {
//删除
System.out.println("===" + historicTaskInstance.getTaskDefinitionKey());
myProcessMapper.deleteHisTaskById(lastTask.getId());
}
if (historicTaskInstance.getTaskDefinitionKey().equals(sourceTask.getTaskDefinitionKey())) {
myProcessMapper.deleteHisTask(processInstanceId, sourceTask.getTaskDefinitionKey());
}
}
}
}
}

@ -1,921 +0,0 @@
package com.huacai.activiti.util;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.*;
import java.io.InputStream;
import java.util.*;
/**
* Class to generate an image based the diagram interchange information in a BPMN 2.0 process.
* BPMN 2.0
*
* @author Joram Barrez
* @author Tijs Rademakers
*/
public class CustomProcessDiagramGenerator implements ICustomProcessDiagramGenerator {
protected String ACTIVITY_FONT_NAME = "微软雅黑";
protected String LABEL_FONT_NAME = "微软雅黑";
protected String ANNOTATION_FONT_NAME = "微软雅黑";
protected Map<Class<? extends BaseElement>, ActivityDrawInstruction> activityDrawInstructions = new HashMap<>();
protected Map<Class<? extends BaseElement>, ArtifactDrawInstruction> artifactDrawInstructions = new HashMap<>();
/**
* The instructions on how to draw a certain construct is
* created statically and stored in a map for performance.
*/
public CustomProcessDiagramGenerator() {
// start event
activityDrawInstructions.put(StartEvent.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
StartEvent startEvent = (StartEvent) flowNode;
if (startEvent.getEventDefinitions() != null && !startEvent.getEventDefinitions().isEmpty()) {
EventDefinition eventDefinition = startEvent.getEventDefinitions().get(0);
if (eventDefinition instanceof TimerEventDefinition) {
processDiagramCanvas.drawTimerStartEvent(flowNode.getId(), graphicInfo);
} else if (eventDefinition instanceof ErrorEventDefinition) {
processDiagramCanvas.drawErrorStartEvent(flowNode.getId(), graphicInfo);
} else if (eventDefinition instanceof SignalEventDefinition) {
processDiagramCanvas.drawSignalStartEvent(flowNode.getId(), graphicInfo);
} else if (eventDefinition instanceof MessageEventDefinition) {
processDiagramCanvas.drawMessageStartEvent(flowNode.getId(), graphicInfo);
} else {
processDiagramCanvas.drawNoneStartEvent(flowNode.getId(), graphicInfo);
}
} else {
processDiagramCanvas.drawNoneStartEvent(flowNode.getId(), graphicInfo);
}
}
});
// signal catch
activityDrawInstructions.put(IntermediateCatchEvent.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
IntermediateCatchEvent intermediateCatchEvent = (IntermediateCatchEvent) flowNode;
if (intermediateCatchEvent.getEventDefinitions() != null && !intermediateCatchEvent
.getEventDefinitions().isEmpty()) {
if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) {
processDiagramCanvas.drawCatchingSignalEvent(flowNode.getId(), flowNode.getName(), graphicInfo, true);
} else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) {
processDiagramCanvas.drawCatchingTimerEvent(flowNode.getId(), flowNode.getName(), graphicInfo, true);
} else if (intermediateCatchEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) {
processDiagramCanvas.drawCatchingMessageEvent(flowNode.getId(), flowNode.getName(), graphicInfo, true);
}
}
}
});
// signal throw
activityDrawInstructions.put(ThrowEvent.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
ThrowEvent throwEvent = (ThrowEvent) flowNode;
if (throwEvent.getEventDefinitions() != null && !throwEvent.getEventDefinitions().isEmpty()) {
if (throwEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) {
processDiagramCanvas.drawThrowingSignalEvent(flowNode.getId(), graphicInfo);
} else if (throwEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) {
processDiagramCanvas.drawThrowingCompensateEvent(flowNode.getId(), graphicInfo);
} else {
processDiagramCanvas.drawThrowingNoneEvent(flowNode.getId(), graphicInfo);
}
} else {
processDiagramCanvas.drawThrowingNoneEvent(flowNode.getId(), graphicInfo);
}
}
});
// end event
activityDrawInstructions.put(EndEvent.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
EndEvent endEvent = (EndEvent) flowNode;
if (endEvent.getEventDefinitions() != null && !endEvent.getEventDefinitions().isEmpty()) {
if (endEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) {
processDiagramCanvas.drawErrorEndEvent(flowNode.getId(), flowNode.getName(), graphicInfo);
} else {
processDiagramCanvas.drawNoneEndEvent(flowNode.getId(), flowNode.getName(), graphicInfo);
}
} else {
processDiagramCanvas.drawNoneEndEvent(flowNode.getId(), flowNode.getName(), graphicInfo);
}
}
});
// task
activityDrawInstructions.put(Task.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawTask(flowNode.getId(), flowNode.getName(), graphicInfo);
}
});
// user task
activityDrawInstructions.put(UserTask.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawUserTask(flowNode.getId(), flowNode.getName(), graphicInfo);
}
});
// script task
activityDrawInstructions.put(ScriptTask.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawScriptTask(flowNode.getId(), flowNode.getName(), graphicInfo);
}
});
// service task
activityDrawInstructions.put(ServiceTask.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
ServiceTask serviceTask = (ServiceTask) flowNode;
processDiagramCanvas.drawServiceTask(flowNode.getId(), flowNode.getName(), graphicInfo);
}
});
// receive task
activityDrawInstructions.put(ReceiveTask.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawReceiveTask(flowNode.getId(), flowNode.getName(), graphicInfo);
}
});
// send task
activityDrawInstructions.put(SendTask.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawSendTask(flowNode.getId(), flowNode.getName(), graphicInfo);
}
});
// manual task
activityDrawInstructions.put(ManualTask.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawManualTask(flowNode.getId(), flowNode.getName(), graphicInfo);
}
});
// businessRuleTask task
activityDrawInstructions.put(BusinessRuleTask.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawBusinessRuleTask(flowNode.getId(), flowNode.getName(), graphicInfo);
}
});
// exclusive gateway
activityDrawInstructions.put(ExclusiveGateway.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawExclusiveGateway(flowNode.getId(), graphicInfo);
}
});
// inclusive gateway
activityDrawInstructions.put(InclusiveGateway.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawInclusiveGateway(flowNode.getId(), graphicInfo);
}
});
// parallel gateway
activityDrawInstructions.put(ParallelGateway.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawParallelGateway(flowNode.getId(), graphicInfo);
}
});
// event based gateway
activityDrawInstructions.put(EventGateway.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawEventBasedGateway(flowNode.getId(), graphicInfo);
}
});
// Boundary timer
activityDrawInstructions.put(BoundaryEvent.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
BoundaryEvent boundaryEvent = (BoundaryEvent) flowNode;
if (boundaryEvent.getEventDefinitions() != null && !boundaryEvent.getEventDefinitions().isEmpty()) {
if (boundaryEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition) {
processDiagramCanvas.drawCatchingTimerEvent(flowNode.getId(), flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity());
} else if (boundaryEvent.getEventDefinitions().get(0) instanceof ErrorEventDefinition) {
processDiagramCanvas.drawCatchingErrorEvent(flowNode.getId(), graphicInfo, boundaryEvent.isCancelActivity());
} else if (boundaryEvent.getEventDefinitions().get(0) instanceof SignalEventDefinition) {
processDiagramCanvas.drawCatchingSignalEvent(flowNode.getId(), flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity());
} else if (boundaryEvent.getEventDefinitions().get(0) instanceof MessageEventDefinition) {
processDiagramCanvas.drawCatchingMessageEvent(flowNode.getId(), flowNode.getName(), graphicInfo, boundaryEvent.isCancelActivity());
} else if (boundaryEvent.getEventDefinitions().get(0) instanceof CompensateEventDefinition) {
processDiagramCanvas.drawCatchingCompensateEvent(flowNode.getId(), graphicInfo, boundaryEvent.isCancelActivity());
}
}
}
});
// subprocess
activityDrawInstructions.put(SubProcess.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) {
processDiagramCanvas.drawCollapsedSubProcess(flowNode.getId(), flowNode.getName(), graphicInfo, false);
} else {
processDiagramCanvas.drawExpandedSubProcess(flowNode.getId(), flowNode.getName(), graphicInfo, SubProcess.class);
}
}
});
// Event subprocess
activityDrawInstructions.put(EventSubProcess.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
if (graphicInfo.getExpanded() != null && !graphicInfo.getExpanded()) {
processDiagramCanvas.drawCollapsedSubProcess(flowNode.getId(), flowNode.getName(), graphicInfo, false);
} else {
processDiagramCanvas.drawExpandedSubProcess(flowNode.getId(), flowNode.getName(), graphicInfo, Transaction.class);
}
}
});
// call activity
activityDrawInstructions.put(CallActivity.class, new ActivityDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
processDiagramCanvas.drawCollapsedCallActivity(flowNode.getId(), flowNode.getName(), graphicInfo);
}
});
// text annotation
artifactDrawInstructions.put(TextAnnotation.class, new ArtifactDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(artifact.getId());
TextAnnotation textAnnotation = (TextAnnotation) artifact;
processDiagramCanvas.drawTextAnnotation(textAnnotation.getId(), textAnnotation.getText(), graphicInfo);
}
});
// association
artifactDrawInstructions.put(Association.class, new ArtifactDrawInstruction() {
@Override
public void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact) {
Association association = (Association) artifact;
String sourceRef = association.getSourceRef();
String targetRef = association.getTargetRef();
// source and target can be instance of FlowElement or Artifact
BaseElement sourceElement = bpmnModel.getFlowElement(sourceRef);
BaseElement targetElement = bpmnModel.getFlowElement(targetRef);
if (sourceElement == null) {
sourceElement = bpmnModel.getArtifact(sourceRef);
}
if (targetElement == null) {
targetElement = bpmnModel.getArtifact(targetRef);
}
List<GraphicInfo> graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId());
graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList);
int[] xPoints = new int[graphicInfoList.size()];
int[] yPoints = new int[graphicInfoList.size()];
for (int i = 1; i < graphicInfoList.size(); i++) {
GraphicInfo graphicInfo = graphicInfoList.get(i);
GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1);
if (i == 1) {
xPoints[0] = (int) previousGraphicInfo.getX();
yPoints[0] = (int) previousGraphicInfo.getY();
}
xPoints[i] = (int) graphicInfo.getX();
yPoints[i] = (int) graphicInfo.getY();
}
AssociationDirection associationDirection = association.getAssociationDirection();
processDiagramCanvas.drawAssociation(xPoints, yPoints, associationDirection, false);
}
});
}
protected CustomProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel,
List<String> highLightedActivities, List<String> runningActivityIdList, List<String> highLightedFlows, List<String> runningActivityFlowsIds,
String activityFontName, String labelFontName, String annotationFontName) {
CustomProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, activityFontName, labelFontName, annotationFontName);
// Draw pool shape, if process is participant in collaboration
for (Pool pool : bpmnModel.getPools()) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
processDiagramCanvas.drawPoolOrLane(pool.getId(), pool.getName(), graphicInfo);
}
// Draw lanes
for (Process process : bpmnModel.getProcesses()) {
for (Lane lane : process.getLanes()) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId());
processDiagramCanvas.drawPoolOrLane(lane.getId(), lane.getName(), graphicInfo);
}
}
// Draw activities and their sequence-flows
/**
* 线线
*/
for (FlowNode flowNode : bpmnModel.getProcesses().get(0).findFlowElementsOfType(FlowNode.class)) {
drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, runningActivityIdList,
highLightedFlows, runningActivityFlowsIds);
}
// Draw artifacts
for (Process process : bpmnModel.getProcesses()) {
for (Artifact artifact : process.getArtifacts()) {
drawArtifact(processDiagramCanvas, bpmnModel, artifact);
}
}
return processDiagramCanvas;
}
/**
* Desc: 线线
*
* @param processDiagramCanvas
* @param bpmnModel
* @param flowNode
* @param highLightedActivities
* @param highLightedFlows
* @author Fuxs
*/
protected void drawActivity(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode,
List<String> highLightedActivities, List<String> runningActivityIdList, List<String> highLightedFlows, List<String> runningActivityFlowsIds) {
ActivityDrawInstruction drawInstruction = activityDrawInstructions.get(flowNode.getClass());
if (drawInstruction != null) {
drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode);
// Gather info on the multi instance marker
boolean multiInstanceSequential = false;
boolean multiInstanceParallel = false;
boolean highLighted = false;
if (flowNode instanceof Activity) {
Activity activity = (Activity) flowNode;
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics();
if (multiInstanceLoopCharacteristics != null) {
multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential();
multiInstanceParallel = !multiInstanceSequential;
}
}
// Gather info on the highLighted marker
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
if (!(flowNode instanceof SubProcess)) {
if (flowNode instanceof CallActivity) {
highLighted = true;
}
} else {
highLighted = graphicInfo.getExpanded() != null && !graphicInfo.getExpanded();
}
processDiagramCanvas.drawActivityMarkers((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo.getWidth(), (int) graphicInfo.getHeight(), multiInstanceSequential, multiInstanceParallel, highLighted);
// Draw highlighted activities
if (highLightedActivities.contains(flowNode.getId())) {
/*
*
*/
if (runningActivityIdList.contains(flowNode.getId())) {
drawRunningActivityHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()));
} else {
drawHighLight(processDiagramCanvas, bpmnModel.getGraphicInfo(flowNode.getId()));
}
}
}
/*
* 线
*/
for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
boolean highLighted = (highLightedFlows.contains(sequenceFlow.getId()));
String defaultFlow = null;
if (flowNode instanceof Activity) {
defaultFlow = ((Activity) flowNode).getDefaultFlow();
} else if (flowNode instanceof Gateway) {
defaultFlow = ((Gateway) flowNode).getDefaultFlow();
}
boolean isDefault = false;
if (defaultFlow != null && defaultFlow.equalsIgnoreCase(sequenceFlow.getId())) {
isDefault = true;
}
boolean drawConditionalIndicator = sequenceFlow.getConditionExpression() != null
&& !(flowNode instanceof Gateway);
String sourceRef = sequenceFlow.getSourceRef();
String targetRef = sequenceFlow.getTargetRef();
FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef);
FlowElement targetElement = bpmnModel.getFlowElement(targetRef);
List<GraphicInfo> graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
if (graphicInfoList != null && graphicInfoList.size() > 0) {
graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement,
targetElement, graphicInfoList);
int[] xPoints = new int[graphicInfoList.size()];
int[] yPoints = new int[graphicInfoList.size()];
for (int i = 1; i < graphicInfoList.size(); i++) {
GraphicInfo graphicInfo = graphicInfoList.get(i);
GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1);
if (i == 1) {
xPoints[0] = (int) previousGraphicInfo.getX();
yPoints[0] = (int) previousGraphicInfo.getY();
}
xPoints[i] = (int) graphicInfo.getX();
yPoints[i] = (int) graphicInfo.getY();
}
if (highLightedFlows.contains(sequenceFlow.getId()) && runningActivityFlowsIds.contains(sequenceFlow.getId())) {
processDiagramCanvas.drawLastSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted);
} else {
processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted);
}
/*
* 线
*/
GraphicInfo lineCenter = getLineCenter(graphicInfoList);
processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, true);
}
}
// Nested elements
if (flowNode instanceof FlowElementsContainer) {
for (FlowElement nestedFlowElement : ((FlowElementsContainer) flowNode).getFlowElements()) {
if (nestedFlowElement instanceof FlowNode) {
drawActivity(processDiagramCanvas, bpmnModel, (FlowNode) nestedFlowElement, highLightedActivities,
runningActivityIdList, highLightedFlows, runningActivityFlowsIds);
}
}
}
}
/**
* This method makes coordinates of connection flow better.
*
* @param processDiagramCanvas
* @param bpmnModel
* @param sourceElement
* @param targetElement
* @param graphicInfoList
* @return
*/
protected static List<GraphicInfo> connectionPerfectionizer(CustomProcessDiagramCanvas processDiagramCanvas,
BpmnModel bpmnModel, BaseElement sourceElement, BaseElement targetElement,
List<GraphicInfo> graphicInfoList) {
GraphicInfo sourceGraphicInfo = bpmnModel.getGraphicInfo(sourceElement.getId());
GraphicInfo targetGraphicInfo = bpmnModel.getGraphicInfo(targetElement.getId());
CustomProcessDiagramCanvas.SHAPE_TYPE sourceShapeType = getShapeType(sourceElement);
CustomProcessDiagramCanvas.SHAPE_TYPE targetShapeType = getShapeType(targetElement);
return processDiagramCanvas.connectionPerfectionizer(sourceShapeType, targetShapeType, sourceGraphicInfo,
targetGraphicInfo, graphicInfoList);
}
/**
* This method returns shape type of base element.<br>
* Each element can be presented as rectangle, rhombus, or ellipse.
*
* @param baseElement
* @return CustomProcessDiagramCanvas.SHAPE_TYPE
*/
protected static CustomProcessDiagramCanvas.SHAPE_TYPE getShapeType(BaseElement baseElement) {
if (baseElement instanceof Task || baseElement instanceof Activity || baseElement instanceof TextAnnotation) {
return CustomProcessDiagramCanvas.SHAPE_TYPE.Rectangle;
} else if (baseElement instanceof Gateway) {
return CustomProcessDiagramCanvas.SHAPE_TYPE.Rhombus;
} else if (baseElement instanceof Event) {
return CustomProcessDiagramCanvas.SHAPE_TYPE.Ellipse;
} else {
// unknown source element, just do not correct coordinates
}
return null;
}
protected static GraphicInfo getLineCenter(List<GraphicInfo> graphicInfoList) {
GraphicInfo gi = new GraphicInfo();
int[] xPoints = new int[graphicInfoList.size()];
int[] yPoints = new int[graphicInfoList.size()];
double length = 0;
double[] lengths = new double[graphicInfoList.size()];
lengths[0] = 0;
double m;
for (int i = 1; i < graphicInfoList.size(); i++) {
GraphicInfo graphicInfo = graphicInfoList.get(i);
GraphicInfo previousGraphicInfo = graphicInfoList.get(i - 1);
if (i == 1) {
xPoints[0] = (int) previousGraphicInfo.getX();
yPoints[0] = (int) previousGraphicInfo.getY();
}
xPoints[i] = (int) graphicInfo.getX();
yPoints[i] = (int) graphicInfo.getY();
length += Math.sqrt(Math.pow((int) graphicInfo.getX() - (int) previousGraphicInfo.getX(), 2) + Math.pow(
(int) graphicInfo.getY() - (int) previousGraphicInfo.getY(), 2));
lengths[i] = length;
}
m = length / 2;
int p1 = 0, p2 = 1;
for (int i = 1; i < lengths.length; i++) {
double len = lengths[i];
p1 = i - 1;
p2 = i;
if (len > m) {
break;
}
}
GraphicInfo graphicInfo1 = graphicInfoList.get(p1);
GraphicInfo graphicInfo2 = graphicInfoList.get(p2);
double AB = (int) graphicInfo2.getX() - (int) graphicInfo1.getX();
double OA = (int) graphicInfo2.getY() - (int) graphicInfo1.getY();
double OB = lengths[p2] - lengths[p1];
double ob = m - lengths[p1];
double ab = AB * ob / OB;
double oa = OA * ob / OB;
double mx = graphicInfo1.getX() + ab;
double my = graphicInfo1.getY() + oa;
gi.setX(mx);
gi.setY(my);
return gi;
}
protected void drawArtifact(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel,
Artifact artifact) {
ArtifactDrawInstruction drawInstruction = artifactDrawInstructions.get(artifact.getClass());
if (drawInstruction != null) {
drawInstruction.draw(processDiagramCanvas, bpmnModel, artifact);
}
}
private static void drawHighLight(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) {
processDiagramCanvas.drawHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo
.getWidth(), (int) graphicInfo.getHeight());
}
/**
* Desc:
*
* @param processDiagramCanvas CustomProcessDiagramCanvas
* @param graphicInfo GraphicInfo
* @author Fuxs
*/
private static void drawRunningActivityHighLight(CustomProcessDiagramCanvas processDiagramCanvas, GraphicInfo graphicInfo) {
processDiagramCanvas.drawRunningActivityHighLight((int) graphicInfo.getX(), (int) graphicInfo.getY(), (int) graphicInfo
.getWidth(), (int) graphicInfo.getHeight());
}
protected static CustomProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String activityFontName,
String labelFontName, String annotationFontName) {
// We need to calculate maximum values to know how big the image will be in its entirety
double minX = 1.7976931348623157E308D;
double maxX = 0.0D;
double minY = 1.7976931348623157E308D;
double maxY = 0.0D;
for (Pool pool : bpmnModel.getPools()) {
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
minX = graphicInfo.getX();
maxX = graphicInfo.getX() + graphicInfo.getWidth();
minY = graphicInfo.getY();
maxY = graphicInfo.getY() + graphicInfo.getHeight();
}
List<FlowNode> flowNodes = gatherAllFlowNodes(bpmnModel);
for (FlowNode flowNode : flowNodes) {
GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
// width
if (flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth() > maxX) {
maxX = flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth();
}
if (flowNodeGraphicInfo.getX() < minX) {
minX = flowNodeGraphicInfo.getX();
}
// height
if (flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight() > maxY) {
maxY = flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight();
}
if (flowNodeGraphicInfo.getY() < minY) {
minY = flowNodeGraphicInfo.getY();
}
for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
List<GraphicInfo> graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
if (graphicInfoList != null) {
for (GraphicInfo graphicInfo : graphicInfoList) {
// width
if (graphicInfo.getX() > maxX) {
maxX = graphicInfo.getX();
}
if (graphicInfo.getX() < minX) {
minX = graphicInfo.getX();
}
// height
if (graphicInfo.getY() > maxY) {
maxY = graphicInfo.getY();
}
if (graphicInfo.getY() < minY) {
minY = graphicInfo.getY();
}
}
}
}
}
List<Artifact> artifacts = gatherAllArtifacts(bpmnModel);
for (Artifact artifact : artifacts) {
GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(artifact.getId());
if (artifactGraphicInfo != null) {
// width
if (artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth() > maxX) {
maxX = artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth();
}
if (artifactGraphicInfo.getX() < minX) {
minX = artifactGraphicInfo.getX();
}
// height
if (artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight() > maxY) {
maxY = artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight();
}
if (artifactGraphicInfo.getY() < minY) {
minY = artifactGraphicInfo.getY();
}
}
List<GraphicInfo> graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId());
if (graphicInfoList != null) {
for (GraphicInfo graphicInfo : graphicInfoList) {
// width
if (graphicInfo.getX() > maxX) {
maxX = graphicInfo.getX();
}
if (graphicInfo.getX() < minX) {
minX = graphicInfo.getX();
}
// height
if (graphicInfo.getY() > maxY) {
maxY = graphicInfo.getY();
}
if (graphicInfo.getY() < minY) {
minY = graphicInfo.getY();
}
}
}
}
int nrOfLanes = 0;
for (Process process : bpmnModel.getProcesses()) {
for (Lane l : process.getLanes()) {
nrOfLanes++;
GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(l.getId());
// // width
if (graphicInfo.getX() + graphicInfo.getWidth() > maxX) {
maxX = graphicInfo.getX() + graphicInfo.getWidth();
}
if (graphicInfo.getX() < minX) {
minX = graphicInfo.getX();
}
// height
if (graphicInfo.getY() + graphicInfo.getHeight() > maxY) {
maxY = graphicInfo.getY() + graphicInfo.getHeight();
}
if (graphicInfo.getY() < minY) {
minY = graphicInfo.getY();
}
}
}
// Special case, see http://jira.codehaus.org/browse/ACT-1431
if (flowNodes.isEmpty() && bpmnModel.getPools().isEmpty() && nrOfLanes == 0) {
// Nothing to show
minX = 0.0D;
minY = 0.0D;
}
//width和height代表最大的长宽
return new CustomProcessDiagramCanvas((int) maxX + 30, (int) maxY + 50, (int) minX, (int) minY, activityFontName, labelFontName, annotationFontName);
}
protected static List<Artifact> gatherAllArtifacts(BpmnModel bpmnModel) {
List<Artifact> artifacts = new ArrayList<Artifact>();
for (Process process : bpmnModel.getProcesses()) {
artifacts.addAll(process.getArtifacts());
}
return artifacts;
}
protected static List<FlowNode> gatherAllFlowNodes(BpmnModel bpmnModel) {
List<FlowNode> flowNodes = new ArrayList<FlowNode>();
for (Process process : bpmnModel.getProcesses()) {
flowNodes.addAll(gatherAllFlowNodes(process));
}
return flowNodes;
}
protected static List<FlowNode> gatherAllFlowNodes(FlowElementsContainer flowElementsContainer) {
List<FlowNode> flowNodes = new ArrayList<FlowNode>();
for (FlowElement flowElement : flowElementsContainer.getFlowElements()) {
if (flowElement instanceof FlowNode) {
flowNodes.add((FlowNode) flowElement);
}
if (flowElement instanceof FlowElementsContainer) {
flowNodes.addAll(gatherAllFlowNodes((FlowElementsContainer) flowElement));
}
}
return flowNodes;
}
public Map<Class<? extends BaseElement>, ActivityDrawInstruction> getActivityDrawInstructions() {
return activityDrawInstructions;
}
public void setActivityDrawInstructions(Map<Class<? extends BaseElement>, ActivityDrawInstruction> activityDrawInstructions) {
this.activityDrawInstructions = activityDrawInstructions;
}
public Map<Class<? extends BaseElement>, ArtifactDrawInstruction> getArtifactDrawInstructions() {
return artifactDrawInstructions;
}
public void setArtifactDrawInstructions(Map<Class<? extends BaseElement>, ArtifactDrawInstruction> artifactDrawInstructions) {
this.artifactDrawInstructions = artifactDrawInstructions;
}
protected interface ActivityDrawInstruction {
void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode);
}
protected interface ArtifactDrawInstruction {
void draw(CustomProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, Artifact artifact);
}
/**
* Desc:
*
* @param bpmnModel
* @param highLightedActivities
* @param runningActivityIdList
* @param highLightedFlows
* @param activityFontName
* @param labelFontName
* @param annotationFontName
* @return
*/
@Override
public InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> runningActivityIdList,
List<String> highLightedFlows,
List<String> runningActivityFlowsIds,
String activityFontName,
String labelFontName,
String annotationFontName) {
// TODO
return generateProcessDiagram(bpmnModel,
highLightedActivities,
runningActivityIdList,
highLightedFlows,
runningActivityFlowsIds,
activityFontName,
labelFontName,
annotationFontName).generateImage();
}
@Override
public InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> runningActivityIdList,
List<String> highLightedFlows,
String activityFontName,
String labelFontName,
String annotationFontName) {
return generateProcessDiagram(bpmnModel,
highLightedActivities,
runningActivityIdList,
highLightedFlows,
Collections.emptyList(),
activityFontName,
labelFontName,
annotationFontName).generateImage();
}
@Override
public InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> highLightedFlows,
String activityFontName,
String labelFontName,
String annotationFontName) {
return generateProcessDiagram(bpmnModel,
highLightedActivities,
Collections.emptyList(),
highLightedFlows,
Collections.emptyList(),
activityFontName,
labelFontName,
annotationFontName).generateImage();
}
@Override
public InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> runningActivityIdList,
List<String> highLightedFlows,
List<String> runningActivityFlowsIds) {
return generateProcessDiagram(bpmnModel,
highLightedActivities,
runningActivityIdList,
highLightedFlows,
runningActivityFlowsIds,
ACTIVITY_FONT_NAME,
LABEL_FONT_NAME,
ANNOTATION_FONT_NAME).generateImage();
}
@Override
public InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> runningActivityIdList,
List<String> highLightedFlows) {
return generateProcessDiagram(bpmnModel,
highLightedActivities,
runningActivityIdList,
highLightedFlows,
Collections.emptyList(),
ACTIVITY_FONT_NAME,
LABEL_FONT_NAME,
ANNOTATION_FONT_NAME).generateImage();
}
@Override
public InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> highLightedFlows) {
return generateProcessDiagram(bpmnModel,
highLightedActivities,
Collections.emptyList(),
highLightedFlows,
Collections.emptyList(),
ACTIVITY_FONT_NAME,
LABEL_FONT_NAME,
ANNOTATION_FONT_NAME).generateImage();
}
}

@ -1,61 +0,0 @@
package com.huacai.activiti.util;
import org.activiti.bpmn.model.BpmnModel;
import java.io.InputStream;
import java.util.List;
/**
* bpmnModel bpmn
* activityFontName
* labelFontName
* annotationFontName
* highLightedActivities (绿)
* runningActivityIdList ()
* highLightedFlows (绿)
* lastFlowIdList ()
*/
public interface ICustomProcessDiagramGenerator {
//指定字体
InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> runningActivityIdList,
List<String> highLightedFlows,
List<String> runningActivityFlowsIds,
String activityFontName,
String labelFontName,
String annotationFontName);
InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> runningActivityIdList,
List<String> highLightedFlows,
String activityFontName,
String labelFontName,
String annotationFontName);
InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> highLightedFlows,
String activityFontName,
String labelFontName,
String annotationFontName);
//无指定字体,使用默认字体
InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> runningActivityIdList,
List<String> highLightedFlows,
List<String> runningActivityFlowsIds);
InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> runningActivityIdList,
List<String> highLightedFlows);
InputStream generateDiagramCustom(BpmnModel bpmnModel,
List<String> highLightedActivities,
List<String> highLightedFlows);
}

@ -1,380 +0,0 @@
package com.huacai.activiti.util;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.runtime.Execution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Component
public class ProcessImageManager {
@Autowired
RepositoryService repositoryService;
@Autowired
private HistoryService historyService;
@Autowired
private RuntimeService runtimeService;
public InputStream getFlowImgByProcInstId(String procInstId) throws Exception {
if (StringUtils.isEmpty(procInstId)) {
throw new Exception("[异常]-传入的参数procInstId为空");
}
InputStream imageStream = null;
try {
// 通过流程实例ID获取历史流程实例
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInstId).singleResult();
// 通过流程实例ID获取流程中已经执行的节点按照执行先后顺序排序
List<HistoricActivityInstance> historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery()
// 这里如果流程结束的话process会为空所以查询历史流程这样也能看到结束的流程进度信息。
.processInstanceId(procInstId)
.orderByHistoricActivityInstanceStartTime().asc().list();
// 将已经执行的节点放入高亮显示节点集合
List<String> highLightedActivityIdList = historicActivityInstanceList.stream()
.map(HistoricActivityInstance::getActivityId)
.collect(Collectors.toList());
// 通过流程实例ID获取流程中正在执行的节点
List<String> runningActivityIdList = runtimeService.createExecutionQuery().processInstanceId(procInstId).list()
.stream().map(Execution::getActivityId).collect(Collectors.toList());
// 定义流程画布生成器
CustomProcessDiagramGenerator processDiagramGenerator = new CustomProcessDiagramGenerator();
// 获取流程定义Model对象
BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());
// 获取已经流经的流程线需要高亮显示流程已经发生流转的线id集合
// List<String> highLightedFlowsIds = getHighLightedFlows(bpmnModel, historicActivityInstanceList);
List<String> highLightedFlowsIds = getHighLightedFlowsByIncomingFlows(bpmnModel, historicActivityInstanceList);
// 根据runningActivityIdList获取runningActivityFlowsIds
List<String> runningActivityFlowsIds = getRunningActivityFlowsIds(bpmnModel, runningActivityIdList, historicActivityInstanceList);
// 使用默认配置获得流程图表生成器,并生成追踪图片字符流
imageStream = processDiagramGenerator.generateDiagramCustom(
bpmnModel,
highLightedActivityIdList, runningActivityIdList, highLightedFlowsIds, runningActivityFlowsIds,
"宋体", "微软雅黑", "黑体");
return imageStream;
} catch (Exception e) {
throw new Exception("通过流程实例ID" + procInstId + "获取流程图时出现异常!", e);
} finally {
if (imageStream != null) {
imageStream.close();
}
}
}
/**
* @param bpmnModel bpmnModel
* @param historicActivityInstanceList historicActivityInstanceList
* @return HighLightedFlows
*/
public List<String> getHighLightedFlows(BpmnModel bpmnModel,
List<HistoricActivityInstance> historicActivityInstanceList) {
//historicActivityInstanceList 是 流程中已经执行的历史活动实例
// 已经流经的顺序流,需要高亮显示
List<String> highFlows = new ArrayList<>();
// 全部活动节点
List<FlowNode> allHistoricActivityNodeList = new ArrayList<>();
// 拥有endTime的历史活动实例即已经完成了的节点
List<HistoricActivityInstance> finishedActivityInstancesList = new ArrayList<>();
/*
*
* FlowNodeallHistoricActivityNodeList
* finishedActivityInstancesList
*/
for (HistoricActivityInstance historicActivityInstance : historicActivityInstanceList) {
// 获取流程节点
// bpmnModel.getMainProcess()获取一个Process对象
FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true);
allHistoricActivityNodeList.add(flowNode);
// 如果结束时间不为空,表示当前节点已经完成
if (historicActivityInstance.getEndTime() != null) {
finishedActivityInstancesList.add(historicActivityInstance);
}
}
FlowNode currentFlowNode;
FlowNode targetFlowNode;
HistoricActivityInstance currentActivityInstance;
// 遍历已经完成的活动实例从每个实例的outgoingFlows中找到已经执行的
for (int k = 0; k < finishedActivityInstancesList.size(); k++) {
currentActivityInstance = finishedActivityInstancesList.get(k);
// 获得当前活动对应的节点信息以及outgoingFlows信息
currentFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(currentActivityInstance.getActivityId(), true);
// 当前节点的所有流出线
List<SequenceFlow> outgoingFlowList = currentFlowNode.getOutgoingFlows();
/*
* outgoingFlows
* 1outgoingFlows
* 2outgoingFlows
* (线线)
*/
if ("parallelGateway".equals(currentActivityInstance.getActivityType()) ||
"inclusiveGateway".equals(currentActivityInstance.getActivityType())) {
// 遍历历史活动节点,找到匹配流程目标节点的
for (SequenceFlow outgoingFlow : outgoingFlowList) {
// 获取当前节点流程线对应的下一级节点
targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(outgoingFlow.getTargetRef(), true);
// 如果下级节点包含在所有历史节点中,则将当前节点的流出线高亮显示
if (allHistoricActivityNodeList.contains(targetFlowNode)) {
highFlows.add(outgoingFlow.getId());
}
}
} else {
/*
* 2
* -
* 线
*/
List<Map<String, Object>> tempMapList = new ArrayList<>();
// 当前节点ID
String currentActivityId = currentActivityInstance.getActivityId();
int size = historicActivityInstanceList.size();
boolean ifStartFind = false;
boolean ifFinded = false;
HistoricActivityInstance historicActivityInstance;
// 循环当前节点的所有流出线
// 循环所有的历史节点
// log.info("【开始】-匹配当前节点-ActivityId=【{}】需要高亮显示的流出线", currentActivityId);
// log.info("循环历史节点");
for (int i = 0; i < size; i++) {
// // 如果当前节点流程线对应的下级节点在历史节点中,则该条流程线进行高亮显示(【问题】有驳回流程线时,即使没有进行驳回操作,因为申请节点在历史节点中,也会将驳回流程线高亮显示-_-||
// if (historicActivityInstance.getActivityId().equals(sequenceFlow.getTargetRef())) {
// Map<String, Object> map = new HashMap<>();
// map.put("highLightedFlowId", sequenceFlow.getId());
// map.put("highLightedFlowStartTime", historicActivityInstance.getStartTime().getTime());
// tempMapList.add(map);
// // highFlows.add(sequenceFlow.getId());
// }
// 历史节点
historicActivityInstance = historicActivityInstanceList.get(i);
// log.info("第【{}/{}】个历史节点-ActivityId=【{}】", i + 1, size, historicActivityInstance.getActivityId());
// 如果循环历史节点中的id等于当前节点id从当前历史节点继续先后查找是否有当前流程线等于的节点
// 历史节点的序号需要大于等于已经完成历史节点的序号,放置驳回重审一个节点经过两次时只取第一次的流出线高亮显示,第二次的不显示
if (i >= k && historicActivityInstance.getActivityId().equals(currentActivityId)) {
// log.info("第【{}】个历史节点和当前节点一致-ActivityId=【{}】", i + 1, historicActivityInstance.getActivityId());
ifStartFind = true;
// 跳过当前节点继续查找下一个节点
continue;
}
if (ifStartFind) {
// log.info("[开始]-循环当前节点-ActivityId=【{}】的所有流出线", currentActivityId);
ifFinded = false;
for (SequenceFlow sequenceFlow : outgoingFlowList) {
// 如果当前节点流程线对应的下级节点在其后面的历史节点中,则该条流程线进行高亮显示
// 【问题】
// log.info("当前流出线的下级节点=[{}]", sequenceFlow.getTargetRef());
if (historicActivityInstance.getActivityId().equals(sequenceFlow.getTargetRef())) {
// log.info("当前节点[{}]需高亮显示的流出线=[{}]", currentActivityId, sequenceFlow.getId());
highFlows.add(sequenceFlow.getId());
// 暂时默认找到离当前节点最近的下一级节点即退出循环,否则有多条流出线时将全部被高亮显示
ifFinded = true;
break;
}
}
// log.info("[完成]-循环当前节点-ActivityId=【{}】的所有流出线", currentActivityId);
}
if (ifFinded) {
// 暂时默认找到离当前节点最近的下一级节点即退出历史节点循环,否则有多条流出线时将全部被高亮显示
break;
}
}
// log.info("【完成】-匹配当前节点-ActivityId=【{}】需要高亮显示的流出线", currentActivityId);
// if (!CollectionUtils.isEmpty(tempMapList)) {
// // 遍历匹配的集合,取得开始时间最早的一个
// long earliestStamp = 0L;
// String highLightedFlowId = null;
// for (Map<String, Object> map : tempMapList) {
// long highLightedFlowStartTime = Long.valueOf(map.get("highLightedFlowStartTime").toString());
// if (earliestStamp == 0 || earliestStamp <= highLightedFlowStartTime) {
// highLightedFlowId = map.get("highLightedFlowId").toString();
// earliestStamp = highLightedFlowStartTime;
// }
// }
// highFlows.add(highLightedFlowId);
// }
}
}
return highFlows;
}
/**
* @param bpmnModel bpmnModel
* @param historicActivityInstanceList historicActivityInstanceList
* @return HighLightedFlows
*/
public List<String> getHighLightedFlowsByIncomingFlows(BpmnModel bpmnModel,
List<HistoricActivityInstance> historicActivityInstanceList) {
//historicActivityInstanceList 是 流程中已经执行的历史活动实例
// 已经流经的顺序流,需要高亮显示
List<String> highFlows = new ArrayList<>();
// 全部活动节点(包括正在执行的和未执行的)
List<FlowNode> allHistoricActivityNodeList = new ArrayList<>();
/*
*
* FlowNodeallHistoricActivityNodeList
* finishedActivityInstancesList
*/
for (HistoricActivityInstance historicActivityInstance : historicActivityInstanceList) {
// 获取流程节点
// bpmnModel.getMainProcess()获取一个Process对象
FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true);
allHistoricActivityNodeList.add(flowNode);
}
// 循环活动节点
for (FlowNode flowNode : allHistoricActivityNodeList) {
// 获取每个活动节点的输入线
List<SequenceFlow> incomingFlows = flowNode.getIncomingFlows();
// 循环输入线,如果输入线的源头处于全部活动节点中,则将其包含在内
for (SequenceFlow sequenceFlow : incomingFlows) {
if (allHistoricActivityNodeList.stream().map(BaseElement::getId).collect(Collectors.toList()).contains(sequenceFlow.getSourceFlowElement().getId())) {
highFlows.add(sequenceFlow.getId());
}
}
}
return highFlows;
}
private List<String> getRunningActivityFlowsIds(BpmnModel bpmnModel, List<String> runningActivityIdList, List<HistoricActivityInstance> historicActivityInstanceList) {
List<String> runningActivityFlowsIds = new ArrayList<>();
List<String> runningActivityIds = new ArrayList<>(runningActivityIdList);
// 逆序寻找因为historicActivityInstanceList有序
if (CollectionUtils.isEmpty(runningActivityIds)) {
return runningActivityFlowsIds;
}
for (int i = historicActivityInstanceList.size() - 1; i >= 0; i--) {
HistoricActivityInstance historicActivityInstance = historicActivityInstanceList.get(i);
FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true);
// 如果当前节点是未完成的节点
if (runningActivityIds.contains(flowNode.getId())) {
continue;
}
// 当前节点的所有流出线
List<SequenceFlow> outgoingFlowList = flowNode.getOutgoingFlows();
// 遍历所有的流出线
for (SequenceFlow outgoingFlow : outgoingFlowList) {
// 获取当前节点流程线对应的下一级节点
FlowNode targetFlowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(outgoingFlow.getTargetRef(), true);
// 如果找到流出线的目标是runningActivityIdList中的那么添加后将其移除避免找到重复的都指向runningActivityIdList的流出线
if (runningActivityIds.contains(targetFlowNode.getId())) {
runningActivityFlowsIds.add(outgoingFlow.getId());
runningActivityIds.remove(targetFlowNode.getId());
}
}
}
return runningActivityFlowsIds;
}
/**
* getRunningActivityFlowsIds
* CSDN)
*/
public List<String> getRunningActivityFlowIdsByIcommingFlows(BpmnModel bpmnModel, List<String> runningActivityIdList, List<HistoricActivityInstance> historicActivityInstanceList) {
List<String> runningActivityFlowsIds = new ArrayList<>();
List<String> runningActivityIds = new ArrayList<>(runningActivityIdList);
// 逆序寻找因为historicActivityInstanceList有序
if (CollectionUtils.isEmpty(runningActivityIds)) {
return runningActivityFlowsIds;
}
// 全部活动节点(包括正在执行的和未执行的)
List<FlowNode> allHistoricActivityNodeList = new ArrayList<>();
for (HistoricActivityInstance historicActivityInstance : historicActivityInstanceList) {
// 获取流程节点
// bpmnModel.getMainProcess()获取一个Process对象
FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true);
allHistoricActivityNodeList.add(flowNode);
}
for (int i = historicActivityInstanceList.size() - 1; i >= 0; i--) {
HistoricActivityInstance historicActivityInstance = historicActivityInstanceList.get(i);
FlowNode flowNode = (FlowNode) bpmnModel.getMainProcess().getFlowElement(historicActivityInstance.getActivityId(), true);
// 如果当前节点是未完成的节点
if (runningActivityIds.contains(flowNode.getId())) {
// 获取每个活动节点的输入线
List<SequenceFlow> incomingFlows = flowNode.getIncomingFlows();
// 循环输入线,如果输入线的源头处于全部活动节点中,则将其包含在内
for (SequenceFlow sequenceFlow : incomingFlows) {
if (allHistoricActivityNodeList.stream().map(BaseElement::getId).collect(Collectors.toList()).contains(sequenceFlow.getSourceFlowElement().getId())) {
runningActivityFlowsIds.add(sequenceFlow.getId());
}
}
}
}
return runningActivityFlowsIds;
}
/**
* ActivityIdprocessInstanceId
* @param activityId ID
* @param processInstanceId ID
* @return
*/
public HistoricActivityInstance getActivityInfo(String activityId, String processInstanceId) {
// 查询历史流程实例
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
// 查询历史活动实例
HistoricActivityInstance historicActivityInstance = historyService.createHistoricActivityInstanceQuery()
.activityId(activityId)
.processInstanceId(processInstanceId)
.singleResult();
return historicActivityInstance;
}
}

@ -1,19 +0,0 @@
package com.huacai.activiti.vo;
import lombok.Data;
/**
* @projectName: haucai-activiti-kjglxt
* @package: com.huacai.activiti.vo
* @className: ActivitiVo
* @author:
* @description: TODO
* @date: 2024/6/24 14:44
* @version: 1.0
*/
@Data
public class ActivitiVo {
private String endTime;
private String activityName;
private String approver;
}

@ -1,21 +0,0 @@
package com.huacai.activiti.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
/**
* vo
*/
@Data
public class ApplyVo implements Serializable {
private String processInstanceId;//流程实例ID
private String comment;//审批意见
private String taskId;//任务ID
private String businessKey;//业务ID
private Integer businessType;//业务类型
private Map<String,Object> params;
}

@ -1,15 +0,0 @@
package com.huacai.activiti.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class HistoryVo implements Serializable {
private String taskName;
private String COMMENT;
private Date startTime;
private Date endTime;
private String nickName;
}

@ -1,35 +0,0 @@
package com.huacai.activiti.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
*
*/
@Data
public class MyTaskVo implements Serializable {
private String taskId;
private String taskName;
private String processInstanceId;
private String businessTitle;
private String businessType;
private String businessKey;
private String applyUser;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date applyTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTaskTime;
/** 流程状态 默认1 */
private Integer processStatus;
//当前审批人
private String assignee;
//拾取时间
private Date claimTime;
}

@ -1,43 +0,0 @@
package com.huacai.activiti.vo;
import lombok.Data;
import java.util.Set;
/**
* @projectName: haucai-activiti-kjglxt
* @package: com.huacai.activiti.vo
* @className: ProcessHighlightEntity
* @author:
* @description: TODO
* @date: 2024/6/23 19:45
* @version: 1.0
*/
@Data
public class ProcessHighlightEntity {
/**
* id
*/
private Set<String> activeActivityIds;
/**
* id
*/
private Set<String> executedActivityIds;
/**
* 线id线
*/
private Set<String> highlightedFlowIds;
/**
* xml
*/
private String modelXml;
/**
*
*/
private String modelName;
}

@ -1,94 +0,0 @@
package com.huacai.infoHiComment.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.huacai.common.annotation.Excel;
import com.huacai.common.core.domain.BaseEntity;
/**
* info_hi_comment
*
* @author huacai
* @date 2024-03-11
*/
public class InfoHiComment extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 主键 */
private Long id;
/** 任务名称 */
@Excel(name = "任务名称")
private String taskName;
/** 操作日志 */
@Excel(name = "操作日志")
private String message;
/** 操作人 */
@Excel(name = "操作人")
private String createName;
/** 流程实例id */
@Excel(name = "流程实例id")
private String processInstanceId;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setTaskName(String taskName)
{
this.taskName = taskName;
}
public String getTaskName()
{
return taskName;
}
public void setMessage(String message)
{
this.message = message;
}
public String getMessage()
{
return message;
}
public void setCreateName(String createName)
{
this.createName = createName;
}
public String getCreateName()
{
return createName;
}
public void setProcessInstanceId(String processInstanceId)
{
this.processInstanceId = processInstanceId;
}
public String getProcessInstanceId()
{
return processInstanceId;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("taskName", getTaskName())
.append("message", getMessage())
.append("createTime", getCreateTime())
.append("createName", getCreateName())
.append("processInstanceId", getProcessInstanceId())
.toString();
}
}

@ -1,61 +0,0 @@
package com.huacai.infoHiComment.mapper;
import java.util.List;
import com.huacai.infoHiComment.domain.InfoHiComment;
/**
* Mapper
*
* @author huacai
* @date 2024-03-11
*/
public interface InfoHiCommentMapper {
/**
*
*
* @param id
* @return
*/
public InfoHiComment selectInfoHiCommentById(Long id);
/**
*
*
* @param infoHiComment
* @return
*/
public List<InfoHiComment> selectInfoHiCommentList(InfoHiComment infoHiComment);
/**
*
*
* @param infoHiComment
* @return
*/
public int insertInfoHiComment(InfoHiComment infoHiComment);
/**
*
*
* @param infoHiComment
* @return
*/
public int updateInfoHiComment(InfoHiComment infoHiComment);
/**
*
*
* @param id
* @return
*/
public int deleteInfoHiCommentById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteInfoHiCommentByIds(Long[] ids);
}

@ -1,61 +0,0 @@
package com.huacai.infoHiComment.service;
import java.util.List;
import com.huacai.infoHiComment.domain.InfoHiComment;
/**
* Service
*
* @author huacai
* @date 2024-03-11
*/
public interface IInfoHiCommentService
{
/**
*
*
* @param id
* @return
*/
public InfoHiComment selectInfoHiCommentById(Long id);
/**
*
*
* @param infoHiComment
* @return
*/
public List<InfoHiComment> selectInfoHiCommentList(InfoHiComment infoHiComment);
/**
*
*
* @param infoHiComment
* @return
*/
public int insertInfoHiComment(InfoHiComment infoHiComment);
/**
*
*
* @param infoHiComment
* @return
*/
public int updateInfoHiComment(InfoHiComment infoHiComment);
/**
*
*
* @param ids
* @return
*/
public int deleteInfoHiCommentByIds(Long[] ids);
/**
*
*
* @param id
* @return
*/
public int deleteInfoHiCommentById(Long id);
}

@ -1,96 +0,0 @@
package com.huacai.infoHiComment.service.impl;
import java.util.List;
import com.huacai.common.utils.DateUtils;
import org.springframework.stereotype.Service;
import com.huacai.infoHiComment.mapper.InfoHiCommentMapper;
import com.huacai.infoHiComment.domain.InfoHiComment;
import com.huacai.infoHiComment.service.IInfoHiCommentService;
import javax.annotation.Resource;
/**
* Service
*
* @author huacai
* @date 2024-03-11
*/
@Service
public class InfoHiCommentServiceImpl implements IInfoHiCommentService
{
@Resource
private InfoHiCommentMapper infoHiCommentMapper;
/**
*
*
* @param id
* @return
*/
@Override
public InfoHiComment selectInfoHiCommentById(Long id)
{
return infoHiCommentMapper.selectInfoHiCommentById(id);
}
/**
*
*
* @param infoHiComment
* @return
*/
@Override
public List<InfoHiComment> selectInfoHiCommentList(InfoHiComment infoHiComment)
{
return infoHiCommentMapper.selectInfoHiCommentList(infoHiComment);
}
/**
*
*
* @param infoHiComment
* @return
*/
@Override
public int insertInfoHiComment(InfoHiComment infoHiComment)
{
infoHiComment.setCreateTime(DateUtils.getNowDate());
return infoHiCommentMapper.insertInfoHiComment(infoHiComment);
}
/**
*
*
* @param infoHiComment
* @return
*/
@Override
public int updateInfoHiComment(InfoHiComment infoHiComment)
{
return infoHiCommentMapper.updateInfoHiComment(infoHiComment);
}
/**
*
*
* @param ids
* @return
*/
@Override
public int deleteInfoHiCommentByIds(Long[] ids)
{
return infoHiCommentMapper.deleteInfoHiCommentByIds(ids);
}
/**
*
*
* @param id
* @return
*/
@Override
public int deleteInfoHiCommentById(Long id)
{
return infoHiCommentMapper.deleteInfoHiCommentById(id);
}
}

@ -1,127 +0,0 @@
package com.huacai.infoQingJia.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import com.huacai.common.utils.SecurityUtils;
import com.huacai.infoRunTaskData.domain.InfoRunTaskData;
import com.huacai.infoRunTaskData.service.IInfoRunTaskDataService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.huacai.common.annotation.Log;
import com.huacai.common.core.controller.BaseController;
import com.huacai.common.core.domain.AjaxResult;
import com.huacai.common.enums.BusinessType;
import com.huacai.infoQingJia.domain.InfoQingJia;
import com.huacai.infoQingJia.service.IInfoQingJiaService;
import com.huacai.common.utils.poi.ExcelUtil;
import com.huacai.common.core.page.TableDataInfo;
/**
* Controller
*
* @author huacai
* @date 2024-02-22
*/
@RestController
@RequestMapping("/infoQingJia/infoQingJia")
public class InfoQingJiaController extends BaseController {
@Resource
private IInfoQingJiaService infoQingJiaService;
@Resource
private IInfoRunTaskDataService iInfoRunTaskDataService;
/**
*
*/
@PreAuthorize("@ss.hasPermi('infoQingJia:infoQingJia:list')")
@GetMapping("/list")
public TableDataInfo list(InfoQingJia infoQingJia) {
startPage();
List<InfoQingJia> list = infoQingJiaService.selectInfoQingJiaList(infoQingJia);
return getDataTable(list);
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('infoQingJia:infoQingJia:export')")
@Log(title = "请假", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, InfoQingJia infoQingJia) {
List<InfoQingJia> list = infoQingJiaService.selectInfoQingJiaList(infoQingJia);
ExcelUtil<InfoQingJia> util = new ExcelUtil<InfoQingJia>(InfoQingJia.class);
util.exportExcel(response, list, "请假数据");
}
/**
*
*/
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Long id) {
return success(infoQingJiaService.selectInfoQingJiaById(id));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('infoQingJia:infoQingJia:add')")
@Log(title = "请假", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody InfoQingJia infoQingJia) {
infoQingJia.setUserId(getUserId());
int i = infoQingJiaService.insertInfoQingJia(infoQingJia);
//向流程业务表中加入数据
InfoRunTaskData infoRunTaskData = new InfoRunTaskData();
infoRunTaskData.setBusinessKey(String.valueOf(infoQingJia.getId()));
infoRunTaskData.setBusinessType(1);
infoRunTaskData.setBusinessTitle(infoQingJia.getQingJiaTitle());
infoRunTaskData.setApplyUser(SecurityUtils.getLoginUser().getUser().getNickName());//申请人
iInfoRunTaskDataService.insertInfoRunTaskData(infoRunTaskData);
return toAjax(i);
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('infoQingJia:infoQingJia:edit')")
@Log(title = "请假", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody InfoQingJia infoQingJia) {
//修改业务中间表关系数据
InfoRunTaskData infoRunTaskData = new InfoRunTaskData();
infoRunTaskData.setBusinessTitle(infoQingJia.getQingJiaTitle());
infoRunTaskData.setBusinessKey(String.valueOf(infoQingJia.getId()));
infoRunTaskData.setBusinessType(1);
iInfoRunTaskDataService.updateInfoRunTaskData(infoRunTaskData);
return toAjax(infoQingJiaService.updateInfoQingJia(infoQingJia));
}
/**
*
*/
@PreAuthorize("@ss.hasPermi('infoQingJia:infoQingJia:remove')")
@Log(title = "请假", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Long[] ids) {
//同时删除业务关系数据
for (Long id : ids) {
InfoQingJia infoQingJia = infoQingJiaService.selectInfoQingJiaById(id);
iInfoRunTaskDataService.deleteData(String.valueOf(infoQingJia.getId()), 1);
}
return toAjax(infoQingJiaService.deleteInfoQingJiaByIds(ids));
}
}

@ -1,135 +0,0 @@
package com.huacai.infoQingJia.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.huacai.common.annotation.Excel;
import com.huacai.common.core.domain.BaseEntity;
/**
* info_qing_jia
*
* @author huacai
* @date 2024-02-22
*/
public class InfoQingJia extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* $column.columnComment
*/
private Long id;
/**
*
*/
@Excel(name = "请假标题")
private String qingJiaTitle;
/**
*
*/
@Excel(name = "请假原因")
private String qingJiaReason;
/**
*
*/
@Excel(name = "请假天数")
private Long qingJiaDay;
/**
*
*/
@Excel(name = "请假人")
private Long userId;
/**
*
*/
private String nickName;
/**
*
*/
private Integer processStatus;
/**
* id
*/
private String processInstanceId;
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
}
public Integer getProcessStatus() {
return processStatus;
}
public void setProcessStatus(Integer processStatus) {
this.processStatus = processStatus;
}
public void setId(Long id) {
this.id = id;
}
public Long getId() {
return id;
}
public void setQingJiaTitle(String qingJiaTitle) {
this.qingJiaTitle = qingJiaTitle;
}
public String getQingJiaTitle() {
return qingJiaTitle;
}
public void setQingJiaReason(String qingJiaReason) {
this.qingJiaReason = qingJiaReason;
}
public String getQingJiaReason() {
return qingJiaReason;
}
public void setQingJiaDay(Long qingJiaDay) {
this.qingJiaDay = qingJiaDay;
}
public Long getQingJiaDay() {
return qingJiaDay;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Long getUserId() {
return userId;
}
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("qingJiaTitle", getQingJiaTitle())
.append("qingJiaReason", getQingJiaReason())
.append("qingJiaDay", getQingJiaDay())
.append("userId", getUserId())
.toString();
}
}

@ -1,61 +0,0 @@
package com.huacai.infoQingJia.mapper;
import java.util.List;
import com.huacai.infoQingJia.domain.InfoQingJia;
/**
* Mapper
*
* @author huacai
* @date 2024-02-22
*/
public interface InfoQingJiaMapper
{
/**
*
*
* @param id
* @return
*/
public InfoQingJia selectInfoQingJiaById(Long id);
/**
*
*
* @param infoQingJia
* @return
*/
public List<InfoQingJia> selectInfoQingJiaList(InfoQingJia infoQingJia);
/**
*
*
* @param infoQingJia
* @return
*/
public int insertInfoQingJia(InfoQingJia infoQingJia);
/**
*
*
* @param infoQingJia
* @return
*/
public int updateInfoQingJia(InfoQingJia infoQingJia);
/**
*
*
* @param id
* @return
*/
public int deleteInfoQingJiaById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteInfoQingJiaByIds(Long[] ids);
}

@ -1,61 +0,0 @@
package com.huacai.infoQingJia.service;
import java.util.List;
import com.huacai.infoQingJia.domain.InfoQingJia;
/**
* Service
*
* @author huacai
* @date 2024-02-22
*/
public interface IInfoQingJiaService
{
/**
*
*
* @param id
* @return
*/
public InfoQingJia selectInfoQingJiaById(Long id);
/**
*
*
* @param infoQingJia
* @return
*/
public List<InfoQingJia> selectInfoQingJiaList(InfoQingJia infoQingJia);
/**
*
*
* @param infoQingJia
* @return
*/
public int insertInfoQingJia(InfoQingJia infoQingJia);
/**
*
*
* @param infoQingJia
* @return
*/
public int updateInfoQingJia(InfoQingJia infoQingJia);
/**
*
*
* @param ids
* @return
*/
public int deleteInfoQingJiaByIds(Long[] ids);
/**
*
*
* @param id
* @return
*/
public int deleteInfoQingJiaById(Long id);
}

@ -1,87 +0,0 @@
package com.huacai.infoQingJia.service.impl;
import com.huacai.infoQingJia.domain.InfoQingJia;
import com.huacai.infoQingJia.mapper.InfoQingJiaMapper;
import com.huacai.infoQingJia.service.IInfoQingJiaService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* Service
*
* @author huacai
* @date 2024-02-22
*/
@Service
public class InfoQingJiaServiceImpl implements IInfoQingJiaService {
@Resource
private InfoQingJiaMapper infoQingJiaMapper;
/**
*
*
* @param id
* @return
*/
@Override
public InfoQingJia selectInfoQingJiaById(Long id) {
return infoQingJiaMapper.selectInfoQingJiaById(id);
}
/**
*
*
* @param infoQingJia
* @return
*/
@Override
public List<InfoQingJia> selectInfoQingJiaList(InfoQingJia infoQingJia) {
return infoQingJiaMapper.selectInfoQingJiaList(infoQingJia);
}
/**
*
*
* @param infoQingJia
* @return
*/
@Override
public int insertInfoQingJia(InfoQingJia infoQingJia) {
return infoQingJiaMapper.insertInfoQingJia(infoQingJia);
}
/**
*
*
* @param infoQingJia
* @return
*/
@Override
public int updateInfoQingJia(InfoQingJia infoQingJia) {
return infoQingJiaMapper.updateInfoQingJia(infoQingJia);
}
/**
*
*
* @param ids
* @return
*/
@Override
public int deleteInfoQingJiaByIds(Long[] ids) {
return infoQingJiaMapper.deleteInfoQingJiaByIds(ids);
}
/**
*
*
* @param id
* @return
*/
@Override
public int deleteInfoQingJiaById(Long id) {
return infoQingJiaMapper.deleteInfoQingJiaById(id);
}
}

@ -1,140 +0,0 @@
package com.huacai.infoRunTaskData.domain;
import com.huacai.common.annotation.Excel;
import com.huacai.common.core.domain.BaseEntity;
import java.util.Date;
/**
* info_run_task_data
*
* @author huacai
* @date 2024-02-22
*/
public class InfoRunTaskData extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private Long id;
/** 业务businessId */
@Excel(name = "业务businessId")
private String businessKey;
/** 业务类型 */
@Excel(name = "业务类型")
private Integer businessType;
/** 业务标题 */
@Excel(name = "业务标题")
private String businessTitle;
/** 流程实例id */
@Excel(name = "流程实例id")
private String processInstanceId;
public Integer getProcessStatus() {
return processStatus;
}
public void setProcessStatus(Integer processStatus) {
this.processStatus = processStatus;
}
/** 流程状态 默认1 */
@Excel(name = "流程状态 默认1")
private Integer processStatus;
private String applyUser;//申请人
private Date applyTime;//发起申请时间
private String userIds;
public String getUserIds() {
return userIds;
}
public void setUserIds(String userIds) {
this.userIds = userIds;
}
public String getApplyUser() {
return applyUser;
}
public void setApplyUser(String applyUser) {
this.applyUser = applyUser;
}
public Date getApplyTime() {
return applyTime;
}
public void setApplyTime(Date applyTime) {
this.applyTime = applyTime;
}
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setBusinessKey(String businessKey)
{
this.businessKey = businessKey;
}
public String getBusinessKey()
{
return businessKey;
}
public Integer getBusinessType() {
return businessType;
}
public void setBusinessType(Integer businessType) {
this.businessType = businessType;
}
public void setBusinessTitle(String businessTitle)
{
this.businessTitle = businessTitle;
}
public String getBusinessTitle()
{
return businessTitle;
}
public void setProcessInstanceId(String processInstanceId)
{
this.processInstanceId = processInstanceId;
}
public String getProcessInstanceId()
{
return processInstanceId;
}
@Override
public String toString() {
return "InfoRunTaskData{" +
"id=" + id +
", businessKey=" + businessKey +
", businessType=" + businessType +
", businessTitle='" + businessTitle + '\'' +
", processInstanceId='" + processInstanceId + '\'' +
", processStatus=" + processStatus +
", applyUser='" + applyUser + '\'' +
", applyTime=" + applyTime +
", userIds=" + userIds +
'}';
}
}

@ -1,88 +0,0 @@
package com.huacai.infoRunTaskData.mapper;
import java.util.List;
import com.huacai.infoRunTaskData.domain.InfoRunTaskData;
import org.apache.ibatis.annotations.Param;
/**
* Mapper
*
* @author huacai
* @date 2024-02-22
*/
public interface InfoRunTaskDataMapper
{
/**
*
*
* @param id
* @return
*/
public InfoRunTaskData selectInfoRunTaskDataById(Long id);
/**
*
*
* @param infoRunTaskData
* @return
*/
public List<InfoRunTaskData> selectInfoRunTaskDataList(InfoRunTaskData infoRunTaskData);
/**
*
*
* @param infoRunTaskData
* @return
*/
public int insertInfoRunTaskData(InfoRunTaskData infoRunTaskData);
/**
*
*
* @param infoRunTaskData
* @return
*/
public int updateInfoRunTaskData(InfoRunTaskData infoRunTaskData);
/**
* ()
* @param infoRunTaskData
* @return
*/
public int updateInfoRunTaskDatas(InfoRunTaskData infoRunTaskData);
/**
*
*
* @param id
* @return
*/
public int deleteInfoRunTaskDataById(Long id);
/**
*
*
* @param ids
* @return
*/
public int deleteInfoRunTaskDataByIds(Long[] ids);
/**
*
* @param businessKey
* @param businessType
* @return
*/
public InfoRunTaskData selectDetailInfo(@Param("businessKey") String businessKey,
@Param("businessType") Integer businessType);
/**
*
* @param businessKey
* @param businessType
*/
void deleteData(@Param("businessKey") String businessKey,
@Param("businessType") Integer businessType);
}

@ -1,102 +0,0 @@
package com.huacai.infoRunTaskData.service;
import java.util.List;
import com.huacai.infoRunTaskData.domain.InfoRunTaskData;
/**
* Service
*
* @author huacai
* @date 2024-02-22
*/
public interface IInfoRunTaskDataService
{
/**
*
*
* @param id
* @return
*/
public InfoRunTaskData selectInfoRunTaskDataById(Long id);
/**
*
*
* @param infoRunTaskData
* @return
*/
public List<InfoRunTaskData> selectInfoRunTaskDataList(InfoRunTaskData infoRunTaskData);
/**
*
*
* @param infoRunTaskData
* @return
*/
public int insertInfoRunTaskData(InfoRunTaskData infoRunTaskData);
/**
*
*
* @param infoRunTaskData
* @return
*/
public int updateInfoRunTaskData(InfoRunTaskData infoRunTaskData);
/**
* ()
*
* @param infoRunTaskData
* @return
*/
int updateInfoRunTaskDatas(InfoRunTaskData infoRunTaskData);
/**
*
*
* @param ids
* @return
*/
public int deleteInfoRunTaskDataByIds(Long[] ids);
/**
*
*
* @param id
* @return
*/
public int deleteInfoRunTaskDataById(Long id);
/**
*
* @param businessKey
* @param businessType
* @return
*/
public InfoRunTaskData selectDetailInfo(String businessKey,Integer businessType);
/**
*
* @param businessKey
* @param businessType
* @param status
*/
public void updateStatus(String businessKey,Integer businessType,Integer status);
/**
*
* @param businessKey
* @param businessType
* @param processInstanceId id
* @param status
*/
public void updateStatus(String businessKey,Integer businessType,Integer status,String processInstanceId);
/**
*
* @param businessKey
* @param businessType
*/
void deleteData(String businessKey,Integer businessType);
}

@ -1,141 +0,0 @@
package com.huacai.infoRunTaskData.service.impl;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.huacai.infoRunTaskData.mapper.InfoRunTaskDataMapper;
import com.huacai.infoRunTaskData.domain.InfoRunTaskData;
import com.huacai.infoRunTaskData.service.IInfoRunTaskDataService;
import org.springframework.transaction.annotation.Transactional;
/**
* Service
*
* @author huacai
* @date 2024-02-22
*/
@Service
public class InfoRunTaskDataServiceImpl implements IInfoRunTaskDataService {
@Autowired
private InfoRunTaskDataMapper infoRunTaskDataMapper;
/**
*
*
* @param id
* @return
*/
@Override
public InfoRunTaskData selectInfoRunTaskDataById(Long id) {
return infoRunTaskDataMapper.selectInfoRunTaskDataById(id);
}
/**
*
*
* @param infoRunTaskData
* @return
*/
@Override
public List<InfoRunTaskData> selectInfoRunTaskDataList(InfoRunTaskData infoRunTaskData) {
return infoRunTaskDataMapper.selectInfoRunTaskDataList(infoRunTaskData);
}
/**
*
*
* @param infoRunTaskData
* @return
*/
@Override
public int insertInfoRunTaskData(InfoRunTaskData infoRunTaskData) {
return infoRunTaskDataMapper.insertInfoRunTaskData(infoRunTaskData);
}
/**
*
*
* @param infoRunTaskData
* @return
*/
@Override
@Transactional
public int updateInfoRunTaskData(InfoRunTaskData infoRunTaskData) {
if (Objects.isNull(infoRunTaskData.getBusinessKey()) || Objects.isNull(infoRunTaskData.getBusinessType())) {
throw new RuntimeException("缺少必要参数");
}
InfoRunTaskData infoRunTaskData1 = infoRunTaskDataMapper.selectDetailInfo(infoRunTaskData.getBusinessKey(), infoRunTaskData.getBusinessType());
BeanUtils.copyProperties(infoRunTaskData, infoRunTaskData1);
return infoRunTaskDataMapper.updateInfoRunTaskData(infoRunTaskData1);
}
/**
* ()
* @param infoRunTaskData
* @return
*/
public int updateInfoRunTaskDatas(InfoRunTaskData infoRunTaskData) {
if (Objects.isNull(infoRunTaskData.getBusinessKey()) || Objects.isNull(infoRunTaskData.getBusinessType())) {
throw new RuntimeException("缺少必要参数");
}
InfoRunTaskData infoRunTaskData1 = infoRunTaskDataMapper.selectDetailInfo(infoRunTaskData.getBusinessKey(), infoRunTaskData.getBusinessType());
BeanUtils.copyProperties(infoRunTaskData, infoRunTaskData1);
return infoRunTaskDataMapper.updateInfoRunTaskDatas(infoRunTaskData1);
}
/**
*
*
* @param ids
* @return
*/
@Override
public int deleteInfoRunTaskDataByIds(Long[] ids) {
return infoRunTaskDataMapper.deleteInfoRunTaskDataByIds(ids);
}
/**
*
*
* @param id
* @return
*/
@Override
public int deleteInfoRunTaskDataById(Long id) {
return infoRunTaskDataMapper.deleteInfoRunTaskDataById(id);
}
@Override
public InfoRunTaskData selectDetailInfo(String businessKey, Integer businessType) {
return infoRunTaskDataMapper.selectDetailInfo(businessKey, businessType);
}
@Override
@Transactional
public void updateStatus(String businessKey, Integer businessType, Integer status) {
InfoRunTaskData infoRunTaskData = infoRunTaskDataMapper.selectDetailInfo(businessKey, businessType);
infoRunTaskData.setProcessStatus(status);
infoRunTaskDataMapper.updateInfoRunTaskData(infoRunTaskData);
}
@Override
public void updateStatus(String businessKey, Integer businessType, Integer status, String processInstanceId) {
InfoRunTaskData infoRunTaskData = infoRunTaskDataMapper.selectDetailInfo(businessKey, businessType);
infoRunTaskData.setProcessStatus(status);
infoRunTaskData.setProcessInstanceId(processInstanceId);
if (status.compareTo(2) == 0) {
//审核中的时候 修改申请时间
infoRunTaskData.setApplyTime(new Date());
}
infoRunTaskDataMapper.updateInfoRunTaskData(infoRunTaskData);
}
@Override
public void deleteData(String businessKey, Integer businessType) {
infoRunTaskDataMapper.deleteData(businessKey, businessType);
}
}

@ -1,81 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huacai.infoHiComment.mapper.InfoHiCommentMapper">
<resultMap type="InfoHiComment" id="InfoHiCommentResult">
<result property="id" column="id"/>
<result property="taskName" column="task_name"/>
<result property="message" column="message"/>
<result property="createTime" column="create_time"/>
<result property="createName" column="create_name"/>
<result property="processInstanceId" column="process_instance_id"/>
</resultMap>
<sql id="selectInfoHiCommentVo">
select id, task_name, message, create_time, create_name, process_instance_id
from info_hi_comment
</sql>
<select id="selectInfoHiCommentList" parameterType="InfoHiComment" resultMap="InfoHiCommentResult">
<include refid="selectInfoHiCommentVo"/>
<where>
<if test="taskName != null and taskName != ''">and task_name like concat('%', #{taskName}, '%')</if>
<if test="message != null and message != ''">and message = #{message}</if>
<if test="createName != null and createName != ''">and create_name like concat('%', #{createName}, '%')
</if>
<if test="processInstanceId != null and processInstanceId != ''">and process_instance_id =
#{processInstanceId}
</if>
</where>
</select>
<select id="selectInfoHiCommentById" parameterType="Long" resultMap="InfoHiCommentResult">
<include refid="selectInfoHiCommentVo"/>
where id = #{id}
</select>
<insert id="insertInfoHiComment" parameterType="InfoHiComment" useGeneratedKeys="true" keyProperty="id">
insert into info_hi_comment
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="taskName != null">task_name,</if>
<if test="message != null">message,</if>
<if test="createTime != null">create_time,</if>
<if test="createName != null">create_name,</if>
<if test="processInstanceId != null">process_instance_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="taskName != null">#{taskName},</if>
<if test="message != null">#{message},</if>
<if test="createTime != null">#{createTime},</if>
<if test="createName != null">#{createName},</if>
<if test="processInstanceId != null">#{processInstanceId},</if>
</trim>
</insert>
<update id="updateInfoHiComment" parameterType="InfoHiComment">
update info_hi_comment
<trim prefix="SET" suffixOverrides=",">
<if test="taskName != null">task_name = #{taskName},</if>
<if test="message != null">message = #{message},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="createName != null">create_name = #{createName},</if>
<if test="processInstanceId != null">process_instance_id = #{processInstanceId},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteInfoHiCommentById" parameterType="Long">
delete
from info_hi_comment
where id = #{id}
</delete>
<delete id="deleteInfoHiCommentByIds" parameterType="String">
delete from info_hi_comment where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

@ -1,98 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huacai.infoQingJia.mapper.InfoQingJiaMapper">
<resultMap type="InfoQingJia" id="InfoQingJiaResult">
<result property="id" column="id"/>
<result property="qingJiaTitle" column="qing_jia_title"/>
<result property="qingJiaReason" column="qing_jia_reason"/>
<result property="qingJiaDay" column="qing_jia_day"/>
<result property="userId" column="user_id"/>
<result property="processStatus" column="process_status"/>
<result property="processInstanceId" column="process_instance_id"/>
<result property="nickName" column="nick_name"/>
</resultMap>
<sql id="selectInfoQingJiaVo">
select id, qing_jia_title, qing_jia_reason, qing_jia_day, user_id
from info_qing_jia
</sql>
<select id="selectInfoQingJiaList" parameterType="InfoQingJia" resultMap="InfoQingJiaResult">
SELECT
t1.id,
t1.qing_jia_title,
t1.qing_jia_reason,
t1.qing_jia_day,
t1.user_id,
t2.process_status,
t2.process_instance_id
FROM
info_qing_jia t1
LEFT JOIN ( SELECT * FROM info_run_task_data WHERE business_type = 1 ) t2 ON t1.id = t2.business_key
<where>
<if test="qingJiaTitle != null and qingJiaTitle != ''">and qing_jia_title like concat('%', #{qingJiaTitle},
'%')
</if>
<if test="qingJiaReason != null and qingJiaReason != ''">and qing_jia_reason = #{qingJiaReason}</if>
<if test="qingJiaDay != null ">and qing_jia_day = #{qingJiaDay}</if>
<if test="userId != null ">and user_id = #{userId}</if>
</where>
</select>
<select id="selectInfoQingJiaById" parameterType="Long" resultMap="InfoQingJiaResult">
SELECT
t1.id,
t1.qing_jia_title,
t1.qing_jia_reason,
t1.qing_jia_day,
t1.user_id ,
t2.nick_name
FROM
info_qing_jia t1
LEFT JOIN sys_user t2 ON t1.user_id = t2.user_id
where t1.id = #{id}
</select>
<insert id="insertInfoQingJia" parameterType="InfoQingJia" useGeneratedKeys="true" keyProperty="id">
insert into info_qing_jia
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="qingJiaTitle != null and qingJiaTitle != ''">qing_jia_title,</if>
<if test="qingJiaReason != null and qingJiaReason != ''">qing_jia_reason,</if>
<if test="qingJiaDay != null">qing_jia_day,</if>
<if test="userId != null">user_id,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="qingJiaTitle != null and qingJiaTitle != ''">#{qingJiaTitle},</if>
<if test="qingJiaReason != null and qingJiaReason != ''">#{qingJiaReason},</if>
<if test="qingJiaDay != null">#{qingJiaDay},</if>
<if test="userId != null">#{userId},</if>
</trim>
</insert>
<update id="updateInfoQingJia" parameterType="InfoQingJia">
update info_qing_jia
<trim prefix="SET" suffixOverrides=",">
<if test="qingJiaTitle != null and qingJiaTitle != ''">qing_jia_title = #{qingJiaTitle},</if>
<if test="qingJiaReason != null and qingJiaReason != ''">qing_jia_reason = #{qingJiaReason},</if>
<if test="qingJiaDay != null">qing_jia_day = #{qingJiaDay},</if>
<if test="userId != null">user_id = #{userId},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteInfoQingJiaById" parameterType="Long">
delete
from info_qing_jia
where id = #{id}
</delete>
<delete id="deleteInfoQingJiaByIds" parameterType="String">
delete from info_qing_jia where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

@ -1,113 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huacai.infoRunTaskData.mapper.InfoRunTaskDataMapper">
<resultMap type="InfoRunTaskData" id="InfoRunTaskDataResult">
<result property="id" column="id" />
<result property="businessKey" column="business_key" />
<result property="businessType" column="business_type" />
<result property="businessTitle" column="business_title" />
<result property="processInstanceId" column="process_instance_id" />
<result property="processStatus" column="process_status" />
<result property="applyUser" column="apply_user" />
<result property="applyTime" column="apply_time" />
</resultMap>
<sql id="selectInfoRunTaskDataVo">
select id, business_key, business_type, business_title, process_instance_id, process_status, apply_user, apply_time from info_run_task_data
</sql>
<select id="selectInfoRunTaskDataList" parameterType="InfoRunTaskData" resultMap="InfoRunTaskDataResult">
<include refid="selectInfoRunTaskDataVo"/>
<where>
<if test="businessKey != null "> and business_key = #{businessKey}</if>
<if test="businessType != null "> and business_type = #{businessType}</if>
<if test="businessTitle != null and businessTitle != ''"> and business_title = #{businessTitle}</if>
<if test="processInstanceId != null and processInstanceId != ''"> and process_instance_id = #{processInstanceId}</if>
<if test="processStatus != null "> and process_status = #{processStatus}</if>
<if test="applyUser != null and applyUser != ''"> and apply_user = #{applyUser}</if>
<if test="applyTime != null "> and apply_time = #{applyTime}</if>
</where>
</select>
<select id="selectInfoRunTaskDataById" parameterType="Long" resultMap="InfoRunTaskDataResult">
<include refid="selectInfoRunTaskDataVo"/>
where id = #{id}
</select>
<select id="selectDetailInfo" resultType="com.huacai.infoRunTaskData.domain.InfoRunTaskData">
<include refid="selectInfoRunTaskDataVo"/>
where business_key = #{businessKey} and business_type=#{businessType}
</select>
<insert id="insertInfoRunTaskData" parameterType="InfoRunTaskData" useGeneratedKeys="true" keyProperty="id">
insert into info_run_task_data
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="businessKey != null">business_key,</if>
<if test="businessType != null">business_type,</if>
<if test="businessTitle != null">business_title,</if>
<if test="processInstanceId != null">process_instance_id,</if>
<if test="processStatus != null">process_status,</if>
<if test="applyUser != null">apply_user,</if>
<if test="applyTime != null">apply_time,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="businessKey != null">#{businessKey},</if>
<if test="businessType != null">#{businessType},</if>
<if test="businessTitle != null">#{businessTitle},</if>
<if test="processInstanceId != null">#{processInstanceId},</if>
<if test="processStatus != null">#{processStatus},</if>
<if test="applyUser != null">#{applyUser},</if>
<if test="applyTime != null">#{applyTime},</if>
</trim>
</insert>
<!--修改正在运行任务的业务数据-->
<update id="updateInfoRunTaskData" parameterType="InfoRunTaskData">
update info_run_task_data
<trim prefix="SET" suffixOverrides=",">
<if test="businessKey != null">business_key = #{businessKey},</if>
<if test="businessType != null">business_type = #{businessType},</if>
<if test="businessTitle != null">business_title = #{businessTitle},</if>
<if test="processInstanceId != null">process_instance_id = #{processInstanceId},</if>
<if test="processStatus != null">process_status = #{processStatus},</if>
<if test="applyUser != null">apply_user = #{applyUser},</if>
<if test="applyTime != null">apply_time = #{applyTime},</if>
</trim>
where id = #{id}
</update>
<!--修改正在运行任务的业务数据(用于修改业务)-->
<update id="updateInfoRunTaskDatas" parameterType="InfoRunTaskData">
update info_run_task_data
<trim prefix="SET" suffixOverrides=",">
<if test="businessKey != null">business_key = #{businessKey},</if>
<if test="businessType != null">business_type = #{businessType},</if>
<if test="businessTitle != null">business_title = #{businessTitle},</if>
<if test="processInstanceId != null">process_instance_id = #{processInstanceId},</if>
<if test="processStatus != null">process_status = #{processStatus},</if>
<if test="applyUser != null">apply_user = #{applyUser},</if>
<if test="applyTime != null">apply_time = #{applyTime},</if>
<if test="userIds != null">user_ids = #{userIds},</if>
</trim>
where business_key = #{businessKey}
</update>
<delete id="deleteInfoRunTaskDataById" parameterType="Long">
delete from info_run_task_data where id = #{id}
</delete>
<delete id="deleteInfoRunTaskDataByIds" parameterType="String">
delete from info_run_task_data where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<delete id="deleteData">
delete
from info_run_task_data
where business_key = #{businessKey}
and business_type = #{businessType}
</delete>
</mapper>

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huacai.activiti.mapper.MyTaskMapper">
<select id="selectMyTask" resultType="com.huacai.activiti.vo.MyTaskVo">
SELECT DISTINCT t1.ID_ as taskId,
t1.NAME_ as taskName,
t1.PROC_INST_ID_ as processInstanceId,
t2.business_key as businessKey,
t2.business_type as businessType,
t2.business_title as businessTitle,
t2.process_status as processStatus,
t2.apply_user as applyUser,
t2.user_ids as userIds,
t2.apply_time as applyTime,
t1.CREATE_TIME_ as createTaskTime,
t1.CLAIM_TIME_ AS claimTime
FROM act_ru_task t1
INNER JOIN ACT_RU_IDENTITYLINK I ON I.TASK_ID_ = t1.ID_
LEFT JOIN info_run_task_data t2 ON t1.PROC_INST_ID_ = t2.process_instance_id
WHERE (t1.ASSIGNEE_ = #{assignee} OR (t1.ASSIGNEE_ IS NULL
# AND I.TYPE_ = 'candidate' AND I.GROUP_ID_ = (SELECT
AND I.TYPE_ = 'candidate' AND I.GROUP_ID_ in (SELECT
sys_role.role_key
FROM
sys_user_role
INNER JOIN
sys_user
ON
sys_user_role.user_id = sys_user.user_id
INNER JOIN
sys_role
ON
sys_user_role.role_id = sys_role.role_id
WHERE
sys_user.user_id = #{assignee})
OR (I.USER_ID_ = #{assignee}
AND t1.CLAIM_TIME_ IS NULL AND I.TYPE_ = 'candidate'))
)
<if test="processStatus != null "> and process_status = #{processStatus}</if>
<if test="businessType != null "> and business_type = #{businessType}</if>
<if test="businessTitle != null and businessTitle != ''"> and business_title like concat('%', #{businessTitle}, '%')</if>
<if test="applyUser != null and applyUser != ''"> and apply_user like concat('%', #{applyUser}, '%')</if>
</select>
<select id="selectGroupTask" resultType="com.huacai.activiti.vo.MyTaskVo">
SELECT DISTINCT RES.ID_ AS taskId,
RES.NAME_ AS taskName,
RES.PROC_INST_ID_ AS processInstanceId,
t2.business_key AS businessKey,
t2.business_type AS businessType,
t2.business_title AS businessTitle,
t2.apply_user AS applyUser,
t2.apply_time AS applyTime,
RES.CREATE_TIME_ AS createTaskTime
FROM ACT_RU_TASK RES
INNER JOIN ACT_RU_IDENTITYLINK I ON I.TASK_ID_ = RES.ID_
INNER JOIN ACT_RE_PROCDEF D ON RES.PROC_DEF_ID_ = D.ID_
LEFT JOIN info_run_task_data t2 ON RES.PROC_INST_ID_ = t2.process_instance_id
WHERE RES.ASSIGNEE_ IS NULL
AND I.TYPE_ = 'candidate'
OR I.USER_ID_ = #{assignee}
AND RES.CLAIM_TIME_ IS NULL
ORDER BY RES.CREATE_TIME_ DESC
</select>
<select id="selectHistory" resultType="com.huacai.activiti.vo.HistoryVo">
SELECT task_name AS taskName,
create_time AS endTime,
create_name AS nickName,
message AS COMMENT
FROM `info_hi_comment`
WHERE process_instance_id = #{processInstanceId}
</select>
</mapper>

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huacai.activiti.mapper.MyProcessMapper">
<select id="listData" resultType="com.huacai.activiti.domain.DefineVo">
SELECT D.ID_ AS deploymentId,
D.NAME_ AS deploymentName,
P.ID_ AS processDefinitionId,
P.NAME_ AS processDefinitionName,
P.KEY_ AS processDefinitionKey,
P.VERSION_ AS processDefinitionVersion,
P.DEPLOYMENT_ID_ AS processDeploymentId,
D.CATEGORY_ AS processDefinitionType,
D.DEPLOY_TIME_ AS deployTime,
p.RESOURCE_NAME_ AS resourceName
FROM ACT_RE_DEPLOYMENT D
JOIN ACT_RE_PROCDEF P ON D.ID_ = P.DEPLOYMENT_ID_
<where>
<if test="processDefinitionType != null and processDefinitionType != ''"> and D.CATEGORY_ like concat('%', #{processDefinitionType}, '%')</if>
</where>
ORDER BY D.DEPLOY_TIME_ DESC
</select>
<select id="selectLastVersionProcessDefineKey" resultType="java.lang.String">
SELECT P.KEY_ AS processDefinitionKey
FROM ACT_RE_DEPLOYMENT D
JOIN ACT_RE_PROCDEF P ON D.ID_ = P.DEPLOYMENT_ID_
WHERE D.CATEGORY_ = #{processType}
ORDER BY D.DEPLOY_TIME_ DESC LIMIT 1
</select>
<delete id="deleteHisTaskById">
DELETE
FROM `act_hi_taskinst`
WHERE ID_ = #{id}
</delete>
<delete id="deleteHisTask">
DELETE
FROM `act_hi_taskinst`
WHERE PROC_INST_ID_ = #{processInstanceId}
AND TASK_DEF_KEY_ = #{taskDefKey}
</delete>
</mapper>

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huacai.activiti.mapper.UserMapper">
<select id="listUsersToWorkflow" resultType="com.huacai.activiti.domain.UserVo">
SELECT t1.user_id as userId,
t1.nick_name as nickName,
t2.dept_name as deptName
FROM `sys_user` t1
LEFT JOIN sys_dept t2 ON t1.dept_id = t2.dept_id
WHERE t1.del_flag = 0
</select>
<select id="queryAllSysRole" resultType="com.huacai.activiti.domain.RoleVo">
SELECT role_name as roleName,
role_key as roleKey
FROM `sys_role`
</select>
</mapper>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save