From 3398f0474b8dd223e2cf8e6133b18a907cb8ba8c Mon Sep 17 00:00:00 2001 From: lijiangkun Date: Mon, 25 Aug 2025 11:11:11 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E9=9B=B6=E4=BB=A3=E7=A0=81=E5=8F=91?= =?UTF-8?q?=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zerocode/ZeroCodeServiceImpl.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/web-frontendproject/src/main/java/com/inspur/edp/web/frontendproject/zerocode/ZeroCodeServiceImpl.java b/web-frontendproject/src/main/java/com/inspur/edp/web/frontendproject/zerocode/ZeroCodeServiceImpl.java index 945b93ed..07d31816 100644 --- a/web-frontendproject/src/main/java/com/inspur/edp/web/frontendproject/zerocode/ZeroCodeServiceImpl.java +++ b/web-frontendproject/src/main/java/com/inspur/edp/web/frontendproject/zerocode/ZeroCodeServiceImpl.java @@ -18,6 +18,9 @@ package com.inspur.edp.web.frontendproject.zerocode; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.inspur.edp.lcm.metadata.api.entity.FrameWorkTypeEnum; +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.lcm.metadata.api.entity.MetadataProperties; import com.inspur.edp.web.common.JITEngineConstants; import com.inspur.edp.web.common.io.FileUtility; import com.inspur.edp.web.common.logger.WebLogger; @@ -95,6 +98,10 @@ public class ZeroCodeServiceImpl implements ZeroCodeService { @Override public void resolveBuild(ZeroCodeParameter zeroCodeParameter) { prepareOperate(zeroCodeParameter); + if(isVueForm(zeroCodeParameter)){ + resolveVueForm(zeroCodeParameter); + return; + } // if (zeroCodeParameter.xxx) { List formParameters = zeroCodeParameter.getFormParameters(); List formatsForm = formParameters.stream().filter(form -> !form.getFormFormatList().isEmpty() && !form.isMobile()).collect(Collectors.toList()); @@ -179,6 +186,24 @@ public class ZeroCodeServiceImpl implements ZeroCodeService { } } + private void resolveVueForm(ZeroCodeParameter zeroCodeParameter) { + ZeroCodeManager.getInstance().saveZeroCodeParameterMetadataIntoJson(zeroCodeParameter); + + } + + private boolean isVueForm(ZeroCodeParameter zeroCodeParameter) { + if(zeroCodeParameter.getFormParameters().isEmpty()){ + return false; + } + + List formParameters = zeroCodeParameter.getFormParameters().stream().filter(form -> { + MetadataProperties properties = form.getMetadata().getProperties(); + return properties != null && properties.getFramework() == FrameWorkTypeEnum.Vue; + }).collect(Collectors.toList()); + + return !formParameters.isEmpty(); + } + private static void mergeAndDeduplicate(JSONArray jsonArray, Set uniqueKeys, JSONArray mergedArray) { if (jsonArray != null) { for (int i = 0; i < jsonArray.size(); i++) { -- Gitee From 6d4a98dd26546a5e87fc4fb92efab2a72410e5c7 Mon Sep 17 00:00:00 2001 From: Wang Jason Date: Thu, 25 Sep 2025 17:36:09 +0800 Subject: [PATCH 02/15] Merge remote-tracking branch 'origin/main' into dev-i18n-fix --- .../api/webservice/DesignSchemaWebService.java | 7 +++++-- .../webservice/DesignSchemaWebServiceImpl.java | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java b/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java index 88dfc723..86adb354 100644 --- a/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java +++ b/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java @@ -34,13 +34,16 @@ public interface DesignSchemaWebService /** * 创建designschema + * * @param content * @return */ @POST @Path("/create") - @Consumes({MediaType.APPLICATION_JSON,MediaType.TEXT_PLAIN}) - String CreateDesignSchema(JSONObject content); + @Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN}) + default String CreateDesignSchema(JSONObject content) { + return null; + } @POST @Path("/createByScene") diff --git a/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java b/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java index 6f05c3a2..e9b5b9e3 100644 --- a/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java +++ b/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java @@ -60,8 +60,8 @@ public class DesignSchemaWebServiceImpl implements DesignSchemaWebService { SchemaBuilder schemaBuilder = new SchemaBuilder(); Schema schema = schemaBuilder.buildWithScene(vm, scene, isRuntime); - - return SerializeUtility.getInstance().valueToJson(schema, PropertyNamingStrategy.LOWER_CAMEL_CASE).toString(); + String result=SerializeUtility.getInstance().valueToJson(schema, PropertyNamingStrategy.LOWER_CAMEL_CASE).toString(); + return result; } catch (WebCustomException e) { WebLogger.Instance.error(e, DesignSchemaWebServiceImpl.class.getName()); throw e; -- Gitee From 9e0dfde4d2ef29f2a6927f105d10f70afa5cf0f8 Mon Sep 17 00:00:00 2001 From: Wang Jason Date: Thu, 25 Sep 2025 17:36:09 +0800 Subject: [PATCH 03/15] Merge remote-tracking branch 'origin/main' into dev-i18n-fix --- .../api/webservice/DesignSchemaWebService.java | 7 +++++-- .../webservice/DesignSchemaWebServiceImpl.java | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java b/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java index 88dfc723..86adb354 100644 --- a/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java +++ b/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java @@ -34,13 +34,16 @@ public interface DesignSchemaWebService /** * 创建designschema + * * @param content * @return */ @POST @Path("/create") - @Consumes({MediaType.APPLICATION_JSON,MediaType.TEXT_PLAIN}) - String CreateDesignSchema(JSONObject content); + @Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN}) + default String CreateDesignSchema(JSONObject content) { + return null; + } @POST @Path("/createByScene") diff --git a/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java b/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java index 6f05c3a2..e9b5b9e3 100644 --- a/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java +++ b/web-designschema/src/main/java/com/inspur/edp/web/designschema/webservice/DesignSchemaWebServiceImpl.java @@ -60,8 +60,8 @@ public class DesignSchemaWebServiceImpl implements DesignSchemaWebService { SchemaBuilder schemaBuilder = new SchemaBuilder(); Schema schema = schemaBuilder.buildWithScene(vm, scene, isRuntime); - - return SerializeUtility.getInstance().valueToJson(schema, PropertyNamingStrategy.LOWER_CAMEL_CASE).toString(); + String result=SerializeUtility.getInstance().valueToJson(schema, PropertyNamingStrategy.LOWER_CAMEL_CASE).toString(); + return result; } catch (WebCustomException e) { WebLogger.Instance.error(e, DesignSchemaWebServiceImpl.class.getName()); throw e; -- Gitee From b2636e21e2ed2c248d26280abee5ee3c411d24a5 Mon Sep 17 00:00:00 2001 From: Wang Jason Date: Sun, 28 Sep 2025 09:43:46 +0800 Subject: [PATCH 04/15] Merge remote-tracking branch 'origin/main' into dev-i18n-fix --- .../designschema/api/webservice/DesignSchemaWebService.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java b/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java index 86adb354..c09c0d61 100644 --- a/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java +++ b/web-designschema-api/src/main/java/com/inspur/edp/web/designschema/api/webservice/DesignSchemaWebService.java @@ -40,10 +40,8 @@ public interface DesignSchemaWebService */ @POST @Path("/create") - @Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN}) - default String CreateDesignSchema(JSONObject content) { - return null; - } + @Consumes({MediaType.APPLICATION_JSON,MediaType.TEXT_PLAIN}) + String CreateDesignSchema(JSONObject content); @POST @Path("/createByScene") -- Gitee From 9522eb08d6732304964ac4d98bb2dcf6830c0175 Mon Sep 17 00:00:00 2001 From: lorcan <13231947+lorcan-lv@user.noreply.gitee.com> Date: Fri, 12 Dec 2025 15:40:20 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E6=8A=BD=E5=B1=89=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E8=B5=84=E6=BA=90=E5=85=83=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../i18nresourcestrategy/VueDrawerI18nResourceStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/VueDrawerI18nResourceStrategy.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/VueDrawerI18nResourceStrategy.java index f63070e2..e5284e55 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/VueDrawerI18nResourceStrategy.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/VueDrawerI18nResourceStrategy.java @@ -13,7 +13,7 @@ import java.util.List; public class VueDrawerI18nResourceStrategy extends AbstractI18nResourceStrategy { @Override protected String getComponentName(HashMap component) { - IComponentNameStrategy componentNameStrategy = ComponentNameFactory.getInstance().creatComponentNameStrategy(ComponentNameType.TEXT); + IComponentNameStrategy componentNameStrategy = ComponentNameFactory.getInstance().creatComponentNameStrategy(ComponentNameType.TITLE); if (componentNameStrategy == null) { return null; } -- Gitee From 85142633bf079646278412159ae826ff95b40043 Mon Sep 17 00:00:00 2001 From: lorcan <13231947+lorcan-lv@user.noreply.gitee.com> Date: Thu, 8 Jan 2026 10:34:40 +0800 Subject: [PATCH 06/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8A=9B=E5=87=BA?= =?UTF-8?q?=E5=8E=9F=E7=94=9F=E5=BC=82=E5=B8=B8=E5=8E=86=E5=8F=B2=E9=81=97?= =?UTF-8?q?=E7=95=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/formmetadata/filter/LowCodeLanguagePackageFilter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/filter/LowCodeLanguagePackageFilter.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/filter/LowCodeLanguagePackageFilter.java index d3f06141..abf0631c 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/filter/LowCodeLanguagePackageFilter.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/filter/LowCodeLanguagePackageFilter.java @@ -30,6 +30,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.inspur.edp.web.common.customexception.WebCustomException; import io.iec.edp.caf.boot.context.CAFContext; import io.iec.edp.caf.commons.exception.CAFRuntimeException; import io.iec.edp.caf.commons.utils.SpringBeanUtils; @@ -299,7 +300,7 @@ public class LowCodeLanguagePackageFilter extends OncePerRequestFilter { JsonNode mergedJsonNodes = mergeJsonNodes(originalJson, uiLanguagePackageJson); return objectMapper.writeValueAsString(mergedJsonNodes); } catch (JsonProcessingException e) { - throw new CAFRuntimeException("pfcommon", "", "", e); // todo: 换成多语的抛异常方式。 + throw new WebCustomException(e); // todo: 换成多语的抛异常方式。 } } -- Gitee From 08427b601edff9e3f000ca69567d34257687eada Mon Sep 17 00:00:00 2001 From: lorcan <13231947+lorcan-lv@user.noreply.gitee.com> Date: Thu, 8 Jan 2026 10:35:06 +0800 Subject: [PATCH 07/15] =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=93=8D=E4=BD=9C=E5=88=97=E8=B5=84=E6=BA=90=E9=A1=B9?= =?UTF-8?q?=E6=8F=90=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataGridI18nResourceStrategy.java | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/DataGridI18nResourceStrategy.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/DataGridI18nResourceStrategy.java index 79cb8f6f..c0686795 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/DataGridI18nResourceStrategy.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/DataGridI18nResourceStrategy.java @@ -23,6 +23,7 @@ import com.inspur.edp.web.formmetadata.i18n.I18nResourceItemManager; import com.inspur.edp.web.formmetadata.i18n.component.ComponentUtility; import com.inspur.edp.web.formmetadata.i18n.component.strategy.i18nresourcestrategy.CommonStrategy.GridCommonStrategy; import com.inspur.edp.web.formmetadata.i18n.constant.I18nResourceConstant; +import jodd.util.ObjectUtil; import java.util.ArrayList; import java.util.HashMap; @@ -72,22 +73,40 @@ public class DataGridI18nResourceStrategy extends GridCommonStrategy { } //提取columns里的行内容 - if(currentComponent.containsKey("columns")){ - I18nResourceItemCollection columnsI18nResourceItemCollection=extractedColumns( i18nResourceItemBaseId, currentComponent); + if (currentComponent.containsKey("columns")) { + I18nResourceItemCollection columnsI18nResourceItemCollection = extractedColumns(i18nResourceItemBaseId, currentComponent); if (columnsI18nResourceItemCollection != null && columnsI18nResourceItemCollection.size() > 0) { i18nResourceItemCollection.addRange(columnsI18nResourceItemCollection); } } //提取handing内的行号值 - if(currentComponent.containsKey("rowNumber")){ + if (currentComponent.containsKey("rowNumber")) { String currentComponentType = ComponentUtility.getInstance().getType(currentComponent); String currentComponentId = ComponentUtility.getInstance().getId(currentComponent); - HashMaprowNumber= (HashMap) currentComponent.get("rowNumber"); - String heading= (String) rowNumber.get("heading"); - String generatedComponentId = currentComponentId + "/rowNumber/heading"; + HashMap rowNumber = (HashMap) currentComponent.get("rowNumber"); + String heading = (String) rowNumber.get("heading"); + String generatedComponentId = currentComponentId + "/rowNumber/heading"; I18nResourceItem footerButtonI18nResourceItem = I18nResourceItemManager.createI18nResourceItem(i18nResourceItemBaseId, generatedComponentId, heading, heading); this.addInCollection(i18nResourceItemCollection, footerButtonI18nResourceItem); } + //提取command + if (currentComponent.containsKey("command")) { + String currentComponentId = ComponentUtility.getInstance().getId(currentComponent); + HashMap command = (HashMap) currentComponent.get("command"); + if (command.containsKey("commands")) { + List> commands = (List>) command.get("commands"); + if(command.containsKey("enableType") && "custom".equals((String) command.get("enableType"))){ + commands.forEach(cmd -> { + if (cmd.get("value") == null || StringUtility.isNullOrEmpty((String) cmd.get("value"))) { + return; + } + String generatedComponentId = currentComponentId + "/command/commands/" + (String) cmd.get("value"); + I18nResourceItem footerButtonI18nResourceItem = I18nResourceItemManager.createI18nResourceItem(i18nResourceItemBaseId, generatedComponentId, (String) cmd.get("text"), (String) cmd.get("text")); + this.addInCollection(i18nResourceItemCollection, footerButtonI18nResourceItem); + }); + } + } + } return i18nResourceItemCollection; } -- Gitee From ab44de413b3d7a8e327a25450535c98c4ffdda15 Mon Sep 17 00:00:00 2001 From: lorcan <13231947+lorcan-lv@user.noreply.gitee.com> Date: Thu, 29 Jan 2026 16:35:07 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BD=8E=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=BA=94=E7=94=A8=E5=A4=8D=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + web-metadata-replication-core/pom.xml | 166 +++ .../config/WebReplicationConfiguration.java | 44 + .../formmetadata/FormCopyCommonUtility.java | 988 ++++++++++++++++++ .../formmetadata/FormMetadataCopyImpl.java | 33 + .../FormMetadataReferenceCollect.java | 258 +++++ .../MobileFormMetadataCopyImpl.java | 30 + .../MobilePageFlowCopyImpl.java | 28 + .../PageFlowCopyCommonUtility.java | 138 +++ .../pageflowmetadata/PageFlowCopyImpl.java | 27 + .../main/resources/META-INF/spring.factories | 2 + 11 files changed, 1715 insertions(+) create mode 100644 web-metadata-replication-core/pom.xml create mode 100644 web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/config/WebReplicationConfiguration.java create mode 100644 web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormCopyCommonUtility.java create mode 100644 web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormMetadataCopyImpl.java create mode 100644 web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormMetadataReferenceCollect.java create mode 100644 web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/MobileFormMetadataCopyImpl.java create mode 100644 web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/MobilePageFlowCopyImpl.java create mode 100644 web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/PageFlowCopyCommonUtility.java create mode 100644 web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/PageFlowCopyImpl.java create mode 100644 web-metadata-replication-core/src/main/resources/META-INF/spring.factories diff --git a/pom.xml b/pom.xml index d9f87fe9..0cfcc4bd 100644 --- a/pom.xml +++ b/pom.xml @@ -60,6 +60,7 @@ form-process web-formmetadata-relycheck + web-metadata-replication-core diff --git a/web-metadata-replication-core/pom.xml b/web-metadata-replication-core/pom.xml new file mode 100644 index 00000000..97119253 --- /dev/null +++ b/web-metadata-replication-core/pom.xml @@ -0,0 +1,166 @@ + + + 4.0.0 + + com.inspur.edp + web + 1.0.2-SNAPSHOT + + + web-metadata-replication-core + + + 8 + 8 + UTF-8 + + + + io.iec.edp + caf-application-context-api + + + com.inspur.edp + metadata-service-dev-api + + + + com.inspur.edp + metadata-service-api + ${version.metadata} + + + com.inspur.edp + metadata-service-spi + + + io.iec.edp + caf-i18n-framework-api + + + io.iec.edp + caf-i18n-api + + + com.inspur.edp + i18n-resource-api + + + com.inspur.edp + lcm-metadata-api + + + + + com.inspur.edp + metadata-common + + + com.inspur.edp + lcm-metadata-api + + + + + com.inspur.edp + web-jitengine-common + + + com.inspur.edp + cdp-sgf-api + + + com.inspur.edp + web-jitengine-formmetadata + + + com.inspur.edp + web-pageflow-metadata + + + org.junit.jupiter + junit-jupiter-api + + + + io.iec.edp + caf-framework-licservice-api + + + com.inspur.edp + web-tsfile-api + + + com.inspur.edp + lcm-metadata-api + + + + + io.iec.edp + caf-boot-starter-context + compile + + + + + + + + io.iec.edp + caf-boot-core-context + compile + + + com.inspur.edp + view-object-api + 0.1.3 + + + com.inspur.edp + view-object-model + + + com.inspur.edp + view-object-manager + + + com.inspur.edp + wf-bizprocess-api + 0.3.2 + + + com.inspur.edp + lcm-metadata-api + + + + + com.inspur.edp + runtime-customize-api + + + com.inspur.edp + lcm-metadata-api + + + + + com.inspur.edp + runtime-customize-form + + + com.inspur.edp + lcm-replication-api + 1.0.0-rc.3 + + + com.inspur.edp + lcm-replication-spi + 1.0.0-rc.3 + + + + diff --git a/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/config/WebReplicationConfiguration.java b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/config/WebReplicationConfiguration.java new file mode 100644 index 00000000..4bfcd0ef --- /dev/null +++ b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/config/WebReplicationConfiguration.java @@ -0,0 +1,44 @@ +package com.inspur.edp.web.appcopy.config; + + +import com.inspur.edp.lcm.replication.spi.MetadataCopySpi; +import com.inspur.edp.lcm.replication.spi.MetadataReferenceCollectSpi; +import com.inspur.edp.web.appcopy.formmetadata.FormMetadataCopyImpl; +import com.inspur.edp.web.appcopy.formmetadata.FormMetadataReferenceCollect; +import com.inspur.edp.web.appcopy.formmetadata.MobileFormMetadataCopyImpl; +import com.inspur.edp.web.appcopy.pageflowmetadata.MobilePageFlowCopyImpl; +import com.inspur.edp.web.appcopy.pageflowmetadata.PageFlowCopyImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration("com.inspur.edp.web.appcopy.config.WebReplicationConfiguration") +public class WebReplicationConfiguration { + + + @Bean + public MetadataCopySpi getPageFlowMetadataCopySpi() { + return new PageFlowCopyImpl(); + } + + @Bean + public MetadataCopySpi getMobilePageFlowMetadataCopySpi() { + return new MobilePageFlowCopyImpl(); + } + + + @Bean + public MetadataCopySpi getFormMetadataCopy() { + return new FormMetadataCopyImpl(); + } + + @Bean + public MetadataCopySpi getMobileFormMetadataCopy() { + return new MobileFormMetadataCopyImpl(); + } + + @Bean + public MetadataReferenceCollectSpi getFormMetadataReferenceCollect() { + return new FormMetadataReferenceCollect(); + } +} + diff --git a/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormCopyCommonUtility.java b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormCopyCommonUtility.java new file mode 100644 index 00000000..20dc824c --- /dev/null +++ b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormCopyCommonUtility.java @@ -0,0 +1,988 @@ +package com.inspur.edp.web.appcopy.formmetadata; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +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.MetadataDto; +import com.inspur.edp.lcm.metadata.common.MetadataDtoConverter; +import com.inspur.edp.lcm.replication.api.context.ReplicationServiceContext; +import com.inspur.edp.lcm.replication.api.entity.ReplicationParam; +import com.inspur.edp.sgf.api.entity.SgMetadata; +import com.inspur.edp.web.common.customexception.WebCustomException; +import com.inspur.edp.web.common.logger.WebLogger; +import com.inspur.edp.web.common.utility.StringUtility; +import com.inspur.edp.web.formmetadata.metadata.FormMetadataContent; +import io.iec.edp.caf.common.JSONSerializer; + +import java.nio.file.Paths; +import java.util.*; + +public class FormCopyCommonUtility { + + public static void updateFormContent(ReplicationParam replicationParam, GspMetadata formMetadata, + ReplicationServiceContext replicationServiceContext) { + FormMetadataContent formMetadataContent = (FormMetadataContent) formMetadata.getContent(); + updateProjectNameAndMetadataId(formMetadataContent, replicationParam, replicationServiceContext); + updateFormByEapi(formMetadataContent, replicationServiceContext); + updateFormByVo(formMetadataContent, replicationServiceContext, replicationParam); + updateFormByStateMachines(formMetadataContent, replicationServiceContext); + updateFormByExternalComponents(formMetadataContent, replicationServiceContext, replicationParam); + updateFormOptions(formMetadataContent, replicationServiceContext); + updateFormControllerCommandParam(formMetadataContent, replicationServiceContext); + updateComponentHelpId(formMetadataContent, replicationServiceContext, replicationParam); + updateCommunications(formMetadataContent, replicationServiceContext); + updateActionsNode(formMetadataContent, replicationServiceContext); + FormMetadataContent updateParamFormMdContent = updateDataIEOrWFCommand(formMetadataContent, replicationServiceContext); + FormMetadataContent formMdContent = updateFormByWebCommands(updateParamFormMdContent, replicationServiceContext, replicationParam); + updateQoInfo(formMdContent, replicationServiceContext, replicationParam, formMetadata); + formMetadata.setContent(formMdContent); + } + + private static void updateCommunications(FormMetadataContent formMetadataContent, ReplicationServiceContext replicationServiceContext) { + JsonNode module = formMetadataContent.getModule(); + if (module == null || module.isMissingNode() || module.isNull()) { + return; + } + JsonNode communications = module.get("communications"); + if (isNullOrEmptyNode(communications)) { + return; + } + communications.forEach(communication -> { + if (!isNullOrEmptyNode(communication.at("/source/formId")) && + !StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(communication.at("/source/formId").asText()))) { + ObjectNode source = (ObjectNode) communication.get("source"); + source.put("formId", replicationServiceContext.findNewUUID(source.get("formId").asText())); + } + if (!isNullOrEmptyNode(communication.at("/target/formId")) && + !StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(communication.at("/target/formId").asText()))) { + ObjectNode target = (ObjectNode) communication.get("target"); + target.put("formId", replicationServiceContext.findNewUUID(target.get("formId").asText())); + } + }); + + } + + private static void updateQoInfo(FormMetadataContent formMdContent, ReplicationServiceContext replicationServiceContext, ReplicationParam replicationParam, GspMetadata formMetadata) { + JsonNode module = formMdContent.getModule(); + if (module == null || module.isMissingNode() || module.isNull()) { + return; + } + JsonNode qoInfo = module.get("qdpInfo"); + if (isNullOrEmptyNode(qoInfo) || isNullOrEmptyNode(qoInfo.get("qoMetadata"))) { + return; + } + JsonNode qoMetadata = qoInfo.get("qoMetadata"); + List newQoMetadataDtoList = new ArrayList<>(); + qoMetadata.forEach(qo -> { + if (isNullOrEmptyNode(qo.get("id")) || StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(qo.get("id").asText()))) { + return; + } + GspMetadata newQoMetadata = replicationServiceContext.findCopiedGspMetadata(qo.get("id").asText()); + if (newQoMetadata != null) { + MetadataDto dto = MetadataDtoConverter.asDto(newQoMetadata); + dto.setId(replicationServiceContext.findNewUUID(qo.get("id").asText())); + newQoMetadataDtoList.add(dto); + } + }); + try { + if (!newQoMetadataDtoList.isEmpty()) { + List metadataJsonList = new ArrayList<>(); + ObjectMapper mapper = new ObjectMapper(); + for (MetadataDto metadataDto : newQoMetadataDtoList) { + String content = metadataDto.getContent(); + JsonNode jsonNode = mapper.readTree(content); + JsonNode dtoJson = mapper.readTree(mapper.writeValueAsString(metadataDto)); + ObjectNode dtoObjectJson = (ObjectNode) dtoJson; + dtoObjectJson.put("content", jsonNode); + metadataJsonList.add(dtoObjectJson); + } + String newDtoListStr = mapper.writeValueAsString(metadataJsonList); + ((ObjectNode) qoInfo).set("qoMetadata", mapper.readTree(newDtoListStr)); + } + + replaceAllQoInfo(replicationServiceContext, module, replicationParam, formMetadata, formMdContent); + + + } catch (Exception e) { + throw new WebCustomException(e); + } + } + + private static void replaceAllQoInfo(ReplicationServiceContext context, JsonNode node, ReplicationParam replicationParam, GspMetadata formMetadata, FormMetadataContent formMdContent) { + if (isNullOrEmptyNode(node)) { + return; + } + try { + // 处理对象节点({...}) + if (node.isObject()) { + ObjectNode objectNode = (ObjectNode) node; // 转为可变的 ObjectNode + updateQdpFrameWorkProperty(objectNode, context, replicationParam, formMetadata, formMdContent); + Iterator> fields = objectNode.fields(); + + while (fields.hasNext()) { + Map.Entry field = fields.next(); + + // 递归遍历子节点 + replaceAllQoInfo(context, field.getValue(), replicationParam, formMetadata, formMdContent); + } + } + // 处理数组节点([...]) + else if (node.isArray()) { + for (JsonNode item : node) { + replaceAllQoInfo(context, item, replicationParam, formMetadata, formMdContent); + } + } + // 基本类型节点,无需处理 + } catch (Exception e) { + throw new WebCustomException(e); + + } + + } + + private static void updateQdpFrameWorkProperty(ObjectNode objectNode, ReplicationServiceContext context, ReplicationParam replicationParam, GspMetadata formMetadata, FormMetadataContent formMdContent) { + if (isNullOrEmptyNode(objectNode) || isNullOrEmptyNode(objectNode.get("type")) || !"QdpFramework".equals(objectNode.get("type").asText())) { + return; + } + updateQdpInformation(objectNode, context, replicationParam, formMetadata, formMdContent); + + + if (isNullOrEmptyNode(objectNode.get("contents"))) { + updateQdpSchema(formMdContent, replicationParam, formMetadata); + return; + } + objectNode.get("contents").forEach(content -> updateQdpInformation((ObjectNode) content, context, replicationParam, formMetadata, formMdContent)); + updateQdpSchema(formMdContent, replicationParam, formMetadata); + } + + private static void updateQdpSchema(FormMetadataContent formMdContent, ReplicationParam replicationParam, GspMetadata formMetadata) { + JsonNode schema = formMdContent.getSchema(); + if (isNullOrEmptyNode(schema)) { + return; + } + schema.forEach(node -> { + if (isNullOrEmptyNode(node.get("eapiId")) && !isNullOrEmptyNode(node.get("sourceUri"))) { + ((ObjectNode) node).put("sourceUri", assemblyRouter(replicationParam, node.get("sourceUri").asText(), formMetadata, 3)); + } + }); + } + + private static void updateQdpInformation(ObjectNode objectNode, ReplicationServiceContext context, ReplicationParam replicationParam, GspMetadata formMetadata, FormMetadataContent formMdContent) { + if (!isNullOrEmptyNode(objectNode.get("qoManagerCode")) && + !StringUtility.isNullOrEmpty(objectNode.get("qoManagerCode").asText()) && + !StringUtility.isNullOrEmpty(context.findNewUUID(objectNode.get("qoManagerCode").asText()))) { + objectNode.put("qoManagerCode", context.findNewUUID(objectNode.get("qoManagerCode").asText())); + } + if (!isNullOrEmptyNode(objectNode.get("qoId")) && + !StringUtility.isNullOrEmpty(objectNode.get("qoId").asText()) && + !StringUtility.isNullOrEmpty(context.findNewUUID(objectNode.get("qoId").asText()))) { + objectNode.put("qoId", context.findNewUUID(objectNode.get("qoId").asText())); + } + if (!isNullOrEmptyNode(objectNode.get("queryRelativeUrl")) && + !StringUtility.isNullOrEmpty(objectNode.get("queryRelativeUrl").asText())) { + String router = assemblyRouter(replicationParam, objectNode.get("queryRelativeUrl").asText(), formMetadata,4); + objectNode.put("queryRelativeUrl", "/" + router + "/service/"); + } + if (!isNullOrEmptyNode(objectNode.get("voId")) && + !StringUtility.isNullOrEmpty(objectNode.get("voId").asText())) { + + JsonNode schema = formMdContent.getSchema(); + if (isNullOrEmptyNode(schema) || + isNullOrEmptyNode(schema.get(0)) || + isNullOrEmptyNode(schema.get(0).get("id")) || + !context.getOldUUID2NewUUIDMap().containsValue(schema.get(0).get("id").asText())) { + return; + } + String oldUUID = ""; + for (Map.Entry stringStringEntry : context.getOldUUID2NewUUIDMap().entrySet()) { + if (Objects.equals(stringStringEntry.getValue(), schema.get(0).get("id").asText())) { + oldUUID = stringStringEntry.getKey(); + break;// 找到匹配的value,返回对应的key + } + } + if (StringUtility.isNullOrEmpty(oldUUID)) { + return; + } + GspMetadata voMetadata = context.findCopiedGspMetadata(oldUUID); + GspViewModel voContent = (GspViewModel) voMetadata.getContent(); + objectNode.put("voId", voContent.getGeneratingAssembly() + "." + voContent.getCode()); + } + } + + private static String assemblyRouter(ReplicationParam replicationParam, String oldRouter, GspMetadata formMetadata, int i) { + String targetSU = replicationParam.getTargetSU(); + String oldSu = getProperty(oldRouter, i); + + return targetSU.toLowerCase().equals(oldSu) ? "api/" + replicationParam.getTargetAppDomain().toLowerCase() + "/" + + replicationParam.getTargetSU().toLowerCase() + "/v1.0/" + replicationParam.getTargetBizObjCode().toLowerCase() + "-" + formMetadata.getHeader().getCode().toLowerCase() + "_frm" : + "api/" + replicationParam.getTargetAppDomain().toLowerCase() + "/" + + replicationParam.getTargetSU().toLowerCase() + "/v1.0/" + formMetadata.getHeader().getCode().toLowerCase() + "_frm"; + + } + + private static FormMetadataContent updateDataIEOrWFCommand(FormMetadataContent formMetadataContent, ReplicationServiceContext replicationServiceContext) { + String contentsStr = JSONSerializer.serialize(formMetadataContent); + ArrayNode viewModels = (ArrayNode) formMetadataContent.getModule().at("/viewmodels"); + for (int i = 0; i < viewModels.size(); i++) { + JsonNode vm = viewModels.get(i); + if (vm.get("commands") != null) { + ArrayNode commands = (ArrayNode) vm.get("commands"); + if (!commands.isEmpty()) { + for (int j = 0; j < commands.size(); j++) { + JsonNode cmd = commands.get(j); + if (cmd.get("params") != null) { + ArrayNode submitAndSaveParams = (ArrayNode) cmd.get("params"); + for (int k = 0; k < submitAndSaveParams.size(); k++) { + JsonNode item = submitAndSaveParams.get(k); + //流程分类 + if (item.get("name") != null && "bizDefKey".equals(item.get("name").asText())) { + if (item.get("value") != null) { + String oldVal = item.get("value").asText(); + String newVal = getNewConfigData("gspwfflowform", "id", oldVal, replicationServiceContext); + contentsStr = contentsStr.replace(oldVal, newVal); + + } + } + //导入导出 + if (item.get("name") != null && "ruleID".equals(item.get("name").asText())) { + if (item.get("value") != null) { + String oldVal = item.get("value").asText(); + String newVal = getNewConfigData("gspdataierulemanage", "id", oldVal, replicationServiceContext); + contentsStr = contentsStr.replace(oldVal, newVal); + } + } + + } + } + } + } + } + } + return JSONSerializer.deserialize(contentsStr, FormMetadataContent.class); + + } + + private static void updateComponentHelpId(FormMetadataContent formMetadataContent, + ReplicationServiceContext replicationServiceContext, + ReplicationParam replicationParam) { + + if (isNullOrEmptyNode(formMetadataContent.getModule()) || isNullOrEmptyNode(formMetadataContent.getModule().get("components"))) { + return; + } + JsonNode components = formMetadataContent.getModule().get("components"); + replaceHelpId(components, replicationServiceContext); + } + + private static void updateActionsNode(FormMetadataContent formMetadataContent, ReplicationServiceContext replicationServiceContext) { + JsonNode module = formMetadataContent.getModule(); + if (isNullOrEmptyNode(module) || isNullOrEmptyNode(module.get("actions"))) { + return; + } + ArrayNode actions = (ArrayNode) module.get("actions"); + actions.forEach(action -> { + if (!isNullOrEmptyNode(action.get("sourceComponent"))) { + action.get("sourceComponent").forEach(comp -> { + if (!isNullOrEmptyNode(comp.get("map"))) { + comp.get("map").forEach(map -> { + if (!isNullOrEmptyNode(map.get("command"))) { + map.get("command").forEach(command -> { + recognizeUpdateControllerCommand(command, replicationServiceContext); + }); + } + }); + } + }); + } + }); + } + + private static void updateFormOptions(FormMetadataContent formMetadataContent, ReplicationServiceContext replicationServiceContext) { + JsonNode contents = formMetadataContent.getContents(); + if (isNullOrEmptyNode(contents) || isNullOrEmptyNode(contents.get("options"))) { + return; + } + JsonNode options = contents.get("options"); + if (!isNullOrEmptyNode(options.get("mobileMetadataId")) && + !StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(options.get("mobileMetadataId").asText()))) { + ObjectNode optionsNode = (ObjectNode) options; + optionsNode.put("mobileMetadataId", replicationServiceContext.findNewUUID(options.get("mobileMetadataId").asText())); + } + if (!isNullOrEmptyNode(options.get("pcMetadataId")) && + !StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(options.get("pcMetadataId").asText()))) { + ObjectNode optionsNode = (ObjectNode) options; + optionsNode.put("pcMetadataId", replicationServiceContext.findNewUUID(options.get("pcMetadataId").asText())); + } + if (!isNullOrEmptyNode(options.at("/vueMetadata/id")) && + !StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(options.at("/vueMetadata/id").asText()))) { + ObjectNode vueMetadata = (ObjectNode) options.get("vueMetadata"); + vueMetadata.put("id", replicationServiceContext.findNewUUID(vueMetadata.get("id").asText())); + } + } + + private static void updateFormByExternalComponents(FormMetadataContent formMetadataContent, ReplicationServiceContext replicationServiceContext, ReplicationParam replicationParam) { + JsonNode module = formMetadataContent.getModule(); + if (module == null) { + return; + } + JsonNode externalComponents = module.at("/externalComponents"); + if (isNullOrEmptyNode(externalComponents)) { + return; + } + ArrayNode externalComponentsArray = (ArrayNode) externalComponents; + externalComponentsArray.forEach(externalComponent -> { + updateFormByExternalComponent(externalComponent, replicationServiceContext, replicationParam); + }); + + } + + private static void updateFormByExternalComponent(JsonNode externalComponent, ReplicationServiceContext replicationServiceContext, ReplicationParam replicationParam) { + if (isNullOrEmptyNode(externalComponent) || isNullOrEmptyNode(externalComponent.get("uri"))) { + return; + } + String formId = externalComponent.get("uri").asText(); + ObjectNode extComponent = (ObjectNode) externalComponent; + extComponent.put("uri", StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(formId)) ? + formId : replicationServiceContext.findNewUUID(formId)); + GspMetadata copiedGspMetadata = replicationServiceContext.findCopiedGspMetadata(formId); + if (copiedGspMetadata == null) { + return; + } + if (!isNullOrEmptyNode(extComponent.at("/nameSpace"))) { + extComponent.put("nameSpace", copiedGspMetadata.getHeader().getNameSpace()); + } + if (!isNullOrEmptyNode(extComponent.at("/fileName"))) { + extComponent.put("fileName", copiedGspMetadata.getHeader().getFileName()); + } + if (!isNullOrEmptyNode(extComponent.at("/filePath"))) { + extComponent.put("filePath", StringUtility.isNullOrEmpty(extComponent.get("filePath").asText()) ? null : buildNewRelativePath(replicationParam, replicationServiceContext, extComponent.get("filePath").asText())); + } + if (!isNullOrEmptyNode(extComponent.at("/projectName"))) { + extComponent.put("projectName", replicationServiceContext.getProjectNameMap() != null && + !replicationServiceContext.getProjectNameMap().isEmpty() && + !StringUtility.isNullOrEmpty(replicationServiceContext.getProjectNameMap().get(extComponent.at("/projectName").asText())) ? + replicationServiceContext.getProjectNameMap().get(extComponent.at("/projectName").asText()).toLowerCase() : "bo-" + replicationParam.getTargetBizObjCode().toLowerCase() + "-front"); + } + if (!isNullOrEmptyNode(extComponent.at("/serviceUnitPath"))) { + extComponent.put("serviceUnitPath", replicationParam.getTargetAppDomain().toLowerCase() + "/" + replicationParam.getTargetSU().toLowerCase()); + } + if (!isNullOrEmptyNode(extComponent.at("/name"))) { + extComponent.put("name", copiedGspMetadata.getHeader().getName()); + } + if (!isNullOrEmptyNode(extComponent.at("/code"))) { + extComponent.put("code", copiedGspMetadata.getHeader().getCode()); + } + } + + private static FormMetadataContent updateFormByWebCommands(FormMetadataContent formMetadataContent, ReplicationServiceContext replicationServiceContext, ReplicationParam replicationParam) { + JsonNode module = formMetadataContent.getModule(); + if (module == null) { + return formMetadataContent; + } + JsonNode webCommandsNode = module.at("/webcmds"); + if (webCommandsNode == null || webCommandsNode.isNull() || webCommandsNode.isMissingNode()) { + return formMetadataContent; + } + ArrayNode webCommandsArray = (ArrayNode) webCommandsNode; + Map oldNewCmdIdMap = new HashMap<>(); + for (JsonNode jsonCmdNode : webCommandsArray) { + if (isNullOrEmptyNode(jsonCmdNode)) { + continue; + } + String webCmdId = jsonCmdNode.at("/id").asText(); + ObjectNode cmdNode = (ObjectNode) jsonCmdNode; + + cmdNode.put("id", StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(webCmdId)) ? webCmdId : replicationServiceContext.findNewUUID(webCmdId)); + if (replicationServiceContext.findCopiedGspMetadata(webCmdId) == null) { + continue; + } + GspMetadata copiedGspMetadata = replicationServiceContext.findCopiedGspMetadata(webCmdId); + + if (!isNullOrEmptyNode(cmdNode.at("/nameSpace"))) { + cmdNode.put("nameSpace", copiedGspMetadata.getHeader().getNameSpace()); + } + if (!isNullOrEmptyNode(cmdNode.at("/path"))) { + cmdNode.put("path", StringUtility.isNullOrEmpty(cmdNode.get("path").asText()) ? null : buildNewRelativePath(replicationParam, replicationServiceContext, cmdNode.get("path").asText())); + } + if (!isNullOrEmptyNode(cmdNode.at("/name"))) { + cmdNode.put("name", copiedGspMetadata.getHeader().getFileName()); + } + if (!isNullOrEmptyNode(cmdNode.at("/code"))) { + cmdNode.put("code", copiedGspMetadata.getHeader().getCode()); + } + oldNewCmdIdMap.put(webCmdId, replicationServiceContext.findNewUUID(webCmdId)); + } + //全局替换 + if (!oldNewCmdIdMap.isEmpty()) { + String contentStr = JSONSerializer.serialize(formMetadataContent); + for (Map.Entry entry : oldNewCmdIdMap.entrySet()) { + contentStr.replace(entry.getKey(), entry.getValue()); + } + return JSONSerializer.deserialize(contentStr, FormMetadataContent.class); + } + return formMetadataContent; + + } + + private static void updateFormByStateMachines(FormMetadataContent formMetadataContent, ReplicationServiceContext replicationServiceContext) { + JsonNode module = formMetadataContent.getModule(); + if (module == null) { + return; + } + JsonNode stateMachines = module.at("/stateMachines"); + if (isNullOrEmptyNode(stateMachines)) { + return; + } + ArrayNode stateMachinesArray = (ArrayNode) stateMachines; + for (JsonNode stateMachine : stateMachinesArray) { + if (isNullOrEmptyNode(stateMachine.at("/uri"))) { + continue; + } + String smId = stateMachine.at("/uri").asText(); + ObjectNode smObjectNode = (ObjectNode) stateMachine; + smObjectNode.put("uri", StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(smId)) ? + smId : replicationServiceContext.findNewUUID(smId)); + GspMetadata copiedSmMetadata = replicationServiceContext.findCopiedGspMetadata(smId); + if (copiedSmMetadata == null) { + continue; + } + if (!isNullOrEmptyNode(smObjectNode.at("/nameSpace"))) { + smObjectNode.put("nameSpace", copiedSmMetadata.getHeader().getNameSpace()); + } + if (!isNullOrEmptyNode(smObjectNode.at("/id"))) { + smObjectNode.put("id", copiedSmMetadata.getHeader().getCode()); + } + if (!isNullOrEmptyNode(smObjectNode.at("/name"))) { + smObjectNode.put("name", copiedSmMetadata.getHeader().getName()); + } + } + } + + private static void updateProjectNameAndMetadataId(FormMetadataContent formMetadataContent, + ReplicationParam replicationParam, + ReplicationServiceContext replicationServiceContext) { + if (!StringUtility.isNullOrEmpty(formMetadataContent.getId()) && + !StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(formMetadataContent.getId()))) { + formMetadataContent.setId(replicationServiceContext.findNewUUID(formMetadataContent.getId())); + } + JsonNode module = formMetadataContent.getModule(); + if (module == null || module.isMissingNode() || module.isNull()) { + return; + } + String targetBizObjCode = replicationParam.getTargetBizObjCode(); + if (StringUtility.isNullOrEmpty(targetBizObjCode)) { + return; + } + ObjectNode objectContent = (ObjectNode) module; + if (!isNullOrEmptyNode(objectContent.at("/projectName"))) { + String project = objectContent.at("/projectName").asText(); + + objectContent.put("projectName", replicationServiceContext.getProjectNameMap() != null && + !replicationServiceContext.getProjectNameMap().isEmpty() && + !StringUtility.isNullOrEmpty(replicationServiceContext.getProjectNameMap().get(project)) ? + replicationServiceContext.getProjectNameMap().get(project).toLowerCase() : "bo-" + replicationParam.getTargetBizObjCode().toLowerCase() + "-front"); + } + if (!isNullOrEmptyNode(objectContent.at("/metadataId")) && + !StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(objectContent.get("metadataId").asText()))) { + objectContent.put("metadataId", replicationServiceContext.findNewUUID(objectContent.get("metadataId").asText())); + } + } + + private static void updateFormByVo(FormMetadataContent formMetadataContent, ReplicationServiceContext replicationServiceContext, ReplicationParam replicationParam) { + JsonNode schema = formMetadataContent.getSchema(); + if (isNullOrEmptyNode(schema)) { + return; + } + ArrayNode schemaArray = (ArrayNode) schema; + schemaArray.forEach(schemaNode -> { + if (schemaNode != null && schemaNode.get("id") != null) { + ObjectNode objectSchemaNode = (ObjectNode) schemaNode; + GspMetadata voMetadata = replicationServiceContext.findCopiedGspMetadata(schemaNode.get("id").asText()); + if (voMetadata != null) { + if (!isNullOrEmptyNode(objectSchemaNode.at("/voPath"))) { + objectSchemaNode.put("voPath", StringUtility.isNullOrEmpty(voMetadata.getRelativePath()) ? null : buildNewRelativePath(replicationParam, replicationServiceContext, voMetadata.getRelativePath())); + } + if (!isNullOrEmptyNode(objectSchemaNode.at("/voNameSpace"))) { + objectSchemaNode.put("voNameSpace", voMetadata.getHeader().getNameSpace()); + } + if (!StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(schemaNode.get("id").asText()))) { + objectSchemaNode.put("id", replicationServiceContext.findNewUUID(schemaNode.get("id").asText())); + } + } + } + + }); + + } + + private static void updateFormControllerCommandParam(FormMetadataContent formMetadataContent, ReplicationServiceContext replicationServiceContext) { + ArrayNode viewModels = (ArrayNode) formMetadataContent.getModule().at("/viewmodels"); + for (int i = 0; i < viewModels.size(); i++) { + JsonNode vm = viewModels.get(i); + if (vm.get("commands") != null) { + ArrayNode commands = (ArrayNode) vm.get("commands"); + if (!commands.isEmpty()) { + for (int j = 0; j < commands.size(); j++) { + JsonNode cmd = commands.get(j); + recognizeUpdateControllerCommand(cmd, replicationServiceContext); + } + } + } + } + } + + + private static void recognizeUpdateControllerCommand(JsonNode cmd, ReplicationServiceContext replicationServiceContext) { + if (isListControllerCommand(cmd)) { + updateListAppCommand(cmd); + updateListFuncCommand(cmd); + updateListRtcCommand(cmd, replicationServiceContext); + } + if (isPrintCommand(cmd)) { + updatePrintCommand(cmd, replicationServiceContext); + } + if (isAdvancedListCardControllerCommand(cmd)) { + updateAdvancedListCardControllerCommand(cmd, replicationServiceContext); + } + if (isCardControllerCommand(cmd)) { + updateCardControllerCommand(cmd, replicationServiceContext); + } + if (isBatchEditCommand(cmd)) { + updateBatchEditCommand(cmd, replicationServiceContext); + } + if (isDoubleListControllerCommand(cmd)) { + updateDoubleListControllerCommand(cmd, replicationServiceContext); + } + if (isPopControllerCommand(cmd)) { + updatePopControllerCommand(cmd, replicationServiceContext); + } + if (isTreeListControllerCommand(cmd)) { + updateTreeListControllerCommand(cmd, replicationServiceContext); + } + } + + private static void updateListAppCommand(JsonNode item) { + if (isNullOrEmptyNode(item.get("params"))) { + return; + } + ArrayNode params = (ArrayNode) item.get("params"); + params.forEach(paramNode -> { + if (!isNullOrEmptyNode(paramNode.get("name")) && "appId".equals(paramNode.get("name").asText())) { + ((ObjectNode) paramNode).put("value", ""); + } + if (!isNullOrEmptyNode(paramNode.get("name")) && "appEntrance".equals(paramNode.get("name").asText())) { + ((ObjectNode) paramNode).put("value", ""); + } + }); + } + + private static void updateListRtcCommand(JsonNode item, ReplicationServiceContext context) { + if (isNullOrEmptyNode(item.get("params"))) { + return; + } + ArrayNode params = (ArrayNode) item.get("params"); + params.forEach(paramNode -> { + if (!isNullOrEmptyNode(paramNode.get("name")) && "funcId".equals(paramNode.get("name").asText())) { + ((ObjectNode) paramNode).put("value", ""); + } + if (!isNullOrEmptyNode(paramNode.get("name")) && "metadataId".equals(paramNode.get("name").asText())) { + if (!isNullOrEmptyNode(paramNode.get("value")) && !StringUtility.isNullOrEmpty(context.findNewUUID(paramNode.get("value").asText()))) { + ((ObjectNode) paramNode).put("value", context.findNewUUID(paramNode.get("value").asText())); + } + } + }); + } + + private static boolean isListControllerCommand(JsonNode item) { + return item.get("cmpId") != null && "70b4abd4-9f2c-4b7c-90e9-6ac6f4b74c72".equals(item.get("cmpId").asText()); + } + + private static boolean isCardControllerCommand(JsonNode item) { + return item.get("cmpId") != null && "8172a979-2c80-4637-ace7-b13074d3f393".equals(item.get("cmpId").asText()); + } + + private static void updateCardControllerCommand(JsonNode item, ReplicationServiceContext context) { + if (isNullOrEmptyNode(item.get("params"))) { + return; + } + ArrayNode params = (ArrayNode) item.get("params"); + params.forEach(paramNode -> { + if (!isNullOrEmptyNode(paramNode.get("name")) && "helpId".equals(paramNode.get("name").asText())) { + if (!isNullOrEmptyNode(paramNode.get("value")) && !StringUtility.isNullOrEmpty(context.findNewUUID(paramNode.get("value").asText()))) { + ((ObjectNode) paramNode).put("value", context.findNewUUID(paramNode.get("value").asText())); + } + } + if (!isNullOrEmptyNode(paramNode.get("name")) && "funcOrAppId".equals(paramNode.get("name").asText())) { + ((ObjectNode) paramNode).put("value", ""); + } + if (!isNullOrEmptyNode(paramNode.get("name")) && "appEntrance".equals(paramNode.get("name").asText())) { + ((ObjectNode) paramNode).put("value", ""); + } + }); + } + + + private static boolean isAdvancedListCardControllerCommand(JsonNode item) { + return item.get("cmpId") != null && "45be24f9-c1f7-44f7-b447-fe2ada458a61".equals(item.get("cmpId").asText()); + } + + private static void updateAdvancedListCardControllerCommand(JsonNode item, ReplicationServiceContext context) { + if (isNullOrEmptyNode(item.get("params"))) { + return; + } + ArrayNode params = (ArrayNode) item.get("params"); + params.forEach(paramNode -> { + if (!isNullOrEmptyNode(paramNode.get("name")) && "helpId".equals(paramNode.get("name").asText())) { + if (!isNullOrEmptyNode(paramNode.get("value")) && !StringUtility.isNullOrEmpty(context.findNewUUID(paramNode.get("value").asText()))) { + ((ObjectNode) paramNode).put("value", context.findNewUUID(paramNode.get("value").asText())); + } + } + }); + } + + private static boolean isPrintCommand(JsonNode item) { + return item.get("cmpId") != null && "e353b4e9-e073-4e18-b9f7-ec4cc8ac72b1".equals(item.get("cmpId").asText()); + } + + private static void updatePrintCommand(JsonNode item, ReplicationServiceContext context) { + if (isNullOrEmptyNode(item.get("params"))) { + return; + } + ArrayNode params = (ArrayNode) item.get("params"); + params.forEach(paramNode -> { + if (!isNullOrEmptyNode(paramNode.get("name")) && "beMetaId".equals(paramNode.get("name").asText())) { + if (!isNullOrEmptyNode(paramNode.get("value")) && !StringUtility.isNullOrEmpty(context.findNewUUID(paramNode.get("value").asText()))) { + ((ObjectNode) paramNode).put("value", context.findNewUUID(paramNode.get("value").asText())); + } + } + if (!isNullOrEmptyNode(paramNode.get("name")) && "billCategoryId".equals(paramNode.get("name").asText())) { + if (!isNullOrEmptyNode(paramNode.get("value")) && + !StringUtility.isNullOrEmpty(getNewConfigData("bfbfconfigdefine", "id", paramNode.get("value").asText(), context))) { + ((ObjectNode) paramNode).put("value", getNewConfigData("bfbfconfigdefine", "id", paramNode.get("value").asText(), context)); + } + } + }); + } + + private static void updateListFuncCommand(JsonNode item) { + if (isNullOrEmptyNode(item.get("params"))) { + return; + } + ArrayNode params = (ArrayNode) item.get("params"); + params.forEach(paramNode -> { + if (!isNullOrEmptyNode(paramNode.get("name")) && "url".equals(paramNode.get("name").asText())) { + ((ObjectNode) paramNode).put("value", ""); + } + }); + } + + private static void updateFormByEapi(FormMetadataContent formMetadataContent, ReplicationServiceContext replicationServiceContext) { + JsonNode schema = formMetadataContent.getSchema(); + if (isNullOrEmptyNode(schema)) { + return; + } + ArrayNode schemaArray = (ArrayNode) schema; + schemaArray.forEach(schemaNode -> { + if (schemaNode != null && schemaNode.get("eapiId") != null) { + String eapiId = schemaNode.get("eapiId").asText(); + if (!StringUtility.isNullOrEmpty(eapiId)) { + GspMetadata newEapiMetadata = replicationServiceContext.findCopiedGspMetadata(eapiId); + if (newEapiMetadata != null) { + updateFormByEapi(schemaNode, newEapiMetadata, replicationServiceContext); + } + } + } + }); + } + + + private static String getNewConfigData(String tableName, String columnName, String oldValue, ReplicationServiceContext replicationServiceContext) { + String result = ""; + if (!StringUtility.isNullOrEmpty(tableName) && !StringUtility.isNullOrEmpty(columnName) && !StringUtility.isNullOrEmpty(oldValue)) { + String key = tableName + "_" + columnName + "_" + oldValue; + result = replicationServiceContext.findConfigDataNewValue(key); + if (StringUtility.isNullOrEmpty(result)) { + WebLogger.Instance.info("com.inspur.edp.web.formmetadata.formcopy.FormMetadataCopyImpl,key值为:" + key); + result = oldValue; + } + } + return result; + } + + private static void updateFormByEapi(JsonNode schema, GspMetadata eapiMetadata, ReplicationServiceContext replicationServiceContext) { + SgMetadata eapiMdContent = (SgMetadata) eapiMetadata.getContent(); + // 表单上回写eapi id和url + ObjectNode schemaNode = (ObjectNode) schema; + schemaNode.put("eapiId", StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(schemaNode.get("eapiId").asText())) ? + schemaNode.get("eapiId").asText() : replicationServiceContext.findNewUUID(schemaNode.get("eapiId").asText())); + String sourceUri = eapiMdContent.getRouter(); + if (sourceUri.startsWith("/")) { + sourceUri = sourceUri.substring(1); + } + if (!isNullOrEmptyNode(schemaNode.at("/sourceUri"))) { + schemaNode.put("sourceUri", sourceUri); + } + if (!isNullOrEmptyNode(schemaNode.at("/eapiCode"))) { + schemaNode.put("eapiCode", eapiMdContent.getCode()); + } + if (!isNullOrEmptyNode(schemaNode.at("/eapiName"))) { + schemaNode.put("eapiName", eapiMdContent.getName()); + } + if (!isNullOrEmptyNode(schemaNode.at("/eapiNameSpace"))) { + schemaNode.put("eapiNameSpace", eapiMetadata.getHeader().getNameSpace()); + } + } + + //同LCM给的规则保持一致, + private static String buildNewRelativePath(ReplicationParam replicationParam, ReplicationServiceContext context, String oldRelativePath) { + if (StringUtility.isNullOrEmpty(oldRelativePath)) { + return null; + } + // 获取新值 + String newAppDomain = replicationParam.getTargetAppDomain(); + String newServiceUnit = replicationParam.getTargetSU(); + String newBoCode = replicationParam.getTargetBizObjCode(); + String projectName = getProjectName(oldRelativePath); + if (StringUtility.isNullOrEmpty(projectName)) { + return null; + } + String result = Paths.get(newAppDomain, + newServiceUnit, + newBoCode, + context.getProjectNameMap() != null && + !context.getProjectNameMap().isEmpty() && + !StringUtility.isNullOrEmpty(context.getProjectNameMap().get(projectName)) ? + context.getProjectNameMap().get(projectName).toLowerCase() : "bo-" + replicationParam.getTargetBizObjCode().toLowerCase() + "-front", + getSecondLastProperty(oldRelativePath), + getFinalProperty(oldRelativePath) + ).toString().replace("\\", "/"); + return result; + + } + + public static String getProjectName(String oldRelativePath) { + // 1. 空值校验:避免NPE + if (StringUtility.isNullOrEmpty(oldRelativePath)) { + return null; // 或抛业务异常,根据实际需求调整 + } + + // 2. 分割路径 + 过滤空元素(处理连续/、首尾/的情况) + String[] pathSegments = oldRelativePath.split("/"); + List validSegments = new ArrayList<>(); + for (String segment : pathSegments) { + if (!StringUtility.isNullOrEmpty(segment)) { // 过滤空字符串/纯空格 + validSegments.add(segment); + } + } + + // 3. 数组长度校验:避免IndexOutOfBoundsException + if (validSegments.size() < 3) { + return null; // 路径层级不足,返回null/抛异常/返回默认值 + } + + // 4. 取倒数第三个元素 + return validSegments.get(validSegments.size() - 3); + } + + public static String getFinalProperty(String key) { + if (StringUtility.isNullOrEmpty(key)) { + return key; + } + String[] splitString = key.split("/"); + if (splitString.length < 1) { + return key; + } + return splitString[splitString.length - 1]; + } + + public static String getSecondLastProperty(String key) { + if (StringUtility.isNullOrEmpty(key)) { + return key; + } + String[] splitString = key.split("/"); + if (splitString.length < 2) { + return key; + } + return splitString[splitString.length - 2]; + + } + + public static String getProperty(String key, int length) { + if (StringUtility.isNullOrEmpty(key)) { + return key; + } + String[] splitString = key.split("/"); + if (splitString.length < length) { + return key; + } + return splitString[length - 1]; + + } + + + private static String buildNewRelativePath(ReplicationParam replicationParam, String oldRelativePath) { + + // 获取新值 + String newAppDomain = replicationParam.getTargetAppDomain(); + String newServiceUnit = replicationParam.getTargetSU(); + String newBoCode = replicationParam.getTargetBizObjCode(); + + String result = Paths.get(newAppDomain, + newServiceUnit, + newBoCode, + "bo-" + newBoCode.toLowerCase() + "-front", + "metadata", + "components" + ).toString().replace("\\", "/"); + + + return result; + + + } + + public static boolean isNullOrEmptyNode(JsonNode node) { + return node == null || + node.isNull() || + node.isArray() && node.isEmpty() || + node.isObject() && node.isEmpty() || + StringUtility.isNullOrEmpty(node.toString()); + } + + /** + * 提取JSON字符串中所有helpId的值 + * + * @param rootNode 目标JSON字符串 + * @return 所有helpId的值列表 + */ + public static void replaceHelpId(JsonNode rootNode, ReplicationServiceContext context) { + ; + // 递归遍历节点 + traverseJsonNodeToUpdateHelpId(rootNode, context); + } + + /** + * 递归遍历Jackson的JsonNode,替换helpId + * + * @param node 当前遍历的节点 + * @param context 替换上下文 + */ + private static void traverseJsonNodeToUpdateHelpId(JsonNode node, ReplicationServiceContext context) { + if (isNullOrEmptyNode(node)) { + return; + } + try { + // 处理对象节点({...}) + if (node.isObject()) { + ObjectNode objectNode = (ObjectNode) node; // 转为可变的 ObjectNode + Iterator> fields = objectNode.fields(); + + while (fields.hasNext()) { + Map.Entry field = fields.next(); + String key = field.getKey(); + JsonNode value = field.getValue(); + // 匹配helpId键,收集值 + if ("helpId".equals(key) && + !StringUtility.isNullOrEmpty(value.asText()) && + !StringUtility.isNullOrEmpty(context.findNewUUID(value.asText()))) { + objectNode.put(key, context.findNewUUID(value.asText())); + } + // 递归遍历子节点 + traverseJsonNodeToUpdateHelpId(value, context); + } + } + // 处理数组节点([...]) + else if (node.isArray()) { + for (JsonNode item : node) { + traverseJsonNodeToUpdateHelpId(item, context); + } + } + // 基本类型节点,无需处理 + } catch (Exception e) { + throw new WebCustomException(e); + + } + } + + + private static boolean isBatchEditCommand(JsonNode item) { + return item.get("cmpId") != null && "43f68561-eae4-4495-b318-d629615523f8".equals(item.get("cmpId").asText()); + } + + private static void updateBatchEditCommand(JsonNode item, ReplicationServiceContext context) { + if (isNullOrEmptyNode(item.get("params"))) { + return; + } + ArrayNode params = (ArrayNode) item.get("params"); + params.forEach(paramNode -> { + if (!isNullOrEmptyNode(paramNode.get("name")) && "helpId".equals(paramNode.get("name").asText())) { + if (!isNullOrEmptyNode(paramNode.get("value")) && !StringUtility.isNullOrEmpty(context.findNewUUID(paramNode.get("value").asText()))) { + ((ObjectNode) paramNode).put("value", context.findNewUUID(paramNode.get("value").asText())); + } + } + }); + } + + private static boolean isDoubleListControllerCommand(JsonNode item) { + return item.get("cmpId") != null && "26436aa8-88a7-4aee-bf0b-9843c1e8afbf".equals(item.get("cmpId").asText()); + } + + private static void updateDoubleListControllerCommand(JsonNode item, ReplicationServiceContext context) { + if (isNullOrEmptyNode(item.get("params"))) { + return; + } + ArrayNode params = (ArrayNode) item.get("params"); + params.forEach(paramNode -> { + if (!isNullOrEmptyNode(paramNode.get("name")) && "url".equals(paramNode.get("name").asText())) { + if (!isNullOrEmptyNode(paramNode.get("value")) && !StringUtility.isNullOrEmpty(paramNode.get("value").asText())) { + ((ObjectNode) paramNode).put("value", ""); + } + } + }); + } + + private static boolean isPopControllerCommand(JsonNode item) { + return item.get("cmpId") != null && "8d21e69c-70b3-44f6-88b5-fd6a8d3ce11b".equals(item.get("cmpId").asText()); + } + + private static void updatePopControllerCommand(JsonNode item, ReplicationServiceContext context) { + if (isNullOrEmptyNode(item.get("params"))) { + return; + } + ArrayNode params = (ArrayNode) item.get("params"); + params.forEach(paramNode -> { + if (!isNullOrEmptyNode(paramNode.get("name")) && "funcOrAppId".equals(paramNode.get("name").asText())) { + if (!isNullOrEmptyNode(paramNode.get("value")) && !StringUtility.isNullOrEmpty(paramNode.get("value").asText())) { + ((ObjectNode) paramNode).put("value", ""); + } + } + if (!isNullOrEmptyNode(paramNode.get("name")) && "appEntrance".equals(paramNode.get("name").asText())) { + if (!isNullOrEmptyNode(paramNode.get("value")) && !StringUtility.isNullOrEmpty(paramNode.get("value").asText())) { + ((ObjectNode) paramNode).put("value", ""); + } + } + }); + } + + private static boolean isTreeListControllerCommand(JsonNode item) { + return item.get("cmpId") != null && "d7de1993-d500-44fd-9922-43c78d477aa3".equals(item.get("cmpId").asText()); + } + + private static void updateTreeListControllerCommand(JsonNode item, ReplicationServiceContext context) { + if (isNullOrEmptyNode(item.get("params"))) { + return; + } + ArrayNode params = (ArrayNode) item.get("params"); + params.forEach(paramNode -> { + if (!isNullOrEmptyNode(paramNode.get("name")) && "url".equals(paramNode.get("name").asText())) { + if (!isNullOrEmptyNode(paramNode.get("value")) && !StringUtility.isNullOrEmpty(paramNode.get("value").asText())) { + ((ObjectNode) paramNode).put("value", ""); + } + } + }); + } + + +} diff --git a/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormMetadataCopyImpl.java b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormMetadataCopyImpl.java new file mode 100644 index 00000000..7fa7cec1 --- /dev/null +++ b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormMetadataCopyImpl.java @@ -0,0 +1,33 @@ +package com.inspur.edp.web.appcopy.formmetadata; + +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.lcm.replication.api.context.ReplicationServiceContext; +import com.inspur.edp.lcm.replication.api.entity.ReplicationParam; +import com.inspur.edp.lcm.replication.api.entity.ReplicationTypeEnum; +import com.inspur.edp.lcm.replication.spi.MetadataCopySpi; +import com.inspur.edp.web.common.utility.StringUtility; + + +public class FormMetadataCopyImpl implements MetadataCopySpi { + + @Override + public void metadataCopy(ReplicationParam replicationParam, GspMetadata formMetadata, ReplicationServiceContext replicationServiceContext) { + + String type = formMetadata.getHeader().getType(); + if (StringUtility.isNullOrEmpty(type) || !"Form".equals(type) ) { + return; + } + FormCopyCommonUtility.updateFormContent(replicationParam, formMetadata, replicationServiceContext); + } + + @Override + public String getMdType() { + return "Form"; + } + + @Override + public ReplicationTypeEnum getReplicationTypeEnum() { + return ReplicationTypeEnum.COMMON_APP_COPY; + } + +} diff --git a/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormMetadataReferenceCollect.java b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormMetadataReferenceCollect.java new file mode 100644 index 00000000..84f9f2c5 --- /dev/null +++ b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/FormMetadataReferenceCollect.java @@ -0,0 +1,258 @@ +package com.inspur.edp.web.appcopy.formmetadata; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +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.MetadataReference; +import com.inspur.edp.lcm.replication.api.entity.ReplicationTypeEnum; +import com.inspur.edp.lcm.replication.spi.MetadataReferenceCollectSpi; +import com.inspur.edp.web.common.utility.StringUtility; +import com.inspur.edp.web.formmetadata.metadata.FormMetadataContent; + +import java.util.*; + +public class FormMetadataReferenceCollect implements MetadataReferenceCollectSpi { + + + @Override + public List collect(GspMetadata formMetadata) { + if (formMetadata == null || + formMetadata.getHeader() == null || + !("Form".equals(formMetadata.getHeader().getType()) || + "MobileForm".equals(formMetadata.getHeader().getType()))) { + return Collections.emptyList(); + } + List formMdReferences = new ArrayList<>(formMetadata.getRefs()); + FormMetadataContent formMdContent = (FormMetadataContent) formMetadata.getContent(); + JsonNode module = formMdContent.getModule(); + if (isNullOrEmptyNode(module)) { + return formMdReferences; + } + //获取vo和eapi + JsonNode schema = formMdContent.getSchema(); + if (!isNullOrEmptyNode(schema)) { + getReferenceBySchema((ArrayNode) schema, formMdReferences); + } + JsonNode stateMachines = formMdContent.getModule().get("stateMachines"); + //获取状态机 + if (!isNullOrEmptyNode(stateMachines)) { + getReferenceByStateMachines((ArrayNode) stateMachines, formMdReferences); + } + //获取构件元数据依赖 + JsonNode webCmds = formMdContent.getModule().get("webcmds"); + if (!isNullOrEmptyNode(webCmds)) { + getReferenceByWebCmd((ArrayNode) webCmds, formMdReferences); + } + //获取组合表单 + JsonNode externalComponents = formMdContent.getModule().get("externalComponents"); + if (!isNullOrEmptyNode(externalComponents)) { + getReferenceByExternalComponent((ArrayNode) externalComponents, formMdReferences); + } + //获取帮助依赖 + JsonNode components = formMdContent.getModule().get("components"); + if (!isNullOrEmptyNode(components)) { + extractHelpIds(components, formMdReferences); + } + //获取qo元数据依赖 + JsonNode qdpInfo = formMdContent.getModule().get("qdpInfo"); + if (!isNullOrEmptyNode(qdpInfo)) { + extractQueryInfoRefs(qdpInfo, formMdReferences); + } + + return formMdReferences; + } + + private void extractQueryInfoRefs(JsonNode qdpInfo, List formMdReferences) { + JsonNode qoMetadata = qdpInfo.get("qoMetadata"); + if (isNullOrEmptyNode(qoMetadata)) { + return; + } + qoMetadata.forEach(qo -> { + JsonNode idNode = qo.get("id"); + if (isNullOrEmptyNode(idNode)) { + return; + } + if (formMdReferences.stream().noneMatch(item -> idNode.asText().equals(item.getDependentMetadata().getId()))) { + MetadataReference ref = new MetadataReference(); + MetadataHeader dependentMetadata = new MetadataHeader(); + dependentMetadata.setId(idNode.asText()); + dependentMetadata.setType("QueryObject"); + ref.setDependentMetadata(dependentMetadata); + formMdReferences.add(ref); + } + }); + } + + private void getReferenceByExternalComponent(ArrayNode externalComponent, List formMdReferences) { + externalComponent.forEach(cmp -> { + getReferenceByExternalForm(cmp, formMdReferences); + }); + } + + private void getReferenceByExternalForm(JsonNode cmp, List formMdReferences) { + JsonNode uri = cmp.get("uri"); + if (isNullOrEmptyNode(uri)) { + return; + } + + if (formMdReferences.stream().noneMatch(item -> uri.asText().equals(item.getDependentMetadata().getId()))) { + MetadataReference ref = new MetadataReference(); + MetadataHeader dependentMetadata = new MetadataHeader(); + dependentMetadata.setId(uri.asText()); + ref.setDependentMetadata(dependentMetadata); + formMdReferences.add(ref); + } + } + + private void getReferenceByWebCmd(ArrayNode webCmds, List formMdReferences) { + webCmds.forEach(webCmd -> { + getReferenceByWebCmdNode(webCmd, formMdReferences); + }); + } + + private void getReferenceByWebCmdNode(JsonNode webCmd, List formMdReferences) { + if (isNullOrEmptyNode(webCmd.get("id"))) { + return; + } + + if (formMdReferences.stream().noneMatch(item -> webCmd.get("id").asText().equals(item.getDependentMetadata().getId()))) { + MetadataReference cmdReference = new MetadataReference(); + MetadataHeader dependentMetadata = new MetadataHeader(); + dependentMetadata.setId(webCmd.get("id").asText()); + dependentMetadata.setType("WebCommand"); + cmdReference.setDependentMetadata(dependentMetadata); + formMdReferences.add(cmdReference); + } + + } + + private void getReferenceByStateMachines(ArrayNode stateMachines, List formMdReferences) { + stateMachines.forEach(stateMachineNode -> { + getReferenceBySM(stateMachineNode, formMdReferences); + }); + } + + private void getReferenceBySM(JsonNode stateMachineNode, List formMdReferences) { + if (isNullOrEmptyNode(stateMachineNode.get("uri"))) { + return; + } + String smId = stateMachineNode.get("uri").textValue(); + + if (formMdReferences.stream().noneMatch(item -> smId.equals(item.getDependentMetadata().getId()))) { + MetadataReference smReference = new MetadataReference(); + MetadataHeader dependentMetadata = new MetadataHeader(); + dependentMetadata.setId(smId); + dependentMetadata.setType("StateMachine"); + smReference.setDependentMetadata(dependentMetadata); + formMdReferences.add(smReference); + } + } + + private void getReferenceBySchema(ArrayNode schema, List formMdReferences) { + schema.forEach(schemaNode -> { + getReferenceByEapi(schemaNode, formMdReferences); + getReferenceByVo(schemaNode, formMdReferences); + }); + } + + private void getReferenceByVo(JsonNode node, List formMdReferences) { + if (isNullOrEmptyNode(node.get("id"))) { + return; + } + String voId = node.get("id").asText(); + if (formMdReferences.stream().noneMatch(item -> voId.equals(item.getDependentMetadata().getId()))) { + MetadataReference voReference = new MetadataReference(); + MetadataHeader dependentMetadata = new MetadataHeader(); + dependentMetadata.setId(voId); + dependentMetadata.setType("GSPViewModel"); + voReference.setDependentMetadata(dependentMetadata); + formMdReferences.add(voReference); + } + } + + private void getReferenceByEapi(JsonNode schemaNode, List formMdReferences) { + if (isNullOrEmptyNode(schemaNode.get("eapiId"))) { + return; + } + String eapiId = schemaNode.get("eapiId").asText(); + if (formMdReferences.stream().noneMatch(item -> eapiId.equals(item.getDependentMetadata().getId()))) { + MetadataReference eapiReference = new MetadataReference(); + MetadataHeader dependentMetadata = new MetadataHeader(); + dependentMetadata.setId(eapiId); + dependentMetadata.setType("ExternalApi"); + eapiReference.setDependentMetadata(dependentMetadata); + formMdReferences.add(eapiReference); + } + } + + @Override + public ReplicationTypeEnum getReplicationTypeEnum() { + return ReplicationTypeEnum.COMMON_APP_COPY; + } + + public static boolean isNullOrEmptyNode(JsonNode node) { + return node == null || + node.isNull() || + node.isArray() && node.isEmpty() || + node.isObject() && node.isEmpty() || + StringUtility.isNullOrEmpty(node.toString()); + } + + /** + * 提取JSON字符串中所有helpId的值 + * + * @param rootNode 目标JSON字符串 + * @param formMdReferences + * @return 所有helpId的值列表 + */ + public static void extractHelpIds(JsonNode rootNode, List formMdReferences) { + List helpIdList = new ArrayList<>(); + // 递归遍历节点 + traverseJsonNode(rootNode, helpIdList); + helpIdList.forEach(helpId -> { + if (!StringUtility.isNullOrEmpty(helpId) && + formMdReferences.stream().noneMatch(item -> helpId.equals(item.getDependentMetadata().getId()))) { + MetadataReference helpReference = new MetadataReference(); + MetadataHeader dependentMetadata = new MetadataHeader(); + dependentMetadata.setId(helpId); + helpReference.setDependentMetadata(dependentMetadata); + formMdReferences.add(helpReference); + } + }); + } + + /** + * 递归遍历Jackson的JsonNode,提取helpId + * + * @param node 当前遍历的节点 + * @param helpIdList 收集helpId的列表 + */ + private static void traverseJsonNode(JsonNode node, List helpIdList) { + if (isNullOrEmptyNode(node)) { + return; + } + // 处理对象节点({...}) + if (node.isObject()) { + Iterator> fields = node.fields(); + while (fields.hasNext()) { + Map.Entry field = fields.next(); + String key = field.getKey(); + JsonNode value = field.getValue(); + // 匹配helpId键,收集值 + if ("helpId".equals(key)) { + helpIdList.add(value.isNull() ? null : value.asText()); + } + // 递归遍历子节点 + traverseJsonNode(value, helpIdList); + } + } + // 处理数组节点([...]) + else if (node.isArray()) { + for (JsonNode item : node) { + traverseJsonNode(item, helpIdList); + } + } + // 基本类型节点,无需处理 + } +} diff --git a/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/MobileFormMetadataCopyImpl.java b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/MobileFormMetadataCopyImpl.java new file mode 100644 index 00000000..eadc4001 --- /dev/null +++ b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/formmetadata/MobileFormMetadataCopyImpl.java @@ -0,0 +1,30 @@ +package com.inspur.edp.web.appcopy.formmetadata; + +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.lcm.replication.api.context.ReplicationServiceContext; +import com.inspur.edp.lcm.replication.api.entity.ReplicationParam; +import com.inspur.edp.lcm.replication.api.entity.ReplicationTypeEnum; +import com.inspur.edp.lcm.replication.spi.MetadataCopySpi; +import com.inspur.edp.web.common.utility.StringUtility; + +public class MobileFormMetadataCopyImpl implements MetadataCopySpi { + @Override + public void metadataCopy(ReplicationParam replicationParam, GspMetadata formMetadata, ReplicationServiceContext replicationServiceContext) { + String type = formMetadata.getHeader().getType(); + if (StringUtility.isNullOrEmpty(type) || !"MobileForm".equals(type) ) { + return; + } + FormCopyCommonUtility.updateFormContent(replicationParam, formMetadata, replicationServiceContext); + + } + + @Override + public String getMdType() { + return "MobileForm"; + } + + @Override + public ReplicationTypeEnum getReplicationTypeEnum() { + return ReplicationTypeEnum.COMMON_APP_COPY; + } +} diff --git a/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/MobilePageFlowCopyImpl.java b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/MobilePageFlowCopyImpl.java new file mode 100644 index 00000000..eed9f94b --- /dev/null +++ b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/MobilePageFlowCopyImpl.java @@ -0,0 +1,28 @@ +package com.inspur.edp.web.appcopy.pageflowmetadata; + +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.lcm.replication.api.context.ReplicationServiceContext; +import com.inspur.edp.lcm.replication.api.entity.ReplicationParam; +import com.inspur.edp.lcm.replication.api.entity.ReplicationTypeEnum; +import com.inspur.edp.lcm.replication.spi.MetadataCopySpi; + +public class MobilePageFlowCopyImpl implements MetadataCopySpi { + + @Override + public void metadataCopy(ReplicationParam replicationParam, GspMetadata gspMetadata, ReplicationServiceContext replicationServiceContext) { + if (gspMetadata == null || gspMetadata.getHeader() == null || !"MobilePageFlowMetadata".equals(gspMetadata.getHeader().getType())) { + return; + } + PageFlowCopyCommonUtility.updatePageFlowContent(replicationParam, gspMetadata, replicationServiceContext); + } + + @Override + public String getMdType() { + return "MobilePageFlowMetadata"; + } + + @Override + public ReplicationTypeEnum getReplicationTypeEnum() { + return ReplicationTypeEnum.COMMON_APP_COPY; + } +} diff --git a/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/PageFlowCopyCommonUtility.java b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/PageFlowCopyCommonUtility.java new file mode 100644 index 00000000..c89931d1 --- /dev/null +++ b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/PageFlowCopyCommonUtility.java @@ -0,0 +1,138 @@ +package com.inspur.edp.web.appcopy.pageflowmetadata; + +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.lcm.replication.api.context.ReplicationServiceContext; +import com.inspur.edp.lcm.replication.api.entity.ReplicationParam; +import com.inspur.edp.web.common.utility.StringUtility; +import com.inspur.edp.web.pageflow.metadata.entity.Page; +import com.inspur.edp.web.pageflow.metadata.entity.PageFlowMetadataEntity; +import com.inspur.edp.web.pageflow.metadata.entity.Project; + +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +public class PageFlowCopyCommonUtility { + + public static void updatePageFlowContent(ReplicationParam replicationParam, GspMetadata pfMetadata, + ReplicationServiceContext replicationServiceContext) { + + PageFlowMetadataEntity pageFlowContent = (PageFlowMetadataEntity) pfMetadata.getContent(); + if (pageFlowContent == null) { + return; + } + //发布信息删了; + pageFlowContent.setPublishes(new ArrayList<>()); + //替换id + if (!StringUtility.isNullOrEmpty(pageFlowContent.getId()) && + !StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(pageFlowContent.getId()))) { + pageFlowContent.setId(replicationServiceContext.findNewUUID(pageFlowContent.getId())); + } + //替换project + Project project = new Project(); + project.setName(pageFlowContent.getProject() != null && + !StringUtility.isNullOrEmpty(pageFlowContent.getProject().getName()) && + replicationServiceContext.getProjectNameMap() != null && + !replicationServiceContext.getProjectNameMap().isEmpty() && + !StringUtility.isNullOrEmpty(replicationServiceContext.getProjectNameMap().get(pageFlowContent.getProject().getName())) ? + replicationServiceContext.getProjectNameMap().get(pageFlowContent.getProject().getName()).toLowerCase() : "bo-" + replicationParam.getTargetBizObjCode().toLowerCase() + "-front"); + pageFlowContent.setProject(project); + //清空应用信息 + pageFlowContent.setEntry(null); + pageFlowContent.setRoutes(null); + pageFlowContent.setAppName(null); + pageFlowContent.setAppCode(null); + + if (pageFlowContent.hasEmptyPage()) { + pfMetadata.setContent(pageFlowContent); + return; + } + for (Page page : pageFlowContent.getPages()) { + updatePage(replicationParam, replicationServiceContext, page); + } + pfMetadata.setContent(pageFlowContent); + } + + private static void updatePage(ReplicationParam replicationParam, ReplicationServiceContext replicationServiceContext, Page page) { + if (!StringUtility.isNullOrEmpty(page.getId()) && !StringUtility.isNullOrEmpty(replicationServiceContext.findNewUUID(page.getId()))) { + page.setId(replicationServiceContext.findNewUUID(page.getId())); + } + if (!StringUtility.isNullOrEmpty(page.getRelativePath())) { + page.setRelativePath(buildNewRelativePath(replicationParam, replicationServiceContext, page.getRelativePath())); + } + } + + //同LCM给的规则保持一致, + private static String buildNewRelativePath(ReplicationParam replicationParam, ReplicationServiceContext context, String oldRelativePath) { + if (StringUtility.isNullOrEmpty(oldRelativePath)) { + return null; + } + // 获取新值 + String newAppDomain = replicationParam.getTargetAppDomain(); + String newServiceUnit = replicationParam.getTargetSU(); + String newBoCode = replicationParam.getTargetBizObjCode(); + String projectName = getProjectName(oldRelativePath); + if (StringUtility.isNullOrEmpty(projectName)) { + return null; + } + String result = Paths.get(newAppDomain, + newServiceUnit, + newBoCode, + context.getProjectNameMap() != null && + !context.getProjectNameMap().isEmpty() && + !StringUtility.isNullOrEmpty(context.getProjectNameMap().get(projectName)) ? + context.getProjectNameMap().get(projectName).toLowerCase() : "bo-" + replicationParam.getTargetBizObjCode().toLowerCase() + "-front", + getSecondLastProperty(oldRelativePath), + getFinalProperty(oldRelativePath) + ).toString().replace("\\", "/"); + return result; + + } + + public static String getProjectName(String oldRelativePath) { + // 1. 空值校验:避免NPE + if (StringUtility.isNullOrEmpty(oldRelativePath)) { + return null; // 或抛业务异常,根据实际需求调整 + } + + // 2. 分割路径 + 过滤空元素(处理连续/、首尾/的情况) + String[] pathSegments = oldRelativePath.split("/"); + List validSegments = new ArrayList<>(); + for (String segment : pathSegments) { + if (!StringUtility.isNullOrEmpty(segment)) { // 过滤空字符串/纯空格 + validSegments.add(segment); + } + } + + // 3. 数组长度校验:避免IndexOutOfBoundsException + if (validSegments.size() < 3) { + return null; // 路径层级不足,返回null/抛异常/返回默认值 + } + + // 4. 取倒数第三个元素 + return validSegments.get(validSegments.size() - 3); + } + + public static String getFinalProperty(String key) { + if (StringUtility.isNullOrEmpty(key)) { + return key; + } + String[] splitString = key.split("/"); + if (splitString.length < 1) { + return key; + } + return splitString[splitString.length - 1]; + } + + public static String getSecondLastProperty(String key) { + if (StringUtility.isNullOrEmpty(key)) { + return key; + } + String[] splitString = key.split("/"); + if (splitString.length < 2) { + return key; + } + return splitString[splitString.length - 2]; + + } +} diff --git a/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/PageFlowCopyImpl.java b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/PageFlowCopyImpl.java new file mode 100644 index 00000000..3a4176f6 --- /dev/null +++ b/web-metadata-replication-core/src/main/java/com/inspur/edp/web/appcopy/pageflowmetadata/PageFlowCopyImpl.java @@ -0,0 +1,27 @@ +package com.inspur.edp.web.appcopy.pageflowmetadata; + +import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; +import com.inspur.edp.lcm.replication.api.context.ReplicationServiceContext; +import com.inspur.edp.lcm.replication.api.entity.ReplicationParam; +import com.inspur.edp.lcm.replication.api.entity.ReplicationTypeEnum; +import com.inspur.edp.lcm.replication.spi.MetadataCopySpi; + +public class PageFlowCopyImpl implements MetadataCopySpi { + @Override + public void metadataCopy(ReplicationParam replicationParam, GspMetadata gspMetadata, ReplicationServiceContext replicationServiceContext) { + if (gspMetadata == null || gspMetadata.getHeader() == null || !"PageFlowMetadata".equals(gspMetadata.getHeader().getType())) { + return; + } + PageFlowCopyCommonUtility.updatePageFlowContent(replicationParam, gspMetadata, replicationServiceContext); + } + + @Override + public String getMdType() { + return "PageFlowMetadata"; + } + + @Override + public ReplicationTypeEnum getReplicationTypeEnum() { + return ReplicationTypeEnum.COMMON_APP_COPY; + } +} diff --git a/web-metadata-replication-core/src/main/resources/META-INF/spring.factories b/web-metadata-replication-core/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..13863b80 --- /dev/null +++ b/web-metadata-replication-core/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.inspur.edp.web.appcopy.config.WebReplicationConfiguration -- Gitee From f0ceae3003fca3adb09e42c5b9f3ac2e144108a3 Mon Sep 17 00:00:00 2001 From: Wang Jason Date: Thu, 5 Feb 2026 09:14:03 +0800 Subject: [PATCH 09/15] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dng=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E6=96=B9=E6=A1=88=E8=B5=84=E6=BA=90=E6=8F=90=E5=8F=96bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QuerySchemeI18nResourceStrategy.java | 39 ++++++++++++++++--- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/QuerySchemeI18nResourceStrategy.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/QuerySchemeI18nResourceStrategy.java index 26aea96f..42715939 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/QuerySchemeI18nResourceStrategy.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/i18n/component/strategy/i18nresourcestrategy/QuerySchemeI18nResourceStrategy.java @@ -69,7 +69,12 @@ public class QuerySchemeI18nResourceStrategy extends AbstractI18nResourceStrateg String currentComponentType = ComponentUtility.getInstance().getType(currentComponent); String currentComponentId = ComponentUtility.getInstance().getId(currentComponent); String filterTextValue = ComponentUtility.getInstance().getValue(currentComponent, filterTextKey); - String generatedComponentId = currentComponentId + "/filterText"; + String generatedComponentId; + if(i18nResourceItemBaseId.equals("")){ + generatedComponentId = currentComponentId + "/filterText"; + }else { + generatedComponentId = currentComponentType + "/" + currentComponentId + "/filterText"; + } I18nResourceItem i18nResourceItem = I18nResourceItemManager.createI18nResourceItem(i18nResourceItemBaseId, generatedComponentId, filterTextValue, "筛选按钮文本"); this.addInCollection(i18nResourceItemCollection, i18nResourceItem); } @@ -147,7 +152,13 @@ public class QuerySchemeI18nResourceStrategy extends AbstractI18nResourceStrateg String nameAtributeValue = ComponentUtility.getInstance().getName(childComponent); if (!StringUtility.isNullOrEmpty(idAtributeValue)) { String componentId = idAtributeValue; - String generatedComponentId = currentComponentId + "/" + componentId; + String generatedComponentId; + if(i18nResourceItemBaseId.equals("")){ + generatedComponentId = currentComponentId + "/" + componentId; + }else{ + generatedComponentId = currentComponentType + "/" + currentComponentId + "/" + componentId; + } + I18nResourceItem i18nResourceItem = I18nResourceItemManager.createI18nResourceItem(i18nResourceItemBaseId, generatedComponentId, nameAtributeValue, nameAtributeValue); this.addInCollection(i18nResourceItemCollection, i18nResourceItem); @@ -155,7 +166,13 @@ public class QuerySchemeI18nResourceStrategy extends AbstractI18nResourceStrateg //提取placeholder属性参数 String placeHolderName = ComponentUtility.getInstance().GetPlaceHolderName(childComponent); String placeHolderValue = ComponentUtility.getInstance().getPlaceHolder(childComponent); - String generatedPlaceHolderComponentId = currentComponentId + "/" + componentId + "/" + placeHolderName; + String generatedPlaceHolderComponentId; + if(i18nResourceItemBaseId.equals("")){ + generatedPlaceHolderComponentId = currentComponentId + "/" + componentId + "/" + placeHolderName; + }else{ + generatedPlaceHolderComponentId = currentComponentType + "/" + currentComponentId + "/" + componentId + "/" + placeHolderName; + } + I18nResourceItem i18nPlaceholderResourceItem = I18nResourceItemManager.createI18nResourceItem(i18nResourceItemBaseId, generatedPlaceHolderComponentId, placeHolderValue, placeHolderValue); this.addInCollection(i18nResourceItemCollection, i18nPlaceholderResourceItem); @@ -163,7 +180,13 @@ public class QuerySchemeI18nResourceStrategy extends AbstractI18nResourceStrateg String beginPlaceHolderName = ComponentUtility.getInstance().getBeginPlaceHolderName(childComponent); String beginplaceHolderValue = ComponentUtility.getInstance().getBeginPlaceHolder(childComponent); if (!StringUtility.isNullOrEmpty(beginplaceHolderValue)) { - String generatedBeginPlaceHolderComponentId = currentComponentId + "/" + componentId + "/" + beginPlaceHolderName; + String generatedBeginPlaceHolderComponentId; + if(i18nResourceItemBaseId.equals("")){ + generatedBeginPlaceHolderComponentId = currentComponentId + "/" + componentId + "/" + beginPlaceHolderName; + }else{ + generatedBeginPlaceHolderComponentId = currentComponentType + "/" + currentComponentId + "/" + componentId + "/" + beginPlaceHolderName; + } + I18nResourceItem i18nBeginPlaceholderResourceItem = I18nResourceItemManager.createI18nResourceItem(i18nResourceItemBaseId, generatedBeginPlaceHolderComponentId, beginplaceHolderValue, beginplaceHolderValue); this.addInCollection(i18nResourceItemCollection, i18nBeginPlaceholderResourceItem); } @@ -172,7 +195,13 @@ public class QuerySchemeI18nResourceStrategy extends AbstractI18nResourceStrateg String endPlaceHolderName = ComponentUtility.getInstance().getEndPlaceHolderName(childComponent); String endPlaceHolderValue = ComponentUtility.getInstance().getEndPlaceHolder(childComponent); if (!StringUtility.isNullOrEmpty(endPlaceHolderValue)) { - String generatedEndPlaceHolderComponentId = currentComponentId + "/" + componentId + "/" + endPlaceHolderName; + String generatedEndPlaceHolderComponentId; + if(i18nResourceItemBaseId.equals("")){ + generatedEndPlaceHolderComponentId = currentComponentId + "/" + componentId + "/" + endPlaceHolderName; + }else{ + generatedEndPlaceHolderComponentId = currentComponentType + "/" + currentComponentId + "/" + componentId + "/" + endPlaceHolderName; + } + I18nResourceItem i18nEndPlaceholderResourceItem = I18nResourceItemManager.createI18nResourceItem(i18nResourceItemBaseId, generatedEndPlaceHolderComponentId, endPlaceHolderValue, endPlaceHolderValue); this.addInCollection(i18nResourceItemCollection, i18nEndPlaceholderResourceItem); } -- Gitee From f3de40803abe93fd90fa65961889d223cd152ff2 Mon Sep 17 00:00:00 2001 From: lorcan <13231947+lorcan-lv@user.noreply.gitee.com> Date: Fri, 6 Feb 2026 15:28:33 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E6=8E=A8=E9=80=81=E8=A1=A8=E5=8D=95?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E8=B7=A8=E6=9C=8D=E5=8A=A1=E5=8D=95=E5=85=83?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../formformat/FormFormatHandler.java | 1 + .../formformat/FormFormatRtcUtility.java | 38 +++ .../handler/WFFormFormatMobileHandler.java | 239 +++++++++--------- .../handler/WFFormFormatPcHandler.java | 10 +- 4 files changed, 166 insertions(+), 122 deletions(-) create mode 100644 web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/FormFormatRtcUtility.java diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/FormFormatHandler.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/FormFormatHandler.java index 82726ee7..844442e6 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/FormFormatHandler.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/FormFormatHandler.java @@ -28,6 +28,7 @@ public abstract class FormFormatHandler { public abstract void pushFormFormat(GspMetadata formMetadata, String formatType, String formPath); + @Deprecated public abstract void pushRtcFormFormat(GspMetadata formMetadata, String formatType, DimensionExtendEntity dimension); public abstract void pushNoCodeFormFormat(GspMetadata formMetadata, String formatType); diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/FormFormatRtcUtility.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/FormFormatRtcUtility.java new file mode 100644 index 00000000..5cce4831 --- /dev/null +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/FormFormatRtcUtility.java @@ -0,0 +1,38 @@ +package com.inspur.edp.web.formmetadata.formformat; + +import com.inspur.edp.formserver.viewmodel.formentity.VoFormModel; +import com.inspur.edp.metadata.rtcustomization.api.entity.DimensionExtendEntity; +import com.inspur.edp.web.common.customexception.WebCustomException; +import io.iec.edp.caf.commons.utils.SpringBeanUtils; +import io.iec.edp.caf.rpc.api.service.RpcClient; + +import java.util.LinkedHashMap; + +public class FormFormatRtcUtility { + + public static boolean canPushFormFormat(String voId) { + try { + LinkedHashMap params = new LinkedHashMap<>(); + params.put("voId", voId); + RpcClient rpcClient = SpringBeanUtils.getBean(RpcClient.class); + return rpcClient.invoke(Boolean.TYPE, "com.inspur.edp.rtc.template.api.rpc.RtcTemplateRpcService.canPushFormFormat", "Bcc", params, null); + } catch (Exception e) { + throw new WebCustomException("failed to invoke the Rpc interface: com.inspur.edp.rtc.template.api.rpc.RtcTemplateRpcService.canPushFormFormat", e); + } + } + + public static void buildRtcFormFormat(VoFormModel voFormModel, DimensionExtendEntity dimension, String voId, String bizObjectID) { + try { + LinkedHashMap params = new LinkedHashMap<>(); + params.put("voFormModel", voFormModel); + params.put("dimensionExtendEntity", dimension); + params.put("voId", voId); + params.put("businessObjectId", bizObjectID); + RpcClient rpcClient = SpringBeanUtils.getBean(RpcClient.class); + rpcClient.invoke(Void.TYPE, "com.inspur.edp.rtc.template.api.rpc.RtcTemplateRpcService.buildRtcFormFormat", "Bcc", params, null); + } catch (Exception e) { + throw new WebCustomException("failed to invoke the Rpc interface: com.inspur.edp.rtc.template.api.rpc.RtcTemplateRpcService.buildRtcFormFormat", e); + } + + } +} diff --git a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/handler/WFFormFormatMobileHandler.java b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/handler/WFFormFormatMobileHandler.java index 95bd4643..7c3d375e 100644 --- a/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/handler/WFFormFormatMobileHandler.java +++ b/web-form-metadata/src/main/java/com/inspur/edp/web/formmetadata/formformat/handler/WFFormFormatMobileHandler.java @@ -2,8 +2,6 @@ package com.inspur.edp.web.formmetadata.formformat.handler; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ArrayNode; -import com.inspur.edp.customize.form.api.RuntimeCheckVoFormVariableService; -import com.inspur.edp.customize.service.VoRuntimeBuildFormFormatService; import com.inspur.edp.formserver.viewmodel.formentity.*; import com.inspur.edp.formserver.vmapi.formconfig.VoBuildFormFormatService; import com.inspur.edp.lcm.metadata.api.entity.GspMetadata; @@ -14,6 +12,7 @@ import com.inspur.edp.lcm.metadata.api.service.MetadataService; import com.inspur.edp.metadata.rtcustomization.api.entity.DimensionExtendEntity; import com.inspur.edp.web.common.utility.StringUtility; import com.inspur.edp.web.formmetadata.formformat.FormFormatHandler; +import com.inspur.edp.web.formmetadata.formformat.FormFormatRtcUtility; import com.inspur.edp.web.formmetadata.metadata.FormMetadataContent; import io.iec.edp.caf.businessobject.api.entity.DevBasicBoInfo; import io.iec.edp.caf.businessobject.api.service.DevBasicInfoService; @@ -28,12 +27,13 @@ import java.util.*; /** * 向vo推送按钮、字段、命令,用于权限控制 */ -public class WFFormFormatMobileHandler extends FormFormatHandler { +public class WFFormFormatMobileHandler extends FormFormatHandler { - private final List controlsWithButton = Arrays.asList("ListView","Button","ButtonGroup","Card","Section"); + private final List controlsWithButton = Arrays.asList("ListView", "Button", "ButtonGroup", "Card", "Section"); /** * 表单类型 + * * @return */ @Override @@ -63,22 +63,20 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { FormMetadataContent formContents = (FormMetadataContent) formMetadata.getContent(); JsonNode content = formContents.getContents(); String voId = content.at("/module/schemas/0/id").textValue(); - RuntimeCheckVoFormVariableService runtimeCheckVoFormVariableService = SpringBeanUtils.getBean(RuntimeCheckVoFormVariableService.class); - boolean isPushRtcForm = runtimeCheckVoFormVariableService.checkVoFormVariable(voId); + boolean isPushRtcForm = FormFormatRtcUtility.canPushFormFormat(voId); if (!isPushRtcForm) { return; } - VoRuntimeBuildFormFormatService voRuntimeBuildFormFormatService = SpringBeanUtils.getBean(VoRuntimeBuildFormFormatService.class); - VoFormModel voFormModel = getVoFormModel(formMetadata, formatType, null,"LCDP"); - String dim1 = StringUtils.isNotBlank(dimension.getFirstDimension())?dimension.getFirstDimension():"public"; - String dim2 = StringUtils.isNotBlank(dimension.getSecondDimension())?dimension.getSecondDimension():"public"; + VoFormModel voFormModel = getVoFormModel(formMetadata, formatType, null, "LCDP"); + String dim1 = StringUtils.isNotBlank(dimension.getFirstDimension()) ? dimension.getFirstDimension() : "public"; + String dim2 = StringUtils.isNotBlank(dimension.getSecondDimension()) ? dimension.getSecondDimension() : "public"; generateParameters(voFormModel.getUrlParameters(), "dim1", "维度一", dim1); generateParameters(voFormModel.getUrlParameters(), "dim2", "维度二", dim2); generateParameters(voFormModel.getUrlParameters(), "metadataId", "元数据id", dimension.getBasicMetadataId()); - voRuntimeBuildFormFormatService.buildFormFormat(voFormModel, dimension, voId, formMetadata.getHeader().getBizobjectID()); + FormFormatRtcUtility.buildRtcFormFormat(voFormModel, dimension, voId, formMetadata.getHeader().getBizobjectID()); } @Override @@ -135,6 +133,7 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { /** * 获取实体信息 + * * @param formContent * @return */ @@ -167,39 +166,38 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { } - - /** * 提取按钮 + * * @param formContent 表单内容 * @return 按钮信息 */ @Override - public List getButtons(JsonNode formContent){ + public List getButtons(JsonNode formContent) { // 递归找Button JsonNode componentArr = formContent.at("/module/components"); JsonNode viewmodelArr = formContent.at("/module/viewmodels"); - List buttonGroupList = new ArrayList<>(); + List buttonGroupList = new ArrayList<>(); List cardPageviewModelIdList = new ArrayList<>(); - componentArr.forEach(component->{ - String componentType = getValue(component,"componentType",null); - String pageType = getValue(component,"pageType",null); - String viewModelId = getValue(component,"viewModel",null); + componentArr.forEach(component -> { + String componentType = getValue(component, "componentType", null); + String pageType = getValue(component, "pageType", null); + String viewModelId = getValue(component, "viewModel", null); //找到卡片页面的视图模型 - if( "Page".equals(componentType) && "Card".equals(pageType) && StringUtils.isNotBlank(viewModelId)){ + if ("Page".equals(componentType) && "Card".equals(pageType) && StringUtils.isNotBlank(viewModelId)) { cardPageviewModelIdList.add(viewModelId); } }); - for(JsonNode component :componentArr){ - String viewModelId = getValue(component,"viewModel",null); - JsonNode parentViewModel = findParentViewModelId( viewmodelArr, viewModelId); + for (JsonNode component : componentArr) { + String viewModelId = getValue(component, "viewModel", null); + JsonNode parentViewModel = findParentViewModelId(viewmodelArr, viewModelId); //只提取卡片页面及其子组件 - if( cardPageviewModelIdList.contains(getValue(parentViewModel,"id",null))){ + if (cardPageviewModelIdList.contains(getValue(parentViewModel, "id", null))) { searchComponentsForButton(component, buttonGroupList); } } @@ -207,16 +205,16 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { return buttonGroupList; } - private JsonNode findParentViewModelId(JsonNode viewmodelArr,String curViewmodelId){ + private JsonNode findParentViewModelId(JsonNode viewmodelArr, String curViewmodelId) { JsonNode result = null; - if(StringUtils.isNotBlank(curViewmodelId) ){ - for(JsonNode viewmodel :viewmodelArr){ - if(curViewmodelId.equals(getValue(viewmodel,"id",null))){ + if (StringUtils.isNotBlank(curViewmodelId)) { + for (JsonNode viewmodel : viewmodelArr) { + if (curViewmodelId.equals(getValue(viewmodel, "id", null))) { result = viewmodel; - String parentViewModelId = getValue(viewmodel,"parent",null); - if(StringUtils.isNotBlank(parentViewModelId)){ - JsonNode parentViewModel = findParentViewModelId( viewmodelArr, parentViewModelId); - if(parentViewModel != null ){ + String parentViewModelId = getValue(viewmodel, "parent", null); + if (StringUtils.isNotBlank(parentViewModelId)) { + JsonNode parentViewModel = findParentViewModelId(viewmodelArr, parentViewModelId); + if (parentViewModel != null) { result = parentViewModel; } @@ -230,6 +228,7 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { /** * 提取方法 + * * @param formContent * @return */ @@ -237,41 +236,41 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { // 1.遍历页面组件 JsonNode componentArr = formContent.at("/module/components"); String cardViewModelId = null; - for(JsonNode component:componentArr){ - String componentType = getValue(component,"componentType",null); - String pageType = getValue(component,"pageType",null); + for (JsonNode component : componentArr) { + String componentType = getValue(component, "componentType", null); + String pageType = getValue(component, "pageType", null); //找到卡片页面 - if( "Page".equals(componentType) && "Card".equals(pageType)){ - cardViewModelId = getValue(component,"viewModel",""); + if ("Page".equals(componentType) && "Card".equals(pageType)) { + cardViewModelId = getValue(component, "viewModel", ""); break; } } List methodGroupList = new ArrayList<>(); - if(StringUtils.isNotBlank(cardViewModelId)){ + if (StringUtils.isNotBlank(cardViewModelId)) { JsonNode viewModelArr = formContent.at("/module/viewmodels"); //2.遍历视图模型 - for(JsonNode viewModel:viewModelArr){ - String viewModelId = getValue(viewModel,"id",null); - if(StringUtils.isNotBlank(viewModelId) && cardViewModelId.equals(viewModelId)){ + for (JsonNode viewModel : viewModelArr) { + String viewModelId = getValue(viewModel, "id", null); + if (StringUtils.isNotBlank(viewModelId) && cardViewModelId.equals(viewModelId)) { JsonNode commands = viewModel.get("commands"); //3.遍历命令 - if(commands != null && commands.size() > 0){ - commands.forEach(command->{ + if (commands != null && commands.size() > 0) { + commands.forEach(command -> { MethodGroup methodGroup = new MethodGroup(); - methodGroup.setId(getValue(command,"id",null)); - methodGroup.setMethodCode(getValue(command,"code",null)); - methodGroup.setMethodName(getValue(command,"name",null)); + methodGroup.setId(getValue(command, "id", null)); + methodGroup.setMethodCode(getValue(command, "code", null)); + methodGroup.setMethodName(getValue(command, "name", null)); //4.遍历命令参数 JsonNode params = command.get("params"); - if(params != null && params.size() > 0){ + if (params != null && params.size() > 0) { List methodParamList = new ArrayList<>(); - params.forEach(param->{ + params.forEach(param -> { MethodParam methodParam = new MethodParam(); - methodParam.setCode(getValue(param,"name",null)); - methodParam.setName(getValue(param,"shownName",null)); + methodParam.setCode(getValue(param, "name", null)); + methodParam.setName(getValue(param, "shownName", null)); methodParam.setValue(null); methodParamList.add(methodParam); @@ -292,25 +291,26 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { /** * 查找带按钮的组件 - * @param root 页面组件 + * + * @param root 页面组件 * @param buttonGroupList 按钮组列表 */ private void searchComponentsForButton(JsonNode root, List buttonGroupList) { - if(root.isArray()) { + if (root.isArray()) { for (JsonNode jsonNode : root) { searchComponentsForButton(jsonNode, buttonGroupList); } } - if(root.isObject()){ + if (root.isObject()) { JsonNode type = root.get("type"); - if(type != null && controlsWithButton.contains(type.asText())){ + if (type != null && controlsWithButton.contains(type.asText())) { this.findButtons(root, buttonGroupList); - }else { + } else { Iterator fieldNames = root.fieldNames(); - while(fieldNames.hasNext()) { + while (fieldNames.hasNext()) { String fieldName = fieldNames.next(); JsonNode fieldValue = root.get(fieldName); - if(fieldValue.isArray() || fieldValue.isObject()){ + if (fieldValue.isArray() || fieldValue.isObject()) { searchComponentsForButton(fieldValue, buttonGroupList); } } @@ -320,13 +320,14 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { /** * 查找控件中按钮 - * @param node 组件节点 + * + * @param node 组件节点 * @param buttonGroupList 按钮组列表 */ - private void findButtons(JsonNode node,List buttonGroupList){ + private void findButtons(JsonNode node, List buttonGroupList) { String type = node.get("type").asText(); - switch (type){ - case "NavigationBar":{ + switch (type) { + case "NavigationBar": { //在流程中会隐藏头部和尾部,不需要提取导航栏的按钮。 break; // JsonNode toolbar = node.get("toolbar"); @@ -339,52 +340,52 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { // } // break; } - case "ListView":{ + case "ListView": { //删除 - JsonNode swipeToolbar = node.get("swipeToolbar"); - if(swipeToolbar != null){ + JsonNode swipeToolbar = node.get("swipeToolbar"); + if (swipeToolbar != null) { ArrayNode items = (ArrayNode) swipeToolbar.get("items"); - if(items != null && items.size() > 0 ){ - this.findComplexButtons( items, node , buttonGroupList); + if (items != null && items.size() > 0) { + this.findComplexButtons(items, node, buttonGroupList); } } //多选 - JsonNode toolbar = node.get("toolbar"); - if(toolbar != null){ + JsonNode toolbar = node.get("toolbar"); + if (toolbar != null) { ArrayNode items = (ArrayNode) toolbar.get("items"); - if(items != null && items.size() > 0 ){ - this.findComplexButtons( items, node , buttonGroupList); + if (items != null && items.size() > 0) { + this.findComplexButtons(items, node, buttonGroupList); } } break; } - case "Button":{ + case "Button": { findSingleButton(node, buttonGroupList); break; } - case "ButtonGroup":{ + case "ButtonGroup": { ArrayNode items = (ArrayNode) node.get("items"); - if(items != null && items.size() > 0 ){ - this.findComplexButtons( items, node , buttonGroupList); + if (items != null && items.size() > 0) { + this.findComplexButtons(items, node, buttonGroupList); } break; } - case "Card":{ + case "Card": { ArrayNode items = (ArrayNode) node.get("actions"); - if(items != null && items.size() > 0 ){ - this.findComplexButtons( items, node , buttonGroupList); + if (items != null && items.size() > 0) { + this.findComplexButtons(items, node, buttonGroupList); } break; } - case "Section":{ - JsonNode footerToolbar = node.get("footerToolbar"); - if(null == footerToolbar){ + case "Section": { + JsonNode footerToolbar = node.get("footerToolbar"); + if (null == footerToolbar) { break; } ArrayNode items = (ArrayNode) footerToolbar.get("items"); - if(items !=null && items.size() > 0 ){ - this.findComplexButtons( items, node , buttonGroupList); + if (items != null && items.size() > 0) { + this.findComplexButtons(items, node, buttonGroupList); } break; } @@ -393,7 +394,8 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { /** * 查找简单按钮 - * @param node 组件节点 + * + * @param node 组件节点 * @param buttonGroupList 按钮组列表 */ private void findSingleButton(JsonNode node, List buttonGroupList) { @@ -412,11 +414,11 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { //3.创建按钮 List configAbleAttrs = getConfigAbleAttrs(node); if (!configAbleAttrs.isEmpty()) { - Button button = new Button(); + Button button = new Button(); button.setId(node.get("id").asText()); button.setCode(node.get("id").asText()); button.setType(node.get("type").asText()); - button.setName(getName(node,"按钮")); + button.setName(getName(node, "按钮")); button.setConfigurableAttrs(configAbleAttrs); buttonGroup.setButtons(Collections.singletonList(button)); @@ -427,16 +429,17 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { /** * 查找复杂按钮 - * @param childNodes 按钮项 - * @param parentNode 按钮父级信息 + * + * @param childNodes 按钮项 + * @param parentNode 按钮父级信息 * @param buttonGroupList 按钮组列表 */ - private void findComplexButtons(ArrayNode childNodes, JsonNode parentNode , List buttonGroupList){ + private void findComplexButtons(ArrayNode childNodes, JsonNode parentNode, List buttonGroupList) { // 1.创建按钮组。button 当前没有分组信息,用方法名暂时做分组名 ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.setId(parentNode.get("id").asText()); buttonGroup.setCode(parentNode.get("id").asText()); - String name= getName(parentNode,"按钮"); + String name = getName(parentNode, "按钮"); String id = ""; if (parentNode.get("id") != null) { id = parentNode.get("id").asText(); @@ -444,16 +447,16 @@ public class WFFormFormatMobileHandler extends FormFormatHandler { name += "[" + id + "]"; buttonGroup.setName(name); - List