【转】K3Cloud 在插件中调用工作流

在插件中可以调用ApprovalAssignmentServiceHelper.SubmitApprovalItems()进行工作流审批。但SubmitApprovalItems()需要一个AssignmentContext参数,而AssignmentContext属性非常多,构造起来很麻烦。
因此我写了两个方法,将SubmitApprovalItems()再次封装,传入几个简单参数,就能完成审批。

  1   /// <summary>
  2         /// 审批单据,actionName为空时,自动寻找第一个同意审批项;
  3         /// 有多个类型为通过的审批项时,可用actionName指定审批项,如actionName="审批通过"
  4         /// </summary>
  5         /// <param name="formId">单据FormId</param>
  6         /// <param name="pKValue">单据主键</param>
  7         /// <param name="receiverName">处理人</param>
  8         /// <param name="disposition">审批意见</param>
  9         /// <param name="isApprovalFlow">是否为审批流</param>
 10         public void ApproveBill(string formId, string pKValue, string receiverName, string disposition, bool isApprovalFlow = false, string actionName = null)
 11         {
 12             List<AssignResult> assignResults = GetApproveActions(formId, pKValue, receiverName);
 13             AssignResult approvalAssignResults = assignResults.FirstOrDefault(r => r.ApprovalType == AssignResultApprovalType.Forward);
 14             if (approvalAssignResults == null) throw new Exception("未找到审批项。");
 15             SubmitWorkflow(formId, pKValue, receiverName, approvalAssignResults.Id, disposition, isApprovalFlow);
 16         }
 17
 18         /// <summary>
 19         /// 驳回单据,actionName为空时,自动寻找一个驳回审批项;
 20         /// 有多个类型为驳回的审批项时(如驳回、打回发起人),可用actionName指定审批项,如actionName="打回发起人"
 21         /// </summary>
 22         public void RejectBill(string formId, string pKValue, string receiverName, string disposition, bool isApprovalFlow = false, string actionName = null)
 23         {
 24             List<AssignResult> assignResults = GetApproveActions(formId, pKValue, receiverName);
 25             if (!string.IsNullOrEmpty(actionName))
 26                 assignResults = assignResults.Where(r => r.Name.Any(p => p.Value == actionName)).ToList();
 27             else
 28                 assignResults = assignResults.OrderBy(r => r.Name.Any(p => p.Value == "打回发起人")).ToList();
 29             AssignResult rejectAssignResults = assignResults.FirstOrDefault(r => r.ApprovalType == AssignResultApprovalType.Reject);
 30             if (rejectAssignResults == null) throw new Exception("未找到驳回审批项。");
 31             SubmitWorkflow(formId, pKValue, receiverName, rejectAssignResults.Id, disposition, isApprovalFlow);
 32         }
 33
 34         private List<AssignResult> GetApproveActions(string formId, string pKValue, string receiverName)
 35         {
 36             DataSet ds = DBUtils.ExecuteDataSet(this.Context, @"select b.FASSIGNID,b.FAPPROVALASSIGNID
 37                                 from t_wf_assign a
 38                                 join T_WF_APPROVALASSIGN b on a.fassignid=b.fassignid
 39                                 where [email protected]
 40                                 and [email protected] and a.FSTATUS=0 and [email protected]",
 41                         new List<SqlParam>
 42                         {
 43                             new SqlParam("@FormID", DbType.String, formId),
 44                             new SqlParam("@pKValue", DbType.String, pKValue),
 45                             new SqlParam("@FRECEIVERNAMES", DbType.String, receiverName)
 46                         });
 47             DataRow row = ds.Tables[0].Rows.Cast<DataRow>().FirstOrDefault();
 48             if (row == null) return new List<AssignResult> { };
 49
 50             string assignId = row["FASSIGNID"].ToString();
 51             string approvalAssignId = row["FAPPROVALASSIGNID"].ToString();
 52             string _approvalItemId = AssignmentServiceHelper.OpenApprovalItem(this.Context, this.Context.UserId, assignId, false);
 53             var _approvalItem = AssignmentServiceHelper.GetApprovalItemById(this.View.Context, _approvalItemId);
 54             return _approvalItem.Actions.ToList();
 55         }
 56
 57
 58         private void SubmitWorkflow(string formId, string pKValue, string receiverName, string actionResult, string disposition, bool isApprovalFlow)
 59         {
 60             DataSet ds = DBUtils.ExecuteDataSet(this.Context, @"select b.FASSIGNID,b.FAPPROVALASSIGNID,a.FACTINSTID
 61                                 from t_wf_assign a
 62                                 join T_WF_APPROVALASSIGN b on a.fassignid=b.fassignid
 63                                 where [email protected]
 64                                 and [email protected] and a.FSTATUS=0 and [email protected]",
 65                         new List<SqlParam>
 66                         {
 67                             new SqlParam("@FormID", DbType.String, formId),
 68                             new SqlParam("@pKValue", DbType.String, pKValue),
 69                             new SqlParam("@FRECEIVERNAMES", DbType.String, receiverName)
 70                         });
 71             DataRow row = ds.Tables[0].Rows.Cast<DataRow>().FirstOrDefault();
 72             if (row == null) throw new Exception("未找到待办任务");
 73
 74             string assignId = row["FASSIGNID"].ToString();
 75             string approvalAssignId = row["FAPPROVALASSIGNID"].ToString();
 76             string _approvalItemId = AssignmentServiceHelper.OpenApprovalItem(this.Context, this.Context.UserId, assignId, false);
 77             FormMetadata formMetadata = MetaDataServiceHelper.GetFormMetaData(this.Context, formId);
 78             DynamicObject ObjData = BusinessDataServiceHelper.LoadSingle(this.Context, pKValue, formMetadata.BusinessInfo.GetDynamicObjectType());
 79             BusinessInfo businessInfo = formMetadata.BusinessInfo;
 80
 81             var _approvalItem = AssignmentServiceHelper.GetApprovalItemById(this.View.Context, _approvalItemId);
 82             if (_approvalItem == null) throw new Exception("待办任务所在的流程实例不在运行中,不能进行处理!");
 83             _approvalItem.ObjData = ObjData;
 84             _approvalItem.ReceiverPostId = 0;
 85             _approvalItem.ActionResult = actionResult;
 86             _approvalItem.Disposition = disposition.ToString();
 87             AssignResult assignResult = _approvalItem.Actions != null ? _approvalItem.Actions.FirstOrDefault(i => i.Id == actionResult) : null;
 88             AssignResultApprovalType approvalType = assignResult != null ? assignResult.ApprovalType : AssignResultApprovalType.None;
 89             _approvalItem.ActionResultType = approvalType;
 90             _approvalItem.Status = ApprovalItemStatus.Completed;
 91             DateTime timeNow = TimeServiceHelper.GetSystemDateTime(this.Context);
 92             _approvalItem.CompletedTime = timeNow;
 93
 94             ObjectActivityInstance _activityInstance = AssignmentServiceHelper.ConvertActivityModel(
 95                     this.Context, businessInfo, approvalAssignId, _approvalItem);
 96
 97             var option = OperateOption.Create();
 98
 99             if (isApprovalFlow)
100             {
101                 ApprovalAssignmentContext assignCtx = new ApprovalAssignmentContext()
102                 {
103                     ApprovalItems = new List<ApprovalItem>() { _approvalItem },
104                     Info = businessInfo,
105                     Option = option
106                 };
107                 assignCtx.NextActHandler = null;
108                 assignCtx.RejectReturn = false;
109                 assignCtx.ActivityInstance = _activityInstance;
110                 if (actionResult == AssignResultApprovalType.Reject.ToString())
111                 {
112                     string actInstId = row["FACTINSTID"].ToString();
113                     Kingdee.BOS.Workflow.App.Core.ProcInstService procInstService = new Kingdee.BOS.Workflow.App.Core.ProcInstService();
114                     var rejectActivityIds = procInstService.GetBackActInstList(this.Context, actInstId, true).Select(r => r.ActivityId);
115                     if (!rejectActivityIds.Any()) throw new Exception("无驳回节点");
116                     assignCtx.Target = rejectActivityIds.FirstOrDefault();
117                 }
118                 ApprovalAssignmentServiceHelper.SubmitApprovalItem(Context, assignCtx);
119             }
120             else
121             {
122                 ApprovalAssignmentContext assignCtx = new ApprovalAssignmentContext()
123                 {
124                     ApprovalItems = new List<ApprovalItem>() { _approvalItem },
125                     Info = businessInfo,
126                     Option = option
127                 };
128                 assignCtx.NextActHandler = null;
129                 assignCtx.RejectReturn = false;
130                 assignCtx.ActivityInstance = _activityInstance;
131                 AssignmentServiceHelper.SubmitApprovalItem(Context, assignCtx);
132             }
133         }

