TANG JIANG 1 년 전
부모
커밋
5321e27ed8

+ 1 - 1
src/DataSharing.Application/DataSharing.Application.csproj

@@ -7,7 +7,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Hotline.Share" Version="1.0.38" />
+    <PackageReference Include="Hotline.Share" Version="1.0.39" />
     <PackageReference Include="Polly.Core" Version="8.2.0" />
   </ItemGroup>
 

+ 1 - 1
src/DataSharing.Application/Receivers/BulletinReceiver.cs

@@ -36,7 +36,7 @@ namespace DataSharing.Application.Receivers
         /// <param name="a"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        //[CapSubscribe(EventNames.HotlineOrderFlowStarted)]
+        [CapSubscribe(Hotline.Share.Mq.EventNames.HotlinePushBulletin)]
         public async Task PushBulletin(PublishBulletinDto dto, CancellationToken cancellationToken)
         {
             var data = _mapper.Map<DsBulletin>(dto);

+ 88 - 29
src/DataSharing.Application/Receivers/ProvinceReceiver.cs

@@ -231,8 +231,16 @@ namespace DataSharing.Application.Receivers
 
                 //处理时间格式
                 ForeachClass(data);
+                SendRequestListModel model = new()
+                {
+                    JsonList = new List<string>
+                    {
+                        System.Text.Json.JsonSerializer.Serialize(data)
+                    }
+                };
+
                 //将待推送数据写入待推送表
-                await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", System.Text.Json.JsonSerializer.Serialize(data), cancellationToken, taskPriority: 10);
+                await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", System.Text.Json.JsonSerializer.Serialize(model), cancellationToken, taskPriority: 10);
                 //处理附件
                 await FileDataAsync(dto.FileJson, dto.ProvinceNo, data.CliengGuid, EMaterialType.Acceptance, data.AreaCode, cancellationToken);
             }
@@ -354,8 +362,15 @@ namespace DataSharing.Application.Receivers
 
                 //处理时间格式
                 ForeachClass(data);
+                SendRequestListModel model = new()
+                {
+                    JsonList = new List<string>
+                    {
+                        System.Text.Json.JsonSerializer.Serialize(data)
+                    }
+                };
                 //将待推送数据写入待推送表
-                await InitPushDataAsync("SubmitCaseProcess", "submit_case_process", System.Text.Json.JsonSerializer.Serialize(data), cancellationToken);
+                await InitPushDataAsync("SubmitCaseProcess", "submit_case_process", System.Text.Json.JsonSerializer.Serialize(model), cancellationToken);
 
                 //处理附件
                 await FileDataAsync(dto.WorkflowTrace.FileJson, dto.Order.ProvinceNo, data.CliengGuid, EMaterialType.Process, dto.Order.AreaCode, cancellationToken);
@@ -447,8 +462,15 @@ namespace DataSharing.Application.Receivers
 
                 //处理时间格式
                 ForeachClass(data);
+                SendRequestListModel model = new()
+                {
+                    JsonList = new List<string>
+                    {
+                        System.Text.Json.JsonSerializer.Serialize(data)
+                    }
+                };
                 //将待推送数据写入待推送表
-                await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", System.Text.Json.JsonSerializer.Serialize(data), cancellationToken, taskPriority: 20);
+                await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", System.Text.Json.JsonSerializer.Serialize(model), cancellationToken, taskPriority: 20);
 
             }
         }
@@ -467,8 +489,15 @@ namespace DataSharing.Application.Receivers
 
             //处理时间格式
             ForeachClass(data);
+            SendRequestListModel model = new()
+            {
+                JsonList = new List<string>
+                    {
+                        System.Text.Json.JsonSerializer.Serialize(data)
+                    }
+            };
             //将待推送数据写入待推送表
-            await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", System.Text.Json.JsonSerializer.Serialize(data), cancellationToken, taskPriority: 20);
+            await InitPushDataAsync("SubmitCaseRecord", "submit_case_record", System.Text.Json.JsonSerializer.Serialize(model), cancellationToken, taskPriority: 20);
 
         }
 
