45.1、操作服务插件,BeginOperationTransaction,事务开始后事件原创
金蝶云社区-林荫大道_找工作身份
林荫大道_找工作
13人赞赏了该文章 1.2万次浏览 未经作者许可,禁止转载编辑于2020年07月12日 17:27:48
summary-icon摘要由AI智能服务提供

本文描述了企业资源规划(ERP)系统中的业务逻辑处理过程,主要涉及采购订单和收料通知单的关系处理。当采购订单下推生成收料通知单后,若采购订单未审核,反审核采购订单将自动删除收料通知单;若收料通知单已审核,则反审核采购订单将失败。文章还详细说明了如何通过修改代码(如删除校验、设置事务属性等)和注册插件来实现这一业务逻辑,并提供了代码片段和最终效果的说明。

业务场景:


一、采购订单下推生成下游单据收料通知单后,收料通知单后保存状态,反审核采购订单,自动删除下游单据;



二、如果下游单据收料通知单已经审核,则采购订单不允许反审核,


       删除下游单据 和 反审核 一方成功都成功,一方失败,都失败;




1、修改44.2代码,删除校验的代码


image.png



2、


        public override void OnPrepareOperationServiceOption(OnPrepareOperationServiceEventArgs e)
        {
            base.OnPrepareOperationServiceOption(e);
            //为了在BeginOperationTransaction里检查数据抛出异常时
            //只回滚当前单据的事务,这里设置为不支持批量事务,这样BOS会
            //循环为每一张单据创建事务调用操作 
            e.SupportTransaction = true;
            e.SurportBatchTransaction = false;
        }


image.png



3、


        //本节事件
        public override void BeginOperationTransaction(BeginOperationTransactionArgs e)
        {
            base.BeginOperationTransaction(e);
            DeleteBFReturnMtrlData(e.DataEntitys.ToList());
        }


image.png



4、


        //自定义类
        private List<DynamicObject> DeleteBFReturnMtrlData(List<DynamicObject> dataEntitys)
        {
            List<DynamicObject> newEntitys = new List<DynamicObject>();
            foreach(DynamicObject item in dataEntitys)
            {
                List<object> pkIds = new List<object>();
                //for循环,判断ID
                object pkId = item["Id"];
                pkIds.Add(pkId);
                IDeleteService delService = Kingdee.BOS.App.ServiceHelper.GetService<IDeleteService>();
                //通过sql判断发货通知单T_PUR_ReceiveEntry_LK是否有关联的源单单号
                string sqlselect = @"/*dialect*/select distinct t2.FID from T_PUR_ReceiveEntry_LK t1 inner join T_PUR_ReceiveEntry t2 on t1.FENTRYID=t2.FENTRYID where FSBILLID in (" + string.Join(",", pkIds.ToArray()) + ")";
                dtTable = DBUtils.ExecuteDataSet(this.Context, sqlselect).Tables[0];
                //如果有源单单号
                if(dtTable.Rows.Count >0)
                {
                    //获取dtTable有多少行
                    object[] InFid = new object[dtTable.Rows.Count];
                    //把获取的值加到一个数组里面
                    for(int x=0; x<dtTable.Rows.Count;x++)
                    {
                        InFid[x] = dtTable.Rows[x]["FID"];
                    }
                    //需要删除的发货通知单InFid
                    IOperationResult result = delService.Delete(this.Context,"PUR_ReceiveBill",InFid);
                    if(!result.IsSuccess)
                    {
                        string returnMtrlBillNo = result.CustomMessageFormId;
                        string billNo = item["BillNo"].ToString();
                        string strPkId = pkId.ToString();
                        string message = string.Format("发货通知有问题,请查看!", billNo, returnMtrlBillNo);
                        throw new KDBusinessException("", message); ;
                    }
                }
                newEntitys.Add(item);
            }
            return newEntitys;
        }



image.png



5、反审核按钮,注册插件


5.1、去掉标准产品校验,否则本例无法进行


image.png


BeginOperationTransaction事件


说明:


操作执行前,事务开始后事件


1. 此事件在操作校验之后

2. 此事件在操作事务开始之后

3. 此事件在操作执行代码之前

4. 此事件中的数据库处理,受操作的事务保护

5. 通常此事件,可以用来做数据准备,在操作之前,提前写数据到库





6、最终效果,采购订单,下推收料通知单,收料通知单保存;



6.1、然后反审核采购订单,提示成功,自动同步删除下游收料通知单;


image.png



6.2、如果收料通知单已审核,则反审核采购订单失败


image.png



总目录链接

https://vip.kingdee.com/article/64993872014591232



45.1.zip(18.75KB)

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