diff --git a/io.sc.engine.rule.frontend/src/i18n/messages.json b/io.sc.engine.rule.frontend/src/i18n/messages.json
index 46c27f79..72b59084 100644
--- a/io.sc.engine.rule.frontend/src/i18n/messages.json
+++ b/io.sc.engine.rule.frontend/src/i18n/messages.json
@@ -53,6 +53,7 @@
"re.model.grid.toolbar.generateGroovySourceCode": "Generate Script Code",
"re.model.grid.entity.resource": "Resource",
"re.model.grid.entity.executeMode": "Execute Mode",
+ "re.model.dialog.import.title": "Import Sub Model",
"re.parameter.grid.title": "Parameter List",
"re.parameter.grid.toolbar.move": "Move",
diff --git a/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json b/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
index 37c816f1..feb89510 100644
--- a/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
+++ b/io.sc.engine.rule.frontend/src/i18n/messages_tw_CN.json
@@ -53,6 +53,7 @@
"re.model.grid.toolbar.generateGroovySourceCode": "生成腳本代碼",
"re.model.grid.entity.resource": "資源",
"re.model.grid.entity.executeMode": "執行模式",
+ "re.model.dialog.import.title": "導入子模型",
"re.parameter.grid.title": "參數列表",
"re.parameter.grid.toolbar.move": "移動",
diff --git a/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json b/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
index 036cfec1..b7b50122 100644
--- a/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
+++ b/io.sc.engine.rule.frontend/src/i18n/messages_zh_CN.json
@@ -53,6 +53,7 @@
"re.model.grid.toolbar.generateGroovySourceCode": "生成脚本代码",
"re.model.grid.entity.resource": "资源",
"re.model.grid.entity.executeMode": "执行模式",
+ "re.model.dialog.import.title": "导入子模型",
"re.parameter.grid.title": "参数列表",
"re.parameter.grid.toolbar.move": "移动",
diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/ImportModelDialog.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/ImportModelDialog.vue
new file mode 100644
index 00000000..acdf6352
--- /dev/null
+++ b/io.sc.engine.rule.frontend/src/views/resources/designer/ImportModelDialog.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
diff --git a/io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue b/io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue
index 4b3a0b78..8f3779b8 100644
--- a/io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue
+++ b/io.sc.engine.rule.frontend/src/views/resources/designer/Model.vue
@@ -82,7 +82,26 @@
'separator',
'view',
'separator',
- 'export',
+ {
+ name: 'import',
+ label: $t('import'),
+ icon: 'file_upload',
+ enableIf: (args: any) => {
+ return args.selected;
+ },
+ click: (args: any) => {
+ importDialogRef.open(args.selected.id);
+ },
+ },
+ {
+ extend: 'export',
+ enableIf: (args: any) => {
+ return args.selected;
+ },
+ click: (args: any) => {
+ Downloader.get(Environment.apiContextPath('/api/re/model/export/' + args.selected.id), { loading: true });
+ },
+ },
]"
:columns="[
{ width: 220, name: 'name', label: $t('name'), sortable: false },
@@ -163,14 +182,16 @@
:source-code-url="Environment.apiContextPath('/api/re/executable/generateGroovySourceCode/' + resource.id)"
:validate-url="Environment.apiContextPath('/api/re/executable/validateGroovySourceCode')"
>
+
diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ModelWebController.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ModelWebController.java
index 7c64301a..8d823691 100644
--- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ModelWebController.java
+++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/controller/ModelWebController.java
@@ -1,17 +1,33 @@
package io.sc.engine.rule.server.model.controller;
import io.sc.engine.rule.core.ModelAbstract;
+import io.sc.engine.rule.core.po.model.Model;
+import io.sc.engine.rule.core.po.resource.Resource;
+import io.sc.engine.rule.server.model.converter.ModelEntityConverter;
import io.sc.engine.rule.server.model.entity.ModelEntity;
import io.sc.engine.rule.server.model.repository.ModelRepository;
import io.sc.engine.rule.server.model.service.ModelService;
import io.sc.engine.rule.server.model.vo.ModelVo;
+import io.sc.engine.rule.server.resource.controller.ResourceWebController;
+import io.sc.engine.rule.server.resource.converter.ResourceEntityConverter;
+import io.sc.platform.core.annotation.IgnoreResponseBodyAdvice;
import io.sc.platform.mvc.controller.support.RestCrudController;
+import io.sc.platform.mvc.support.FileDownloader;
+import io.sc.platform.util.ObjectMapperUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Locale;
/**
* 模型 Controller
@@ -19,6 +35,7 @@ import java.util.List;
@RestController("io.sc.engine.rule.server.model.controller.ModelWebController")
@RequestMapping("/api/re/model")
public class ModelWebController extends RestCrudController {
+ private static final Logger log = LoggerFactory.getLogger(ModelWebController.class);
@GetMapping("findModelWithSubModelsByResourceId")
protected List findModelWithSubModelsByResourceId(@RequestParam(name="resourceId") String resourceId) throws Exception {
@@ -43,4 +60,43 @@ public class ModelWebController extends RestCrudController findModelByParentIdAndCodeOrName(String parentId,String code,String name);
+
+ /**
+ * 导入模型或子模型
+ * @param targetModelId 目标模型ID
+ * @param model 模型或子模型对象
+ * @throws Exception 违例
+ */
+ public void imports(String targetModelId, Model model) throws Exception;
+
+ /**
+ * 导出指定的模型或子模型
+ * @param id 模型或子模型ID
+ * @return 模型或子模型 PO 对象
+ * @throws Exception 违例
+ */
+ public Model exports(String id) throws Exception;
}
diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ModelServiceImpl.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ModelServiceImpl.java
index b4a3d65e..fb9c5e95 100644
--- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ModelServiceImpl.java
+++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/model/service/impl/ModelServiceImpl.java
@@ -1,6 +1,9 @@
package io.sc.engine.rule.server.model.service.impl;
import io.sc.engine.rule.core.ModelAbstract;
+import io.sc.engine.rule.core.po.model.Model;
+import io.sc.engine.rule.core.po.resource.Resource;
+import io.sc.engine.rule.server.model.converter.ModelEntityConverter;
import io.sc.engine.rule.server.model.entity.ModelEntity;
import io.sc.engine.rule.server.model.entity.ParameterEntity;
import io.sc.engine.rule.server.model.exception.ModelEntityAlreadyExistsException;
@@ -9,6 +12,7 @@ import io.sc.engine.rule.server.model.repository.ModelRepository;
import io.sc.engine.rule.server.model.service.ModelService;
import io.sc.engine.rule.server.model.service.support.ModelEntityChangedEvent;
import io.sc.engine.rule.server.model.vo.ModelVo;
+import io.sc.engine.rule.server.resource.converter.ResourceEntityConverter;
import io.sc.engine.rule.server.resource.entity.ResourceEntity;
import io.sc.platform.orm.entity.support.EntityChangedEventType;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
@@ -290,7 +294,29 @@ public class ModelServiceImpl extends DaoServiceImpl result) {
+ @Override
+ @Transactional
+ public void imports(String targetModelId, Model model) throws Exception {
+ if(StringUtils.hasText(targetModelId) && model!=null){
+ ModelEntity targetEntity =findById(targetModelId);
+ ModelEntity subModelEntity =ModelEntityConverter.fromPo(model);
+ subModelEntity.clearId();
+ subModelEntity.setParent(targetEntity);
+ repository.save(subModelEntity);
+ }
+ }
+
+ @Override
+ public Model exports(String id) throws Exception {
+ ModelEntity entity =findById(id);
+ if(entity!=null) {
+ Model po = ModelEntityConverter.toPo(entity);
+ return po;
+ }
+ return null;
+ }
+
+ private void recursiveGetSubModels(ModelEntity model, List result) {
if(model!=null) {
List models =model.getChildren();
if(models!=null && models.size()>0) {
diff --git a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/controller/ResourceWebController.java b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/controller/ResourceWebController.java
index dabc08f5..904f1774 100644
--- a/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/controller/ResourceWebController.java
+++ b/io.sc.engine.rule.server/src/main/java/io/sc/engine/rule/server/resource/controller/ResourceWebController.java
@@ -236,7 +236,7 @@ public class ResourceWebController extends RestCrudController