在EAS工作流中存在以下兼职问题:
节点取参与人的时候根据人员去获取上级,如果此时的人员存在兼职,现在标准程序会获取人员所有职位的上级,即实际业务中不相关的上级人员也会被取出来参与审批,这种并不符合实际的业务场景:
那么如何解决呢?从上面的这个图片我们可以看出来,其实只要在这个场景中引入对应的【组织属性】即可。也就是说 你只要再告诉程序 现在单据的业务发生的组织是哪个,自然地就可以确定出兼职的职位中那一个是该组织体系下的。
在这里我们新建一个工作流函数 来解决此问题,需要先仔细看下下面的操作手册以及应用:
(工作流函数操作手册:https://vip.kingdee.com/article/212581886727071232?productLineId=8&isKnowledge=2)
(工作流函数应用:https://vip.kingdee.com/article/168392489492660992?productLineId=8&isKnowledge=2)
新增一个工作流函数:
函数名称: 根据职员(用户)ID以及组织长编码查找该职员的直接上级 返回类型:参与者(performer) 数组类型:是 输入参数: personID orgLongNumber 函数脚本: if(null == personID || "".equals(personID.toString())) return null; String personIDBak=personID.toString(); com.kingdee.eas.basedata.person.app.PersonToWFAdapter adapter = new com.kingdee.eas.basedata.person.app.PersonToWFAdapter(); com.kingdee.bos.workflow.participant.Person person = adapter.getPersonByUserId(__bosContext, personID.toString()); personID=person.getEmployeeId(); if(!com.kingdee.util.StringUtils.isEmpty(personID)){ personID=com.kingdee.bos.util.BOSUuid.read(personID); }else{ personID=com.kingdee.bos.util.BOSUuid.read(personIDBak); } com.kingdee.eas.basedata.org.PositionCollection positionCol = com.kingdee.eas.basedata.person.PersonFactory.getLocalInstance(__bosContext).getPositions(personID); com.kingdee.eas.basedata.org.HierarchyInfo hierarchyinfo = com.kingdee.eas.basedata.org.HierarchyFactory.getLocalInstance(__bosContext).getDefaultHierarchy(); String hierarId = null; com.kingdee.bos.util.BOSUuid hierarUuid = hierarchyinfo!=null?hierarchyinfo.getId():null; if(hierarUuid!=null){ hierarId = hierarUuid.toString(); } if(positionCol ==null||positionCol.size()<=0) return null; String positionId = ""; java.util.ArrayList list = new java.util.ArrayList(); for(int i=0;i<positionCol.size();i++){ com.kingdee.eas.basedata.org.PositionInfo positionInfo = positionCol.get(i); com.kingdee.eas.basedata.org.AdminOrgUnitInfo orgUnitInfo = positionInfo.getAdminOrgUnit(); String longNumber = com.kingdee.eas.basedata.org.AdminOrgFacadeFactory.getLocalInstance(__bosContext).getComByOrgId(orgUnitInfo.getId()).getLongNumber(); if(orgLongNumber.contains(longNumber)){//单据上的orgLongNumber原则上是业务发生的组织,在这个流程里应该是最末级的组织 positionId = positionInfo.getId().toString(); if(!com.kingdee.util.StringUtils.isEmpty(positionId)){ list.add(positionId); } } } if(list.size()<=0) return null; java.util.ArrayList superlist = new java.util.ArrayList(); com.kingdee.bos.workflow.participant.Person[] sPersons = null; for(int i=0;i<list.size();i++){ positionId = list.get(i); sPersons = adapter.getSupervisor(__bosContext,personID.toString(),positionId,hierarId); for(int j=0;j<sPersons.length;j++){ superlist.add(sPersons[j]); } } sPersons = new com.kingdee.bos.workflow.participant.Person[superlist.size()]; for(int i=0;i<superlist.size();i++) { sPersons[i] = superlist.get(i); } return sPersons;
2,在配置流程的时候要注意什么?
首先,使用函数参与人选取对应的函数【根据职员(用户)ID以及组织长编码查找该职员的直接上级】
然后选择变量来填充参数,选择变量的时候要搞明白这两个参数的含义,personID对应的是要取上级的那个人,
orgLongNumber对应的是参考哪个组织去取上级,然后从单据实体上去选择对应组织的 长编码,注意是长编码(longNumber),不是编码(number)
根据职员(用户)ID以及组织长编码查找该职员的直接上级.ra …(1.02KB)
推荐阅读