原文地址:https://www.cnblogs.com/jlz-s/p/9834866.html

时间: 2024-07-30 13:35:16

【转】K3Cloud 在插件中调用工作流的相关文章

在插件中得到,调用 插件的id

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title></head><body><button id="btn">改变</button><script src="js/jquery.js"></

在VBA中调用大漠插件[ V2.1133 ]

VBA中大漠插件的调用[ V2.1133 ] -首先要在电脑中注册大漠插件,系统暂不支持windows 8 :如想获得更好的体检请购买收费版本大漠插件: -代码如下: ======================== Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '以下为延时函数 Delay ( ) Public Function Delay(DT As Long)For i = 0 To

kettle中调用java类

有时需要在kettle调用java类,如:验证.查询或自定义加密等.有时甚至连基本的数据访问都不那么简单,如获取一个存储文件或使用一个数据库连接,某些数据源可能封装在应用程序中,手工使用自定义的java客户端访问是唯一的方法.本文介绍如何在kettle中调用java类.示例代码在这里下载. 注:如果你使用kettle4.0及以上版本,也你也可以使用user defined java class 步骤实现.   Modified Java ScriptValue 步骤 关键要在kettle中使用M

理清cordova插件的调用流程

从调用的角度看流程  前端调用(clobbers)-->cordova_plugins.js(clobbers对应插件id和插件文件所在的路径)-–>js部分(配置着插件的名字,已经插件里面都有的方法)-->config.xml(根据插件的名字找到对应的插件原生文件的包名)-->原生(根据匹配到的方法名,来调用原生方法,另外也可以获取到js传递下来的参数) 简单说:前端调用-->桥梁:(cordova_plugin.js clobbers)-->js文件-->桥梁

