From 9a2c8d87956e730393c478051581d85dac0f5ad4 Mon Sep 17 00:00:00 2001 From: zhuxinru Date: Fri, 23 Jan 2026 10:21:50 +0800 Subject: [PATCH 01/12] =?UTF-8?q?fix:=E7=94=9F=E6=88=90=E6=8A=A5=E5=91=8A?= =?UTF-8?q?=E5=91=BD=E5=90=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sdm/project/service/impl/SimulationRunServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index 14b081e9..bb81e008 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -1449,7 +1449,7 @@ public class SimulationRunServiceImpl extends ServiceImpl Date: Fri, 23 Jan 2026 10:35:26 +0800 Subject: [PATCH 02/12] =?UTF-8?q?fix:=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E9=9C=80=E8=A6=81=E5=88=86=E7=A7=9F=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project/controller/SimulationNodeController.java | 4 +++- .../com/sdm/project/dao/SimulationNodeMapper.java | 2 +- .../req/GetAllUserTaskCompleteStatisticsReq.java | 2 ++ .../req/GetUserGroupTaskCompleteStatisticsReq.java | 3 +++ .../java/com/sdm/project/service/INodeService.java | 2 +- .../com/sdm/project/service/impl/NodeServiceImpl.java | 6 ++---- .../main/resources/mapper/SimulationNodeMapper.xml | 11 +++++++++-- 7 files changed, 21 insertions(+), 9 deletions(-) diff --git a/project/src/main/java/com/sdm/project/controller/SimulationNodeController.java b/project/src/main/java/com/sdm/project/controller/SimulationNodeController.java index c25d7eba..3a1c6398 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationNodeController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationNodeController.java @@ -178,6 +178,7 @@ public class SimulationNodeController implements ISimulationNodeFeignClient { @PostMapping("/getAllUserTaskCompleteStatistics") @Operation(summary = "所有项目的人员任务完成情况统计", description = "所有项目的人员任务完成情况统计") public SdmResponse getAllUserTaskCompleteStatistics(@RequestBody @Validated GetAllUserTaskCompleteStatisticsReq req) { + req.setTenantId(ThreadLocalContext.getTenantId()); return nodeService.getAllUserTaskCompleteStatistics(req); } @@ -188,7 +189,7 @@ public class SimulationNodeController implements ISimulationNodeFeignClient { @GetMapping("/getUserGroupProjectStatistics") @Operation(summary = "用户组项目统计", description = "用户组项目统计") public SdmResponse getUserGroupProjectStatistics(@Parameter(description = "用户组ID")@RequestParam( value = "userGroupId" )@NotNull(message = "用户组ID(userGroupId)为必传参数,请补充后重试") Long userGroupId, @Parameter(description = "用户ID")@RequestParam( value = "userId", required = false) Long userId) { - return nodeService.getUserGroupProjectStatistics(userGroupId,userId); + return nodeService.getUserGroupProjectStatistics(userGroupId,userId,ThreadLocalContext.getTenantId()); } /** @@ -201,6 +202,7 @@ public class SimulationNodeController implements ISimulationNodeFeignClient { @PostMapping("/getUserGroupTaskCompleteStatistics") @Operation(summary = "用户组任务完成情况统计", description = "用户组任务完成情况统计") public SdmResponse getUserGroupTaskCompleteStatistics(@RequestBody @Validated GetUserGroupTaskCompleteStatisticsReq req) { + req.setTenantId(ThreadLocalContext.getTenantId()); return nodeService.getUserGroupTaskCompleteStatistics(req); } diff --git a/project/src/main/java/com/sdm/project/dao/SimulationNodeMapper.java b/project/src/main/java/com/sdm/project/dao/SimulationNodeMapper.java index 7553893f..b3bea795 100644 --- a/project/src/main/java/com/sdm/project/dao/SimulationNodeMapper.java +++ b/project/src/main/java/com/sdm/project/dao/SimulationNodeMapper.java @@ -74,7 +74,7 @@ public interface SimulationNodeMapper extends BaseMapper { List getNodeListByIds(@Param("nodeIdList") List nodeIdList); - List getUserGroupProjectStatistics(@Param("userIds")Set userIds ); + List getUserGroupProjectStatistics(@Param("userIds")Set userIds, @Param("tenantId")Long tenantId); List getUserGroupTaskCompleteStatistics(@Param("req") GetUserGroupTaskCompleteStatisticsReq req); diff --git a/project/src/main/java/com/sdm/project/model/req/GetAllUserTaskCompleteStatisticsReq.java b/project/src/main/java/com/sdm/project/model/req/GetAllUserTaskCompleteStatisticsReq.java index 8e1a58b6..cd6c31fe 100644 --- a/project/src/main/java/com/sdm/project/model/req/GetAllUserTaskCompleteStatisticsReq.java +++ b/project/src/main/java/com/sdm/project/model/req/GetAllUserTaskCompleteStatisticsReq.java @@ -11,6 +11,8 @@ import java.util.List; @Data @Schema(description = "所有项目的人员任务完成情况统计") public class GetAllUserTaskCompleteStatisticsReq { + @Schema(description = "租户ID") + private Long tenantId; @Schema(description = "用户列表") private List userIds; diff --git a/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java b/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java index d51d5abf..05358692 100644 --- a/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java +++ b/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java @@ -20,6 +20,9 @@ public class GetUserGroupTaskCompleteStatisticsReq { @Schema(description = "用户ID") private Long userId; + @Schema(description = "租户ID") + private Long tenantId; + @Schema(description = "用户") private Set userIds; diff --git a/project/src/main/java/com/sdm/project/service/INodeService.java b/project/src/main/java/com/sdm/project/service/INodeService.java index afbfa23a..b434f79f 100644 --- a/project/src/main/java/com/sdm/project/service/INodeService.java +++ b/project/src/main/java/com/sdm/project/service/INodeService.java @@ -41,7 +41,7 @@ public interface INodeService extends IService { SdmResponse> getTaskRunList(List uuids); - SdmResponse getUserGroupProjectStatistics(Long userGroupId, Long userId); + SdmResponse getUserGroupProjectStatistics(Long userGroupId, Long userId,Long tenantId); SdmResponse getUserGroupTaskCompleteStatistics(GetUserGroupTaskCompleteStatisticsReq req); diff --git a/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java index 9ce70e43..623db442 100644 --- a/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java @@ -8,7 +8,6 @@ import com.sdm.common.common.ResultCode; import com.sdm.common.common.SdmResponse; import com.sdm.common.common.ThreadLocalContext; import com.sdm.common.entity.ExportExcelFormat; -import com.sdm.common.entity.bo.DataDictionary; import com.sdm.common.entity.constants.TagConstant; import com.sdm.common.entity.enums.DirTypeEnum; import com.sdm.common.entity.enums.FilePermissionEnum; @@ -22,7 +21,6 @@ import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp; import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.project.SimulationNodeResp; import com.sdm.common.entity.resp.project.SimulationRunResp; -import com.sdm.common.entity.resp.system.CIDStaffResp; import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.SysUserGroupDetailResp; import com.sdm.common.feign.impl.data.DataClientFeignClientImpl; @@ -1240,7 +1238,7 @@ public class NodeServiceImpl extends ServiceImpl userId2Nickname = getUserIdToNicknameMap(userGroupId); if (MapUtils.isEmpty(userId2Nickname)) { return SdmResponse.success(); @@ -1253,7 +1251,7 @@ public class NodeServiceImpl extends ServiceImpl userGroupProjectStatistics = this.baseMapper.getUserGroupProjectStatistics(userIds); + List userGroupProjectStatistics = this.baseMapper.getUserGroupProjectStatistics(userIds,tenantId ); if (CollectionUtils.isEmpty(userGroupProjectStatistics)) { return SdmResponse.success(new ArrayList<>()); } diff --git a/project/src/main/resources/mapper/SimulationNodeMapper.xml b/project/src/main/resources/mapper/SimulationNodeMapper.xml index d435da70..acb4975f 100644 --- a/project/src/main/resources/mapper/SimulationNodeMapper.xml +++ b/project/src/main/resources/mapper/SimulationNodeMapper.xml @@ -339,7 +339,11 @@ nodeId, user_id as userId from simulation_node_member - where user_id in ( + left join simulation_node on simulation_node_member.nodeId = simulation_node.uuid + where + simulation_node.tenantId = #{tenantId} + and + user_id in ( #{userId} @@ -354,6 +358,8 @@ from simulation_task task left join simulation_task_member task_member on task.uuid = task_member.task_id + task.tenant_Id = #{req.tenantId} + and task_member.user_id in ( @@ -406,7 +412,8 @@ from simulation_task task left join simulation_task_member task_member on task.uuid = task_member.task_id - task_member.user_id in + task.tenant_Id = #{req.tenantId} + and task_member.user_id in ( #{userId} From fce1431c517dc91a2b82a777d23e6b72b932892a Mon Sep 17 00:00:00 2001 From: zhuxinru Date: Fri, 23 Jan 2026 11:45:24 +0800 Subject: [PATCH 03/12] =?UTF-8?q?fix:=E4=BF=9D=E5=AD=98=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SimulationRunController.java | 4 ++-- .../sdm/project/service/ISimulationRunService.java | 2 +- .../service/impl/SimulationRunServiceImpl.java | 14 ++++++++------ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java index b3ad8f29..800b2bd8 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java @@ -240,8 +240,8 @@ public class SimulationRunController implements ISimulationRunFeignClient { */ @PostMapping("/editReport") @Operation(summary = "编辑报告模板生成报告", description = "编辑报告模板生成报告") - public void editReport(@RequestBody EditReportReq req) { - runService.editReport(req); + public SdmResponse editReport(@RequestBody EditReportReq req) { + return runService.editReport(req); } /** diff --git a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java index 3aeaf650..7b09631d 100644 --- a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java +++ b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java @@ -71,7 +71,7 @@ public interface ISimulationRunService extends IService { void generateNewReport(SpdmReportReq req, HttpServletResponse response); - void editReport(EditReportReq req); + SdmResponse editReport(EditReportReq req); void editReportAndDownload(EditReportReq req, HttpServletResponse response); diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index bb81e008..829d5deb 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -1561,7 +1561,7 @@ public class SimulationRunServiceImpl extends ServiceImpl Date: Fri, 23 Jan 2026 15:55:22 +0800 Subject: [PATCH 04/12] =?UTF-8?q?fix:=E6=B5=81=E7=A8=8B=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=8C=E6=9B=B4=E6=96=B0=E7=AE=97=E5=88=97?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/MarsCodeWorkspaceAppSettings.xml | 6 ++ .../project/SimulationRunFeignClientImpl.java | 11 ++++ .../project/ISimulationRunFeignClient.java | 10 ++++ .../flowable/listener/ProcessEndListener.java | 56 +++++++++++++++++++ .../sdm/flowable/util/Dto2BpmnConverter.java | 8 +++ .../controller/SimulationRunController.java | 13 +++++ .../service/ISimulationRunService.java | 9 +++ .../impl/SimulationRunServiceImpl.java | 40 +++++++++++++ 8 files changed, 153 insertions(+) create mode 100644 .idea/MarsCodeWorkspaceAppSettings.xml create mode 100644 flowable/src/main/java/com/sdm/flowable/listener/ProcessEndListener.java diff --git a/.idea/MarsCodeWorkspaceAppSettings.xml b/.idea/MarsCodeWorkspaceAppSettings.xml new file mode 100644 index 00000000..e2a065b7 --- /dev/null +++ b/.idea/MarsCodeWorkspaceAppSettings.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java b/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java index 06e5f619..f1ef16ac 100644 --- a/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java +++ b/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java @@ -51,4 +51,15 @@ public class SimulationRunFeignClientImpl implements ISimulationRunFeignClient { return SdmResponse.failed("内部调用生成自动化报告失败"); } } + + @Override + public SdmResponse completeRunByFlowInstanceId(String flowInstanceId) { + try { + simulationRunFeignClient.completeRunByFlowInstanceId(flowInstanceId); + return SdmResponse.success(); + }catch (Exception e){ + log.error("根据流程实例ID完成算列失败", e); + return SdmResponse.failed("根据流程实例ID完成算列失败"); + } + } } diff --git a/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java b/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java index f7d9303f..ff6fc588 100644 --- a/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java +++ b/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java @@ -26,4 +26,14 @@ public interface ISimulationRunFeignClient { @PostMapping("/run/generateReportInternal") SdmResponse generateReportInternal(@RequestBody SpdmReportReq req); + /** + * 根据流程实例ID完成算列(将状态更新为完成) + * 由Flowable流程结束监听器调用 + * + * @param flowInstanceId 流程实例ID + * @return SdmResponse + */ + @PostMapping("/run/completeRunByFlowInstanceId") + SdmResponse completeRunByFlowInstanceId(@RequestParam("flowInstanceId") String flowInstanceId); + } \ No newline at end of file diff --git a/flowable/src/main/java/com/sdm/flowable/listener/ProcessEndListener.java b/flowable/src/main/java/com/sdm/flowable/listener/ProcessEndListener.java new file mode 100644 index 00000000..585c3357 --- /dev/null +++ b/flowable/src/main/java/com/sdm/flowable/listener/ProcessEndListener.java @@ -0,0 +1,56 @@ +package com.sdm.flowable.listener; + +import com.sdm.common.common.SdmResponse; +import com.sdm.common.feign.inter.project.ISimulationRunFeignClient; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 流程结束监听器 + * 当流程执行到结束事件(EndEvent)时触发,自动更新算列表(SimulationRun)的状态为完成 + */ +@Slf4j +@Component("processEndListener") +public class ProcessEndListener implements ExecutionListener { + + @Autowired + private ISimulationRunFeignClient simulationRunFeignClient; + + @Override + public void notify(DelegateExecution execution) { + try { + // 获取流程变量 + String runId = (String) execution.getVariable("runId"); + String processInstanceId = execution.getProcessInstanceId(); + String processDefinitionId = execution.getProcessDefinitionId(); + + log.info("流程结束监听器触发 - 流程实例ID: {}, 流程定义ID: {}, runId: {}", + processInstanceId, processDefinitionId, runId); + + // 校验必要参数 + if (StringUtils.isBlank(runId)) { + log.warn("流程结束监听器: runId为空,无法更新算列表状态。流程实例ID: {}", processInstanceId); + return; + } + + // 调用project服务更新算列表状态为完成 + SdmResponse response = simulationRunFeignClient.completeRunByFlowInstanceId(processInstanceId); + + if (response.isSuccess()) { + log.info("流程结束监听器: 算列表状态更新成功 - runId: {}, 流程实例ID: {}", runId, processInstanceId); + } else { + log.error("流程结束监听器: 算列表状态更新失败 - runId: {}, 流程实例ID: {}, 错误信息: {}", + runId, processInstanceId, response.getMessage()); + } + + } catch (Exception e) { + // 异常不应该影响流程的正常结束,只记录日志 + log.error("流程结束监听器执行异常 - 流程实例ID: {}, 异常信息: {}", + execution.getProcessInstanceId(), e.getMessage(), e); + } + } +} diff --git a/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java b/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java index 4e5860f9..46da82ea 100644 --- a/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java +++ b/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java @@ -511,6 +511,14 @@ public class Dto2BpmnConverter { EndEvent endEvent = new EndEvent(); endEvent.setId(nodeDto.getId()); endEvent.setName(nodeDto.getName()); + + // 添加流程结束监听器,在进入结束节点时触发 + FlowableListener processEndListener = new FlowableListener(); + processEndListener.setEvent("start"); // 进入结束节点时触发 + processEndListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); + processEndListener.setImplementation("${processEndListener}"); + endEvent.getExecutionListeners().add(processEndListener); + process.addFlowElement(endEvent); log.info("创建结束事件节点 nodeId:{}", nodeDto.getId()); break; diff --git a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java index 800b2bd8..b28f1efe 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java @@ -395,4 +395,17 @@ public class SimulationRunController implements ISimulationRunFeignClient { return runService.syncKeyResultToTask(req); } + /** + * 根据流程实例ID完成算列(将状态更新为完成) + * 由Flowable流程结束监听器调用 + * + * @param flowInstanceId 流程实例ID + * @return SdmResponse + */ + @SysLog("根据流程实例ID完成算列") + @PostMapping("/completeRunByFlowInstanceId") + @Override + public SdmResponse completeRunByFlowInstanceId(@RequestParam("flowInstanceId") String flowInstanceId) { + return runService.completeRunByFlowInstanceId(flowInstanceId); + } } \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java index 7b09631d..efa79322 100644 --- a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java +++ b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java @@ -110,4 +110,13 @@ public interface ISimulationRunService extends IService { SdmResponse syncKeyResultToTask(KeyResultReq req); + /** + * 根据流程实例ID完成算列(将状态更新为完成) + * 由Flowable流程结束监听器调用 + * + * @param flowInstanceId 流程实例ID + * @return SdmResponse + */ + SdmResponse completeRunByFlowInstanceId(String flowInstanceId); + } \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index 829d5deb..53029f9f 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -2309,4 +2309,44 @@ public class SimulationRunServiceImpl extends ServiceImpl Date: Fri, 23 Jan 2026 16:09:12 +0800 Subject: [PATCH 05/12] =?UTF-8?q?fix:=E6=9B=B4=E6=96=B0=E6=8C=87=E6=A0=87?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/enums/PerformanceStatusEnum.java | 6 +-- .../impl/SimulationRunServiceImpl.java | 10 +---- .../project/service/impl/TaskServiceImpl.java | 6 +-- .../task/model/dto/TaskPerformanceDto.java | 4 ++ .../model/entity/SimulationPerformance.java | 2 +- .../SimulationPerformanceServiceImpl.java | 43 +++++++++++++++++++ 6 files changed, 56 insertions(+), 15 deletions(-) rename project/src/main/java/com/sdm/project/common/RunPerformanceStatusEnum.java => common/src/main/java/com/sdm/common/entity/enums/PerformanceStatusEnum.java (74%) diff --git a/project/src/main/java/com/sdm/project/common/RunPerformanceStatusEnum.java b/common/src/main/java/com/sdm/common/entity/enums/PerformanceStatusEnum.java similarity index 74% rename from project/src/main/java/com/sdm/project/common/RunPerformanceStatusEnum.java rename to common/src/main/java/com/sdm/common/entity/enums/PerformanceStatusEnum.java index 08ddace9..f001619b 100644 --- a/project/src/main/java/com/sdm/project/common/RunPerformanceStatusEnum.java +++ b/common/src/main/java/com/sdm/common/entity/enums/PerformanceStatusEnum.java @@ -1,4 +1,4 @@ -package com.sdm.project.common; +package com.sdm.common.entity.enums; import lombok.Getter; @@ -6,7 +6,7 @@ import lombok.Getter; * 指标完成情况状态枚举 */ @Getter -public enum RunPerformanceStatusEnum { +public enum PerformanceStatusEnum { UNCOMPLETED("未完成", "0"), NOT_STARTED("不合格", "1"), @@ -18,7 +18,7 @@ public enum RunPerformanceStatusEnum { private final String code; - RunPerformanceStatusEnum(String name, String code) { + PerformanceStatusEnum(String name, String code) { this.name = name; this.code = code; } diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index 829d5deb..879b1496 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -12,12 +12,8 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.sdm.common.common.SdmResponse; import com.sdm.common.common.ThreadLocalContext; -import com.sdm.common.config.FlowableConfig; import com.sdm.common.entity.constants.NumberConstants; -import com.sdm.common.entity.enums.ApproveTypeEnum; -import com.sdm.common.entity.enums.DirTypeEnum; -import com.sdm.common.entity.enums.FileBizTypeEnum; -import com.sdm.common.entity.enums.NodeTypeEnum; +import com.sdm.common.entity.enums.*; import com.sdm.common.entity.flowable.dto.FlowElementDTO; import com.sdm.common.entity.flowable.dto.ProcessDefinitionDTO; import com.sdm.common.entity.req.capability.FlowNodeDto; @@ -60,7 +56,6 @@ import com.sdm.project.model.resp.KeyResultAndTaskInfoResp; import com.sdm.project.model.resp.RunVersionInfoResp; import com.sdm.project.model.vo.SpdmNodeVo; import com.sdm.common.entity.resp.project.SpdmTaskVo; -import com.sdm.project.model.vo.SpdmTaskMemberVo; import com.sdm.project.service.*; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; @@ -84,7 +79,6 @@ import java.nio.file.StandardCopyOption; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.function.UnaryOperator; import java.util.stream.Collectors; import static com.sdm.common.service.BaseService.generateUuid; @@ -629,7 +623,7 @@ public class SimulationRunServiceImpl extends ServiceImpl comparison >= 0; + case ">" -> comparison > 0; + case "<" -> comparison < 0; + case "≤" -> comparison <= 0; + default -> throw new IllegalArgumentException("无效运算符: " + method); + }; + simulationPerformance.setCompleteStatus(isPassed ? PerformanceStatusEnum.STARTED.getCode() : PerformanceStatusEnum.NOT_STARTED.getCode()); + } catch (Exception e) { + log.error("数字格式异常:", e); + return SdmResponse.failed("请输入有效的目标值和分析值"); + } + } return SdmResponse.success(this.updateById(simulationPerformance)); } + private boolean validateNumber(String input) { + String trimmed = input.trim(); + // 前置格式检查 - 验证是不是有效数字格式 + if (!CommonUtils.isValidNumberFormat(trimmed)) { + return false; + } + return true; + } + @Override public SdmResponse exportPerformance(PerformanceExportExcelFormat performanceExportExcelFormat, HttpServletResponse httpServletResponse) { SdmResponse response = new SdmResponse(); From ee5a8367bce802ce5d48906a9cdb1cfc8d05154e Mon Sep 17 00:00:00 2001 From: zhuxinru Date: Fri, 23 Jan 2026 16:09:18 +0800 Subject: [PATCH 06/12] =?UTF-8?q?fix:=E6=9B=B4=E6=96=B0=E6=8C=87=E6=A0=87?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sdm/common/utils/CommonUtils.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 common/src/main/java/com/sdm/common/utils/CommonUtils.java diff --git a/common/src/main/java/com/sdm/common/utils/CommonUtils.java b/common/src/main/java/com/sdm/common/utils/CommonUtils.java new file mode 100644 index 00000000..d1f1f18a --- /dev/null +++ b/common/src/main/java/com/sdm/common/utils/CommonUtils.java @@ -0,0 +1,36 @@ +package com.sdm.common.utils; + +public class CommonUtils { + + /** + * 检查字符串是否为有效的数字格式 + */ + public static boolean isValidNumberFormat(String str) { + if (str == null || str.isEmpty()) { + return false; + } + + // 支持: + // 1. 整数:123, -123, +123 + // 2. 小数:123.45, .45, 123. + // 3. 科学计数法:1.23e10, 1.23E-10 + // 4. 排除:空字符串、纯空格、多个小数点、非法字符 + + // 去除首尾空格 + str = str.trim(); + + // 检查是否为空 + if (str.isEmpty()) { + return false; + } + + // 检查是否只包含数字、小数点、正负号、e/E + if (!str.matches("^[+-]?[\\d.eE]+$")) { + return false; + } + + // 更精确的正则表达式 + return str.matches("^[+-]?(\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?$"); + } + +} From 89160079dc880f97be6c09305ca4078a29e90402 Mon Sep 17 00:00:00 2001 From: gulongcheng <474084054@qq.com> Date: Fri, 23 Jan 2026 16:36:21 +0800 Subject: [PATCH 07/12] =?UTF-8?q?Revert=20"fix:=E6=B5=81=E7=A8=8B=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=AE=8C=E6=88=90=EF=BC=8C=E6=9B=B4=E6=96=B0=E7=AE=97?= =?UTF-8?q?=E5=88=97=E7=8A=B6=E6=80=81"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7e76f27c423c0b5056cfdf7825ea398c1b3d0e04. --- .idea/MarsCodeWorkspaceAppSettings.xml | 6 -- .../project/SimulationRunFeignClientImpl.java | 11 ---- .../project/ISimulationRunFeignClient.java | 10 ---- .../flowable/listener/ProcessEndListener.java | 56 ------------------- .../sdm/flowable/util/Dto2BpmnConverter.java | 8 --- .../controller/SimulationRunController.java | 13 ----- .../service/ISimulationRunService.java | 9 --- .../impl/SimulationRunServiceImpl.java | 40 ------------- 8 files changed, 153 deletions(-) delete mode 100644 .idea/MarsCodeWorkspaceAppSettings.xml delete mode 100644 flowable/src/main/java/com/sdm/flowable/listener/ProcessEndListener.java diff --git a/.idea/MarsCodeWorkspaceAppSettings.xml b/.idea/MarsCodeWorkspaceAppSettings.xml deleted file mode 100644 index e2a065b7..00000000 --- a/.idea/MarsCodeWorkspaceAppSettings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java b/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java index f1ef16ac..06e5f619 100644 --- a/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java +++ b/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java @@ -51,15 +51,4 @@ public class SimulationRunFeignClientImpl implements ISimulationRunFeignClient { return SdmResponse.failed("内部调用生成自动化报告失败"); } } - - @Override - public SdmResponse completeRunByFlowInstanceId(String flowInstanceId) { - try { - simulationRunFeignClient.completeRunByFlowInstanceId(flowInstanceId); - return SdmResponse.success(); - }catch (Exception e){ - log.error("根据流程实例ID完成算列失败", e); - return SdmResponse.failed("根据流程实例ID完成算列失败"); - } - } } diff --git a/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java b/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java index ff6fc588..f7d9303f 100644 --- a/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java +++ b/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java @@ -26,14 +26,4 @@ public interface ISimulationRunFeignClient { @PostMapping("/run/generateReportInternal") SdmResponse generateReportInternal(@RequestBody SpdmReportReq req); - /** - * 根据流程实例ID完成算列(将状态更新为完成) - * 由Flowable流程结束监听器调用 - * - * @param flowInstanceId 流程实例ID - * @return SdmResponse - */ - @PostMapping("/run/completeRunByFlowInstanceId") - SdmResponse completeRunByFlowInstanceId(@RequestParam("flowInstanceId") String flowInstanceId); - } \ No newline at end of file diff --git a/flowable/src/main/java/com/sdm/flowable/listener/ProcessEndListener.java b/flowable/src/main/java/com/sdm/flowable/listener/ProcessEndListener.java deleted file mode 100644 index 585c3357..00000000 --- a/flowable/src/main/java/com/sdm/flowable/listener/ProcessEndListener.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.sdm.flowable.listener; - -import com.sdm.common.common.SdmResponse; -import com.sdm.common.feign.inter.project.ISimulationRunFeignClient; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.flowable.engine.delegate.DelegateExecution; -import org.flowable.engine.delegate.ExecutionListener; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * 流程结束监听器 - * 当流程执行到结束事件(EndEvent)时触发,自动更新算列表(SimulationRun)的状态为完成 - */ -@Slf4j -@Component("processEndListener") -public class ProcessEndListener implements ExecutionListener { - - @Autowired - private ISimulationRunFeignClient simulationRunFeignClient; - - @Override - public void notify(DelegateExecution execution) { - try { - // 获取流程变量 - String runId = (String) execution.getVariable("runId"); - String processInstanceId = execution.getProcessInstanceId(); - String processDefinitionId = execution.getProcessDefinitionId(); - - log.info("流程结束监听器触发 - 流程实例ID: {}, 流程定义ID: {}, runId: {}", - processInstanceId, processDefinitionId, runId); - - // 校验必要参数 - if (StringUtils.isBlank(runId)) { - log.warn("流程结束监听器: runId为空,无法更新算列表状态。流程实例ID: {}", processInstanceId); - return; - } - - // 调用project服务更新算列表状态为完成 - SdmResponse response = simulationRunFeignClient.completeRunByFlowInstanceId(processInstanceId); - - if (response.isSuccess()) { - log.info("流程结束监听器: 算列表状态更新成功 - runId: {}, 流程实例ID: {}", runId, processInstanceId); - } else { - log.error("流程结束监听器: 算列表状态更新失败 - runId: {}, 流程实例ID: {}, 错误信息: {}", - runId, processInstanceId, response.getMessage()); - } - - } catch (Exception e) { - // 异常不应该影响流程的正常结束,只记录日志 - log.error("流程结束监听器执行异常 - 流程实例ID: {}, 异常信息: {}", - execution.getProcessInstanceId(), e.getMessage(), e); - } - } -} diff --git a/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java b/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java index 46da82ea..4e5860f9 100644 --- a/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java +++ b/flowable/src/main/java/com/sdm/flowable/util/Dto2BpmnConverter.java @@ -511,14 +511,6 @@ public class Dto2BpmnConverter { EndEvent endEvent = new EndEvent(); endEvent.setId(nodeDto.getId()); endEvent.setName(nodeDto.getName()); - - // 添加流程结束监听器,在进入结束节点时触发 - FlowableListener processEndListener = new FlowableListener(); - processEndListener.setEvent("start"); // 进入结束节点时触发 - processEndListener.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION); - processEndListener.setImplementation("${processEndListener}"); - endEvent.getExecutionListeners().add(processEndListener); - process.addFlowElement(endEvent); log.info("创建结束事件节点 nodeId:{}", nodeDto.getId()); break; diff --git a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java index b28f1efe..800b2bd8 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java @@ -395,17 +395,4 @@ public class SimulationRunController implements ISimulationRunFeignClient { return runService.syncKeyResultToTask(req); } - /** - * 根据流程实例ID完成算列(将状态更新为完成) - * 由Flowable流程结束监听器调用 - * - * @param flowInstanceId 流程实例ID - * @return SdmResponse - */ - @SysLog("根据流程实例ID完成算列") - @PostMapping("/completeRunByFlowInstanceId") - @Override - public SdmResponse completeRunByFlowInstanceId(@RequestParam("flowInstanceId") String flowInstanceId) { - return runService.completeRunByFlowInstanceId(flowInstanceId); - } } \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java index efa79322..7b09631d 100644 --- a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java +++ b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java @@ -110,13 +110,4 @@ public interface ISimulationRunService extends IService { SdmResponse syncKeyResultToTask(KeyResultReq req); - /** - * 根据流程实例ID完成算列(将状态更新为完成) - * 由Flowable流程结束监听器调用 - * - * @param flowInstanceId 流程实例ID - * @return SdmResponse - */ - SdmResponse completeRunByFlowInstanceId(String flowInstanceId); - } \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index 53029f9f..829d5deb 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -2309,44 +2309,4 @@ public class SimulationRunServiceImpl extends ServiceImpl Date: Fri, 23 Jan 2026 17:00:35 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E9=A2=84=E7=83=AD=EF=BC=9B=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E8=A7=A3=E5=AF=86=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/DataSourcePreWarmer.java | 47 ++++++++++++++++++ .../flowable/delegate/handler/HpcHandler.java | 2 +- .../sdm/outbridge/config/CommonConfig.java | 49 ++++++++++++++++++- 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/com/sdm/common/config/DataSourcePreWarmer.java diff --git a/common/src/main/java/com/sdm/common/config/DataSourcePreWarmer.java b/common/src/main/java/com/sdm/common/config/DataSourcePreWarmer.java new file mode 100644 index 00000000..a075b282 --- /dev/null +++ b/common/src/main/java/com/sdm/common/config/DataSourcePreWarmer.java @@ -0,0 +1,47 @@ +package com.sdm.common.config;//package com.sdm.project.config.mybatis; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.ApplicationRunner; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; +import java.sql.Connection; + +@Slf4j +@Configuration +public class DataSourcePreWarmer { + + @Bean + public ApplicationRunner secondDataSourcePreWarmer( + @Qualifier("secondDataSource") DataSource secondDataSource) { + return args -> { + try (Connection conn = secondDataSource.getConnection()) { + log.info("✅ secondDataSource 预热成功,连接已建立: {}", conn); + } catch (Exception e) { + log.error("❌ secondDataSource 预热失败", e); + throw new RuntimeException(e); + } + }; + } + + @Bean + public ApplicationRunner mainDataSourcePreWarmer( + @Qualifier("masterDataSource") DataSource master, + @Qualifier("slaveDataSource") DataSource slave) { + return args -> { + try { + try (Connection c1 = master.getConnection()) { + log.info("✅ masterDataSource 预热成功: {}", c1); + } + try (Connection c2 = slave.getConnection()) { + log.info("✅ slaveDataSource 预热成功: {}", c2); + } + } catch (Exception e) { + log.error("❌ 主从数据源预热失败", e); + throw new RuntimeException(e); + } + }; + } +} \ No newline at end of file diff --git a/flowable/src/main/java/com/sdm/flowable/delegate/handler/HpcHandler.java b/flowable/src/main/java/com/sdm/flowable/delegate/handler/HpcHandler.java index 611b9f9c..bdd9d4d7 100644 --- a/flowable/src/main/java/com/sdm/flowable/delegate/handler/HpcHandler.java +++ b/flowable/src/main/java/com/sdm/flowable/delegate/handler/HpcHandler.java @@ -105,7 +105,7 @@ public class HpcHandler implements ExecutionHandler,HPCExecu if(!submitResp.isSuccess()|| StringUtils.isBlank(submitResp.getData())){ // 推送失败消息 sendMsg(ThreadLocalContext.getTenantId(),ThreadLocalContext.getUserId(),submitHpcTaskRemoteReq.getJobName(),"失败"); - log.error("HpcHandler submit failed,jobName:{}",params); + log.error("HpcHandler submit failed:{}",JSONObject.toJSONString(params)); throw new RuntimeException("HpcHandler submit failed,"+submitResp.getMessage()); } diff --git a/outbridge/src/main/java/com/sdm/outbridge/config/CommonConfig.java b/outbridge/src/main/java/com/sdm/outbridge/config/CommonConfig.java index fe7d40cc..71968877 100644 --- a/outbridge/src/main/java/com/sdm/outbridge/config/CommonConfig.java +++ b/outbridge/src/main/java/com/sdm/outbridge/config/CommonConfig.java @@ -1,13 +1,19 @@ package com.sdm.outbridge.config; //// common模块:com.xxx.common.config.CommonConfig +import com.sdm.common.utils.AESUtil; +import org.apache.commons.lang3.StringUtils; import org.springframework.boot.env.YamlPropertySourceLoader; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.EnumerablePropertySource; +import org.springframework.core.env.MapPropertySource; import org.springframework.core.io.support.DefaultPropertySourceFactory; import org.springframework.core.io.support.EncodedResource; import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 加载common模块的自定义配置文件 @@ -25,7 +31,48 @@ public class CommonConfig { } List> sources = new YamlPropertySourceLoader() .load(resource.getResource().getFilename(), resource.getResource()); - return sources.get(0); + org.springframework.core.env.PropertySource originalSource = sources.get(0); + org.springframework.core.env.PropertySource decryptedSource = + decryptPropertySource(originalSource); + return decryptedSource; } } + + private static org.springframework.core.env.PropertySource decryptPropertySource(org.springframework.core.env.PropertySource source) { + // 只处理可枚举的属性源(yml加载后的源都是EnumerablePropertySource) + if (!(source instanceof EnumerablePropertySource)) { + return source; + } + + EnumerablePropertySource enumerableSource = (EnumerablePropertySource) source; + Map decryptedProperties = new HashMap<>(); + // 遍历所有配置项 + for (String propertyName : enumerableSource.getPropertyNames()) { + Object value = enumerableSource.getProperty(propertyName); + if (value != null && value instanceof String) { + String strValue = (String) value; + if (strValue.startsWith("ENC(") && strValue.endsWith(")")) { + // 解密并替换值 + String spdmEnkey = StringUtils.isBlank(System.getProperty("spdm.enkey"))? + System.getenv("spdm.enkey"):System.getProperty("spdm.enkey"); + String encryptedValue = strValue.substring(4, strValue.length() - 1); + try { + decryptedProperties.put(propertyName, AESUtil.decodeNew(encryptedValue, spdmEnkey)); + } catch (Exception e) { + System.out.println("利元亨现场配置解密异常:"+e.getMessage()); + throw new RuntimeException(e); + } + } else { + // 非加密值,直接保留 + decryptedProperties.put(propertyName, strValue); + } + } else { + // 非字符串类型,直接保留 + decryptedProperties.put(propertyName, value); + } + } + // 生成新的属性源(名称和原始源一致,确保覆盖) + return new MapPropertySource(source.getName(), decryptedProperties); + } + } \ No newline at end of file From c01c2bfbc55c06cb9fff4c4a252edbad7f1353b4 Mon Sep 17 00:00:00 2001 From: gulongcheng <474084054@qq.com> Date: Fri, 23 Jan 2026 17:54:22 +0800 Subject: [PATCH 09/12] =?UTF-8?q?fix:=E6=B5=81=E7=A8=8B=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=8C=E6=9B=B4=E6=96=B0=E7=AE=97=E5=88=97?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/MarsCodeWorkspaceAppSettings.xml | 6 + .qoder/rules/rule.md | 74 +++++++ .../project/SimulationRunFeignClientImpl.java | 10 + .../project/ISimulationRunFeignClient.java | 10 + .../flowable/config/FlowableEngineConfig.java | 48 +++++ .../enums/ProcessInstanceStateEnum.java | 40 ++-- .../listener/GlobalStatusEventListener.java | 187 ++++++++++++++++++ .../sdm/flowable/process/ProcessService.java | 10 +- .../controller/SimulationRunController.java | 9 + .../service/ISimulationRunService.java | 8 + .../impl/SimulationRunServiceImpl.java | 59 +++++- 11 files changed, 439 insertions(+), 22 deletions(-) create mode 100644 .idea/MarsCodeWorkspaceAppSettings.xml create mode 100644 .qoder/rules/rule.md create mode 100644 flowable/src/main/java/com/sdm/flowable/config/FlowableEngineConfig.java create mode 100644 flowable/src/main/java/com/sdm/flowable/listener/GlobalStatusEventListener.java diff --git a/.idea/MarsCodeWorkspaceAppSettings.xml b/.idea/MarsCodeWorkspaceAppSettings.xml new file mode 100644 index 00000000..e2a065b7 --- /dev/null +++ b/.idea/MarsCodeWorkspaceAppSettings.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.qoder/rules/rule.md b/.qoder/rules/rule.md new file mode 100644 index 00000000..424ff144 --- /dev/null +++ b/.qoder/rules/rule.md @@ -0,0 +1,74 @@ +--- +trigger: manual + +# Java 开发规范与重构指南 + +作为我的 AI 编程伙伴,请在生成、修改或评审代码时严格遵循以下 10 条核心原则: + +### 1. 单一职责原则 (SRP) + +* **规则**:一个方法只做一件事。 +* **实践**:如果方法逻辑过长,请通过**拆分职责明确的私有方法**(Private Methods)来解耦。 +* **目标**:提升代码的可读性和方法复用率。 + +### 2. 卫语句优先 (Guard Clauses) + +* **规则**:减少 `if-else` 嵌套深度。 +* **实践**:使用**卫语句提前返回**(Early Return)。先处理异常分支和边界条件,核心逻辑放在方法最后。 +* **示例**: +```java +if (user == null) return; +// 执行核心逻辑... + +``` + + + +### 3. 重复逻辑抽取 + +* **规则**:不要重复你自己 (DRY)。 +* **实践**:将频繁出现的**参数校验、类型转换、对象构建**等模式封装为公共工具类或私有通用方法。 + +### 4. 数据封装 (Encapsulation) + +* **规则**:避免多个相关变量散落在方法参数中。 +* **实践**:如果多个变量在逻辑上高度相关(如 `startTime`, `endTime`),应**封装为内部类或 DTO 对象**。 + +### 5. 统一异常处理 + +* **规则**:禁止散乱的 try-catch。 +* **实践**:使用**通用的响应校验方法**或全局异常拦截器。确保错误码和错误信息在整个系统中保持一致。 + +### 6. 参数对象化 + +* **规则**:控制方法入参数量。 +* **实践**:当方法参数**超过 3 个**时,必须封装为 Request 对象或 Context 对象。 + +### 7. 语义化命名 + +* **规则**:变量名应具备自解释性。 +* **实践**:**变量即文档**。使用准确的动词+名词组合,避免使用 `a`, `b`, `list1` 等无意义命名。 + +### 8. 消灭魔术值 (Magic Values) + +* **规则**:禁止在逻辑判断中直接使用硬编码的数字或字符串。 +* **实践**:全面**拥抱枚举 (Enum) 或常量 (Static Final)**。 + +### 9. 声明式编程 + +* **规则**:提升集合处理的可读性。 +* **实践**:优先使用 **Java Stream API** 或函数式编程替代复杂的 `for/while` 循环。 + +### 10. 智能注释 + +* **规则**:避免“无效注释”。 +* **实践**:不要解释代码在做什么(What),而是解释**为什么要这么做(Why)**。如果代码本身足够清晰,则无需注释。 + +--- + +**当你为我生成代码时,请先自检是否违反了上述规则。如果我提交的代码不符合这些原则,请主动提示并给出重构建议。** + +--- + +--- + diff --git a/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java b/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java index 06e5f619..79377930 100644 --- a/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java +++ b/common/src/main/java/com/sdm/common/feign/impl/project/SimulationRunFeignClientImpl.java @@ -51,4 +51,14 @@ public class SimulationRunFeignClientImpl implements ISimulationRunFeignClient { return SdmResponse.failed("内部调用生成自动化报告失败"); } } + + @Override + public SdmResponse updateStatusByProcessInstanceId(String processInstanceId, Integer statusCode) { + try { + return simulationRunFeignClient.updateStatusByProcessInstanceId(processInstanceId, statusCode); + } catch (Exception e) { + log.error("根据流程实例ID更新算例状态失败: processInstanceId={}, statusCode={}", processInstanceId, statusCode, e); + return SdmResponse.failed("更新算例状态失败"); + } + } } diff --git a/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java b/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java index f7d9303f..1803c176 100644 --- a/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java +++ b/common/src/main/java/com/sdm/common/feign/inter/project/ISimulationRunFeignClient.java @@ -26,4 +26,14 @@ public interface ISimulationRunFeignClient { @PostMapping("/run/generateReportInternal") SdmResponse generateReportInternal(@RequestBody SpdmReportReq req); + /** + * 根据流程实例ID更新算例状态 + * + * @param processInstanceId 流程实例ID + * @param statusCode 状态值(RUNNING/SUSPENDED/COMPLETED/CANCELLED/ERROR) + * @return SdmResponse + */ + @PostMapping("/run/updateStatusByProcessInstanceId") + SdmResponse updateStatusByProcessInstanceId(@RequestParam String processInstanceId, @RequestParam Integer statusCode); + } \ No newline at end of file diff --git a/flowable/src/main/java/com/sdm/flowable/config/FlowableEngineConfig.java b/flowable/src/main/java/com/sdm/flowable/config/FlowableEngineConfig.java new file mode 100644 index 00000000..e5fc9f23 --- /dev/null +++ b/flowable/src/main/java/com/sdm/flowable/config/FlowableEngineConfig.java @@ -0,0 +1,48 @@ +package com.sdm.flowable.config; + +import com.sdm.flowable.listener.GlobalStatusEventListener; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.delegate.event.FlowableEventListener; +import org.flowable.spring.SpringProcessEngineConfiguration; +import org.flowable.spring.boot.EngineConfigurationConfigurer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +/** + * Flowable流程引擎配置类 + * 用于注册全局事件监听器等配置 + * + * @author SDM + * @date 2026-01-23 + */ +@Slf4j +@Configuration +public class FlowableEngineConfig { + + /** + * 注册全局事件监听器 + * 通过EngineConfigurationConfigurer可以在流程引擎初始化时添加监听器 + */ + @Bean + public EngineConfigurationConfigurer globalEventListenerConfigurer( + GlobalStatusEventListener globalStatusEventListener) { + return engineConfiguration -> { + // 获取现有的事件监听器列表 + List eventListeners = engineConfiguration.getEventListeners(); + if (eventListeners == null) { + eventListeners = new ArrayList<>(); + } + + // 添加全局状态同步监听器 + eventListeners.add(globalStatusEventListener); + engineConfiguration.setEventListeners(eventListeners); + + log.info("✅ 已注册Flowable全局事件监听器: GlobalStatusEventListener"); + log.info(" 监听事件类型: PROCESS_COMPLETED, PROCESS_CANCELLED, ENTITY_SUSPENDED, ENTITY_ACTIVATED, JOB_MOVED_TO_DEADLETTER"); + log.info(" 状态映射: COMPLETED, CANCELLED, SUSPENDED, RUNNING, ERROR"); + }; + } +} diff --git a/flowable/src/main/java/com/sdm/flowable/enums/ProcessInstanceStateEnum.java b/flowable/src/main/java/com/sdm/flowable/enums/ProcessInstanceStateEnum.java index 9512aa34..babd516d 100644 --- a/flowable/src/main/java/com/sdm/flowable/enums/ProcessInstanceStateEnum.java +++ b/flowable/src/main/java/com/sdm/flowable/enums/ProcessInstanceStateEnum.java @@ -7,35 +7,43 @@ public enum ProcessInstanceStateEnum { /** * 运行中 */ - RUNNING("running"), + RUNNING(1,"running"), + + /** + * 已完成 + */ + COMPLETED(2,"completed"), + + /** + * 错误 + */ + ERROR(3,"error"), /** * 挂起 */ - SUSPENDED("suspended"), - - /** - * 错误 - */ - ERROR("error"), - - /** - * 已完成 - */ - COMPLETED("completed"), + SUSPENDED(4,"suspended"), + /** * 已取消 */ - CANCELLED("cancelled"); + CANCELLED(5,"cancelled"); - private final String code; + private final Integer code; - ProcessInstanceStateEnum(String code) { + private final String value; + + ProcessInstanceStateEnum(Integer code, String value) { this.code = code; + this.value = value; } - public String getCode() { + public String getValue() { + return value; + } + + public Integer getCode() { return code; } } \ No newline at end of file diff --git a/flowable/src/main/java/com/sdm/flowable/listener/GlobalStatusEventListener.java b/flowable/src/main/java/com/sdm/flowable/listener/GlobalStatusEventListener.java new file mode 100644 index 00000000..451704d5 --- /dev/null +++ b/flowable/src/main/java/com/sdm/flowable/listener/GlobalStatusEventListener.java @@ -0,0 +1,187 @@ +package com.sdm.flowable.listener; + +import com.sdm.common.feign.inter.project.ISimulationRunFeignClient; +import com.sdm.flowable.enums.ProcessInstanceStateEnum; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType; +import org.flowable.common.engine.api.delegate.event.FlowableEvent; +import org.flowable.common.engine.api.delegate.event.FlowableEventListener; +import org.flowable.engine.impl.persistence.entity.ExecutionEntity; +import org.flowable.job.api.Job; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +/** + * 全局算例状态同步监听器 + * 作用:替代定时任务,实时推送状态 + *

+ * 监听Flowable流程引擎的全生命周期事件,实现算例状态的实时同步: + * - PROCESS_COMPLETED: 流程正常完成 + * - PROCESS_CANCELLED: 流程被取消/终止 + * - ENTITY_SUSPENDED: 实体挂起(需过滤流程实例) + * - ENTITY_ACTIVATED: 实体激活(需过滤流程实例) + * - JOB_MOVED_TO_DEADLETTER: 作业移入死信队列(ERROR状态) + *

+ * + * @author SDM + * @date 2026-01-23 + */ +@Slf4j +@Component +public class GlobalStatusEventListener implements FlowableEventListener { + + @Autowired + private ISimulationRunFeignClient simulationRunFeignClient; + + @Override + public Set getTypes() { + return new HashSet<>(Arrays.asList( + FlowableEngineEventType.PROCESS_COMPLETED, // 流程完成 + FlowableEngineEventType.PROCESS_CANCELLED, // 流程取消(精确匹配,不需要判断deleteReason) + FlowableEngineEventType.ENTITY_SUSPENDED, // 实体挂起(需过滤流程实例) + FlowableEngineEventType.ENTITY_ACTIVATED, // 实体激活(需过滤流程实例) + FlowableEngineEventType.JOB_MOVED_TO_DEADLETTER // 作业进入死信(ERROR状态) + )); + } + + @Override + public void onEvent(FlowableEvent event) { + try { + FlowableEngineEventType eventType = (FlowableEngineEventType) event.getType(); + + // 1. 流程正常完成 + if (eventType == FlowableEngineEventType.PROCESS_COMPLETED) { + handleProcessCompleted((FlowableEngineEntityEvent) event); + } + // 2. 流程被取消(Flowable 7.x有独立的CANCELLED事件) + else if (eventType == FlowableEngineEventType.PROCESS_CANCELLED) { + handleProcessCancelled((FlowableEngineEntityEvent) event); + } + // 3. 实体挂起/激活(需要过滤,只处理流程实例级别) + else if (eventType == FlowableEngineEventType.ENTITY_SUSPENDED || + eventType == FlowableEngineEventType.ENTITY_ACTIVATED) { + handleSuspendOrActivate((FlowableEngineEntityEvent) event, eventType); + } + // 4. 作业进入死信队列(ERROR状态的金标准) + else if (eventType == FlowableEngineEventType.JOB_MOVED_TO_DEADLETTER) { + handleDeadLetter((FlowableEngineEntityEvent) event); + } + } catch (Exception e) { + log.error("处理Flowable事件异常: eventType={}", event.getType(), e); + } + } + + // --- 内部逻辑方法 --- + + /** + * 处理流程正常完成事件 + * PROCESS_COMPLETED只表示流程走到EndEvent,不包括取消场景 + */ + private void handleProcessCompleted(FlowableEngineEntityEvent event) { + String processInstanceId = event.getProcessInstanceId(); + log.info("流程正常完成: processInstanceId={}", processInstanceId); + doUpdate(processInstanceId, ProcessInstanceStateEnum.COMPLETED.getCode()); + } + + /** + * 处理流程取消事件 + * Flowable 7.x提供了独立的PROCESS_CANCELLED事件,更精确 + */ + private void handleProcessCancelled(FlowableEngineEntityEvent event) { + String processInstanceId = event.getProcessInstanceId(); + ExecutionEntity execution = (ExecutionEntity) event.getEntity(); + log.info("流程被取消: processInstanceId={}, deleteReason={}", + processInstanceId, execution.getDeleteReason()); + doUpdate(processInstanceId, ProcessInstanceStateEnum.CANCELLED.getCode()); + } + + /** + * 处理实体挂起/激活事件 + * 关键:必须过滤,只处理流程实例级别的挂起/激活,忽略子流程或其他实体 + */ + private void handleSuspendOrActivate(FlowableEngineEntityEvent event, FlowableEngineEventType eventType) { + Object entity = event.getEntity(); + + // 只处理ExecutionEntity(流程执行实体) + if (entity instanceof ExecutionEntity) { + ExecutionEntity execution = (ExecutionEntity) entity; + + // 关键判断:isProcessInstanceType()确保是流程实例本身,而非子分支 + if (execution.isProcessInstanceType()) { + String processInstanceId = execution.getProcessInstanceId(); + Integer status = (eventType == FlowableEngineEventType.ENTITY_SUSPENDED) ? ProcessInstanceStateEnum.SUSPENDED.getCode() : ProcessInstanceStateEnum.RUNNING.getCode(); + + log.info("流程实例{}状态变更: processInstanceId={}", + status.equals("SUSPENDED") ? "挂起" : "激活", processInstanceId); + doUpdate(processInstanceId, status); + } else { + log.debug("忽略非流程实例级别的挂起/激活事件: executionId={}", execution.getId()); + } + } + } + + /** + * 处理死信事件(ERROR状态的标准方式) + * JOB_MOVED_TO_DEADLETTER是最精确的ERROR信号: + * - 比JOB_EXECUTION_FAILURE准确(FAILURE只是重试中的失败) + * - 表示引擎已放弃重试,必须人工干预 + *

+ * 前提条件:ServiceTask必须配置async="true"和R0/PT0S重试策略 + */ + private void handleDeadLetter(FlowableEngineEntityEvent event) { + Object entity = event.getEntity(); + + if (entity instanceof Job) { + Job job = (Job) entity; + String processInstanceId = job.getProcessInstanceId(); + String exceptionMessage = job.getExceptionMessage(); + + log.error("❌ 作业进入死信队列,流程ERROR: processInstanceId={}, jobId={}, exception={}", + processInstanceId, job.getId(), exceptionMessage); + + doUpdate(processInstanceId, ProcessInstanceStateEnum.ERROR.getCode()); + } + } + + /** + * 真正的更新数据库逻辑 + * 通过Feign调用project服务更新算例状态 + */ + private void doUpdate(String processInstanceId, Integer statusCode) { + if (processInstanceId == null) { + log.warn("流程实例ID为空,跳过状态更新"); + return; + } + + log.info(">>> 更新算例状态 [{}] -> {}", processInstanceId, statusCode); + try { + simulationRunFeignClient.updateStatusByProcessInstanceId(processInstanceId, statusCode); + } catch (Exception e) { + log.error("更新算例状态失败: processInstanceId={}, status={}", processInstanceId, statusCode, e); + } + } + + @Override + public boolean isFailOnException() { + // 返回false:即使监听器抛异常,也不影响流程继续执行 + // 这是容错设计,保证业务流程的稳定性 + return false; + } + + @Override + public boolean isFireOnTransactionLifecycleEvent() { + // 返回false:在事务提交前触发,确保状态及时更新 + // 如果返回true,监听器会在事务提交后触发,可能导致状态更新滞后 + return false; + } + + @Override + public String getOnTransaction() { + return null; + } +} diff --git a/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java b/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java index e4834e87..0d814b3f 100644 --- a/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java +++ b/flowable/src/main/java/com/sdm/flowable/process/ProcessService.java @@ -472,11 +472,11 @@ public class ProcessService implements Iprocess{ if (isRunning) { // --- 运行中 --- if (hasError) { - status = ProcessInstanceStateEnum.ERROR.getCode(); // 有死信作业,视为异常 + status = ProcessInstanceStateEnum.ERROR.getValue(); // 有死信作业,视为异常 } else if (isSuspended) { - status = ProcessInstanceStateEnum.SUSPENDED.getCode(); // 被挂起 + status = ProcessInstanceStateEnum.SUSPENDED.getValue(); // 被挂起 } else { - status = ProcessInstanceStateEnum.RUNNING.getCode(); // 正常运行 + status = ProcessInstanceStateEnum.RUNNING.getValue(); // 正常运行 } } else { // --- 已结束 (运行时查不到,历史表里有) --- @@ -484,11 +484,11 @@ public class ProcessService implements Iprocess{ if (deleteReason == null) { // 1. 正常走完结束节点,deleteReason 为空 - status = ProcessInstanceStateEnum.COMPLETED.getCode(); + status = ProcessInstanceStateEnum.COMPLETED.getValue(); } else { // 2. 有删除原因,说明是被取消或强制终止的 // 你可以根据 reason 的内容做更细的区分,或者统称为 cancelled - status = ProcessInstanceStateEnum.CANCELLED.getCode(); + status = ProcessInstanceStateEnum.CANCELLED.getValue(); } } info.setStatus(status); diff --git a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java index 800b2bd8..af96589c 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationRunController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationRunController.java @@ -395,4 +395,13 @@ public class SimulationRunController implements ISimulationRunFeignClient { return runService.syncKeyResultToTask(req); } + /** + * 根据流程实例ID更新算例状态 (内部调用) + * 由Flowable全局事件监听器调用 + */ + @PostMapping("/updateStatusByProcessInstanceId") + public SdmResponse updateStatusByProcessInstanceId(@RequestParam String processInstanceId, @RequestParam Integer statusCode) { + return runService.updateStatusByProcessInstanceId(processInstanceId, statusCode); + } + } \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java index 7b09631d..22fc4ec2 100644 --- a/project/src/main/java/com/sdm/project/service/ISimulationRunService.java +++ b/project/src/main/java/com/sdm/project/service/ISimulationRunService.java @@ -110,4 +110,12 @@ public interface ISimulationRunService extends IService { SdmResponse syncKeyResultToTask(KeyResultReq req); + /** + * 根据流程实例ID更新算例状态 + * @param processInstanceId 流程实例ID + * @param statusCode 状态值(RUNNING/SUSPENDED/COMPLETED/CANCELLED/ERROR) + * @return SdmResponse + */ + SdmResponse updateStatusByProcessInstanceId(String processInstanceId, Integer statusCode); + } \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index 879b1496..4cdb55cf 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -623,7 +623,7 @@ public class SimulationRunServiceImpl extends ServiceImpl Date: Fri, 23 Jan 2026 17:56:43 +0800 Subject: [PATCH 10/12] =?UTF-8?q?fix:=E6=B5=81=E7=A8=8B=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=8C=E6=9B=B4=E6=96=B0=E7=AE=97=E5=88=97?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sdm/project/service/impl/SimulationRunServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java index 4cdb55cf..88474c1d 100644 --- a/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/SimulationRunServiceImpl.java @@ -623,7 +623,7 @@ public class SimulationRunServiceImpl extends ServiceImpl Date: Fri, 23 Jan 2026 18:43:17 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E9=A2=84=E7=83=AD=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/DataSourcePreWarmer.java | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/common/src/main/java/com/sdm/common/config/DataSourcePreWarmer.java b/common/src/main/java/com/sdm/common/config/DataSourcePreWarmer.java index a075b282..f45415c1 100644 --- a/common/src/main/java/com/sdm/common/config/DataSourcePreWarmer.java +++ b/common/src/main/java/com/sdm/common/config/DataSourcePreWarmer.java @@ -1,47 +1,47 @@ -package com.sdm.common.config;//package com.sdm.project.config.mybatis; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.ApplicationRunner; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import javax.sql.DataSource; -import java.sql.Connection; - -@Slf4j -@Configuration -public class DataSourcePreWarmer { - - @Bean - public ApplicationRunner secondDataSourcePreWarmer( - @Qualifier("secondDataSource") DataSource secondDataSource) { - return args -> { - try (Connection conn = secondDataSource.getConnection()) { - log.info("✅ secondDataSource 预热成功,连接已建立: {}", conn); - } catch (Exception e) { - log.error("❌ secondDataSource 预热失败", e); - throw new RuntimeException(e); - } - }; - } - - @Bean - public ApplicationRunner mainDataSourcePreWarmer( - @Qualifier("masterDataSource") DataSource master, - @Qualifier("slaveDataSource") DataSource slave) { - return args -> { - try { - try (Connection c1 = master.getConnection()) { - log.info("✅ masterDataSource 预热成功: {}", c1); - } - try (Connection c2 = slave.getConnection()) { - log.info("✅ slaveDataSource 预热成功: {}", c2); - } - } catch (Exception e) { - log.error("❌ 主从数据源预热失败", e); - throw new RuntimeException(e); - } - }; - } -} \ No newline at end of file +//package com.sdm.common.config;//package com.sdm.project.config.mybatis; +// +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.beans.factory.annotation.Qualifier; +//import org.springframework.boot.ApplicationRunner; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +// +//import javax.sql.DataSource; +//import java.sql.Connection; +// +//@Slf4j +//@Configuration +//public class DataSourcePreWarmer { +// +// @Bean +// public ApplicationRunner secondDataSourcePreWarmer( +// @Qualifier("secondDataSource") DataSource secondDataSource) { +// return args -> { +// try (Connection conn = secondDataSource.getConnection()) { +// log.info("✅ secondDataSource 预热成功,连接已建立: {}", conn); +// } catch (Exception e) { +// log.error("❌ secondDataSource 预热失败", e); +// throw new RuntimeException(e); +// } +// }; +// } +// +// @Bean +// public ApplicationRunner mainDataSourcePreWarmer( +// @Qualifier("masterDataSource") DataSource master, +// @Qualifier("slaveDataSource") DataSource slave) { +// return args -> { +// try { +// try (Connection c1 = master.getConnection()) { +// log.info("✅ masterDataSource 预热成功: {}", c1); +// } +// try (Connection c2 = slave.getConnection()) { +// log.info("✅ slaveDataSource 预热成功: {}", c2); +// } +// } catch (Exception e) { +// log.error("❌ 主从数据源预热失败", e); +// throw new RuntimeException(e); +// } +// }; +// } +//} \ No newline at end of file From 344cb87a14a701a56d874cfc69bdba8e5dd4658b Mon Sep 17 00:00:00 2001 From: zhuxinru Date: Fri, 23 Jan 2026 19:36:20 +0800 Subject: [PATCH 12/12] =?UTF-8?q?fix:=E5=9B=9E=E9=80=80outbrige=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90=E9=A2=84=E7=83=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- outbridge/src/main/resources/common.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/outbridge/src/main/resources/common.yml b/outbridge/src/main/resources/common.yml index cb9cb324..67e3d02e 100644 --- a/outbridge/src/main/resources/common.yml +++ b/outbridge/src/main/resources/common.yml @@ -2,7 +2,7 @@ spring: datasource: second: username: EP_DM - password: ENC(c04rt9Z6Ygz024EU9eWvig==) + password: EP_DM@123.COM # todo 生产地址 jdbc-url: jdbc:mysql://10.122.48.11:13306/easy_project?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver