1齐乐乐2020年7月金蝶云星空BOS专题中级课工作流2Content010203工作流整体介绍工作流连线条件工作流插件工作流与第三方集成04常见问题及最佳实践05资料参考063工作流概念工作流(Workflow),主要解决的主要问题是:在多个参与者之间自动传递任务。流程设计流程配置流程管理统计报表4流程设计–工作流与审批流区别审批流:节点是封装好的,很多配置不允许修改,支持较简单的流程工作流:可配置性更强,支持功能更多(如自动单据转换、批量驳回等)审批流三级审批(简洁)工作流三级审批(可配置性强)5Content010203工作流整体介绍工作流连线条件工作流插件工作流与第三方集成04常见问题及最佳实践05资料参考066工作流条件类型使用频率:•基本条件(配置):90%•高级条件(Python):10%•自定义条件(二开):<1%工作流掌握Python,即可完成99%的流程配置7Python条件应用场景连线条件参与人方案条件流程启动条件前置条件后置条件8流程设计难点-Python表达式Python表达式特性:(1)基于IronPython进行解析执行,语法和Python语法保持一致。(2)表达式大小写敏感。(3)内置常用函数。(4)支持自定义C#函数。9流程设计难点-Python表达式关于Python的提单较多:1、不懂Python,无法完成复杂的流程条件配置2、Python语法错误,导致流程出错3、没考虑非空判断、Python运算符优先级问题原因:1、Python需要一定编程基础,对用户不够友好2、单据数据包太复杂,不知道字段属性值怎么取(尤其是单据体字段)3、系统不支持Python自动完成和语法检查,需要反复测试、修改10Python表达式测试功能为了降低Python表达式的使用难度,提高流程设计效率,金蝶云星空7.3版本增加表达式测试功能。可快速执行、验证Python表达式11Python练习题1–取单据字段值利用Python表达式测试功能,完成下列字段取值字段名称Python表达式单据编号客户名称明细信息明细信息第1行数据明细信息第1行的物料编码明细信息第1行的单价12Python练习题1–总结Python不需要一次写对,可利用表达式测试,快速试错、分步完成以取明细信息第1行单价为例:1、查看单据JSON,在数据包中找到明细信息属性FSaleOrderEntry2、取明细信息第1行FSaleOrderEntry[0],报错3、测试FSaleOrderEntry.TargetObjects[0],取到第1行数据包4、在数据包中找到单价属性FPrice5、测试FSaleOrderEntry.TargetObjects[0].FPrice,完成13函数可变形成lambda:def改为lambda,函数名、return省略同样,lambda也可还原成函数Python技巧:lambda表达式等价于lambda表达式本质是单行函数的简写形式Python条件不支持函数,只支持lambda14Python技巧:map()函数map:转换集合中的元素map(lambda输入:输出,集合)map(lambdax:"red",["orange","orange"])["red","red"]15Python技巧:filter()函数filter:过滤集合filter(lamda输入:判断输入是否满足,集合)filter(lambdax:x=="green",["orange","green","green"])=>[“green",“green"]16Python练习题2–lambda表达式根据以下两个业务场景,写出对应的流程条件Python表达式业务场景Python表达式单据明细总金额大于10万,走总经理审批sum(map(lambdax:x.FPrice*x.FPriceUnitQty,FSaleOrderEntry))>100000单据明细中有单价大于1万的物料时,走总经理审批len(filter(lambdax:x.FPrice>10000,FSaleOrderEntry))>017Python技巧1、单据体FEntity是lazyLoad集合,直接取行数据包(如FEntity[0])会报错,可使用FEntity.TargetObjects[0]2、注意判断非空如FUser.FName=‘xx’,字段为空时,FUser为null,会报错。应改为FUser<>nullandFUser.FName=‘xx’3、Python条件过多时,用inFUser.FName=‘xx’orFUser.FName=‘yy’orFUser.FName=‘zz’FUser.Fnamein[‘xx’,‘yy’,‘zz’]4、注意and和or等运算符优先级trueortrueandfalse=trueor(trueandfalse)=true18Python自定义函数-使用场景Python内置函数无法满足需求时,可使用自定义函数进行扩展。使用场景:1、Python表达式超长2、无内置Python函数,如计算平均值3、需要执行SQL获取的数据4、需要调第三方接口获取的数据,如汇率5、复杂的业务逻辑,如计算剩余库存19Python自定义函数-最简单的自定义函数实现方法:<1>继承Kingdee.BOS.Core.Metadata.Expression.FuncDefine.AbstractFuncDefine<2>重写GetFuncDefine()20Python自定义函数–GetFuncDefine返回值类型值函数对象21Python自定义函数-在数据库中注册建议:把多个函数封装到一个Helper类中,GetFuncDefine()返回Helper类实例。注册一次,就能支持多个函数。22Python自定义函数演示1、实现自定义函数HelloWorld2、把求和、求平均数方法封装成Helper类,利用自定义函数调用3、利用自定义函数,计算单据明细总金额23Content010203工作流整体介绍工作流连线条件工作流插件工作流与第三方集成04常见问题及最佳实践05资料参考0624工作流插件开发1、审批动作服务插件用于审批校验、审批前后执行用户自定义动作2、自定义流转条件插件当Python条件无法满足需求时,可以用自定义条件插件3、自定义参与人插件支持自定义基础资料(如销售员)25工作流插件开发-审批动作服务插件背景:流程审批过程中,用户希望同时做一些其他的数据处理,比如将当前审批节点的审批人、审批意见等信息输出到单据上,就可以通过审批动作服务插件实现。操作服务插件基类:Kingdee.BOS.Core.DynamicForm.PlugIn.AbstractOperationServicePlugIn事件:1、BeforeExecuteOperationTransaction,审批前触发2、EndOperationTransaction,审批后触发26工作流插件开发-审批动作服务插件配置方法1、在审核操作上挂插件2、在审批项上绑定审核操作27工作流插件开发-自定义流转条件插件插件基类:Kingdee.BOS.Workflow.Kernel.Condition.AbstractConditionExecutorPlugIn重载方法:Execute(MapStateContextflowSateContext,List
customizeConditionList)背景:目前流程连线上支持单据字段作为条件,决定流程走向;还有其他特殊需求,就希望通过自定义条件插件,编写代码决定流程走向,流程设计将会更加灵活自由。28工作流插件开发-自定义参与人插件插件基类:Kingdee.BOS.Workflow.App.Core.Participant.MemberWrapper.CustomizeMemberPlugIn重载方法:GetUserMember(Contextctx,IEnumerablemembers)背景:现有流程参与人支持用户、角色、员工、岗位、部门、汇报关系、变量或他们的组合。如有其他特殊需求,希望通过自定义参与人插件实现,比如通过业务员中的销售员作为参与人。29工作流插件开发-代码示例工作流插件开发教程与代码示例流程插件开发系列1:审批动作服务插件https://vip.kingdee.com/article/170398流程插件开发系列2:自定义流转条件插件https://vip.kingdee.com/article/170400流程插件开发系列3:自定义参与人插件https://vip.kingdee.com/article/17040130Content010203工作流整体介绍工作流连线条件工作流插件工作流与第三方集成04常见问题及最佳实践05资料参考0631工作流WebAPI介绍金蝶云星空WebAPI是一种轻量级的、可维护的、可伸缩的Web服务。采用HTTP+JSON,也就是用RESTful的方式来开发。使用.NETFramework4.0为开发平台,源代码使用C#编写。工作流WebAPI用于第三方集成,支持流程审批任务的处理、驳回32工作流WebAPI–接口说明接口类:Kingdee.BOS.WebApi.ServicesStub.DynamicFormService参数:userId:审批人用户Id,(该用户必须有待审批任务)formId:单据标识IdpkValues:单据内码Id,数组,可以传多个33工作流WebAPI–在线测试用Administrator登录,打开WebAPI在线测试页面,即可调用WebAPI,测试返回结果34工作流WebAPI–审批代码测试建议使用Kingdee.BOS.WebApi.FormService.dll里面的WebApiServiceCall类。这种调用方式避免了Http请求,并且绕开了用户登录验证,可有效提升性能。WebAPI快捷驳回接口WorkFlowQuickAuditByFormId代码示例35工作流WebAPI–驳回代码测试WebAPI快捷驳回接口WorkFlowQuickRejectByFormId代码示例36工作流WebAPI–如何获取用户的待办任务使用SQL查询待办任务,后续会提供查询接口。selectFASSIGNID,FOBJECTTYPEIDasFormId,FKEYVALUEaspkValue,FRECEIVERID,FNUMBERFROMV_WF_ASSIGNwhereFRECEIVERID=@UserId37Content010203工作流整体介绍工作流连线条件工作流插件工作流与第三方集成04常见问题及最佳实践05资料参考0638工作流常见问题-流程设计不合理解决方法:1、简化流程,使用参与人方案,减少节点个数2、分拆成多个流程,设置启动条件问题:1、用户:流程不清晰2、系统:节点太多,运行效率低3、实施:维护困难39工作流常见问题–工作流连线上没有条件工作流增加连线,一定要设置连线条件,判断审批结果(ActionResult),否则无论同意还是驳回,都会走连线,导致流程出错审批流同意时才会连线,连线条件可以不判断审批结果40工作流常见问题–ActionResult判断条件ActionResult是用户审批时选择的审批项编码工作流需要用ActionResult作为连线条件,确定节点审批、驳回后走哪个连线一级节点下面的连线条件是ActionResult=‘01’,表示只有审批同意时,才会到二级节点。如果忘记设置条件,一级节点驳回时,也会走到二级节点41工作流常见问题–删除流程条件中引用的字段删除流程条件中引用的字段,导致条件表达式出错,流程挂起删除字段前需要确认流程条件中是否用到42工作流常见问题–流程路线、节点出入模式设置错误问题:开始节点同时走两条线到达二级审批,导致用户收到重复待办任务解决方法:1、消息节点放在一级审批之后,不用分支2、二级节点可以设置为并行模式(等到全部前置节点处理完毕,才启动下一节点)43工作流常见问题–随意转发邮件审批链接启用邮件审批后,用户邮件中会包含任务处理链接。点击链接能直接登录系统,不需要密码!如果将邮件随意转发到他人邮箱、QQ、微信群,就相当于把账户密码告诉别人,导致账户被盗用、数据泄露。邮件转发要慎重!44工作流常见问题–收不到邮件1、检查服务器域名、端口是否连接正常2、检查用户邮箱、虚拟邮箱是否设置正确3、尽量使用企业邮箱、VIP邮箱,以免被当作垃圾邮件45工作流最佳实践–设置自动归档,提高查询速度启用自动归档功能,可以把历史流程数据转移到历史表中。提高工作流引擎运行速度,同时不影响流程管理和统计报表等功能。46工作流最佳实践–节点运行出错,先检查节点设置CheckList:是否设置了前置条件、后置条件等出入模式是否设置正确前置节点、后置节点设置会签策略特别容易出错47工作流最佳实践–工作流节点不能过多工作流连线太多,某条连线条件设置错误,不易排查节点很多的纯审批流程,可以使用审批流,减少连线数量48工作流最佳实践–参与人设置建议尽量使用岗位、角色、汇报关系等参与人维度。避免人员岗位变动,导致流程频繁修改49工作流最佳实践–启用插件热更新,不用重启IIS插件代码编译后直接生效,不需要重启IIS,提高开发效率。启用方法:1、在WebSite\App_Data\Common.Config中添加appSettings2、给插件类加特性[Kingdee.BOS.Util.HotUpdate]50工作流最佳实践-工具推荐工具名称用途LINQPad编译、运行代码段,不需要VS,可快速测试、调试API调用代码dnSpy反编译调试神器,无需任何源代码,生产环境可直接反编译程序集,修改代码和调试程序集。Git代码管理神器51Content010203工作流整体介绍工作流连线条件工作流插件工作流与第三方集成04常见问题及最佳实践05资料参考0652参考资料-工作流知识汇总https://vip.kingdee.com/article/5928321719465139253资料参考–Python相关Python内置函数https://www.runoob.com/python/python-built-in-functions.html学习笔记-Python字符串操作https://vip.kingdee.com/article/34108常用的Python条件https://vip.kingdee.com/article/43989如何比较字段值https://vip.kingdee.com/article/17027字符串操作https://vip.kingdee.com/article/3410854答疑时间答疑55Thanksterimakasih感謝谢谢ありがとうขอบคุณ