feat(REQ-3004) - 集成表单引擎测试
This commit is contained in:
parent
424da03bd2
commit
d5ed0367d5
@ -2,7 +2,6 @@ package cn.axzo.workflow.common.model.request.bpmn.model;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
|
||||
import cn.axzo.workflow.common.model.request.form.FormJsonModel;
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FormFieldsDTO;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
@ -12,7 +11,6 @@ import org.hibernate.validator.constraints.Length;
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 创建流程模型的入参模型
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package cn.axzo.workflow.common.model.request.form;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FormFieldsDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FormFieldDTO;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.AllArgsConstructor;
|
||||
@ -32,5 +32,5 @@ public class FormJsonModel implements Serializable {
|
||||
|
||||
@ApiModelProperty(value = "表单模型")
|
||||
@Valid
|
||||
private List<FormFieldsDTO> formFields;
|
||||
private List<FormFieldDTO> formFields;
|
||||
}
|
||||
|
||||
@ -32,7 +32,7 @@ public class FormDefinitionDTO {
|
||||
|
||||
@ApiModelProperty(value = "表单定义的具体字段项", example = "[{'': '''}]")
|
||||
@Valid
|
||||
private List<FormFieldsDTO> fields;
|
||||
private List<FormFieldDTO> fields;
|
||||
|
||||
@ApiModelProperty(value = "描述")
|
||||
private String description;
|
||||
|
||||
@ -6,7 +6,6 @@ import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@ -20,7 +19,7 @@ import java.util.Map;
|
||||
*/
|
||||
@ApiModel("表单定义中的字段相关属性入参模型")
|
||||
@Data
|
||||
public class FormFieldsDTO {
|
||||
public class FormFieldDTO {
|
||||
|
||||
@ApiModelProperty(value = "表单字段类型", hidden = true)
|
||||
@NotBlank(message = "字段类型不能为空")
|
||||
@ -1,6 +1,6 @@
|
||||
package cn.axzo.workflow.common.model.request.form.model;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FormFieldsDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FormFieldDTO;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
@ -37,7 +37,7 @@ public class FormModelCreateDTO {
|
||||
|
||||
@ApiModelProperty(value = "表单模型的 Json 结构")
|
||||
@Valid
|
||||
private List<FormFieldsDTO> formFields;
|
||||
private List<FormFieldDTO> formFields;
|
||||
|
||||
@ApiModelProperty(value = "租户 ID", example = "1")
|
||||
private String tenantId = NO_TENANT_ID;
|
||||
|
||||
@ -2,12 +2,14 @@ package cn.axzo.workflow.common.model.response.bpmn.process;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.bpmn.BpmnJsonModel;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FormFieldDTO;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@ApiModel("流程定义响应模型")
|
||||
@Data
|
||||
@ -57,6 +59,11 @@ public class BpmnProcessDefinitionVO {
|
||||
@ApiModelProperty(value = "状态 1:生效中(激活) 2:历史(挂起)", required = true, example = "1", notes = "参见 SuspensionState 枚举")
|
||||
private Integer suspensionState;
|
||||
|
||||
/**
|
||||
* 表单字段集合
|
||||
*/
|
||||
@ApiModelProperty(value = "表单字段集合")
|
||||
private List<FormFieldDTO> formFields;
|
||||
/**
|
||||
* 流程模型 JSON 数据
|
||||
*/
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
package cn.axzo.workflow.common.model.response.form.definition;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FormFieldsDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FormFieldDTO;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
@ -16,15 +16,15 @@ import java.util.List;
|
||||
@ApiModel("表单定义的响应模型")
|
||||
@Data
|
||||
public class FormDefinitionVO {
|
||||
@ApiModelProperty(value = "模型定义 ID")
|
||||
private String formDefinitionId;
|
||||
|
||||
@ApiModelProperty(value = "模型名称")
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "模型 KEY")
|
||||
private String key;
|
||||
|
||||
@ApiModelProperty(value = "自定义分类")
|
||||
private String category;
|
||||
|
||||
@ApiModelProperty(value = "版本")
|
||||
private Integer version;
|
||||
|
||||
@ -32,6 +32,6 @@ public class FormDefinitionVO {
|
||||
private String tenantId;
|
||||
|
||||
@ApiModelProperty(value = "表单模型字段")
|
||||
private List<FormFieldsDTO> fields;
|
||||
private List<FormFieldDTO> fields;
|
||||
|
||||
}
|
||||
|
||||
@ -15,12 +15,14 @@ import org.flowable.engine.repository.Model;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FORM_FILE_SUFFIX;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
|
||||
|
||||
/**
|
||||
* 聚合审批模型和表单模型的操作服务
|
||||
@ -51,6 +53,7 @@ public class AggregateModelServiceImpl implements AggregateModelService {
|
||||
formModelDto.setKey(dto.getKey());
|
||||
formModelDto.setName(dto.getName());
|
||||
formModelDto.setFormFields(dto.getFormJsonModel().getFormFields());
|
||||
formModelDto.setTenantId(StringUtils.hasText(dto.getTenantId()) ? dto.getTenantId() : NO_TENANT_ID);
|
||||
if (Objects.isNull(formModel)) {
|
||||
formModelService.createFormModel(formModelDto);
|
||||
} else {
|
||||
@ -83,8 +86,10 @@ public class AggregateModelServiceImpl implements AggregateModelService {
|
||||
String definitionId = bpmnProcessModelService.deployBpmModelById(processModelId, tenantId, operator);
|
||||
|
||||
Model model = this.repositoryService.getModel(processModelId);
|
||||
Model formModel = repositoryService.createModelQuery().modelKey(model.getKey())
|
||||
Model formModel = repositoryService.createModelQuery()
|
||||
.modelKey(model.getKey())
|
||||
.modelCategory(FORM_FILE_SUFFIX)
|
||||
.modelTenantId(StringUtils.hasText(tenantId) ? tenantId : NO_TENANT_ID)
|
||||
.singleResult();
|
||||
if (Objects.isNull(formModel)) {
|
||||
return definitionId;
|
||||
|
||||
@ -1,15 +1,18 @@
|
||||
package cn.axzo.workflow.core.service.impl;
|
||||
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.definition.BpmnProcessDefinitionUpdateDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessDefinitionPageDTO;
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FromDefinitionSearchDTO;
|
||||
import cn.axzo.workflow.common.model.response.BpmPageResult;
|
||||
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
|
||||
import cn.axzo.workflow.common.exception.WorkflowEngineException;
|
||||
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
||||
import cn.axzo.workflow.core.common.utils.BpmnJsonConverterUtil;
|
||||
import cn.axzo.workflow.core.repository.entity.ExtAxReProcDef;
|
||||
import cn.axzo.workflow.core.service.BpmnProcessDefinitionService;
|
||||
import cn.axzo.workflow.core.service.ExtAxReProcDefService;
|
||||
import cn.axzo.workflow.core.service.converter.BpmnProcessDefinitionConverter;
|
||||
import cn.axzo.workflow.form.service.FormDefinitionService;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@ -37,7 +40,6 @@ import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BPMN_FILE_SUFFIX;
|
||||
import static cn.axzo.workflow.common.code.BpmnModelRespCode.BPMN_BYTES_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.code.BpmnModelRespCode.MODEL_NOT_EXISTS;
|
||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_DEPLOY_ID_NOT_EXISTS;
|
||||
@ -47,6 +49,7 @@ import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS
|
||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_KEY_NOT_MATCH;
|
||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_NAME_NOT_MATCH;
|
||||
import static cn.axzo.workflow.common.code.BpmnProcessDefinitionRespCode.PROCESS_DEFINITION_RESULT_TOO_MANY;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.BPMN_FILE_SUFFIX;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnCollectionUtils.addIfNotNull;
|
||||
import static cn.axzo.workflow.core.common.utils.BpmnCollectionUtils.convertMap;
|
||||
import static java.util.Collections.emptyList;
|
||||
@ -63,6 +66,8 @@ public class BpmnProcessDefinitionServiceImpl implements BpmnProcessDefinitionSe
|
||||
private BpmnProcessDefinitionConverter processDefinitionConverter;
|
||||
@Resource
|
||||
private String serviceVersion;
|
||||
@Resource
|
||||
private FormDefinitionService formDefinitionService;
|
||||
|
||||
@Override
|
||||
public String createProcessDefinition(Model model, byte[] bpmnBytes) {
|
||||
@ -185,6 +190,14 @@ public class BpmnProcessDefinitionServiceImpl implements BpmnProcessDefinitionSe
|
||||
}
|
||||
BpmnProcessDefinitionVO vo = processDefinitionConverter.toVo(processDefinition);
|
||||
vo.setJsonModel(BpmnJsonConverterUtil.convertToJson(repositoryService.getBpmnModel(id)));
|
||||
|
||||
FromDefinitionSearchDTO formDefinitionSearch = new FromDefinitionSearchDTO();
|
||||
formDefinitionSearch.setKey(processDefinition.getKey());
|
||||
formDefinitionSearch.setTenantId(processDefinition.getTenantId());
|
||||
FormDefinitionVO formDefinitionVO = formDefinitionService.get(formDefinitionSearch);
|
||||
if (Objects.nonNull(formDefinitionVO)) {
|
||||
vo.setFormFields(formDefinitionVO.getFields());
|
||||
}
|
||||
return vo;
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,30 @@
|
||||
package cn.axzo.workflow.form.service.converter;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2024-11-11 13:42
|
||||
*/
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ConversionUtils {
|
||||
public static List<String> convertObjectToList(Object obj) {
|
||||
if (obj instanceof List) {
|
||||
List<?> list = (List<?>) obj;
|
||||
List<String> stringList = new ArrayList<>();
|
||||
for (Object item : list) {
|
||||
if (item instanceof String) {
|
||||
stringList.add((String) item);
|
||||
} else {
|
||||
// 处理非字符串类型的情况,可以选择忽略、抛出异常或进行其他处理
|
||||
}
|
||||
}
|
||||
return stringList;
|
||||
} else {
|
||||
// 如果输入不是列表类型,返回空列表或进行其他处理
|
||||
return new ArrayList<>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
package cn.axzo.workflow.form.service.converter;
|
||||
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FormFieldDTO;
|
||||
import org.flowable.form.model.FormField;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.mapstruct.NullValueCheckStrategy.ALWAYS;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*
|
||||
* @author wangli
|
||||
* @since 2024-11-11 11:27
|
||||
*/
|
||||
@Mapper(
|
||||
componentModel = "spring",
|
||||
nullValueCheckStrategy = ALWAYS,
|
||||
imports = {Arrays.class, ConversionUtils.class}
|
||||
)
|
||||
public interface FormFieldConverter extends EntityConverter<FormFieldDTO, FormField> {
|
||||
|
||||
@Mapping(target = "id", source = "entity.id")
|
||||
@Mapping(target = "name", source = "entity.name")
|
||||
@Mapping(target = "type", source = "entity.type")
|
||||
@Mapping(target = "value", expression = "java(ConversionUtils.convertObjectToList(entity.getValue()))")
|
||||
@Mapping(target = "required", source = "entity.required")
|
||||
@Mapping(target = "readOnly", source = "entity.readOnly")
|
||||
@Mapping(target = "placeholder", source = "entity.placeholder")
|
||||
@Mapping(target = "params", source = "entity.params")
|
||||
FormFieldDTO toVo(FormField entity);
|
||||
|
||||
}
|
||||
@ -4,25 +4,29 @@ import cn.axzo.framework.jackson.utility.JSON;
|
||||
import cn.axzo.workflow.common.model.request.form.definition.FromDefinitionSearchDTO;
|
||||
import cn.axzo.workflow.common.model.response.form.definition.FormDefinitionVO;
|
||||
import cn.axzo.workflow.form.service.FormDefinitionService;
|
||||
import cn.axzo.workflow.form.service.converter.FormFieldConverter;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.javassist.Loader;
|
||||
import org.flowable.common.engine.api.FlowableObjectNotFoundException;
|
||||
import org.flowable.common.engine.impl.util.IoUtil;
|
||||
import org.flowable.engine.FormService;
|
||||
import org.flowable.engine.RepositoryService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.form.api.FormDefinition;
|
||||
import org.flowable.form.api.FormDefinitionQuery;
|
||||
import org.flowable.form.api.FormInfo;
|
||||
import org.flowable.form.api.FormRepositoryService;
|
||||
import org.flowable.form.model.FormField;
|
||||
import org.flowable.form.model.SimpleFormModel;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.FORM_FILE_SUFFIX;
|
||||
import static cn.axzo.workflow.common.constant.BpmnConstants.NO_TENANT_ID;
|
||||
|
||||
|
||||
/**
|
||||
@ -38,11 +42,7 @@ public class FormDefinitionServiceImpl implements FormDefinitionService {
|
||||
@Resource
|
||||
private FormRepositoryService formRepositoryService;
|
||||
@Resource
|
||||
private RepositoryService repositoryService;
|
||||
@Resource
|
||||
private FormService formService;
|
||||
@Resource
|
||||
private RuntimeService runtimeService;
|
||||
private FormFieldConverter formFieldConverter;
|
||||
|
||||
@Override
|
||||
public FormDefinitionVO getDraft(FromDefinitionSearchDTO dto) {
|
||||
@ -52,28 +52,22 @@ public class FormDefinitionServiceImpl implements FormDefinitionService {
|
||||
|
||||
@Override
|
||||
public FormDefinitionVO get(FromDefinitionSearchDTO dto) {
|
||||
FormDefinitionQuery definitionQuery = formRepositoryService.createFormDefinitionQuery()
|
||||
.formTenantId(dto.getTenantId());
|
||||
if (StringUtils.hasText(dto.getKey())) {
|
||||
definitionQuery.formDefinitionKey(dto.getKey());
|
||||
}
|
||||
if (StringUtils.hasText(dto.getDeploymentId())) {
|
||||
definitionQuery.deploymentId(dto.getDeploymentId());
|
||||
FormInfo formModel;
|
||||
try {
|
||||
formModel = formRepositoryService.getFormModelByKey(dto.getKey(), dto.getTenantId(), true);
|
||||
}catch (FlowableObjectNotFoundException e){
|
||||
return null;
|
||||
}
|
||||
|
||||
FormDefinition formDefinition;
|
||||
if (Objects.nonNull(dto.getVersion())) {
|
||||
formDefinition = definitionQuery.formVersion(dto.getVersion())
|
||||
.singleResult();
|
||||
} else {
|
||||
formDefinition = definitionQuery.latestVersion()
|
||||
.singleResult();
|
||||
}
|
||||
|
||||
InputStream formDefinitionResource = formRepositoryService.getFormDefinitionResource(formDefinition.getId());
|
||||
byte[] bytes = IoUtil.readInputStream(formDefinitionResource, dto.getKey() + FORM_FILE_SUFFIX);
|
||||
IoUtil.closeSilently(formDefinitionResource);
|
||||
return JSON.parseObject(new String(bytes, StandardCharsets.UTF_8), FormDefinitionVO.class);
|
||||
FormDefinitionVO formDefinitionVO = new FormDefinitionVO();
|
||||
formDefinitionVO.setFormDefinitionId(formModel.getId());
|
||||
formDefinitionVO.setName(formModel.getName());
|
||||
formDefinitionVO.setKey(formModel.getKey());
|
||||
formDefinitionVO.setVersion(formModel.getVersion());
|
||||
formDefinitionVO.setTenantId(dto.getTenantId());
|
||||
List<FormField> fields = ((SimpleFormModel) formModel.getFormModel()).getFields();
|
||||
formDefinitionVO.setFields(formFieldConverter.toVos(fields));
|
||||
return formDefinitionVO;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -13,15 +13,14 @@ import cn.azxo.framework.common.model.CommonResponse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.flowable.bpmn.model.FlowElement;
|
||||
import org.flowable.common.engine.impl.util.IoUtil;
|
||||
import org.flowable.engine.FormService;
|
||||
import org.flowable.engine.HistoryService;
|
||||
import org.flowable.engine.RepositoryService;
|
||||
import org.flowable.engine.RuntimeService;
|
||||
import org.flowable.engine.form.StartFormData;
|
||||
import org.flowable.engine.history.HistoricProcessInstance;
|
||||
import org.flowable.engine.repository.Deployment;
|
||||
import org.flowable.form.api.FormInfo;
|
||||
import org.flowable.form.api.FormRepositoryService;
|
||||
import org.flowable.form.api.FormService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.util.StringUtils;
|
||||
@ -267,7 +266,8 @@ public class TestController {
|
||||
@GetMapping("form")
|
||||
public CommonResponse<FormInfo> getForm(@RequestParam String definitionId, @RequestParam(required = false) String processInstanceId) {
|
||||
// FormInfo startFormModel = bpmnProcessInstanceService.getStartFormModel(definitionId, processInstanceId);
|
||||
StartFormData startFormData = formService.getStartFormData(definitionId);
|
||||
// formService.getFormInstanceModelByKey("we", null, null, null);
|
||||
FormInfo we = formService.getFormModelWithVariablesByKey("we", null, null);
|
||||
FormInfo formModelByKey = formRepositoryService.getFormModelByKey("we");
|
||||
FormInfo startFormModel = runtimeService.getStartFormModel(definitionId, processInstanceId);
|
||||
return CommonResponse.success(null);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user