二开案例.单据插件.重新加载基础资料字段引用数据包
【应用场景】
基础资料引用数据包中的某些数据已经被修改了,当前单据界面因为有数据缓存,无法及时将变化后的数据在界面上及时刷新显示。
【案例演示】
采购订单界面上有一个基础资料属性字段,用于显示供应商的注册编码,保存采购订单的时候,后台会修改供应商的注册编码,希望修改后的供应商的注册编码能在当前单据界面上即时刷新显示。
【实现步骤】
<1>编写单据插件,用于刷新采购订单界面上的基础资料属性字段的数据,代码如下。
using Kingdee.BOS;
using Kingdee.BOS.App.Core;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Const;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System.Collections.Generic;
using System.ComponentModel;
namespace Jac.XkDemo.BOS.Business.PlugIn
{
/// <summary>
/// 【单据插件】重新加载基础资料字段引用数据包
/// </summary>
[Description("【单据插件】重新加载基础资料字段引用数据包"), HotUpdate]
public class ReloadBaseDataFieldRefDataObjectBillPlugIn : AbstractBillPlugIn
{
public override void AfterDoOperation(AfterDoOperationEventArgs e)
{
base.AfterDoOperation(e);
if (e.Operation.OperationId == 8 && e.OperationResult.IsSuccess)
{
// 保存操作执行成功后,刷新供应商字段的引用数据包
var field = (BaseDataField)this.View.BusinessInfo.GetField("FSupplierId");
var objSupplier = (DynamicObject)this.View.Model.GetValue(field.Key);
if (objSupplier != null)
{
var dataObj = BusinessDataServiceHelper.LoadFromCache(this.Context, new[] { objSupplier[0] }, field.RefFormDynamicObjectType);
if (dataObj != null && dataObj.Length > 0)
{
field.DynamicProperty.SetValue(this.View.Model.DataObject, dataObj[0]);
//this.View.UpdateView(field.Key);
this.View.UpdateView("F_Jac_BaseProperty");
}
}
}
}
}
}
<2>编写服务插件,用于修改供应商的注册编码,代码如下:
using Kingdee.BOS;
using Kingdee.BOS.App.Core;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Const;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using System.Collections.Generic;
using System.ComponentModel;
namespace Jac.XkDemo.BOS.Business.PlugIn
{
/// <summary>
/// 【服务插件】修改基础资料数据并清除基础资料数据缓存
/// </summary>
[Description("【服务插件】修改基础资料数据并清除基础资料数据缓存"), HotUpdate]
public class SetBaseDataAndClearCacheOperationServicePlugIn : AbstractOperationServicePlugIn
{
public override void BeginOperationTransaction(BeginOperationTransactionArgs e)
{
base.BeginOperationTransaction(e);
foreach (var dataEntity in e.DataEntitys)
{
var fsupplierid = dataEntity["SupplierId_Id"];
var fbillNo = (string)dataEntity["BillNo"];
if (fsupplierid != null)
{
// 修改供应商的注册编码为当前单据的编号
var sql = string.Format("UPDATE T_BD_SUPPLIER SET FREGNUMBER='{0}' WHERE FSUPPLIERID={1}", fbillNo, fsupplierid);
DBUtils.Execute(Context, sql);
// 清除当前供应商的数据缓存
ClearCacheByPrimaryKeys(Context, "BD_Supplier", new List<string>(new[] { fsupplierid.ToString() }));
}
}
}
/// <summary>
/// 清理缓存(只清理指定内码的数据缓存)
/// </summary>
/// <param name="ctx">上下文</param>
/// <param name="formId">业务对象标识</param>
/// <param name="keys">数据内码</param>
public static bool ClearCacheByPrimaryKeys(Context ctx, string formId, List<string> keys)
{
if (keys == null || keys.Count == 0)
{
return false;
}
var metadata = (FormMetadata)new MetaDataService().Load(ctx, formId);
if (metadata == null)
{
return false;
}
using (DataEntityCacheManager cacheManager = new DataEntityCacheManager(ctx, metadata.BusinessInfo.GetDynamicObjectType()))
{
cacheManager.RemoveCacheByPrimaryKeys(keys);
}
CacheUtil.ClearCache(ctx.DBId + formId, CacheRegionConst.BOS_QuickBaseDataCache);
return true;
}
}
}
<3>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。
<4>BOSIDE扩展采购订单,供应商添加引用字段,新增基础资料属性字段,注册表单插件,服务插件,保存元数据,开发完毕。
【功能验证】
<1>登录业务站点,打开采购订单编辑界面,点击保存,此时,基础资料属性字段会将供应商修改后的注册编码在界面上刷新显示。
---------------------------------------------------------------------------------------------------------
【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696
二开案例.单据插件.重新加载基础资料字段引用数据包
本文2024-09-23 04:08:00发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-163346.html