@@ -481,8 +510,15 @@ namespace DataSharing.Application.Receivers
         {
             //处理时间格式
             ForeachClass(dto);
+            SendRequestListModel model = new()
+            {
+                JsonList = new List<string>
+                {
+                        System.Text.Json.JsonSerializer.Serialize(dto)
+                    }
+            };
             //将待推送数据写入待推送表
-            await InitPushDataAsync("SubmitCaseTotal", "submit_case_total", System.Text.Json.JsonSerializer.Serialize(dto), cancellationToken);
+            await InitPushDataAsync("SubmitCaseTotal", "submit_case_total", System.Text.Json.JsonSerializer.Serialize(model), cancellationToken);
         }
 
         #endregion
@@ -896,8 +932,15 @@ namespace DataSharing.Application.Receivers
 
                 //处理时间格式
                 ForeachClass(data);
+                SendRequestListModel model = new()
+                {
+                    JsonList = new List<string>
+                    {
+                        System.Text.Json.JsonSerializer.Serialize(data)
+                    }
+                };
                 //将待推送数据写入待推送表
-                await InitPushDataAsync("SubmitVisitInfo", "submit_visit_info", System.Text.Json.JsonSerializer.Serialize(data), cancellationToken, taskPriority: 5);
+                await InitPushDataAsync("SubmitVisitInfo", "submit_visit_info", System.Text.Json.JsonSerializer.Serialize(model), cancellationToken, taskPriority: 5);
 
                 //处理附件
                 await FileDataAsync(null, data.CaseSerial, data.CliengGuid, EMaterialType.Visit, data.AreaCode, cancellationToken);
@@ -947,8 +990,15 @@ namespace DataSharing.Application.Receivers
 
             //处理时间格式
             ForeachClass(data);
+            SendRequestListModel model = new()
+            {
+                JsonList = new List<string>
+                    {
+                        System.Text.Json.JsonSerializer.Serialize(data)
+                    }
+            };
             //将待推送数据写入待推送表
-            await InitPushDataAsync("SubmitCaseResult", "submit_case_result", System.Text.Json.JsonSerializer.Serialize(data), cancellationToken);
+            await InitPushDataAsync("SubmitCaseResult", "submit_case_result", System.Text.Json.JsonSerializer.Serialize(model), cancellationToken);
 
             //处理附件
             await FileDataAsync(dto.WorkflowTrace.FileJson, data.CaseSerial, data.CliengGuid, EMaterialType.Result, dto.Order.AreaCode, cancellationToken);
