Commit 2048dd9a by shenweidong

0627-1

parents c6c7e752 d2eca046
......@@ -8,15 +8,13 @@
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="jyzb-common" />
<module name="jyzb-process" />
<module name="jyzb-api" />
<module name="jyzb-boot" />
<module name="jyzb-biz" />
<module name="jyzb-process" />
<module name="jyzb-boot" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel>
<module name="jyzb-business" target="1.8" />
</bytecodeTargetLevel>
<bytecodeTargetLevel target="9" />
</component>
<component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
......@@ -24,7 +22,6 @@
<module name="jyzb-api" options="-parameters" />
<module name="jyzb-biz" options="-parameters" />
<module name="jyzb-boot" options="-parameters" />
<module name="jyzb-business" options="-parameters" />
<module name="jyzb-common" options="-parameters" />
<module name="jyzb-process" options="-parameters" />
</option>
......
......@@ -2,6 +2,7 @@
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/jyzb-api/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jyzb-api/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jyzb-biz/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jyzb-biz/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jyzb-boot/src/main/java" charset="UTF-8" />
......@@ -10,5 +11,7 @@
<file url="file://$PROJECT_DIR$/jyzb-common/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jyzb-process/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/jyzb-process/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
......@@ -2,14 +2,9 @@
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="oss" />
<option name="name" value="oss" />
<option name="url" value="https://oss.sonatype.org/content/groups/public" />
</remote-repository>
<remote-repository>
<option name="id" value="junmp-public" />
<option name="name" value="junmp-public" />
<option name="url" value="http://maven.sothing.top/repository/junmp-public/" />
<option name="id" value="aliyun" />
<option name="name" value="aliyun" />
<option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
......@@ -17,24 +12,29 @@
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="junmp-public" />
<option name="name" value="junmp-public" />
<option name="url" value="http://maven.sothing.top/repository/junmp-public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="spring-milestones" />
<option name="name" value="Spring Milestones" />
<option name="url" value="https://repo.spring.io/libs-milestone" />
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="aliyun" />
<option name="name" value="aliyun" />
<option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
<option name="id" value="oss" />
<option name="name" value="oss" />
<option name="url" value="https://oss.sonatype.org/content/groups/public" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
<option name="id" value="spring-milestones" />
<option name="name" value="Spring Milestones" />
<option name="url" value="https://repo.spring.io/libs-milestone" />
</remote-repository>
</component>
</project>
\ No newline at end of file
......@@ -17,5 +17,5 @@
</set>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8 (3)" project-jdk-type="JavaSDK" />
</project>
\ No newline at end of file
......@@ -87,3 +87,4 @@ flowable:
enabled: false
eventregistry:
enabled: false
enabled: false
D:\java-project\jyzb\jyzb-platform\jyzb-boot\src\main\java\com\junmp\jyzb\boot\config\GlobalCorsConfig.java
D:\java-project\jyzb\jyzb-platform\jyzb-boot\src\main\java\com\junmp\jyzb\boot\JyzbBootApplication.java
D:\java-project\jyzb\jyzb-platform\jyzb-boot\src\main\java\com\junmp\jyzb\boot\core\handle\GlobalExceptionHandler.java
D:\java-project\jyzb\jyzb-platform\jyzb-boot\src\main\java\com\junmp\jyzb\boot\config\JsonSerializerConfig.java
D:\java-project\jyzb\jyzb-platform\jyzb-boot\src\main\java\com\junmp\jyzb\boot\module\JpJacksonModule.java
D:\java-project\jyzb\jyzb-platform\jyzb-boot\src\main\java\com\junmp\jyzb\boot\config\MapperScanConfiguration.java
D:\java-project\jyzb\jyzb-platform\jyzb-boot\src\main\java\com\junmp\jyzb\boot\config\Swagger2Config.java
C:\项目\JAVA\主平台\junmp-jyzb-app\jyzb-boot\src\main\java\com\junmp\jyzb\boot\config\GlobalCorsConfig.java
C:\项目\JAVA\主平台\junmp-jyzb-app\jyzb-boot\src\main\java\com\junmp\jyzb\boot\config\Swagger2Config.java
C:\项目\JAVA\主平台\junmp-jyzb-app\jyzb-boot\src\main\java\com\junmp\jyzb\boot\core\handle\GlobalExceptionHandler.java
C:\项目\JAVA\主平台\junmp-jyzb-app\jyzb-boot\src\main\java\com\junmp\jyzb\boot\module\JpJacksonModule.java
C:\项目\JAVA\主平台\junmp-jyzb-app\jyzb-boot\src\main\java\com\junmp\jyzb\boot\config\JsonSerializerConfig.java
C:\项目\JAVA\主平台\junmp-jyzb-app\jyzb-boot\src\main\java\com\junmp\jyzb\boot\config\MapperScanConfiguration.java
C:\项目\JAVA\主平台\junmp-jyzb-app\jyzb-boot\src\main\java\com\junmp\jyzb\boot\JyzbBootApplication.java
......@@ -223,7 +223,13 @@
<version>1.1.4c</version>
<scope>compile</scope>
</dependency>
<!-- <dependency>-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-annotations</artifactId>
<version>3.0.3</version>
<scope>compile</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>2.9.2</version>-->
......
......@@ -4,21 +4,17 @@ package com.junmp.junmpProcess.common;
*
*/
public interface CommonConstants {
/**
* {@code 500 Server Error} (HTTP/1.0 - RFC 1945)
*/
/** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */
Integer SC_INTERNAL_SERVER_ERROR_500 = 500;
/**
* {@code 200 OK} (HTTP/1.0 - RFC 1945)
*/
/** {@code 200 OK} (HTTP/1.0 - RFC 1945) */
Integer SC_OK_200 = 200;
String FORM_VAR = "formData";
String PROCESS_STATUS = "processStatus";
String START_USER_INFO = "startUser";
String BUSINESS_STATUS_1 = "1"; //正在处理
String BUSINESS_STATUS_2 = "2";//撤销
String BUSINESS_STATUS_3 = "3";//驳回
String BUSINESS_STATUS_4 = "4";//已结束
String FORM_VAR="formData";
String PROCESS_STATUS="processStatus";
String START_USER_INFO="startUser";
String BUSINESS_STATUS_1="1"; //正在处理
String BUSINESS_STATUS_2="2";//撤销
String BUSINESS_STATUS_3="3";//驳回
String BUSINESS_STATUS_4="4";//已结束
}
......@@ -44,7 +44,7 @@ public class ActivitiConfig {
config.setTransactionManager(transactionManager);
config.setDisableIdmEngine(true);
config.setDatabaseType(ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL);
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE);
config.setDelegateExpressionFieldInjectionMode(DelegateExpressionFieldInjectionMode.MIXED);
config.setIdGenerator(idWorkerIdGenerator);
config.setAsyncExecutorActivate(Boolean.TRUE);
......@@ -60,9 +60,9 @@ public class ActivitiConfig {
config.setHttpClientConfig(httpClientConfig);
config.setKnowledgeBaseCacheLimit(200);
config.setProcessDefinitionCacheLimit(200);
List<JobHandler> customJobHandlers = new ArrayList<>();
customJobHandlers.add(new CustomJobHandler());
config.setCustomJobHandlers(customJobHandlers);
// List<JobHandler> customJobHandlers = new ArrayList<>();
// customJobHandlers.add(new CustomJobHandler());
// config.setCustomJobHandlers(customJobHandlers);
return config;
}
......
package com.junmp.junmpProcess.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.junmp.junmpProcess.common.R;
import com.junmp.junmpProcess.common.Result;
import com.junmp.junmpProcess.doc.BpmnDoc;
import com.junmp.junmpProcess.dto.ApplyDTO;
import com.junmp.junmpProcess.dto.HandleDataDTO;
import com.junmp.junmpProcess.dto.StartProcessInstanceDTO;
import com.junmp.junmpProcess.dto.TaskDTO;
import com.junmp.junmpProcess.dto.json.JunmpUserInfo;
import com.junmp.junmpProcess.dto.json.UserInfo;
import com.junmp.junmpProcess.entity.ProcessTemplates;
import com.junmp.junmpProcess.exception.WorkFlowException;
import com.junmp.junmpProcess.service.Repository.ProcessTemplateService;
import com.junmp.junmpProcess.utils.BpmnConvert;
import com.junmp.junmpProcess.vo.HistoryProcessInstanceVO;
import com.junmp.junmpProcess.vo.ProcessVO;
import com.junmp.junmpProcess.vo.TaskVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import com.junmp.junmpProcess.service.Bussiness.WorkProcessService;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.*;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ActivityInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.runtime.ProcessInstanceBuilder;
import org.flowable.task.api.DelegationState;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.junmp.junmpProcess.common.CommonConstants.*;
@Slf4j
@RestController
@RequestMapping("/Bpmn")
@RequestMapping("/Process")
@Api(tags = "流程表单方法")
public class BpmnController implements BpmnDoc {
@Resource
private RepositoryService repositoryService;
@Autowired
private ProcessTemplateService processTemplateService;
@Autowired
private WorkProcessService ProcessService;
private WorkProcessService WorkProcessService;
@Override
@PostMapping(value = "create")
public Result<String> create(@RequestBody ProcessVO processVO) throws JsonProcessingException {
return WorkProcessService.createBpmn(processVO);
@Override
@PostMapping(value = "bpmn/create")
}
@ApiOperation("通过流程定义id启动流程")
@PostMapping("start")
public Result<Object> start(@RequestBody StartProcessInstanceDTO startProcessInstanceDTO) {
return WorkProcessService.start(startProcessInstanceDTO);
}
@ApiOperation("查看我发起的流程")
@PostMapping("applyList")
public Result<Page<HistoryProcessInstanceVO>> applyList(@RequestBody ApplyDTO ApplyDTO) {
return WorkProcessService.applyList(ApplyDTO);
}
@ApiOperation("查看我的待办")
@PostMapping("toDoList")
public Result<Page<TaskVO>> toDoList(@RequestBody TaskDTO taskDTO){
return WorkProcessService.toDoList(taskDTO);
}
@ApiOperation("同意按钮")
@PostMapping("agree")
public Result<Page<TaskVO>> agree(@RequestBody HandleDataDTO handleDataDTO){
return WorkProcessService.agree(handleDataDTO);
}
@ApiOperation("拒绝按钮")
@PostMapping("refuse")
public Result<Page<TaskVO>> refuse(@RequestBody HandleDataDTO handleDataDTO){
return WorkProcessService.refuse(handleDataDTO);
}
/**
* 查询表单模板数据
*
* @param templateId 模板id
* @return 模板详情数据
*/
@PostMapping(value = "getFormTemplateById")
public Object getFormTemplateById(String templateId) {
ProcessTemplates processTemplates = processTemplateService.getById(templateId);
processTemplates.setFormId(processTemplates.getTemplateId());
return R.ok(processTemplates);
}
public boolean create(@RequestBody String nodeJson) {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = null;
try {
jsonNode = objectMapper.readTree(nodeJson);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
/**
* 查询表单模板数据
*
* @param templateId 模板id
* @return 模板详情数据
*/
@ApiOperation("通过模板id查看流程信息 会附带流程定义id")
@GetMapping("detail")
public Result<ProcessTemplates> detail(@RequestParam("templateId") String templateId){
ProcessTemplates processTemplates = processTemplateService.getById(templateId);
processTemplates.setLogo(processTemplates.getIcon());
processTemplates.setFormId(processTemplates.getTemplateId());
processTemplates.setFormName(processTemplates.getTemplateName());
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("process"+templateId).latestVersion().singleResult();
if(processDefinition==null){
throw new WorkFlowException("该流程暂未接入Flowable,请重试");
}
return ProcessService.createBpmn(jsonNode);
processTemplates.setProcessDefinitionId(processDefinition.getId());
return Result.OK(processTemplates);
}
}
package com.junmp.junmpProcess.doc;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.junmp.junmpProcess.common.Result;
import com.junmp.junmpProcess.vo.ProcessVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -10,5 +13,5 @@ public interface BpmnDoc {
* bpmn划线
*/
@ApiOperation(value = "bpmn划线", tags = "bpmn划线")
boolean create(String nodeJson);
Result<String> create(ProcessVO processVO) throws JsonProcessingException;
}
package com.junmp.junmpProcess.dto;
import com.alibaba.fastjson.JSONObject;
import com.junmp.junmpProcess.dto.json.JunmpUserInfo;
import lombok.Data;
import com.junmp.junmpProcess.dto.json.UserInfo;
......@@ -15,6 +16,6 @@ import java.util.Map;
public class StartProcessInstanceDTO {
private String processDefinitionId;
private JSONObject formData;
private Map<String, List<UserInfo>> processUsers;
private UserInfo startUserInfo;
private Map<String, List<JunmpUserInfo>> processUsers;
private JunmpUserInfo startUserInfo;
}
package com.junmp.junmpProcess.dto;
import com.junmp.junmpProcess.dto.json.JunmpUserInfo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import com.junmp.junmpProcess.dto.json.UserInfo;
......@@ -11,5 +12,5 @@ import com.junmp.junmpProcess.dto.json.UserInfo;
@Data
@ApiModel("待办 需要返回给前端的VO")
public class TaskDTO extends PageDTO {
private UserInfo currentUserInfo;
private JunmpUserInfo currentUserInfo;
}
package com.junmp.junmpProcess.dto.json;
import lombok.Data;
import java.util.List;
@Data
public class ApproverGroups {
private String id;
private String approverType;
private String levelMode;
private List<String> approverIds;
private List<String> approverNames;
}
......@@ -29,12 +29,13 @@ public class ChildNode {
private String id;
private String parentId;
private String type;
private String states;
private String name;
private String desc;
private Properties props;
private ChildNode children;
private List<ChildNode> branchs;
private ChildNode childNode;
private List<ChildNode> conditionNodes;
private List<ApproverGroups> approverGroups;
private String parallelStr;
private JSONObject incoming = new JSONObject();
private Boolean typeElse;
......
package com.junmp.junmpProcess.dto.json;
import lombok.Data;
@Data
public class JunmpUserInfo {
private String userId;
private String sex;
private String name;
}
......@@ -44,11 +44,11 @@ public class ProcessTemplates implements Serializable {
/**
* 摸板表单
*/
private String formItems;
private String formJson;
private String settings;
private String process;
private String processJson;
/**
* 图标
*/
......
......@@ -4,20 +4,19 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.junmp.junmpProcess.dto.json.*;
import com.junmp.junmpProcess.exception.WorkFlowException;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import com.junmp.junmpProcess.dto.json.ChildNode;
import com.junmp.junmpProcess.dto.json.Properties;
import com.junmp.junmpProcess.dto.json.UserInfo;
import com.junmp.junmpProcess.enums.AssigneeTypeEnums;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -38,8 +37,8 @@ public class CounterSignListener implements ExecutionListener {
String currentActivityId = execution.getCurrentActivityId();
Process mainProcess = repositoryService.getBpmnModel(execution.getProcessDefinitionId()).getMainProcess();
UserTask userTask = (UserTask) mainProcess.getFlowElement(currentActivityId);
String dingDing = mainProcess.getAttributeValue("http://flowable.org/bpmn", "DingDing");
JSONObject jsonObject = JSONObject.parseObject(dingDing, new TypeReference<JSONObject>() {
String flowJson = mainProcess.getAttributeValue("http://flowable.org/bpmn", "Junmp");
JSONObject jsonObject = JSONObject.parseObject(flowJson, new TypeReference<JSONObject>() {
});
String processJson = jsonObject.getString("processJson");
ChildNode childNode = JSONObject.parseObject(processJson, new TypeReference<ChildNode>() {
......@@ -48,87 +47,114 @@ public class CounterSignListener implements ExecutionListener {
String variable = currentActivityId + "assigneeList";
List usersValue = (List) execution.getVariable(variable);
if (usersValue == null) {
ChildNode currentNode = getChildNode(childNode, currentActivityId);
if (currentNode == null) {
throw new WorkFlowException("查找审批人失败,请联系管理员重试");
}
Properties props = currentNode.getProps();
String assignedType = props.getAssignedType();
Map<String, Object> nobody = props.getNobody();
if (AssigneeTypeEnums.ASSIGN_USER.getTypeName().equals(assignedType)) {
List<UserInfo> assignedUser = props.getAssignedUser();
for (UserInfo userInfo : assignedUser) {
assigneeList.add(userInfo.getId());
ApproverGroups group=currentNode.getApproverGroups().get(0);
String Type=group.getApproverType();
if (Type.equals("1"))//指定人员,不处理
{
List<String> assignedUser = group.getApproverIds();
for (String userInfo : assignedUser) {
assigneeList.add(userInfo);
}
} else if (AssigneeTypeEnums.SELF_SELECT.getTypeName().equals(assignedType)) {
} else if (AssigneeTypeEnums.LEADER_TOP.getTypeName().equals(assignedType)) {
throw new WorkFlowException("暂不做这个功能,等发版!");
} else if (AssigneeTypeEnums.LEADER.getTypeName().equals(assignedType)) {
/*
这里代码应该怎么写??? 你想想
应该是 通过leader 的code 查出来leader里面的人 然后添加到
assigneeList.addAll() 既可
不过本项目没有添加leader的CRUD页面 所以 先这样,
怎么实现就是上述实现手段
下面角色也一样, 希望我们<布尔什维克>的
同志们
可以举一反三 一通百通
*/
// throw new WorkFlowException("当前只是简单的系统 没有RBAC功能,各位可以自己实现!");
} else if (AssigneeTypeEnums.ROLE.getTypeName().equals(assignedType)) {
// throw new WorkFlowException("当前只是简单的系统 没有RBAC功能,各位可以自己实现!");
} else if (AssigneeTypeEnums.SELF.getTypeName().equals(assignedType)) {
String startUserJson = execution.getVariable(START_USER_INFO, String.class);
UserInfo userInfo = JSONObject.parseObject(startUserJson, new TypeReference<UserInfo>() {
});
assigneeList.add(userInfo.getId());
} else if (AssigneeTypeEnums.FORM_USER.getTypeName().equals(assignedType)) {
String formUser = props.getFormUser();
List<JSONObject> assigneeUsers = execution.getVariable(formUser, List.class);
if (assigneeUsers != null) {
for (JSONObject assigneeUser : assigneeUsers) {
assigneeList.add(assigneeUser.getString("id"));
}
}
else if (Type.equals("2"))//指定角色
{
List<String> Roles=group.getApproverIds();
for (String role :Roles
) {
// assigneeList.add(role.getId());
}
}
else if (Type.equals("3"))//指定组织机构中的角色
{}
// Properties props = currentNode.getProps();
// String assignedType = props.getAssignedType();
Map<String, Object> nobody = new HashMap<>();
// if (AssigneeTypeEnums.ASSIGN_USER.getTypeName().equals(assignedType)) {
// List<UserInfo> assignedUser = props.getAssignedUser();
// for (UserInfo userInfo : assignedUser) {
// assigneeList.add(userInfo.getId());
// }
// } else if (AssigneeTypeEnums.SELF_SELECT.getTypeName().equals(assignedType)) {
//
// } else if (AssigneeTypeEnums.LEADER_TOP.getTypeName().equals(assignedType)) {
// throw new WorkFlowException("暂不做这个功能,等发版!");
// } else if (AssigneeTypeEnums.LEADER.getTypeName().equals(assignedType)) {
// /*
// 这里代码应该怎么写??? 你想想
// 应该是 通过leader 的code 查出来leader里面的人 然后添加到
// assigneeList.addAll() 既可
// 不过本项目没有添加leader的CRUD页面 所以 先这样,
// 怎么实现就是上述实现手段
// 下面角色也一样, 希望我们<布尔什维克>的
// 同志们
// 可以举一反三 一通百通
// */
//// throw new WorkFlowException("当前只是简单的系统 没有RBAC功能,各位可以自己实现!");
// } else if (AssigneeTypeEnums.ROLE.getTypeName().equals(assignedType)) {
//
//// throw new WorkFlowException("当前只是简单的系统 没有RBAC功能,各位可以自己实现!");
// } else if (AssigneeTypeEnums.SELF.getTypeName().equals(assignedType)) {
// String startUserJson = execution.getVariable(START_USER_INFO, String.class);
// UserInfo userInfo = JSONObject.parseObject(startUserJson, new TypeReference<UserInfo>() {
// });
// assigneeList.add(userInfo.getId());
// } else if (AssigneeTypeEnums.FORM_USER.getTypeName().equals(assignedType)) {
// String formUser = props.getFormUser();
// List<JSONObject> assigneeUsers = execution.getVariable(formUser, List.class);
// if (assigneeUsers != null) {
// for (JSONObject assigneeUser : assigneeUsers) {
// assigneeList.add(assigneeUser.getString("id"));
// }
// }
//
// }
if (CollUtil.isEmpty(assigneeList)) {
String handler = MapUtil.getStr(nobody, "handler");
if ("TO_PASS".equals(handler)) {
assigneeList.add("100000");
execution.setVariable(variable, assigneeList);
} else if ("TO_REFUSE".equals(handler)) {
execution.setVariable("autoRefuse", Boolean.TRUE);
assigneeList.add("100000");
execution.setVariable(variable, assigneeList);
} else if ("TO_ADMIN".equals(handler)) {
assigneeList.add("381496");
execution.setVariable(variable, assigneeList);
} else if ("TO_USER".equals(handler)) {
Object assignedUserObj = nobody.get("assignedUser");
if (assignedUserObj != null) {
List<JSONObject> assignedUser = (List<JSONObject>) assignedUserObj;
if (assignedUser.size() > 0) {
for (JSONObject object : assignedUser) {
assigneeList.add(object.getString("id"));
}
execution.setVariable(variable, assigneeList);
} else {
assigneeList.add("100000");
execution.setVariable(variable, assigneeList);
}
// if (CollUtil.isEmpty(assigneeList)) {
// String handler = MapUtil.getStr(nobody, "handler");
// if ("TO_PASS".equals(handler)) {
// assigneeList.add("100000");
// execution.setVariable(variable, assigneeList);
// } else if ("TO_REFUSE".equals(handler)) {
// execution.setVariable("autoRefuse", Boolean.TRUE);
// assigneeList.add("100000");
// execution.setVariable(variable, assigneeList);
// } else if ("TO_ADMIN".equals(handler)) {
// assigneeList.add("381496");
// execution.setVariable(variable, assigneeList);
// } else if ("TO_USER".equals(handler)) {
// Object assignedUserObj = nobody.get("assignedUser");
// if (assignedUserObj != null) {
// List<JSONObject> assignedUser = (List<JSONObject>) assignedUserObj;
// if (assignedUser.size() > 0) {
// for (JSONObject object : assignedUser) {
// assigneeList.add(object.getString("id"));
// }
// execution.setVariable(variable, assigneeList);
// } else {
// assigneeList.add("100000");
// execution.setVariable(variable, assigneeList);
// }
//
// }
//
// } else {
// throw new WorkFlowException("找不到审批人,请检查配置!!!");
// }
// } else {
// execution.setVariable(variable, assigneeList);
// }
if (assigneeList.size()!=0)
{execution.setVariable(variable, assigneeList);}
}
} else {
throw new WorkFlowException("找不到审批人,请检查配置!!!");
}
} else {
execution.setVariable(variable, assigneeList);
}
} else {
}
}
......
package com.junmp.junmpProcess.service.Bussiness;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.junmp.junmpProcess.common.Result;
import com.junmp.junmpProcess.dto.ApplyDTO;
......@@ -8,10 +9,7 @@ import com.junmp.junmpProcess.dto.HandleDataDTO;
import com.junmp.junmpProcess.dto.StartProcessInstanceDTO;
import com.junmp.junmpProcess.dto.TaskDTO;
import com.junmp.junmpProcess.entity.ProcessTemplates;
import com.junmp.junmpProcess.vo.HandleDataVO;
import com.junmp.junmpProcess.vo.HistoryProcessInstanceVO;
import com.junmp.junmpProcess.vo.MultiVO;
import com.junmp.junmpProcess.vo.TaskVO;
import com.junmp.junmpProcess.vo.*;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
......@@ -24,7 +22,7 @@ public interface WorkProcessService {
*
* @return
*/
boolean createBpmn(JsonNode flowdto);
Result<String> createBpmn(ProcessVO processVO) throws JsonProcessingException;
/**
* 获取用户可见表单
......
......@@ -5,9 +5,12 @@ import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Lists;
import com.junmp.junmpProcess.dto.*;
import com.junmp.junmpProcess.dto.json.*;
import com.junmp.junmpProcess.exception.WorkFlowException;
import com.junmp.junmpProcess.service.Bussiness.WorkProcessService;
import com.junmp.junmpProcess.service.Repository.ProcessTemplateService;
......@@ -26,6 +29,7 @@ import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
......@@ -37,10 +41,6 @@ import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import com.junmp.junmpProcess.common.Result;
import com.junmp.junmpProcess.common.WorkFlowConstants;
import com.junmp.junmpProcess.dto.json.ChildNode;
import com.junmp.junmpProcess.dto.json.FormOperates;
import com.junmp.junmpProcess.dto.json.SettingsInfo;
import com.junmp.junmpProcess.dto.json.UserInfo;
import com.junmp.junmpProcess.dto.json.flowJson.FlowChildNode;
import com.junmp.junmpProcess.dto.json.flowJson.Inout;
import com.junmp.junmpProcess.entity.ProcessTemplates;
......@@ -72,30 +72,18 @@ public class WorkProcessServiceImpl implements WorkProcessService {
private TaskService taskService;
public boolean createBpmn(JsonNode FlowDTO) {
// 一.准备工作
BpmnModel bpmnModel = new BpmnModel();
Process process = new Process(); // 相当于图纸
bpmnModel.addProcess(process);
process.setId("Process_" + UUID.randomUUID());
process.setExecutable(true);
// 二.开始结束节点
StartEvent startEvent = new StartEvent();// 新建开始节点
startEvent.setId("_start");
process.addFlowElement(startEvent);// 绘制到图纸
EndEvent endEvent = new EndEvent(); // 新建结束节点
endEvent.setId("_end");// 绘制到图纸
process.addFlowElement(endEvent);
// 三.递归绘制节点
drawNode(process, FlowDTO, "_start", "_end", null);
// 四.自动布局
new BpmnAutoLayout(bpmnModel).execute();
// 五.转xml
BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
byte[] convertToXML = bpmnXMLConverter.convertToXML(bpmnModel);
String xml = new String(convertToXML);
xml = xml.replaceAll("&lt;", "<").replaceAll("&gt;", ">");
return true;
public Result<String> createBpmn(ProcessVO processVO) throws JsonProcessingException {
//流程定义
ObjectMapper objectMapper = new ObjectMapper();
JsonNode processJsonNode = objectMapper.readTree(processVO.getProcessJson());
JsonNode formJsonNode = objectMapper.readTree(processVO.getFormJson());
String formName=processVO.getFormName().toString();
//将json转换为bpmn
BpmnModel bpmnModel = processTemplateService.toBpmn(processJsonNode,formJsonNode,formName);
Deployment deploy = repositoryService.createDeployment()
.addBpmnModel(bpmnModel.getProcesses().get(0).getId()+".bpmn20.xml", bpmnModel)
.deploy();
return Result.OK(deploy.getId());
}
/**
......@@ -332,14 +320,13 @@ public class WorkProcessServiceImpl implements WorkProcessService {
public Object getFormGroups(String templateId) {
ProcessTemplates processTemplates = processTemplateService.getById(templateId);
processTemplates.setLogo(processTemplates.getIcon());
processTemplates.setFormId(processTemplates.getTemplateId());
processTemplates.setFormName(processTemplates.getTemplateName());
processTemplates.setFormName(processTemplates.getFormName());
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey(PROCESS_PREFIX + templateId).latestVersion().singleResult();
if (processDefinition == null) {
throw new WorkFlowException("该流程暂未接入Flowable,请重试");
}
processTemplates.setProcessDefinitionId(processDefinition.getId());
// processTemplates.setProcessDefinitionId(processDefinition.getId());
return processTemplates;
// return null;
}
......@@ -352,14 +339,14 @@ public class WorkProcessServiceImpl implements WorkProcessService {
@Override
public Result<ProcessTemplates> detail(String templateId) {
ProcessTemplates processTemplates = processTemplateService.getById(templateId);
processTemplates.setLogo(processTemplates.getIcon());
// processTemplates.setLogo(processTemplates.getIcon());
processTemplates.setFormId(processTemplates.getTemplateId());
processTemplates.setFormName(processTemplates.getTemplateName());
processTemplates.setFormName(processTemplates.getFormName());
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey(PROCESS_PREFIX + templateId).latestVersion().singleResult();
if (processDefinition == null) {
throw new WorkFlowException("该流程暂未接入Flowable,请重试");
}
processTemplates.setProcessDefinitionId(processDefinition.getId());
// processTemplates.setProcessDefinitionId(processDefinition.getId());
return Result.OK(processTemplates);
}
......@@ -375,28 +362,61 @@ public class WorkProcessServiceImpl implements WorkProcessService {
JSONObject formData = processInstanceDto.getFormData();
UserInfo startUserInfo = processInstanceDto.getStartUserInfo();
Authentication.setAuthenticatedUserId(startUserInfo.getId());
Map<String, Object> processVariables = new HashMap<>();
processVariables.put(FORM_VAR, formData);
processVariables.put(PROCESS_STATUS, BUSINESS_STATUS_1);
processVariables.put(START_USER_INFO, JSONObject.toJSONString(startUserInfo));
ArrayList<UserInfo> userInfos = CollUtil.newArrayList(startUserInfo);
processVariables.put("root", JSONObject.toJSONString(userInfos));
JunmpUserInfo startUserInfo = processInstanceDto.getStartUserInfo();
Map<String,Object> processVariables= new HashMap<>();
processVariables.put(FORM_VAR,formData);
processVariables.put(START_USER_INFO,JSONObject.toJSONString(startUserInfo));
ArrayList<JunmpUserInfo> userInfos = CollUtil.newArrayList(startUserInfo);
Map formValue = JSONObject.parseObject(formData.toJSONString(), new TypeReference<Map>() {
});
processVariables.putAll(formValue);
ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder();
ProcessInstance processInstance = processInstanceBuilder
.processDefinitionId(processInstanceDto.getProcessDefinitionId())
.variable("initiator",startUserInfo.getUserId())
.variables(processVariables)
.businessStatus(BUSINESS_STATUS_1)
.start();
//手动完成第一个任务
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
Object ts=new Object();
if(task!=null){
taskService.complete(task.getId());
}
// ProcessInstance processInstance = processInstanceBuilder
// .variable("initiator",startUserInfo.getUserId()).start();
// .
// Authentication.setAuthenticatedUserId(startUserInfo.getUserId());
// Map<String,Object> processVariables= new HashMap<>();
// processVariables.put(FORM_VAR,formData);
// processVariables.put(PROCESS_STATUS,BUSINESS_STATUS_1);
// processVariables.put(START_USER_INFO,JSONObject.toJSONString(startUserInfo));
// ArrayList<JunmpUserInfo> userInfos = CollUtil.newArrayList(startUserInfo);
// processVariables.put("root",JSONObject.toJSONString(userInfos));
// Map formValue = JSONObject.parseObject(formData.toJSONString(), new TypeReference<Map>() {
// });
// processVariables.putAll(formValue);
// ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder();
// ProcessInstance processInstance = processInstanceBuilder
// .processDefinitionId(processInstanceDto.getProcessDefinitionId())
// .variables(processVariables)
// .businessStatus(BUSINESS_STATUS_1)
// .start();
return Result.OK(processInstance.getId());
} catch (Exception e) {
}
catch (Exception e){
Throwable cause = e.getCause();
if (cause instanceof WorkFlowException) {
WorkFlowException workFlowException = (WorkFlowException) cause;
if(cause instanceof WorkFlowException){
WorkFlowException workFlowException=(WorkFlowException)cause;
return Result.error(workFlowException.getMessage());
}
e.printStackTrace();
......@@ -462,37 +482,38 @@ public class WorkProcessServiceImpl implements WorkProcessService {
*/
@Override
public Result<Page<TaskVO>> toDoList(TaskDTO taskDTO) {
List<Task> tasks = taskService.createTaskQuery().taskAssignee(taskDTO.getCurrentUserInfo().getId())
List<Task> tasks = taskService.createTaskQuery().taskAssignee(taskDTO.getCurrentUserInfo().getUserId())
.includeProcessVariables()
.orderByTaskCreateTime().desc()
.listPage((taskDTO.getPageNo() - 1) * taskDTO.getPageSize(), taskDTO.getPageSize());
long count = taskService.createTaskQuery().taskAssignee(taskDTO.getCurrentUserInfo().getId()).count();
List<TaskVO> taskVOS = new ArrayList<>();
Page<TaskVO> page = new Page<>();
long count = taskService.createTaskQuery().taskAssignee(taskDTO.getCurrentUserInfo().getUserId()).count();
List<TaskVO> taskVOS= new ArrayList<>();
Page<TaskVO> page =new Page<>();
List<String> taskIds= new ArrayList<>();
for (Task task : tasks) {
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
Map<String, Object> processVariables = task.getProcessVariables();
}
Map<Long, JunmpUserInfo> collect=new HashMap<>();
for (Task task : tasks) {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
Map<String, Object> processVariables = task.getProcessVariables();
TaskVO taskVO = new TaskVO();
TaskVO taskVO=new TaskVO();
taskVO.setTaskId(task.getId());
taskVO.setProcessInstanceId(task.getProcessInstanceId());
taskVO.setProcessDefinitionName(bpmnModel.getMainProcess().getName());
taskVO.setStartUser(JSONObject.parseObject(MapUtil.getStr(processVariables, START_USER_INFO), new TypeReference<UserInfo>() {
}));
taskVO.setStartTime(historicProcessInstance.getStartTime());
Execution execution = runtimeService.createExecutionQuery().executionId(task.getProcessInstanceId()).singleResult();
String activityId = execution.getActivityId();
if (StringUtils.isBlank(activityId)) {
taskVO.setCurrentActivityName("");
} else {
FlowElement flowElement = bpmnModel.getMainProcess().getFlowElement(activityId);
taskVO.setCurrentActivityName(flowElement.getName());
}
taskVO.setStartUser(JSONObject.parseObject(MapUtil.getStr(processVariables,START_USER_INFO),new TypeReference<UserInfo>(){}));
taskVO.setStartTime(processInstance.getStartTime());
taskVO.setCurrentActivityName(getCurrentName(processInstance.getId(),false,processInstance.getProcessDefinitionId()));
taskVO.setBusinessStatus(MapUtil.getStr(processVariables, PROCESS_STATUS));
taskVO.setBusinessStatus(MapUtil.getStr(processVariables,PROCESS_STATUS));
taskVO.setTaskCreatedTime(task.getCreateTime());
DelegationState delegationState = task.getDelegationState();
if (delegationState != null) {
if(delegationState!=null){
taskVO.setDelegationState(delegationState);
}
taskVOS.add(taskVO);
......@@ -513,13 +534,13 @@ public class WorkProcessServiceImpl implements WorkProcessService {
@Override
public Result<Page<TaskVO>> doneList(TaskDTO taskDTO) {
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
.taskAssignee(taskDTO.getCurrentUserInfo().getId())
.taskAssignee(taskDTO.getCurrentUserInfo().getUserId())
.finished()
.includeProcessVariables()
.orderByTaskCreateTime().desc()
.listPage((taskDTO.getPageNo() - 1) * taskDTO.getPageSize(), taskDTO.getPageSize());
long count = historyService.createHistoricTaskInstanceQuery()
.taskAssignee(taskDTO.getCurrentUserInfo().getId()).count();
.taskAssignee(taskDTO.getCurrentUserInfo().getUserId()).count();
List<TaskVO> taskVOS = new ArrayList<>();
Page<TaskVO> page = new Page<>();
for (HistoricTaskInstance task : tasks) {
......@@ -565,33 +586,62 @@ public class WorkProcessServiceImpl implements WorkProcessService {
String comments = handleDataDTO.getComments();
JSONObject formData = handleDataDTO.getFormData();
String taskId = handleDataDTO.getTaskId();
String processInstanceId=handleDataDTO.getProcessInstanceId();
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
Map<String, Object> map = new HashMap<>();
if (formData != null && formData.size() > 0) {
Map formValue = JSONObject.parseObject(formData.toJSONString(), new TypeReference<Map>() {
});
map.putAll(formValue);
map.put(FORM_VAR, formData);
}
if (task!=null)//task为空则说明当前任务可能已结束
{
Map<String, Object> map = new HashMap<>();
if (formData != null && formData.size() > 0) {
Map formValue = JSONObject.parseObject(formData.toJSONString(), new TypeReference<Map>() {
});
map.putAll(formValue);
map.put(FORM_VAR, formData);
}
runtimeService.setVariables(task.getProcessInstanceId(), map);//设置进入当前流程
Authentication.setAuthenticatedUserId(currentUserInfo.getId());
if (StringUtils.isNotBlank(comments)) {
taskService.addComment(task.getId(), task.getProcessInstanceId(), "opinion", comments);
}
if (attachments != null && attachments.size() > 0) {
for (AttachmentDTO attachment : attachments) {
taskService.createAttachment("option", taskId, task.getProcessInstanceId(), attachment.getName(), attachment.getName(), attachment.getUrl());
}
}
if (StringUtils.isNotBlank(handleDataDTO.getSignInfo())) {
taskService.addComment(task.getId(), task.getProcessInstanceId(), "sign", handleDataDTO.getSignInfo());
}
taskService.complete(task.getId());
HistoricTaskInstance historicTask = historyService
.createHistoricTaskInstanceQuery()
.taskId(taskId)
.singleResult();
if (historicTask.getEndTime()!=null)//EndTime为空,说明任务已结束,需要往消息队列中进行消息传递
{
HistoricProcessInstance historicProcessInstance= historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId)
.includeProcessVariables().singleResult();//拿到历史中的表单信息
Map<String, Object> processVariables = historicProcessInstance.getProcessVariables();
JSONObject jsonObject = (JSONObject) processVariables.get(FORM_VAR);
runtimeService.setVariables(task.getProcessInstanceId(), map);//设置进入当前流程
Authentication.setAuthenticatedUserId(currentUserInfo.getId());
if (StringUtils.isNotBlank(comments)) {
taskService.addComment(task.getId(), task.getProcessInstanceId(), "opinion", comments);
}
if (attachments != null && attachments.size() > 0) {
for (AttachmentDTO attachment : attachments) {
taskService.createAttachment("option", taskId, task.getProcessInstanceId(), attachment.getName(), attachment.getName(), attachment.getUrl());
}
return Result.OK();
}
else {
if (StringUtils.isNotBlank(handleDataDTO.getSignInfo())) {
taskService.addComment(task.getId(), task.getProcessInstanceId(), "sign", handleDataDTO.getSignInfo());
return Result.error("当前任务已结束");
}
taskService.complete(task.getId());
return Result.OK();
}
@Override
......@@ -927,10 +977,10 @@ public class WorkProcessServiceImpl implements WorkProcessService {
.includeProcessVariables().singleResult();
String processDefinitionKey = historicProcessInstance.getProcessDefinitionKey();
ProcessTemplates processTemplates = processTemplateService.getById(processDefinitionKey.replace(PROCESS_PREFIX, ""));
processTemplates.setLogo(processTemplates.getIcon());
// processTemplates.setLogo(processTemplates.getIcon());
processTemplates.setFormId(processTemplates.getTemplateId());
processTemplates.setFormName(processTemplates.getTemplateName());
processTemplates.setProcessDefinitionId(historicProcessInstance.getProcessDefinitionId());
processTemplates.setFormName(processTemplates.getFormName());
// processTemplates.setProcessDefinitionId(historicProcessInstance.getProcessDefinitionId());
HandleDataVO handleDataVO = new HandleDataVO();
Map<String, Object> processVariables = historicProcessInstance.getProcessVariables();
......@@ -938,7 +988,7 @@ public class WorkProcessServiceImpl implements WorkProcessService {
handleDataVO.setProcessInstanceId(historicProcessInstance.getId());
JSONObject jsonObject = (JSONObject) processVariables.get(FORM_VAR);
handleDataVO.setFormData(jsonObject);
String process = processTemplates.getProcess();
String process = processTemplates.getProcessJson();
ChildNode childNode = JSONObject.parseObject(process, new TypeReference<ChildNode>() {
});
SettingsInfo settingsInfo = JSONObject.parseObject(processTemplates.getSettings(), new TypeReference<SettingsInfo>() {
......
package com.junmp.junmpProcess.service.Repository;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fasterxml.jackson.databind.JsonNode;
import com.junmp.junmpProcess.entity.ProcessTemplates;
import org.flowable.bpmn.model.BpmnModel;
/**
* @author : willian fu
......@@ -9,5 +11,10 @@ import com.junmp.junmpProcess.entity.ProcessTemplates;
*/
public interface ProcessTemplateService extends IService<ProcessTemplates> {
/**
* 获取用户可见表单
*
* @return
*/
public BpmnModel toBpmn(JsonNode processNode, JsonNode formNode,String formName);
}
package com.junmp.junmpProcess.service.Repository.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.junmp.junmpProcess.common.WorkFlowConstants;
import com.junmp.junmpProcess.dto.json.flowJson.Inout;
import com.junmp.junmpProcess.entity.ProcessTemplates;
import com.junmp.junmpProcess.mapper.ProcessTemplatesMapper;
import com.junmp.junmpProcess.service.Repository.ProcessTemplateService;
import com.junmp.junmpProcess.utils.IdWorker;
import com.junmp.junmpProcess.utils.JsonToELConverter;
import org.flowable.bpmn.BpmnAutoLayout;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.delegate.TaskListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import static com.junmp.junmpProcess.common.WorkFlowConstants.START_EVENT_ID;
import static com.junmp.junmpProcess.utils.BpmnModelUtils.createEndEvent;
import static com.junmp.junmpProcess.utils.BpmnModelUtils.createStartEvent;
import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION;
/**
* @author : willian fu
* @version : 1.0
......@@ -15,4 +39,306 @@ import org.springframework.stereotype.Service;
public class ProcessTemplateServiceImpl extends ServiceImpl<ProcessTemplatesMapper, ProcessTemplates> implements
ProcessTemplateService {
@Resource
private IdWorker idWorker;
@Autowired
private ProcessTemplateService processTemplateService;
public BpmnModel toBpmn(JsonNode processNode, JsonNode formNode,String formName) {
//表单存储
String formItems = formNode.toString();
String templateId = idWorker.nextId()+"";
ProcessTemplates processTemplates = ProcessTemplates.builder().build();
processTemplates.setTemplateId(templateId);
processTemplates.setFormJson(formItems);
processTemplates.setProcessJson(processNode.toString());
processTemplates.setIsStop(false);
Date date= new Date();
processTemplates.setCreated(date);
processTemplates.setUpdated(date);
processTemplateService.save(processTemplates);
JSONObject jsonObject=new JSONObject();
jsonObject.put("processJson", processNode.toString());
jsonObject.put("formJson", formItems);
// 一.准备工作
BpmnModel bpmnModel = new BpmnModel();
String id=""+ UUID.randomUUID();
bpmnModel.setTargetNamespace(id+"");
ExtensionAttribute extensionAttribute=new ExtensionAttribute();
extensionAttribute.setName("Junmp");
extensionAttribute.setNamespace("http://flowable.org/bpmn");
extensionAttribute.setValue(jsonObject.toJSONString());
Process process = new Process(); // 相当于图纸
process.setName(formName);
process.setId("Process_"+templateId);
process.setExecutable(true);
process.addAttribute(extensionAttribute);
bpmnModel.addProcess(process);
// 二.开始结束节点
// 二.开始结束节点
StartEvent startEvent = new StartEvent();// 新建开始节点
startEvent.setId("_start");
startEvent.setInitiator("initiator");
process.addFlowElement(startEvent);// 绘制到图纸
EndEvent endEvent = new EndEvent(); // 新建结束节点
endEvent.setId("_end");// 绘制到图纸
process.addFlowElement(endEvent);
// 三.递归绘制节点
drawNode("root",process, processNode,formNode, "_start", "_end", null);
// 四.自动布局
new BpmnAutoLayout(bpmnModel).execute();
// 五.转xml
return bpmnModel;
}
/**
* 绘制节点
* @param process bpmn process 图纸
* @param node json的节点
* @param preId 上一节点id
* @param endId 结束节点
* @param preExpression 上一节点表达式
*/
public void drawNode(String typeNode,Process process, JsonNode node,JsonNode formJson, String preId, String endId, String preExpression) {
// 根据type绘制不同种类的节点
Inout inout = drawNodeByType(process, node,formJson,typeNode);
// 绘制前一根线
process.addFlowElement(createSequenceFlow(preId, inout.getIn(), preExpression));
if (node.get("childNode").toString().equals("null")) {
// 没有下一步, 绘制指向结束的线
process.addFlowElement(createSequenceFlow(inout.getOut(), endId, null));
} else {
// 有下一步, 递归绘制下一个节点
drawNode("",process, node.get("childNode"),formJson, inout.getOut(), endId, null);
}
}
/**
* 绘制不同种类节点
* @param process
* @param node
* @return Inout
*/
private Inout drawNodeByType(Process process, JsonNode node,JsonNode formJson,String typeNode) {
if (node.get("type").toString().equals("0")) { //标准节点
return drawBzNode(process, node,formJson,typeNode);
} else if (node.get("type").toString().equals("1")) {//审核节点
return drawAuditNode(process, node);
} else if (node.get("type").toString().equals("4")) {//路由
return drawExclusiveNode(process, node);
}
else {
throw new IllegalArgumentException();
}
}
/**
* 绘制标准节点
* @param process
* @param node
* @return Inout
*/
private Inout drawBzNode(Process process, JsonNode node,JsonNode formJson,String typeNode) {
// String id= "Node_"+UUID.randomUUID();
String id="Node_"+ node.get("id").asText();
//创建发起人结点
UserTask task = new UserTask();
//设置结点ID
task.setId(id);
//设置结点名称
task.setName(node.get("name").asText());
//通过将 ${initiator} 作为指派人的值,可以将用户任务分配给流程的发起人。当流程实例启动时,${initiator} 会被替换为实际的发起人信息。
//需要注意的是,在使用表达式时,需要确保流程引擎的配置中启用了表达式语言(例如使用 Flowable 的默认配置,会启用表达式语言)。
task.setAssignee("${initiator}");
List<FormProperty> formProperties = formJsonToFormProperty(formJson);
task.setFormProperties(formProperties);
//添加连线
process.addFlowElement(task);
return new Inout(id, id);
}
private List<FormProperty> formJsonToFormProperty(JsonNode formJson){
List<FormProperty> formList=new ArrayList<>();
for (JsonNode listInfo : formJson.get("list")) {
FormProperty form=new FormProperty();
JsonNode key=listInfo.get("key");
form.setId(key.asText());
form.setName(key.asText());
formList.add(form);
}
return formList;
}
/**
* 绘制审核节点
* @param process
* @param node
* @return Inout
*/
private Inout drawAuditNode(Process process, JsonNode node) {
// 绘制节点
// String id = "Node_"+UUID.randomUUID();
String id ="Node_"+ node.get("id").asText();
UserTask userTask = new UserTask();
userTask.setId(id);
//写入节点名称
userTask.setName(node.get("name").asText());
ObjectMapper objectMapper = new ObjectMapper();
JsonNode[] approverGroups = objectMapper.convertValue(node.get("approverGroups"), JsonNode[].class);
userTask.setExecutionListeners(getTaskListeners());//角色监听
MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics();
// 审批人集合参数
multiInstanceLoopCharacteristics.setInputDataItem(userTask.getId()+"assigneeList");
// 迭代集合
multiInstanceLoopCharacteristics.setElementVariable("assigneeName");
// 并行
multiInstanceLoopCharacteristics.setSequential(false);
userTask.setAssignee("${assigneeName}");
// 设置多实例属性
userTask.setLoopCharacteristics(multiInstanceLoopCharacteristics);
// for (int i = 0; i < approverGroups.length; i++) {
// JsonNode element = approverGroups[i];
// JsonNode approverType = element.get("approverType");
// JsonNode[] approverIds = objectMapper.convertValue(element.get("approverIds"), JsonNode[].class);
// if (approverType != null) {
// //指定人员
// if(approverType.asText().equals("1")){
// for(int j=0;j<approverIds.length;j++){
// userTask.setAssignee(approverIds[j].asText());
// }
// }
// else
// {
//
//// if("1".equals(examineMode)){
//// multiInstanceLoopCharacteristics.setSequential(true);
//// }
//// else if("3".equals(examineMode)){
//// multiInstanceLoopCharacteristics.setCompletionCondition("${nrOfCompletedInstances/nrOfInstances > 0}");
//// }
//
// }
// //指定角色
//// if(approverType.asText().equals("2")){
////
//// userTask.setAssignee(""); //去掉指点人员
//// for(int j=0;j<approverIds.length;j++){
//// //设置后选角色
//// userTask.getCandidateGroups().add(approverIds[j].asText());
////
//// }
////
//// }
//// //指定本组织机构中的某个角色
//// if(approverType.asText().equals("3")){
//// userTask.setAssignee(""); //去掉指点人员
//// for(int j=0;j<approverIds.length;j++){
//// //设置后选角色
//// userTask.getCandidateGroups().add(approverIds[j].asText());
//// }
////
//// }
//
//
//
// }
//
// }
process.addFlowElement(userTask);
return new Inout(id, id);
}
/**
* 监听任务启动后角色分配事件
*
* @return 监听节点列表
*/
private List<FlowableListener> getTaskListeners() {
ArrayList<FlowableListener> taskListeners = new ArrayList<>();
//监听器开始class
FlowableListener listener = new FlowableListener();
listener.setEvent(ExecutionListener.EVENTNAME_START);//监听任务启动
listener.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
listener.setImplementation("${counterSignListener}");//启动角色分配监听事件
taskListeners.add(listener);
return taskListeners;
}
/**
* 绘制分支节点
* @param process 绘图对象
* @param node 当前节点信息
* @return Inout
*/
private Inout drawExclusiveNode(Process process, JsonNode node) {
// 开始网关
// String startId = "Exclusive_"+UUID.randomUUID();
String startId = "Exclusive_"+UUID.randomUUID();
ExclusiveGateway startGateway = new ExclusiveGateway();
startGateway.setId(startId);
process.addFlowElement(startGateway);
// 结束网关
String endId = "Exclusive_"+UUID.randomUUID();
ExclusiveGateway endGateway = new ExclusiveGateway();
endGateway.setId(endId);
process.addFlowElement(endGateway);
// 绘制分支
JsonNode branches = node.get("conditionNodes");
for (JsonNode branch : branches) {
if (branch.get("childNode").toString().equals("null")) {
// 没有子流程,直接绘制结束 内容为EL表达式
//解释JSON数据,转换为EL表达式
JsonNode conditionGroup=branch.get("conditionGroup");
String condition = JsonToELConverter.convertToEL(conditionGroup);
//条件线路 根前端数据对接 内容为EL表达式
process.addFlowElement(createSequenceFlow(startId, endId, condition));
} else {
// 有子流程,递归绘制子流程
//解释JSON数据,转换为EL表达式
JsonNode conditionGroup=branch.get("conditionGroup");
//把JSOn转换为EL表达式
String condition = JsonToELConverter.convertToEL(conditionGroup);
//条件线路 根前端数据对接 内容为EL表达式
drawNode("",process, branch.get("childNode"),null, startId, endId, condition);
}
}
// int和out不一样
return new Inout(startId, endId);
}
/**
* 创建连线
* @param from 起点
* @param to 终点
* @return SequenceFlow
*/
public SequenceFlow createSequenceFlow(String from, String to, String conditionExpression) {
SequenceFlow flow = new SequenceFlow();
flow.setId("Node_"+UUID.randomUUID());
flow.setSourceRef(from);
flow.setTargetRef(to);
if (conditionExpression != null) {
flow.setConditionExpression(conditionExpression);
}
return flow;
}
}
package com.junmp.junmpProcess.utils;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.junmp.junmpProcess.dto.json.flowJson.Inout;
import com.junmp.junmpProcess.entity.ProcessTemplates;
import org.flowable.bpmn.BpmnAutoLayout;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import javax.annotation.Resource;
import java.util.*;
public class BpmnConvert {
public BpmnModel toBpmn(JsonNode node,JsonNode formNode) {
//表单存储
// String remark = flowEngineDTO.getRemark();
// String formItems = flowEngineDTO.getFormItems();
// String formName = flowEngineDTO.getFormName();
// String logo = flowEngineDTO.getLogo();
// Integer groupId = flowEngineDTO.getGroupId();
// String templateId = idWorker.nextId()+"";
// ProcessTemplates processTemplates = ProcessTemplates.builder().build();
// processTemplates.setTemplateId(templateId);
// processTemplates.setTemplateName(formName);
// processTemplates.setGroupId(groupId);
// processTemplates.setFormItems(formItems);
// processTemplates.setProcess(processJson);
// processTemplates.setIcon(logo);
// processTemplates.setBackground(logo);
// processTemplates.setNotify(settingsInfo.getNotify().toJSONString());
// String adminInfo = JSONObject.toJSONString(settingsInfo.getAdmin());
// processTemplates.setSettings(settingsJson);
// processTemplates.setWhoCommit(adminInfo);
// processTemplates.setWhoEdit(adminInfo);
// processTemplates.setWhoExport(adminInfo);
// processTemplates.setRemark(flowEngineDTO.getRemark());
// processTemplates.setIsStop(false);
// Date date= new Date();
// processTemplates.setCreated(date);
// processTemplates.setUpdated(date);
// processTemplateService.save(processTemplates);
// 一.准备工作
BpmnModel bpmnModel = new BpmnModel();
String id=""+UUID.randomUUID();
Process process = new Process(); // 相当于图纸
bpmnModel.addProcess(process);
process.setId("Process_"+ id);
process.setExecutable(true);
// 二.开始结束节点
StartEvent startEvent = new StartEvent();// 新建开始节点
startEvent.setId("_start");
process.addFlowElement(startEvent);// 绘制到图纸
EndEvent endEvent = new EndEvent(); // 新建结束节点
endEvent.setId("_end");// 绘制到图纸
process.addFlowElement(endEvent);
// 三.递归绘制节点
drawNode(process, node,formNode, "_start", "_end", null);
// 四.自动布局
new BpmnAutoLayout(bpmnModel).execute();
// 五.转xml
// BpmnXMLConverter bpmnXMLConverter=new BpmnXMLConverter();
// byte[] convertToXML = bpmnXMLConverter.convertToXML(bpmnModel);
// String xml=new String(convertToXML);
// xml = xml.replaceAll("&lt;","<").replaceAll("&gt;",">");
return bpmnModel;
}
/**
* 绘制节点
* @param process bpmn process 图纸
* @param node json的节点
* @param preId 上一节点id
* @param endId 结束节点
* @param preExpression 上一节点表达式
*/
public void drawNode(Process process, JsonNode node,JsonNode formJson, String preId, String endId, String preExpression) {
// 根据type绘制不同种类的节点
Inout inout = drawNodeByType(process, node,formJson);
// 绘制前一根线
process.addFlowElement(createSequenceFlow(preId, inout.getIn(), preExpression));
if (node.get("childNode").toString().equals("null")) {
// 没有下一步, 绘制指向结束的线
process.addFlowElement(createSequenceFlow(inout.getOut(), endId, null));
} else {
// 有下一步, 递归绘制下一个节点
drawNode(process, node.get("childNode"),formJson, inout.getOut(), endId, null);
}
}
/**
* 绘制不同种类节点
* @param process
* @param node
* @return Inout
*/
private Inout drawNodeByType(Process process, JsonNode node,JsonNode formJson) {
if (node.get("type").toString().equals("0")) { //标准节点
return drawBzNode(process, node,formJson);
} else if (node.get("type").toString().equals("1")) {//审核节点
return drawAuditNode(process, node);
} else if (node.get("type").toString().equals("4")) {//路由
return drawExclusiveNode(process, node);
}
else {
throw new IllegalArgumentException();
}
}
/**
* 绘制标准节点
* @param process
* @param node
* @return Inout
*/
private Inout drawBzNode(Process process, JsonNode node,JsonNode formJson) {
// 绘制节点 创建自动执行任务节点
String id = "Node_"+UUID.randomUUID();
//创建发起人结点
UserTask task = new UserTask();
//设置结点ID
task.setId(id);
//设置结点名称
task.setName(node.get("name").toString());
//通过将 ${initiator} 作为指派人的值,可以将用户任务分配给流程的发起人。当流程实例启动时,${initiator} 会被替换为实际的发起人信息。
//需要注意的是,在使用表达式时,需要确保流程引擎的配置中启用了表达式语言(例如使用 Flowable 的默认配置,会启用表达式语言)。
task.setAssignee("${initiator}");
List<FormProperty> formProperties = formJsonToFormProperty(formJson);
task.setFormProperties(formProperties);
//添加连线
process.addFlowElement(task);
return new Inout(id, id);
}
private List<FormProperty> formJsonToFormProperty(JsonNode formJson){
List<FormProperty> formList=new ArrayList<>();
for (JsonNode listInfo : formJson.get("list")) {
FormProperty form=new FormProperty();
form.setName(listInfo.get("key").toString());
formList.add(form);
}
return formList;
}
/**
* 绘制审核节点
* @param process
* @param node
* @return Inout
*/
private Inout drawAuditNode(Process process, JsonNode node) {
// 绘制节点
String id = "Node_"+UUID.randomUUID();
UserTask userTask = new UserTask();
userTask.setId(id);
//写入节点名称
userTask.setName(node.get("name").toString());
ObjectMapper objectMapper = new ObjectMapper();
JsonNode[] approverGroups = objectMapper.convertValue(node.get("approverGroups"), JsonNode[].class);
for (int i = 0; i < approverGroups.length; i++) {
JsonNode element = approverGroups[i];
JsonNode approverType = element.get("approverType");
JsonNode[] approverIds = objectMapper.convertValue(element.get("approverIds"), JsonNode[].class);
if (approverType != null) {
//指定人员
if(approverType.asText().equals("1")){
for(int j=0;j<approverIds.length;j++){
userTask.setAssignee(approverIds[j].asText());
}
}
//指定角色
if(approverType.asText().equals("2")){
userTask.setAssignee(""); //去掉指点人员
for(int j=0;j<approverIds.length;j++){
//设置后选角色
userTask.getCandidateGroups().add(approverIds[j].asText());
}
}
//指定本部门中的某个角色
if(approverType.asText().equals("3")){
userTask.setAssignee(""); //去掉指点人员
for(int j=0;j<approverIds.length;j++){
//设置后选角色
userTask.getCandidateGroups().add(approverIds[j].asText());
}
// 设置任务监听器 获取本部门的角色才可进行审批
userTask.setTaskListeners(getTaskListeners());
}
}
}
process.addFlowElement(userTask);
return new Inout(id, id);
}
/**
* 获取用户任务监听节点
*
* @return 监听节点列表
*/
private List<FlowableListener> getTaskListeners() {
List<FlowableListener> taskListeners = new ArrayList<>();
//监听器开始class
FlowableListener listener = new FlowableListener();
listener.setEvent("all");
listener.setImplementationType("class");
listener.setImplementation("org.example.MultiInstanceTaskListener");
taskListeners.add(listener);
return taskListeners;
}
/**
* 绘制分支节点
* @param process 绘图对象
* @param node 当前节点信息
* @return Inout
*/
private Inout drawExclusiveNode(Process process, JsonNode node) {
// 开始网关
String startId = "Exclusive_"+UUID.randomUUID();
ExclusiveGateway startGateway = new ExclusiveGateway();
startGateway.setId(startId);
process.addFlowElement(startGateway);
// 结束网关
String endId = "Exclusive_"+UUID.randomUUID();
ExclusiveGateway endGateway = new ExclusiveGateway();
endGateway.setId(endId);
process.addFlowElement(endGateway);
// 绘制分支
JsonNode branches = node.get("conditionNodes");
for (JsonNode branch : branches) {
if (branch.get("childNode").toString().equals("null")) {
// 没有子流程,直接绘制结束 内容为EL表达式
//解释JSON数据,转换为EL表达式
JsonNode conditionGroup=branch.get("conditionGroup");
String condition = JsonToELConverter.convertToEL(conditionGroup);
//条件线路 根前端数据对接 内容为EL表达式
process.addFlowElement(createSequenceFlow(startId, endId, condition));
} else {
// 有子流程,递归绘制子流程
//解释JSON数据,转换为EL表达式
JsonNode conditionGroup=branch.get("conditionGroup");
//把JSOn转换为EL表达式
String condition = JsonToELConverter.convertToEL(conditionGroup);
//条件线路 根前端数据对接 内容为EL表达式
drawNode(process, branch.get("childNode"),null, startId, endId, condition);
}
}
// int和out不一样
return new Inout(startId, endId);
}
/**
* 创建连线
* @param from 起点
* @param to 终点
* @return SequenceFlow
*/
public SequenceFlow createSequenceFlow(String from, String to, String conditionExpression) {
SequenceFlow flow = new SequenceFlow();
flow.setId("Node_"+UUID.randomUUID());
flow.setSourceRef(from);
flow.setTargetRef(to);
if (conditionExpression != null) {
flow.setConditionExpression(conditionExpression);
}
return flow;
}
}
\ No newline at end of file
......@@ -279,7 +279,7 @@ public class BpmnModelUtils {
incoming.put("incoming", Collections.singletonList(fromId));
String id = createTask(process, flowNode, sequenceFlows, childNodeMap);
// 如果当前任务还有后续任务,则遍历创建后续任务
ChildNode children = flowNode.getChildren();
ChildNode children = flowNode.getChildNode();
if (Objects.nonNull(children) && StringUtils.isNotBlank(children.getId())) {
return create(id, children, process, bpmnModel, sequenceFlows, childNodeMap);
} else {
......@@ -291,7 +291,7 @@ public class BpmnModelUtils {
incoming.put("incoming", Collections.singletonList(fromId));
String id = createTask(process, flowNode, sequenceFlows, childNodeMap);
// 如果当前任务还有后续任务,则遍历创建后续任务
ChildNode children = flowNode.getChildren();
ChildNode children = flowNode.getChildNode();
if (Objects.nonNull(children) && StringUtils.isNotBlank(children.getId())) {
return create(id, children, process, bpmnModel, sequenceFlows, childNodeMap);
} else {
......@@ -340,10 +340,10 @@ public class BpmnModelUtils {
process.addFlowElement(exclusiveGateway);
process.addFlowElement(connect(formId, exclusiveGatewayId, sequenceFlows, childNodeMap, process));
if (Objects.isNull(flowNode.getBranchs()) && Objects.isNull(flowNode.getChildren())) {
if (Objects.isNull(flowNode.getConditionNodes()) && Objects.isNull(flowNode.getChildNode())) {
return exclusiveGatewayId;
}
List<ChildNode> flowNodes = flowNode.getBranchs();
List<ChildNode> flowNodes = flowNode.getConditionNodes();
List<String> incoming = Lists.newArrayListWithCapacity(flowNodes.size());
List<JSONObject> conditions = Lists.newCopyOnWriteArrayList();
for (ChildNode element : flowNodes) {
......@@ -352,7 +352,7 @@ public class BpmnModelUtils {
exclusiveGateway.setDefaultFlow(element.getId());
}
childNodeMap.put(element.getId(), element);
ChildNode childNode = element.getChildren();
ChildNode childNode = element.getChildNode();
String nodeName = element.getName();
Properties props = element.getProps();
......@@ -395,7 +395,7 @@ public class BpmnModelUtils {
}
ChildNode childNode = flowNode.getChildren();
ChildNode childNode = flowNode.getChildNode();
if (Objects.nonNull(childNode) && StringUtils.isNotBlank(childNode.getId())) {
String parentId = childNode.getParentId();
......@@ -418,8 +418,8 @@ public class BpmnModelUtils {
incomingObj.put("incoming", incoming);
FlowElement flowElement = bpmnModel.getFlowElement(incoming.get(0));
// 1.0 先进行边连接, 暂存 nextNode
ChildNode nextNode = childNode.getChildren();
childNode.setChildren(null);
ChildNode nextNode = childNode.getChildNode();
childNode.setChildNode(null);
String identifier = endExId;
for (int i = 0; i < incoming.size(); i++) {
process.addFlowElement(connect(incoming.get(i), identifier, sequenceFlows, childNodeMap, process));
......@@ -504,15 +504,15 @@ public class BpmnModelUtils {
process.addFlowElement(parallelGateway);
process.addFlowElement(connect(formId, parallelGatewayId, sequenceFlows, childNodeMap, process));
if (Objects.isNull(flowNode.getBranchs()) && Objects.isNull(flowNode.getChildren())) {
if (Objects.isNull(flowNode.getConditionNodes()) && Objects.isNull(flowNode.getChildNode())) {
return parallelGatewayId;
}
List<ChildNode> flowNodes = flowNode.getBranchs();
List<ChildNode> flowNodes = flowNode.getConditionNodes();
List<String> incoming = Lists.newArrayListWithCapacity(flowNodes.size());
for (ChildNode element : flowNodes) {
childNodeMap.put(element.getId(), element);
ChildNode childNode = element.getChildren();
ChildNode childNode = element.getChildNode();
if (Objects.isNull(childNode) || StringUtils.isBlank(childNode.getId())) {
incoming.add(parallelGatewayId);
continue;
......@@ -523,7 +523,7 @@ public class BpmnModelUtils {
}
}
ChildNode childNode = flowNode.getChildren();
ChildNode childNode = flowNode.getChildNode();
if (Objects.nonNull(childNode) && StringUtils.isNotBlank(childNode.getId())) {
String parentId = childNode.getParentId();
ChildNode parentChildNode = childNodeMap.get(parentId);
......@@ -546,8 +546,8 @@ public class BpmnModelUtils {
incomingObj.put("incoming", incoming);
FlowElement flowElement = bpmnModel.getFlowElement(incoming.get(0));
// 1.0 先进行边连接, 暂存 nextNode
ChildNode nextNode = childNode.getChildren();
childNode.setChildren(null);
ChildNode nextNode = childNode.getChildNode();
childNode.setChildNode(null);
String identifier = endExId;
for (int i = 0; i < incoming.size(); i++) {
FlowElement flowElement1 = bpmnModel.getFlowElement(incoming.get(i));
......@@ -579,8 +579,8 @@ public class BpmnModelUtils {
incomingObj.put("incoming", incoming);
FlowElement flowElement = bpmnModel.getFlowElement(incoming.get(0));
// 1.0 先进行边连接, 暂存 nextNode
ChildNode nextNode = childNode.getChildren();
childNode.setChildren(null);
ChildNode nextNode = childNode.getChildNode();
childNode.setChildNode(null);
String identifier = endExId;
for (int i = 0; i < incoming.size(); i++) {
FlowElement flowElement1 = bpmnModel.getFlowElement(incoming.get(i));
......@@ -796,7 +796,7 @@ public class BpmnModelUtils {
Set<String> set = childNodeMap.keySet();
for (String s : set) {
if (StringUtils.isNotBlank(s)) {
if (s.equals(nodeId)) {
if (("Node_"+s).equals(nodeId)) {
return childNodeMap.get(s);
}
}
......@@ -806,8 +806,8 @@ public class BpmnModelUtils {
private static void getChildNode(ChildNode childNode, Map<String, ChildNode> childNodeMap) {
childNodeMap.put(childNode.getId(), childNode);
List<ChildNode> branchs = childNode.getBranchs();
ChildNode children = childNode.getChildren();
List<ChildNode> branchs = childNode.getConditionNodes();
ChildNode children = childNode.getChildNode();
if (branchs != null && branchs.size() > 0) {
for (ChildNode branch : branchs) {
if (StringUtils.isNotBlank(branch.getId())) {
......
package com.junmp.junmpProcess.utils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonToELConverter {
private static final ObjectMapper objectMapper = new ObjectMapper();
public static String convertToEL(JsonNode jsonNode) {
StringBuilder expressionBuilder = new StringBuilder();
JsonNode[] jsonArray = objectMapper.convertValue(jsonNode, JsonNode[].class);
// 递归构建EL表达式
buildExpression(expressionBuilder, jsonArray);
return expressionBuilder.toString();
}
private static void buildExpression(StringBuilder expressionBuilder, JsonNode[] jsonArray) {
for (int i = 0; i < jsonArray.length; i++) {
JsonNode element = jsonArray[i];
JsonNode conditionNode = element.get("condition");
JsonNode conditionsNode = element.get("conditions");
if (conditionNode != null && conditionNode.isTextual() && conditionsNode != null && conditionsNode.isArray()) {
String condition = conditionNode.asText();
JsonNode[] conditions = objectMapper.convertValue(conditionsNode, JsonNode[].class);
if (i > 0) {
expressionBuilder.append(" ");
expressionBuilder.append("||");
expressionBuilder.append(" ");
}
// expressionBuilder.append("(");
for (int j = 0; j < conditions.length; j++) {
JsonNode conditionObject = conditions[j];
JsonNode columnValueNode = conditionObject.get("columnValue");
JsonNode optTypeNode = conditionObject.get("optType");
JsonNode conditionValueNode = conditionObject.get("conditionValue");
if ( columnValueNode != null && columnValueNode.isTextual()
&& optTypeNode != null && optTypeNode.isTextual()
&& conditionValueNode != null && conditionValueNode.isArray()) {
String columnValue = columnValueNode.asText();
String optType = optTypeNode.asText();
JsonNode[] conditionValues = objectMapper.convertValue(conditionValueNode, JsonNode[].class);
if (j > 0) {
expressionBuilder.append(" ");
expressionBuilder.append("&&");
expressionBuilder.append(" ");
}
expressionBuilder.append("${");
expressionBuilder.append(columnValue);
expressionBuilder.append(" ");
expressionBuilder.append(optType);
expressionBuilder.append(" ");
expressionBuilder.append(conditionValues[0].asText());
expressionBuilder.append("}");
}
}
// expressionBuilder.append(")");
}
}
}
}
\ No newline at end of file
package com.junmp.junmpProcess.vo;
import lombok.Data;
@Data
public class ProcessVO {
private String formJson;
private String formName;
private String processJson;
}
......@@ -105,6 +105,7 @@ com\junmp\junmpProcess\controller\OrgUserAndDeptController.class
com\junmp\junmpProcess\controller\WorkspaceProcessController$5.class
com\junmp\junmpProcess\mapper\ProcessTemplatesMapper.class
com\junmp\junmpProcess\vo\AttachmentVO.class
com\junmp\junmpProcess\vo\ProcessVO.class
com\junmp\junmpProcess\common\Result.class
com\junmp\junmpProcess\vo\OrgTreeVo$OrgTreeVoBuilder.class
com\junmp\junmpProcess\controller\WorkspaceProcessController$8.class
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论