Dynamics 365 CRM (online) 使用WebApi调用全局action(Plugin)执行批量更新操作, 前端JS批量上传记录到CRM中

  1. 创建一个action process,如下图,分别有两个inputparameter 和一个outputparameter
    在这里插入图片描述

2.使用visual studio 2019编写一个plugin dll, 功能是根据电话,邮件,会员编号为查找条件查Contact表,然后更新某一个实体的记录,代码如下

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Linq;

namespace APM_ProContact_Plugin
{
    public class ProContact_Process : IPlugin
    {
        #region Secure/Unsecure Configuration Setup
        private string _secureConfig = null;
        private string _unsecureConfig = null;

        public ProContact_Process(string unsecureConfig, string secureConfig)
        {
            _secureConfig = secureConfig;
            _unsecureConfig = unsecureConfig;
        }
        #endregion
        public void Execute(IServiceProvider serviceProvider)
        {
            ITracingService tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = factory.CreateOrganizationService(context.UserId);

          
            try
            {
                // Entity entity = (Entity)context.InputParameters["Target"];
                var Create_Num = 0;
                string inputOne = context.InputParameters["InputOne"].ToString();
                string inputTwo = context.InputParameters["InputTwo"].ToString();
                string OutIdList = string.Empty;
                    
                var ProContactQuery = new QueryExpression("apm_procontact");
                ProContactQuery.ColumnSet = new ColumnSet(true);
                ProContactQuery.Criteria.AddCondition("apm_processed", ConditionOperator.NotEqual, true);
           
                var queryEntity = service.RetrieveMultiple(ProContactQuery);
                if (queryEntity.Entities.Count > 0)
                {
                    foreach (Entity item in queryEntity.Entities)
                    {
                        var contactQuery = new QueryExpression("contact");
                        contactQuery.ColumnSet = new ColumnSet(true);
                        string phone = string.Empty;
                        string email = string.Empty;
                        string contact_no = string.Empty;
                        if(item.Attributes.Contains("_phone"))                      
                        {
                            phone = item.Attributes["_phone"].ToString();
                            contactQuery.Criteria.AddCondition("mobilephone", ConditionOperator.Equal, phone);
                        }
                        else if (item.Attributes.Contains("_email"))
                        {
                            email = item.Attributes["_email"].ToString();
                            contactQuery.Criteria.AddCondition("emailaddress1", ConditionOperator.Equal, email);
                        }
                        else if (item.Attributes.Contains("_contact_no"))
                        {
                            contact_no = item.Attributes["_contact_no"].ToString();
                            contactQuery.Criteria.AddCondition("thk_contact_no", ConditionOperator.Equal, contact_no);
                        }
                        else
                        {
                            continue;
                        }
                       
                        var ContactEntity = service.RetrieveMultiple(contactQuery);
                        if (ContactEntity.Entities.Count > 0)
                        {
                            Entity selectEn = ContactEntity.Entities.FirstOrDefault();
                            if (selectEn.Attributes.Count > 0)
                            {
                                Entity updateEntity = service.Retrieve("_procontact", item.Id, new ColumnSet());
                                if (selectEn.Attributes.Contains("thk_howdoyouknowus"))
                                {
                                    updateEntity.Attributes["_howdoyouknowus"] = selectEn.FormattedValues["thk_howdoyouknowus"];
                                }
                                updateEntity.Attributes["_contactid"] = new EntityReference("contact", selectEn.Id);
                                if (selectEn.Attributes.Contains("thk_contact_no"))
                                    updateEntity.Attributes["_contact_no"] = selectEn.Attributes["thk_contact_no"];
                                if (selectEn.Attributes.Contains("new_localortourist"))
                                    updateEntity.Attributes["_local_or_tourist"] = selectEn.FormattedValues["new_localortourist"];
                                if (selectEn.Attributes.Contains("new_countryid"))
                                {
                                    EntityReference countryReference = (EntityReference)selectEn.Attributes["new_countryid"];
                                    updateEntity.Attributes["_country"] = new EntityReference("new_country", countryReference.Id);
                                }
                                if (selectEn.Attributes.Contains("thk_city"))
                                    updateEntity.Attributes["_city"] = selectEn["thk_city"];
                                if (selectEn.Attributes.Contains("thk_address"))
                                    updateEntity.Attributes["_address"] = selectEn.Attributes["thk_address"];
                                if (selectEn.Attributes.Contains("thk_contact_type"))
                                    updateEntity.Attributes["_contact_type"] = selectEn.FormattedValues["thk_contact_type"];
                                if (selectEn.Attributes.Contains("new_creationshop"))
                                    updateEntity.Attributes["_creationshop"] = selectEn.Attributes["new_creationshop"];
                                if (selectEn.Attributes.Contains("_subscription"))
                                    updateEntity.Attributes["_subscription"] = selectEn.FormattedValues["_subscription"];
                                if (selectEn.Attributes.Contains("new_ethnicity"))
                                    updateEntity.Attributes["_ethnicity"] = selectEn.FormattedValues["new_ethnicity"];
                                if (selectEn.Attributes.Contains("fullname"))
                                    updateEntity.Attributes["_fullname"] = selectEn["fullname"];
                                if (selectEn.Attributes.Contains("new_languageid"))
                                    updateEntity.Attributes["_language"] = selectEn.FormattedValues["new_languageid"];
                                if (selectEn.Attributes.Contains("lastname"))
                                    updateEntity.Attributes["_lastname"] = selectEn["lastname"];
                                if ((selectEn.Attributes.Contains("new_membercardid")))
                                    updateEntity.Attributes["_membercard"] = selectEn.Attributes["new_membercardid"];
                                if (selectEn.Attributes.Contains("lastname"))
                                    item.Attributes["_name"] = selectEn.Attributes["lastname"];
                                if (selectEn.Attributes.Contains("new_phoneareacode"))
                                    updateEntity.Attributes["_phoneprefix"] = selectEn.Attributes["new_phoneareacode"];
                                if (selectEn.Attributes.Contains("new_datecreated"))
                                    updateEntity.Attributes["_sourcecreatedate"] = selectEn.Attributes["new_datecreated"];

                                if (selectEn.Attributes.Contains("emailaddress1"))
                                    updateEntity.Attributes["_email"] = selectEn.Attributes["emailaddress1"];

                                if (selectEn.Attributes.Contains("mobilephone"))
                                {
                                    updateEntity.Attributes["_phone"] = selectEn.Attributes["mobilephone"];
                                }
                                if (selectEn.Attributes.Contains("thk_contact_no"))
                                {
                                    updateEntity.Attributes["_contact_no"] = selectEn.Attributes["thk_contact_no"];
                                }

                                updateEntity.Attributes["_processed"] = true;

                                service.Update(updateEntity);
                              

                                Create_Num++;
                            }
                        }
                    }
                    string res = $"{Create_Num.ToString()} records are created.";
                    context.OutputParameters["OutParameter"] = res;

                }
                //TODO: Do stuff
            }
            catch (Exception e)
            {
                throw new InvalidPluginExecutionException(e.Message);
            }
        }
    }
}
  1. 使Plugin-registration tool注册插件,注册为全局的,在Primary Entity处填写none, Message处选择action的名字,要先激活action
    在这里插入图片描述

  2. 测试,批量上传一些记录到表中,此时,上传到CRM后有很字段是没有值的,这就需要点一个按钮(处理数据)调action去更新能匹配到的记录,
    在这里插入图片描述
    在这里插入图片描述

  3. 关于前端如何批量上传记录到CRM,也是采用webapi批量操作,需拼body,相对容易出错,如下代码,


        function BatchPostAccounts() {
            this.apiUrl = "https://yoururl.crm5.dynamics.com" +
                "/api/data/v9.1/";
            this.uniqueId = "batch_" + (new Date().getTime());
            this.batchItemHeader = "--" +
                this.uniqueId +
                "\nContent-Type: application/http\nContent-Transfer-Encoding:binary";
            this.content = [];
        }

        BatchPostAccounts.prototype.addRequestItem = function (entity, entityname) {
            this.content.push(this.batchItemHeader);
            this.content.push("");
            this.content.push("POST " + this.apiUrl + entityname + " HTTP/1.1");
            this.content.push("Content-Type: application/json;type=entry");
            this.content.push("");
            this.content.push(JSON.stringify(entity));

        }

        BatchPostAccounts.prototype.sendRequest = function () {
            this.content.push("");
            this.content.push("--" + this.uniqueId + "--");
            this.content.push(" ");

            var xhr = new XMLHttpRequest();
            xhr.open("POST", encodeURI(this.apiUrl + "$batch"));
            xhr.setRequestHeader("Content-Type", "multipart/mixed;boundary=" + this.uniqueId);
            xhr.setRequestHeader("Accept", "application/json");
            xhr.setRequestHeader("OData-MaxVersion", "4.0");
            xhr.setRequestHeader("OData-Version", "4.0");
            xhr.addEventListener("load",
                function () {
                    console.log("Batch request response code: " + xhr.status);
                });

            xhr.send(this.content.join("\n"));
            alert(xhr.response);
            alert(xhr.status);
            alert(xhr.response.readAsBinaryString());
        }

        function ExecuteBatchRequest() {

            var batchRequest = new BatchPostAccounts();

            var entityname = "apm_procontacts";

            for (var i = 0; i < jsondt.value.length; i++) {

                var contact = Object.create(ContactInfo);

                contact._contact_no = jsondt.value[i]["Contact No"];
                contact._email = jsondt.value[i]["Email"];
                contact._sourcetable = jsondt.value[i]["Source Table"];
                contact._mobilephone = jsondt.value[i]["Mobile Phone"];
                contact._fullname = jsondt.value[i]["Last Name"];

                var anonymous_json = {};
                anonymous_json["_email"] = contact._email;
                anonymous_json["_name"] = contact._fullname;
                anonymous_json["_phone"] = contact._mobilephone;
                anonymous_json["_contact_no"] = contact._contact_no;
                anonymous_json["_city"] = "广州";
                anonymous_json["_contactid@odata.bind"] = "/contacts(0001efb9-2d3e-e911-a982-000d3aa04914)";

                batchRequest.addRequestItem(JSON.stringify(anonymous_json), entityname);

            }
            batchRequest.sendRequest(); //调用方法批量上传数据

            document.getElementById("upload_btn").disabled = true;

            
        }
  1. 上传完毕数据后,然后前端webapi调用CRM的action实现更新操作,WebApi调用Action代码如下

        function UpdateUploadInfo() {

            var result = null;
            var entity = new Object();
            entity["InputOne"] = "parameter input one";
            entity["InputTwo"] = "parameter input two";
            var req = new XMLHttpRequest()
            req.open("POST", "https://yourCRM.crm5.dynamics.com/api/data/v9.1/new_ProContact_Process", false);

            req.setRequestHeader("Accept", "application/json");
            req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
            req.setRequestHeader("OData-MaxVersion", "4.0");
            req.setRequestHeader("OData-Version", "4.0");

            req.onreadystatechange = function () {
                if (this.readyState == 4) {
                    req.onreadystatechange = null;

                    if (this.status == 200) {
                        result = req.responseText;
                    }
                    else if (this.status == 204) {
                        console.log("Request executed successfully with a response.");
                    }
                    else {
                        var error = JSON.parse(this.response).error;
                        alert(error.message);
                    }
                }
            };

            if (entity) {
                req.send(JSON.stringify(entity))
            }
            else {
                req.send();
            }
            alert(result);

            document.getElementById("process_btn").disabled = true;
         
        }
  1. 点击“处理数据”按钮后,数据已被更新,输出参数显示6条记录已被更新,
    在这里插入图片描述

  2. 再回来CRM看记录,很没有值的字段已被更新
    在这里插入图片描述

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
前端使用播放器插件webplugin.exe主要用于在网页播放音频或视频内容。该插件通常为网页开发人员提供了一种简单的方式来嵌入多种格式的音视频文件,并实现播放、暂停、停止、调节音量和全屏等基本功能。 首先,在使用webplugin.exe之前,需要确保已经在网页的代码导入相应的插件文件。插件文件通常以.webplugin或.plugin的扩展名保存,并与网页的HTML代码相互连接。 一般来说,插件的使用方法包括以下几个步骤: 1. 在网页的合适位置创建一个<embed>标签或<object>标签,用来嵌入插件。 2. 在标签设置插件的属性,如宽度、高度、地址、类型等。例如,可以设置src属性来指定要播放的音频或视频文件的路径。 3. 在标签设置其他必要的属性,如自动播放、循环播放、控制按钮的显示等。 4. 刷新网页,即可在指定的位置看到嵌入的播放器插件。 使用webplugin.exe的另一个重要要点是与其他JS或CSS文件的交互。开发人员可以通过调用插件提供的JavaScript函数或通过使用对应的CSS样式来控制播放器的外观和行为。 总结起来,前端使用播放器插件webplugin.exe可以实现方便的音视频播放功能,无论是播放本地文件还是在线音视频流,都可以通过嵌入相关的HTML标签和设置相应的属性来实现。但是需要注意兼容性问题,因为不同的浏览器对插件的支持情况有所不同,所以需要针对不同浏览器做相应的兼容性处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fei-AX&CRM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值