如何自动填充目录项中Manager字段对应下属用户至Members列表收集器?
实现经理下属自动填充到列表收集器的方案
实现步骤
- 给Manager字段绑定onChange客户端脚本,触发下属查询逻辑
- 创建可客户端调用的Script Include,负责从服务器端查询指定经理的下属
- 将查询到的用户ID列表赋值给Members列表收集器
客户端脚本(onChange,针对Manager变量)
function onChange(control, oldValue, newValue, isLoading) { if (isLoading || newValue === '') { return; } // 先清空现有成员列表 g_form.setValue('members', ''); var ajaxCall = new GlideAjax('ManagerSubordinatesAjax'); ajaxCall.addParam('sysparm_name', 'getSubordinates'); ajaxCall.addParam('sysparm_manager_id', newValue); ajaxCall.getXMLAnswer(function(response) { if (response) { var subordinateIds = JSON.parse(response); // 将下属ID列表赋值给Members收集器 g_form.setValue('members', subordinateIds.join(',')); } }); }
服务器端脚本(Script Include,名称:ManagerSubordinatesAjax)
需勾选Client callable选项,允许客户端调用:
var ManagerSubordinatesAjax = Class.create(); ManagerSubordinatesAjax.prototype = Object.extendsObject(AbstractAjaxProcessor, { getSubordinates: function() { var managerSysId = this.getParameter('sysparm_manager_id'); var subordinateIds = []; // 查询该经理的所有直接下属 var userGr = new GlideRecord('sys_user'); userGr.addQuery('manager', managerSysId); userGr.query(); while (userGr.next()) { subordinateIds.push(userGr.getValue('sys_id')); // 如果需要获取间接下属(下属的下属),取消下面注释并启用递归方法 // subordinateIds = subordinateIds.concat(this.getIndirectSubordinates(userGr.getValue('sys_id'))); } return JSON.stringify(subordinateIds); }, // 可选:递归获取间接下属的辅助方法 getIndirectSubordinates: function(userId) { var indirectIds = []; var userGr = new GlideRecord('sys_user'); userGr.addQuery('manager', userId); userGr.query(); while (userGr.next()) { indirectIds.push(userGr.getValue('sys_id')); indirectIds = indirectIds.concat(this.getIndirectSubordinates(userGr.getValue('sys_id'))); } return indirectIds; }, type: 'ManagerSubordinatesAjax' });
关键注意事项
- 字段名匹配:确保脚本中的
members和manager与你目录项里的变量名称完全一致 - 权限配置:执行脚本的用户需要有
sys_user表的读取权限,否则无法查询下属数据 - 递归开关:根据业务需求选择是否启用间接下属查询,默认只获取直接下属
- 空值处理:当Manager字段被清空时,脚本会自动清空Members列表收集器
内容的提问来源于stack exchange,提问作者syvny
相关产品推荐
相关产品推荐

