From 754e1e8b17dde491e4dae23ba7a381183029351d Mon Sep 17 00:00:00 2001 From: wangshaoping Date: Thu, 19 Jun 2025 18:08:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=A0=B8=E5=BF=83=E5=8F=91?= =?UTF-8?q?=E5=B8=83:=208.2.80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 基础框架发布: 8.2.18 1) 规则引擎中,增加模型和子模型的导入导出功能 --- .../src/i18n/messages.json | 1 + .../src/i18n/messages_tw_CN.json | 1 + .../src/i18n/messages_zh_CN.json | 1 + .../resources/designer/ImportModelDialog.vue | 74 +++++++++++++++++++ .../src/views/resources/designer/Model.vue | 30 +++++++- .../model/controller/ModelWebController.java | 56 ++++++++++++++ .../server/model/service/ModelService.java | 19 +++++ .../model/service/impl/ModelServiceImpl.java | 28 ++++++- .../controller/ResourceWebController.java | 2 +- .../service/support/chat/ChatCallback.java | 5 +- 10 files changed, 210 insertions(+), 7 deletions(-) create mode 100644 io.sc.engine.rule.frontend/src/views/resources/designer/ImportModelDialog.vue 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