From b7ff7fcd5720e6e024ad55032bfe8c04e3faf07a Mon Sep 17 00:00:00 2001 From: lijianxiong <1518062161@qq.com> Date: Thu, 4 Sep 2025 11:06:39 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat=EF=BC=9A=E9=83=A8=E4=BB=B6=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=8A=B6=E6=80=81=E5=80=BCisCounterDisabled=EF=BC=88?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E7=A6=81=E7=94=A8=E8=AE=A1=E6=95=B0=E5=99=A8?= =?UTF-8?q?=EF=BC=89=EF=BC=8C=E6=96=B0=E5=A2=9E=E9=83=A8=E4=BB=B6=E8=83=BD?= =?UTF-8?q?=E5=8A=9BdisableCounter=EF=BC=88=E7=A6=81=E7=94=A8=E9=83=A8?= =?UTF-8?q?=E4=BB=B6=E8=AE=A1=E6=95=B0=E5=99=A8=E6=96=B9=E6=B3=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/common/control/control.controller.ts | 9 +++++++++ .../api/controller/control/i-api-control.controller.ts | 6 ++++++ .../interface/api/state/control/i-api-control.state.ts | 7 +++++++ 3 files changed, 22 insertions(+) diff --git a/packages/runtime/src/controller/common/control/control.controller.ts b/packages/runtime/src/controller/common/control/control.controller.ts index 584e07e7e06..01917e99b84 100644 --- a/packages/runtime/src/controller/common/control/control.controller.ts +++ b/packages/runtime/src/controller/common/control/control.controller.ts @@ -221,6 +221,7 @@ export class ControlController< this.state.disabled = false; this.state.maskOption = { mode: 'BLANK' }; this.state.zIndex = undefined; + this.state.isCounterDisabled = false; } protected async onCreated(): Promise { @@ -681,4 +682,12 @@ export class ControlController< } this.state.maskOption = options; } + + /** + * @description 禁用部件计数器 + * @memberof ControlController + */ + disableCounter(): void { + this.state.isCounterDisabled = true; + } } diff --git a/packages/runtime/src/interface/api/controller/control/i-api-control.controller.ts b/packages/runtime/src/interface/api/controller/control/i-api-control.controller.ts index 21973151bbd..ddbbbae510b 100644 --- a/packages/runtime/src/interface/api/controller/control/i-api-control.controller.ts +++ b/packages/runtime/src/interface/api/controller/control/i-api-control.controller.ts @@ -88,6 +88,12 @@ export interface IApiControlController< */ disabled(options?: IApiMaskOption): void; + /** + * @description 禁用部件计数器 + * @memberof IApiControlController + */ + disableCounter(): void; + /** * @description 触发实体数据变更的通知 * @param {('create' | 'update' | 'remove')} type diff --git a/packages/runtime/src/interface/api/state/control/i-api-control.state.ts b/packages/runtime/src/interface/api/state/control/i-api-control.state.ts index a82f45d251c..ec5df78d622 100644 --- a/packages/runtime/src/interface/api/state/control/i-api-control.state.ts +++ b/packages/runtime/src/interface/api/state/control/i-api-control.state.ts @@ -62,4 +62,11 @@ export interface IApiControlState extends IApiControllerState { * @memberof IApiControlState */ maskOption: IApiMaskOption; + + /** + * @description 是否禁用计数器 + * @type {boolean} + * @memberof IApiControllerState + */ + isCounterDisabled: boolean; } -- Gitee From dc75cd1e488cb66367c1bd64eda5c23576cc8987 Mon Sep 17 00:00:00 2001 From: lijianxiong <1518062161@qq.com> Date: Thu, 4 Sep 2025 11:15:54 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat=EF=BC=9A=E8=8F=9C=E5=8D=95=E3=80=81?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E3=80=81=E6=90=9C=E7=B4=A2=E6=A0=8F=E3=80=81?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=A0=8F=E3=80=81=E6=A0=91=E3=80=81=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=AF=BC=E8=88=AA=E9=9D=A2=E6=9D=BF=E3=80=81=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E7=AD=89=E9=83=A8=E4=BB=B6=EF=BC=8C=E5=9C=A8=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E8=AE=A1=E6=95=B0=E5=99=A8=E6=97=B6=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E9=83=A8=E4=BB=B6=E7=8A=B6=E6=80=81=E5=B1=9E=E6=80=A7?= =?UTF-8?q?isCounterDisabled=EF=BC=88=E6=98=AF=E5=90=A6=E7=A6=81=E7=94=A8?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E5=99=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/controller/control/app-menu/app-menu.controller.ts | 1 + .../src/controller/control/form/form/form.controller.ts | 6 +++++- .../src/controller/control/panel/panel/panel.controller.ts | 1 + .../controller/control/search-bar/search-bar.controller.ts | 1 + .../control/tab-exp-panel/tab-exp-panel.controller.ts | 1 + .../src/controller/control/toolbar/toolbar.controller.ts | 1 + .../runtime/src/controller/control/tree/tree.controller.ts | 1 + 7 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/runtime/src/controller/control/app-menu/app-menu.controller.ts b/packages/runtime/src/controller/control/app-menu/app-menu.controller.ts index 27976dfc825..ec1f5642638 100644 --- a/packages/runtime/src/controller/control/app-menu/app-menu.controller.ts +++ b/packages/runtime/src/controller/control/app-menu/app-menu.controller.ts @@ -309,6 +309,7 @@ export class AppMenuController * @Date: 2023-07-10 15:14:21 */ getCounter(id: string): AppCounter | null { + if (this.state.isCounterDisabled) return null; const { counters } = this.ctx.view; if (counters[id]) { return counters[id]; diff --git a/packages/runtime/src/controller/control/form/form/form.controller.ts b/packages/runtime/src/controller/control/form/form/form.controller.ts index 3624368f5bc..9590187f337 100644 --- a/packages/runtime/src/controller/control/form/form/form.controller.ts +++ b/packages/runtime/src/controller/control/form/form/form.controller.ts @@ -261,9 +261,9 @@ export abstract class FormController< */ protected async onCreated(): Promise { await super.onCreated(); - await this.initDetailControllers(); // 初始化计数器 await this.initCounter(); + await this.initDetailControllers(); // 数据变更通知防抖,且合并参数 this.dataChangeNotify = debounceAndAsyncMerge( @@ -585,6 +585,9 @@ export abstract class FormController< await super.onDestroyed(); // 销毁视图计数器 Object.values(this.counters).forEach(counter => counter.destroy()); + Object.values(this.formItems).forEach(item => { + item.destroy(); + }); } /** @@ -595,6 +598,7 @@ export abstract class FormController< * @return {*} {Promise} */ protected async initCounter(): Promise { + if (this.state.isCounterDisabled) return; this.counters = {}; const { appCounterRefs } = this.model; if (appCounterRefs && appCounterRefs.length > 0) { diff --git a/packages/runtime/src/controller/control/panel/panel/panel.controller.ts b/packages/runtime/src/controller/control/panel/panel/panel.controller.ts index c86f044fbf8..5f6bd892115 100644 --- a/packages/runtime/src/controller/control/panel/panel/panel.controller.ts +++ b/packages/runtime/src/controller/control/panel/panel/panel.controller.ts @@ -166,6 +166,7 @@ export class PanelController< * @memberof PanelController */ protected async initCounter(): Promise { + if (this.state.isCounterDisabled) return; this.counters = {}; const { appCounterRefs } = this.model; if (appCounterRefs && appCounterRefs.length > 0) { diff --git a/packages/runtime/src/controller/control/search-bar/search-bar.controller.ts b/packages/runtime/src/controller/control/search-bar/search-bar.controller.ts index 76aa63bcdaa..cb90774caa1 100644 --- a/packages/runtime/src/controller/control/search-bar/search-bar.controller.ts +++ b/packages/runtime/src/controller/control/search-bar/search-bar.controller.ts @@ -1069,6 +1069,7 @@ export class SearchBarController * @memberof SearchBarController */ protected async initCounter(): Promise { + if (this.state.isCounterDisabled) return; const { appCounterRefs } = this.model as IData; const appCounterRef = appCounterRefs?.[0]; if (appCounterRef) { diff --git a/packages/runtime/src/controller/control/tab-exp-panel/tab-exp-panel.controller.ts b/packages/runtime/src/controller/control/tab-exp-panel/tab-exp-panel.controller.ts index 9c9e3ad4fdb..d7dcbe187b1 100644 --- a/packages/runtime/src/controller/control/tab-exp-panel/tab-exp-panel.controller.ts +++ b/packages/runtime/src/controller/control/tab-exp-panel/tab-exp-panel.controller.ts @@ -308,6 +308,7 @@ export class TabExpPanelController * @memberof TabExpPanelController */ protected async initCounter(): Promise { + if (this.state.isCounterDisabled) return; const { appCounterRefs } = this.model as IData; const appCounterRef = appCounterRefs?.[0]; if (appCounterRef) { diff --git a/packages/runtime/src/controller/control/toolbar/toolbar.controller.ts b/packages/runtime/src/controller/control/toolbar/toolbar.controller.ts index f687cf2866b..76313d70fc7 100644 --- a/packages/runtime/src/controller/control/toolbar/toolbar.controller.ts +++ b/packages/runtime/src/controller/control/toolbar/toolbar.controller.ts @@ -213,6 +213,7 @@ export class ToolbarController< * @return {*} */ initCounter(): void { + if (this.state.isCounterDisabled) return; const { counters } = this.ctx.view; const { appCounterRefs } = this.ctx.view.model.viewLayoutPanel!; if (appCounterRefs && appCounterRefs.length > 0) { diff --git a/packages/runtime/src/controller/control/tree/tree.controller.ts b/packages/runtime/src/controller/control/tree/tree.controller.ts index da6d0024bf8..def94072b90 100644 --- a/packages/runtime/src/controller/control/tree/tree.controller.ts +++ b/packages/runtime/src/controller/control/tree/tree.controller.ts @@ -280,6 +280,7 @@ export class TreeController< * @return {*} {Promise} */ protected async initCounter(): Promise { + if (this.state.isCounterDisabled) return; const { appCounterRefs } = this.model; const appCounterRef = appCounterRefs?.[0]; if (appCounterRef) { -- Gitee From 614449353b9333212ead52a7050aadab6f58ad6b Mon Sep 17 00:00:00 2001 From: lijianxiong <1518062161@qq.com> Date: Thu, 4 Sep 2025 11:23:04 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat=EF=BC=9A=E6=96=B0=E5=A2=9E=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E9=A1=B9=E8=AE=A1=E6=95=B0=E5=99=A8=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E5=B0=86=E8=A1=A8=E5=8D=95=E9=A1=B9=E8=AE=A1=E6=95=B0=E5=99=A8?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E7=BB=9F=E4=B8=80=E8=BF=81=E7=A7=BB=E8=87=B3?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=99=A8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../form-detail/form-detail.controller.ts | 47 +++++++++++++++++++ .../form-detail/form-detail.state.ts | 7 +++ .../form-tab-panel.controller.ts | 19 ++++++++ .../panel/panel/panel-item.controller.ts | 2 +- .../form-detail/i-api-form-detail.state.ts | 8 ++++ .../form-detail/i-form-detail.controller.ts | 6 +++ 6 files changed, 88 insertions(+), 1 deletion(-) diff --git a/packages/runtime/src/controller/control/form/form-detail/form-detail/form-detail.controller.ts b/packages/runtime/src/controller/control/form/form-detail/form-detail/form-detail.controller.ts index d1035c6923b..b5fde585e7d 100644 --- a/packages/runtime/src/controller/control/form/form-detail/form-detail/form-detail.controller.ts +++ b/packages/runtime/src/controller/control/form/form-detail/form-detail/form-detail.controller.ts @@ -10,6 +10,7 @@ import { ScriptFactory, verifyFormGroupLogic } from '../../../../../utils'; import { FormNotifyState } from '../../../../constant'; import { FormDetailState } from './form-detail.state'; import { FormController } from '../../form'; +import { AppCounter } from '../../../../../service'; export class FormDetailController implements IFormDetailController @@ -122,6 +123,13 @@ export class FormDetailController required: undefined, }; + /** + * @description 计数器对象 + * @type {AppCounter} + * @memberof FormDetailController + */ + counter?: AppCounter; + /** * Creates an instance of FormDetailController. * @author lxm @@ -189,6 +197,45 @@ export class FormDetailController this.model.caption, ); } + this.handleCounterChange = this.handleCounterChange.bind(this); + this.initCounter(); + } + + /** + * @description 初始化计数器 + * @protected + * @returns {*} {void} + * @memberof FormDetailController + */ + protected initCounter(): void { + const { counters } = this.form; + const { appCounterRefId } = this.model; + if (appCounterRefId) { + this.counter = counters[appCounterRefId]; + this.counter?.onChange(this.handleCounterChange); + } + } + + /** + * @description 处理计数器改变,并根据计数器模式计算显示状态 + * @protected + * @param {IData} data + * @returns {*} {void} + * @memberof FormDetailController + */ + protected handleCounterChange(data: IData): void { + this.state.counterData = data; + let state: boolean = true; + const { counterId, counterMode } = this.model; + if (counterId) { + const count = this.counter?.getCounter(counterId); + if (counterMode === 1 && count === 0) state = false; + this.state.visible = state; + } + } + + destroy(): void { + this.counter?.offChange(this.handleCounterChange); } /** diff --git a/packages/runtime/src/controller/control/form/form-detail/form-detail/form-detail.state.ts b/packages/runtime/src/controller/control/form/form-detail/form-detail/form-detail.state.ts index 8d4eee57d1e..c11feb7e452 100644 --- a/packages/runtime/src/controller/control/form/form-detail/form-detail/form-detail.state.ts +++ b/packages/runtime/src/controller/control/form/form-detail/form-detail/form-detail.state.ts @@ -81,6 +81,13 @@ export class FormDetailState implements IFormDetailState { */ enableReadonly: boolean = true; + /** + * @description 计数器数据 + * @type {IData} + * @memberof FormDetailState + */ + counterData: IData = {}; + constructor(protected parent?: IFormDetailContainerState) { // 定义是否显示,set方法需要返回true,否则vue proxy报错 let $visible: boolean = true; diff --git a/packages/runtime/src/controller/control/form/form-detail/form-tab-panel/form-tab-panel.controller.ts b/packages/runtime/src/controller/control/form/form-detail/form-tab-panel/form-tab-panel.controller.ts index 0e15acfb4e5..08c53b7bc70 100644 --- a/packages/runtime/src/controller/control/form/form-detail/form-tab-panel/form-tab-panel.controller.ts +++ b/packages/runtime/src/controller/control/form/form-detail/form-tab-panel/form-tab-panel.controller.ts @@ -28,6 +28,25 @@ export class FormTabPanelController this.state.activeTab = this.model.deformTabPages?.[0].id || ''; } + /** + * @description 初始化计数器 + * @protected + * @returns {*} {void} + * @memberof FormTabPanelController + */ + protected initCounter(): void { + const tabPage = this.model.deformTabPages?.find( + _item => !!_item.appCounterRefId, + ); + if (!tabPage) return; + const { counters } = this.form; + const { appCounterRefId } = tabPage; + if (appCounterRefId) { + this.counter = counters[appCounterRefId]; + this.counter?.onChange(this.handleCounterChange); + } + } + /** * 分页点击切换处理 * @author lxm diff --git a/packages/runtime/src/controller/control/panel/panel/panel-item.controller.ts b/packages/runtime/src/controller/control/panel/panel/panel-item.controller.ts index 47546f70d1a..55f445ea180 100644 --- a/packages/runtime/src/controller/control/panel/panel/panel-item.controller.ts +++ b/packages/runtime/src/controller/control/panel/panel/panel-item.controller.ts @@ -133,6 +133,7 @@ export class PanelItemController if (labelSysCss?.cssName) { this.state.class.label.push(labelSysCss.cssName); } + this.handleCounterChange = this.handleCounterChange.bind(this); this.initCounter(); } @@ -145,7 +146,6 @@ export class PanelItemController protected initCounter(): void { const { counters } = this.panel; const { appCounterRefId } = this.model; - this.handleCounterChange = this.handleCounterChange.bind(this); if (appCounterRefId) { this.counter = counters[appCounterRefId]; this.counter?.onChange(this.handleCounterChange); diff --git a/packages/runtime/src/interface/api/state/control/form-detail/i-api-form-detail.state.ts b/packages/runtime/src/interface/api/state/control/form-detail/i-api-form-detail.state.ts index 9028f2dacc7..54b3ac7e9ee 100644 --- a/packages/runtime/src/interface/api/state/control/form-detail/i-api-form-detail.state.ts +++ b/packages/runtime/src/interface/api/state/control/form-detail/i-api-form-detail.state.ts @@ -1,3 +1,4 @@ +import { IApiData } from '@ibiz-template/core'; import { IApiColState } from '../../common'; /** @@ -69,4 +70,11 @@ export interface IApiFormDetailState extends IApiColState { * @memberof IApiFormDetailState */ required: boolean; + + /** + * @description 计数器数据 + * @type {IApiData} + * @memberof IApiFormDetailState + */ + counterData: IApiData; } diff --git a/packages/runtime/src/interface/controller/controller/control/form-detail/i-form-detail.controller.ts b/packages/runtime/src/interface/controller/controller/control/form-detail/i-form-detail.controller.ts index 1897c447692..7150a126937 100644 --- a/packages/runtime/src/interface/controller/controller/control/form-detail/i-form-detail.controller.ts +++ b/packages/runtime/src/interface/controller/controller/control/form-detail/i-form-detail.controller.ts @@ -27,4 +27,10 @@ export interface IFormDetailController * @memberof IFormDetailController */ formStateNotify(state: FormNotifyState): Promise; + + /** + * @description 销毁方法 + * @memberof IApiFormDetailController + */ + destroy(): void; } -- Gitee From c14ebdee93008d66769ec596dea9d6bde043afc3 Mon Sep 17 00:00:00 2001 From: lijianxiong <1518062161@qq.com> Date: Thu, 4 Sep 2025 11:23:26 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat=EF=BC=9A=E6=9B=B4=E6=96=B0CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/runtime/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/runtime/CHANGELOG.md b/packages/runtime/CHANGELOG.md index 135647f309d..4e6fe86484c 100644 --- a/packages/runtime/CHANGELOG.md +++ b/packages/runtime/CHANGELOG.md @@ -14,6 +14,12 @@ - 新增移动端mobWeChatDebug全局参数,控制是否开启微信js-sdk的debug模式 - 新增微信工具类,包含获取签名getSign、配置微信授权config方法 - 新增表单全局参数validateMode与表单部件参数validatemode,为notification时表单项错误信息以通知方式显示 +- 新增部件状态属性isCounterDisabled(是否禁用计数器,值为true时禁用),新增部件能力disableCounter(禁用部件计数器方法) +- 新增表单项计数器,并将表单项计数器逻辑统一迁移至控制器处理 + +### Changed + +- 菜单、表单、搜索栏、工具栏、树、分页导航面板、面板等部件,在初始化计数器时识别部件状态属性isCounterDisabled(是否禁用计数器) ### Fixed -- Gitee