@@ -1318,29 +1368,21 @@ namespace DataSharing.Application.Receivers
         /// <returns></returns>
         private async Task InitCityDataYBAsync(OrderDto dto, CancellationToken cancellationToken)
         {
-            var cityHandOver = "";// _channelConfigurationManager.GetConfigurationCityHandOver();
-            string source = "";// string.IsNullOrEmpty(dto.Source) ? cityHandOver.SendCityName : cityDataSend.Source;
-            string secretKey = "";// GetMD5(cityDataSend.Source + cityHandOver.SecretKey);
-            string ServerName = dto.IdentityType == EIdentityType.Enterprise ? "1" : "0";
+            var cityHandOver = _channelConfigurationManager.GetConfigurationCityHandOver();
+            string source = cityHandOver.SendCityName;
+            string secretKey = GetMD5(source + cityHandOver.SecretKey);
 
-            string fromGender = "0";
-            switch (dto.FromGender)
+            string fromGender = dto.FromGender switch
             {
-                case EGender.Female:
-                    fromGender = "2";
-                    break;
-                case EGender.Male:
-                    fromGender = "1";
-                    break;
-                default:
-                    fromGender = "0";
-                    break;
-            }
+                EGender.Female => "2",
+                EGender.Male => "1",
+                _ => "0",
+            };
             Dictionary<string, string> dicParam = new()
             {
                 { "Code", secretKey },
                 { "FSHCode", dto.No },
-                { "ServerName", ServerName},
+                { "ServerName", dto.IdentityType == EIdentityType.Enterprise ? "1" : "0"},
                 { "PurTypeName",dto.AcceptType },
                 { "ConTypeName", dto.HotspotSpliceName},
                 { "Title", dto.Title},
@@ -1387,20 +1429,37 @@ namespace DataSharing.Application.Receivers
         /// <param name="taskPriority">任务优先级(0:最低级别)</param>
         /// <param name="fileJson">附件</param>
         /// <returns></returns>
-        private async Task InitPushDataAsync(string taskType, string path, string request, CancellationToken cancellationToken, string httpMethod = "Post",
-            EPlatformSource platformSource = EPlatformSource.Province, int taskPriority = 0, List<FileJson>? fileJson = null)
+        private async Task InitPushDataAsync(string taskType, string path, string request, CancellationToken cancellationToken, string httpMethod = "Post", EPlatformSource platformSource = EPlatformSource.Province, int taskPriority = 0, List<FileJson>? fileJson = null)
         {
-            //将待推送数据写入待推送表
+            //组装参数
             DsSendTask dsSendTask = new()
             {
                 TaskPriority = taskPriority,
                 TaskType = taskType,
                 HttpMethod = httpMethod,
                 Path = path,
-                Request = request,
                 PlatformSource = platformSource,
                 FileJson = fileJson
             };
+
+            //根据不同平台组装不同的请求参数
+            if (platformSource == EPlatformSource.Province)
+            {
+                //获取配置
+                var configProvince = _channelConfigurationManager.GetConfigurationProvince();
+                //组装成需要提交的参数
+                var model = new SendRequestModel
+                {
+                    Data = request,
+                    ClientInfo = new DataSharing.Share.Dtos.Province.ClientInfo(configProvince.ClientId, configProvince.ClientSecret)
+                };
+
+                //将待推送数据写入待推送表
+                dsSendTask.Request = System.Text.Json.JsonSerializer.Serialize(model);
+            }
+            else//其他平台
+                dsSendTask.Request = request;
+
             await _dsSendTaskRepository.AddAsync(dsSendTask, cancellationToken);
         }
         #endregion
@@ -1459,7 +1518,7 @@ namespace DataSharing.Application.Receivers
                 }
             }
 
-        } 
+        }
         #endregion
 
         #endregion

+ 84 - 0
src/DataSharing.Share/Dtos/Province/ProvinceResponse.cs

@@ -0,0 +1,84 @@
+namespace DataSharing.Share.Dtos.Province
+{
+    public class ProvinceResponse
+    {
+        public BaseProvinceResponse ReturnInfo { get; set; }
+    }
+
+    /// <summary>
+    /// 省接口返回
+    /// </summary>
+    public class BaseProvinceResponse
+    {
+        public string Code { get; set; }
+
+        public string Description { get; set; }
+
+        public ErrorObjs custom { get; set; }
+    }
+
+    public class ErrorObjs
+    {
+        public List<ErrorInfo> errorObjs { get; set; }
+    }
+
+    public class ErrorInfo
+    {
+        /// <summary>
+        /// 服务工单编号
+        /// </summary>
+        public string caseserial { get; set; }
+
+        public string resturl { get; set; }
+
+        /// <summary>
+        /// 过程唯一值
+        /// </summary>
+        public string caseid { get; set; }
+    }
+
+    /// <summary>
+    /// 省接口调用返回数据
+    /// </summary>
+    public class Reponse
+    {
+        [System.Text.Json.Serialization.JsonPropertyName("ReturnInfo")]
+        public ReponseBase ReturnInfo { get; set; }
+
+        public static Reponse Success(string? description = "")
+        {
+            return new Reponse
+            {
+                ReturnInfo = new ReponseBase
+                {
+                    Code = "1",
+                    Description = (description ?? "您已成功提交数据!")
+                }
+            };
+        }
+
+        public static Reponse Failed(string? description = "")
+        {
+            return new Reponse
+            {
+                ReturnInfo = new ReponseBase
+                {
+                    Code = "0",
+                    Description = (description ?? "接口调用失败!")
+                }
+            };
+        }
+    }
+
+    /// <summary>
+    /// 省调用接口返回状态
+    /// </summary>
+    public class ReponseBase
+    {
+        [System.Text.Json.Serialization.JsonPropertyName("Code")]
+        public string Code { get; set; }
+
+        [System.Text.Json.Serialization.JsonPropertyName("Description")]
+        public string Description { get; set; }
+    }
+}

