Browse Source

chore: workflow compose

master
wangxiang 2 years ago
parent
commit
8a94ba1e50
No known key found for this signature in database
GPG Key ID: 1BA7946AB6B232E4
  1. 5
      kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/util/AuthUtils.java
  2. 12
      kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/util/SecurityUtils.java
  3. 6
      kicc-platform/kicc-platform-api/kicc-workflow-api/src/main/java/com/cloud/kicc/workflow/api/constant/SqlConstants.java
  4. 2
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/cmd/RollBackUserTaskCmd.java
  5. 14
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/controller/WorkflowFormController.java
  6. 13
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/controller/WorkflowModelController.java
  7. 9
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/controller/WorkflowProcessController.java
  8. 9
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/controller/WorkflowTaskController.java
  9. 2
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/extension/controller/ActivityExtensionDataController.java
  10. 2
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/extension/controller/ActivityExtensionPropertyController.java
  11. 15
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/interceptor/ModelHandlerInterceptor.java
  12. 18
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/override/UiTenantProvider.java
  13. 2
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/override/jsonconverter/FlowableSequenceFlowJsonConverter.java
  14. 4
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/override/jsonconverter/FlowableStartEventJsonConverter.java
  15. 8
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/override/jsonconverter/FlowableUserTaskJsonConverter.java
  16. 23
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/parser/handler/ExtendUserTaskActivityBehavior.java
  17. 7
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/parser/handler/MultiInstanceHandler.java
  18. 22
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/service/impl/WorkflowModelServiceImpl.java
  19. 64
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/service/impl/WorkflowProcessServiceImpl.java
  20. 96
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/service/impl/WorkflowTaskServiceImpl.java
  21. 10
      kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/util/WorkflowUtil.java

5
kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/util/AuthUtils.java

@ -6,6 +6,7 @@ import lombok.SneakyThrows;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -65,4 +66,8 @@ public class AuthUtils {
return extractAndDecodeHeader(header); return extractAndDecodeHeader(header);
} }
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("123456"));
}
} }

12
kicc-common/kicc-common-security/src/main/java/com/cloud/kicc/common/security/util/SecurityUtils.java

@ -174,8 +174,16 @@ public class SecurityUtils {
return (T) user; return (T) user;
} }
public static void main(String[] args) { public String getTenantIdLike() {
System.out.println(new BCryptPasswordEncoder().encode("123456")); CasUser casUser = getCasUser();
if (casUser == null) return null;
return StrUtil.format("%{}%", casUser.getTenantId());
}
public String getTenantId() {
CasUser casUser = getCasUser();
if (casUser == null) return null;
return casUser.getTenantId();
} }
} }

6
kicc-platform/kicc-platform-api/kicc-workflow-api/src/main/java/com/cloud/kicc/workflow/api/constant/SqlConstants.java

@ -12,10 +12,10 @@ public interface SqlConstants {
String QUERY_ACT_HI_COMMENT= "select * from ACT_HI_COMMENT where TYPE_ like ? and TASK_ID_ = ? order by TIME_ desc"; String QUERY_ACT_HI_COMMENT= "select * from ACT_HI_COMMENT where TYPE_ like ? and TASK_ID_ = ? order by TIME_ desc";
String QUERY_USER_BY_ID = "select csu.id, csu.user_name userName, csu.nick_name nickName, csu.password, u.dept_id deptId, u.status from sys_user u join cas_sso_user_view csu on u.cas_user_id = csu.id where csu.id = ?"; String QUERY_USER_BY_ID = "select id, user_name userName, nick_name nickName, password, dept_id deptId, status from sso_enhanced_user_view where id = ? and tenant_id like ?";
String QUERY_USER_BY_DEPT_ID = "select csu.id, csu.user_name userName, csu.nick_name nickName, csu.password, u.dept_id deptId, u.status from sys_user u join cas_sso_user_view csu on u.cas_user_id = csu.id where u.dept_id = ?"; String QUERY_USER_BY_DEPT_ID = "select id, user_name userName, nick_name nickName, password, dept_id deptId, status from sso_enhanced_user_view where u.dept_id = ? and tenant_id like ?";
String QUERY_USER_BY_ROLE_ID = "select distinct csu.id, csu.user_name userName, csu.nick_name nickName, csu.password, u.dept_id deptId, u.status from sys_user u join cas_sso_user_view csu on u.cas_user_id = csu.id join sys_user_role b on csu.id = b.user_id where b.role_id = ?"; String QUERY_USER_BY_ROLE_ID = "select distinct id, user_name userName, nick_name nickName, password, dept_id deptId, status from sso_enhanced_user_view u join sys_user_role r on u.id = r.user_id where r.role_id = ? and u.tenant_id like ?";
} }

2
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/cmd/RollBackUserTaskCmd.java

@ -50,7 +50,7 @@ public class RollBackUserTaskCmd implements Command<String>, Serializable {
@Override @Override
public String execute(CommandContext commandContext) { public String execute(CommandContext commandContext) {
if (targetActivityId == null || targetActivityId.length() == 0) { if (targetActivityId == null || targetActivityId.isEmpty()) {
throw new FlowableException("targetActivityId不能为空"); throw new FlowableException("targetActivityId不能为空");
} }
TaskEntity task = CommandContextUtil.getTaskService().getTask(taskId); TaskEntity task = CommandContextUtil.getTaskService().getTask(taskId);

14
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/controller/WorkflowFormController.java

@ -10,6 +10,7 @@ import com.cloud.kicc.workflow.api.entity.Workflow;
import com.cloud.kicc.workflow.service.WorkflowTaskService; import com.cloud.kicc.workflow.service.WorkflowTaskService;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.StartEvent; import org.flowable.bpmn.model.StartEvent;
@ -36,6 +37,7 @@ import java.util.Map;
* @Author: wangxiang4 * @Author: wangxiang4
* @Date: 2022/1/4 * @Date: 2022/1/4
*/ */
@Slf4j
@RestController @RestController
@RequestMapping(AppConstants.APP_WORKFLOW + "/form") @RequestMapping(AppConstants.APP_WORKFLOW + "/form")
@AllArgsConstructor @AllArgsConstructor
@ -88,7 +90,9 @@ public class WorkflowFormController {
// 指定下一步处理人 // 指定下一步处理人
if(StringUtils.isNotBlank(assignee)){ if(StringUtils.isNotBlank(assignee)){
Task task = taskService.createTaskQuery().processInstanceId(processInsId).active().singleResult(); Task task = taskService.createTaskQuery()
.processInstanceId(processInsId)
.taskTenantIdLike(SecurityUtils.getTenantIdLike()).active().singleResult();
if(task != null){ if(task != null){
taskService.setAssignee(task.getId(), assignee); taskService.setAssignee(task.getId(), assignee);
} }
@ -141,7 +145,9 @@ public class WorkflowFormController {
// 指定下一步处理人 // 指定下一步处理人
if(StringUtils.isNotBlank(assignee)){ if(StringUtils.isNotBlank(assignee)){
Task task = taskService.createTaskQuery().processInstanceId(processInsId).active().singleResult(); Task task = taskService.createTaskQuery()
.processInstanceId(processInsId)
.taskTenantIdLike(SecurityUtils.getTenantIdLike()).active().singleResult();
if(task != null){ if(task != null){
taskService.setAssignee(task.getId(), assignee); taskService.setAssignee(task.getId(), assignee);
} }
@ -180,7 +186,7 @@ public class WorkflowFormController {
formPropertyMap.put("readable", true); formPropertyMap.put("readable", true);
list.add(formPropertyMap); list.add(formPropertyMap);
} }
}catch (Exception e){ e.printStackTrace(); } }catch (Exception e){ log.error("An error occurred", e); }
} }
}else{ }else{
List<FormProperty> formPropertyList = formService.getStartFormData(processDefId).getFormProperties(); List<FormProperty> formPropertyList = formService.getStartFormData(processDefId).getFormProperties();
@ -196,7 +202,7 @@ public class WorkflowFormController {
formPropertyMap.put("readable", true); formPropertyMap.put("readable", true);
list.add(formPropertyMap); list.add(formPropertyMap);
} }
}catch (Exception e){ e.printStackTrace(); } }catch (Exception e){ log.error("An error occurred", e); }
} }
} }
return R.ok(list); return R.ok(list);

13
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/controller/WorkflowModelController.java

