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 (
+
+ );
+ },
+});
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