Dynamics 365客户端编程示例:获取当前用户的信息,表单级通知/提示,表单OnLoad事件执行代码 Dynamics 365 获取用户角色名称再也不用额外查询一次了。

Dynamics 365客户端编程示例:获取当前用户的信息,表单级通知/提示,表单OnLoad事件执行代码
Dynamics 365 获取用户角色名称再也不用额外查询一次了。

我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复379或者20191119可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

 今天的文章是接着前面的文章 Dynamics 365客户端编程示例:两个选项集字段的联动 继续的,请先阅读之前的文章。今天这个例子是教大家如何获取当前用户的信息,比如当前用户的角色,做项目的时候容易用到判断用户是否具有某个角色然后做个逻辑比如控制字段是否只读等。还有获取当前用户的一些信息,比如用户的主要电话,或者所属业务部门,显示表单级别的提示信息然后自动隐藏,然后教一下在窗体的OnLoad事件中执行代码。我这里例子是获取用户所属的业务部门,若属于某些业务部门,省份字段只能选择指定的省份。

首先贴上我用到的代码如下,这个是放在名称为 workorderform.js 的Web资源中的。

//定义命名空间,我一般用项目统一前缀加上实体去掉前缀后的架构名称(每个单词首字母大写)
var LuoYongWorkOrder = window.LuoYongWorkOrder || {};
(function () {
    this.formOnLoad = function (executionContext) {
        var formContext = executionContext.getFormContext();
        var myUniqueId = "B76C4FF7-AF21-434D-8482-D39AA02A5F0B";
        formContext.ui.setFormNotification("表单加载完毕,开始执行表单OnLoad代码!", "INFO", myUniqueId);
        //等5秒钟后清除前面代码显示在表单上的提醒
        window.setTimeout(function () { formContext.ui.clearFormNotification(myUniqueId); }, 5000);
        //获取当前用户的Guid
        var userId = Xrm.Utility.getGlobalContext().userSettings.userId;
        //获取用户的角色ID
        var roleIdArray = Xrm.Utility.getGlobalContext().userSettings.securityRoles;
        var roleIdFilter = "";
        roleIdArray.forEach(function (element) {
            roleIdFilter = roleIdFilter + "roleid eq " + element + " or ";
        });
        var userRoleNames = [];
        //通过Web API返回用户拥有的角色名称
        Xrm.WebApi.retrieveMultipleRecords("role", "?$select=name&$filter=" + roleIdFilter.substring(0, roleIdFilter.length - 3)).then(
            function success(result) {
                for (var i = 0; i < result.entities.length; i++) {
                    userRoleNames.push(result.entities[i]["name"]);
                }
                console.log("当前用户拥有" + userRoleNames.length + "个角色,分别为" + userRoleNames.join(","));
            },
            function (error) {
                console.log(error.message);
            }
        );
        Xrm.WebApi.retrieveRecord("systemuser", userId, "?$select=systemuserid&$expand=businessunitid($select=name)").then(
            function success(result) {
                console.log("用户所属的业务部门名称为:" + result.businessunitid.name);
                var formType = formContext.ui.getFormType();
                //只有当前表单是可编辑窗体时才限制省份可选列表,节约计算资源
                if (formType <= 2) {
                    //获取省份字段的所有可用选项信息
                    var provinceValidOptions = formContext.getAttribute("ly_province").getOptions();
                    if (result.businessunitid.name == "Demo") {
                        provinceValidOptions.forEach(
                            function (element) {
                                //移除不能让用户选择的选项
                                if (element.value != 430000) {
                                    formContext.getControl("ly_province").removeOption(element.value);
                                }
                            }
                        );
                    }
                    else if (result.businessunitid.name == "Sub Unit") {
                        provinceValidOptions.forEach(
                            function (element) {
                                if (element.value != 440000) {
                                    //移除不能让用户选择的选项
                                    formContext.getControl("ly_province").removeOption(element.value);
                                }
                            }
                        );
                    }
                }
            },
            function (error) {
                console.log(error.message);
            }
        );
    }
}).call(LuoYongWorkOrder);

然后打开窗体类型为主要的表单,点击Ribbon区的窗体属性,确认事件是 OnLoad后点击【添加】按钮。

Dynamics 365客户端编程示例:获取当前用户的信息,表单级通知/提示,表单OnLoad事件执行代码
Dynamics 365 获取用户角色名称再也不用额外查询一次了。

我的输入如下,函数名称我输入 LuoYongWorkOrder.formOnLoad ,还是要记得勾选 【将执行上下文作为第一个参数传递】,保存后发布。

Dynamics 365客户端编程示例:获取当前用户的信息,表单级通知/提示,表单OnLoad事件执行代码
Dynamics 365 获取用户角色名称再也不用额外查询一次了。

然后去看下效果:

Dynamics 365客户端编程示例:获取当前用户的信息,表单级通知/提示,表单OnLoad事件执行代码
Dynamics 365 获取用户角色名称再也不用额外查询一次了。

按F12,Console中显示了用户的角色和所属业务部门的名字:

Dynamics 365客户端编程示例:获取当前用户的信息,表单级通知/提示,表单OnLoad事件执行代码
Dynamics 365 获取用户角色名称再也不用额外查询一次了。

 获取用户角色名称有更加简单的方法,请参考我的博文: