Compare commits

..

15 Commits

Author SHA1 Message Date
FCL
5cbc445cf7 代码合并 2026-01-09 13:54:33 +08:00
chenbowen
3e3cc502e3 Merge branch 'dev' into test 2026-01-08 11:57:35 +08:00
chenbowen
c4968d1aea 1. 升级 bpm api 版本 2026-01-08 11:57:12 +08:00
chenbowen
5aa83d739e 1. 添加 prestop 切换流量 2026-01-07 19:49:11 +08:00
chenbowen
c44d798e68 Merge branch 'dev' into test 2025-12-23 10:52:47 +08:00
chenbowen
6ecfcf2a09 1. 升级版本 2025-12-23 10:50:24 +08:00
FCL
32bb22d6b6 Merge branch 'dev' into test 2025-12-23 09:35:22 +08:00
FCL
f16243441e fix:qms模块监听 2025-12-23 09:34:58 +08:00
FCL
f06e0a4d5c feat:报告流程回调优化;转pdf;发起iwork流程; 2025-12-16 16:11:09 +08:00
FCL
39ff226c9b Merge branch 'refs/heads/zt-test' into test 2025-12-11 10:17:55 +08:00
chenbowen
b4805414c5 1. 提出私服 skywalking 的依赖,使用 ZStack 自带链路追踪 2025-12-03 20:32:06 +08:00
qianshijiang
b3b324e0d9 错误信息未记录日志文件 2025-11-26 15:45:14 +08:00
qianshijiang
c327678aa4 错误信息未记录日志文件 2025-11-26 15:35:26 +08:00
qianshijiang
3e88f2a647 日志配置修改 2025-11-26 10:36:46 +08:00
qianshijiang
b1920b7b47 nacos配置 2025-11-26 08:58:10 +08:00
6 changed files with 119 additions and 29 deletions

View File

@@ -27,6 +27,13 @@ spec:
env: env:
- name: TZ - name: TZ
value: Asia/Shanghai value: Asia/Shanghai
lifecycle:
preStop:
exec:
command:
- "/bin/sh"
- "-c"
- "sleep 35"
readinessProbe: readinessProbe:
httpGet: httpGet:
path: /actuator/health path: /actuator/health
@@ -48,7 +55,7 @@ spec:
limits: limits:
cpu: "1" cpu: "1"
memory: "2048Mi" memory: "2048Mi"
terminationGracePeriodSeconds: 30 terminationGracePeriodSeconds: 40
strategy: strategy:
type: RollingUpdate type: RollingUpdate
rollingUpdate: rollingUpdate:

25
pom.xml
View File

@@ -16,15 +16,15 @@
<url>https://github.com/YunaiV/ruoyi-vue-pro</url> <url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<properties> <properties>
<revision>3.0.45</revision> <revision>3.0.46</revision>
<business.supply.version>3.0.44</business.supply.version> <business.supply.version>3.0.46</business.supply.version>
<business.base.version>3.0.44</business.base.version> <business.base.version>3.0.46</business.base.version>
<business.logistic.version>3.0.44</business.logistic.version> <business.logistic.version>3.0.46</business.logistic.version>
<business.manage.version>3.0.44</business.manage.version> <business.manage.version>3.0.46</business.manage.version>
<business.qms.version>3.0.44</business.qms.version> <business.qms.version>3.0.46</business.qms.version>
<business.mes.version>3.0.44</business.mes.version> <business.mes.version>3.0.46</business.mes.version>
<business.capital.version>3.0.44</business.capital.version> <business.capital.version>3.0.46</business.capital.version>
<business.product.version>3.0.44</business.product.version> <business.product.version>3.0.46</business.product.version>
<!-- Maven 相关 --> <!-- Maven 相关 -->
<java.version>17</java.version> <java.version>17</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.source>${java.version}</maven.compiler.source>
@@ -269,7 +269,14 @@
<profile> <profile>
<id>qsj</id> <id>qsj</id>
<properties> <properties>
<env.name>dev</env.name>
<!--Nacos 配置-->
<config.server-addr>172.16.46.63:30848</config.server-addr>
<config.namespace>qsj</config.namespace> <config.namespace>qsj</config.namespace>
<config.group>DEFAULT_GROUP</config.group>
<config.username>nacos</config.username>
<config.password>P@ssword25</config.password>
<config.version>1.0.0</config.version>
</properties> </properties>
</profile> </profile>
</profiles> </profiles>

View File

