diff --git a/src/main/java/com/qs/serve/modules/bpm/common/enums/NodeType.java b/src/main/java/com/qs/serve/modules/bpm/common/enums/NodeType.java new file mode 100644 index 0000000..3f15ee4 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/common/enums/NodeType.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.bpm.common.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author YenHex + * @since 2022/9/9 + */ +@Getter +@AllArgsConstructor +public enum NodeType { + + Start("start"), + Approval("approval"); + + String name; + + public boolean eq(String key){ + if (this.name.equals(key)){ + return true; + } + return false; + } + +} diff --git a/src/main/java/com/qs/serve/modules/bpm/common/util/DeployBpmnUtil.java b/src/main/java/com/qs/serve/modules/bpm/common/util/DeployBpmnUtil.java index 413165a..599221b 100644 --- a/src/main/java/com/qs/serve/modules/bpm/common/util/DeployBpmnUtil.java +++ b/src/main/java/com/qs/serve/modules/bpm/common/util/DeployBpmnUtil.java @@ -1,8 +1,16 @@ package com.qs.serve.modules.bpm.common.util; -import com.qs.serve.modules.bpm.entity.dto.DeployBpmnBo; -import com.qs.serve.modules.bpm.entity.dto.DeployViewerDto; +import com.qs.serve.common.util.IdUtil; +import com.qs.serve.common.util.StringUtils; +import com.qs.serve.modules.bpm.common.enums.NodeType; +import com.qs.serve.modules.bpm.entity.dto.DeployBucketDTO; +import com.qs.serve.modules.bpm.entity.dto.DeployNodeBo; import org.flowable.bpmn.model.BpmnModel; +import org.flowable.bpmn.model.SequenceFlow; +import org.flowable.bpmn.model.StartEvent; +import org.flowable.bpmn.model.UserTask; + +import java.util.ArrayList; /** * 视图转换工具类 @@ -13,12 +21,51 @@ public class DeployBpmnUtil { /** * 视图转换 - * @param viewer + * @param node * @return */ - public static BpmnModel toBpmnModel(DeployViewerDto viewer){ - + public static BpmnModel toBpmnModel(DeployNodeBo node){ + DeployBucketDTO bucketDTO = new DeployBucketDTO(); + bucketDTO.setSequenceFlows(new ArrayList<>()); + bucketDTO.setUserTaskList(new ArrayList<>()); + recursiveNode(null,node,bucketDTO); return new BpmnModel(); } + public static void recursiveNode(DeployNodeBo parentNode,DeployNodeBo node, DeployBucketDTO bucketDTO){ + String nodeType = node.getType(); + if(NodeType.Start.eq(nodeType)){ + node.setNodeLabel(StringUtils.hasText(node.getNodeLabel()) ? "开始节点" : node.getNodeLabel()); + StartEvent startEvent = new StartEvent(); + startEvent.setId(node.getNodeId()); + startEvent.setName(node.getNodeLabel()); + bucketDTO.setStartEvent(startEvent); + }else if (NodeType.Approval.eq(nodeType)){ + UserTask userTask = new UserTask(); + + }else{ + + } + + //条件解析器 + String conditionExpression = null; + + if(parentNode!=null){ + SequenceFlow s2 = new SequenceFlow(); + s2.setId(createId()); + s2.setName(parentNode.getNodeLabel()+"到"+node.getNodeLabel()); + s2.setSourceRef(parentNode.getNodeId()); + s2.setTargetRef(node.getNodeId()); + s2.setConditionExpression(conditionExpression); + bucketDTO.getSequenceFlows().add(s2); + } + + + } + + + private static String createId(){ + return IdUtil.nanoId(9); + } + } diff --git a/src/main/java/com/qs/serve/modules/bpm/controller/FlowDefinitionController.java b/src/main/java/com/qs/serve/modules/bpm/controller/FlowDefinitionController.java index 5a5a1ac..444006e 100644 --- a/src/main/java/com/qs/serve/modules/bpm/controller/FlowDefinitionController.java +++ b/src/main/java/com/qs/serve/modules/bpm/controller/FlowDefinitionController.java @@ -75,7 +75,7 @@ public class FlowDefinitionController { * @param variables 变量集合,json对象 * @return */ - @PostMapping("/start/{procDefId}") + //@PostMapping("/start/{procDefId}") public R start(@PathVariable(value = "procDefId") String procDefId, @RequestBody Map variables) { flowDefinitionService.startProcessInstanceById(procDefId, variables); return R.ok(); diff --git a/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployApprovalConfigBo.java b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployApprovalConfigBo.java new file mode 100644 index 0000000..662eaa4 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployApprovalConfigBo.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.bpm.entity.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @author YenHex + * @since 2022/9/8 + */ +@Data +public class DeployApprovalConfigBo { + + private List approvalPersonnel; + + /** + * 多人审批类型 0会签 1或签 + */ + private String multiplePersonnelApprovalType; + + /** + * 或签通过人数 + */ + private String approvalPersonnelPassCount; + +} diff --git a/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployBpmnBo.java b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployBpmnBo.java index bd279e1..ce81a64 100644 --- a/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployBpmnBo.java +++ b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployBpmnBo.java @@ -3,7 +3,6 @@ package com.qs.serve.modules.bpm.entity.dto; import lombok.Data; import javax.validation.constraints.NotNull; -import java.util.List; /** * @author YenHex @@ -21,6 +20,6 @@ public class DeployBpmnBo { /** 前端视图对象 */ @NotNull(message = "流程视图布局不可为空") - private DeployViewerDto viewer; + private DeployNodeBo viewer; } diff --git a/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployBucketDTO.java b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployBucketDTO.java new file mode 100644 index 0000000..274ad13 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployBucketDTO.java @@ -0,0 +1,26 @@ +package com.qs.serve.modules.bpm.entity.dto; + +import lombok.Data; +import org.flowable.bpmn.model.EndEvent; +import org.flowable.bpmn.model.SequenceFlow; +import org.flowable.bpmn.model.StartEvent; +import org.flowable.bpmn.model.UserTask; +import java.util.List; + +/** + * 基础Bpmn所有节点 + * @author YenHex + * @since 2022/9/9 + */ +@Data +public class DeployBucketDTO { + + private StartEvent startEvent; + + private EndEvent endEvent; + + private List userTaskList; + + private List sequenceFlows; + +} diff --git a/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployCcConfigBo.java b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployCcConfigBo.java new file mode 100644 index 0000000..77eb12e --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployCcConfigBo.java @@ -0,0 +1,15 @@ +package com.qs.serve.modules.bpm.entity.dto; + +import lombok.Data; +import java.util.List; + +/** + * @author YenHex + * @since 2022/9/8 + */ +@Data +public class DeployCcConfigBo { + + private List ccPersonnel; + +} diff --git a/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployConditionBo.java b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployConditionBo.java new file mode 100644 index 0000000..84ca6d0 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployConditionBo.java @@ -0,0 +1,65 @@ +package com.qs.serve.modules.bpm.entity.dto; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +/** + * @author YenHex + * @since 2022/9/8 + */ +@Data +@Slf4j +public class DeployConditionBo { + + private String id; + + private String type; + + /** + * 表单项ID + */ + private String field; + + private DeployCompare compares; + + public DeployConditionSimpleDto toSimpleDto(){ + DeployConditionSimpleDto simpleDto = new DeployConditionSimpleDto(); + simpleDto.setId(this.id); + simpleDto.setType(this.type); + simpleDto.setField(this.field); + try { + simpleDto.setCompareType(this.getCompares().getCompareType().getValue()); + simpleDto.setCompareValue(this.getCompares().getCompareValue().getValue()); + } catch (Exception e) { + log.warn("条件获取失效"); + return null; + } + return simpleDto; + } + + @Data + public static class DeployCompare{ + private DeployCompareType compareType; + private DeployCompareValue compareValue; + } + + @Data + public static class DeployCompareType{ + private String value; + } + + @Data + public static class DeployCompareValue{ + private String value; + } + + @Data + public static class DeployConditionSimpleDto{ + private String id; + private String type; + private String field; + private String compareType; + private String compareValue; + } + +} diff --git a/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployConditionConfigBo.java b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployConditionConfigBo.java new file mode 100644 index 0000000..102a478 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployConditionConfigBo.java @@ -0,0 +1,14 @@ +package com.qs.serve.modules.bpm.entity.dto; + +import lombok.Data; +import java.util.List; +/** + * @author YenHex + * @since 2022/9/8 + */ +@Data +public class DeployConditionConfigBo { + + private List conditions; + +} diff --git a/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployNodeBo.java b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployNodeBo.java new file mode 100644 index 0000000..4388350 --- /dev/null +++ b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployNodeBo.java @@ -0,0 +1,46 @@ +package com.qs.serve.modules.bpm.entity.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import java.util.List; +/** + * @author YenHex + * @since 2022/8/15 + */ +@Data +public class DeployNodeBo { + + private String nodeId; + + private String nodeLabel; + + /** + * approval -- userTask + * branch -- ex-gateway x2 + * condition -- flow + * cc + * stat + * end + */ + private String type; + + private DeployApprovalConfigBo approvalNodeConfig; + + private DeployCcConfigBo ccNodeConfig; + + private DeployConditionConfigBo conditionNodeConfig; + + private List conditionNodes; + + private DeployNodeBo childNode; + +// @JsonIgnore +// private String bpmnId; +// +// @JsonIgnore +// private String bpmnName; +// +// @JsonIgnore +// private String bpmnLabel; + +} diff --git a/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployViewerDto.java b/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployViewerDto.java deleted file mode 100644 index a6344e0..0000000 --- a/src/main/java/com/qs/serve/modules/bpm/entity/dto/DeployViewerDto.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.qs.serve.modules.bpm.entity.dto; - -import lombok.Data; -import java.util.List; -/** - * @author YenHex - * @since 2022/8/15 - */ -@Data -public class DeployViewerDto { - - private String nodeId; - - private String nodeLabel; - - /** - * approval -- userTask - * branch -- ex-gateway x2 - * condition -- flow - * stat - * end - */ - private String type; - - private List conditions; - - private List conditionNodes; - - private List childNode; - -} diff --git a/src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowDefinitionServiceImpl.java b/src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowDefinitionServiceImpl.java index 0c563ef..85e11d8 100644 --- a/src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowDefinitionServiceImpl.java +++ b/src/main/java/com/qs/serve/modules/bpm/service/impl/IFlowDefinitionServiceImpl.java @@ -1,5 +1,6 @@ package com.qs.serve.modules.bpm.service.impl; +import com.qs.serve.common.framework.security.model.LoginUser; import com.qs.serve.common.util.Assert; import com.qs.serve.common.util.AuthContextUtils; import com.qs.serve.modules.bpm.common.consts.ProcessConstants; @@ -54,7 +55,8 @@ public class IFlowDefinitionServiceImpl extends FlowServiceFactory implements IF // variables.put("skip", true); // variables.put(ProcessConstants.FLOWABLE_SKIP_EXPRESSION_ENABLED, true); // 设置流程发起人Id到流程中 - identityService.setAuthenticatedUserId("TODO"); + LoginUser loginUser = AuthContextUtils.getLoginUser(); + identityService.setAuthenticatedUserId(loginUser.getUserId()); variables.put(ProcessConstants.PROCESS_INITIATOR, ""); ProcessInstance processInstance = runtimeService.startProcessInstanceById(procDefId, variables); // 给第一步申请人节点设置任务执行人和意见 todo:第一个节点不设置为申请人节点有点问题? diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 6b77927..8181e23 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,14 +1,14 @@ #服务配置 server: - port: 7777 + port: 7200 servlet: context-path: / #SpringBoot相关 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - #url: jdbc:mysql://192.168.0.9:3333/qs-base-bpm-demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true - url: jdbc:mysql://192.168.0.9:3333/qs-base-bpm-demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true + #url: jdbc:mysql://192.168.0.9:3306/gy_oa_qs?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai + url: jdbc:mysql://192.168.0.9:3333/qs-base-bpm?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: 123456 redis: