feat(REQ-3004) - 测试表单引擎

This commit is contained in:
wangli 2024-11-07 17:41:26 +08:00
parent 99b773b49f
commit d11c420f39
19 changed files with 1258 additions and 1157 deletions

View File

@ -113,7 +113,7 @@ public interface ProcessDefinitionApi {
@GetMapping("/api/process/definition/active/json/model")
@InvokeMode(SYNC)
CommonResponse<BpmnModelUpdateDTO> getActiveProcessDefinitionJsonModel(@NotBlank(message = "模型 ID 不能为空") @RequestParam(required = false) String modelId,
@NotBlank(message = "分类不能为空") @RequestParam(required = false) String category,
@NotBlank(message = "分类不能为空") @RequestParam(required = false) String key,
@RequestParam(required = false) String tenantId);
/**

View File

@ -6,6 +6,7 @@ import cn.axzo.workflow.common.enums.ApproverScopeEnum;
import cn.axzo.workflow.common.enums.ApproverSpecifyEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
import cn.axzo.workflow.common.model.request.form.FormFieldPermissionConf;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -140,5 +141,6 @@ public class BpmnJsonNodeProperty {
* 表单字段权限配置
*/
@ApiModelProperty(value = "表单字段权限控制")
private FormFieldPermissionConf formFieldPermissionConf;
private FormFieldPermissionConf fieldPermission;
}

View File

@ -20,7 +20,7 @@ public class BpmnModelSearchDTO extends BpmPageParam {
* 标识
*/
@ApiModelProperty(value = "流程模型标识", example = "process1641042089407", notes = "精准匹配")
private String key;
private List<String> keys;
/**
* 名称

View File

@ -7,7 +7,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Map;
import java.util.List;
/**
* 表单字段权限配置
@ -27,34 +27,34 @@ import java.util.Map;
public class FormFieldPermissionConf implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 发起人的表单字段权限
*/
@ApiModelProperty(value = "发起人的表单字段权限")
private Map<String, Integer> initiator;
private List<FormPermissionMetaInfo> initiator;
/**
* 审批人的表单字段权限
*/
@ApiModelProperty(value = "审批人的表单字段权限")
private Map<String, Integer> current;
private List<FormPermissionMetaInfo> current;
/**
* 历史审批人的表单字段权限
*/
@ApiModelProperty(value = "历史审批人的表单字段权限")
private Map<String, Integer> history;
private List<FormPermissionMetaInfo> history;
/**
* 抄送人的表单字段权限
*/
@ApiModelProperty(value = "抄送人的表单字段权限")
private Map<String, Integer> carbonCopy;
private List<FormPermissionMetaInfo> carbonCopy;
/**
* 管理员的字段权限
*/
@ApiModelProperty(value = "管理员的字段权限")
private Map<String, Integer> admin;
private List<FormPermissionMetaInfo> admin;
}

View File

@ -3,7 +3,9 @@ package cn.axzo.workflow.common.model.request.form;
import cn.axzo.workflow.common.model.request.form.definition.FormFieldsDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import javax.validation.Valid;
@ -19,6 +21,8 @@ import java.util.List;
@ApiModel("新版本的表单定义模型 JSON 结构")
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class FormJsonModel implements Serializable {
private static final long serialVersionUID = 1L;

View File

@ -0,0 +1,43 @@
package cn.axzo.workflow.common.model.request.form;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 表单字段权限信息
*
* @author wangli
* @since 2024-11-07 11:09
*/
@Data
@Accessors(chain = true)
public class FormPermissionMetaInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 字段标识
*/
private String fieldKey;
/**
* 只读
*/
private Boolean readOnly = true;
/**
* 可编辑必填
*/
private Boolean editRequired = false;
/**
* 可编辑非必填
*/
private Boolean editable = false;
/**
* 隐藏
*/
private Boolean hidden = false;
}

View File

@ -10,6 +10,7 @@ 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.model.BpmnModelCreateDTO;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.request.form.FormFieldPermissionConf;
import cn.axzo.workflow.core.converter.json.AbstractBpmnJsonConverter;
import cn.axzo.workflow.core.converter.json.BoundaryEventJsonConverter;
import cn.axzo.workflow.core.converter.json.EndEventJsonConverter;
@ -67,6 +68,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.UUID;
import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVE_SUPPORT_BATCH_OPERATION;
@ -761,7 +763,10 @@ public final class BpmnJsonConverterUtil {
getNoticeConfig(bpmnModel.getMainProcess());
BpmnJsonModel bpmnJsonModel = convertToJson(bpmnModel);
// FlowElement flowElement = bpmnModel.getFlowElement("node_350687681316");
FlowElement flowElement = bpmnModel.getFlowElement("node_429076682717");
Optional<FormFieldPermissionConf> formFieldPermissionConf =
BpmnMetaParserHelper.getFormFieldPermissionConf(flowElement);
// ServiceTask serviceTask = (ServiceTask) bpmnModel.getFlowElement("node_946990365785");
// Optional<List<BpmnCarbonCopyConf>> carbonCopyConfigs = BpmnMetaParserHelper.getCarbonCopyConfigs
// (serviceTask);

View File

@ -20,6 +20,8 @@ import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeProperty;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeReceiver;
import cn.axzo.workflow.common.model.request.bpmn.BpmnPendingProperty;
import cn.axzo.workflow.common.model.request.bpmn.BpmnSmsProperty;
import cn.axzo.workflow.common.model.request.form.FormFieldPermissionConf;
import cn.axzo.workflow.common.model.request.form.FormPermissionMetaInfo;
import com.alibaba.fastjson.JSON;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.ExtensionElement;
@ -61,6 +63,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_CARBON_COPY_
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_NODE_TYPE;
import static cn.axzo.workflow.common.constant.BpmnConstants.CONFIG_NOTICE;
import static cn.axzo.workflow.common.constant.BpmnConstants.ELEMENT_ATTRIBUTE_CHECKED;
@ -422,4 +425,9 @@ public final class BpmnMetaParserHelper {
}
return Optional.empty();
}
public static Optional<FormFieldPermissionConf> getFormFieldPermissionConf(FlowElement flowElement) {
return defaultValid(flowElement, CONFIG_FIELD_PERMISSION).map(element-> JSON.parseObject(element.getElementText(), FormFieldPermissionConf.class));
}
}

View File

@ -1,5 +1,6 @@
package cn.axzo.workflow.core.converter.json;
import cn.axzo.framework.jackson.utility.JSON;
import cn.axzo.workflow.common.enums.ApprovalMethodEnum;
import cn.axzo.workflow.common.enums.BpmnFlowNodeMode;
import cn.axzo.workflow.common.enums.BpmnFlowNodeType;
@ -71,8 +72,8 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
//以下是保存配置信息, 引擎完全不会 care 这里的信息
// "设置审批人"
setApprovalExtensionElement(node, userTask);
// "权限设置"
setFieldExtensionElement(node, userTask);
// "表单权限设置"
setFormFieldExtensionElement(node, userTask);
// "高级设置",包含按钮配置,自动过审配置
setAdvancedExtensionElement(node, userTask);
// "待办消息模板配置"
@ -157,13 +158,14 @@ public class UserTaskJsonConverter extends AbstractBpmnJsonConverter<UserTask> {
userTask.addExtensionElement(autoApprovalExtensionElement);
}
private static void setFieldExtensionElement(BpmnJsonNode node, UserTask userTask) {
private static void setFormFieldExtensionElement(BpmnJsonNode node, UserTask userTask) {
if (Objects.isNull(node.getProperty())) {
return;
}
ExtensionElement fieldElement = new ExtensionElement();
fieldElement.setName(CONFIG_FIELD_PERMISSION);
fieldElement.setElementText(node.getProperty().getFieldPermission());
fieldElement.setElementText(Objects.nonNull(node.getProperty().getFieldPermission()) ?
JSON.toJSONString(node.getProperty().getFieldPermission()) : null);
userTask.addExtensionElement(fieldElement);
}

View File

@ -78,7 +78,7 @@ public interface BpmnProcessDefinitionService {
* 获取指定模型激活的定义 ID
* @return 流程定义ID
*/
String getActiveProcessDefinitionId(String tenantId, String category);
String getActiveProcessDefinitionId(String tenantId, String key);
void updateProcessDefinition(BpmnProcessDefinitionUpdateDTO dto);

View File

@ -12,6 +12,7 @@ import org.flowable.engine.RepositoryService;
import org.flowable.engine.repository.Model;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Nullable;
import javax.annotation.Resource;
@ -40,16 +41,18 @@ public class AggregateModelServiceImpl implements AggregateModelService {
public String createBpmnAndFormModel(BpmnModelCreateDTO dto) {
String bpmModelId = bpmnProcessModelService.createBpmModel(dto);
Model formModel = repositoryService.createModelQuery().modelKey(dto.getKey()).modelCategory(FORM_FILE_SUFFIX).singleResult();
FormModelUpdateDTO formModelDto = new FormModelUpdateDTO();
formModelDto.setKey(dto.getKey());
formModelDto.setName(dto.getName());
formModelDto.setFormFields(dto.getFormJsonModel().getFormFields());
if (Objects.isNull(formModel)) {
formModelService.createFormModel(formModelDto);
} else {
formModelDto.setFormModelId(formModel.getId());
formModelService.updateFormModel(formModelDto);
if (!CollectionUtils.isEmpty(dto.getFormJsonModel().getFormFields())) {
Model formModel = repositoryService.createModelQuery().modelKey(dto.getKey()).modelCategory(FORM_FILE_SUFFIX).singleResult();
FormModelUpdateDTO formModelDto = new FormModelUpdateDTO();
formModelDto.setKey(dto.getKey());
formModelDto.setName(dto.getName());
formModelDto.setFormFields(dto.getFormJsonModel().getFormFields());
if (Objects.isNull(formModel)) {
formModelService.createFormModel(formModelDto);
} else {
formModelDto.setFormModelId(formModel.getId());
formModelService.updateFormModel(formModelDto);
}
}
return bpmModelId;
}
@ -59,11 +62,14 @@ public class AggregateModelServiceImpl implements AggregateModelService {
public String updateBpmnAndFormModel(BpmnModelUpdateDTO dto) {
bpmnProcessModelService.updateBpmModel(dto);
FormModelUpdateDTO formModel = new FormModelUpdateDTO();
formModel.setKey(dto.getKey());
formModel.setName(dto.getName());
formModel.setFormFields(dto.getFormJsonModel().getFormFields());
formModelService.updateFormModel(formModel);
// 如果没有表单字段就操作表单模型
if (!CollectionUtils.isEmpty(dto.getFormJsonModel().getFormFields())) {
FormModelUpdateDTO formModel = new FormModelUpdateDTO();
formModel.setKey(dto.getKey());
formModel.setName(dto.getName());
formModel.setFormFields(dto.getFormJsonModel().getFormFields());
formModelService.updateFormModel(formModel);
}
return dto.getProcessModelId();
}

View File

@ -234,16 +234,16 @@ public class BpmnProcessDefinitionServiceImpl implements BpmnProcessDefinitionSe
}
@Override
public String getActiveProcessDefinitionId(String tenantId, String category) {
public String getActiveProcessDefinitionId(String tenantId, String key) {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantId(tenantId)
.processDefinitionCategory(category)
.processDefinitionKey(key)
.latestVersion()
.list();
if (!CollectionUtils.isEmpty(list) && list.size() != 1) {
throw new WorkflowEngineException(PROCESS_DEFINITION_RESULT_TOO_MANY, tenantId, category);
throw new WorkflowEngineException(PROCESS_DEFINITION_RESULT_TOO_MANY, tenantId, key);
} else if (CollectionUtils.isEmpty(list)) {
throw new WorkflowEngineException(PROCESS_DEFINITION_HAS_DIRTY_DATA, category);
throw new WorkflowEngineException(PROCESS_DEFINITION_HAS_DIRTY_DATA, key);
} else {
return list.get(0).getId();
}

View File

@ -98,10 +98,17 @@ public class BpmnProcessModelServiceImpl implements BpmnProcessModelService {
.append(" b.status = #{status}");
query.parameter("status", dto.getStatus() == 1);
}
if (StringUtils.hasLength(dto.getKey())) {
if (!CollectionUtils.isEmpty(dto.getKeys())) {
baseQuerySql.append(sqlConnectors(baseQuerySql))
.append(" a.KEY_ = #{key}");
query.parameter("key", dto.getKey());
.append(" a.KEY_ in (");
for (int i = 0; i < dto.getKeys().size(); i++) {
baseQuerySql.append("#{KEY_").append(i).append("}");
if (i < dto.getKeys().size() - 1) {
baseQuerySql.append(",");
}
query.parameter("KEY_" + i, dto.getKeys().get(i));
}
baseQuerySql.append(")");
}
if (StringUtils.hasLength(dto.getName())) {
baseQuerySql.append(sqlConnectors(baseQuerySql))

View File

@ -34,8 +34,10 @@ import java.util.Objects;
import static cn.axzo.workflow.common.code.FormModelRespCode.FORM_MODEL_EXISTS;
import static cn.axzo.workflow.common.code.FormModelRespCode.FORM_MODEL_NOT_EXISTS;
import static cn.axzo.workflow.common.constant.BpmnConstants.FORM_FILE_SUFFIX;
import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_DESCRIPTION;
import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE;
import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE_FORM;
import static cn.axzo.workflow.common.constant.MetaInfoConstants.MODEL_TYPE_PROCESS;
import static cn.axzo.workflow.common.util.BpmnNativeQueryUtil.countSql;
import static cn.axzo.workflow.common.util.BpmnNativeQueryUtil.sqlConnectors;
@ -64,28 +66,21 @@ public class FormModelServiceImpl implements FormModelService {
.modelCategory(FORM_FILE_SUFFIX)
.modelTenantId(dto.getTenantId())
.singleResult();
if (Objects.nonNull(persistModel)) {
throw new WorkflowEngineException(FORM_MODEL_EXISTS);
}
Map<String, String> metaInfoMap = new HashMap<>();
metaInfoMap.put(MODEL_TYPE, MODEL_TYPE_FORM);
Model model = repositoryService.newModel();
model.setKey(dto.getKey());
model.setCategory(FORM_FILE_SUFFIX);
model.setName(dto.getName());
model.setTenantId(dto.getTenantId());
model.setMetaInfo(JSONUtil.toJsonStr(metaInfoMap));
repositoryService.saveModel(model);
persistModel.setKey(dto.getKey());
persistModel.setCategory(FORM_FILE_SUFFIX);
persistModel.setName(dto.getName());
persistModel.setTenantId(dto.getTenantId());
repositoryService.saveModel(persistModel);
FormDefinitionDTO formDefinition = new FormDefinitionDTO();
formDefinition.setKey(dto.getKey());
formDefinition.setName(dto.getName());
formDefinition.setVersion(model.getVersion());
formDefinition.setVersion(persistModel.getVersion());
formDefinition.setFields(dto.getFormFields());
repositoryService.addModelEditorSource(model.getId(), JSON.toJSONString(formDefinition).getBytes(StandardCharsets.UTF_8));
return model.getId();
repositoryService.addModelEditorSource(persistModel.getId(), JSON.toJSONString(formDefinition).getBytes(StandardCharsets.UTF_8));
return persistModel.getId();
}
@Override
@ -98,10 +93,17 @@ public class FormModelServiceImpl implements FormModelService {
.modelTenantId(dto.getTenantId())
.singleResult();
if (Objects.isNull(model)) {
throw new WorkflowEngineException(FORM_MODEL_NOT_EXISTS);
model = repositoryService.newModel();
}
model.setName(dto.getName());
model.setKey(dto.getKey());
model.setCategory(FORM_FILE_SUFFIX);
Map<String, String> metaInfoMap = new HashMap<>();
metaInfoMap.put(MODEL_TYPE, MODEL_TYPE_FORM);
model.setMetaInfo(JSONUtil.toJsonStr(metaInfoMap));
model.setTenantId(dto.getTenantId());
repositoryService.saveModel(model);
FormDefinitionDTO formDefinition = new FormDefinitionDTO();
@ -119,10 +121,17 @@ public class FormModelServiceImpl implements FormModelService {
StringBuilder baseQuerySql = new StringBuilder("SELECT * FROM ")
.append(tableName);
NativeModelQuery query = repositoryService.createNativeModelQuery();
if (StringUtils.hasLength(dto.getKey())) {
if (!CollectionUtils.isEmpty(dto.getKeys())) {
baseQuerySql.append(sqlConnectors(baseQuerySql))
.append(" KEY_ = #{key}");
query.parameter("key", dto.getKey());
.append(" a.KEY_ in (");
for (int i = 0; i < dto.getKeys().size(); i++) {
baseQuerySql.append("#{KEY_").append(i).append("}");
if (i < dto.getKeys().size() - 1) {
baseQuerySql.append(",");
}
query.parameter("KEY_" + i, dto.getKeys().get(i));
}
baseQuerySql.append(")");
}
if (StringUtils.hasLength(dto.getName())) {
baseQuerySql.append(sqlConnectors(baseQuerySql))
@ -213,7 +222,7 @@ public class FormModelServiceImpl implements FormModelService {
.deploy();
model.setDeploymentId(deploy.getId());
repositoryService.saveModel(model);
// repositoryService.saveModel(model);
return deploy.getId();
}

View File

@ -180,19 +180,19 @@ public class BpmnProcessDefinitionController implements ProcessDefinitionApi {
*
* @param modelId 模型 ID
* @param tenantId 租户 ID
* @param category 业务分类
* @param key 业务分类
* @return
*/
@Operation(summary = "获取指定模型激活的流程定义 JSON 模型")
@GetMapping("/active/json/model")
@Override
public CommonResponse<BpmnModelUpdateDTO> getActiveProcessDefinitionJsonModel(@NotBlank(message = "模型 ID 不能为空") @RequestParam(required = false) String modelId,
@NotBlank(message = "分类不能为空") @RequestParam(required = false) String category,
@NotBlank(message = "分类不能为空") @RequestParam(required = false) String key,
@RequestParam(required = false) String tenantId) {
String finalTenantId = StringUtils.hasText(tenantId) ? tenantId : "";
BpmnModelDetailVO modelDetail = bpmnProcessModelService.getById(modelId, finalTenantId);
String activeProcessDefinitionId = bpmnProcessDefinitionService.getActiveProcessDefinitionId(finalTenantId,
category);
key);
BpmnProcessDefinitionVO processDefinition =
bpmnProcessDefinitionService.getProcessDefinition(activeProcessDefinitionId);

File diff suppressed because one or more lines are too long

View File

@ -2427,7 +2427,24 @@
"multiMode": "AND",
"approverEmptyHandleType": "autoPassed",
"emptyApproverSpecify": null,
"fieldPermission": null,
"fieldPermission": {
"initiator": [
{
"fieldKey": "field_1",
"readOnly": true,
"editRequired": false,
"editable": false,
"hidden": false
},
{
"fieldKey": "field_1",
"readOnly": true,
"editRequired": false,
"editable": false,
"hidden": false
}
]
},
"buttonPermission": {
"initiator": [
{

View File

@ -6,10 +6,43 @@ 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.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.annotation.InvokeMode;
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.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.ProcessNodeDetailVO;
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.List;
import java.util.Map;
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;
@ -21,45 +54,12 @@ 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.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 io.swagger.v3.oas.annotations.Operation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import javax.annotation.Nullable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;
import java.util.Map;
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.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.ProcessNodeDetailVO;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PutMapping;
import javax.validation.constraints.NotNull;
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;
/**
* Workflow Engine Starter Core Service
@ -71,6 +71,135 @@ import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO;
@org.springframework.cloud.openfeign.FeignClient(name = "workflow-engine-starter-core", url = "${axzo.service.workflow-engine:http://workflow-engine:8080}", configuration = WorkflowEngineStarterFeignConfiguration.class)
public interface WorkflowCoreService {
/**
* 业务节点唤醒, 该节点废弃请换成 {@link ProcessActivityApi#trigger(cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO)} 接口
* <p>
* 当模型中使用了业务节点且设置了不设置审批人模式则当业务监听到 PROCESS_ACTIVITY_START 事件时可通过该接口推动流程继续运行
*/
@Deprecated
@GetMapping("/api/process/activity/trigger")
Boolean trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId);
/**
* 业务节点唤醒
*
* @param dto
* @return
*/
@PostMapping("/api/process/activity/trigger")
Boolean trigger(@Validated @RequestBody BpmnActivityTriggerDTO dto);
/**
* 业务节点设置审批人, 不支持重复设置
* <p>
* 当模型中使用了业务节点且设置了业务指定审批人模式则当业务监听到 PROCESS_ACTIVITY_WAIT_ASSIGNEE 事件时可通过该接口设置动态设置审批人
* <p>
* <strong color=orange>注意如果调用接口时传入的审批人集合为空流程引擎将对该审批流程实例自动中止</strong>
*
* @param dto
* @return
*/
@PostMapping("/api/process/activity/assignee/set")
@Operation(summary = "业务节点设置审批人,不支持重复调用设置审批人,需一次性传入所有审批人")
Boolean setAssignee(@Validated @RequestBody BpmnActivitySetAssigneeDTO dto);
/**
* 创建审批流程
*
* <pre>
* MQ 触发规则:
* 1. 当前流程实例会依次触发 process-instance-created process-instance-started 事件
* 2. 第一个审批任务会依次触发 process-task-assigned process-task-created 事件
* </pre>
*
* @param dto {@link BpmnProcessInstanceCreateDTO}
*/
@Operation(summary = "创建审批流程, MQ 触发规则:1. 当前流程实例会依次触发 process-instance-created 和 process-instance-started 事件,2. 第一个审批任务会依次触发 process-task-assigned 和 process-task-created 事件")
@PostMapping("/api/process/instance/create")
@InvokeMode(SYNC)
String createProcessInstance(@Validated @RequestBody BpmnProcessInstanceCreateDTO dto);
/**
* 发起人主动撤回审核
*
* <pre>
* MQ 触发规则:
* 1. 当前流程实例中现存的任务会依次触发 process-task-deleted 事件
* 2. 当前流程实例会触发 process-instance-cancelled 事件
* </pre>
*
* @param dto {@link BpmnProcessInstanceCancelDTO}
* @return
*/
@Operation(summary = "发起人主动撤回审核,MQ 触发规则:1. 当前流程实例中现存的任务会依次触发 process-task-deleted 事件,2. 当前流程实例会触发 process-instance-cancelled 事件")
@DeleteMapping("/api/process/instance/cancel")
Boolean cancelProcessInstance(@Validated @RequestBody BpmnProcessInstanceCancelDTO dto);
/**
* 中止流程实例
*
* @param dto
* @return
*/
@Operation(summary = "中止流程实例")
@DeleteMapping("/api/process/instance/abort")
Boolean abortProcessInstance(@Validated @RequestBody BpmnProcessInstanceAbortDTO dto);
/**
* 批量中止流程实例
*
* @param dtos
* @return
*/
@Operation(summary = "批量中止流程实例")
@DeleteMapping("/api/process/instance/batch/abort")
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);
/**
* 获得流程实例
*
* @param dto {@link BpmnProcessInstanceQueryDTO} 可根据 Id,BusinessKey进行查询
* @return 流程实例, 租户Id不必传
*/
@Operation(summary = "获得流程实例")
@GetMapping("/api/process/instance/get")
@InvokeMode(SYNC)
BpmnProcessInstanceVO getProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceQueryDTO dto);
/**
* 获取指定流程实例的流程变量
*
* @param processInstanceId
* @param tenantId
* @return
*/
@Operation(summary = "获取指定流程实例的流程变量")
@GetMapping("/api/process/instance/cooperation-org")
@InvokeMode(SYNC)
Map<String, Object> getProcessVariables(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
/**
* 获取指定流程的日志
*
* @param dto
* @return
*/
@Operation(summary = "获取指定流程的日志")
@PostMapping("/api/process/instance/logs")
@InvokeMode(SYNC)
BpmnProcessInstanceLogVO getProcessInstanceLogs(@Validated @RequestBody BpmnProcessInstanceLogQueryDTO dto);
/**
* 同意
*
@ -196,135 +325,6 @@ public interface WorkflowCoreService {
@PostMapping("/api/process/task/robot/complete")
Boolean completeRobotTask(@Validated @RequestBody BpmnRobotTaskCompleteDTO dto);
/**
* 创建审批流程
*
* <pre>
* MQ 触发规则:
* 1. 当前流程实例会依次触发 process-instance-created process-instance-started 事件
* 2. 第一个审批任务会依次触发 process-task-assigned process-task-created 事件
* </pre>
*
* @param dto {@link BpmnProcessInstanceCreateDTO}
*/
@Operation(summary = "创建审批流程, MQ 触发规则:1. 当前流程实例会依次触发 process-instance-created 和 process-instance-started 事件,2. 第一个审批任务会依次触发 process-task-assigned 和 process-task-created 事件")
@PostMapping("/api/process/instance/create")
@InvokeMode(SYNC)
String createProcessInstance(@Validated @RequestBody BpmnProcessInstanceCreateDTO dto);
/**
* 发起人主动撤回审核
*
* <pre>
* MQ 触发规则:
* 1. 当前流程实例中现存的任务会依次触发 process-task-deleted 事件
* 2. 当前流程实例会触发 process-instance-cancelled 事件
* </pre>
*
* @param dto {@link BpmnProcessInstanceCancelDTO}
* @return
*/
@Operation(summary = "发起人主动撤回审核,MQ 触发规则:1. 当前流程实例中现存的任务会依次触发 process-task-deleted 事件,2. 当前流程实例会触发 process-instance-cancelled 事件")
@DeleteMapping("/api/process/instance/cancel")
Boolean cancelProcessInstance(@Validated @RequestBody BpmnProcessInstanceCancelDTO dto);
/**
* 中止流程实例
*
* @param dto
* @return
*/
@Operation(summary = "中止流程实例")
@DeleteMapping("/api/process/instance/abort")
Boolean abortProcessInstance(@Validated @RequestBody BpmnProcessInstanceAbortDTO dto);
/**
* 批量中止流程实例
*
* @param dtos
* @return
*/
@Operation(summary = "批量中止流程实例")
@DeleteMapping("/api/process/instance/batch/abort")
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);
/**
* 获得流程实例
*
* @param dto {@link BpmnProcessInstanceQueryDTO} 可根据 Id,BusinessKey进行查询
* @return 流程实例, 租户Id不必传
*/
@Operation(summary = "获得流程实例")
@GetMapping("/api/process/instance/get")
@InvokeMode(SYNC)
BpmnProcessInstanceVO getProcessInstanceVO(@Validated @RequestBody BpmnProcessInstanceQueryDTO dto);
/**
* 获取指定流程实例的流程变量
*
* @param processInstanceId
* @param tenantId
* @return
*/
@Operation(summary = "获取指定流程实例的流程变量")
@GetMapping("/api/process/instance/cooperation-org")
@InvokeMode(SYNC)
Map<String, Object> getProcessVariables(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId, @Nullable @RequestParam(required = false) String tenantId);
/**
* 获取指定流程的日志
*
* @param dto
* @return
*/
@Operation(summary = "获取指定流程的日志")
@PostMapping("/api/process/instance/logs")
@InvokeMode(SYNC)
BpmnProcessInstanceLogVO getProcessInstanceLogs(@Validated @RequestBody BpmnProcessInstanceLogQueryDTO dto);
/**
* 业务节点唤醒, 该节点废弃请换成 {@link ProcessActivityApi#trigger(cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivityTriggerDTO)} 接口
* <p>
* 当模型中使用了业务节点且设置了不设置审批人模式则当业务监听到 PROCESS_ACTIVITY_START 事件时可通过该接口推动流程继续运行
*/
@Deprecated
@GetMapping("/api/process/activity/trigger")
Boolean trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId);
/**
* 业务节点唤醒
*
* @param dto
* @return
*/
@PostMapping("/api/process/activity/trigger")
Boolean trigger(@Validated @RequestBody BpmnActivityTriggerDTO dto);
/**
* 业务节点设置审批人, 不支持重复设置
* <p>
* 当模型中使用了业务节点且设置了业务指定审批人模式则当业务监听到 PROCESS_ACTIVITY_WAIT_ASSIGNEE 事件时可通过该接口设置动态设置审批人
* <p>
* <strong color=orange>注意如果调用接口时传入的审批人集合为空流程引擎将对该审批流程实例自动中止</strong>
*
* @param dto
* @return
*/
@PostMapping("/api/process/activity/assignee/set")
@Operation(summary = "业务节点设置审批人,不支持重复调用设置审批人,需一次性传入所有审批人")
Boolean setAssignee(@Validated @RequestBody BpmnActivitySetAssigneeDTO dto);
/**
* 强制使用异步模式调用该方法请在调用真实方法前调用该方法
* <pre>