From c4633022115784c68b686c26034bc1a1cdbf4899 Mon Sep 17 00:00:00 2001
From: sunquan <287962685@qq.com>
Date: Thu, 30 Jul 2026 14:39:15 +0800
Subject: [PATCH] =?UTF-8?q?add=EF=BC=9A=E6=96=B0=E5=A2=9E=E5=8A=A0common-f?=
=?UTF-8?q?low-online=20=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
common/common-flow-online/pom.xml | 34 +
.../online/aop/FlowMultiDatabaseWriteAspect.java | 88 ++
.../online/aop/FlowMultiDatabaseWriteExAspect.java | 38 +
.../flow/online/config/FlowOnlineAutoConfig.java | 13 +
.../flow/online/config/FlowOnlineProperties.java | 20 +
.../controller/FlowOnlineOperationController.java | 1437 ++++++++++++++++++++
.../listener/ApprovalSettingsByCreateListener.java | 94 ++
.../object/TransactionalFlowBusinessData.java | 101 ++
.../online/service/FlowEntryOnlineService.java | 13 +
.../online/service/FlowOnlineOperationService.java | 163 +++
.../service/impl/FlowEntryOnlineServiceImpl.java | 319 +++++
.../impl/FlowOnlineBusinessServiceImpl.java | 102 ++
.../impl/FlowOnlineOperationServiceImpl.java | 434 ++++++
.../src/main/resources/META-INF/spring.factories | 2 +
common/pom.xml | 1 +
15 files changed, 2859 insertions(+)
create mode 100644 common/common-flow-online/pom.xml
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/aop/FlowMultiDatabaseWriteAspect.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/aop/FlowMultiDatabaseWriteExAspect.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/config/FlowOnlineAutoConfig.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/config/FlowOnlineProperties.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/controller/FlowOnlineOperationController.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/listener/ApprovalSettingsByCreateListener.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/object/TransactionalFlowBusinessData.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/service/FlowEntryOnlineService.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/service/FlowOnlineOperationService.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/service/impl/FlowEntryOnlineServiceImpl.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/service/impl/FlowOnlineBusinessServiceImpl.java
create mode 100644 common/common-flow-online/src/main/java/apelet/common/flow/online/service/impl/FlowOnlineOperationServiceImpl.java
create mode 100644 common/common-flow-online/src/main/resources/META-INF/spring.factories
diff --git a/common/common-flow-online/pom.xml b/common/common-flow-online/pom.xml
new file mode 100644
index 0000000..5904893
--- /dev/null
+++ b/common/common-flow-online/pom.xml
@@ -0,0 +1,34 @@
+
+
+
+ common
+ apelet
+ 1.0.0
+
+ 4.0.0
+
+ common-flow-online
+ 1.0.0
+ common-flow-online
+ jar
+
+
+
+ apelet
+ common-flow
+ 1.0.0
+
+
+ apelet
+ common-online
+ 1.0.0
+
+
+ apelet
+ common-orm
+ 1.0.0
+
+
+
\ No newline at end of file
diff --git a/common/common-flow-online/src/main/java/apelet/common/flow/online/aop/FlowMultiDatabaseWriteAspect.java b/common/common-flow-online/src/main/java/apelet/common/flow/online/aop/FlowMultiDatabaseWriteAspect.java
new file mode 100644
index 0000000..d109b34
--- /dev/null
+++ b/common/common-flow-online/src/main/java/apelet/common/flow/online/aop/FlowMultiDatabaseWriteAspect.java
@@ -0,0 +1,88 @@
+package apelet.common.flow.online.aop;
+
+import apelet.common.core.object.TokenData;
+import apelet.common.core.util.AopTargetUtil;
+import apelet.common.core.util.MyDateUtil;
+import apelet.common.flow.dao.FlowTransProducerMapper;
+import apelet.common.flow.model.FlowTaskComment;
+import apelet.common.flow.model.FlowTransProducer;
+import apelet.common.flow.online.object.TransactionalFlowBusinessData;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.stereotype.Component;
+
+/**
+ * 拦截流程业务多数据库数据写入的AOP对象。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+@Aspect
+@Component
+@Slf4j
+public class FlowMultiDatabaseWriteAspect {
+
+ @Autowired
+ private ApplicationEventPublisher eventPublisher;
+ @Autowired
+ private FlowTransProducerMapper flowTransProducerMapper;
+
+ @Pointcut("execution(public * apelet.common.flow..service.impl..*(..)) " +
+ "&& @annotation(apelet.common.core.annotation.MultiDatabaseWriteMethod)")
+ public void multiDatabaseWriteMethodPointCut() {
+ // 空注释,避免sonar警告
+ }
+
+ @Around("multiDatabaseWriteMethodPointCut()")
+ public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+ String initMethod = AopTargetUtil.getFullMethodName(joinPoint);
+ TransactionalFlowBusinessData data = TransactionalFlowBusinessData.getOrCreateFromRequestAttribute();
+ if (data.getInitMethod() == null) {
+ data.setInitMethod(initMethod);
+ }
+ try {
+ // 调用原来的方法
+ Object result = joinPoint.proceed();
+ if (StrUtil.equals(initMethod, data.getInitMethod()) && CollUtil.isNotEmpty(data.getSqlDataList())) {
+ this.fillupTransactionalBusinessData();
+ FlowTransProducer producerData = BeanUtil.copyProperties(data, FlowTransProducer.class);
+ producerData.setAppCode(TokenData.takeFromRequest().getAppCode());
+ producerData.setTryTimes(1);
+ String sqlData = JSON.toJSONStringWithDateFormat(
+ data.getSqlDataList(), MyDateUtil.COMMON_SHORT_DATETIME_FORMAT);
+ producerData.setSqlData(sqlData);
+ flowTransProducerMapper.insert(producerData);
+ eventPublisher.publishEvent(data);
+ }
+ return result;
+ } catch (Exception e) {
+ TransactionalFlowBusinessData.removeFromRequestAttribute();
+ throw e;
+ } finally {
+ if (StrUtil.equals(initMethod, data.getInitMethod())) {
+ TransactionalFlowBusinessData.removeFromRequestAttribute();
+ }
+ }
+ }
+
+ private void fillupTransactionalBusinessData() {
+ FlowTaskComment comment = FlowTaskComment.getFromRequest();
+ TransactionalFlowBusinessData data = TransactionalFlowBusinessData.getFromRequestAttribute();
+ if (comment != null) {
+ data.setProcessInstanceId(comment.getProcessInstanceId());
+ data.setTaskId(comment.getTaskId());
+ data.setTaskKey(comment.getTaskKey());
+ data.setTaskName(comment.getTaskName());
+ data.setTaskComment(comment.getTaskComment());
+ }
+ }
+}
diff --git a/common/common-flow-online/src/main/java/apelet/common/flow/online/aop/FlowMultiDatabaseWriteExAspect.java b/common/common-flow-online/src/main/java/apelet/common/flow/online/aop/FlowMultiDatabaseWriteExAspect.java
new file mode 100644
index 0000000..d15aca1
--- /dev/null
+++ b/common/common-flow-online/src/main/java/apelet/common/flow/online/aop/FlowMultiDatabaseWriteExAspect.java
@@ -0,0 +1,38 @@
+package apelet.common.flow.online.aop;
+
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * 主要用于拦截FlowTransactionBusinessDataListener监听器类抛出的异常。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+@Aspect
+@Component
+@Order(1)
+@Slf4j
+public class FlowMultiDatabaseWriteExAspect {
+
+ @Pointcut("execution(public * apelet.common.flow.online.service.impl..*(..)) " +
+ "&& @annotation(apelet.common.core.annotation.MultiDatabaseWriteMethod)")
+ public void multiDatabaseWriteMethodPointCut() {
+ // 空注释,避免sonar警告
+ }
+
+ @Around("multiDatabaseWriteMethodPointCut()")
+ public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
+ try {
+ return joinPoint.proceed();
+ } catch (Exception e) {
+ log.error("FlowMultiDatabaseWriteExAspect throw", e);
+ throw e;
+ }
+ }
+}
diff --git a/common/common-flow-online/src/main/java/apelet/common/flow/online/config/FlowOnlineAutoConfig.java b/common/common-flow-online/src/main/java/apelet/common/flow/online/config/FlowOnlineAutoConfig.java
new file mode 100644
index 0000000..ffefce4
--- /dev/null
+++ b/common/common-flow-online/src/main/java/apelet/common/flow/online/config/FlowOnlineAutoConfig.java
@@ -0,0 +1,13 @@
+package apelet.common.flow.online.config;
+
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+
+/**
+ * common-flow-online模块的自动配置引导类。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+@EnableConfigurationProperties({FlowOnlineProperties.class})
+public class FlowOnlineAutoConfig {
+}
diff --git a/common/common-flow-online/src/main/java/apelet/common/flow/online/config/FlowOnlineProperties.java b/common/common-flow-online/src/main/java/apelet/common/flow/online/config/FlowOnlineProperties.java
new file mode 100644
index 0000000..550bbc7
--- /dev/null
+++ b/common/common-flow-online/src/main/java/apelet/common/flow/online/config/FlowOnlineProperties.java
@@ -0,0 +1,20 @@
+package apelet.common.flow.online.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * 在线表单工作流模块的配置对象。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+@Data
+@ConfigurationProperties(prefix = "common-flow-online")
+public class FlowOnlineProperties {
+
+ /**
+ * 在线表单的URL前缀。
+ */
+ private String urlPrefix;
+}
diff --git a/common/common-flow-online/src/main/java/apelet/common/flow/online/controller/FlowOnlineOperationController.java b/common/common-flow-online/src/main/java/apelet/common/flow/online/controller/FlowOnlineOperationController.java
new file mode 100644
index 0000000..2c5070f
--- /dev/null
+++ b/common/common-flow-online/src/main/java/apelet/common/flow/online/controller/FlowOnlineOperationController.java
@@ -0,0 +1,1437 @@
+package apelet.common.flow.online.controller;
+
+import apelet.common.core.annotation.DisableDataFilter;
+import apelet.common.core.annotation.MyRequestBody;
+import apelet.common.core.constant.ErrorCodeEnum;
+import apelet.common.core.object.*;
+import apelet.common.core.util.*;
+import apelet.common.flow.constant.*;
+import apelet.common.flow.dto.FlowTaskCommentDto;
+import apelet.common.flow.dto.FlowWorkOrderDto;
+import apelet.common.flow.exception.FlowOperationException;
+import apelet.common.flow.model.*;
+import apelet.common.flow.model.constant.FlowMessageType;
+import apelet.common.flow.online.service.FlowEntryOnlineService;
+import apelet.common.flow.online.service.FlowOnlineOperationService;
+import apelet.common.flow.service.*;
+import apelet.common.flow.util.FlowOperationHelper;
+import apelet.common.flow.vo.*;
+import apelet.common.generator.utils.OrmGenDataSourceUtil;
+import apelet.common.log.annotation.OperationLog;
+import apelet.common.log.model.constant.SysOperationLogType;
+import apelet.common.online.config.OnlineProperties;
+import apelet.common.online.dto.OnlineFilterDto;
+import apelet.common.online.model.*;
+import apelet.common.online.model.constant.FieldFilterType;
+import apelet.common.online.model.constant.FieldKind;
+import apelet.common.online.model.constant.RelationType;
+import apelet.common.online.service.*;
+import apelet.common.online.util.OnlineOperationHelper;
+import apelet.common.orm.impl.Selector;
+import apelet.common.orm.impl.SelectorItem;
+import apelet.common.redis.cache.SessionCacheHelper;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.BooleanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.pagehelper.page.PageMethod;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.flowable.bpmn.model.Process;
+import org.flowable.bpmn.model.*;
+import org.flowable.engine.history.HistoricProcessInstance;
+import org.flowable.engine.runtime.ProcessInstance;
+import org.flowable.task.api.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.stream.XMLStreamException;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 工作流在线表单流程操作接口。
+ *
+ * @author guifc
+ * @date 2023-08-04
+ */
+@Tag(name = "工作流在线表单流程操作接口")
+@Slf4j
+@RestController
+@RequestMapping("${common-flow.urlPrefix}/flowOnlineOperation")
+@ConditionalOnProperty(name = "common-flow.operationEnabled", havingValue = "true")
+public class FlowOnlineOperationController {
+
+ @Autowired
+ private FlowEntryService flowEntryService;
+ @Autowired
+ private FlowApiService flowApiService;
+ @Autowired
+ private FlowOperationHelper flowOperationHelper;
+ @Autowired
+ private FlowOnlineOperationService flowOnlineOperationService;
+ @Autowired
+ private FlowWorkOrderService flowWorkOrderService;
+ @Autowired
+ private FlowMessageService flowMessageService;
+ @Autowired
+ private FlowTransProducerService flowTransProducerService;
+ @Autowired
+ private OnlineFormService onlineFormService;
+ @Autowired
+ private OnlinePageService onlinePageService;
+ @Autowired
+ private OnlineOperationService onlineOperationService;
+ @Autowired
+ private OnlineTableService onlineTableService;
+ @Autowired
+ private OnlineDatasourceService onlineDatasourceService;
+ @Autowired
+ private OnlineOperationHelper onlineOperationHelper;
+ @Autowired
+ private OnlineProperties onlineProperties;
+ @Autowired
+ private SessionCacheHelper sessionCacheHelper;
+ @Autowired
+ private FlowTaskExtService flowTaskExtService;
+ @Autowired
+ private FlowEntryOnlineService flowEntryOnlineService;
+
+ @Autowired
+ private OrmGenDataSourceUtil ormGenDataSourceUtil;
+
+ private static final String ONE_TO_MANY_VAR_SUFFIX = "List";
+
+
+ @DisableDataFilter
+ @PostMapping("/getOpreatingFlow")
+ public ResponseResult