diff --git a/pom.xml b/pom.xml
index 923d1dfab593bb105e4d6b2fedfc1fb0e0b896bc..f90ebf84035f154a0c1de25ce43e7c1b00d60dc8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,6 +9,7 @@
rest-api-service-dev
rest-api-spi-dev
rest-api-utils
+ rest-api-provider-dev
diff --git a/rest-api-provider-dev/pom.xml b/rest-api-provider-dev/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8e649fb353e5b1533856ec2352fd6cfbfb9ff079
--- /dev/null
+++ b/rest-api-provider-dev/pom.xml
@@ -0,0 +1,48 @@
+
+
+
+ rest-api-model
+ com.inspur.edp
+ 0.2.0
+
+ 4.0.0
+
+ rest-api-provider-dev
+
+
+
+
+ com.inspur.edp
+ rest-api-metadata
+ ${project.version}
+ compile
+
+
+ com.inspur.edp
+ rest-api-spi-dev
+ ${project.version}
+ compile
+
+
+ com.inspur.edp
+ formserver-viewmodel
+ 0.2.7
+ compile
+
+
+ com.inspur.edp
+ rest-api-provider-common
+ ${project.version}
+ compile
+
+
+ io.iec.edp
+ caf-boot-commons-multicontext
+ 0.3.9
+
+
+
+
+
\ No newline at end of file
diff --git a/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/common/EapiBuilder.java b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/common/EapiBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..911d85625548093e4bf114976087bb492d74f4f2
--- /dev/null
+++ b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/common/EapiBuilder.java
@@ -0,0 +1,302 @@
+/*
+ * Copyright © OpenAtom Foundation.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.inspur.edp.sgf.dt.provider.common;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.inspur.edp.formserver.viewmodel.GspViewModel;
+import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
+import com.inspur.edp.lcm.metadata.api.entity.MetadataHeader;
+import com.inspur.edp.lcm.metadata.api.entity.MetadataProject;
+import com.inspur.edp.lcm.metadata.api.service.FileService;
+import com.inspur.edp.lcm.metadata.api.service.MetadataService;
+import com.inspur.edp.lcm.metadata.api.service.NoCodeService;
+import com.inspur.edp.sgf.api.common.ResourceType;
+import com.inspur.edp.sgf.api.entity.ServiceDefine;
+import com.inspur.edp.sgf.api.entity.ServiceOperation;
+import com.inspur.edp.sgf.api.entity.ServiceParameter;
+import com.inspur.edp.sgf.api.entity.SgMetadata;
+import com.inspur.edp.sgf.api.entity.SgModel;
+import com.inspur.edp.sgf.api.utils.ObjectMapperUtil;
+import com.inspur.edp.sgf.dt.provider.utils.MetadataUtils;
+import com.inspur.edp.sgf.provider.vo.utils.SimpleViewModelUtils;
+import com.inspur.edp.sgf.provider.vo.utils.ViewModelUtils;
+import io.iec.edp.caf.businessobject.api.entity.DevBasicBoInfo;
+import io.iec.edp.caf.commons.utils.SpringBeanUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+/**
+ * 功能描述: @ClassName: EapiBuilder @Author: Fynn Qi @Date: 2020/12/24 9:17 @Version: V1.0
+ */
+public class EapiBuilder {
+
+ private final String EAPI_RESOURCE_TYPE_VO = "VO";
+ private final String EAPI_RESOURCE_TYPE_VO_SIMPLE = "VO-Simple";
+ private final String EAPI_TYPE_NAME = "ExternalApi";
+ private final String EAPI_SUFFIX_NAME = ".eapi";
+ private final String EAPI_PATH = "/eapi";
+ private ResourceType resourceType;
+
+ public GspMetadata updateEapi(String eapiMetadataId, GspMetadata voMetadata, ResourceType resourceType) {
+ this.resourceType = resourceType;
+ NoCodeService noCodeService = SpringBeanUtils.getBean(NoCodeService.class);
+ GspMetadata metadata = noCodeService.getMetadata(eapiMetadataId);
+ //构造Header
+ metadata.setHeader(updateMetadataHeader(voMetadata, metadata));
+ //构造Content
+ metadata.setContent(buildEapiMetadataDefine(voMetadata, metadata));
+ //构造扩展属性
+ ObjectNode extension = getEapiMetadataExtendProperties(metadata);
+ metadata.setExtendProperty(ObjectMapperUtil.serialize(extension));
+ noCodeService.saveMetadata(metadata);
+ return metadata;
+ }
+
+ private ObjectNode getEapiMetadataExtendProperties(GspMetadata metadata) {
+ ObjectNode node = ObjectMapperUtil.getMapper().createObjectNode();
+ node.put("metadataVersion", UUID.randomUUID().toString());
+ node.put("resourceType", ((SgMetadata) metadata.getContent()).getService().getResourceType());
+ node.put("resourceId", ((SgMetadata) metadata.getContent()).getService().getResourceId());
+ node.put("uri", ((SgMetadata) metadata.getContent()).getRouter());
+ return node;
+ }
+
+ private MetadataHeader updateMetadataHeader(GspMetadata voMetadata, GspMetadata eapiMetadata) {
+ //获取当前需要更新的运行时定制元数据的Header
+ MetadataHeader header = eapiMetadata.getHeader();
+ // 编号和名称取自运行时定制扩展的VO元数据,VO的编号和名称已作出对应的扩展调整
+ header.setCode(voMetadata.getHeader().getCode());
+ header.setName(voMetadata.getHeader().getName());
+ // 是否允许扩展,与VO同步
+ header.setExtendable(voMetadata.getHeader().isExtendable());
+ return header;
+ }
+
+ public GspMetadata buildEapi(GspMetadata voMetadata, ResourceType resourceType) {
+ this.resourceType = resourceType;
+ GspMetadata metadata = new GspMetadata();
+ // 初始化Header信息
+ metadata.setHeader(buildEapiMetadataHeader(voMetadata));
+ //构造Content
+ metadata.setContent(buildEapiMetadataDefine(voMetadata, metadata));
+ //构造扩展属性
+ ObjectNode extension = getEapiMetadataExtendProperties(metadata);
+ metadata.setExtendProperty(ObjectMapperUtil.serialize(extension));
+ NoCodeService noCodeService = SpringBeanUtils.getBean(NoCodeService.class);
+ noCodeService.saveMetadata(metadata);
+ return metadata;
+ }
+
+ public GspMetadata buildEapi(GspMetadata voMetadata, String path, ResourceType resourceType) {
+ this.resourceType = resourceType;
+ // 初始化Header信息
+ GspMetadata eapiMetadata = buildEapiMetadataBaseInfo(voMetadata, path);
+ // 生成元数据content
+ eapiMetadata = buildEapiMetadataFileContent(voMetadata, eapiMetadata);
+ return eapiMetadata;
+ }
+
+ private GspMetadata buildEapiMetadataFileContent(GspMetadata voMetadata, GspMetadata eapiMetadata) {
+ List metadataTypeList = new ArrayList<>();
+ metadataTypeList.add(EAPI_SUFFIX_NAME);
+ MetadataService metadataService = SpringBeanUtils.getBean(MetadataService.class);
+ String eapiRelativePath = eapiMetadata.getRelativePath();
+ List metadataList = metadataService.getMetadataList(eapiRelativePath, metadataTypeList);
+ if (metadataList != null && metadataList.size() > 0) {
+ String metadataCode = eapiMetadata.getHeader().getCode();
+ boolean exist = metadataList.stream().anyMatch(x -> metadataCode.equalsIgnoreCase(x.getHeader().getCode()));
+ //如果不存在当前编号的EAPI元数据,则直接创建
+ if (!exist) {
+ // 元数据初始化
+ eapiMetadata = metadataService.initializeMetadataEntity(eapiMetadata);
+ // 创建元数据
+ metadataService.createMetadata(eapiRelativePath, eapiMetadata);
+ }
+ } else {
+ // 元数据初始化
+ eapiMetadata = metadataService.initializeMetadataEntity(eapiMetadata);
+ // 创建元数据
+ metadataService.createMetadata(eapiRelativePath, eapiMetadata);
+ }
+ // 加载元数据
+ eapiMetadata = metadataService.loadMetadata(eapiMetadata.getHeader().getFileName(), eapiRelativePath);
+ // eapi赋值给元数据的content
+ eapiMetadata.setContent(buildEapiMetadataDefine(voMetadata, eapiMetadata));
+ // 保存元数据,元数据设置扩展属性
+ ObjectNode extension = getEapiMetadataExtendProperties(eapiMetadata);
+ eapiMetadata.setExtendProperty(ObjectMapperUtil.serialize(extension));
+ // 元数据保存所需要的完整路径
+ String fullPath = String.format("%s/%s%s", eapiRelativePath, eapiMetadata.getHeader().getCode(), EAPI_SUFFIX_NAME);
+ metadataService.saveMetadata(eapiMetadata, fullPath);
+ return eapiMetadata;
+ }
+
+ private SgMetadata buildEapiMetadataDefine(GspMetadata vo, GspMetadata eapiMetadata) {
+ SgMetadata eapiContent = new SgMetadata();
+ // 定义SG外部服务基本信息
+ eapiContent.setId(eapiMetadata.getHeader().getId());
+ eapiContent.setCode(eapiMetadata.getHeader().getCode());
+ eapiContent.setName(eapiMetadata.getHeader().getName());
+ eapiContent.setBizObject(eapiMetadata.getHeader().getBizobjectID());
+ DevBasicBoInfo boInfo = MetadataUtils.getDevBasicBoInfo(eapiMetadata.getHeader().getBizobjectID());
+ eapiContent.setCriticalApplication(boInfo.getAppCode().toLowerCase());
+ eapiContent.setServiceUnit(boInfo.getSuCode().toLowerCase());
+ String boCode = "";
+ if (boInfo.getBoInfo() != null && StringUtils.isNotBlank(boInfo.getBoInfo().getCode())) {
+ boCode = boInfo.getBoInfo().getCode();
+ }
+ //TODO 后续修改为下面的生成方式
+ // route的默认生成方式:BO的编号_VO元数据的编号
+ eapiContent.setRouteUrl(vo.getHeader().getCode().toLowerCase());
+ //eapiContent.setRouteUrl(String.format("%s_%s", boCode.toLowerCase(), vo.getHeader().getCode().toLowerCase()));
+ // 版本信息,默认1.0
+ eapiContent.setVersion("1.0");
+ eapiContent.setDescription(vo.getHeader().getCode() + "服务");
+ // 生成服务定义
+ eapiContent.setService(this.buildServiceDefine(vo));
+ // 获取服务模型列表
+ eapiContent.getModels().addAll(getServiceModels(eapiContent));
+ return eapiContent;
+ }
+
+ private List getServiceModels(SgMetadata eapiContent) {
+ List models = new ArrayList<>();
+ Set modelsIdsSet = new HashSet<>();
+ if (eapiContent.getService().getOperations().size() <= 0) {
+ return models;
+ }
+ for (ServiceOperation operation : eapiContent.getService().getOperations()) {
+ if (operation.getParameters() == null || operation.getParameters().size() <= 0) {
+ continue;
+ }
+ for (ServiceParameter parameter : operation.getParameters()) {
+ if (parameter.isBasicType() || parameter.getRefId().equals("object") || parameter.getModelId().equals("object")) {
+ continue;
+ }
+ SgModel sgModel = getModelProperty(parameter);
+ //判断eapi中是否已存在
+ long count =
+ eapiContent.getModels().stream()
+ .filter(x -> x.getId().equalsIgnoreCase(sgModel.getId()))
+ .count();
+ if (count <= 0) {
+ //判断本次models中是否已添加
+ if (!modelsIdsSet.contains(sgModel.getId())) {
+ models.add(sgModel);
+ modelsIdsSet.add(sgModel.getId());
+ }
+ }
+ }
+ }
+ return models;
+ }
+
+ private SgModel getModelProperty(ServiceParameter param) {
+ SgModel sgModel = new SgModel();
+ sgModel.setId(param.getRefId());
+ sgModel.setCode(param.getRefCode());
+ sgModel.setName(param.getRefName());
+ sgModel.setModelId(param.getModelId());
+ sgModel.setModelCode(param.getModelCode());
+ sgModel.setModelName(param.getModelName());
+ sgModel.setRelativePath(param.getRefPath());
+ sgModel.setFileName(param.getRefFileName());
+ sgModel.setModelType(param.getModelType());
+ return sgModel;
+ }
+
+ private ServiceDefine buildServiceDefine(GspMetadata vo) {
+ ServiceDefine serviceDefine = new ServiceDefine();
+ serviceDefine.setId(UUID.randomUUID().toString());
+ serviceDefine.setResourceId(vo.getHeader().getId());
+ serviceDefine.setResourceType(getResourceType(resourceType));
+ serviceDefine.setResourceCode(((GspViewModel) vo.getContent()).getGeneratedConfigID());
+ serviceDefine.setResourceName(vo.getHeader().getName());
+ serviceDefine.setOperations(new ArrayList<>());
+ switch (resourceType) {
+ case VO_ADVANCE:
+ serviceDefine.getOperations().addAll(ViewModelUtils.getAllOperations(vo));
+ break;
+ case VO_SIMPLE:
+ serviceDefine.getOperations().addAll(SimpleViewModelUtils.getAllOperations(vo));
+ break;
+ default:
+ throw new RuntimeException("不支持的资源类型:" + resourceType);
+ }
+ return serviceDefine;
+ }
+
+ private MetadataHeader buildEapiMetadataHeader(GspMetadata vo) {
+ MetadataHeader header = new MetadataHeader();
+ header.setId(UUID.randomUUID().toString());
+ header.setNameSpace(vo.getHeader().getNameSpace());
+ header.setCode(vo.getHeader().getCode());
+ header.setName(vo.getHeader().getName());
+ header.setExtendable(vo.getHeader().isExtendable());
+ if (StringUtils.isBlank(vo.getHeader().getBizobjectID())) {
+ throw new RuntimeException(String.format("VO元数据【%s(ID:%s)】的业务对象不能为空", vo.getHeader().getCode(), vo.getHeader().getId()));
+ }
+ header.setBizobjectID(vo.getHeader().getBizobjectID());
+ header.setType(EAPI_TYPE_NAME);
+
+ return header;
+ }
+
+ private GspMetadata buildEapiMetadataBaseInfo(GspMetadata vo, String path) {
+ GspMetadata metadata = new GspMetadata();
+ metadata.setHeader(new MetadataHeader());
+ metadata.getHeader().setNameSpace(vo.getHeader().getNameSpace());
+ metadata.getHeader().setCode(vo.getHeader().getCode());
+ metadata.getHeader().setName(vo.getHeader().getName());
+ metadata.getHeader().setExtendable(vo.getHeader().isExtendable());
+ if (StringUtils.isBlank(vo.getHeader().getBizobjectID())) {
+ throw new RuntimeException(String.format("VO元数据【%s(ID:%s)】的业务对象不能为空", vo.getHeader().getCode(), vo.getHeader().getId()));
+ }
+ metadata.getHeader().setBizobjectID(vo.getHeader().getBizobjectID());
+ metadata.getHeader().setType(EAPI_TYPE_NAME);
+ metadata.getHeader().setFileName(vo.getHeader().getCode() + EAPI_SUFFIX_NAME);
+ metadata.setRelativePath(getEapiRelativePath(path));
+
+ FileService fileService = SpringBeanUtils.getBean(FileService.class);
+ // 如果该路径上不存在api文件夹则直接创建新的api文件夹
+ if (!fileService.isDirectoryExist(metadata.getRelativePath())) {
+ fileService.createDirectory(metadata.getRelativePath());
+ }
+ return metadata;
+ }
+
+ private String getResourceType(ResourceType resourceType) {
+ switch (resourceType) {
+ case VO_ADVANCE:
+ return EAPI_RESOURCE_TYPE_VO;
+ case VO_SIMPLE:
+ return EAPI_RESOURCE_TYPE_VO_SIMPLE;
+ default:
+ throw new RuntimeException("不支持的资源类型:" + resourceType);
+ }
+ }
+
+ private String getEapiRelativePath(String path) {
+ MetadataProject metadataProject = MetadataUtils.getMetadataProject(path);
+ // 拼接eapi元数据路径:工程路径+eapi文件路径(/eapi)
+ return metadataProject.getProjectPath() + EAPI_PATH;
+ }
+
+}
diff --git a/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/config/EapiBeanConfig.java b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/config/EapiBeanConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7db59524f9f3dee849c37886d7b87e6effaf5f5
--- /dev/null
+++ b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/config/EapiBeanConfig.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright © OpenAtom Foundation.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.inspur.edp.sgf.dt.provider.config;
+
+import com.inspur.edp.sgf.dt.provider.service.SimpleViewModelProvider;
+import com.inspur.edp.sgf.dt.provider.service.ViewModelProvider;
+import com.inspur.edp.sgf.dt.spi.ResourceProvider;
+import io.iec.edp.caf.multicontext.annotation.BeanCollector;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 功能描述:
+ *
+ * @ClassName: EapiBeanConfig
+ * @Author: Fynn Qi
+ * @Date: 2021/1/22 9:28
+ * @Version: V1.0
+ */
+@Configuration(value = "com.inspur.edp.sgf.dt.provider.config.EapiBeanConfig", proxyBeanMethods = false)
+public class EapiBeanConfig {
+
+ @Bean("com.inspur.edp.sgf.dt.provider.service.ViewModelProvider")
+ @BeanCollector
+ public ResourceProvider viewModelProvider() {
+ return new ViewModelProvider();
+ }
+
+ @Bean("com.inspur.edp.sgf.dt.provider.service.SimpleViewModelProvider")
+ @BeanCollector
+ public ResourceProvider simpleViewModelProvider() {
+ return new SimpleViewModelProvider();
+ }
+
+}
diff --git a/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/SimpleViewModelProvider.java b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/SimpleViewModelProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..9352cd4a85a2d9ff9b2b791c7998257d3fcd89f1
--- /dev/null
+++ b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/SimpleViewModelProvider.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright © OpenAtom Foundation.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.inspur.edp.sgf.dt.provider.service;
+
+import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
+import com.inspur.edp.sgf.api.common.ResourceType;
+import com.inspur.edp.sgf.api.common.SummaryInfo;
+import com.inspur.edp.sgf.api.entity.ServiceOperation;
+import com.inspur.edp.sgf.dt.provider.common.EapiBuilder;
+import com.inspur.edp.sgf.dt.provider.utils.MetadataUtils;
+import com.inspur.edp.sgf.dt.spi.EapiProvider;
+import com.inspur.edp.sgf.dt.spi.ResourceProvider;
+import com.inspur.edp.sgf.provider.vo.utils.SimpleViewModelUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 功能描述: 经典型视图对象元数据设计时定义适配器
+ *
+ * @ClassName:SimpleViewModelProvider
+ * @Author: Fynn Qi
+ * @Date: 2020/8/31 15:29
+ * @Version: V1.0
+ */
+@EapiProvider(resourceType = "VO-Simple")
+public class SimpleViewModelProvider implements ResourceProvider {
+
+ @Override
+ public List getSummaryOperations(String resourceId) {
+ if (StringUtils.isBlank(resourceId)) {
+ throw new RuntimeException("外部服务获取服务操作概要信息的资源ID为空");
+ }
+ List summaryInfos = new ArrayList<>();
+ GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId);
+ summaryInfos.addAll(SimpleViewModelUtils.getAllSummaryOperations(metadata));
+ return summaryInfos;
+ }
+
+ @Override
+ public List getOperations(String resourceId) {
+ if (StringUtils.isBlank(resourceId)) {
+ throw new RuntimeException("外部服务获取服务操作的资源ID为空");
+ }
+ List operations = new ArrayList<>();
+ GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId);
+ operations.addAll(SimpleViewModelUtils.getAllOperations(metadata));
+ return operations;
+ }
+
+ @Override
+ public List getOperations(String resourceId, List operationIds) {
+ if (StringUtils.isBlank(resourceId)) {
+ throw new RuntimeException("外部服务获取服务操作的资源ID为空");
+ }
+ GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId);
+ List operations = new ArrayList<>();
+ operations.addAll(SimpleViewModelUtils.getAllOperations(metadata));
+ if (operationIds == null || operationIds.size() <= 0) {
+ return null;
+ }
+ // 返回过滤的服务操作
+ return operations.stream().filter(x -> operationIds.stream().anyMatch(id -> id.equals(x.getId()))).collect(Collectors.toList());
+ }
+
+ @Override
+ public GspMetadata create(GspMetadata metadata, String path) {
+ EapiBuilder builder = new EapiBuilder();
+ return builder.buildEapi(metadata, path, ResourceType.VO_SIMPLE);
+ }
+
+ @Override
+ public GspMetadata create(GspMetadata metadata) {
+ EapiBuilder builder = new EapiBuilder();
+ return builder.buildEapi(metadata, ResourceType.VO_SIMPLE);
+ }
+
+ @Override
+ public GspMetadata update(String eapiMetadataId, GspMetadata metadata) {
+ EapiBuilder builder = new EapiBuilder();
+ return builder.updateEapi(eapiMetadataId, metadata, ResourceType.VO_SIMPLE);
+ }
+}
diff --git a/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/ViewModelProvider.java b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/ViewModelProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..a18e8f1bdba9dfe8f66f42de57b27c08ed1c5660
--- /dev/null
+++ b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/service/ViewModelProvider.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright © OpenAtom Foundation.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.inspur.edp.sgf.dt.provider.service;
+
+import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
+import com.inspur.edp.sgf.api.common.ResourceType;
+import com.inspur.edp.sgf.api.common.SummaryInfo;
+import com.inspur.edp.sgf.api.entity.ServiceOperation;
+import com.inspur.edp.sgf.dt.provider.common.EapiBuilder;
+import com.inspur.edp.sgf.dt.provider.utils.MetadataUtils;
+import com.inspur.edp.sgf.dt.spi.EapiProvider;
+import com.inspur.edp.sgf.dt.spi.ResourceProvider;
+import com.inspur.edp.sgf.provider.vo.utils.ViewModelUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 功能描述: 高级型视图对象元数据设计时定义适配器
+ *
+ * @ClassName: ViewModelProvider
+ * @Author: Fynn Qi
+ * @Date:2020/2/3 10:21
+ * @Version: V1.0
+ */
+@EapiProvider(resourceType = "VO")
+public class ViewModelProvider implements ResourceProvider {
+
+ @Override
+ public List getSummaryOperations(String resourceId) {
+ GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId);
+ return ViewModelUtils.getAllSummaryOperations(metadata);
+ }
+
+ @Override
+ public List getOperations(String resourceId) {
+ GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId);
+ return ViewModelUtils.getAllOperations(metadata);
+ }
+
+ @Override
+ public List getOperations(String resourceId, List operationIds) {
+ GspMetadata metadata = MetadataUtils.getDtVoMetadata(resourceId);
+ List operations = ViewModelUtils.getAllOperations(metadata);
+ if (operationIds == null || operationIds.size() <= 0) {
+ return null;
+ }
+ // 返回过滤的服务操作
+ return operations.stream().filter(x -> operationIds.stream().anyMatch(id -> id.equals(x.getId()))).collect(Collectors.toList());
+ }
+
+ @Override
+ public GspMetadata create(GspMetadata metadata, String path) {
+ EapiBuilder builder = new EapiBuilder();
+ return builder.buildEapi(metadata, path, ResourceType.VO_ADVANCE);
+ }
+
+ @Override
+ public GspMetadata create(GspMetadata metadata) {
+ EapiBuilder builder = new EapiBuilder();
+ return builder.buildEapi(metadata, ResourceType.VO_ADVANCE);
+ }
+
+ @Override
+ public GspMetadata update(String eapiMetadataId, GspMetadata metadata) {
+ EapiBuilder builder = new EapiBuilder();
+ return builder.updateEapi(eapiMetadataId, metadata, ResourceType.VO_ADVANCE);
+ }
+
+}
diff --git a/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/utils/MetadataUtils.java b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/utils/MetadataUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..e8f4d63c7b589cda7551b6eac77e8f0d29aeaf8f
--- /dev/null
+++ b/rest-api-provider-dev/src/main/java/com/inspur/edp/sgf/dt/provider/utils/MetadataUtils.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright © OpenAtom Foundation.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.inspur.edp.sgf.dt.provider.utils;
+
+import com.inspur.edp.lcm.metadata.api.entity.GspMetadata;
+import com.inspur.edp.lcm.metadata.api.entity.GspProject;
+import com.inspur.edp.lcm.metadata.api.entity.MetadataProject;
+import com.inspur.edp.lcm.metadata.api.service.GspProjectService;
+import com.inspur.edp.lcm.metadata.api.service.MetadataProjectService;
+import com.inspur.edp.lcm.metadata.api.service.MetadataService;
+import com.inspur.edp.lcm.metadata.api.service.RefCommonService;
+import io.iec.edp.caf.businessobject.api.entity.DevBasicBoInfo;
+import io.iec.edp.caf.businessobject.api.service.DevBasicInfoService;
+import io.iec.edp.caf.commons.utils.SpringBeanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.Assert;
+
+import java.io.IOException;
+
+/** 功能描述: @ClassName: MetadataUtils @Author: Fynn Qi @Date: 2020/9/1 14:15 @Version: V1.0 */
+public class MetadataUtils {
+
+ public static GspMetadata getDtVoMetadata(String resourceId) {
+ if (StringUtils.isBlank(resourceId)) {
+ throw new RuntimeException("外部服务获取解析的资源ID为空");
+ }
+ if(resourceId.contains("##")){
+ String[] temps=resourceId.split("##");
+ MetadataService service = SpringBeanUtils.getBean(MetadataService.class);
+ return service.getRefMetadata(temps[1],temps[0]);
+ }
+ else{
+ RefCommonService service = SpringBeanUtils.getBean(RefCommonService.class);
+ return service.getRefMetadata(resourceId);
+ }
+ }
+
+ public static MetadataProject getMetadataProject(String path) {
+ MetadataProjectService service = SpringBeanUtils.getBean(MetadataProjectService.class);
+ if (service == null) {
+ throw new RuntimeException("获取MetadataProjectService Bean为空");
+ }
+ MetadataProject projectInfo = service.getMetadataProjInfo(path);
+ if (projectInfo == null) {
+ throw new RuntimeException(String.format("根据相对路径【%s】获取元数据工程信息为空!", path));
+ }
+ return projectInfo;
+ }
+
+ public static GspProject getProjectInfo(GspMetadata metadata) {
+ if (StringUtils.isBlank(metadata.getRelativePath())) {
+ throw new RuntimeException(
+ String.format(
+ "元数据【%s(ID:%s)】的相对路径为空,无法获取工程信息!",
+ metadata.getHeader().getCode(), metadata.getHeader().getId()));
+ }
+ GspProjectService service = SpringBeanUtils.getBean(GspProjectService.class);
+ if (service == null) {
+ throw new RuntimeException("获取MetadataProjectService Bean为空");
+ }
+ GspProject projectInfo = null;
+ try {
+ projectInfo = service.getGspProjectInfo(metadata.getRelativePath());
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ if (projectInfo == null) {
+ throw new RuntimeException(
+ String.format(
+ "元数据【%s(ID:%s)】根据相对路径【%s】获取工程信息为空!",
+ metadata.getHeader().getCode(),
+ metadata.getHeader().getId(),
+ metadata.getRelativePath()));
+ }
+ return projectInfo;
+ }
+
+ public static DevBasicBoInfo getDevBasicBoInfo(String bizId) {
+ DevBasicInfoService devBasicInfoService = SpringBeanUtils.getBean(DevBasicInfoService.class);
+ DevBasicBoInfo devBasicBoInfo = devBasicInfoService.getDevBasicBoInfo(bizId);
+ Assert.notNull(devBasicBoInfo, String.format("根据业务对象ID[%s]获取的DevBasicBoInfo为空", bizId));
+ if (StringUtils.isBlank(devBasicBoInfo.getAppCode())) {
+ throw new RuntimeException(String.format("根据业务对象ID[%s]获取的DevBasicBoInfo为的AppCode为空", bizId));
+ }
+ if (StringUtils.isBlank(devBasicBoInfo.getSuCode())) {
+ throw new RuntimeException(String.format("根据业务对象ID[%s]获取的DevBasicBoInfo为的SuCode为空", bizId));
+ }
+ return devBasicBoInfo;
+ }
+}
diff --git a/rest-api-provider-dev/src/main/resources/META-INF/spring.factories b/rest-api-provider-dev/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000000000000000000000000000000000000..80ae747fa2bed590e3e3c1dca9eaf795c681e5e6
--- /dev/null
+++ b/rest-api-provider-dev/src/main/resources/META-INF/spring.factories
@@ -0,0 +1 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.inspur.edp.sgf.dt.provider.config.EapiBeanConfig
\ No newline at end of file