第三方系统集成星空工作流分享​ 第三方系统集成星空工作流分享​原创
金蝶云社区-BingGuo
BingGuo
12人赞赏了该文章 2,590次浏览 未经作者许可,禁止转载编辑于2020年04月21日 22:48:46
封面

最近收到很多客户或伙伴的反馈,希望在第三方系统集成星空的工作流,例如把星空的信息中心在第三方系统展示、直接在第三方系统处理工作流任务、流程在第三方系统流转通过接口同步处理星空的工作流等等。平台之前给的方案大部分是基于单点登录特性,然后在星空中做动态表单开发,第三方系统先单点登录到这个表单再跳转,例如任务处理、显示代办、已办等。这个方案比较灵活,但对开发者的能力会有一定要求,新手比较难以上手。基于这个考虑,我整理了一些工作流的常用集成示例来分享给大家,后续也会持续在本贴更新完善。演示代码请大家下载附件。


首先,做工作流的集成,我们需要先了解单点登录特性,我这边推荐两个帖子去参考:

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)修改流程模板字段属性如下

QQ图片20200421221757.jpg

3)保存元数据


关于代码附件的说明:附件是演示示例代码,需要netframework4.0环境,下载后不能直接运行,首先需要把部分BOS组件拷贝到bin目录,组件如下图:

QQ图片20200421222425.jpg

然后修改示例中的url为客户环境的星空地址,调整第三方登录授权信息为客户实际环境的数据,调整dbid,userid以及username等信息,用default.aspx为首页,改完后,不出意外,示例就可以直接跑起来了。大家试试吧!


后续更新完善,敬请期待。。。



赞 12