+ 1 - 1
src/DataSharing.Share/Dtos/Province/XieTong/Receive/GetCaseMaterialInfoRequest.cs

@@ -16,7 +16,7 @@ namespace DataSharing.Share.Dtos.Province.XieTong.Receive
         /// <summary>
         /// 附件信息
         /// </summary>
-        public GetCaseMaterialInfoModel paras { get; set; }
+        public string paras { get; set; }
     }
 
     /// <summary>

+ 32 - 0
src/DataSharing.Share/Dtos/SendRequestModel.cs

@@ -0,0 +1,32 @@
+using DataSharing.Share.Dtos.Province;
+using System.Text.Json.Serialization;
+
+namespace DataSharing.Share.Dtos
+{
+    /// <summary>
+    /// 请求参数
+    /// </summary>
+    public class SendRequestModel
+    {
+        /// <summary>
+        /// token
+        /// </summary>
+        [JsonPropertyName("token")]
+        public ClientInfo ClientInfo { get; set; }
+
+        /// <summary>
+        /// 请求参数
+        /// </summary>
+        [JsonPropertyName("paras")]
+        public string Data { get; set; }
+    }
+
+    /// <summary>
+    /// 批量提交数据
+    /// </summary>
+    public class SendRequestListModel
+    {
+        [JsonPropertyName("jsonList")]
+        public IReadOnlyList<string> JsonList { get; set; }
+    }
+}

+ 188 - 0
src/DataSharing/CFormUpload.cs

