Przeglądaj źródła

Merge branch 'master' of http://110.188.24.182:10023/Fengwo/hotline

xf 1 rok temu
rodzic
commit
e734ff133c

+ 2 - 2
Hotline.sln

@@ -43,9 +43,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hotline.Wex", "src\Hotline.
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tr.Sdk", "src\Tr.Sdk\Tr.Sdk.csproj", "{BB901B26-EA97-4D6F-8CAC-14DB321E1733}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hotline.Api.Sdk", "src\Hotline.Api.Sdk\Hotline.Api.Sdk.csproj", "{EEF30056-A626-43B2-9762-632935C1AF31}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hotline.Api.Sdk", "src\Hotline.Api.Sdk\Hotline.Api.Sdk.csproj", "{EEF30056-A626-43B2-9762-632935C1AF31}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApplication1", "test\WebApplication1\WebApplication1.csproj", "{D291230A-0CFD-4991-BC1A-B67C58F3857A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApplication1", "test\WebApplication1\WebApplication1.csproj", "{D291230A-0CFD-4991-BC1A-B67C58F3857A}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

+ 8 - 3
src/Hotline.Api/Controllers/DataSharing/CityDataExchangeController.cs

@@ -1,5 +1,4 @@
-using Fw.Utility.UnifyResponse;
-using Hotline.DataSharing;
+using Hotline.DataSharing;
 using Hotline.DataSharing.DataExchange;
 using Hotline.DataSharing.Province.Notifications;
 using Hotline.Share.Dtos.DataSharing;
@@ -68,6 +67,10 @@ namespace Hotline.Api.Controllers.DataSharing
             if (!string.IsNullOrEmpty(strResult))
                 return OpenResponse.Ok(DataExchangeDeReponse.Failed("-900", strResult));
 
+            var tempData = await _cityDataReceiveRepository.GetAsync(p => p.FSHCode == cityDataReceiveDto.FSHCode, HttpContext.RequestAborted);
+            if (tempData != null)
+                return OpenResponse.Ok(DataExchangeDeReponse.Success(tempData.OrderNo, tempData.Password, "您已成功提交数据!"));
+
             //转换数据
             var dto = _mapper.Map<DsCityDataReceive>(cityDataReceiveDto);
             //添加数据
@@ -95,10 +98,12 @@ namespace Hotline.Api.Controllers.DataSharing
                 };
                 //调用工单创建接口
                 var result = await _mediator.Send(new ReceiveOrderNotify { AddOrderDto = data }, HttpContext.RequestAborted);
-                if (result!=null&&!string.IsNullOrEmpty(result.Id))
+                if (result != null && !string.IsNullOrEmpty(result.Id))
                 {
                     dto.Id = id;
                     dto.OrderId = result.Id;
+                    dto.OrderNo = result.No;
+                    dto.Password = result.Password;
                     await _cityDataReceiveRepository.UpdateAsync(dto, HttpContext.RequestAborted);
                     return OpenResponse.Ok(DataExchangeDeReponse.Success(result.No, result.Password, "您已成功提交数据!"));
                 }

+ 177 - 19
src/Hotline.Api/Controllers/DataSharing/ProvinceController.cs

@@ -1,5 +1,7 @@
 using DotNetCore.CAP;
 using Fw.Utility.UnifyResponse;
+using Hotline.DataSharing;
+using Hotline.DataSharing.Province;
 using Hotline.DataSharing.Province.Extend;
 using Hotline.DataSharing.Province.Notifications;
 using Hotline.DataSharing.Province.XieTong.Receive;
@@ -14,6 +16,8 @@ using MapsterMapper;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
+using System.Net;
+using System.Text.Json.Serialization;
 using XF.Domain.Filters;
 using XF.Domain.Repository;
 
@@ -54,6 +58,8 @@ namespace Hotline.Api.Controllers.DataSharing
         private readonly IRepository<DsGetCaseMaterialInfo> _getCaseMaterialInfoRepository;
         private readonly IRepository<DsSendCaseInfo> _sendCaseInfoRepository;
         private readonly IRepository<DsGetCaseBackApply> _getCaseBackApplyRepository;
+        private readonly IChannelConfigurationManager _channelConfigurationManager;
+        private readonly IHttpClientFactory _httpClientFactory;
 
 
         /// <summary>
@@ -61,6 +67,7 @@ namespace Hotline.Api.Controllers.DataSharing
         /// </summary>
         /// <param name="mapper"></param>
         /// <param name="capPublisher"></param>
+        /// <param name="mediator"></param>
         /// <param name="receiveCaseInfoRepository"></param>
         /// <param name="getCaseBackResultRepository"></param>
         /// <param name="delayCaseResultRepository"></param>
@@ -87,6 +94,7 @@ namespace Hotline.Api.Controllers.DataSharing
         /// <param name="getCaseMaterialInfoRepository"></param>
         /// <param name="sendCaseInfoRepository"></param>
         /// <param name="getCaseBackApplyRepository"></param>
+        /// <param name="channelConfigurationManager"></param>
         public ProvinceController(IMapper mapper,
           ICapPublisher capPublisher,
            IMediator mediator,
@@ -115,7 +123,9 @@ namespace Hotline.Api.Controllers.DataSharing
           IRepository<DsReceiveCaseExtends> receiveCaseExtendsRepository,
           IRepository<DsGetCaseMaterialInfo> getCaseMaterialInfoRepository,
           IRepository<DsSendCaseInfo> sendCaseInfoRepository,
-          IRepository<DsGetCaseBackApply> getCaseBackApplyRepository)
+          IRepository<DsGetCaseBackApply> getCaseBackApplyRepository,
+          IChannelConfigurationManager channelConfigurationManager,
+          IHttpClientFactory httpClientFactory)
         {
             _mapper = mapper;
             _capPublisher = capPublisher;
@@ -146,6 +156,8 @@ namespace Hotline.Api.Controllers.DataSharing
             _getCaseMaterialInfoRepository = getCaseMaterialInfoRepository;
             _sendCaseInfoRepository = sendCaseInfoRepository;
             _getCaseBackApplyRepository = getCaseBackApplyRepository;
+            _channelConfigurationManager = channelConfigurationManager;
+            _httpClientFactory = httpClientFactory;
         }
         #endregion
 
@@ -277,7 +289,7 @@ namespace Hotline.Api.Controllers.DataSharing
             //转换数据
             var dto = _mapper.Map<DsGetCaseBackResult>(receiveBackResult.paras);
 
-            var data = await _getCaseBackApplyRepository.GetAsync(p => p.CaseSerial == dto.CaseSerial);
+            var data = await _getCaseBackApplyRepository.GetAsync(p => p.CaseSerial == dto.CaseSerial, HttpContext.RequestAborted);
             if (data == null)
                 return OpenResponse.Ok(Reponse.Failed("接口调用失败!"));
 
@@ -294,7 +306,7 @@ namespace Hotline.Api.Controllers.DataSharing
                         Reason = dto.BackReason,
                         Result = dto.Result == true ? 1 : 0
                     }
-                });
+                }, HttpContext.RequestAborted);
                 return OpenResponse.Ok(Reponse.Success("您已成功提交数据!"));
             }
             else
@@ -327,7 +339,7 @@ namespace Hotline.Api.Controllers.DataSharing
             if (!string.IsNullOrEmpty(id))
             {
                 //向业务系统推送消息
-                await _mediator.Send(new ProvinceOrderSuperviseNotify { ProvinceOrderSuperviseDto = _mapper.Map<ProvinceOrderSuperviseDto>(dto) });
+                await _mediator.Send(new ProvinceOrderSuperviseNotify { ProvinceOrderSuperviseDto = _mapper.Map<ProvinceOrderSuperviseDto>(dto) }, HttpContext.RequestAborted);
                 return OpenResponse.Ok(Reponse.Success("您已成功提交数据!"));
 
             }
@@ -361,7 +373,7 @@ namespace Hotline.Api.Controllers.DataSharing
             if (!string.IsNullOrEmpty(id))
             {
                 //向业务系统推送消息
-                await _mediator.Send(new ProvinceOrderUrgeNotify { ProvinceOrderUrgeDto = _mapper.Map<ProvinceOrderUrgeDto>(dto) });
+                await _mediator.Send(new ProvinceOrderUrgeNotify { ProvinceOrderUrgeDto = _mapper.Map<ProvinceOrderUrgeDto>(dto) }, HttpContext.RequestAborted);
 
                 return OpenResponse.Ok(Reponse.Success("您已成功提交数据!"));
             }
@@ -394,7 +406,7 @@ namespace Hotline.Api.Controllers.DataSharing
 
             if (!string.IsNullOrEmpty(id))
             {
-                await _mediator.Publish(new ScreenProvinceResultNotify { ProvinceScreenResult = _mapper.Map<ProvinceScreenResult>(dto) }, HttpContext.RequestAborted);
+                await _mediator.Send(new ScreenProvinceResultNotify { ProvinceScreenResult = _mapper.Map<ProvinceScreenResult>(dto) }, HttpContext.RequestAborted);
 
                 return OpenResponse.Ok(Reponse.Success("您已成功提交数据!"));
             }
