feat(REQ-7125) - 调整中止文案为终止

This commit is contained in:
wangli 2026-02-27 15:45:32 +08:00
parent ae5048c6b2
commit f7c83133c7
29 changed files with 62 additions and 63 deletions

View File

@ -26,8 +26,8 @@
> - 支持“政务”类型的模型管理。
> - 支持模型批量控制和手写签名的控制。
> - 新增转交、加签、止功能的异步支持。
> - 新增批量转交和止的功能支持。
> - 新增转交、加签、止功能的异步支持。
> - 新增批量转交和止的功能支持。
> - 优化引擎内部异步任务携带真实的 traceId。
### 1.3.2-SNAPSHOT
@ -50,7 +50,7 @@
> - 重构审批日志的模型, 形成统一标准
> - 新增评论功能,并支持在评论中上传图片/附件和链接
> - 新增审批分类以及分类的黑白名单配置功能
> - 新增系统止流程的功能
> - 新增系统止流程的功能
> - 新增机器人节点
> - 优化 Activity 活动事件, 确保在多实例状态下, 更符合业务逻辑的执行
> - 其他小细节的功能优化

View File

@ -76,7 +76,7 @@ act_ge_bytearray (很多元数据)
| 催办 | 对于时效要求高的流程,发起人可催办提醒当前节点处理人,一般以消息通知方式提醒处理人 |
| 撤销 | 发起人操作,可以撤销当前流程 |
| 取回 | 当前节点上一节点处理人操作,当前节点处理人还未处理,上一节点处理人可以将其退回自己手中重新操作(取回重办) |
| 中止 | 当前节点处理人,中止当前流程 |
| 终止 | 当前节点处理人,终止当前流程 |
| 抄送 | 当前节点处理人,处理完成之后将处理结果抄送给其他人,这里创建备注信息,并给所有抄送人创建子任务(待阅),子任务不影响流程流转 |
| 向前加签 | 当前节点处理人,需要让其他人核对流程,其他人核对完成后,回到当前节点处理人手中,当前节点处理人处理完后进入下一节点 |
| 向后加签 | 当前节点处理人,需要让其他人核对流程,其他人核对完成后,直接进入下一节点 |
@ -86,7 +86,7 @@ act_ge_bytearray (很多元数据)
## 4. 如何配置一个流程?
> 流程的运行依赖一种规则,得让引擎知道何时开始执行流程? 何时止? 如何识别和控制每个步骤该怎么处理? 执行过程中如何走向不同的路径?
> 流程的运行依赖一种规则,得让引擎知道何时开始执行流程? 何时止? 如何识别和控制每个步骤该怎么处理? 执行过程中如何走向不同的路径?
> 比如: 我们常见的需求, 某个节点需要会签/或签, 或者某个节点需要判断条件是否执行该步骤等等.
>
> 以上这些规则都需要再创建流程实例时, 提前就告诉引擎, 且运行过程和步骤中是不可变的. 引擎自己也未提供相应能力.

View File

@ -17,7 +17,6 @@ import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.ASYNC;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
/**
@ -57,7 +56,7 @@ public interface ProcessActivityApi {
* <p>
* 当模型中使用了业务节点且设置了业务指定审批人模式则当业务监听到 PROCESS_ACTIVITY_WAIT_ASSIGNEE 事件时可通过该接口设置动态设置审批人
* <p>
* <strong color=orange>注意如果调用接口时传入的审批人集合为空流程引擎将对该审批流程实例自动</strong>
* <strong color=orange>注意如果调用接口时传入的审批人集合为空流程引擎将对该审批流程实例自动</strong>
*
* @param dto
* @return

View File

@ -115,23 +115,23 @@ public interface ProcessInstanceApi {
CommonResponse<Boolean> superCancelProcessInstance(@Validated @RequestBody SuperBpmnProcessInstanceCancelDTO dto);
/**
* 止流程实例
* 止流程实例
*
* @param dto
* @return
*/
@Operation(summary = "止流程实例")
@Operation(summary = "止流程实例")
@DeleteMapping("/api/process/instance/abort")
@InvokeMode(ASYNC)
CommonResponse<Boolean> abortProcessInstance(@Validated @RequestBody BpmnProcessInstanceAbortDTO dto);
/**
* 批量止流程实例
* 批量止流程实例
*
* @param dtos
* @return
*/
@Operation(summary = "批量止流程实例")
@Operation(summary = "批量止流程实例")
@DeleteMapping("/api/process/instance/batch/abort")
@InvokeMode(ASYNC)
CommonResponse<BatchOperationResultVO> batchAbortProcessInstance(@Validated @RequestBody List<BpmnProcessInstanceAbortDTO> dtos);