@ -39,10 +39,9 @@ import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.text.ParseException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.UUID; import java.util.UUID;
@ -82,11 +81,13 @@ public class WorkflowModelController {
IPage<WorkflowModel> result = workflowModelService.page(page, getLambdaQueryWrapper(workflowModel)); IPage<WorkflowModel> result = workflowModelService.page(page, getLambdaQueryWrapper(workflowModel));
// 存储流程实例 // 存储流程实例
result.getRecords().forEach(item -> { result.getRecords().forEach(item -> {
List<String> modelKeyList = StrUtil.split(item.getModelKey(), new Character(',')); List<String> modelKeyList = StrUtil.split(item.getModelKey(), ',');
ProcessDefinition processDefinition = workflowProcessService.getProcessDefinitionByKey(modelKeyList.get(0)); ProcessDefinition processDefinition = workflowProcessService.getProcessDefinitionByKey(modelKeyList.get(0));
if(processDefinition != null){ if(processDefinition != null){
String deploymentId = processDefinition.getDeploymentId(); String deploymentId = processDefinition.getDeploymentId();
Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(deploymentId).singleResult(); Deployment deployment = repositoryService.createDeploymentQuery()
.deploymentId(deploymentId)
.deploymentTenantIdLike(com.cloud.kicc.common.security.util.SecurityUtils.getTenantIdLike()).singleResult();
item.setProcessDefinition(new ProcessDefinitionInfoVo() item.setProcessDefinition(new ProcessDefinitionInfoVo()
.setId(processDefinition.getId()) .setId(processDefinition.getId())
.setCategory(processDefinition.getCategory()) .setCategory(processDefinition.getCategory())
@ -113,7 +114,7 @@ public class WorkflowModelController {
/** 删除模型 */ /** 删除模型 */
@DeleteMapping("/remove/{ids}") @DeleteMapping("/remove/{ids}")
public R remove(@PathVariable String[] ids) { public R remove(@PathVariable String[] ids) {
Arrays.asList(ids).forEach(id -> workflowModelService.remove(id)); Arrays.asList(ids).forEach(workflowModelService::remove);
return R.ok("删除成功"); return R.ok("删除成功");
} }
@ -214,7 +215,7 @@ public class WorkflowModelController {
/** 修改模型 */ /** 修改模型 */
private ModelRepresentation updateModel(Model model, MultiValueMap<String, String> values, boolean forceNewVersion) { private ModelRepresentation updateModel(Model model, MultiValueMap<String, String> values, boolean forceNewVersion) {
String name = values.getFirst("name"), String name = values.getFirst("name"),
key = values.getFirst("key").replaceAll(" ", ""), key = Objects.requireNonNull(values.getFirst("key")).replaceAll(" ", ""),
description = values.getFirst("description"), description = values.getFirst("description"),
isNewVersionString = values.getFirst("newVersion"), isNewVersionString = values.getFirst("newVersion"),
newVersionComment = null; newVersionComment = null;

9
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/controller/WorkflowProcessController.java

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cloud.kicc.common.core.api.R; import com.cloud.kicc.common.core.api.R;
import com.cloud.kicc.common.core.constant.AppConstants; import com.cloud.kicc.common.core.constant.AppConstants;
import com.cloud.kicc.common.security.util.SecurityUtils;
import com.cloud.kicc.workflow.api.entity.Workflow; import com.cloud.kicc.workflow.api.entity.Workflow;
import com.cloud.kicc.workflow.api.enums.ExtendMessage; import com.cloud.kicc.workflow.api.enums.ExtendMessage;
import com.cloud.kicc.workflow.api.extension.entity.WorkflowCopy; import com.cloud.kicc.workflow.api.extension.entity.WorkflowCopy;
@ -123,7 +124,7 @@ public class WorkflowProcessController {
/** 删除部署的流程 */ /** 删除部署的流程 */
@DeleteMapping("/removeDeployment/{deploymentIds}") @DeleteMapping("/removeDeployment/{deploymentIds}")
public R removeDeployment(@PathVariable String[] deploymentIds) { public R removeDeployment(@PathVariable String[] deploymentIds) {
Arrays.asList(deploymentIds).forEach(id -> workflowProcessService.deleteDeployment(id)); Arrays.asList(deploymentIds).forEach(workflowProcessService::deleteDeployment);
return R.ok("删除成功"); return R.ok("删除成功");
} }
@ -174,7 +175,9 @@ public class WorkflowProcessController {
// 指定下一步处理人,不设置就使用默认处理人 // 指定下一步处理人,不设置就使用默认处理人
if (StringUtils.isNotBlank(workflow.getAssignee())) { if (StringUtils.isNotBlank(workflow.getAssignee())) {
Task task = taskService.createTaskQuery().processInstanceId(processInsId).active().singleResult(); Task task = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).active().singleResult();
if (task != null) { if (task != null) {
taskService.setAssignee(task.getId(), workflow.getAssignee()); taskService.setAssignee(task.getId(), workflow.getAssignee());
} }
@ -189,7 +192,7 @@ public class WorkflowProcessController {
historyService.deleteHistoricProcessInstance(id); historyService.deleteHistoricProcessInstance(id);
workflowCopyService.remove(new LambdaUpdateWrapper<WorkflowCopy>().eq(WorkflowCopy::getProcessInsId, id)); workflowCopyService.remove(new LambdaUpdateWrapper<WorkflowCopy>().eq(WorkflowCopy::getProcessInsId, id));
}); });
return R.ok("删除成功,流程实例ID=" + ids); return R.ok("删除成功,流程实例ID=" + Arrays.toString(ids));
} }
} }

9
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/controller/WorkflowTaskController.java

@ -17,6 +17,7 @@ import com.cloud.kicc.workflow.extension.service.ActivityExtensionPropertyServic
import com.cloud.kicc.workflow.service.WorkflowProcessService; import com.cloud.kicc.workflow.service.WorkflowProcessService;
import com.cloud.kicc.workflow.service.WorkflowTaskService; import com.cloud.kicc.workflow.service.WorkflowTaskService;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.HistoryService; import org.flowable.engine.HistoryService;
@ -37,6 +38,7 @@ import java.util.Map;
* @Author: wangxiang4 * @Author: wangxiang4
* @Date: 2022/1/4 * @Date: 2022/1/4
*/ */
@Slf4j
@RestController @RestController
@AllArgsConstructor @AllArgsConstructor
@RequestMapping(AppConstants.APP_WORKFLOW + "/task") @RequestMapping(AppConstants.APP_WORKFLOW + "/task")
@ -151,7 +153,9 @@ public class WorkflowTaskController {
workflowTaskService.auditTask(workflow); workflowTaskService.auditTask(workflow);
//指定下一步处理人 //指定下一步处理人
if(StringUtils.isNotBlank(workflow.getAssignee())){ if(StringUtils.isNotBlank(workflow.getAssignee())){
Task task = taskService.createTaskQuery().processInstanceId(workflow.getProcessInsId()).active().singleResult(); Task task = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(workflow.getProcessInsId()).active().singleResult();
if(task != null){ if(task != null){
taskService.setAssignee(task.getId(), workflow.getAssignee()); taskService.setAssignee(task.getId(), workflow.getAssignee());
} }
@ -171,6 +175,7 @@ public class WorkflowTaskController {
// 取得流程实例 // 取得流程实例
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).singleResult(); .processInstanceId(processInsId).singleResult();
if (processInstance == null) return R.error("流程已经结束"); if (processInstance == null) return R.error("流程已经结束");
@ -187,7 +192,7 @@ public class WorkflowTaskController {
historyService.deleteHistoricTaskInstance(currentTaskId); historyService.deleteHistoricTaskInstance(currentTaskId);
return R.ok("取回成功"); return R.ok("取回成功");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error("An error occurred", e);
return R.ok("流程取回失败,未知错误."); return R.ok("流程取回失败,未知错误.");
} }
} }

2
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/extension/controller/ActivityExtensionDataController.java

@ -60,7 +60,7 @@ public class ActivityExtensionDataController {
@DeleteMapping("/remove/{ids}") @DeleteMapping("/remove/{ids}")
public R remove(@PathVariable String[] ids) { public R remove(@PathVariable String[] ids) {
Arrays.asList(ids).forEach(id -> activityExtensionDataService.delete(id)); Arrays.asList(ids).forEach(activityExtensionDataService::delete);
return R.ok(); return R.ok();
} }

2
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/extension/controller/ActivityExtensionPropertyController.java

@ -47,7 +47,7 @@ public class ActivityExtensionPropertyController {
.remove(new LambdaUpdateWrapper<ActivityExtensionProperty>() .remove(new LambdaUpdateWrapper<ActivityExtensionProperty>()
.eq(ActivityExtensionProperty::getProcessDefId,taskExtensionProperty.getProcessDefId()) .eq(ActivityExtensionProperty::getProcessDefId,taskExtensionProperty.getProcessDefId())
.eq(ActivityExtensionProperty::getActivityDefId,taskExtensionProperty.getActivityDefId()))); .eq(ActivityExtensionProperty::getActivityDefId,taskExtensionProperty.getActivityDefId())));
activityExtensionPropertyList.forEach(taskExtensionProperty -> activityExtensionPropertyService.save(taskExtensionProperty)); activityExtensionPropertyList.forEach(activityExtensionPropertyService::save);
return R.ok(); return R.ok();
} }

15
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/interceptor/ModelHandlerInterceptor.java

@ -1,7 +1,9 @@
package com.cloud.kicc.workflow.interceptor; package com.cloud.kicc.workflow.interceptor;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.cloud.kicc.common.data.entity.CasUser;
import com.cloud.kicc.common.data.entity.KiccUser; import com.cloud.kicc.common.data.entity.KiccUser;
import io.micrometer.core.lang.NonNullApi;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.flowable.idm.api.User; import org.flowable.idm.api.User;
import org.flowable.idm.engine.impl.persistence.entity.UserEntityImpl; import org.flowable.idm.engine.impl.persistence.entity.UserEntityImpl;
@ -21,20 +23,21 @@ import javax.servlet.http.HttpServletResponse;
* @Author: wangxiang4 * @Author: wangxiang4
* @Date: 2022/1/6 * @Date: 2022/1/6
*/ */
@NonNullApi
public class ModelHandlerInterceptor implements HandlerInterceptor { public class ModelHandlerInterceptor implements HandlerInterceptor {
@SneakyThrows @SneakyThrows
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
KiccUser kiccUser = com.cloud.kicc.common.security.util.SecurityUtils.getUser(); CasUser casUser = com.cloud.kicc.common.security.util.SecurityUtils.getCasUser();
User currentUserObject = SecurityUtils.getCurrentUserObject(); User currentUserObject = SecurityUtils.getCurrentUserObject();
if (currentUserObject == null || StrUtil.isBlank(currentUserObject.getId())) { if (currentUserObject == null || StrUtil.isBlank(currentUserObject.getId())) {
User user = new UserEntityImpl(); User user = new UserEntityImpl();
user.setId(kiccUser.getId()); user.setId(casUser.getId());
user.setFirstName(kiccUser.getUsername()); user.setFirstName(casUser.getUsername());
user.setLastName(""); user.setLastName("");
user.setTenantId(kiccUser.getTenantId()); user.setTenantId(casUser.getTenantId());
user.setEmail(kiccUser.getEmail()); user.setEmail(casUser.getEmail());
user.setDisplayName(kiccUser.getNickName()); user.setDisplayName(casUser.getNickName());
SecurityUtils.assumeUser(user); SecurityUtils.assumeUser(user);
} }
return true; return true;

18
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/override/UiTenantProvider.java

@ -1,9 +1,8 @@
package com.cloud.kicc.workflow.override; package com.cloud.kicc.workflow.override;
import com.cloud.kicc.common.data.entity.KiccUser; import com.cloud.kicc.common.data.entity.CasUser;
import lombok.extern.slf4j.Slf4j;
import org.flowable.ui.common.tenant.TenantProvider; import org.flowable.ui.common.tenant.TenantProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -15,23 +14,22 @@ import org.springframework.stereotype.Component;
* @Author: wangxiang4 * @Author: wangxiang4
* @Since: 2023/9/27 * @Since: 2023/9/27
*/ */
@Slf4j
@Primary @Primary
@Component @Component
public class UiTenantProvider implements TenantProvider { public class UiTenantProvider implements TenantProvider {
private static final Logger LOGGER = LoggerFactory.getLogger(UiTenantProvider.class);
@Override @Override
public String getTenantId() { public String getTenantId() {
KiccUser kiccUser = com.cloud.kicc.common.security.util.SecurityUtils.getUser(); CasUser user = com.cloud.kicc.common.security.util.SecurityUtils.getCasUser();
if(kiccUser != null) { if(user != null) {
// quotes can help solve whitespace issues, trimming here would not // quotes can help solve whitespace issues, trimming here would not
// help solve the problem at source which is in user database // help solve the problem at source which is in user database
LOGGER.debug("Using user tenantId: '{}'", kiccUser.getTenantId()); log.debug("Using user tenantId: '{}'", user.getTenantId());
return kiccUser.getTenantId(); return user.getTenantId();
} }
LOGGER.debug("No tenantId"); log.debug("No tenantId");
return null; return null;
} }

2
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/override/jsonconverter/FlowableSequenceFlowJsonConverter.java

@ -38,7 +38,7 @@ public class FlowableSequenceFlowJsonConverter extends SequenceFlowJsonConverter
List<ActivityExtensionData> list = SpringContextHolderUtil.getBean(ActivityExtensionDataService.class) List<ActivityExtensionData> list = SpringContextHolderUtil.getBean(ActivityExtensionDataService.class)
.list(new LambdaQueryWrapper<ActivityExtensionData>().eq(ActivityExtensionData::getProcessDefId, procDefId) .list(new LambdaQueryWrapper<ActivityExtensionData>().eq(ActivityExtensionData::getProcessDefId, procDefId)
.eq(ActivityExtensionData::getActivityDefId, taskDefId)); .eq(ActivityExtensionData::getActivityDefId, taskDefId));
if (list.size() > 0) { if (!list.isEmpty()) {
ActivityExtensionData activityExtensionData = list.get(0); ActivityExtensionData activityExtensionData = list.get(0);
List<WorkflowCondition> workflowConditionList = SpringContextHolderUtil.getBean(ActivityExtensionDataService.class) List<WorkflowCondition> workflowConditionList = SpringContextHolderUtil.getBean(ActivityExtensionDataService.class)
.findById(activityExtensionData.getId()).getWorkflowConditionList(); .findById(activityExtensionData.getId()).getWorkflowConditionList();

4
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/override/jsonconverter/FlowableStartEventJsonConverter.java

@ -31,10 +31,10 @@ public class FlowableStartEventJsonConverter extends StartEventJsonConverter{
super.convertElementToJson (propertiesNode, baseElement); super.convertElementToJson (propertiesNode, baseElement);
if (baseElement instanceof StartEvent) { if (baseElement instanceof StartEvent) {
//读取自定义扩展属性 //读取自定义扩展属性
if (baseElement.getAttributes ().get ("formType") != null && baseElement.getAttributes ().get ("formType").size () > 0) { if (baseElement.getAttributes ().get ("formType") != null && !baseElement.getAttributes().get("formType").isEmpty()) {
propertiesNode.put ("formType", baseElement.getAttributes ().get ("formType").get (0).getValue ()); propertiesNode.put ("formType", baseElement.getAttributes ().get ("formType").get (0).getValue ());
} }
if (baseElement.getAttributes ().get ("formReadOnly") != null && baseElement.getAttributes ().get ("formReadOnly").size () > 0) { if (baseElement.getAttributes ().get ("formReadOnly") != null && !baseElement.getAttributes().get("formReadOnly").isEmpty()) {
propertiesNode.put ("formReadOnly", baseElement.getAttributes ().get ("formReadOnly").get (0).getValue ()); propertiesNode.put ("formReadOnly", baseElement.getAttributes ().get ("formReadOnly").get (0).getValue ());
} }
} }

8
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/override/jsonconverter/FlowableUserTaskJsonConverter.java

@ -113,10 +113,10 @@ public class FlowableUserTaskJsonConverter extends UserTaskJsonConverter {
super.convertElementToJson (propertiesNode, baseElement); super.convertElementToJson (propertiesNode, baseElement);
if (baseElement instanceof UserTask) { if (baseElement instanceof UserTask) {
//读取自定义扩展属性 //读取自定义扩展属性
if (baseElement.getAttributes ().get ("formType") != null && baseElement.getAttributes ().get ("formType").size () > 0) { if (baseElement.getAttributes ().get ("formType") != null && !baseElement.getAttributes().get("formType").isEmpty()) {
propertiesNode.put ("formType", baseElement.getAttributes ().get ("formType").get (0).getValue ()); propertiesNode.put ("formType", baseElement.getAttributes ().get ("formType").get (0).getValue ());
} }
if (baseElement.getAttributes ().get ("formReadOnly") != null && baseElement.getAttributes ().get ("formReadOnly").size () > 0) { if (baseElement.getAttributes ().get ("formReadOnly") != null && !baseElement.getAttributes().get("formReadOnly").isEmpty()) {
propertiesNode.put ("formReadOnly", baseElement.getAttributes ().get ("formReadOnly").get (0).getValue ()); propertiesNode.put ("formReadOnly", baseElement.getAttributes ().get ("formReadOnly").get (0).getValue ());
} }
@ -141,7 +141,7 @@ public class FlowableUserTaskJsonConverter extends UserTaskJsonConverter {
protected void addAssigneeProperties(List<ExtensionElement> elements, ObjectNode propertiesNode) { protected void addAssigneeProperties(List<ExtensionElement> elements, ObjectNode propertiesNode) {
if (elements.size () == 0) if (elements.isEmpty())
return; return;
ArrayNode propertiesArrayNode = objectMapper.createArrayNode (); ArrayNode propertiesArrayNode = objectMapper.createArrayNode ();
@ -170,7 +170,7 @@ public class FlowableUserTaskJsonConverter extends UserTaskJsonConverter {
} }
protected void addButtonProperties(List<ExtensionElement> elements, ObjectNode propertiesNode) { protected void addButtonProperties(List<ExtensionElement> elements, ObjectNode propertiesNode) {
if (elements.size () == 0) if (elements.isEmpty())
return; return;
ArrayNode propertiesArrayNode = objectMapper.createArrayNode (); ArrayNode propertiesArrayNode = objectMapper.createArrayNode ();

23
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/parser/handler/ExtendUserTaskActivityBehavior.java

@ -24,6 +24,7 @@ import org.flowable.task.service.TaskService;
import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.Types;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -43,7 +44,8 @@ public class ExtendUserTaskActivityBehavior extends UserTaskActivityBehavior {
super(userTask); super(userTask);
} }
@Override /** 处理分配任务处理人 */ /** 处理分配任务处理人 */
@Override
protected void handleAssignments(TaskService taskService, protected void handleAssignments(TaskService taskService,
String assignee, String assignee,
String owner, String owner,
@ -55,7 +57,7 @@ public class ExtendUserTaskActivityBehavior extends UserTaskActivityBehavior {
Process process = SpringContextHolderUtil.getBean(RepositoryService.class).getBpmnModel(task.getProcessDefinitionId()).getMainProcess(); Process process = SpringContextHolderUtil.getBean(RepositoryService.class).getBpmnModel(task.getProcessDefinitionId()).getMainProcess();
FlowElement flowElement = process.getFlowElement(task.getTaskDefinitionKey()); FlowElement flowElement = process.getFlowElement(task.getTaskDefinitionKey());
Boolean isMultiInstance = WorkflowUtil.isFlowElementMultiInstance(flowElement); boolean isMultiInstance = WorkflowUtil.isFlowElementMultiInstance(flowElement);
// 如果当前任务是多实例则移交给MultiInstanceHandler处理 // 如果当前任务是多实例则移交给MultiInstanceHandler处理
if(isMultiInstance){ if(isMultiInstance){
super.handleAssignments( super.handleAssignments(
@ -71,10 +73,10 @@ public class ExtendUserTaskActivityBehavior extends UserTaskActivityBehavior {
} }
List<ActivityExtensionData> list = SpringContextHolderUtil.getBean(ActivityExtensionDataService.class) List<ActivityExtensionData> list = SpringContextHolderUtil.getBean(ActivityExtensionDataService.class)
.list(new LambdaQueryWrapper<ActivityExtensionData>() .list(new LambdaQueryWrapper<ActivityExtensionData>()
.eq(ActivityExtensionData::getActivityDefId, task.getTaskDefinitionKey()) .eq(ActivityExtensionData::getActivityDefId, task.getTaskDefinitionKey())
.eq(ActivityExtensionData::getProcessDefId, process.getId())); .eq(ActivityExtensionData::getProcessDefId, process.getId()));
HashSet<String> candidateUserIds = new HashSet(); HashSet<String> candidateUserIds = new HashSet();
if (list.size () > 0) { if (!list.isEmpty()) {
ActivityExtensionData activityExtensionData = list.get(0); ActivityExtensionData activityExtensionData = list.get(0);
List<WorkflowAssignee> workflowAssigneeList = SpringContextHolderUtil.getBean(ActivityExtensionDataService.class) List<WorkflowAssignee> workflowAssigneeList = SpringContextHolderUtil.getBean(ActivityExtensionDataService.class)
.findById(activityExtensionData.getId()).getWorkflowAssigneeList(); .findById(activityExtensionData.getId()).getWorkflowAssigneeList();
@ -87,7 +89,7 @@ public class ExtendUserTaskActivityBehavior extends UserTaskActivityBehavior {
case "company": case "company":
// 获取公司下的人员进行候选 // 获取公司下的人员进行候选
if (StrUtil.isNotBlank(workflowAssignee.getValue())) { if (StrUtil.isNotBlank(workflowAssignee.getValue())) {
List<Map<String, Object>> userList = jdbcTemplate.queryForList(SqlConstants.QUERY_USER_BY_DEPT_ID, workflowAssignee.getValue()); List<Map<String, Object>> userList = jdbcTemplate.queryForList(SqlConstants.QUERY_USER_BY_DEPT_ID, workflowAssignee.getValue(), SecurityUtils.getTenantIdLike());
candidateUserIds.addAll(userList.stream().map(user -> MapUtil.getStr(user, "id")).collect(Collectors.toList())); candidateUserIds.addAll(userList.stream().map(user -> MapUtil.getStr(user, "id")).collect(Collectors.toList()));
} }
break; break;
@ -96,7 +98,7 @@ public class ExtendUserTaskActivityBehavior extends UserTaskActivityBehavior {
if (StrUtil.isNotBlank(workflowAssignee.getValue())) { if (StrUtil.isNotBlank(workflowAssignee.getValue())) {
String[] roleIds = workflowAssignee.getValue().split (","); String[] roleIds = workflowAssignee.getValue().split (",");
for(String roleId: roleIds){ for(String roleId: roleIds){
List<Map<String, Object>> userList = jdbcTemplate.queryForList(SqlConstants.QUERY_USER_BY_ROLE_ID, roleId); List<Map<String, Object>> userList = jdbcTemplate.queryForList(SqlConstants.QUERY_USER_BY_ROLE_ID, roleId, SecurityUtils.getTenantIdLike());
candidateUserIds.addAll(userList.stream().map(user -> MapUtil.getStr(user, "id")).collect(Collectors.toList())); candidateUserIds.addAll(userList.stream().map(user -> MapUtil.getStr(user, "id")).collect(Collectors.toList()));
} }
} }
@ -108,6 +110,7 @@ public class ExtendUserTaskActivityBehavior extends UserTaskActivityBehavior {
case "previousExecutor": case "previousExecutor":
// 查询上一个任务的处理人进行候选 // 查询上一个任务的处理人进行候选
HistoricTaskInstance historicTaskInstance = SpringContextHolderUtil.getBean(HistoryService.class).createHistoricTaskInstanceQuery() HistoricTaskInstance historicTaskInstance = SpringContextHolderUtil.getBean(HistoryService.class).createHistoricTaskInstanceQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(task.getProcessInstanceId()).finished() .processInstanceId(task.getProcessInstanceId()).finished()
.includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc().list().get(0); .includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc().list().get(0);
candidateUserIds.add(historicTaskInstance.getAssignee()); candidateUserIds.add(historicTaskInstance.getAssignee());
@ -118,7 +121,7 @@ public class ExtendUserTaskActivityBehavior extends UserTaskActivityBehavior {
break; break;
case "sql": case "sql":
// 查询sql中指定的id用户进行候选 // 查询sql中指定的id用户进行候选
Map<String, Object> user = jdbcTemplate.queryForMap(workflowAssignee.getValue()); Map<String, Object> user = jdbcTemplate.queryForMap(workflowAssignee.getValue(), new String[]{ SecurityUtils.getTenantIdLike() }, new int[]{ Types.VARCHAR });
candidateUserIds.add(MapUtil.getStr(user,"id")); candidateUserIds.add(MapUtil.getStr(user,"id"));
break; break;
case "custom": case "custom":
@ -129,7 +132,7 @@ public class ExtendUserTaskActivityBehavior extends UserTaskActivityBehavior {
} }
List<String> candidateIds = new ArrayList(candidateUserIds); List<String> candidateIds = new ArrayList(candidateUserIds);
// 此处可以根据业务逻辑自定义 // 此处可以根据业务逻辑自定义
if (candidateIds.size () == 0) { if (candidateIds.isEmpty()) {
super.handleAssignments( super.handleAssignments(
taskService, taskService,
null, null,
@ -149,7 +152,7 @@ public class ExtendUserTaskActivityBehavior extends UserTaskActivityBehavior {
task, task,
expressionManager, expressionManager,
execution); execution);
} else if (candidateIds.size () > 1) { } else {
super.handleAssignments( super.handleAssignments(
taskService, taskService,
null, null,

7
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/parser/handler/MultiInstanceHandler.java

@ -44,7 +44,7 @@ public class MultiInstanceHandler {
.eq(ActivityExtensionData::getActivityDefId, taskDefId) .eq(ActivityExtensionData::getActivityDefId, taskDefId)
.eq(ActivityExtensionData::getProcessDefId, process.getId())); .eq(ActivityExtensionData::getProcessDefId, process.getId()));
HashSet<String> candidateUserIds = new HashSet(); HashSet<String> candidateUserIds = new HashSet();
if (list.size () > 0) { if (!list.isEmpty()) {
ActivityExtensionData activityExtensionData = list.get(0); ActivityExtensionData activityExtensionData = list.get(0);
List<WorkflowAssignee> workflowAssigneeList = SpringContextHolderUtil.getBean(ActivityExtensionDataService.class) List<WorkflowAssignee> workflowAssigneeList = SpringContextHolderUtil.getBean(ActivityExtensionDataService.class)
.findById(activityExtensionData.getId()).getWorkflowAssigneeList(); .findById(activityExtensionData.getId()).getWorkflowAssigneeList();
@ -57,7 +57,7 @@ public class MultiInstanceHandler {
case "company": case "company":
// 获取公司下的人员进行候选 // 获取公司下的人员进行候选
if (StrUtil.isNotBlank(workflowAssignee.getValue())) { if (StrUtil.isNotBlank(workflowAssignee.getValue())) {
List<Map<String, Object>> userList = jdbcTemplate.queryForList(SqlConstants.QUERY_USER_BY_DEPT_ID, workflowAssignee.getValue()); List<Map<String, Object>> userList = jdbcTemplate.queryForList(SqlConstants.QUERY_USER_BY_DEPT_ID, workflowAssignee.getValue(), SecurityUtils.getTenantIdLike());
candidateUserIds.addAll(userList.stream().map(user -> MapUtil.getStr(user, "id")).collect(Collectors.toList())); candidateUserIds.addAll(userList.stream().map(user -> MapUtil.getStr(user, "id")).collect(Collectors.toList()));
} }
break; break;
@ -66,7 +66,7 @@ public class MultiInstanceHandler {
if (StrUtil.isNotBlank(workflowAssignee.getValue())) { if (StrUtil.isNotBlank(workflowAssignee.getValue())) {
String[] roleIds = workflowAssignee.getValue().split (","); String[] roleIds = workflowAssignee.getValue().split (",");
for(String roleId: roleIds){ for(String roleId: roleIds){
List<Map<String, Object>> userList = jdbcTemplate.queryForList(SqlConstants.QUERY_USER_BY_ROLE_ID, roleId); List<Map<String, Object>> userList = jdbcTemplate.queryForList(SqlConstants.QUERY_USER_BY_ROLE_ID, roleId, SecurityUtils.getTenantIdLike());
candidateUserIds.addAll(userList.stream().map(user -> MapUtil.getStr(user, "id")).collect(Collectors.toList())); candidateUserIds.addAll(userList.stream().map(user -> MapUtil.getStr(user, "id")).collect(Collectors.toList()));
} }
} }
@ -77,6 +77,7 @@ public class MultiInstanceHandler {
case "previousExecutor": case "previousExecutor":
// 查询上一个任务的处理人进行候选 // 查询上一个任务的处理人进行候选
HistoricTaskInstance historicTaskInstance = SpringContextHolderUtil.getBean(HistoryService.class).createHistoricTaskInstanceQuery() HistoricTaskInstance historicTaskInstance = SpringContextHolderUtil.getBean(HistoryService.class).createHistoricTaskInstanceQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(execution.getProcessInstanceId()).finished() .processInstanceId(execution.getProcessInstanceId()).finished()
.includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc().list().get(0); .includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc().list().get(0);
candidateUserIds.add(historicTaskInstance.getAssignee()); candidateUserIds.add(historicTaskInstance.getAssignee());

22
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/service/impl/WorkflowModelServiceImpl.java

@ -3,6 +3,7 @@ package com.cloud.kicc.workflow.service.impl;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cloud.kicc.common.security.util.SecurityUtils;
import com.cloud.kicc.workflow.api.entity.WorkflowModel; import com.cloud.kicc.workflow.api.entity.WorkflowModel;
import com.cloud.kicc.workflow.api.extension.entity.ActivityExtensionProperty; import com.cloud.kicc.workflow.api.extension.entity.ActivityExtensionProperty;
import com.cloud.kicc.workflow.extension.service.ActivityExtensionDataService; import com.cloud.kicc.workflow.extension.service.ActivityExtensionDataService;
@ -33,6 +34,7 @@ import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamReader;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
/** /**
@ -77,8 +79,8 @@ public class WorkflowModelServiceImpl extends ServiceImpl<WorkflowModelMapper, W
public void remove(String id) { public void remove(String id) {
Model model = modelService.getModel(id); Model model = modelService.getModel(id);
try { try {
List<String> modelKeyList = StrUtil.split(model.getKey(), new Character(',')); List<String> modelKeyList = StrUtil.split(model.getKey(), ',');
modelKeyList.forEach(modelKey -> this.deleteDeployment(modelKey)); modelKeyList.forEach(this::deleteDeployment);
this.modelService.deleteModel(model.getId()); this.modelService.deleteModel(model.getId());
activityExtensionDataService.deleteByProcessDefId(model.getKey()); activityExtensionDataService.deleteByProcessDefId(model.getKey());
activityExtensionPropertyService.remove(new LambdaUpdateWrapper<ActivityExtensionProperty>() activityExtensionPropertyService.remove(new LambdaUpdateWrapper<ActivityExtensionProperty>()
@ -103,7 +105,7 @@ public class WorkflowModelServiceImpl extends ServiceImpl<WorkflowModelMapper, W
@Override @Override
public String deploy(String id, String category) { public String deploy(String id, String category) {
String message = ""; StringBuilder message = new StringBuilder();
try { try {
Model model = modelService.getModel(id); Model model = modelService.getModel(id);
byte[] bpmnBytes = modelService.getBpmnXML(model); byte[] bpmnBytes = modelService.getBpmnXML(model);
@ -112,12 +114,14 @@ public class WorkflowModelServiceImpl extends ServiceImpl<WorkflowModelMapper, W
if (!StringUtils.endsWith(processName, ".bpmn20.xml")) processName += ".bpmn20.xml"; if (!StringUtils.endsWith(processName, ".bpmn20.xml")) processName += ".bpmn20.xml";
Deployment deployment = repositoryService.createDeployment() Deployment deployment = repositoryService.createDeployment()
.tenantId(SecurityUtils.getUser().getTenantId())
.addBytes(processName, bpmnBytes) .addBytes(processName, bpmnBytes)
.name(model.getName()) .name(model.getName())
.key(model.getKey()) .key(model.getKey())
.deploy(); .deploy();
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery() List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantIdLike(SecurityUtils.getTenantIdLike())
.deploymentId(deployment.getId()).list(); .deploymentId(deployment.getId()).list();
// 设置流程分类 // 设置流程分类
@ -125,30 +129,30 @@ public class WorkflowModelServiceImpl extends ServiceImpl<WorkflowModelMapper, W
if (StringUtils.isNotBlank(category)) { if (StringUtils.isNotBlank(category)) {
repositoryService.setProcessDefinitionCategory(processDefinition.getId(), category); repositoryService.setProcessDefinitionCategory(processDefinition.getId(), category);
} }
message += "部署成功,流程ID=" + processDefinition.getId() ; message.append("部署成功,流程ID=").append(processDefinition.getId());
} }
if (list.size() == 0) { if (list.isEmpty()) {
message = "部署失败,没有流程。"; message = new StringBuilder("部署失败,没有流程。");
} }
} catch (Exception e) { } catch (Exception e) {
throw new FlowableException("设计模型图不正确,检查模型正确性,模型ID=" + id, e); throw new FlowableException("设计模型图不正确,检查模型正确性,模型ID=" + id, e);
} }
return message; return message.toString();
} }
@Override @Override
public String changeXmlToJson(String xml) { public String changeXmlToJson(String xml) {
try { try {
XMLInputFactory xif = XmlUtil.createSafeXmlInputFactory(); XMLInputFactory xif = XmlUtil.createSafeXmlInputFactory();
InputStreamReader xmlIn = new InputStreamReader(new ByteArrayInputStream(xml.getBytes("UTF-8")), "UTF-8"); InputStreamReader xmlIn = new InputStreamReader(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8);
XMLStreamReader xsr = xif.createXMLStreamReader(xmlIn); XMLStreamReader xsr = xif.createXMLStreamReader(xmlIn);
// bpmn模型转换 // bpmn模型转换
BpmnModel bpmnModel = this.bpmnXmlConverter.convertToBpmnModel(xsr); BpmnModel bpmnModel = this.bpmnXmlConverter.convertToBpmnModel(xsr);
if (CollectionUtils.isEmpty(bpmnModel.getProcesses())) { if (CollectionUtils.isEmpty(bpmnModel.getProcesses())) {
throw new BadRequestException("在定义中没有发现进程" ); throw new BadRequestException("在定义中没有发现进程" );
} else { } else {
if (bpmnModel.getLocationMap().size() == 0) { if (bpmnModel.getLocationMap().isEmpty()) {
BpmnAutoLayout bpmnLayout = new BpmnAutoLayout(bpmnModel); BpmnAutoLayout bpmnLayout = new BpmnAutoLayout(bpmnModel);
bpmnLayout.execute(); bpmnLayout.execute();
} }

64
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/service/impl/WorkflowProcessServiceImpl.java

@ -82,6 +82,7 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
@Override @Override
public IPage<ProcessDefinitionInfoVo> list(Map<String, Object> params) { public IPage<ProcessDefinitionInfoVo> list(Map<String, Object> params) {
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery() ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantIdLike(SecurityUtils.getTenantIdLike())
.active().latestVersion().orderByProcessDefinitionKey().asc(); .active().latestVersion().orderByProcessDefinitionKey().asc();
String name = MapUtil.getStr(params, "name"), String name = MapUtil.getStr(params, "name"),
@ -103,7 +104,9 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
List<ProcessDefinition> processDefinitionList = query.listPage((current - 1) * size, size); List<ProcessDefinition> processDefinitionList = query.listPage((current - 1) * size, size);
for (ProcessDefinition processDefinition : processDefinitionList) { for (ProcessDefinition processDefinition : processDefinitionList) {
if(this.validateProcessAuth(SecurityUtils.getUser(), processDefinition.getId())){ if(this.validateProcessAuth(SecurityUtils.getUser(), processDefinition.getId())){
Deployment deployment = repositoryService.createDeploymentQuery().deploymentId(processDefinition.getDeploymentId()).singleResult(); Deployment deployment = repositoryService.createDeploymentQuery()
.deploymentTenantIdLike(SecurityUtils.getTenantIdLike())
.deploymentId(processDefinition.getDeploymentId()).singleResult();
ProcessDefinitionInfoVo processDefinitionInfo =new ProcessDefinitionInfoVo(); ProcessDefinitionInfoVo processDefinitionInfo =new ProcessDefinitionInfoVo();
processDefinitionInfo.setId(processDefinition.getId()); processDefinitionInfo.setId(processDefinition.getId());
processDefinitionInfo.setCategory(processDefinition.getCategory()); processDefinitionInfo.setCategory(processDefinition.getCategory());
@ -129,10 +132,12 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
@Override @Override
public IPage<ProcessInstanceInfoVo> runList(Map<String, Object> params) { public IPage<ProcessInstanceInfoVo> runList(Map<String, Object> params) {
ProcessInstanceQuery query = runtimeService.createProcessInstanceQuery().includeProcessVariables(); ProcessInstanceQuery query = runtimeService.createProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.includeProcessVariables();
String processInsId = MapUtil.getStr(params, "processInsId"), String processInsId = MapUtil.getStr(params, "processInsId"),
processDefKey = MapUtil.getStr(params, "processDefKey"); processDefKey = MapUtil.getStr(params, "processDefKey");
if (StrUtil.isNotBlank(processInsId)) { if (StrUtil.isNotBlank(processInsId)) {
query.processInstanceId(processInsId); query.processInstanceId(processInsId);
@ -163,7 +168,9 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
@Override @Override
public IPage<ProcessInstanceInfoVo> historyList(Map<String, Object> params) { public IPage<ProcessInstanceInfoVo> historyList(Map<String, Object> params) {
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery().includeProcessVariables().finished() HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.includeProcessVariables().finished()
.orderByProcessInstanceEndTime().desc(); .orderByProcessInstanceEndTime().desc();
String processInsId = MapUtil.getStr(params, "processInsId"), String processInsId = MapUtil.getStr(params, "processInsId"),
@ -203,11 +210,13 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
public InputStream readResource(String processInsId, String processDefId, String fileType) { public InputStream readResource(String processInsId, String processDefId, String fileType) {
if (StrUtil.isBlank(processDefId)) { if (StrUtil.isBlank(processDefId)) {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).singleResult(); .processInstanceId(processInsId).singleResult();
processDefId = processInstance.getProcessDefinitionId(); processDefId = processInstance.getProcessDefinitionId();
} }
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantIdLike(SecurityUtils.getTenantIdLike())
.processDefinitionId(processDefId).singleResult(); .processDefinitionId(processDefId).singleResult();
String resourceName = ""; String resourceName = "";
@ -217,8 +226,7 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
resourceName = processDefinition.getResourceName(); resourceName = processDefinition.getResourceName();
} }
InputStream resourceAsStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), resourceName); return repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), resourceName);
return resourceAsStream;
} }
@Override @Override
@ -242,9 +250,13 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
@Override @Override
public void stopProcessInstance(String processInsId, ExtendMessage extendMessage, String comment) { public void stopProcessInstance(String processInsId, ExtendMessage extendMessage, String comment) {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).singleResult();
if (processInstance != null) { if (processInstance != null) {
Task task = taskService.createTaskQuery().processInstanceId(processInsId).list().get(0); Task task = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).list().get(0);
// 设置审批记录 // 设置审批记录
ActivityCommentInfoVo activityCommentInfo = new ActivityCommentInfoVo(); ActivityCommentInfoVo activityCommentInfo = new ActivityCommentInfoVo();
@ -264,7 +276,9 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
String endId = endNodes.get(0).getId(); String endId = endNodes.get(0).getId();
// 执行终止流程 // 执行终止流程
List<Execution> executions = runtimeService.createExecutionQuery().parentId(processInsId).list(); List<Execution> executions = runtimeService.createExecutionQuery()
.executionTenantIdLike(SecurityUtils.getTenantIdLike())
.parentId(processInsId).list();
List<String> executionIds = new ArrayList<>(); List<String> executionIds = new ArrayList<>();
executions.forEach(execution -> executionIds.add(execution.getId())); executions.forEach(execution -> executionIds.add(execution.getId()));
this.moveExecutionsToSingleActivityId(executionIds, endId); this.moveExecutionsToSingleActivityId(executionIds, endId);
@ -295,7 +309,9 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
public ProcessInstanceInfoVo queryProcessState(String processInstanceId) { public ProcessInstanceInfoVo queryProcessState(String processInstanceId) {
ProcessInstanceInfoVo processInstanceInfo = new ProcessInstanceInfoVo(); ProcessInstanceInfoVo processInstanceInfo = new ProcessInstanceInfoVo();
// 通过流程实例ID查询流程实例 // 通过流程实例ID查询流程实例
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInstanceId).singleResult();
if (processInstance != null) { if (processInstance != null) {
if (processInstance.isSuspended()) { if (processInstance.isSuspended()) {
//挂起实例 //挂起实例
@ -303,16 +319,21 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
} else { } else {
//执行实例 //执行实例
processInstanceInfo.setExtendMessage(ExtendMessage.PROCESS_WAITING); processInstanceInfo.setExtendMessage(ExtendMessage.PROCESS_WAITING);
Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).list().get(0); Task task = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInstanceId).list().get(0);
processInstanceInfo.setTaskInfo(new TaskInfoVo(task)); processInstanceInfo.setTaskInfo(new TaskInfoVo(task));
processInstanceInfo.setTaskName(task.getName()); processInstanceInfo.setTaskName(task.getName());
} }
return processInstanceInfo; return processInstanceInfo;
} else { } else {
HistoricProcessInstance historicProcessInstance = HistoricProcessInstance historicProcessInstance =
historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInstanceId).singleResult();
//查询历史流程完整历史活动 //查询历史流程完整历史活动
HistoricActivityInstance historicActivityInstance = historyService.createHistoricActivityInstanceQuery() HistoricActivityInstance historicActivityInstance = historyService.createHistoricActivityInstanceQuery()
.activityTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInstanceId).finished() .processInstanceId(processInstanceId).finished()
.orderByHistoricActivityInstanceEndTime().desc().list().stream() .orderByHistoricActivityInstanceEndTime().desc().list().stream()
.filter(activity -> .filter(activity ->
@ -356,37 +377,42 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
@Override @Override
public ProcessDefinition getProcessDefinition(String processDefId) { public ProcessDefinition getProcessDefinition(String processDefId) {
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery() ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantIdLike(SecurityUtils.getTenantIdLike())
.latestVersion().orderByProcessDefinitionKey().asc(); .latestVersion().orderByProcessDefinitionKey().asc();
if (StrUtil.isNotBlank(processDefId)) { if (StrUtil.isNotBlank(processDefId)) {
processDefinitionQuery.processDefinitionId(processDefId); processDefinitionQuery.processDefinitionId(processDefId);
} }
ProcessDefinition processDefinition = processDefinitionQuery.singleResult(); return processDefinitionQuery.singleResult();
return processDefinition;
} }
public ProcessDefinition getProcessDefinitionByKey(String processDefKey) { public ProcessDefinition getProcessDefinitionByKey(String processDefKey) {
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery() ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantIdLike(SecurityUtils.getTenantIdLike())
.latestVersion().orderByProcessDefinitionKey().asc(); .latestVersion().orderByProcessDefinitionKey().asc();
if (StrUtil.isNotBlank(processDefKey)) { if (StrUtil.isNotBlank(processDefKey)) {
processDefinitionQuery.processDefinitionKey(processDefKey); processDefinitionQuery.processDefinitionKey(processDefKey);
} }
ProcessDefinition processDefinition = processDefinitionQuery.singleResult(); return processDefinitionQuery.singleResult();
return processDefinition;
} }
@Override @Override
public ProcessInstance getProcessInstance(String processInsId) { public ProcessInstance getProcessInstance(String processInsId) {
return runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult(); return runtimeService.createProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).singleResult();
} }
@Override @Override
public HistoricProcessInstance getFinishedProcessInstance(String processInsId) { public HistoricProcessInstance getFinishedProcessInstance(String processInsId) {
return historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult(); return historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).singleResult();
} }
@Override @Override
public IPage<ProcessInstanceInfoVo> selfProcessInstanceList(Map<String, Object> params) { public IPage<ProcessInstanceInfoVo> selfProcessInstanceList(Map<String, Object> params) {
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery() HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.startedBy(SecurityUtils.getUser().getId()).includeProcessVariables().orderByProcessInstanceStartTime().desc(); .startedBy(SecurityUtils.getUser().getId()).includeProcessVariables().orderByProcessInstanceStartTime().desc();
String title = MapUtil.getStr(params, " title"); String title = MapUtil.getStr(params, " title");
@ -452,7 +478,7 @@ public class WorkflowProcessServiceImpl implements WorkflowProcessService {
// 启动流程实例 // 启动流程实例
String processInsId = runtimeService String processInsId = runtimeService
.startProcessInstanceByKey(processDefKey, String.join(":",businessTable,businessId), vars) .startProcessInstanceByKeyAndTenantId(processDefKey, String.join(":",businessTable,businessId), vars, SecurityUtils.getTenantId())
.getProcessInstanceId(); .getProcessInstanceId();
// 更新业务表流程实例ID,确保业务表字段process_ins_id存在 // 更新业务表流程实例ID,确保业务表字段process_ins_id存在

96
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/service/impl/WorkflowTaskServiceImpl.java

@ -2,6 +2,7 @@ package com.cloud.kicc.workflow.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -41,6 +42,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.Types;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -80,6 +82,7 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
public IPage<ProcessInstanceInfoVo> list(Map<String, Object> params) { public IPage<ProcessInstanceInfoVo> list(Map<String, Object> params) {
// =============== 已经签收或者等待签收的任务 =============== // =============== 已经签收或者等待签收的任务 ===============
TaskQuery query = taskService.createTaskQuery() TaskQuery query = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.taskCandidateOrAssigned(SecurityUtils.getUser().getId()).active() .taskCandidateOrAssigned(SecurityUtils.getUser().getId()).active()
.includeProcessVariables().orderByTaskCreateTime().desc(); .includeProcessVariables().orderByTaskCreateTime().desc();
@ -112,6 +115,7 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
for (Task task : taskList) { for (Task task : taskList) {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantIdLike(SecurityUtils.getTenantIdLike())
.processDefinitionId(task.getProcessDefinitionId()).singleResult(); .processDefinitionId(task.getProcessDefinitionId()).singleResult();
ProcessInstanceInfoVo processInstanceInfo = new ProcessInstanceInfoVo(); ProcessInstanceInfoVo processInstanceInfo = new ProcessInstanceInfoVo();
TaskInfoVo taskInfo = new TaskInfoVo(task); TaskInfoVo taskInfo = new TaskInfoVo(task);
@ -130,6 +134,7 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
@Override @Override
public IPage<HistoryTaskInfoVo> historyList(Map<String, Object> params) { public IPage<HistoryTaskInfoVo> historyList(Map<String, Object> params) {
HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery() HistoricTaskInstanceQuery query = historyService.createHistoricTaskInstanceQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.taskAssignee(SecurityUtils.getUser().getId()).finished() .taskAssignee(SecurityUtils.getUser().getId()).finished()
.includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc(); .includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc();
@ -162,18 +167,21 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
for (HistoricTaskInstance historicTask : historicTaskList) { for (HistoricTaskInstance historicTask : historicTaskList) {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantIdLike(SecurityUtils.getTenantIdLike())
.processDefinitionId(historicTask.getProcessDefinitionId()).singleResult(); .processDefinitionId(historicTask.getProcessDefinitionId()).singleResult();
HistoryTaskInfoVo HistoryTaskInfo = new HistoryTaskInfoVo(historicTask); HistoryTaskInfoVo HistoryTaskInfo = new HistoryTaskInfoVo(historicTask);
HistoryTaskInfo.setProcessDefName(processDefinition.getName()); HistoryTaskInfo.setProcessDefName(processDefinition.getName());
HistoryTaskInfo.setRollBack(this.rollBackTask(historicTask)); HistoryTaskInfo.setRollBack(this.rollBackTask(historicTask));
List<Task> taskList = taskService.createTaskQuery().processInstanceId(historicTask.getProcessInstanceId()).list(); List<Task> taskList = taskService.createTaskQuery()
if (taskList.size() > 0) { .taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(historicTask.getProcessInstanceId()).list();
if (!taskList.isEmpty()) {
TaskInfoVo taskInfo = new TaskInfoVo(taskList.get(0)); TaskInfoVo taskInfo = new TaskInfoVo(taskList.get(0));
HistoryTaskInfo.setTaskInfo(taskInfo); HistoryTaskInfo.setTaskInfo(taskInfo);
} }
// 获取意见评论内容 // 获取意见评论内容
List<ActivityCommentInfoVo> activityCommentInfoList = this.getTaskComments(historicTask.getId()); List<ActivityCommentInfoVo> activityCommentInfoList = this.getTaskComments(historicTask.getId());
if (activityCommentInfoList.size() > 0) { if (!activityCommentInfoList.isEmpty()) {
ActivityCommentInfoVo activityCommentInfo = activityCommentInfoList.get(activityCommentInfoList.size()-1); ActivityCommentInfoVo activityCommentInfo = activityCommentInfoList.get(activityCommentInfoList.size()-1);
HistoryTaskInfo.setComment(activityCommentInfo.getMessage()); HistoryTaskInfo.setComment(activityCommentInfo.getMessage());
HistoryTaskInfo.setMesLevel(activityCommentInfo.getMesLevel()); HistoryTaskInfo.setMesLevel(activityCommentInfo.getMesLevel());
@ -188,15 +196,15 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
@Override @Override
public List<Workflow> historyFlowChangeList(String processInsId) { public List<Workflow> historyFlowChangeList(String processInsId) {
List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery() List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery()
.activityTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).orderByHistoricActivityInstanceStartTime().asc() .processInstanceId(processInsId).orderByHistoricActivityInstanceStartTime().asc()
.orderByHistoricActivityInstanceEndTime().asc().list(); .orderByHistoricActivityInstanceEndTime().asc().list();
List<Workflow> historicFlowChangeList = new ArrayList(); List<Workflow> historicFlowChangeList = new ArrayList();
for (int i = 0; i < historicActivityInstances.size(); i++) { for (HistoricActivityInstance historicActivityInstance : historicActivityInstances) {
HistoricActivityInstance historicActivityInstance = historicActivityInstances.get(i);
// 只显示开始节点和结束节点,并且执行人不为空的任务 // 只显示开始节点和结束节点,并且执行人不为空的任务
if (StrUtil.isNotBlank(historicActivityInstance.getAssignee()) if (StrUtil.isNotBlank(historicActivityInstance.getAssignee())
&& historyService.createHistoricTaskInstanceQuery().taskId(historicActivityInstance.getTaskId()).count() != 0 && historyService.createHistoricTaskInstanceQuery().taskTenantIdLike(SecurityUtils.getTenantIdLike()).taskId(historicActivityInstance.getTaskId()).count() != 0
|| BpmnXMLConstants.ELEMENT_TASK_USER.equals(historicActivityInstance.getActivityType()) || BpmnXMLConstants.ELEMENT_TASK_USER.equals(historicActivityInstance.getActivityType())
&& historicActivityInstance.getEndTime() == null && historicActivityInstance.getEndTime() == null
|| BpmnXMLConstants.ELEMENT_EVENT_START.equals(historicActivityInstance.getActivityType()) || BpmnXMLConstants.ELEMENT_EVENT_START.equals(historicActivityInstance.getActivityType())
@ -259,7 +267,9 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
processVars.put(WorkflowConstant.TITLE, workFlow.getTitle()); processVars.put(WorkflowConstant.TITLE, workFlow.getTitle());
} }
Task task = taskService.createTaskQuery().taskId(workFlow.getTaskId()).singleResult(); Task task = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.taskId(workFlow.getTaskId()).singleResult();
// owner不为空说明可能存在委托任务 // owner不为空说明可能存在委托任务
if (StrUtil.isNotBlank(task.getOwner())){ if (StrUtil.isNotBlank(task.getOwner())){
DelegationState delegationState = task.getDelegationState(); DelegationState delegationState = task.getDelegationState();
@ -292,15 +302,20 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
public Map getPaintDiagramXml(String processInsId) { public Map getPaintDiagramXml(String processInsId) {
Map result = MapUtil.newHashMap(); Map result = MapUtil.newHashMap();
String processDefId; String processDefId;
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult(); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).singleResult();
// 获取流程定义ID // 获取流程定义ID
if(processInstance == null) { if(processInstance == null) {
processDefId = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult().getProcessDefinitionId(); processDefId = historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).singleResult().getProcessDefinitionId();
} else { } else {
processDefId = processInstance.getProcessDefinitionId(); processDefId = processInstance.getProcessDefinitionId();
} }
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId);
List<HistoricActivityInstance> historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery() List<HistoricActivityInstance> historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery()
.activityTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).finished() .processInstanceId(processInsId).finished()
.orderByHistoricActivityInstanceEndTime().asc().list(); .orderByHistoricActivityInstanceEndTime().asc().list();
@ -312,14 +327,16 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
if (activityType.equals(BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW) || activityType.equals(BpmnXMLConstants.ELEMENT_GATEWAY_EXCLUSIVE)) { if (activityType.equals(BpmnXMLConstants.ELEMENT_SEQUENCE_FLOW) || activityType.equals(BpmnXMLConstants.ELEMENT_GATEWAY_EXCLUSIVE)) {
flows.add(historicActivityInstance.getActivityId()); flows.add(historicActivityInstance.getActivityId());
} else if (StrUtil.isNotBlank(historicActivityInstance.getAssignee()) } else if (StrUtil.isNotBlank(historicActivityInstance.getAssignee())
&& historyService.createHistoricTaskInstanceQuery().taskId(historicActivityInstance.getTaskId()).count() != 0 && historyService.createHistoricTaskInstanceQuery().taskTenantIdLike(SecurityUtils.getTenantIdLike()).taskId(historicActivityInstance.getTaskId()).count() != 0
|| BpmnXMLConstants.ELEMENT_TASK_USER.equals(historicActivityInstance.getActivityType()) && historicActivityInstance.getEndTime() == null || BpmnXMLConstants.ELEMENT_TASK_USER.equals(historicActivityInstance.getActivityType()) && historicActivityInstance.getEndTime() == null
|| BpmnXMLConstants.ELEMENT_EVENT_START.equals(historicActivityInstance.getActivityType()) || BpmnXMLConstants.ELEMENT_EVENT_START.equals(historicActivityInstance.getActivityType())
|| BpmnXMLConstants.ELEMENT_EVENT_END.equals(historicActivityInstance.getActivityType())) { || BpmnXMLConstants.ELEMENT_EVENT_END.equals(historicActivityInstance.getActivityType())) {
activityIds.add(historicActivityInstance.getActivityId()); activityIds.add(historicActivityInstance.getActivityId());
} }
} }
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInsId).list(); List<Task> tasks = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).list();
for (Task task : tasks) { for (Task task : tasks) {
activityIds.add(task.getTaskDefinitionKey()); activityIds.add(task.getTaskDefinitionKey());
} }
@ -337,13 +354,16 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
@Override @Override
public void rollBackTask(String rollBackTaskDefKey, String currentTaskId, ActivityCommentInfoVo activityCommentInfo) { public void rollBackTask(String rollBackTaskDefKey, String currentTaskId, ActivityCommentInfoVo activityCommentInfo) {
Task task = taskService.createTaskQuery().taskId(currentTaskId).singleResult(); Task task = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.taskId(currentTaskId).singleResult();
if(StrUtil.isBlank(task.getAssignee())){ if(StrUtil.isBlank(task.getAssignee())){
//代理人为空自己签收任务 //代理人为空自己签收任务
taskService.claim(currentTaskId, SecurityUtils.getUser().getId()); taskService.claim(currentTaskId, SecurityUtils.getUser().getId());
} }
// 退回发起者处理,退回到发起者,默认设置任务执行人为发起者 // 退回发起者处理,退回到发起者,默认设置任务执行人为发起者
ActivityInstance targetRealActivityInstance = runtimeService.createActivityInstanceQuery() ActivityInstance targetRealActivityInstance = runtimeService.createActivityInstanceQuery()
.activityTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(task.getProcessInstanceId()).activityId(rollBackTaskDefKey).list().get(0); .processInstanceId(task.getProcessInstanceId()).activityId(rollBackTaskDefKey).list().get(0);
if (targetRealActivityInstance.getActivityType().equals(BpmnXMLConstants.ELEMENT_EVENT_START)) { if (targetRealActivityInstance.getActivityType().equals(BpmnXMLConstants.ELEMENT_EVENT_START)) {
workflowProcessServices.stopProcessInstance(task.getProcessInstanceId(), ExtendMessage.PROCESS_REJECT, activityCommentInfo.getMessage()); workflowProcessServices.stopProcessInstance(task.getProcessInstanceId(), ExtendMessage.PROCESS_REJECT, activityCommentInfo.getMessage());
@ -355,7 +375,9 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
@Override @Override
public List<Workflow> rollBackTaskList(String taskId) { public List<Workflow> rollBackTaskList(String taskId) {
Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); Task task = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.taskId(taskId).singleResult();
String processInstanceId = task.getProcessInstanceId(); String processInstanceId = task.getProcessInstanceId();
String currentActivityId = task.getTaskDefinitionKey(); String currentActivityId = task.getTaskDefinitionKey();
String processDefinitionId = task.getProcessDefinitionId(); String processDefinitionId = task.getProcessDefinitionId();
@ -364,14 +386,15 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
//获取已经完成的活动节点 //获取已经完成的活动节点
List<ActivityInstance> activityInstanceList = runtimeService.createActivityInstanceQuery() List<ActivityInstance> activityInstanceList = runtimeService.createActivityInstanceQuery()
.activityTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInstanceId).finished().orderByActivityInstanceStartTime().asc().list(); .processInstanceId(processInstanceId).finished().orderByActivityInstanceStartTime().asc().list();
//获取已经完成节点的活动ID //获取已经完成节点的活动ID
List<String> activityIds = activityInstanceList.stream().filter(activity -> activity.getActivityType() List<String> activityIds = activityInstanceList.stream().filter(activity -> activity.getActivityType()
.equals(BpmnXMLConstants.ELEMENT_TASK_USER) || activity.getActivityType() .equals(BpmnXMLConstants.ELEMENT_TASK_USER) || activity.getActivityType()
.equals(BpmnXMLConstants.ELEMENT_EVENT_START)) .equals(BpmnXMLConstants.ELEMENT_EVENT_START))
.filter(activity ->!activity.getActivityId().equals(currentActivityId)) .map(ActivityInstance::getActivityId)
.map(ActivityInstance::getActivityId).distinct().collect(Collectors.toList()); .filter(activityId ->!activityId.equals(currentActivityId)).distinct().collect(Collectors.toList());
List<Workflow> result = CollectionUtil.newArrayList(); List<Workflow> result = CollectionUtil.newArrayList();
for (String activityId : activityIds) { for (String activityId : activityIds) {
@ -394,16 +417,21 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
Map result = new HashMap (); Map result = new HashMap ();
try { try {
String processDefId; String processDefId;
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInsId).singleResult(); ProcessInstance pi = runtimeService.createProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).singleResult();
//流程走完的不显示图 //流程走完的不显示图
if (pi == null) { if (pi == null) {
processDefId = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult().getProcessDefinitionId(); processDefId = historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).singleResult().getProcessDefinitionId();
} else { } else {
processDefId = pi.getProcessDefinitionId(); processDefId = pi.getProcessDefinitionId();
} }
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefId);
List<HistoricActivityInstance> historyProcess = historyService // 历史相关Service List<HistoricActivityInstance> historyProcess = historyService // 历史相关Service
.createHistoricActivityInstanceQuery() // 创建历史活动实例查询 .createHistoricActivityInstanceQuery() // 创建历史活动实例查询
.activityTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId) // 执行流程实例id .processInstanceId(processInsId) // 执行流程实例id
.finished().orderByHistoricActivityInstanceEndTime().asc() .finished().orderByHistoricActivityInstanceEndTime().asc()
.list(); .list();
@ -411,7 +439,7 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
Set<String> runActivityIds = new LinkedHashSet(); Set<String> runActivityIds = new LinkedHashSet();
for (HistoricActivityInstance hi : historyProcess) { for (HistoricActivityInstance hi : historyProcess) {
if (StrUtil.isNotBlank(hi.getAssignee()) if (StrUtil.isNotBlank(hi.getAssignee())
&& historyService.createHistoricTaskInstanceQuery().taskId(hi.getTaskId()).count() != 0 && historyService.createHistoricTaskInstanceQuery().taskTenantIdLike(SecurityUtils.getTenantIdLike()).taskId(hi.getTaskId()).count() != 0
|| BpmnXMLConstants.ELEMENT_TASK_USER.equals(hi.getActivityType()) && hi.getEndTime() == null || BpmnXMLConstants.ELEMENT_TASK_USER.equals(hi.getActivityType()) && hi.getEndTime() == null
|| BpmnXMLConstants.ELEMENT_EVENT_START.equals(hi.getActivityType()) || BpmnXMLConstants.ELEMENT_EVENT_START.equals(hi.getActivityType())
|| BpmnXMLConstants.ELEMENT_EVENT_END.equals(hi.getActivityType()) || BpmnXMLConstants.ELEMENT_EVENT_END.equals(hi.getActivityType())
@ -420,7 +448,9 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
activityIds.add(hi.getActivityId()); activityIds.add(hi.getActivityId());
} }
} }
List<Task> taskList = taskService.createTaskQuery().processInstanceId(processInsId).list(); List<Task> taskList = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(processInsId).list();
for (Task task : taskList) { for (Task task : taskList) {
runActivityIds.add(task.getTaskDefinitionKey()); runActivityIds.add(task.getTaskDefinitionKey());
} }
@ -430,7 +460,7 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
result.put("runActivityIds", runActivityIds); result.put("runActivityIds", runActivityIds);
return result; return result;
} catch(Exception e) { } catch(Exception e) {
e.printStackTrace(); log.error("An error occurred", e);
} }
return null; return null;
} }
@ -438,15 +468,19 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
/** 是否可以回滚任务 */ /** 是否可以回滚任务 */
private boolean rollBackTask(HistoricTaskInstance historicTaskInstance) { private boolean rollBackTask(HistoricTaskInstance historicTaskInstance) {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(historicTaskInstance.getProcessInstanceId()).singleResult(); .processInstanceId(historicTaskInstance.getProcessInstanceId()).singleResult();
if (processInstance != null) { if (processInstance != null) {
if (!processInstance.isSuspended()) { if (!processInstance.isSuspended()) {
Task currentTask = taskService.createTaskQuery().processInstanceId(historicTaskInstance.getProcessInstanceId()).list().get(0); Task currentTask = taskService.createTaskQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(historicTaskInstance.getProcessInstanceId()).list().get(0);
HistoricTaskInstance lastHisTask = historyService.createHistoricTaskInstanceQuery() HistoricTaskInstance lastHisTask = historyService.createHistoricTaskInstanceQuery()
.taskTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(historicTaskInstance.getProcessInstanceId()).finished().includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc().list().get(0); .processInstanceId(historicTaskInstance.getProcessInstanceId()).finished().includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc().list().get(0);
// 用户已签收 // 用户已签收
if (currentTask.getClaimTime() != null) return false; if (currentTask.getClaimTime() != null) return false;
if (historicTaskInstance.getId().equals(lastHisTask.getId())) return true; return historicTaskInstance.getId().equals(lastHisTask.getId());
} }
} }
return false; return false;
@ -454,7 +488,10 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
/** 获取任务意见评论内容 */ /** 获取任务意见评论内容 */
private List<ActivityCommentInfoVo> getTaskComments(String taskId) { private List<ActivityCommentInfoVo> getTaskComments(String taskId) {
return jdbcTemplate.query(SqlConstants.QUERY_ACT_HI_COMMENT, new String[]{ WorkflowConstant.COMMENT_TYPE_PREFIX + "%", taskId } ,(ResultSet rs, int rowNum) -> { return jdbcTemplate.query(SqlConstants.QUERY_ACT_HI_COMMENT,
new String[]{ WorkflowConstant.COMMENT_TYPE_PREFIX + "%", taskId },
new int[]{ Types.VARCHAR, Types.VARCHAR },
(ResultSet rs, int rowNum) -> {
ActivityCommentInfoVo activityCommentInfo = new ActivityCommentInfoVo(); ActivityCommentInfoVo activityCommentInfo = new ActivityCommentInfoVo();
activityCommentInfo.setExtendMessage(rs.getString("TYPE_")); activityCommentInfo.setExtendMessage(rs.getString("TYPE_"));
activityCommentInfo.setCombinationMessage(new String(rs.getBytes("FULL_MSG_"))); activityCommentInfo.setCombinationMessage(new String(rs.getBytes("FULL_MSG_")));
@ -470,12 +507,13 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
// 获取开始事件流程发起人名称 // 获取开始事件流程发起人名称
if (BpmnXMLConstants.ELEMENT_EVENT_START.equals(historicActivityInstance.getActivityType())) { if (BpmnXMLConstants.ELEMENT_EVENT_START.equals(historicActivityInstance.getActivityType())) {
List<HistoricProcessInstance> historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery() List<HistoricProcessInstance> historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantIdLike(SecurityUtils.getTenantIdLike())
.processInstanceId(historicActivityInstance.getProcessInstanceId()) .processInstanceId(historicActivityInstance.getProcessInstanceId())
.orderByProcessInstanceStartTime().asc().list(); .orderByProcessInstanceStartTime().asc().list();
if (historicProcessInstanceList.size() > 0) { if (!historicProcessInstanceList.isEmpty()) {
if (StrUtil.isNotBlank(historicProcessInstanceList.get(0).getStartUserId())) { if (StrUtil.isNotBlank(historicProcessInstanceList.get(0).getStartUserId())) {
Map<String, Object> user = jdbcTemplate.queryForMap(SqlConstants.QUERY_USER_BY_ID, historicProcessInstanceList.get(0).getStartUserId()); Map<String, Object> user = jdbcTemplate.queryForMap(SqlConstants.QUERY_USER_BY_ID, historicProcessInstanceList.get(0).getStartUserId(), SecurityUtils.getTenantIdLike());
if (user != null) { if (ObjectUtil.isNotEmpty(user)) {
workflow.setAssignee(historicActivityInstance.getAssignee()); workflow.setAssignee(historicActivityInstance.getAssignee());
workflow.setAssigneeName(MapUtil.getStr(user, "userName")); workflow.setAssigneeName(MapUtil.getStr(user, "userName"));
} }
@ -500,8 +538,8 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
// 获取任务执行人名称 // 获取任务执行人名称
if (StrUtil.isNotEmpty(historicActivityInstance.getAssignee())) { if (StrUtil.isNotEmpty(historicActivityInstance.getAssignee())) {
Map<String, Object> user = jdbcTemplate.queryForMap(SqlConstants.QUERY_USER_BY_ID,historicActivityInstance.getAssignee()); Map<String, Object> user = jdbcTemplate.queryForMap(SqlConstants.QUERY_USER_BY_ID, historicActivityInstance.getAssignee(), SecurityUtils.getTenantIdLike());
if (user != null) { if (ObjectUtil.isNotEmpty(user)) {
workflow.setAssignee(historicActivityInstance.getAssignee()); workflow.setAssignee(historicActivityInstance.getAssignee());
workflow.setAssigneeName(MapUtil.getStr(user, "userName")); workflow.setAssigneeName(MapUtil.getStr(user, "userName"));
} }
@ -510,7 +548,7 @@ public class WorkflowTaskServiceImpl implements WorkflowTaskService {
// 获取意见评论内容 // 获取意见评论内容
if (StrUtil.isNotBlank(historicActivityInstance.getTaskId())) { if (StrUtil.isNotBlank(historicActivityInstance.getTaskId())) {
List<ActivityCommentInfoVo> activityCommentInfoList = this.getTaskComments(historicActivityInstance.getTaskId()); List<ActivityCommentInfoVo> activityCommentInfoList = this.getTaskComments(historicActivityInstance.getTaskId());
if (activityCommentInfoList.size() > 0) { if (!activityCommentInfoList.isEmpty()) {
ActivityCommentInfoVo activityCommentInfo = activityCommentInfoList.get(activityCommentInfoList.size()-1); ActivityCommentInfoVo activityCommentInfo = activityCommentInfoList.get(activityCommentInfoList.size()-1);
workflow.setActivityCommentInfo((activityCommentInfo)); workflow.setActivityCommentInfo((activityCommentInfo));
} }

10
kicc-platform/kicc-platform-biz/kicc-workflow-biz/src/main/java/com/cloud/kicc/workflow/util/WorkflowUtil.java

@ -37,7 +37,7 @@ public class WorkflowUtil {
return false; return false;
} }
// 没有流出的seq流:可能是结束。流程或嵌入的子流程 // 没有流出的seq流:可能是结束。流程或嵌入的子流程
if (sourceElement.getOutgoingFlows().size() == 0) { if (sourceElement.getOutgoingFlows().isEmpty()) {
visitedElements.add(sourceElement.getId()); visitedElements.add(sourceElement.getId());
FlowElementsContainer parentElement = process.findParent(sourceElement); FlowElementsContainer parentElement = process.findParent(sourceElement);
if (parentElement instanceof SubProcess) { if (parentElement instanceof SubProcess) {
@ -61,7 +61,7 @@ public class WorkflowUtil {
return true; return true;
} }
List<SequenceFlow> sequenceFlows = sourceElement.getOutgoingFlows(); List<SequenceFlow> sequenceFlows = sourceElement.getOutgoingFlows();
if (sequenceFlows != null && sequenceFlows.size() > 0) { if (sequenceFlows != null && !sequenceFlows.isEmpty()) {
for (SequenceFlow sequenceFlow : sequenceFlows) { for (SequenceFlow sequenceFlow : sequenceFlows) {
String targetRef = sequenceFlow.getTargetRef(); String targetRef = sequenceFlow.getTargetRef();
FlowNode sequenceFlowTarget = (FlowNode) process.getFlowElement(targetRef, true); FlowNode sequenceFlowTarget = (FlowNode) process.getFlowElement(targetRef, true);
@ -77,7 +77,7 @@ public class WorkflowUtil {
} }
/** 当前元素是否是事件子流程 */ /** 当前元素是否是事件子流程 */
protected boolean isInEventSubprocess(FlowNode flowNode) { private boolean isInEventSubprocess(FlowNode flowNode) {
FlowElementsContainer flowElementsContainer = flowNode.getParentContainer(); FlowElementsContainer flowElementsContainer = flowNode.getParentContainer();
while (flowElementsContainer != null) { while (flowElementsContainer != null) {
if (flowElementsContainer instanceof EventSubProcess) { if (flowElementsContainer instanceof EventSubProcess) {
@ -207,7 +207,7 @@ public class WorkflowUtil {
//收集节点ID //收集节点ID
elements.add(specialGatewayBegin.getId()); elements.add(specialGatewayBegin.getId());
List<SequenceFlow> sequenceFlows = ((FlowNode) specialGatewayBegin).getOutgoingFlows(); List<SequenceFlow> sequenceFlows = ((FlowNode) specialGatewayBegin).getOutgoingFlows();
if (sequenceFlows != null && sequenceFlows.size() > 0) { if (sequenceFlows != null && !sequenceFlows.isEmpty()) {
for (SequenceFlow sequenceFlow : sequenceFlows) { for (SequenceFlow sequenceFlow : sequenceFlows) {
FlowElement targetFlowElement = sequenceFlow.getTargetFlowElement(); FlowElement targetFlowElement = sequenceFlow.getTargetFlowElement();
String targetFlowElementId = targetFlowElement.getId(); String targetFlowElementId = targetFlowElement.getId();
@ -295,7 +295,7 @@ public class WorkflowUtil {
} }
taskParentExecution = taskParentExecution.getParent(); taskParentExecution = taskParentExecution.getParent();
} }
if (realParentExecutionId == null || realParentExecutionId.length() == 0) { if (realParentExecutionId == null || realParentExecutionId.isEmpty()) {
throw new FlowableException("无法找到带有executionId的父执行" + execution.getId()); throw new FlowableException("无法找到带有executionId的父执行" + execution.getId());
} }
return realParentExecutionId; return realParentExecutionId;

Loading…
Cancel
Save