本文介绍了客户希望将星空的工作流集成到第三方系统的需求,并指出以往方案的灵活性与开发者能力要求。作者分享了工作流集成的一些常用示例,并提供了示例代码,包括在第三方系统打开星空的信息中心界面、我的待办列表等功能的实现方式。同时,还提供了关于单点登录特性的参考资料链接,并提醒用户在使用时需注意软件版本的更新。整体内容旨在帮助开发者更方便地实现工作流集成。
最近收到很多客户或伙伴的反馈,希望在第三方系统集成星空的工作流,例如把星空的信息中心在第三方系统展示、直接在第三方系统处理工作流任务、流程在第三方系统流转通过接口同步处理星空的工作流等等。平台之前给的方案大部分是基于单点登录特性,然后在星空中做动态表单开发,第三方系统先单点登录到这个表单再跳转,例如任务处理、显示代办、已办等。这个方案比较灵活,但对开发者的能力会有一定要求,新手比较难以上手。基于这个考虑,我整理了一些工作流的常用集成示例来分享给大家,后续也会持续在本贴更新完善。演示代码请大家下载附件。
首先,做工作流的集成,我们需要先了解单点登录特性,我这边推荐两个帖子去参考:
1)https://vip.kingdee.com/article/9788 2)https://vip.kingdee.com/article/37406
上面两个是总部基础平台部的老师分享的,很详细的介绍了如何使用单点登录,本贴就借花献佛了。
有了前面的基础,接下来就是工作流集成的干货分享了。
1、在第三方系统打开星空的信息中心界面(废话不多说,直接上代码)
string url = "http://localhost:1700/k3cloud/Silverlight/Index.aspx?ud="; #region 访问信息中心 // 访问信息中心 int lcId = 2052; //时间戳 string timestamp = DateTime.Now.GetTimestamp().ToString(); //数据中心ID string dbId = "5e7d9ad5d3fd70"; //用户名称 string userName = "yh"; //第三方系统应用Id string appId = "205406_2Y9DTaFO6PG528UuwY6N2d/M6r1WSoqL"; //第三方系统应用秘钥 string appSecret = "b54716208c8a47d0bba38bd4b57f22f2"; //签名 string[] arr = new string[] { dbId, userName, appId, appSecret, timestamp}; string sign = Kingdee.BOS.Util.SHA1Util.GetSignature(arr); SimplePassportLoginArg arg = new SimplePassportLoginArg(); arg.appid = appId; arg.dbid = dbId; arg.lcid = lcId.ToString(); arg.origintype = "SimPas"; arg.signeddata = sign; arg.timestamp = timestamp; arg.username = userName; arg.entryrole = string.Empty; arg.formid = "WF_Worklist_Main"; //信息中心 arg.formtype = string.Empty; arg.otherargs = string.Empty; arg.pkid = string.Empty; string argJosn = Kingdee.BOS.JSON.KDObjectConverter.SerializeObject(arg); string argJsonBase64 = System.Text.UTF8Encoding.UTF8.GetBytes(argJosn).ToBase64(); InfoUrl = url + argJsonBase64;//第三方系统展示信息中心界面的地址 #endregion
2、在第三方系统打开星空的我的待办列表(部分变量值参考1)
#region 访问我的待办 arg = new SimplePassportLoginArg(); arg.appid = appId; arg.dbid = dbId; arg.lcid = lcId.ToString(); arg.origintype = "SimPas"; arg.signeddata = sign; arg.timestamp = timestamp; arg.username = userName; arg.entryrole = string.Empty; arg.formid = "WF_AssignmentBill"; //我的待办 arg.formtype = "list"; arg.otherargs = string.Empty; arg.pkid = string.Empty; argJosn = Kingdee.BOS.JSON.KDObjectConverter.SerializeObject(arg); argJsonBase64 = System.Text.UTF8Encoding.UTF8.GetBytes(argJosn).ToBase64(); AssignmentUrl = url + argJsonBase64;;//第三方系统展示我的待办列表界面地址 #endregion
说明:关于第2点,在第三方系统直接打开星空中我的待办列表,需要将星空更新到7.X最新版本,然后安装2020年05的补丁,研发的兄弟姐妹们正在快马加鞭的开发这个补丁。
3、在第三方系统仅查询并显示我的待办记录,然后调用星空的任务处理界面处理任务
string url = "http://localhost:1700/k3cloud/"; string approvalUrl = "http://localhost:1700/k3cloud/Silverlight/Index.aspx?ud="; // 访问信息中心 int lcId = 2052; //数据中心ID string dbId = "5e7d9ad5d3fd70"; //用户名称 string userName = "yh"; //第三方系统应用Id string appId = "205406_2Y9DTaFO6PG528UuwY6N2d/M6r1WSoqL"; //第三方系统应用秘钥 string appSecret = "b54716208c8a47d0bba38bd4b57f22f2"; long userId = 135880; ApiClient client = new ApiClient(url); string loginResult = client.LoginByAppSecret( dbId, userName, appId, appSecret, 2052); Newtonsoft.Json.Linq.JObject loginResultObj = JObject.Parse(loginResult); JToken loginResultType; loginResultObj.TryGetValue("LoginResultType", out loginResultType); string result = "登录失败,请检查与站点地址、数据中心Id,用户名及密码!"; Control ctrl = this.FindControl("assignList"); // 登陆成功,开始保存数据 if (loginResultType != null && loginResultType.Value<Int32>() == 1) { var resultAssigns = client.Execute<List<List<object>>>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery", new object[] { "{\"FormId\":\"WF_AssignmentBill\","+//待办任务formid "\"TopRowCount\":10,"+//最多允许查询的数量,0或者不要此属性表示不限制 "\"Limit\":10,"+// 分页取数每页允许获取的数据,最大不能超过2000 "\"StartRow\":0,"+// 分页取数开始行索引,从0开始,例如每页10行数据,第2页开始是10,第3页开始是20 "\"FilterString\":\"FSTATUS = 0 and FReceiverId ='"+userId + "'\","+// 过滤条件 "\"OrderString\":\"FCreateTime DESC\","+// 排序条件 //TODO:要支持查询FTmpId.FProcessType,需要先修改元数据,设计器打开WF_AssignmentBill,找到流程模板字段,字段类型设置正确(wf_TemplateSelect), //TODO:并把引用属性流程分类加上,这个问题平台会在后续补丁完善 "\"FieldKeys\":\"FASSIGNID,FTitle,FCONTENT,FCREATETIME\"}"// "\"FieldKeys\":\"FASSIGNID,FTitle,FCONTENT,FCREATETIME,FTmpId.FProcessType\"}" }); if (resultAssigns == null || resultAssigns.Count == 0) { return; } string formId = "WF_AssignmentApproval";//工作流任务=WF_AssignmentApproval,审批流=AP_ApprovalAssignHandle //时间戳 string timestamp = DateTime.Now.GetTimestamp().ToString(); //签名 string[] arr = new string[] { dbId, userName, appId, appSecret, timestamp }; string sign = Kingdee.BOS.Util.SHA1Util.GetSignature(arr); SimplePassportLoginArg arg = new SimplePassportLoginArg(); arg.appid = appId; arg.dbid = dbId; arg.lcid = lcId.ToString(); arg.origintype = "SimPas"; arg.signeddata = sign; arg.timestamp = timestamp; arg.username = userName; arg.entryrole = string.Empty; arg.formid = formId; arg.formtype = string.Empty; arg.pkid = string.Empty; foreach (var assign in resultAssigns) { LiteralControl li = new LiteralControl(); arg.otherargs = assign[0].ToString(); //TODO:判断FProcessType,决定formid是用工作流的还是审批流的 //if (assign[4].ToString() == "310") //{ // // 310是审批流 // arg.formid = "AP_ApprovalAssignHandle"; //} string argJosn = Kingdee.BOS.JSON.KDObjectConverter.SerializeObject(arg); string argJsonBase64 = System.Text.UTF8Encoding.UTF8.GetBytes(argJosn).ToBase64(); string InfoUrl = approvalUrl + argJsonBase64;// 星空任务处理地址 // 任务处理链接 li.Text = string.Format("<h5>{0}</h5>{1}<a href=\"javascript:window.open('{2}');void(0);\"> 处理 </a>", assign[1], assign[2], InfoUrl); ctrl.Controls.Add(li); } } else { LiteralControl li = new LiteralControl(); li.Text = result; ctrl.Controls.Add(li); }
这个示例中用到了webapi,如果大家不了解星空的webapi,可以通过论坛搜索系统集成去查找相关分享。
另外在这部分代码中有两处TODO代码,如果要使用注释的代码,需要按以下要求先进行调整(平台也会在后续补丁进行完善,完善后二开无需再进行设计器的修改就可以使用注释的代码了)。
1)打开设计器,打开任务明细表单WF_AssignmentBill
2)修改流程模板字段属性如下
3)保存元数据
关于代码附件的说明:附件是演示示例代码,需要netframework4.0环境,下载后不能直接运行,首先需要把部分BOS组件拷贝到bin目录,组件如下图:
然后修改示例中的url为客户环境的星空地址,调整第三方登录授权信息为客户实际环境的数据,调整dbid,userid以及username等信息,用default.aspx为首页,改完后,不出意外,示例就可以直接跑起来了。大家试试吧!
后续更新完善,敬请期待。。。
推荐阅读