二开案例.服务插件.全事件演示

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

二开案例.服务插件.全事件演示

【案例演示】

演示操作服务插件所包含的全部事件及其触发顺序。



【实现步骤】

<1>编写操作服务插件,代码如下。

using Kingdee.BOS.Util;
using System;
using System.ComponentModel;
namespace Jac.XkDemo.BOS.App.PlugIn
{
    /// <summary>
    /// 【服务插件】全事件
    /// https://vip.kingdee.com/article/122724714954450688
    /// </summary>
    [Description("【服务插件】全事件"), HotUpdate]
    public class AllEventOperationServicePlugIn : Kingdee.BOS.Core.DynamicForm.PlugIn.AbstractOperationServicePlugIn
    {
        #region event
        /// <summary>
        /// 选项设置
        /// 1.在操作服务初始化是执行
        /// 2.可以对操作的执行参数进行设置,比如是否是否启动事务,是否支持批量处理等
        /// </summary>
        /// <param name="e"></param>
        public override void OnPrepareOperationServiceOption(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.OnPrepareOperationServiceEventArgs e)
        {
            PrintEventInfo("OnPrepareOperationServiceOption", e);
            base.OnPrepareOperationServiceOption(e);
        }
        /// <summary>
        /// 在执行保存操作前触发
        /// 1.此时数据包没有填充主键数据
        /// 2.只有继承了AbstractSave的保存服务才会触发此事件
        /// </summary>
        /// <param name="e"></param>
        public override void BeforeDoSaveExecute(Kingdee.BOS.Core.DynamicForm.PlugIn.BeforeDoSaveExecuteEventArgs e)
        {
            PrintEventInfo("BeforeDoSaveExecute", e);
            base.BeforeDoSaveExecute(e);
        }
        /// <summary>
        /// 加载指定字段到实体数据包里
        /// 1.在列表上执行操作时,单据的字段并没有被完全加载。 如果操作插件用到了未被加载的字段,一定会中断。
        /// 2.本事件允许插件,强制要求加载某些字段,避免中断
        /// </summary>
        /// <param name="e"></param>
        public override void OnPreparePropertys(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.PreparePropertysEventArgs e)
        {
            PrintEventInfo("OnPreparePropertys", e);
            base.OnPreparePropertys(e);
        }
        /// <summary>
        /// 初始化操作结果
        /// </summary>
        /// <param name="result"></param>
        public override void InitializeOperationResult(Kingdee.BOS.Core.DynamicForm.IOperationResult result)
        {
            PrintEventInfo("InitializeOperationResult", result);
            base.InitializeOperationResult(result);
        }
        /// <summary>
        /// 添加自定义数据校验器
        /// 在系统开始执行校验前,插件可以追加自己的校验器进入操作校验器集合
        /// </summary>
        /// <param name="e"></param>
        public override void OnAddValidators(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AddValidatorsEventArgs e)
        {
            PrintEventInfo("OnAddValidators", e);
            base.OnAddValidators(e);
        }
        /// <summary>
        /// 执行操作事务前事件,通知插件对要处理的数据进行排序等预处理(事务外触发)
        /// 1.此事件在操作校验之后、操作实现代码之前执行
        /// 2.此事件在操作事务之前,即此事件中的数据库处理,不受操作的事务保护
        /// 3.通常此事件,也可以用来进行数据校验
        /// </summary>
        /// <param name="e">e.SelectedRows 准备要处理的扩展实体 e.DataEntitys 处理后的实体</param>
        public override void BeforeExecuteOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeforeExecuteOperationTransaction e)
        {
            PrintEventInfo("BeforeExecuteOperationTransaction", e);
            base.BeforeExecuteOperationTransaction(e);
        }
        /// <summary>
        /// 操作事物前事件(事务内触发)
        /// </summary>
        /// 1.此事件在操作校验之后
        /// 2.此事件在操作事务开始之后
        /// 3.此事件在操作执行代码之前
        /// 4.此事件中的数据库处理,受操作的事务保护
        /// 5.通常此事件,可以用来做数据准备,在操作之前,提前写数据到库
        /// <param name="e"></param>
        public override void BeginOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.BeginOperationTransactionArgs e)
        {
            PrintEventInfo("BeginOperationTransaction", e);
            base.BeginOperationTransaction(e);
        }
        /// <summary>
        /// 操作事物后事件(事务内触发)
        /// 1.此事件在操作执行代码之后,操作的内部逻辑已经执行完毕
        /// 2.此事件在操作事务提交之前
        /// 3.此事件中的数据库处理,受操作的事务保护
        /// 4.通常此事件,可以用来做同步数据,如同步生成其他单据,而且需要受事务保护
        /// </summary>
        /// <param name="e"></param>
        public override void EndOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.EndOperationTransactionArgs e)
        {
            PrintEventInfo("EndOperationTransaction", e);
            base.EndOperationTransaction(e);
        }
        /// <summary>
        /// 内部事务执行失败后,调用回滚数据事件(事务外触发)
        /// 1.此事件只有在操作执行过程中发生异常时才触发
        /// 2.操作异常时,回滚内存中的数据
        /// 3.避免访问数据库造成事务状态无效的错误
        /// </summary>
        /// <param name="e"></param>
        public override void RollbackData(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.OperationRollbackDataArgs e)
        {
            PrintEventInfo("RollbackData", e);
            base.RollbackData(e);
        }
        /// <summary>
        /// 执行操作事务后事件,通知插件对象执行其它事务无关的业务逻辑(事务外触发)
        /// 1.此事件在操作执行后,操作的内部逻辑已经执行完毕;
        /// 2.此事件在操作事务提交之后;
        /// 3.此事件中的数据库处理,不受操作的事务保护
        /// 4.通常此事件,也可以做同步数据,但是此同步数据的成功与否,不需影响操作
        /// </summary>
        /// <param name="e"></param>
        public override void AfterExecuteOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AfterExecuteOperationTransaction e)
        {
            PrintEventInfo("AfterExecuteOperationTransaction", e);
            base.AfterExecuteOperationTransaction(e);
        }
        #endregion
        #region private method
        /// <summary>
        /// 事件执行次数计数器
        /// </summary>
        private int counter;
        /// <summary>
        /// 事件执行次数计数器
        /// </summary>
        private int Counter
        {
            get { return ++counter; }
        }
        /// <summary>
        /// 输出事件执行日志
        /// </summary>
        /// <param name="eventName">事件名称</param>
        /// <param name="args">事件参数</param>
        private void PrintEventInfo(string eventName, params object[] args)
        {
            var formId = GetFormId();
            var parameters = string.Empty;
            try
            {
                parameters = Newtonsoft.Json.JsonConvert.SerializeObject(args);
            }
            catch
            {
            }
            var log = string.Format("序号:{0},执行时间:{1},表单Id:{2},事件名称:{3},事件参数:{4}", Counter, DateTime.Now.ToString("yyyy -MM-dd HH:mm:ss.fff"), formId, eventName, parameters);
            System.Diagnostics.Debug.Print(log);
            Kingdee.BOS.Log.Logger.Error("EVENT", log, null);
        }
        /// <summary>
        /// 获取业务对象标识
        /// </summary>
        /// <returns></returns>
        private string GetFormId()
        {
            return this.BusinessInfo.GetForm().Id;
        }
        #endregion
    }
}


<2>拷贝插件组件到应用站点的WebSite\Bin目录下,重启IIS。


<3>BOSIDE扩展采购订单,操作列表,给保存操作注册服务插件,保存元数据,开发完毕。


现在可以登录业务站点,打开采购订单编辑界面,执行订单的保存操作,观察操作服务插件的事件的触发顺序啦。

---------------------------------------------------------------------------------------------------------













【金蝶云星空BOS二次开发案例演示】https://vip.kingdee.com/article/94751030918525696

二开案例.服务插件.全事件演示

【案例演示】演示操作服务插件所包含的全部事件及其触发顺序。【实现步骤】<1>编写操作服务插件,代码如下。using Kingdee.BOS.Util;using ...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息