本文讨论了关于在第三方系统中集成星空工作流的客户需求和现有方案。现有方案主要基于单点登录和动态表单开发,但存在开发难度。作者因此分享了工作流集成的常用示例,包括在第三方系统打开星空的信息中心、我的待办列表,以及查询待办记录并调用星空任务处理界面的方法。同时,提供了详细的代码示例和必要的配置信息,并建议参考相关单点登录的文章以获取更多基础知识。此外,还提到了在第三方系统直接打开待办列表需要星空更新到特定版本并安装补丁。
最近收到很多客户或伙伴的反馈,希望在第三方系统集成星空的工作流,例如把星空的信息中心在第三方系统展示、直接在第三方系统处理工作流任务、流程在第三方系统流转通过接口同步处理星空的工作流等等。平台之前给的方案大部分是基于单点登录特性,然后在星空中做动态表单开发,第三方系统先单点登录到这个表单再跳转,例如任务处理、显示代办、已办等。这个方案比较灵活,但对开发者的能力会有一定要求,新手比较难以上手。基于这个考虑,我整理了一些工作流的常用集成示例来分享给大家,后续也会持续在本贴更新完善。演示代码请大家下载附件。
首先,做工作流的集成,我们需要先了解单点登录特性,我这边推荐两个帖子去参考:
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为首页,改完后,不出意外,示例就可以直接跑起来了。大家试试吧!
方法.rar(3.53MB)