From abca41f8512bbe1bd2cbb27636edc33e3dd0de7a Mon Sep 17 00:00:00 2001 From: zhf <1204297681@qq.com> Date: Mon, 11 Nov 2024 22:30:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA=E5=92=8C=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E7=9A=84=E6=95=B0=E6=8D=AE=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model-clipboard-import-view.tsx | 31 ++++---- .../model-clipboard-item.tsx | 52 ++++++++------ .../model-edit-view/model-edit-view.tsx | 72 ++++++++++++------- .../src/interface/i-model-params.ts | 13 +--- packages/model-design/src/model/model-data.ts | 18 +---- .../src/ui-action/model-edit-provider.ts | 2 +- .../src/ui-action/model-export-provider.ts | 52 ++++++++++---- .../src/ui-action/model-import-provider.ts | 48 ++++++++++--- 8 files changed, 175 insertions(+), 113 deletions(-) diff --git a/packages/model-design/src/components/model-clipboard-import-view/model-clipboard-import-view.tsx b/packages/model-design/src/components/model-clipboard-import-view/model-clipboard-import-view.tsx index 37aaf7c0..fd8aea17 100644 --- a/packages/model-design/src/components/model-clipboard-import-view/model-clipboard-import-view.tsx +++ b/packages/model-design/src/components/model-clipboard-import-view/model-clipboard-import-view.tsx @@ -4,7 +4,6 @@ import { PropType, computed, defineComponent } from 'vue'; import { useNamespace } from '@ibiz-template/vue3-util'; import draggable from 'vuedraggable'; import { ModelData } from '../../model'; -import { modelService } from '../../service'; import './model-clipboard-import-view.scss'; export default defineComponent({ @@ -123,7 +122,7 @@ export default defineComponent({ const materialItem = computed(() => { return modelClipboardController.state.items.filter(item => { if ( - !Object.is(c.state.params.srfDeName, item.srfDeName) || + !Object.is(c.state.params.codeName, item.codeName) || c.state.items.findIndex(self => Object.is(self.uuid, item.uuid)) !== -1 ) { @@ -140,32 +139,40 @@ export default defineComponent({ if (Array.isArray(models)) { c.state.models = models; } else { - ibiz.message.error('模型数据格式异常,请检查!', 0, true); + ibiz.message.error('模型数据格式异常,请检查!'); return; } } catch (error) { - ibiz.message.error('模型数据格式异常,请检查!', 0, true); + ibiz.message.error('模型数据格式异常,请检查!'); return; } c.state.isLoading = true; c.state.importItems = []; let isError: boolean = false; + const entity = await ibiz.hub.getAppDataEntity( + c.state.params.codeName, + props.context.srfappid, + ); + const app = ibiz.hub.getApp(props.context.srfappid); + const service = await app.deService.getService(props.context, entity.id!); for (let i = 0; i < c.state.models.length; i++) { const item = c.state.models[i]; const params: IParams = { - srfdename: c.state.params.srfDeName, - srfmodel: item, - srfparentdata: c.state.params.srfParentData, + srfmodelv2scope: props.context.srfmodelv2scope, + model: item, }; try { - const res = await modelService.saveModel(params, { - srfdename: c.state.params.srfDeName, - }); + const res = await service.exec( + 'ImportModelV2', + props.context, + params, + props.params, + ); if (res.status === 200) { c.state.isModelChange = false; c.state.importItems.push(item); } else { - ibiz.message.error(res.statusText, 0, true); + ibiz.message.error(res.statusText); isError = true; break; } @@ -176,8 +183,6 @@ export default defineComponent({ error?.data?.message || error?.statusText || ibiz.i18n.t('core.error.networkAbnormality'), - 0, - true, ); isError = true; break; diff --git a/packages/model-design/src/components/model-clipboard-item/model-clipboard-item.tsx b/packages/model-design/src/components/model-clipboard-item/model-clipboard-item.tsx index 5debda98..7a56f162 100644 --- a/packages/model-design/src/components/model-clipboard-item/model-clipboard-item.tsx +++ b/packages/model-design/src/components/model-clipboard-item/model-clipboard-item.tsx @@ -4,7 +4,6 @@ import { PropType, defineComponent, onUnmounted, ref } from 'vue'; import { useNamespace } from '@ibiz-template/vue3-util'; import { ModelData } from '../../model'; -import { modelService } from '../../service'; import './model-clipboard-item.scss'; export default defineComponent({ @@ -36,28 +35,30 @@ export default defineComponent({ for (let i: number = 0; i < props.data.items.length; i++) { const item = props.data.items[i]; try { - const params: IParams = { - srfdename: props.data.srfDeName, - srfkey: item.srfkey, - }; - if (props.data.srfParentData) { - params.srfparentdata = props.data.srfParentData; - } - const res = await modelService.loadModel(params); - if (res && res.status === 200) { - props.data.models.push(res.data); + const entity = await ibiz.hub.getAppDataEntity( + props.data.codeName, + props.context.srfappid, + ); + const app = ibiz.hub.getApp(props.context.srfappid); + const service = await app.deService.getService( + props.context, + entity.id!, + ); + const res = await service.exec( + 'ExportModelV2', + { + ...props.context, + [entity.deapicodeName!]: item.srfkey, + }, + props.params, + ); + if (res && res.status === 200 && res.data.model) { + props.data.models.push(res.data.model); } } catch (err: any) { props.data.isError = true; - if (err && err.data) { - ibiz.message.error( - `${props.data.title} 新建失败:${err.data.message || ''}`, - 3, - ); - props.data.errorInfo = err.data.message; - } else { - props.data.errorInfo = '模型导出发生未知错误!'; - } + props.data.errorInfo = err.message || '模型导出发生未知错误!'; + ibiz.message.error(props.data.errorInfo!); break; } if (isDestroyed.value) { @@ -76,9 +77,14 @@ export default defineComponent({ // 拷贝当前项 const copy = () => { - const result = ibiz.util.text.copy( - JSON.stringify(props.data.models, null, 2), - ); + const el = document.createElement('textarea'); + el.style.position = 'absolute'; + el.style.left = '-9999px'; + el.value = JSON.stringify(props.data.models, null, 2); + document.body.appendChild(el); + el.select(); + const result = document.execCommand('copy'); + document.body.removeChild(el); if (result) { ibiz.message.success('已复制模型数据至剪贴板'); } else { diff --git a/packages/model-design/src/components/model-edit-view/model-edit-view.tsx b/packages/model-design/src/components/model-edit-view/model-edit-view.tsx index 941ad17f..ce50df1a 100644 --- a/packages/model-design/src/components/model-edit-view/model-edit-view.tsx +++ b/packages/model-design/src/components/model-edit-view/model-edit-view.tsx @@ -1,8 +1,6 @@ import { defineComponent, PropType, ref } from 'vue'; import { IModal } from '@ibiz-template/runtime'; import { useNamespace } from '@ibiz-template/vue3-util'; -import pluralize from 'pluralize'; -import axios from 'axios'; import './model-edit-view.scss'; export default defineComponent({ @@ -12,6 +10,7 @@ export default defineComponent({ params: { type: Object as PropType, default: () => ({}) }, modal: { type: Object as PropType }, caption: { type: String, default: '' }, + codeName: { type: String, required: true }, }, setup(props) { const ns = useNamespace('model-edit-view'); @@ -35,21 +34,40 @@ export default defineComponent({ // 保存 const save = async (isClose: boolean = false) => { + try { + JSON.parse(value.value); + } catch (error) { + ibiz.message.error('模型数据格式异常,请检查!'); + return; + } isSave.value = true; - const context = props.context; - const deNamePlural: string = pluralize( - context.srfdename || '', - ).toLowerCase(); - const url: string = `/${deNamePlural}/${ - context[context.srfdename?.toLowerCase()] - }/importModel`; try { loading.value = true; loadingText.value = '保存中...'; - const res = await axios.post(url, JSON.parse(value.value)); + const entity = await ibiz.hub.getAppDataEntity( + props.codeName, + props.context.srfappid, + ); + const app = ibiz.hub.getApp(props.context.srfappid); + const service = await app.deService.getService( + props.context, + entity.id!, + ); + const deName = entity.codeName?.toLowerCase() || ''; + const params: IParams = { + [entity.keyAppDEFieldId!]: props.context[deName], + srfmodelv2scope: props.context.srfmodelv2scope, + model: JSON.parse(value.value), + }; + const res = await service.exec( + 'ImportModelV2', + props.context, + params, + props.params, + ); if (res.status !== 200) { ibiz.message.error( - res.data.message || + res.data?.message || res.statusText || ibiz.i18n.t('core.error.networkAbnormality'), ); @@ -71,27 +89,31 @@ export default defineComponent({ // 加载数据 const load = async () => { - const context = props.context; - const deNamePlural: string = pluralize( - context.srfdename || '', - ).toLowerCase(); - const url: string = `/${deNamePlural}/${ - context[context.srfdename?.toLowerCase()] - }/exportModel`; try { loading.value = true; loadingText.value = '加载中...'; - const res = await axios.post(url, {}); - if (res.status === 200) { - const data = res.data; - value.value = JSON.stringify(data, null, 4); + const entity = await ibiz.hub.getAppDataEntity( + props.codeName, + props.context.srfappid, + ); + const app = ibiz.hub.getApp(props.context.srfappid); + const service = await app.deService.getService( + props.context, + entity.id!, + ); + const res = await service.exec( + 'ExportModelV2', + props.context, + {}, + props.params, + ); + if (res.status === 200 && res.data && res.data.model) { + value.value = JSON.stringify(res.data.model, null, 4); } } catch (err) { const error = err as IData; ibiz.message.error( - error?.data?.message || - error?.statusText || - ibiz.i18n.t('core.error.networkAbnormality'), + error.message || ibiz.i18n.t('core.error.networkAbnormality'), ); } finally { loading.value = false; diff --git a/packages/model-design/src/interface/i-model-params.ts b/packages/model-design/src/interface/i-model-params.ts index 67b5eb13..d32a7952 100644 --- a/packages/model-design/src/interface/i-model-params.ts +++ b/packages/model-design/src/interface/i-model-params.ts @@ -9,22 +9,13 @@ export interface IModelParams { title: string; /** - * 实体名称 + * 实体codeName * * @author zhanghengfeng * @date 2024-10-25 20:10:06 * @type {string} */ - srfDeName: string; - - /** - * 父数据 - * - * @author zhanghengfeng - * @date 2024-10-25 20:10:16 - * @type {IData} - */ - srfParentData?: IData; + codeName: string; /** * 拷贝源数据 diff --git a/packages/model-design/src/model/model-data.ts b/packages/model-design/src/model/model-data.ts index 99f846d0..21073a18 100644 --- a/packages/model-design/src/model/model-data.ts +++ b/packages/model-design/src/model/model-data.ts @@ -57,22 +57,13 @@ export class ModelData { errorInfo?: string; /** - * 实体名称 + * 实体codeName * * @author zhanghengfeng * @date 2024-10-25 20:10:00 * @type {string} */ - srfDeName: string; - - /** - * 父数据 - * - * @author zhanghengfeng - * @date 2024-10-25 20:10:10 - * @type {IData} - */ - srfParentData?: IData; + codeName: string; /** * 拷贝源数据 @@ -94,12 +85,9 @@ export class ModelData { constructor(data: IModelParams) { this.title = data.title; - this.srfDeName = data.srfDeName; + this.codeName = data.codeName; if (data.items) { this.items = data.items; } - if (data.srfParentData) { - this.srfParentData = data.srfParentData; - } } } diff --git a/packages/model-design/src/ui-action/model-edit-provider.ts b/packages/model-design/src/ui-action/model-edit-provider.ts index 3d015066..7c6795cf 100644 --- a/packages/model-design/src/ui-action/model-edit-provider.ts +++ b/packages/model-design/src/ui-action/model-edit-provider.ts @@ -60,7 +60,6 @@ export class ModelEditProvider extends UIActionProviderBase { view.model.appDataEntityId!, view.model.appId, ); - resultContext.srfdename = appEntity?.codeName?.toLowerCase(); const className = `${useNamespace('drawer').b()} ${useNamespace( 'model-edit-view', ).b('drawer')}`; @@ -71,6 +70,7 @@ export class ModelEditProvider extends UIActionProviderBase { context: resultContext, params: resultParams, caption: view.model.caption || action.caption, + codeName: appEntity?.codeName, }); }, undefined, diff --git a/packages/model-design/src/ui-action/model-export-provider.ts b/packages/model-design/src/ui-action/model-export-provider.ts index 6838fb15..a6edfc86 100644 --- a/packages/model-design/src/ui-action/model-export-provider.ts +++ b/packages/model-design/src/ui-action/model-export-provider.ts @@ -5,9 +5,12 @@ import { IUIActionResult, IUILogicParams, UIActionProviderBase, + convertNavData, + formatMultiData, } from '@ibiz-template/runtime'; import { IAppDEUIAction } from '@ibiz/model-core'; import { useNamespace } from '@ibiz-template/vue3-util'; +import { notNilEmpty } from 'qx-util'; export class ModelExportProvider extends UIActionProviderBase { async execAction( @@ -18,28 +21,49 @@ export class ModelExportProvider extends UIActionProviderBase { if (!ibiz.modelClipboard) { return {}; } - // 处理参数 - const { resultContext, resultParams, resultData } = await this.handleParams( - action, - context, - data, - params, - ); - if (!Array.isArray(resultData) || resultData.length === 0) { + if (!Array.isArray(data) || data.length === 0) { return {}; } + // 是否是多数据 + const isMultiData = + ['MULTIKEY', 'MULTIDATA'].includes(action.actionTarget!) && + data.length > 0; + // 处理自定义导航上下文 + const resultContext = context.clone(); + const navContexts = action.navigateContexts; + if (notNilEmpty(navContexts)) { + Object.assign( + resultContext, + convertNavData( + navContexts, + isMultiData ? formatMultiData(navContexts, data) : data[0] || {}, + params, + context, + ), + ); + } + // 处理自定义导航参数 + const resultParams = {}; + const navParams = action.navigateParams; + if (notNilEmpty(navParams)) { + Object.assign( + resultParams, + convertNavData( + navParams, + isMultiData ? formatMultiData(navParams, data) : data[0] || {}, + params, + context, + ), + ); + } const entity = await ibiz.hub.getAppDataEntity( view.model.appDataEntityId!, view.model.appId, ); ibiz.modelClipboard.createItem({ title: `${entity.logicName}-${entity.codeName}`, - srfDeName: entity.codeName?.toLowerCase() || '', - srfParentData: { - srfparentdename: resultContext.srfparentdename, - srfparentkey: resultContext.srfparentkey, - }, - items: resultData, + codeName: entity.codeName!, + items: data, }); const className = `${useNamespace('drawer').b()} ${useNamespace( 'model-clipboard', diff --git a/packages/model-design/src/ui-action/model-import-provider.ts b/packages/model-design/src/ui-action/model-import-provider.ts index 5672df52..1055cdc1 100644 --- a/packages/model-design/src/ui-action/model-import-provider.ts +++ b/packages/model-design/src/ui-action/model-import-provider.ts @@ -5,9 +5,12 @@ import { IUIActionResult, IUILogicParams, UIActionProviderBase, + convertNavData, + formatMultiData, } from '@ibiz-template/runtime'; import { IAppDEUIAction } from '@ibiz/model-core'; import { useNamespace } from '@ibiz-template/vue3-util'; +import { notNilEmpty } from 'qx-util'; export class ModelImportProvider extends UIActionProviderBase { async execAction( @@ -18,22 +21,45 @@ export class ModelImportProvider extends UIActionProviderBase { if (!ibiz.modelClipboardImportView) { return {}; } - const { resultContext, resultParams } = await this.handleParams( - action, - context, - data, - params, - ); + // 是否是多数据 + const isMultiData = + ['MULTIKEY', 'MULTIDATA'].includes(action.actionTarget!) && + data.length > 0; + // 处理自定义导航上下文 + const resultContext = context.clone(); + const navContexts = action.navigateContexts; + if (notNilEmpty(navContexts)) { + Object.assign( + resultContext, + convertNavData( + navContexts, + isMultiData ? formatMultiData(navContexts, data) : data[0] || {}, + params, + context, + ), + ); + } + // 处理自定义导航参数 + const resultParams = {}; + const navParams = action.navigateParams; + if (notNilEmpty(navParams)) { + Object.assign( + resultParams, + convertNavData( + navParams, + isMultiData ? formatMultiData(navParams, data) : data[0] || {}, + params, + context, + ), + ); + } const entity = await ibiz.hub.getAppDataEntity( view.model.appDataEntityId!, view.model.appId, ); ibiz.modelClipboardImportView.updateParams({ - srfDeName: entity.codeName?.toLowerCase() || '', - srfParentData: { - srfparentdename: resultContext.srfparentdename, - srfparentkey: resultContext.srfparentkey, - }, + codeName: entity.codeName, + srfmodelv2scope: resultContext.srfmodelv2scope, }); const className = `${useNamespace('drawer').b()} ${useNamespace( 'model-clipboard-import-view', -- Gitee