二开案例.WebApi.清除多类别基础资料的数据缓存

【应用场景】直接去数据库改了基础资料数据,登录金蝶云星空,在业务单据上的多类别基础资料上看到的对应基础资料数据还是修改前的数据,不会即时自动刷新,需等到缓存到期后才会显示最新的数据。如果业务上不允许这种缓存未及时更新的场景,可通过设定某个程序主动调用WebApi,完成对指定的应用站点下的指定缓存块的缓存刷新。
【案例演示】数据库直接改某个供应商的名称,打开某个付款单的编辑界面,在往来单位字段上,能立即看到最新的供应商名称。

【实现步骤】
<1>添加自定义WebApi接口类,实现缓存清理的功能,代码如下。
using Kingdee.BOS.App.Core;
using Kingdee.BOS.Core.Const;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.ServiceFacade.KDServiceFx;
using Kingdee.BOS.Util;
using Kingdee.BOS.WebApi.ServicesStub;
using System.Collections.Generic;
using System.Linq;
namespace Jac.XkDemo.BOS.WebApi
{
/// <summary>
/// 【WebApi】清除多类别基础资料的数据缓存
/// 背景知识:
/// (1)多类别基础资料会引用多个基础资料
/// (2)多类别基础资料可能会被多个业务对象引用
/// (3)当修改多类别基础资料下的某个基础资料数据时,引用了该多类别基础资料的业务对象的数据缓存都要清除
/// </summary>
public class ClearItemClassCacheWebApiService : AbstractWebApiBusinessService
{
public ClearItemClassCacheWebApiService(KDServiceContext context)
: base(context)
{
//
}
/// <summary>
/// 清除多类别基础资料缓存
/// </summary>
/// <param name="pkId">基础资料数据包内码</param>
/// <param name="baseDataFormId">数据发生了变化的基础资料的标识</param>
/// <param name="refFormIds">引用了含该基础资料的多类别基础资料的所有业务对象标识</param>
/// <returns></returns>
public bool ClearCache(string pkId, string baseDataFormId, List<string> refFormIds)
{
if (string.IsNullOrWhiteSpace(pkId))
{
return false;
}
if (string.IsNullOrWhiteSpace(baseDataFormId))
{
return false;
}
if (refFormIds == null || refFormIds.Count == 0)
{
return false;
}
var metaDataService = new MetaDataService();
#region 清除基础资料的缓存数据
var baseDataMetadata = metaDataService.Load(this.KDContext.Session.AppContext, baseDataFormId) as FormMetadata;
if (baseDataMetadata != null)
{
using (var cacheManager = new DataEntityCacheManager(this.KDContext.Session.AppContext, baseDataMetadata.BusinessInfo.GetDynamicObjectType()))
{
cacheManager.RemoveCacheByPrimaryKey(pkId);
}
}
#endregion
#region 清除基础资料模糊查询的缓存数据
// 清除模糊查询缓存数据
CacheUtil.ClearRCache(this.KDContext.Session.AppContext.DBId + baseDataFormId, CacheRegionConst.BOS_QuickBaseDataCache);
#endregion
#region 清除多类别基础资料的缓存数据
foreach (var formId in refFormIds)
{
var formMetadata = metaDataService.Load(this.KDContext.Session.AppContext, formId) as FormMetadata;
if (formMetadata == null)
{
continue;
}
var fields = formMetadata.BusinessInfo.GetFieldList().Where(f => f is ItemClassField).Cast<ItemClassField>().ToList();
foreach (var fld in fields)
{
var ctlField = fld.ControlField as ItemClassTypeField;
if (ctlField == null || string.IsNullOrWhiteSpace(ctlField.ViewName) || ctlField.RefBaseDataList == null)
{
continue;
}
if (!ctlField.RefBaseDataList.Exists(r => r.FormId.EqualsIgnoreCase(baseDataFormId
二开案例.WebApi.清除多类别基础资料的数据缓存
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



