本文讨论了单据处理中的业务需求与功能实现,包括如何在单据审核后、表单及列表插件中判断是否存在下游单据,并阻止反审核、删除及作废操作。同时,分析了单据转换的通常步骤及现有配置问题,提出在缺少反写规则情况下判断单据是否有下游单据的方法。通过调用Kingdee平台提供的BusinessFlowDataServiceHelper.IsPush函数,可以在表单、列表及服务端插件中有效判断单据是否下推过,并给出了具体实现代码示例。
一、【业务需求】
1、单据审核后,如何判断是否存在下游单据?
2、在表单插件中,如何判断是否存在下游单据
3、在列表插件中,如何判断是否存在下游单据
4、若存在下游单据,则不能反审核、删除及作废,该如何实现?
5、如何判断是否下推过特定单据?
二、【功能分析】
实现一个单据转换通常的步骤
1、BOS配置转换路线,字段映射,二开插件,表单服务规则等
2、配置选单条件策略,通过业务单据数量字段结合反写规则,限制单据是否可以下推,是否满足部分下推
3、配置反写规则
实际二开中,业务比较简单粗暴,只做到第一步,并没有配置相关反写规则和选单条件中对数量的判断,导致同一张单据可以反复下推,出现重复单据的业务问题。由此产生二开需求:
“如果去判断单据是否存在下游单据”或者说“单据是否下推过”。
在没有配置反写规则的情况下,除了检查下游单据的源单编号,还有什么方法能判断本单据是否有下游单据?因为如果单据有多个转换规则的话,从下游单据一个一个判断源单编号会非常麻烦。
参考官方文章:
针对表单插件和服务插件,有对应实现案例。
通过参考@JohnnyDing 老师的帖子答复:
调用 Kingdee.BOS.ServiceHelper.BusinessFlowDataServiceHelper.IsPush(ctx, args) 函数进行判断。
参数说明:ctx : 数据库上下文args.BusinessInfo : 源单元数据args.EntityKey : 源单单据体Key,单据下推,是基于单据体行的,需要明确指定那个单据体的那一行是否下推过args.ActiveRow : 源单单据体数据行
返回值:true : 源单单据体行下推过false : 源单单据体行未下推过
另外,Kingdee.BOS.ServiceHelper.BusinessFlowDataServiceHelper还有其他函数,可以获取单据下推了什么单。
1、列表插件
var selectedRows = this.ListView.SelectedRowsInfo; DynamicObject[] reqObj = BusinessDataServiceHelper.Load(this.Context, selectedRows.GetPrimaryKeyValues(), this.ListView.BillBusinessInfo.GetDynamicObjectType()); BusinessInfo businessInfo = this.ListView.BillBusinessInfo; LinkEntity linkEntity = businessInfo.GetForm().LinkSet.LinkEntitys[0]; var parentEntity = businessInfo.GetEntity(linkEntity.ParentEntityKey); foreach(DynamicObject reqObjItem in reqObj) { DynamicObjectCollection entryObjs = parentEntity.DynamicProperty.GetValue(reqObjItem) as DynamicObjectCollection; if (entryObjs != null && entryObjs.Count() > 0) { string[] selectEntryIds = selectedRows.GetEntryPrimaryKeyValues(); foreach (var entry in entryObjs) { string entryid = Convert.ToString(entry["Id"]); if (selectEntryIds.Contains(entryid)) { if (Kingdee.BOS.ServiceHelper.BusinessFlowDataServiceHelper.IsPush(this.Context, new Kingdee.BOS.Core.BusinessFlow.ServiceArgs.IsPushArgs(this.ListView.BillBusinessInfo, "FEntity", entry))) { this.View.ShowErrMessage(string.Format("所选申请单{0}存在已下推的分录,请重新选择!", reqObjItem["BillNo"])); return; } } } } }
2、表单插件
BusinessInfo businessInfo = this.View.BusinessInfo; LinkEntity linkEntity = businessInfo.GetForm().LinkSet.LinkEntitys[0]; Entity parentEntity = businessInfo.GetEntity(linkEntity.ParentEntityKey); DynamicObjectCollection entryObjs = parentEntity.DynamicProperty.GetValue(this.Model.DataObject) as DynamicObjectCollection; foreach (DynamicObject entry in entryObjs) { if (Kingdee.BOS.ServiceHelper.BusinessFlowDataServiceHelper.IsPush(this.Context, new Kingdee.BOS.Core.BusinessFlow.ServiceArgs.IsPushArgs(this.View.BillBusinessInfo, "FEntity", entry))) { this.View.ShowErrMessage("所选申请单存在已下推的分录,请重新选择!"); return; } }
3、服务端插件
反审核操作判断是否下推有下游单据
添加程序集引用:Kingdee.K3.SCM.App.dll
反审核插件添加校验器:IsPushValidator(实际也是基于平台BusinessFlowDataServiceHelper.IsPush接口做的封装)
IsPushValidator pushValid = new IsPushValidator(); pushValid.BillFormId = "STK_OutStockApply"; //pushValid.ExceptTargetFormId = exceptforms; pushValid.Info = this.BusinessInfo; pushValid.AlwaysValidate = true; pushValid.EntityKey = "FBillHead"; e.Validators.Add(pushValid);
说明
1、如何判断是否下推过特定单据?(待后续总结)
相关文章参考