@@ -783,7 +795,7 @@ namespace Hotline.Api.Controllers.DataSharing
             if (!string.IsNullOrEmpty(id))
             {
                 //向业务系统推送消息
-                await _mediator.Send(new ReceiveOrderExtensionNotify { OrderExtensionDto = orderExtension });
+                await _mediator.Send(new ReceiveOrderExtensionNotify { OrderExtensionDto = orderExtension }, HttpContext.RequestAborted);
 
                 return OpenResponse.Ok(Reponse.Success("您已成功提交数据!"));
 
@@ -803,6 +815,7 @@ namespace Hotline.Api.Controllers.DataSharing
         [AllowAnonymous]
         public async Task<OpenResponse> GetCaseMaterialInfo(string @params, List<IFormFile> files)
         {
+            var request = Request;
             // 上传文件为必须
             if (files is null || files.Count <= 0)
             {
@@ -827,14 +840,8 @@ namespace Hotline.Api.Controllers.DataSharing
             // 文件列表
             foreach (var file in files)
             {
-                // 文件内容字节数据
-                using var memoryStream = new MemoryStream();
-                await file.CopyToAsync(memoryStream);
-                memoryStream.Seek(0, SeekOrigin.Begin);
-                byte[] fileContentBytes = memoryStream.ToArray();
-
                 //这里需要上文件服务器上传
-                var Additions = await SendFileData(fileContentBytes);
+                var businessFileDto = await SendFileData(file);
 
                 // 新增文件到列表
                 var materialInfo = new DsGetCaseMaterialInfo()
@@ -845,7 +852,8 @@ namespace Hotline.Api.Controllers.DataSharing
                     AreaCode = tmpCaseMaterialInfo.AreaCode,
                     FileName = file.FileName,
                     FileSize = file.Length,
-                    Additions = Additions,
+                    Additions = businessFileDto.path,
+                    FileId = businessFileDto.id,
                     Direction = "2",
                     SyncState = "1"
                 };
@@ -857,16 +865,166 @@ namespace Hotline.Api.Controllers.DataSharing
             return OpenResponse.Ok(Reponse.Success("您已成功提交数据!"));
         }
 
-        //还需要将附件上传到业务服务器
+        /// <summary>
+        /// 服务工单材料接口--测试
+        /// </summary>
+        /// <param name="params">工单材料信息</param>
+        /// <param name="files">材料文件</param>
+        /// <returns></returns>
+        [HttpPost]
+        [Route("get_case_material_info_test")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetCaseMaterialInfotest()
+        {
+            var businessFile = _channelConfigurationManager.GetConfigurationBusinessFile();
+
+            string result = "";
+            byte[] fileContentBytes = null;
+            try
+            {
+                string url = string.Format("{0}{1}?Source={2}&Id={3}", businessFile.BaseUrl, businessFile.DownloadUrlAddress, businessFile.Source, "08dbf49c-85cd-414b-8f1d-c16a811ed96e");
+                using (var client = _httpClientFactory.CreateClient())
+                using (var response = await client.GetAsync(url))
+                {
+                    if (response.StatusCode == HttpStatusCode.OK)
+                    {
+                        using var memoryStream = new MemoryStream();
+                        //await file.CopyToAsync(memoryStream);
+                        //memoryStream.Seek(0, SeekOrigin.Begin);
+                        //byte[] fileContentBytes = memoryStream.ToArray();
+
+                        await response.Content.CopyToAsync(memoryStream);
+                        memoryStream.Seek(0, SeekOrigin.Begin);
+                        fileContentBytes = memoryStream.ToArray();
+                    }
+                }
+            }
+            catch (Exception)
+            { }
+
+            GetCaseMaterialInfoModel dto = new GetCaseMaterialInfoModel()
+            {
+                CaseSerial = "1111111111",
+                MaterialType = "10",
+                CliengGuid = "1122222",
+                AreaCode = "510000"
+            };
+
+            //组装请求参数
+            var model = new GetCaseMaterialInfoRequest
+            {
+                paras = dto,
+                token = new ClientInfo("11111", "22222")
+            };
+
+
+            Dictionary<string, object> dicParam = new Dictionary<string, object>();
+            //{
+            //    { "params", "111111" } // 第一个接口参数,json格式字符串
+            //};
+
+            // 文件内容
+            //    byte[] file = Convert.FromBase64String(result);//这里需要获取附件的流
+
+            // 构造字典文件数据
+            // 接口参数名称为files
+            CFormUpload.FileParameter fileParameter = new CFormUpload.FileParameter("files", fileContentBytes, "测试", null);
+            dicParam.Add("测试", fileParameter);
+            dicParam.Add("params", System.Text.Json.JsonSerializer.Serialize(model));
+            string strUrl = "http://localhost:7051/api/receive/get_case_material_info";
+            // 上传附件
+            string strResult = CFormUpload.MultipartFormDataPost(strUrl, null, dicParam, "");
+
+            var responseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ProvinceResponse>(strResult);
+            if (responseData != null && responseData.ReturnInfo != null)
+            {
+
+            }
+
+
+
+
+
+
+            //Dictionary<string, object> dic = new Dictionary<string, object>();
+            //dic.Add("MATERIAL_SERIAL", "1234567890");          //服务工单编号
+            //dic.Add("MATERIAL_TYPE", "1");              //材料类型
+            //dic.Add("CLIENG_GUID", Guid.NewGuid().ToString());                  //材料标识
+            //dic.Add("AREA_CODE", "510000");                      //行政区划代码
+
+            //string strParam = e_DicConvertToJson(dic, true);
+
+            //Dictionary<string, object> dicParam = new Dictionary<string, object>();
+            //// 第一个接口参数,json格式字符串
+            //dicParam.Add("params", strParam);
+            //// 文件名称
+            //string fileName = "测试一个附件上传.txt";
+            //foreach (var file in files)
+            //{
+            //    // 文件内容字节数据
+            //    using var memoryStream = new MemoryStream();
+            //    await file.CopyToAsync(memoryStream);
+            //    memoryStream.Seek(0, SeekOrigin.Begin);
+            //    byte[] fileContentBytes = memoryStream.ToArray();
+
+            //    // 构造字典文件数据
+            //    // 接口参数名称为files
+            //    CFormUpload.FileParameter fileParameter = new CFormUpload.FileParameter("files", fileContentBytes, fileName, null);
+            //    dicParam.Add(fileName, fileParameter);
+            //    var a = CFormUpload.MultipartFormDataPost("http://localhost:50100/api/v1/Province/get_case_material_info", null, dicParam, null);
+            //}
+            return OpenResponse.Ok(Reponse.Failed("成功"));
+        }
+
+
 
         /// <summary>
         /// 将文件流上传到附件服务器
         /// </summary>
-        /// <param name="fileContentBytes"></param>
+        /// <param name="file"></param>
         /// <returns></returns>
-        private async Task<string> SendFileData(byte[] fileContentBytes)
+        private async Task<BusinessFileDto> SendFileData(IFormFile file)
         {
-            return "";
+            var businessFile = _channelConfigurationManager.GetConfigurationBusinessFile();
+            // 文件名称
+            string fileName = file.FileName;
+
+            // 文件内容字节数据
+            using var memoryStream = new MemoryStream();
+            await file.CopyToAsync(memoryStream);
+            memoryStream.Seek(0, SeekOrigin.Begin);
+            byte[] fileContentBytes = memoryStream.ToArray();
+
+            // 构造字典文件数据
+            // 接口参数名称为files
+            CFormUpload.FileParameter fileParameter = new CFormUpload.FileParameter("fileData", fileContentBytes, fileName, "multipart/form-data");
+
+            Dictionary<string, object> dicParam = new()
+            {
+                { fileName, fileParameter }
+            };
+            string url = string.Format("{0}{1}?source={2}", businessFile.BaseUrl, businessFile.UploadUrlAddress, businessFile.Source);
+            var result = CFormUpload.MultipartFormDataPost(url, null, dicParam, "");
+            if (!string.IsNullOrEmpty(result))
+            {
+                var resultData = Newtonsoft.Json.JsonConvert.DeserializeObject<BusinessFileResponse>(result);
+                if (resultData != null && resultData.code == 0)
+                {
+                    return resultData.result;
+                }
+            }
+            return new BusinessFileDto();
+
         }
     }
+
+
+    public class test
+    {
+
+        [JsonPropertyName("params")]
+        public string Params { get; set; }
+
+        public List<IFormFile> files { get; set; }
+    }
 }

+ 3 - 2
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -157,8 +157,9 @@ namespace Hotline.Api.Controllers
         [HttpPost("receivecallrecord")]
         public async Task<OpenResponse> ReceiveCallRecord([FromQuery]ReceiveCallRecordDto dto)
         {
-            var result = JsonSerializer.Serialize(dto);
-            _logger.LogInformation($"收到通话记录:{ result }");
+            _logger.LogInformation($"收到通话记录:{ Request.QueryString }");
+            //var result = JsonSerializer.Serialize(dto);
+            //_logger.LogInformation($"收到通话记录:{ result }");
             var model = _mapper.Map<TrCallRecord>(dto);
             await _trCallRecordRepository.AddAsync(model, HttpContext.RequestAborted);
             return OpenResponse.Ok("success");

+ 28 - 20
src/Hotline.Api/Controllers/OrderController.cs

@@ -240,7 +240,11 @@ public class OrderController : BaseController
         orderVisit.VisitState = EVisitState.WaitForVisit;
         orderVisit.PublishTime = DateTime.Now;
         orderVisit.IsCanHandle = true;
-        string visitId = await _orderVisitRepository.AddAsync(orderVisit);
+        if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null })
+        {
+            orderVisit.VisitState = EVisitState.Visited;
+		}
+		string visitId = await _orderVisitRepository.AddAsync(orderVisit);
 
         //新增回访信息
         var visitedDetail = new List<OrderVisitDetail>();
@@ -248,26 +252,30 @@ public class OrderController : BaseController
         var seatDetail = new OrderVisitDetail();
         seatDetail.VisitId = visitId;
         seatDetail.VisitTarget = EVisitTarget.Seat;
-        if (order.ProcessType == EProcessType.Zhiban && order.CounterSignType is null)
-        {
-	        seatDetail.VoiceEvaluate = EVoiceEvaluate.Satisfied;
-	        seatDetail.SeatEvaluate = ESeatEvaluate.Satisfied;
-	        order.Visited("1", "满意");
-	        await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
-			visitedDetail.Add(seatDetail);
+		foreach (var item in dto.IdNames)
+		{
+			var orgDetail = new OrderVisitDetail();
+			orgDetail.VisitId = visitId;
+			orgDetail.VisitOrgCode = item.Key;
+			orgDetail.VisitOrgName = item.Value;
+			orgDetail.VisitTarget = EVisitTarget.Org;
+            if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null }) {
+	            var satisfy = new Kv() { Key = "4", Value = "满意" };
+	            orgDetail.OrgProcessingResults = satisfy;
+	            orgDetail.OrgHandledAttitude = satisfy;
+			}
+			visitedDetail.Add(orgDetail);
 		}
-		else{
-            foreach (var item in dto.IdNames)
-            {
-                var orgDetail = new OrderVisitDetail();
-                orgDetail.VisitId = visitId;
-                orgDetail.VisitOrgCode = item.Key;      
-                orgDetail.VisitOrgName = item.Value;
-                orgDetail.VisitTarget = EVisitTarget.Org;
-				visitedDetail.Add(orgDetail);
-            }
-        }
-        await _orderVisitedDetailRepository.AddRangeAsync(visitedDetail, HttpContext.RequestAborted);
+		if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null })
+		{
+			seatDetail.VoiceEvaluate = EVoiceEvaluate.Satisfied;
+			seatDetail.SeatEvaluate = ESeatEvaluate.Satisfied;
+			order.Visited("4", "满意");
+			order.Status = EOrderStatus.Visited;
+			await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
+		}
+		visitedDetail.Add(seatDetail);
+		await _orderVisitedDetailRepository.AddRangeAsync(visitedDetail, HttpContext.RequestAborted);
 		await _mediator.Publish(new AddVisitNotify{ OrderVisitedDetails =  visitedDetail }, HttpContext.RequestAborted);
 
         //TODO 中国政府网

+ 65 - 57
src/Hotline.Api/config/appsettings.Development.json

@@ -129,68 +129,76 @@
     "CityCode": {
       "AreaCode": "511500"
     },
