diff --git a/packages/renderer/src/metadata/data-service/common-web-command-metadata-data-service.ts b/packages/renderer/src/metadata/data-service/common-web-command-metadata-data-service.ts index 6f5d1085190a483f02d23df52cfe7dfc8134c035..d131cc3cedc384ce692518eaed76cbed4effca83 100644 --- a/packages/renderer/src/metadata/data-service/common-web-command-metadata-data-service.ts +++ b/packages/renderer/src/metadata/data-service/common-web-command-metadata-data-service.ts @@ -23,9 +23,16 @@ export class CommonWebCommandMetadataDataService { }); } + public loadByDto(currentPath: string, metadataDto: any) { + return this.metadataRepository.loadByDto(currentPath, metadataDto).then((response: any) => { + return this.createMetadata(response); + }); + } + private createMetadata(response: any) { const metadata = { id: response.id, + nameSpace: response.nameSpace, content: JSON.parse(response.content), refs: JSON.parse(response.refs) }; diff --git a/packages/renderer/src/metadata/data-service/custom-web-command-metadata-data-service.ts b/packages/renderer/src/metadata/data-service/custom-web-command-metadata-data-service.ts index d0b7375047fe4e322bb307bfb3f19ff02b7a57ae..ca5e4807b31ac38a3355eed41496a035ba9d54e4 100644 --- a/packages/renderer/src/metadata/data-service/custom-web-command-metadata-data-service.ts +++ b/packages/renderer/src/metadata/data-service/custom-web-command-metadata-data-service.ts @@ -25,6 +25,12 @@ export class CustomWebCommandMetadataDataService { }); } + public loadByDto(currentPath: string, metadataDto: any) { + return this.metadataRepository.loadByDto(currentPath, metadataDto).then((response: any) => { + return this.createMetadata(response); + }); + } + private createMetadata(response: any) { const metadata = { id: response.id, diff --git a/packages/renderer/src/metadata/data-service/custom-web-component-metadata-data-service.ts b/packages/renderer/src/metadata/data-service/custom-web-component-metadata-data-service.ts index becc779e44764e0fa2622340a4af9ce12d5d8871..14fe5fe6ff6885713394e4f65e00a068637726b0 100644 --- a/packages/renderer/src/metadata/data-service/custom-web-component-metadata-data-service.ts +++ b/packages/renderer/src/metadata/data-service/custom-web-component-metadata-data-service.ts @@ -5,9 +5,9 @@ export class CustomWebComponentMetadataDataService { constructor(private metadataRepository: MetadataRepository) { } public loadByType(metadataPath: string) { - return this.metadataRepository.loadMetadatasByType(metadataPath, ".webcmp").then((metadatas: any[])=>{ - if(metadatas && metadatas.length>0){ - return Promise.all(metadatas.map((metadata: any)=>{ + return this.metadataRepository.loadMetadatasByType(metadataPath, ".webcmp").then((metadatas: any[]) => { + if (metadatas && metadatas.length > 0) { + return Promise.all(metadatas.map((metadata: any) => { return this.loadByFullPath(metadataPath, metadata.id); })); } @@ -31,6 +31,12 @@ export class CustomWebComponentMetadataDataService { }); } + public loadByDto(currentPath: string, metadataDto: any) { + return this.metadataRepository.loadByDto(currentPath, metadataDto).then((response: any) => { + return this.createMetadata(response); + }); + } + private createMetadata(response: any) { const metadata = { id: response.id, diff --git a/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts b/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts index 94726df171c393de9fe212b38d0910ed76e5b8bb..78ea24f9afc2f1249b2c627a1380718277582073 100644 --- a/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts +++ b/packages/renderer/src/metadata/data-service/form-metadata-data-service.ts @@ -17,6 +17,12 @@ export class FormMetadataDataService { }); } + public loadByDto(currentPath: string, metadataDto: any) { + return this.repository.loadByDto(currentPath, metadataDto).then((response: any) => { + return this.createMetadata(response); + }); + } + private createMetadata(response: any) { const { Contents: content } = JSON.parse(response.content); const refs = JSON.parse(response.refs); diff --git a/packages/renderer/src/metadata/data-service/metadata-data-service.ts b/packages/renderer/src/metadata/data-service/metadata-data-service.ts index 887fdb48ff38f09248c91871ecef204518d83fa7..6c8fe762ca2252273bcfbfc46192a097ad242468 100644 --- a/packages/renderer/src/metadata/data-service/metadata-data-service.ts +++ b/packages/renderer/src/metadata/data-service/metadata-data-service.ts @@ -14,28 +14,28 @@ export class MetadataDataService { private customWebCommandMetadataDataService: CustomWebCommandMetadataDataService ) { } + /** + * 根据Path加载元数据 + */ public loadMetadataByPath(projectPath: string, metadataPath: string) { return this.formMetadataDataService.loadByFullPath(metadataPath).then((formMetadata: Metadata) => { const schema = formMetadata.content as FormMetadata; + + // 状态机元数据 const { stateMachines = [] } = schema.module; - // const stateMachineRefSchema = stateMachines; const stateMachineMetadataPromise = stateMachines && stateMachines.length > 0 ? stateMachines.map((stateMachine: StateMachineRefMetadata) => { return this.stateMachineMetadataDataService.loadByProjectPath(projectPath, stateMachine.uri); }) : [Promise.resolve(null)]; - // const stateMachineMetadataPromise = stateMachines ? this.stateMachineMetadataDataService.loadByProjectPath(projectPath, stateMachineRefSchema.uri) : Promise.resolve(null); + + // 命令元数据 const commandsMetadataPromise = schema.module.webcmds.map((webCommand: WebCommandRefMetadata) => { const { id } = webCommand; return this.webCommandMetadataDataService.loadByProjectPath(projectPath, id); }); + + // 自定义构件元数据 const customWebComponentMetadataPromise = this.customWebComponentMetadataDataService.loadByType(projectPath); - // 资源元数据, 暂不加载 - // const resourceMetadatas = formMetadata.refs && formMetadata.refs.filter((ref: any) => { - // return ref.DependentMetadata.Type === "ResourceMetadata"; - // }).map((ref: any) => ref.DependentMetadata.ID) || []; - // const resourceMetadataPromise = resourceMetadatas.map((id: string) => { - // return useResourceMetadata(id, useCache); - // }); - // , Promise.all(resourceMetadataPromise) + const promises = [Promise.all(stateMachineMetadataPromise), Promise.all(commandsMetadataPromise), customWebComponentMetadataPromise]; return Promise.all(promises).then(([stateMachineSchema, commandSchemas, customWebComponents]) => { return { @@ -48,6 +48,9 @@ export class MetadataDataService { }); } + /** + * 根据ID加载元数据 + */ public loadMetadataById(metadataId: string) { return this.formMetadataDataService.loadById(metadataId).then((formMetadata: Metadata) => { const schema = formMetadata.content as FormMetadata; @@ -97,4 +100,75 @@ export class MetadataDataService { }); }); } + + /** + * 根据DTO加载元数据 + */ + public loadMetadataByDto(currentPath: any, formMetadataDto: any) { + return this.formMetadataDataService.loadByDto(currentPath, formMetadataDto).then((formMetadata: Metadata) => { + const schema = formMetadata.content as FormMetadata; + + // 状态机 + const { stateMachines } = schema.module; + const stateMachineMetadataPromise = stateMachines && stateMachines.length > 0 ? stateMachines.map((stateMachine: StateMachineRefMetadata) => { + const stateMachineMetadataDto = { + id: stateMachine.uri, + nameSpace: stateMachine.nameSpace + }; + return this.stateMachineMetadataDataService.loadByDto(currentPath, stateMachineMetadataDto); + }) : [Promise.resolve(null)]; + + // 命令构件 + const commandsMetadataPromise = schema.module.webcmds.map((webCommand: WebCommandRefMetadata) => { + const commandMetadataDto = { + id: webCommand.id, + nameSpace: webCommand.nameSpace + }; + return this.webCommandMetadataDataService.loadByDto(currentPath, commandMetadataDto); + }); + + const promises = [Promise.all(stateMachineMetadataPromise), Promise.all(commandsMetadataPromise)]; + + + return Promise.all(promises).then(([stateMachineSchema, commandSchemas]) => { + const customWebComponentDtos: any[] = []; + + if (commandSchemas && commandSchemas.length > 0) { + commandSchemas.forEach((commandSchema: any | null) => { + if (commandSchema && commandSchema.content && commandSchema.content.Extends && commandSchema.content.Extends.IsCommon === false) { + const commands = commandSchema.content.Commands as any[]; + commands.forEach((command: any) => { + const items = command.Items as any[]; + items.forEach((item: any) => { + if (!item.ComponentPath.startsWith('Gsp/')) { + const componentId = item.ComponentId; + const existedCustomWebComponentDto = customWebComponentDtos.find((customWebComponentDto) => { + return customWebComponentDto.id === componentId; + }); + if (!existedCustomWebComponentDto) { + customWebComponentDtos.push({ id: componentId, nameSpace: commandSchema.nameSpace }); + } + } + }); + }); + } + }); + } + + // 自定义Web构件 + const customWebComponentMetadataPromise = customWebComponentDtos.length > 0 ? Promise.all(customWebComponentDtos.map((customWebComponentDto: string) => { + return this.customWebComponentMetadataDataService.loadByDto(currentPath, customWebComponentDto); + })) : Promise.resolve(null); + + return customWebComponentMetadataPromise.then((customWebComponents: Metadata[] | null) => { + return { + form: formMetadata, + stateMachines: stateMachineSchema as Metadata[], + commands: commandSchemas as Metadata[], + webComponents: customWebComponents as Metadata[] + }; + }); + }); + }); + } } diff --git a/packages/renderer/src/metadata/data-service/state-machine-metadata-data-service.ts b/packages/renderer/src/metadata/data-service/state-machine-metadata-data-service.ts index a1df8a868dfa210e8523f686046c65c5e46d0ce8..e1fbead530d60518db667d1405f0332cb5e54e96 100644 --- a/packages/renderer/src/metadata/data-service/state-machine-metadata-data-service.ts +++ b/packages/renderer/src/metadata/data-service/state-machine-metadata-data-service.ts @@ -22,6 +22,12 @@ export class StateMachineMetadataDataService { }); } + public loadByDto(currentPath: string, metadataDto: any) { + return this.metadataRepository.loadByDto(currentPath, metadataDto).then((response: any) => { + return this.createMetadata(response); + }); + } + private createMetadata(response: any) { const metadata = { content: JSON.parse(response.content), diff --git a/packages/renderer/src/metadata/metadata-loader.ts b/packages/renderer/src/metadata/metadata-loader.ts index 995c73f327fbc9063b8e507e75937c767bd339a8..38c4693c67a8b5a63571bf7802185ba9d9bb5a55 100644 --- a/packages/renderer/src/metadata/metadata-loader.ts +++ b/packages/renderer/src/metadata/metadata-loader.ts @@ -36,7 +36,7 @@ class MetadataLoader { this.normalizeExternalComponents(formMetadataQuery, metadatas); this.metadataManager.setMetadatasCache(metadatas.form.id, metadatas); - await this.loadExternalMetadataByPath(metadatas.form); + await this.loadExternalMetadataByPath(formMetadataPath, metadatas.form); } /** @@ -53,22 +53,35 @@ class MetadataLoader { await this.loadExternalMetadataById(metadatas.form); } + /** + * 根据路径加载表单元数据 + */ + public async loadMetadataByDto(currentPath: string, formMetadataDto: any): Promise { + const metadatas = await this.metadataDataService.loadMetadataByDto(currentPath, formMetadataDto); + + const formMetadataQuery = new FormMetadataQuery(metadatas.form); + this.normalizeStatemachines(formMetadataQuery, metadatas); + this.normalizeExternalComponents(formMetadataQuery, metadatas); + + this.metadataManager.setMetadatasCache(metadatas.form.id, metadatas); + } + /** * 根据Path加载外部表单元数据 */ - public async loadExternalMetadataByPath(formMetadata: any): Promise { + public async loadExternalMetadataByPath(formMetadataPath: string, formMetadata: any): Promise { const formMetadataQuery = new FormMetadataQuery(formMetadata); const externalFormInfos = formMetadataQuery.getExternalFormInfos(); for (const externalFormInfo of externalFormInfos) { - if (externalFormInfo.formMetadataPath) { - - // 开发模式下优先使用path加载,以便能实时预览外部表单 - await this.loadMetadataByPath(externalFormInfo.formMetadataPath, externalFormInfo.formMetadataPath); + if (externalFormInfo.relativePath) { + const metadataPath = `${externalFormInfo.relativePath}/${externalFormInfo.fileName}`; + await this.loadMetadataByPath(metadataPath, metadataPath); } else { - await this.loadMetadataById(externalFormInfo.formMetadataId); + const { id, nameSpace } = externalFormInfo; + const metadataDto = { id, nameSpace }; + await this.loadMetadataByDto(formMetadataPath, metadataDto); } - } } @@ -80,7 +93,7 @@ class MetadataLoader { const externalFormInfos = formMetadataQuery.getExternalFormInfos(); for (const externalFormInfo of externalFormInfos) { - await this.loadMetadataById(externalFormInfo.formMetadataId); + await this.loadMetadataById(externalFormInfo.id); } } diff --git a/packages/renderer/src/metadata/repository/metadata-repository.ts b/packages/renderer/src/metadata/repository/metadata-repository.ts index bab8adb2437699dffb98fd3f742a73fbdc443fde..5a7dffc82b64ca4dfab7a5631230dcb56e10bd6c 100644 --- a/packages/renderer/src/metadata/repository/metadata-repository.ts +++ b/packages/renderer/src/metadata/repository/metadata-repository.ts @@ -16,6 +16,18 @@ export class MetadataRepository { return this.httpClient.get(`/api/dev/main/v1.0/metadatas/load`, { params: httpParams }); } + /** + * 根据DTO加载元数据 + */ + public loadByDto(currentPath: string, metadataDto: any): Promise { + const url = `/api/dev/main/v1.0/mdservice/pickMetadata?currentPath=${currentPath}`; + const body = metadataDto; + const requestConfig: HttpRequestConfig = { headers: { accept: 'application/json' } }; + return this.httpClient.post(url, body, requestConfig).then((result: any) => { + return result.metadata; + }); + } + /** * 根据元数据类型获取表单定义的其他元数据 * @param metadataPath 元数据工程路径 diff --git a/packages/renderer/src/metadata/types.ts b/packages/renderer/src/metadata/types.ts index b6d5002dea11ba56b38aae8659538940f5c93659..2acd6ae62b2dd3028f946f851782bf9e90233469 100644 --- a/packages/renderer/src/metadata/types.ts +++ b/packages/renderer/src/metadata/types.ts @@ -2,7 +2,13 @@ * 外部表单信息 */ export interface ExternalFormInfo { - externalContainerId: string, - formMetadataId: string, - formMetadataPath?: string + id: string, + code: string, + name: string, + fileName: string, + bizobjectID: string, + nameSpace: string, + relativePath?: string, + projectName?: string, + externalContainerId: string; } diff --git a/packages/renderer/src/service/form-metadata-query.ts b/packages/renderer/src/service/form-metadata-query.ts index 1d19d09f16b8fe4fe6fec769d46dc9666d346f49..4face9a08478d1252a7938c6d7f56a227c1a9fea 100644 --- a/packages/renderer/src/service/form-metadata-query.ts +++ b/packages/renderer/src/service/form-metadata-query.ts @@ -226,13 +226,9 @@ class FormMetadataQuery { return null; } - const formMetadataDir = externalComponent.relativePath; - const formMetadataFileName = externalComponent.fileName; - const formMetadataPath = formMetadataDir && formMetadataFileName ? `${formMetadataDir}/${formMetadataFileName}` : undefined; const externalFormInfo = { externalContainerId: externalContainer.id, - formMetadataId: externalComponent.id, - formMetadataPath: formMetadataPath + ...externalComponent }; return externalFormInfo;