From 525f944e661e9681e430635d3edd59b837d7d634 Mon Sep 17 00:00:00 2001 From: zhf <1204297681@qq.com> Date: Mon, 17 Mar 2025 21:43:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=BB=E8=BE=91=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E8=A1=A5=E5=85=85=E9=80=BB=E8=BE=91=E6=89=80?= =?UTF-8?q?=E6=9C=89=E8=80=85=E7=9A=84=E7=BB=98=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../public/assets/svg/backend.svg | 14 ++ .../public/assets/svg/common.svg | 23 ++++ .../public/assets/svg/front.svg | 14 ++ .../antv-x6-design/src/components/index.ts | 1 + .../components/logic-holder/logic-holder.scss | 24 ++++ .../components/logic-holder/logic-holder.tsx | 47 +++++++ .../scale-toolbar/scale-toolbar.scss | 5 + .../x6-cell-controller/x6-cell-controller.ts | 11 ++ .../x6-panel-item-stencil.controller.ts | 122 +++++++++++++++++- .../x6-panel-item/x6-panel-item.controller.ts | 119 ++++++++++++++++- .../x6-panel-item/x6-panel-item.state.ts | 9 ++ .../x6-panel-item/x6-panel-item.tsx | 10 +- .../interface/x6-design-view.event.ts | 23 ++++ 13 files changed, 416 insertions(+), 6 deletions(-) create mode 100644 packages/antv-x6-design/public/assets/svg/backend.svg create mode 100644 packages/antv-x6-design/public/assets/svg/common.svg create mode 100644 packages/antv-x6-design/public/assets/svg/front.svg create mode 100644 packages/antv-x6-design/src/components/logic-holder/logic-holder.scss create mode 100644 packages/antv-x6-design/src/components/logic-holder/logic-holder.tsx diff --git a/packages/antv-x6-design/public/assets/svg/backend.svg b/packages/antv-x6-design/public/assets/svg/backend.svg new file mode 100644 index 00000000..4d0cc721 --- /dev/null +++ b/packages/antv-x6-design/public/assets/svg/backend.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/antv-x6-design/public/assets/svg/common.svg b/packages/antv-x6-design/public/assets/svg/common.svg new file mode 100644 index 00000000..a7417292 --- /dev/null +++ b/packages/antv-x6-design/public/assets/svg/common.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/antv-x6-design/public/assets/svg/front.svg b/packages/antv-x6-design/public/assets/svg/front.svg new file mode 100644 index 00000000..b9ffb4f5 --- /dev/null +++ b/packages/antv-x6-design/public/assets/svg/front.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/antv-x6-design/src/components/index.ts b/packages/antv-x6-design/src/components/index.ts index 74849a34..ed4e9472 100644 --- a/packages/antv-x6-design/src/components/index.ts +++ b/packages/antv-x6-design/src/components/index.ts @@ -1 +1,2 @@ export { ScaleToolbar } from './scale-toolbar/scale-toolbar'; +export { LogicHolder } from './logic-holder/logic-holder'; diff --git a/packages/antv-x6-design/src/components/logic-holder/logic-holder.scss b/packages/antv-x6-design/src/components/logic-holder/logic-holder.scss new file mode 100644 index 00000000..7943a4f9 --- /dev/null +++ b/packages/antv-x6-design/src/components/logic-holder/logic-holder.scss @@ -0,0 +1,24 @@ +@include b(x6-logic-holder) { + position: absolute; + top: 0; + left: 0; + z-index: 9; + width: 100px; + height: 100px; + + @include e(icon) { + width: 100px; + height: 100px; + } + + @include e(text) { + position: absolute; + top: 52px; + width: 84%; + font-size: 14px; + font-weight: 500; + line-height: 20px; + color: #2f54eb; + text-align: center; + } +} \ No newline at end of file diff --git a/packages/antv-x6-design/src/components/logic-holder/logic-holder.tsx b/packages/antv-x6-design/src/components/logic-holder/logic-holder.tsx new file mode 100644 index 00000000..ce2dd540 --- /dev/null +++ b/packages/antv-x6-design/src/components/logic-holder/logic-holder.tsx @@ -0,0 +1,47 @@ +import { useNamespace } from '@ibiz-template/vue3-util'; +import { defineComponent } from 'vue'; +import { resource } from '../../global'; +import './logic-holder.scss'; + +export const LogicHolder = defineComponent({ + props: { + value: { + type: Number, + required: true, + }, + }, + setup() { + const ns = useNamespace('x6-logic-holder'); + + // 逻辑所有者映射 + const map = { + 1: { + text: '后台', + icon: resource.dir('./assets/svg/backend.svg'), + }, + 2: { + text: '前台', + icon: resource.dir('./assets/svg/front.svg'), + }, + 3: { + text: '通用', + icon: resource.dir('./assets/svg/common.svg'), + }, + }; + + return { ns, map }; + }, + render() { + const item = this.map[this.value as keyof typeof this.map]; + if (!item) { + return; + } + + return ( +
+ +
{item.text}
+
+ ); + }, +}); diff --git a/packages/antv-x6-design/src/components/scale-toolbar/scale-toolbar.scss b/packages/antv-x6-design/src/components/scale-toolbar/scale-toolbar.scss index d4302f10..76169d59 100644 --- a/packages/antv-x6-design/src/components/scale-toolbar/scale-toolbar.scss +++ b/packages/antv-x6-design/src/components/scale-toolbar/scale-toolbar.scss @@ -5,6 +5,11 @@ left: 6px; z-index: 10; + @include when(right) { + right: 6px; + left: auto; + } + .el-button-group .el-button.el-button--primary { --el-button-bg-color: #{getCssVar(color, primary)}; --el-button-text-color: #{getCssVar(color, primary, text)}; diff --git a/packages/antv-x6-design/src/controller/x6-cell-controller/x6-cell-controller.ts b/packages/antv-x6-design/src/controller/x6-cell-controller/x6-cell-controller.ts index aaa1d0d8..db5161a3 100644 --- a/packages/antv-x6-design/src/controller/x6-cell-controller/x6-cell-controller.ts +++ b/packages/antv-x6-design/src/controller/x6-cell-controller/x6-cell-controller.ts @@ -127,6 +127,17 @@ export abstract class X6CellController { protected onMessageChange(msg: IPortalMessage): void { if (msg.data && typeof msg.data === 'object') { const id = (msg.data as IData).srfkey; + const view = this.panel.view as IData; + const data = view?.state?.data; + const entity = msg.data as IData; + if ( + data && + data.srfkey === id && + data.srfdecodename && + data.srfdecodename === entity.srfdecodename + ) { + return; + } if (id && this.map.has(id)) { const cell = this.g.getCellById(id); if (cell) { diff --git a/packages/antv-x6-design/src/panel-items/x6-panel-item-stencil/x6-panel-item-stencil.controller.ts b/packages/antv-x6-design/src/panel-items/x6-panel-item-stencil/x6-panel-item-stencil.controller.ts index 16176c87..ff3c54c1 100644 --- a/packages/antv-x6-design/src/panel-items/x6-panel-item-stencil/x6-panel-item-stencil.controller.ts +++ b/packages/antv-x6-design/src/panel-items/x6-panel-item-stencil/x6-panel-item-stencil.controller.ts @@ -1,10 +1,18 @@ +/* eslint-disable prefer-const */ import { CodeListItem, PanelItemController, ScriptFactory, UIActionUtil, + getControl, } from '@ibiz-template/runtime'; -import { IPanelField, ICodeListEditor, IAppCodeList } from '@ibiz/model-core'; +import { + IPanelField, + ICodeListEditor, + IAppCodeList, + IDEEditForm, + IDEFormDetail, +} from '@ibiz/model-core'; import { Stencil } from '@antv/x6-plugin-stencil'; import { RuntimeModelError, awaitTimeout } from '@ibiz-template/core'; import { Graph } from '@antv/x6'; @@ -12,6 +20,7 @@ import { X6PanelItemStencilState } from './x6-panel-item-stencil.state'; import { X6PanelItemController } from '../x6-panel-item/x6-panel-item.controller'; import { X6Controller } from '../../controller'; import { X6NodeServiceProvider } from '../../interface'; +import { X6DesignViewController } from '../../views'; export class X6PanelItemStencilController extends PanelItemController { protected get x6Controller(): X6PanelItemController { @@ -70,6 +79,108 @@ export class X6PanelItemStencilController extends PanelItemController} + */ + protected async onInit(): Promise { + await super.onInit(); + const editorParams = this.model.editor?.editorParams; + this.showLogicHolder = editorParams?.showLogicHolder === 'true'; + if (this.showLogicHolder) { + this.logicHolder = this.view.state.data?.logicholder || 3; + this.initCodeList(); + this.view.evt.on('onLogicHolderChange', e => { + if (!e) { + return; + } + this.logicHolder = e.logicHolder || 3; + this.s?.dispose(); + this.s = undefined; + if (this.container) { + this.initStencil(this.container); + } + }); + } + } + + /** + * 初始化代码表 + * + * @author zhanghengfeng + * @date 2025-03-17 19:03:16 + * @protected + * @return {*} {void} + */ + protected initCodeList(): void { + const node = getControl(this.view.model, 'node') as IDEEditForm; + if (!node) { + throw new RuntimeModelError(this.view, '未找到 node 表单模型'); + } + const pages = node.deformPages; + if (!Array.isArray(pages) || !pages.length) { + return; + } + const page = pages[0]; + const formDetails = page.deformDetails; + if (!Array.isArray(formDetails)) { + return; + } + const formDetail = formDetails.find( + item => item.codeName === 'front_type', + ) as IDEFormDetail & { editor?: { appCodeListId?: string } }; + if (!formDetail) { + return; + } + const editor = formDetail.editor; + if (editor) { + this.frontCodeListId = editor.appCodeListId; + } + } + /** * 加载代码表 * @@ -321,8 +432,15 @@ export class X6PanelItemStencilController extends PanelItemController */ rawItemParams: IData = {}; + /** + * 是否显示逻辑所有者 + * + * @author zhanghengfeng + * @date 2025-03-17 19:03:30 + * @type {boolean} + */ + showLogicHolder: boolean = false; + + /** + * 主实体 + * + * @author zhanghengfeng + * @date 2025-03-17 19:03:53 + * @type {IAppDataEntity} + */ + majorEntity?: IAppDataEntity; + + /** + * 主服务 + * + * @author zhanghengfeng + * @date 2025-03-17 19:03:03 + * @type {IAppDEService} + */ + majorService?: IAppDEService; + protected async onInit(): Promise { await super.onInit(); this.handleRawItemParams(); @@ -31,16 +68,91 @@ export class X6PanelItemController extends PanelItemController if (!this.x6 || this.x6.g.disposed) { return; } + if (this.showLogicHolder) { + const logicHolder = this.view.state.data?.logicholder || 3; + if (logicHolder !== this.state.logicHolder) { + this.state.logicHolder = logicHolder; + this.view.evt.emit('onLogicHolderChange', { + logicHolder, + }); + } + } await this.x6.refresh(); }); this.view.evt.on('onRefreshView', async () => { if (!this.x6 || this.x6.g.disposed) { return; } + if (this.showLogicHolder) { + const logicHolder = this.view.state.data?.logicholder || 3; + if (logicHolder !== this.state.logicHolder) { + this.state.logicHolder = logicHolder; + this.view.evt.emit('onLogicHolderChange', { + logicHolder, + }); + } + } await this.x6.refresh(); }); this.onPanelActivated = this.onPanelActivated.bind(this); this.panel.evt.on('onActivated', this.onPanelActivated); + this.showLogicHolder = this.rawItemParams.showlogicholder === 'true'; + if (this.showLogicHolder) { + this.state.logicHolder = this.view.state.data?.logicholder || 3; + const app = ibiz.hub.getApp(this.view.model.appId); + const majorForm = getControl(this.view.model, 'form'); + if (!majorForm) { + throw new RuntimeModelError(this.view, '未找到 form 表单模型'); + } + this.majorEntity = await ibiz.hub.getAppDataEntity( + majorForm.appDataEntityId!, + this.view.model.appId, + ); + this.majorService = await app.deService.getService( + this.view.context, + majorForm.appDataEntityId!, + ); + this.onDataUpdate = this.onDataUpdate.bind(this); + ibiz.mc.command.update.on(this.onDataUpdate); + } + } + + /** + * 监听数据变化 + * + * @author zhanghengfeng + * @date 2025-03-17 19:03:47 + * @protected + * @param {IPortalMessage} msg + * @return {*} {Promise} + */ + protected async onDataUpdate(msg: IPortalMessage): Promise { + if (!msg || !msg.data || typeof msg.data !== 'object') { + return; + } + if (!this.majorEntity || !this.majorService) { + return; + } + const data = msg.data as IDataEntity; + if ( + data.srfdecodename === this.majorEntity.codeName && + data.srfkey === this.view.state.data?.srfkey + ) { + const majorResult = await this.majorService.getTemp( + this.panel.context, + this.panel.params, + ); + if (!majorResult || !majorResult.ok || !majorResult.data) { + return; + } + const logicHolder = majorResult.data.logicholder || 3; + if (logicHolder !== this.state.logicHolder) { + this.state.logicHolder = logicHolder; + this.view.evt.emit('onLogicHolderChange', { + logicHolder, + }); + } + } } /** @@ -183,5 +295,8 @@ export class X6PanelItemController extends PanelItemController this.x6?.destroy(); this.view.select.off(this.onSelectDataChange); this.panel.evt.off('onActivated', this.onPanelActivated); + if (this.showLogicHolder) { + ibiz.mc.command.update.off(this.onDataUpdate); + } } } diff --git a/packages/antv-x6-design/src/panel-items/x6-panel-item/x6-panel-item.state.ts b/packages/antv-x6-design/src/panel-items/x6-panel-item/x6-panel-item.state.ts index ea7ac70c..30a8ee4a 100644 --- a/packages/antv-x6-design/src/panel-items/x6-panel-item/x6-panel-item.state.ts +++ b/packages/antv-x6-design/src/panel-items/x6-panel-item/x6-panel-item.state.ts @@ -17,4 +17,13 @@ export class X6PanelItemState extends PanelItemState { * @memberof X6PanelItemState */ loading: boolean = false; + + /** + * 逻辑所有者 + * + * @author zhanghengfeng + * @date 2025-03-17 19:03:54 + * @type {number} + */ + logicHolder: number = 3; } diff --git a/packages/antv-x6-design/src/panel-items/x6-panel-item/x6-panel-item.tsx b/packages/antv-x6-design/src/panel-items/x6-panel-item/x6-panel-item.tsx index dad8245d..f64e9d82 100644 --- a/packages/antv-x6-design/src/panel-items/x6-panel-item/x6-panel-item.tsx +++ b/packages/antv-x6-design/src/panel-items/x6-panel-item/x6-panel-item.tsx @@ -2,7 +2,7 @@ import { PropType, defineComponent, onMounted, onUnmounted, ref } from 'vue'; import { useNamespace } from '@ibiz-template/vue3-util'; import { IPanelRawItem } from '@ibiz/model-core'; import { X6PanelItemController } from './x6-panel-item.controller'; -import { ScaleToolbar } from '../../components'; +import { LogicHolder, ScaleToolbar } from '../../components'; import './x6-panel-item.scss'; export default defineComponent({ @@ -62,7 +62,13 @@ export default defineComponent({ class={[this.ns.b(), this.ns.m(this.theme), this.shellNS.b()]} v-loading={this.controller.state.loading} > - + {this.controller.showLogicHolder ? ( + + ) : null} +
diff --git a/packages/antv-x6-design/src/views/x6-design-view/interface/x6-design-view.event.ts b/packages/antv-x6-design/src/views/x6-design-view/interface/x6-design-view.event.ts index bf631e62..17e13b6c 100644 --- a/packages/antv-x6-design/src/views/x6-design-view/interface/x6-design-view.event.ts +++ b/packages/antv-x6-design/src/views/x6-design-view/interface/x6-design-view.event.ts @@ -45,4 +45,27 @@ export interface X6DesignViewEvent extends IViewEvent { event: EventBase; emitArgs: undefined; }; + + /** + * 逻辑所有者改变 + * + * @author zhanghengfeng + * @date 2025-03-17 20:03:37 + * @type {({ + * event: EventBase & { + * logicHolder: number; + * }; + * emitArgs: { + * logicHolder: number; + * }; + * })} + */ + onLogicHolderChange: { + event: EventBase & { + logicHolder: number; + }; + emitArgs: { + logicHolder: number; + }; + }; } -- Gitee