-    //110对接
-    "PoliceDS": {
-      //1、非警情分流推送服务_宜宾市
-      //   receive-工单受理
-      //   http://10.12.185.168:8001/service/api/ds/110To12345/chainAlarm
-      "token1_token": "b8aae0a998f5b79c9a35aecb888e1a58",
-      "token1_dcsm": "c9bc4e718d1917a9a68add90fecbe5bb60920e5ab85d9ecb6a6167db4352f42b8ae21ac67a6e2aab48b4c99cd9f93ec5fb017e202df969a91f74456c14e8770a",
-      "token1_sm2_public": "BS/H9JVlRdo8vbsZYQLTkeGGZBVjdkX+VJ82CX7n6i4NubmynRIaxvzoSsEAhbbvTDGm2DS96l95nK6Dkd0UZg==",
-      "token1_sm2_private": "GbjU4GFk0yaa/wTdzxeh5BOh8VNlqvnTcb7EUtDVvOY=",
-      "token1_sm4": "BKrW/v4jeRgsFg3HSbxEKnDi6rPceW0AdRiaa1rhEwAnraf8MnHdXzUQoQ7+zyjfghaK5G+zDz+wW+Ob27Jgxt91HkVmyL6+SjqV9ZnqNeGFgTBkQrHDySGz6jHKa12Sv7PZs8pjc716he3NNHZAkCI=",
-      "token1_sm4_mw": "4034d80c19bbd01d",
+    //业务系统附件上传配置
+    "BusinessFile": {
+      "BaseUrl": "http://open.fs.12345lm.cn/",
+      "UploadUrlAddress": "file/upload",
+      "DownloadUrlAddress": "file/downloadfile",
+      "Source": "数据共享系统"
+    },
+
+      //110对接
+      "PoliceDS": {
+        //1、非警情分流推送服务_宜宾市
+        //   receive-工单受理
+        //   http://10.12.185.168:8001/service/api/ds/110To12345/chainAlarm
+        "token1_token": "b8aae0a998f5b79c9a35aecb888e1a58",
+        "token1_dcsm": "c9bc4e718d1917a9a68add90fecbe5bb60920e5ab85d9ecb6a6167db4352f42b8ae21ac67a6e2aab48b4c99cd9f93ec5fb017e202df969a91f74456c14e8770a",
+        "token1_sm2_public": "BS/H9JVlRdo8vbsZYQLTkeGGZBVjdkX+VJ82CX7n6i4NubmynRIaxvzoSsEAhbbvTDGm2DS96l95nK6Dkd0UZg==",
+        "token1_sm2_private": "GbjU4GFk0yaa/wTdzxeh5BOh8VNlqvnTcb7EUtDVvOY=",
+        "token1_sm4": "BKrW/v4jeRgsFg3HSbxEKnDi6rPceW0AdRiaa1rhEwAnraf8MnHdXzUQoQ7+zyjfghaK5G+zDz+wW+Ob27Jgxt91HkVmyL6+SjqV9ZnqNeGFgTBkQrHDySGz6jHKa12Sv7PZs8pjc716he3NNHZAkCI=",
+        "token1_sm4_mw": "4034d80c19bbd01d",
 
-      //4、警务警情分流推送服务_宜宾市
-      //   receive-工单办结
-      //   http://10.12.185.168:8001/service/api/ds/110To12345/chainDeal
-      "token4_token": "8806bfba29b997853bdb059a9ba9a3ae",
-      "token4_dcsm": "f5dce079e0f4acd6b6627b89fb5e72af5fa5775d3ee3b8c7876f546c5ebe723888df4a70c09f9aa5e096bb342d73e0c4793c851a7a8035e8683b07430f132bd3",
-      "token4_sm2_public": "P2IVWpFx38GQTDV3hgrxjlOdfPhLQNW2LyvAKmYqMz9UYHCtm/l3K73UIouMXs4jcmZjXyItepvKFv44g3YnXA==",
-      "token4_sm2_private": "yxIkRALHoOTxpiZ/jrvCDQatcR7k11Xhps7c92peU9w=",
-      "token4_sm4": "BCD88AXnIfMxe8PrUcubSbFRr07cOuDDEPzy754W3CzhOqjcpAcu1B9B6U46jyM4hEFPqkx+SS1PUAfRlG5tzYD1Z8SKsJTBUDGR6bTMRvCc+C/aps+IcRBfzjjRchtT1c5iok4CfiT4LoK5cmOHKKU=",
-      "token4_sm4_mw": "d731ff1282dda792",
+        //4、警务警情分流推送服务_宜宾市
+        //   receive-工单办结
+        //   http://10.12.185.168:8001/service/api/ds/110To12345/chainDeal
+        "token4_token": "8806bfba29b997853bdb059a9ba9a3ae",
+        "token4_dcsm": "f5dce079e0f4acd6b6627b89fb5e72af5fa5775d3ee3b8c7876f546c5ebe723888df4a70c09f9aa5e096bb342d73e0c4793c851a7a8035e8683b07430f132bd3",
+        "token4_sm2_public": "P2IVWpFx38GQTDV3hgrxjlOdfPhLQNW2LyvAKmYqMz9UYHCtm/l3K73UIouMXs4jcmZjXyItepvKFv44g3YnXA==",
+        "token4_sm2_private": "yxIkRALHoOTxpiZ/jrvCDQatcR7k11Xhps7c92peU9w=",
+        "token4_sm4": "BCD88AXnIfMxe8PrUcubSbFRr07cOuDDEPzy754W3CzhOqjcpAcu1B9B6U46jyM4hEFPqkx+SS1PUAfRlG5tzYD1Z8SKsJTBUDGR6bTMRvCc+C/aps+IcRBfzjjRchtT1c5iok4CfiT4LoK5cmOHKKU=",
+        "token4_sm4_mw": "d731ff1282dda792",
 
-      //3、警务警情分流查询服务_宜宾市
-      //   send-工单受理
-      //   http://10.12.185.168:8001/service/api/ds/12345To110/chainAlarm
-      "token3_token": "b76ba1896c4880998a86b829cf79888a",
-      "token3_dcsm": "3cccc86e021c0ff7827537053ec1b6e4a57cbb49b77c9492257123703c5a6b711000f0842c035fe6d33eb2a947915af53a1ef501916ec7128bff9514d6184e2c",
-      "token3_sm2_public": "qaao4Xh8/eyYGeVOj1K8D7p3+OriP55azWDAbYVoZelMdluNrJuQWM2qPn+hjTHTBnIMAVK2HlHBx4oGfCxGdA==",
-      "token3_sm2_private": "8bSYM8P3b4I94qGt3XVx3bQddNCy/xVKo7o1b5LI4/M=",
-      "token3_sm4": "BIDhFaEu5NILR7byg/JfaPlJEm4dYWC+u9J1IqhtYeYY1AktOxp7cZWqfk/mWjw72pYGT7YRENCULbjZ2bxVG6UUv2pYukZWtYog34Vicu5IgC8ti4VpED9eGzGgtKJ/CT0KtAnjQPQL0PsVbCjTY5M=",
-      "token3_sm4_mw": "bbeb56d247354360",
+        //3、警务警情分流查询服务_宜宾市
+        //   send-工单受理
+        //   http://10.12.185.168:8001/service/api/ds/12345To110/chainAlarm
+        "token3_token": "b76ba1896c4880998a86b829cf79888a",
+        "token3_dcsm": "3cccc86e021c0ff7827537053ec1b6e4a57cbb49b77c9492257123703c5a6b711000f0842c035fe6d33eb2a947915af53a1ef501916ec7128bff9514d6184e2c",
+        "token3_sm2_public": "qaao4Xh8/eyYGeVOj1K8D7p3+OriP55azWDAbYVoZelMdluNrJuQWM2qPn+hjTHTBnIMAVK2HlHBx4oGfCxGdA==",
+        "token3_sm2_private": "8bSYM8P3b4I94qGt3XVx3bQddNCy/xVKo7o1b5LI4/M=",
+        "token3_sm4": "BIDhFaEu5NILR7byg/JfaPlJEm4dYWC+u9J1IqhtYeYY1AktOxp7cZWqfk/mWjw72pYGT7YRENCULbjZ2bxVG6UUv2pYukZWtYog34Vicu5IgC8ti4VpED9eGzGgtKJ/CT0KtAnjQPQL0PsVbCjTY5M=",
+        "token3_sm4_mw": "bbeb56d247354360",
 
-      //2、非警情分流查询服务_宜宾市
-      //   send-工单办结
-      //   http://10.12.185.168:8001/service/api/ds/12345To110/chainDeal
-      "token2_token": "1fbbac1b09b89d11bc569168aabb3c8b",
-      "token2_dcsm": "3873c1b1ff0ce3b8120d63509d3b85169cda4856b0a0d89625a4744641a343951d8ced868bd5c7fc60826403bd6314a02e5a26ba8808dae5a9d9f851555338d0",
-      "token2_sm2_public": "VgjJ7FfA23vY3Hr1pVrdbi3MZt7X0k/nMf9kwEyyC32CXgT2ccWBlxf3kGPXLO56HSBoo9IA7sSEG3eJYVQmLw==",
-      "token2_sm2_private": "QNTPy2nPBe2JY308G0LHO4r42iomDWcdedf81FapkWA=",
-      "token2_sm4": "BKNpLwBCT2MvXwhLRcZ6FoMm4GaXs6LXqVmEa5hMJ3d9G+vC/5j7xtQh9HRKIfSfXkDQI0EQS7UR4inEXks/AnKsLYGhmhRjyzM7AGpEsujr2vJTwcwIWpBmpuc7k0uBQ34bN+kopafIo5UVyk7rIek=",
-      "token2_sm4_mw": "2938d7acb2754a09",
+        //2、非警情分流查询服务_宜宾市
+        //   send-工单办结
+        //   http://10.12.185.168:8001/service/api/ds/12345To110/chainDeal
+        "token2_token": "1fbbac1b09b89d11bc569168aabb3c8b",
+        "token2_dcsm": "3873c1b1ff0ce3b8120d63509d3b85169cda4856b0a0d89625a4744641a343951d8ced868bd5c7fc60826403bd6314a02e5a26ba8808dae5a9d9f851555338d0",
+        "token2_sm2_public": "VgjJ7FfA23vY3Hr1pVrdbi3MZt7X0k/nMf9kwEyyC32CXgT2ccWBlxf3kGPXLO56HSBoo9IA7sSEG3eJYVQmLw==",
+        "token2_sm2_private": "QNTPy2nPBe2JY308G0LHO4r42iomDWcdedf81FapkWA=",
+        "token2_sm4": "BKNpLwBCT2MvXwhLRcZ6FoMm4GaXs6LXqVmEa5hMJ3d9G+vC/5j7xtQh9HRKIfSfXkDQI0EQS7UR4inEXks/AnKsLYGhmhRjyzM7AGpEsujr2vJTwcwIWpBmpuc7k0uBQ34bN+kopafIo5UVyk7rIek=",
+        "token2_sm4_mw": "2938d7acb2754a09",
 
-      //5、从公安网侧获取12345政务服务热线平台知识库列表
-      //   send-知识库列表
-      //   http://10.12.185.168:8001/service/api/ds/get_knowledge_info
-      "token5_token": "1fbbac1b09b89d11bc569168aabb3c8b",
-      "token5_dcsm": "3873c1b1ff0ce3b8120d63509d3b85169cda4856b0a0d89625a4744641a343951d8ced868bd5c7fc60826403bd6314a02e5a26ba8808dae5a9d9f851555338d0",
-      "token5_sm2_public": "VgjJ7FfA23vY3Hr1pVrdbi3MZt7X0k/nMf9kwEyyC32CXgT2ccWBlxf3kGPXLO56HSBoo9IA7sSEG3eJYVQmLw==",
-      "token5_sm2_private": "QNTPy2nPBe2JY308G0LHO4r42iomDWcdedf81FapkWA=",
-      "token5_sm4": "BKNpLwBCT2MvXwhLRcZ6FoMm4GaXs6LXqVmEa5hMJ3d9G+vC/5j7xtQh9HRKIfSfXkDQI0EQS7UR4inEXks/AnKsLYGhmhRjyzM7AGpEsujr2vJTwcwIWpBmpuc7k0uBQ34bN+kopafIo5UVyk7rIek=",
-      "token5_sm4_mw": "2938d7acb2754a09",
+        //5、从公安网侧获取12345政务服务热线平台知识库列表
+        //   send-知识库列表
+        //   http://10.12.185.168:8001/service/api/ds/get_knowledge_info
+        "token5_token": "1fbbac1b09b89d11bc569168aabb3c8b",
+        "token5_dcsm": "3873c1b1ff0ce3b8120d63509d3b85169cda4856b0a0d89625a4744641a343951d8ced868bd5c7fc60826403bd6314a02e5a26ba8808dae5a9d9f851555338d0",
+        "token5_sm2_public": "VgjJ7FfA23vY3Hr1pVrdbi3MZt7X0k/nMf9kwEyyC32CXgT2ccWBlxf3kGPXLO56HSBoo9IA7sSEG3eJYVQmLw==",
+        "token5_sm2_private": "QNTPy2nPBe2JY308G0LHO4r42iomDWcdedf81FapkWA=",
+        "token5_sm4": "BKNpLwBCT2MvXwhLRcZ6FoMm4GaXs6LXqVmEa5hMJ3d9G+vC/5j7xtQh9HRKIfSfXkDQI0EQS7UR4inEXks/AnKsLYGhmhRjyzM7AGpEsujr2vJTwcwIWpBmpuc7k0uBQ34bN+kopafIo5UVyk7rIek=",
+        "token5_sm4_mw": "2938d7acb2754a09",
 
-      //6、从公安网侧获取12345政务服务热线平台知识内容
-      //   send-知识库内容
-      //   http://10.12.185.168:8001/service/api/ds/get_knowledge_content
-      "token6_token": "1fbbac1b09b89d11bc569168aabb3c8b",
-      "token6_dcsm": "3873c1b1ff0ce3b8120d63509d3b85169cda4856b0a0d89625a4744641a343951d8ced868bd5c7fc60826403bd6314a02e5a26ba8808dae5a9d9f851555338d0",
-      "token6_sm2_public": "VgjJ7FfA23vY3Hr1pVrdbi3MZt7X0k/nMf9kwEyyC32CXgT2ccWBlxf3kGPXLO56HSBoo9IA7sSEG3eJYVQmLw==",
-      "token6_sm2_private": "QNTPy2nPBe2JY308G0LHO4r42iomDWcdedf81FapkWA=",
-      "token6_sm4": "BKNpLwBCT2MvXwhLRcZ6FoMm4GaXs6LXqVmEa5hMJ3d9G+vC/5j7xtQh9HRKIfSfXkDQI0EQS7UR4inEXks/AnKsLYGhmhRjyzM7AGpEsujr2vJTwcwIWpBmpuc7k0uBQ34bN+kopafIo5UVyk7rIek=",
-      "token6_sm4_mw": "2938d7acb2754a09"
+        //6、从公安网侧获取12345政务服务热线平台知识内容
+        //   send-知识库内容
+        //   http://10.12.185.168:8001/service/api/ds/get_knowledge_content
+        "token6_token": "1fbbac1b09b89d11bc569168aabb3c8b",
+        "token6_dcsm": "3873c1b1ff0ce3b8120d63509d3b85169cda4856b0a0d89625a4744641a343951d8ced868bd5c7fc60826403bd6314a02e5a26ba8808dae5a9d9f851555338d0",
+        "token6_sm2_public": "VgjJ7FfA23vY3Hr1pVrdbi3MZt7X0k/nMf9kwEyyC32CXgT2ccWBlxf3kGPXLO56HSBoo9IA7sSEG3eJYVQmLw==",
+        "token6_sm2_private": "QNTPy2nPBe2JY308G0LHO4r42iomDWcdedf81FapkWA=",
+        "token6_sm4": "BKNpLwBCT2MvXwhLRcZ6FoMm4GaXs6LXqVmEa5hMJ3d9G+vC/5j7xtQh9HRKIfSfXkDQI0EQS7UR4inEXks/AnKsLYGhmhRjyzM7AGpEsujr2vJTwcwIWpBmpuc7k0uBQ34bN+kopafIo5UVyk7rIek=",
+        "token6_sm4_mw": "2938d7acb2754a09"
+      }
     }
