Merge branch 'feature/REQ-3502' into 'master'

Feature/req 3502

See merge request universal/infrastructure/backend/workflow-engine!17
This commit is contained in:
金海洋 2025-02-20 05:45:53 +00:00
commit a5000681b2
29 changed files with 544 additions and 360 deletions

View File

@ -16,7 +16,7 @@
<name>Workflow Engine</name>
<properties>
<revision>1.5.1-SNAPSHOT</revision>
<revision>1.5.2-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>

View File

@ -9,10 +9,10 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCan
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;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateWithFormDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
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;
@ -20,6 +20,7 @@ import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLo
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.ProcessNodeDetailVO;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import cn.azxo.framework.common.model.CommonResponse;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.swagger.v3.oas.annotations.Operation;
@ -242,4 +243,15 @@ public interface ProcessInstanceApi {
@PostMapping("/api/process/instance/logs")
@InvokeMode(SYNC)
CommonResponse<BpmnProcessInstanceLogVO> getProcessInstanceLogs(@Validated @RequestBody BpmnProcessInstanceLogQueryDTO dto);
/**
* 根据任务id查询任务状态按钮详情
*
* @param taskButtonsSearchDTO 请求参数
* @return
*/
@Operation(summary = "根据任务id查询任务状态按钮详情")
@PostMapping("/api/process/instance/task/buttons/find")
@InvokeMode(SYNC)
CommonResponse<BpmnTaskButtonVo> findProcessSingleTaskButtons(@Validated @RequestBody BpmnTaskButtonSearchDTO taskButtonsSearchDTO);
}

View File

@ -3,25 +3,10 @@ package cn.axzo.workflow.client.feign.bpmn;
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.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.BpmnTaskTransferDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.*;
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 cn.axzo.workflow.common.model.response.bpmn.task.*;
import cn.azxo.framework.common.model.CommonResponse;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated;
@ -284,4 +269,5 @@ public interface ProcessTaskApi {
@InvokeMode(SYNC)
CommonResponse<Map<String, String>> findTaskIdByInstanceIdsAndPersonId(@RequestParam(required = false) @NotEmpty(message = "流程实例 ID列表 不能为空") List<String> processInstanceIds,
@RequestParam(required = false) @NotBlank(message = "自然人 ID 不能为空") String personId);
}

View File

@ -199,4 +199,9 @@ public interface BpmnConstants {
* ouId+workspaceId 下限制人员数量为20
*/
Integer MAX_ORG_WORKSPACE_ADMIN_COUNT = 20;
/**
* 发起人撤回时当前流程停留住的节点定义key
*/
String CANCEL_PROCESS_NODE_DEF_KEY_NAME = "[_CANCEL_PROCESS_NODE_DEF_KEY_]";
}

View File

@ -0,0 +1,29 @@
package cn.axzo.workflow.common.enums;
import lombok.Getter;
@Getter
public enum BpmnProcessTaskResultEnum {
PENDING("PENDING", "待处理"),
APPROVED("APPROVED", "已同意"),
REJECTED("REJECTED", "已驳回"),
DELETED("DELETED", "已删除"),
CANCELED("CANCELED", "已撤销"),
TRANSFERRED("TRANSFERRED", "已转交"),
NONE("NONE", "没有执行动作,例如 抄送"),
;
/**
* 结果
*/
private final String status;
/**
* 描述
*/
private final String desc;
BpmnProcessTaskResultEnum(String status, String desc) {
this.status = status;
this.desc = desc;
}
}

View File

@ -0,0 +1,26 @@
package cn.axzo.workflow.common.enums;
import lombok.Getter;
@Getter
public enum ButtonVisibleScopeEnum {
INITIATOR("INITIATOR", "发起人"),
EXECUTOR("EXECUTOR", "当前操作人"),
;
/**
* 结果
*/
private final String status;
/**
* 描述
*/
private final String desc;
ButtonVisibleScopeEnum(String status, String desc) {
this.status = status;
this.desc = desc;
}
}

View File

