From de012b69fb209a0464215c881677dbe7e255453e Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 5 Sep 2025 11:25:22 +0800 Subject: [PATCH 01/10] =?UTF-8?q?fix=20-=20=E8=B0=83=E6=95=B4=20xxljob?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++++ workflow-engine-server/pom.xml | 4 +++ .../server/xxljob/NodeAlterJobHandler.java | 30 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java diff --git a/pom.xml b/pom.xml index b9cc62063..fe575363e 100644 --- a/pom.xml +++ b/pom.xml @@ -32,6 +32,7 @@ 2.0.0 2.5.0 0.0.1-SNAPSHOT + 2.0.1-SNAPSHOT @@ -179,6 +180,11 @@ doc-api ${axzo-dependencies.version} + + cn.axzo.infra + adapter + ${adapter.version} + diff --git a/workflow-engine-server/pom.xml b/workflow-engine-server/pom.xml index 10cae3ff8..dc7817d5c 100644 --- a/workflow-engine-server/pom.xml +++ b/workflow-engine-server/pom.xml @@ -154,6 +154,10 @@ cn.axzo.nanopart doc-api + + cn.axzo.infra + adapter + diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java new file mode 100644 index 000000000..836e09668 --- /dev/null +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java @@ -0,0 +1,30 @@ +package cn.axzo.workflow.server.xxljob; + +import cn.axzo.infra.xxl220to250.IJobHandler; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * TODO + * + * @author wangli + * @since 2025-09-05 11:19 + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class NodeAlterJobHandler extends IJobHandler { + @XxlJob("nodeAlterJobHandler") + @Override + public ReturnT execute(String param) throws Exception { +// log.info(); + XxlJobHelper.log("request param: {}", param); + + + return null; + } +} From f4168959e75f3bf7b9469fe3b76c0223add7695c Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 5 Sep 2025 17:10:23 +0800 Subject: [PATCH 02/10] =?UTF-8?q?fix=20-=20=E5=A2=9E=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E5=BC=A0=E6=96=B0=E8=A1=A8=E6=9D=A5=E6=94=AF=E6=92=91=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E8=8A=82=E7=82=B9=E5=91=8A=E8=AD=A6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/dto/TermNodeAddTimerJobDTO.java | 2 + .../core/conf/FlowableConfiguration.java | 3 +- .../core/engine/cmd/CustomAddTimerJobCmd.java | 34 ++---- ...BpmnActivityEventListener_lo_Listener.java | 2 + .../repository/entity/ExtAxNodeAlterJob.java | 48 ++++++++ .../mapper/ExtAxNodeAlterJobMapper.java | 22 ++++ .../service/ExtAxNodeAlterJobService.java | 17 +++ .../impl/ExtAxNodeAlterJobServiceImpl.java | 31 ++++++ .../server/controller/web/JobHttpHandler.java | 28 +++++ .../server/xxljob/NodeAlterJobHandler.java | 103 +++++++++++++++++- 10 files changed, 261 insertions(+), 29 deletions(-) create mode 100644 workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/entity/ExtAxNodeAlterJob.java create mode 100644 workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/ExtAxNodeAlterJobMapper.java create mode 100644 workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/ExtAxNodeAlterJobService.java create mode 100644 workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/ExtAxNodeAlterJobServiceImpl.java create mode 100644 workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/JobHttpHandler.java diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java index c5e955d78..dd1790730 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/dto/TermNodeAddTimerJobDTO.java @@ -21,7 +21,9 @@ import java.io.Serializable; @Builder public class TermNodeAddTimerJobDTO implements Serializable { private String processInstanceId; + private String processDefinitionId; private String activityId; + private String activityName; private Integer delayTime; private String timeUnit; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java index b65829847..565d0dd4a 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/FlowableConfiguration.java @@ -20,7 +20,6 @@ import cn.axzo.workflow.core.engine.job.AsyncExtTaskInstJobHandler; import cn.axzo.workflow.core.engine.job.AsyncRejectTaskJobHandler; import cn.axzo.workflow.core.engine.job.AsyncRemindTaskJobHandler; import cn.axzo.workflow.core.engine.job.AsyncResetApproversUserTaskJobHandler; -import cn.axzo.workflow.core.engine.job.AsyncTermNodeAlterJobHandler; import cn.axzo.workflow.core.engine.job.AsyncTransferUserTaskJobHandler; import cn.axzo.workflow.core.engine.job.NextActivityConfigCheckJobHandler; import cn.axzo.workflow.core.engine.job.exception.handle.CustomAsyncJobLogClearTraceExceptionHandler; @@ -114,7 +113,7 @@ public class FlowableConfiguration { configuration.addCustomJobHandler(new AsyncExtTaskInstJobHandler(extAxHiTaskInstService)); configuration.addCustomJobHandler(new AsyncRejectTaskJobHandler(extAxHiTaskInstService)); configuration.addCustomJobHandler(new AsyncTransferUserTaskJobHandler()); - configuration.addCustomJobHandler(new AsyncTermNodeAlterJobHandler(refreshProperties)); +// configuration.addCustomJobHandler(new AsyncTermNodeAlterJobHandler(refreshProperties)); configuration.addCustomJobHandler(new AsyncCountersignUserTaskJobHandler(extAxHiTaskInstService)); configuration.addCustomJobHandler(new AsyncActivityLeaveJobHandler(bpmnProcessActivityService)); configuration.addCustomJobHandler(new AsyncActivityCallbackJobHandler()); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java index 8e44f1ba2..4a73e1529 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java @@ -1,16 +1,13 @@ package cn.axzo.workflow.core.engine.cmd; import cn.axzo.workflow.common.model.dto.TermNodeAddTimerJobDTO; -import cn.axzo.workflow.core.engine.job.AsyncTermNodeAlterJobHandler; +import cn.axzo.workflow.core.common.utils.SpringContextUtils; +import cn.axzo.workflow.core.repository.entity.ExtAxNodeAlterJob; +import cn.axzo.workflow.core.service.ExtAxNodeAlterJobService; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.impl.interceptor.CommandContext; -import org.flowable.engine.ManagementService; -import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; -import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.job.service.TimerJobService; -import org.flowable.job.service.impl.persistence.entity.TimerJobEntity; import java.io.Serializable; import java.util.Date; @@ -37,10 +34,7 @@ public class CustomAddTimerJobCmd extends AbstractCommand implements Seria @Override public Void executeInternal(CommandContext commandContext) { log.info("CustomAddTimerJobCmd start. instanceId: {}, activityId: {}, delayTime: {}, timeUnit: {}", dto.getProcessInstanceId(), dto.getActivityId(), dto.getDelayTime(), dto.getTimeUnit()); - ProcessEngineConfigurationImpl processEngineConfiguration = - CommandContextUtil.getProcessEngineConfiguration(commandContext); - ManagementService managementService = processEngineConfiguration.getManagementService(); Date alterTime; switch (dto.getTimeUnit()) { case "M": @@ -54,20 +48,14 @@ public class CustomAddTimerJobCmd extends AbstractCommand implements Seria break; } - managementService.executeCommand(context -> { - TimerJobService timerJobService = CommandContextUtil.getTimerJobService(); - TimerJobEntity timerJobEntity = timerJobService.createTimerJob(); - timerJobEntity.setJobType("timer"); - timerJobEntity.setJobHandlerType(AsyncTermNodeAlterJobHandler.TYPE); // 这里填写你自定义的 JobHandler 类型 - timerJobEntity.setProcessInstanceId(dto.getProcessInstanceId()); - timerJobEntity.setExecutionId(null); - timerJobEntity.setDuedate(alterTime); // 立即执行 - timerJobEntity.setRepeat(null); // 不重复 - timerJobEntity.setRetries(1); - timerJobEntity.setJobHandlerConfiguration(dto.getActivityId()); // 可选,传递参数 - timerJobService.scheduleTimerJob(timerJobEntity); - return null; - }); + ExtAxNodeAlterJobService service = SpringContextUtils.getBean(ExtAxNodeAlterJobService.class); + ExtAxNodeAlterJob job = new ExtAxNodeAlterJob(); + job.setProcessInstanceId(dto.getProcessInstanceId()); + job.setProcessDefinitionId(dto.getProcessDefinitionId()); + job.setActivityId(dto.getActivityId()); + job.setActivityName(dto.getActivityName()); + job.setAlterTime(alterTime); + service.save(job); return null; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java index cde40df9d..346e7198a 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java @@ -89,7 +89,9 @@ public class InternalBpmnActivityEventListener_lo_Listener extends AbstractBpmnE TermNodeAddTimerJobDTO addTimerJobDTO = new TermNodeAddTimerJobDTO(); addTimerJobDTO.setProcessInstanceId(execution.getProcessInstanceId()); + addTimerJobDTO.setProcessDefinitionId(execution.getProcessDefinitionId()); addTimerJobDTO.setActivityId(execution.getCurrentActivityId()); + addTimerJobDTO.setActivityName(flowElement.getName()); addTimerJobDTO.setDelayTime(refreshProperties.getAlterInterval()); addTimerJobDTO.setTimeUnit(timeUnit); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/entity/ExtAxNodeAlterJob.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/entity/ExtAxNodeAlterJob.java new file mode 100644 index 000000000..ef6ec0c7f --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/entity/ExtAxNodeAlterJob.java @@ -0,0 +1,48 @@ +package cn.axzo.workflow.core.repository.entity; + +import cn.axzo.framework.data.mybatisplus.model.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.util.Date; + +/** + * 业务节点告警任务表 + * + * @author wangli + * @since 2025-09-05 13:43 + */ +@EqualsAndHashCode(callSuper = true) +@TableName(value = "ext_ax_node_alter_job", autoResultMap = true) +@Data +@ToString(callSuper = true) +public class ExtAxNodeAlterJob extends BaseEntity { + private static final long serialVersionUID = 461756492937079852L; + + /** + * 流程实例 ID + */ + private String processInstanceId; + /** + * 流程定义 ID + */ + private String processDefinitionId; + /** + * 活动节点 ID + */ + private String activityId; + /** + * 活动节点名称 + */ + private String activityName; + /** + * 告警事件 + */ + private Date alterTime; + /** + * 异常信息 + */ + private String exception; +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/ExtAxNodeAlterJobMapper.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/ExtAxNodeAlterJobMapper.java new file mode 100644 index 000000000..710206ab6 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/repository/mapper/ExtAxNodeAlterJobMapper.java @@ -0,0 +1,22 @@ +package cn.axzo.workflow.core.repository.mapper; + +import cn.axzo.workflow.core.repository.entity.ExtAxNodeAlterJob; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface ExtAxNodeAlterJobMapper extends BaseMapperX { + + @Delete({ + "" + }) + int physicsDeleteBatchIds(@Param("ids") List ids); +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/ExtAxNodeAlterJobService.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/ExtAxNodeAlterJobService.java new file mode 100644 index 000000000..6ac3218f6 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/ExtAxNodeAlterJobService.java @@ -0,0 +1,17 @@ +package cn.axzo.workflow.core.service; + +import cn.axzo.workflow.core.repository.entity.ExtAxNodeAlterJob; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * 业务节点告警表操作服务 + * + * @author wangli + * @since 2024/4/3 10:40 + */ +public interface ExtAxNodeAlterJobService extends IService { + + boolean deleteByIds(List ids); +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/ExtAxNodeAlterJobServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/ExtAxNodeAlterJobServiceImpl.java new file mode 100644 index 000000000..041aea474 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/ExtAxNodeAlterJobServiceImpl.java @@ -0,0 +1,31 @@ +package cn.axzo.workflow.core.service.impl; + +import cn.axzo.workflow.core.repository.entity.ExtAxNodeAlterJob; +import cn.axzo.workflow.core.repository.mapper.ExtAxNodeAlterJobMapper; +import cn.axzo.workflow.core.service.ExtAxNodeAlterJobService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 业务节点告警表操作服务实现类 + * + * @author wangli + * @since 2025-09-05 13:50 + */ +@Service +@Slf4j +public class ExtAxNodeAlterJobServiceImpl extends ServiceImpl implements ExtAxNodeAlterJobService { + @Resource + private ExtAxNodeAlterJobMapper extAxNodeAlterJobMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteByIds(List ids) { + return extAxNodeAlterJobMapper.physicsDeleteBatchIds(ids) > 0; + } +} diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/JobHttpHandler.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/JobHttpHandler.java new file mode 100644 index 000000000..f9a66bf17 --- /dev/null +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/JobHttpHandler.java @@ -0,0 +1,28 @@ +package cn.axzo.workflow.server.controller.web; + +import com.alibaba.fastjson.JSONObject; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.executor.XxlJobExecutor; +import com.xxl.job.core.handler.IJobHandler; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author yanglin + */ +@RestController +public class JobHttpHandler { + + @PostMapping("/jobs/{jobName}") + ReturnT exec(@PathVariable String jobName, + @RequestBody(required = false) JSONObject paramObj) throws Exception { + IJobHandler jobHandler = XxlJobExecutor.loadJobHandler(jobName); + if (jobHandler == null) + return new ReturnT<>(ReturnT.FAIL_CODE, String.format("找不到job: %s", jobName)); + jobHandler.execute(); + return ReturnT.SUCCESS; + } + +} \ No newline at end of file diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java index 836e09668..eb86d63c0 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java @@ -1,15 +1,43 @@ package cn.axzo.workflow.server.xxljob; +import cn.axzo.basics.common.util.NumberUtil; +import cn.axzo.framework.jackson.utility.JSON; import cn.axzo.infra.xxl220to250.IJobHandler; +import cn.axzo.workflow.common.model.dto.AlterDTO; +import cn.axzo.workflow.common.model.response.category.CategoryItemVO; +import cn.axzo.workflow.core.common.utils.SpringContextUtils; +import cn.axzo.workflow.core.conf.SupportRefreshProperties; +import cn.axzo.workflow.core.listener.Alter; +import cn.axzo.workflow.core.repository.entity.ExtAxNodeAlterJob; +import cn.axzo.workflow.core.service.CategoryService; +import cn.axzo.workflow.core.service.ExtAxNodeAlterJobService; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.engine.runtime.ProcessInstance; +import org.flowable.spring.SpringProcessEngineConfiguration; +import org.flowable.task.api.Task; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY; /** - * TODO + * 调度业务节点告警定时任务 * * @author wangli * @since 2025-09-05 11:19 @@ -18,13 +46,80 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor @Slf4j public class NodeAlterJobHandler extends IJobHandler { + + private final ExtAxNodeAlterJobService extAxNodeAlterJobService; + private final CategoryService categoryService; + private final SpringProcessEngineConfiguration processEngineConfiguration; + private final SupportRefreshProperties refreshProperties; + @XxlJob("nodeAlterJobHandler") @Override public ReturnT execute(String param) throws Exception { -// log.info(); - XxlJobHelper.log("request param: {}", param); + List jobs = extAxNodeAlterJobService.list(new LambdaQueryWrapper() + .le(ExtAxNodeAlterJob::getAlterTime, new Date())); + if (CollectionUtils.isEmpty(jobs)) { + XxlJobHelper.log("没有需要处理的业务节点告警任务"); + return ReturnT.SUCCESS; + } + List executedJobs = new ArrayList<>(); + RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); + TaskService taskService = processEngineConfiguration.getTaskService(); + jobs.forEach(e -> { + XxlJobHelper.log("start execution of job: {}", JSON.toJSONString(e)); + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(e.getProcessInstanceId()).singleResult(); + if (Objects.isNull(processInstance)) { + executedJobs.add(e); + return; + } + List tasks = taskService.createTaskQuery() + .processInstanceId(e.getProcessInstanceId()) + .taskDefinitionKey(e.getActivityId()) + .active().list(); - return null; + StringBuilder sb = new StringBuilder(); + tasks.forEach(t -> { + sb.append("id:").append(e.getId()).append(", assignee: ").append(t.getAssignee()); + }); + XxlJobHelper.log("tasks size:{}, info: {}", tasks.size(), com.alibaba.fastjson.JSON.toJSONString(sb)); + if (CollectionUtils.isEmpty(tasks) || tasks.size() > 1 || hasAssignee(tasks.get(0).getAssignee())) { + executedJobs.add(e); + return; + } + + Optional category = categoryService.get(BPM_MODEL_CATEGORY, processInstance.getProcessDefinitionKey()); + +// sendAlter(processInstance, category, e, tasks.get(0)); + + executedJobs.add(e); + XxlJobHelper.log("end execution of job: {}", JSON.toJSONString(e)); + }); + + extAxNodeAlterJobService.deleteByIds(executedJobs.stream().map(ExtAxNodeAlterJob::getId).collect(Collectors.toList())); + return ReturnT.SUCCESS; + } + + private void sendAlter(ProcessInstance processInstance, Optional category, ExtAxNodeAlterJob job, Task task) { + // 发送告警对象 + Alter alter = SpringContextUtils.getBean(Alter.class); + AlterDTO alterDTO = new AlterDTO(); + alterDTO.setProcessDefinitionKey(processInstance.getProcessDefinitionKey()); + alterDTO.setProcessDefinitionName(category.orElse(new CategoryItemVO()).getLabel()); + alterDTO.setProcessInstanceId(job.getProcessInstanceId()); + alterDTO.setActivityId(job.getActivityId()); + alterDTO.setTaskId(task.getId()); + alterDTO.setStartTime(task.getCreateTime()); + alterDTO.setPrettyStartTime(DateUtil.formatDateTime(task.getCreateTime())); + if (Boolean.TRUE.equals(refreshProperties.getAlterSendDingTalk())) { + alter.invoke(alterDTO); + } + } + + private Boolean hasAssignee(String assignee) { + if (!StringUtils.hasText(assignee)) { + return false; + } + String[] split = assignee.split("\\|"); + return split.length == 2 && NumberUtil.isPositiveNumber(Long.valueOf(split[1])); } } From ffbf2709486a438c7ae5949b655ba968121b5dcf Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 5 Sep 2025 17:22:12 +0800 Subject: [PATCH 03/10] =?UTF-8?q?fix=20-=20=E5=A2=9E=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E5=BC=A0=E6=96=B0=E8=A1=A8=E6=9D=A5=E6=94=AF=E6=92=91=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E8=8A=82=E7=82=B9=E5=91=8A=E8=AD=A6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/core/engine/cmd/CustomActivityTriggerCmd.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java index 2a930c561..3eb2e4b14 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java @@ -12,7 +12,6 @@ import org.flowable.common.engine.impl.interceptor.CommandContext; import org.flowable.engine.RuntimeService; import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl; import org.flowable.engine.impl.util.CommandContextUtil; -import org.flowable.job.service.TimerJobService; import org.flowable.engine.impl.util.ProcessDefinitionUtil; import org.flowable.task.service.impl.persistence.entity.TaskEntity; import org.slf4j.Logger; @@ -66,9 +65,6 @@ public class CustomActivityTriggerCmd extends AbstractCommand implements S addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意"); RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); - // 告警节点生产的定时任务需要删除,否则会因为外键约束导致触发功能会重试,并抛出触发节点不存在的问题 - TimerJobService timerJobService = CommandContextUtil.getTimerJobService(); - timerJobService.findTimerJobsByProcessInstanceId(task.getProcessInstanceId()).forEach(timerJobService::deleteTimerJob); runtimeService.trigger(dto.getTriggerId()); return null; } From 972557b32c7c17204561dbb8a9f156c9046bcd69 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 5 Sep 2025 17:51:37 +0800 Subject: [PATCH 04/10] =?UTF-8?q?fix=20-=20=E6=B7=BB=E5=8A=A0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=91=8A=E8=AD=A6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/core/conf/SupportRefreshProperties.java | 10 ++++++++++ .../InternalBpmnActivityEventListener_lo_Listener.java | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/SupportRefreshProperties.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/SupportRefreshProperties.java index cfac43c61..e7b9974ef 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/SupportRefreshProperties.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/conf/SupportRefreshProperties.java @@ -41,6 +41,16 @@ public class SupportRefreshProperties { @Value(value = "${workflow.alter.enable:false}") private Boolean alterEnable; + /** + * 是否全量业务 ID 都开启告警功能 + */ + @Value(value = "${workflow.alter.allDefinitionKey:false}") + private Boolean alterAllDefinitionKey; + /** + * 需要开启告警功能的业务 ID 列表 + */ + @Value(value = "${workflow.alter.definitionKeys:}") + private List alterDefinitionKeys; /** * 节点卡住多久才告警,单位分钟 */ diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java index 346e7198a..77ce5a30d 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/impl/InternalBpmnActivityEventListener_lo_Listener.java @@ -11,6 +11,7 @@ import cn.axzo.workflow.core.listener.AbstractBpmnEventListener; import cn.axzo.workflow.core.listener.BpmnActivityEventListener; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.FlowElement; import org.flowable.common.engine.impl.cfg.TransactionState; @@ -60,11 +61,16 @@ public class InternalBpmnActivityEventListener_lo_Listener extends AbstractBpmnE if (!Boolean.TRUE.equals(refreshProperties.getAlterEnable())) { return; } + BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(execution.getProcessDefinitionId()); + if (!refreshProperties.getAlterAllDefinitionKey()) { + if (!ListUtils.emptyIfNull(refreshProperties.getAlterDefinitionKeys()).contains(bpmnModel.getMainProcess().getId())) { + return; + } + } ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); RuntimeService runtimeService = processEngineConfiguration.getRuntimeService(); TermNodePausingDTO dto = new TermNodePausingDTO(execution.getProcessInstanceId(), execution.getCurrentActivityId(), 0); runtimeService.setVariable(execution.getProcessInstanceId(), BIZ_NODE_ALTER + execution.getCurrentActivityId(), dto); - BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(execution.getProcessDefinitionId()); FlowElement flowElement = bpmnModel.getFlowElement(execution.getCurrentActivityId()); BpmnMetaParserHelper.getNodeType(flowElement).ifPresent(e -> { if (Objects.equals(BpmnFlowNodeType.NODE_BUSINESS, e)) { From 7e5a140ed40568ba0ca1e0643d6aab3e0c1eaaea Mon Sep 17 00:00:00 2001 From: wangli Date: Sat, 6 Sep 2025 11:17:54 +0800 Subject: [PATCH 05/10] =?UTF-8?q?fix=20-=20=E8=B0=83=E6=95=B4=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=AE=A1=E6=89=B9=E4=BA=BA=E7=9A=84=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/engine/cmd/CustomBizSpecifyAssigneeToTaskCmd.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBizSpecifyAssigneeToTaskCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBizSpecifyAssigneeToTaskCmd.java index 4446489b9..112ea35f6 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBizSpecifyAssigneeToTaskCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomBizSpecifyAssigneeToTaskCmd.java @@ -89,12 +89,13 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand * @param assigners */ public static void validate(RuntimeService runtimeService, String executionId, Task task, List assigners) { + validTask(task, executionId); + BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(task.getProcessDefinitionId()); boolean present = assigners.stream().anyMatch(assigner -> !StringUtils.hasText(assigner.getNodeId())); if (present && getCategoryVersion(bpmnModel.getMainProcess()).orElse(0) > 0) { throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "审批人"); } - validTask(task, executionId); //校验审批人数量是否超过限制 validTaskAssignerCount(runtimeService, (TaskEntity) task, assigners); } From f566fb0009b19caa5c725d1211d31c78c05ddeea Mon Sep 17 00:00:00 2001 From: wangli Date: Sat, 6 Sep 2025 11:31:06 +0800 Subject: [PATCH 06/10] =?UTF-8?q?fix=20-=20=E8=B0=83=E6=95=B4=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=9B=A0=E6=95=B0=E6=8D=AE=E5=AD=97=E6=AE=B5=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E4=B8=8D=E8=83=BD=E4=B8=BA=E7=A9=BA=E5=90=8E?= =?UTF-8?q?=E5=BC=95=E8=B5=B7=E7=9A=84=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java | 1 + .../cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java index 4a73e1529..08c18a822 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java @@ -55,6 +55,7 @@ public class CustomAddTimerJobCmd extends AbstractCommand implements Seria job.setActivityId(dto.getActivityId()); job.setActivityName(dto.getActivityName()); job.setAlterTime(alterTime); + job.setException(""); service.save(job); return null; diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java index eb86d63c0..f3c95a685 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java @@ -89,7 +89,7 @@ public class NodeAlterJobHandler extends IJobHandler { Optional category = categoryService.get(BPM_MODEL_CATEGORY, processInstance.getProcessDefinitionKey()); -// sendAlter(processInstance, category, e, tasks.get(0)); + sendAlter(processInstance, category, e, tasks.get(0)); executedJobs.add(e); XxlJobHelper.log("end execution of job: {}", JSON.toJSONString(e)); From 7c60c3c179d9e3e186cf04c16a4e8c750d124d68 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 8 Sep 2025 11:28:48 +0800 Subject: [PATCH 07/10] =?UTF-8?q?fix=20-=20=E6=B7=BB=E5=8A=A0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=91=8A=E8=AD=A6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java | 2 +- .../workflow/server/common/config/XxlJobConfiguration.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java index 08c18a822..99edf3998 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomAddTimerJobCmd.java @@ -38,7 +38,7 @@ public class CustomAddTimerJobCmd extends AbstractCommand implements Seria Date alterTime; switch (dto.getTimeUnit()) { case "M": - alterTime = DateUtil.offsetDay(new Date(), dto.getDelayTime()); + alterTime = DateUtil.offsetMinute(new Date(), dto.getDelayTime()); break; case "H": alterTime = DateUtil.offsetHour(new Date(), dto.getDelayTime()); diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/config/XxlJobConfiguration.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/config/XxlJobConfiguration.java index 42c4500b3..dedea0c35 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/config/XxlJobConfiguration.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/config/XxlJobConfiguration.java @@ -1,6 +1,5 @@ package cn.axzo.workflow.server.common.config; -import cn.azxo.framework.common.annotation.OnlyPodsEnvironment; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +13,7 @@ import org.springframework.context.annotation.Configuration; * @author wangli * @since 2024/4/28 14:02 */ -@OnlyPodsEnvironment +//@OnlyPodsEnvironment @Configuration public class XxlJobConfiguration { Logger logger = LoggerFactory.getLogger(XxlJobConfiguration.class); From 0600c5c65b8e0e19ef793eb029eafe5329ecc61b Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 8 Sep 2025 11:29:05 +0800 Subject: [PATCH 08/10] =?UTF-8?q?fix=20-=20=E6=B7=BB=E5=8A=A0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=91=8A=E8=AD=A6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/server/common/config/XxlJobConfiguration.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/config/XxlJobConfiguration.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/config/XxlJobConfiguration.java index dedea0c35..42c4500b3 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/config/XxlJobConfiguration.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/common/config/XxlJobConfiguration.java @@ -1,5 +1,6 @@ package cn.axzo.workflow.server.common.config; +import cn.azxo.framework.common.annotation.OnlyPodsEnvironment; import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,7 +14,7 @@ import org.springframework.context.annotation.Configuration; * @author wangli * @since 2024/4/28 14:02 */ -//@OnlyPodsEnvironment +@OnlyPodsEnvironment @Configuration public class XxlJobConfiguration { Logger logger = LoggerFactory.getLogger(XxlJobConfiguration.class); From 7d75eccfc2716608af12e2f855bb40857cc54eac Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Mon, 8 Sep 2025 11:44:42 +0800 Subject: [PATCH 09/10] =?UTF-8?q?fix=20-=20=E6=B7=BB=E5=8A=A0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=91=8A=E8=AD=A6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/workflow/server/xxljob/NodeAlterJobHandler.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java index f3c95a685..6b0944db4 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java @@ -18,6 +18,7 @@ import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.ListUtils; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.runtime.ProcessInstance; @@ -68,6 +69,12 @@ public class NodeAlterJobHandler extends IJobHandler { jobs.forEach(e -> { XxlJobHelper.log("start execution of job: {}", JSON.toJSONString(e)); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(e.getProcessInstanceId()).singleResult(); + if (!refreshProperties.getAlterAllDefinitionKey()) { + if (!ListUtils.emptyIfNull(refreshProperties.getAlterDefinitionKeys()).contains(processInstance.getProcessDefinitionKey())) { + XxlJobHelper.log("skip alter by config"); + return; + } + } if (Objects.isNull(processInstance)) { executedJobs.add(e); return; From d14696f8d68cf6555021f0cde83a952fd4ddd0d9 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 12 Sep 2025 10:20:15 +0800 Subject: [PATCH 10/10] =?UTF-8?q?fix=20-=20=E5=A4=84=E7=90=86XXL=E2=80=94?= =?UTF-8?q?=E2=80=94JOB=20=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/workflow/server/xxljob/NodeAlterJobHandler.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java index 6b0944db4..8b30ea034 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/xxljob/NodeAlterJobHandler.java @@ -69,16 +69,16 @@ public class NodeAlterJobHandler extends IJobHandler { jobs.forEach(e -> { XxlJobHelper.log("start execution of job: {}", JSON.toJSONString(e)); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(e.getProcessInstanceId()).singleResult(); + if (Objects.isNull(processInstance)) { + executedJobs.add(e); + return; + } if (!refreshProperties.getAlterAllDefinitionKey()) { if (!ListUtils.emptyIfNull(refreshProperties.getAlterDefinitionKeys()).contains(processInstance.getProcessDefinitionKey())) { XxlJobHelper.log("skip alter by config"); return; } } - if (Objects.isNull(processInstance)) { - executedJobs.add(e); - return; - } List tasks = taskService.createTaskQuery() .processInstanceId(e.getProcessInstanceId()) .taskDefinitionKey(e.getActivityId())