④内部公开请勿外传跟着工作流大神学习—☞—如何使用脚本找人作者:黄秋强前言:【程序小媛】在金蝶KSM上提了一个单,想要找某个职位的直接上级作为节点审批参与人。KSM提单中【黄老师】答复:该需求可以通过使用[脚本]节点,请参考脚本《职位直接上级脚本.txt》实现找人。【程序小媛】抓破了脑袋也不知道怎么使用脚本节点。【开发大祥】路过【小媛】的座位,看到【小媛】一脸生无可恋的样子,调侃道:大媛子,你今天又没带脑子出门啦?----------------------------------------------------------------------------------------------------------------------------------------【程序小媛】:(看到大神来了,两眼发光)大祥哥,您这么厉害,这么流弊,金蝶EAS工作流用得出神入化,能不能教教俺,俺在KSM提单的时候,黄老师说俺这个找人可以通过[脚本]节点来实现,然后随手抛给我一个脚本参考,这个咋用呀?(小媛一脸懵逼的看着大祥)【开发大祥】:BOS工作流配置中有一个[脚本]节点,脚本里面用的是java格式代码,可以写sql查数据,也可以直接用java调用业务方法,用处可大了。【程序小媛】:(程序小媛再次一脸懵逼)啥啥啥??虽然没听懂你说的啥,但就是觉得很流弊很厉害非常屌的样子耶~【开发大祥】:那就慢慢说呗,先从[脚本]节点定义说起,先了解下啥是[脚本]节点,它能做啥呗:更详细的你可以在这里【EAS服务支持工作流资料获取途径:http://club.kingdee.com/forum.php?mod=viewthread&tid=1111131&pid=2972411找到《金蝶EAS_V8.1_工作流用户手册.docx》细看看哦】文档地址:https://club.kingdee.com/forum.php?1/9④内部公开请勿外传mod=viewthread&tid=1001997&extra=脚本节点的具体定义&说明如下:脚本节点脚本节点是一种特殊的自动节点,用于执行基于KSCRIPT语言的脚本。当遇到某些工作流中的其它节点不支持或难以实现的功能时,可以使用脚本节点来实现。脚本节点理论上可以实现任何功能,例如,通过脚本节点建立数据库链接、更新某个业务对象、判断业务对象的某个状态、将业务对象中某个属性传递到工作流中等。为了方便调试和跟踪,用户可以在java编辑器中编写好脚本,测试通过后再拷贝到脚本节点中。在流程编辑区双击脚本节点,即可查看脚本节点的活动属性,如图所示。脚本节点的活动属性脚本节点的属性说明如表所示。脚本节点的属性说明2/9④内部公开请勿外传【开发大祥】:看完上面的说明,你懂了没?【程序小媛】:不懂不懂,定义太枯燥了,看到这么多字俺就头晕了,能举个栗子说明一下嘛!?【开发大祥】:那我就以案例进行说明吧!【案例一】:首先简单说下脚本执行sql查询赋值到变量的例子,如《脚本执行方式.txt》:这个脚本是:根据单据编码fnumber查业务单据表T_FS_SETTLEMENTBILL中的FSOURCEBILLID字段的值。又如《新脚本执行方式.txt》:3/9属性名称属性功能属性设置基本定义脚本节点的基本描述信息,如名称、优先级等。系统显示各参数默认值,可以根据实际需要修改,具体请参考《金蝶EAS_V8.1_工作流用户手册.docx》Error:ReferencesourcenotfoundError:Referencesourcenotfound。任务定义实现具体功能的脚本。该属性必须设置。在脚本录入框中输入编译通过的脚本信息即可。模式定义流程处理的方式或行为。请参考《金蝶EAS_V8.1_工作流用户手册.docx》Error:ReferencesourcenotfoundError:Referencesourcenotfound进行设置。最后期限定义任务执行的最后期限以及超过期限后的处理策略,用于对超过期限的任务进行催办或触发其他业务处理,避免因节点任务长时间未执行而导致的流程阻塞。请参考《金蝶EAS_V8.1_工作流用户手册.docx》Error:ReferencesourcenotfoundError:Referencesourcenotfound进行设置。后置脚本对于某些复杂的功能可以通过设置脚本来实现,例如对变量赋值或计算单据的相关信息等。在脚本录入框中输入脚本即可。④内部公开请勿外传这种是最广泛使用到的脚本方式,SQL里面的内容,得根据自己的需求去写哦!【程序小媛】:那是不是用上面的这种方式,就能用来做节点找参与人?【开发大祥】:真聪明!例如:【案例二】:这个《根据部门fid取部门的负责人作为审批人.txt》吧:【程序小媛】:哦哦哦!是不是说其实我sql已经找到了我想要找的人,我只需要将找到的人的信息赋值给变量,后面直接用就可以了?【开发大祥】:对!你只要理解清楚【T_ORG_ADMIN行政组织、T_ORG_POSITION职位、T_ORG_POSITIONMEMBER职员_任职情况、T_BD_PERSON职员(员工)、T_PM_USER用户】这几张表之间的关系,再写出符合需求的SQL,只要表数据没问题,找个人分分钟啦。【程序小媛】:(小媛双手托腮眼发青光看着大祥)上面这个SQL祥哥哥您能跟俺说说啥意思么?【开发大祥】:那就简单说说吧,这几张表都不是工作流的表,工作流只是根据这些职员任职关系去查,所以如果查不到数据,你应该要找客户的HR去维护下数据。我们执行SQL,肯定是从子查询先执行的嘛,例如上述整条SQL:selectFIDfromT_PM_USERwhereFpersonidin(selectFpersonidfromT_ORG_PositionMemberwherefpositionidin(selectFIDfromT_ORG_PositionwhereFIsRespPosition='1'andFAdminOrgUnitID='【你拿到的部门fid变量】'))我们可以拆分为如下几步:1.在职位表中,找到属于这个部门的,并且是部门负责人(FIsRespPosition='1')的职位id:selectFIDfromT_ORG_PositionwhereFIsRespPosition='1'andFAdminOrgUnitID='【你拿到的部门fid变量】'4/9④内部公开请勿外传2.拿到步骤1的这个职位id,再去找这个职位上任职的职员id,即:selectFpersonidfromT_ORG_PositionMemberwherefpositionidin('步骤1找到的职位id1',步骤1找到的职位id2')3.步骤2找到了这些职员id,因为工作流参与人需要满足如下《【SQL】-检查用户是否符合工作流参与人.txt》条件,所以我们还要看下他们(这些职员id)是否有对应的用户(EAS850无职员用户可参与工作流):selectFIDfromT_PM_USERwhereFpersonidin('步骤2找到的职位职员1','步骤2找到的职员id2')《【SQL】-检查用户是否符合工作流参与人.txt》详见该网址内容:https://club.kingdee.com/forum.php?mod=viewthread&tid=1510549现在你理解了吗?【程序小媛】:这样容易明白多了,俺还看过有些脚本,里面写了java方法的,例如:【案例三】:《根据职位id取参与人.txt》:com.kingdee.eas.basedata.person.app.PersonToWFAdapteradapter=newcom.kingdee.eas.basedata.person.app.PersonToWFAdapter();com.kingdee.bos.workflow.participant.Person[]personList=adapter.getPositionHolders(__bosContext,mypositionID);该例子中,这两个就是直接写调用系统内置的java方法去找职位上的职员吧?【开发大祥】:没错,脚本里面定义变量、调用具体java方法都需要按照这种格式的。【开发大祥】:[脚本]节点除了可以用来做找节点参与人之外,还可以用来做一些操作,例如终止流程啊、删表数据啊,修复业务数据啊等等,如:5/9④内部公开请勿外传还能够做业务的计算、反写单据信息、做流程走向的判断等等,如:总之咧,[脚本]节点能做的事情很多,这个就有待你后面使用的时候再慢慢研究发掘喇,所谓师傅领进门,修行靠个人嘛!说完,【开发大祥】随手抛给【程序小媛】了一堆脚本,并说道:这些脚本给你参考参考,不能直接套用哦,需要在理解的基础上,根据你的实际需求做修改调试再去使用哦!《工作流各种脚本参考.zip》请详见该网址:https://club.kingdee.com/forum.php?mod=viewthread&tid=1510553【程序小媛】:好哒,谢谢大佬大祥哥!-------------------------------------------------此处应有一条华丽的分割线------------------------------------------------6/9④内部公开请勿外传【番外篇】【程序小媛】:大祥哥,上次的[脚本]俺用起来效果杠杠哒,有点小问题咨询下,[脚本]节点和[审批]、[人工]这些节点的”后置脚本”有什么不一样的吗?【开发大祥】:一样哒,这两个都能写一样的脚本哟,只不过后置脚本是该节点主要任务做完了,才会执行的,一般复杂点的内容,我们就单独抽出来写在[脚本]节点里面,更加清晰明了。简单的内容(例如赋值某个变量这种的)直接写在节点的[后置脚本]里就好了啦~7/9④内部公开请勿外传【程序小媛】:哦哦哦~嗦喋死咖,哇卡里马西大,阿里嘎多!香蕉菠萝麻子(Thankyouverymuch)!其他的例子:【根据自身需求在[脚本]节点中写java处理逻辑】:8/9④内部公开请勿外传PS:此外脚本也能运用在进入[共享]节点前面的脚本上喔,例如:(共享具体脚本内容&配置说明,请找共享那边的小哥哥咨询哦)9/9