-  }
 
 }

+ 154 - 0
src/Hotline.Application/DataSharing/Province/PushDataBgService.cs

@@ -1,12 +1,16 @@
 //using Hotline.DataSharing.Province.HuiJu.Send;
 //using Hotline.DataSharing.Province.Other;
 //using Hotline.DataSharing.Province.Services;
+//using Hotline.DataSharing.Province.XieTong.Knowledge;
 //using Hotline.DataSharing.Province.XieTong.Receive;
 //using Hotline.DataSharing.Province.XieTong.Send;
 //using MediatR;
+//using Microsoft.AspNetCore.Http;
 //using Microsoft.Extensions.DependencyInjection;
 //using Microsoft.Extensions.Hosting;
+//using System.Threading;
 //using XF.Domain.Repository;
+//using static System.Runtime.InteropServices.JavaScript.JSType;
 
 //namespace Hotline.Application.DataSharing.Province
 //{
@@ -48,6 +52,7 @@
 //                //查询待推送数据
 //                var listData = await _waitingPushDataRepository
 //                .Queryable()
+//                .Take(30)
 //                .OrderByDescending(p => p.Priority)
 //                       .ToListAsync();
 //                var isContinue = true;
@@ -57,12 +62,88 @@
 //                    List<DsSubmitCaseResult> submitCaseResults = new(); //服务工单处理结果
 //                    List<DsSubmitVisitInfo> submitVisitInfos = new(); //服务工单回访评价
 //                    List<DsGetCaseMaterialInfo> getCaseMaterialInfos = new();//附件上传处理
+//                    DsGetCaseBackApply dsGetCaseBackApply = null;//退回申请
+//                    DsSendSuperviseProcessInfo dsSendSuperviseProcessInfo = null;//服务工单督办过程
+//                    DsSendSuperviseResultInfo dsSendSuperviseResultInfo = null;//服务工单督办结果
+//                    DsScreenCaseInfoSend dsScreenCaseInfoSend = null;//工单发起甄别
+//                    DsDelayCaseInfoSend dsDelayCaseInfoSend = null;//服务工单申请延时
+//                    DsZmhdCaseInfoPublic dsZmhdCaseInfoPublic = null;//政民互动提交公开
+//                    List<DsSubmitCaseInfo> dsSubmitCaseInfos = new();//服务工单受理推送工单--批量
 
+//                    DsGetCaseProcessReceive dsGetCaseProcessReceive = null;//服务工单交办处理过程
+//                    DsGetVisitInfoReceive dsGetVisitInfoReceive = null;//服务工单交办评价
+//                    List<DsSubmitCaseRecord> dsSubmitCaseRecords = new();//挂电话推送--批量推送
+//                    DsSubmitCaseTotal dsSubmitCaseTotal = null;//统计数据
+//                    DsSupplyCaseInfoSend dsSupplyCaseInfoSend = null;//上报补充诉求
+//                    DsRevokeCaseInfo dsRevokeCaseInfo = null;//服务工单撤单
+//                    DsRemindCaseInfo dsRemindCaseInfo = null;//服务工单催单
+//                    DsGetKnowledgeInfoSend dsGetKnowledgeInfoSend = null;//知识库上报
+//                    DsGetKnowledgeInfoUpdate dsGetKnowledgeInfoUpdate = null;//知识库变更
+//                    DsGetKnowledgeInfoAbandon dsGetKnowledgeInfoAbandon = null;//知识库下架
+//                    DsSendRealTimeStatus dsSendRealTimeStatus = null;//实时服务上报
 //                    //根据查询出来数据组装推送数据
 //                    foreach (var item in listData)
 //                    {
 //                        switch (item.ServiceInterface)
 //                        {
+//                            case "GetCaseBackApply"://退回申请
+//                                dsGetCaseBackApply = System.Text.Json.JsonSerializer.Deserialize<DsGetCaseBackApply>(item.Data);
+//                                break;
+//                            case "SendSuperviseProcessInfo"://服务工单督办过程
+//                                dsSendSuperviseProcessInfo = System.Text.Json.JsonSerializer.Deserialize<DsSendSuperviseProcessInfo>(item.Data);
+//                                break;
+//                            case "SendSuperviseResultInfo"://服务工单督办结果
+//                                dsSendSuperviseResultInfo = System.Text.Json.JsonSerializer.Deserialize<DsSendSuperviseResultInfo>(item.Data);
+//                                break;
+//                            case "ScreenCaseInfoSend"://工单发起甄别
+//                                dsScreenCaseInfoSend = System.Text.Json.JsonSerializer.Deserialize<DsScreenCaseInfoSend>(item.Data);
+//                                break;
+//                            case "DelayCaseInfoSend"://服务工单申请延时
+//                                dsDelayCaseInfoSend = System.Text.Json.JsonSerializer.Deserialize<DsDelayCaseInfoSend>(item.Data);
+//                                break;
+//                            case "ZmhdCaseInfoPublic"://政民互动提交公开
+//                                dsZmhdCaseInfoPublic = System.Text.Json.JsonSerializer.Deserialize<DsZmhdCaseInfoPublic>(item.Data);
+//                                break;
+//                            case "SubmitCaseInfo"://服务工单受理推送工单
+//                                var submitCaseInfo = System.Text.Json.JsonSerializer.Deserialize<DsSubmitCaseInfo>(item.Data);
+//                                if (submitCaseInfo != null) dsSubmitCaseInfos.Add(submitCaseInfo);
+//                                break;
+//                            case "GetCaseProcessReceive"://服务工单交办处理过程
+//                                dsGetCaseProcessReceive = System.Text.Json.JsonSerializer.Deserialize<DsGetCaseProcessReceive>(item.Data);
+//                                break;
+//                            case "GetVisitInfoReceive"://服务工单交办评价
+//                                dsGetVisitInfoReceive = System.Text.Json.JsonSerializer.Deserialize<DsGetVisitInfoReceive>(item.Data);
+//                                break;
+//                            case "SubmitCaseRecord"://挂电话推送--批量推送
+//                                var caseRecord = System.Text.Json.JsonSerializer.Deserialize<DsSubmitCaseRecord>(item.Data);
+//                                if (caseRecord != null) dsSubmitCaseRecords.Add(caseRecord);
+//                                break;
+//                            case "SubmitCaseTotal"://统计数据
+//                                dsSubmitCaseTotal = System.Text.Json.JsonSerializer.Deserialize<DsSubmitCaseTotal>(item.Data);
+//                                break;
+//                            case "SupplyCaseInfoSend"://上报补充诉求
+//                                dsSupplyCaseInfoSend = System.Text.Json.JsonSerializer.Deserialize<DsSupplyCaseInfoSend>(item.Data);
+//                                break;
+//                            case "SendRevokeCaseInfo"://服务工单撤单
+//                                dsRevokeCaseInfo = System.Text.Json.JsonSerializer.Deserialize<DsRevokeCaseInfo>(item.Data);
+//                                break;
+//                            case "SendRemindCaseInfo"://服务工单催单
+//                                dsRemindCaseInfo = System.Text.Json.JsonSerializer.Deserialize<DsRemindCaseInfo>(item.Data);
+//                                break;
+//                            case "GetKnowledgeInfoSend"://知识库上报
+//                                dsGetKnowledgeInfoSend = System.Text.Json.JsonSerializer.Deserialize<DsGetKnowledgeInfoSend>(item.Data);
+//                                break;
+//                            case "GetKnowledgeInfoUpdate"://知识库变更
+//                                dsGetKnowledgeInfoUpdate = System.Text.Json.JsonSerializer.Deserialize<DsGetKnowledgeInfoUpdate>(item.Data);
+//                                break;
+//                            case "GetKnowledgeInfoAbandon"://知识库下架
+//                                dsGetKnowledgeInfoAbandon = System.Text.Json.JsonSerializer.Deserialize<DsGetKnowledgeInfoAbandon>(item.Data);
+//                                break;
+//                            case "SendRealTimeStatus"://实时服务上报
+//                                dsSendRealTimeStatus = System.Text.Json.JsonSerializer.Deserialize<DsSendRealTimeStatus>(item.Data);
+//                                break;
+
+
 //                            case "SubmitCaseProcess"://服务工单处理过程
 //                                var caseProcess = System.Text.Json.JsonSerializer.Deserialize<DsSubmitCaseProcess>(item.Data);
 //                                if (caseProcess != null) submitCaseProcesses.Add(caseProcess);