Gradle 1.12 翻译——第十七章. 从 Gradle 中调用 Ant

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41204073 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

Mac下使用Eclipse实现Android中调用C/C++(NDK)基础详细教程

写于2014年那个办公室停电导致热爆了汗流浃背的夏天. 吐槽和需求 果然跟po主用之前猜的差不多,eclipse不愧是po主非常非常没有猿粪的开发工具,po主简直已经无力吐槽了,为什么稳定性这么糟糕的东西居然还能被如此多大牛开发者甘之如饴?一群叫嚣着要开发出世界上最人性化UI的人连自己用的工具都不稳定(人性化?呵呵),就像一个拿着漏勺烂锅残口菜刀的乞丐跟你说他能做世界上最好的叫花鸡一样--你信吗?当然,厨师可以不会(一般也不)生产菜刀,生产菜刀的也不一定是厨师,但起码要能分辨出好的菜刀:开发者可

编写chrome插件,调用本地应用程序,并进行通讯(发送信息给应用程序)

开发说明 1.浏览器插件实现manifest.json文件内容.每个chrome的插件都需要该文件,该文件记录插件的关键信息 { "name" : "callapp", "version" : "1.0.1", "description" : "call local application", "background" : { "scripts":

WEB中调用Nutch执行JOB抓取

把nutch的源代码导入到eclipse工程自定义抓取任务. 下载源码: http://svn.apache.org/repos/asf/nutch/ 从svn下载想要的nutch源码,这里选择nutch-1.1 编译源码: 使用ant编译源代码,编译成功,可以看到多了一个build目录,其中有plugins目录及nutch-1.1.job文件 新建WEB工程 新建web工程org.apache.nutch.web,执行以下操作 1.      把nutch源代码的src/java 目录复制到w

在C#中调用VBScript和JavaScript等脚本的实现

在C#中调用VBScript.JavaScript等脚本的实现 作者:郑佐 2004-04-26 以前在做工作流(workflow)项目的时候,里面有一项就是在用户制定流程定义时可以编写脚本来控制活动的跳转,而这些脚本定义后存在数据库中,当流程启动的时候,工作流引擎会控制活动执行顺序,串型的两个活动比较简单,但有的活动到下一个活动有条件判断,或者存在多个分支,简单的还好,只要在数据库表中加个字段就可以实现,复杂一点的就需要通过脚本实现了.当时经验不够,几天都没找到快速的解决办法,想自己写一个自定