View File

@ -20,7 +20,7 @@ public enum BpmnInstanceRespCode implements IModuleRespCode {
PROCESS_INSTANCE_ID_NOT_EXISTS("005", "流程实例【{}】不存在"),
PROCESS_INSTANCE_CANCELLED("006", "流程实例已撤回"),
PROCESS_INSTANCE_CANT_CANCEL("007", "流程实例不能撤回"),
PROCESS_INSTANCE_CANT_ABORT("008", "流程实例不能"),
PROCESS_INSTANCE_CANT_ABORT("008", "流程实例不能"),
PROCESS_INSTANCE_CANT_UPDATE("009", "流程实例不能更新"),
PROCESS_INSTANCE_CANT_DELETE("010", "流程实例不能删除"),
PROCESS_INSTANCE_CANT_START("011", "流程实例不能启动"),

View File

@ -27,7 +27,7 @@ public interface BpmnConstants {
String INTERNAL_PROCESS_TYPE_REJECT = "[_INTERNAL_PROCESS_TYPE_REJECT_]";
String INTERNAL_PROCESS_TYPE_ABORT = "[_INTERNAL_PROCESS_TYPE_ABORT_]";
String INTERNAL_SPECIFY_NEXT_APPROVER = "[_INTERNAL_SPECIFY_NEXT_APPROVER_]";
// 取消/驳回/止时,记录原因
// 取消/驳回/止时,记录原因
String INTERNAL_PROCESS_DELETE_REASON = "[_INTERNAL_PROCESS_DELETE_REASON_]";
String BIZ_ORG_RELATION = "[_BIZ_ORG_RELATION_]";
String PENDING_TEMPLATE_VARIABLE = "[_PENDING_VARIABLES]";

View File

@ -24,7 +24,7 @@ public enum BpmnFlowNodeType {
NODE_TRIGGER("NODE_TRIGGER", "触发器节点"),
NODE_ROBOT("NODE_ROBOT", "机器人节点"),
NODE_COMMENT("NODE_COMMENT", "评论节点"),
NODE_ABORT("NODE_ABORT", "止节点"),
NODE_ABORT("NODE_ABORT", "止节点"),
NODE_ALTER("NODE_ALTER", "告警节点"),
NODE_CANCEL("NODE_CANCEL", "撤回节点"),
NODE_EMPTY("NODE_EMPTY", "空节点"),

View File

@ -13,7 +13,7 @@ public enum BpmnProcessInstanceResultEnum {
REJECTED("REJECTED", "已驳回"),
BACKED("BACKED", "已回退"),
CANCELLED("CANCELLED", "已撤回"),
ABORTED("ABORTED", ""),
ABORTED("ABORTED", ""),
TRANSFER("TRANSFER", "已转交"),
COUNTERSIGN("COUNTERSIGN", "已加签"),
UPGRADED("UPGRADED", "已提级"),

View File

@ -14,7 +14,7 @@ public enum ProcessInstanceEventEnum {
PROCESS_INSTANCE_STARTED("process-instance", "process-instance-started", "流程实例已开始"),
PROCESS_INSTANCE_CANCELLED("process-instance", "process-instance-cancelled", "流程实例已撤回"),
PROCESS_INSTANCE_REJECTED("process-instance", "process-instance-rejected", "流程实例已驳回"),
PROCESS_INSTANCE_ABORTED("process-instance", "process-instance-aborted", "流程实例已"),
PROCESS_INSTANCE_ABORTED("process-instance", "process-instance-aborted", "流程实例已"),
PROCESS_INSTANCE_COMPLETED("process-instance", "process-instance-completed", "流程实例已结束"),
;
private final String module;

View File

@ -18,12 +18,12 @@ import javax.validation.constraints.Size;
import java.util.List;
/**
* 止流程实例的入参模型
* 止流程实例的入参模型
*
* @author wangli
* @since 2024/1/2 17:49
*/
@ApiModel("止流程实例的入参模型")
@ApiModel("止流程实例的入参模型")
@Data
@AllArgsConstructor
@NoArgsConstructor
@ -45,11 +45,11 @@ public class BpmnProcessInstanceAbortDTO {
private String tenantId;
/**
* 止原因
* 止原因
*/
@ApiModelProperty(value = "止原因")
@NotBlank(message = "止原因不能为空")
@Length(max = 100, message = "止原因长度不能超过 100 个字符")
@ApiModelProperty(value = "止原因")
@NotBlank(message = "止原因不能为空")
@Length(max = 100, message = "止原因长度不能超过 100 个字符")
private String reason;
/**
@ -57,7 +57,7 @@ public class BpmnProcessInstanceAbortDTO {
* advice 统一均为审批节点的审批意见一般为用户在同意驳回时填写的内容
* 有值时在日志中一般出现在 operationDesc 的下方
*/
@ApiModelProperty(value = "止意见")
@ApiModelProperty(value = "止意见")
private String advice;
/**
@ -73,14 +73,14 @@ public class BpmnProcessInstanceAbortDTO {
private List<AttachmentDTO> attachmentList;
/**
* 止节点的名称
* 为空时则默认展示为系统
* 止节点的名称
* 为空时则默认展示为系统
*/
@ApiModelProperty(value = "止节点名称")
@ApiModelProperty(value = "止节点名称")
private String nodeName;
/**
* 指定止的操作人信息
* 指定止的操作人信息
* <p>
* 只能是 axzo 平台存在的人
*/

View File

@ -49,7 +49,7 @@ public class BpmnActivitySetAssigneeDTO {
/**
* 需要设置的审批人, 业务侧自行去重, 请根据 personId 进行去重, 如果发现有重复, 并抛出异常.
* <p>
* 业务如果传入的 assigners 集合为空, 引擎则会对该流程进行自动止处理且驳回意见为业务未指定审批人
* 业务如果传入的 assigners 集合为空, 引擎则会对该流程进行自动止处理且驳回意见为业务未指定审批人
*/
@ApiModelProperty(value = "审批人集合信息", notes = "业务传参时,需要注意去重")
@Size(max = 60, message = "指定审批人数量限制为60")

View File

@ -99,7 +99,7 @@ public class ProcessInstanceDTO implements Serializable {
/**
* 对流程实例做否定操作时的原因
* <p>
* : /驳回/撤回功能
* : /驳回/撤回功能
*/
private String reason;

View File

@ -41,7 +41,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.completeV
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVirtualTask;
/**
* 自定义的止流程实例的命令实现
* 自定义的止流程实例的命令实现
*
* @author wangli
* @since 2024/1/2 18:19
@ -63,7 +63,7 @@ public class CustomAbortProcessInstanceCmd extends AbstractCommand<Void> impleme
this.tenantId = dto.getTenantId();
this.reason = dto.getReason();
this.attachmentList = dto.getAttachmentList();
this.nodeName = StringUtils.hasText(dto.getNodeName()) ? dto.getNodeName() : "系统";
this.nodeName = StringUtils.hasText(dto.getNodeName()) ? dto.getNodeName() : "系统";
this.assigner = Objects.nonNull(dto.getAssigner()) ? dto.getAssigner() :
BpmnTaskDelegateAssigner.buildDummyAssigner("system", TASK_ASSIGNEE_SKIP_FLAT, "");
this.signatureUrl = dto.getSignatureUrl();

View File

@ -249,12 +249,12 @@ public class EngineExecutionStartListener implements ExecutionListener {
execution, true));
}
finalEmptyAssigneeHandle(assigners, userTask, execution, "未找到审批人且转交管理员失败,自动", "karma: " + (refreshProperties.getUseNewToAdminApi() ? "api/flow/listTaskAssignerAdmin/v2" : "api/flow/listTaskAssignerAdmin"));
finalEmptyAssigneeHandle(assigners, userTask, execution, "未找到审批人且转交管理员失败,自动", "karma: " + (refreshProperties.getUseNewToAdminApi() ? "api/flow/listTaskAssignerAdmin/v2" : "api/flow/listTaskAssignerAdmin"));
break;
case specifyAssignee:
assigners.addAll(approverSelect(ApproverEmptyHandleTypeEnum.specifyAssignee.getType(), userTask,
execution, true));
finalEmptyAssigneeHandle(assigners, userTask, execution, "转交指定人员失败,自动", "org-gateway: api/node-user/list");
finalEmptyAssigneeHandle(assigners, userTask, execution, "转交指定人员失败,自动", "org-gateway: api/node-user/list");
break;
default:
break;

View File

@ -42,7 +42,7 @@ public interface BpmnProcessEventListener extends OperationContext, Ordered {
default void onRejected(FlowableCancelledEvent event) {}
/**
* 流程实例被止后回调
* 流程实例被止后回调
*
* @param event
*/

View File

@ -56,7 +56,7 @@ public interface BpmnProcessInstanceService {
Boolean cancelProcessInstance(SuperBpmnProcessInstanceCancelDTO processInstanceCancelDTO);
/**
* 止流程实例
* 止流程实例
*
* @param dto
* @return
@ -64,7 +64,7 @@ public interface BpmnProcessInstanceService {
Boolean abortProcessInstance(BpmnProcessInstanceAbortDTO dto);
/**
* 批量止流程实例
* 批量止流程实例
*
* @param dtos
* @return

View File

@ -1707,7 +1707,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
build.setOperationDesc("待审批");
break;
case transferToAdmin:
build.setOperationDesc("找不到审批人且转交管理员失败,自动");
build.setOperationDesc("找不到审批人且转交管理员失败,自动");
break;
case human:
if (Objects.equals(e.getNodeMode(), EXCEPTIONAL)) {

View File

@ -18,7 +18,7 @@ import java.sql.SQLIntegrityConstraintViolationException;
* 处理多个接口同时操作一个流程实例时可能会抛出数据库的异常这种异常是可以被忽略的
* <p>
* 例如 {@link ProcessActivityApi#setAssignee(BpmnActivitySetAssigneeDTO)} {@link ProcessInstanceApi#abortProcessInstance(BpmnProcessInstanceAbortDTO)}
* 两个接口并发访问时由于 abort 先执行完并提交事务后setAssignee 方法内虽然有判断实例状态但最后事务提交时突然发现实例状态被止了就会抛出异常
* 两个接口并发访问时由于 abort 先执行完并提交事务后setAssignee 方法内虽然有判断实例状态但最后事务提交时突然发现实例状态被止了就会抛出异常
*
* @author wangli
* @since 2024/6/20 09:42

View File

@ -221,7 +221,7 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
.setType(PROCESS_INSTANCE_ABORTED)
.setCategory(deployment.getKey())
.setProcessInstanceId(event.getProcessInstanceId())
.setCurrentElementKey("止流程实例无节点信息")
.setCurrentElementKey("止流程实例无节点信息")
.setProcessDefinitionId(event.getProcessDefinitionId())
.setProcessDefinitionKey(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getProcessDefinitionKey())
.setProcessDefinitionVersion(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getProcessDefinitionVersion())

View File

@ -57,7 +57,7 @@ public class SyncToEsProcessEventListener extends AbstractBpmnEventListener<Proc
}
/**
* 流程实例被止后回调
* 流程实例被止后回调
*
* @param event
*/

View File

@ -170,18 +170,18 @@ public class TestController {
.startedBefore(new Date(timestamp))
.unfinished()
.list();
log.info("待系统止的流程实例数: {}", list.size());
log.info("待系统止的流程实例数: {}", list.size());
ExecutorService executorService = Executors.newFixedThreadPool(3);
list.forEach(i -> {
executorService.submit(() -> {
try {
log.info("当前止的流程: {}", i.getId());
log.info("当前止的流程: {}", i.getId());
BpmnProcessInstanceAbortDTO abort = new BpmnProcessInstanceAbortDTO();
abort.setProcessInstanceId(i.getId());
abort.setReason("系统超时");
abort.setReason("系统超时");
bpmnProcessInstanceService.abortProcessInstance(abort);
} catch (Exception e) {
log.warn("系统批量止流程: {}, 发生异常: {}", i.getId(), e.getMessage());
log.warn("系统批量止流程: {}, 发生异常: {}", i.getId(), e.getMessage());
}
});
});

View File

@ -225,33 +225,33 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
}
/**
* 止流程实例
* 止流程实例
*
* @param dto
* @return
*/
@Operation(summary = "止流程实例")
@Operation(summary = "止流程实例")
@Override
@DeleteMapping("/abort")
@RepeatSubmit
public CommonResponse<Boolean> abortProcessInstance(@Validated @RequestBody BpmnProcessInstanceAbortDTO dto) {
log.info("止流程实例abortProcessInstant===>>>参数:{}", JSONUtil.toJsonStr(dto));
log.info("止流程实例abortProcessInstant===>>>参数:{}", JSONUtil.toJsonStr(dto));
populateUsersAvatar(dto.getAssigner());
return success(bpmnProcessInstanceService.abortProcessInstance(dto));
}
/**
* 批量止流程实例
* 批量止流程实例
*
* @param dtos 请求参数
* @return
*/
@Operation(summary = "批量止流程实例")
@Operation(summary = "批量止流程实例")
@Override
@DeleteMapping("/batch/abort")
@RepeatSubmit
public CommonResponse<BatchOperationResultVO> batchAbortProcessInstance(@Validated @RequestBody List<BpmnProcessInstanceAbortDTO> dtos) {
log.info("批量止流程实例abortProcessInstants===>>>参数:{}", JSONUtil.toJsonStr(dtos));
log.info("批量止流程实例abortProcessInstants===>>>参数:{}", JSONUtil.toJsonStr(dtos));
return success(bpmnProcessInstanceService.batchAbortProcessInstance(dtos));
}

View File

@ -79,7 +79,7 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprova
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
/**
* 同意评论加签转交驳回撤回抄送
* 同意评论加签转交驳回撤回抄送
* <p>
* 回退
*

View File

@ -184,7 +184,7 @@ public class DangerSuperOperationJobHandler extends IJobHandler {
CANCEL, // 撤销任务
APPROVE, // 同意任务
REJECT, // 拒绝任务
ABORT, // 止实例
ABORT, // 止实例
RESUMER_DEADLINE_JOB, // 一般是因为二方计算人异常导致卡节点
}
}

View File

@ -206,7 +206,7 @@
<option value="CANCEL">撤回实例</option>
<option value="APPROVE">同意任务</option>
<option value="REJECT">拒绝任务</option>
<option value="ABORT">止实例</option>
<option value="ABORT">止实例</option>
<option value="RESUMER_DEADLINE_JOB">恢复节点</option>
</select>
<div
@ -297,7 +297,7 @@
<ul class="text-sm text-gray-600 space-y-1 list-disc list-inside">
<li>撤回实例:需要提供流程实例编号,可选择填写意见</li>
<li>同意/拒绝任务需要提供流程实例编号和处理人ID</li>
<li>中止实例:需要提供流程实例编号和中止原因</li>
<li>终止实例:需要提供流程实例编号和终止原因</li>
<li>恢复节点:仅需要提供流程实例编号</li>
</ul>
</div>
@ -473,7 +473,7 @@
personId.required = true;
break;
case 'ABORT': // 止实例
case 'ABORT': // 止实例
showElement(commentGroup);
commentRequired.classList.remove('hidden');
comment.required = true;

View File

@ -13,7 +13,7 @@
2. ProcessTaskListener
3. ProcessActivityListener
4. MessageNotificationListener
- 内部与工作流的数据交互,也将异步解耦,确保在调用对端服务时,不会因为对端服务止而失败。
- 内部与工作流的数据交互,也将异步解耦,确保在调用对端服务时,不会因为对端服务止而失败。
- 接口需要有分类:
1. 部分接口仅支持同步调
2. 大部分接口支持同步和异步调用,

View File

@ -146,7 +146,7 @@ public interface WorkflowCoreService {
* <p>
* 当模型中使用了业务节点且设置了业务指定审批人模式则当业务监听到 PROCESS_ACTIVITY_WAIT_ASSIGNEE 事件时可通过该接口设置动态设置审批人
* <p>
* <strong color=orange>注意如果调用接口时传入的审批人集合为空流程引擎将对该审批流程实例自动</strong>
* <strong color=orange>注意如果调用接口时传入的审批人集合为空流程引擎将对该审批流程实例自动</strong>
*
* @param dto
* @return
@ -280,23 +280,23 @@ public interface WorkflowCoreService {
Boolean cancelProcessInstance(@Validated @RequestBody BpmnProcessInstanceCancelDTO dto);
/**
* 止流程实例
* 止流程实例
*
* @param dto
* @return
*/
@Operation(summary = "止流程实例")
@Operation(summary = "止流程实例")
@DeleteMapping("/api/process/instance/abort")
@InvokeMode(ASYNC)
Boolean abortProcessInstance(@Validated @RequestBody BpmnProcessInstanceAbortDTO dto);
/**
* 批量止流程实例
* 批量止流程实例
*
* @param dtos
* @return
*/
@Operation(summary = "批量止流程实例")
@Operation(summary = "批量止流程实例")
@DeleteMapping("/api/process/instance/batch/abort")
@InvokeMode(ASYNC)
BatchOperationResultVO batchAbortProcessInstance(@Validated @RequestBody List<BpmnProcessInstanceAbortDTO> dtos);

View File

@ -42,7 +42,7 @@ public abstract class AbstractProcessInstanceEventHandler implements ProcessInst
public abstract void onPassed(ProcessInstanceDTO dto, BpmnProcessInstanceResultEnum resultEnum);
/**
* 审批不通过的回调该接口会将 撤销驳回 事件归拢到一起处理
* 审批不通过的回调该接口会将 撤销驳回 事件归拢到一起处理
* <p>
* 如业务需要可以在实现类中根据不同的 resultEnum 进行区分处理或者实现类直接实现 {@link ProcessInstanceEventHandler} 接口
*

View File

@ -76,7 +76,7 @@ public interface ProcessInstanceEventHandler extends Ordered {
}
/**
* 流程实例被止后回调
* 流程实例被止后回调
* <p>
* 一般由接入方主动触发比如调用了 {@link ProcessInstanceApi#abortProcessInstance(BpmnProcessInstanceAbortDTO)} 方法等
*