@@ -85,6 +166,79 @@
 //                    }
 
 //                    //推送对应消息
+//                    //退回申请
+//                    if (dsGetCaseBackApply != null)
+//                        await _pusherProviderService.GetCaseBackApplyPusher(dsGetCaseBackApply, default);
+
+//                    //服务工单督办过程
+//                    if (dsSendSuperviseProcessInfo != null)
+//                        await _pusherProviderService.SendSuperviseProcessInfoPusher(dsSendSuperviseProcessInfo, default);
+
+//                    //服务工单督办过程
+//                    if (dsSendSuperviseResultInfo != null)
+//                        await _pusherProviderService.SendSuperviseResultInfoPusher(dsSendSuperviseResultInfo, default);
+
+//                    //工单发起甄别
+//                    if (dsScreenCaseInfoSend != null)
+//                        await _pusherProviderService.ScreenCaseInfoSendPusher(dsScreenCaseInfoSend, default);
+
+//                    //服务工单申请延时
+//                    if (dsDelayCaseInfoSend != null)
+//                        await _pusherProviderService.DelayCaseInfoSendPusher(dsDelayCaseInfoSend, default);
+
+//                    //政民互动提交公开
+//                    if (dsZmhdCaseInfoPublic != null)
+//                        await _pusherProviderService.ZmhdCaseInfoPublicPusher(dsZmhdCaseInfoPublic, default);
+
+//                    //服务工单受理推送工单
+//                    if (dsSubmitCaseInfos != null && dsSubmitCaseInfos.Count > 0)
+//                        await _pusherProviderService.ProvinceOrderCreatedPusher(dsSubmitCaseInfos, default);
+
+//                    //服务工单交办处理过程
+//                    if (dsGetCaseProcessReceive != null)
+//                        await _pusherProviderService.GetCaseProcessReceivePusher(dsGetCaseProcessReceive, default);
+
+//                    //服务工单交办评价请求
+//                    if (dsGetVisitInfoReceive != null)
+//                        await _pusherProviderService.GetVisitInfoReceivePusher(dsGetVisitInfoReceive, default);
+
+//                    //  挂电话推送--批量推送
+//                    if (dsSubmitCaseRecords != null && dsSubmitCaseRecords.Count > 0)
+//                        await _pusherProviderService.SubmitCaseRecordPusher(dsSubmitCaseRecords, default);
+
+//                    //  统计数据
+//                    if (dsSubmitCaseTotal != null)
+//                        await _pusherProviderService.SubmitCaseTotalPusher(dsSubmitCaseTotal, default);
+
+//                    //  上报补充诉求
+//                    if (dsSupplyCaseInfoSend != null)
+//                        await _pusherProviderService.SupplyCaseInfoSendPusher(dsSupplyCaseInfoSend, default);
+
+//                    //  服务工单撤单
+//                    if (dsRevokeCaseInfo != null)
+//                        await _pusherProviderService.SendRevokeCaseInfoPusher(dsRevokeCaseInfo, default);
+
+//                    //  服务工单催单
+//                    if (dsRemindCaseInfo != null)
+//                        await _pusherProviderService.SendRemindCaseInfoPusher(dsRemindCaseInfo, default);
+
+//                    //  知识库上报
+//                    if (dsGetKnowledgeInfoSend != null)
+//                        await _pusherProviderService.GetKnowledgeInfoSendPusher(dsGetKnowledgeInfoSend, default);
+
+//                    //  知识库变更
+//                    if (dsGetKnowledgeInfoUpdate != null)
+//                        await _pusherProviderService.GetKnowledgeInfoUpdatePusher(dsGetKnowledgeInfoUpdate, default);
+
+//                    //  知识库下架
+//                    if (dsGetKnowledgeInfoAbandon != null)
+//                        await _pusherProviderService.GetKnowledgeInfoAbandonPusher(dsGetKnowledgeInfoAbandon, default);
+
+//                    //  实时服务上报
+//                    if (dsSendRealTimeStatus != null)
+//                        await _pusherProviderService.SendRealTimeStatusPusher(dsSendRealTimeStatus, default);
+
+
 //                    //服务工单处理过程
 //                    if (submitCaseProcesses != null && submitCaseProcesses.Count > 0)
 //                    {

+ 1 - 1
src/Hotline.Share/Dtos/DataSharing/DataExchange/CityDataReceiveDto.cs

@@ -21,7 +21,7 @@ namespace Sharing.Share.Dtos.DataSharing.DataExchange
         /// <summary>
         /// 工单编号
         /// </summary>
-        [MDisplayName("撤单时间")]
+        [MDisplayName("工单编号")]
         [VRequired]
         public string FSHCode { get; set; }
 

+ 20 - 0
src/Hotline.Share/Dtos/DataSharing/Province/BusinessFileResponse.cs

@@ -0,0 +1,20 @@
+namespace Hotline.Share.Dtos.DataSharing.Province
+{
+    public class BusinessFileResponse
+    {
+        public BusinessFileDto result { get; set; }
+
+        public int code { get; set; }
+
+        public string message { get; set; }
+
+        public string error { get; set; }
+    }
+
+    public class BusinessFileDto
+    {
+        public string id { get; set; }
+        public string fileName { get; set; }
+        public string path { get; set; }
+    }
+}

+ 0 - 12
src/Hotline.Share/Dtos/DataSharing/Province/Extend/Class1.cs

@@ -1,12 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Hotline.Share.Dtos.DataSharing.Province.Extend
-{
-    internal class Class1
-    {
-    }
-}

+ 32 - 1
src/Hotline/DataSharing/ChannelConfiguration.cs

@@ -31,6 +31,11 @@ public class ChannelConfiguration
     /// 道枢110
     /// </summary>
     public ConfigurationPoliceDS PoliceDS { get; set; }
+
+    /// <summary>
+    /// 业务系统附件上传配置
+    /// </summary>
+    public ConfigurationBusinessFile BusinessFile { get; set; }
 }
 
 /// <summary>
@@ -69,7 +74,7 @@ public class ConfigurationEnterprise
     /// 
     /// </summary>
     public string TenantId { get; set; } = string.Empty;
-    
+
 }
 
 /// <summary>
@@ -125,6 +130,32 @@ public class ConfigurationCityCode
     public string AreaCode { get; set; } = string.Empty;
 }
 
+/// <summary>
+/// 业务系统附件上传配置
+/// </summary>
+public class ConfigurationBusinessFile
+{
+    /// <summary>
+    /// 请求地址
+    /// </summary>
+    public string BaseUrl { get; set; }
+
+    /// <summary>
+    /// 上传接口地址
+    /// </summary>
+    public string UploadUrlAddress { get; set; }
+
+    /// <summary>
+    /// 下载接口
+    /// </summary>
+    public string DownloadUrlAddress { get; set; }
+
+    /// <summary>
+    /// 来源
+    /// </summary>
+    public string Source { get; set; }
+}
+
 /// <summary>
 /// 道枢110
 /// </summary>

+ 10 - 0
src/Hotline/DataSharing/ChannelConfigurationManager.cs

@@ -72,5 +72,15 @@ namespace Hotline.DataSharing
         {
             return _channelOption.Value.PoliceDS;
         }
+
+        /// <summary>
+        /// 业务系统附件上传配置
+        /// </summary>
+        /// <returns></returns>
+        public ConfigurationBusinessFile GetConfigurationBusinessFile()
+        {
+            return _channelOption.Value.BusinessFile;
+        }
+        
     }
 }

+ 12 - 0
src/Hotline/DataSharing/DataExchange/DsCityDataReceive.cs

@@ -87,5 +87,17 @@ namespace Hotline.DataSharing.DataExchange
         /// </summary>
         [SugarColumn(ColumnDescription = "来源", ColumnDataType = "varchar(50)", IsNullable = true)]
         public string Source { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "工单编号", ColumnDataType = "varchar(50)", IsNullable = true)]
+        public string? OrderNo { get; set; }
+
+        /// <summary>
+        /// 查询密码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "查询密码", ColumnDataType = "varchar(10)", IsNullable = true)]
+        public string? Password { get; set; }
     }
 }

+ 6 - 0
src/Hotline/DataSharing/IChannelConfigurationManager.cs

@@ -37,4 +37,10 @@ public interface IChannelConfigurationManager
     /// </summary>
     /// <returns></returns>
     ConfigurationPoliceDS GetConfigurationPoliceDS();
+
+    /// <summary>
+    /// 业务系统附件上传配置
+    /// </summary>
+    /// <returns></returns>
+    ConfigurationBusinessFile GetConfigurationBusinessFile();
 }

+ 171 - 0
src/Hotline/DataSharing/Province/CFormUpload.cs

@@ -0,0 +1,171 @@
+using System.Net;
+using System.Text;
+
+
+namespace Hotline.DataSharing.Province
+{
+    /// <summary>
+    /// Post提交(包含文件提交)
+    /// </summary>
+    public class CFormUpload
+    {
+        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;
+        }
+
+        ///
+        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;
+        }
+
+        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;
+            }
+        }
+    }
+}

+ 36 - 0
src/Hotline/DataSharing/Province/Other/DsWaitingPushData.cs

@@ -45,5 +45,41 @@ namespace Hotline.DataSharing.Province.Other
         /// </summary>
         [SugarColumn(ColumnDescription = "推送方式 post、get", ColumnDataType = "varchar(10)", IsNullable = true)]
         public string Method { get; set; }
+
+        /// <summary>
+        /// 重新推送次数
+        /// </summary>
+        [SugarColumn(ColumnDescription = "重新推送次数")]
+        public int SyncCount { get; set; } = 0;
+
+        /// <summary>
+        /// 第一次工单同步省平台时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "第一次工单同步省平台时间", IsNullable = true)]
+        public DateTime? FirstSyncProvinceTime { get; set; }
+
+        /// <summary>
+        /// 最新工单同步省平台时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "最新工单同步省平台时间", IsNullable = true)]
+        public DateTime? NewSyncProvinceTime { get; set; }
+
+        /// <summary>
+        /// 同步成功时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "同步成功时间", IsNullable = true)]
+        public DateTime? SuccessSyncTime { get; set; }
+
+        /// <summary>
+        /// 接口返回结果
+        /// </summary>
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+        public string? ReturnResult { get; set; }
+
+        /// <summary>
+        /// 同步状态 0:待同步;	  1:同步成功;	 2:同步失败;
+        /// </summary>
+        [SugarColumn(ColumnDescription = "同步状态", ColumnDataType = "varchar(1)", IsNullable = true)]
+        public string SyncState { get; set; } = "0";
     }
 }

+ 3 - 3
src/Hotline/DataSharing/Province/Services/IPusherProviderService.cs

