二开案例.服务插件.获取工作流审核调用堆栈

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

二开案例.服务插件.获取工作流审核调用堆栈

【应用场景】

日志跟踪。

工作流偶发出现单据的流程实例尚未结束,但是单据已被审核,且不知道是何原因被审核,此时可通过挂载此插件进行追踪。


【案例演示】

采购订单,捕获审批时的调用堆栈。


【实现步骤】

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


using Kingdee.BOS;
using Kingdee.BOS.App.Core;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Transactions;
namespace Jac.XkDemo.BOS.App.PlugIn
{
    /// <summary>
    /// 【服务插件】获取工作流审核调用堆栈
    /// </summary>
    [Description("【服务插件】获取工作流审核调用堆栈"), HotUpdate]
    public class WFAuditLogServicePlugInn : AbstractOperationServicePlugIn
    {
        public override void EndOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.EndOperationTransactionArgs e)
        {
            var formId = this.BusinessInfo.GetForm().Id;
            foreach (var obj in e.DataEntitys)
            {
                try
                {
                    if (!obj.Contains("Id") || obj["Id"] == null) continue;
                    var log = GetCurrentStackInfo();
                    var keyValue = (obj["Id"] ?? "").ToString();
                    using (var tran = new KDTransactionScope(TransactionScopeOption.Suppress))
                    {
                        WriteActionEventLog(this.Context, formId, keyValue, log);
                        tran.Complete();
                    }
                }
                catch
                {
                }
            }
        }
        /// <summary>
        /// 获取堆栈信息
        /// </summary>
        /// <param name="topLevel"></param>
        /// <returns></returns>
        private string GetCurrentStackInfo(int topLevel = 100)
        {
            var logs = new List<string>();
            logs.Add("堆栈信息:");
            var stackFrames = new StackTrace().GetFrames();
            foreach (var stackFrame in stackFrames)
            {
                try
                {
                    topLevel--;
                    if (topLevel < 0)
                    {
                        break;
                    }
                    var method = stackFrame.GetMethod();
                    var log = string.Format("【{0}】=>{1}->{2}->{3}", method.Name, method.Module, method.DeclaringType == null ? "" : method.DeclaringType.FullName, method);
                    logs.Add(log);
                }
                catch
                {
                }
            }
            var logData = string.Join("\r\n", logs);
            return logData;
        }
        /// <summary>
        /// 添加工作流节点日志
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="formId"></param>
        /// <param name="keyValue"></param>
        /// <param name="log"></param>
        private void WriteActionEventLog(Context ctx, string formId, string keyValue, string log)
        {
            // 获取工作流当前节点内码
            var sql = string.Format(@"SELECT T_WF_ACTINST.FACTINSTID FROM T_WF_PIBIMAP
                                JOIN T_WF_ACTINST ON T_WF_ACTINST.FPROCINSTID = T_WF_PIBIMAP.FPROCINSTID 
                                WHERE T_WF_PIBIMAP.FOBJECTTYPEID = '{0}' AND T_WF_PIBIMAP.FKEYVALUE = '{1}'
                                ORDER BY T_WF_ACTINST.FCREATETIME DESC", formId, keyValue);
            var actInstId = DBUtils.ExecuteScalar<string>(ctx, sql, "");
            if (string.IsNullOrWhiteSpace(actInstId))
            {
                return;
            }
            // 将日志信息写入工作流动作执行记录表
            sql = @"INSERT INTO T_WF_ACTIONEVENTLOG(FACTIONLOGID,FACTINSTID,FACTIONEVENTID,FEXECUTEDTIME,FEXECUTELOG) VALUES (@FACTIONLOGID,@FACTINSTID,@FACTIONEVENTID,@FEXECUTEDTIME,@FEXECUTELOG)";
            var paras = new List<SqlParam>()
            {
                new SqlParam("@FACTIONLOGID", KDDbType.AnsiString, new DBService().GetSequenceString(1)[0]),
                new SqlParam("@FACTINSTID", KDDbType.AnsiString, actInstId),
                new SqlParam("@FACTIONEVENTID", KDDbType.Int32, -100),
                new SqlParam("@FEXECUTEDTIME", KDDbType.DateTime, DateTime.Now),
                new SqlParam("@FEXECUTELOG", KDDbType.String, log)
            };
            DBUtils.Execute(ctx, sql, paras);
        }
    }
}


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


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


【功能验证】

<1>登录业务站点,打开采购订单新增界面,创建新单,提交工作流,审批单据,完成后,即可前往流程管理中心提取审核操作的堆栈信息,有了堆栈信息,就能知道此次审批的大部分细节信息啦。

流程管理中心选中某个流程,长按Ctrl+Enter,可以调出菜单【导出流程数据

流程数据:

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













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

二开案例.服务插件.获取工作流审核调用堆栈

【应用场景】日志跟踪。工作流偶发出现单据的流程实例尚未结束,但是单据已被审核,且不知道是何原因被审核,此时可通过挂载此插件进行追踪...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息