Merge remote-tracking branch 'origin/feature/REQ-4418'
# Conflicts: # workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomActivityTriggerCmd.java # workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/TestController.java
This commit is contained in:
commit
70086f0b87
5
pom.xml
5
pom.xml
@ -16,7 +16,7 @@
|
||||
<name>Workflow Engine</name>
|
||||
|
||||
<properties>
|
||||
<revision>1.5.3-SNAPSHOT</revision>
|
||||
<revision>1.5.4-SNAPSHOT</revision>
|
||||
<axzo-bom.version>2.0.0-SNAPSHOT</axzo-bom.version>
|
||||
<axzo-dependencies.version>2.0.0-SNAPSHOT</axzo-dependencies.version>
|
||||
<axzo-dependencies.org.version>1.0.0-SNAPSHOT</axzo-dependencies.org.version>
|
||||
@ -31,6 +31,7 @@
|
||||
<elasticsearch.version>7.10.2</elasticsearch.version>
|
||||
<easy-es.version>2.0.0</easy-es.version>
|
||||
<xxl-job.version>2.5.0</xxl-job.version>
|
||||
<workflow-engine-common.version>0.0.1-SNAPSHOT</workflow-engine-common.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
@ -74,7 +75,7 @@
|
||||
<dependency>
|
||||
<groupId>${project.groupId}</groupId>
|
||||
<artifactId>workflow-engine-common</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<version>${workflow-engine-common.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>${project.groupId}</groupId>
|
||||
|
||||
@ -21,7 +21,7 @@
|
||||
<dependency>
|
||||
<groupId>${project.groupId}</groupId>
|
||||
<artifactId>workflow-engine-common</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<version>${workflow-engine-common.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.github.openfeign</groupId>
|
||||
|
||||
@ -17,6 +17,7 @@ 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;
|
||||
|
||||
/**
|
||||
@ -36,6 +37,7 @@ public interface ProcessActivityApi {
|
||||
*/
|
||||
@Deprecated
|
||||
@GetMapping("/api/process/activity/trigger")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Boolean> trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId);
|
||||
|
||||
@ -46,6 +48,7 @@ public interface ProcessActivityApi {
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/process/activity/trigger")
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Boolean> trigger(@Validated @RequestBody BpmnActivityTriggerDTO dto);
|
||||
|
||||
|
||||
@ -61,6 +64,7 @@ public interface ProcessActivityApi {
|
||||
*/
|
||||
@PostMapping("/api/process/activity/assignee/set")
|
||||
@Operation(summary = "业务节点设置审批人,不支持重复调用设置审批人,需一次性传入所有审批人")
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Boolean> setAssignee(@Validated @RequestBody BpmnActivitySetAssigneeDTO dto);
|
||||
|
||||
/**
|
||||
@ -69,8 +73,8 @@ public interface ProcessActivityApi {
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/process/activity/timeout/trigger")
|
||||
@Manageable
|
||||
@Operation(summary = "设置指定业务节点定时继续往下执行")
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Boolean> setTimeoutTrigger(@Validated @RequestBody BpmnActivityTimeoutTriggerDTO dto);
|
||||
|
||||
/**
|
||||
@ -78,8 +82,8 @@ public interface ProcessActivityApi {
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Manageable
|
||||
@PostMapping("/api/process/activity/timeout/callback")
|
||||
@Operation(summary = "设置指定业务节点定时回调")
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Boolean> setTimeoutCallback(@Validated @RequestBody BpmnActivityTimeoutCallbackDTO dto);
|
||||
}
|
||||
|
||||
@ -9,6 +9,7 @@ import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCancelDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
|
||||
@ -50,6 +51,7 @@ import javax.validation.constraints.NotNull;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.ASYNC;
|
||||
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
|
||||
|
||||
/**
|
||||
@ -103,6 +105,7 @@ public interface ProcessInstanceApi {
|
||||
*/
|
||||
@Operation(summary = "发起人主动撤回审核,MQ 触发规则:1. 当前流程实例中现存的任务会依次触发 process-task-deleted 事件,2. 当前流程实例会触发 process-instance-cancelled 事件")
|
||||
@DeleteMapping("/api/process/instance/cancel")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> cancelProcessInstance(@Validated @RequestBody BpmnProcessInstanceCancelDTO dto);
|
||||
|
||||
@DeleteMapping("/api/process/instance/super/cancel")
|
||||
@ -117,6 +120,7 @@ public interface ProcessInstanceApi {
|
||||
*/
|
||||
@Operation(summary = "中止流程实例")
|
||||
@DeleteMapping("/api/process/instance/abort")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> abortProcessInstance(@Validated @RequestBody BpmnProcessInstanceAbortDTO dto);
|
||||
|
||||
/**
|
||||
@ -127,6 +131,7 @@ public interface ProcessInstanceApi {
|
||||
*/
|
||||
@Operation(summary = "批量中止流程实例")
|
||||
@DeleteMapping("/api/process/instance/batch/abort")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<BatchOperationResultVO> batchAbortProcessInstance(@Validated @RequestBody List<BpmnProcessInstanceAbortDTO> dtos);
|
||||
|
||||
/**
|
||||
@ -151,6 +156,17 @@ public interface ProcessInstanceApi {
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<BpmnProcessInstanceVO> getProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceQueryDTO dto);
|
||||
|
||||
/**
|
||||
* 批量获得流程实例
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "批量获得流程实例")
|
||||
@PostMapping("/api/process/instance/batch/get")
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<List<BpmnProcessInstanceVO>> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto);
|
||||
|
||||
/**
|
||||
* 获取指定流程实例的流程变量
|
||||
*
|
||||
@ -257,7 +273,6 @@ public interface ProcessInstanceApi {
|
||||
*/
|
||||
@Operation(summary = "校验指定流程实例下,是否存在指定的审批人")
|
||||
@PostMapping("/api/process/instance/check/approver")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Boolean> checkInstanceApprover(@Validated @RequestBody BpmnProcessInstanceCheckApproverDTO dto);
|
||||
|
||||
|
||||
@ -16,7 +16,6 @@ import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocStatusDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocTenantQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.RestPrintTemplateConfigDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelDetailVO;
|
||||
@ -220,17 +219,6 @@ public interface ProcessModelApi {
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<List<String>> getModelTenantIds();
|
||||
|
||||
/**
|
||||
* 打印模板配置内容更新保存
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "打印模板配置内容更新保存")
|
||||
@PostMapping("/api/process/model/print/template/upsert")
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Void> printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto);
|
||||
|
||||
/**
|
||||
* 获取打印模板配置内容
|
||||
*
|
||||
|
||||
@ -38,6 +38,7 @@ import javax.validation.constraints.NotEmpty;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.ASYNC;
|
||||
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
|
||||
|
||||
|
||||
@ -64,6 +65,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "同意,MQ 触发规则:1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件),2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件,2.2. 流程实例正常结束会触发 process-instance-completed 事件")
|
||||
@PostMapping("/api/process/task/approve")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> approveTask(@Validated @RequestBody BpmnTaskAuditDTO dto);
|
||||
|
||||
/**
|
||||
@ -74,6 +76,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "同意时并提交表单")
|
||||
@PostMapping("/api/process/task/form/approve")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> approveTaskWithForm(@Validated @RequestBody BpmnTaskAuditWithFormDTO dto);
|
||||
|
||||
/**
|
||||
@ -84,6 +87,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "批量同意")
|
||||
@PostMapping("/api/process/task/batch/approve")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<BatchOperationResultVO> batchApproveTask(@Validated @RequestBody List<BpmnTaskAuditDTO> dtos);
|
||||
|
||||
/**
|
||||
@ -94,6 +98,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "获取当前节点可回退节点选项列表")
|
||||
@GetMapping("/api/process/task/back/optional/nodes")
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<List<BpmnOptionalNodeDTO>> getBackOptionalNodes(@RequestParam @NotBlank(message = "任务id不能为空") String taskId);
|
||||
|
||||
/**
|
||||
@ -104,6 +109,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "回退")
|
||||
@PostMapping("/api/process/task/back")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> backTask(@Validated @RequestBody BpmnTaskBackAuditDTO dto);
|
||||
|
||||
/**
|
||||
@ -114,6 +120,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "系统操作回退任务到指定节点")
|
||||
@PostMapping("/api/process/task/system/back")
|
||||
@Manageable
|
||||
CommonResponse<Boolean> systemBackTask(@Validated @RequestBody BpmnNodeBackSystemOperateDTO dto);
|
||||
|
||||
/**
|
||||
@ -127,6 +134,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "驳回,MQ 触发规则:1. 当前审批任务会触发 process-task-deleted 事件, 2. 当前流程实例会触发 process-instance-rejected 事件")
|
||||
@PostMapping("/api/process/task/reject")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> rejectTask(@Validated @RequestBody BpmnTaskAuditDTO dto);
|
||||
|
||||
/**
|
||||
@ -136,6 +144,7 @@ public interface ProcessTaskApi {
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/process/task/batch/reject")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<BatchOperationResultVO> batchRejectTask(@Validated @RequestBody List<BpmnTaskAuditDTO> dtos);
|
||||
|
||||
/**
|
||||
@ -146,6 +155,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "直接修改审批任务的审批人")
|
||||
@PostMapping("/api/process/task/transfer")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> transferTask(@Validated @RequestBody BpmnTaskTransferDTO dto);
|
||||
|
||||
/**
|
||||
@ -156,6 +166,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "批量修改审批任务的审批人")
|
||||
@PostMapping("/api/process/task/batch/transfer")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<BatchOperationResultVO> batchTransferTask(@Validated @RequestBody List<BpmnTaskTransferDTO> dtos);
|
||||
|
||||
/**
|
||||
@ -166,6 +177,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "审批流程评论")
|
||||
@PostMapping("/api/process/task/comment")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> commentTask(@Validated @RequestBody BpmnTaskCommentDTO dto);
|
||||
|
||||
/**
|
||||
@ -176,6 +188,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "审批流程加签")
|
||||
@PostMapping("/api/process/task/countersign")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> countersignTask(@Validated @RequestBody BpmnTaskCountersignDTO dto);
|
||||
|
||||
/**
|
||||
@ -186,6 +199,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "重置节点审批人(提级审批)")
|
||||
@PostMapping("/api/process/task/approvers/reset")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> resetTaskApprovers(@Validated @RequestBody BpmnTaskResetApproversDTO dto);
|
||||
|
||||
/**
|
||||
@ -196,7 +210,6 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "审批流程催办")
|
||||
@PostMapping("/api/process/task/remind")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Boolean> remindTask(@Validated @RequestBody BpmnTaskRemindDTO dto);
|
||||
|
||||
@ -208,6 +221,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "创建机器人节点, 暂停流程任务")
|
||||
@PostMapping("/api/process/task/robot/create")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<String> createRobotTask(@Validated @RequestBody BpmnRobotTaskCreateDTO dto);
|
||||
|
||||
/**
|
||||
@ -218,6 +232,7 @@ public interface ProcessTaskApi {
|
||||
*/
|
||||
@Operation(summary = "完成机器人节点, 继续流程任务")
|
||||
@PostMapping("/api/process/task/robot/complete")
|
||||
@InvokeMode(ASYNC)
|
||||
CommonResponse<Boolean> completeRobotTask(@Validated @RequestBody BpmnRobotTaskCompleteDTO dto);
|
||||
|
||||
/**
|
||||
|
||||
@ -5,6 +5,7 @@ import cn.axzo.workflow.common.annotation.InvokeMode;
|
||||
import cn.axzo.workflow.common.annotation.Manageable;
|
||||
import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
@ -26,20 +27,50 @@ import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
|
||||
* @since 2025-01-16 17:35
|
||||
*/
|
||||
@WorkflowEngineFeignClient
|
||||
@Manageable
|
||||
public interface PrintAdminApi {
|
||||
/**
|
||||
* 查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板
|
||||
*
|
||||
* @param processInstanceId
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板")
|
||||
@GetMapping("/api/print/admin/template/exists")
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Boolean> hasPrintTemplate(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
|
||||
|
||||
/**
|
||||
* 打印模板配置内容更新保存
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "打印模板配置内容更新保存")
|
||||
@PostMapping("/api/print/admin/template/upsert")
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Void> printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto);
|
||||
|
||||
/**
|
||||
* 获取打印模板中可打印的字段
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "获取打印模板中可打印的字段")
|
||||
@PostMapping("/api/print/admin/fields")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<List<PrintFieldDTO>> getPrintFields(@Validated @RequestBody PrintFieldQueryDTO dto);
|
||||
|
||||
/**
|
||||
* 获取指定流程下用于替换打印的相关变量
|
||||
*
|
||||
* @param processInstanceId
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "获取指定流程下用于替换打印的相关变量")
|
||||
@GetMapping("/api/print/admin/field/variables")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
CommonResponse<Map<String, Object>> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
|
||||
}
|
||||
|
||||
@ -14,7 +14,7 @@
|
||||
<dependency>
|
||||
<groupId>cn.axzo.workflow</groupId>
|
||||
<artifactId>workflow-engine-common</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<version>${workflow-engine-common.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.axzo.basics</groupId>
|
||||
|
||||
@ -12,6 +12,7 @@
|
||||
<artifactId>workflow-engine-common</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>workflow Engine Common</name>
|
||||
<version>${workflow-engine-common.version}</version>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
|
||||
@ -33,6 +33,7 @@ public enum BpmnInstanceRespCode implements IModuleRespCode {
|
||||
PROCESS_SIGN_DATA_NOT_EXISTS("018", "签署业务审批未获取到初始模板复制数据"),
|
||||
PROCESS_INSTANCE_CANT_REMIND("019", "流程实例【{}】不存在, 不能评论"),
|
||||
PROCESS_EXT_LOG_PARAM_ERROR("020", "查询流程日志的审批人PersonId参数不合法"),
|
||||
PROCESS_INSTANCE_CREATE_PARAM_ERROR("021", "当前审批业务必须传入叶子节点(CooperationOrgDTO.nodeId)"),
|
||||
;
|
||||
private final String code;
|
||||
private final String message;
|
||||
|
||||
@ -41,7 +41,9 @@ public enum BpmnTaskRespCode implements IModuleRespCode {
|
||||
BACK_NODE_CANNOT_REACHABLE("024", "退回节点【{}】不可达,不允许退回"),
|
||||
REACHED_BACKED_MAXIMUM_NUM("025", "达到回退操作次数上限【{}】次"),
|
||||
TRANSFER_TO_SELF("026", "任务不能转交给自己"),
|
||||
REMIND_TASK_TOO_MANY("027", "催办任务数据异常")
|
||||
REMIND_TASK_TOO_MANY("027", "催办任务数据异常"),
|
||||
PROCESS_SET_ASSIGNEE_PARAM_ERROR("028", "当前审批业务审批人模型中 NodeId 必传(topNodeId/nodeId均可), 触发 ID: 【{}】"),
|
||||
TASK_OPERATION_PARAM_INVALID("029", "流程实例 ID 与任务 ID 必须二选一"),
|
||||
;
|
||||
|
||||
private final String code;
|
||||
|
||||
@ -20,6 +20,9 @@ public enum FlowableEngineRespCode implements IModuleRespCode {
|
||||
ENGINE_NOTICE_CUSTOM_FLOW_ELEMENT_ERROR("005", "查询通知目标用户前参数发生异常,未获取到 WorkspaceType"),
|
||||
ENGINE_ASYNC_COMMAND_EXECUTION_ERROR("006", "引擎出现 SQL 相关异常, 异常信息:【{}】"),
|
||||
ENGINE_ASYNC_COMMAND_EXECUTION_RETRY_GIVE_UP("007", "命令重试尝试【{}】次仍然失败,并出现异常, 将放弃, 错误信息:{}"),
|
||||
ENGINE_POSITION_V2_CONFIG_INVALID("008", "新版本岗位配置不合法, 缺少【{}】, nodeId:【{}】"),
|
||||
ENGINE_ROLE_V2_CONFIG_INVALID("009", "新版本角色配置不合法, 缺少【{}】, nodeId:【{}】"),
|
||||
ENGINE_IDENTITY_V2_CONFIG_INVALID("009", "新版本身份配置不合法, 缺少【{}】, nodeId:【{}】"),
|
||||
;
|
||||
|
||||
private final String code;
|
||||
|
||||
@ -22,6 +22,7 @@ public enum OtherRespCode implements IModuleRespCode {
|
||||
ASYNC_JOB_EXECUTION_ERROR("007", "获取指定实例 ID【{}】的锁失败"),
|
||||
ILLEGAL_PARAM_ERROR("008", "非法的参数:【{}】"),
|
||||
MESSAGE_IM_EVENT_BUILD_ERROR("009", "不能使用 createEvent 函数创建`IM 消息`的事件, 请调用 createIMEvent 函数"),
|
||||
ASSIGNEE_NODE_ID_NOT_EXISTS("010", "【{}】 nodeId 不存在, 请检查参数是否正确")
|
||||
;
|
||||
|
||||
private final String code;
|
||||
|
||||
@ -65,6 +65,7 @@ public interface BpmnConstants {
|
||||
String FLOW_SERVER_VERSION_130 = "1.3.0";
|
||||
// 1.4.2 开始启用新版本日志
|
||||
String FLOW_SERVER_VERSION_142 = "1.4.2";
|
||||
String FLOW_CATEGORY_VERSION = "categoryVersion";
|
||||
String CONFIG_SIGN = "signConfig";
|
||||
String CONFIG_NOTICE = "noticeConfig";
|
||||
String CONFIG_APPROVE = "approveConfig";
|
||||
@ -99,6 +100,15 @@ public interface BpmnConstants {
|
||||
String CONFIG_SIGN_APPROVER_ROLE_LIMIT = "roleLimit";
|
||||
String CONFIG_APPROVER_SCOPE = "approverScope";
|
||||
String CONFIG_APPROVER_SPECIFY = "approverSpecify";
|
||||
String CONFIG_APPROVE_SPECIFY_RANGE = "approverSpecifyRange";
|
||||
String CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE = "approverSpecifyCooperateType";
|
||||
String CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT = "approverSpecifyRangeOrgLimit";
|
||||
String CONFIG_APPROVE_SPECIFY_RANGE_UNIT = "approverSpecifyRangeUnit";
|
||||
String CONFIG_INITIATOR_SPECIFIED_RANGE = "initiatorSpecifiedRange";
|
||||
String CONFIG_INITIATOR_SPECIFIED_FILTER = "initiatorSpecifiedFilter";
|
||||
String CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES = "excludeIdentityTypes";
|
||||
String CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES = "excludeCooperateShipTypes";
|
||||
String CONFIG_INITIATOR_LEADER_RANGE_UNIT = "initiatorLeaderRangeUnit";
|
||||
String CONFIG_APPROVER_MODE_TYPE = "approverModeType";
|
||||
String CONFIG_APPROVER_EMPTY_HANDLE_TYPE = "approverEmptyHandleType";
|
||||
String CONFIG_ACTIVITY_SIGNATURE = "signature";
|
||||
@ -111,6 +121,8 @@ public interface BpmnConstants {
|
||||
String CONFIG_BUTTON_TYPE_HISTORY = "history";
|
||||
String CONFIG_BUTTON_TYPE_CARBON_COPY = "carbonCopy";
|
||||
String CONFIG_SIGN_TYPE = "signType";
|
||||
String CONFIG_AREA_FILTER_ENABLE = "areaFilterEnable";
|
||||
String CONFIG_SPECIALTY_FILTER_ENABLE = "specialtyFilterEnable";
|
||||
String ELEMENT_ATTRIBUTE_NAME = "name";
|
||||
String ELEMENT_ATTRIBUTE_VALUE = "value";
|
||||
String ELEMENT_ATTRIBUTE_DESC = "desc";
|
||||
@ -122,6 +134,7 @@ public interface BpmnConstants {
|
||||
String ELEMENT_ATTRIBUTE_TYPE = "type";
|
||||
String ELEMENT_ATTRIBUTE_ORG_LIMIT = "orgLimit";
|
||||
String ELEMENT_ATTRIBUTE_APPROVER_SPECIFY = "approverSpecify";
|
||||
String ELEMENT_ATTRIBUTE_APPROVER_SPECIFY_RANGE = "approverSpecifyRange";
|
||||
String START_EVENT_ID = "startEventNode";
|
||||
String SEQUENCE_FLOW_ID = "SequenceFlowId";
|
||||
String END_EVENT_ID = "endEventNode";
|
||||
|
||||
@ -19,6 +19,7 @@ public enum ApprovalMethodEnum {
|
||||
nobody("nobody", "不设置审批人", "[仅业务节点可能有该值]"),
|
||||
bizSpecify("bizSpecify", "业务指定审批人", "[仅业务节点可能有该值]"),
|
||||
transferToAdmin("transferToAdmin", "转办给管理员", "该枚举仅日志处理使用"),
|
||||
unknown("unknown", "未知", "兜底")
|
||||
;
|
||||
|
||||
private String type;
|
||||
|
||||
@ -8,23 +8,36 @@ package cn.axzo.workflow.common.enums;
|
||||
*/
|
||||
public enum ApproverSpecifyEnum {
|
||||
|
||||
position("position", "指定岗位"),
|
||||
role("role", "指定角色"),
|
||||
identity("identity", "指定身份"),
|
||||
initiatorLeader("initiatorLeader", "发起人主管"),
|
||||
initiatorLeaderRecursion("initiatorLeaderRecursion", "发起人多级主管"),
|
||||
fixedPerson("fixedPerson", "固定人员"),
|
||||
preNodeSpecified("preNodeSpecified", "上级节点指定"),
|
||||
initiatorSpecified("initiatorSpecified", "发起时指定"),
|
||||
position("position", "指定岗位", 1),
|
||||
role("role", "指定角色", 1),
|
||||
identity("identity", "指定身份", 1),
|
||||
initiatorLeader("initiatorLeader", "发起人主管", 1),
|
||||
initiatorLeaderRecursion("initiatorLeaderRecursion", "发起人多级主管", 1),
|
||||
fixedPerson("fixedPerson", "固定人员", 1),
|
||||
preNodeSpecified("preNodeSpecified", "上级节点指定", 1),
|
||||
initiatorSpecified("initiatorSpecified", "发起时指定", 1),
|
||||
// 该枚举,目前主要为了区别签署业务与审批业务的不同配法,选择该项时,意味着该节点是由二方后端自由消费 BpmnSignApproverLimit 配置
|
||||
signerRelated("signerRelated", "签署人相关组织"),
|
||||
signerRelated("signerRelated", "签署人相关组织", 1),
|
||||
|
||||
// 新配置规则的审批人指定方式
|
||||
position_v2("position_v2", "指定岗位", 2),
|
||||
role_v2("role_v2", "指定角色", 2),
|
||||
identity_v2("identity_v2", "指定身份", 2),
|
||||
initiatorSpecified_v2("initiatorSpecified_v2", "发起人自选", 2),
|
||||
initiator_v2("initiator_v2", "发起人自己", 2),
|
||||
initiatorLeader_v2("initiatorLeader_v2", "发起人主管", 2),
|
||||
fixedPerson_v2("fixedPerson_v2", "固定人员", 2),
|
||||
preAllNodeApprover_v2("preAllNodeApprover_v2", "所有前序节点审批人", 2),
|
||||
;
|
||||
|
||||
private String type;
|
||||
private String desc;
|
||||
private Integer version;
|
||||
|
||||
ApproverSpecifyEnum(String type, String desc) {
|
||||
ApproverSpecifyEnum(String type, String desc, Integer version) {
|
||||
this.type = type;
|
||||
this.desc = desc;
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
@ -42,4 +55,12 @@ public enum ApproverSpecifyEnum {
|
||||
public void setDesc(String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public Integer getVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
public void setVersion(Integer version) {
|
||||
this.version = version;
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,41 @@
|
||||
package cn.axzo.workflow.common.enums;
|
||||
|
||||
/**
|
||||
* 审批人指定的二次范围限定枚举
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-13 14:32
|
||||
*/
|
||||
public enum ApproverSpecifyRangeEnum {
|
||||
|
||||
within_the_project("within_the_project", "项目内岗位"),
|
||||
within_the_project_construction_units("within_the_project_construction_units", "项目内参建单位的企业岗位"),
|
||||
specified_org("specified_org", "审批单指定的末级组织"),
|
||||
initiator("initiator", "审批单发起人"),
|
||||
pre_node_approver("pre_node_approver", "上节点审批人"),
|
||||
;
|
||||
|
||||
private String type;
|
||||
private String desc;
|
||||
|
||||
ApproverSpecifyRangeEnum(String type, String desc) {
|
||||
this.type = type;
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDesc(String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
package cn.axzo.workflow.common.enums;
|
||||
|
||||
/**
|
||||
* 审批人指定的范围“单位”枚举
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-13 15:05
|
||||
*/
|
||||
public enum ApproverSpecifyRangeUnitEnum {
|
||||
in_project("in_project", "项目内", null),
|
||||
in_ent("in_ent", "企业内", null),
|
||||
in_group_lv_1("in_group_lv_1", "集团岗位,上一级", 1),
|
||||
in_group_lv_2("in_group_lv_2", "集团岗位,上二级", 2),
|
||||
in_group_lv_3("in_group_lv_3", "集团岗位,上三级", 3),
|
||||
in_group_lv_4("in_group_lv_4", "集团岗位,上四级", 4),
|
||||
in_group_lv_top("in_group_lv_top", "集团岗位,总公司", Integer.MAX_VALUE),
|
||||
UNKNOWN("UNKNOWN", "未知范围", null)
|
||||
;
|
||||
private final String type;
|
||||
private final String desc;
|
||||
private final Integer value;
|
||||
|
||||
ApproverSpecifyRangeUnitEnum(String type, String desc, Integer value) {
|
||||
this.type = type;
|
||||
this.desc = desc;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public Integer getValue() {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
package cn.axzo.workflow.common.enums;
|
||||
|
||||
/**
|
||||
* 参建单位类型枚举
|
||||
* <p>
|
||||
* 拷贝自 cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-13 14:51
|
||||
*/
|
||||
public enum CooperateShipTypeEnum {
|
||||
PROJ_PRIMARY_CONTRACTING_UNIT(1, "施工总承包"),
|
||||
PROJ_CONSTRUCTION_UNIT(2, "建设单位"),
|
||||
PROJ_SUPERVISION_UNIT(3, "监理单位"),
|
||||
PROJ_LABOR_SUBCONTRACTING(4, "劳务分包"),
|
||||
PROJ_PROFESSIONAL_SUBCONTRACTING(5, "专业承包"),
|
||||
OMS(6, "OMS"),
|
||||
ENT_COMMON(7, "企业通用"),
|
||||
ENT_TEAM(8, "企业内班组"),
|
||||
PROJ_TEAM(9, "项目内班组"),
|
||||
ENT_GROUP(10, "企业内小组"),
|
||||
PROJ_GROUP(11, "项目内小组"),
|
||||
SURVEY_UNIT(12, "地勘单位"),
|
||||
DESIGN_UNIT(13, "设计单位"),
|
||||
OTHER(30, "其他");
|
||||
|
||||
private final Integer code;
|
||||
private final String desc;
|
||||
|
||||
CooperateShipTypeEnum(Integer code, String desc) {
|
||||
this.code = code;
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public Integer getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
package cn.axzo.workflow.common.enums;
|
||||
|
||||
/**
|
||||
* 新版配置下的发起人自选的范围限定枚举
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-13 15:13
|
||||
*/
|
||||
public enum InitiatorSpecifiedRangeEnum {
|
||||
self_and_children_in_project("self_and_children_in_project", "项目内本组织及其下属组织所有成员"),
|
||||
self_in_project("self_in_project", "项目内本组织所有成员"),
|
||||
in_project("in_project", "项目内所有成员"),
|
||||
in_ent("in_ent", "企业内所有成员"),
|
||||
;
|
||||
private final String type;
|
||||
private final String desc;
|
||||
|
||||
InitiatorSpecifiedRangeEnum(String type, String desc) {
|
||||
this.type = type;
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
}
|
||||
@ -17,6 +17,8 @@ public enum SignApproverOrgLimitEnum {
|
||||
LV_4("LV_4", "上4级组织", 4),
|
||||
LV_5("LV_5", "上5级组织", 5),
|
||||
LV_ALL("LV_ALL", "所有组织", -1),
|
||||
LV_TOP("LV_TOP", "顶层组织", Integer.MAX_VALUE),
|
||||
UNKNOWN("UNKNOWN", "未知层级", null)
|
||||
;
|
||||
|
||||
private final String type;
|
||||
|
||||
@ -23,6 +23,22 @@ import java.util.List;
|
||||
@Builder
|
||||
public class CooperationOrgDTO implements Serializable {
|
||||
private static final long serialVersionUID = 4739924705980062997L;
|
||||
/**
|
||||
* 叶子节点ID(末级节点),仅限用于新的项目配置模式
|
||||
* <p>
|
||||
* 该参数的用意是基于组织架构的一条线审批,而叶子节点则是为了确认最底层,人岗架会基于 nodeId 向上推出“线”的范围。
|
||||
*/
|
||||
private Long nodeId;
|
||||
|
||||
/**
|
||||
* 基于人权事的,指定某些管理管辖人员
|
||||
*/
|
||||
private List<String> includeAreaCodes;
|
||||
|
||||
/**
|
||||
* 基于人权事的,指定专业管辖人员
|
||||
*/
|
||||
private List<String> includeSpecialtyCodes;
|
||||
|
||||
/**
|
||||
* 企业组织架构范围
|
||||
|
||||
@ -4,7 +4,12 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
|
||||
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
@ -52,6 +57,43 @@ public class BpmnJsonNodeProperty {
|
||||
@NotBlank(message = "审批人指定不能为空")
|
||||
private ApproverSpecifyEnum approverSpecify;
|
||||
|
||||
//*************** 针对新配置中的岗位、角色、身份的扩展配置 Start ****************
|
||||
@ApiModelProperty(value = "任务节点:对选择的 approverSpecify 做的二次范围限定配置")
|
||||
private ApproverSpecifyRangeEnum approverSpecifyRange;
|
||||
/**
|
||||
* cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum
|
||||
*/
|
||||
@ApiModelProperty(value = "任务节点: 当选择approverSpecifyRange的值为positions_within_the_project_construction_units,做的二次范围限定配置的级联选择")
|
||||
private CooperateShipTypeEnum cooperateShipType;
|
||||
|
||||
@ApiModelProperty(value = "任务节点: 当选择approverSpecifyRange的值为specified_org,做的二次范围限定配置的级联选择的值")
|
||||
private SignApproverOrgLimitEnum approverSpecifyRangeOrgLimit;
|
||||
|
||||
/**
|
||||
* 该属性,当 approverSpecify = initiatorLeader_v2 时,也会被应用为限定单位内主管还是项目内主管
|
||||
*/
|
||||
@ApiModelProperty(value = "任务节点: 当选择approverSpecifyRange的值为specified_org,做的二次范围限定配置的级联选择的值")
|
||||
private ApproverSpecifyRangeUnitEnum approverSpecifyRangeUnit;
|
||||
|
||||
//*************** 针对新配置中的岗位、角色、身份的扩展配置 End ****************
|
||||
|
||||
//*************** approverSpecify 为 initiatorSpecified_v2 发起人自选时的一些扩展配置 Start ****************
|
||||
@ApiModelProperty(value = "任务节点: 当选择approverSpecify的值为 initiatorSpecified_v2,做的范围选择的值")
|
||||
private InitiatorSpecifiedRangeEnum initiatorSpecifyRange;
|
||||
@ApiModelProperty(value = "是否开起发起人的筛选策略")
|
||||
private Boolean initiatorSpecifiedFilter;
|
||||
/**
|
||||
* 需要排除的身份类型
|
||||
*/
|
||||
@ApiModelProperty(value = "需要排除的身份类型")
|
||||
private List<String> excludeIdentityTypes;
|
||||
/**
|
||||
* 需要排查的参建单位类型
|
||||
*/
|
||||
@ApiModelProperty(value = "需要排除的参建单位类型")
|
||||
private List<String> excludeCooperateShipTypes;
|
||||
//*************** approverSpecify 为 initiatorSpecified_v2 发起人自选时的一些扩展配置 End ****************
|
||||
|
||||
/**
|
||||
* 签署确认节点的审批人限定规则
|
||||
*/
|
||||
@ -147,7 +189,7 @@ public class BpmnJsonNodeProperty {
|
||||
|
||||
//************* 抄送节点Start **************//
|
||||
/**
|
||||
* 抄送节点配置
|
||||
* 抄送节点配置,(老的配置)
|
||||
*/
|
||||
@ApiModelProperty(value = "抄送节点: 多组配置,最多五组")
|
||||
private List<BpmnCarbonCopyConf> carbonCopyConf;
|
||||
@ -159,4 +201,16 @@ public class BpmnJsonNodeProperty {
|
||||
@ApiModelProperty(value = "表单字段权限控制")
|
||||
private List<FormPermissionMetaInfo> fieldPermission;
|
||||
|
||||
/**
|
||||
* 区域过滤开关
|
||||
*/
|
||||
@ApiModelProperty(value = "区域过滤开关", notes = "true: 开启区域过滤, false: 关闭区域过滤")
|
||||
private Boolean areaFilterEnable;
|
||||
|
||||
/**
|
||||
* 专业过滤开关
|
||||
*/
|
||||
@ApiModelProperty(value = "专业过滤开关", notes = "true: 开启专业过滤, false: 关闭专业过滤")
|
||||
private Boolean specialtyFilterEnable;
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,35 @@
|
||||
package cn.axzo.workflow.common.model.request.bpmn.process;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.Size;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 批量查询流程实例的入参模型
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2023/7/14 10:12
|
||||
*/
|
||||
@Data
|
||||
@ApiModel("批量查询流程实例的入参模型")
|
||||
@Accessors(chain = true)
|
||||
public class BpmnProcessInstanceBatchQueryDTO {
|
||||
|
||||
/**
|
||||
* 流程实例 ID 列表
|
||||
*/
|
||||
@NotEmpty(message = "流程实例 ID 列表不能为空")
|
||||
@Size(max = 20, message = "一次性查询不能超过 20个")
|
||||
private List<String> processInstanceIds;
|
||||
|
||||
/**
|
||||
* 是否包含流程变量,默认 false
|
||||
* <p>
|
||||
* 注意:开启后可能会严重影响查询性能,
|
||||
*/
|
||||
private Boolean hasVariables;
|
||||
}
|
||||
@ -13,7 +13,6 @@ import lombok.NoArgsConstructor;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Size;
|
||||
import java.util.List;
|
||||
@ -30,9 +29,20 @@ import java.util.List;
|
||||
@NoArgsConstructor
|
||||
@Builder
|
||||
public class BpmnTaskAuditDTO {
|
||||
/**
|
||||
* 流程实例 ID
|
||||
* <p>
|
||||
* 与审批任务 ID 二选一
|
||||
*/
|
||||
@ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
|
||||
private String processInstanceId;
|
||||
|
||||
/**
|
||||
* 审批任务 ID
|
||||
* <p>
|
||||
* 与流程实例 ID 二选一,如果两属性都传,则优先使用 taskId
|
||||
*/
|
||||
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
|
||||
@NotEmpty(message = "任务编号不能为空")
|
||||
private String taskId;
|
||||
|
||||
/**
|
||||
|
||||
@ -36,10 +36,19 @@ public class BpmnTaskCountersignDTO implements Serializable {
|
||||
private static final long serialVersionUID = -8106887960942113552L;
|
||||
|
||||
/**
|
||||
* 审批任务ID
|
||||
* 流程实例 ID
|
||||
* <p>
|
||||
* 与审批任务 ID 二选一
|
||||
*/
|
||||
@ApiModelProperty(value = "审批任务ID")
|
||||
@NotEmpty(message = "任务ID不能为空")
|
||||
@ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
|
||||
private String processInstanceId;
|
||||
|
||||
/**
|
||||
* 审批任务 ID
|
||||
* <p>
|
||||
* 与流程实例 ID 二选一,如果两属性都传,则优先使用 taskId
|
||||
*/
|
||||
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
|
||||
private String taskId;
|
||||
|
||||
/**
|
||||
|
||||
@ -240,9 +240,15 @@ public class BpmnTaskDelegateAssigner extends BaseBpmnTaskDelegateAssigner imple
|
||||
public Long parsePersonId() {
|
||||
if (NumberUtils.isDigits(personId)) {
|
||||
return Long.parseLong(personId);
|
||||
} else {
|
||||
return 0L;
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
public Long parseNodeId() {
|
||||
if (NumberUtils.isDigits(nodeId)) {
|
||||
return Long.parseLong(nodeId);
|
||||
}
|
||||
return 0L;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
@ -32,10 +32,19 @@ public class BpmnTaskResetApproversDTO implements Serializable {
|
||||
private static final long serialVersionUID = 4570922472032531513L;
|
||||
|
||||
/**
|
||||
* 审批任务ID
|
||||
* 流程实例 ID
|
||||
* <p>
|
||||
* 与审批任务 ID 二选一
|
||||
*/
|
||||
@ApiModelProperty(value = "审批任务ID")
|
||||
@NotEmpty(message = "任务ID不能为空")
|
||||
@ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
|
||||
private String processInstanceId;
|
||||
|
||||
/**
|
||||
* 审批任务 ID
|
||||
* <p>
|
||||
* 与流程实例 ID 二选一,如果两属性都传,则优先使用 taskId
|
||||
*/
|
||||
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
|
||||
private String taskId;
|
||||
|
||||
/**
|
||||
|
||||
@ -31,11 +31,20 @@ public class BpmnTaskTransferDTO implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 8142105892475867826L;
|
||||
|
||||
/**
|
||||
* 流程实例 ID
|
||||
* <p>
|
||||
* 与审批任务 ID 二选一
|
||||
*/
|
||||
@ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
|
||||
private String processInstanceId;
|
||||
|
||||
/**
|
||||
* 审批任务 ID
|
||||
* <p>
|
||||
* 与流程实例 ID 二选一,如果两属性都传,则优先使用 taskId
|
||||
*/
|
||||
@ApiModelProperty(value = "审批任务 ID")
|
||||
@NotBlank(message = "任务 ID 不能为空")
|
||||
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
|
||||
private String taskId;
|
||||
|
||||
/**
|
||||
|
||||
@ -87,4 +87,10 @@ public class CategoryCreateDTO {
|
||||
@ApiModelProperty(value = "是否展示在发起工作台,默认为false")
|
||||
private Boolean displayInitiateMenu = false;
|
||||
|
||||
/**
|
||||
* 版本号
|
||||
*/
|
||||
@ApiModelProperty(value = "版本号")
|
||||
private Integer version;
|
||||
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
@ -12,6 +13,8 @@ import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 发起流程前的节点列表中每个节点的模型配置信息
|
||||
*
|
||||
@ -57,10 +60,41 @@ public class BpmnNodeConfigVO {
|
||||
* fixedPerson("fixedPerson", "固定人员"), 如果节点是该类型,则该节点下的人,会默认回显至该上级模型属性中
|
||||
* initiatorLeader("initiatorLeader", "发起人主管"),
|
||||
* initiatorSpecified("initiatorSpecified", "发起人自选"),
|
||||
* <p>
|
||||
* // 新配置规则的审批人指定方式
|
||||
* position_v2("position_v2", "指定岗位", 2),
|
||||
* role_v2("role_v2", "指定角色", 2),
|
||||
* identity_v2("identity_v2", "指定身份", 2),
|
||||
* initiatorSpecified_v2("initiatorSpecified_v2", "发起人自选", 2),
|
||||
* initiator_v2("initiator_v2", "发起人自己", 2),
|
||||
* initiatorLeader_v2("initiatorLeader_v2", "发起人主管", 2),
|
||||
* fixedPerson_v2("fixedPerson_v2", "固定人员", 2),
|
||||
* pre_all_node_approver_v2("pre_all_node_approver_v2", "所有前序节点审批人", 2),
|
||||
*/
|
||||
@ApiModelProperty(value = "审批人指定")
|
||||
private ApproverSpecifyEnum approverSpecifyEnum;
|
||||
|
||||
/**
|
||||
* self_and_children_in_project("self_and_children_in_project", "项目内本组织及其下属组织所有成员"),
|
||||
* self_in_project("self_in_project", "项目内本组织所有成员"),
|
||||
* in_project("in_project", "项目内所有成员"),
|
||||
* in_ent("in_ent", "企业内所有成员"),
|
||||
*/
|
||||
@ApiModelProperty(value = "任务节点: 当选择approverSpecifyEnum的值为 initiatorSpecified_v2,做的范围选择的值")
|
||||
private InitiatorSpecifiedRangeEnum initiatorSpecifyRange;
|
||||
|
||||
@ApiModelProperty(value = "是否开起发起人的筛选策略")
|
||||
private Boolean initiatorSpecifiedFilter;
|
||||
/**
|
||||
* 需要排除的身份类型
|
||||
*/
|
||||
@ApiModelProperty(value = "需要排除的身份类型")
|
||||
private List<String> excludeIdentityTypes;
|
||||
/**
|
||||
* 需要排查的参建单位类型
|
||||
*/
|
||||
@ApiModelProperty(value = "需要排除的参建单位类型")
|
||||
private List<String> excludeCooperateShipTypes;
|
||||
/**
|
||||
* 审批人为空时的处理方式
|
||||
* <p>
|
||||
|
||||
@ -44,6 +44,9 @@ public class CategoryItemVO {
|
||||
@ApiModelProperty(value = "是否展示在发起工作台")
|
||||
private Boolean displayInitiateMenu;
|
||||
|
||||
@ApiModelProperty(value = "版本号")
|
||||
private Integer version;
|
||||
|
||||
@ApiModelProperty(value = "更新时间")
|
||||
private Date updateAt;
|
||||
}
|
||||
|
||||
@ -75,6 +75,11 @@ public class ProcessInstanceDocumentVO {
|
||||
*/
|
||||
private String initiatorName;
|
||||
|
||||
/**
|
||||
* 发起人模型 JSON 字符串
|
||||
*/
|
||||
private String initiatorJsonStr;
|
||||
|
||||
/**
|
||||
* 实例对应的流程引擎服务端迭代版本
|
||||
*/
|
||||
|
||||
@ -81,6 +81,11 @@ public class ProcessInstanceDTO implements Serializable {
|
||||
*/
|
||||
private String businessProcessInstanceName;
|
||||
|
||||
/**
|
||||
* 模型定义的原始名称
|
||||
*/
|
||||
private String definitionName;
|
||||
|
||||
/**
|
||||
* 发起人信息
|
||||
*/
|
||||
|
||||
@ -1,7 +1,12 @@
|
||||
package cn.axzo.workflow.core.common.utils;
|
||||
|
||||
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ModelBizTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
|
||||
@ -10,9 +15,7 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnFieldConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignApproverLimit;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnSignConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnUpgradeApprovalConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelCreateDTO;
|
||||
import cn.axzo.workflow.core.converter.json.AbstractBpmnJsonConverter;
|
||||
import cn.axzo.workflow.core.converter.json.BoundaryEventJsonConverter;
|
||||
@ -100,6 +103,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_O
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.END_EVENT_ID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_CATEGORY_VERSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_MODEL_BIZ_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_NODE_JSON;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
|
||||
@ -117,16 +121,29 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_NOTICE_MES
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_PENDING_MESSAGE_ID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SIGN_PENDING_MESSAGE_ID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_SMS_MESSAGE_ID;
|
||||
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_ent;
|
||||
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CONDITION;
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EMPTY;
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EXCLUSIVE_GATEWAY;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeUnit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValue;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeCooperateShipTypes;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeIdentityTypes;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getFieldConfig;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifiedFilter;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifyRange;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignApproverLimit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignConfig;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getUpgradeApprovalConf;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
|
||||
|
||||
/**
|
||||
* BPMN json 格式转换工具
|
||||
@ -182,11 +199,12 @@ public final class BpmnJsonConverterUtil {
|
||||
/**
|
||||
* 将 json 格式数据转的 BpmnJsonNode 对象,转换成 Flowable 标准的模型 {@link BpmnModel}
|
||||
*
|
||||
* @param bpmnJsonNode json 格式对象,可以直接解析
|
||||
* @param approveConf 流程高审批相关高级配置
|
||||
* @param bpmnJsonNode json 格式对象,可以直接解析
|
||||
* @param approveConf 流程高审批相关高级配置
|
||||
* @param noticeConf
|
||||
* @param buttonConf
|
||||
* @param fieldConf
|
||||
* @param categoryVersion 用于区分新老版本配置
|
||||
* @return {@link BpmnModel}
|
||||
*/
|
||||
public static BpmnModel convertToBpmn(BpmnJsonNode bpmnJsonNode, ModelBizTypeEnum modelBizType,
|
||||
@ -197,7 +215,8 @@ public final class BpmnJsonConverterUtil {
|
||||
BpmnNoticeConf noticeConf,
|
||||
BpmnButtonConf buttonConf,
|
||||
List<BpmnFieldConf> fieldConf,
|
||||
String serverVersionStr) {
|
||||
String serverVersionStr,
|
||||
Integer categoryVersion) {
|
||||
if (Objects.isNull(bpmnJsonNode)) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "JSON 数据为空");
|
||||
}
|
||||
@ -209,16 +228,21 @@ public final class BpmnJsonConverterUtil {
|
||||
ExtensionAttribute serverVersion = new ExtensionAttribute();
|
||||
serverVersion.setName(FLOW_SERVER_VERSION);
|
||||
serverVersion.setValue(serverVersionStr);
|
||||
ExtensionAttribute categoryVersionAttr = new ExtensionAttribute();
|
||||
categoryVersionAttr.setName(FLOW_CATEGORY_VERSION);
|
||||
categoryVersionAttr.setValue(String.valueOf(categoryVersion));
|
||||
ExtensionAttribute jsonMetaValue = new ExtensionAttribute();
|
||||
jsonMetaValue.setName(FLOW_NODE_JSON);
|
||||
jsonMetaValue.setValue(JSONUtil.toJsonStr(bpmnJsonNode));
|
||||
|
||||
|
||||
Process mainProcess = new Process();
|
||||
mainProcess.setId(id);
|
||||
mainProcess.setName(name);
|
||||
mainProcess.setDocumentation(documentation);
|
||||
mainProcess.addAttribute(modelType);
|
||||
mainProcess.addAttribute(serverVersion);
|
||||
mainProcess.addAttribute(categoryVersionAttr);
|
||||
mainProcess.addAttribute(jsonMetaValue);
|
||||
|
||||
//设置流程审批相关高级配置
|
||||
@ -632,6 +656,7 @@ public final class BpmnJsonConverterUtil {
|
||||
BpmnJsonNode tempEndNode = new BpmnJsonNode();
|
||||
tempEndNode.setIncoming(Lists.newArrayList(gateway.getId()));
|
||||
if (Objects.isNull(defaultConditionConnectNode)) {
|
||||
tempEndNode.setPreJsonNode(branch);
|
||||
tempEndNode.setId(END_EVENT_ID);
|
||||
} else {
|
||||
if (Objects.equals(defaultConditionConnectNode.getType(), NODE_EMPTY) && Objects.nonNull(defaultConditionConnectNode.getChildren())) {
|
||||
@ -768,7 +793,7 @@ public final class BpmnJsonConverterUtil {
|
||||
}
|
||||
|
||||
private static FlowElement convertJsonToElement(Class<? extends BaseElement> clz, BpmnJsonNode bpmnJsonNode,
|
||||
Process process, String formKey) {
|
||||
Process process, String formKey) {
|
||||
AbstractBpmnJsonConverter converter = CONVERTERS.getOrDefault(clz, new NotSupportConverter());
|
||||
FlowElement flowElement = converter.convertJsonToElement(bpmnJsonNode, process, formKey);
|
||||
if (Objects.nonNull(bpmnJsonNode)) {
|
||||
@ -806,30 +831,40 @@ public final class BpmnJsonConverterUtil {
|
||||
// "/resources/配置台模型.json";
|
||||
// String fileName = "/Users/wangli/work/company/yizhi/workflow-engine/workflow-engine-server/src/main" +
|
||||
// "/resources/权限点模型.json";
|
||||
|
||||
boolean present = Optional.of(in_ent).filter(unit -> unit != in_project).isPresent();
|
||||
String fileName = "/Users/wangli/work/company/yizhi/workflow-engine/workflow-engine-server/src/main" +
|
||||
"/resources/request.json";
|
||||
byte[] bytes = Files.readAllBytes(Paths.get(fileName));
|
||||
String content = new String(bytes, StandardCharsets.UTF_8);
|
||||
|
||||
BpmnModelCreateDTO model = JSON.parseObject(content, BpmnModelCreateDTO.class);
|
||||
BpmnModel bpmnModel = convertToBpmn(model.getJsonModel().getNode(), ModelBizTypeEnum.SIGN, "id", "测试", "test-form", "remark",
|
||||
BpmnModel bpmnModel = convertToBpmn(model.getJsonModel().getNode(), ModelBizTypeEnum.FLOWABLE, "id", "测试", "test-form", "remark",
|
||||
model.getJsonModel().getApproveConf(),
|
||||
model.getJsonModel().getSignConf(),
|
||||
model.getJsonModel().getNoticeConf(),
|
||||
model.getJsonModel().getButtonConf(), model.getJsonModel().getFieldConf(),
|
||||
"1.3.1-SNAPSHOT");
|
||||
"1.3.1-SNAPSHOT",
|
||||
2);
|
||||
|
||||
getNoticeConfig(bpmnModel.getMainProcess());
|
||||
getSignConfig(bpmnModel.getMainProcess());
|
||||
BpmnJsonModel bpmnJsonModel = convertToJson(bpmnModel);
|
||||
|
||||
FlowElement flowElement = bpmnModel.getFlowElement("node_350687681316");
|
||||
Optional<BpmnUpgradeApprovalConf> upgradeApprovalConf = getUpgradeApprovalConf(flowElement);
|
||||
// Optional<BpmnSignApproverLimit> signApproverLimit = getSignApproverLimit(flowElement);
|
||||
// ServiceTask serviceTask = (ServiceTask) bpmnModel.getFlowElement("node_946990365785");
|
||||
// Optional<List<BpmnCarbonCopyConf>> carbonCopyConfigs = BpmnMetaParserHelper.getCarbonCopyConfigs
|
||||
// (serviceTask);
|
||||
|
||||
FlowElement flowElement = bpmnModel.getFlowElement("node_865038288523_ff8k");
|
||||
Optional<InitiatorSpecifiedRangeEnum> initiatorSpecifyRange = getInitiatorSpecifyRange(flowElement);
|
||||
Optional<Boolean> initiatorSpecifiedFilter = getInitiatorSpecifiedFilter(flowElement);
|
||||
Optional<List<String>> excludeIdentityTypes = getExcludeIdentityTypes(flowElement);
|
||||
Optional<List<String>> excludeCooperateShipTypes = getExcludeCooperateShipTypes(flowElement);
|
||||
Optional<Integer> categoryVersion = getCategoryVersion(bpmnModel.getMainProcess());
|
||||
Optional<ApproverSpecifyRangeEnum> approverSpecifyRange = getApproverSpecifyRange(flowElement);
|
||||
Optional<String> approverSpecifyValue = getApproverSpecifyValue(flowElement);
|
||||
Optional<String> approverSpecifyValueV2 = getApproverSpecifyValueV2(flowElement);
|
||||
Optional<CooperateShipTypeEnum> cooperateShipType = getCooperateShipType(flowElement);
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit = getApproverSpecifyRangeUnit(flowElement);
|
||||
Optional<SignApproverOrgLimitEnum> approverSpecifyRangeOrgLimit = getApproverSpecifyRangeOrgLimit(flowElement);
|
||||
Boolean areaFilterEnable = getAreaFilterEnable(flowElement);
|
||||
Boolean specialtyFilterEnable = getSpecialtyFilterEnable(flowElement);
|
||||
// generateImage(bpmnModel);
|
||||
|
||||
byte[] xml = transformBytes(bpmnModel);
|
||||
|
||||
@ -4,11 +4,15 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||
import cn.axzo.workflow.common.enums.AutoApprovalTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
|
||||
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
||||
import cn.axzo.workflow.common.enums.BpmnSignType;
|
||||
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
|
||||
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.InitiatorSpecifiedRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverRoleLimitEnum;
|
||||
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
|
||||
@ -63,6 +67,11 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_EMPTY_HANDLE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SCOPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_UNIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_AREA_FILTER_ENABLE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_META;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CARBON_COPY;
|
||||
@ -77,6 +86,11 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_META;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_OPTION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_LEADER_RANGE_UNIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_FILTER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_RANGE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NODE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NOTICE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN;
|
||||
@ -84,6 +98,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVE
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ORG_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ROLE_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SPECIALTY_FILTER_ENABLE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_APPROVER_SPECIFY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CODE;
|
||||
@ -94,6 +109,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_O
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_ORG_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_CATEGORY_VERSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.SUPPORT_BATCH_OPERATION_DEFAULT_VALUE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_CARBON_COPY_MESSAGE_ID;
|
||||
@ -127,6 +143,24 @@ public final class BpmnMetaParserHelper {
|
||||
return Optional.ofNullable(process.getAttributeValue(null, FLOW_SERVER_VERSION));
|
||||
}
|
||||
|
||||
public static Optional<Integer> getCategoryVersion(Process process) {
|
||||
if (Objects.isNull(process)) {
|
||||
return Optional.of(0);
|
||||
}
|
||||
String categoryVersion = process.getAttributeValue(null, FLOW_CATEGORY_VERSION);
|
||||
if (StringUtils.hasText(categoryVersion)) {
|
||||
try {
|
||||
return Optional.of(Integer.parseInt(categoryVersion));
|
||||
} catch (NumberFormatException e) {
|
||||
// 如果转换失败,返回空
|
||||
return Optional.of(0);
|
||||
}
|
||||
} else {
|
||||
// 如果没有设置版本号,返回空
|
||||
return Optional.of(0);
|
||||
}
|
||||
}
|
||||
|
||||
public static Optional<BpmnApproveConf> getProcessApproveConf(Process process) {
|
||||
List<ExtensionElement> elements = process.getExtensionElements().getOrDefault(CONFIG_APPROVE, Collections.emptyList());
|
||||
BpmnApproveConf conf = new BpmnApproveConf();
|
||||
@ -438,8 +472,13 @@ public final class BpmnMetaParserHelper {
|
||||
}
|
||||
|
||||
public static Optional<ApproverSpecifyEnum> getApproverSpecify(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getApproverSpecify((UserTask) flowElement);
|
||||
if (Objects.nonNull(flowElement)) {
|
||||
if (flowElement instanceof UserTask) {
|
||||
return getApproverSpecify((UserTask) flowElement);
|
||||
|
||||
} else if (flowElement instanceof ServiceTask) {
|
||||
return getApproverSpecify((ServiceTask) flowElement);
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
@ -448,6 +487,117 @@ public final class BpmnMetaParserHelper {
|
||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
|
||||
}
|
||||
|
||||
public static Optional<ApproverSpecifyEnum> getApproverSpecify(ServiceTask serviceTask) {
|
||||
return defaultValid(serviceTask, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyEnum.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
|
||||
}
|
||||
|
||||
public static Optional<ApproverSpecifyRangeEnum> getApproverSpecifyRange(FlowElement flowElement) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(flowElement);
|
||||
if (approverSpecify.isPresent()) {
|
||||
return defaultValid(flowElement, CONFIG_APPROVER_SPECIFY).map(element -> ApproverSpecifyRangeEnum.valueOf(element.getChildElements()
|
||||
.getOrDefault(CONFIG_APPROVE_SPECIFY_RANGE, Collections.emptyList())
|
||||
.get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE)));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<SignApproverOrgLimitEnum> getApproverSpecifyRangeOrgLimit(FlowElement flowElement) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(flowElement);
|
||||
if (approverSpecify.isPresent()) {
|
||||
return defaultValid(flowElement, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> SignApproverOrgLimitEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<CooperateShipTypeEnum> getCooperateShipType(FlowElement flowElement) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(flowElement);
|
||||
if (approverSpecify.isPresent()) {
|
||||
return defaultValid(flowElement, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> CooperateShipTypeEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<ApproverSpecifyRangeUnitEnum> getApproverSpecifyRangeUnit(FlowElement flowElement) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(flowElement);
|
||||
if (approverSpecify.isPresent()) {
|
||||
return defaultValid(flowElement, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_APPROVE_SPECIFY_RANGE_UNIT, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> ApproverSpecifyRangeUnitEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<InitiatorSpecifiedRangeEnum> getInitiatorSpecifyRange(FlowElement flowElement) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(flowElement);
|
||||
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
|
||||
return defaultValid(flowElement, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_RANGE, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> InitiatorSpecifiedRangeEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<ApproverSpecifyRangeUnitEnum> getInitiatorLeaderRangeUnit(FlowElement flowElement) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(flowElement);
|
||||
if (approverSpecify.isPresent()) {
|
||||
return defaultValid(flowElement, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_INITIATOR_LEADER_RANGE_UNIT, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> ApproverSpecifyRangeUnitEnum.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<Boolean> getInitiatorSpecifiedFilter(FlowElement flowElement) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(flowElement);
|
||||
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
|
||||
return defaultValid(flowElement, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_FILTER, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> Boolean.valueOf(e.getAttributeValue(null, ELEMENT_ATTRIBUTE_VALUE))));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<List<String>> getExcludeIdentityTypes(FlowElement flowElement) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(flowElement);
|
||||
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
|
||||
return defaultValid(flowElement, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> JSON.parseArray(e.getElementText(), String.class)));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public static Optional<List<String>> getExcludeCooperateShipTypes(FlowElement flowElement) {
|
||||
Optional<ApproverSpecifyEnum> approverSpecify = getApproverSpecify(flowElement);
|
||||
if (approverSpecify.isPresent() && Objects.equals(approverSpecify.get(), ApproverSpecifyEnum.initiatorSpecified_v2)) {
|
||||
return defaultValid(flowElement, CONFIG_APPROVER_SPECIFY).flatMap(element -> element.getChildElements()
|
||||
.getOrDefault(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES, Collections.emptyList())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(e -> JSON.parseArray(e.getElementText(), String.class)));
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
|
||||
public static Optional<String> getApproverSpecifyValue(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getApproverSpecifyValue((UserTask) flowElement);
|
||||
@ -459,6 +609,10 @@ public final class BpmnMetaParserHelper {
|
||||
return defaultValid(userTask, CONFIG_APPROVER_SPECIFY).map(element -> StringUtils.hasLength(element.getElementText()) ? element.getElementText() : "[]");
|
||||
}
|
||||
|
||||
public static Optional<String> getApproverSpecifyValueV2(FlowElement flowElement) {
|
||||
return defaultValid(flowElement, CONFIG_APPROVER_SPECIFY).map(element -> element.getChildElements().getOrDefault(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE, Collections.emptyList()).get(0).getElementText());
|
||||
}
|
||||
|
||||
public static Optional<ApproverEmptyHandleTypeEnum> getApproverEmptyHandleType(FlowElement flowElement) {
|
||||
if (Objects.nonNull(flowElement) && flowElement instanceof UserTask) {
|
||||
return getApproverEmptyHandleType((UserTask) flowElement);
|
||||
@ -486,6 +640,14 @@ public final class BpmnMetaParserHelper {
|
||||
&& Objects.equals(specifyEnum, ApproverSpecifyEnum.initiatorSpecified);
|
||||
}
|
||||
|
||||
public static Boolean getAreaFilterEnable(FlowElement flowElement) {
|
||||
return defaultValid(flowElement, CONFIG_AREA_FILTER_ENABLE).map(element -> Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED))).orElse(false);
|
||||
}
|
||||
|
||||
public static Boolean getSpecialtyFilterEnable(FlowElement flowElement) {
|
||||
return defaultValid(flowElement, CONFIG_SPECIALTY_FILTER_ENABLE).map(element -> Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED))).orElse(false);
|
||||
}
|
||||
|
||||
private static Optional<ExtensionElement> defaultValid(FlowElement flowElement, String elementName) {
|
||||
if (Objects.isNull(flowElement)) {
|
||||
return Optional.empty();
|
||||
@ -588,7 +750,7 @@ public final class BpmnMetaParserHelper {
|
||||
BpmnUpgradeApprovalConf conf = new BpmnUpgradeApprovalConf();
|
||||
Boolean enabled = Boolean.valueOf(element.getAttributeValue(null, ELEMENT_ATTRIBUTE_CHECKED));
|
||||
conf.setEnabled(enabled);
|
||||
if(Objects.equals(Boolean.TRUE, enabled)) {
|
||||
if (Objects.equals(Boolean.TRUE, enabled)) {
|
||||
conf.setOrgLimit(SignApproverOrgLimitEnum.valueOfType(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_ORG_LIMIT)));
|
||||
conf.setApproverSpecify(ApproverSpecifyEnum.valueOf(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_LIMIT_CONF).get(0).getAttributeValue(null, ELEMENT_ATTRIBUTE_APPROVER_SPECIFY)));
|
||||
conf.setSpecifyValue(element.getChildElements().get(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE).get(0).getElementText());
|
||||
|
||||
@ -1,25 +1,41 @@
|
||||
package cn.axzo.workflow.core.converter.json;
|
||||
|
||||
import cn.axzo.framework.jackson.utility.JSON;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnCarbonCopyConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNodeProperty;
|
||||
import org.flowable.bpmn.model.ExtensionAttribute;
|
||||
import org.flowable.bpmn.model.ExtensionElement;
|
||||
import org.flowable.bpmn.model.Process;
|
||||
import org.flowable.bpmn.model.ServiceTask;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.workflow.common.code.ConvertorRespCode.CONVERTOR_COMMON_ERROR;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_UNIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPIES;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY_OBJECT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY_SPECIFY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_LEADER_RANGE_UNIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_FILTER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_RANGE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_DESC;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_NAME;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_VALUE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static org.flowable.bpmn.model.ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION;
|
||||
|
||||
/**
|
||||
@ -35,17 +51,290 @@ public class ServiceTaskJsonConverter extends AbstractBpmnJsonConverter<ServiceT
|
||||
serviceTask.setId(node.getId());
|
||||
serviceTask.setName(node.getName());
|
||||
|
||||
// 设置抄送具体的实现类
|
||||
setCarbonCopyDelegate(serviceTask);
|
||||
Integer categoryVersion = getCategoryVersion(process).orElse(0);
|
||||
if (categoryVersion < 2) {
|
||||
|
||||
// 持久化节点抄送配置元数据
|
||||
setCarbonCopyExtensionElement(node, serviceTask);
|
||||
// 设置抄送具体的实现类
|
||||
setCarbonCopyDelegate(serviceTask);
|
||||
|
||||
// 持久化节点抄送配置元数据
|
||||
setCarbonCopyExtensionElement(node, serviceTask);
|
||||
} else {
|
||||
// 设置抄送具体的实现类
|
||||
setCarbonCopyDelegateV2(serviceTask);
|
||||
// 持久化节点抄送配置元数据
|
||||
setCarbonCopyExtensionElementV2(node, serviceTask);
|
||||
}
|
||||
|
||||
// "表单权限设置"
|
||||
setFormFieldExtensionElement(node, serviceTask);
|
||||
return serviceTask;
|
||||
}
|
||||
|
||||
private void setCarbonCopyDelegateV2(ServiceTask serviceTask) {
|
||||
serviceTask.setImplementation("${engineCarbonCopyV2EventListener}");
|
||||
serviceTask.setImplementationType(IMPLEMENTATION_TYPE_DELEGATEEXPRESSION);
|
||||
}
|
||||
|
||||
private static void setCarbonCopyExtensionElementV2(BpmnJsonNode node, ServiceTask serviceTask) {
|
||||
BpmnJsonNodeProperty property = node.getProperty();
|
||||
if (Objects.isNull(property)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(Objects.nonNull(property.getApproverSpecify())) {
|
||||
// 审批人指定
|
||||
ExtensionElement approverSpecifyElement = new ExtensionElement();
|
||||
approverSpecifyElement.setName(CONFIG_APPROVER_SPECIFY);
|
||||
|
||||
ExtensionAttribute approverSpecifyValueAttribute = new ExtensionAttribute();
|
||||
approverSpecifyValueAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyValueAttribute.setValue(property.getApproverSpecify().getType());
|
||||
approverSpecifyElement.addAttribute(approverSpecifyValueAttribute);
|
||||
ExtensionAttribute approverSpecifyDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyDescAttribute.setValue("审批人指定");
|
||||
approverSpecifyElement.addAttribute(approverSpecifyDescAttribute);
|
||||
|
||||
if (property.getApproverSpecify().name().contains("_v2")) {
|
||||
switch (property.getApproverSpecify()) {
|
||||
case position_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少岗位的二级配置");
|
||||
}
|
||||
ExtensionElement approverSpecifyRangePosition = new ExtensionElement();
|
||||
approverSpecifyRangePosition.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeDescAttribute);
|
||||
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case within_the_project_construction_units:
|
||||
if (Objects.isNull(property.getCooperateShipType())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "岗位“项目内岗位”缺少级联配置");
|
||||
}
|
||||
ExtensionElement cooperateShipType = new ExtensionElement();
|
||||
cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||
ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||
|
||||
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||
approverSpecifyElement.addChildElement(cooperateShipType);
|
||||
|
||||
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangeUnit);
|
||||
break;
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "岗位“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "岗位“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "岗位“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangePosition);
|
||||
break;
|
||||
case role_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少角色的二级配置");
|
||||
}
|
||||
ExtensionElement approverSpecifyRangeRole = new ExtensionElement();
|
||||
approverSpecifyRangeRole.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||
ExtensionAttribute approverSpecifyRangeRoleAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeRoleAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeRoleAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeRoleDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeRoleDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeRoleDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleDescAttribute);
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case within_the_project_construction_units:
|
||||
if (Objects.isNull(property.getCooperateShipType())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "角色“项目内角色”缺少级联配置");
|
||||
}
|
||||
ExtensionElement cooperateShipType = new ExtensionElement();
|
||||
cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||
ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||
|
||||
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||
|
||||
approverSpecifyElement.addChildElement(cooperateShipType);
|
||||
break;
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "角色“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "角色“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "角色“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangeRole);
|
||||
break;
|
||||
case identity_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少身份的二级配置");
|
||||
}
|
||||
ExtensionElement approverSpecifyRangeIdentity = new ExtensionElement();
|
||||
approverSpecifyRangeIdentity.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||
ExtensionAttribute approverSpecifyRangeIdentityAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeIdentityAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeIdentityAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeIdentityDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeIdentityDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeIdentityDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityDescAttribute);
|
||||
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case within_the_project_construction_units:
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "身份不支持“项目内参建单位的企业身份”选项");
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "身份“审批单指定的末级组织”", false);
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "身份“审批单发起人”", false);
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "身份“上节点审批人”", false);
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangeIdentity);
|
||||
break;
|
||||
case initiatorSpecified_v2:
|
||||
if (Objects.isNull(property.getInitiatorSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少发起人自选的二级配置");
|
||||
}
|
||||
ExtensionElement initiatorSpecifyRange = new ExtensionElement();
|
||||
initiatorSpecifyRange.setName(CONFIG_INITIATOR_SPECIFIED_RANGE);
|
||||
|
||||
ExtensionAttribute initiatorSpecifyRangeAttribute = new ExtensionAttribute();
|
||||
initiatorSpecifyRangeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
initiatorSpecifyRangeAttribute.setValue(property.getInitiatorSpecifyRange().getType());
|
||||
initiatorSpecifyRange.addAttribute(initiatorSpecifyRangeAttribute);
|
||||
|
||||
ExtensionAttribute initiatorSpecifyRangeDescAttribute = new ExtensionAttribute();
|
||||
initiatorSpecifyRangeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
initiatorSpecifyRangeDescAttribute.setValue(property.getInitiatorSpecifyRange().getDesc());
|
||||
initiatorSpecifyRange.addAttribute(initiatorSpecifyRangeDescAttribute);
|
||||
|
||||
approverSpecifyElement.addChildElement(initiatorSpecifyRange);
|
||||
|
||||
boolean enableFilter = Boolean.TRUE.equals(property.getInitiatorSpecifiedFilter());
|
||||
ExtensionElement InitiatorSpecifiedFilter = new ExtensionElement();
|
||||
InitiatorSpecifiedFilter.setName(CONFIG_INITIATOR_SPECIFIED_FILTER);
|
||||
ExtensionAttribute InitiatorSpecifiedFilterAttribute = new ExtensionAttribute();
|
||||
InitiatorSpecifiedFilterAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
InitiatorSpecifiedFilterAttribute.setValue(String.valueOf(enableFilter));
|
||||
InitiatorSpecifiedFilter.addAttribute(InitiatorSpecifiedFilterAttribute);
|
||||
|
||||
ExtensionAttribute InitiatorSpecifiedFilterDescAttribute = new ExtensionAttribute();
|
||||
InitiatorSpecifiedFilterDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
InitiatorSpecifiedFilterDescAttribute.setValue("是否开起发起人的筛选策略");
|
||||
InitiatorSpecifiedFilter.addAttribute(InitiatorSpecifiedFilterDescAttribute);
|
||||
approverSpecifyElement.addChildElement(InitiatorSpecifiedFilter);
|
||||
|
||||
if (enableFilter) {
|
||||
ExtensionElement excludeIdentityTypes = new ExtensionElement();
|
||||
excludeIdentityTypes.setName(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES);
|
||||
excludeIdentityTypes.setElementText(JSON.toJSONString(
|
||||
CollectionUtils.isEmpty(property.getExcludeIdentityTypes()) ? new ArrayList<>() : property.getExcludeIdentityTypes())
|
||||
);
|
||||
approverSpecifyElement.addChildElement(excludeIdentityTypes);
|
||||
|
||||
ExtensionElement excludeCooperateShipTypes = new ExtensionElement();
|
||||
excludeCooperateShipTypes.setName(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES);
|
||||
excludeCooperateShipTypes.setElementText(JSON.toJSONString(
|
||||
CollectionUtils.isEmpty(property.getExcludeCooperateShipTypes()) ? new ArrayList<>() : property.getExcludeCooperateShipTypes())
|
||||
);
|
||||
approverSpecifyElement.addChildElement(excludeCooperateShipTypes);
|
||||
}
|
||||
break;
|
||||
case initiator_v2:
|
||||
break;
|
||||
case initiatorLeader_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRangeUnit())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少发起人主管的二级配置");
|
||||
}
|
||||
ExtensionElement initiatorLeader = new ExtensionElement();
|
||||
initiatorLeader.setName(CONFIG_INITIATOR_LEADER_RANGE_UNIT);
|
||||
ExtensionAttribute initiatorLeaderAttribute = new ExtensionAttribute();
|
||||
initiatorLeaderAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
initiatorLeaderAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||
initiatorLeader.addAttribute(initiatorLeaderAttribute);
|
||||
|
||||
ExtensionAttribute initiatorLeaderDescAttribute = new ExtensionAttribute();
|
||||
initiatorLeaderDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
initiatorLeaderDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
initiatorLeader.addAttribute(initiatorLeaderDescAttribute);
|
||||
approverSpecifyElement.addChildElement(initiatorLeader);
|
||||
break;
|
||||
case fixedPerson_v2:
|
||||
break;
|
||||
case preAllNodeApprover_v2:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
// 审批人指定的具体值
|
||||
ExtensionElement specifyValueElement = new ExtensionElement();
|
||||
specifyValueElement.setName(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE);
|
||||
specifyValueElement.setElementText(property.getSpecifyValue());
|
||||
approverSpecifyElement.addChildElement(specifyValueElement);
|
||||
serviceTask.addExtensionElement(approverSpecifyElement);
|
||||
}
|
||||
}
|
||||
|
||||
private static void setCarbonCopyExtensionElement(BpmnJsonNode node, ServiceTask serviceTask) {
|
||||
if (Objects.isNull(node.getProperty())) {
|
||||
return;
|
||||
@ -120,4 +409,57 @@ public class ServiceTaskJsonConverter extends AbstractBpmnJsonConverter<ServiceT
|
||||
JSON.toJSONString(node.getProperty().getFieldPermission()) : null);
|
||||
serviceTask.addExtensionElement(fieldElement);
|
||||
}
|
||||
|
||||
public static void checkCascadeConfig(BpmnJsonNodeProperty property, String tips) {
|
||||
checkCascadeConfig(property, tips, true);
|
||||
}
|
||||
|
||||
public static void checkCascadeConfig(BpmnJsonNodeProperty property, String tips, boolean containsRangeUnit) {
|
||||
if (Objects.isNull(property.getApproverSpecifyRangeOrgLimit())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, tips + "缺少级联组织配置");
|
||||
}
|
||||
if (Objects.isNull(property.getApproverSpecifyRangeUnit()) && containsRangeUnit) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, tips + "缺少级联配置");
|
||||
}
|
||||
}
|
||||
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement) {
|
||||
addCascadeConfig(property, parentElement, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加级联配置协议转换
|
||||
*
|
||||
* @param property
|
||||
* @param parentElement
|
||||
*/
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement, boolean containsRangeUnit) {
|
||||
ExtensionElement specifiedOrg = new ExtensionElement();
|
||||
specifiedOrg.setName(CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT);
|
||||
ExtensionAttribute specifiedOrgAttribute = new ExtensionAttribute();
|
||||
specifiedOrgAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
specifiedOrgAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().name());
|
||||
specifiedOrg.addAttribute(specifiedOrgAttribute);
|
||||
|
||||
ExtensionAttribute specifiedOrgDescAttribute = new ExtensionAttribute();
|
||||
specifiedOrgDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
specifiedOrgDescAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().getDesc());
|
||||
specifiedOrg.addAttribute(specifiedOrgDescAttribute);
|
||||
parentElement.addChildElement(specifiedOrg);
|
||||
|
||||
if (containsRangeUnit) {
|
||||
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||
parentElement.addChildElement(approverSpecifyRangeUnit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@ import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
|
||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNode;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonNodeProperty;
|
||||
@ -25,6 +26,7 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.workflow.common.code.ConvertorRespCode.CONVERTOR_COMMON_ERROR;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.AUTO_APPROVAL_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_ACTIVITY_SIGNATURE;
|
||||
@ -33,15 +35,26 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_EMP
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_MODE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SCOPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVER_SPECIFY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_APPROVE_SPECIFY_RANGE_UNIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_AREA_FILTER_ENABLE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CARBON_COPY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_CURRENT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_HISTORY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_BUTTON_TYPE_INITIATOR;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_FIELD_PERMISSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_LEADER_RANGE_UNIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_FILTER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_INITIATOR_SPECIFIED_RANGE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ORG_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SIGN_APPROVER_ROLE_LIMIT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_SPECIALTY_FILTER_ENABLE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_APPROVER_SPECIFY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_DESC;
|
||||
@ -152,9 +165,24 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
buildMetaButton(buttonConf.getHistory(), CONFIG_BUTTON_TYPE_HISTORY, buttonConfigElement);
|
||||
buildMetaButton(buttonConf.getCarbonCopy(), CONFIG_BUTTON_TYPE_CARBON_COPY, buttonConfigElement);
|
||||
}
|
||||
|
||||
userTask.addExtensionElement(buttonConfigElement);
|
||||
|
||||
ExtensionElement areaFilterEnableElement = new ExtensionElement();
|
||||
areaFilterEnableElement.setName(CONFIG_AREA_FILTER_ENABLE);
|
||||
ExtensionAttribute areaFilterEnableAttribute = new ExtensionAttribute();
|
||||
areaFilterEnableAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
|
||||
areaFilterEnableAttribute.setValue(String.valueOf(Boolean.TRUE.equals(node.getProperty().getAreaFilterEnable())));
|
||||
areaFilterEnableElement.addAttribute(areaFilterEnableAttribute);
|
||||
userTask.addExtensionElement(areaFilterEnableElement);
|
||||
|
||||
ExtensionElement specialtyFilterEnableElement = new ExtensionElement();
|
||||
specialtyFilterEnableElement.setName(CONFIG_SPECIALTY_FILTER_ENABLE);
|
||||
ExtensionAttribute specialtyFilterEnableAttribute = new ExtensionAttribute();
|
||||
specialtyFilterEnableAttribute.setName(ELEMENT_ATTRIBUTE_CHECKED);
|
||||
specialtyFilterEnableAttribute.setValue(String.valueOf(Boolean.TRUE.equals(node.getProperty().getSpecialtyFilterEnable())));
|
||||
specialtyFilterEnableElement.addAttribute(specialtyFilterEnableAttribute);
|
||||
userTask.addExtensionElement(specialtyFilterEnableElement);
|
||||
|
||||
//添加自动审批配置
|
||||
ExtensionElement autoApprovalExtensionElement = new ExtensionElement();
|
||||
ExtensionAttribute pendingMessageAttribute = new ExtensionAttribute();
|
||||
@ -268,14 +296,250 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
approverSpecifyValueAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyValueAttribute.setValue(property.getApproverSpecify().getType());
|
||||
approverSpecifyElement.addAttribute(approverSpecifyValueAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyDescAttribute.setValue("审批人指定");
|
||||
approverSpecifyElement.addAttribute(approverSpecifyDescAttribute);
|
||||
// 审批人指定的具体值
|
||||
approverSpecifyElement.setElementText(property.getSpecifyValue());
|
||||
userTask.addExtensionElement(approverSpecifyElement);
|
||||
|
||||
if (property.getApproverSpecify().name().contains("_v2")) {
|
||||
switch (property.getApproverSpecify()) {
|
||||
case position_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少岗位的二级配置");
|
||||
}
|
||||
ExtensionElement approverSpecifyRangePosition = new ExtensionElement();
|
||||
approverSpecifyRangePosition.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||
approverSpecifyRangePosition.addAttribute(approverSpecifyRangeDescAttribute);
|
||||
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case within_the_project_construction_units:
|
||||
if (Objects.isNull(property.getCooperateShipType())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "岗位“项目内岗位”缺少级联配置");
|
||||
}
|
||||
ExtensionElement cooperateShipType = new ExtensionElement();
|
||||
cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||
ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||
|
||||
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||
approverSpecifyElement.addChildElement(cooperateShipType);
|
||||
|
||||
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangeUnit);
|
||||
break;
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "岗位“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "岗位“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "岗位“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangePosition);
|
||||
break;
|
||||
case role_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少角色的二级配置");
|
||||
}
|
||||
ExtensionElement approverSpecifyRangeRole = new ExtensionElement();
|
||||
approverSpecifyRangeRole.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||
ExtensionAttribute approverSpecifyRangeRoleAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeRoleAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeRoleAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeRoleDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeRoleDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeRoleDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||
approverSpecifyRangeRole.addAttribute(approverSpecifyRangeRoleDescAttribute);
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case within_the_project_construction_units:
|
||||
if (Objects.isNull(property.getCooperateShipType())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "角色“项目内角色”缺少级联配置");
|
||||
}
|
||||
ExtensionElement cooperateShipType = new ExtensionElement();
|
||||
cooperateShipType.setName(CONFIG_APPROVE_SPECIFY_COOPERATE_TYPE);
|
||||
ExtensionAttribute cooperateShipTypeAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
cooperateShipTypeAttribute.setValue(property.getCooperateShipType().name());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeAttribute);
|
||||
|
||||
ExtensionAttribute cooperateShipTypeDescAttribute = new ExtensionAttribute();
|
||||
cooperateShipTypeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
cooperateShipTypeDescAttribute.setValue(property.getCooperateShipType().getDesc());
|
||||
cooperateShipType.addAttribute(cooperateShipTypeDescAttribute);
|
||||
|
||||
approverSpecifyElement.addChildElement(cooperateShipType);
|
||||
break;
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "角色“审批单指定的末级组织”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "角色“审批单发起人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "角色“上节点审批人”");
|
||||
addCascadeConfig(property, approverSpecifyElement);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangeRole);
|
||||
break;
|
||||
case identity_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少身份的二级配置");
|
||||
}
|
||||
ExtensionElement approverSpecifyRangeIdentity = new ExtensionElement();
|
||||
approverSpecifyRangeIdentity.setName(CONFIG_APPROVE_SPECIFY_RANGE);
|
||||
ExtensionAttribute approverSpecifyRangeIdentityAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeIdentityAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeIdentityAttribute.setValue(property.getApproverSpecifyRange().getType());
|
||||
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeIdentityDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeIdentityDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeIdentityDescAttribute.setValue(property.getApproverSpecifyRange().getDesc());
|
||||
approverSpecifyRangeIdentity.addAttribute(approverSpecifyRangeIdentityDescAttribute);
|
||||
|
||||
switch (property.getApproverSpecifyRange()) {
|
||||
case within_the_project_construction_units:
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "身份不支持“项目内参建单位的企业身份”选项");
|
||||
case specified_org:
|
||||
checkCascadeConfig(property, "身份“审批单指定的末级组织”", false);
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
case initiator:
|
||||
checkCascadeConfig(property, "身份“审批单发起人”", false);
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
case pre_node_approver:
|
||||
checkCascadeConfig(property, "身份“上节点审批人”", false);
|
||||
addCascadeConfig(property, approverSpecifyElement, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
approverSpecifyElement.addChildElement(approverSpecifyRangeIdentity);
|
||||
break;
|
||||
case initiatorSpecified_v2:
|
||||
if (Objects.isNull(property.getInitiatorSpecifyRange())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少发起人自选的二级配置");
|
||||
}
|
||||
ExtensionElement initiatorSpecifyRange = new ExtensionElement();
|
||||
initiatorSpecifyRange.setName(CONFIG_INITIATOR_SPECIFIED_RANGE);
|
||||
|
||||
ExtensionAttribute initiatorSpecifyRangeAttribute = new ExtensionAttribute();
|
||||
initiatorSpecifyRangeAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
initiatorSpecifyRangeAttribute.setValue(property.getInitiatorSpecifyRange().getType());
|
||||
initiatorSpecifyRange.addAttribute(initiatorSpecifyRangeAttribute);
|
||||
|
||||
ExtensionAttribute initiatorSpecifyRangeDescAttribute = new ExtensionAttribute();
|
||||
initiatorSpecifyRangeDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
initiatorSpecifyRangeDescAttribute.setValue(property.getInitiatorSpecifyRange().getDesc());
|
||||
initiatorSpecifyRange.addAttribute(initiatorSpecifyRangeDescAttribute);
|
||||
|
||||
approverSpecifyElement.addChildElement(initiatorSpecifyRange);
|
||||
|
||||
boolean enableFilter = Boolean.TRUE.equals(property.getInitiatorSpecifiedFilter());
|
||||
ExtensionElement InitiatorSpecifiedFilter = new ExtensionElement();
|
||||
InitiatorSpecifiedFilter.setName(CONFIG_INITIATOR_SPECIFIED_FILTER);
|
||||
ExtensionAttribute InitiatorSpecifiedFilterAttribute = new ExtensionAttribute();
|
||||
InitiatorSpecifiedFilterAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
InitiatorSpecifiedFilterAttribute.setValue(String.valueOf(enableFilter));
|
||||
InitiatorSpecifiedFilter.addAttribute(InitiatorSpecifiedFilterAttribute);
|
||||
|
||||
ExtensionAttribute InitiatorSpecifiedFilterDescAttribute = new ExtensionAttribute();
|
||||
InitiatorSpecifiedFilterDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
InitiatorSpecifiedFilterDescAttribute.setValue("是否开起发起人的筛选策略");
|
||||
InitiatorSpecifiedFilter.addAttribute(InitiatorSpecifiedFilterDescAttribute);
|
||||
approverSpecifyElement.addChildElement(InitiatorSpecifiedFilter);
|
||||
|
||||
if (enableFilter) {
|
||||
ExtensionElement excludeIdentityTypes = new ExtensionElement();
|
||||
excludeIdentityTypes.setName(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_IDENTITY_TYPES);
|
||||
excludeIdentityTypes.setElementText(JSON.toJSONString(
|
||||
CollectionUtils.isEmpty(property.getExcludeIdentityTypes()) ? new ArrayList<>() : property.getExcludeIdentityTypes())
|
||||
);
|
||||
approverSpecifyElement.addChildElement(excludeIdentityTypes);
|
||||
|
||||
ExtensionElement excludeCooperateShipTypes = new ExtensionElement();
|
||||
excludeCooperateShipTypes.setName(CONFIG_INITIATOR_SPECIFIED_EXCLUDE_COOPERATE_TYPES);
|
||||
excludeCooperateShipTypes.setElementText(JSON.toJSONString(
|
||||
CollectionUtils.isEmpty(property.getExcludeCooperateShipTypes()) ? new ArrayList<>() : property.getExcludeCooperateShipTypes())
|
||||
);
|
||||
approverSpecifyElement.addChildElement(excludeCooperateShipTypes);
|
||||
}
|
||||
break;
|
||||
case initiator_v2:
|
||||
break;
|
||||
case initiatorLeader_v2:
|
||||
if (Objects.isNull(property.getApproverSpecifyRangeUnit())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, "缺少发起人主管的二级配置");
|
||||
}
|
||||
ExtensionElement initiatorLeader = new ExtensionElement();
|
||||
initiatorLeader.setName(CONFIG_INITIATOR_LEADER_RANGE_UNIT);
|
||||
ExtensionAttribute initiatorLeaderAttribute = new ExtensionAttribute();
|
||||
initiatorLeaderAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
initiatorLeaderAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||
initiatorLeader.addAttribute(initiatorLeaderAttribute);
|
||||
|
||||
ExtensionAttribute initiatorLeaderDescAttribute = new ExtensionAttribute();
|
||||
initiatorLeaderDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
initiatorLeaderDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
initiatorLeader.addAttribute(initiatorLeaderDescAttribute);
|
||||
approverSpecifyElement.addChildElement(initiatorLeader);
|
||||
break;
|
||||
case fixedPerson_v2:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
// 审批人指定的具体值
|
||||
ExtensionElement specifyValueElement = new ExtensionElement();
|
||||
specifyValueElement.setName(TEMPLATE_UPGRADE_APPROVAL_SPECIFY_VALUE);
|
||||
specifyValueElement.setElementText(property.getSpecifyValue());
|
||||
approverSpecifyElement.addChildElement(specifyValueElement);
|
||||
userTask.addExtensionElement(approverSpecifyElement);
|
||||
} else {
|
||||
// 老版本的兼容
|
||||
// 审批人指定的具体值
|
||||
approverSpecifyElement.setElementText(property.getSpecifyValue());
|
||||
userTask.addExtensionElement(approverSpecifyElement);
|
||||
}
|
||||
}
|
||||
|
||||
if (Objects.nonNull(property.getMultiMode())) {
|
||||
@ -333,7 +597,7 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
|
||||
// “提级审批配置”
|
||||
BpmnUpgradeApprovalConf upgradeApprovalConf = property.getUpgradeApprovalConf();
|
||||
if(Objects.nonNull(upgradeApprovalConf) && Objects.equals(Boolean.TRUE, upgradeApprovalConf.getEnabled())){
|
||||
if (Objects.nonNull(upgradeApprovalConf) && Objects.equals(Boolean.TRUE, upgradeApprovalConf.getEnabled())) {
|
||||
ExtensionElement upgradeApprovalElement = new ExtensionElement();
|
||||
upgradeApprovalElement.setName(TEMPLATE_UPGRADE_APPROVAL_CONF);
|
||||
ExtensionAttribute upgradeApprovalEnabledAttribute = new ExtensionAttribute();
|
||||
@ -363,6 +627,59 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkCascadeConfig(BpmnJsonNodeProperty property, String tips) {
|
||||
checkCascadeConfig(property, tips, true);
|
||||
}
|
||||
|
||||
public static void checkCascadeConfig(BpmnJsonNodeProperty property, String tips, boolean containsRangeUnit) {
|
||||
if (Objects.isNull(property.getApproverSpecifyRangeOrgLimit())) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, tips + "缺少级联组织配置");
|
||||
}
|
||||
if (Objects.isNull(property.getApproverSpecifyRangeUnit()) && containsRangeUnit) {
|
||||
throw new WorkflowEngineException(CONVERTOR_COMMON_ERROR, tips + "缺少级联配置");
|
||||
}
|
||||
}
|
||||
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement) {
|
||||
addCascadeConfig(property, parentElement, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加级联配置协议转换
|
||||
*
|
||||
* @param property
|
||||
* @param parentElement
|
||||
*/
|
||||
private static void addCascadeConfig(BpmnJsonNodeProperty property, ExtensionElement parentElement, boolean containsRangeUnit) {
|
||||
ExtensionElement specifiedOrg = new ExtensionElement();
|
||||
specifiedOrg.setName(CONFIG_APPROVE_SPECIFY_RANGE_ORG_LIMIT);
|
||||
ExtensionAttribute specifiedOrgAttribute = new ExtensionAttribute();
|
||||
specifiedOrgAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
specifiedOrgAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().name());
|
||||
specifiedOrg.addAttribute(specifiedOrgAttribute);
|
||||
|
||||
ExtensionAttribute specifiedOrgDescAttribute = new ExtensionAttribute();
|
||||
specifiedOrgDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
specifiedOrgDescAttribute.setValue(property.getApproverSpecifyRangeOrgLimit().getDesc());
|
||||
specifiedOrg.addAttribute(specifiedOrgDescAttribute);
|
||||
parentElement.addChildElement(specifiedOrg);
|
||||
|
||||
if (containsRangeUnit) {
|
||||
ExtensionElement approverSpecifyRangeUnit = new ExtensionElement();
|
||||
approverSpecifyRangeUnit.setName(CONFIG_APPROVE_SPECIFY_RANGE_UNIT);
|
||||
ExtensionAttribute approverSpecifyRangeUnitAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitAttribute.setName(ELEMENT_ATTRIBUTE_VALUE);
|
||||
approverSpecifyRangeUnitAttribute.setValue(property.getApproverSpecifyRangeUnit().getType());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitAttribute);
|
||||
|
||||
ExtensionAttribute approverSpecifyRangeUnitDescAttribute = new ExtensionAttribute();
|
||||
approverSpecifyRangeUnitDescAttribute.setName(ELEMENT_ATTRIBUTE_DESC);
|
||||
approverSpecifyRangeUnitDescAttribute.setValue(property.getApproverSpecifyRangeUnit().getDesc());
|
||||
approverSpecifyRangeUnit.addAttribute(approverSpecifyRangeUnitDescAttribute);
|
||||
parentElement.addChildElement(approverSpecifyRangeUnit);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置执行监听
|
||||
*
|
||||
|
||||
@ -24,12 +24,21 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.*;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.*;
|
||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANT_ABORT;
|
||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_DELETE_PROCESS_FLAG;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_DELETE_REASON;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_TYPE_ABORT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_ASSIGNEE_SKIP_FLAT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_ABORT;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.ABORTED;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.CANCELLED;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.*;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.completeVirtualTask;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVirtualTask;
|
||||
|
||||
/**
|
||||
* 自定义的中止流程实例的命令实现
|
||||
@ -119,7 +128,9 @@ public class CustomAbortProcessInstanceCmd extends AbstractCommand<Void> impleme
|
||||
batchAddAttachment(commandContext, task.getProcessInstanceId(), task, attachmentList, assigner);
|
||||
completeVirtualTask(commandContext, task);
|
||||
|
||||
runtimeService.setVariable(processInstanceId, CLOSE_PROCESS_ASSIGNER, assigner);
|
||||
if (Objects.nonNull(assigner)) {
|
||||
runtimeService.setVariable(processInstanceId, CLOSE_PROCESS_ASSIGNER, assigner);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@ -1,17 +1,15 @@
|
||||
package cn.axzo.workflow.core.engine.cmd;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
|
||||
import cn.axzo.workflow.core.engine.job.AsyncActivityTriggerJobHandler;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.runtime.Execution;
|
||||
import org.flowable.job.service.JobService;
|
||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||
@ -22,6 +20,7 @@ import java.io.Serializable;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_TRIGGER_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.core.engine.cmd.CustomActivityTriggerCmd.validateActivityConfig;
|
||||
|
||||
/**
|
||||
* 自定义(异步)流转业务姐弟那的命令器实现
|
||||
@ -47,7 +46,7 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand<String> imple
|
||||
@Override
|
||||
public String execute(CommandContext commandContext) {
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
TaskEntity task = (TaskEntity) processEngineConfiguration.getTaskService().createTaskQuery()
|
||||
.executionId(dto.getTriggerId())
|
||||
.taskDefinitionKey(StringUtils.isBlank(dto.getActivityId()) ? null : dto.getActivityId())
|
||||
@ -56,12 +55,17 @@ public class CustomActivityTriggerAsyncCmd extends AbstractCommand<String> imple
|
||||
throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId());
|
||||
}
|
||||
|
||||
if (!validateActivityConfig(task)) {
|
||||
log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey());
|
||||
return "";
|
||||
}
|
||||
|
||||
return startAsync(commandContext);
|
||||
}
|
||||
|
||||
private String startAsync(CommandContext commandContext) {
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||
TaskEntity task = (TaskEntity) taskService.createTaskQuery()
|
||||
.executionId(dto.getTriggerId())
|
||||
|
||||
@ -1,14 +1,19 @@
|
||||
package cn.axzo.workflow.core.engine.cmd;
|
||||
|
||||
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
|
||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
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;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -53,6 +58,12 @@ public class CustomActivityTriggerCmd extends AbstractCommand<Void> implements S
|
||||
if (Objects.isNull(task)) {
|
||||
throw new WorkflowEngineException(ACTIVITY_TRIGGER_NOT_EXISTS, dto.getTriggerId());
|
||||
}
|
||||
|
||||
if (!validateActivityConfig(task)) {
|
||||
log.info("业务节点唤醒时,发现节点已经修改配置,无法继续唤醒,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey());
|
||||
return null;
|
||||
}
|
||||
|
||||
addComment(commandContext, task, COMMENT_TYPE_OPERATION_DESC, "已同意");
|
||||
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
||||
// 告警节点生产的定时任务需要删除,否则会因为外键约束导致触发功能会重试,并抛出触发节点不存在的问题
|
||||
@ -61,4 +72,13 @@ public class CustomActivityTriggerCmd extends AbstractCommand<Void> implements S
|
||||
runtimeService.trigger(dto.getTriggerId());
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean validateActivityConfig(TaskEntity task) {
|
||||
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(task.getProcessDefinitionId());
|
||||
FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey());
|
||||
ApprovalMethodEnum approvalMethodEnum = BpmnMetaParserHelper.getApprovalMethod(flowElement).orElse(ApprovalMethodEnum.unknown);
|
||||
return Objects.equals(approvalMethodEnum, ApprovalMethodEnum.nobody);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -6,6 +6,9 @@ import cn.axzo.workflow.common.model.dto.SignatureDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
|
||||
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
|
||||
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.common.engine.impl.identity.Authentication;
|
||||
@ -38,6 +41,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_SPECIFY_NE
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGNATURE_COLLECTION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
||||
@ -155,12 +159,32 @@ public class CustomApproveTaskCmd extends AbstractCommand<Void> implements Seria
|
||||
// 记录电子签名的图片
|
||||
recordSignature(task, runtimeService);
|
||||
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
||||
resetApproverNode(task.getProcessInstanceId());
|
||||
|
||||
if (Objects.nonNull(approver)) {
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
||||
}
|
||||
|
||||
executeSynchronous(task, taskService, runtimeService);
|
||||
return null;
|
||||
}
|
||||
|
||||
private void resetApproverNode(String processInstanceId) {
|
||||
ExtAxProcessLogService logService = SpringContextUtils.getBean(ExtAxProcessLogService.class);
|
||||
ExtAxProcessLog logQuery = new ExtAxProcessLog();
|
||||
logQuery.setProcessInstanceId(processInstanceId);
|
||||
logQuery.setTaskId(taskId);
|
||||
logQuery.setStatus(PROCESSING.getStatus());
|
||||
List<ExtAxProcessLog> logs = logService.genericQuery(logQuery);
|
||||
if (CollectionUtils.isEmpty(logs)) {
|
||||
return;
|
||||
}
|
||||
if (CollectionUtils.isEmpty(logs.get(0).getAssigneeFull())) {
|
||||
return;
|
||||
}
|
||||
approver.setNodeId(logs.get(0).getAssigneeFull().get(0).getNodeId());
|
||||
}
|
||||
|
||||
private void recordSignature(TaskEntity task, RuntimeService runtimeService) {
|
||||
List<SignatureDTO> signatures = runtimeService.getVariable(task.getProcessInstanceId(), SIGNATURE_COLLECTION, List.class);
|
||||
if (Objects.isNull(signatures)) {
|
||||
|
||||
@ -178,12 +178,25 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implemen
|
||||
// 记录电子签名的图片
|
||||
recordSignature(task, runtimeService);
|
||||
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
||||
resetApproverNode(task.getProcessInstanceId());
|
||||
|
||||
if (Objects.nonNull(approver)) {
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
||||
}
|
||||
|
||||
executeSynchronous(task, taskService, runtimeService, commandContext, historicTaskInstance.getTenantId());
|
||||
return null;
|
||||
}
|
||||
|
||||
private void resetApproverNode(String processInstanceId) {
|
||||
ExtAxProcessLogService logService = SpringContextUtils.getBean(ExtAxProcessLogService.class);
|
||||
ExtAxProcessLog processLog = logService.findByProcessIdAndTaskIdWithDeleted(processInstanceId, taskId);
|
||||
if (CollectionUtils.isEmpty(processLog.getAssigneeFull())) {
|
||||
return;
|
||||
}
|
||||
approver.setNodeId(processLog.getAssigneeFull().get(0).getNodeId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 表单校验
|
||||
*
|
||||
|
||||
@ -11,12 +11,15 @@ import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.job.service.JobService;
|
||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import static cn.axzo.workflow.core.engine.cmd.CustomBizSpecifyAssigneeToTaskCmd.getOperateTask;
|
||||
import static cn.axzo.workflow.core.engine.cmd.CustomBizSpecifyAssigneeToTaskCmd.validProcessInstance;
|
||||
import static cn.axzo.workflow.core.engine.cmd.CustomBizSpecifyAssigneeToTaskCmd.validate;
|
||||
import static cn.axzo.workflow.core.engine.cmd.CustomBizSpecifyAssigneeToTaskCmd.validateActivityConfig;
|
||||
|
||||
/**
|
||||
* 自定的业务指定审批人命令实现
|
||||
@ -26,6 +29,7 @@ import static cn.axzo.workflow.core.engine.cmd.CustomBizSpecifyAssigneeToTaskCmd
|
||||
*/
|
||||
public class CustomBizSpecifyAssigneeToTaskAsyncCmd extends AbstractCommand<String> implements Serializable {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(CustomBizSpecifyAssigneeToTaskAsyncCmd.class);
|
||||
private final BpmnActivitySetAssigneeDTO dto;
|
||||
|
||||
public CustomBizSpecifyAssigneeToTaskAsyncCmd(BpmnActivitySetAssigneeDTO dto) {
|
||||
@ -46,7 +50,13 @@ public class CustomBizSpecifyAssigneeToTaskAsyncCmd extends AbstractCommand<Stri
|
||||
//校验
|
||||
validate(processEngineConfiguration.getRuntimeService(), dto.getTriggerId(), task, dto.getAssigners());
|
||||
|
||||
validProcessInstance(commandContext, task);
|
||||
// 校验节点真实的节点配置,还是否是指定人?
|
||||
if (!validateActivityConfig(task)) {
|
||||
log.info("业务节点设置审批人时,发现节点已经修改配置,无法继续设置审批人,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey());
|
||||
return "";
|
||||
}
|
||||
|
||||
validProcessInstance(commandContext, task, dto.getAssigners());
|
||||
|
||||
return startAsync(processEngineConfiguration, task);
|
||||
}
|
||||
|
||||
@ -1,9 +1,15 @@
|
||||
package cn.axzo.workflow.core.engine.cmd;
|
||||
|
||||
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||
import cn.axzo.workflow.core.common.utils.SpringContextUtils;
|
||||
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
||||
import cn.axzo.workflow.core.service.CategoryService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.HistoryService;
|
||||
import org.flowable.engine.ManagementService;
|
||||
@ -12,11 +18,15 @@ import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.history.HistoricProcessInstance;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||
import org.flowable.job.api.Job;
|
||||
import org.flowable.job.service.impl.persistence.entity.TimerJobEntity;
|
||||
import org.flowable.task.api.Task;
|
||||
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
@ -28,12 +38,17 @@ import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_BIZ_SET_ASSIGNEE_ERROR;
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.ACTIVITY_CANT_SET_ASSIGNEE;
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.PROCESS_CANT_SET_ASSIGNEE;
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.PROCESS_SET_ASSIGNEE_PARAM_ERROR;
|
||||
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.HIDDEN_ASSIGNEE_ID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.DELETED;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
|
||||
import static cn.axzo.workflow.common.enums.WorkspaceType.PROJECT;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTaskAssignerCount;
|
||||
|
||||
/**
|
||||
@ -43,7 +58,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask
|
||||
* @since 2023/12/22 13:51
|
||||
*/
|
||||
public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean> implements Serializable {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(CustomBizSpecifyAssigneeToTaskCmd.class);
|
||||
private final String executionId;
|
||||
private final List<BpmnTaskDelegateAssigner> addedAssigners;
|
||||
|
||||
@ -62,8 +77,8 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
||||
|
||||
public static Task getOperateTask(TaskService taskService, String executionId) {
|
||||
return taskService.createTaskQuery().executionId(executionId)
|
||||
.taskAssignee(NO_ASSIGNEE)
|
||||
.singleResult();
|
||||
.taskAssignee(NO_ASSIGNEE)
|
||||
.singleResult();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -74,6 +89,11 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
||||
* @param assigners
|
||||
*/
|
||||
public static void validate(RuntimeService runtimeService, String executionId, Task task, List<BpmnTaskDelegateAssigner> assigners) {
|
||||
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);
|
||||
@ -82,13 +102,19 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
||||
@Override
|
||||
public Boolean execute(CommandContext commandContext) {
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||
TaskEntity task = (TaskEntity) getOperateTask(taskService, executionId);
|
||||
//校验
|
||||
validate(processEngineConfiguration.getRuntimeService(), executionId, task, addedAssigners);
|
||||
|
||||
validProcessInstance(commandContext, task);
|
||||
// 校验节点真实的节点配置,还是否是指定人?
|
||||
if (!validateActivityConfig(task)) {
|
||||
log.info("业务节点设置审批人时,发现节点已经修改配置,无法继续设置审批人,processInstanceId:{}, taskDefinitionKey={}", task.getProcessInstanceId(), task.getTaskDefinitionKey());
|
||||
return true;
|
||||
}
|
||||
|
||||
validProcessInstance(commandContext, task, addedAssigners);
|
||||
|
||||
changeAssigneeSnapshot(commandContext, task);
|
||||
|
||||
@ -99,12 +125,22 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
||||
return true;
|
||||
}
|
||||
|
||||
public static boolean validateActivityConfig(TaskEntity task) {
|
||||
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(task.getProcessDefinitionId());
|
||||
FlowElement flowElement = bpmnModel.getFlowElement(task.getTaskDefinitionKey());
|
||||
ApprovalMethodEnum approvalMethodEnum = BpmnMetaParserHelper.getApprovalMethod(flowElement).orElse(ApprovalMethodEnum.unknown);
|
||||
return Objects.equals(approvalMethodEnum, ApprovalMethodEnum.bizSpecify);
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空告警的任务
|
||||
* <p>
|
||||
* 这个方法在最新的告警功能中,应该已经失效了,这里保留只是为了暂时兼容
|
||||
*
|
||||
* @param commandContext
|
||||
* @param task
|
||||
*/
|
||||
@Deprecated
|
||||
private void clearAlterTimeJob(CommandContext commandContext, TaskEntity task) {
|
||||
ManagementService managementService = CommandContextUtil.getProcessEngineConfiguration(commandContext).getManagementService();
|
||||
Job timerJob = managementService.createTimerJobQuery().elementId(task.getTaskDefinitionKey()).processInstanceId(task.getProcessInstanceId()).singleResult();
|
||||
@ -114,9 +150,9 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
||||
|
||||
}
|
||||
|
||||
public static void validProcessInstance(CommandContext commandContext, Task task) {
|
||||
public static void validProcessInstance(CommandContext commandContext, Task task, List<BpmnTaskDelegateAssigner> addedAssigners) {
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
HistoryService historyService = processEngineConfiguration.getHistoryService();
|
||||
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
|
||||
if (Objects.isNull(processInstance)) {
|
||||
@ -125,17 +161,29 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
||||
if (!Objects.equals(PROCESSING.getStatus(), processInstance.getBusinessStatus())) {
|
||||
throw new WorkflowEngineException(PROCESS_CANT_SET_ASSIGNEE);
|
||||
}
|
||||
|
||||
CategoryService categoryService = SpringContextUtils.getBean(CategoryService.class);
|
||||
categoryService.get(BPM_MODEL_CATEGORY, processInstance.getProcessDefinitionKey())
|
||||
.ifPresent(category -> {
|
||||
if (category.getWorkspaceTypeCode().equals(String.valueOf(PROJECT.getCode())) && category.getVersion() > 0) {
|
||||
for (BpmnTaskDelegateAssigner assigner : addedAssigners) {
|
||||
if (!StringUtils.hasText(assigner.getNodeId())) {
|
||||
throw new WorkflowEngineException(PROCESS_SET_ASSIGNEE_PARAM_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private void changeAssigneeSnapshot(CommandContext commandContext, Task task) {
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
List<BpmnTaskDelegateAssigner> originAssingeeList = runtimeService.getVariable(task.getProcessInstanceId(),
|
||||
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class);
|
||||
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(), List.class);
|
||||
|
||||
for (BpmnTaskDelegateAssigner assigner : originAssingeeList) {
|
||||
if (Objects.equals(assigner.buildAssigneeId(), NO_ASSIGNEE)) {
|
||||
@ -145,8 +193,8 @@ public class CustomBizSpecifyAssigneeToTaskCmd extends AbstractCommand<Boolean>
|
||||
}
|
||||
originAssingeeList.addAll(addedAssigners);
|
||||
runtimeService.setVariable(task.getProcessInstanceId(),
|
||||
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(),
|
||||
originAssingeeList);
|
||||
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + task.getTaskDefinitionKey(),
|
||||
originAssingeeList);
|
||||
}
|
||||
|
||||
private void addAssignee(CommandContext commandContext, TaskService taskService, Task task) {
|
||||
|
||||
@ -140,7 +140,9 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand<Void> implem
|
||||
|
||||
completeVirtualTask(commandContext, task);
|
||||
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, initiator);
|
||||
if (Objects.nonNull(initiator)) {
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, initiator);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@ -13,7 +13,6 @@ import com.google.common.collect.Lists;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.CustomProperty;
|
||||
import org.flowable.bpmn.model.ServiceTask;
|
||||
import org.flowable.common.engine.impl.interceptor.Command;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.HistoryService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
@ -41,6 +40,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.OLD_INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimitedElementList;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId;
|
||||
|
||||
@ -60,18 +60,20 @@ public class CustomCarbonCopyUserSelectorCmd extends AbstractCommand<List<BpmnTa
|
||||
private final EngineExecutionStartListener engineExecutionStartListener;
|
||||
private final BpmnHistoricTaskInstanceConverter historicTaskInstanceConverter;
|
||||
private final String serviceVersion;
|
||||
private final Integer categoryVersion;
|
||||
/**
|
||||
* 模型中发起节点立马接着抄送节点,此时无法通过 runtimeService 得到正运行的 execution,所以由外部传递
|
||||
*/
|
||||
private DelegateExecution execution;
|
||||
|
||||
public CustomCarbonCopyUserSelectorCmd(String processInstanceId, List<BpmnCarbonCopyConf> carbons, ServiceTask serviceTask, EngineExecutionStartListener engineExecutionStartListener, BpmnHistoricTaskInstanceConverter historicTaskInstanceConverter, String serviceVersion) {
|
||||
public CustomCarbonCopyUserSelectorCmd(String processInstanceId, List<BpmnCarbonCopyConf> carbons, ServiceTask serviceTask, EngineExecutionStartListener engineExecutionStartListener, BpmnHistoricTaskInstanceConverter historicTaskInstanceConverter, String serviceVersion, Integer categoryVersion) {
|
||||
this.processInstanceId = processInstanceId;
|
||||
this.carbons = carbons;
|
||||
this.serviceTask = serviceTask;
|
||||
this.engineExecutionStartListener = engineExecutionStartListener;
|
||||
this.historicTaskInstanceConverter = historicTaskInstanceConverter;
|
||||
this.serviceVersion = serviceVersion;
|
||||
this.categoryVersion = categoryVersion;
|
||||
}
|
||||
|
||||
public CustomCarbonCopyUserSelectorCmd(String processInstanceId, List<BpmnCarbonCopyConf> carbons,
|
||||
@ -79,6 +81,7 @@ public class CustomCarbonCopyUserSelectorCmd extends AbstractCommand<List<BpmnTa
|
||||
EngineExecutionStartListener engineExecutionStartListener,
|
||||
BpmnHistoricTaskInstanceConverter historicTaskInstanceConverter,
|
||||
String serviceVersion,
|
||||
Integer categoryVersion,
|
||||
DelegateExecution execution) {
|
||||
this.processInstanceId = processInstanceId;
|
||||
this.carbons = carbons;
|
||||
@ -86,6 +89,7 @@ public class CustomCarbonCopyUserSelectorCmd extends AbstractCommand<List<BpmnTa
|
||||
this.engineExecutionStartListener = engineExecutionStartListener;
|
||||
this.historicTaskInstanceConverter = historicTaskInstanceConverter;
|
||||
this.serviceVersion = serviceVersion;
|
||||
this.categoryVersion = categoryVersion;
|
||||
this.execution = execution;
|
||||
}
|
||||
|
||||
@ -95,11 +99,42 @@ public class CustomCarbonCopyUserSelectorCmd extends AbstractCommand<List<BpmnTa
|
||||
params.put("processInstanceId", processInstanceId);
|
||||
params.put("carbons", carbons);
|
||||
params.put("serviceVersion", serviceVersion);
|
||||
params.put("categoryVersion", categoryVersion);
|
||||
return JSON.toJSONString(params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> execute(CommandContext commandContext) {
|
||||
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
|
||||
if (Objects.isNull(categoryVersion) || categoryVersion < 2) {
|
||||
assigners.addAll(calcUserV1(commandContext));
|
||||
} else {
|
||||
// v2 版本
|
||||
assigners.addAll(calcUserV2(commandContext));
|
||||
}
|
||||
return getLimitedElementList(removeDuplicateByPersonId(assigners), CARBON_ASSIGNER_LIMIT_NUMBER);
|
||||
}
|
||||
|
||||
private List<BpmnTaskDelegateAssigner> calcUserV2(CommandContext commandContext) {
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration =
|
||||
CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
|
||||
List<Execution> executions = new ArrayList<>();
|
||||
if (Objects.isNull(execution)) {
|
||||
executions.addAll(runtimeService.createExecutionQuery().processInstanceId(processInstanceId).list());
|
||||
} else {
|
||||
executions.add((Execution) execution);
|
||||
}
|
||||
|
||||
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
|
||||
getApproverSpecify(serviceTask).ifPresent(specify -> {
|
||||
assigners.addAll(engineExecutionStartListener.approverSelect(specify.getType(), serviceTask,
|
||||
(DelegateExecution) executions.get(0), false));
|
||||
});
|
||||
return assigners;
|
||||
}
|
||||
|
||||
private List<BpmnTaskDelegateAssigner> calcUserV1(CommandContext commandContext) {
|
||||
if (CollectionUtils.isEmpty(carbons)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
@ -159,7 +194,7 @@ public class CustomCarbonCopyUserSelectorCmd extends AbstractCommand<List<BpmnTa
|
||||
break;
|
||||
}
|
||||
});
|
||||
return getLimitedElementList(removeDuplicateByPersonId(assigners), CARBON_ASSIGNER_LIMIT_NUMBER);
|
||||
return assigners;
|
||||
}
|
||||
|
||||
private List<BpmnTaskDelegateAssigner> getApproverRelationUser(BpmnCarbonCopyConf carbon,
|
||||
|
||||
@ -1,13 +1,16 @@
|
||||
package cn.axzo.workflow.core.engine.cmd;
|
||||
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
|
||||
import cn.axzo.workflow.core.engine.job.AsyncCountersignUserTaskJobHandler;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||
import org.flowable.job.service.JobService;
|
||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||
import org.flowable.task.api.Task;
|
||||
@ -17,6 +20,8 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTaskAssignerCount;
|
||||
|
||||
@ -44,6 +49,8 @@ public class CustomCountersignUserTaskAsyncCmd extends AbstractCommand<Void> imp
|
||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||
Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
|
||||
|
||||
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||
|
||||
validTask(historicTaskInstance, (TaskEntity) task, dto.getOriginAssigner(), null);
|
||||
|
||||
// validTaskAssignerDuplicated(commandContext, (TaskEntity) task, dto.getTargetAssignerList());
|
||||
@ -75,4 +82,12 @@ public class CustomCountersignUserTaskAsyncCmd extends AbstractCommand<Void> imp
|
||||
jobService.scheduleAsyncJob(job);
|
||||
}
|
||||
|
||||
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||
boolean present = dto.getTargetAssignerList().stream().anyMatch(assigner -> !org.springframework.util.StringUtils.hasText(assigner.getNodeId()));
|
||||
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||
if (categoryVersion > 0 && present) {
|
||||
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "审批人");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package cn.axzo.workflow.core.engine.cmd;
|
||||
|
||||
import cn.axzo.workflow.common.enums.BpmnCountersignTypeEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
||||
@ -9,11 +10,13 @@ import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||
import org.flowable.task.api.Task;
|
||||
import org.flowable.task.api.TaskInfo;
|
||||
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||
@ -29,9 +32,11 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COUNTERSIGN_ASSIGNER_SHOW_NUMBER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.COUNTERSIGN;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.completeVirtualTask;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVirtualTask;
|
||||
@ -95,6 +100,8 @@ public class CustomCountersignUserTaskCmd extends AbstractCommand<Void> implemen
|
||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(originTaskId).singleResult();
|
||||
|
||||
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||
|
||||
validTask(historicTaskInstance, task, originTaskAssignee, null);
|
||||
|
||||
validTaskAssignerCount(processEngineConfiguration.getRuntimeService(), task, targetTaskAssigneeList);
|
||||
@ -180,4 +187,12 @@ public class CustomCountersignUserTaskCmd extends AbstractCommand<Void> implemen
|
||||
completeVirtualTask(commandContext, virtualTask);
|
||||
}
|
||||
|
||||
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||
boolean present = targetTaskAssigneeList.stream().anyMatch(assigner -> !org.springframework.util.StringUtils.hasText(assigner.getNodeId()));
|
||||
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||
if (categoryVersion > 0 && present) {
|
||||
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "审批人");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,12 +1,13 @@
|
||||
package cn.axzo.workflow.core.engine.cmd;
|
||||
|
||||
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
||||
import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
import org.flowable.common.engine.impl.cfg.IdGenerator;
|
||||
import org.flowable.common.engine.impl.identity.Authentication;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
@ -15,10 +16,12 @@ import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.history.HistoricProcessInstance;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||
import org.flowable.task.api.Task;
|
||||
import org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntity;
|
||||
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
@ -27,15 +30,17 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CANT_CREATED;
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CANT_REPEAT_CREATE;
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CREATED_ERROR;
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CREATED_NOT_SUPPORT;
|
||||
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.HIDDEN_ASSIGNEE_ID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_ASSIGNEE_SKIP_FLAT;
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_ROBOT;
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CANT_CREATED;
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CANT_REPEAT_CREATE;
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CREATED_ERROR;
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.DUMMY_TASK_CREATED_NOT_SUPPORT;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static org.flowable.task.api.Task.DEFAULT_PRIORITY;
|
||||
|
||||
/**
|
||||
@ -125,6 +130,7 @@ public class CustomCreateDummyTaskCmd extends AbstractCommand<String> implements
|
||||
taskService.saveTask(task);
|
||||
|
||||
if (Objects.nonNull(operator)) {
|
||||
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||
CommandContextUtil.getEntityCache().findInCache(HistoricTaskInstanceEntity.class).stream()
|
||||
.filter(i -> Objects.equals(i.getId(), task.getId())).findAny()
|
||||
.ifPresent(i -> i.setAssignee(operator.buildAssigneeId()));
|
||||
@ -154,4 +160,11 @@ public class CustomCreateDummyTaskCmd extends AbstractCommand<String> implements
|
||||
}
|
||||
}
|
||||
|
||||
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||
if (categoryVersion > 0 && !StringUtils.hasText(operator.getNodeId())) {
|
||||
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "审批人");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -38,18 +38,22 @@ public class CustomForecastUserTaskAssigneeCmd extends AbstractCommand<List<Bpmn
|
||||
private final String processInstanceId;
|
||||
private final UserTask userTask;
|
||||
private final EngineExecutionStartListener engineExecutionStartListener;
|
||||
private final Integer categoryVersion;
|
||||
|
||||
public CustomForecastUserTaskAssigneeCmd(String processInstanceId, UserTask userTask,
|
||||
EngineExecutionStartListener engineExecutionStartListener) {
|
||||
EngineExecutionStartListener engineExecutionStartListener,
|
||||
Integer categoryVersion) {
|
||||
this.processInstanceId = processInstanceId;
|
||||
this.userTask = userTask;
|
||||
this.engineExecutionStartListener = engineExecutionStartListener;
|
||||
this.categoryVersion = categoryVersion;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String paramToJsonString() {
|
||||
Map<String, Object> params = new HashMap<>();
|
||||
params.put("processInstanceId", processInstanceId);
|
||||
params.put("categoryVersion", categoryVersion);
|
||||
return JSON.toJSONString(params);
|
||||
}
|
||||
|
||||
@ -73,8 +77,10 @@ public class CustomForecastUserTaskAssigneeCmd extends AbstractCommand<List<Bpmn
|
||||
BpmnMetaParserHelper.getApproverEmptyHandleType(userTask).ifPresent(type -> {
|
||||
switch (type) {
|
||||
case transferToAdmin:
|
||||
forecastAssigners.addAll(engineExecutionStartListener.approverSelect(ApproverEmptyHandleTypeEnum.transferToAdmin.getType(), userTask,
|
||||
(DelegateExecution) list.get(0), false));
|
||||
if (categoryVersion < 2) {
|
||||
forecastAssigners.addAll(engineExecutionStartListener.approverSelect(ApproverEmptyHandleTypeEnum.transferToAdmin.getType(), userTask,
|
||||
(DelegateExecution) list.get(0), false));
|
||||
}
|
||||
break;
|
||||
case specifyAssignee:
|
||||
BpmnMetaParserHelper.getEmptyApproverSpecify(userTask)
|
||||
|
||||
@ -125,7 +125,9 @@ public class CustomRejectionTaskCmd extends AbstractCommand<Void> implements Ser
|
||||
variables.put(INTERNAL_DELETE_PROCESS_FLAG, INTERNAL_PROCESS_TYPE_REJECT);
|
||||
variables.put(INTERNAL_PROCESS_DELETE_REASON, reason);
|
||||
runtimeService.setVariables(task.getProcessInstanceId(), variables);
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
||||
if (Objects.nonNull(approver)) {
|
||||
runtimeService.setVariable(task.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, approver);
|
||||
}
|
||||
CommandContextUtil.getAgenda(commandContext)
|
||||
.planOperation(new DeleteProcessInstanceOperation(commandContext, task.getProcessInstanceId(),
|
||||
extAxHiTaskInstService, REJECTED));
|
||||
|
||||
@ -1,14 +1,17 @@
|
||||
package cn.axzo.workflow.core.engine.cmd;
|
||||
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
|
||||
import cn.axzo.workflow.core.engine.job.AsyncResetApproversUserTaskJobHandler;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||
import org.flowable.job.service.JobService;
|
||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||
@ -17,6 +20,8 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
||||
|
||||
/**
|
||||
@ -51,6 +56,8 @@ public class CustomResetTaskApproversAsyncCmd extends AbstractCommand<Void> impl
|
||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
|
||||
|
||||
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||
|
||||
validTask(historicTaskInstance, task, dto.getOriginAssigner(), null);
|
||||
|
||||
startAsync(processEngineConfiguration, task);
|
||||
@ -78,4 +85,12 @@ public class CustomResetTaskApproversAsyncCmd extends AbstractCommand<Void> impl
|
||||
jobService.scheduleAsyncJob(job);
|
||||
}
|
||||
|
||||
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||
boolean present = dto.getTargetAssignerList().stream().anyMatch(assigner -> !org.springframework.util.StringUtils.hasText(assigner.getNodeId()));
|
||||
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||
if (categoryVersion > 0 && present) {
|
||||
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "审批人");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package cn.axzo.workflow.core.engine.cmd;
|
||||
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper;
|
||||
@ -7,12 +8,14 @@ import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
import org.flowable.common.engine.impl.identity.Authentication;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||
import org.flowable.task.api.Task;
|
||||
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
|
||||
@ -24,6 +27,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||
@ -33,6 +37,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_ASSIGNEE_SKIP_
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TASK_COMPLETE_OPERATION_TYPE;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.UPGRADED;
|
||||
import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner.buildDummyAssigner;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
||||
@ -83,7 +88,7 @@ public class CustomResetTaskApproversCmd extends AbstractCommand<Void> implement
|
||||
|
||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(originTaskId).singleResult();
|
||||
|
||||
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||
validTask(historicTaskInstance, task, originTaskAssignee, null);
|
||||
|
||||
resolveOriginTask(commandContext, taskService, task);
|
||||
@ -151,4 +156,12 @@ public class CustomResetTaskApproversCmd extends AbstractCommand<Void> implement
|
||||
taskService.saveTask(task);
|
||||
}
|
||||
|
||||
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||
boolean present = targetTaskAssigneeList.stream().anyMatch(assigner -> !org.springframework.util.StringUtils.hasText(assigner.getNodeId()));
|
||||
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||
if (categoryVersion > 0 && present) {
|
||||
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "审批人");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -5,10 +5,13 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
|
||||
import cn.axzo.workflow.core.engine.job.AsyncTransferUserTaskJobHandler;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||
import org.flowable.job.service.JobService;
|
||||
import org.flowable.job.service.impl.persistence.entity.JobEntity;
|
||||
import org.flowable.task.api.Task;
|
||||
@ -19,6 +22,8 @@ import org.flowable.task.service.impl.persistence.entity.TaskEntity;
|
||||
import java.io.Serializable;
|
||||
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TRANSFER_TO_SELF;
|
||||
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask;
|
||||
|
||||
/**
|
||||
@ -48,8 +53,11 @@ public class CustomTransferUserTaskAsyncCmd extends AbstractCommand<Void> implem
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
|
||||
HistoricTaskInstanceQuery taskQuery = processEngineConfiguration.getHistoryService().createHistoricTaskInstanceQuery();
|
||||
HistoricTaskInstance historicTaskInstance = taskQuery.taskId(dto.getTaskId()).singleResult();
|
||||
|
||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||
Task task = taskService.createTaskQuery().taskId(dto.getTaskId()).singleResult();
|
||||
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||
|
||||
validTask(historicTaskInstance, (TaskEntity) task, dto.getOriginAssigner(), null);
|
||||
startAsync(processEngineConfiguration, task);
|
||||
return null;
|
||||
@ -76,4 +84,12 @@ public class CustomTransferUserTaskAsyncCmd extends AbstractCommand<Void> implem
|
||||
jobService.scheduleAsyncJob(job);
|
||||
}
|
||||
|
||||
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||
if (categoryVersion > 0 && StringUtils.isBlank(dto.getTargetAssigner().getNodeId())) {
|
||||
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "审批人");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -7,12 +7,14 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Lists;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
import org.flowable.common.engine.impl.identity.Authentication;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandContext;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||
import org.flowable.task.api.Task;
|
||||
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
|
||||
@ -28,6 +30,7 @@ import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TRANSFER_TO_SELF;
|
||||
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_OPERATION_DESC;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||
@ -37,6 +40,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.TRANSFER_TO;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.TRANSFER_TO_ADVICE;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.TRANSFER;
|
||||
import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner.buildDummyAssigner;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addComment;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.addMultiTask;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.batchAddAttachment;
|
||||
@ -97,6 +101,8 @@ public class CustomTransferUserTaskCmd extends AbstractCommand<Void> implements
|
||||
TaskService taskService = processEngineConfiguration.getTaskService();
|
||||
TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(originTaskId).singleResult();
|
||||
|
||||
validTargetAssigneeNodeId(task.getProcessDefinitionId());
|
||||
|
||||
validTask(historicTaskInstance, task, originTaskAssignee, null);
|
||||
|
||||
|
||||
@ -123,6 +129,14 @@ public class CustomTransferUserTaskCmd extends AbstractCommand<Void> implements
|
||||
return null;
|
||||
}
|
||||
|
||||
private void validTargetAssigneeNodeId(String processDefinitionId) {
|
||||
BpmnModel bpmnModel = ProcessDefinitionUtil.getBpmnModel(processDefinitionId);
|
||||
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(0);
|
||||
if (categoryVersion > 0 && StringUtils.isBlank(targetTaskAssignee.getNodeId())) {
|
||||
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "审批人");
|
||||
}
|
||||
}
|
||||
|
||||
private void resolveOriginTask(CommandContext commandContext, TaskService taskService, TaskEntity task) {
|
||||
BpmnTaskDelegateAssigner assigner = buildDummyAssigner("transfer", TASK_ASSIGNEE_SKIP_FLAT, "dummyApprover");
|
||||
task.setAssignee(assigner.buildAssigneeId());
|
||||
|
||||
@ -38,6 +38,7 @@ import java.util.concurrent.atomic.AtomicReference;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getActivitySignature;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCarbonCopyConfigs;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig;
|
||||
import static cn.axzo.workflow.core.listener.AbstractBpmnEventListener.parseProcessDefinitionKey;
|
||||
|
||||
@ -74,14 +75,14 @@ public class EngineCarbonCopyEventListener implements JavaDelegate {
|
||||
String processInstanceId = execution.getProcessInstanceId();
|
||||
CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor();
|
||||
Process mainProcess = ProcessDefinitionUtil.getBpmnModel(processDefinitionId).getMainProcess();
|
||||
|
||||
Integer categoryVersion = getCategoryVersion(mainProcess).orElse(0);
|
||||
ServiceTask serviceTask = (ServiceTask) mainProcess.getFlowElement(currentActivityId);
|
||||
|
||||
List<BpmnTaskDelegateAssigner> carbonUsers = new ArrayList<>();
|
||||
getCarbonCopyConfigs(serviceTask).ifPresent(carbons -> {
|
||||
carbonUsers.addAll(commandExecutor.execute(new CustomCarbonCopyUserSelectorCmd(processInstanceId,
|
||||
carbons, serviceTask, engineExecutionStartListener,
|
||||
historicTaskInstanceConverter, serviceVersion, execution)));
|
||||
historicTaskInstanceConverter, serviceVersion, categoryVersion, execution)));
|
||||
});
|
||||
|
||||
RuntimeService runtimeService =
|
||||
|
||||
@ -0,0 +1,128 @@
|
||||
package cn.axzo.workflow.core.engine.listener;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.ExtHiTaskSearchDTO;
|
||||
import cn.axzo.workflow.core.engine.event.MessagePushEventBuilder;
|
||||
import cn.axzo.workflow.core.engine.event.MessagePushEventImpl;
|
||||
import cn.axzo.workflow.core.engine.event.MessagePushEventType;
|
||||
import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst;
|
||||
import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
|
||||
import cn.axzo.workflow.core.service.converter.BpmnHistoricTaskInstanceConverter;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.Process;
|
||||
import org.flowable.bpmn.model.ServiceTask;
|
||||
import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.flowable.engine.delegate.JavaDelegate;
|
||||
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
|
||||
import org.flowable.engine.impl.util.CommandContextUtil;
|
||||
import org.flowable.engine.impl.util.ProcessDefinitionUtil;
|
||||
import org.flowable.spring.SpringProcessEngineConfiguration;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.cloud.context.config.annotation.RefreshScope;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CARBON_ASSIGNER_LIMIT_NUMBER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getActivitySignature;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNoticeConfig;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimitedElementList;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId;
|
||||
import static cn.axzo.workflow.core.listener.AbstractBpmnEventListener.parseProcessDefinitionKey;
|
||||
|
||||
/**
|
||||
* 抄送功能的具体实现
|
||||
* <p>
|
||||
* 只负责完成抄送自身功能即可, 关于审批日志中需要记录抄送节点的功能,由 CustomServiceTaskDelegateExpressionActivityBehavior 完成
|
||||
*
|
||||
* @author wangli
|
||||
* @since 08/03/2024 17:17
|
||||
*/
|
||||
@Component
|
||||
@RefreshScope
|
||||
@Slf4j
|
||||
public class EngineCarbonCopyV2EventListener implements JavaDelegate {
|
||||
@Value("${workflow.carbonCopyTemplateCode}")
|
||||
private String carbonCopyTemplateCode;
|
||||
@Resource
|
||||
private EngineExecutionStartListener engineExecutionStartListener;
|
||||
@Resource
|
||||
private SpringProcessEngineConfiguration springProcessEngineConfiguration;
|
||||
@Resource
|
||||
private ExtAxHiTaskInstService extAxHiTaskInstService;
|
||||
|
||||
@Override
|
||||
public void execute(DelegateExecution execution) {
|
||||
log.info("EngineCarbonCopyEventListener exec...,processInstanceId: {}", execution.getProcessInstanceId());
|
||||
String currentActivityId = execution.getCurrentActivityId();
|
||||
String processDefinitionId = execution.getProcessDefinitionId();
|
||||
String processInstanceId = execution.getProcessInstanceId();
|
||||
Process mainProcess = ProcessDefinitionUtil.getBpmnModel(processDefinitionId).getMainProcess();
|
||||
|
||||
ServiceTask serviceTask = (ServiceTask) mainProcess.getFlowElement(currentActivityId);
|
||||
|
||||
List<BpmnTaskDelegateAssigner> carbonUsers = new ArrayList<>();
|
||||
getApproverSpecify(serviceTask).ifPresent(specify -> {
|
||||
carbonUsers.addAll(engineExecutionStartListener.approverSelect(specify.getType(), serviceTask, execution, false));
|
||||
});
|
||||
|
||||
List<BpmnTaskDelegateAssigner> limitedAssigners = getLimitedElementList(removeDuplicateByPersonId(carbonUsers), CARBON_ASSIGNER_LIMIT_NUMBER);
|
||||
|
||||
RuntimeService runtimeService =
|
||||
springProcessEngineConfiguration.getProcessEngineConfiguration().getRuntimeService();
|
||||
runtimeService.setVariable(processInstanceId,
|
||||
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + currentActivityId, limitedAssigners);
|
||||
|
||||
// 发送抄送事件
|
||||
invokeCarbonCopy(limitedAssigners, getNoticeConfig(mainProcess), getActivitySignature(serviceTask), execution);
|
||||
}
|
||||
|
||||
private void invokeCarbonCopy(List<BpmnTaskDelegateAssigner> carbonUsers,
|
||||
Optional<BpmnNoticeConf> noticeConf,
|
||||
Boolean activitySignature, DelegateExecution execution) {
|
||||
if (CollectionUtils.isEmpty(carbonUsers)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
|
||||
FlowableEventDispatcher eventDispatcher = processEngineConfiguration.getEventDispatcher();
|
||||
|
||||
BpmnNoticeConf bpmnNoticeConf = noticeConf.map(conf -> {
|
||||
if (!StringUtils.hasText(conf.getCarbonCopy().getCarbonCopyMessageId())) {
|
||||
conf.getCarbonCopy().setCarbonCopyMessageId(carbonCopyTemplateCode);
|
||||
}
|
||||
return conf;
|
||||
}).orElse(null);
|
||||
MessagePushEventImpl event = MessagePushEventBuilder.createEvent(MessagePushEventType.CARBON_COPY,
|
||||
carbonUsers, bpmnNoticeConf, execution.getProcessInstanceId(),
|
||||
parseProcessDefinitionKey(execution.getProcessDefinitionId()),
|
||||
execution.getTenantId(), getCarbonTaskId(execution), activitySignature);
|
||||
eventDispatcher.dispatchEvent(event, processEngineConfiguration.getEngineCfgKey());
|
||||
}
|
||||
|
||||
private String getCarbonTaskId(DelegateExecution execution) {
|
||||
AtomicReference<String> taskId = new AtomicReference<>(null);
|
||||
ExtHiTaskSearchDTO searchDTO = new ExtHiTaskSearchDTO();
|
||||
searchDTO.setProcessInstanceId(execution.getProcessInstanceId());
|
||||
searchDTO.setTaskDefinitionKey(execution.getCurrentActivityId());
|
||||
extAxHiTaskInstService.queryList(searchDTO)
|
||||
.stream()
|
||||
.max(Comparator.comparing(ExtAxHiTaskInst::getCreateAt))
|
||||
.ifPresent(i -> taskId.set(i.getTaskId()));
|
||||
return taskId.get();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -63,6 +63,7 @@ import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAs
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprovalMethod;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessServerVersion;
|
||||
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimitedElementList;
|
||||
@ -102,11 +103,12 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
|
||||
// 从 version=1.2.1-SNAPSHOT 开始,才给 process 节点增加了 serverVersion 属性
|
||||
Optional<String> processServerVersion = getProcessServerVersion(mainProcess);
|
||||
Optional<Integer> categoryVersion = getCategoryVersion(mainProcess);
|
||||
if (processServerVersion.isPresent()) {
|
||||
// 创建检查下个节点的配置
|
||||
createCheckNextActivityJob(execution.getProcessInstanceId(), currentActivityId);
|
||||
calcTaskAssigner121(execution, userTask, processServerVersion.get(), assigneeListVariableName,
|
||||
currentActivityId);
|
||||
currentActivityId, categoryVersion.orElse(0));
|
||||
} else {
|
||||
calcTaskAssignerDefault(execution, userTask, currentActivityId, assigneeListVariableName);
|
||||
}
|
||||
@ -139,7 +141,7 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
}
|
||||
|
||||
private void calcTaskAssigner121(DelegateExecution execution, UserTask userTask, String processServerVersion,
|
||||
String assigneeListVariableName, String currentActivityId) {
|
||||
String assigneeListVariableName, String currentActivityId, Integer categoryVersion) {
|
||||
Optional<BpmnFlowNodeType> nodeType = getNodeType(userTask);
|
||||
DefaultArtifactVersion supportVersion = new DefaultArtifactVersion(FLOW_SERVER_VERSION_121);
|
||||
DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(processServerVersion);
|
||||
@ -184,8 +186,8 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
assigners.addAll(approverSelect(specify.getType(), userTask, execution, true));
|
||||
});
|
||||
|
||||
// 审批候选人为空时的兜底
|
||||
emptyAssigneeHandle(assigners, userTask, execution);
|
||||
// 审批候选人为空时的兜底,
|
||||
emptyAssigneeHandle(assigners, userTask, execution, categoryVersion);
|
||||
List<BpmnTaskDelegateAssigner> resultAssigners = getLimitedElementList(assigners, APPROVAL_ASSIGNER_LIMIT_NUMBER);
|
||||
for (BpmnTaskDelegateAssigner user : resultAssigners) {
|
||||
assigneeIdList.add(user.buildAssigneeId());
|
||||
@ -211,7 +213,7 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
* @param execution 当前执行实例
|
||||
*/
|
||||
private void emptyAssigneeHandle(List<BpmnTaskDelegateAssigner> assigners, UserTask userTask,
|
||||
DelegateExecution execution) {
|
||||
DelegateExecution execution, Integer categoryVersion) {
|
||||
// 审批人为空并且当前节点设置了自动跳过条件
|
||||
if (!CollectionUtils.isEmpty(assigners)) {
|
||||
return;
|
||||
@ -226,8 +228,10 @@ public class EngineExecutionStartListener implements ExecutionListener {
|
||||
// 自动通过和驳回, 统一由 cn.axzo.workflow.server.controller.listener.task.AutoOperatorEventListener 来处理
|
||||
break;
|
||||
case transferToAdmin:
|
||||
assigners.addAll(approverSelect(ApproverEmptyHandleTypeEnum.transferToAdmin.getType(), userTask,
|
||||
execution, true));
|
||||
if (categoryVersion < 2) {
|
||||
assigners.addAll(approverSelect(ApproverEmptyHandleTypeEnum.transferToAdmin.getType(), userTask,
|
||||
execution, true));
|
||||
}
|
||||
|
||||
finalEmptyAssigneeHandle(assigners, userTask, execution, "未找到审批人且转交管理员失败,自动中止", "karma: " + (refreshProperties.getUseNewToAdminApi() ? "api/flow/listTaskAssignerAdmin/v2" : "api/flow/listTaskAssignerAdmin"));
|
||||
break;
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
package cn.axzo.workflow.core.engine.tx.listener;
|
||||
|
||||
import cn.axzo.framework.jackson.utility.JSON;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.engine.cmd.CustomApproveTaskAsyncCmd;
|
||||
@ -53,7 +54,7 @@ public class AutoPassTransactionListener implements TransactionListener {
|
||||
RuntimeService runtimeService = springProcessEngineConfiguration.getRuntimeService();
|
||||
BpmnTaskDelegateAssigner assigner = BpmnTaskDelegateAssigner.toObjectCompatible(
|
||||
runtimeService.getVariable(delegateTask.getProcessInstanceId(), INTERNAL_TASK_RELATION_ASSIGNEE_INFO + delegateTask.getId()));
|
||||
|
||||
log.info("auto pass transaction listener, assigner: {}", JSON.toJSONString(assigner));
|
||||
CommandConfig commandConfig = new CommandConfig().transactionRequired();
|
||||
CommandExecutor commandExecutor = springProcessEngineConfiguration.getCommandExecutor();
|
||||
BpmnTaskAuditDTO pass = new BpmnTaskAuditDTO();
|
||||
|
||||
@ -79,4 +79,9 @@ public class ExtAxDict extends BaseEntity<ExtAxDict> {
|
||||
* 是否展示在发起工作台
|
||||
*/
|
||||
private Boolean displayInitiateMenu;
|
||||
|
||||
/**
|
||||
* 版本号
|
||||
*/
|
||||
private Integer version;
|
||||
}
|
||||
|
||||
@ -8,11 +8,9 @@ import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
|
||||
import cn.axzo.workflow.core.conf.handler.ButtonConfTypeHandler;
|
||||
import cn.axzo.workflow.core.conf.handler.ListAssigneeTypeHandler;
|
||||
import cn.axzo.workflow.core.conf.handler.ListFormFieldPermissionTypeHandler;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
|
||||
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
@ -77,7 +75,7 @@ public class ExtAxProcessLog extends BaseEntity<ExtAxProcessLog> {
|
||||
/**
|
||||
* 审批人对象信息
|
||||
*/
|
||||
@TableField(typeHandler = ListAssigneeTypeHandler.class)
|
||||
@TableField(value = "assignee_full", typeHandler = ListAssigneeTypeHandler.class)
|
||||
private List<BpmnTaskDelegateAssigner> assigneeFull;
|
||||
/**
|
||||
* 审批人标识
|
||||
|
||||
@ -3,6 +3,7 @@ package cn.axzo.workflow.core.service;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
|
||||
@ -136,6 +137,14 @@ public interface BpmnProcessInstanceService {
|
||||
*/
|
||||
BpmnProcessInstanceVO getProcessInstanceVO(BpmnProcessInstanceQueryDTO dto);
|
||||
|
||||
/**
|
||||
* 批量获得流程实例 VO 信息
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
List<BpmnProcessInstanceVO> getBatchProcessInstanceVO(BpmnProcessInstanceBatchQueryDTO dto);
|
||||
|
||||
ObjectNode getProcessInstanceGraphical(String processInstanceId, @Nullable String tenantId);
|
||||
|
||||
BpmPageResult<HistoricProcessInstanceVO> historicProcessInstancePage(HistoricProcessInstanceSearchDTO dto);
|
||||
@ -184,6 +193,7 @@ public interface BpmnProcessInstanceService {
|
||||
|
||||
/**
|
||||
* 获取指定流程实例对应的模型 ID
|
||||
*
|
||||
* @param processInstanceId
|
||||
* @return
|
||||
*/
|
||||
|
||||
@ -165,7 +165,8 @@ public class BpmnProcessDefinitionServiceImpl implements BpmnProcessDefinitionSe
|
||||
dto.getJsonModel().getNoticeConf(),
|
||||
dto.getJsonModel().getButtonConf(),
|
||||
dto.getJsonModel().getFieldConf(),
|
||||
serviceVersion);
|
||||
serviceVersion,
|
||||
optCategory.get().getVersion());
|
||||
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
||||
updateProcessDefinition(model.getId(), bpmn);
|
||||
}
|
||||
|
||||
@ -22,6 +22,7 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateDTO;
|
||||
@ -93,6 +94,7 @@ import com.alibaba.fastjson.JSON;
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.BpmnModel;
|
||||
@ -154,6 +156,7 @@ import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.client.config.WorkflowRequestInterceptor.HEADER_SERVER_NAME;
|
||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CREATE_PARAM_ERROR;
|
||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_ID_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.RUNNING_INSTANCE_ONLY_FORECAST;
|
||||
@ -162,6 +165,7 @@ import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS
|
||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_IS_INVALID;
|
||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_IS_SUSPENDED;
|
||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_KEY_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.code.OtherRespCode.ASSIGNEE_NODE_ID_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.AND_SIGN_EXPRESSION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BPMN_FILE_SUFFIX;
|
||||
@ -187,9 +191,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_PROCESS_ENABLE
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.SIGN_VARIABLE;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.WORKFLOW_ENGINE_VERSION;
|
||||
import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE_PROCESS;
|
||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoPassed;
|
||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoPassed_empty;
|
||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoRejection;
|
||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoRejection_empty;
|
||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.human;
|
||||
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.transferToAdmin;
|
||||
@ -211,6 +213,7 @@ import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.DELETE
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.REJECTED;
|
||||
import static cn.axzo.workflow.common.enums.WorkspaceType.GOVERNMENT;
|
||||
import static cn.axzo.workflow.common.enums.WorkspaceType.PROJECT;
|
||||
import static cn.axzo.workflow.common.util.BpmnNativeQueryUtil.countSql;
|
||||
import static cn.axzo.workflow.common.util.BpmnNativeQueryUtil.sqlConnectors;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getActivitySignature;
|
||||
@ -220,6 +223,11 @@ import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprove
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCarbonCopyConfigs;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCategoryVersion;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeCooperateShipTypes;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getExcludeIdentityTypes;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifiedFilter;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorSpecifyRange;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSignApproverLimit;
|
||||
@ -421,6 +429,10 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
.approvalMethodEnum(getApprovalMethod(fe).orElse(null))
|
||||
.approverScopeEnum(getApproverScope(fe).orElse(null))
|
||||
.approverSpecifyEnum(approverSpecifyEnum)
|
||||
.initiatorSpecifyRange(getInitiatorSpecifyRange(fe).orElse(null))
|
||||
.initiatorSpecifiedFilter(getInitiatorSpecifiedFilter(fe).orElse(null))
|
||||
.excludeIdentityTypes(getExcludeIdentityTypes(fe).orElse(null))
|
||||
.excludeCooperateShipTypes(getExcludeCooperateShipTypes(fe).orElse(null))
|
||||
.approverEmptyHandleTypeEnum(getApproverEmptyHandleType(fe).orElse(null))
|
||||
.signature(getActivitySignature(fe))
|
||||
.signApproverLimit(getSignApproverLimit(fe).orElse(null))
|
||||
@ -466,7 +478,15 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
throw new WorkflowEngineException(PROCESS_DEFINITION_IS_INVALID, dto.getProcessDefinitionKey());
|
||||
}
|
||||
}
|
||||
|
||||
//新版入参 nodeId 校验
|
||||
if (categoryItemVO.isPresent() && categoryItemVO.get().getWorkspaceTypeCode().equals(String.valueOf(PROJECT.getCode())) && categoryItemVO.get().getVersion() > 0) {
|
||||
if (Objects.isNull(dto.getCooperationOrg().getNodeId())) {
|
||||
throw new WorkflowEngineException(PROCESS_INSTANCE_CREATE_PARAM_ERROR);
|
||||
}
|
||||
if (!StringUtils.hasText(dto.getInitiator().getNodeId())) {
|
||||
throw new WorkflowEngineException(ASSIGNEE_NODE_ID_NOT_EXISTS, "发起人");
|
||||
}
|
||||
}
|
||||
categoryItemVO.ifPresent(itemVO -> {
|
||||
dto.getVariables().put(INTERNAL_PROCESS_WORKSPACE_TYPE, WorkspaceType.getType(Integer.valueOf(itemVO.getWorkspaceTypeCode())).getCode());
|
||||
dto.getVariables().put(INTERNAL_PROCESS_BIZ_TYPE, itemVO.getBusinessType().getType());
|
||||
@ -811,6 +831,61 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
processInstance.getProcessDefinitionKey()), runningTasks);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnProcessInstanceVO> getBatchProcessInstanceVO(BpmnProcessInstanceBatchQueryDTO dto) {
|
||||
List<HistoricProcessInstance> processInstanceList = historyService.createHistoricProcessInstanceQuery().processInstanceIds(Sets.newHashSet(dto.getProcessInstanceIds())).list();
|
||||
Map<String, Map<String, Object>> variableMaps = historyService.createNativeHistoricVariableInstanceQuery()
|
||||
.sql("select * from act_hi_varinst where PROC_INST_ID_ in (#{ids}) and (NAME_ = '" + INTERNAL_INITIATOR + "' or NAME_ = '" + OLD_INTERNAL_INITIATOR + "' or NAME_ = '" + WORKFLOW_ENGINE_VERSION + "')")
|
||||
.parameter("ids", dto.getProcessInstanceIds()).list()
|
||||
.stream()
|
||||
.collect(Collectors.groupingBy(HistoricVariableInstance::getProcessInstanceId, Collectors.toMap(HistoricVariableInstance::getVariableName, HistoricVariableInstance::getValue, (s, t) -> s)));
|
||||
Map<String, Task> taskMaps = taskService.createTaskQuery().processInstanceIdIn(dto.getProcessInstanceIds())
|
||||
.active()
|
||||
.list()
|
||||
.stream().collect(Collectors.groupingBy(
|
||||
Task::getProcessInstanceId,
|
||||
Collectors.collectingAndThen(
|
||||
Collectors.maxBy(Comparator.comparing(Task::getCreateTime)),
|
||||
Optional::get
|
||||
)
|
||||
));
|
||||
|
||||
|
||||
Map<String, CategoryItemVO> categoryMaps = categoryService.getByValues(processInstanceList.stream().map(HistoricProcessInstance::getProcessDefinitionKey).filter(StringUtils::hasText).distinct().collect(Collectors.toList()))
|
||||
.stream()
|
||||
.filter(i -> Objects.equals(i.getType(), BPM_MODEL_CATEGORY))
|
||||
.collect(Collectors.toMap(CategoryItemVO::getValue, Function.identity(), (s, t) -> s));
|
||||
return processInstanceList.stream().map(e -> {
|
||||
BpmnProcessInstanceVO vo = new BpmnProcessInstanceVO();
|
||||
vo.setId(e.getId());
|
||||
vo.setName(e.getName());
|
||||
vo.setCategory(e.getProcessDefinitionKey());
|
||||
CategoryItemVO category = categoryMaps.getOrDefault(e.getProcessDefinitionKey(), null);
|
||||
if (Objects.nonNull(category)) {
|
||||
vo.setCategoryDesc(category.getLabel());
|
||||
vo.setWorkspaceType(WorkspaceType.getType(Integer.valueOf(category.getWorkspaceTypeCode())));
|
||||
}
|
||||
vo.setResult(BpmnProcessInstanceResultEnum.valueOfStatus(e.getBusinessStatus()));
|
||||
vo.setCreateAt(e.getStartTime());
|
||||
vo.setEndTime(e.getEndTime());
|
||||
vo.setProcessDefinitionKey(e.getProcessDefinitionKey());
|
||||
vo.setProcessDefinitionId(e.getProcessDefinitionId());
|
||||
vo.setBusinessKey(e.getBusinessKey());
|
||||
vo.setBusinessStatus(e.getBusinessStatus());
|
||||
vo.setTenantId(e.getTenantId());
|
||||
Task task = taskMaps.getOrDefault(e.getId(), null);
|
||||
if (Objects.nonNull(task)) {
|
||||
vo.setCurrentDefinitionKey(task.getTaskDefinitionKey());
|
||||
}
|
||||
Map<String, Object> variables = variableMaps.getOrDefault(e.getId(), Collections.emptyMap());
|
||||
if (!CollectionUtils.isEmpty(variables)) {
|
||||
vo.setInitiator(BpmnTaskDelegateAssigner.toObjectCompatible(variables.getOrDefault(INTERNAL_INITIATOR, variables.getOrDefault(OLD_INTERNAL_INITIATOR, null))));
|
||||
vo.setWorkflowEngineVersion(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, "").toString());
|
||||
}
|
||||
return vo;
|
||||
}).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得流程实例 Map
|
||||
*
|
||||
@ -1033,6 +1108,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
String startNodeDefinitionKey,
|
||||
Boolean containSelf) {
|
||||
BpmnModel bpmnModel = repositoryService.getBpmnModel(instance.getProcessDefinitionId());
|
||||
Integer categoryVersion = getCategoryVersion(bpmnModel.getMainProcess()).orElse(1);
|
||||
List<ProcessNodeDetailVO> resultList = new ArrayList<>(flowElements.size());
|
||||
// 发起人节点,也是一个 UserTask 节点, 所以这里默认就包含了发起人节点
|
||||
flowElements.stream()
|
||||
@ -1054,9 +1130,9 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
node.setNodeMode(GENERAL);
|
||||
node.setId(i.getId()).setName(i.getName());
|
||||
if (i instanceof UserTask) {
|
||||
parseUserTask(processInstanceId, (UserTask) i, node, nodeDefinitionKeys);
|
||||
parseUserTask(processInstanceId, (UserTask) i, node, nodeDefinitionKeys, categoryVersion);
|
||||
} else if (i instanceof ServiceTask) {
|
||||
parseServiceTask(processInstanceId, (ServiceTask) i, node, nodeDefinitionKeys);
|
||||
parseServiceTask(processInstanceId, (ServiceTask) i, node, nodeDefinitionKeys, categoryVersion);
|
||||
}
|
||||
resultList.add(node);
|
||||
});
|
||||
@ -1064,21 +1140,28 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
}
|
||||
|
||||
private void parseServiceTask(String processInstanceId, ServiceTask i, ProcessNodeDetailVO
|
||||
node, List<String> skipTaskDefinitionKeys) {
|
||||
node, List<String> skipTaskDefinitionKeys, Integer categoryVersion) {
|
||||
// ServiceTask 主要作用于抄送
|
||||
node.setId(i.getId()).setName(i.getName());
|
||||
if (skipTaskDefinitionKeys.contains(i.getId())) {
|
||||
return;
|
||||
}
|
||||
getCarbonCopyConfigs(i).ifPresent(carbons ->
|
||||
node.setForecastAssigners(springProcessEngineConfiguration.getCommandExecutor()
|
||||
.execute(new CustomCarbonCopyUserSelectorCmd(processInstanceId, carbons,
|
||||
i, engineExecutionStartListener,
|
||||
historicTaskInstanceConverter, serviceVersion))));
|
||||
if (categoryVersion < 2) {
|
||||
getCarbonCopyConfigs(i).ifPresent(carbons ->
|
||||
node.setForecastAssigners(springProcessEngineConfiguration.getCommandExecutor()
|
||||
.execute(new CustomCarbonCopyUserSelectorCmd(processInstanceId, carbons,
|
||||
i, engineExecutionStartListener,
|
||||
historicTaskInstanceConverter, serviceVersion, categoryVersion))));
|
||||
} else {
|
||||
node.setForecastAssigners(springProcessEngineConfiguration.getCommandExecutor()
|
||||
.execute(new CustomCarbonCopyUserSelectorCmd(processInstanceId, null,
|
||||
i, engineExecutionStartListener,
|
||||
historicTaskInstanceConverter, serviceVersion, categoryVersion)));
|
||||
}
|
||||
}
|
||||
|
||||
private void parseUserTask(String processInstanceId, UserTask i, ProcessNodeDetailVO
|
||||
node, List<String> skipTaskDefinitionKeys) {
|
||||
node, List<String> skipTaskDefinitionKeys, Integer categoryVersion) {
|
||||
node.setFormKey(i.getFormKey());
|
||||
// 设置审批模式,
|
||||
if (i.getBehavior() instanceof MultiInstanceActivityBehavior) {
|
||||
@ -1099,7 +1182,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
List<BpmnTaskDelegateAssigner> forecastAssigners =
|
||||
springProcessEngineConfiguration.getCommandExecutor()
|
||||
.execute(new CustomForecastUserTaskAssigneeCmd(processInstanceId,
|
||||
i, engineExecutionStartListener));
|
||||
i, engineExecutionStartListener, categoryVersion));
|
||||
node.setForecastAssigners(forecastAssigners);
|
||||
if (CollectionUtils.isEmpty(forecastAssigners)) {
|
||||
getApproverEmptyHandleType(i).ifPresent(emptyHandleType -> {
|
||||
@ -1415,7 +1498,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
.findAny()
|
||||
.ifPresent(i -> {
|
||||
authorizedButtons.addAll(chooseButtons(logVO, CONFIG_BUTTON_TYPE_CURRENT));
|
||||
supportUpgrade.set(Objects.equals(Boolean.TRUE,i.getSupportUpgradeApproval()));
|
||||
supportUpgrade.set(Objects.equals(Boolean.TRUE, i.getSupportUpgradeApproval()));
|
||||
});
|
||||
|
||||
|
||||
@ -1586,63 +1669,63 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
|
||||
ListUtils.emptyIfNull(forecasting).stream()
|
||||
.filter(i -> Objects.equals(Boolean.TRUE, i.getFutureNode()))
|
||||
.forEach(e -> {
|
||||
BpmnTaskInstanceLogVO build = BpmnTaskInstanceLogVO.builder()
|
||||
.taskDefinitionKey(e.getId())
|
||||
.name(e.getName())
|
||||
.approvalMethod(e.getApprovalMethod())
|
||||
.nodeType(e.getNodeType())
|
||||
.nodeMode(e.getNodeMode())
|
||||
.forecastAssignees(e.getForecastAssigners())
|
||||
.build();
|
||||
if (Objects.nonNull(e.getApprovalMethod())) {
|
||||
switch (e.getApprovalMethod()) {
|
||||
case bizSpecify:
|
||||
build.setOperationDesc("动态审批人");
|
||||
break;
|
||||
case nobody:
|
||||
build.setOperationDesc("系统处理");
|
||||
break;
|
||||
case autoPassed:
|
||||
build.setOperationDesc("无需审批人,自动同意");
|
||||
break;
|
||||
case autoRejection:
|
||||
build.setOperationDesc("无需审批人,自动驳回");
|
||||
break;
|
||||
case autoPassed_empty:
|
||||
build.setOperationDesc("未找到审批人,自动同意");
|
||||
break;
|
||||
case autoRejection_empty:
|
||||
build.setOperationDesc("未找到审批人,自动驳回");
|
||||
break;
|
||||
case transferToAdmin:
|
||||
build.setOperationDesc("找不到审批人且转交管理员失败,自动中止");
|
||||
break;
|
||||
case human:
|
||||
if (Objects.equals(e.getNodeMode(), EXCEPTIONAL)) {
|
||||
build.setOperationDesc("");
|
||||
} else {
|
||||
int countPerson = e.getForecastAssigners().size();
|
||||
if (Objects.equals(BpmnFlowNodeMode.AND, e.getNodeMode())) {
|
||||
build.setOperationDesc(countPerson + "人会签,需要全部同意");
|
||||
} else if (Objects.equals(BpmnFlowNodeMode.OR, e.getNodeMode())) {
|
||||
build.setOperationDesc(countPerson + "人或签,仅一人同意即可");
|
||||
}
|
||||
if (Objects.equals(countPerson, 1)) {
|
||||
// 如果未来节点是单人,则按单人节点展示
|
||||
build.setAssigneeSnapshot(build.getForecastAssignees().get(0));
|
||||
build.setOperationDesc(build.getAssigneeSnapshot().getAssignerName());
|
||||
build.setForecastAssignees(null);
|
||||
}
|
||||
BpmnTaskInstanceLogVO build = BpmnTaskInstanceLogVO.builder()
|
||||
.taskDefinitionKey(e.getId())
|
||||
.name(e.getName())
|
||||
.approvalMethod(e.getApprovalMethod())
|
||||
.nodeType(e.getNodeType())
|
||||
.nodeMode(e.getNodeMode())
|
||||
.forecastAssignees(e.getForecastAssigners())
|
||||
.build();
|
||||
if (Objects.nonNull(e.getApprovalMethod())) {
|
||||
switch (e.getApprovalMethod()) {
|
||||
case bizSpecify:
|
||||
build.setOperationDesc("动态审批人");
|
||||
break;
|
||||
case nobody:
|
||||
build.setOperationDesc("系统处理");
|
||||
break;
|
||||
case autoPassed:
|
||||
build.setOperationDesc("无需审批人,自动同意");
|
||||
break;
|
||||
case autoRejection:
|
||||
build.setOperationDesc("无需审批人,自动驳回");
|
||||
break;
|
||||
case autoPassed_empty:
|
||||
build.setOperationDesc("未找到审批人,自动同意");
|
||||
break;
|
||||
case autoRejection_empty:
|
||||
build.setOperationDesc("未找到审批人,自动驳回");
|
||||
break;
|
||||
case transferToAdmin:
|
||||
build.setOperationDesc("找不到审批人且转交管理员失败,自动中止");
|
||||
break;
|
||||
case human:
|
||||
if (Objects.equals(e.getNodeMode(), EXCEPTIONAL)) {
|
||||
build.setOperationDesc("");
|
||||
} else {
|
||||
int countPerson = e.getForecastAssigners().size();
|
||||
if (Objects.equals(BpmnFlowNodeMode.AND, e.getNodeMode())) {
|
||||
build.setOperationDesc(countPerson + "人会签,需要全部同意");
|
||||
} else if (Objects.equals(BpmnFlowNodeMode.OR, e.getNodeMode())) {
|
||||
build.setOperationDesc(countPerson + "人或签,仅一人同意即可");
|
||||
}
|
||||
if (Objects.equals(countPerson, 1)) {
|
||||
// 如果未来节点是单人,则按单人节点展示
|
||||
build.setAssigneeSnapshot(build.getForecastAssignees().get(0));
|
||||
build.setOperationDesc(build.getAssigneeSnapshot().getAssignerName());
|
||||
build.setForecastAssignees(null);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (Objects.equals(e.getNodeType(), NODE_CARBON_COPY)) {
|
||||
build.setOperationDesc("抄送" + e.getForecastAssigners().size() + "人");
|
||||
}
|
||||
build.setUpgradeApprovalConf(e.getUpgradeApprovalConf());
|
||||
tasks.add(build);
|
||||
});
|
||||
}
|
||||
if (Objects.equals(e.getNodeType(), NODE_CARBON_COPY)) {
|
||||
build.setOperationDesc("抄送" + e.getForecastAssigners().size() + "人");
|
||||
}
|
||||
build.setUpgradeApprovalConf(e.getUpgradeApprovalConf());
|
||||
tasks.add(build);
|
||||
});
|
||||
}
|
||||
|
||||
private void getHistoricTasks(List<ExtAxProcessLog> logs,
|
||||
|
||||
@ -282,7 +282,8 @@ public class BpmnProcessModelServiceImpl implements BpmnProcessModelService {
|
||||
dto.getJsonModel().getNoticeConf(),
|
||||
dto.getJsonModel().getButtonConf(),
|
||||
dto.getJsonModel().getFieldConf(),
|
||||
serviceVersion);
|
||||
serviceVersion,
|
||||
optCategory.get().getVersion());
|
||||
BpmnJsonConverterUtil.setCategory(bpmnModel, dto.getKey());
|
||||
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
||||
processDefinitionService.updateProcessDefinition(model.getId(), bpmn);
|
||||
@ -319,7 +320,7 @@ public class BpmnProcessModelServiceImpl implements BpmnProcessModelService {
|
||||
throw new WorkflowEngineException(MODEL_ID_NOT_EXISTS, processModelId);
|
||||
}
|
||||
if (Objects.nonNull(tenantId) && !Objects.equals(model.getTenantId(), tenantId)) {
|
||||
throw new WorkflowEngineException(MODEL_ID_NOT_EXISTS, tenantId);
|
||||
throw new WorkflowEngineException(MODEL_ID_NOT_EXISTS, processModelId);
|
||||
}
|
||||
return bpmnModelConverter.toVoParseDesc(model);
|
||||
}
|
||||
@ -376,7 +377,8 @@ public class BpmnProcessModelServiceImpl implements BpmnProcessModelService {
|
||||
dto.getJsonModel().getNoticeConf(),
|
||||
dto.getJsonModel().getButtonConf(),
|
||||
dto.getJsonModel().getFieldConf(),
|
||||
serviceVersion);
|
||||
serviceVersion,
|
||||
optCategory.get().getVersion());
|
||||
BpmnJsonConverterUtil.setCategory(bpmnModel, dto.getKey());
|
||||
byte[] bpmn = BpmnJsonConverterUtil.transformBytes(bpmnModel);
|
||||
processDefinitionService.updateProcessDefinition(originModel.getId(), bpmn);
|
||||
|
||||
@ -917,7 +917,7 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
|
||||
@Override
|
||||
public String findTaskIdByInstanceIdAndPersonId(String processInstanceId, String personId) {
|
||||
List<Task> list = taskService.createTaskQuery().processInstanceId(processInstanceId)
|
||||
.taskAssigneeLike("%" + personId)
|
||||
.taskAssigneeLike("%|" + personId)
|
||||
.active()
|
||||
.list();
|
||||
if (CollectionUtils.isEmpty(list) || list.size() > 1) {
|
||||
@ -929,7 +929,7 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
|
||||
@Override
|
||||
public Map<String, String> findTaskIdByInstanceIdsAndPersonId(List<String> processInstanceIds, String personId) {
|
||||
List<Task> tasks = taskService.createTaskQuery().processInstanceIdIn(processInstanceIds)
|
||||
.taskAssigneeLike("%" + personId)
|
||||
.taskAssigneeLike("%|" + personId)
|
||||
.active()
|
||||
.list();
|
||||
if (CollectionUtils.isEmpty(tasks)) {
|
||||
|
||||
@ -118,6 +118,7 @@ public class CategoryServiceImpl extends ServiceImpl<ExtAxDictMapper, ExtAxDict>
|
||||
dict.setBusinessType(dto.getBusinessType());
|
||||
dict.setIcon(dto.getIcon());
|
||||
dict.setDisplayInitiateMenu(dto.getDisplayInitiateMenu());
|
||||
dict.setVersion(dto.getVersion());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@ -23,7 +23,7 @@ import static org.dromara.easyes.annotation.rely.Analyzer.IK_MAX_WORD;
|
||||
* @since 2024-09-25 20:32
|
||||
*/
|
||||
@Data
|
||||
@Settings(settingsProvider = CustomIndexSettingProvider.class)
|
||||
@Settings(settingsProvider = CustomIndexSettingProvider.class, replicasNum = 1, shardsNum = 1)
|
||||
@IndexName(value = "process_instance_document", keepGlobalPrefix = true, refreshPolicy = RefreshPolicy.IMMEDIATE)
|
||||
@Join(nodes = {@Node(parentClass = ProcessInstanceDocument.class, parentAlias = "process_instance_document", childClasses = {ProcessTaskDocument.class}, childAliases = {"process_task_document"})})
|
||||
public class ProcessInstanceDocument {
|
||||
@ -100,6 +100,12 @@ public class ProcessInstanceDocument {
|
||||
@IndexField(fieldType = FieldType.KEYWORD)
|
||||
private String initiatorName;
|
||||
|
||||
/**
|
||||
* 发起人模型
|
||||
*/
|
||||
@IndexField(fieldType = FieldType.TEXT)
|
||||
private String initiatorJsonStr;
|
||||
|
||||
/**
|
||||
* 实例对应的流程引擎服务端迭代版本
|
||||
*/
|
||||
|
||||
@ -30,6 +30,13 @@ public interface EsProcessInstanceService {
|
||||
*/
|
||||
Boolean deleteIndex();
|
||||
|
||||
/**
|
||||
* 更新流程实例索引
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
Boolean updateIndex();
|
||||
|
||||
/**
|
||||
* 新增流程实例文档
|
||||
*
|
||||
|
||||
@ -12,6 +12,7 @@ import cn.axzo.workflow.es.model.ProcessInstanceDocument;
|
||||
import cn.axzo.workflow.es.model.ProcessTaskDocument;
|
||||
import cn.axzo.workflow.es.service.EsProcessInstanceService;
|
||||
import cn.hutool.core.util.NumberUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -83,9 +84,18 @@ public class AggregateProcessInstanceService {
|
||||
if (Objects.nonNull(initiator)) {
|
||||
BpmnTaskDelegateAssigner fullAssigner = null;
|
||||
if (Objects.nonNull(function) && !StringUtils.hasText(initiator.getAssignerName()) && NumberUtil.isNumber(initiator.getPersonId())) {
|
||||
fullAssigner = function.apply(Lists.newArrayList(initiator)).getOrDefault(Long.parseLong(initiator.getPersonId()), null);
|
||||
fullAssigner = function.apply(Lists.newArrayList(initiator)).getOrDefault(initiator.parsePersonId(), null);
|
||||
}
|
||||
processInstanceDocument.setInitiatorName(Objects.nonNull(fullAssigner) ? fullAssigner.getAssignerName() : StringUtils.hasText(initiator.getAssignerName()) ? initiator.getAssignerName() : "未知");
|
||||
log.info("insert es check fullAssigner: {}", Objects.nonNull(fullAssigner));
|
||||
if (Objects.nonNull(fullAssigner)) {
|
||||
fullAssigner.setAssignerName(StringUtils.hasText(initiator.getAssignerName()) ? initiator.getAssignerName() : "未知");
|
||||
processInstanceDocument.setInitiatorName(fullAssigner.getAssignerName());
|
||||
processInstanceDocument.setInitiatorJsonStr(JSON.toJSONString(fullAssigner));
|
||||
} else {
|
||||
processInstanceDocument.setInitiatorName(StringUtils.hasText(initiator.getAssignerName()) ? initiator.getAssignerName() : "未知");
|
||||
processInstanceDocument.setInitiatorJsonStr(JSON.toJSONString(initiator));
|
||||
}
|
||||
|
||||
}
|
||||
processInstanceDocument.setWorkflowEngineVersion(String.valueOf(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, FLOW_SERVER_VERSION_121)));
|
||||
processInstanceDocument.setProcessCategoryType(WorkspaceType.getType((Integer) variables.getOrDefault(INTERNAL_PROCESS_WORKSPACE_TYPE, WorkspaceType.UN_KNOW.getCode())).getDesc());
|
||||
@ -101,7 +111,7 @@ public class AggregateProcessInstanceService {
|
||||
esProcessInstanceService.insert(ES_FIXED_ROUTING, processInstanceDocument);
|
||||
|
||||
String instanceVersion = String.valueOf(variables.getOrDefault(WORKFLOW_ENGINE_VERSION, FLOW_SERVER_VERSION_121))
|
||||
.replaceAll("-SNAPSHOT","")
|
||||
.replaceAll("-SNAPSHOT", "")
|
||||
.replaceAll("-RELEASE", "");
|
||||
DefaultArtifactVersion version = new DefaultArtifactVersion(instanceVersion);
|
||||
DefaultArtifactVersion supportVersion = new DefaultArtifactVersion(FLOW_SERVER_VERSION_142);
|
||||
|
||||
@ -1,17 +1,20 @@
|
||||
package cn.axzo.workflow.es.service.impl;
|
||||
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.es.mapper.EsProcessInstanceMapper;
|
||||
import cn.axzo.workflow.es.model.ProcessInstanceDocument;
|
||||
import cn.axzo.workflow.es.model.ProcessTaskDocument;
|
||||
import cn.axzo.workflow.es.service.EsProcessInstanceService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.easyes.annotation.IndexName;
|
||||
import org.dromara.easyes.annotation.rely.FieldType;
|
||||
import org.dromara.easyes.core.biz.EsPageInfo;
|
||||
import org.dromara.easyes.core.cache.GlobalConfigCache;
|
||||
import org.dromara.easyes.core.conditions.index.LambdaEsIndexWrapper;
|
||||
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
|
||||
import org.dromara.easyes.core.config.GlobalConfig;
|
||||
import org.dromara.easyes.core.toolkit.FieldUtils;
|
||||
@ -70,6 +73,19 @@ public class EsProcessInstanceServiceImpl implements EsProcessInstanceService {
|
||||
return esProcessInstanceMapper.deleteIndex(globalConfig.getDbConfig().getIndexPrefix() + annotation.value());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean updateIndex() {
|
||||
GlobalConfig globalConfig = GlobalConfigCache.getGlobalConfig();
|
||||
|
||||
LambdaEsIndexWrapper<ProcessInstanceDocument> wrapper = new LambdaEsIndexWrapper<>();
|
||||
// 指定要更新哪个索引
|
||||
IndexName annotation = AnnotationUtils.findAnnotation(ProcessInstanceDocument.class, IndexName.class);
|
||||
wrapper.indexName(globalConfig.getDbConfig().getIndexPrefix() + annotation.value());
|
||||
wrapper.mapping("initiator_json_str", FieldType.TEXT);
|
||||
esProcessInstanceMapper.updateIndex(wrapper);
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增流程实例文档文档
|
||||
*
|
||||
@ -78,6 +94,7 @@ public class EsProcessInstanceServiceImpl implements EsProcessInstanceService {
|
||||
*/
|
||||
@Override
|
||||
public Integer insert(String routing, ProcessInstanceDocument processInstanceDocument) {
|
||||
log.info("insert es document: {}", JSON.toJSONString(processInstanceDocument));
|
||||
return esProcessInstanceMapper.insert(routing, processInstanceDocument);
|
||||
}
|
||||
|
||||
@ -121,7 +138,7 @@ public class EsProcessInstanceServiceImpl implements EsProcessInstanceService {
|
||||
.eq(StringUtils.hasText(dto.getBusinessStatus()), FieldUtils.val(ProcessInstanceDocument::getBusinessStatus), dto.getBusinessStatus())
|
||||
.and(StringUtils.hasText(dto.getProcessInstanceName()),
|
||||
w -> w.or(i -> i.eq(FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName(), 1.2F))
|
||||
.or(j->j.match(FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName()))
|
||||
.or(j -> j.match(FieldUtils.val(ProcessInstanceDocument::getProcessInstanceName), dto.getProcessInstanceName()))
|
||||
)
|
||||
.in(CollectionUtils.isEmpty(dto.getProcessInstanceIds()), FieldUtils.val(ProcessInstanceDocument::getId), dto.getProcessInstanceIds())
|
||||
.ge(Objects.nonNull(dto.getBeginStartTime()), ProcessInstanceDocument::getInstanceStartTime, dto.getBeginStartTime())
|
||||
|
||||
@ -45,17 +45,17 @@ public class DingTalkAlter implements Alter {
|
||||
if (obj instanceof AlterDTO) {
|
||||
AlterDTO alterDTO = (AlterDTO) obj;
|
||||
if (Objects.equals(profile, "master")) {
|
||||
DingTalkUtils.sendDingTalkForBizNodeAlter(profile, alterDTO, refreshProperties.getAlterMobiles());
|
||||
} else {
|
||||
rivenDingtalk(alterDTO);
|
||||
} else {
|
||||
DingTalkUtils.sendDingTalkForBizNodeAlter(profile, alterDTO, refreshProperties.getAlterMobiles());
|
||||
}
|
||||
}
|
||||
if (obj instanceof NextNodePreCheckAlterDTO) {
|
||||
NextNodePreCheckAlterDTO alterDTO = (NextNodePreCheckAlterDTO) obj;
|
||||
if(Objects.equals(profile, "master")){
|
||||
DingTalkUtils.sendDingTalkForNodePreCheck(profile, alterDTO, refreshProperties.getAlterMobiles());
|
||||
} else {
|
||||
if (Objects.equals(profile, "master")) {
|
||||
rivenDingtalkForNodePreCheck(alterDTO);
|
||||
} else {
|
||||
DingTalkUtils.sendDingTalkForNodePreCheck(profile, alterDTO, refreshProperties.getAlterMobiles());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
import cn.axzo.karma.client.feign.FlowSupportApi;
|
||||
import cn.axzo.karma.client.model.request.PersonProfileQueryReq;
|
||||
import cn.axzo.karma.client.model.response.PersonProfileResp;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||
import cn.axzo.workflow.common.enums.ApproverScopeEnum;
|
||||
import cn.axzo.workflow.common.enums.CarbonCopyObjectType;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
@ -265,4 +266,22 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign
|
||||
this.applicationContext = context;
|
||||
}
|
||||
|
||||
public static List<BpmnTaskDelegateAssigner> convertApprover(List<FlowTaskAssignerV2Resp> flowTaskAssignersV2) {
|
||||
if (CollectionUtils.isEmpty(flowTaskAssignersV2)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return flowTaskAssignersV2.stream()
|
||||
.map(i -> BpmnTaskDelegateAssigner.builder()
|
||||
.assignee(i.getIdentityId())
|
||||
.assigneeType(i.getIdentityType())
|
||||
.assignerName(i.getRealName())
|
||||
.personId(String.valueOf(i.getPersonId()))
|
||||
.tenantId(String.valueOf(i.getWorkspaceId()))
|
||||
.ouId(String.valueOf(i.getOuId()))
|
||||
.avatar(i.getAvatarUrl())
|
||||
.nodeId(i.getNodeId())
|
||||
.build())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -9,6 +9,8 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import groovy.util.logging.Slf4j;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
@ -33,10 +35,11 @@ import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TA
|
||||
* @author wangli
|
||||
* @since 2023/11/18 22:56
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@AllArgsConstructor
|
||||
public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Resource
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
private final OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
|
||||
@ -0,0 +1,106 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.bpmn.model.UserTask;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_CALC_ERROR;
|
||||
|
||||
/**
|
||||
* 基于固定人员的任务审批人选择器
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-18 14:58
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@AllArgsConstructor
|
||||
public class BasedFixedPersonV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
private final OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.fixedPerson_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
|
||||
Boolean throwException) {
|
||||
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
|
||||
if (!(flowElement instanceof UserTask)) {
|
||||
return super.select(flowElement, execution, throwException);
|
||||
}
|
||||
BpmnMetaParserHelper.getApproverSpecifyValueV2(flowElement)
|
||||
.ifPresent(s -> assigners.addAll(JSON.parseArray(s, BpmnTaskDelegateAssigner.class)));
|
||||
|
||||
Set<Long> workspaceIds = assigners.stream()
|
||||
.map(BpmnTaskDelegateAssigner::getTenantId)
|
||||
.filter(StringUtils::hasText)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
List<Long> personIds = assigners.stream()
|
||||
.map(BpmnTaskDelegateAssigner::getPersonId)
|
||||
.filter(StringUtils::hasText)
|
||||
.map(Long::parseLong)
|
||||
.collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(personIds)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<OrgNodeUserDTO> onlineUsers = new ArrayList<>();
|
||||
try {
|
||||
ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq();
|
||||
searchReq.setWorkspaceIds(workspaceIds);
|
||||
searchReq.setPersonIds(personIds);
|
||||
searchReq.setPage(1);
|
||||
searchReq.setPageSize(personIds.size());
|
||||
PageResp<OrgNodeUserDTO> pageResp = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "查询指定人员是否在职",
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq);
|
||||
if (pageResp != null) {
|
||||
onlineUsers = pageResp.getData();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (Boolean.TRUE.equals(throwException)) {
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(),
|
||||
this.getType(), e.getMessage());
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
|
||||
// 只要有在职的人,不会走审批人为空
|
||||
if (ListUtils.emptyIfNull(onlineUsers).stream()
|
||||
.filter(i -> Objects.equals(i.getIsDelete(), 0L))
|
||||
.anyMatch(u -> assigners.stream()
|
||||
.anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId()))
|
||||
&& Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) {
|
||||
return assigners;
|
||||
}
|
||||
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,134 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.FlowTaskAssignerScopeDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerIdentityEnum;
|
||||
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerQuerySceneEnum;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerV2Req;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_IDENTITY_V2_CONFIG_INVALID;
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_TYPE_NOT_SUPPORT;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
|
||||
|
||||
/**
|
||||
* 基于新版配置的身份查询审批人
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-15 10:58
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class BasedIdentityV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Resource
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.identity_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
Optional<ApproverSpecifyRangeEnum> optRange = getApproverSpecifyRange(flowElement);
|
||||
if (!optRange.isPresent()) {
|
||||
throw new WorkflowEngineException(ENGINE_IDENTITY_V2_CONFIG_INVALID, "级联配置", flowElement.getId());
|
||||
}
|
||||
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
|
||||
|
||||
// 获取发起人
|
||||
BpmnTaskDelegateAssigner initiator =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||
|
||||
FlowTaskAssignerV2Req.FlowTaskAssignerV2ReqBuilder v2ReqBuilder = FlowTaskAssignerV2Req.builder()
|
||||
.scene(FlowTaskAssignerQuerySceneEnum.BY_IDENTITY)
|
||||
.identities(getApproverSpecifyValue(flowElement))
|
||||
.initiatorPersonId(initiator.parsePersonId())
|
||||
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
|
||||
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
|
||||
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
|
||||
switch (optRange.get()) {
|
||||
case within_the_project:
|
||||
log.info("executing role v2 with within_the_project");
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||
.crossDomain(false)
|
||||
.build());
|
||||
break;
|
||||
case within_the_project_construction_units:
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_TYPE_NOT_SUPPORT);
|
||||
case specified_org:
|
||||
log.info("executing role v2 with specified_org");
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.build());
|
||||
break;
|
||||
case initiator:
|
||||
log.info("executing role v2 with initiator");
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(initiator.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.build());
|
||||
break;
|
||||
case pre_node_approver:
|
||||
log.info("executing role v2 with pre_node_approver");
|
||||
BpmnTaskDelegateAssigner lastOperationApprover =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(CLOSE_PROCESS_ASSIGNER));
|
||||
if (Objects.isNull(lastOperationApprover)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(lastOperationApprover.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.build());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
|
||||
List<FlowTaskAssignerV2Resp> apiResultUsers = parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssignerV2(request), "新版查询身份下的人" + execution.getProcessInstanceId() + flowElement.getId(),
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssignerV2", request);
|
||||
return convertApprover(apiResultUsers);
|
||||
}
|
||||
|
||||
public Set<FlowTaskAssignerIdentityEnum> getApproverSpecifyValue(FlowElement flowElement) {
|
||||
return getApproverSpecifyValueV2(flowElement)
|
||||
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.map(FlowTaskAssignerIdentityEnum::valueOf)
|
||||
.collect(Collectors.toSet()))
|
||||
.orElse(Collections.emptySet());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,80 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.FlowTaskAssignerScopeDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerQuerySceneEnum;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerV2Req;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
|
||||
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getInitiatorLeaderRangeUnit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
|
||||
|
||||
/**
|
||||
* 基于"发起人主管"查询审批人
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2023/11/16 11:41
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class BasedInitiatorLeaderV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
|
||||
@Resource
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.initiatorLeader_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution,
|
||||
Boolean throwException) {
|
||||
// 获取发起人
|
||||
BpmnTaskDelegateAssigner initiator =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||
if (Objects.isNull(initiator)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
|
||||
FlowTaskAssignerV2Req.FlowTaskAssignerV2ReqBuilder v2ReqBuilder = FlowTaskAssignerV2Req.builder()
|
||||
.scene(FlowTaskAssignerQuerySceneEnum.BY_INITIATOR_MANAGER)
|
||||
.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(initiator.parseNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_0.getCode())
|
||||
.crossDomain(getInitiatorLeaderRangeUnit(flowElement).filter(unit -> unit != in_project).isPresent())
|
||||
.build())
|
||||
.initiatorPersonId(initiator.parsePersonId())
|
||||
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
|
||||
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
|
||||
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
|
||||
|
||||
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
|
||||
List<FlowTaskAssignerV2Resp> apiResultUsers = parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssignerV2(request), "新版查询发起人主管的审批人" + execution.getProcessInstanceId() + flowElement.getId(),
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssignerV2", request);
|
||||
return convertApprover(apiResultUsers);
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,78 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_CALC_ERROR;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INITIATOR_SPECIFY;
|
||||
|
||||
/**
|
||||
* 基于发起人指定的任务审批人选择器
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-18 14:43
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@AllArgsConstructor
|
||||
public class BasedInitiatorSpecifiedV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
private final RuntimeService runtimeService;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.initiatorSpecified_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
List<BpmnTaskDelegateAssigner> assigners = new ArrayList<>();
|
||||
try {
|
||||
populateAssigneeByInitiatorSpecify(assigners, flowElement, execution);
|
||||
} catch (Throwable t) {
|
||||
if (Boolean.TRUE.equals(throwException)) {
|
||||
log.warn("执行查询发起时指定审批人时发现异常, 审批节点:{}, 异常信息:{}", flowElement.getId(), t.getMessage());
|
||||
if (!(t instanceof WorkflowEngineException)) {
|
||||
throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(),
|
||||
this.getType(), t.getMessage());
|
||||
}
|
||||
throw t;
|
||||
} else {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
return assigners.stream().filter(i -> StringUtils.hasText(i.getPersonId())).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建审批时,传入各个节点应该设置的审批人的数据信息,此处直接设置人
|
||||
*
|
||||
* @param assigners
|
||||
* @param flowElement
|
||||
* @param execution
|
||||
*/
|
||||
private void populateAssigneeByInitiatorSpecify(List<BpmnTaskDelegateAssigner> assigners, FlowElement flowElement, DelegateExecution execution) {
|
||||
String processInstanceId = execution.getProcessInstanceId();
|
||||
@SuppressWarnings("unchecked")
|
||||
Map<String, List<BpmnTaskDelegateAssigner>> initiatorSpecifyMap = runtimeService.getVariable(processInstanceId, INITIATOR_SPECIFY, Map.class);
|
||||
if (CollectionUtils.isEmpty(initiatorSpecifyMap)) {
|
||||
return;
|
||||
}
|
||||
|
||||
assigners.addAll(initiatorSpecifyMap.getOrDefault(flowElement.getId(), Collections.emptyList()));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,36 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
|
||||
/**
|
||||
* 基于发起自己的任务审批人选择器
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-18 14:54
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class BasedInitiatorV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.initiator_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
// 获取发起人
|
||||
BpmnTaskDelegateAssigner initiator =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||
return Collections.singletonList(initiator);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,156 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.FlowTaskAssignerScopeDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerQuerySceneEnum;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerV2Req;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_POSITION_V2_CONFIG_INVALID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
|
||||
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeUnit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
|
||||
|
||||
/**
|
||||
* 基于新版配置的岗位查询审批人
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-15 10:58
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class BasedPositionV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Resource
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.position_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
Optional<ApproverSpecifyRangeEnum> optRange = getApproverSpecifyRange(flowElement);
|
||||
if (!optRange.isPresent()) {
|
||||
throw new WorkflowEngineException(ENGINE_POSITION_V2_CONFIG_INVALID, "级联配置", flowElement.getId());
|
||||
}
|
||||
|
||||
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
|
||||
|
||||
// 获取发起人
|
||||
BpmnTaskDelegateAssigner initiator =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||
|
||||
FlowTaskAssignerV2Req.FlowTaskAssignerV2ReqBuilder v2ReqBuilder = FlowTaskAssignerV2Req.builder()
|
||||
.scene(FlowTaskAssignerQuerySceneEnum.BY_JOB)
|
||||
.jobCodes(getApproverSpecifyValue(flowElement))
|
||||
.initiatorPersonId(initiator.parsePersonId())
|
||||
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
|
||||
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
|
||||
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
|
||||
switch (optRange.get()) {
|
||||
case within_the_project:
|
||||
log.info("executing position v2 with within_the_project");
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||
.crossDomain(false)
|
||||
.build());
|
||||
break;
|
||||
case within_the_project_construction_units:
|
||||
log.info("executing position v2 with within_the_project_construction_units");
|
||||
CooperateShipTypeEnum workflowType = getCooperateShipType(flowElement).orElseThrow(() -> new WorkflowEngineException(ENGINE_POSITION_V2_CONFIG_INVALID, "缺少参建单位类型配置", flowElement.getId()));
|
||||
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||
.crossDomain(true)
|
||||
.cooperateTypes(Sets.newHashSet(cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum.valueOf(workflowType.name())))
|
||||
.build());
|
||||
break;
|
||||
case specified_org:
|
||||
log.info("executing position v2 with specified_org");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit = getApproverSpecifyRangeUnit(flowElement);
|
||||
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
case initiator:
|
||||
log.info("executing position v2 with initiator");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4Initiator = getApproverSpecifyRangeUnit(flowElement);
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(initiator.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit4Initiator.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit4Initiator.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
case pre_node_approver:
|
||||
log.info("executing position v2 with pre_node_approver");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4PreNodeApprover = getApproverSpecifyRangeUnit(flowElement);
|
||||
BpmnTaskDelegateAssigner lastOperationApprover =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(CLOSE_PROCESS_ASSIGNER));
|
||||
if (Objects.isNull(lastOperationApprover)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(lastOperationApprover.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit4PreNodeApprover.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit4PreNodeApprover.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
|
||||
List<FlowTaskAssignerV2Resp> apiResultUsers = parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssignerV2(request), "新版查询岗位下的人" + execution.getProcessInstanceId() + flowElement.getId(),
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssignerV2", request);
|
||||
return convertApprover(apiResultUsers);
|
||||
}
|
||||
|
||||
public Set<String> getApproverSpecifyValue(FlowElement flowElement) {
|
||||
return getApproverSpecifyValueV2(flowElement)
|
||||
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.collect(Collectors.toSet()))
|
||||
.orElse(Collections.emptySet());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,55 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
|
||||
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CARBON_COPY;
|
||||
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.DELETED;
|
||||
|
||||
/**
|
||||
* 基于前序节点的任务审批人选择器(除非抄送节点)
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-18 15:11
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@AllArgsConstructor
|
||||
public class BasedPreAllNodeTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
private final ExtAxProcessLogService processLogService;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.preAllNodeApprover_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
ExtAxProcessLog query = new ExtAxProcessLog();
|
||||
query.setProcessInstanceId(execution.getProcessInstanceId());
|
||||
List<ExtAxProcessLog> logs = processLogService.genericQuery(query);
|
||||
if (CollectionUtils.isEmpty(logs)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return logs.stream()
|
||||
.filter(i -> !Objects.equals(BpmnFlowNodeType.valueOfType(i.getNodeType()), NODE_CARBON_COPY))
|
||||
.filter(i -> !Objects.equals(i.getStatus(), DELETED.getStatus()))
|
||||
.flatMap(log -> !CollectionUtils.isEmpty(log.getAssigneeFull()) ? log.getAssigneeFull().stream() : Stream.empty())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,160 @@
|
||||
package cn.axzo.workflow.server.controller.delegate;
|
||||
|
||||
import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.FlowTaskAssignerScopeDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.enums.FlowTaskAssignerQuerySceneEnum;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerV2Req;
|
||||
import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssignerV2Resp;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeEnum;
|
||||
import cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum;
|
||||
import cn.axzo.workflow.common.enums.CooperateShipTypeEnum;
|
||||
import cn.axzo.workflow.common.enums.SignApproverOrgLimitEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.dto.CooperationOrgDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.ListUtils;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.delegate.DelegateExecution;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_ROLE_V2_CONFIG_INVALID;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.CLOSE_PROCESS_ASSIGNER;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
import static cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum.transferToAdmin;
|
||||
import static cn.axzo.workflow.common.enums.ApproverSpecifyRangeUnitEnum.in_project;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRange;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeOrgLimit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyRangeUnit;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecifyValueV2;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getAreaFilterEnable;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getCooperateShipType;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getSpecialtyFilterEnable;
|
||||
|
||||
/**
|
||||
* 基于新版配置的角色查询审批人
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2025-08-15 10:58
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
public class BasedRoleV2TaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector {
|
||||
@Resource
|
||||
private OrgNodeUserApi orgNodeUserApi;
|
||||
@Resource
|
||||
private RuntimeService runtimeService;
|
||||
|
||||
@Override
|
||||
public String getType() {
|
||||
return ApproverSpecifyEnum.role_v2.getType();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BpmnTaskDelegateAssigner> select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) {
|
||||
Optional<ApproverSpecifyRangeEnum> optRange = getApproverSpecifyRange(flowElement);
|
||||
if (!optRange.isPresent()) {
|
||||
throw new WorkflowEngineException(ENGINE_ROLE_V2_CONFIG_INVALID, "级联配置", flowElement.getId());
|
||||
}
|
||||
CooperationOrgDTO orgDTO = (CooperationOrgDTO) execution.getVariables().get(BIZ_ORG_RELATION);
|
||||
|
||||
// 获取发起人
|
||||
BpmnTaskDelegateAssigner initiator =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariables().get(INTERNAL_INITIATOR));
|
||||
|
||||
FlowTaskAssignerV2Req.FlowTaskAssignerV2ReqBuilder v2ReqBuilder = FlowTaskAssignerV2Req.builder()
|
||||
.scene(FlowTaskAssignerQuerySceneEnum.BY_ROLE)
|
||||
.roleIds(getApproverSpecifyValue(flowElement))
|
||||
.initiatorPersonId(initiator.parsePersonId())
|
||||
.areaCodes(getAreaFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeAreaCodes())) : Sets.newHashSet())
|
||||
.specialtyCodes(getSpecialtyFilterEnable(flowElement) ? Sets.newHashSet(ListUtils.emptyIfNull(orgDTO.getIncludeSpecialtyCodes())) : Sets.newHashSet())
|
||||
.querySupervisorWhileMissMatched(getApproverEmptyHandleType(flowElement).filter(type -> Objects.equals(type, transferToAdmin)).isPresent());
|
||||
switch (optRange.get()) {
|
||||
case within_the_project:
|
||||
log.info("executing role v2 with within_the_project");
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||
.crossDomain(false)
|
||||
.build());
|
||||
break;
|
||||
case within_the_project_construction_units:
|
||||
log.info("executing role v2 with within_the_project_construction_units");
|
||||
CooperateShipTypeEnum cooperateShipTypeEnum = getCooperateShipType(flowElement).orElseThrow(() -> new WorkflowEngineException(ENGINE_ROLE_V2_CONFIG_INVALID, "缺少参建单位类型配置", flowElement.getId()));
|
||||
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(SignApproverOrgLimitEnum.LV_ALL.getCode())
|
||||
.crossDomain(true)
|
||||
.cooperateTypes(Sets.newHashSet(cn.axzo.orgmanax.dto.cooperateship.enums.CooperateShipTypeEnum.valueOf(cooperateShipTypeEnum.name())))
|
||||
.build());
|
||||
break;
|
||||
case specified_org:
|
||||
log.info("executing role v2 with specified_org");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit = getApproverSpecifyRangeUnit(flowElement);
|
||||
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(orgDTO.getNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
case initiator:
|
||||
log.info("executing role v2 with initiator");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4Initiator = getApproverSpecifyRangeUnit(flowElement);
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(initiator.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit4Initiator.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit4Initiator.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
case pre_node_approver:
|
||||
log.info("executing role v2 with pre_node_approver");
|
||||
Optional<ApproverSpecifyRangeUnitEnum> approverSpecifyRangeUnit4PreNodeApprover = getApproverSpecifyRangeUnit(flowElement);
|
||||
BpmnTaskDelegateAssigner lastOperationApprover =
|
||||
BpmnTaskDelegateAssigner.toObjectCompatible(runtimeService.getVariable(execution.getProcessInstanceId(), CLOSE_PROCESS_ASSIGNER, BpmnTaskDelegateAssigner.class));
|
||||
log.info("lastOperationApprover:{}", JSON.toJSONString(lastOperationApprover));
|
||||
if (Objects.isNull(lastOperationApprover)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
v2ReqBuilder.scope(FlowTaskAssignerScopeDTO.builder()
|
||||
.nodeId(lastOperationApprover.parseNodeId())
|
||||
.upLevel(getApproverSpecifyRangeOrgLimit(flowElement).orElse(SignApproverOrgLimitEnum.UNKNOWN).getCode())
|
||||
.crossDomain(approverSpecifyRangeUnit4PreNodeApprover.filter(unit -> unit != in_project).isPresent())
|
||||
.entUpLevel(approverSpecifyRangeUnit4PreNodeApprover.orElse(ApproverSpecifyRangeUnitEnum.UNKNOWN).getValue())
|
||||
.build());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
FlowTaskAssignerV2Req request = v2ReqBuilder.build();
|
||||
List<FlowTaskAssignerV2Resp> apiResultUsers = parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssignerV2(request), "新版查询角色下的人" + execution.getProcessInstanceId() + flowElement.getId(),
|
||||
"cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssignerV2", request);
|
||||
return convertApprover(apiResultUsers);
|
||||
}
|
||||
|
||||
public Set<Long> getApproverSpecifyValue(FlowElement flowElement) {
|
||||
return getApproverSpecifyValueV2(flowElement)
|
||||
.map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject)
|
||||
.map(i -> i.getString("value"))
|
||||
.map(Long::valueOf)
|
||||
.collect(Collectors.toSet()))
|
||||
.orElse(Collections.emptySet());
|
||||
}
|
||||
}
|
||||
@ -85,7 +85,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
|
||||
.setStartTime(((ExecutionEntityImpl) event.getEntity()).getStartTime())
|
||||
.setTenantId(((ExecutionEntityImpl) event.getEntity()).getTenantId())
|
||||
.setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getBusinessKey())
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName());
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName())
|
||||
.setDefinitionName(mainProcess.getName());
|
||||
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
|
||||
BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf);
|
||||
|
||||
@ -154,7 +155,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
|
||||
.setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime())
|
||||
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
|
||||
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName());
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
|
||||
.setDefinitionName(mainProcess.getName());
|
||||
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
|
||||
BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf);
|
||||
|
||||
@ -194,7 +196,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
|
||||
.setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime())
|
||||
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
|
||||
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName());
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
|
||||
.setDefinitionName(mainProcess.getName());
|
||||
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
|
||||
BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf);
|
||||
|
||||
@ -229,7 +232,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
|
||||
.setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime())
|
||||
.setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId())
|
||||
.setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey())
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName());
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName())
|
||||
.setDefinitionName(mainProcess.getName());
|
||||
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
|
||||
BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf);
|
||||
|
||||
@ -264,7 +268,8 @@ public class RocketMqBpmnProcessEventListener extends AbstractBpmnEventListener<
|
||||
.setStartTime(((ExecutionEntityImpl) event.getEntity()).getStartTime())
|
||||
.setTenantId(((ExecutionEntityImpl) event.getEntity()).getTenantId())
|
||||
.setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getProcessInstanceBusinessKey())
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName());
|
||||
.setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName())
|
||||
.setDefinitionName(mainProcess.getName());
|
||||
BpmnMetaParserHelper.getNoticeConfig(mainProcess).ifPresent(dto::setNoticeConf);
|
||||
BpmnMetaParserHelper.getSignConfig(mainProcess).ifPresent(dto::setSignConf);
|
||||
|
||||
|
||||
@ -32,6 +32,7 @@ import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_ASSIGNEE;
|
||||
@ -89,13 +90,23 @@ public class CheckApproverServiceImpl implements CheckApproverService {
|
||||
return exists.get();
|
||||
}
|
||||
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
|
||||
processEngineConfiguration.getActivityInstanceEntityManager()
|
||||
.findActivityInstancesByProcessInstanceId(delegateTask.getProcessInstanceId(), false)
|
||||
List<ActivityInstanceEntity> actInsts = processEngineConfiguration.getActivityInstanceEntityManager()
|
||||
.findActivityInstancesByProcessInstanceId(delegateTask.getProcessInstanceId(), false);
|
||||
|
||||
actInsts.stream().map(i -> new StringBuilder()
|
||||
.append(i.getActivityId()).append(":")
|
||||
.append(i.getActivityType()).append(":")
|
||||
.append(i.getEndTime()))
|
||||
.collect(Collectors.toList())
|
||||
.forEach(i -> log.info("checkApproveServiceImpl inst: {}", i.toString()));
|
||||
|
||||
actInsts
|
||||
.stream()
|
||||
.filter(i -> !Objects.equals(i.getActivityId(), userTask.getId()))
|
||||
.filter(i -> !Objects.equals(i.getActivityType(), "exclusiveGateway"))
|
||||
.filter(i -> !Objects.equals(i.getActivityType(), "sequenceFlow"))
|
||||
.filter(i -> !Objects.equals(i.getActivityType(), "startEvent"))
|
||||
.filter(i -> Objects.nonNull(i.getEndTime()))
|
||||
.max(Comparator.comparing(ActivityInstanceEntity::getEndTime))
|
||||
.ifPresent(i -> {
|
||||
log.info("CheckApproverServiceImpl#checkApproverExists...上一个节点ID:{},类型:{}", i.getActivityId(), i.getActivityType());
|
||||
|
||||
@ -2,14 +2,12 @@ package cn.axzo.workflow.server.controller.web;
|
||||
|
||||
import cn.axzo.framework.domain.ServiceException;
|
||||
import cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi;
|
||||
import cn.axzo.workflow.common.model.dto.VariableObjectDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FormContentSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormInstanceSearchDTO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
|
||||
import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesToObjectCmd;
|
||||
import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation;
|
||||
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
|
||||
import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService;
|
||||
@ -20,14 +18,15 @@ import cn.axzo.workflow.server.common.util.ShellUtil;
|
||||
import cn.axzo.workflow.server.xxljob.EsIndexOperationJobHandler;
|
||||
import cn.axzo.workflow.server.xxljob.SpecifyProcessInstanceSyncEsJobHandler;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.common.engine.impl.interceptor.CommandExecutor;
|
||||
import org.flowable.common.engine.impl.util.IoUtil;
|
||||
import org.flowable.engine.HistoryService;
|
||||
import org.flowable.engine.RepositoryService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.TaskService;
|
||||
import org.flowable.engine.history.HistoricProcessInstance;
|
||||
import org.flowable.engine.repository.Deployment;
|
||||
import org.flowable.form.api.FormDefinition;
|
||||
@ -106,6 +105,8 @@ public class TestController {
|
||||
private EsIndexOperationJobHandler esIndexOperationJobHandler;
|
||||
@Resource
|
||||
private SpecifyProcessInstanceSyncEsJobHandler specifyProcessInstanceSyncEsJobHandler;
|
||||
@Resource
|
||||
private TaskService taskService;
|
||||
|
||||
@RepeatSubmit
|
||||
@GetMapping("/test")
|
||||
@ -287,11 +288,18 @@ public class TestController {
|
||||
}*/
|
||||
|
||||
@GetMapping("log")
|
||||
public String log(@RequestParam String keyword) throws Exception {
|
||||
public String log(@RequestParam String keyword, @RequestParam(required = false) String date, @RequestParam(required = false) String grepKeyword) throws Exception {
|
||||
if (!StringUtils.hasText(keyword)) {
|
||||
return "命令不能为空";
|
||||
}
|
||||
return ShellUtil.grepRealTimeLog(profile, keyword);
|
||||
if (StringUtils.hasText(date)) {
|
||||
return ShellUtil.grepLog(profile, keyword, StringUtils.hasText(date) ? DateUtil.parseDate(date) : new Date(), grepKeyword);
|
||||
}
|
||||
String s = ShellUtil.grepRealTimeLog(profile, keyword);
|
||||
if (StringUtils.hasText(s)) {
|
||||
return s;
|
||||
}
|
||||
return ShellUtil.grepLog(profile, keyword, StringUtils.hasText(date) ? DateUtil.parseDate(date) : new Date(), grepKeyword);
|
||||
}
|
||||
|
||||
@GetMapping("form")
|
||||
@ -380,5 +388,11 @@ public class TestController {
|
||||
commandExecutor.execute(new CustomGetProcessInstanceVariablesToObjectCmd(processInstanceId));
|
||||
return CommonResponse.success(JSON.toJSONString(wpsVariables));
|
||||
}
|
||||
|
||||
@GetMapping("/task/complete")
|
||||
public CommonResponse<Boolean> taskComplete(@RequestParam String taskId) {
|
||||
taskService.complete(taskId);
|
||||
return CommonResponse.success(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -13,6 +13,7 @@ import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceBatchQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCancelDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCarbonCopyDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCheckApproverDTO;
|
||||
@ -48,6 +49,7 @@ import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
|
||||
import cn.axzo.workflow.core.repository.mapper.ExtAxModelDocMapper;
|
||||
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
|
||||
import cn.axzo.workflow.core.service.BpmnProcessTaskService;
|
||||
import cn.axzo.workflow.core.service.CategoryService;
|
||||
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
|
||||
import cn.axzo.workflow.core.service.ExtAxProcessSignService;
|
||||
import cn.axzo.workflow.core.service.ExtAxReModelService;
|
||||
@ -125,6 +127,8 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
|
||||
private ExtAxReModelService extAxReModelService;
|
||||
@Resource
|
||||
private ExtAxProcessLogService extAxProcessLogService;
|
||||
@Resource
|
||||
private CategoryService categoryService;
|
||||
|
||||
/**
|
||||
* 超管查询所有流程实例
|
||||
@ -278,6 +282,20 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
|
||||
return success(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量获得流程实例
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "批量获得流程实例")
|
||||
@GetMapping("/batch/get")
|
||||
@Override
|
||||
public CommonResponse<List<BpmnProcessInstanceVO>> getBatchProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceBatchQueryDTO dto) {
|
||||
log.info("批量获得历史的流程实例 getProcessInstanceVO===>>>参数:{}", JSONUtil.toJsonStr(dto));
|
||||
return success(bpmnProcessInstanceService.getBatchProcessInstanceVO(dto));
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新指定流程定义的版本的状态, 处于 suspended 状态的流程模型将不能再发起实例
|
||||
*
|
||||
|
||||
@ -410,21 +410,6 @@ public class BpmnProcessModelController implements ProcessModelApi {
|
||||
return success(bpmnProcessModelService.getTenantIds());
|
||||
}
|
||||
|
||||
/**
|
||||
* 打印模板配置内容
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "打印模板配置内容")
|
||||
@PostMapping("/print/template/upsert")
|
||||
@Override
|
||||
public CommonResponse<Void> printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto) {
|
||||
log.info("操作打印模板配置内容: {}", JSON.toJSONString(dto));
|
||||
bpmnProcessModelService.printTemplateConfig(dto);
|
||||
return success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取打印模板配置内容
|
||||
*
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
package cn.axzo.workflow.server.controller.web.bpmn;
|
||||
|
||||
import cn.axzo.workflow.client.feign.bpmn.ProcessTaskApi;
|
||||
import cn.axzo.workflow.common.annotation.Manageable;
|
||||
import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
|
||||
@ -54,6 +56,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_OPERATION_PARAM_INVALID;
|
||||
import static cn.azxo.framework.common.model.CommonResponse.success;
|
||||
|
||||
/**
|
||||
@ -75,6 +78,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@Operation(summary = "待审核列表")
|
||||
@GetMapping("/page/todo")
|
||||
@Override
|
||||
@Manageable
|
||||
public CommonResponse<BpmPageResult<BpmnTaskTodoPageItemVO>> getTodoTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto) {
|
||||
log.info("待审核列表 getTodoTaskPage===>>>参数:{}", JSON.toJSONString(dto));
|
||||
return success(bpmnProcessTaskService.getTodoTaskPage(dto));
|
||||
@ -86,6 +90,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@Operation(summary = "已完成的审批列表")
|
||||
@GetMapping("/page/done")
|
||||
@Override
|
||||
@Manageable
|
||||
public CommonResponse<BpmPageResult<BpmnTaskDonePageItemVO>> getDoneTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto) {
|
||||
log.info("已完成的审批列表 getDoneTaskPage===>>>参数:{}", JSON.toJSONString(dto));
|
||||
return success(bpmnProcessTaskService.getDoneTaskPage(dto));
|
||||
@ -101,6 +106,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@RepeatSubmit
|
||||
public CommonResponse<Boolean> approveTask(@Validated @RequestBody BpmnTaskAuditDTO dto) {
|
||||
log.info("同意 approveTask===>>>参数:{}", JSON.toJSONString(dto));
|
||||
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
|
||||
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
|
||||
}
|
||||
if(!StringUtils.hasText(dto.getTaskId())) {
|
||||
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getApprover().getPersonId()));
|
||||
}
|
||||
List<AttachmentDTO> tempAttachments = ListUtils.defaultIfNull(dto.getAttachmentList(), new ArrayList<>());
|
||||
if (StringUtils.hasText(dto.getSignatureUrl())) {
|
||||
AttachmentDTO signature = new AttachmentDTO();
|
||||
@ -121,6 +132,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@RepeatSubmit
|
||||
public CommonResponse<Boolean> approveTaskWithForm(@Validated @RequestBody BpmnTaskAuditWithFormDTO dto) {
|
||||
log.info("同意 approveTaskWithForm===>>>参数:{}", JSON.toJSONString(dto));
|
||||
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
|
||||
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
|
||||
}
|
||||
if(!StringUtils.hasText(dto.getTaskId())) {
|
||||
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getApprover().getPersonId()));
|
||||
}
|
||||
List<AttachmentDTO> tempAttachments = ListUtils.defaultIfNull(dto.getAttachmentList(), new ArrayList<>());
|
||||
if (StringUtils.hasText(dto.getSignatureUrl())) {
|
||||
AttachmentDTO signature = new AttachmentDTO();
|
||||
@ -176,6 +193,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@Override
|
||||
public CommonResponse<Boolean> backTask(@Validated @RequestBody BpmnTaskBackAuditDTO dto) {
|
||||
log.info("回退 backTask===>>>参数:{}", JSON.toJSONString(dto));
|
||||
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
|
||||
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
|
||||
}
|
||||
if(!StringUtils.hasText(dto.getTaskId())) {
|
||||
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getApprover().getPersonId()));
|
||||
}
|
||||
populateUsersAvatar(dto.getApprover());
|
||||
bpmnProcessTaskService.backTask(dto);
|
||||
return success(true);
|
||||
@ -203,6 +226,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@RepeatSubmit
|
||||
public CommonResponse<Boolean> rejectTask(@Validated @RequestBody BpmnTaskAuditDTO dto) {
|
||||
log.info("驳回 rejectTask===>>>参数:{}", JSON.toJSONString(dto));
|
||||
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
|
||||
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
|
||||
}
|
||||
if(!StringUtils.hasText(dto.getTaskId())) {
|
||||
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getApprover().getPersonId()));
|
||||
}
|
||||
populateUsersAvatar(dto.getApprover());
|
||||
bpmnProcessTaskService.rejectTask(dto);
|
||||
return success(true);
|
||||
@ -231,6 +260,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@RepeatSubmit
|
||||
public CommonResponse<Boolean> transferTask(@Validated @RequestBody BpmnTaskTransferDTO dto) {
|
||||
log.info("转交任务 transferTask===>>>参数:{}", JSON.toJSONString(dto));
|
||||
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
|
||||
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
|
||||
}
|
||||
if(!StringUtils.hasText(dto.getTaskId())) {
|
||||
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getOriginAssigner().getPersonId()));
|
||||
}
|
||||
// 填充头像
|
||||
populateUsersAvatar(dto.getTargetAssigner());
|
||||
bpmnProcessTaskService.transferTask(dto);
|
||||
@ -272,6 +307,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@RepeatSubmit
|
||||
public CommonResponse<Boolean> countersignTask(@Validated @RequestBody BpmnTaskCountersignDTO dto) {
|
||||
log.info("加签任务 countersignTask===>>>参数:{}", JSON.toJSONString(dto));
|
||||
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
|
||||
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
|
||||
}
|
||||
if(!StringUtils.hasText(dto.getTaskId())) {
|
||||
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getOriginAssigner().getPersonId()));
|
||||
}
|
||||
// 填充头像
|
||||
populateUsersAvatar(dto.getOriginAssigner());
|
||||
populateUsersAvatar(dto.getTargetAssignerList());
|
||||
@ -281,6 +322,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
|
||||
/**
|
||||
* 提级审批
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@ -289,6 +331,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@PostMapping("/approvers/reset")
|
||||
@RepeatSubmit
|
||||
public CommonResponse<Boolean> resetTaskApprovers(@Validated @RequestBody BpmnTaskResetApproversDTO dto) {
|
||||
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
|
||||
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
|
||||
}
|
||||
if(!StringUtils.hasText(dto.getTaskId())) {
|
||||
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getOriginAssigner().getPersonId()));
|
||||
}
|
||||
populateUsersAvatar(dto.getOriginAssigner());
|
||||
populateUsersAvatar(dto.getTargetAssignerList());
|
||||
bpmnProcessTaskService.resetTaskApprovers(dto);
|
||||
@ -350,6 +398,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@Operation(summary = "获取指定流程实例的审批过程信息(flat)")
|
||||
@GetMapping("/list/flat")
|
||||
@Override
|
||||
@Manageable
|
||||
public CommonResponse<List<BpmnHistoricTaskInstanceVO>> getTaskListFlatByProcessInstanceId(
|
||||
@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
|
||||
@Nullable @RequestParam(required = false) String tenantId) {
|
||||
@ -365,6 +414,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@Operation(summary = "获取指定流程实例的审批过程信息(group)")
|
||||
@GetMapping("/list/group")
|
||||
@Override
|
||||
@Manageable
|
||||
public CommonResponse<List<BpmnHistoricTaskInstanceGroupVO>> getTaskListGroupByProcessInstanceId(
|
||||
@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
|
||||
@Nullable @RequestParam(required = false) String tenantId) {
|
||||
@ -378,6 +428,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
|
||||
@Operation(summary = "获取实例正在审核的人列表")
|
||||
@GetMapping("/active/list")
|
||||
@Override
|
||||
@Manageable
|
||||
public CommonResponse<List<BpmnTaskInstanceVO>> getActiveTasksByProcessInstanceId(
|
||||
@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
|
||||
@NotBlank(message = "租户不能为空") @RequestParam String tenantId) {
|
||||
|
||||
@ -9,6 +9,7 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.dto.print.FieldAttributeDTO;
|
||||
import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.PrintTemplateConfigUpsertDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.model.request.category.CategoryGroupVarSearchDto;
|
||||
@ -20,6 +21,7 @@ import cn.axzo.workflow.core.engine.cmd.CustomGetFormInstanceLatestValuesCmd;
|
||||
import cn.axzo.workflow.core.engine.cmd.CustomGetProcessInstanceVariablesCmd;
|
||||
import cn.axzo.workflow.core.service.BpmnProcessDefinitionService;
|
||||
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
|
||||
import cn.axzo.workflow.core.service.BpmnProcessModelService;
|
||||
import cn.axzo.workflow.core.service.CategoryGroupService;
|
||||
import cn.axzo.workflow.server.common.annotation.ErrorReporter;
|
||||
import cn.axzo.workflow.server.common.util.RpcExternalUtil;
|
||||
@ -130,6 +132,8 @@ public class PrintAdminController implements PrintAdminApi {
|
||||
private BpmnProcessInstanceService bpmnProcessInstanceService;
|
||||
@Resource
|
||||
private CategoryGroupService categoryGroupService;
|
||||
@Resource
|
||||
private BpmnProcessModelService bpmnProcessModelService;
|
||||
|
||||
/**
|
||||
* 查询指定流程实例是否能使用打印
|
||||
@ -144,6 +148,20 @@ public class PrintAdminController implements PrintAdminApi {
|
||||
return CommonResponse.success(bpmnProcessInstanceService.hasPrintTemplate(processInstanceId, null));
|
||||
}
|
||||
|
||||
/**
|
||||
* 打印模板配置内容
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "打印模板配置内容")
|
||||
@PostMapping("/template/upsert")
|
||||
@Override
|
||||
public CommonResponse<Void> printTemplateConfig(@Validated @RequestBody PrintTemplateConfigUpsertDTO dto) {
|
||||
log.info("操作打印模板配置内容: {}", JSON.toJSONString(dto));
|
||||
bpmnProcessModelService.printTemplateConfig(dto);
|
||||
return success();
|
||||
}
|
||||
/**
|
||||
* 获取打印模板中可打印的字段, 或者是 WPS 模板中可配置的变量字段
|
||||
*
|
||||
|
||||
@ -99,6 +99,7 @@ public class ProcessCategoryController implements ProcessCategoryApi {
|
||||
@Override
|
||||
@RepeatSubmit
|
||||
public CommonResponse<CategoryItemVO> create(@Validated @RequestBody CategoryCreateDTO req) {
|
||||
req.setVersion(2);
|
||||
return success(categoryService.createCategory(req));
|
||||
}
|
||||
|
||||
|
||||
@ -179,7 +179,7 @@ public class TaskEntityEventHandle implements EntityEventHandle<TaskEntity> {
|
||||
.avatarUrl(Objects.nonNull(firstNodeUser.getPersonProfile()) ? firstNodeUser.getPersonProfile().getAvatarUrl() : "")
|
||||
.phone(firstNodeUser.getPhone())
|
||||
.topNodeId(firstNodeUser.getTopNodeId())
|
||||
.workspaceType(firstNodeUser.getWorkspace().getType())
|
||||
.workspaceType(Objects.nonNull(firstNodeUser.getWorkspace()) ? firstNodeUser.getWorkspace().getType() : null)
|
||||
.snapshotInfo(Objects.nonNull(firstNodeUser.getCooperateShip()) ? OrgSnapshotInfo.builder()
|
||||
.workspaceName(firstNodeUser.getCooperateShip().getWorkspaceName())
|
||||
.workspaceId(String.valueOf(firstNodeUser.getCooperateShip().getWorkspaceId()))
|
||||
|
||||
@ -6,9 +6,15 @@ 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.dromara.easyes.common.utils.RestHighLevelClientUtils;
|
||||
import org.dromara.easyes.core.toolkit.IndexUtils;
|
||||
import org.elasticsearch.client.RestHighLevelClient;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import static org.dromara.easyes.annotation.rely.AnnotationConstants.DEFAULT_MAX_RESULT_WINDOW;
|
||||
import static org.dromara.easyes.common.utils.RestHighLevelClientUtils.DEFAULT_DS;
|
||||
|
||||
/**
|
||||
* 生产环境下手动创建索引
|
||||
*
|
||||
@ -20,17 +26,43 @@ import org.springframework.util.StringUtils;
|
||||
@Slf4j
|
||||
public class EsIndexOperationJobHandler {
|
||||
private final EsProcessInstanceService esProcessInstanceService;
|
||||
private final RestHighLevelClientUtils restHighLevelClientUtils;
|
||||
|
||||
@XxlJob("esIndexOperation")
|
||||
public ReturnT<String> execute(String param) {
|
||||
if (!StringUtils.hasText(param)) {
|
||||
createIndex();
|
||||
} else {
|
||||
} else if (StringUtils.hasText(param) && "delete".equalsIgnoreCase(param.trim())) {
|
||||
deleteIndex();
|
||||
} else if (StringUtils.hasText(param) && "update".equalsIgnoreCase(param.trim())) {
|
||||
updateIndex();
|
||||
} else if (StringUtils.hasText(param) && "reindex".equalsIgnoreCase(param.trim())) {
|
||||
reindex();
|
||||
}
|
||||
return ReturnT.SUCCESS;
|
||||
}
|
||||
|
||||
private void reindex() {
|
||||
log.info("开始执行 reindex 操作...");
|
||||
XxlJobHelper.log("开始执行 reindex 操作...");
|
||||
//获取动态数据源 若未配置多数据源,则使用默认数据源
|
||||
RestHighLevelClient client = restHighLevelClientUtils.getClient(DEFAULT_DS);
|
||||
boolean reindex = IndexUtils.reindex(client, "workflow_engine_test_process_instance_document", "workflow_engine_dev_process_instance_document", DEFAULT_MAX_RESULT_WINDOW);
|
||||
log.info("reindex 操作完成. 响应结果: {}", reindex);
|
||||
XxlJobHelper.log("reindex 操作完成. 响应结果: {}", reindex);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新索引
|
||||
*/
|
||||
private void updateIndex() {
|
||||
log.info("开始更新父子文档索引...");
|
||||
XxlJobHelper.log("开始更新父子文档索引...");
|
||||
Boolean index = esProcessInstanceService.updateIndex();
|
||||
log.info("更新完成. 响应结果: {}", index);
|
||||
XxlJobHelper.log("更新完成. 响应结果: {}", index);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除索引
|
||||
*/
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
@ -24,7 +24,7 @@ public class StarterFeignClientConfiguration {
|
||||
}
|
||||
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@ConditionalOnProperty(prefix = "workflow.engine.starter", value = "manageable", havingValue = "true")
|
||||
@ConditionalOnProperty(prefix = "workflow", value = "manageable", havingValue = "true")
|
||||
@ConditionalOnClass(FeignClientFactoryBean.class)
|
||||
@EnableFeignClients(clients = WorkflowManageService.class)
|
||||
public static class WorkflowManageServiceClient {
|
||||
|
||||
@ -23,6 +23,7 @@ import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerInstanceEventListener
|
||||
import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerNotificationEventListener;
|
||||
import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerTaskEventListener;
|
||||
import cn.axzo.workflow.starter.mq.broadcast.consumer.InnerWorkflowListener;
|
||||
import cn.axzo.workflow.starter.mq.check.ImplementationReadyChecker;
|
||||
import cn.axzo.workflow.starter.mq.monitor.WorkflowEngineStarterDefaultMQMonitor;
|
||||
import cn.axzo.workflow.starter.mq.monitor.console.WorkflowEngineStarterMQMonitorController;
|
||||
import cn.axzo.workflow.starter.selector.MetaFeignClientEnableSelector;
|
||||
@ -155,4 +156,9 @@ public class WorkflowEngineStarterAutoConfiguration {
|
||||
return new WorkflowEngineStarterDefaultMQMonitor(mqAdminExtObjectProvider, broadcastDLQProcessorObjectProvider, rpcDLQProcessorObjectProvider, workflowEngineStarterProperties, environment);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ImplementationReadyChecker implementationReadyChecker() {
|
||||
return new ImplementationReadyChecker();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -24,12 +24,12 @@ public class WorkflowEngineStarterProperties {
|
||||
* 默认 false,优先 starter 提供的 coreService、manageServer。
|
||||
* 为 true 时,会为当前应用注册原始 xxxApi FeignClient
|
||||
*/
|
||||
private Boolean metaFeign = false;
|
||||
// private Boolean metaFeign = false;
|
||||
|
||||
/**
|
||||
* 特殊用途,不建议接入方使用
|
||||
*/
|
||||
private Boolean manageable = false;
|
||||
// private Boolean manageable = false;
|
||||
|
||||
/**
|
||||
* <h3>该参数只针对<strong color=orange>非</strong>容器环境生效</h3>
|
||||
@ -92,21 +92,21 @@ public class WorkflowEngineStarterProperties {
|
||||
*/
|
||||
private Boolean alert = false;
|
||||
|
||||
public Boolean getMetaFeign() {
|
||||
return metaFeign;
|
||||
}
|
||||
|
||||
public void setMetaFeign(Boolean metaFeign) {
|
||||
this.metaFeign = metaFeign;
|
||||
}
|
||||
|
||||
public Boolean getManageable() {
|
||||
return manageable;
|
||||
}
|
||||
|
||||
public void setManageable(Boolean manageable) {
|
||||
this.manageable = manageable;
|
||||
}
|
||||
// public Boolean getMetaFeign() {
|
||||
// return metaFeign;
|
||||
// }
|
||||
//
|
||||
// public void setMetaFeign(Boolean metaFeign) {
|
||||
// this.metaFeign = metaFeign;
|
||||
// }
|
||||
//
|
||||
// public Boolean getManageable() {
|
||||
// return manageable;
|
||||
// }
|
||||
//
|
||||
// public void setManageable(Boolean manageable) {
|
||||
// this.manageable = manageable;
|
||||
// }
|
||||
|
||||
public Boolean getJoinContainerGroup() {
|
||||
return joinContainerGroup;
|
||||
|
||||
@ -5,47 +5,30 @@ import cn.axzo.workflow.common.util.ThreadUtil;
|
||||
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.ASYNC;
|
||||
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
|
||||
import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
|
||||
import cn.axzo.workflow.common.annotation.Manageable;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import cn.axzo.workflow.common.annotation.InvokeMode;
|
||||
import cn.axzo.workflow.common.annotation.Manageable;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
|
||||
import cn.axzo.workflow.common.model.response.form.FormVO;
|
||||
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
||||
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import cn.axzo.workflow.common.model.dto.SignFileDTO;
|
||||
import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
|
||||
@ -62,10 +45,13 @@ import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverRead
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceAdminPageItemVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstancePageItemVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.ExtProcessLogVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO;
|
||||
@ -73,7 +59,29 @@ import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||
import org.springframework.web.bind.annotation.PutMapping;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.Map;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
|
||||
/**
|
||||
* Workflow Engine Starter Core Service
|
||||
@ -102,6 +110,7 @@ public interface WorkflowCoreService {
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/process/activity/trigger")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean trigger(@Validated @RequestBody BpmnActivityTriggerDTO dto);
|
||||
|
||||
/**
|
||||
@ -116,163 +125,50 @@ public interface WorkflowCoreService {
|
||||
*/
|
||||
@PostMapping("/api/process/activity/assignee/set")
|
||||
@Operation(summary = "业务节点设置审批人,不支持重复调用设置审批人,需一次性传入所有审批人")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean setAssignee(@Validated @RequestBody BpmnActivitySetAssigneeDTO dto);
|
||||
|
||||
/**
|
||||
* 同意
|
||||
* 该功能应该利用引擎的 TimerBoundaryEvent 来实现,但为了简便,先利用引擎的任务调度来实现
|
||||
*
|
||||
* <pre>
|
||||
* MQ 触发规则:
|
||||
* 1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,
|
||||
* 如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件)
|
||||
* 2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件
|
||||
* 2.2. 流程实例正常结束会触发 process-instance-completed 事件
|
||||
* </pre>
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "同意,MQ 触发规则:1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件),2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件,2.2. 流程实例正常结束会触发 process-instance-completed 事件")
|
||||
@PostMapping("/api/process/task/approve")
|
||||
Boolean approveTask(@Validated @RequestBody BpmnTaskAuditDTO dto);
|
||||
@PostMapping("/api/process/activity/timeout/trigger")
|
||||
@Operation(summary = "设置指定业务节点定时继续往下执行")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean setTimeoutTrigger(@Validated @RequestBody BpmnActivityTimeoutTriggerDTO dto);
|
||||
|
||||
/**
|
||||
* 同意时并提交表单数据
|
||||
* 为指定业务节点设置定时回调
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/process/activity/timeout/callback")
|
||||
@Operation(summary = "设置指定业务节点定时回调")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean setTimeoutCallback(@Validated @RequestBody BpmnActivityTimeoutCallbackDTO dto);
|
||||
|
||||
/**
|
||||
* 获取指定审批业务的流程表单设置,
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/form/admin/start/form")
|
||||
@InvokeMode(SYNC)
|
||||
FormDefinitionVO getFormDefinition(@Validated @RequestBody StartFormSearchDTO dto);
|
||||
|
||||
/**
|
||||
* 查询指定审批实例的表单模型和数据
|
||||
* <p>
|
||||
* dto 中的 processInstanceId 与 taskId,至少有一个属性有值,一般建议直接使用实例 ID。
|
||||
* 当传入 taskId 时,将只查询该任务绑定的表单模型和数据。
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "同意时并提交表单")
|
||||
@PostMapping("/api/process/task/form/approve")
|
||||
Boolean approveTaskWithForm(@Validated @RequestBody BpmnTaskAuditWithFormDTO dto);
|
||||
|
||||
/**
|
||||
* 批量同意
|
||||
*
|
||||
* @param dtos
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "批量同意")
|
||||
@PostMapping("/api/process/task/batch/approve")
|
||||
BatchOperationResultVO batchApproveTask(@Validated @RequestBody List<BpmnTaskAuditDTO> dtos);
|
||||
|
||||
/**
|
||||
* 获取当前节点可回退节点选项列表
|
||||
*
|
||||
* @param taskId 当前任务id
|
||||
* @return 可以回退节点列表
|
||||
*/
|
||||
@Operation(summary = "获取当前节点可回退节点选项列表")
|
||||
@GetMapping("/api/process/task/back/optional/nodes")
|
||||
List<BpmnOptionalNodeDTO> getBackOptionalNodes(@RequestParam @NotBlank(message = "任务id不能为空") String taskId);
|
||||
|
||||
/**
|
||||
* 回退到指定节点
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "回退")
|
||||
@PostMapping("/api/process/task/back")
|
||||
Boolean backTask(@Validated @RequestBody BpmnTaskBackAuditDTO dto);
|
||||
|
||||
/**
|
||||
* 用于系统内部操作,跳转到指定节点
|
||||
* @param dto 请求参数
|
||||
* @return 是否成功
|
||||
*/
|
||||
@Operation(summary = "系统操作回退任务到指定节点")
|
||||
@PostMapping("/api/process/task/system/back")
|
||||
Boolean systemBackTask(@Validated @RequestBody BpmnNodeBackSystemOperateDTO dto);
|
||||
|
||||
/**
|
||||
* 驳回
|
||||
*
|
||||
* <pre>
|
||||
* MQ 触发规则:
|
||||
* 1. 当前审批任务会触发 process-task-deleted 事件
|
||||
* 2. 当前流程实例会触发 process-instance-rejected 事件
|
||||
* </pre>
|
||||
*/
|
||||
@Operation(summary = "驳回,MQ 触发规则:1. 当前审批任务会触发 process-task-deleted 事件, 2. 当前流程实例会触发 process-instance-rejected 事件")
|
||||
@PostMapping("/api/process/task/reject")
|
||||
Boolean rejectTask(@Validated @RequestBody BpmnTaskAuditDTO dto);
|
||||
|
||||
/**
|
||||
* 批量驳回
|
||||
*
|
||||
* @param dtos 批量请求参数
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/process/task/batch/reject")
|
||||
BatchOperationResultVO batchRejectTask(@Validated @RequestBody List<BpmnTaskAuditDTO> dtos);
|
||||
|
||||
/**
|
||||
* 转交
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "直接修改审批任务的审批人")
|
||||
@PostMapping("/api/process/task/transfer")
|
||||
Boolean transferTask(@Validated @RequestBody BpmnTaskTransferDTO dto);
|
||||
|
||||
/**
|
||||
* 批量转交
|
||||
*
|
||||
* @param dtos
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "批量修改审批任务的审批人")
|
||||
@PostMapping("/api/process/task/batch/transfer")
|
||||
BatchOperationResultVO batchTransferTask(@Validated @RequestBody List<BpmnTaskTransferDTO> dtos);
|
||||
|
||||
/**
|
||||
* 评论
|
||||
*
|
||||
* @param dto 评论请求参数
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "审批流程评论")
|
||||
@PostMapping("/api/process/task/comment")
|
||||
Boolean commentTask(@Validated @RequestBody BpmnTaskCommentDTO dto);
|
||||
|
||||
/**
|
||||
* 加签
|
||||
*
|
||||
* @param dto 加签请求参数
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "审批流程加签")
|
||||
@PostMapping("/api/process/task/countersign")
|
||||
Boolean countersignTask(@Validated @RequestBody BpmnTaskCountersignDTO dto);
|
||||
|
||||
/**
|
||||
* 重置节点审批人(提级审批)
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "重置节点审批人(提级审批)")
|
||||
@PostMapping("/api/process/task/approvers/reset")
|
||||
Boolean resetTaskApprovers(@Validated @RequestBody BpmnTaskResetApproversDTO dto);
|
||||
|
||||
/**
|
||||
* 暂停流程任务,并创建机器人节点,等待业务推动
|
||||
*
|
||||
* @param dto
|
||||
* @return 返回机器人节点任务 ID
|
||||
*/
|
||||
@Operation(summary = "创建机器人节点, 暂停流程任务")
|
||||
@PostMapping("/api/process/task/robot/create")
|
||||
String createRobotTask(@Validated @RequestBody BpmnRobotTaskCreateDTO dto);
|
||||
|
||||
/**
|
||||
* 完成机器人节点
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "完成机器人节点, 继续流程任务")
|
||||
@PostMapping("/api/process/task/robot/complete")
|
||||
Boolean completeRobotTask(@Validated @RequestBody BpmnRobotTaskCompleteDTO dto);
|
||||
@PostMapping("/api/form/admin/instance/render")
|
||||
@InvokeMode(SYNC)
|
||||
FormInstanceVO getFormInstance(@Validated @RequestBody FormDetailDTO dto);
|
||||
|
||||
/**
|
||||
* 创建流程前的节点列表
|
||||
@ -315,6 +211,7 @@ public interface WorkflowCoreService {
|
||||
*/
|
||||
@Operation(summary = "发起人主动撤回审核,MQ 触发规则:1. 当前流程实例中现存的任务会依次触发 process-task-deleted 事件,2. 当前流程实例会触发 process-instance-cancelled 事件")
|
||||
@DeleteMapping("/api/process/instance/cancel")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean cancelProcessInstance(@Validated @RequestBody BpmnProcessInstanceCancelDTO dto);
|
||||
|
||||
/**
|
||||
@ -325,6 +222,7 @@ public interface WorkflowCoreService {
|
||||
*/
|
||||
@Operation(summary = "中止流程实例")
|
||||
@DeleteMapping("/api/process/instance/abort")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean abortProcessInstance(@Validated @RequestBody BpmnProcessInstanceAbortDTO dto);
|
||||
|
||||
/**
|
||||
@ -335,19 +233,9 @@ public interface WorkflowCoreService {
|
||||
*/
|
||||
@Operation(summary = "批量中止流程实例")
|
||||
@DeleteMapping("/api/process/instance/batch/abort")
|
||||
@InvokeMode(ASYNC)
|
||||
BatchOperationResultVO batchAbortProcessInstance(@Validated @RequestBody List<BpmnProcessInstanceAbortDTO> dtos);
|
||||
|
||||
/**
|
||||
* 抄送流程实例(未实现)
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "抄送流程实例")
|
||||
@PostMapping("/api/process/instance/carbon-copy")
|
||||
@Deprecated
|
||||
Boolean carbonCopyProcessInstance(@Validated @RequestBody BpmnProcessInstanceCarbonCopyDTO dto);
|
||||
|
||||
/**
|
||||
* 获得流程实例
|
||||
*
|
||||
@ -371,6 +259,16 @@ public interface WorkflowCoreService {
|
||||
@InvokeMode(SYNC)
|
||||
Map<String, Object> getProcessVariables(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 校验指定流程实例下,是否存在指定的审批人正处理待审批
|
||||
*
|
||||
* @return true 是在当前流程实例中,存在指定的审批人
|
||||
*/
|
||||
@Operation(summary = "校验指定流程实例下,是否存在指定的审批人")
|
||||
@PostMapping("/api/process/instance/check/approver")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean checkInstanceApprover(@Validated @RequestBody BpmnProcessInstanceCheckApproverDTO dto);
|
||||
|
||||
/**
|
||||
* 获取指定流程的日志
|
||||
*
|
||||
@ -442,6 +340,178 @@ public interface WorkflowCoreService {
|
||||
@InvokeMode(SYNC)
|
||||
List<SignFileDTO> getProcessInstanceFinalDocs(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId);
|
||||
|
||||
/**
|
||||
* 同意
|
||||
*
|
||||
* <pre>
|
||||
* MQ 触发规则:
|
||||
* 1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,
|
||||
* 如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件)
|
||||
* 2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件
|
||||
* 2.2. 流程实例正常结束会触发 process-instance-completed 事件
|
||||
* </pre>
|
||||
*/
|
||||
@Operation(summary = "同意,MQ 触发规则:1. 当前审批任务会依次触发 process-task-completed 和 process-task-deleted 事件(如果有下一级审批,则会触发第 2.1 点中的事件,如果当前审核任务最后一级审批,则会触发第 2.2 点中的事件),2.1. 下一级审批任务会依次触发 process-task-assigned 和 process-task-created 事件,2.2. 流程实例正常结束会触发 process-instance-completed 事件")
|
||||
@PostMapping("/api/process/task/approve")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean approveTask(@Validated @RequestBody BpmnTaskAuditDTO dto);
|
||||
|
||||
/**
|
||||
* 同意时并提交表单数据
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "同意时并提交表单")
|
||||
@PostMapping("/api/process/task/form/approve")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean approveTaskWithForm(@Validated @RequestBody BpmnTaskAuditWithFormDTO dto);
|
||||
|
||||
/**
|
||||
* 批量同意
|
||||
*
|
||||
* @param dtos
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "批量同意")
|
||||
@PostMapping("/api/process/task/batch/approve")
|
||||
@InvokeMode(ASYNC)
|
||||
BatchOperationResultVO batchApproveTask(@Validated @RequestBody List<BpmnTaskAuditDTO> dtos);
|
||||
|
||||
/**
|
||||
* 获取当前节点可回退节点选项列表
|
||||
*
|
||||
* @param taskId 当前任务id
|
||||
* @return 可以回退节点列表
|
||||
*/
|
||||
@Operation(summary = "获取当前节点可回退节点选项列表")
|
||||
@GetMapping("/api/process/task/back/optional/nodes")
|
||||
@InvokeMode(SYNC)
|
||||
List<BpmnOptionalNodeDTO> getBackOptionalNodes(@RequestParam @NotBlank(message = "任务id不能为空") String taskId);
|
||||
|
||||
/**
|
||||
* 回退到指定节点
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "回退")
|
||||
@PostMapping("/api/process/task/back")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean backTask(@Validated @RequestBody BpmnTaskBackAuditDTO dto);
|
||||
|
||||
/**
|
||||
* 驳回
|
||||
*
|
||||
* <pre>
|
||||
* MQ 触发规则:
|
||||
* 1. 当前审批任务会触发 process-task-deleted 事件
|
||||
* 2. 当前流程实例会触发 process-instance-rejected 事件
|
||||
* </pre>
|
||||
*/
|
||||
@Operation(summary = "驳回,MQ 触发规则:1. 当前审批任务会触发 process-task-deleted 事件, 2. 当前流程实例会触发 process-instance-rejected 事件")
|
||||
@PostMapping("/api/process/task/reject")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean rejectTask(@Validated @RequestBody BpmnTaskAuditDTO dto);
|
||||
|
||||
/**
|
||||
* 批量驳回
|
||||
*
|
||||
* @param dtos 批量请求参数
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/process/task/batch/reject")
|
||||
@InvokeMode(ASYNC)
|
||||
BatchOperationResultVO batchRejectTask(@Validated @RequestBody List<BpmnTaskAuditDTO> dtos);
|
||||
|
||||
/**
|
||||
* 转交
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "直接修改审批任务的审批人")
|
||||
@PostMapping("/api/process/task/transfer")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean transferTask(@Validated @RequestBody BpmnTaskTransferDTO dto);
|
||||
|
||||
/**
|
||||
* 批量转交
|
||||
*
|
||||
* @param dtos
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "批量修改审批任务的审批人")
|
||||
@PostMapping("/api/process/task/batch/transfer")
|
||||
@InvokeMode(ASYNC)
|
||||
BatchOperationResultVO batchTransferTask(@Validated @RequestBody List<BpmnTaskTransferDTO> dtos);
|
||||
|
||||
/**
|
||||
* 评论
|
||||
*
|
||||
* @param dto 评论请求参数
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "审批流程评论")
|
||||
@PostMapping("/api/process/task/comment")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean commentTask(@Validated @RequestBody BpmnTaskCommentDTO dto);
|
||||
|
||||
/**
|
||||
* 加签
|
||||
*
|
||||
* @param dto 加签请求参数
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "审批流程加签")
|
||||
@PostMapping("/api/process/task/countersign")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean countersignTask(@Validated @RequestBody BpmnTaskCountersignDTO dto);
|
||||
|
||||
/**
|
||||
* 重置节点审批人(提级审批)
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "重置节点审批人(提级审批)")
|
||||
@PostMapping("/api/process/task/approvers/reset")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean resetTaskApprovers(@Validated @RequestBody BpmnTaskResetApproversDTO dto);
|
||||
|
||||
/**
|
||||
* 催办
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "审批流程催办")
|
||||
@PostMapping("/api/process/task/remind")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean remindTask(@Validated @RequestBody BpmnTaskRemindDTO dto);
|
||||
|
||||
/**
|
||||
* 暂停流程任务,并创建机器人节点,等待业务推动
|
||||
*
|
||||
* @param dto
|
||||
* @return 返回机器人节点任务 ID
|
||||
*/
|
||||
@Operation(summary = "创建机器人节点, 暂停流程任务")
|
||||
@PostMapping("/api/process/task/robot/create")
|
||||
@InvokeMode(ASYNC)
|
||||
String createRobotTask(@Validated @RequestBody BpmnRobotTaskCreateDTO dto);
|
||||
|
||||
/**
|
||||
* 完成机器人节点
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "完成机器人节点, 继续流程任务")
|
||||
@PostMapping("/api/process/task/robot/complete")
|
||||
@InvokeMode(ASYNC)
|
||||
Boolean completeRobotTask(@Validated @RequestBody BpmnRobotTaskCompleteDTO dto);
|
||||
|
||||
/**
|
||||
* 强制使用‘异步’模式调用该方法,请在调用真实方法前调用该方法
|
||||
* <pre>
|
||||
|
||||
@ -5,65 +5,34 @@ import cn.axzo.workflow.common.util.ThreadUtil;
|
||||
import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
|
||||
import cn.axzo.workflow.common.annotation.InvokeMode;
|
||||
import cn.axzo.workflow.common.annotation.Manageable;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.definition.BpmnProcessDefinitionUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessDefinitionPageDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
|
||||
import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
|
||||
import cn.azxo.framework.common.model.CommonResponse;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
|
||||
import java.util.List;
|
||||
import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
|
||||
import cn.axzo.workflow.common.model.response.es.ProcessInstanceDocumentVO;
|
||||
import cn.axzo.workflow.common.model.request.category.*;
|
||||
import cn.axzo.workflow.common.model.response.category.CategoryConfigItemVO;
|
||||
import cn.axzo.workflow.common.model.response.category.CategoryGroupVarItemVo;
|
||||
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.*;
|
||||
import java.util.Map;
|
||||
import cn.axzo.workflow.common.model.request.admin.ProcessAdminCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.admin.ProcessAdminDeleteDTO;
|
||||
import cn.axzo.workflow.common.model.request.admin.ProcessAdminQueryDTO;
|
||||
import cn.axzo.workflow.common.model.response.admin.ProcessAdminVo;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.RestBpmnProcessVariable;
|
||||
import cn.axzo.workflow.common.model.dto.print.PrintFieldDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.print.PrintFieldQueryDTO;
|
||||
import java.util.Map;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import cn.axzo.workflow.common.model.request.form.definition.StartFormSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormDetailDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormSearchDTO;
|
||||
import cn.axzo.workflow.common.model.response.form.FormVO;
|
||||
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
||||
import cn.axzo.workflow.common.model.response.form.instance.FormInstanceVO;
|
||||
import cn.axzo.workflow.common.model.request.es.InstanceSearchReqDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.model.response.es.ProcessInstanceDocumentVO;
|
||||
import cn.axzo.workflow.common.model.dto.SignFileDTO;
|
||||
import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
|
||||
@ -80,17 +49,29 @@ import cn.axzo.workflow.common.model.request.bpmn.process.doc.ChangeApproverRead
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.doc.ProcessDocQueryDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.instance.FormVariablesUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceAdminPageItemVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstancePageItemVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.ExtProcessLogVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import cn.axzo.workflow.common.model.request.category.*;
|
||||
import cn.axzo.workflow.common.model.response.category.CategoryConfigItemVO;
|
||||
import cn.axzo.workflow.common.model.response.category.CategoryGroupVarItemVo;
|
||||
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.*;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocByIdDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.model.doc.DocOrderDTO;
|
||||
@ -107,10 +88,31 @@ import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelDetailVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.model.BpmnModelExtVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.model.doc.DocBaseVO;
|
||||
import cn.axzo.workflow.common.model.response.print.PrintModelDTO;
|
||||
import cn.axzo.workflow.common.model.request.admin.ProcessAdminCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.admin.ProcessAdminDeleteDTO;
|
||||
import cn.axzo.workflow.common.model.request.admin.ProcessAdminQueryDTO;
|
||||
import cn.axzo.workflow.common.model.response.admin.ProcessAdminVo;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.RestBpmnProcessVariable;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCreateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAttachmentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskAuditWithFormDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskBackAuditDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCommentDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskCountersignDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskPageSearchDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskRemindDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskResetApproversDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskTransferDTO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceGroupVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnHistoricTaskInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskDonePageItemVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceVO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskTodoPageItemVO;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.definition.BpmnProcessDefinitionUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessDefinitionPageDTO;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
|
||||
|
||||
/**
|
||||
* Workflow Engine Starter Management Service
|
||||
@ -122,91 +124,206 @@ import cn.axzo.workflow.common.model.response.admin.ProcessAdminVo;
|
||||
@org.springframework.cloud.openfeign.FeignClient(name = "workflow-engine", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}", configuration = WorkflowEngineStarterFeignConfiguration.class)
|
||||
public interface WorkflowManageService {
|
||||
|
||||
/**
|
||||
* 获取活跃的流程定义分页
|
||||
*/
|
||||
@GetMapping("/api/process/definition/page")
|
||||
@Operation(summary = "查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板")
|
||||
@GetMapping("/api/print/admin/template/exists")
|
||||
@InvokeMode(SYNC)
|
||||
BpmPageResult<BpmnProcessDefinitionVO> getProcessDefinitionPage(@Validated @RequestBody BpmnProcessDefinitionPageDTO dto);
|
||||
Boolean hasPrintTemplate(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
|
||||
|
||||
@Operation(summary = "获取打印模板中可打印的字段")
|
||||
@PostMapping("/api/print/admin/fields")
|
||||
@InvokeMode(SYNC)
|
||||
List<PrintFieldDTO> getPrintFields(@Validated @RequestBody PrintFieldQueryDTO dto);
|
||||
|
||||
@Operation(summary = "获取指定流程下用于替换打印的相关变量")
|
||||
@GetMapping("/api/print/admin/field/variables")
|
||||
@InvokeMode(SYNC)
|
||||
Map<String, Object> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
|
||||
|
||||
/**
|
||||
* 通过模型 ID 更新流程定义
|
||||
* 查询管理员
|
||||
* @param dto 管理员数据
|
||||
* @return 管理员id
|
||||
*/
|
||||
@PostMapping("/api/process/admin/query")
|
||||
@InvokeMode(SYNC)
|
||||
List<ProcessAdminVo> queryProcessAdmins(@RequestBody ProcessAdminQueryDTO dto);
|
||||
|
||||
/**
|
||||
* 查询管理员
|
||||
* @param dto 管理员数据
|
||||
* @return 管理员id
|
||||
*/
|
||||
@PostMapping("/api/process/admin/query/count")
|
||||
@InvokeMode(SYNC)
|
||||
Integer queryProcessAdminsCount(@RequestBody ProcessAdminQueryDTO dto);
|
||||
|
||||
/**
|
||||
* 添加管理员
|
||||
* @param dto 管理员数据
|
||||
* @return 管理员id
|
||||
*/
|
||||
@PostMapping("/api/process/admin/create")
|
||||
@InvokeMode(SYNC)
|
||||
Long createProcessAdmin(@RequestBody ProcessAdminCreateDTO dto);
|
||||
|
||||
/**
|
||||
* 批量添加管理员
|
||||
* @param dtos
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/process/admin/batch/create")
|
||||
@InvokeMode(SYNC)
|
||||
Void batchCreateProcessAdmin(@RequestBody List<ProcessAdminCreateDTO> dtos);
|
||||
|
||||
/**
|
||||
* 删除管理员
|
||||
* @param id 配置表id
|
||||
* @return
|
||||
*/
|
||||
@DeleteMapping("/api/process/admin/delete")
|
||||
@InvokeMode(SYNC)
|
||||
Integer deleteCommonProcessAdmin(@RequestParam Long id);
|
||||
|
||||
/**
|
||||
* 根据条件删除管理员
|
||||
* @param dto 删除条件
|
||||
* @return
|
||||
*/
|
||||
@DeleteMapping("/api/process/admin/delete/criteria")
|
||||
@InvokeMode(SYNC)
|
||||
Integer deleteProcessAdminCriteria(@RequestBody ProcessAdminDeleteDTO dto);
|
||||
|
||||
/**
|
||||
* 删除管理员
|
||||
* @param ids 管理员配置id列表
|
||||
* @return
|
||||
*/
|
||||
@DeleteMapping("/api/process/admin/batch/delete")
|
||||
@InvokeMode(SYNC)
|
||||
Integer batchDeleteProcessAdmin(@RequestBody List<Long> ids);
|
||||
|
||||
@PostMapping("/api/form/admin/form/page")
|
||||
@InvokeMode(SYNC)
|
||||
@Manageable
|
||||
List<FormVO> formPage(@Validated @RequestBody FormSearchDTO dto);
|
||||
|
||||
/**
|
||||
* 从 ES 中搜索符合条件的实例纬度数据
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@PutMapping("/api/process/definition/update")
|
||||
@PostMapping("/api/es/instance/search")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean updateProcessDefinition(@Validated @RequestBody BpmnProcessDefinitionUpdateDTO dto);
|
||||
BpmPageResult<ProcessInstanceDocumentVO> searchInstanceInEs(@Validated @RequestBody InstanceSearchReqDTO dto);
|
||||
|
||||
@DeleteMapping("/api/process/instance/super/cancel")
|
||||
@Manageable
|
||||
Boolean superCancelProcessInstance(@Validated @RequestBody SuperBpmnProcessInstanceCancelDTO dto);
|
||||
|
||||
/**
|
||||
* 获得指定定义编号对应的流程定义内容
|
||||
* 抄送流程实例(未实现)
|
||||
*
|
||||
* @param processDefinitionId 编号
|
||||
* @return 流程定义
|
||||
*/
|
||||
@GetMapping("/api/process/definition/get")
|
||||
@InvokeMode(SYNC)
|
||||
BpmnProcessDefinitionVO getProcessDefinition(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId);
|
||||
|
||||
/**
|
||||
* 获得 deploymentId 对应的 ProcessDefinition
|
||||
*
|
||||
* @param deploymentId 部署编号
|
||||
* @return 流程定义
|
||||
*/
|
||||
@GetMapping("/api/process/definition/getByDeploymentId")
|
||||
@InvokeMode(SYNC)
|
||||
BpmnProcessDefinitionVO getProcessDefinitionByDeploymentId(@NotBlank(message = "流程部署 ID 不能为空") @RequestParam String deploymentId);
|
||||
|
||||
/**
|
||||
* 获得流程定义标识对应的激活的流程定义
|
||||
*
|
||||
* @param key 流程定义的标识
|
||||
* @return 流程定义
|
||||
*/
|
||||
@GetMapping("/api/process/definition/active/getByKey")
|
||||
@InvokeMode(SYNC)
|
||||
BpmnProcessDefinitionVO getActiveProcessDefinitionByKey(@NotBlank(message = "模型定义KEY不能为空") @RequestParam String key, @RequestParam(required = false, defaultValue = NO_TENANT_ID) String tenantId);
|
||||
|
||||
/**
|
||||
* 挂起/激活流程,
|
||||
* 激活:SuspensionState.ACTIVE.getStateCode()
|
||||
* 挂起:SuspensionState.SUSPENDED.getStateCode()
|
||||
* {@see SuspensionState}
|
||||
*/
|
||||
@PutMapping("/api/process/definition/state/update")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean getActiveProcessDefinitionByKey(@NotBlank(message = "流程定义ID不能为空") @RequestParam String processDefinitionId, @NotNull(message = "状态不能为空") @RequestParam Integer state);
|
||||
|
||||
/**
|
||||
* 获取指定模型的定义 ID
|
||||
*
|
||||
* @return 流程定义ID
|
||||
*/
|
||||
@GetMapping("/api/process/definition/active/getByCategory")
|
||||
@InvokeMode(SYNC)
|
||||
String getActiveProcessDefinitionId(@RequestParam(required = false) String tenantId, @NotBlank(message = "分类不能为空") @RequestParam(required = false) String category);
|
||||
|
||||
/**
|
||||
* 获取指定模型激活的流程定义 JSON 模型
|
||||
*
|
||||
* @return 流程定义ID
|
||||
*/
|
||||
@GetMapping("/api/process/definition/active/json/model")
|
||||
@InvokeMode(SYNC)
|
||||
BpmnModelUpdateDTO getActiveProcessDefinitionJsonModel(@NotBlank(message = "模型 ID 不能为空") @RequestParam(required = false) String modelId, @NotBlank(message = "分类不能为空") @RequestParam(required = false) String key, @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 删除流程部署及定义
|
||||
*
|
||||
* @param deploymentId 流程定义部署 ID
|
||||
* @param cascade 是否级联参数定义对应的流程实例及 job 等管理内容
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/api/process/definition/delete")
|
||||
@Operation(summary = "抄送流程实例")
|
||||
@PostMapping("/api/process/instance/carbon-copy")
|
||||
@Deprecated
|
||||
@Manageable
|
||||
Boolean carbonCopyProcessInstance(@Validated @RequestBody BpmnProcessInstanceCarbonCopyDTO dto);
|
||||
|
||||
/**
|
||||
* 查询所有的审批流
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "查询所有的审批流")
|
||||
@PostMapping("/api/process/instance/page/all")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
Void delete(@NotBlank(message = "流程定义部署 ID 不能为空") String deploymentId, @RequestParam(required = false) Boolean cascade);
|
||||
BpmPageResult<BpmnProcessInstanceAdminPageItemVO> getAllProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceAdminPageReqVO dto);
|
||||
|
||||
/**
|
||||
* 我发起的审批列表
|
||||
*/
|
||||
@Operation(summary = "我发起的审批列表")
|
||||
@PostMapping("/api/process/instance/page/my")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
BpmPageResult<BpmnProcessInstancePageItemVO> getMyProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceMyPageReqVO dto);
|
||||
|
||||
/**
|
||||
* 更新流程定义的状态
|
||||
*
|
||||
* @param processDefinitionId 流程定义的编号
|
||||
* @param status 1, "active"; 2, "suspended"
|
||||
*/
|
||||
@Operation(summary = "更新指定流程定义的版本的状态, 处于 suspended 状态的流程模型将不能再发起实例")
|
||||
@PutMapping("/api/process/instance/status/update")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
Boolean updateProcessStatus(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId, @NotNull(message = "状态不能为空") @RequestParam Integer status);
|
||||
|
||||
/**
|
||||
* 获取审批流程实例的运行图
|
||||
*
|
||||
* @param processInstanceId
|
||||
* @param tenantId
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "获取审批流程实例的运行图")
|
||||
@GetMapping("/api/process/instance/graphical")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
ObjectNode processInstanceGraphical(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 推断指定流程实例的所有节点执行顺序
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "推断指定流程实例的所有节点执行顺序")
|
||||
@GetMapping("/api/process/instance/node/forecasting")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<ProcessNodeDetailVO> processInstanceNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 推断指定流程实例的过滤掉部分节点执行顺序
|
||||
*
|
||||
* @param allNode 如果为真时,相当于调用 {@link ProcessInstanceApi#processInstanceNodeForecast(String, String)} 方法,切会直接丢弃 nodeDefinitionKeys 参数
|
||||
* 如果为假时,才结合 nodeDefinitionKeys 过滤掉传入的节点
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "推断指定流程实例的过滤掉部分节点执行顺序")
|
||||
@GetMapping("/api/process/instance/node/filter/forecasting")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<ProcessNodeDetailVO> processInstanceFilterNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId, @Nullable @RequestParam(required = false) String tenantId, @RequestParam(required = false, defaultValue = "false") Boolean allNode, @Nullable @RequestParam(required = false) List<String> nodeDefinitionKeys);
|
||||
|
||||
/**
|
||||
* 查询实例的租户集合
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "查询实例的租户集合")
|
||||
@GetMapping("/api/process/instance/tenant/ids")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<String> getTenantIds();
|
||||
|
||||
/**
|
||||
* 查询 ExtAxProcessLog 表中审批人的冗余信息
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "查询 ExtAxProcessLog 表中审批人的冗余信息")
|
||||
@GetMapping("/api/process/instance/log/approve/ext")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<ExtProcessLogVO> getProcessLogByInstanceIdAndPersonId(@Validated @RequestBody LogApproveSearchDTO dto);
|
||||
|
||||
/**
|
||||
* 将死信队列中的任务转移到正常 JOB 队列中
|
||||
@ -240,25 +357,6 @@ public interface WorkflowManageService {
|
||||
@Manageable
|
||||
String getDeadLetterJobExceptionStacktraceByJobId(@RequestParam String jobId);
|
||||
|
||||
/**
|
||||
* 获取流程操作按钮列表
|
||||
*
|
||||
* @return 流程操作按钮列表
|
||||
*/
|
||||
@GetMapping("/api/process/config/button/list")
|
||||
@InvokeMode(SYNC)
|
||||
List<BpmnButtonMetaInfo> getDefaultButtons();
|
||||
|
||||
/**
|
||||
* 从 ES 中搜索符合条件的实例纬度数据
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/es/instance/search")
|
||||
@InvokeMode(SYNC)
|
||||
BpmPageResult<ProcessInstanceDocumentVO> searchInstanceInEs(@Validated @RequestBody InstanceSearchReqDTO dto);
|
||||
|
||||
/**
|
||||
* 获取指定业务分类
|
||||
*
|
||||
@ -414,274 +512,13 @@ public interface WorkflowManageService {
|
||||
Boolean upsertCategoryGroupAndVars(@Validated @RequestBody CategoryGroupVarUpsertDto dto);
|
||||
|
||||
/**
|
||||
* 该功能应该利用引擎的 TimerBoundaryEvent 来实现,但为了简便,先利用引擎的任务调度来实现
|
||||
* 获取流程操作按钮列表
|
||||
*
|
||||
* @return
|
||||
* @return 流程操作按钮列表
|
||||
*/
|
||||
@PostMapping("/api/process/activity/timeout/trigger")
|
||||
@Manageable
|
||||
@Operation(summary = "设置指定业务节点定时继续往下执行")
|
||||
Boolean setTimeoutTrigger(@Validated @RequestBody BpmnActivityTimeoutTriggerDTO dto);
|
||||
|
||||
/**
|
||||
* 为指定业务节点设置定时回调
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Manageable
|
||||
@PostMapping("/api/process/activity/timeout/callback")
|
||||
@Operation(summary = "设置指定业务节点定时回调")
|
||||
Boolean setTimeoutCallback(@Validated @RequestBody BpmnActivityTimeoutCallbackDTO dto);
|
||||
|
||||
/**
|
||||
* 为指定流程新增变量
|
||||
*/
|
||||
@PostMapping("/api/process/variable/create/{executionId}")
|
||||
@GetMapping("/api/process/config/button/list")
|
||||
@InvokeMode(SYNC)
|
||||
Void createVariable(@PathVariable @NotBlank(message = "流程实例 ID 不能为空") String executionId, @RequestBody @Validated RestBpmnProcessVariable restVariable);
|
||||
|
||||
/**
|
||||
* 仅更新流程已存在的变量
|
||||
*
|
||||
* @param executionId
|
||||
* @param restVariable
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/process/variable/update/{executionId}")
|
||||
@InvokeMode(SYNC)
|
||||
Void updateVariable(@PathVariable @NotBlank(message = "流程实例 ID 不能为空") String executionId, @RequestBody @Validated RestBpmnProcessVariable restVariable);
|
||||
|
||||
/**
|
||||
* 批量删除流程变量
|
||||
*/
|
||||
@DeleteMapping("/api/process/variable/delete/{executionId}")
|
||||
@InvokeMode(SYNC)
|
||||
Void deleteVariables(@PathVariable("executionId") String executionId, @RequestParam String variableNames, @RequestParam(value = "scope", required = false) String scope);
|
||||
|
||||
@Operation(summary = "查询指定审批流程是否能打印,打印开关是否开启,是否存在打印模板")
|
||||
@GetMapping("/api/print/admin/template/exists")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean hasPrintTemplate(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
|
||||
|
||||
@Operation(summary = "获取打印模板中可打印的字段")
|
||||
@PostMapping("/api/print/admin/fields")
|
||||
@InvokeMode(SYNC)
|
||||
List<PrintFieldDTO> getPrintFields(@Validated @RequestBody PrintFieldQueryDTO dto);
|
||||
|
||||
@Operation(summary = "获取指定流程下用于替换打印的相关变量")
|
||||
@GetMapping("/api/print/admin/field/variables")
|
||||
@InvokeMode(SYNC)
|
||||
Map<String, Object> getPrintFieldVariables(@NotBlank(message = "流程实例不能为空") @RequestParam String processInstanceId);
|
||||
|
||||
/**
|
||||
* 催办
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "审批流程催办")
|
||||
@PostMapping("/api/process/task/remind")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
Boolean remindTask(@Validated @RequestBody BpmnTaskRemindDTO dto);
|
||||
|
||||
/**
|
||||
* 添加附件
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "添加附件")
|
||||
@PostMapping("/api/process/task/attachment")
|
||||
@Manageable
|
||||
Void addAttachment(@Validated @RequestBody BpmnTaskAttachmentDTO dto);
|
||||
|
||||
/**
|
||||
* 待审核列表
|
||||
*/
|
||||
@Operation(summary = "待审核列表")
|
||||
@GetMapping("/api/process/task/page/todo")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
BpmPageResult<BpmnTaskTodoPageItemVO> getTodoTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto);
|
||||
|
||||
/**
|
||||
* 已完成的审批列表
|
||||
*/
|
||||
@Operation(summary = "已完成的审批列表")
|
||||
@GetMapping("/api/process/task/page/done")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
BpmPageResult<BpmnTaskDonePageItemVO> getDoneTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto);
|
||||
|
||||
/**
|
||||
* 获取指定流程实例的审批过程信息
|
||||
* <p>
|
||||
* 同一层级结构
|
||||
*/
|
||||
@Operation(summary = "获取指定流程实例的审批过程信息")
|
||||
@GetMapping("/api/process/task/list/flat")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<BpmnHistoricTaskInstanceVO> getTaskListFlatByProcessInstanceId(@NotBlank(message = "流程实例 ID " + "不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 获取指定流程实例的审批过程信息
|
||||
* <p>
|
||||
* 分组结构
|
||||
*/
|
||||
@Operation(summary = "获取指定流程实例的审批过程信息")
|
||||
@GetMapping("/api/process/task/list/group")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<BpmnHistoricTaskInstanceGroupVO> getTaskListGroupByProcessInstanceId(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 获取实例正在审核的人列表
|
||||
*/
|
||||
@Operation(summary = "获取实例正在审核的人列表")
|
||||
@GetMapping("/api/process/task/active/list")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<BpmnTaskInstanceVO> getActiveTasksByProcessInstanceId(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @NotBlank(message = "租户不能为空") @RequestParam String tenantId);
|
||||
|
||||
/**
|
||||
* 根据实例 ID 和自然人 ID 查询对应待处理的任务 ID
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "根据实例 ID 和自然人 ID 查询对应待处理的任务 ID")
|
||||
@GetMapping("/api/process/task/find")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
String findTaskIdByInstanceIdAndPersonId(@RequestParam(required = false) @NotBlank(message = "流程实例 ID 不能为空") String processInstanceId, @RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId);
|
||||
|
||||
/**
|
||||
* 根据实例 ID列表 和自然人 ID 查询对应待处理的任务 ID
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "根据实例 ID列表 和自然人 ID 查询对应待处理的任务 ID")
|
||||
@GetMapping("/api/process/task/batch/find")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
Map<String, String> findTaskIdByInstanceIdsAndPersonId(@RequestParam(required = false) @NotEmpty(message = "流程实例 ID列表 不能为空") List<String> processInstanceIds, @RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId);
|
||||
|
||||
@PostMapping("/api/form/admin/form/page")
|
||||
@InvokeMode(SYNC)
|
||||
List<FormVO> formPage(@Validated @RequestBody FormSearchDTO dto);
|
||||
|
||||
@PostMapping("/api/form/admin/start/form")
|
||||
@InvokeMode(SYNC)
|
||||
FormDefinitionVO getFormDefinition(@Validated @RequestBody StartFormSearchDTO dto);
|
||||
|
||||
/**
|
||||
* 查询指定审批实例的表单模型和数据
|
||||
* <p>
|
||||
* dto 中的 processInstanceId 与 taskId,至少有一个属性有值,一般建议直接使用实例 ID。
|
||||
* 当传入 taskId 时,将只查询该任务绑定的表单模型和数据。
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/form/admin/instance/render")
|
||||
@InvokeMode(SYNC)
|
||||
FormInstanceVO getFormInstance(@Validated @RequestBody FormDetailDTO dto);
|
||||
|
||||
@DeleteMapping("/api/process/instance/super/cancel")
|
||||
@Manageable
|
||||
Boolean superCancelProcessInstance(@Validated @RequestBody SuperBpmnProcessInstanceCancelDTO dto);
|
||||
|
||||
/**
|
||||
* 查询所有的审批流
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "查询所有的审批流")
|
||||
@PostMapping("/api/process/instance/page/all")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
BpmPageResult<BpmnProcessInstanceAdminPageItemVO> getAllProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceAdminPageReqVO dto);
|
||||
|
||||
/**
|
||||
* 我发起的审批列表
|
||||
*/
|
||||
@Operation(summary = "我发起的审批列表")
|
||||
@PostMapping("/api/process/instance/page/my")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
BpmPageResult<BpmnProcessInstancePageItemVO> getMyProcessInstancePage(@Validated @RequestBody BpmnProcessInstanceMyPageReqVO dto);
|
||||
|
||||
/**
|
||||
* 更新流程定义的状态
|
||||
*
|
||||
* @param processDefinitionId 流程定义的编号
|
||||
* @param status 1, "active"; 2, "suspended"
|
||||
*/
|
||||
@Operation(summary = "更新指定流程定义的版本的状态, 处于 suspended 状态的流程模型将不能再发起实例")
|
||||
@PutMapping("/api/process/instance/status/update")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
Boolean updateProcessStatus(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId, @NotNull(message = "状态不能为空") @RequestParam Integer status);
|
||||
|
||||
/**
|
||||
* 获取审批流程实例的运行图
|
||||
*
|
||||
* @param processInstanceId
|
||||
* @param tenantId
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "获取审批流程实例的运行图")
|
||||
@GetMapping("/api/process/instance/graphical")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
ObjectNode processInstanceGraphical(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 推断指定流程实例的所有节点执行顺序
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "推断指定流程实例的所有节点执行顺序")
|
||||
@GetMapping("/api/process/instance/node/forecasting")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<ProcessNodeDetailVO> processInstanceNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 推断指定流程实例的过滤掉部分节点执行顺序
|
||||
*
|
||||
* @param allNode 如果为真时,相当于调用 {@link ProcessInstanceApi#processInstanceNodeForecast(String, String)} 方法,切会直接丢弃 nodeDefinitionKeys 参数
|
||||
* 如果为假时,才结合 nodeDefinitionKeys 过滤掉传入的节点
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "推断指定流程实例的过滤掉部分节点执行顺序")
|
||||
@GetMapping("/api/process/instance/node/filter/forecasting")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<ProcessNodeDetailVO> processInstanceFilterNodeForecast(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId, @Nullable @RequestParam(required = false) String tenantId, @RequestParam(required = false, defaultValue = "false") Boolean allNode, @Nullable @RequestParam(required = false) List<String> nodeDefinitionKeys);
|
||||
|
||||
/**
|
||||
* 查询实例的租户集合
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "查询实例的租户集合")
|
||||
@GetMapping("/api/process/instance/tenant/ids")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<String> getTenantIds();
|
||||
|
||||
/**
|
||||
* 校验指定流程实例下,是否存在指定的审批人正处理待审批
|
||||
*
|
||||
* @return true 是在当前流程实例中,存在指定的审批人
|
||||
*/
|
||||
@Operation(summary = "校验指定流程实例下,是否存在指定的审批人")
|
||||
@PostMapping("/api/process/instance/check/approver")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
Boolean checkInstanceApprover(@Validated @RequestBody BpmnProcessInstanceCheckApproverDTO dto);
|
||||
List<BpmnButtonMetaInfo> getDefaultButtons();
|
||||
|
||||
/**
|
||||
* 流程模型列表
|
||||
@ -1009,67 +846,208 @@ public interface WorkflowManageService {
|
||||
List<Long> hasFilesTenantIds(@Validated @RequestBody DocTenantQueryDTO dto);
|
||||
|
||||
/**
|
||||
* 查询管理员
|
||||
* @param dto 管理员数据
|
||||
* @return 管理员id
|
||||
* 为指定流程新增变量
|
||||
*/
|
||||
@PostMapping("/api/process/admin/query")
|
||||
@PostMapping("/api/process/variable/create/{executionId}")
|
||||
@InvokeMode(SYNC)
|
||||
List<ProcessAdminVo> queryProcessAdmins(@RequestBody ProcessAdminQueryDTO dto);
|
||||
Void createVariable(@PathVariable @NotBlank(message = "流程实例 ID 不能为空") String executionId, @RequestBody @Validated RestBpmnProcessVariable restVariable);
|
||||
|
||||
/**
|
||||
* 查询管理员
|
||||
* @param dto 管理员数据
|
||||
* @return 管理员id
|
||||
*/
|
||||
@PostMapping("/api/process/admin/query/count")
|
||||
@InvokeMode(SYNC)
|
||||
Integer queryProcessAdminsCount(@RequestBody ProcessAdminQueryDTO dto);
|
||||
|
||||
/**
|
||||
* 添加管理员
|
||||
* @param dto 管理员数据
|
||||
* @return 管理员id
|
||||
*/
|
||||
@PostMapping("/api/process/admin/create")
|
||||
@InvokeMode(SYNC)
|
||||
Long createProcessAdmin(@RequestBody ProcessAdminCreateDTO dto);
|
||||
|
||||
/**
|
||||
* 批量添加管理员
|
||||
* @param dtos
|
||||
* 仅更新流程已存在的变量
|
||||
*
|
||||
* @param executionId
|
||||
* @param restVariable
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/api/process/admin/batch/create")
|
||||
@PostMapping("/api/process/variable/update/{executionId}")
|
||||
@InvokeMode(SYNC)
|
||||
Void batchCreateProcessAdmin(@RequestBody List<ProcessAdminCreateDTO> dtos);
|
||||
Void updateVariable(@PathVariable @NotBlank(message = "流程实例 ID 不能为空") String executionId, @RequestBody @Validated RestBpmnProcessVariable restVariable);
|
||||
|
||||
/**
|
||||
* 删除管理员
|
||||
* @param id 配置表id
|
||||
* @return
|
||||
* 批量删除流程变量
|
||||
*/
|
||||
@DeleteMapping("/api/process/admin/delete")
|
||||
@DeleteMapping("/api/process/variable/delete/{executionId}")
|
||||
@InvokeMode(SYNC)
|
||||
Integer deleteCommonProcessAdmin(@RequestParam Long id);
|
||||
Void deleteVariables(@PathVariable("executionId") String executionId, @RequestParam String variableNames, @RequestParam(value = "scope", required = false) String scope);
|
||||
|
||||
/**
|
||||
* 根据条件删除管理员
|
||||
* @param dto 删除条件
|
||||
* @return
|
||||
* 用于系统内部操作,跳转到指定节点
|
||||
*
|
||||
* @param dto 请求参数
|
||||
* @return 是否成功
|
||||
*/
|
||||
@DeleteMapping("/api/process/admin/delete/criteria")
|
||||
@InvokeMode(SYNC)
|
||||
Integer deleteProcessAdminCriteria(@RequestBody ProcessAdminDeleteDTO dto);
|
||||
@Operation(summary = "系统操作回退任务到指定节点")
|
||||
@PostMapping("/api/process/task/system/back")
|
||||
@Manageable
|
||||
Boolean systemBackTask(@Validated @RequestBody BpmnNodeBackSystemOperateDTO dto);
|
||||
|
||||
/**
|
||||
* 删除管理员
|
||||
* @param ids 管理员配置id列表
|
||||
* 添加附件
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@DeleteMapping("/api/process/admin/batch/delete")
|
||||
@Operation(summary = "添加附件")
|
||||
@PostMapping("/api/process/task/attachment")
|
||||
@Manageable
|
||||
Void addAttachment(@Validated @RequestBody BpmnTaskAttachmentDTO dto);
|
||||
|
||||
/**
|
||||
* 待审核列表
|
||||
*/
|
||||
@Operation(summary = "待审核列表")
|
||||
@GetMapping("/api/process/task/page/todo")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
Integer batchDeleteProcessAdmin(@RequestBody List<Long> ids);
|
||||
BpmPageResult<BpmnTaskTodoPageItemVO> getTodoTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto);
|
||||
|
||||
/**
|
||||
* 已完成的审批列表
|
||||
*/
|
||||
@Operation(summary = "已完成的审批列表")
|
||||
@GetMapping("/api/process/task/page/done")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
BpmPageResult<BpmnTaskDonePageItemVO> getDoneTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto);
|
||||
|
||||
/**
|
||||
* 获取指定流程实例的审批过程信息
|
||||
* <p>
|
||||
* 同一层级结构
|
||||
*/
|
||||
@Operation(summary = "获取指定流程实例的审批过程信息")
|
||||
@GetMapping("/api/process/task/list/flat")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<BpmnHistoricTaskInstanceVO> getTaskListFlatByProcessInstanceId(@NotBlank(message = "流程实例 ID " + "不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 获取指定流程实例的审批过程信息
|
||||
* <p>
|
||||
* 分组结构
|
||||
*/
|
||||
@Operation(summary = "获取指定流程实例的审批过程信息")
|
||||
@GetMapping("/api/process/task/list/group")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<BpmnHistoricTaskInstanceGroupVO> getTaskListGroupByProcessInstanceId(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 获取实例正在审核的人列表
|
||||
*/
|
||||
@Operation(summary = "获取实例正在审核的人列表")
|
||||
@GetMapping("/api/process/task/active/list")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
List<BpmnTaskInstanceVO> getActiveTasksByProcessInstanceId(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @NotBlank(message = "租户不能为空") @RequestParam String tenantId);
|
||||
|
||||
/**
|
||||
* 根据实例 ID 和自然人 ID 查询对应待处理的任务 ID
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "根据实例 ID 和自然人 ID 查询对应待处理的任务 ID")
|
||||
@GetMapping("/api/process/task/find")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
String findTaskIdByInstanceIdAndPersonId(@RequestParam(required = false) @NotBlank(message = "流程实例 ID 不能为空") String processInstanceId, @RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId);
|
||||
|
||||
/**
|
||||
* 根据实例 ID列表 和自然人 ID 查询对应待处理的任务 ID
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Operation(summary = "根据实例 ID列表 和自然人 ID 查询对应待处理的任务 ID")
|
||||
@GetMapping("/api/process/task/batch/find")
|
||||
@Manageable
|
||||
@InvokeMode(SYNC)
|
||||
Map<String, String> findTaskIdByInstanceIdsAndPersonId(@RequestParam(required = false) @NotEmpty(message = "流程实例 ID列表 不能为空") List<String> processInstanceIds, @RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId);
|
||||
|
||||
/**
|
||||
* 获取活跃的流程定义分页
|
||||
*/
|
||||
@GetMapping("/api/process/definition/page")
|
||||
@InvokeMode(SYNC)
|
||||
BpmPageResult<BpmnProcessDefinitionVO> getProcessDefinitionPage(@Validated @RequestBody BpmnProcessDefinitionPageDTO dto);
|
||||
|
||||
/**
|
||||
* 通过模型 ID 更新流程定义
|
||||
*
|
||||
* @param dto
|
||||
* @return
|
||||
*/
|
||||
@PutMapping("/api/process/definition/update")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean updateProcessDefinition(@Validated @RequestBody BpmnProcessDefinitionUpdateDTO dto);
|
||||
|
||||
/**
|
||||
* 获得指定定义编号对应的流程定义内容
|
||||
*
|
||||
* @param processDefinitionId 编号
|
||||
* @return 流程定义
|
||||
*/
|
||||
@GetMapping("/api/process/definition/get")
|
||||
@InvokeMode(SYNC)
|
||||
BpmnProcessDefinitionVO getProcessDefinition(@NotBlank(message = "流程定义 ID 不能为空") @RequestParam String processDefinitionId);
|
||||
|
||||
/**
|
||||
* 获得 deploymentId 对应的 ProcessDefinition
|
||||
*
|
||||
* @param deploymentId 部署编号
|
||||
* @return 流程定义
|
||||
*/
|
||||
@GetMapping("/api/process/definition/getByDeploymentId")
|
||||
@InvokeMode(SYNC)
|
||||
BpmnProcessDefinitionVO getProcessDefinitionByDeploymentId(@NotBlank(message = "流程部署 ID 不能为空") @RequestParam String deploymentId);
|
||||
|
||||
/**
|
||||
* 获得流程定义标识对应的激活的流程定义
|
||||
*
|
||||
* @param key 流程定义的标识
|
||||
* @return 流程定义
|
||||
*/
|
||||
@GetMapping("/api/process/definition/active/getByKey")
|
||||
@InvokeMode(SYNC)
|
||||
BpmnProcessDefinitionVO getActiveProcessDefinitionByKey(@NotBlank(message = "模型定义KEY不能为空") @RequestParam String key, @RequestParam(required = false, defaultValue = NO_TENANT_ID) String tenantId);
|
||||
|
||||
/**
|
||||
* 挂起/激活流程,
|
||||
* 激活:SuspensionState.ACTIVE.getStateCode()
|
||||
* 挂起:SuspensionState.SUSPENDED.getStateCode()
|
||||
* {@see SuspensionState}
|
||||
*/
|
||||
@PutMapping("/api/process/definition/state/update")
|
||||
@InvokeMode(SYNC)
|
||||
Boolean getActiveProcessDefinitionByKey(@NotBlank(message = "流程定义ID不能为空") @RequestParam String processDefinitionId, @NotNull(message = "状态不能为空") @RequestParam Integer state);
|
||||
|
||||
/**
|
||||
* 获取指定模型的定义 ID
|
||||
*
|
||||
* @return 流程定义ID
|
||||
*/
|
||||
@GetMapping("/api/process/definition/active/getByCategory")
|
||||
@InvokeMode(SYNC)
|
||||
String getActiveProcessDefinitionId(@RequestParam(required = false) String tenantId, @NotBlank(message = "分类不能为空") @RequestParam(required = false) String category);
|
||||
|
||||
/**
|
||||
* 获取指定模型激活的流程定义 JSON 模型
|
||||
*
|
||||
* @return 流程定义ID
|
||||
*/
|
||||
@GetMapping("/api/process/definition/active/json/model")
|
||||
@InvokeMode(SYNC)
|
||||
BpmnModelUpdateDTO getActiveProcessDefinitionJsonModel(@NotBlank(message = "模型 ID 不能为空") @RequestParam(required = false) String modelId, @NotBlank(message = "分类不能为空") @RequestParam(required = false) String key, @RequestParam(required = false) String tenantId);
|
||||
|
||||
/**
|
||||
* 删除流程部署及定义
|
||||
*
|
||||
* @param deploymentId 流程定义部署 ID
|
||||
* @param cascade 是否级联参数定义对应的流程实例及 job 等管理内容
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/api/process/definition/delete")
|
||||
@InvokeMode(SYNC)
|
||||
Void delete(@NotBlank(message = "流程定义部署 ID 不能为空") String deploymentId, @RequestParam(required = false) Boolean cascade);
|
||||
|
||||
/**
|
||||
* 强制使用‘同步’模式调用该方法,请在调用真实方法前调用该方法
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user