电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

二开案例.表单插件.元数据缓存刷新

来源:金蝶云社区作者:金蝶2024-09-2311

二开案例.表单插件.元数据缓存刷新

【应用场景】

元数据不能直接修改

元数据不能直接修改!

元数据不能直接修改!

虽然官方各种强调元数据不能直接修改,但元数据还是经常被改的稀里哗啦的。

元数据被改后,可能会产生各种稀奇古怪的问题。

在无法定位到是谁改了元数据的时候,目前唯一能做的就是,在系统报错的地方,刷新元数据缓存,临时性的抢救一下。


报错场景示例:

保存数据异常,数据包莫名多了些字段。。。


审批单据异常,界面都打不开,本来有的字段莫名丢失了。。。



【案例演示】

应收票据,挂载元数据修复插件。


【实现步骤】

<1>编写单据插件,代码如下。

using Kingdee.BOS.Cache;

using Kingdee.BOS.Core.Bill;

using Kingdee.BOS.Core.Bill.PlugIn;

using Kingdee.BOS.Core.Bill.PlugIn.Args;

using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

using Kingdee.BOS.Core.Metadata;

using Kingdee.BOS.Core.Metadata.ControlElement;

using Kingdee.BOS.Orm.Metadata.DataEntity;

using Kingdee.BOS.ServiceHelper;

using Kingdee.BOS.Util;

using System;

using System.ComponentModel;

using System.Linq;


namespace Jac.XkDemo.BOS.Business.PlugIn

{

    /// <summary>

    /// 【单据插件】元数据缓存刷新

    /// </summary>

    [Description("【单据插件】元数据缓存刷新"), HotUpdate]

    public class ReloadMetadataBillPlugIn : AbstractBillPlugIn

    {

        private BusinessInfo businessInfo;

        private LayoutInfo layoutInfo;


        public override void OnSetBusinessInfo(SetBusinessInfoArgs e)

        {

            base.OnSetBusinessInfo(e);

            var meta = GetNewMetadata(this.View);

            if (meta != null)

            {

                this.businessInfo = meta.BusinessInfo;

                this.layoutInfo = meta.GetLayoutInfo();


                e.BillBusinessInfo = this.businessInfo;

                e.BusinessInfo = this.businessInfo;

            }

        }


        public override void OnSetLayoutInfo(SetLayoutInfoArgs e)

        {

            base.OnSetLayoutInfo(e);

            e.BillLayoutInfo = this.layoutInfo;

            e.LayoutInfo = this.layoutInfo;

        }


        public override void LoadData(LoadDataEventArgs e)

        {

            base.LoadData(e);

            var meta = GetNewMetadata(this.View);

            if (meta != null)

            {

                throw new Exception("加载数据前检测到元数据异常,请关闭当前界面后重试!");

            }

        }


        public override void AfterLoadData(EventArgs e)

        {

            base.AfterLoadData(e);

            var meta = GetNewMetadata(this.View);

            if (meta != null)

            {

                throw new Exception("加载数据后检测到元数据异常,请关闭当前界面后重试!");

            }

        }


        public override void BarItemClick(BarItemClickEventArgs e)

        {

            base.BarItemClick(e);

            if (e.BarItemKey == "test")

            {

                var field = this.View.BusinessInfo.GetFieldList().FirstOrDefault(o => o.Key == "FSumAmount");

                if (field != null)

                {

                    //this.View.BusinessInfo.GetFieldList().Remove(field);

                    //this.View.BusinessInfo.GetDynamicObjectType(true);

                    //this.View.ShowMessage("字段已移除");

                }

            }

        }


        /// <summary>

        /// 清除元数据缓存,返回新的元数据

        /// </summary>

        /// <param name="view"></param>

        /// <returns></returns>

        public static FormMetadata GetNewMetadata(IBillView view)

        {

            var ctx = view.Context;

            var businessInfo = view.BusinessInfo;

            var layoutId = view.OpenParameter.LayoutId;

            var formId = businessInfo.GetForm().Id;

            // 此处,判断元数据可能存在损坏的场景。

            // 例如

二开案例.表单插件.元数据缓存刷新

【应用场景】元数据不能直接修改!!!元数据不能直接修改!!!元数据不能直接修改!!!虽然官方各种强调元数据不能直接修改,但元数据还...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信