@@ -1,7 +1,6 @@
## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性 ## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性
ARG BASE_IMAGE=172.16.46.66:10043/base-service/skywalking-agent-jre:9.7.0 FROM 172.16.46.66:10043/base-service/eclipse-temurin:21-jre
FROM ${BASE_IMAGE}
## 创建目录,并使用它作为工作目录 ## 创建目录,并使用它作为工作目录
RUN mkdir -p /zt-module-bpm-server RUN mkdir -p /zt-module-bpm-server
@@ -11,15 +10,10 @@ COPY ./target/zt-module-bpm-server.jar app.jar
## 设置 TZ 时区 ## 设置 TZ 时区
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖 ## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV TZ=Asia/Shanghai ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m"
ENV JAVA_OPTS="-Xms512m -Xmx512m"
ENV SW_AGENT_HOME=/opt/skywalking/agent
ENV SW_AGENT_NAME=zt-module-bpm-server
ENV SW_AGENT_COLLECTOR_BACKEND_SERVICES=172.16.46.63:30201
ENV AGENT_JAVA_OPTS="-javaagent:${SW_AGENT_HOME}/skywalking-agent.jar -Dskywalking.agent.service_name=${SW_AGENT_NAME} -Dskywalking.collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES}"
## 暴露后端项目的 48080 端口 ## 暴露后端项目的 48080 端口
EXPOSE 48083 EXPOSE 48083
## 启动后端项目 ## 启动后端项目
CMD java ${AGENT_JAVA_OPTS} ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar

View File