@@ -14,7 +14,7 @@ namespace Hotline.DataSharing.Province.Services
         /// <param name="submitCaseInfo"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task ProvinceOrderCreatedPusher(DsSubmitCaseInfo submitCaseInfo, CancellationToken cancellationToken);
+        Task ProvinceOrderCreatedPusher(List<DsSubmitCaseInfo> submitCaseInfo, CancellationToken cancellationToken);
 
         /// <summary>
         /// 服务工单交办评价请求
@@ -22,7 +22,7 @@ namespace Hotline.DataSharing.Province.Services
         /// <param name="dto"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task SubmitVisitInfoPusher(DsGetVisitInfoReceive data, CancellationToken cancellationToken);
+        Task GetVisitInfoReceivePusher(DsGetVisitInfoReceive data, CancellationToken cancellationToken);
 
         /// <summary>
         /// 上传通话记录
@@ -53,7 +53,7 @@ namespace Hotline.DataSharing.Province.Services
         /// <param name="dto"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task SubmitCaseProcessPusher(DsGetCaseProcessReceive dto, CancellationToken cancellationToken);
+        Task GetCaseProcessReceivePusher(DsGetCaseProcessReceive dto, CancellationToken cancellationToken);
 
         /// <summary>
         /// 退回申请请求

+ 99 - 28
src/Hotline/DataSharing/Province/Services/ProvinceService.cs

@@ -280,7 +280,10 @@ namespace Hotline.DataSharing.Province.Services
                 //将上报信息写入本地库
                 data.Id = await _getCaseBackApplyRepository.AddAsync(data, cancellationToken);
 
-                await _pusherProviderService.GetCaseBackApplyPusher(data, cancellationToken);
+                //将待推送数据写入待推送表
+                await InitPushData("GetCaseBackApply", System.Text.Json.JsonSerializer.Serialize(data), "get_case_back_apply", data.Id, 0, cancellationToken);
+
+                //   await _pusherProviderService.GetCaseBackApplyPusher(data, cancellationToken);
 
                 //处理附件
                 await FileData(new List<Hotline.Share.Dtos.File.FileDto>(), dto.Order.ProvinceNo, dto.ClientGuid, dto.Order.AreaCode, cancellationToken);
@@ -300,9 +303,11 @@ namespace Hotline.DataSharing.Province.Services
                 var data = _mapper.Map<DsSendSuperviseProcessInfo>(dto);
                 //将上报信息写入本地库
                 data.Id = await _sendSuperviseProcessInfoRepository.AddAsync(data, cancellationToken);
+                //将待推送数据写入待推送表
+                await InitPushData("SendSuperviseProcessInfo", System.Text.Json.JsonSerializer.Serialize(data), "send_supervise_process_info", data.Id, 0, cancellationToken);
 
                 //推送数据
-                _pusherProviderService.SendSuperviseProcessInfoPusher(data, cancellationToken);
+                // await _pusherProviderService.SendSuperviseProcessInfoPusher(data, cancellationToken);
             }
         }
 
@@ -321,7 +326,10 @@ namespace Hotline.DataSharing.Province.Services
                 //将上报信息写入本地库
                 data.Id = await _sendSuperviseResultInfoRepository.AddAsync(data, cancellationToken);
 
-                await _pusherProviderService.SendSuperviseResultInfoPusher(data, cancellationToken);
+                //将待推送数据写入待推送表
+                await InitPushData("SendSuperviseResultInfo", System.Text.Json.JsonSerializer.Serialize(data), "send_supervise_result_info", data.Id, 0, cancellationToken);
+
+                // await _pusherProviderService.SendSuperviseResultInfoPusher(data, cancellationToken);
             }
         }
 
@@ -346,7 +354,10 @@ namespace Hotline.DataSharing.Province.Services
                 //将上报信息写入本地库
                 data.Id = await _screenCaseInfoSendRepository.AddAsync(data, cancellationToken);
 
-                await _pusherProviderService.ScreenCaseInfoSendPusher(data, cancellationToken);
+                //将待推送数据写入待推送表
+                await InitPushData("ScreenCaseInfoSend", System.Text.Json.JsonSerializer.Serialize(data), "screen_case_info_send", data.Id, 0, cancellationToken);
+
+                //  await _pusherProviderService.ScreenCaseInfoSendPusher(data, cancellationToken);
             }
         }
 
@@ -360,11 +371,13 @@ namespace Hotline.DataSharing.Province.Services
             var data = _mapper.Map<DsDelayCaseInfoSend>(dto);
             data.AreaCode = _channelConfigurationManager.GetConfigurationCityCode().AreaCode;
             //将上报信息写入本地库
-            var id = await _delayCaseInfoSendRepository.AddAsync(data);
+            data.Id = await _delayCaseInfoSendRepository.AddAsync(data);
+
+            //将待推送数据写入待推送表
+            await InitPushData("DelayCaseInfoSend", System.Text.Json.JsonSerializer.Serialize(data), "delay_case_info_send", data.Id, 0, cancellationToken);
 
-            data.Id = id;
             //信息上报
-            await _pusherProviderService.DelayCaseInfoSendPusher(data, cancellationToken);
+            //   await _pusherProviderService.DelayCaseInfoSendPusher(data, cancellationToken);
             //处理附件
             await FileData(new List<Hotline.Share.Dtos.File.FileDto>(), dto.CaseSerial, dto.CliengGuid, dto.AreaCode, cancellationToken);
         }
@@ -381,8 +394,11 @@ namespace Hotline.DataSharing.Province.Services
             //将上报信息写入本地库
             data.Id = await _zMHDCaseInfoPublicRepository.AddAsync(data);
 
+            //将待推送数据写入待推送表
+            await InitPushData("ZmhdCaseInfoPublic", System.Text.Json.JsonSerializer.Serialize(data), "zmhd_case_info_public", data.Id, 0, cancellationToken);
+
             //信息上报
-            await _pusherProviderService.ZmhdCaseInfoPublicPusher(data, cancellationToken);
+            //  await _pusherProviderService.ZmhdCaseInfoPublicPusher(data, cancellationToken);
         }
         #endregion
 
@@ -440,8 +456,11 @@ namespace Hotline.DataSharing.Province.Services
                     await _dataOrderRepository.UpdateAsync(dataOrder, cancellationToken);
                 }
 
+                //将待推送数据写入待推送表
+                await InitPushData("SubmitCaseInfo", System.Text.Json.JsonSerializer.Serialize(submitCaseInfo), "submit_case_info", submitCaseInfo.Id, 10, cancellationToken);
+
                 //推送数据
-                await _pusherProviderService.ProvinceOrderCreatedPusher(submitCaseInfo, cancellationToken);
+                //   await _pusherProviderService.ProvinceOrderCreatedPusher(submitCaseInfo, cancellationToken);
 
                 //处理附件
                 await FileData(new List<Hotline.Share.Dtos.File.FileDto>(), submitCaseInfo.CaseSerial, submitCaseInfo.CliengGuid, submitCaseInfo.AreaCode, cancellationToken);
@@ -459,8 +478,12 @@ namespace Hotline.DataSharing.Province.Services
             if (!dto.IsProvince)
             {
                 var submitCaseInfo = await InitData(dto, cancellationToken);
+
+                //将待推送数据写入待推送表
+                await InitPushData("SubmitCaseInfo", System.Text.Json.JsonSerializer.Serialize(submitCaseInfo), "submit_case_info", submitCaseInfo.Id, 10, cancellationToken);
+
                 //推送数据
-                await _pusherProviderService.ProvinceOrderCreatedPusher(submitCaseInfo, cancellationToken);
+                //await _pusherProviderService.ProvinceOrderCreatedPusher(submitCaseInfo, cancellationToken);
             }
         }
 
@@ -492,8 +515,11 @@ namespace Hotline.DataSharing.Province.Services
                 data.TacheName = "70:" + data.DeptName;
                 //将上报信息写入本地库
                 data.Id = await _getCaseProcessReceiveRepository.AddAsync(data, cancellationToken);
+
+                await InitPushData("GetCaseProcessReceive", System.Text.Json.JsonSerializer.Serialize(data), "get_case_process_receive", data.Id, 0, cancellationToken);
+
                 //信息上报
-                await _pusherProviderService.SubmitCaseProcessPusher(data, cancellationToken);
+                await _pusherProviderService.GetCaseProcessReceivePusher(data, cancellationToken);
             }
             else  //如果不是省上派下来的工单
             {
@@ -501,8 +527,11 @@ namespace Hotline.DataSharing.Province.Services
                 if (dto.ExpiredTimeChanged)
                 {
                     var submitCaseInfo = await InitData(dto.Order, cancellationToken);
+                    //将待推送数据写入待推送表
+                    await InitPushData("SubmitCaseInfo", System.Text.Json.JsonSerializer.Serialize(submitCaseInfo), "submit_case_info", submitCaseInfo.Id, 10, cancellationToken);
+
                     //推送数据
-                    await _pusherProviderService.ProvinceOrderCreatedPusher(submitCaseInfo, cancellationToken);
+                    //  await _pusherProviderService.ProvinceOrderCreatedPusher(submitCaseInfo, cancellationToken);
                 }
 
                 //推送办理记录
@@ -553,7 +582,9 @@ namespace Hotline.DataSharing.Province.Services
             {
                 //推送工单信息
                 var submitCaseInfo = await InitData(dto.Order, cancellationToken);
-                await _pusherProviderService.ProvinceOrderCreatedPusher(submitCaseInfo, cancellationToken);
+
+                await InitPushData("SubmitCaseInfo", System.Text.Json.JsonSerializer.Serialize(submitCaseInfo), "submit_case_info", submitCaseInfo.Id, 10, cancellationToken);
+                // await _pusherProviderService.ProvinceOrderCreatedPusher(submitCaseInfo, cancellationToken);
             }
             //推送服务工单结果信息-组装110数据
             await SubmitCaseResult(dto, cancellationToken);
@@ -590,11 +621,12 @@ namespace Hotline.DataSharing.Province.Services
                 //将上报信息写入本地库
                 record.Id = await _submitCaseRecordRepository.AddAsync(record, cancellationToken);
                 if (!string.IsNullOrEmpty(record.Id))
-                    recordList.Add(record);
+                    await InitPushData("SubmitCaseRecord", System.Text.Json.JsonSerializer.Serialize(record), "submit_case_record", record.Id, 11, cancellationToken);
+                // recordList.Add(record);
             }
-            if (recordList != null && recordList.Count > 0)
-                //信息上报
-                await _pusherProviderService.SubmitCaseRecordPusher(recordList, cancellationToken);
+            //if (recordList != null && recordList.Count > 0)
+            //    //信息上报
+            //    await _pusherProviderService.SubmitCaseRecordPusher(recordList, cancellationToken);
         }
 
         /// <summary>
@@ -610,8 +642,9 @@ namespace Hotline.DataSharing.Province.Services
             //将上报信息写入本地库
             data.Id = await _submitCaseRecordRepository.AddAsync(data, cancellationToken);
 
+            await InitPushData("SubmitCaseRecord", System.Text.Json.JsonSerializer.Serialize(data), "submit_case_record", data.Id, 11, cancellationToken);
             //信息上报
-            await _pusherProviderService.SubmitCaseRecordPusher(new List<DsSubmitCaseRecord> { data }, cancellationToken);
+            // await _pusherProviderService.SubmitCaseRecordPusher(new List<DsSubmitCaseRecord> { data }, cancellationToken);
         }
 
         /// <summary>
