插件判断单据是否存在下游单据的案例总结原创
金蝶云社区-邱育华
邱育华
19人赞赏了该文章 2,602次浏览 未经作者许可,禁止转载编辑于2022年03月18日 17:06:14
summary-icon摘要由AI智能服务提供

本文讨论了单据处理中的业务需求与功能实现,包括如何在单据审核后、表单及列表插件中判断是否存在下游单据,并阻止反审核、删除及作废操作。同时,分析了单据转换的通常步骤及现有配置问题,提出在缺少反写规则情况下判断单据是否有下游单据的方法。通过调用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、服务端插件

反审核操作判断是否下推有下游单据

  1. 添加程序集引用:Kingdee.K3.SCM.App.dll

  2. 反审核插件添加校验器: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、如何判断是否下推过特定单据?(待后续总结)


相关文章参考





图标赞 19
19人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!