@@ -10,9 +10,11 @@ import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.flowable.bpmn.model.FieldExtension; import org.flowable.bpmn.model.FieldExtension;
import org.flowable.bpmn.model.FlowableListener; import org.flowable.bpmn.model.FlowableListener;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService; import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate; import org.flowable.engine.delegate.JavaDelegate;
import org.flowable.engine.history.HistoricActivityInstance;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -33,14 +35,28 @@ public class QmsExecutionListener implements JavaDelegate {
@Autowired @Autowired
private QmsApi qmsApi; private QmsApi qmsApi;
@Resource private RuntimeService runtimeService; @Resource private RuntimeService runtimeService;
@Resource private HistoryService historyService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void execute(DelegateExecution execution) { public void execute(DelegateExecution execution) {
log.info("[QmsExecutionListener][execution({}) 被调用!变量有:{}]", execution.getId(), execution.getCurrentFlowableListener().getFieldExtensions()); // log.info("[QmsExecutionListener][execution({}) 被调用!变量有:{}]", execution.getId(), execution.getCurrentFlowableListener().getFieldExtensions());
Map<String, Object> variables = execution.getVariables();
JSONObject jsonObject = new JSONObject(variables);
String insId = execution.getProcessInstanceId(); String insId = execution.getProcessInstanceId();
Map<String, Object> variables = execution.getVariables();
String activityId = execution.getCurrentActivityId();
List<HistoricActivityInstance> instances = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(insId)
.activityId(activityId)
.orderByHistoricActivityInstanceStartTime().desc()
.list();
String currentActivityInsId = "";
if(instances != null && !instances.isEmpty())
currentActivityInsId = instances.get(0).getId();
variables.put("currentActivityInsId", currentActivityInsId);
variables.put("processInstanceId", insId);
JSONObject jsonObject = new JSONObject(variables);
// log.error("============[QmsExecutionListener][execution({})] 参数有:{}", execution.getId(), JSONObject.toJSONString(variables));
String businessKey = execution.getProcessInstanceBusinessKey(); String businessKey = execution.getProcessInstanceBusinessKey();
FlowableListener listener = execution.getCurrentFlowableListener(); FlowableListener listener = execution.getCurrentFlowableListener();
List<FieldExtension> fieldExtensions = listener.getFieldExtensions(); //节点执行监听里配置的扩展字段 List<FieldExtension> fieldExtensions = listener.getFieldExtensions(); //节点执行监听里配置的扩展字段

View File

@@ -5,13 +5,18 @@ import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.module.qms.api.task.QmsApi; import com.zt.plat.module.qms.api.task.QmsApi;
import com.zt.plat.module.qms.api.task.dto.QmsBpmDTO; import com.zt.plat.module.qms.api.task.dto.QmsBpmDTO;
import com.zt.plat.module.qms.enums.ErrorCodeConstants; import com.zt.plat.module.qms.enums.ErrorCodeConstants;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.TaskListener; import org.flowable.engine.delegate.TaskListener;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.task.service.delegate.DelegateTask; import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map; import java.util.Map;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception0; import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception0;
@@ -23,21 +28,53 @@ import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.e
@Component @Component
@Slf4j @Slf4j
public class QmsTaskListener implements TaskListener { public class QmsTaskListener implements TaskListener {
@Autowired @Autowired private QmsApi qmsApi;
private QmsApi qmsApi; @Resource private RuntimeService runtimeService;
@Resource private HistoryService historyService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void notify(DelegateTask delegateTask) { public void notify(DelegateTask delegateTask) {
log.info("[QmsTaskListener][delegateTask({})]", delegateTask); // log.info("[QmsTaskListener][delegateTask({})]", delegateTask);
String state = delegateTask.getState(); String state = delegateTask.getState();
Map<String, Object> variables = delegateTask.getVariables(); Map<String, Object> variables = delegateTask.getVariables();
String processInsId = delegateTask.getProcessInstanceId();
String activityId = delegateTask.getTaskDefinitionKey();
String currentActivityInsId = "";
List<HistoricActivityInstance> instances = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInsId)
.activityId(activityId)
.orderByHistoricActivityInstanceStartTime().desc()
.list();
if(instances != null && !instances.isEmpty())
currentActivityInsId = instances.get(0).getId();
variables.put("currentActivityInsId", currentActivityInsId);
variables.put("processInstanceId", processInsId);
String rejectToFirstActivity = checkFirstActivityReject(activityId, instances);
//todo 判断退回
Map<String, Object> execVariables = runtimeService.getVariables(delegateTask.getExecutionId());
variables.put("rejectToFirstActivity", rejectToFirstActivity);
// log.error("================[QmsTaskListener][delegateTask({})] 参数有:{}", delegateTask.getId(), JSONObject.toJSONString(variables));
JSONObject jsonObject = new JSONObject(variables); JSONObject jsonObject = new JSONObject(variables);
String insId = delegateTask.getProcessInstanceId(); QmsBpmDTO qmsBpmDTO = new QmsBpmDTO(processInsId, "", jsonObject, state);
QmsBpmDTO qmsBpmDTO = new QmsBpmDTO(insId, "", jsonObject, state);
CommonResult<JSONObject> result = qmsApi.bpmCallback(qmsBpmDTO); CommonResult<JSONObject> result = qmsApi.bpmCallback(qmsBpmDTO);
if (!result.isSuccess()) { if (!result.isSuccess()) {
log.error("[QmsExecutionListener][execution({}) 回调失败!错误码:{},错误信息:{}]", delegateTask.getId(), result.getCode(), result.getMsg()); log.error("[QmsExecutionListener][execution({}) 回调失败!错误码:{},错误信息:{}]", delegateTask.getId(), result.getCode(), result.getMsg());
throw exception0(ErrorCodeConstants.ERROR_CODE_MODULE_QMS_BPM, result.getMsg()); throw exception0(ErrorCodeConstants.ERROR_CODE_MODULE_QMS_BPM, result.getMsg());
} }
} }
/*
* 判断是否退回发起节点
* */
private String checkFirstActivityReject(String activityId, List<HistoricActivityInstance> instances){
if(!activityId.contains("001"))
return "0";
if(instances == null || instances.isEmpty())
return "0";
return "1";
}
} }

View File

@@ -5,6 +5,10 @@
<springProperty scope="context" name="zt.info.base-package" source="zt.info.base-package"/> <springProperty scope="context" name="zt.info.base-package" source="zt.info.base-package"/>
<!-- 格式化输出:%d 表示日期,%X{tid} SkWalking 链路追踪编号,%thread 表示线程名,%-5level级别从左显示 5 个字符宽度,%msg日志消息%n是换行符 --> <!-- 格式化输出:%d 表示日期,%X{tid} SkWalking 链路追踪编号,%thread 表示线程名,%-5level级别从左显示 5 个字符宽度,%msg日志消息%n是换行符 -->
<property name="PATTERN_DEFAULT" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} | %highlight(${LOG_LEVEL_PATTERN:-%5p} ${PID:- }) | %boldYellow(%thread [%tid]) %boldGreen(%-40.40logger{39}) | %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/> <property name="PATTERN_DEFAULT" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} | %highlight(${LOG_LEVEL_PATTERN:-%5p} ${PID:- }) | %boldYellow(%thread [%tid]) %boldGreen(%-40.40logger{39}) | %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!--应用名称-->
<springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
<!-- 日志输出路径 -->
<property name="LOG_DIR" value="${user.home}/logs/${spring.application.name}"/>
<!-- 控制台 Appender --> <!-- 控制台 Appender -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">     
@@ -56,18 +60,43 @@
</encoder> </encoder>
</appender> </appender>
<!-- ERROR 级别日志 -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}-error.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留30天的日志 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--logback的日志级别 FATAL > ERROR > WARN > INFO > DEBUG-->
<!-- 本地环境 --> <!-- 本地环境 -->
<springProfile name="local"> <springProfile name="local,dev">
<root level="INFO"> <root level="WARN">
<appender-ref ref="STDOUT"/> <appender-ref ref="STDOUT"/>
<appender-ref ref="ERROR"/>
<appender-ref ref="GRPC"/> <!-- 本地环境下,如果不想接入 SkyWalking 日志服务,可以注释掉本行 --> <appender-ref ref="GRPC"/> <!-- 本地环境下,如果不想接入 SkyWalking 日志服务,可以注释掉本行 -->
<appender-ref ref="ASYNC"/> <!-- 本地环境下,如果不想打印日志,可以注释掉本行 --> <appender-ref ref="ASYNC"/> <!-- 本地环境下,如果不想打印日志,可以注释掉本行 -->
</root> </root>
<!--针对不同的业务路径,配置dao层的sql打印日志级别为DEBUG-->
<logger name="com.zt.plat.module.bpm.dal.mysql" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
</springProfile> </springProfile>
<!-- 其它环境 --> <!-- 其它环境 -->
<springProfile name="dev,test,stage,prod,default"> <springProfile name="dev,test,stage,prod,default">
<root level="INFO"> <root level="INFO">
<appender-ref ref="STDOUT"/> <appender-ref ref="STDOUT"/>
<appender-ref ref="ERROR"/>
<appender-ref ref="ASYNC"/> <appender-ref ref="ASYNC"/>
<appender-ref ref="GRPC"/> <appender-ref ref="GRPC"/>
</root> </root>