@@ -626,8 +659,9 @@ namespace Hotline.DataSharing.Province.Services
             var id = await _submitCaseTotalRepository.AddAsync(data);
 
             data.Id = id;
+            await InitPushData("SubmitCaseTotal", System.Text.Json.JsonSerializer.Serialize(data), "submit_case_total", data.Id, 0, cancellationToken);
             //信息上报
-            await _pusherProviderService.SubmitCaseTotalPusher(data, cancellationToken);
+            //await _pusherProviderService.SubmitCaseTotalPusher(data, cancellationToken);
         }
 
 
@@ -711,8 +745,11 @@ namespace Hotline.DataSharing.Province.Services
             var id = await _supplyCaseInfoSendRepository.AddAsync(data);
 
             data.Id = id;
+
+            await InitPushData("SupplyCaseInfoSend", System.Text.Json.JsonSerializer.Serialize(data), "supply_case_info_send", data.Id, 0, cancellationToken);
+
             //信息上报
-            await _pusherProviderService.SupplyCaseInfoSendPusher(data, cancellationToken);
+            //await _pusherProviderService.SupplyCaseInfoSendPusher(data, cancellationToken);
 
             //处理附件
             await FileData(new List<Share.Dtos.File.FileDto>(), dto.CaseSerial, dto.CliengGuid, dto.AreaCode, cancellationToken);
@@ -733,7 +770,9 @@ namespace Hotline.DataSharing.Province.Services
 
             //信息上报
             //往省上派的单需要代用省上接口
-            await _pusherProviderService.SendRevokeCaseInfoPusher(data, cancellationToken);
+
+            await InitPushData("SendRevokeCaseInfo", System.Text.Json.JsonSerializer.Serialize(data), "revoke_case_info", data.Id, 0, cancellationToken);
+            // await _pusherProviderService.SendRevokeCaseInfoPusher(data, cancellationToken);
 
             //如果是派给企业服务的需要调用企业服务的接口
 
@@ -759,7 +798,8 @@ namespace Hotline.DataSharing.Province.Services
                 data.Id = await _remindCaseInfoRepository.AddAsync(data);
 
                 //信息上报
-                await _pusherProviderService.SendRemindCaseInfoPusher(data, cancellationToken);
+                await InitPushData("SendRemindCaseInfo", System.Text.Json.JsonSerializer.Serialize(data), "remind_case_info", data.Id, 0, cancellationToken);
+                //await _pusherProviderService.SendRemindCaseInfoPusher(data, cancellationToken);
 
                 //处理附件
                 await FileData(new List<Share.Dtos.File.FileDto>(), dto.Order.ProvinceNo, dto.ClientGuid, dto.Order.AreaCode, cancellationToken);
@@ -798,7 +838,8 @@ namespace Hotline.DataSharing.Province.Services
                 await _knowledgeRawDataRepository.AddAsync(raw);
 
             //信息上报
-            await _pusherProviderService.GetKnowledgeInfoSendPusher(data, cancellationToken);
+            await InitPushData("GetKnowledgeInfoSend", System.Text.Json.JsonSerializer.Serialize(data), "get_knowledge_info_send", data.Id, 0, cancellationToken);
+            // await _pusherProviderService.GetKnowledgeInfoSendPusher(data, cancellationToken);
             //知识附件处理
             await FileData(new List<Share.Dtos.File.FileDto>(), dto.UID, dto.CliengGuid, data.AreaCode, cancellationToken);
 
@@ -831,7 +872,8 @@ namespace Hotline.DataSharing.Province.Services
                 await _knowledgeRawDataRepository.AddAsync(raw);
 
             //信息上报
-            await _pusherProviderService.GetKnowledgeInfoUpdatePusher(data, cancellationToken);
+            await InitPushData("GetKnowledgeInfoUpdate", System.Text.Json.JsonSerializer.Serialize(data), "get_knowledge_info_update", data.Id, 0, cancellationToken);
+            // await _pusherProviderService.GetKnowledgeInfoUpdatePusher(data, cancellationToken);
 
             //知识附件处理
             await FileData(new List<Share.Dtos.File.FileDto>(), dto.UID, dto.CliengGuid, data.AreaCode, cancellationToken);
@@ -853,7 +895,8 @@ namespace Hotline.DataSharing.Province.Services
             await _knowledgeRawDataRepository.RemoveAsync(p => p.UID == data.UID, false);
 
             //信息上报
-            await _pusherProviderService.GetKnowledgeInfoAbandonPusher(data, cancellationToken);
+            await InitPushData("GetKnowledgeInfoAbandon", System.Text.Json.JsonSerializer.Serialize(data), "get_knowledge_info_abandon", data.Id, 0, cancellationToken);
+            //  await _pusherProviderService.GetKnowledgeInfoAbandonPusher(data, cancellationToken);
         }
         #endregion
 
@@ -870,7 +913,8 @@ namespace Hotline.DataSharing.Province.Services
             data.Id = await _sendRealTimeStatusRepository.AddAsync(data);
 
             //信息上报
-            await _pusherProviderService.SendRealTimeStatusPusher(data, cancellationToken);
+            await InitPushData("SendRealTimeStatus", System.Text.Json.JsonSerializer.Serialize(data), "sendrealtimestatus", data.Id, 0, cancellationToken);
+            // await _pusherProviderService.SendRealTimeStatusPusher(data, cancellationToken);
         }
         #endregion
 
@@ -915,7 +959,9 @@ namespace Hotline.DataSharing.Province.Services
                 data.Id = await _getVisitInfoReceiveRepository.AddAsync(data, cancellationToken);
 
                 //服务工单交办评价请求
-                await _pusherProviderService.SubmitVisitInfoPusher(data, cancellationToken);
+
+                await InitPushData("GetVisitInfoReceive", System.Text.Json.JsonSerializer.Serialize(data), "get_visit_info_receive", data.Id, 5, cancellationToken);
+                await _pusherProviderService.GetVisitInfoReceivePusher(data, cancellationToken);
 
                 //处理附件
                 await FileData(new List<Hotline.Share.Dtos.File.FileDto>(), data.CaseSerial, data.CliengGuid, data.AreaCode, cancellationToken);
@@ -1669,7 +1715,32 @@ namespace Hotline.DataSharing.Province.Services
             return pwd;
         }
 
-        #endregion 
         #endregion
+        #endregion
+
+        /// <summary>
+        /// 初始化待推送数据
+        /// </summary>
+        /// <param name="ServiceInterface"></param>
+        /// <param name="Data"></param>
+        /// <param name="PushUrl"></param>
+        /// <param name="SyncID"></param>
+        /// <param name="Priority"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task InitPushData(string ServiceInterface, string Data, string PushUrl, string SyncID, int Priority, CancellationToken cancellationToken)
+        {
+            //将待推送数据写入待推送表
+            DsWaitingPushData pushData = new()
+            {
+                ServiceInterface = ServiceInterface,
+                Data = Data,
+                Priority = Priority,
+                PushUrl = PushUrl,
+                Method = HttpMethods.Post,
+                SyncID = SyncID
+            };
+            await _waitingPushDataRepository.AddAsync(pushData, cancellationToken);
+        }
     }
 }

+ 227 - 38
src/Hotline/DataSharing/Province/Services/PusherProviderService.cs

@@ -16,6 +16,7 @@ using MapsterMapper;
 using MediatR;
 using Newtonsoft.Json;
 using Sharing.Province.Dtos.HuiJu.Send;
+using System.Net;
 using XF.Domain.Dependency;
 using XF.Domain.Repository;
 
@@ -74,9 +75,10 @@ namespace Hotline.DataSharing.Province.Services
         private readonly PusherProvider _pusherProvider;
         private readonly IHttpClientFactory _httpClientFactory;
         private readonly IRepository<DsGetCaseDistrecordSend> _getCaseDistrecordSendRepository;
+        private readonly XieTongClient _xieTongClient;
 
         /// <summary>
-        /// 注入
+        /// 
         /// </summary>
         /// <param name="submitCaseInfoRepository"></param>
         /// <param name="mapper"></param>
@@ -128,6 +130,7 @@ namespace Hotline.DataSharing.Province.Services
         /// <param name="pusherProvider"></param>
         /// <param name="httpClientFactory"></param>
         /// <param name="getCaseDistrecordSendRepository"></param>
+        /// <param name="xieTongClient"></param>
         public PusherProviderService(IRepository<DsSubmitCaseInfo> submitCaseInfoRepository,
           IMapper mapper,
           IMediator mediator,
@@ -177,7 +180,8 @@ namespace Hotline.DataSharing.Province.Services
           IRepository<DsOrderWorkFlow> dataOrderWorkFlowRepository,
           PusherProvider pusherProvider,
           IHttpClientFactory httpClientFactory,
-          IRepository<DsGetCaseDistrecordSend> getCaseDistrecordSendRepository)
+          IRepository<DsGetCaseDistrecordSend> getCaseDistrecordSendRepository,
+          XieTongClient xieTongClient)
         {
             _submitCaseInfoRepository = submitCaseInfoRepository;
             _mapper = mapper;
@@ -229,6 +233,7 @@ namespace Hotline.DataSharing.Province.Services
             _pusherProvider = pusherProvider;
             _httpClientFactory = httpClientFactory;
             _getCaseDistrecordSendRepository = getCaseDistrecordSendRepository;
+            _xieTongClient = xieTongClient;
         }
         #endregion
 
@@ -238,38 +243,52 @@ namespace Hotline.DataSharing.Province.Services
         /// <param name="submitCaseInfo"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task ProvinceOrderCreatedPusher(DsSubmitCaseInfo submitCaseInfo, CancellationToken cancellationToken)
+        public async Task ProvinceOrderCreatedPusher(List<DsSubmitCaseInfo> submitCaseInfo, CancellationToken cancellationToken)
         {
             var pusher = _pusherProvider.CreatePusher(_channelConfigurationManager);
 
-            var dataReceive = _mapper.Map<CaseInfo>(submitCaseInfo);
+            var dataReceive = _mapper.Map<List<CaseInfo>>(submitCaseInfo);
             var request = new SubmitCaseInfoRequest();
 
             request.ForeachClass(dataReceive);
 
             var data = new SubmitCaseInfoData
             {
-                CaseInfos = new List<CaseInfo>
-                {
-                    dataReceive
-                }
+                CaseInfos = dataReceive
             };
 
             request.SetData(data);
 
             var response = await pusher.PushOrderCreatedAsync(request, cancellationToken);
-
             //如果推送成功修改数据状态
             if (response != null)
             {
-                if (response.Code == "1")
-                    submitCaseInfo.SyncState = "1";
-                else
-                    submitCaseInfo.SyncState = "2";
+                if (response != null)
+                {
+                    List<ErrorInfo> list = new();
+                    if (response.custom != null && response.custom.errorObjs != null && response.custom.errorObjs.Count > 0)
+                    {
+                        list = response.custom.errorObjs;
+                    }
+                    foreach (var item in submitCaseInfo)
+                    {
+                        if (list != null && list.Count > 0)
+                        {
+                            if (list.Find(p => p.caseid == item.CaseSerial) != null)
+                                item.SyncState = "2";
+                            else
+                                item.SyncState = "1";
+                        }
+                        else
+                            item.SyncState = "1";
 
-                submitCaseInfo.ReturnResult = JsonConvert.SerializeObject(response);
-                await _submitCaseInfoRepository.UpdateAsync(submitCaseInfo, cancellationToken);
+                        await _submitCaseInfoRepository.UpdateAsync(item, cancellationToken);
 
+                        //处理同步记录
+                        await UpdateWaitingPushData(item.Id, item.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
+
+                    }
+                }
             }
         }
 
@@ -279,7 +298,7 @@ namespace Hotline.DataSharing.Province.Services
         /// <param name="dto"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task SubmitVisitInfoPusher(DsGetVisitInfoReceive data, CancellationToken cancellationToken)
+        public async Task GetVisitInfoReceivePusher(DsGetVisitInfoReceive data, CancellationToken cancellationToken)
         {
             //信息上报
             var pusher = _pusherProvider.CreatePusher(_channelConfigurationManager);
@@ -302,6 +321,10 @@ namespace Hotline.DataSharing.Province.Services
 
                 data.ReturnResult = JsonConvert.SerializeObject(response);
                 await _getVisitInfoReceiveRepository.UpdateAsync(data, cancellationToken);
+
+                //处理同步记录
+                await UpdateWaitingPushData(data.Id, data.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
+
             }
         }
 
@@ -327,18 +350,47 @@ namespace Hotline.DataSharing.Province.Services
             });
 
             var response = await pusher.PushSubmitCaseRecordAsync(request, cancellationToken);
