From ccac93e4a82d7de3e261e604dfe3866be997b946 Mon Sep 17 00:00:00 2001 From: asp_ly Date: Sat, 14 Dec 2024 22:56:04 +0800 Subject: [PATCH] 1 --- .../api/WorkflowDefinitionApiController.java | 124 +-- .../converter/WorkflowInstanceConverter.java | 15 + .../dto/WorkflowInstanceCreateDTO.java | 50 +- .../workflow/dto/WorkflowInstanceDTO.java | 91 +- .../workflow/entity/WorkflowDefinition.java | 3 + .../workflow/entity/WorkflowInstance.java | 5 +- .../IWorkflowDefinitionRepository.java | 4 + ....java => IWorkflowInstanceRepository.java} | 8 +- .../service/IWorkflowDefinitionService.java | 6 +- .../service/IWorkflowInstanceService.java | 3 +- .../impl/WorkflowDefinitionServiceImpl.java | 37 +- .../impl/WorkflowInstanceServiceImpl.java | 188 ++-- .../util/WorkflowDefinitionGraph.java | 229 ----- .../db/migration/V1.0.0__init_schema.sql | 934 ++++++++++-------- .../db/migration/V1.0.1__init_data.sql | 6 +- 15 files changed, 806 insertions(+), 897 deletions(-) create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/converter/WorkflowInstanceConverter.java rename backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/{WorkflowInstanceRepository.java => IWorkflowInstanceRepository.java} (70%) delete mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/util/WorkflowDefinitionGraph.java diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java index 5c13570b..49fe4b41 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/api/WorkflowDefinitionApiController.java @@ -69,16 +69,14 @@ public class WorkflowDefinitionApiController extends BaseController startWorkflow( + public Response startWorkflow( @Parameter(description = "流程标识", required = true) @RequestParam String processKey, @Parameter(description = "业务标识", required = true) @RequestParam String businessKey ) { Map variables = new HashMap<>(); - try { // 同步创建实例,立即返回实例ID - WorkflowInstanceCreateDTO result = workflowDefinitionService.startWorkflow(processKey, businessKey, variables); - return Response.success(result); + return Response.success(workflowDefinitionService.startWorkflow(processKey, businessKey, variables)); } catch (Exception e) { log.error("Failed to start workflow", e); return Response.error(ResponseCode.WORKFLOW_EXECUTION_ERROR); @@ -119,48 +117,49 @@ public class WorkflowDefinitionApiController extends BaseController activities = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId) - .orderByHistoricActivityInstanceStartTime() - .asc() - .list(); - - List activityInstances = activities.stream() - .map(activity -> { - WorkflowInstanceDTO.ActivityInstance activityInstance = new WorkflowInstanceDTO.ActivityInstance(); - activityInstance.setId(activity.getId()); - activityInstance.setActivityId(activity.getActivityId()); - activityInstance.setActivityName(activity.getActivityName()); - activityInstance.setActivityType(activity.getActivityType()); - activityInstance.setStartTime(activity.getStartTime()); - activityInstance.setEndTime(activity.getEndTime()); - activityInstance.setDurationInMillis(activity.getDurationInMillis()); - - // 如果是Shell任务,获取Shell相关变量 - if ("serviceTask".equals(activity.getActivityType())) { - Map variables = historicProcessInstance.getProcessVariables(); - activityInstance.setShellOutput((String) variables.get("shellOutput")); - activityInstance.setShellError((String) variables.get("shellError")); - activityInstance.setShellExitCode((Integer) variables.get("shellExitCode")); - } - - return activityInstance; - }) - .collect(Collectors.toList()); - - instanceDTO.setActivities(activityInstances); - - return Response.success(instanceDTO); +// instanceDTO.setProcessDefinitionId(historicProcessInstance.getProcessDefinitionId()); +// instanceDTO.setBusinessKey(historicProcessInstance.getBusinessKey()); +// instanceDTO.setStartTime(historicProcessInstance.getStartTime()); +// instanceDTO.setEndTime(historicProcessInstance.getEndTime()); +// instanceDTO.setDurationInMillis(historicProcessInstance.getDurationInMillis()); +// instanceDTO.setStartUserId(historicProcessInstance.getStartUserId()); +// instanceDTO.setStatus(historicProcessInstance.getEndTime() != null ? WorkflowInstanceStatusEnums.COMPLETED : WorkflowInstanceStatusEnums.RUNNING); +// instanceDTO.setVariables(historicProcessInstance.getProcessVariables()); +// +// // 查询活动节点历史 +// List activities = historyService.createHistoricActivityInstanceQuery() +// .processInstanceId(processInstanceId) +// .orderByHistoricActivityInstanceStartTime() +// .asc() +// .list(); +// +// List activityInstances = activities.stream() +// .map(activity -> { +// WorkflowInstanceDTO.ActivityInstance activityInstance = new WorkflowInstanceDTO.ActivityInstance(); +// activityInstance.setId(activity.getId()); +// activityInstance.setActivityId(activity.getActivityId()); +// activityInstance.setActivityName(activity.getActivityName()); +// activityInstance.setActivityType(activity.getActivityType()); +// activityInstance.setStartTime(activity.getStartTime()); +// activityInstance.setEndTime(activity.getEndTime()); +// activityInstance.setDurationInMillis(activity.getDurationInMillis()); +// +// // 如果是Shell任务,获取Shell相关变量 +// if ("serviceTask".equals(activity.getActivityType())) { +// Map variables = historicProcessInstance.getProcessVariables(); +// activityInstance.setShellOutput((String) variables.get("shellOutput")); +// activityInstance.setShellError((String) variables.get("shellError")); +// activityInstance.setShellExitCode((Integer) variables.get("shellExitCode")); +// } +// +// return activityInstance; +// }) +// .collect(Collectors.toList()); +// +// instanceDTO.setActivities(activityInstances); +// +// return Response.success(instanceDTO);' + return Response.success(); } @Operation(summary = "获取工作流执行状态") @@ -183,23 +182,24 @@ public class WorkflowDefinitionApiController extends BaseController instanceDTOs = historicProcessInstances.stream() - .map(historicProcessInstance -> { - WorkflowInstanceDTO instanceDTO = new WorkflowInstanceDTO(); -// instanceDTO.setId(historicProcessInstance.getId()); - instanceDTO.setProcessDefinitionId(historicProcessInstance.getProcessDefinitionId()); - instanceDTO.setBusinessKey(historicProcessInstance.getBusinessKey()); - instanceDTO.setStartTime(historicProcessInstance.getStartTime()); - instanceDTO.setEndTime(historicProcessInstance.getEndTime()); - instanceDTO.setDurationInMillis(historicProcessInstance.getDurationInMillis()); - instanceDTO.setStartUserId(historicProcessInstance.getStartUserId()); - instanceDTO.setStatus(historicProcessInstance.getEndTime() != null ? WorkflowInstanceStatusEnums.COMPLETED : WorkflowInstanceStatusEnums.RUNNING); - instanceDTO.setVariables(historicProcessInstance.getProcessVariables()); - return instanceDTO; - }) - .collect(Collectors.toList()); +// List instanceDTOs = historicProcessInstances.stream() +// .map(historicProcessInstance -> { +// WorkflowInstanceDTO instanceDTO = new WorkflowInstanceDTO(); +//// instanceDTO.setId(historicProcessInstance.getId()); +// instanceDTO.setProcessDefinitionId(historicProcessInstance.getProcessDefinitionId()); +// instanceDTO.setBusinessKey(historicProcessInstance.getBusinessKey()); +// instanceDTO.setStartTime(historicProcessInstance.getStartTime()); +// instanceDTO.setEndTime(historicProcessInstance.getEndTime()); +// instanceDTO.setDurationInMillis(historicProcessInstance.getDurationInMillis()); +// instanceDTO.setStartUserId(historicProcessInstance.getStartUserId()); +// instanceDTO.setStatus(historicProcessInstance.getEndTime() != null ? WorkflowInstanceStatusEnums.COMPLETED : WorkflowInstanceStatusEnums.RUNNING); +// instanceDTO.setVariables(historicProcessInstance.getProcessVariables()); +// return instanceDTO; +// }) +// .collect(Collectors.toList()); - return Response.success(instanceDTOs); +// return Response.success(instanceDTOs); + return Response.success(); } @Operation(summary = "获取节点实时日志") diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/converter/WorkflowInstanceConverter.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/converter/WorkflowInstanceConverter.java new file mode 100644 index 00000000..5b48a894 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/converter/WorkflowInstanceConverter.java @@ -0,0 +1,15 @@ +package com.qqchen.deploy.backend.workflow.converter; + +import com.qqchen.deploy.backend.framework.converter.BaseConverter; +import com.qqchen.deploy.backend.workflow.dto.WorkflowDefinitionDTO; +import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO; +import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition; +import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; +import org.mapstruct.Mapper; + +/** + * 工作流定义转换器 + */ +@Mapper(config = BaseConverter.class) +public interface WorkflowInstanceConverter extends BaseConverter { +} diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowInstanceCreateDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowInstanceCreateDTO.java index 81301c01..55c62f04 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowInstanceCreateDTO.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowInstanceCreateDTO.java @@ -1,21 +1,47 @@ package com.qqchen.deploy.backend.workflow.dto; import com.qqchen.deploy.backend.framework.dto.BaseDTO; +import com.qqchen.deploy.backend.workflow.enums.WorkflowInstanceStatusEnums; import lombok.Data; +import java.time.LocalDateTime; + @Data public class WorkflowInstanceCreateDTO extends BaseDTO { - private String processInstanceId; - private String processDefinitionKey; - private String businessKey; - private String status; // CREATING, RUNNING, ERROR - public static WorkflowInstanceCreateDTO of(String processInstanceId, String processDefinitionKey, String businessKey) { - WorkflowInstanceCreateDTO dto = new WorkflowInstanceCreateDTO(); - dto.setProcessInstanceId(processInstanceId); - dto.setProcessDefinitionKey(processDefinitionKey); - dto.setBusinessKey(businessKey); - dto.setStatus("CREATING"); - return dto; - } + /** + * 流程实例ID + */ + private String processInstanceId; + + /** + * 流程定义ID + */ + private Long processDefinitionId; + + /** + * 业务标识 + */ + private String businessKey; + + /** + * 实例状态 + */ + private WorkflowInstanceStatusEnums status; + + /** + * 流程变量(JSON) + */ + private String variables; + + /** + * 开始时间 + */ + private LocalDateTime startTime; + + /** + * 结束时间 + */ + private LocalDateTime endTime; + } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowInstanceDTO.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowInstanceDTO.java index 6b9674e9..59fef30f 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowInstanceDTO.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/WorkflowInstanceDTO.java @@ -4,6 +4,8 @@ import com.qqchen.deploy.backend.framework.dto.BaseDTO; import com.qqchen.deploy.backend.workflow.enums.WorkflowInstanceStatusEnums; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; + +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.Map; @@ -12,64 +14,39 @@ import java.util.Map; @Schema(description = "工作流实例信息") public class WorkflowInstanceDTO extends BaseDTO { - @Schema(description = "流程定义ID") + /** + * 流程实例ID + */ + private String processInstanceId; + + /** + * 流程定义ID + */ private String processDefinitionId; - - @Schema(description = "业务标识") + + /** + * 业务标识 + */ private String businessKey; - - @Schema(description = "开始时间") - private Date startTime; - - @Schema(description = "结束时间") - private Date endTime; - - @Schema(description = "执行时长(毫秒)") - private Long durationInMillis; - - @Schema(description = "启动用户ID") - private String startUserId; - - @Schema(description = "状态(RUNNING/COMPLETED/FAILED)") + + /** + * 实例状态 + */ private WorkflowInstanceStatusEnums status; - - @Data - @Schema(description = "活动节点信息") - public static class ActivityInstance { - @Schema(description = "活动ID") - private String id; - - @Schema(description = "活动定义ID") - private String activityId; - - @Schema(description = "活动名称") - private String activityName; - - @Schema(description = "活动类型") - private String activityType; - - @Schema(description = "开始时间") - private Date startTime; - - @Schema(description = "结束时间") - private Date endTime; - - @Schema(description = "执行时长(毫秒)") - private Long durationInMillis; - - @Schema(description = "Shell输出") - private String shellOutput; - - @Schema(description = "Shell错误") - private String shellError; - - @Schema(description = "Shell退出码") - private Integer shellExitCode; - } - - @Schema(description = "活动节点列表") - private List activities; - - @Schema(description = "流程变量") - private Map variables; + + /** + * 流程变量(JSON) + */ + private String variables; + + /** + * 开始时间 + */ + private LocalDateTime startTime; + + /** + * 结束时间 + */ + private LocalDateTime endTime; + } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/WorkflowDefinition.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/WorkflowDefinition.java index f576644f..79387526 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/WorkflowDefinition.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/WorkflowDefinition.java @@ -36,6 +36,9 @@ public class WorkflowDefinition extends Entity { */ @Column(name = "`key`", nullable = false) private String key; + + @Column(name = "process_definition_id", nullable = false) + private String processDefinitionId; /** * 流程版本 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/WorkflowInstance.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/WorkflowInstance.java index 21726e52..5958c946 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/WorkflowInstance.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/entity/WorkflowInstance.java @@ -30,7 +30,10 @@ public class WorkflowInstance extends Entity { * 流程定义ID */ @Column(name = "process_definition_id", nullable = false) - private Long processDefinitionId; + private String processDefinitionId; + + @Column(name = "workflow_definition_id", nullable = false) + private Long workflowDefinitionId; /** * 业务标识 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowDefinitionRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowDefinitionRepository.java index 13f8cca5..503b1d08 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowDefinitionRepository.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowDefinitionRepository.java @@ -4,6 +4,8 @@ import com.qqchen.deploy.backend.framework.repository.IBaseRepository; import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition; import org.springframework.stereotype.Repository; +import java.util.Optional; + /** * 工作流定义仓库 */ @@ -18,4 +20,6 @@ public interface IWorkflowDefinitionRepository extends IBaseRepository findByKey(String businessKey); } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/WorkflowInstanceRepository.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowInstanceRepository.java similarity index 70% rename from backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/WorkflowInstanceRepository.java rename to backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowInstanceRepository.java index ec1637f8..15259810 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/WorkflowInstanceRepository.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/repository/IWorkflowInstanceRepository.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Optional; @Repository -public interface WorkflowInstanceRepository extends JpaRepository { +public interface IWorkflowInstanceRepository extends JpaRepository { /** * 根据Flowable流程实例ID查询工作流实例 @@ -19,9 +19,5 @@ public interface WorkflowInstanceRepository extends JpaRepository findByBusinessKey(String businessKey); - - /** - * 根据流程定义ID查询工作流实例列表 - */ - List findByProcessDefinitionId(Long processDefinitionId); + } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowDefinitionService.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowDefinitionService.java index df2cf22f..323bc439 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowDefinitionService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowDefinitionService.java @@ -5,7 +5,9 @@ import com.qqchen.deploy.backend.workflow.dto.WorkflowDefinitionDTO; import com.qqchen.deploy.backend.workflow.dto.WorkflowDesignDTO; import com.qqchen.deploy.backend.workflow.dto.WorkflowExecutionDTO; import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceCreateDTO; +import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO; import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition; +import org.flowable.engine.repository.Deployment; import org.flowable.engine.runtime.ProcessInstance; import org.springframework.transaction.annotation.Transactional; @@ -24,7 +26,7 @@ public interface IWorkflowDefinitionService extends IBaseService variables); + WorkflowInstanceDTO startWorkflow(String processKey, String businessKey, Map variables); /** * 挂起工作流实例 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowInstanceService.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowInstanceService.java index a7ca19c7..7f5b4b87 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowInstanceService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/IWorkflowInstanceService.java @@ -14,10 +14,9 @@ public interface IWorkflowInstanceService { * 创建工作流实例并关联Flowable实例 * * @param processInstance Flowable流程实例 - * @param variables 流程变量 * @return 工作流实例 */ - WorkflowInstance createWorkflowInstance(ProcessInstance processInstance, Map variables); + WorkflowInstanceDTO createWorkflowInstance(Long workflowDefinitionId, String businessKey, ProcessInstance processInstance); /** * 更新工作流实例状态 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowDefinitionServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowDefinitionServiceImpl.java index c16ac1d3..af008be5 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowDefinitionServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowDefinitionServiceImpl.java @@ -1,15 +1,20 @@ package com.qqchen.deploy.backend.workflow.service.impl; import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl; +import com.qqchen.deploy.backend.workflow.converter.WorkflowInstanceConverter; import com.qqchen.deploy.backend.workflow.dto.WorkflowDefinitionDTO; import com.qqchen.deploy.backend.workflow.dto.WorkflowExecutionDTO; import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceCreateDTO; +import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO; import com.qqchen.deploy.backend.workflow.dto.graph.WorkflowDefinitionGraph; import com.qqchen.deploy.backend.workflow.entity.WorkflowDefinition; +import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; import com.qqchen.deploy.backend.workflow.enums.WorkflowInstanceStatusEnums; import com.qqchen.deploy.backend.workflow.enums.WorkflowStatusEnums; import com.qqchen.deploy.backend.workflow.repository.IWorkflowDefinitionRepository; +import com.qqchen.deploy.backend.workflow.repository.IWorkflowInstanceRepository; import com.qqchen.deploy.backend.workflow.service.IWorkflowDefinitionService; +import com.qqchen.deploy.backend.workflow.service.IWorkflowInstanceService; import com.qqchen.deploy.backend.workflow.util.BpmnConverter; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; @@ -24,6 +29,7 @@ import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.bpmn.model.BpmnModel; import org.flowable.engine.repository.Deployment; +import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.Execution; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.bpmn.model.Process; @@ -31,6 +37,7 @@ import org.flowable.bpmn.model.FlowElement; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -38,7 +45,6 @@ import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; - /** * 工作流定义服务实现 */ @@ -64,9 +70,12 @@ public class WorkflowDefinitionServiceImpl extends BaseServiceImpl variables) { + @Transactional(rollbackFor = Exception.class) + public WorkflowInstanceDTO startWorkflow(String processKey, String businessKey, Map variables) { try { + // 2. 创建工作流实例记录 + WorkflowDefinition workflowDefinition = workflowDefinitionRepository.findByKey(processKey).orElseThrow(() -> new RuntimeException("Workflow definition process key not found: " + processKey)); // 1. 创建并异步启动流程实例 ProcessInstance processInstance = runtimeService.createProcessInstanceBuilder() .processDefinitionKey(processKey) .businessKey(businessKey) .variables(variables) .startAsync(); // 异步启动,会自动执行 shell 任务 -// .start(); - - // 2. 返回实例信息 - WorkflowInstanceCreateDTO dto = new WorkflowInstanceCreateDTO(); - dto.setProcessInstanceId(processInstance.getId()); - dto.setProcessDefinitionKey(processKey); - dto.setBusinessKey(businessKey); - dto.setStatus("RUNNING"); // 因为实例已经在运行了 - - return dto; + return workflowInstanceService.createWorkflowInstance(workflowDefinition.getId(), businessKey, processInstance); } catch (Exception e) { log.error("Failed to create workflow: {}", processKey, e); throw new RuntimeException("Failed to create workflow", e); @@ -345,9 +348,11 @@ public class WorkflowDefinitionServiceImpl extends BaseServiceImpl new RuntimeException("Workflow definition not found: " + workflowDefinitionId)); WorkflowDefinitionGraph graph = definition.getGraph(); definition.setBpmnXml(bpmnConverter.convertToXml(graph, definition.getKey())); + Deployment deployment = this.deployWorkflow(definition); + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult(); definition.setStatus(WorkflowStatusEnums.PUBLISHED); - this.deployWorkflow(definition); definition.setFlowVersion(1); + definition.setProcessDefinitionId(processDefinition.getId()); workflowDefinitionRepository.save(definition); log.info("Successfully published workflow definition: {}", workflowDefinitionId); } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java index 74455226..2867a33c 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/service/impl/WorkflowInstanceServiceImpl.java @@ -2,11 +2,13 @@ package com.qqchen.deploy.backend.workflow.service.impl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.qqchen.deploy.backend.workflow.converter.WorkflowInstanceConverter; import com.qqchen.deploy.backend.workflow.dto.WorkflowInstanceDTO; import com.qqchen.deploy.backend.workflow.entity.WorkflowInstance; import com.qqchen.deploy.backend.workflow.enums.WorkflowInstanceStatusEnums; -import com.qqchen.deploy.backend.workflow.repository.WorkflowInstanceRepository; +import com.qqchen.deploy.backend.workflow.repository.IWorkflowInstanceRepository; import com.qqchen.deploy.backend.workflow.service.IWorkflowInstanceService; +import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; @@ -24,135 +26,137 @@ import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class WorkflowInstanceServiceImpl implements IWorkflowInstanceService { - - private final WorkflowInstanceRepository workflowInstanceRepository; + + private final IWorkflowInstanceRepository workflowInstanceRepository; + private final RuntimeService runtimeService; + private final HistoryService historyService; + private final ObjectMapper objectMapper; - + + @Resource + private WorkflowInstanceConverter workflowInstanceConverter; + @Override @Transactional - public WorkflowInstance createWorkflowInstance(ProcessInstance processInstance, Map variables) { - WorkflowInstance instance = new WorkflowInstance(); - instance.setProcessInstanceId(processInstance.getId()); - instance.setProcessDefinitionId(Long.valueOf(processInstance.getProcessDefinitionId().split(":")[0])); - instance.setBusinessKey(processInstance.getBusinessKey()); - instance.setStatus(WorkflowInstanceStatusEnums.RUNNING); - instance.setStartTime(LocalDateTime.now()); - - try { - instance.setVariables(objectMapper.writeValueAsString(variables)); - } catch (JsonProcessingException e) { - log.error("Failed to serialize variables", e); - instance.setVariables("{}"); - } - - return workflowInstanceRepository.save(instance); + public WorkflowInstanceDTO createWorkflowInstance(Long workflowDefinitionId, String businessKey, ProcessInstance processInstance) { + WorkflowInstance workflowInstance = new WorkflowInstance(); + workflowInstance.setProcessInstanceId(processInstance.getId()); + workflowInstance.setProcessDefinitionId(processInstance.getProcessDefinitionId()); + workflowInstance.setWorkflowDefinitionId(workflowDefinitionId); + workflowInstance.setBusinessKey(businessKey); + workflowInstance.setStatus(WorkflowInstanceStatusEnums.CREATED); + workflowInstance.setStartTime(LocalDateTime.now()); + workflowInstanceRepository.save(workflowInstance); + // 3. 返回创建结果 + return workflowInstanceConverter.toDto(workflowInstance); } - + @Override @Transactional public WorkflowInstance updateInstanceStatus(String processInstanceId, WorkflowInstanceStatusEnums status) { WorkflowInstance instance = workflowInstanceRepository.findByProcessInstanceId(processInstanceId) - .orElseThrow(() -> new RuntimeException("Workflow instance not found: " + processInstanceId)); - + .orElseThrow(() -> new RuntimeException("Workflow instance not found: " + processInstanceId)); + instance.setStatus(status); if (status == WorkflowInstanceStatusEnums.COMPLETED || status == WorkflowInstanceStatusEnums.FAILED) { instance.setEndTime(LocalDateTime.now()); } - + return workflowInstanceRepository.save(instance); } - + @Override public WorkflowInstanceDTO getInstanceDetails(String processInstanceId) { WorkflowInstance instance = workflowInstanceRepository.findByProcessInstanceId(processInstanceId) - .orElseThrow(() -> new RuntimeException("Workflow instance not found: " + processInstanceId)); - - WorkflowInstanceDTO dto = new WorkflowInstanceDTO(); -// dto.setId(instance.getProcessInstanceId()); - dto.setProcessDefinitionId(String.valueOf(instance.getProcessDefinitionId())); - dto.setBusinessKey(instance.getBusinessKey()); - dto.setStatus(instance.getStatus()); - - // Convert LocalDateTime to Date - dto.setStartTime(java.sql.Timestamp.valueOf(instance.getStartTime())); - if (instance.getEndTime() != null) { - dto.setEndTime(java.sql.Timestamp.valueOf(instance.getEndTime())); - } - - // Calculate duration if both start and end time exist - if (instance.getStartTime() != null && instance.getEndTime() != null) { - dto.setDurationInMillis(java.time.Duration.between(instance.getStartTime(), instance.getEndTime()).toMillis()); - } - - // Get variables - try { - @SuppressWarnings("unchecked") - Map variables = objectMapper.readValue(instance.getVariables(), Map.class); - dto.setVariables(variables); - } catch (JsonProcessingException e) { - log.error("Failed to deserialize variables", e); - dto.setVariables(new HashMap<>()); - } - - // Get activity instances - List activities = historyService.createHistoricActivityInstanceQuery() - .processInstanceId(processInstanceId) - .orderByHistoricActivityInstanceStartTime().asc() - .list(); - - dto.setActivities(activities.stream().map(this::convertToActivityInstance).collect(Collectors.toList())); - - return dto; + .orElseThrow(() -> new RuntimeException("Workflow instance not found: " + processInstanceId)); + +// WorkflowInstanceDTO dto = new WorkflowInstanceDTO(); +//// dto.setId(instance.getProcessInstanceId()); +// dto.setProcessDefinitionId(String.valueOf(instance.getProcessDefinitionId())); +// dto.setBusinessKey(instance.getBusinessKey()); +// dto.setStatus(instance.getStatus()); +// +// // Convert LocalDateTime to Date +// dto.setStartTime(java.sql.Timestamp.valueOf(instance.getStartTime())); +// if (instance.getEndTime() != null) { +// dto.setEndTime(java.sql.Timestamp.valueOf(instance.getEndTime())); +// } +// +// // Calculate duration if both start and end time exist +// if (instance.getStartTime() != null && instance.getEndTime() != null) { +// dto.setDurationInMillis(java.time.Duration.between(instance.getStartTime(), instance.getEndTime()).toMillis()); +// } +// +// // Get variables +// try { +// @SuppressWarnings("unchecked") +// Map variables = objectMapper.readValue(instance.getVariables(), Map.class); +// dto.setVariables(variables); +// } catch (JsonProcessingException e) { +// log.error("Failed to deserialize variables", e); +// dto.setVariables(new HashMap<>()); +// } +// +// // Get activity instances +// List activities = historyService.createHistoricActivityInstanceQuery() +// .processInstanceId(processInstanceId) +// .orderByHistoricActivityInstanceStartTime().asc() +// .list(); +// +// dto.setActivities(activities.stream().map(this::convertToActivityInstance).collect(Collectors.toList())); + +// return dto; + return null; } - + @Override public List findByBusinessKey(String businessKey) { return workflowInstanceRepository.findByBusinessKey(businessKey).stream() - .map(instance -> getInstanceDetails(instance.getProcessInstanceId())) - .collect(Collectors.toList()); + .map(instance -> getInstanceDetails(instance.getProcessInstanceId())) + .collect(Collectors.toList()); } - + @Override @Transactional public void completeInstance(String processInstanceId, Map variables) { // Update Flowable variables runtimeService.setVariables(processInstanceId, variables); - + // Update our instance WorkflowInstance instance = workflowInstanceRepository.findByProcessInstanceId(processInstanceId) - .orElseThrow(() -> new RuntimeException("Workflow instance not found: " + processInstanceId)); - + .orElseThrow(() -> new RuntimeException("Workflow instance not found: " + processInstanceId)); + try { instance.setVariables(objectMapper.writeValueAsString(variables)); } catch (JsonProcessingException e) { log.error("Failed to serialize variables", e); } - + instance.setStatus(WorkflowInstanceStatusEnums.COMPLETED); instance.setEndTime(LocalDateTime.now()); workflowInstanceRepository.save(instance); } - - private WorkflowInstanceDTO.ActivityInstance convertToActivityInstance(HistoricActivityInstance hai) { - WorkflowInstanceDTO.ActivityInstance ai = new WorkflowInstanceDTO.ActivityInstance(); - ai.setId(hai.getId()); - ai.setActivityId(hai.getActivityId()); - ai.setActivityName(hai.getActivityName()); - ai.setActivityType(hai.getActivityType()); - ai.setStartTime(hai.getStartTime()); - ai.setEndTime(hai.getEndTime()); - ai.setDurationInMillis(hai.getDurationInMillis()); - - // Get shell task execution details from variables if available - if ("serviceTask".equals(hai.getActivityType())) { - Map variables = runtimeService.getVariables(hai.getExecutionId()); - ai.setShellOutput((String) variables.get("shellOutput")); - ai.setShellError((String) variables.get("shellError")); - ai.setShellExitCode((Integer) variables.get("shellExitCode")); - } - - return ai; - } + +// private WorkflowInstanceDTO.ActivityInstance convertToActivityInstance(HistoricActivityInstance hai) { +// WorkflowInstanceDTO.ActivityInstance ai = new WorkflowInstanceDTO.ActivityInstance(); +// ai.setId(hai.getId()); +// ai.setActivityId(hai.getActivityId()); +// ai.setActivityName(hai.getActivityName()); +// ai.setActivityType(hai.getActivityType()); +// ai.setStartTime(hai.getStartTime()); +// ai.setEndTime(hai.getEndTime()); +// ai.setDurationInMillis(hai.getDurationInMillis()); +// +// // Get shell task execution details from variables if available +// if ("serviceTask".equals(hai.getActivityType())) { +// Map variables = runtimeService.getVariables(hai.getExecutionId()); +// ai.setShellOutput((String) variables.get("shellOutput")); +// ai.setShellError((String) variables.get("shellError")); +// ai.setShellExitCode((Integer) variables.get("shellExitCode")); +// } +// +// return ai; +// } } diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/WorkflowDefinitionGraph.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/WorkflowDefinitionGraph.java deleted file mode 100644 index cae2490a..00000000 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/util/WorkflowDefinitionGraph.java +++ /dev/null @@ -1,229 +0,0 @@ -//package com.qqchen.deploy.backend.workflow.util; -// -//import com.fasterxml.jackson.databind.ObjectMapper; -//import com.qqchen.deploy.backend.workflow.dto.graph.*; -//import com.qqchen.deploy.backend.workflow.enums.NodeTypeEnums; -//import lombok.Data; -//import lombok.extern.slf4j.Slf4j; -// -//import java.util.ArrayList; -//import java.util.HashMap; -//import java.util.List; -//import java.util.Map; -// -///** -// * 工作流定义图形生成工具类 -// * 用于生成示例工作流定义,包括: -// * 1. 简单工作流:开始 -> 脚本任务 -> 结束 -// * 2. 复杂工作流:开始 -> 脚本任务A -> 脚本任务B -> 结束 -// */ -//@Data -//@Slf4j -//public class WorkflowDefinitionGraph { -// private static final ObjectMapper mapper = new ObjectMapper(); -// -// /** -// * 节点列表 -// */ -// private List nodes; -// -// /** -// * 边列表 -// */ -// private List edges; -// -// /** -// * 生成简单工作流 -// * 开始 -> 脚本任务 -> 结束 -// */ -// public static WorkflowDefinitionGraph generateSimpleWorkflow() { -// WorkflowDefinitionGraph graph = new WorkflowDefinitionGraph(); -// List nodes = new ArrayList<>(); -// List edges = new ArrayList<>(); -// -// // 开始节点 -// WorkflowDefinitionNode startNode = createNode( -// "startEvent1", -// NodeTypeEnums.START_EVENT, -// "开始", -// 100, 100, -// createNodeConfig("开始节点", "启动流程") -// ); -// nodes.add(startNode); -// -// // 脚本任务节点 -// Map scriptConfig = createNodeConfig("脚本任务", "执行一个简单的Shell脚本"); -// scriptConfig.put("script", "echo 'Hello World'"); -// scriptConfig.put("language", "shell"); -// -// WorkflowDefinitionNode scriptNode = createNode( -// "scriptTask1", -// NodeTypeEnums.SCRIPT_TASK, -// "执行脚本", -// 300, 100, -// scriptConfig -// ); -// nodes.add(scriptNode); -// -// // 结束节点 -// WorkflowDefinitionNode endNode = createNode( -// "endEvent1", -// NodeTypeEnums.END_EVENT, -// "结束", -// 500, 100, -// createNodeConfig("结束节点", "流程结束") -// ); -// nodes.add(endNode); -// -// // 添加连线 -// edges.add(createEdge("flow1", "startEvent1", "scriptTask1", "开始到脚本")); -// edges.add(createEdge("flow2", "scriptTask1", "endEvent1", "脚本到结束")); -// -// graph.setNodes(nodes); -// graph.setEdges(edges); -// return graph; -// } -// -// /** -// * 生成复杂工作流 -// * 开始 -> 脚本任务A -> 脚本任务B -> 结束 -// */ -// public static WorkflowDefinitionGraph generateComplexWorkflow() { -// WorkflowDefinitionGraph graph = new WorkflowDefinitionGraph(); -// List nodes = new ArrayList<>(); -// List edges = new ArrayList<>(); -// -// // 开始节点 -// WorkflowDefinitionNode startNode = createNode( -// "startEvent1", -// NodeTypeEnums.START_EVENT, -// "开始", -// 100, 100, -// createNodeConfig("开始节点", "启动流程") -// ); -// nodes.add(startNode); -// -// // 脚本任务A -// Map scriptConfigA = createNodeConfig("脚本任务A", "数据处理"); -// scriptConfigA.put("script", "process_data.sh"); -// scriptConfigA.put("language", "shell"); -// -// WorkflowDefinitionNode scriptNodeA = createNode( -// "scriptTask1", -// NodeTypeEnums.SCRIPT_TASK, -// "数据处理", -// 300, 100, -// scriptConfigA -// ); -// nodes.add(scriptNodeA); -// -// // 脚本任务B -// Map scriptConfigB = createNodeConfig("脚本任务B", "生成报告"); -// scriptConfigB.put("script", "generate_report.sh"); -// scriptConfigB.put("language", "shell"); -// -// WorkflowDefinitionNode scriptNodeB = createNode( -// "scriptTask2", -// NodeTypeEnums.SCRIPT_TASK, -// "生成报告", -// 500, 100, -// scriptConfigB -// ); -// nodes.add(scriptNodeB); -// -// // 结束节点 -// WorkflowDefinitionNode endNode = createNode( -// "endEvent1", -// NodeTypeEnums.END_EVENT, -// "结束", -// 700, 100, -// createNodeConfig("结束节点", "流程结束") -// ); -// nodes.add(endNode); -// -// // 添加连线 -// edges.add(createEdge("flow1", "startEvent1", "scriptTask1", "开始到处理")); -// edges.add(createEdge("flow2", "scriptTask1", "scriptTask2", "处理到报告")); -// edges.add(createEdge("flow3", "scriptTask2", "endEvent1", "报告到结束")); -// -// graph.setNodes(nodes); -// graph.setEdges(edges); -// return graph; -// } -// -// /** -// * 创建节点 -// */ -// private static WorkflowDefinitionNode createNode(String id, NodeTypeEnums type, String name, int x, int y, Map config) { -// WorkflowDefinitionNode node = new WorkflowDefinitionNode(); -// node.setId(id); -// node.setCode(type.getCode()); -// node.setType(type); -// node.setName(name); -// node.setConfig(config); -// -// // 从枚举的uiConfig中获取配置并创建新的图形配置 -// WorkflowNodeGraph originalConfig = type.getUiConfig(); -// WorkflowNodeGraph nodeGraph = new WorkflowNodeGraph() -// .setShape(originalConfig.getShape()) -// .setSize(originalConfig.getSize().getWidth(), originalConfig.getSize().getHeight()) -// .setStyle(originalConfig.getStyle().getFill(), -// originalConfig.getStyle().getStroke(), -// originalConfig.getStyle().getIcon()) -// .configPorts(originalConfig.getPorts().getTypes()) -// .setPosition(x, y); -// -// node.setGraph(nodeGraph); -// return node; -// } -// -// /** -// * 创建节点配置 -// */ -// private static Map createNodeConfig(String name, String description) { -// Map config = new HashMap<>(); -// config.put("name", name); -// config.put("description", description); -// return config; -// } -// -// /** -// * 创建连线 -// */ -// private static WorkflowDefinitionEdge createEdge(String id, String from, String to, String name) { -// return createEdge(id, from, to, name, null); -// } -// -// /** -// * 创建带条件的连线 -// */ -// private static WorkflowDefinitionEdge createEdge(String id, String from, String to, String name, String condition) { -// WorkflowDefinitionEdge edge = new WorkflowDefinitionEdge(); -// edge.setId(id); -// edge.setFrom(from); -// edge.setTo(to); -// edge.setName(name); -// -// // 设置边配置 -// WorkflowDefinitionEdgeConfig config = new WorkflowDefinitionEdgeConfig(); -// config.setType("sequence"); -// if (condition != null) { -// config.setCondition(condition); -// config.setConditionExpression(condition); -// } -// edge.setConfig(config); -// -// return edge; -// } -// -// public static void main(String[] args) { -// try { -// System.out.println("=== 简单工作流 ==="); -// System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(generateSimpleWorkflow())); -// System.out.println("\n=== 复杂工作流 ==="); -// System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(generateComplexWorkflow())); -// } catch (Exception e) { -// log.error("生成工作流定义失败", e); -// } -// } -//} diff --git a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql b/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql index 7c96b55a..768c2645 100644 --- a/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql +++ b/backend/src/main/resources/db/migration/V1.0.0__init_schema.sql @@ -3,88 +3,173 @@ -- -------------------------------------------------------------------------------------- -- 租户表 -CREATE TABLE IF NOT EXISTS sys_tenant ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - code VARCHAR(50) NOT NULL COMMENT '租户编码', - name VARCHAR(100) NOT NULL COMMENT '租户名称', - address VARCHAR(255) NULL COMMENT '租户地址', - contact_name VARCHAR(50) NULL COMMENT '联系人姓名', - contact_phone VARCHAR(20) NULL COMMENT '联系人电话', - email VARCHAR(100) NULL COMMENT '联系人邮箱', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - - CONSTRAINT UK_tenant_code UNIQUE (code) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租户表'; +CREATE TABLE IF NOT EXISTS sys_tenant +( + id + BIGINT + AUTO_INCREMENT + PRIMARY + KEY + COMMENT + '主键ID', + create_by + VARCHAR +( + 255 +) NULL COMMENT '创建人', + create_time DATETIME +( + 6 +) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR +( + 255 +) NULL COMMENT '更新人', + update_time DATETIME +( + 6 +) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR +( + 50 +) NOT NULL COMMENT '租户编码', + NAME VARCHAR +( + 100 +) NOT NULL COMMENT '租户名称', + address VARCHAR +( + 255 +) NULL COMMENT '租户地址', + contact_name VARCHAR +( + 50 +) NULL COMMENT '联系人姓名', + contact_phone VARCHAR +( + 20 +) NULL COMMENT '联系人电话', + email VARCHAR +( + 100 +) NULL COMMENT '联系人邮箱', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + CONSTRAINT UK_tenant_code UNIQUE +( + code +) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE =utf8mb4_unicode_ci COMMENT='租户表'; -- 部门表 -CREATE TABLE sys_department ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - code VARCHAR(50) NOT NULL COMMENT '部门编码', - name VARCHAR(100) NOT NULL COMMENT '部门名称', - description VARCHAR(255) NULL COMMENT '部门描述', - leader_id BIGINT NULL COMMENT '部门负责人ID', - leader_name VARCHAR(50) NULL COMMENT '部门负责人姓名', - parent_id BIGINT NULL COMMENT '父部门ID', - sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - - CONSTRAINT UK_department_code UNIQUE (code) +CREATE TABLE sys_department +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR(50) NOT NULL COMMENT '部门编码', + name VARCHAR(100) NOT NULL COMMENT '部门名称', + description VARCHAR(255) NULL COMMENT '部门描述', + leader_id BIGINT NULL COMMENT '部门负责人ID', + leader_name VARCHAR(50) NULL COMMENT '部门负责人姓名', + parent_id BIGINT NULL COMMENT '父部门ID', + sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + CONSTRAINT UK_department_code UNIQUE (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='部门表'; -- 用户表 -CREATE TABLE IF NOT EXISTS sys_user ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - username VARCHAR(50) NOT NULL COMMENT '用户名', - password VARCHAR(255) NOT NULL COMMENT '密码', - nickname VARCHAR(50) NULL COMMENT '昵称', - email VARCHAR(100) NULL COMMENT '邮箱', - phone VARCHAR(20) NULL COMMENT '手机号', - department_id BIGINT NULL COMMENT '所属部门ID', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - - CONSTRAINT UK_user_username UNIQUE (username), - CONSTRAINT FK_user_department FOREIGN KEY (department_id) REFERENCES sys_department(id) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'; +CREATE TABLE IF NOT EXISTS sys_user +( + id + BIGINT + AUTO_INCREMENT + PRIMARY + KEY + COMMENT + '主键ID', + create_by + VARCHAR +( + 255 +) NULL COMMENT '创建人', + create_time DATETIME +( + 6 +) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR +( + 255 +) NULL COMMENT '更新人', + update_time DATETIME +( + 6 +) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + username VARCHAR +( + 50 +) NOT NULL COMMENT '用户名', + password VARCHAR +( + 255 +) NOT NULL COMMENT '密码', + nickname VARCHAR +( + 50 +) NULL COMMENT '昵称', + email VARCHAR +( + 100 +) NULL COMMENT '邮箱', + phone VARCHAR +( + 20 +) NULL COMMENT '手机号', + department_id BIGINT NULL COMMENT '所属部门ID', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + CONSTRAINT UK_user_username UNIQUE +( + username +), + CONSTRAINT FK_user_department FOREIGN KEY +( + department_id +) REFERENCES sys_department +( + id +) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE =utf8mb4_unicode_ci COMMENT='用户表'; -- 系统参数表 -CREATE TABLE sys_param ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - code VARCHAR(100) NOT NULL COMMENT '参数编码', - name VARCHAR(100) NOT NULL COMMENT '参数名称', - value TEXT COMMENT '参数值', - type VARCHAR(50) NOT NULL COMMENT '参数类型', - description VARCHAR(255) NULL COMMENT '参数描述', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - - CONSTRAINT UK_sys_param_code UNIQUE (code) +CREATE TABLE sys_param +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR(100) NOT NULL COMMENT '参数编码', + name VARCHAR(100) NOT NULL COMMENT '参数名称', + value TEXT COMMENT '参数值', + type VARCHAR(50) NOT NULL COMMENT '参数类型', + description VARCHAR(255) NULL COMMENT '参数描述', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + CONSTRAINT UK_sys_param_code UNIQUE (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统参数表'; -- -------------------------------------------------------------------------------------- @@ -92,141 +177,150 @@ CREATE TABLE sys_param ( -- -------------------------------------------------------------------------------------- -- 菜单表 -CREATE TABLE sys_menu ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - name VARCHAR(100) NOT NULL COMMENT '菜单名称', - path VARCHAR(200) NULL COMMENT '路由路径', - component VARCHAR(255) NULL COMMENT '组件路径', - icon VARCHAR(100) NULL COMMENT '菜单图标', - permission VARCHAR(100) NULL COMMENT '权限标识', - type TINYINT NOT NULL COMMENT '菜单类型(1:目录 2:菜单 3:按钮)', - parent_id BIGINT NULL COMMENT '父菜单ID', - sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', - hidden BIT NOT NULL DEFAULT 0 COMMENT '是否隐藏(0:显示,1:隐藏)', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - - INDEX IDX_parent_id (parent_id) +CREATE TABLE sys_menu +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + name VARCHAR(100) NOT NULL COMMENT '菜单名称', + path VARCHAR(200) NULL COMMENT '路由路径', + component VARCHAR(255) NULL COMMENT '组件路径', + icon VARCHAR(100) NULL COMMENT '菜单图标', + permission VARCHAR(100) NULL COMMENT '权限标识', + type TINYINT NOT NULL COMMENT '菜单类型(1:目录 2:菜单 3:按钮)', + parent_id BIGINT NULL COMMENT '父菜单ID', + sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', + hidden BIT NOT NULL DEFAULT 0 COMMENT '是否隐藏(0:显示,1:隐藏)', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + INDEX IDX_parent_id (parent_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='菜单表'; -- 角色表 -CREATE TABLE sys_role ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - code VARCHAR(100) NOT NULL COMMENT '角色编码', - name VARCHAR(100) NOT NULL COMMENT '角色名称', - type TINYINT NOT NULL DEFAULT 2 COMMENT '角色类型(1:系统角色,2:自定义角色)', - description VARCHAR(255) NULL COMMENT '角色描述', - sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', - - CONSTRAINT UK_role_code UNIQUE (code) +CREATE TABLE sys_role +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR(100) NOT NULL COMMENT '角色编码', + name VARCHAR(100) NOT NULL COMMENT '角色名称', + type TINYINT NOT NULL DEFAULT 2 COMMENT '角色类型(1:系统角色,2:自定义角色)', + description VARCHAR(255) NULL COMMENT '角色描述', + sort INT NOT NULL DEFAULT 0 COMMENT '显示顺序', + + CONSTRAINT UK_role_code UNIQUE (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表'; -- 角色标签表 -CREATE TABLE sys_role_tag ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - name VARCHAR(50) NOT NULL COMMENT '标签名称', - color VARCHAR(20) NULL COMMENT '标签颜色' +CREATE TABLE sys_role_tag +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + name VARCHAR(50) NOT NULL COMMENT '标签名称', + color VARCHAR(20) NULL COMMENT '标签颜色' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色标签表'; -- 角色标签关联表 -CREATE TABLE sys_role_tag_relation ( - role_id BIGINT NOT NULL COMMENT '角色ID', - tag_id BIGINT NOT NULL COMMENT '标签ID', - - PRIMARY KEY (role_id, tag_id), - CONSTRAINT FK_role_tag_role FOREIGN KEY (role_id) REFERENCES sys_role (id), - CONSTRAINT FK_role_tag_tag FOREIGN KEY (tag_id) REFERENCES sys_role_tag (id) +CREATE TABLE sys_role_tag_relation +( + role_id BIGINT NOT NULL COMMENT '角色ID', + tag_id BIGINT NOT NULL COMMENT '标签ID', + + PRIMARY KEY (role_id, tag_id), + CONSTRAINT FK_role_tag_role FOREIGN KEY (role_id) REFERENCES sys_role (id), + CONSTRAINT FK_role_tag_tag FOREIGN KEY (tag_id) REFERENCES sys_role_tag (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色标签关联表'; -- 用户角色关联表 -CREATE TABLE sys_user_role ( - - user_id BIGINT NOT NULL COMMENT '用户ID', - role_id BIGINT NOT NULL COMMENT '角色ID', - - CONSTRAINT UK_user_role UNIQUE (user_id, role_id), - CONSTRAINT FK_user_role_user FOREIGN KEY (user_id) REFERENCES sys_user (id), - CONSTRAINT FK_user_role_role FOREIGN KEY (role_id) REFERENCES sys_role (id) +CREATE TABLE sys_user_role +( + + user_id BIGINT NOT NULL COMMENT '用户ID', + role_id BIGINT NOT NULL COMMENT '角色ID', + + CONSTRAINT UK_user_role UNIQUE (user_id, role_id), + CONSTRAINT FK_user_role_user FOREIGN KEY (user_id) REFERENCES sys_user (id), + CONSTRAINT FK_user_role_role FOREIGN KEY (role_id) REFERENCES sys_role (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表'; -- 角色菜单关联表 -CREATE TABLE sys_role_menu ( - role_id BIGINT NOT NULL COMMENT '角色ID', - menu_id BIGINT NOT NULL COMMENT '菜单ID', - - PRIMARY KEY (role_id, menu_id), - CONSTRAINT FK_role_menu_role FOREIGN KEY (role_id) REFERENCES sys_role (id), - CONSTRAINT FK_role_menu_menu FOREIGN KEY (menu_id) REFERENCES sys_menu (id) +CREATE TABLE sys_role_menu +( + role_id BIGINT NOT NULL COMMENT '角色ID', + menu_id BIGINT NOT NULL COMMENT '菜单ID', + + PRIMARY KEY (role_id, menu_id), + CONSTRAINT FK_role_menu_role FOREIGN KEY (role_id) REFERENCES sys_role (id), + CONSTRAINT FK_role_menu_menu FOREIGN KEY (menu_id) REFERENCES sys_menu (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色菜单关联表'; -- 权限模板表 -CREATE TABLE sys_permission_template ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - code VARCHAR(100) NOT NULL COMMENT '模板编码', - name VARCHAR(100) NOT NULL COMMENT '模板名称', - type TINYINT NOT NULL DEFAULT 1 COMMENT '模板类型(1:系统模板,2:自定义模板)', - description VARCHAR(255) NULL COMMENT '模板描述', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - - CONSTRAINT UK_template_code UNIQUE (code) +CREATE TABLE sys_permission_template +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + code VARCHAR(100) NOT NULL COMMENT '模板编码', + name VARCHAR(100) NOT NULL COMMENT '模板名称', + type TINYINT NOT NULL DEFAULT 1 COMMENT '模板类型(1:系统模板,2:自定义模板)', + description VARCHAR(255) NULL COMMENT '模板描述', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + + CONSTRAINT UK_template_code UNIQUE (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限模板表'; -- 模板菜单关联表 -CREATE TABLE sys_template_menu ( - template_id BIGINT NOT NULL COMMENT '模板ID', - menu_id BIGINT NOT NULL COMMENT '菜单ID', - - PRIMARY KEY (template_id, menu_id), - CONSTRAINT FK_template_menu_template FOREIGN KEY (template_id) REFERENCES sys_permission_template (id), - CONSTRAINT FK_template_menu_menu FOREIGN KEY (menu_id) REFERENCES sys_menu (id) +CREATE TABLE sys_template_menu +( + template_id BIGINT NOT NULL COMMENT '模板ID', + menu_id BIGINT NOT NULL COMMENT '菜单ID', + + PRIMARY KEY (template_id, menu_id), + CONSTRAINT FK_template_menu_template FOREIGN KEY (template_id) REFERENCES sys_permission_template (id), + CONSTRAINT FK_template_menu_menu FOREIGN KEY (menu_id) REFERENCES sys_menu (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='模板菜单关联表'; -- 权限表 -CREATE TABLE sys_permission ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - menu_id BIGINT NOT NULL COMMENT '关联的菜单ID', - code VARCHAR(100) NOT NULL COMMENT '权限编码', - name VARCHAR(100) NOT NULL COMMENT '权限名称', - type VARCHAR(50) NOT NULL DEFAULT 'FUNCTION' COMMENT '权限类型(MENU:菜单,FUNCTION:功能,API:接口)', - sort INT NULL DEFAULT 0 COMMENT '排序', - - CONSTRAINT UK_permission_code UNIQUE (code), - CONSTRAINT FK_permission_menu FOREIGN KEY (menu_id) REFERENCES sys_menu (id), - INDEX IDX_menu_id (menu_id) +CREATE TABLE sys_permission +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + menu_id BIGINT NOT NULL COMMENT '关联的菜单ID', + code VARCHAR(100) NOT NULL COMMENT '权限编码', + name VARCHAR(100) NOT NULL COMMENT '权限名称', + type VARCHAR(50) NOT NULL DEFAULT 'FUNCTION' COMMENT '权限类型(MENU:菜单,FUNCTION:功能,API:接口)', + sort INT NULL DEFAULT 0 COMMENT '排序', + + CONSTRAINT UK_permission_code UNIQUE (code), + CONSTRAINT FK_permission_menu FOREIGN KEY (menu_id) REFERENCES sys_menu (id), + INDEX IDX_menu_id (menu_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统权限表'; -- -------------------------------------------------------------------------------------- @@ -234,148 +328,152 @@ CREATE TABLE sys_permission ( -- -------------------------------------------------------------------------------------- -- 外部系统表 -CREATE TABLE sys_external_system ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - name VARCHAR(100) NOT NULL COMMENT '系统名称', - type VARCHAR(50) NOT NULL COMMENT '系统类型(JENKINS/GIT/ZENTAO等)', - url VARCHAR(255) NOT NULL COMMENT '系统访问地址', - remark TEXT NULL COMMENT '备注说明', - sort INT NULL DEFAULT 0 COMMENT '排序', - enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', - auth_type VARCHAR(50) NOT NULL COMMENT '认证方式(BASIC/TOKEN/OAUTH等)', - username VARCHAR(100) NULL COMMENT '用户名', - password VARCHAR(255) NULL COMMENT '密码', - token VARCHAR(255) NULL COMMENT '访问令牌', - sync_status VARCHAR(50) NULL COMMENT '同步状态(SUCCESS/FAILED/RUNNING)', - last_sync_time DATETIME(6) NULL COMMENT '最后同步时间', - last_connect_time DATETIME(6) NULL COMMENT '最近连接成功时间', - config JSON NULL COMMENT '系统特有配置', - - CONSTRAINT UK_external_system_name UNIQUE (name), - CONSTRAINT UK_external_system_type_url UNIQUE (type, url) +CREATE TABLE sys_external_system +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + name VARCHAR(100) NOT NULL COMMENT '系统名称', + type VARCHAR(50) NOT NULL COMMENT '系统类型(JENKINS/GIT/ZENTAO等)', + url VARCHAR(255) NOT NULL COMMENT '系统访问地址', + remark TEXT NULL COMMENT '备注说明', + sort INT NULL DEFAULT 0 COMMENT '排序', + enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用(0:禁用,1:启用)', + auth_type VARCHAR(50) NOT NULL COMMENT '认证方式(BASIC/TOKEN/OAUTH等)', + username VARCHAR(100) NULL COMMENT '用户名', + password VARCHAR(255) NULL COMMENT '密码', + token VARCHAR(255) NULL COMMENT '访问令牌', + sync_status VARCHAR(50) NULL COMMENT '同步状态(SUCCESS/FAILED/RUNNING)', + last_sync_time DATETIME(6) NULL COMMENT '最后同步时间', + last_connect_time DATETIME(6) NULL COMMENT '最近连接成功时间', + config JSON NULL COMMENT '系统特有配置', + + CONSTRAINT UK_external_system_name UNIQUE (name), + CONSTRAINT UK_external_system_type_url UNIQUE (type, url) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='外部系统表'; -- 代码仓库组表 -CREATE TABLE deploy_repo_group ( - -- 基础字段 - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', - - -- 业务字段 - name VARCHAR(100) NOT NULL COMMENT '仓库组名', - description VARCHAR(500) NULL COMMENT '仓库组描述', - group_id BIGINT NOT NULL COMMENT '外部系统中的组ID', - parent_id BIGINT NULL COMMENT '父级仓库组ID', - path VARCHAR(200) NOT NULL COMMENT '仓库组路径', - external_system_id BIGINT NOT NULL COMMENT '外部系统ID', - avatar_url VARCHAR(255) NULL COMMENT '头像URL', - web_url VARCHAR(255) NULL COMMENT '网页URL', - visibility ENUM('private', 'internal', 'public') NOT NULL DEFAULT 'private' COMMENT '可见性:private-私有,internal-内部,public-公开', - sort INT DEFAULT 0 COMMENT '排序号', - - -- 索引 - INDEX idx_external_system_group_id (external_system_id, group_id) COMMENT '外部系统组ID索引', - INDEX idx_parent_id (parent_id) COMMENT '父级ID索引', - INDEX idx_path (path) COMMENT '路径索引', - UNIQUE INDEX uk_external_system_group_path (external_system_id, path) COMMENT '外部系统下路径唯一', - - -- 外键约束 - CONSTRAINT fk_group_parent FOREIGN KEY (parent_id) - REFERENCES deploy_repo_group (id), - CONSTRAINT fk_group_external_system FOREIGN KEY (external_system_id) - REFERENCES sys_external_system (id) +CREATE TABLE deploy_repo_group +( + -- 基础字段 + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', + + -- 业务字段 + name VARCHAR(100) NOT NULL COMMENT '仓库组名', + description VARCHAR(500) NULL COMMENT '仓库组描述', + group_id BIGINT NOT NULL COMMENT '外部系统中的组ID', + parent_id BIGINT NULL COMMENT '父级仓库组ID', + path VARCHAR(200) NOT NULL COMMENT '仓库组路径', + external_system_id BIGINT NOT NULL COMMENT '外部系统ID', + avatar_url VARCHAR(255) NULL COMMENT '头像URL', + web_url VARCHAR(255) NULL COMMENT '网页URL', + visibility ENUM('private', 'internal', 'public') NOT NULL DEFAULT 'private' COMMENT '可见性:private-私有,internal-内部,public-公开', + sort INT DEFAULT 0 COMMENT '排序号', + + -- 索引 + INDEX idx_external_system_group_id (external_system_id, group_id) COMMENT '外部系统组ID索引', + INDEX idx_parent_id (parent_id) COMMENT '父级ID索引', + INDEX idx_path ( PATH) COMMENT '路径索引', + UNIQUE INDEX uk_external_system_group_path (external_system_id, PATH) COMMENT '外部系统下路径唯一', + + -- 外键约束 + CONSTRAINT fk_group_parent FOREIGN KEY (parent_id) + REFERENCES deploy_repo_group (id), + CONSTRAINT fk_group_external_system FOREIGN KEY (external_system_id) + REFERENCES sys_external_system (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='代码仓库组表'; -- 代码仓库项目表 -CREATE TABLE deploy_repo_project ( - -- 基础字段 - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', - - -- 业务字段 - name VARCHAR(100) NOT NULL COMMENT '项目名称', - description VARCHAR(500) NULL COMMENT '项目描述', - project_id BIGINT NOT NULL COMMENT '外部系统中的项目ID', - group_id BIGINT NULL COMMENT '所属仓库组ID', - path VARCHAR(200) NOT NULL COMMENT '项目路径', - external_system_id BIGINT NOT NULL COMMENT '外部系统ID', - is_default_branch VARCHAR(100) NULL COMMENT '默认分支', - is_enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用:0-禁用,1-启用', - visibility ENUM('private', 'internal', 'public') NOT NULL DEFAULT 'private' COMMENT '可见性:private-私有,internal-内部,public-公开', - http_url VARCHAR(255) NULL COMMENT 'HTTP克隆地址', - ssh_url VARCHAR(255) NULL COMMENT 'SSH克隆地址', - web_url VARCHAR(255) NULL COMMENT '网页URL', - last_activity_at DATETIME(6) NULL COMMENT '最后活动时间', - sort INT DEFAULT 0 COMMENT '排序号', - - -- 索引 - INDEX idx_external_system_project_id (external_system_id, project_id) COMMENT '外部系统项目ID索引', - INDEX idx_group_id (group_id) COMMENT '组ID索引', - INDEX idx_path (path) COMMENT '路径索引', - UNIQUE INDEX uk_external_system_project_path (external_system_id, path) COMMENT '外部系统下路径唯一', - - -- 外键约束 - CONSTRAINT fk_project_group FOREIGN KEY (group_id) - REFERENCES deploy_repo_group (id), - CONSTRAINT fk_project_external_system FOREIGN KEY (external_system_id) - REFERENCES sys_external_system (id) +CREATE TABLE deploy_repo_project +( + -- 基础字段 + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', + + -- 业务字段 + name VARCHAR(100) NOT NULL COMMENT '项目名称', + description VARCHAR(500) NULL COMMENT '项目描述', + project_id BIGINT NOT NULL COMMENT '外部系统中的项目ID', + group_id BIGINT NULL COMMENT '所属仓库组ID', + path VARCHAR(200) NOT NULL COMMENT '项目路径', + external_system_id BIGINT NOT NULL COMMENT '外部系统ID', + is_default_branch VARCHAR(100) NULL COMMENT '默认分支', + is_enabled BIT NOT NULL DEFAULT 1 COMMENT '是否启用:0-禁用,1-启用', + visibility ENUM('private', 'internal', 'public') NOT NULL DEFAULT 'private' COMMENT '可见性:private-私有,internal-内部,public-公开', + http_url VARCHAR(255) NULL COMMENT 'HTTP克隆地址', + ssh_url VARCHAR(255) NULL COMMENT 'SSH克隆地址', + web_url VARCHAR(255) NULL COMMENT '网页URL', + last_activity_at DATETIME(6) NULL COMMENT '最后活动时间', + sort INT DEFAULT 0 COMMENT '排序号', + + -- 索引 + INDEX idx_external_system_project_id (external_system_id, project_id) COMMENT '外部系统项目ID索引', + INDEX idx_group_id (group_id) COMMENT '组ID索引', + INDEX idx_path ( PATH) COMMENT '路径索引', + UNIQUE INDEX uk_external_system_project_path (external_system_id, PATH) COMMENT '外部系统下路径唯一', + + -- 外键约束 + CONSTRAINT fk_project_group FOREIGN KEY (group_id) + REFERENCES deploy_repo_group (id), + CONSTRAINT fk_project_external_system FOREIGN KEY (external_system_id) + REFERENCES sys_external_system (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='代码仓库项目表'; -- 代码仓库分支表 -CREATE TABLE deploy_repo_branch ( - -- 基础字段 - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(100) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - update_by VARCHAR(100) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', - - -- 业务字段 - name VARCHAR(100) NOT NULL COMMENT '分支名称', - project_id BIGINT NOT NULL COMMENT '所属项目ID', - external_system_id BIGINT NOT NULL COMMENT '外部系统ID', - is_default_branch BIT DEFAULT 0 COMMENT '是否为默认分支:0-否,1-是', - is_protected BIT DEFAULT 0 COMMENT '是否受保护:0-否,1-是', - can_push BIT DEFAULT 1 COMMENT '是否可推送:0-否,1-是', - developers_can_push BIT DEFAULT 1 COMMENT '开发者是否可推送:0-否,1-是', - developers_can_merge BIT DEFAULT 1 COMMENT '开发者是否可合并:0-否,1-是', - commit_id VARCHAR(64) NULL COMMENT '最新提交ID', - commit_message TEXT NULL COMMENT '最新提交信息', - commit_author VARCHAR(100) NULL COMMENT '最新提交作者', - commit_date DATETIME(6) NULL COMMENT '最新提交时间', - web_url VARCHAR(255) NULL COMMENT '网页URL', - - -- 索引 - INDEX idx_project_id (project_id) COMMENT '项目ID索引', - INDEX idx_external_system_id (external_system_id) COMMENT '外部系统ID索引', - INDEX idx_name (name) COMMENT '分支名称索引', - UNIQUE INDEX uk_project_branch_name (project_id, name) COMMENT '项目下分支名称唯一', - - -- 外键约束 - CONSTRAINT fk_branch_project FOREIGN KEY (project_id) - REFERENCES deploy_repo_project (id), - CONSTRAINT fk_branch_external_system FOREIGN KEY (external_system_id) - REFERENCES sys_external_system (id) +CREATE TABLE deploy_repo_branch +( + -- 基础字段 + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(100) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + update_by VARCHAR(100) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除:0-未删除,1-已删除', + + -- 业务字段 + name VARCHAR(100) NOT NULL COMMENT '分支名称', + project_id BIGINT NOT NULL COMMENT '所属项目ID', + external_system_id BIGINT NOT NULL COMMENT '外部系统ID', + is_default_branch BIT DEFAULT 0 COMMENT '是否为默认分支:0-否,1-是', + is_protected BIT DEFAULT 0 COMMENT '是否受保护:0-否,1-是', + can_push BIT DEFAULT 1 COMMENT '是否可推送:0-否,1-是', + developers_can_push BIT DEFAULT 1 COMMENT '开发者是否可推送:0-否,1-是', + developers_can_merge BIT DEFAULT 1 COMMENT '开发者是否可合并:0-否,1-是', + commit_id VARCHAR(64) NULL COMMENT '最新提交ID', + commit_message TEXT NULL COMMENT '最新提交信息', + commit_author VARCHAR(100) NULL COMMENT '最新提交作者', + commit_date DATETIME(6) NULL COMMENT '最新提交时间', + web_url VARCHAR(255) NULL COMMENT '网页URL', + + -- 索引 + INDEX idx_project_id (project_id) COMMENT '项目ID索引', + INDEX idx_external_system_id (external_system_id) COMMENT '外部系统ID索引', + INDEX idx_name ( NAME) COMMENT '分支名称索引', + UNIQUE INDEX uk_project_branch_name (project_id, NAME) COMMENT '项目下分支名称唯一', + + -- 外键约束 + CONSTRAINT fk_branch_project FOREIGN KEY (project_id) + REFERENCES deploy_repo_project (id), + CONSTRAINT fk_branch_external_system FOREIGN KEY (external_system_id) + REFERENCES sys_external_system (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='代码仓库分支表'; -- -------------------------------------------------------------------------------------- @@ -385,120 +483,126 @@ CREATE TABLE deploy_repo_branch ( -- 工作流定义表 CREATE TABLE workflow_definition ( - -- 主键 - id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + -- 主键 + id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', - -- 基础信息 - name VARCHAR(255) NOT NULL COMMENT '流程名称', - `key` VARCHAR(255) NOT NULL COMMENT '流程标识', - flow_version INT NOT NULL COMMENT '流程版本', - description TEXT COMMENT '流程描述', - category VARCHAR(100) COMMENT '流程分类', + -- 基础信息 + name VARCHAR(255) NOT NULL COMMENT '流程名称', + `key` VARCHAR(255) NOT NULL COMMENT '流程标识', + process_definition_id VARCHAR(100) NULL COMMENT '工作流定义ID', + flow_version INT NOT NULL COMMENT '流程版本', + description TEXT COMMENT '流程描述', + category VARCHAR(100) COMMENT '流程分类', - -- 流程配置 - bpmn_xml TEXT COMMENT 'BPMN XML内容', - graph JSON COMMENT '流程图数据,包含节点和连线的位置、样式等信息', - form_config JSON COMMENT '表单配置', - tags JSON COMMENT '流程标签', + -- 流程配置 + bpmn_xml TEXT COMMENT 'BPMN XML内容', + graph JSON COMMENT '流程图数据,包含节点和连线的位置、样式等信息', + form_config JSON COMMENT '表单配置', + tags JSON COMMENT '流程标签', - -- 流程属性 - status VARCHAR(50) NOT NULL COMMENT '流程状态(DRAFT-草稿、PUBLISHED-已发布、DISABLED-已禁用)', - is_executable BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否可执行', - target_namespace VARCHAR(255) DEFAULT 'http://www.flowable.org/test' COMMENT '目标命名空间', + -- 流程属性 + status VARCHAR(50) NOT NULL COMMENT '流程状态(DRAFT-草稿、PUBLISHED-已发布、DISABLED-已禁用)', + is_executable BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否可执行', + target_namespace VARCHAR(255) DEFAULT 'http://www.flowable.org/test' COMMENT '目标命名空间', - -- 审计字段 - created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间', - updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间', - created_by BIGINT COMMENT '创建人', - updated_by BIGINT COMMENT '更新人', - is_deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否删除', + -- 审计字段 + created_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP (6) COMMENT '创建时间', + updated_at DATETIME(6) NOT NULL DEFAULT CURRENT_TIMESTAMP (6) ON UPDATE CURRENT_TIMESTAMP (6) COMMENT '更新时间', + created_by BIGINT COMMENT '创建人', + updated_by BIGINT COMMENT '更新人', + is_deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否删除', - -- 约束 - UNIQUE KEY uk_key_version (`key`, flow_version) + -- 约束 + UNIQUE KEY uk_key_version (`key`, flow_version) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT ='工作流定义表'; -- 工作流实例表 -CREATE TABLE workflow_instance ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - process_instance_id VARCHAR(64) NOT NULL COMMENT '流程实例ID', - process_definition_id BIGINT NOT NULL COMMENT '流程定义ID', - business_key VARCHAR(64) NULL COMMENT '业务标识', - status VARCHAR(32) NOT NULL COMMENT '实例状态', - variables TEXT NULL COMMENT '流程变量(JSON)', - start_time DATETIME(6) NOT NULL COMMENT '开始时间', - end_time DATETIME(6) NULL COMMENT '结束时间', - - CONSTRAINT FK_workflow_instance_definition FOREIGN KEY (process_definition_id) REFERENCES workflow_definition(id) +CREATE TABLE workflow_instance +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + process_instance_id VARCHAR(64) NOT NULL COMMENT '流程实例ID', + process_definition_id VARCHAR(64) NOT NULL COMMENT '流程定义ID', + workflow_definition_id BIGINT NOT NULL COMMENT '工作流定义ID', + business_key VARCHAR(64) NULL COMMENT '业务标识', + status VARCHAR(32) NOT NULL COMMENT '实例状态', + variables TEXT NULL COMMENT '流程变量(JSON)', + start_time DATETIME(6) NOT NULL COMMENT '开始时间', + end_time DATETIME(6) NULL COMMENT '结束时间' + +-- CONSTRAINT FK_workflow_instance_definition FOREIGN KEY (process_definition_id) REFERENCES workflow_definition(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流实例表'; -- 工作流节点实例表 -CREATE TABLE workflow_node_instance ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - workflow_instance_id BIGINT NOT NULL COMMENT '工作流实例ID', - node_id VARCHAR(64) NOT NULL COMMENT '节点ID', - node_name VARCHAR(100) NOT NULL COMMENT '节点名称', - node_type VARCHAR(32) NOT NULL COMMENT '节点类型', - status VARCHAR(32) NOT NULL COMMENT '节点状态', - start_time DATETIME(6) NOT NULL COMMENT '开始时间', - end_time DATETIME(6) NULL COMMENT '结束时间', - variables TEXT NULL COMMENT '节点变量(JSON)', - error_message TEXT NULL COMMENT '错误信息', - - CONSTRAINT FK_workflow_node_instance_instance FOREIGN KEY (workflow_instance_id) REFERENCES workflow_instance(id) +CREATE TABLE workflow_node_instance +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + workflow_instance_id BIGINT NOT NULL COMMENT '工作流实例ID', + node_id VARCHAR(64) NOT NULL COMMENT '节点ID', + node_name VARCHAR(100) NOT NULL COMMENT '节点名称', + node_type VARCHAR(32) NOT NULL COMMENT '节点类型', + status VARCHAR(32) NOT NULL COMMENT '节点状态', + start_time DATETIME(6) NOT NULL COMMENT '开始时间', + end_time DATETIME(6) NULL COMMENT '结束时间', + variables TEXT NULL COMMENT '节点变量(JSON)', + error_message TEXT NULL COMMENT '错误信息', + + CONSTRAINT FK_workflow_node_instance_instance FOREIGN KEY (workflow_instance_id) REFERENCES workflow_instance (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流节点实例表'; -- 工作流日志表 -CREATE TABLE workflow_log ( - id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', - create_by VARCHAR(255) NULL COMMENT '创建人', - create_time DATETIME(6) NULL COMMENT '创建时间', - deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', - update_by VARCHAR(255) NULL COMMENT '更新人', - update_time DATETIME(6) NULL COMMENT '更新时间', - version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', - - workflow_instance_id BIGINT NULL COMMENT '工作流实例ID', - node_instance_id BIGINT NULL COMMENT '节点实例ID', - log_type VARCHAR(32) NOT NULL COMMENT '日志类型', - log_level VARCHAR(32) NOT NULL COMMENT '日志级别', - content TEXT NOT NULL COMMENT '日志内容', - - CONSTRAINT FK_workflow_log_instance FOREIGN KEY (workflow_instance_id) REFERENCES workflow_instance(id), - CONSTRAINT FK_workflow_log_node_instance FOREIGN KEY (node_instance_id) REFERENCES workflow_node_instance(id) +CREATE TABLE workflow_log +( + id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID', + create_by VARCHAR(255) NULL COMMENT '创建人', + create_time DATETIME(6) NULL COMMENT '创建时间', + deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除(0:未删除,1:已删除)', + update_by VARCHAR(255) NULL COMMENT '更新人', + update_time DATETIME(6) NULL COMMENT '更新时间', + version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号', + + workflow_instance_id BIGINT NULL COMMENT '工作流实例ID', + node_instance_id BIGINT NULL COMMENT '节点实例ID', + log_type VARCHAR(32) NOT NULL COMMENT '日志类型', + log_level VARCHAR(32) NOT NULL COMMENT '日志级别', + content TEXT NOT NULL COMMENT '日志内容', + + CONSTRAINT FK_workflow_log_instance FOREIGN KEY (workflow_instance_id) REFERENCES workflow_instance (id), + CONSTRAINT FK_workflow_log_node_instance FOREIGN KEY (node_instance_id) REFERENCES workflow_node_instance (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流日志表'; -- 创建工作流节点定义表 -CREATE TABLE workflow_node_definition ( - id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', - type VARCHAR(50) NOT NULL COMMENT '节点类型编码', - name VARCHAR(100) NOT NULL COMMENT '节点名称', - description VARCHAR(500) COMMENT '节点描述', - category VARCHAR(50) NOT NULL COMMENT '节点分类', - graph_config TEXT NOT NULL COMMENT 'X6图形配置JSON', - order_num INT NOT NULL DEFAULT 0 COMMENT '排序号', - enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用', - create_time DATETIME NOT NULL COMMENT '创建时间', - create_by VARCHAR(50) NOT NULL COMMENT '创建人', - update_time DATETIME NOT NULL COMMENT '更新时间', - update_by VARCHAR(50) NOT NULL COMMENT '更新人', - version INT NOT NULL DEFAULT 1 COMMENT '版本号', - deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否删除', - PRIMARY KEY (id), - UNIQUE KEY uk_type (type) +CREATE TABLE workflow_node_definition +( + id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID', + type VARCHAR(50) NOT NULL COMMENT '节点类型编码', + name VARCHAR(100) NOT NULL COMMENT '节点名称', + description VARCHAR(500) COMMENT '节点描述', + category VARCHAR(50) NOT NULL COMMENT '节点分类', + graph_config TEXT NOT NULL COMMENT 'X6图形配置JSON', + order_num INT NOT NULL DEFAULT 0 COMMENT '排序号', + enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否启用', + create_time DATETIME NOT NULL COMMENT '创建时间', + create_by VARCHAR(50) NOT NULL COMMENT '创建人', + update_time DATETIME NOT NULL COMMENT '更新时间', + update_by VARCHAR(50) NOT NULL COMMENT '更新人', + version INT NOT NULL DEFAULT 1 COMMENT '版本号', + deleted BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否删除', + PRIMARY KEY (id), + UNIQUE KEY uk_type (TYPE) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='工作流节点定义表'; \ No newline at end of file diff --git a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql b/backend/src/main/resources/db/migration/V1.0.1__init_data.sql index a4772f07..39a0a554 100644 --- a/backend/src/main/resources/db/migration/V1.0.1__init_data.sql +++ b/backend/src/main/resources/db/migration/V1.0.1__init_data.sql @@ -158,7 +158,7 @@ INSERT INTO sys_external_system ( -- 工作流定义测试数据 INSERT INTO workflow_definition ( -- 基础信息 - name, `key`, flow_version, description, category, + name, `key`, process_definition_id, flow_version, description, category, -- 流程配置 graph, form_config, tags, -- 流程属性 @@ -168,7 +168,7 @@ INSERT INTO workflow_definition ( ) VALUES -- 简单脚本流程:开始 -> 脚本任务 -> 结束 ( - '简单脚本流程', 'simple_script_flow', 1, '一个包含脚本任务的简单流程', 'test', + '简单脚本流程', 'simple_script_flow', null, 1, '一个包含脚本任务的简单流程', 'test', '{ "nodes" : [ { "id" : "startEvent1", @@ -337,7 +337,7 @@ INSERT INTO workflow_definition ( -- 复杂业务流程:开始 -> 脚本任务A -> 脚本任务B -> 结束 ( - '复杂业务流程', 'complex_business_flow', 1, '包含多个脚本任务节点的业务流程', 'business', + '复杂业务流程', 'complex_business_flow', null, 1, '包含多个脚本任务节点的业务流程', 'business', '{ "nodes" : [ { "id" : "startEvent1",