• Microsoft Dynamics CRM 批量上传web资源(非官方WebResourceUtility)并替换实体图标


    背景:

    去年以前可以按照目录WebResourceUtility批量上传web资源,昨天发现用不了了,拿到WebResourceUtility源码改了一下都不是很方便,感觉官方写的太冗余,太长了,跟我喜欢的简单粗暴思想不太符合,刚好无意阅览了一个上传资源的代码,干脆自己手写一个根据目录去上传web资源的工具。

    工具:

    LinqPad 5

    Microsoft Dynamics SDK 9.0

    XrmToolBox

    老规矩先上效果图:

    目录包含的文件

    批量创建web资源后,发布

     

    解决方案添加现有资源

     

     代码

      1 //Microsoft Dynamics CRM 批量上传web资源(非官方WebResourceUtility)替换图标
      2 //对应web资源在mscrm的文件类型
      3 enum FileTypes
      4 {
      5     HTML = 1,
      6     CSS = 2,
      7     JS = 3,
      8     XML = 4,
      9     PNG = 5,
     10     JPG = 6,
     11     GIF = 7,
     12     XAP = 8,
     13     XSL = 9,
     14     ICO = 10,
     15     SVG = 11,
     16     RESX = 12
     17 }
     18 //根据目录获取目录下所有的文件
     19 Dictionary<string, int> GetFilesWithDir(string localPath)
     20 {
     21     Dictionary<string, int> dict = new Dictionary<string, int>();
     22     var typelist = Enum.GetNames(typeof(FileTypes));
     23     var dirs = Directory.GetDirectories(localPath);
     24     //dirs.Dump();
     25     foreach (var dir in dirs)
     26     {
     27         var files = Directory.GetFiles(dir);
     28         //files.Dump();
     29         foreach (var file in files)
     30         {
     31             var index = file.LastIndexOf(".");//.Dump();
     32             if (index == -1) continue;
     33             var filetype = file.Substring(index + 1).ToUpper();
     34             if (typelist.Contains(filetype))
     35             {
     36                 dict.Add(file,
     37                 Enum.Parse(typeof(FileTypes), filetype).GetHashCode()
     38                 );
     39             }
     40 
     41         }
     42     }
     43     return dict;
     44 }
     45 
     46 //创建或更新web资源
     47 Guid CreateOrUpateFile2WebResoulse(IOrganizationService service, string filePath, FileTypes type, string rootPath, string serverPath = "new_/icons/")
     48 {
     49     Stopwatch sw = new Stopwatch();
     50     sw.Start();
     51 
     52     string fileName = filePath.Replace(rootPath, serverPath).Replace("\", "/");
     53 
     54     var fileContent = File.ReadAllText(filePath);
     55 
     56     fileName = Regex.Replace(fileName, @"[u4e00-u9fa5]", "").Replace("//", "/");
     57 
     58     //常规文本文件
     59     var customTypes = new int[] { 1, 2, 3, 4, 11, 12 };
     60 
     61     QueryExpression query = new QueryExpression("webresource")
     62     {
     63         ColumnSet = new ColumnSet(new string[] { "webresourceid" }),
     64         Criteria = new FilterExpression(LogicalOperator.And)
     65     };
     66     query.Criteria.AddCondition("name", ConditionOperator.Equal, new object[] { fileName });
     67     EntityCollection entitys = service.RetrieveMultiple(query);
     68 
     69     Guid entityId;
     70 
     71     Entity entity = new Entity("webresource");
     72     entity["content"] = customTypes.Contains(type.GetHashCode()) ? Convert.ToBase64String(Encoding.UTF8.GetBytes(fileContent.ToString())) : ImgToBase64String(filePath);
     73 
     74     if (entitys.Entities.Count == 0)
     75     {
     76         entity["webresourcetype"] = new OptionSetValue(type.GetHashCode());
     77         entity["displayname"] = fileName;
     78         entity["name"] = fileName;
     79         entity["componentstate"] = new OptionSetValue(0);
     80         entityId = service.Create(entity);
     81     }
     82     else
     83     {
     84         entity = entitys.Entities[0];
     85         service.Update(entity);
     86         entityId = entity.Id;
     87     }
     88     sw.Stop();
     89     Console.WriteLine($"{fileName} 创建/更新成功!耗时:{sw.ElapsedMilliseconds} 毫秒。");
     90     return entityId;
     91 }
     92 
     93 //发布web资源
     94 void publishWebResources(List<Guid> ids,IOrganizationService service)
     95 {
     96     Stopwatch sw=new Stopwatch();
     97     sw.Start();
     98     
     99     var sb=new StringBuilder();
    100     
    101     foreach (var id in ids)
    102     {
    103         sb.AppendLine($"
    <webresource>{id.ToString().ToUpper()}</webresource>
    ");
    104     }
    105     XElement element = XElement.Parse("<importexportxml>
    <webresources>"+sb.ToString()+"</webresources>
    </importexportxml>");
    106     PublishXmlRequest request = new PublishXmlRequest();
    107     request.ParameterXml = element.ToString();
    108     service.Execute(request);
    109     sw.Stop();
    110     Console.WriteLine($"批量发布!耗时:{sw.ElapsedMilliseconds} 毫秒。");
    111 
    112 }
    113 void Main()
    114 {    
    115     var service = Dynamic365.GetService(Envs.dev);
    116     
    117     var rootPath = @"D:Desktop图标20191123图标20191123";
    118     var targetPath = @"new_/dyicon/";
    119     var dict=GetFilesWithDir(rootPath).Dump("目录包含的文件");
    120     
    121     var ids=new List<Guid>();
    122     
    123     foreach (var kv in dict)
    124     {
    125         Guid id;
    126         try
    127         {
    128             id=CreateOrUpateFile2WebResoulse(service, kv.Key, (FileTypes)kv.Value, rootPath, targetPath);
    129 
    130         }
    131         catch(Exception ex)
    132         {
    133             ex.Dump();
    134             
    135             //报错重新执行一次
    136             id=CreateOrUpateFile2WebResoulse(service, kv.Key, (FileTypes)kv.Value, rootPath, targetPath);
    137         }
    138         ids.Add(id);
    139     }
    140     
    141     publishWebResources(ids,service);
    142 }

    问题延伸:

    web资源批量上传后,但是还是需要手动选择web资源替换实体图标,这里在xrmtoolbox的插件市场找到iconator插件

     实体修改图标最终效果图

     更换站点地图底色后

     移动端:

  • 相关阅读:
    Java实验--基于Swing的简单的歌曲信息管理系统(三)
    Java实验--基于Swing的简单的歌曲信息管理系统(二)
    Java实验--基于Swing的简单的歌曲信息管理系统(一)
    《下厨房》移动应用开发需求分析(第二版)
    《下厨房》移动应用开发需求分析
    结对编程之黄金点游戏
    常用JS正则
    JS正则表达式
    transition-
    DOM与BOM区别js
  • 原文地址:https://www.cnblogs.com/xiefengdaxia123/p/11921924.html
Copyright © 2020-2023  润新知