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

【应用场景】
元数据不能直接修改!!!
元数据不能直接修改!!!
元数据不能直接修改!!!
虽然官方各种强调元数据不能直接修改,但元数据还是经常被改的稀里哗啦的。
元数据被改后,可能会产生各种稀奇古怪的问题。
在无法定位到是谁改了元数据的时候,目前唯一能做的就是,在系统报错的地方,刷新元数据缓存,临时性的抢救一下。
报错场景示例:
保存数据异常,数据包莫名多了些字段。。。

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

【案例演示】
应收票据,挂载元数据修复插件。
【实现步骤】
<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;
// 此处,判断元数据可能存在损坏的场景。
// 例如
二开案例.表单插件.元数据缓存刷新
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



