47、操作服务插件,AfterExecuteOperationTransaction事务结束后事件原创
金蝶云社区-林荫大道_找工作身份
林荫大道_找工作
22人赞赏了该文章 1.6万次浏览 未经作者许可,禁止转载编辑于2020年07月12日 19:46:07
summary-icon摘要由AI智能服务提供

该文本描述了在一个基于Kingdee BOS平台的系统中,如何通过编写一个自定义的插件(OnAddValidatorsHead类)来实现采购订单审核后自动生成下游单据(收料通知单)的功能。插件通过重写AfterExecuteOperationTransaction方法,在操作事务结束后,读取采购订单及其分录,根据预设的转换规则生成收料通知单,并保存到数据库中。此外,文本还提到了BOS扩展中对收料通知单的设置,包括必录项的设置以及可能因设置导致的自动生成失败情况。文本最后提供了关于AfterExecuteOperationTransaction事件的详细说明,包括其触发时机、数据库处理的独立性和对原操作的影响。

业务场景:采购订单审核后,自动生成下游单据,收料通知单



1、删除上一节代码,继续到红框写




2、


image.png

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kingdee.BOS;
using Kingdee.BOS.Core;
//服务端
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
//校验器
using Kingdee.BOS.Core.Validation;
using System.ComponentModel;
using System.Data;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Core.Metadata.FormElement;
using System.ComponentModel.Composition;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;
using Kingdee.BOS.Core.DynamicForm.Operation;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Core.Metadata;

namespace Kingdee.Bos.Test.ServicePlugln
{
    [Description("校验器")]
    [Kingdee.BOS.Util.HotUpdate]
    //继承操作服务插件
    public class OnAddValidatorsHead : AbstractOperationServicePlugIn
    {
        public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
        {
            base.AfterExecuteOperationTransaction(e);
            int i;
            //读取全部的单据,for循环,转换成DynamicObject类型
            foreach(DynamicObject entity in e.DataEntitys)
            {   //如果不为空,开始循环
                if(entity != null)
                {
                    //单据转换,上游单据是什么,下游单据是什么
                    var rules = ConvertServiceHelper.GetConvertRules(this.Context, "PUR_PurchaseOrder", "PUR_ReceiveBill");
                    //默认的单据转换
                    var rule = rules.FirstOrDefault(t => t.IsDefault);
                    //获取每个单据体,获取分录ID,判断是哪一行
                    DynamicObjectCollection entry = (DynamicObjectCollection)entity["POOrderEntry"];
                    i = 0;
                    ConvertOperationResult operationResult = null;
                    ListSelectedRow[] selectedRows = new ListSelectedRow[entry.Count];
                    //把选中的单据体ID,循环,全部读取出来
                    foreach(DynamicObject HHentity in entry)
                    {
                        selectedRows[i] = new ListSelectedRow(Convert.ToString(entity["id"]), Convert.ToString(HHentity["id"]), i,"PUR_PurchaseOrder");
                        i++;
                    }
                    Dictionary<string, object> custParams = new Dictionary<string, object>();
                    //下推事件
                    PushArgs pushArgs = new PushArgs(rule, selectedRows)
                    {
                        //标准发货通知单
                        // 请设定目标单据单据类型。如无单据类型,可以空字符
                        TargetBillTypeId = "",
                        // 请设定目标单据主业务组织。如无主业务组织,可以为0
                        TargetOrgId = 0,
                        // 可以传递额外附加的参数给单据转换插件,如无此需求,可以忽略
                        CustomParams = custParams,
                    };
                    operationResult = ConvertServiceHelper.Push(this.Context, pushArgs, OperateOption.Create());
                    // 获取生成的目标单据数据包
                    DynamicObject[] objs = (from p in operationResult.TargetDataEntities
                                             select p.DataEntity).ToArray();
                    // 读取目标单据元数据
                    var targetBillMeta = MetaDataServiceHelper.Load(this.Context, "PUR_ReceiveBill") as FormMetadata;
                    OperateOption saveOption = OperateOption.Create();
                    // 忽略全部需要交互性质的提示,直接保存;调用保存事件
                    var saveResult = BusinessDataServiceHelper.Save(this.Context, targetBillMeta.BusinessInfo, objs, saveOption, "Save");
                }
            }
        }
    }
}

AfterExecuteOperationTransaction事件

说明:


操作执行后,事务结束后


1. 此事件在操作执行后,操作的内部逻辑已经执行完毕;

2. 此事件在操作事务提交之后;

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

4. 通常此事件,也可以做同步数据,但是此同步数据的成功与否,不需影响操作



3、最终效果,采购订单审核后,自动生成下游单据,收料通知单

image.png



4、BOS扩展收料通知单,设置收料部门必录,重新审核采购审核,无法自动生成收料通知单;


image.png


image.png


AfterExecuteOperationTransaction事件


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

4. 通常此事件,也可以做同步数据,但是此同步数据的成功与否,不需影响操作


即不管是否自动下推事件执行成功,审核操作服务继续执行成功;


总目录链接

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



47.zip(18.91KB)

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