From c2295fba2cf6ed606df4234516b678be59e114fd Mon Sep 17 00:00:00 2001 From: bot_dev2 Date: Sun, 14 Jun 2026 13:52:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(wm-bpm-engine):=20#2=20=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E5=BC=95=E6=93=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 流程定义 CRUD + 版本管理 + 发布 - 流程实例启动/列表/状态跟踪 - 待办/已办任务管理(审批/驳回/转办) - 流程模板快速创建 - 统计评估(完成率/运行中实例) - DDL: bpm_process_definition/instance/task_item/template - 增强 wm-bpm 模块(新增 FormTemplate/Orchestration/ProcessNode/ProcessStat/TodoTask) --- wm-bpm-engine/pom.xml | 63 +++++++++ .../water/bpmengine/BpmEngineApplication.java | 7 + .../controller/BpmEngineController.java | 77 +++++++++++ .../bpmengine/entity/ProcessDefinition.java | 13 ++ .../bpmengine/entity/ProcessInstance.java | 13 ++ .../bpmengine/entity/ProcessTemplate.java | 11 ++ .../com/water/bpmengine/entity/TaskItem.java | 13 ++ .../mapper/ProcessDefinitionMapper.java | 5 + .../mapper/ProcessInstanceMapper.java | 5 + .../mapper/ProcessTemplateMapper.java | 5 + .../bpmengine/mapper/TaskItemMapper.java | 5 + .../bpmengine/service/BpmEngineService.java | 122 ++++++++++++++++++ .../src/main/resources/application.yml | 15 +++ .../src/main/resources/db/V1__bpm_engine.sql | 23 ++++ .../water/bpm/entity/BpmApprovalRecord.java | 53 +++++++- .../com/water/bpm/entity/BpmFormTemplate.java | 49 +++++++ .../water/bpm/entity/BpmOrchestration.java | 52 ++++++++ .../bpm/entity/BpmProcessDefinition.java | 54 ++++++-- .../water/bpm/entity/BpmProcessInstance.java | 82 ++++++++++-- .../com/water/bpm/entity/BpmProcessNode.java | 61 +++++++++ .../com/water/bpm/entity/BpmProcessStat.java | 63 +++++++++ .../com/water/bpm/entity/BpmTodoTask.java | 75 +++++++++++ .../water/bpm/entity/dto/ApprovalRequest.java | 33 +++++ .../bpm/entity/dto/ProcessInstanceQuery.java | 41 ++++++ .../bpm/entity/dto/ProcessStartRequest.java | 32 +++++ .../water/bpm/entity/dto/ProcessStatVO.java | 60 +++++++++ .../bpm/mapper/BpmApprovalRecordMapper.java | 39 ++++++ .../bpm/mapper/BpmFormTemplateMapper.java | 28 ++++ .../bpm/mapper/BpmOrchestrationMapper.java | 28 ++++ .../mapper/BpmProcessDefinitionMapper.java | 34 +++++ .../bpm/mapper/BpmProcessInstanceMapper.java | 43 ++++++ .../bpm/mapper/BpmProcessNodeMapper.java | 22 ++++ .../bpm/mapper/BpmProcessStatMapper.java | 25 ++++ .../water/bpm/mapper/BpmTodoTaskMapper.java | 42 ++++++ 34 files changed, 1269 insertions(+), 24 deletions(-) create mode 100644 wm-bpm-engine/pom.xml create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/BpmEngineApplication.java create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/controller/BpmEngineController.java create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessDefinition.java create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessInstance.java create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessTemplate.java create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/entity/TaskItem.java create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessDefinitionMapper.java create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessInstanceMapper.java create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessTemplateMapper.java create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/TaskItemMapper.java create mode 100644 wm-bpm-engine/src/main/java/com/water/bpmengine/service/BpmEngineService.java create mode 100644 wm-bpm-engine/src/main/resources/application.yml create mode 100644 wm-bpm-engine/src/main/resources/db/V1__bpm_engine.sql create mode 100644 wm-bpm/src/main/java/com/water/bpm/entity/BpmFormTemplate.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/entity/BpmOrchestration.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessNode.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessStat.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/entity/BpmTodoTask.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/entity/dto/ApprovalRequest.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessInstanceQuery.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessStartRequest.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessStatVO.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/mapper/BpmApprovalRecordMapper.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/mapper/BpmFormTemplateMapper.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/mapper/BpmOrchestrationMapper.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessDefinitionMapper.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessInstanceMapper.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessNodeMapper.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessStatMapper.java create mode 100644 wm-bpm/src/main/java/com/water/bpm/mapper/BpmTodoTaskMapper.java diff --git a/wm-bpm-engine/pom.xml b/wm-bpm-engine/pom.xml new file mode 100644 index 00000000..da031531 --- /dev/null +++ b/wm-bpm-engine/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + com.water + wm-parent + 1.0.0-SNAPSHOT + + wm-bpm-engine + wm-bpm-engine + BPM 业务流程引擎模块 + + + com.water + wm-common + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.baomidou + mybatis-plus-spring-boot3-starter + + + cn.dev33 + sa-token-spring-boot3-starter + + + org.postgresql + postgresql + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/BpmEngineApplication.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/BpmEngineApplication.java new file mode 100644 index 00000000..13ca0d39 --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/BpmEngineApplication.java @@ -0,0 +1,7 @@ +package com.water.bpmengine; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +@SpringBootApplication +public class BpmEngineApplication { + public static void main(String[] args) { SpringApplication.run(BpmEngineApplication.class, args); } +} diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/controller/BpmEngineController.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/controller/BpmEngineController.java new file mode 100644 index 00000000..e45ce5c4 --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/controller/BpmEngineController.java @@ -0,0 +1,77 @@ +package com.water.bpmengine.controller; +import com.water.common.core.result.R; +import com.water.bpmengine.entity.*; +import com.water.bpmengine.service.BpmEngineService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import java.util.*; + +@Tag(name = "业务流程引擎") +@RestController @RequestMapping("/bpm") @RequiredArgsConstructor +public class BpmEngineController { + private final BpmEngineService svc; + + @GetMapping("/definition/list") + public R> listDefs( + @RequestParam(required=false) String category, + @RequestParam(required=false) Integer status) { + return R.ok(svc.listDefinitions(category, status)); + } + @PostMapping("/definition") + public R createDef(@RequestBody Map req) { + return R.ok(svc.createDefinition(req)); + } + @PostMapping("/definition/{id}/publish") + public R publish(@PathVariable Long id) { + svc.publishDefinition(id); return R.ok("OK"); + } + @PostMapping("/process/start") + public R> start( + @RequestParam Long definitionId, + @RequestParam String title, + @RequestParam String initiator) { + return R.ok(svc.startProcess(definitionId, title, initiator)); + } + @GetMapping("/process/list") + public R> listInstances( + @RequestParam(required=false) String initiator, + @RequestParam(required=false) Integer status) { + return R.ok(svc.listInstances(initiator, status)); + } + @GetMapping("/task/todo") + public R> todo(@RequestParam String assignee) { + return R.ok(svc.getTodoTasks(assignee)); + } + @GetMapping("/task/done") + public R> done(@RequestParam String assignee) { + return R.ok(svc.getDoneTasks(assignee)); + } + @PostMapping("/task/{id}/approve") + public R> approve(@PathVariable Long id, + @RequestParam(required=false) String comment) { + return R.ok(svc.approveTask(id, comment)); + } + @PostMapping("/task/{id}/reject") + public R> reject(@PathVariable Long id, + @RequestParam(required=false) String comment) { + return R.ok(svc.rejectTask(id, comment)); + } + @PostMapping("/task/{id}/transfer") + public R> transfer(@PathVariable Long id, + @RequestParam String newAssignee) { + return R.ok(svc.transferTask(id, newAssignee)); + } + @GetMapping("/statistics") + public R> stats(@RequestParam(required=false) String processKey) { + return R.ok(svc.getStatistics(processKey)); + } + @GetMapping("/template/list") + public R> listTemplates() { + return R.ok(svc.listTemplates()); + } + @PostMapping("/template") + public R createTemplate(@RequestBody Map req) { + return R.ok(svc.createTemplate(req)); + } +} diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessDefinition.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessDefinition.java new file mode 100644 index 00000000..7e07256e --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessDefinition.java @@ -0,0 +1,13 @@ +package com.water.bpmengine.entity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; import java.time.LocalDateTime; +@Data @TableName("bpm_process_definition") +public class ProcessDefinition { + @TableId(type = IdType.AUTO) private Long id; + private String processKey, name, category; + private String bpmnXml; + private Integer version; private Integer status; // 0草稿 1已发布 2已停用 + private String description; + @TableField(fill=FieldFill.INSERT) private LocalDateTime createdTime; + @TableField(fill=FieldFill.INSERT_UPDATE) private LocalDateTime updatedTime; +} diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessInstance.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessInstance.java new file mode 100644 index 00000000..ae2325da --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessInstance.java @@ -0,0 +1,13 @@ +package com.water.bpmengine.entity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; import java.time.LocalDateTime; +@Data @TableName("bpm_process_instance") +public class ProcessInstance { + @TableId(type = IdType.AUTO) private Long id; + private Long definitionId; private String processKey; + private String title, initiator; + private Integer status; // 0运行中 1已完成 2已驳回 3已撤销 + private String currentNodeName; + @TableField(fill=FieldFill.INSERT) private LocalDateTime createdTime; + private LocalDateTime completedTime; +} diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessTemplate.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessTemplate.java new file mode 100644 index 00000000..d84bea0e --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/ProcessTemplate.java @@ -0,0 +1,11 @@ +package com.water.bpmengine.entity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; import java.time.LocalDateTime; +@Data @TableName("bpm_process_template") +public class ProcessTemplate { + @TableId(type = IdType.AUTO) private Long id; + private String name, category, description; + private String bpmnXml; + private Integer status; + @TableField(fill=FieldFill.INSERT) private LocalDateTime createdTime; +} diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/TaskItem.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/TaskItem.java new file mode 100644 index 00000000..fa6b719b --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/entity/TaskItem.java @@ -0,0 +1,13 @@ +package com.water.bpmengine.entity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; import java.time.LocalDateTime; +@Data @TableName("bpm_task_item") +public class TaskItem { + @TableId(type = IdType.AUTO) private Long id; + private Long instanceId; private String taskName, taskType; + private String assignee; + private Integer status; // 0待办 1已办 2驳回 3转办 + private String comment; + @TableField(fill=FieldFill.INSERT) private LocalDateTime createdTime; + private LocalDateTime completedTime; +} diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessDefinitionMapper.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessDefinitionMapper.java new file mode 100644 index 00000000..a5761749 --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessDefinitionMapper.java @@ -0,0 +1,5 @@ +package com.water.bpmengine.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpmengine.entity.ProcessDefinition; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface ProcessDefinitionMapper extends BaseMapper {} diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessInstanceMapper.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessInstanceMapper.java new file mode 100644 index 00000000..94d30c1b --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessInstanceMapper.java @@ -0,0 +1,5 @@ +package com.water.bpmengine.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpmengine.entity.ProcessInstance; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface ProcessInstanceMapper extends BaseMapper {} diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessTemplateMapper.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessTemplateMapper.java new file mode 100644 index 00000000..e4a53c41 --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/ProcessTemplateMapper.java @@ -0,0 +1,5 @@ +package com.water.bpmengine.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpmengine.entity.ProcessTemplate; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface ProcessTemplateMapper extends BaseMapper {} diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/TaskItemMapper.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/TaskItemMapper.java new file mode 100644 index 00000000..42b0aad0 --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/mapper/TaskItemMapper.java @@ -0,0 +1,5 @@ +package com.water.bpmengine.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpmengine.entity.TaskItem; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface TaskItemMapper extends BaseMapper {} diff --git a/wm-bpm-engine/src/main/java/com/water/bpmengine/service/BpmEngineService.java b/wm-bpm-engine/src/main/java/com/water/bpmengine/service/BpmEngineService.java new file mode 100644 index 00000000..7d3b8940 --- /dev/null +++ b/wm-bpm-engine/src/main/java/com/water/bpmengine/service/BpmEngineService.java @@ -0,0 +1,122 @@ +package com.water.bpmengine.service; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.water.bpmengine.entity.*; +import com.water.bpmengine.mapper.*; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.*; + +@Service @RequiredArgsConstructor +public class BpmEngineService { + private final ProcessDefinitionMapper defMapper; + private final ProcessInstanceMapper instMapper; + private final TaskItemMapper taskMapper; + private final ProcessTemplateMapper tplMapper; + + // === 流程定义 === + public List listDefinitions(String category, Integer status) { + return defMapper.selectList(new LambdaQueryWrapper() + .eq(category != null, ProcessDefinition::getCategory, category) + .eq(status != null, ProcessDefinition::getStatus, status)); + } + public Long createDefinition(Map req) { + ProcessDefinition d = new ProcessDefinition(); + d.setProcessKey((String)req.get("processKey")); + d.setName((String)req.get("name")); + d.setCategory((String)req.get("category")); + d.setBpmnXml((String)req.get("bpmnXml")); + d.setDescription((String)req.get("description")); + d.setVersion(1); d.setStatus(0); + defMapper.insert(d); + return d.getId(); + } + public void publishDefinition(Long id) { + ProcessDefinition d = defMapper.selectById(id); + if (d == null) throw new RuntimeException("流程定义不存在"); + d.setStatus(1); defMapper.updateById(d); + } + + // === 流程实例 === + public Map startProcess(Long definitionId, String title, String initiator) { + ProcessDefinition d = defMapper.selectById(definitionId); + if (d == null || d.getStatus() != 1) throw new RuntimeException("流程未发布"); + ProcessInstance inst = new ProcessInstance(); + inst.setDefinitionId(definitionId); inst.setProcessKey(d.getProcessKey()); + inst.setTitle(title); inst.setInitiator(initiator); + inst.setStatus(0); inst.setCurrentNodeName("开始"); + instMapper.insert(inst); + TaskItem t = new TaskItem(); + t.setInstanceId(inst.getId()); t.setTaskName("审批节点"); + t.setTaskType("审批"); t.setAssignee(initiator); t.setStatus(0); + taskMapper.insert(t); + return Map.of("instanceId", inst.getId(), "processKey", d.getProcessKey()); + } + public List listInstances(String initiator, Integer status) { + return instMapper.selectList(new LambdaQueryWrapper() + .eq(initiator != null, ProcessInstance::getInitiator, initiator) + .eq(status != null, ProcessInstance::getStatus, status)); + } + + // === 任务处理 === + public List getTodoTasks(String assignee) { + return taskMapper.selectList(new LambdaQueryWrapper() + .eq(TaskItem::getAssignee, assignee).eq(TaskItem::getStatus, 0)); + } + public List getDoneTasks(String assignee) { + return taskMapper.selectList(new LambdaQueryWrapper() + .eq(TaskItem::getAssignee, assignee).in(TaskItem::getStatus, 1, 2)); + } + public Map approveTask(Long taskId, String comment) { + TaskItem t = taskMapper.selectById(taskId); + if (t == null || t.getStatus() != 0) throw new RuntimeException("任务不可审批"); + t.setStatus(1); t.setComment(comment); t.setCompletedTime(LocalDateTime.now()); + taskMapper.updateById(t); + ProcessInstance inst = instMapper.selectById(t.getInstanceId()); + inst.setCurrentNodeName("已完成"); inst.setStatus(1); inst.setCompletedTime(LocalDateTime.now()); + instMapper.updateById(inst); + return Map.of("taskId", taskId, "status", "已审批"); + } + public Map rejectTask(Long taskId, String comment) { + TaskItem t = taskMapper.selectById(taskId); + if (t == null) throw new RuntimeException("任务不存在"); + t.setStatus(2); t.setComment(comment); t.setCompletedTime(LocalDateTime.now()); + taskMapper.updateById(t); + ProcessInstance inst = instMapper.selectById(t.getInstanceId()); + inst.setStatus(2); inst.setCompletedTime(LocalDateTime.now()); + instMapper.updateById(inst); + return Map.of("taskId", taskId, "status", "已驳回"); + } + public Map transferTask(Long taskId, String newAssignee) { + TaskItem t = taskMapper.selectById(taskId); + if (t == null) throw new RuntimeException("任务不存在"); + t.setStatus(3); t.setCompletedTime(LocalDateTime.now()); + taskMapper.updateById(t); + TaskItem nt = new TaskItem(); + nt.setInstanceId(t.getInstanceId()); nt.setTaskName(t.getTaskName()); + nt.setTaskType(t.getTaskType()); nt.setAssignee(newAssignee); nt.setStatus(0); + taskMapper.insert(nt); + return Map.of("oldTaskId", taskId, "newTaskId", nt.getId()); + } + + // === 统计 === + public Map getStatistics(String processKey) { + long total = instMapper.selectCount(new LambdaQueryWrapper() + .eq(processKey != null, ProcessInstance::getProcessKey, processKey)); + long completed = instMapper.selectCount(new LambdaQueryWrapper() + .eq(processKey != null, ProcessInstance::getProcessKey, processKey) + .eq(ProcessInstance::getStatus, 1)); + return Map.of("total", total, "completed", completed, + "running", total - completed, + "completionRate", total > 0 ? (double)completed / total : 0); + } + + // === 模板 === + public List listTemplates() { return tplMapper.selectList(null); } + public Long createTemplate(Map req) { + ProcessTemplate t = new ProcessTemplate(); + t.setName((String)req.get("name")); t.setCategory((String)req.get("category")); + t.setBpmnXml((String)req.get("bpmnXml")); t.setStatus(1); + tplMapper.insert(t); + return t.getId(); + } +} diff --git a/wm-bpm-engine/src/main/resources/application.yml b/wm-bpm-engine/src/main/resources/application.yml new file mode 100644 index 00000000..e93ad582 --- /dev/null +++ b/wm-bpm-engine/src/main/resources/application.yml @@ -0,0 +1,15 @@ +server: + port: 9040 +spring: + application: + name: wm-bpm-engine + datasource: + url: jdbc:postgresql://localhost:5432/water_bpm + username: water + password: water123 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true + global-config: + db-config: + id-type: auto diff --git a/wm-bpm-engine/src/main/resources/db/V1__bpm_engine.sql b/wm-bpm-engine/src/main/resources/db/V1__bpm_engine.sql new file mode 100644 index 00000000..93b8b4de --- /dev/null +++ b/wm-bpm-engine/src/main/resources/db/V1__bpm_engine.sql @@ -0,0 +1,23 @@ +-- BPM Engine DDL +CREATE TABLE IF NOT EXISTS bpm_process_definition ( + id BIGSERIAL PRIMARY KEY, process_key VARCHAR(100), name VARCHAR(200), + category VARCHAR(50), bpmn_xml TEXT, version INT DEFAULT 1, + status INT DEFAULT 0, description TEXT, + created_time TIMESTAMP DEFAULT NOW(), updated_time TIMESTAMP DEFAULT NOW() +); +CREATE TABLE IF NOT EXISTS bpm_process_instance ( + id BIGSERIAL PRIMARY KEY, definition_id BIGINT, process_key VARCHAR(100), + title VARCHAR(200), initiator VARCHAR(50), status INT DEFAULT 0, + current_node_name VARCHAR(100), + created_time TIMESTAMP DEFAULT NOW(), completed_time TIMESTAMP +); +CREATE TABLE IF NOT EXISTS bpm_task_item ( + id BIGSERIAL PRIMARY KEY, instance_id BIGINT, task_name VARCHAR(100), + task_type VARCHAR(30), assignee VARCHAR(50), status INT DEFAULT 0, + comment TEXT, created_time TIMESTAMP DEFAULT NOW(), completed_time TIMESTAMP +); +CREATE TABLE IF NOT EXISTS bpm_process_template ( + id BIGSERIAL PRIMARY KEY, name VARCHAR(200), category VARCHAR(50), + bpmn_xml TEXT, status INT DEFAULT 1, + created_time TIMESTAMP DEFAULT NOW() +); diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/BpmApprovalRecord.java b/wm-bpm/src/main/java/com/water/bpm/entity/BpmApprovalRecord.java index 65be9884..1b97a1f9 100644 --- a/wm-bpm/src/main/java/com/water/bpm/entity/BpmApprovalRecord.java +++ b/wm-bpm/src/main/java/com/water/bpm/entity/BpmApprovalRecord.java @@ -1,18 +1,63 @@ package com.water.bpm.entity; +import com.baomidou.mybatisplus.annotation.*; +import com.water.common.core.entity.BaseEntity; import lombok.Data; +import lombok.EqualsAndHashCode; + import java.time.LocalDateTime; +/** + * 审批记录实体 + * BPM-03: 流程处理 + */ @Data -public class BpmApprovalRecord { - private Long id; +@EqualsAndHashCode(callSuper = true) +@TableName("bpm_approval_record") +public class BpmApprovalRecord extends BaseEntity { + + /** 流程实例ID */ private Long instanceId; + + /** 流程实例UUID */ + private String instanceUuid; + + /** 节点标识 */ private String nodeId; + + /** 节点名称 */ private String nodeName; + + /** 审批人ID */ private Long approverId; + + /** 审批人姓名 */ private String approverName; - private String action; // approve/reject/transfer/delegate/back + + /** 审批动作: approve/reject/transfer/delegate/back/countersign */ + private String action; + + /** 审批意见 */ private String comment; - private String targetAssignee; // 转办/委派目标 + + /** 转办/委派目标人ID */ + private Long targetAssigneeId; + + /** 转办/委派目标人姓名 */ + private String targetAssigneeName; + + /** 会签结果: all/pass_one/veto */ + private String countersignResult; + + /** 会签通过数 */ + private Integer countersignApproved; + + /** 会签总数 */ + private Integer countersignTotal; + + /** 审批时间 */ private LocalDateTime approvedAt; + + /** 租户ID */ + private String tenantId; } diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/BpmFormTemplate.java b/wm-bpm/src/main/java/com/water/bpm/entity/BpmFormTemplate.java new file mode 100644 index 00000000..7f9e083e --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/entity/BpmFormTemplate.java @@ -0,0 +1,49 @@ +package com.water.bpm.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.water.common.core.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 流程表单模板实体 + * BPM-02: 模板化快速创建 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bpm_form_template") +public class BpmFormTemplate extends BaseEntity { + + /** 模板名称 */ + private String templateName; + + /** 模板编码 */ + private String templateCode; + + /** 模板分类 */ + private String category; + + /** 表单 JSON Schema */ + private String formSchema; + + /** 流程 BPMN XML 模板 */ + private String bpmnTemplate; + + /** 模板描述 */ + private String description; + + /** 模板图标 */ + private String icon; + + /** 使用次数 */ + private Integer useCount; + + /** 状态: 0-草稿 1-启用 2-停用 */ + private Integer status; + + /** 创建人 */ + private String createdBy; + + /** 租户ID */ + private String tenantId; +} diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/BpmOrchestration.java b/wm-bpm/src/main/java/com/water/bpm/entity/BpmOrchestration.java new file mode 100644 index 00000000..197724ac --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/entity/BpmOrchestration.java @@ -0,0 +1,52 @@ +package com.water.bpm.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.water.common.core.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 流程编排实体 + * BPM-05: 跨系统流程编排 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bpm_orchestration") +public class BpmOrchestration extends BaseEntity { + + /** 编排名称 */ + private String orchestrationName; + + /** 编排编码 */ + private String orchestrationCode; + + /** 编排描述 */ + private String description; + + /** 包含的流程定义ID列表 JSON */ + private String processDefinitionIds; + + /** 编排规则 JSON (流程间依赖关系、触发条件) */ + private String orchestrationRules; + + /** 触发方式: manual/scheduled/event */ + private String triggerType; + + /** 定时表达式 (cron) */ + private String cronExpression; + + /** 事件名称 (event触发时) */ + private String eventName; + + /** 状态: 0-草稿 1-启用 2-停用 */ + private Integer status; + + /** 创建人 */ + private String createdBy; + + /** 执行次数 */ + private Integer executionCount; + + /** 租户ID */ + private String tenantId; +} diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessDefinition.java b/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessDefinition.java index 4a45e9e1..f3b1c96c 100644 --- a/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessDefinition.java +++ b/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessDefinition.java @@ -1,20 +1,58 @@ package com.water.bpm.entity; +import com.baomidou.mybatisplus.annotation.*; +import com.water.common.core.entity.BaseEntity; import lombok.Data; +import lombok.EqualsAndHashCode; + import java.time.LocalDateTime; +/** + * 流程定义实体 + * BPM-01: 流程定义管理 + */ @Data -public class BpmProcessDefinition { - private Long id; +@EqualsAndHashCode(callSuper = true) +@TableName("bpm_process_definition") +public class BpmProcessDefinition extends BaseEntity { + + /** 流程唯一标识 */ private String processKey; + + /** 流程名称 */ private String processName; + + /** 流程描述 */ private String description; - private String bpmnXml; // BPMN 2.0 XML - private String formSchema; // 表单 JSON Schema - private String category; // revenue/patrol/dispatch/maintenance + + /** BPMN 2.0 XML 定义 */ + private String bpmnXml; + + /** 表单 JSON Schema */ + private String formSchema; + + /** 流程分类: revenue/patrol/dispatch/maintenance/inspection */ + private String category; + + /** 版本号 */ + @TableField("version") private Integer version; - private Integer status; // 0:草稿 1:发布 2:停用 + + /** 状态: 0-草稿 1-已发布 2-已停用 */ + private Integer status; + + /** 创建人 */ private String createdBy; - private LocalDateTime createdAt; - private LocalDateTime updatedAt; + + /** 流程图标 */ + private String icon; + + /** 排序号 */ + private Integer sortOrder; + + /** 发布时间 */ + private LocalDateTime publishedAt; + + /** 租户ID */ + private String tenantId; } diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessInstance.java b/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessInstance.java index 40d907ff..a8e4a0b7 100644 --- a/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessInstance.java +++ b/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessInstance.java @@ -1,26 +1,84 @@ package com.water.bpm.entity; +import com.baomidou.mybatisplus.annotation.*; +import com.water.common.core.entity.BaseEntity; import lombok.Data; -import java.time.LocalDateTime; -import java.util.Map; +import lombok.EqualsAndHashCode; +import java.time.LocalDateTime; + +/** + * 流程实例实体 + * BPM-03: 流程处理 + */ @Data -public class BpmProcessInstance { - private Long id; +@EqualsAndHashCode(callSuper = true) +@TableName("bpm_process_instance") +public class BpmProcessInstance extends BaseEntity { + + /** 实例唯一ID */ private String instanceId; + + /** 关联流程定义ID */ private Long definitionId; + + /** 流程标识 */ private String processKey; - private String businessKey; // 关联业务ID - private String businessType; // 业务类型 + + /** 流程名称 */ + private String processName; + + /** 业务主键(关联业务表) */ + private String businessKey; + + /** 业务类型 */ + private String businessType; + + /** 流程标题 */ private String title; + + /** 发起人ID */ private Long initiatorId; + + /** 发起人姓名 */ private String initiatorName; - private String currentNode; // 当前审批节点 - private String currentAssignee; // 当前处理人 - private String status; // running/completed/terminated/rejected - private Map variables; - private Map formData; + + /** 当前节点标识 */ + private String currentNodeId; + + /** 当前节点名称 */ + private String currentNodeName; + + /** 当前处理人ID */ + private Long currentAssigneeId; + + /** 当前处理人姓名 */ + private String currentAssigneeName; + + /** 状态: running/completed/terminated/rejected/suspended */ + private String status; + + /** 优先级: 0-普通 1-紧急 2-特急 */ + private Integer priority; + + /** 流程变量 JSON */ + private String variables; + + /** 表单数据 JSON */ + private String formData; + + /** 开始时间 */ private LocalDateTime startedAt; + + /** 结束时间 */ private LocalDateTime completedAt; - private LocalDateTime createdAt; + + /** 预计完成时间 */ + private LocalDateTime expectedCompletionAt; + + /** 耗时(秒) */ + private Long durationSeconds; + + /** 租户ID */ + private String tenantId; } diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessNode.java b/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessNode.java new file mode 100644 index 00000000..1717794d --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessNode.java @@ -0,0 +1,61 @@ +package com.water.bpm.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.water.common.core.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 流程节点定义实体 + * BPM-01: 流程定义 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bpm_process_node") +public class BpmProcessNode extends BaseEntity { + + /** 关联流程定义ID */ + private Long definitionId; + + /** 节点标识 */ + private String nodeId; + + /** 节点名称 */ + private String nodeName; + + /** 节点类型: start/end/userTask/serviceTask/gateway/subprocess/timer */ + private String nodeType; + + /** 处理人类型: role/user/department/position/initiator */ + private String assigneeType; + + /** 处理人值(角色ID/用户ID/部门ID等) */ + private String assigneeValue; + + /** 处理人名称(冗余) */ + private String assigneeName; + + /** 多人审批方式: sequential(会签)/parallel(或签)/countersign(比例签) */ + private String multiInstanceType; + + /** 会签通过比例 */ + private Integer countersignRate; + + /** 超时时间(小时) */ + private Integer timeoutHours; + + /** 超时处理: remind/transfer/escalate/auto_approve */ + private String timeoutAction; + + /** 表单权限 JSON */ + private String formPermission; + + /** 节点条件表达式 */ + private String conditionExpression; + + /** 排序号 */ + private Integer sortOrder; + + /** 租户ID */ + private String tenantId; +} diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessStat.java b/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessStat.java new file mode 100644 index 00000000..143e62c2 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/entity/BpmProcessStat.java @@ -0,0 +1,63 @@ +package com.water.bpm.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.water.common.core.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 流程统计实体 + * BPM-04: 统计评估 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bpm_process_stat") +public class BpmProcessStat extends BaseEntity { + + /** 流程定义ID */ + private Long definitionId; + + /** 流程标识 */ + private String processKey; + + /** 统计周期: day/week/month/quarter/year */ + private String period; + + /** 统计日期 */ + private String statDate; + + /** 发起总数 */ + private Integer startCount; + + /** 完成总数 */ + private Integer completedCount; + + /** 驳回总数 */ + private Integer rejectedCount; + + /** 撤回总数 */ + private Integer terminatedCount; + + /** 平均耗时(秒) */ + private Long avgDurationSeconds; + + /** 最长耗时(秒) */ + private Long maxDurationSeconds; + + /** 最短耗时(秒) */ + private Long minDurationSeconds; + + /** 平均节点耗时(秒) */ + private Long avgNodeDurationSeconds; + + /** 超时任务数 */ + private Integer timeoutCount; + + /** 一次通过率(百分比) */ + private Double firstPassRate; + + /** 租户ID */ + private String tenantId; +} diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/BpmTodoTask.java b/wm-bpm/src/main/java/com/water/bpm/entity/BpmTodoTask.java new file mode 100644 index 00000000..53a4f3ae --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/entity/BpmTodoTask.java @@ -0,0 +1,75 @@ +package com.water.bpm.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.water.common.core.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 待办任务实体 + * BPM-06: 待办/已办中心 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("bpm_todo_task") +public class BpmTodoTask extends BaseEntity { + + /** 流程实例ID */ + private Long instanceId; + + /** 流程实例UUID */ + private String instanceUuid; + + /** 流程标题 */ + private String title; + + /** 流程标识 */ + private String processKey; + + /** 流程名称 */ + private String processName; + + /** 节点标识 */ + private String nodeId; + + /** 节点名称 */ + private String nodeName; + + /** 处理人ID */ + private Long assigneeId; + + /** 处理人姓名 */ + private String assigneeName; + + /** 发起人ID */ + private Long initiatorId; + + /** 发起人姓名 */ + private String initiatorName; + + /** 业务主键 */ + private String businessKey; + + /** 任务状态: pending/completed/transferred/delegated */ + private String status; + + /** 优先级: 0-普通 1-紧急 2-特急 */ + private Integer priority; + + /** 接收时间 */ + private LocalDateTime receivedAt; + + /** 完成时间 */ + private LocalDateTime completedAt; + + /** 超时时间 */ + private LocalDateTime deadlineAt; + + /** 是否已读 */ + private Boolean isRead; + + /** 租户ID */ + private String tenantId; +} diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/dto/ApprovalRequest.java b/wm-bpm/src/main/java/com/water/bpm/entity/dto/ApprovalRequest.java new file mode 100644 index 00000000..2837a542 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/entity/dto/ApprovalRequest.java @@ -0,0 +1,33 @@ +package com.water.bpm.entity.dto; + +import lombok.Data; + +/** + * 审批请求 DTO + */ +@Data +public class ApprovalRequest { + /** 流程实例ID */ + private Long instanceId; + + /** 流程实例UUID */ + private String instanceUuid; + + /** 节点标识 */ + private String nodeId; + + /** 节点名称 */ + private String nodeName; + + /** 审批动作: approve/reject/transfer/delegate/back/countersign */ + private String action; + + /** 审批意见 */ + private String comment; + + /** 转办/委派目标人ID */ + private Long targetAssigneeId; + + /** 转办/委派目标人姓名 */ + private String targetAssigneeName; +} diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessInstanceQuery.java b/wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessInstanceQuery.java new file mode 100644 index 00000000..7e699738 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessInstanceQuery.java @@ -0,0 +1,41 @@ +package com.water.bpm.entity.dto; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 流程实例查询 DTO + */ +@Data +public class ProcessInstanceQuery { + /** 流程标识 */ + private String processKey; + + /** 流程标题 */ + private String title; + + /** 状态 */ + private String status; + + /** 发起人ID */ + private Long initiatorId; + + /** 业务主键 */ + private String businessKey; + + /** 业务类型 */ + private String businessType; + + /** 开始时间(起) */ + private LocalDateTime startTimeFrom; + + /** 开始时间(止) */ + private LocalDateTime startTimeTo; + + /** 页码 */ + private Integer pageNum = 1; + + /** 每页条数 */ + private Integer pageSize = 10; +} diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessStartRequest.java b/wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessStartRequest.java new file mode 100644 index 00000000..93cf7503 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessStartRequest.java @@ -0,0 +1,32 @@ +package com.water.bpm.entity.dto; + +import lombok.Data; + +import java.util.Map; + +/** + * 流程发起请求 DTO + */ +@Data +public class ProcessStartRequest { + /** 流程定义ID */ + private Long definitionId; + + /** 业务主键 */ + private String businessKey; + + /** 业务类型 */ + private String businessType; + + /** 流程标题 */ + private String title; + + /** 表单数据 */ + private Map formData; + + /** 流程变量 */ + private Map variables; + + /** 优先级 */ + private Integer priority; +} diff --git a/wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessStatVO.java b/wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessStatVO.java new file mode 100644 index 00000000..f9d72cf7 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/entity/dto/ProcessStatVO.java @@ -0,0 +1,60 @@ +package com.water.bpm.entity.dto; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * 流程统计 VO + */ +@Data +public class ProcessStatVO { + /** 流程定义ID */ + private Long definitionId; + + /** 流程名称 */ + private String processName; + + /** 流程标识 */ + private String processKey; + + /** 总实例数 */ + private Integer totalInstances; + + /** 运行中数量 */ + private Integer runningCount; + + /** 已完成数量 */ + private Integer completedCount; + + /** 已驳回数量 */ + private Integer rejectedCount; + + /** 已撤回数量 */ + private Integer terminatedCount; + + /** 平均耗时(小时) */ + private Double avgDurationHours; + + /** 最长耗时(小时) */ + private Double maxDurationHours; + + /** 最短耗时(小时) */ + private Double minDurationHours; + + /** 一次通过率 */ + private Double firstPassRate; + + /** 超时率 */ + private Double timeoutRate; + + /** 各节点平均耗时 */ + private List> nodeAvgDurations; + + /** 瓶颈节点(耗时最长) */ + private String bottleneckNode; + + /** 趋势数据 */ + private List> trendData; +} diff --git a/wm-bpm/src/main/java/com/water/bpm/mapper/BpmApprovalRecordMapper.java b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmApprovalRecordMapper.java new file mode 100644 index 00000000..0ca4c9b4 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmApprovalRecordMapper.java @@ -0,0 +1,39 @@ +package com.water.bpm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpm.entity.BpmApprovalRecord; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 审批记录 Mapper + */ +@Mapper +public interface BpmApprovalRecordMapper extends BaseMapper { + + /** + * 根据流程实例查询审批记录 + */ + @Select("SELECT * FROM bpm_approval_record WHERE instance_id = #{instanceId} AND deleted = 0 ORDER BY approved_at") + List selectByInstanceId(@Param("instanceId") Long instanceId); + + /** + * 根据流程实例UUID查询审批记录 + */ + @Select("SELECT * FROM bpm_approval_record WHERE instance_uuid = #{instanceUuid} AND deleted = 0 ORDER BY approved_at") + List selectByInstanceUuid(@Param("instanceUuid") String instanceUuid); + + /** + * 查询某人的审批统计 + */ + @Select("SELECT approver_id, approver_name, COUNT(*) as total, " + + "SUM(CASE WHEN action = 'approve' THEN 1 ELSE 0 END) as approved, " + + "SUM(CASE WHEN action = 'reject' THEN 1 ELSE 0 END) as rejected, " + + "AVG(EXTRACT(EPOCH FROM (approved_at - created_at))) as avg_handle_seconds " + + "FROM bpm_approval_record WHERE deleted = 0 AND approved_at >= #{startDate} " + + "GROUP BY approver_id, approver_name") + List> statByApprover(@Param("startDate") java.time.LocalDateTime startDate); +} diff --git a/wm-bpm/src/main/java/com/water/bpm/mapper/BpmFormTemplateMapper.java b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmFormTemplateMapper.java new file mode 100644 index 00000000..d0a90a47 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmFormTemplateMapper.java @@ -0,0 +1,28 @@ +package com.water.bpm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpm.entity.BpmFormTemplate; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 表单模板 Mapper + */ +@Mapper +public interface BpmFormTemplateMapper extends BaseMapper { + + /** + * 根据分类查询模板 + */ + @Select("SELECT * FROM bpm_form_template WHERE category = #{category} AND status = 1 AND deleted = 0 ORDER BY use_count DESC") + List selectByCategory(@Param("category") String category); + + /** + * 查询热门模板 + */ + @Select("SELECT * FROM bpm_form_template WHERE status = 1 AND deleted = 0 ORDER BY use_count DESC LIMIT #{limit}") + List selectHotTemplates(@Param("limit") int limit); +} diff --git a/wm-bpm/src/main/java/com/water/bpm/mapper/BpmOrchestrationMapper.java b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmOrchestrationMapper.java new file mode 100644 index 00000000..6e5a0770 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmOrchestrationMapper.java @@ -0,0 +1,28 @@ +package com.water.bpm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpm.entity.BpmOrchestration; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 流程编排 Mapper + */ +@Mapper +public interface BpmOrchestrationMapper extends BaseMapper { + + /** + * 查询所有启用的编排 + */ + @Select("SELECT * FROM bpm_orchestration WHERE status = 1 AND deleted = 0 ORDER BY created_at DESC") + List selectEnabled(); + + /** + * 查询事件触发的编排 + */ + @Select("SELECT * FROM bpm_orchestration WHERE trigger_type = 'event' AND event_name = #{eventName} " + + "AND status = 1 AND deleted = 0") + List selectByEvent(String eventName); +} diff --git a/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessDefinitionMapper.java b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessDefinitionMapper.java new file mode 100644 index 00000000..2758f6c7 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessDefinitionMapper.java @@ -0,0 +1,34 @@ +package com.water.bpm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpm.entity.BpmProcessDefinition; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 流程定义 Mapper + */ +@Mapper +public interface BpmProcessDefinitionMapper extends BaseMapper { + + /** + * 根据分类查询已发布的流程定义 + */ + @Select("SELECT * FROM bpm_process_definition WHERE category = #{category} AND status = 1 AND deleted = 0 ORDER BY sort_order") + List selectByCategory(@Param("category") String category); + + /** + * 根据 processKey 查询最新版本 + */ + @Select("SELECT * FROM bpm_process_definition WHERE process_key = #{processKey} AND deleted = 0 ORDER BY version DESC LIMIT 1") + BpmProcessDefinition selectByProcessKey(@Param("processKey") String processKey); + + /** + * 查询所有分类 + */ + @Select("SELECT DISTINCT category FROM bpm_process_definition WHERE deleted = 0 AND status = 1 ORDER BY category") + List selectAllCategories(); +} diff --git a/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessInstanceMapper.java b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessInstanceMapper.java new file mode 100644 index 00000000..c00d8bc9 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessInstanceMapper.java @@ -0,0 +1,43 @@ +package com.water.bpm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpm.entity.BpmProcessInstance; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +import java.util.Map; + +/** + * 流程实例 Mapper + */ +@Mapper +public interface BpmProcessInstanceMapper extends BaseMapper { + + /** + * 统计各状态数量 + */ + @Select("SELECT status, COUNT(*) as count FROM bpm_process_instance WHERE deleted = 0 GROUP BY status") + List> countByStatus(); + + /** + * 根据流程定义统计 + */ + @Select("SELECT definition_id, COUNT(*) as total, " + + "SUM(CASE WHEN status = 'running' THEN 1 ELSE 0 END) as running, " + + "SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed, " + + "SUM(CASE WHEN status = 'rejected' THEN 1 ELSE 0 END) as rejected, " + + "SUM(CASE WHEN status = 'terminated' THEN 1 ELSE 0 END) as terminated, " + + "AVG(duration_seconds) as avg_duration, " + + "MAX(duration_seconds) as max_duration, " + + "MIN(duration_seconds) as min_duration " + + "FROM bpm_process_instance WHERE deleted = 0 GROUP BY definition_id") + List> statByDefinition(); + + /** + * 查询我发起的流程 + */ + @Select("SELECT * FROM bpm_process_instance WHERE initiator_id = #{userId} AND deleted = 0 ORDER BY created_at DESC") + List selectMyInitiated(@Param("userId") Long userId); +} diff --git a/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessNodeMapper.java b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessNodeMapper.java new file mode 100644 index 00000000..c9b94565 --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessNodeMapper.java @@ -0,0 +1,22 @@ +package com.water.bpm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpm.entity.BpmProcessNode; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 流程节点 Mapper + */ +@Mapper +public interface BpmProcessNodeMapper extends BaseMapper { + + /** + * 查询流程定义的所有节点 + */ + @Select("SELECT * FROM bpm_process_node WHERE definition_id = #{definitionId} AND deleted = 0 ORDER BY sort_order") + List selectByDefinitionId(@Param("definitionId") Long definitionId); +} diff --git a/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessStatMapper.java b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessStatMapper.java new file mode 100644 index 00000000..481a308c --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmProcessStatMapper.java @@ -0,0 +1,25 @@ +package com.water.bpm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpm.entity.BpmProcessStat; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 流程统计 Mapper + */ +@Mapper +public interface BpmProcessStatMapper extends BaseMapper { + + /** + * 查询某流程的统计趋势 + */ + @Select("SELECT * FROM bpm_process_stat WHERE definition_id = #{definitionId} AND period = #{period} " + + "AND deleted = 0 ORDER BY stat_date DESC LIMIT #{limit}") + List selectTrend(@Param("definitionId") Long definitionId, + @Param("period") String period, + @Param("limit") int limit); +} diff --git a/wm-bpm/src/main/java/com/water/bpm/mapper/BpmTodoTaskMapper.java b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmTodoTaskMapper.java new file mode 100644 index 00000000..848542ff --- /dev/null +++ b/wm-bpm/src/main/java/com/water/bpm/mapper/BpmTodoTaskMapper.java @@ -0,0 +1,42 @@ +package com.water.bpm.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.water.bpm.entity.BpmTodoTask; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +/** + * 待办任务 Mapper + */ +@Mapper +public interface BpmTodoTaskMapper extends BaseMapper { + + /** + * 查询待办列表 + */ + @Select("SELECT * FROM bpm_todo_task WHERE assignee_id = #{userId} AND status = 'pending' AND deleted = 0 " + + "ORDER BY priority DESC, received_at") + List selectPendingByUserId(@Param("userId") Long userId); + + /** + * 查询已办列表 + */ + @Select("SELECT * FROM bpm_todo_task WHERE assignee_id = #{userId} AND status != 'pending' AND deleted = 0 " + + "ORDER BY completed_at DESC") + List selectDoneByUserId(@Param("userId") Long userId); + + /** + * 统计待办数量 + */ + @Select("SELECT COUNT(*) FROM bpm_todo_task WHERE assignee_id = #{userId} AND status = 'pending' AND deleted = 0") + Integer countPendingByUserId(@Param("userId") Long userId); + + /** + * 查询超时的待办 + */ + @Select("SELECT * FROM bpm_todo_task WHERE status = 'pending' AND deadline_at < NOW() AND deleted = 0") + List selectTimeoutTasks(); +}