@ -15,6 +15,11 @@ import java.io.Serializable;
@Accessors(chain = true)
public class BpmnButtonMetaInfo implements Serializable {
public static final String BUTTON_TYPE_SYSTEM = "SYSTEM";
public static final String BUTTON_TYPE_CUSTOM = "CUSTOM";
private static final long serialVersionUID = -5224316166904752829L;
/**
* 按钮顺序
*/

View File

@ -0,0 +1,27 @@
package cn.axzo.workflow.common.model.request.bpmn.task;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@Data
@ApiModel("获取审批任务按钮,状态入参模型")
public class BpmnTaskButtonSearchDTO implements Serializable {
private static final long serialVersionUID = -3220083731019329293L;
@ApiModelProperty(value = "流程实例id", required = true)
@NotBlank(message = "流程实例id不能为空")
private String processInstanceId;
@ApiModelProperty(value = "审批任务id", required = true)
@NotBlank(message = "审批任务id不能为空")
private String taskId;
private Long initiatorPersonId;
private Long executorPersonId;
}

View File

@ -3,7 +3,12 @@ package cn.axzo.workflow.common.model.request.bpmn.task;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 扩展的历史任务表搜索入参模型
@ -13,6 +18,9 @@ import lombok.Data;
*/
@ApiModel("扩展的历史任务表搜索入参模型")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ExtHiTaskSearchDTO {
@ApiModelProperty("流程实例 ID")
@ -29,4 +37,7 @@ public class ExtHiTaskSearchDTO {
@ApiModelProperty("任务状态")
private BpmnProcessInstanceResultEnum status;
@ApiModelProperty("需要排除的id列表")
private List<Long> excludeIds;
}

View File

@ -0,0 +1,60 @@
package cn.axzo.workflow.common.model.response.bpmn.task;
import cn.axzo.workflow.common.enums.BpmnProcessTaskResultEnum;
import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonMetaInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.io.Serializable;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class BpmnTaskButtonVo implements Serializable {
private static final long serialVersionUID = -2701890396246979758L;
/**
* 执行人任务状态
*/
@ApiModelProperty(value = "执行人任务执行状态")
private BpmnProcessTaskResultEnum executorTaskResult;
/**
* 发起人执行状态
*/
@ApiModelProperty(value = "发起人任务执行状态")
private BpmnProcessTaskResultEnum initiatorTaskResult;
/**
* 当前任务执行人以及发起人全量按钮
*/
@ApiModelProperty(value = "当前任务相关以及发起人的全量按钮")
private List<BpmnButtonMetaInfoWithVisibleScope> buttons;
/**
* 需要隐藏的按钮
*/
@ApiModelProperty(value = "需要隐藏的自定义按钮")
private List<BpmnButtonMetaInfo> customHiddenButtons;
/**
* 全量的配置按钮
*/
@ApiModelProperty(value = "全量的配置按钮")
private List<BpmnButtonMetaInfo> allConfigButtons;
@Data
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
@NoArgsConstructor
public static final class BpmnButtonMetaInfoWithVisibleScope extends BpmnButtonMetaInfo {
private static final long serialVersionUID = 5758633314769798044L;
private List<ButtonVisibleScopeEnum> visibleScopes;
}
}

View File

@ -59,6 +59,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.validTask
*/
public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implements Serializable {
private static final long serialVersionUID = 2366844598166684546L;
private static final Logger log = LoggerFactory.getLogger(CustomApproveTaskWithFormCmd.class);
private final String taskId;
/**
@ -85,12 +86,12 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implemen
/**
* 指定节点类型
*/
private List<BpmnFlowNodeType> nodeTypes;
private final List<BpmnFlowNodeType> nodeTypes;
/**
* 表单数据
*/
private Map<String, Object> formVariables;
private final Map<String, Object> formVariables;
@Override
public String paramToJsonString() {
@ -183,12 +184,12 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implemen
if (CollectionUtils.isEmpty(logs) || logs.size() != 1) {
throw new WorkflowEngineException(FORM_FIELD_VALIDATOR_ERROR);
}
ExtAxProcessLog log = logs.get(0);
Map<String, FormPermissionMetaInfo> permissionMap = log.getFormFieldPermissionConf().stream()
ExtAxProcessLog axProcessLog = logs.get(0);
Map<String, FormPermissionMetaInfo> permissionMap = axProcessLog.getFormFieldPermissionConf().stream()
.collect(Collectors.toMap(FormPermissionMetaInfo::getFieldId, Function.identity(), (s, t) -> s));
formVariables.forEach((k, v) -> {
FormPermissionMetaInfo permission = permissionMap.getOrDefault(k, new FormPermissionMetaInfo());
if (permission.getRequired()) {
if (Boolean.TRUE.equals(permission.getRequired())) {
if (Objects.isNull(v)) {
throw new WorkflowEngineException(FORM_FIELD_VALIDATOR_ERROR);
}
@ -211,19 +212,21 @@ public class CustomApproveTaskWithFormCmd extends AbstractCommand<Void> implemen
.deploymentId(relation.getFormDeploymentId())
.singleResult();
Authentication.setAuthenticatedUserId(approver.buildAssigneeId());
formVariables.entrySet().forEach(e -> {
if (e.getValue() instanceof Collection) {
List<String> convertUploads = ((Collection<?>) e.getValue()).stream().map(i -> {
if (i instanceof String) {
return UploadFieldDTO.toObject(String.valueOf(i)).toSpecString();
} else {
ObjectMapper objectMapper = SpringContextUtils.getBean(ObjectMapper.class);
return objectMapper.convertValue(i, UploadFieldDTO.class).toSpecString();
}
}).collect(Collectors.toList());
e.setValue(StringUtils.collectionToCommaDelimitedString(convertUploads));
}
});
if (!CollectionUtils.isEmpty(formVariables)) {
formVariables.entrySet().forEach(e -> {
if (e.getValue() instanceof Collection) {
List<String> convertUploads = ((Collection<?>) e.getValue()).stream().map(i -> {
if (i instanceof String) {
return UploadFieldDTO.toObject(String.valueOf(i)).toSpecString();
} else {
ObjectMapper objectMapper = SpringContextUtils.getBean(ObjectMapper.class);
return objectMapper.convertValue(i, UploadFieldDTO.class).toSpecString();
}
}).collect(Collectors.toList());
e.setValue(StringUtils.collectionToCommaDelimitedString(convertUploads));
}
});
}
taskService.completeTaskWithForm(taskId, formDefinition.getId(), null, formVariables);
Authentication.setAuthenticatedUserId(null);
} else {

View File

@ -14,7 +14,9 @@ import org.flowable.engine.RuntimeService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.flowable.engine.impl.util.CommandContextUtil;
import org.flowable.task.api.Task;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.Serializable;
@ -23,22 +25,12 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANCEL_FAIL_NOT_EXISTS;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANCEL_FAIL_NOT_SELF;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_CANT_CANCEL;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_INSTANCE_NOT_EXISTS;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_DELETE_PROCESS_FLAG;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_END_TENANT_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_END_USER_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_END_USER_NAME;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_DELETE_REASON;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_TYPE_CANCEL;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.*;
import static cn.axzo.workflow.common.constant.BpmnConstants.*;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CANCEL;
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.batchAddAttachment;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.completeVirtualTask;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVirtualTask;
import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.*;
/**
* 自定义的撤回流程实例的命令实现
@ -47,6 +39,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.createVir
* @since 2024/1/2 18:19
*/
public class CustomCancelProcessInstanceCmd extends AbstractCommand<Void> implements Serializable {
private static final long serialVersionUID = 6556399267210245511L;
private final String processInstanceId;
private final String tenantId;
private final String reason;
@ -102,22 +95,31 @@ public class CustomCancelProcessInstanceCmd extends AbstractCommand<Void> implem
throw new WorkflowEngineException(PROCESS_INSTANCE_CANT_CANCEL);
}
List<Task> tasks = processEngineConfiguration.getTaskService()
.createTaskQuery()
.processInstanceId(processInstanceId)
.active()
.list();
String taskDefKey = "";
if (!CollectionUtils.isEmpty(tasks)) {
taskDefKey = tasks.get(0).getTaskDefinitionKey();
}
Map<String, Object> variables = new HashMap<>();
variables.put(INTERNAL_END_TENANT_ID, tenantId);
variables.put(INTERNAL_END_USER_ID, initiator.buildAssigneeId());
variables.put(INTERNAL_END_USER_NAME, initiator.getAssignerName());
variables.put(INTERNAL_DELETE_PROCESS_FLAG, INTERNAL_PROCESS_TYPE_CANCEL);
variables.put(INTERNAL_PROCESS_DELETE_REASON, reason);
variables.put(CANCEL_PROCESS_NODE_DEF_KEY_NAME, taskDefKey);
RuntimeService runtimeService = processEngineConfiguration.getRuntimeService();
runtimeService.setVariables(instance.getId(), variables);
CommandContextUtil.getAgenda(commandContext).planOperation(new DeleteProcessInstanceOperation(commandContext,
processInstanceId, extAxHiTaskInstService, CANCELLED));
processInstanceId, extAxHiTaskInstService, CANCELLED));
// 添加自定义的节点,用于展示最后的操作
TaskEntity task = createVirtualTask(commandContext, extAxHiTaskInstService, processInstanceId,
nodeName, NODE_CANCEL.getType(), reason, initiator, CANCELLED.getStatus(), new AddComment(CANCELLED.getDesc()));
nodeName, NODE_CANCEL.getType(), reason, initiator, CANCELLED.getStatus(), new AddComment(CANCELLED.getDesc()));
batchAddAttachment(commandContext, processInstanceId, task, attachmentList, initiator);

View File

@ -1,21 +1,15 @@
package cn.axzo.workflow.core.engine.event;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import java.util.List;
import static cn.axzo.workflow.common.code.OtherRespCode.MESSAGE_PUSH_EVENT_BUILD_ERROR;
import static cn.axzo.workflow.common.code.OtherRespCode.MES_PUSH_OBJECT_BUILD_ERROR;
import static cn.axzo.workflow.core.engine.event.MessagePushEventType.CARBON_COPY;
import static cn.axzo.workflow.core.engine.event.MessagePushEventType.CARBON_COPY_COMPLETE;
import static cn.axzo.workflow.core.engine.event.MessagePushEventType.NOTICE;
import static cn.axzo.workflow.core.engine.event.MessagePushEventType.PENDING_COMPLETE;
import static cn.axzo.workflow.core.engine.event.MessagePushEventType.PENDING_PUSH;
import static cn.axzo.workflow.core.engine.event.MessagePushEventType.PENDING_ROLLBACK;
import static cn.axzo.workflow.core.engine.event.MessagePushEventType.SMS;
import static cn.axzo.workflow.core.engine.event.MessagePushEventType.*;
/**
* 推送事件对象构造器
@ -36,7 +30,7 @@ public class MessagePushEventBuilder {
case PENDING_COMPLETE:
return createPendingCompleteEvent(assigners, noticeConf, processInstanceId, processDefinitionKey, tenantId, taskId);
case CARBON_COPY:
return createCarbonCopyEvent(assigners, noticeConf, processInstanceId, processDefinitionKey, tenantId);
return createCarbonCopyEvent(assigners, noticeConf, processInstanceId, processDefinitionKey, tenantId, taskId);
case CARBON_COPY_COMPLETE:
return createCarbonCopyCompleteEvent(assigners, noticeConf, processInstanceId, processDefinitionKey, tenantId);
case SMS:
@ -84,10 +78,10 @@ public class MessagePushEventBuilder {
public static MessagePushEventImpl createCarbonCopyEvent(List<BpmnTaskDelegateAssigner> assigners,
BpmnNoticeConf noticeConf, String processInstanceId,
String processDefinitionKey,
String tenantId) {
MessagePushEventImpl newEvent = new MessagePushEventImpl(CARBON_COPY, assigners, noticeConf,
processInstanceId, processDefinitionKey, tenantId, null);
return newEvent;
String tenantId,
String taskId) {
return new MessagePushEventImpl(CARBON_COPY, assigners, noticeConf,
processInstanceId, processDefinitionKey, tenantId, taskId);
}
public static MessagePushEventImpl createCarbonCopyCompleteEvent(List<BpmnTaskDelegateAssigner> assigners,

View File

@ -30,6 +30,8 @@ import java.util.List;
@ToString(callSuper = true)
public class ExtAxProcessLog extends BaseEntity<ExtAxProcessLog> {
private static final long serialVersionUID = 461756492937079852L;
/**
* 流程实例 ID
*/

View File

@ -2,6 +2,7 @@ package cn.axzo.workflow.core.repository.mapper;
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
@Mapper
@ -10,4 +11,7 @@ public interface ExtAxProcessLogMapper extends BaseMapperX<ExtAxProcessLog> {
@Update("UPDATE ext_ax_process_log SET is_delete = 0, start_time = NOW() WHERE process_instance_id = #{processInstanceId} and task_id = #{taskId}")
void restore(String processInstanceId, String taskId);
@Select("select * from ext_ax_process_log WHERE process_instance_id = #{processInstanceId} and task_id = #{taskId}")
ExtAxProcessLog findByProcessIdAndTaskIdWithDeleted(String processInstanceId, String taskId);
}

View File

@ -1,24 +1,11 @@
package cn.axzo.workflow.core.service;
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.BpmnProcessInstanceCancelDTO;
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;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateWithFormDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.HistoricProcessInstanceSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.*;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
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.HistoricProcessInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
import cn.axzo.workflow.common.model.response.bpmn.process.*;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance;
@ -165,4 +152,12 @@ public interface BpmnProcessInstanceService {
* @return
*/
BpmnProcessInstanceLogVO getProcessInstanceLog(BpmnProcessInstanceLogQueryDTO dto);
/**
* 根据流程实例id,任务id查询任务状态按钮配置
*
* @param taskButtonsSearchDTO 请求参数
* @return 任务按钮状态信息
*/
BpmnTaskButtonVo findTaskButtons(BpmnTaskButtonSearchDTO taskButtonsSearchDTO);
}

View File

@ -1,24 +1,9 @@
package cn.axzo.workflow.core.service;
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.BpmnTaskTransferDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.*;
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 cn.axzo.workflow.common.model.response.bpmn.task.*;
import org.flowable.form.api.FormInfo;
import java.util.List;
@ -151,4 +136,5 @@ public interface BpmnProcessTaskService {
String findTaskIdByInstanceIdAndPersonId(String processInstanceId, String personId);
Map<String, String> findTaskIdByInstanceIdsAndPersonId(List<String> processInstanceIds, String personId);
}

View File

@ -55,8 +55,11 @@ public interface ExtAxProcessLogService {
List<ExtAxProcessLog> genericQuery(ExtAxProcessLog query);
ExtAxProcessLog findByProcessIdAndTaskIdWithDeleted(String processId, String taskId);
/**
* 机器人节点会删除日志这里仅仅为了恢复日志都删除标识并更新时间
*
* @param processInstanceId
* @param taskId
*/

View File

@ -1,11 +1,14 @@
package cn.axzo.workflow.core.service.impl;
import cn.axzo.framework.domain.ServiceException;
import cn.axzo.workflow.common.constant.BpmnConstants;
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.enums.BpmnProcessTaskResultEnum;
import cn.axzo.workflow.common.enums.ButtonVisibleScopeEnum;
import cn.axzo.workflow.common.enums.WorkspaceType;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
@ -23,44 +26,30 @@ import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyP
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.HistoricProcessInstanceSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.model.request.bpmn.task.ExtHiTaskSearchDTO;
import cn.axzo.workflow.common.model.request.category.CategorySearchDTO;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationItemResultVO;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
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.HistoricProcessInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
import cn.axzo.workflow.common.model.response.bpmn.process.*;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceLogVO;
import cn.axzo.workflow.common.model.response.category.CategoryItemVO;
import cn.axzo.workflow.core.common.utils.BpmnCollectionUtils;
import cn.axzo.workflow.core.engine.cmd.CustomAbortProcessInstanceAsyncCmd;
import cn.axzo.workflow.core.engine.cmd.CustomAbortProcessInstanceCmd;
import cn.axzo.workflow.core.engine.cmd.CustomCancelProcessInstanceAsyncCmd;
import cn.axzo.workflow.core.engine.cmd.CustomCancelProcessInstanceCmd;
import cn.axzo.workflow.core.engine.cmd.CustomCarbonCopyUserSelectorCmd;
import cn.axzo.workflow.core.engine.cmd.CustomForecastUserTaskAssigneeCmd;
import cn.axzo.workflow.core.engine.cmd.*;
import cn.axzo.workflow.core.engine.listener.EngineExecutionStartListener;
import cn.axzo.workflow.core.repository.entity.ExtAxBpmnFormRelation;
import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst;
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
import cn.axzo.workflow.core.service.BpmnProcessDefinitionService;
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
import cn.axzo.workflow.core.service.CategoryService;
import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService;
import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
import cn.axzo.workflow.core.service.converter.BpmnHistoricProcessInstanceConverter;
import cn.axzo.workflow.core.service.converter.BpmnHistoricTaskInstanceConverter;
import cn.axzo.workflow.core.service.converter.BpmnProcessInstanceAdminPageItemConverter;
import cn.axzo.workflow.core.service.converter.BpmnProcessInstanceConverter;
import cn.axzo.workflow.core.service.converter.BpmnProcessInstancePageItemConverter;
import cn.axzo.workflow.core.service.*;
import cn.axzo.workflow.core.service.converter.*;
import cn.axzo.workflow.core.service.support.FlowNodeForecastService;
import cn.axzo.workflow.core.service.support.ProcessGraphicService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
@ -125,55 +114,17 @@ 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_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;
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_ID_NOT_EXISTS;
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.constant.BpmnConstants.AND_SIGN_EXPRESSION;
import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION;
import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_MODEL_CATEGORY;
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.CREATE_INSTANCE_PARAMS;
import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION_121;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_AGENT;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_PROCESS_WORKSPACE_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.OLD_INTERNAL_INITIATOR;
import static cn.axzo.workflow.common.constant.BpmnConstants.PENDING_TEMPLATE_VARIABLE;
import static cn.axzo.workflow.common.constant.BpmnConstants.PROCESS_OWNERSHIP_APPLICATION;
import static cn.axzo.workflow.common.constant.BpmnConstants.WORKFLOW_ENGINE_VERSION;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoPassed;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.autoRejection;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.human;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.AND;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.EXCEPTIONAL;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.GENERAL;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.OR;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_BUSINESS;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CARBON_COPY;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_COMMENT;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_ROBOT;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_TASK;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED;
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.BpmnProcessInstanceResultEnum.REJECTED;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.*;
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.*;
import static cn.axzo.workflow.common.constant.BpmnConstants.*;
import static cn.axzo.workflow.common.enums.ApprovalMethodEnum.*;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeMode.*;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.*;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.*;
import static cn.axzo.workflow.common.enums.WorkspaceType.GOVERNMENT;
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.getApprovalMethod;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType;
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.getNodeType;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.*;
@Service
@Slf4j
@ -879,7 +830,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
instance = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
if (Objects.isNull(instance)) {
if (checkAliveThrowException) {
if (Boolean.TRUE.equals(checkAliveThrowException)) {
throw new WorkflowEngineException(RUNNING_INSTANCE_ONLY_FORECAST);
} else {
return Collections.emptyList();
@ -1004,7 +955,7 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
@Override
public Boolean checkInstanceApprover(BpmnProcessInstanceCheckApproverDTO dto) {
if (dto.getOnlyPersonId()) {
if (Boolean.TRUE.equals(dto.getOnlyPersonId())) {
dto.getApprover().setOuId(null);
}
List<Task> list = taskService.createTaskQuery()
@ -1069,16 +1020,164 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
.build();
categoryService.get(BPM_MODEL_CATEGORY, historicProcessInstance.getProcessDefinitionKey()).ifPresent(category -> {
logVO.setWorkspaceType(WorkspaceType.getType(Integer.valueOf(category.getWorkspaceTypeCode())));
logVO.setCategory(category.getValue());
});
categoryService.get(BPM_MODEL_CATEGORY, historicProcessInstance.getProcessDefinitionKey())
.ifPresent(category -> {
logVO.setWorkspaceType(WorkspaceType.getType(Integer.valueOf(category.getWorkspaceTypeCode())));
logVO.setCategory(category.getValue());
});
// 根据传入的访问人计算有权限的按钮
calcAuthorizedButtons(logVO, dto.getVisitor());
return logVO;
}
@Override
public BpmnTaskButtonVo findTaskButtons(BpmnTaskButtonSearchDTO taskButtonsSearchDTO) {
BpmnTaskButtonVo bpmnTaskButtonVo = new BpmnTaskButtonVo();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(taskButtonsSearchDTO.getProcessInstanceId())
.includeProcessVariables()
.singleResult();
if (Objects.isNull(historicProcessInstance)) {
throw new WorkflowEngineException(PROCESS_INSTANCE_ID_NOT_EXISTS, taskButtonsSearchDTO.getProcessInstanceId());
}
BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId());
ExtAxHiTaskInst extAxHiTaskInst = extAxHiTaskInstService.getByTaskId(taskButtonsSearchDTO.getTaskId(), taskButtonsSearchDTO.getProcessInstanceId());
if (extAxHiTaskInst == null) {
log.warn("extAxHiTaskInst is null,request param:{}", JSON.toJSONString(taskButtonsSearchDTO));
throw new ServiceException("can find extAxHiTaskInst");
}
if (Objects.equals(extAxHiTaskInst.getStatus(), DELETED.getStatus())) {
ExtHiTaskSearchDTO extHiTaskSearchDTO = ExtHiTaskSearchDTO.builder()
.processInstanceId(taskButtonsSearchDTO.getProcessInstanceId())
.taskDefinitionKey(extAxHiTaskInst.getTaskDefinitionKey())
.assignee(extAxHiTaskInst.getAssignee())
.excludeIds(Collections.singletonList(extAxHiTaskInst.getId()))
.build();
List<ExtAxHiTaskInst> extAxHiTaskInsts = extAxHiTaskInstService.queryList(extHiTaskSearchDTO);
log.info("extAxHiTaskInst status is DELETED, find another task list in same assignee and task def key,result is:{}", JSON.toJSONString(extAxHiTaskInsts));
if (!CollectionUtils.isEmpty(extAxHiTaskInsts)) {
extAxHiTaskInst = extAxHiTaskInsts.get(0);
}
}
//判断节点类型
FlowElement flowElement = bpmnModel.getMainProcess().getFlowElement(extAxHiTaskInst.getTaskDefinitionKey());
BpmnFlowNodeType nodeType = getNodeType(flowElement).orElse(null);
//设置任务状态
bpmnTaskButtonVo.setExecutorTaskResult(getTaskStatus(nodeType, extAxHiTaskInst));
String buttonConfigName = null;
BpmnButtonConf buttonConf = getButtonConfig(bpmnModel.getMainProcess(), extAxHiTaskInst.getTaskDefinitionKey()).orElse(null);
BpmnProcessInstanceLogVO logVO = BpmnProcessInstanceLogVO.builder()
.id(historicProcessInstance.getId())
.defaultButtonConf(getButtonConfig(bpmnModel.getMainProcess()).orElse(new BpmnButtonConf()))
.calculatingButtonConf(buttonConf)
.build();
List<BpmnButtonMetaInfo> carbonCopyButtons = chooseButtons(logVO, CONFIG_BUTTON_TYPE_CARBON_COPY);
List<BpmnButtonMetaInfo> initiatorButtons;
List<BpmnButtonMetaInfo> executorButtons;
if (Objects.equals(historicProcessInstance.getBusinessStatus(), PROCESSING.getStatus())) {
//发起人按钮
initiatorButtons = chooseButtons(logVO, CONFIG_BUTTON_TYPE_INITIATOR);
if (Objects.equals(nodeType, BpmnFlowNodeType.NODE_CARBON_COPY)) {
buttonConfigName = CONFIG_BUTTON_TYPE_CARBON_COPY;
} else if (Objects.equals(nodeType, BpmnFlowNodeType.NODE_TASK) || //审批节点加业务节点指定审批人
(Objects.equals(nodeType, BpmnFlowNodeType.NODE_BUSINESS) && flowElement.getClass().isAssignableFrom(UserTask.class))) {
// 待审批的节点
if ((Objects.equals(PROCESSING.getStatus(), extAxHiTaskInst.getStatus()))) {
buttonConfigName = CONFIG_BUTTON_TYPE_CURRENT;
}
//已审批节点
if (!Objects.equals(PROCESSING.getStatus(), extAxHiTaskInst.getStatus())) {
buttonConfigName = CONFIG_BUTTON_TYPE_HISTORY;
}
} else if (Objects.equals(nodeType, BpmnFlowNodeType.NODE_STARTER)) {
buttonConfigName = CONFIG_BUTTON_TYPE_INITIATOR;
}
if (!StringUtils.hasText(buttonConfigName)) {
log.warn("can't find button config name ,req:{},extAxHiTaskInst:{}", JSON.toJSONString(taskButtonsSearchDTO), JSON.toJSONString(extAxHiTaskInst));
throw new ServiceException("can't find button config name");
}
executorButtons = chooseButtons(logVO, buttonConfigName);
} else {
//需要判断流程是否撤回,撤回需要设置发起人状态
if (Objects.equals(historicProcessInstance.getBusinessStatus(), CANCELLED.getStatus())) {
Object object = historicProcessInstance.getProcessVariables().get(CANCEL_PROCESS_NODE_DEF_KEY_NAME);
if (object instanceof String) {
String cancelNodeKey = (String) object;
if (StringUtils.hasText(cancelNodeKey) && cancelNodeKey.equals(extAxHiTaskInst.getTaskDefinitionKey())) {
bpmnTaskButtonVo.setInitiatorTaskResult(BpmnProcessTaskResultEnum.CANCELED);
}
}
}
initiatorButtons = new ArrayList<>(carbonCopyButtons);
executorButtons = new ArrayList<>(carbonCopyButtons);
}
bpmnTaskButtonVo.setCustomHiddenButtons(getHiddenCustomButtons(logVO, executorButtons));
//设置allConfigButtons
List<BpmnButtonMetaInfo> allConfigButtons = new ArrayList<>(executorButtons);
bpmnTaskButtonVo.setAllConfigButtons(allConfigButtons);
Map<BpmnButtonMetaInfo, Set<ButtonVisibleScopeEnum>> metaInfoListMap = new HashMap<>();
if (!CollectionUtils.isEmpty(executorButtons)) {
for (BpmnButtonMetaInfo metaInfo : filterValuableButtons(executorButtons)) {
metaInfoListMap.computeIfAbsent(metaInfo, k -> new HashSet<>()).add(ButtonVisibleScopeEnum.EXECUTOR);
}
}
if (!CollectionUtils.isEmpty(initiatorButtons)) {
for (BpmnButtonMetaInfo metaInfo : filterValuableButtons(initiatorButtons)) {
metaInfoListMap.computeIfAbsent(metaInfo, k -> new HashSet<>()).add(ButtonVisibleScopeEnum.INITIATOR);
}
}
List<BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope> scopeButtons = metaInfoListMap.entrySet().stream()
.map(m -> {
BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope scopeButton = BeanUtil.copyProperties(m.getKey(), BpmnTaskButtonVo.BpmnButtonMetaInfoWithVisibleScope.class);
scopeButton.setVisibleScopes(new ArrayList<>(m.getValue()));
return scopeButton;
})
.collect(Collectors.toList());
bpmnTaskButtonVo.setButtons(scopeButtons);
return bpmnTaskButtonVo;
}
private BpmnProcessTaskResultEnum getTaskStatus(BpmnFlowNodeType nodeType, ExtAxHiTaskInst axHiTaskInst) {
String logResultStatus = axHiTaskInst.getStatus();
if (!StringUtils.hasText(logResultStatus)) {
log.warn("log result status is blank!");
return null;
}
BpmnProcessTaskResultEnum taskResult = null;
BpmnProcessInstanceResultEnum instanceResultEnum = BpmnProcessInstanceResultEnum.valueOf(logResultStatus);
switch (instanceResultEnum) {
case CANCELLED:
taskResult = BpmnProcessTaskResultEnum.CANCELED;
break;
case APPROVED:
if (Objects.equals(nodeType, BpmnFlowNodeType.NODE_CARBON_COPY)) {
taskResult = BpmnProcessTaskResultEnum.NONE;
} else {
taskResult = BpmnProcessTaskResultEnum.APPROVED;
}
break;
case REJECTED:
taskResult = BpmnProcessTaskResultEnum.REJECTED;
break;
case TRANSFER:
taskResult = BpmnProcessTaskResultEnum.TRANSFERRED;
break;
case PROCESSING:
taskResult = BpmnProcessTaskResultEnum.PENDING;
break;
case DELETED:
taskResult = BpmnProcessTaskResultEnum.DELETED;
break;
default:
break;
}
return taskResult;
}
private void calcAuthorizedButtons(BpmnProcessInstanceLogVO logVO, BpmnTaskDelegateAssigner visitor) {
List<BpmnButtonMetaInfo> authorizedButtons = new ArrayList<>();
if (Objects.nonNull(logVO.getDefaultButtonConf())
@ -1148,15 +1247,22 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
logVO.setCurrentUserButtons(authorizedButtons);
// 有权限访问的自定义按钮
List<String> customButtonKeys = authorizedButtons.stream()
.filter(i -> Objects.equals(i.getType(), "CUSTOM"))
logVO.setCustomHiddenButtons(getHiddenCustomButtons(logVO, authorizedButtons));
}
private List<BpmnButtonMetaInfo> getHiddenCustomButtons(BpmnProcessInstanceLogVO logVO, List<BpmnButtonMetaInfo> bpmnButtonMetaInfos) {
// 有权限访问的自定义按钮
List<String> customButtonKeys = bpmnButtonMetaInfos.stream()
.filter(i -> Objects.equals(i.getType(), BpmnButtonMetaInfo.BUTTON_TYPE_CUSTOM))
.filter(i -> Boolean.FALSE.equals(i.getDisabled()) && Boolean.TRUE.equals(i.getChecked()))
.map(BpmnButtonMetaInfo::getBtnKey)
.distinct().collect(Collectors.toList());
List<BpmnButtonMetaInfo> customButtons = logVO.getDefaultButtonConf().getInitiator().stream()
.filter(i -> Objects.equals(i.getType(), "CUSTOM"))
.distinct()
.collect(Collectors.toList());
return logVO.getDefaultButtonConf().getInitiator()
.stream()
.filter(i -> Objects.equals(i.getType(), BpmnButtonMetaInfo.BUTTON_TYPE_CUSTOM))
.filter(i -> !customButtonKeys.contains(i.getBtnKey()))
.collect(Collectors.toList());
logVO.setCustomHiddenButtons(customButtons);
}
/**
@ -1197,6 +1303,23 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
return mergeButtons;
}
/**
* 过滤Disabled=false && Checked=true
*
* @param bpmnButtonMetaInfos 按钮列表
* @return 有效的按钮列表
*/
private List<BpmnButtonMetaInfo> filterValuableButtons(List<BpmnButtonMetaInfo> bpmnButtonMetaInfos) {
if (CollectionUtils.isEmpty(bpmnButtonMetaInfos)) {
return Collections.emptyList();
}
return bpmnButtonMetaInfos.stream()
.filter(i -> !i.getDisabled())
.filter(BpmnButtonMetaInfo::getChecked)
.distinct()
.collect(Collectors.toList());
}
public static String getLe130Assignee(BpmnTaskDelegateAssigner visitor) {
return visitor.getTenantId() + "|" + visitor.getAssignee() + "|" + visitor.getAssigneeType();
}
@ -1360,7 +1483,6 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic
.build());
}
});
}
public List<AttachmentDTO> getAttachmentByType(Map<String, List<Attachment>> attachmentByTaskMap, String taskId, AttachmentTypeEnum type) {

View File

@ -5,60 +5,29 @@ import cn.axzo.workflow.common.enums.BpmnCountersignTypeEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.request.BpmnApproveConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
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.BpmnTaskDelegateAssigner;
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.BpmnTaskTransferDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.ExtHiTaskSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.*;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationItemResultVO;
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 cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
import cn.axzo.workflow.common.model.response.bpmn.task.*;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import cn.axzo.workflow.core.engine.cmd.CustomApproveTaskAsyncCmd;
import cn.axzo.workflow.core.engine.cmd.CustomApproveTaskCmd;
import cn.axzo.workflow.core.engine.cmd.CustomApproveTaskWithFormAsyncCmd;
import cn.axzo.workflow.core.engine.cmd.CustomApproveTaskWithFormCmd;
import cn.axzo.workflow.core.engine.cmd.CustomBackTaskAsyncCmd;
import cn.axzo.workflow.core.engine.cmd.CustomBackTaskCmd;
import cn.axzo.workflow.core.engine.cmd.CustomCommentTaskCmd;
import cn.axzo.workflow.core.engine.cmd.CustomCompleteDummyTaskCmd;
import cn.axzo.workflow.core.engine.cmd.CustomCountersignUserTaskAsyncCmd;
import cn.axzo.workflow.core.engine.cmd.CustomCountersignUserTaskCmd;
import cn.axzo.workflow.core.engine.cmd.CustomCreateDummyTaskCmd;
import cn.axzo.workflow.core.engine.cmd.CustomRejectionTaskAsyncCmd;
import cn.axzo.workflow.core.engine.cmd.CustomRejectionTaskCmd;
import cn.axzo.workflow.core.engine.cmd.CustomTransferUserTaskAsyncCmd;
import cn.axzo.workflow.core.engine.cmd.CustomTransferUserTaskCmd;
import cn.axzo.workflow.core.engine.cmd.*;
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.repository.entity.ExtAxProcessLog;
import cn.axzo.workflow.core.service.BpmnProcessDefinitionService;
import cn.axzo.workflow.core.service.BpmnProcessTaskService;
import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService;
import cn.axzo.workflow.core.service.ExtAxHiTaskInstService;
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
import cn.axzo.workflow.core.service.converter.BpmnHistoricAttachmentConverter;
import cn.axzo.workflow.core.service.converter.BpmnHistoricTaskInstanceConverter;
import cn.axzo.workflow.core.service.converter.BpmnTaskConverter;
import cn.axzo.workflow.core.service.converter.BpmnTaskDonePageItemConverter;
import cn.axzo.workflow.core.service.converter.BpmnTaskTodoPageItemConverter;
import cn.axzo.workflow.core.service.converter.*;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
@ -69,11 +38,7 @@ import org.flowable.bpmn.model.FlowElement;
import org.flowable.common.engine.api.delegate.event.FlowableEventDispatcher;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.common.engine.impl.interceptor.CommandExecutor;
import org.flowable.engine.HistoryService;
import org.flowable.engine.ManagementService;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.*;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.flowable.engine.impl.cfg.ProcessEngineConfigurationImpl;
@ -82,9 +47,7 @@ import org.flowable.engine.impl.util.ProcessDefinitionUtil;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.task.Attachment;
import org.flowable.engine.task.Comment;
import org.flowable.form.api.FormDefinition;
import org.flowable.form.api.FormInfo;
import org.flowable.form.api.FormRepositoryService;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskInfo;
@ -102,52 +65,22 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
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.PROCESS_TASK_NOT_EXISTS;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.BACK_NODE_CANNOT_REACHABLE;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.FIND_TASK_BY_PERSON_ID_ERROR;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.REACHED_BACKED_MAXIMUM_NUM;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_REMIND_ERROR_NOT_EXISTS;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_ADVICE;
import static cn.axzo.workflow.common.constant.BpmnConstants.COMMENT_TYPE_COMMENT_EXT;
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;
import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO;
import static cn.axzo.workflow.common.constant.BpmnConstants.MAX_BACKED_OPERATE_COUNT;
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.common.constant.BpmnConstants.WORKFLOW_ENGINE_VERSION;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_BUSINESS;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_CARBON_COPY;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_EMPTY;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_TASK;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROVED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.BACKED;
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.BpmnProcessInstanceResultEnum.REJECTED;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.valueOfStatus;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.*;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.*;
import static cn.axzo.workflow.common.constant.BpmnConstants.*;
import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.*;
import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.*;
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.BpmnCollectionUtils.convertSet;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getButtonConfig;
import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessApproveConf;
@Service
@Slf4j
@ -186,6 +119,8 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
private BpmnProcessDefinitionService bpmnProcessModelService;
@Resource
private ExtAxProcessLogService extAxProcessLogService;
@Resource
private ExtAxProcessLogService processLogService;
@Override
public BpmPageResult<BpmnTaskTodoPageItemVO> getTodoTaskPage(BpmnTaskPageSearchDTO dto) {
@ -350,7 +285,7 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
public void approveTaskWithForm(BpmnTaskAuditWithFormDTO dto) {
// 表单级别暂时只允许同步
CommandExecutor commandExecutor = processEngineConfiguration.getCommandExecutor();
if(Boolean.TRUE.equals(dto.getAsync())) {
if (Boolean.TRUE.equals(dto.getAsync())) {
commandExecutor.execute(new CustomApproveTaskWithFormAsyncCmd(dto));
} else {
commandExecutor.execute(new CustomApproveTaskWithFormCmd(dto));
@ -802,21 +737,19 @@ public class BpmnProcessTaskServiceImpl implements BpmnProcessTaskService {
INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + dto.getTaskDefinitionKey());
// 过滤出未审批的任何,用选择的方式去发送消息
dto.getRemindTypes().forEach(type -> {
list.forEach(task -> {
assigners.stream().filter(i -> Objects.equals(task.getAssignee(), i.buildAssigneeId())).findAny().ifPresent(assigner -> {
MessagePushEventImpl event = MessagePushEventBuilder.createEvent(MessagePushEventType.valueOf(type),
Lists.newArrayList(assigner), noticeConfig.orElse(null),
processInstance.getProcessInstanceId(),
processInstance.getProcessDefinitionKey(),
processInstance.getTenantId(), task.getId());
event.setProcessInstanceId(processInstance.getProcessInstanceId());
event.setTenantId(processInstance.getTenantId());
event.setTaskId(task.getId());
eventDispatcher.dispatchEvent(event, processEngineConfiguration.getEngineCfgKey());
});
dto.getRemindTypes().forEach(type -> list.forEach(task -> {
assigners.stream().filter(i -> Objects.equals(task.getAssignee(), i.buildAssigneeId())).findAny().ifPresent(assigner -> {
MessagePushEventImpl event = MessagePushEventBuilder.createEvent(MessagePushEventType.valueOf(type),
Lists.newArrayList(assigner), noticeConfig.orElse(null),
processInstance.getProcessInstanceId(),
processInstance.getProcessDefinitionKey(),
processInstance.getTenantId(), task.getId());
event.setProcessInstanceId(processInstance.getProcessInstanceId());
event.setTenantId(processInstance.getTenantId());
event.setTaskId(task.getId());
eventDispatcher.dispatchEvent(event, processEngineConfiguration.getEngineCfgKey());
});
});
}));
}
@Override

View File

@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
@ -47,7 +48,8 @@ public class ExtAxHiTaskInstServiceImpl implements ExtAxHiTaskInstService {
.eq(StringUtils.hasLength(dto.getTaskId()), "task_id", dto.getTaskId())
.eq(Objects.nonNull(dto.getStatus()), "status", Objects.isNull(dto.getStatus()) ? "" :
dto.getStatus().getStatus())
.eq(StringUtils.hasLength(dto.getAssignee()), "assignee", dto.getAssignee());
.eq(StringUtils.hasLength(dto.getAssignee()), "assignee", dto.getAssignee())
.notIn(!CollectionUtils.isEmpty(dto.getExcludeIds()), "id", dto.getExcludeIds());
return extAxHiTaskInstMapper.selectList(queryWrapper);
}

View File

@ -16,10 +16,7 @@ import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import static cn.axzo.workflow.common.constant.BpmnConstants.DUMMY_ASSIGNEE_ID;
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.ROBOT_ASSIGNEE_ID;
import static cn.axzo.workflow.common.constant.BpmnConstants.*;
/**
* Api Log 表操服务实现
@ -80,6 +77,11 @@ public class ExtAxProcessLogServiceImpl implements ExtAxProcessLogService {
return extAxProcessLogMapper.selectList(buildQueryWrapper(query));
}
@Override
public ExtAxProcessLog findByProcessIdAndTaskIdWithDeleted(String processId, String taskId) {
return extAxProcessLogMapper.findByProcessIdAndTaskIdWithDeleted(processId,taskId);
}
@Override
public void restore(String processInstanceId, String taskId) {
batchRestore(Lists.newArrayList(new SimpleTaskDTO(processInstanceId, taskId)));

View File

@ -37,6 +37,7 @@ import java.util.Map;
*/
public class CreateAttachmentCmd extends AbstractCommand<Attachment> implements Serializable {
private static final long serialVersionUID = -2901013696126749407L;
protected String attachmentType;
protected String taskId;
protected String processInstanceId;

View File

@ -19,13 +19,11 @@ 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.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@ -70,7 +68,7 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne
protected List<BpmnTaskDelegateAssigner> invokeService(FlowElement flowElement, DelegateExecution execution,
ApproverScopeDTO scopeDto) {
if(Boolean.TRUE.equals(supportRefreshProperties.getUseNewToAdminApi())) {
if (Boolean.TRUE.equals(supportRefreshProperties.getUseNewToAdminApi())) {
return invokeNewQuery(flowElement, execution, scopeDto);
} else {
return invokeOldQuery(flowElement, execution, scopeDto);
@ -90,7 +88,10 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne
.map(w -> BeanUtil.copyProperties(w, ListFlowTaskAssignerReq.OrgScope.class))
.collect(Collectors.toList()));
}
ListFlowTaskAssignerReq req = builder.workspaceAdmin(false).build();
ListFlowTaskAssignerReq req = builder
.procInstId(execution.getProcessInstanceId())
.workspaceAdmin(false)
.build();
BpmnMetaParserHelper.getApproverScope((UserTask) flowElement)
.ifPresent(i -> {
if (Objects.equals(i, ApproverScopeEnum.projectWorkspace)) {
@ -133,13 +134,14 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne
}
ListFlowTaskAssignerReq req = builder.workspaceAdmin(false).build();
req.setProcInstId(execution.getProcessInstanceId());
if(Objects.equals(ApproverScopeEnum.entWorkspace, approverScope.get()) && Objects.equals(ApproverSpecifyEnum.fixedPerson,optSpecify.get())) {
req.setCooperateTypes(Sets.newHashSet(1,2,3,4,5,6,7,8,9,11,30));
if (approverScope.isPresent() && Objects.equals(ApproverScopeEnum.entWorkspace, approverScope.get()) &&
optSpecify.isPresent() && Objects.equals(ApproverSpecifyEnum.fixedPerson, optSpecify.get())) {
req.setCooperateTypes(Sets.newHashSet(1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 30));
} else {
req.setCooperateTypes(getCooperationTypes(flowElement));
}
// 发起人主管找其超管时需要将发起人的数据包装进 orgScope
if (Objects.equals(ApproverSpecifyEnum.initiatorLeader, optSpecify.get())) {
if (optSpecify.isPresent() && Objects.equals(ApproverSpecifyEnum.initiatorLeader, optSpecify.get())) {
BpmnTaskDelegateAssigner initiator = BpmnTaskDelegateAssigner.toObjectCompatible(execution.getVariable(INTERNAL_INITIATOR, String.class));
Integer workspaceType = execution.getVariable(INTERNAL_PROCESS_WORKSPACE_TYPE, Integer.class);
req.setOrgScopes(Lists.newArrayList(new ListFlowTaskAssignerReq.OrgScope(workspaceType, Long.parseLong(initiator.getTenantId()), Long.parseLong(initiator.getOuId()), null)));

View File

@ -251,7 +251,8 @@ public class RocketMqMessagePushEventListener extends AbstractBpmnEventListener<
JSONUtil.toJsonStr(event.getAssigners()), event.getProcessInstanceId());
if (Objects.nonNull(event.getNoticeConfig().getCarbonCopy())) {
//按人员拆分为多个批次发送消息
getMessagePushDtoSlice(event, event.getNoticeConfig().getCarbonCopy().getCarbonCopyMessageId(), PROCESS_CARBON_COPY).forEach(dto -> sendMessageQueue(dto, PROCESS_CARBON_COPY));
getMessagePushDtoSlice(event, event.getNoticeConfig().getCarbonCopy().getCarbonCopyMessageId(), PROCESS_CARBON_COPY)
.forEach(dto -> sendMessageQueue(dto, PROCESS_CARBON_COPY));
}
log.info("RocketMqMessagePushEventListener#onCarbonCopy...end, cc' templateId: {}, receivePerson: {}, processInstanceId: {}",
event.getNoticeConfig().getCarbonCopy().getCarbonCopyMessageId(),

View File

@ -4,28 +4,13 @@ import cn.axzo.oss.http.api.ServerFileServiceApi;
import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest;
import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse;
import cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi;
import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
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.BpmnProcessInstanceCancelDTO;
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;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceCreateWithFormDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceLogQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceMyPageReqVO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.HistoricProcessInstanceSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.*;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskButtonSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
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.HistoricProcessInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
import cn.axzo.workflow.common.model.response.bpmn.process.*;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceLogVO;
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
import cn.axzo.workflow.server.common.annotation.ErrorReporter;
@ -43,20 +28,12 @@ import org.flowable.engine.history.HistoricProcessInstance;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Nullable;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -282,7 +259,7 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
public CommonResponse<Map<String, Object>> getProcessVariables(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
@Nullable String tenantId) {
HistoricProcessInstance processInstance = bpmnProcessInstanceService.getProcessInstance(processInstanceId,
tenantId, true);
tenantId, true);
return success(processInstance.getProcessVariables());
}
@ -339,6 +316,20 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
return success(log);
}
/**
* 根据任务id查询任务状态按钮详情
*
* @param taskButtonsSearchDTO 请求参数
* @return
*/
@Override
@Operation(summary = "根据流程实例id,任务id查询任务状态按钮详情")
@PostMapping("/task/buttons/find")
public CommonResponse<BpmnTaskButtonVo> findProcessSingleTaskButtons(@Validated @RequestBody BpmnTaskButtonSearchDTO taskButtonsSearchDTO) {
return success(bpmnProcessInstanceService.findTaskButtons(taskButtonsSearchDTO));
}
private void resetPersonInfo(BpmnProcessInstanceLogVO log) {
List<BpmnTaskDelegateAssigner> users = log.getTaskDetails().stream().map(BpmnTaskInstanceLogVO::getAssigneeSnapshot).filter(Objects::nonNull).filter(e -> NumberUtils.isNumber(e.getPersonId())).collect(Collectors.toList());
users.add(log.getInitiator());
@ -350,17 +341,17 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
private void parseSignatureUrl(BpmnProcessInstanceLogVO log) {
List<String> signUrls = log.getTaskDetails().stream()
.filter(i -> StringUtils.hasText(i.getTaskId()))
.map(BpmnTaskInstanceLogVO::getSignatureUrl)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
.filter(i -> StringUtils.hasText(i.getTaskId()))
.map(BpmnTaskInstanceLogVO::getSignatureUrl)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
if (!CollectionUtils.isEmpty(signUrls)) {
Map<String, String> ossUrlMap = ListUtils.emptyIfNull(getSignPrivateUrl(signUrls)).stream()
.collect(Collectors.toMap(ApiSignUrlDownloadResponse::getFileKey, ApiSignUrlDownloadResponse::getSignUrl, (s, t) -> s));
.collect(Collectors.toMap(ApiSignUrlDownloadResponse::getFileKey, ApiSignUrlDownloadResponse::getSignUrl, (s, t) -> s));
log.getTaskDetails().stream()
.filter(i -> StringUtils.hasText(i.getTaskId()))
.forEach(i -> i.setSignatureUrl(ossUrlMap.getOrDefault(i.getSignatureUrl(), null)));
.filter(i -> StringUtils.hasText(i.getTaskId()))
.forEach(i -> i.setSignatureUrl(ossUrlMap.getOrDefault(i.getSignatureUrl(), null)));
}
}

View File

@ -2,27 +2,10 @@ package cn.axzo.workflow.server.controller.web.bpmn;
import cn.axzo.workflow.client.feign.bpmn.ProcessTaskApi;
import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
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.BpmnTaskDelegateAssigner;
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.BpmnTaskTransferDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.*;
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 cn.axzo.workflow.common.model.response.bpmn.task.*;
import cn.axzo.workflow.core.service.BpmnProcessTaskService;
import cn.axzo.workflow.server.common.annotation.ErrorReporter;
import cn.axzo.workflow.server.common.annotation.RepeatSubmit;
@ -35,12 +18,7 @@ import org.apache.commons.collections4.ListUtils;
import org.flowable.form.api.FormInfo;
import org.springframework.util.StringUtils;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Nullable;
import javax.annotation.Resource;
@ -148,6 +126,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
/**
* 获取当前节点可回退节点选项列表
*
* @param taskId 当前任务id
* @return 可选回退节点列表
*/
@ -404,4 +383,5 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@RequestParam @NotBlank(message = "自然人 ID 不能为空") String personId) {
return success(bpmnProcessTaskService.findTaskIdByInstanceIdsAndPersonId(processInstanceIds, personId));
}
}

View File

@ -171,7 +171,7 @@ public class CoreServiceCodeGeneration {
"该类是根据 API 动态生成,不同版本可能会开放新的接口,或回收一些旧接口\r\n<p>\r\n" +
"Auto generation by workflow engine, It cannot be manually modified");
classOrInterfaceDeclaration.addAndGetAnnotation("org.springframework.cloud.openfeign.FeignClient")
.addPair("name", new StringLiteralExpr("workflow-engine-starter-core"))
.addPair("name", new StringLiteralExpr("workflow-engine"))
.addPair("url", new StringLiteralExpr("${axzo.service.workflow-engine:http://workflow-engine:8080}"))
.addPair("configuration", new ClassExpr(new ClassOrInterfaceType("WorkflowEngineStarterFeignConfiguration")));
cu.addImport("cn.axzo.workflow.starter.feign.ext.WorkflowEngineStarterFeignConfiguration", false, false);

View File

@ -162,7 +162,7 @@ public class ManageServiceCodeGeneration {
"该类是根据 API 动态生成,不同版本可能会开放新的接口,或回收一些旧接口\r\n<p>\r\n" +
"Auto generation by workflow engine, It cannot be manually modified");
classOrInterfaceDeclaration.addAndGetAnnotation("org.springframework.cloud.openfeign.FeignClient")
.addPair("name", new StringLiteralExpr("workflow-engine-starter-manage"))
.addPair("name", new StringLiteralExpr("workflow-engine"))
.addPair("url", new StringLiteralExpr("${axzo.service.workflow-engine:http://workflow-engine:8080}"))
.addPair("configuration", new ClassExpr(new ClassOrInterfaceType("WorkflowEngineStarterFeignConfiguration")));
cu.addImport("cn.axzo.workflow.starter.feign.ext.WorkflowEngineStarterFeignConfiguration", false, false);