-
             //如果推送成功修改数据状态
             if (response != null)
             {
-                //if (response.Code == "1")
-                //    notification.DataOrder.SyncState = "1";
-                //else
-                //    notification.DataOrder.SyncState = "2";
+                if (response != null)
+                {
+                    List<ErrorInfo> list = new();
+                    if (response.custom != null && response.custom.errorObjs != null && response.custom.errorObjs.Count > 0)
+                    {
+                        list = response.custom.errorObjs;
+                    }
+                    foreach (var item in dto)
+                    {
+                        if (list != null && list.Count > 0)
+                        {
+                            if (list.Find(p => p.caseid == item.CaseSerial) != null)
+                                item.SyncState = "2";
+                            else
+                                item.SyncState = "1";
+                        }
+                        else
+                            item.SyncState = "1";
+
+                        await _submitCaseRecordRepository.UpdateAsync(item, cancellationToken);
 
-                //notification.DataOrder.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
-                //await _submitCaseRecordRepository.UpdateAsync(notification.DataOrder);
+                        //处理同步记录
+                        await UpdateWaitingPushData(item.Id, item.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
+
+                    }
+                }
             }
+            ////如果推送成功修改数据状态
+            //if (response != null)
+            //{
+            //    //if (response.Code == "1")
+            //    //    notification.DataOrder.SyncState = "1";
+            //    //else
+            //    //    notification.DataOrder.SyncState = "2";
+
+            //    //notification.DataOrder.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
+            //    //await _submitCaseRecordRepository.UpdateAsync(notification.DataOrder);
+            //}
         }
 
         /// <summary>
@@ -411,6 +463,9 @@ namespace Hotline.DataSharing.Province.Services
 
                         caseInfo.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                         await _receiveCaseExtendsRepository.UpdateAsync(caseInfo, cancellationToken);
+                        //处理同步记录
+                        await UpdateWaitingPushData(caseInfo.Id, caseInfo.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
+
                     }
                 }
             }
@@ -444,6 +499,9 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = JsonConvert.SerializeObject(response);
                 await _sendCaseInfoRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
+
             }
         }
 
@@ -453,7 +511,7 @@ namespace Hotline.DataSharing.Province.Services
         /// <param name="dto"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task SubmitCaseProcessPusher(DsGetCaseProcessReceive dto, CancellationToken cancellationToken)
+        public async Task GetCaseProcessReceivePusher(DsGetCaseProcessReceive dto, CancellationToken cancellationToken)
         {
             var pusher = _pusherProvider.CreatePusher(_channelConfigurationManager);
 
@@ -475,6 +533,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = JsonConvert.SerializeObject(response);
                 await _getCaseProcessReceiveRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -506,6 +566,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = JsonConvert.SerializeObject(response);
                 await _getCaseBackApplyRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -537,6 +599,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = JsonConvert.SerializeObject(response);
                 await _sendSuperviseProcessInfoRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -568,6 +632,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = JsonConvert.SerializeObject(response);
                 await _sendSuperviseResultInfoRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -600,6 +666,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = JsonConvert.SerializeObject(response);
                 await _screenCaseInfoSendRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -631,6 +699,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                 await _remindCaseInfoRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -662,6 +732,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                 await _getKnowledgeInfoSendRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -693,6 +765,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                 await _getKnowledgeInfoUpdateRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -726,6 +800,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                 await _getKnowledgeInfoAbandonRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -757,6 +833,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                 await _sendRealTimeStatusRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -788,6 +866,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                 await _delayCaseInfoSendRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -819,6 +899,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                 await _zMHDCaseInfoPublicRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -859,6 +941,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                 await _submitCaseTotalRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -890,6 +974,8 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                 await _supplyCaseInfoSendRepository.UpdateAsync(dto, cancellationToken);
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -921,6 +1007,9 @@ namespace Hotline.DataSharing.Province.Services
 
                 dto.ReturnResult = Newtonsoft.Json.JsonConvert.SerializeObject(response);
                 await _revokeCaseInfoRepository.UpdateAsync(dto, cancellationToken);
+
+                //处理同步记录
+                await UpdateWaitingPushData(dto.Id, dto.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
             }
         }
 
@@ -973,7 +1062,9 @@ namespace Hotline.DataSharing.Province.Services
                             item.SyncState = "1";
 
                         await _submitCaseProcessRepository.UpdateAsync(item, cancellationToken);
-                        await _waitingPushDataRepository.RemoveAsync(p => p.SyncID == item.Id, cancellationToken: cancellationToken);
+
+                        //处理同步记录
+                        await UpdateWaitingPushData(item.Id, item.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
                     }
                 }
             }
@@ -1039,7 +1130,9 @@ namespace Hotline.DataSharing.Province.Services
                         item.SyncState = "1";
 
                     await _submitCaseResultRepository.UpdateAsync(item, cancellationToken);
-                    await _waitingPushDataRepository.RemoveAsync(p => p.SyncID == item.Id, cancellationToken: cancellationToken);
+
+                    //处理同步记录
+                    await UpdateWaitingPushData(item.Id, item.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
                 }
             }
         }
@@ -1103,7 +1196,9 @@ namespace Hotline.DataSharing.Province.Services
                         item.SyncState = "1";
 
                     await _submitVisitInfoRepository.UpdateAsync(item, cancellationToken);
-                    await _waitingPushDataRepository.RemoveAsync(p => p.SyncID == item.Id, cancellationToken: cancellationToken);
+
+                    //处理同步记录
+                    await UpdateWaitingPushData(item.Id, item.SyncState, JsonConvert.SerializeObject(response), cancellationToken: cancellationToken);
                 }
             }
         }
@@ -1122,22 +1217,22 @@ namespace Hotline.DataSharing.Province.Services
                 var dataReceive = _mapper.Map<GetCaseMaterialInfoModel>(item);
 
                 //附件上传
-                var result = "";// await SendFile(dataReceive, item.FileName);
-
-                //结果处理
-                if (result == "1")
+                var result = await SendFileData(dataReceive, item.FileName, item.FileId, cancellationToken);
+                if (result != null && result.ReturnInfo != null)
                 {
-                    //移除待发表数据
-                    await _waitingPushDataRepository.RemoveAsync(p => p.SyncID == item.Id, cancellationToken: cancellationToken);
-
-                    //更新推送表状态
-                    item.SyncState = "1";
+                    //结果处理
+                    if (result.ReturnInfo.Code == "1")
+                        //更新推送表状态
+                        item.SyncState = "1";
+                    else
+                        item.SyncState = "2";
                 }
                 else
-                {
                     item.SyncState = "2";
-                }
                 await _getCaseMaterialInfoRepository.UpdateAsync(item, cancellationToken);
+
+                //处理同步记录
+                await UpdateWaitingPushData(item.Id, item.SyncState, JsonConvert.SerializeObject(result), cancellationToken: cancellationToken);
             }
         }
 
@@ -1184,5 +1279,99 @@ namespace Hotline.DataSharing.Province.Services
                 }
             }
         }
+
+
+        /// <summary>
+        /// 将文件流上传到附件服务器   ----还需要拉取文件流
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="fileName"></param>
+        /// <param name="fileId"></param>
+        /// <returns></returns>
+        private async Task<ProvinceResponse> SendFileData(GetCaseMaterialInfoModel dto, 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();
+                    }
+                }
+                //获取附件上传Token
+                string strToken = await _xieTongClient.GetTokenAsync(cancellationToken);
+
+                //组装请求参数
+                var model = new GetCaseMaterialInfoRequest
+                {
+                    paras = dto,
+                    token = new ClientInfo(configProvince.ClientId, configProvince.ClientSecret)
+                };
+
+                Dictionary<string, object> dicParam = new()
+                {
+                    { "params", Newtonsoft.Json.JsonConvert.SerializeObject(model) } // 第一个接口参数,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);
+
+                return Newtonsoft.Json.JsonConvert.DeserializeObject<ProvinceResponse>(strResult);
+            }
+            catch (Exception)
+            { }
+
+            return Newtonsoft.Json.JsonConvert.DeserializeObject<ProvinceResponse>("");
+
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="dataId"></param>
+        /// <param name="SyncState"></param>
+        /// <param name="result"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        private async Task UpdateWaitingPushData(string dataId, string SyncState, string result, CancellationToken cancellationToken)
+        {
+            //处理同步记录
+            var waitingPushData = await _waitingPushDataRepository.GetAsync(p => p.SyncID == dataId);
+            if (waitingPushData != null)
+            {
+                //第一次同步时间
+                if (waitingPushData.FirstSyncProvinceTime is null)
+                    waitingPushData.FirstSyncProvinceTime = DateTime.Now;
+                else
+                    waitingPushData.SyncCount++;
+
+                //同步成功时间
+                if (SyncState == "1")
+                {
+                    waitingPushData.SuccessSyncTime = DateTime.Now;
+                }
+                //最新同步时间
+                waitingPushData.NewSyncProvinceTime = DateTime.Now;
+                waitingPushData.SyncState = SyncState;
+                waitingPushData.ReturnResult = JsonConvert.SerializeObject(result);
+                await _waitingPushDataRepository.UpdateAsync(waitingPushData, cancellationToken: cancellationToken);
+            }
+        }
     }
 }

+ 7 - 1
src/Hotline/DataSharing/Province/XieTong/Receive/DsGetCaseMaterialInfo.cs

@@ -35,6 +35,12 @@ namespace Hotline.DataSharing.Province.XieTong.Receive
         [SugarColumn(ColumnDescription = "附件名称", ColumnDataType = "varchar(100)")]
         public string? FileName { get; set; }
 
+        /// <summary>
+        /// 附件Id
+        /// </summary>
+        [SugarColumn(ColumnDescription = "附件Id", ColumnDataType = "varchar(50)")]
+        public string? FileId { get; set; }
+
         /// <summary>
         /// 附件大小
         /// </summary>
@@ -45,7 +51,7 @@ namespace Hotline.DataSharing.Province.XieTong.Receive
 		/// 附件KEY
 		/// </summary>
 		[SugarColumn(ColumnDescription = "附件Key")]
-        public string Key { get; set; }
+        public string? Key { get; set; }
 
         /// <summary>
         /// 附件类型