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