From 60e12f5735ef3703d435db388ec914546f5f5065 Mon Sep 17 00:00:00 2001 From: ShineKOT <1917095344@qq.com> Date: Wed, 13 Nov 2024 19:56:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=20=E6=96=B0=E5=A2=9E=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E9=A1=B9=E5=8A=A8=E6=80=81=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=83=A8=E4=BB=B6=E5=8D=A0=E4=BD=8D=E9=80=89=E4=B8=AD?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hooks/use-ctrl-pos/use-ctrl-pos.ts | 8 +- .../use-panel-item-container.ts | 23 +++- .../view-design-control.tsx | 30 +----- packages/panel-design/src/entity/index.ts | 1 + .../pspanel-item-logic/pspanel-item-logic.ts | 82 ++++++++++++++ .../panel-design-material-area.controller.ts | 24 ++++- packages/panel-design/src/service/index.ts | 1 + .../pspanel-item-logic.service.ts | 101 ++++++++++++++++++ packages/view-design/src/service/index.ts | 7 ++ .../app-index-view-design.engine.ts | 24 ++++- 10 files changed, 260 insertions(+), 41 deletions(-) create mode 100644 packages/panel-design/src/entity/pspanel-item-logic/pspanel-item-logic.ts create mode 100644 packages/panel-design/src/service/pspanel-item-logic/pspanel-item-logic.service.ts diff --git a/packages/panel-design/src/components/panel-item-widgets/hooks/use-ctrl-pos/use-ctrl-pos.ts b/packages/panel-design/src/components/panel-item-widgets/hooks/use-ctrl-pos/use-ctrl-pos.ts index b56da165..6895f069 100644 --- a/packages/panel-design/src/components/panel-item-widgets/hooks/use-ctrl-pos/use-ctrl-pos.ts +++ b/packages/panel-design/src/components/panel-item-widgets/hooks/use-ctrl-pos/use-ctrl-pos.ts @@ -135,7 +135,7 @@ export function useCtrlPos(props, ctx) { * @return {*} {Promise} */ const loadCtrlsByType = async (): Promise => { - try { + if (ctrlType !== 'APPMENU') { const app = ibiz.hub.getApp(props.context.srfappid); const viewCtrlService = await app.deService.getService( props.context, @@ -156,12 +156,8 @@ export function useCtrlPos(props, ctx) { } ctrls.value = tempCtrls; } - } catch (error) { - ctrls.value = []; - ibiz.log.error(error); - } finally { - getCtrlId(); } + getCtrlId(); }; /** diff --git a/packages/panel-design/src/components/panel-item-widgets/hooks/use-panel-item-container/use-panel-item-container.ts b/packages/panel-design/src/components/panel-item-widgets/hooks/use-panel-item-container/use-panel-item-container.ts index 893f95ec..55465330 100644 --- a/packages/panel-design/src/components/panel-item-widgets/hooks/use-panel-item-container/use-panel-item-container.ts +++ b/packages/panel-design/src/components/panel-item-widgets/hooks/use-panel-item-container/use-panel-item-container.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { inject, onUnmounted, Ref, ref } from 'vue'; +import { clone } from '@ibiz-template/core'; import { PanelContentProvider, PanelItemActionItem, @@ -87,12 +88,30 @@ export function useLayoutItemContainer(props, ctx) { * @date 2024-10-16 11:10:21 * @param {MouseEvent} e */ - const onItemClick = (e: MouseEvent): void => { + const onItemClick = async (e: MouseEvent): Promise => { e.stopPropagation(); - const item = props.data.data; + const item = clone(props.data.data); if (!item) { return; } + // 部件占位选中时须将对应的视图部件合入数据中 + if (item.itemtype === 'CTRLPOS' && item.predefinedtype !== 'APPMENU') { + const app = ibiz.hub.getApp(props.context.srfappid); + const viewCtrlService = await app.deService.getService( + props.context, + 'viewdesign.psdeviewctrl', + ); + const res = await viewCtrlService.fetchDefault(props.context); + if (res && res.data.length > 0) { + const viewCtrl = res.data.find((ctrl: IData) => { + return Object.is( + ctrl.psdeviewctrlname?.toUpperCase(), + item.pssysviewpanelitemname?.toUpperCase(), + ); + }); + item.psdeviewctrlid = viewCtrl?.psdeviewctrlid || null; + } + } select.set({ id: item.srfkey, label: item.srfmajortext, diff --git a/packages/panel-design/src/components/panel-item-widgets/widgets/view-design-control/view-design-control.tsx b/packages/panel-design/src/components/panel-item-widgets/widgets/view-design-control/view-design-control.tsx index 606b98ff..9cc03aa7 100644 --- a/packages/panel-design/src/components/panel-item-widgets/widgets/view-design-control/view-design-control.tsx +++ b/packages/panel-design/src/components/panel-item-widgets/widgets/view-design-control/view-design-control.tsx @@ -291,33 +291,6 @@ export default defineComponent({ ) : null; }; - /** - * 项点击 - * - * @param {MouseEvent} e - * @return {*} {void} - */ - const onItemClick = (e: MouseEvent): void => { - e.stopPropagation(); - const item = props.data.data; - if (!item) { - return; - } - const viewCtrl = ctrls.value.find((ctrl: IData) => { - return ( - ctrl.psdeviewctrlname?.toLowerCase() === - props.data.data.pssysviewpanelitemname?.toLowerCase() - ); - }); - item.psdeviewctrlid = viewCtrl?.psdeviewctrlid; - select.set({ - id: item.srfkey, - label: item.srfmajortext, - type: item.itemtype, - data: item, - }); - }; - /** * 绘制内容组件 * @@ -363,14 +336,13 @@ export default defineComponent({ active, isShowMask, addControl, - onItemClick, renderControl, renderActions, }; }, render() { return ( -
+
控件占位({this.ctrlCaption}) diff --git a/packages/panel-design/src/entity/index.ts b/packages/panel-design/src/entity/index.ts index aed319c4..1b62f0f4 100644 --- a/packages/panel-design/src/entity/index.ts +++ b/packages/panel-design/src/entity/index.ts @@ -1,3 +1,4 @@ export { PSSysViewPanel } from './pssys-view-panel/pssys-view-panel'; export { PSSysViewPanelItem } from './pssys-view-panel-item/pssys-view-panel-item'; export { PSSysViewPanelLogic } from './pssys-view-panel-logic/pssys-view-panel-logic'; +export { PSPanelItemLogic } from './pspanel-item-logic/pspanel-item-logic'; diff --git a/packages/panel-design/src/entity/pspanel-item-logic/pspanel-item-logic.ts b/packages/panel-design/src/entity/pspanel-item-logic/pspanel-item-logic.ts new file mode 100644 index 00000000..0b24013d --- /dev/null +++ b/packages/panel-design/src/entity/pspanel-item-logic/pspanel-item-logic.ts @@ -0,0 +1,82 @@ +import { AppDataEntity } from '@ibiz-template/runtime'; +import { IAppDataEntity, ICodeItem, ISysImage } from '@ibiz/model-core'; + +export class PSPanelItemLogic extends AppDataEntity { + declare _typeCodeItems: ICodeItem[]; + + constructor( + entity: IAppDataEntity, + data: IData | PSPanelItemLogic, + typeCodeItems: ICodeItem[], + ) { + super(entity, data); + Object.defineProperty(this, '_typeCodeItems', { + enumerable: false, + configurable: true, + value: typeCodeItems, + }); + } + + get srftext() { + if (this.srftype === 'GROUP') { + return `${this.groupop || ''}`; + } + return `${this.dstfieldname || ''} ${this.condop || ''} ${ + this.condvalue || '' + }`; + } + + /** + * 设计树显示图标 + * + * @readonly + * @type {(ISysImage | undefined)} + * @memberof PSPanelItemLogic + */ + get srficon(): ISysImage | undefined { + const codeItem = this._typeCodeItems.find( + item => item.value === this.itemtype, + ); + return codeItem ? codeItem.sysImage : undefined; + } + + get srftype() { + return this.logictype; + } + + get itemtype() { + return this.logictype; + } + + get text(): string { + return this.srfmajortext; + } + + // @ts-expect-error + get srfordervalue(): number { + return this.ordervalue; + } + + // @ts-expect-error + set srfordervalue(value): number { + this.ordervalue = value; + } + + clone(): PSPanelItemLogic { + const entity = new PSPanelItemLogic( + this._entity, + this._data, + this._typeCodeItems, + ); + entity.srfkey = this.srfkey; + entity.srfordervalue = this.srfordervalue; + return entity; + } + + assign(data: AppDataEntity | IData): AppDataEntity { + if (data.srfordervalue === undefined) { + data.srfordervalue = this.srfordervalue; + } + return super.assign(data); + } +} diff --git a/packages/panel-design/src/panel-items/panel-design-material-area/panel-design-material-area.controller.ts b/packages/panel-design/src/panel-items/panel-design-material-area/panel-design-material-area.controller.ts index df259e66..078ba17e 100644 --- a/packages/panel-design/src/panel-items/panel-design-material-area/panel-design-material-area.controller.ts +++ b/packages/panel-design/src/panel-items/panel-design-material-area/panel-design-material-area.controller.ts @@ -14,8 +14,7 @@ import { IDEFormTabPanel, IDETBUIActionItem, } from '@ibiz/model-core'; -import { IPortalMessage } from '@ibiz-template/core'; -import { clone } from 'ramda'; +import { clone, IPortalMessage } from '@ibiz-template/core'; import { generateOrderValue, isNilOrEmpty } from 'qx-util'; import { debounce } from 'lodash-es'; import { PanelDesignMaterialAreaState } from './panel-design-material-area.state'; @@ -428,7 +427,8 @@ export class PanelDesignMaterialAreaController extends PanelItemController { * @param {IData} item * @return {*} {void} */ - handleItemSelect(item: IData): void { + async handleItemSelect(data: IData): Promise { + const item = clone(data); if (!item) { return; } @@ -436,6 +436,24 @@ export class PanelDesignMaterialAreaController extends PanelItemController { this.view.call('onActiveRoot'); return; } + // 部件占位选中时须将对应的视图部件合入数据中 + if (item.itemtype === 'CTRLPOS' && item.predefinedtype !== 'APPMENU') { + const app = ibiz.hub.getApp(this.view.context.srfappid); + const viewCtrlService = await app.deService.getService( + this.view.context, + 'viewdesign.psdeviewctrl', + ); + const res = await viewCtrlService.fetchDefault(this.view.context); + if (res && res.data.length > 0) { + const viewCtrl = res.data.find((ctrl: IData) => { + return Object.is( + ctrl.psdeviewctrlname?.toUpperCase(), + item.pssysviewpanelitemname?.toUpperCase(), + ); + }); + item.psdeviewctrlid = viewCtrl?.psdeviewctrlid; + } + } this.view.call('onActive', { id: item.srfkey!, label: item.srfmajortext!, diff --git a/packages/panel-design/src/service/index.ts b/packages/panel-design/src/service/index.ts index ef98d102..ff11ff2f 100644 --- a/packages/panel-design/src/service/index.ts +++ b/packages/panel-design/src/service/index.ts @@ -1,3 +1,4 @@ export { PSSysViewPanelService } from './pssys-view-panel/pssys-view-panel.service'; export { PSSysViewPanelItemService } from './pssys-view-panel-item/pssys-view-panel-item.service'; export { PSSysViewPanelLogicService } from './pssys-view-panel-logic/pssys-view-panel-logic.service'; +export { PSPanelItemLogicService } from './pspanel-item-logic/pspanel-item-logic.service'; diff --git a/packages/panel-design/src/service/pspanel-item-logic/pspanel-item-logic.service.ts b/packages/panel-design/src/service/pspanel-item-logic/pspanel-item-logic.service.ts new file mode 100644 index 00000000..282b20a7 --- /dev/null +++ b/packages/panel-design/src/service/pspanel-item-logic/pspanel-item-logic.service.ts @@ -0,0 +1,101 @@ +import { DEService, IDataEntity } from '@ibiz-template/runtime'; +import { IHttpResponse } from '@ibiz-template/core'; +import { IAppDataEntity, ICodeItem } from '@ibiz/model-core'; +import { PSPanelItemLogic } from '../../entity'; + +const ValueOPs: IData = { + EQ: '等于(=)', + NOTEQ: '不等于(<>)', + GT: '大于(>)', + GTANDEQ: '大于等于(>=)', + LT: '小于(<)', + LTANDEQ: '小于等于(<=)', + ISNULL: '值为空(Nil)', + ISNOTNULL: '值不为空(NotNil)', + LIKE: '文本包含(%)', + IN: '值在范围中(In)', + NOTIN: '值不在范围中(NotIn)', + LEFTLIKE: '文本左包含(%#)', + RIGHTLIKE: '文本右包含(#%)', +}; + +/** + * 面板项逻辑服务 + * + * @export + * @class PSPanelItemLogicService + * @extends {DEService} + */ +export class PSPanelItemLogicService extends DEService { + /** + * 类型代码表 + * @author lxm + * @date 2023-12-27 05:06:47 + * @protected + * @type {ICodeItem[]} + */ + protected typeCodeItems: ICodeItem[]; + + constructor(srfSessionId: string, model: IAppDataEntity) { + super(srfSessionId, model); + const app = ibiz.hub.getApp(model.appId); + this.typeCodeItems = app.codeList.getCodeList( + 'Config__FDLogicType', + )!.codeItems!; + } + + protected newEntity(data: IData | IDataEntity): IDataEntity { + if (data instanceof PSPanelItemLogic) { + return data.clone(); + } + return new PSPanelItemLogic(this.model, data, this.typeCodeItems); + } + + async exec( + id: string, + context: IContext, + params?: IData | IData[], + params2?: IParams, + header?: IData, + ): Promise { + if (params && (id === 'update' || id === 'Create')) { + if (Array.isArray(params)) { + params.forEach(param => this.beforeUpdate(context, param)); + } else { + this.beforeUpdate(context, params); + } + } + return super.exec(id, context, params, params2, header); + } + + /** + * 更新之前 + * + * @param {IContext} _context + * @param {IData} data + * @memberof PSPanelItemLogicService + */ + beforeUpdate(_context: IContext, data: IData): void { + data.pspanelitemlogicname = this.calcText(data); + } + + /** + * 计算显示文本 + * + * @protected + * @param {IData} data + * @return {*} {string} + * @memberof PSPanelItemLogicService + */ + protected calcText(data: IData): string { + if (data.logictype === 'GROUP') { + return `${data.groupop || ''} ${data.groupnotflag === 1 ? '[取反]' : ''}`; + } + if (data.logictype === 'SINGLE') { + return `${data.dstfieldname || ''} ${ValueOPs[data.condop] || ''} ${ + data.condvalue || '' + }`; + } + return data.srfmajortext || data.pspanelitemlogicname; + } +} diff --git a/packages/view-design/src/service/index.ts b/packages/view-design/src/service/index.ts index 5821efa0..1ee5e04e 100644 --- a/packages/view-design/src/service/index.ts +++ b/packages/view-design/src/service/index.ts @@ -6,6 +6,7 @@ import { PSSysViewPanelItemService, PSSysViewPanelLogicService, PSSysViewPanelService, + PSPanelItemLogicService, } from '@ibiz-template-plugin/panel-design'; import { PSDEViewBaseService } from './psdeview-base/psdeview-base.service'; import { PSDEViewCtrlService } from './psdeview-ctrl/psdeview-ctrl.service'; @@ -84,5 +85,11 @@ export default { return new PSAppIndexViewService(srfSessionId, entityModel); }, ); + DEServiceUtil.register( + 'viewdesign.pspanelitemlogic', + async (srfSessionId: string, entityModel: IAppDataEntity) => { + return new PSPanelItemLogicService(srfSessionId, entityModel); + }, + ); }, }; diff --git a/packages/view-design/src/views/app-index-view-design/app-index-view-design.engine.ts b/packages/view-design/src/views/app-index-view-design/app-index-view-design.engine.ts index cf1e64b2..e30f0caf 100644 --- a/packages/view-design/src/views/app-index-view-design/app-index-view-design.engine.ts +++ b/packages/view-design/src/views/app-index-view-design/app-index-view-design.engine.ts @@ -1,6 +1,10 @@ /* eslint-disable import/no-extraneous-dependencies */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { UIActionUtil, getUIActionById } from '@ibiz-template/runtime'; +import { + AppDataEntity, + UIActionUtil, + getUIActionById, +} from '@ibiz-template/runtime'; import { IDETBUIActionItem } from '@ibiz/model-core'; import { getToolbarItem } from '@ibiz-template-plugin/panel-design'; import { AppIndexViewDesignController } from './app-index-view-design.controller'; @@ -98,6 +102,24 @@ export class AppIndexViewDesignEngine extends AppViewPanelDesignEngine { if (data) { this.view.context.psappmenu = data.psappmenuid; this.view.context.pssysapp = data.pssysappid; + if (isInitialLoad) { + const app = ibiz.hub.getApp(this.view.context.srfappid); + const appMenuService = await app.deService.getService( + this.view.context, + 'viewdesign.psappmenu', + ); + const res = await appMenuService.exec( + 'get', + this.view.context, + this.view.params, + ); + if (res.ok && res.data) { + appMenuService.local.add( + this.view.context, + res.data as AppDataEntity, + ); + } + } } return data; } -- Gitee