@@ -0,0 +1,188 @@
+using System.Net;
+using System.Text;
+
+namespace DataSharing
+{
+    /// <summary>
+    /// Post提交(包含文件提交)
+    /// </summary>
+    public class CFormUpload
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        private static readonly Encoding encoding = Encoding.UTF8;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="postUrl"></param>
+        /// <param name="userAgent"></param>
+        /// <param name="postParameters"></param>
+        /// <param name="authorization"></param>
+        /// <returns></returns>
+        public static string MultipartFormDataPost(string postUrl, string userAgent, Dictionary<string, object> postParameters, string authorization = "")
+        {
+            string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid());
+            string contentType = "multipart/form-data; boundary=" + formDataBoundary;
+
+            byte[] formData = GetMultipartFormData(postParameters, formDataBoundary);
+
+            HttpWebResponse webResponse = PostForm(postUrl, userAgent, contentType, formData, authorization);
+
+            StreamReader responseReader = new StreamReader(webResponse.GetResponseStream());
+            string fullResponse = responseReader.ReadToEnd();
+            webResponse.Close();
+            return fullResponse;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="postUrl"></param>
+        /// <param name="userAgent"></param>
+        /// <param name="contentType"></param>
+        /// <param name="formData"></param>
+        /// <param name="authorization"></param>
+        /// <returns></returns>
+        /// <exception cref="NullReferenceException"></exception>
+        private static HttpWebResponse PostForm(string postUrl, string userAgent, string contentType, byte[] formData, string authorization = "")
+        {
+            HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest;
+
+            if (request == null)
+            {
+                throw new NullReferenceException("request is not a http request");
+            }
+
+            // Set up the request properties.
+            if (false == string.IsNullOrEmpty(authorization))
+            {
+                request.Headers.Add("Authorization", "Bearer " + authorization);
+            }
+            request.Method = "POST";
+            request.ContentType = contentType;
+            request.UserAgent = userAgent;
+            request.CookieContainer = new CookieContainer();
+            request.ContentLength = formData.Length;
+
+            using (Stream requestStream = request.GetRequestStream())
+            {
+                requestStream.Write(formData, 0, formData.Length);
+                requestStream.Close();
+            }
+
+            var result = request.GetResponse() as HttpWebResponse;
+            return result;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="postParameters"></param>
+        /// <param name="boundary"></param>
+        /// <returns></returns>
+        private static byte[] GetMultipartFormData(Dictionary<string, object> postParameters, string boundary)
+        {
+            Stream formDataStream = new System.IO.MemoryStream();
+            bool needsCLRF = false;
+
+            foreach (var param in postParameters)
+            {
+                if (needsCLRF)
+                    formDataStream.Write(encoding.GetBytes("\r\n"), 0, encoding.GetByteCount("\r\n"));
+
+                needsCLRF = true;
+
+                if (param.Value is FileParameter)
+                {
+                    FileParameter fileToUpload = (FileParameter)param.Value;
+
+                    string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n",
+                        boundary,
+                        fileToUpload.Name,
+                        fileToUpload.FileName ?? param.Key,
+                        fileToUpload.ContentType ?? "application/octet-stream");
+
+                    formDataStream.Write(encoding.GetBytes(header), 0, encoding.GetByteCount(header));
+
+                    formDataStream.Write(fileToUpload.File, 0, fileToUpload.File.Length);
+                }
+                else
+                {
+                    string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}",
+                        boundary,
+                        param.Key,
+                        param.Value);
+                    formDataStream.Write(encoding.GetBytes(postData), 0, encoding.GetByteCount(postData));
+                }
+            }
+
+            string footer = "\r\n--" + boundary + "--\r\n";
+            formDataStream.Write(encoding.GetBytes(footer), 0, encoding.GetByteCount(footer));
+
+            formDataStream.Position = 0;
+            byte[] formData = new byte[formDataStream.Length];
+            formDataStream.Read(formData, 0, formData.Length);
+            formDataStream.Close();
+
+            return formData;
+        }
+
+        /// <summary>
+        /// 附件参数
+        /// </summary>
+        public class FileParameter
+        {
+            /// <summary>
+            /// 
+            /// </summary>
+            public string Name { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public byte[] File { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public string FileName { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            public string ContentType { get; set; }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="name"></param>
+            /// <param name="file"></param>
+            public FileParameter(string name, byte[] file) : this(name, file, null) { }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="name"></param>
+            /// <param name="file"></param>
+            /// <param name="filename"></param>
+            public FileParameter(string name, byte[] file, string filename) : this(name, file, filename, null) { }
+
+            /// <summary>
+            /// 
+            /// </summary>
+            /// <param name="name"></param>
+            /// <param name="file"></param>
+            /// <param name="filename"></param>
+            /// <param name="contenttype"></param>
+            public FileParameter(string name, byte[] file, string filename, string contenttype)
+            {
+                Name = name;
+                File = file;
+                FileName = filename;
+                ContentType = contenttype;
+            }
+        }
+    }
+}

+ 12 - 0
src/DataSharing/Province/IPusherProviderService.cs

@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DataSharing.Province
+{
+    public interface IPusherProviderService
+    {
+    }
+}

+ 153 - 0
src/DataSharing/Province/PusherProviderService.cs

@@ -0,0 +1,153 @@
+using DataSharing.RawData;
+using DataSharing.SendTask;
+using DataSharing.Share.Dtos.Province;
+using DataSharing.Share.Dtos.Province.XieTong.Receive;
+using MapsterMapper;
+using MediatR;
+using Newtonsoft.Json;
+using System.Net;
+using XF.Domain.Dependency;
+using XF.Domain.Repository;
+
+namespace DataSharing.Province
+{
+    public class PusherProviderService : IPusherProviderService, IScopeDependency
+    {
+        private readonly IMapper _mapper;
+        private readonly IMediator _mediator;
+        private readonly IChannelConfigurationManager _channelConfigurationManager;
+        private readonly PusherProvider _pusherProvider;
+        private readonly IHttpClientFactory _httpClientFactory;
+        private readonly XieTongClient _xieTongClient;
+        private readonly IRepository<DsOrder> _dsOrderRepository;
+        private readonly IRepository<DsSendTask> _dsSendTaskRepository;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="mapper"></param>
+        /// <param name="mediator"></param>
+        /// <param name="channelConfigurationManager"></param>
+        /// <param name="pusherProvider"></param>
+        /// <param name="httpClientFactory"></param>
+        /// <param name="xieTongClient"></param>
+        /// <param name="dsOrderRepository"></param>
+        /// <param name="dsSendTaskRepository"></param>
+        public PusherProviderService(IMapper mapper, IMediator mediator,
+            IChannelConfigurationManager channelConfigurationManager,
+            PusherProvider pusherProvider,
+            IHttpClientFactory httpClientFactory,
+            XieTongClient xieTongClient,
+            IRepository<DsOrder> dsOrderRepository,
+            IRepository<DsSendTask> dsSendTaskRepository)
+        {
+            _mapper = mapper;
+            _mediator = mediator;
+            _channelConfigurationManager = channelConfigurationManager;
+            _pusherProvider = pusherProvider;
+            _httpClientFactory = httpClientFactory;
+            _xieTongClient = xieTongClient;
+            _dsOrderRepository = dsOrderRepository;
+            _dsSendTaskRepository = dsSendTaskRepository;
+        }
+
+
+        /// <summary>
+        ///附件上传处理
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task GetCaseMaterialInfoPusher(DsSendTask dto, CancellationToken cancellationToken)
+        {
+            if (dto is null)
+                return;
+
+            bool isRight = true;
+
+            //读取每一条数据中的附件参数
+            if (dto.FileJson != null && dto.FileJson.Count > 0)
+            {
+                foreach (var itemFile in dto.FileJson)
+                {
+                    var result = await SendFileData(dto.Request, itemFile.FileId, itemFile.FileId, cancellationToken);
+                    if (result != null && result.ReturnInfo != null)
+                    {
+                        //结果处理
+                        if (result.ReturnInfo.Code != "1")
+                            isRight = false;
+                    }
+                }
+            }
+
+            if (isRight)
+            {
+                dto.IsSuccess = true;
+                await _dsSendTaskRepository.UpdateAsync(dto, cancellationToken);
+            }
+        }
+
+        /// <summary>
+        /// 附件读取以及附件上传 
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="fileName"></param>
+        /// <param name="fileId"></param>
+        /// <returns></returns>
+        private async Task<ProvinceResponse> SendFileData(string request, string fileName, string fileId, CancellationToken cancellationToken)
+        {
+            //获取配置信息
+            var configProvince = _channelConfigurationManager.GetConfigurationProvince();
+            var businessFile = _channelConfigurationManager.GetConfigurationBusinessFile();
+            byte[] fileContentBytes = null;
+            try
+            {
+                string url = string.Format("{0}{1}?Source={2}&Id={3}", businessFile.BaseUrl, businessFile.DownloadUrlAddress, businessFile.Source, fileId);
+                using (var client = _httpClientFactory.CreateClient())
+                using (var response = await client.GetAsync(url))
+                {
+                    if (response.StatusCode == HttpStatusCode.OK)
+                    {
+                        using var memoryStream = new MemoryStream();
+                        await response.Content.CopyToAsync(memoryStream);
+                        memoryStream.Seek(0, SeekOrigin.Begin);
+                        fileContentBytes = memoryStream.ToArray();
+                    }
+                }
+                if (fileContentBytes != null)
+                {
+                    //获取附件上传Token
+                    string strToken = await _xieTongClient.GetTokenAsync(cancellationToken);
+
+                    ////组装请求参数
+                    //var model = new GetCaseMaterialInfoRequest
+                    //{
+                    //    paras = request,
+                    //    token = new ClientInfo(configProvince.ClientId, configProvince.ClientSecret)
+                    //};
+
+                    Dictionary<string, object> dicParam = new()
+                    {
+                        { "params",  request } // 第一个接口参数,json格式字符串
+                    };
+
+                    // 构造字典文件数据
+                    // 接口参数名称为files
+                    CFormUpload.FileParameter fileParameter = new CFormUpload.FileParameter("files", fileContentBytes, fileName, null);
+                    dicParam.Add(fileName, fileParameter);
+
+                    string strUrl = configProvince.HuiJu + "get_case_material_info";
+                    // 上传附件
+                    string strResult = CFormUpload.MultipartFormDataPost(strUrl, null, dicParam, strToken);
+                    if (!string.IsNullOrEmpty(strResult))
+                        return JsonConvert.DeserializeObject<ProvinceResponse>(strResult);
+                }
+                return new ProvinceResponse();
+            }
+            catch (Exception)
+            {
+                return new ProvinceResponse();
+            }
+        }
+    }
+}