Quellcode durchsuchen

配置文件依据不同地市拆分

xf vor 10 Monaten
Ursprung
Commit
059599c06e
51 geänderte Dateien mit 2912 neuen und 424 gelöschten Zeilen
  1. 1 1
      src/DataSharing.Application/DataSharing.Application.csproj
  2. 16 0
      src/DataSharing.Application/Mappers/MapperConfigs.cs
  3. 253 32
      src/DataSharing.Application/Receivers/ProvinceReceiver.cs
  4. 6 0
      src/DataSharing.Host/Controllers/BaseController.cs
  5. 102 36
      src/DataSharing.Host/Controllers/CityDataExchangeController.cs
  6. 0 14
      src/DataSharing.Host/Controllers/CommonApiController.cs
  7. 164 50
      src/DataSharing.Host/Controllers/ConvergenceMediaController.cs
  8. 4 2
      src/DataSharing.Host/Controllers/EnterpriseController.cs
  9. 199 79
      src/DataSharing.Host/Controllers/HotlineWebController.cs
  10. 256 0
      src/DataSharing.Host/Controllers/OtherPlatformsYBController.cs
  11. 1 1
      src/DataSharing.Host/Controllers/PoliceDSController.cs
  12. 39 73
      src/DataSharing.Host/Controllers/ProvinceController.cs
  13. 2 17
      src/DataSharing.Host/Controllers/WebPortalController.cs
  14. 240 0
      src/DataSharing.Host/Controllers/WllzYBController.cs
  15. 251 0
      src/DataSharing.Host/Controllers/ZzptYBController.cs
  16. 1 0
      src/DataSharing.Host/DataSharing.Host.csproj
  17. 10 6
      src/DataSharing.Host/config/appsettings.Development.json
  18. 10 6
      src/DataSharing.Host/config/appsettings.json
  19. 4 0
      src/DataSharing.Share/DataSharing.Share.csproj
  20. 18 3
      src/DataSharing.Share/Dtos/Common/AddUserInfoDto.cs
  21. 14 0
      src/DataSharing.Share/Dtos/ConvergenceMedia/ConvergenceMediaDeResponse.cs
  22. 2 2
      src/DataSharing.Share/Dtos/ConvergenceMedia/MediaDataReceiveDto.cs
  23. 34 0
      src/DataSharing.Share/Dtos/DataExchange/CityDataReceiveDto.cs
  24. 9 0
      src/DataSharing.Share/Dtos/DataExchange/CityTranspondRawDataDto.cs
  25. 10 0
      src/DataSharing.Share/Dtos/Enterprise/YbEnterpriseDefaults.cs
  26. 80 24
      src/DataSharing.Share/Dtos/HotlineWeb/CalculateUploadRateDto.cs
  27. 3 3
      src/DataSharing.Share/Dtos/HotlineWeb/QuerySendTaskDto.cs
  28. 123 0
      src/DataSharing.Share/Dtos/OtherPlatformsYB/AcceptTypeListDto.cs
  29. 172 0
      src/DataSharing.Share/Dtos/OtherPlatformsYB/AddWriteInfoDto.cs
  30. 12 0
      src/DataSharing.Share/Dtos/OtherPlatformsYB/BaseVailCodeDto.cs
  31. 44 0
      src/DataSharing.Share/Dtos/OtherPlatformsYB/OtherPlatformsDeResponse.cs
  32. 18 0
      src/DataSharing.Share/Dtos/OtherPlatformsYB/ZzptDeResponse.cs
  33. 1 1
      src/DataSharing.Share/Dtos/Province/XieTong/Send/SendCaseInfo.cs
  34. 178 0
      src/DataSharing.Share/Dtos/WebPortal/DsSendTaskDto.cs
  35. 16 2
      src/DataSharing.Share/Enums/EPlatformSource.cs
  36. 5 0
      src/DataSharing.Share/Mq/EventNames.Order.cs
  37. 6 0
      src/DataSharing.YiBin/ConvergenceMedia/DsReceiveMediaData.cs
  38. 26 10
      src/DataSharing/ChannelConfiguration.cs
  39. 8 1
      src/DataSharing/ChannelConfigurationManager.cs
  40. 13 1
      src/DataSharing/Common/DsUserTokenInfo.cs
  41. 19 19
      src/DataSharing/DataExchange/DataExchangeClient.cs
  42. 33 18
      src/DataSharing/DataExchange/DataExchangePusherProviderService.cs
  43. 11 2
      src/DataSharing/Enterprise/EnterprisePusherProviderService.cs
  44. 6 0
      src/DataSharing/IChannelConfigurationManager.cs
  45. 15 0
      src/DataSharing/OtherPlatformsYB/IZzptPusherProviderService.cs
  46. 128 0
      src/DataSharing/OtherPlatformsYB/ZzptPusherProviderService.cs
  47. 241 20
      src/DataSharing/Province/PusherProviderService.cs
  48. 10 0
      src/DataSharing/RawData/DsOrder.cs
  49. 83 0
      src/DataSharing/RawData/DsOrderVisitSend.cs
  50. 6 0
      src/DataSharing/SendTask/DsSendTaskInfo.cs
  51. 9 1
      src/DataSharing/SendTask/SendTaskDataService.cs

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

@@ -8,7 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="Hotline.Api.Sdk" Version="1.0.7" />
-    <PackageReference Include="Hotline.Share" Version="1.0.73" />
+    <PackageReference Include="Hotline.Share" Version="1.0.79" />
     <PackageReference Include="Polly.Core" Version="8.2.0" />
     <PackageReference Include="FluentValidation" Version="11.6.0" />
   </ItemGroup>

+ 16 - 0
src/DataSharing.Application/Mappers/MapperConfigs.cs

@@ -1,5 +1,6 @@
 using DataSharing.RawData;
 using DataSharing.Share.Dtos.Enterprise;
+using DataSharing.Share.Dtos.OtherPlatformsYB;
 using DataSharing.Share.Dtos.Province.Extend;
 using DataSharing.Share.Dtos.Province.HuiJu;
 using DataSharing.Share.Dtos.Province.XieTong.Receive;
@@ -43,6 +44,8 @@ namespace DataSharing.Application.Mappers
                .Map(d => d.CaseType, x => x.AcceptTypeCode)
                .Map(d => d.CliengGuid, x => x.Id)
                .Map(d => d.CaseIsPublic, x => x.IsPublicity == true ? "1" : "0")
+               .Map(d => d.TfdBackTimeBf, x => x.ExpiredTime)
+               .Map(d=>d.CaseGoal,x=>x.Title)
               ;
 
             config.ForType<OrderDto, SendCaseInfo>()
@@ -263,6 +266,9 @@ namespace DataSharing.Application.Mappers
            .Map(d => d.ApplyTime, x => x.SendBack.CreationTime)
            .Map(d => d.BackReason, x => string.IsNullOrEmpty(x.SendBack.AuditOpinion) ? x.SendBack.Content : x.SendBack.AuditOpinion)
            ;
+
+            config.ForType<ScreenCaseResultReceiveModel, ProvinceScreenResult>()
+          .Map(d => d.AuditResult, x => x.AuditResult == "1");
             #endregion
 
             #region 汇聚扩展数据--拓展信息
@@ -690,6 +696,16 @@ namespace DataSharing.Application.Mappers
             ;
 
             #endregion
+
+            config.ForType<DsOrderWorkFlow, GetFlowInfoReturnDto>()
+            .Map(d => d.AcceptName, x => x.HandlerOrgName)
+            .Map(d => d.AcceptUser, x => x.HandlerName)
+            .Map(d => d.AcceptContent, x => x.Opinion)
+            .Map(d => d.AcceptState, x => "已完成")
+            .Map(d => d.AcceptDate, x => x.HandleTime)
+            .Map(d => d.AcceptEnd, x => "0")
+       ;
+
         }
     }
 

+ 253 - 32
src/DataSharing.Application/Receivers/ProvinceReceiver.cs

@@ -1,12 +1,13 @@
 using DataSharing.Application.Validators.HuiJu;
 using DataSharing.Application.Validators.XieTong;
+using DataSharing.Common;
+using DataSharing.DaoShu110;
 using DataSharing.DataExchange;
 using DataSharing.Province;
 using DataSharing.RawData;
 using DataSharing.SendTask;
 using DataSharing.Share.Consts;
 using DataSharing.Share.Dtos;
-using DataSharing.Share.Dtos.DataExchange;
 using DataSharing.Share.Dtos.Enterprise;
 using DataSharing.Share.Dtos.HotlineWeb;
 using DataSharing.Share.Dtos.Province;
@@ -18,7 +19,6 @@ using DataSharing.Share.Dtos.Province.XieTong.Send;
 using DataSharing.Share.Enums;
 using DataSharing.WebPortal;
 using DotNetCore.CAP;
-using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.TrCallCenter;
@@ -26,11 +26,11 @@ using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using MapsterMapper;
-using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Logging;
 using System.Security.Cryptography;
 using System.Text;
 using DataSharing.Police110.DaoShu110;
+using System.Web;
 using XF.Domain.Cache;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
@@ -59,6 +59,8 @@ namespace DataSharing.Application.Receivers
         private readonly IRepository<DsTelCall> _dsTelCallRepository;
         private readonly IRepository<DsReceiveDataExchangeData> _dsReceiveDataExchangeDataRepository;
         private readonly ITypedCache<ConfigurationInformationDto> _configurationInformationCache;
+        private readonly IRepository<DsOrderVisitSend> _dsOrderVisitSendRepository;
+        private readonly IRepository<DsUserTokenInfo> _dsUserTokenInfoRepository;
 
         /// <summary>
         /// 
@@ -79,6 +81,9 @@ namespace DataSharing.Application.Receivers
         /// <param name="capPublisher"></param>
         /// <param name="dsTelCallRepository"></param>
         /// <param name="dsReceiveDataExchangeDataRepository"></param>
+        /// <param name="configurationInformationCache"></param>
+        /// <param name="dsOrderVisitSendRepository"></param>
+        /// <param name="dsUserTokenInfoRepository"></param>
         public ProvinceReceiver(IMapper mapper, ILogger<ProvinceReceiver> logger,
              IRepository<DsPoliceSendChainAlarmDs> policeSendChainAlarmDsRepository,
              IRepository<DsPoliceSendChainDealDs> policeSendChainDealDsRepository,
@@ -94,7 +99,9 @@ namespace DataSharing.Application.Receivers
              ICapPublisher capPublisher,
              IRepository<DsTelCall> dsTelCallRepository,
              IRepository<DsReceiveDataExchangeData> dsReceiveDataExchangeDataRepository,
-             ITypedCache<ConfigurationInformationDto> configurationInformationCache)
+             ITypedCache<ConfigurationInformationDto> configurationInformationCache,
+             IRepository<DsOrderVisitSend> dsOrderVisitSendRepository,
+             IRepository<DsUserTokenInfo> dsUserTokenInfoRepository)
         {
             _mapper = mapper;
             _logger = logger;
@@ -113,6 +120,8 @@ namespace DataSharing.Application.Receivers
             _dsTelCallRepository = dsTelCallRepository;
             _dsReceiveDataExchangeDataRepository = dsReceiveDataExchangeDataRepository;
             _configurationInformationCache = configurationInformationCache;
+            _dsOrderVisitSendRepository = dsOrderVisitSendRepository;
+            _dsUserTokenInfoRepository = dsUserTokenInfoRepository;
         }
         #endregion
 
@@ -500,6 +509,13 @@ namespace DataSharing.Application.Receivers
                 //将待推送数据写入待推送表
                 await InitPushDataAsync("SubmitCaseInfo", "submit_case_info", jsonData, data.CaseSerial, pathType: EPathType.HuiJu, taskPriority: 10, GenerationTime: dto.StartTime, cancellationToken: cancellationToken);
             }
+            //修改工单的期满时间
+            var dataOrder = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Id, cancellationToken);
+            if (dataOrder != null)
+            {
+                dataOrder.ExpiredTime = dto.ExpiredTime;
+                await _dsOrderRepository.UpdateAsync(dataOrder, cancellationToken);
+            }
         }
 
         /// <summary>
@@ -633,9 +649,12 @@ namespace DataSharing.Application.Receivers
                 dataOrder.HandleState = "办理完成";
                 dataOrder.ActualHandleOrgName = dto.Order.ActualHandleOrgName;
                 dataOrder.ActualHandleOrgCode = dto.Order.ActualHandleOrgCode;
+                dataOrder.ActualHandlerId = dto.Order.ActualHandlerId;
+                dataOrder.ActualHandlerName = dto.Order.ActualHandlerName;
                 dataOrder.ActualOpinion = string.IsNullOrEmpty(dto.Order.ActualOpinion) == false ? dto.Order.ActualOpinion : dto.WorkflowTrace.Opinion;
                 dataOrder.ActualHandleTime = dto.Order.FiledTime;
                 dataOrder.AllDuration = dto.Order.AllDuration;
+                dataOrder.ExpiredTime = dto.Order.ExpiredTime;
                 await _dsOrderRepository.UpdateAsync(dataOrder, cancellationToken);
             }
             else
@@ -667,6 +686,8 @@ namespace DataSharing.Application.Receivers
                     HandleState = "办理完成",
                     ActualHandleOrgName = order.ActualHandleOrgName,
                     ActualHandleOrgCode = order.ActualHandleOrgCode,
+                    ActualHandlerId = order.ActualHandlerId,
+                    ActualHandlerName = order.ActualHandlerName,
                     ActualOpinion = string.IsNullOrEmpty(order.ActualOpinion) == false ? order.ActualOpinion : dto.WorkflowTrace.Opinion,
                     ActualHandleTime = order.FiledTime,
                     StartTime = order.StartTime,
@@ -732,6 +753,11 @@ namespace DataSharing.Application.Receivers
                     await _policeSendChainDealDsRepository.AddAsync(dataPolice, cancellationToken);
                 }
             }
+
+            //市州互转推送办结结果
+            if (dto.Order.Source >= ESource.CityDataExchangeLz && dto.Order.Source < ESource.ConvergenceMedia)
+                await UndertakAdviceAsync(dto.Order, cancellationToken);
+
         }
 
         /// <summary>
@@ -1229,10 +1255,29 @@ namespace DataSharing.Application.Receivers
             //泸州市州数据提交
             if (dto.Transpond == true)
             {
-                if (dto.TranspondCityValue == "TranspondCityLZ12345")
+                string areaCode = _channelConfigurationManager.GetConfigurationCityCode().AreaCode;
+                //判断推送市州
+                string PlatformSource = "";
+                switch (dto.TranspondCityValue)
                 {
-                    await InitCityDataLZAsync(dto, cancellationToken);
+                    case "TranspondCityLZ12345":  //转泸州12345
+                        PlatformSource = "CityDataExchangeLz";
+                        break;
+                    case "TranspondCityZG12345"://转自贡12345
+                        PlatformSource = "CityDataExchangeZG";
+                        break;
+                    case "TranspondCityYB12345"://转宜宾12345
+                        PlatformSource = "CityDataExchangeYB";
+                        break;
+                    case "TranspondCityNJ12345"://转内江12345
+                        PlatformSource = "CityDataExchangeNJ";
+                        break;
+
+                    default:
+                        break;
                 }
+                //数据推送
+                await InitCityDataAsync(dto, PlatformSource, cancellationToken);
             }
         }
         #endregion
@@ -1501,6 +1546,10 @@ namespace DataSharing.Application.Receivers
                         //是否向省上派单
                         if (item.Key == "001171" || item.Key == "001178")
                             await SendCaseInfoDataAsync(dto.Order, cancellationToken);
+
+                        //综治平台
+                        if (item.Key == "001143")
+                            await InitZzptPlatformsAsync(dto.Order, cancellationToken);
                     }
                 }
             }
@@ -1519,6 +1568,36 @@ namespace DataSharing.Application.Receivers
 
             dto.AreaCode = dto.Order.AreaCode.Length > 6 ? dto.Order.AreaCode.Substring(0, 6) : dto.Order.AreaCode;
 
+            //存在更新,不存在新增
+            var visitData = await _dsOrderVisitSendRepository.GetAsync(p => p.OrderId == dto.Order.Id, cancellationToken);
+            if (visitData != null)
+            {
+                visitData.VisitType = dto.VisitType.ToString();
+                visitData.VisitName = dto.VisitName;
+                visitData.VisitTime = dto.VisitTime;
+                visitData.VisitRemark = dto.VisitRemark;
+                visitData.SubjectResultSatifyCode = dto.SubjectResultSatifyCode;
+                await _dsOrderVisitSendRepository.UpdateAsync(visitData, cancellationToken);
+            }
+            else
+            {
+                ///写入推送数据表,用于统计满意度
+                visitData = new()
+                {
+                    OrderId = dto.Order.Id,
+                    OrderNo = dto.No,
+                    ProvinceNo = dto.Order.ProvinceNo,
+                    VisitType = dto.VisitType.ToString(),
+                    VisitName = dto.VisitName,
+                    VisitTime = dto.VisitTime,
+                    VisitRemark = dto.VisitRemark,
+                    SubjectResultSatifyCode = dto.SubjectResultSatifyCode,
+                    IsProvince = dto.Order.IsProvince,
+                    Source = dto.Order.Source.ToString()
+                };
+                await _dsOrderVisitSendRepository.AddAsync(visitData, cancellationToken);
+            }
+
             #region 修改工单基础数据为已评价
             ////修改工单基础数据为已评价
             //var dataOrder = await _dsOrderRepository.GetAsync(p => p.OrderId == dto.Order.Id, cancellationToken);
@@ -1692,6 +1771,12 @@ namespace DataSharing.Application.Receivers
             {
                 await InitPoliceSendChainDealDsAsync(dto, cancellationToken);
             }
+
+            //综治平台推送办理结果
+            if (dto.Order.Source == ESource.ZZPT)
+            {
+                await InitZzptPlatformsDetailAsync(dto, cancellationToken);
+            }
         }
 
         /// <summary>
@@ -1746,7 +1831,7 @@ namespace DataSharing.Application.Receivers
             }
             submitCaseInfo.CaseValid = "1";
             submitCaseInfo.CaseIsPublic = string.IsNullOrEmpty(submitCaseInfo.CaseIsPublic) == true ? "0" : submitCaseInfo.CaseIsPublic;
-            submitCaseInfo.ThemeSerial = "05";
+            submitCaseInfo.ThemeSerial = "20";
 
             if (dto.SourceChannelCode == "SZMHD" && dto.IsProvince == false && dto.Source == ESource.ProvinceStraight)
                 submitCaseInfo.TrowGuid = "【政民互动直派】";
@@ -2286,46 +2371,115 @@ namespace DataSharing.Application.Receivers
         /// 泸州市州数据提交
         /// </summary>
         /// <param name="dto"></param>
+        /// <param name="platformSource"></param>
+        /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        private async Task InitCityDataLZAsync(OrderDto dto, CancellationToken cancellationToken)
+        private async Task InitCityDataAsync(OrderDto dto, string platformSource, CancellationToken cancellationToken)
         {
-            var cityHandOver = _channelConfigurationManager.GetConfigurationCityHandOver();
-            string source = cityHandOver.SendCityName;
-            string secretKey = GetMD5(source + cityHandOver.SecretKey);
+            var userInfo = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSource == platformSource && p.State == "1", cancellationToken);
+            if (userInfo is null)
+                return;
 
-            string fromGender = dto.FromGender switch
-            {
-                EGender.Female => "2",
-                EGender.Male => "1",
-                _ => "0",
-            };
+            string source = userInfo.PlatformSourceName;
+            string secretKey = GetMD5(source + userInfo.AccountSecret);
+
+            var serverName = dto.IdentityType == EIdentityType.Enterprise ? "企业" : "市民";
             Dictionary<string, string> dicParam = new()
             {
                 { "Code", secretKey },
                 { "FSHCode", dto.No },
-                { "ServerName", dto.IdentityType == EIdentityType.Enterprise ? "1" : "0"},
-                { "PurTypeName",dto.AcceptType },
-                { "ConTypeName", dto.HotspotSpliceName},
-                { "Title", dto.Title},
-                { "LinkName", dto.FromName},
-                { "Gender",fromGender},
+                { "ServerName", HttpUtility.UrlEncode(serverName)},
+                { "PurTypeName",HttpUtility.UrlEncode(dto.AcceptType) },
+                { "ConTypeName",HttpUtility.UrlEncode( dto.HotspotSpliceName)},
+                { "Title", HttpUtility.UrlEncode(dto.Title)},
+                { "LinkName", HttpUtility.UrlEncode(dto.FromName)},
+                { "Gender",dto.FromGender switch
+                    {
+                        EGender.Female => "2",
+                        EGender.Male => "1",
+                        _ => "0",
+                    }
+                },
                 { "Mobile", dto.Contact},
                 { "Mail","" },
-                { "Address", dto.Address },
-                { "Content", dto.Content},
-                { "Source",source }
+                { "Address", HttpUtility.UrlEncode( dto.FullAddress )},
+                { "Content", HttpUtility.UrlEncode(dto.Content)},
+                { "Source",HttpUtility.UrlEncode( source )}
             };
 
+            var config = _channelConfigurationManager.GetConfigurationCityHandOver();
+            if (config == null)
+                return;
+
+            string path = "";
+            if (config.IsNew)
+                path = config.NewPushOrder;
+            else
+                path = config.PushOrder;
             //写入待推送数据
-            var snedTaskId = await InitPushDataAsync("InitCityDataYB", "CityHandOver.asmx/FlowWrite", System.Text.Json.JsonSerializer.Serialize(dicParam), dto.ProvinceNo, platformSource: EPlatformSource.CityDataExchange, cancellationToken: cancellationToken);
+            await InitPushDataAsync(platformSource, path, System.Text.Json.JsonSerializer.Serialize(dicParam), dto.No, platformSource: EPlatformSource.CityDataExchange, cancellationToken: cancellationToken);
+
+        }
+
+        /// <summary>
+        /// 办理意见推送
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        private async Task UndertakAdviceAsync(OrderDto dto, CancellationToken cancellationToken)
+        {
+            string areaCode = _channelConfigurationManager.GetConfigurationCityCode().AreaCode;
+            //判断推送市州
+            string platformSource = "";
+            switch (areaCode)
+            {
+                case "510500":  //转泸州12345
+                    platformSource = "CityDataExchangeLz";
+                    break;
+                case "510300"://转自贡12345
+                    platformSource = "CityDataExchangeZG";
+                    break;
+                case "511500"://转宜宾12345
+                    platformSource = "CityDataExchangeYB";
+                    break;
+                case "511000"://转内江12345
+                    platformSource = "CityDataExchangeNJ";
+                    break;
+
+                default:
+                    break;
+            }
+            var userInfoSend = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSource == platformSource && p.State == "1", cancellationToken);
+            if (userInfoSend is null)
+                return;
+            string source = userInfoSend.PlatformSourceName;
+            string secretKey = GetMD5(source + userInfoSend.AccountSecret);
+
+            var userInfo = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSource == dto.Source.ToString() && p.State == "1", cancellationToken);
+            if (userInfo is null)
+                return;
 
-            var dataRow = new DsReceiveDataExchangeData()
+            Dictionary<string, object> dic = new()
             {
-                ExternalId = dto.No,
-                ServiceInterface = "send_data_row",
-                ReceiveData = snedTaskId
+                { "Code", secretKey }, //请求Code
+                { "SCDRCode", dto.ExternalId }, //工单编号
+                { "UndertakAdvice", HttpUtility.UrlEncode(dto.ActualOpinion.Trim()) }, //承办意见
+                { "Source", HttpUtility.UrlEncode(source) } //来源
             };
-            await _dsReceiveDataExchangeDataRepository.AddAsync(dataRow, cancellationToken);
+
+            var config = _channelConfigurationManager.GetConfigurationCityHandOver();
+            if (config == null)
+                return;
+
+            string path = "";
+            if (config.IsNew)
+                path = config.NewPushOpinion;
+            else
+                path = config.PushOpinion;
+
+            //写入待推送数据
+            await InitPushDataAsync(userInfo.PlatformSource, path, System.Text.Json.JsonSerializer.Serialize(dic), dto.No, platformSource: EPlatformSource.CityDataExchange, cancellationToken: cancellationToken);
 
         }
         #endregion
@@ -2348,6 +2502,73 @@ namespace DataSharing.Application.Receivers
         }
         #endregion
 
+        #region 综治平台
+        /// <summary>
+        /// 综治平台--推送工单信息
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        private async Task InitZzptPlatformsAsync(OrderDto dto, CancellationToken cancellationToken)
+        {
+            string fromGender = dto.FromGender switch
+            {
+                EGender.Female => "2",
+                EGender.Male => "1",
+                _ => "0",
+            };
+            string AcceptTypeCode = dto.AcceptTypeCode switch
+            {
+                "10" => "1",
+                "35" => "2",
+                "20" => "3",
+                "15" => "4",
+                "1" => "5",
+                _ => "6",
+            };
+            Dictionary<string, string> dicParam = new Dictionary<string, string>
+            {
+                { "code", dto.No },
+                { "departmentNo", dto.AreaCode },
+                { "userName", dto.FromName },
+                { "gender", fromGender },
+                { "email", "" },
+                { "phome", dto.Contact },
+                { "address", dto.FullAddress },
+                { "type", AcceptTypeCode },
+                { "title", dto.Title },
+                { "content", dto.Content },
+                { "occurDate", Convert.ToDateTime(dto.CreationTime).ToString("yyyy-MM-dd HH:mm:ss") },
+                { "remark", "" }
+            };
+
+            //写入待推送数据
+            await InitPushDataAsync("InitZzptPlatformsAsync", YbEnterpriseDefaults.ZzptPlatformsSendOrder, System.Text.Json.JsonSerializer.Serialize(dicParam), dto.ProvinceNo, platformSource: EPlatformSource.ZZPT, cancellationToken: cancellationToken);
+
+        }
+
+        /// <summary>
+        /// 推送办理信息
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        private async Task InitZzptPlatformsDetailAsync(OrderFlowDto dto, CancellationToken cancellationToken)
+        {
+            Dictionary<string, string> dicParam = new Dictionary<string, string>
+            {
+                { "code", dto.Order.ExternalId },
+                { "action", "9" },
+                { "user", dto.Order.ActualHandlerName },
+                { "date", dto.Order.ActualHandleTime == null ? "" : dto.Order.ActualHandleTime.Value.ToString("yyyy-MM-dd HH:mm:ss") },
+                { "result", dto.Order.ActualOpinion }
+            };
+
+            //写入待推送数据
+            await InitPushDataAsync("InitZzptPlatformsDetailAsync", YbEnterpriseDefaults.ZzptPlatformsSendHandle, System.Text.Json.JsonSerializer.Serialize(dicParam), dto.Order.ProvinceNo, platformSource: EPlatformSource.ZZPT, cancellationToken: cancellationToken);
+
+        }
+        #endregion
+
         #region 初始化待推送数据
         /// 初始化待推送数据
         /// </summary>

+ 6 - 0
src/DataSharing.Host/Controllers/BaseController.cs

@@ -8,4 +8,10 @@ namespace DataSharing.Host.Controllers
     public class BaseController : ControllerBase
     {
     }
+
+    [ApiController]
+    [Route("api/v1/[controller]")]
+    public class BaseDataController : ControllerBase
+    {
+    }
 }

+ 102 - 36
src/DataSharing.Host/Controllers/CityDataExchangeController.cs

@@ -1,4 +1,5 @@
-using DataSharing.DataExchange;
+using DataSharing.Common;
+using DataSharing.DataExchange;
 using DataSharing.FwDataExchange;
 using DataSharing.Share.Dtos;
 using DataSharing.Share.Dtos.DataExchange;
@@ -12,6 +13,7 @@ using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using System.Security.Cryptography;
 using System.Text;
+using System.Web;
 using XF.Domain.Filters;
 using XF.Domain.Repository;
 
@@ -28,6 +30,7 @@ namespace DataSharing.Host.Controllers
         private readonly IChannelConfigurationManager _channelConfigurationManager;
         private readonly IRepository<DsReceiveDataExchangeData> _dsReceiveDataExchangeDataRepository;
         private readonly FwClient _fwClient;
+        private readonly IRepository<DsUserTokenInfo> _dsUserTokenInfoRepository;
 
         /// <summary>
         /// 
@@ -37,12 +40,14 @@ namespace DataSharing.Host.Controllers
         /// <param name="capPublisher"></param>
         /// <param name="channelConfigurationManager"></param>
         /// <param name="dsReceiveDataExchangeDataRepository"></param>
-        /// <param name="hotlineClient"></param>
+        /// <param name="fwClient"></param>
+        /// <param name="dsUserTokenInfoRepository"></param>
         public CityDataExchangeController(IMapper mapper, IMediator mediator,
             ICapPublisher capPublisher,
             IChannelConfigurationManager channelConfigurationManager,
             IRepository<DsReceiveDataExchangeData> dsReceiveDataExchangeDataRepository,
-            FwClient fwClient)
+            FwClient fwClient,
+            IRepository<DsUserTokenInfo> dsUserTokenInfoRepository)
         {
             _mapper = mapper;
             _mediator = mediator;
@@ -50,61 +55,74 @@ namespace DataSharing.Host.Controllers
             _channelConfigurationManager = channelConfigurationManager;
             _dsReceiveDataExchangeDataRepository = dsReceiveDataExchangeDataRepository;
             _fwClient = fwClient;
+            _dsUserTokenInfoRepository = dsUserTokenInfoRepository;
         }
 
         /// <summary>
-        /// 宜宾泸州数据互换
+        /// 市州互转---工单推送业务
         /// </summary>
-        /// <param name="cityDataReceiveDto">宜宾泸州数据互换</param>
+        /// <param name="dto">宜宾泸州数据互换</param>
         /// <returns></returns>
         [HttpPost("city_hand_data")]
         [AllowAnonymous]
-        public async Task<OpenResponse> CityHandData([FromBody] CityDataReceiveDto cityDataReceiveDto)
+        public async Task<OpenResponse> CityHandData([FromForm] CityDataReceiveDto dto)
         {
             // 验证
-            if (cityDataReceiveDto is null)
+            if (dto is null)
                 return OpenResponse.Ok(DataExchangeDeReponse.Failed(description: "数据解析失败"));
 
+            dto.ServerName = HttpUtility.UrlDecode(dto.ServerName);
+            dto.PurTypeName = HttpUtility.UrlDecode(dto.PurTypeName);
+            dto.ConTypeName = HttpUtility.UrlDecode(dto.ConTypeName);
+            dto.Title = HttpUtility.UrlDecode(dto.Title);
+            dto.LinkName = HttpUtility.UrlDecode(dto.LinkName);
+            dto.Address = HttpUtility.UrlDecode(dto.Address);
+            dto.Content = HttpUtility.UrlDecode(dto.Content);
+            dto.Source = HttpUtility.UrlDecode(dto.Source);
+
             //验证数据
-            string strResult = cityDataReceiveDto.Validate();
+            string strResult = dto.Validate();
             if (!string.IsNullOrEmpty(strResult))
                 return OpenResponse.Ok(DataExchangeDeReponse.Failed(description: strResult));
 
-            var cityHandOver = _channelConfigurationManager.GetConfigurationCityHandOver();
+            var userInfo = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSourceName == dto.Source, HttpContext.RequestAborted);
+            if (userInfo is null)
+                return OpenResponse.Ok(DataExchangeDeReponse.Failed("-900", "密钥错误"));
+
             //验证MD5
-            strResult = Verification(cityDataReceiveDto.Code, cityDataReceiveDto.Source + cityHandOver.SecretKey);
+            strResult = Verification(dto.Code, dto.Source + userInfo.AccountSecret);
             if (!string.IsNullOrEmpty(strResult))
                 return OpenResponse.Ok(DataExchangeDeReponse.Failed("-900", strResult));
 
             //写入原始数据表
             var data = new DsReceiveDataExchangeData()
             {
-                ExternalId = cityDataReceiveDto.FSHCode,
+                ExternalId = dto.FSHCode,
                 ServiceInterface = "city_hand_data",
-                ReceiveData = System.Text.Json.JsonSerializer.Serialize(cityDataReceiveDto)
+                ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto)
             };
             data.Id = await _dsReceiveDataExchangeDataRepository.AddAsync(data, HttpContext.RequestAborted);
 
             Hotline.Share.Dtos.Order.AddOrderDto orderDto = new()
             {
-                Title = cityDataReceiveDto.Title,
-                ExternalId = cityDataReceiveDto.FSHCode,
-                AcceptType = cityDataReceiveDto.PurTypeName,
-                HotspotSpliceName = cityDataReceiveDto.ConTypeName,
-                FromName = cityDataReceiveDto.LinkName,
-                Contact = cityDataReceiveDto.Mobile,
-                Address = cityDataReceiveDto.Address,
-                Content = cityDataReceiveDto.Content,
-                Source = Hotline.Share.Enums.Order.ESource.CityDataExchangeLz,
-                FromGender = cityDataReceiveDto.Gender switch
+                Title = dto.Title,
+                ExternalId = dto.FSHCode,
+                AcceptType = dto.PurTypeName,
+                HotspotSpliceName = dto.ConTypeName,
+                FromName = dto.LinkName,
+                Contact = dto.Mobile,
+                FullAddress = dto.Address,
+                Content = dto.Content,
+                Source = (ESource)Enum.Parse(typeof(ESource), userInfo.PlatformSource),
+                FromGender = dto.Gender switch
                 {
-                    "1" => Hotline.Share.Enums.Order.EGender.Male,
-                    "2" => Hotline.Share.Enums.Order.EGender.Female,
-                    _ => Hotline.Share.Enums.Order.EGender.Unknown,
+                    "1" => EGender.Male,
+                    "2" => EGender.Female,
+                    _ => EGender.Unknown,
                 },
                 SourceChannel = "市州互转",
                 SourceChannelCode = "SZHZ",
-                IdentityType = Hotline.Share.Enums.Order.EIdentityType.Citizen,
+                IdentityType = EIdentityType.Citizen,
                 Transpond = false,
                 IsEnforcementOrder = false
             };
@@ -115,13 +133,14 @@ namespace DataSharing.Host.Controllers
             {
                 TranspondCityRawDataDto cityRawDataDto = new()
                 {
-                    OrderCode = cityDataReceiveDto.FSHCode,
+                    OrderCode = dto.FSHCode,
                     TransferOutTime = DateTime.Now,
                     SendTimes = 1,
                     IsSuccess = true,
-                    Result = System.Text.Json.JsonSerializer.Serialize(cityDataReceiveDto),
-                    CityName = cityDataReceiveDto.Source,
-                    Direction = ETranspondDirection.In
+                    Result = System.Text.Json.JsonSerializer.Serialize(dto),
+                    CityName = dto.Source,
+                    Direction = ETranspondDirection.In,
+                    NewCode = result.result.no
                 };
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.SharingOrderReceiveTranspondCity, cityRawDataDto, cancellationToken: HttpContext.RequestAborted);
 
@@ -131,21 +150,68 @@ namespace DataSharing.Host.Controllers
                 return OpenResponse.Ok(DataExchangeDeReponse.Failed(description: "接口调用失败!"));
         }
 
+        /// <summary>
+        /// 办理结果
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("city_undertak_advice_data")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> CityDataUndertakAdvice([FromForm] CityDataUndertakAdviceDto dto)
+        {
+            // 验证
+            if (dto is null)
+                return OpenResponse.Ok(DataExchangeDeReponse.Failed(description: "数据解析失败"));
+
+            dto.UndertakAdvice = HttpUtility.UrlDecode(dto.UndertakAdvice);
+            dto.Source = HttpUtility.UrlDecode(dto.Source);
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(DataExchangeDeReponse.Failed(description: strResult));
+
+            var userInfo = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSourceName == dto.Source, HttpContext.RequestAborted);
+            if (userInfo is null)
+                return OpenResponse.Ok(DataExchangeDeReponse.Failed("-900", "密钥错误"));
+
+            //验证MD5
+            strResult = Verification(dto.Code, dto.Source + userInfo.AccountSecret);
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(DataExchangeDeReponse.Failed("-900", strResult));
+
+            //写入原始数据表
+            var data = new DsReceiveDataExchangeData()
+            {
+                ExternalId = dto.SCDRCode,
+                ServiceInterface = "city_undertak_advice_data",
+                ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto)
+            };
+            await _dsReceiveDataExchangeDataRepository.AddAsync(data, HttpContext.RequestAborted);
+
+            TranspondCityOrderResultDto transpondCityOrderResultDto = new()
+            {
+                No = dto.SCDRCode,
+                Opinion = dto.UndertakAdvice
+            };
+            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.SharingOrderReceiveHandleOpinionTranspondCity, transpondCityOrderResultDto, cancellationToken: HttpContext.RequestAborted);
+
+            return OpenResponse.Ok(DataExchangeDeReponse.Success("", "", "您已成功提交数据!"));
+        }
+
         #region 密钥验证
 
         /// <summary>
         /// 密钥验证
         /// </summary>
-        /// <param name="Code">密钥</param>
+        /// <param name="Code"></param>
+        /// <param name="Source"></param>
+        /// <returns></returns>
         private static string Verification(string Code, string Source)
         {
-            string strJson = "";
             string strJJYLCode = GetMD5(Source);
             if (strJJYLCode.ToLower().Trim() != Code.ToLower().Trim())
-            {
-                strJson = "密钥错误";
-                return strJson;
-            }
+                return "密钥错误";
             return "";
         }
 

+ 0 - 14
src/DataSharing.Host/Controllers/CommonApiController.cs

@@ -72,20 +72,6 @@ namespace DataSharing.Host.Controllers
         }
         #endregion
 
-        /// <summary>
-        /// 新增用户
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [HttpPost("adduserinfo")]
-        [AllowAnonymous]
-        public async Task<OpenResponse> AddUserInfo([FromBody] AddUserInfoDto dto)
-        {
-            var tokenInfo = _mapper.Map<DsUserTokenInfo>(dto);
-            await _dsUserTokenInfoRepository.AddAsync(tokenInfo, HttpContext.RequestAborted);
-            return OpenResponse.Ok("成功");
-        }
-
         /// <summary>
         /// 2.1写信 
         /// </summary>

+ 164 - 50
src/DataSharing.Host/Controllers/ConvergenceMediaController.cs

@@ -6,7 +6,6 @@ using DataSharing.Share.Dtos;
 using DataSharing.Share.Dtos.Common;
 using DataSharing.Share.Dtos.ConvergenceMedia;
 using DataSharing.Share.Dtos.HotlineSetting;
-using DataSharing.Share.Dtos.WebPortal;
 using DataSharing.Share.Enums;
 using DataSharing.WebPortal;
 using DotNetCore.CAP;
@@ -87,21 +86,37 @@ namespace DataSharing.Host.Controllers
         /// <returns></returns>
         [HttpPost("WriteOrder")]
         [AllowAnonymous]
-        public async Task<OpenResponse> WriteOrder([FromBody] MediaDataReceiveDto mediaDataReceiveDto)
+        public async Task<OpenResponse> WriteOrder([FromForm] MediaDataReceiveDto mediaDataReceiveDto)
         {
             var accountDto = await CheckAccountAsync(mediaDataReceiveDto.Code);
             if (accountDto is null || accountDto.IsCheckAccount == false)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Failed(new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = "密钥错误", Code = "-900" }, "1", "密钥错误"));
+            {
+                List<WriteOrderResponseDto> responseDtos = new()
+                {
+                    new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = "密钥错误", Code = "-900" }
+                };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<WriteOrderResponseDto>>.Failed(responseDtos, "0", "密钥错误"));
+            }
+
 
             //验证数据
             string strResult = mediaDataReceiveDto.Validate();
             if (!string.IsNullOrEmpty(strResult))
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Failed(new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = strResult, Code = "0" }, "1", description: strResult));
+            {
+                List<WriteOrderResponseDto> responseDtos = new()
+                {
+                    new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = strResult, Code = "0" }
+                };
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<WriteOrderResponseDto>>.Failed(responseDtos, "0", description: strResult));
+            }
+
 
             //写入原始数据
             DsReceiveMediaData dsReceiveMediaData = new()
             {
                 ServiceInterface = "WriteOrder",
+                PlatformsName= accountDto.PlatformSource,
                 ReceiveData = System.Text.Json.JsonSerializer.Serialize(mediaDataReceiveDto)
             };
             dsReceiveMediaData.Id = await _dsReceiveMediaDataRepository.AddAsync(dsReceiveMediaData, HttpContext.RequestAborted);
@@ -111,7 +126,7 @@ namespace DataSharing.Host.Controllers
                 Title = mediaDataReceiveDto.Title,
                 FromName = mediaDataReceiveDto.LinkName,
                 Contact = mediaDataReceiveDto.Mobile,
-                Address = mediaDataReceiveDto.Address,
+                FullAddress = mediaDataReceiveDto.Address,
                 Content = mediaDataReceiveDto.Content,
                 IsSecret = mediaDataReceiveDto.Secrecy == 0 ? false : true,
                 Source = (Hotline.Share.Enums.Order.ESource)Enum.Parse(typeof(Hotline.Share.Enums.Order.ESource), accountDto.PlatformSource),
@@ -123,7 +138,8 @@ namespace DataSharing.Host.Controllers
                 },
                 IdentityType = Hotline.Share.Enums.Order.EIdentityType.Citizen,
                 Transpond = false,
-                IsEnforcementOrder = false
+                IsEnforcementOrder = false,
+                ExternalId = Guid.NewGuid().ToString()
             };
 
             switch (accountDto.PlatformSource)
@@ -140,7 +156,7 @@ namespace DataSharing.Host.Controllers
                     break;
             }
 
-            switch (mediaDataReceiveDto.PurTypeName)
+            switch (mediaDataReceiveDto.PurTypeID)
             {
                 case 17:
                     data.AcceptType = "咨询";
@@ -220,11 +236,21 @@ namespace DataSharing.Host.Controllers
                 dsReceiveMediaData.ExternalId = result.result.id;
                 dsReceiveMediaData.OrderCode = result.result.no;
                 await _dsReceiveMediaDataRepository.UpdateAsync(dsReceiveMediaData, HttpContext.RequestAborted);
-
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Success(new WriteOrderResponseDto() { AcceptCode = result.result.no, AcceptPwd = result.result.password, msg = "写信成功", Code = "1" }, "您已成功提交数据!"));
+                List<WriteOrderResponseDto> responseDtos = new()
+                {
+                    new WriteOrderResponseDto() { AcceptCode = result.result.no, AcceptPwd = result.result.password, msg = "写信成功", Code = "1" }
+                };
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<WriteOrderResponseDto>>.Success(responseDtos, "您已成功提交数据!"));
             }
             else
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Failed(new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = "接口调用失败", Code = "0" }, "1", description: "接口调用失败!"));
+            {
+                List<WriteOrderResponseDto> responseDtos = new()
+                {
+                  new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = "接口调用失败", Code = "0" }
+                };
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<WriteOrderResponseDto>>.Failed(responseDtos, "0", description: "接口调用失败!"));
+            }
+
         }
 
         /// <summary>
@@ -234,12 +260,23 @@ namespace DataSharing.Host.Controllers
         /// <returns></returns>
         [HttpPost("GetOrderByList")]
         [AllowAnonymous]
-        public async Task<OpenResponse> GetOrderByList([FromBody] GetOrderMediaReceiveDto dto)
+        public async Task<OpenResponse> GetOrderByList([FromForm] GetOrderMediaReceiveDto dto)
         {
             //密钥验证
             var accountDto = await CheckAccountAsync(dto.Code);
             if (accountDto is null || accountDto.IsCheckAccount == false)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<GetOrderMediaDataDto>.Failed(null, "0", "密钥错误"));
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
+
 
             //数据处理
             string AcceptTypeCode = "";
@@ -282,14 +319,16 @@ namespace DataSharing.Host.Controllers
             //计算总页数
             int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
 
+            List<GetOrderMediaDataDto> returnData = new()
+            {
             //处理返回
-            GetOrderMediaDataDto dataDto = new()
+            new()
             {
                 PageCount = nPageCount,
                 data = _mapper.Map<IReadOnlyList<GetOrderMediaDataListDto>>(items)
-            };
+            } };
 
-            return OpenResponse.Ok(ConvergenceMediaDeResponse<GetOrderMediaDataDto>.Success(dataDto, "成功"));
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<List<GetOrderMediaDataDto>>.Success(returnData, "成功"));
 
         }
 
@@ -299,17 +338,27 @@ namespace DataSharing.Host.Controllers
         /// <returns></returns>
         [HttpPost("GetOrderDetail")]
         [AllowAnonymous]
-        public async Task<OpenResponse> GetOrderDetail([FromBody] MediaOrderDetailReceiveDto dto)
+        public async Task<OpenResponse> GetOrderDetail([FromForm] MediaOrderDetailReceiveDto dto)
         {
             //验证密钥
             var accountDto = await CheckAccountAsync(dto.Code);
             if (accountDto is null || accountDto.IsCheckAccount == false)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<MediaOrderDetailDataDto>>.Failed(null, "0", "密钥错误"));
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
 
             //验证数据
             string strResult = dto.Validate();
             if (!string.IsNullOrEmpty(strResult))
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<MediaOrderDetailDataDto>>.Failed(null, "0", strResult));
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ReturnData>>.Failed(ReturnData.ReturnDataInfo(strResult), "0", "失败"));
 
             //查询数据
             var items = await _dataOrderRepository
@@ -334,8 +383,8 @@ namespace DataSharing.Host.Controllers
               })
               .ToListAsync();
 
-            if (items == null)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<MediaOrderDetailDataDto>>.Failed(null, "0", "编号、密码错误!"));
+            if (items == null || items.Count == 0)
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ReturnData>>.Failed(ReturnData.ReturnDataInfo("编号、密码错误!"), "0", "失败"));
             else
                 return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<MediaOrderDetailDataDto>>.Success(_mapper.Map<IReadOnlyList<MediaOrderDetailDataDto>>(items), "成功"));
 
@@ -348,15 +397,25 @@ namespace DataSharing.Host.Controllers
         /// <returns></returns>
         [HttpPost("GetPurTypeReport")]
         [AllowAnonymous]
-        public async Task<OpenResponse> GetPurTypeReport([FromBody] string Code)
+        public async Task<OpenResponse> GetPurTypeReport([FromForm] string Code)
         {
             //验证密钥
             var accountDto = await CheckAccountAsync(Code);
             if (accountDto is null || accountDto.IsCheckAccount == false)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<GetPurTypeReportDataDto>>.Failed(null, "0", "密钥错误"));
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
 
             //数据查询
-            var list = _dataOrderRepository.Queryable()
+            var list = await _dataOrderRepository.Queryable()
                 .Where(p => p.CaseDate >= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")))
                 .Where(p => p.CaseDate <= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59")))
                 .Select(it => new
@@ -384,12 +443,22 @@ namespace DataSharing.Host.Controllers
         /// <returns></returns>
         [HttpPost("GetOrderByListOpen")]
         [AllowAnonymous]
-        public async Task<OpenResponse> GetOrderByListOpen([FromBody] GetOrderMediaReceiveOpenDto dto)
+        public async Task<OpenResponse> GetOrderByListOpen([FromForm] GetOrderMediaReceiveOpenDto dto)
         {
             //密钥验证
             var accountDto = await CheckAccountAsync(dto.Code);
             if (accountDto is null || accountDto.IsCheckAccount == false)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<GetOrderMediaDataDto>.Failed(null, "0", "密钥错误"));
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
 
             //数据处理
             string AcceptTypeCode = "";
@@ -411,7 +480,7 @@ namespace DataSharing.Host.Controllers
             .Where(p => p.IsPublish == EDsPublishState.Open)
             .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title))
             .WhereIF(!string.IsNullOrEmpty(AcceptTypeCode), p => p.CaseTypeCode == AcceptTypeCode)
-            .WhereIF(!string.IsNullOrEmpty(dto.StartDate), p => p.CaseDate >= Convert.ToDateTime(dto.StartDate))
+            .WhereIF(!string.IsNullOrEmpty(dto.StartDate), p => p.CaseDate >= Convert.ToDateTime(dto.StartDate).AddDays(-30))
             .WhereIF(!string.IsNullOrEmpty(dto.EndDate), p => p.CaseDate < Convert.ToDateTime(dto.EndDate).AddDays(1))
             .Select(it => new
             {
@@ -430,13 +499,13 @@ namespace DataSharing.Host.Controllers
             int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize));
 
             //返回数据处理
-            GetOrderMediaDataDto dataDto = new()
+            List<GetOrderMediaDataDto> dataDto = new()
             {
-                PageCount = nPageCount,
-                data = _mapper.Map<IReadOnlyList<GetOrderMediaDataListDto>>(items)
+              new(){  PageCount = nPageCount,
+                data = _mapper.Map<IReadOnlyList<GetOrderMediaDataListDto>>(items) }
             };
 
-            return OpenResponse.Ok(ConvergenceMediaDeResponse<GetOrderMediaDataDto>.Success(dataDto, "成功"));
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<List<GetOrderMediaDataDto>>.Success(dataDto, "成功"));
 
         }
 
@@ -447,22 +516,32 @@ namespace DataSharing.Host.Controllers
         /// <returns></returns>
         [HttpPost("GetOrderByRun")]
         [AllowAnonymous]
-        public async Task<OpenResponse> GetOrderByRun([FromBody] MediaOrderDetailReceiveDto dto)
+        public async Task<OpenResponse> GetOrderByRun([FromForm] MediaOrderDetailReceiveDto dto)
         {
             //密钥验证
             var accountDto = await CheckAccountAsync(dto.Code);
             if (accountDto is null || accountDto.IsCheckAccount == false)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<GetOrderByRunDataDto>>.Failed(null, "0", "密钥错误"));
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
 
             //验证数据
             string strResult = dto.Validate();
             if (!string.IsNullOrEmpty(strResult))
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<GetOrderByRunDataDto>>.Failed(null, "0", strResult));
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ReturnData>>.Failed(ReturnData.ReturnDataInfo(strResult), "0", "失败"));
 
             //验证信件是否存在
             var data = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.AcceptCode && p.Password == dto.AcceptPwd && p.Source == accountDto.PlatformSource, HttpContext.RequestAborted);
-            if (data != null)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<GetOrderByRunDataDto>>.Failed(null, "0", "编号、密码错误!"));
+            if (data == null)
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ReturnData>>.Failed(ReturnData.ReturnDataInfo("编号、密码错误!"), "0", "失败"));
 
             //数据查询
             var list = await _dataOrderWorkFlowRepository.Queryable()
@@ -494,11 +573,25 @@ namespace DataSharing.Host.Controllers
             //验证密钥
             var accountDto = await CheckAccountAsync(Code);
             if (accountDto is null || accountDto.IsCheckAccount == false)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Failed(null, "-900", "密钥错误"));
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
+
+            //验证数据
+            if (string.IsNullOrEmpty(AcceptCode) || string.IsNullOrEmpty(AcceptPwd))
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<string>.Failed("编号、密码不能为空!", "0", "失败"));
 
             var dataRaw = await _dsReceiveMediaDataRepository.GetAsync(p => p.OrderCode == AcceptCode, HttpContext.RequestAborted);
             if (dataRaw == null)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Failed(null, "0", "编号或者密码错误"));
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<string>.Failed("编号、密码错误!", "0", "失败"));
 
             IFormFileCollection files = formData.Files;//等价于Request.Form.Files
 
@@ -510,10 +603,11 @@ namespace DataSharing.Host.Controllers
                 var businessFileDto = await SendFileData(item);
 
                 string strFileName = item.FileName;
-                string strSuffix = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(strFileName.LastIndexOf(".")) : "";
+                string strSuffix = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(strFileName.LastIndexOf(".")+1) : "";
+                string strSubFileName = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(0, strFileName.LastIndexOf(".")) : strFileName;
                 fileDtos.Add(new FileDto()
                 {
-                    Name = item.FileName,
+                    Name = strSubFileName,
                     Type = strSuffix,
                     Classify = "受理上传",
                     Additions = businessFileDto.id,
@@ -530,7 +624,7 @@ namespace DataSharing.Host.Controllers
 
             //推送数据
             var result = await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/update-orderfiles", "Post", System.Text.Json.JsonSerializer.Serialize(updateOrderFiles));
-            return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Success(null, "上传成功"));
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<string>.Success("", "上传成功"));
         }
 
         /// <summary>
@@ -540,12 +634,22 @@ namespace DataSharing.Host.Controllers
         /// <returns></returns>
         [HttpPost("GetNoticeListByPage")]
         [AllowAnonymous]
-        public async Task<OpenResponse> GetNoticeListByPage([FromBody] GetNoticeReceiveDto dto)
+        public async Task<OpenResponse> GetNoticeListByPage([FromForm] GetNoticeReceiveDto dto)
         {
             //密钥验证
             var accountDto = await CheckAccountAsync(dto.Code);
             if (accountDto is null || accountDto.IsCheckAccount == false)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<DataSharing.Share.Dtos.ConvergenceMedia.GetNoticeReceiveDataDto>.Failed(null, "-900", "密钥错误"));
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
 
             int nCurrentPage = 0, nPageSize = 0;
             if (true == string.IsNullOrEmpty(dto.CurrentPage))
@@ -566,7 +670,7 @@ namespace DataSharing.Host.Controllers
                     dto.CType = "4";
                     break;
                 default:
-                    dto.CType = "1";
+                    dto.CType = "4";
                     break;
             }
 
@@ -591,13 +695,13 @@ namespace DataSharing.Host.Controllers
             int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / nPageSize));
 
             //处理返回
-            DataSharing.Share.Dtos.ConvergenceMedia.GetNoticeReceiveDataDto dataDto = new()
+            List<DataSharing.Share.Dtos.ConvergenceMedia.GetNoticeReceiveDataDto> dataDto = new()
             {
-                PageCount = nPageCount,
-                data = _mapper.Map<IReadOnlyList<DataSharing.Share.Dtos.ConvergenceMedia.GetNoticeReceiveDataListDto>>(items)
+                new(){PageCount = nPageCount,
+                data = _mapper.Map<IReadOnlyList<DataSharing.Share.Dtos.ConvergenceMedia.GetNoticeReceiveDataListDto>>(items)}
             };
 
-            return OpenResponse.Ok(ConvergenceMediaDeResponse<DataSharing.Share.Dtos.ConvergenceMedia.GetNoticeReceiveDataDto>.Success(dataDto, "成功"));
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<List<DataSharing.Share.Dtos.ConvergenceMedia.GetNoticeReceiveDataDto>>.Success(dataDto, "成功"));
         }
 
         /// <summary>
@@ -607,12 +711,22 @@ namespace DataSharing.Host.Controllers
         /// <returns></returns>
         [AllowAnonymous]
         [HttpPost("NoticeDetail")]
-        public async Task<OpenResponse> GetArticleDetails([FromBody] MediaArticleIdDto dto)
+        public async Task<OpenResponse> GetArticleDetails([FromForm] MediaArticleIdDto dto)
         {
             //密钥验证
             var accountDto = await CheckAccountAsync(dto.Code);
             if (accountDto is null || accountDto.IsCheckAccount == false)
-                return OpenResponse.Ok(ConvergenceMediaDeResponse<MediaArticleDetailsDto>.Failed(null, "-900", "密钥错误"));
+            {
+                List<ConvergenceMediaDeResponse<string>> convergenceMediaDes = new() {
+                new()
+                {
+                    msg = "密钥错误",
+                    code = "-900",
+                    data = ""
+                } };
+
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<List<ConvergenceMediaDeResponse<string>>>.Failed(convergenceMediaDes, "0", "失败"));
+            }
 
             var data = await _bulletinRepository.GetAsync(p => p.Id == dto.NoticeID, HttpContext.RequestAborted);
             MediaArticleDetailsDto detailsDto = new();
@@ -630,7 +744,7 @@ namespace DataSharing.Host.Controllers
                 detailsDto.NoticeContent = data.Content;
             }
             List<MediaArticleDetailsDto> dataDto = new() { detailsDto };
-            return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<MediaArticleDetailsDto>>.Success(dataDto));
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<List<MediaArticleDetailsDto>>.Success(dataDto, "成功"));
         }
 
         #region 私有方法-将文件转化为文件流

+ 4 - 2
src/DataSharing.Host/Controllers/EnterpriseController.cs

@@ -234,10 +234,12 @@ namespace DataSharing.Host.Controllers
                 var resultData = Newtonsoft.Json.JsonConvert.DeserializeObject<BusinessFileResponse>(result);
                 if (resultData != null && resultData.code == 0)
                 {
+                    string strSuffix = fileName.LastIndexOf(".") > 0 ? fileName.Substring(fileName.LastIndexOf(".") + 1) : "";
+                    string strSubFileName = fileName.LastIndexOf(".") > 0 ? fileName.Substring(0, fileName.LastIndexOf(".")) : fileName;
                     fileDto = new()
                     {
-                        Name = fileName,
-                        Type = type,
+                        Name = strSubFileName,
+                        Type = strSuffix,
                         Classify = classify,
                         Additions = resultData.result.id,
                         Path = resultData.result.path

+ 199 - 79
src/DataSharing.Host/Controllers/HotlineWebController.cs

@@ -1,21 +1,19 @@
-using DataSharing.HotlineWeb;
-using DataSharing.Province;
+using DataSharing.Common;
+using DataSharing.HotlineWeb;
 using DataSharing.RawData;
 using DataSharing.SendTask;
 using DataSharing.Share.Consts;
+using DataSharing.Share.Dtos.Common;
 using DataSharing.Share.Dtos.HotlineWeb;
-using DataSharing.Share.Dtos.Province;
-using DataSharing.Share.Dtos.Province.HuiJu;
+using DataSharing.Share.Dtos.WebPortal;
+using DataSharing.Share.Requests;
 using DotNetCore.CAP;
 using Hotline.Share.Dtos;
-using Hotline.Share.Dtos.Knowledge;
 using MapsterMapper;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
-using Newtonsoft.Json;
 using SqlSugar;
-using System.Security.Permissions;
 using XF.Domain.Cache;
 using XF.Domain.Repository;
 
@@ -30,10 +28,27 @@ namespace DataSharing.Host.Controllers
         private readonly IRepository<DsTelCall> _dsTelCallRepository;
         private readonly IRepository<DsSendTask> _taskRepository;
         private readonly IRepository<DsSendTaskInfo> _taskInfoRepository;
-        private readonly IPusherProviderService _pusherProviderService;
         private readonly IRepository<ConfigurationInformation> _configurationInformationRepository;
         private readonly ITypedCache<ConfigurationInformationDto> _configurationInformationCache;
+        private readonly IRepository<DsOrderVisitSend> _dsOrderVisitSendRepository;
+        private readonly IRepository<DsKnowledgeRawData> _knowledgeRawDataRepository;
+        private readonly IRepository<DsUserTokenInfo> _dsUserTokenInfoRepository;
 
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="mapper"></param>
+        /// <param name="mediator"></param>
+        /// <param name="capPublisher"></param>
+        /// <param name="dsOrderRepository"></param>
+        /// <param name="dsTelCallRepository"></param>
+        /// <param name="taskRepository"></param>
+        /// <param name="taskInfoRepository"></param>
+        /// <param name="configurationInformationRepository"></param>
+        /// <param name="configurationInformationCache"></param>
+        /// <param name="dsOrderVisitSendRepository"></param>
+        /// <param name="knowledgeRawDataRepository"></param>
+        /// <param name="dsUserTokenInfoRepository"></param>
         public HotlineWebController(IMapper mapper,
             IMediator mediator,
             ICapPublisher capPublisher,
@@ -41,9 +56,11 @@ namespace DataSharing.Host.Controllers
             IRepository<DsTelCall> dsTelCallRepository,
             IRepository<DsSendTask> taskRepository,
             IRepository<DsSendTaskInfo> taskInfoRepository,
-             IPusherProviderService pusherProviderService,
-             IRepository<ConfigurationInformation> configurationInformationRepository,
-             ITypedCache<ConfigurationInformationDto> configurationInformationCache
+            IRepository<ConfigurationInformation> configurationInformationRepository,
+            ITypedCache<ConfigurationInformationDto> configurationInformationCache,
+            IRepository<DsOrderVisitSend> dsOrderVisitSendRepository,
+            IRepository<DsKnowledgeRawData> knowledgeRawDataRepository,
+            IRepository<DsUserTokenInfo> dsUserTokenInfoRepository
             )
         {
             _mapper = mapper;
@@ -53,11 +70,14 @@ namespace DataSharing.Host.Controllers
             _dsTelCallRepository = dsTelCallRepository;
             _taskRepository = taskRepository;
             _taskInfoRepository = taskInfoRepository;
-            _pusherProviderService = pusherProviderService;
             _configurationInformationRepository = configurationInformationRepository;
             _configurationInformationCache = configurationInformationCache;
+            _dsOrderVisitSendRepository = dsOrderVisitSendRepository;
+            _knowledgeRawDataRepository = knowledgeRawDataRepository;
+            _dsUserTokenInfoRepository = dsUserTokenInfoRepository;
         }
 
+        #region 数据推送查询统计
         /// <summary>
         /// 查询推送任务
         /// </summary>
@@ -65,20 +85,19 @@ namespace DataSharing.Host.Controllers
         /// <returns></returns>
         [HttpGet("getdssendtask")]
         [AllowAnonymous]
-        public async Task<PagedDto<DsSendTask>> GetDsSendTask([FromQuery] QuerySendTaskDto dto)
+        public async Task<PagedDto<DsSendTaskDto>> GetDsSendTask([FromQuery] QuerySendTaskDto dto)
         {
             //数据查询
             RefAsync<int> total = 0;
             var items = await _taskRepository.Queryable()
                 .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime)
                 .WhereIF(dto.EndTime.HasValue, p => p.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.id), p => p.Id == dto.id)
-                .WhereIF(dto.type == "1", p => p.IsSuccess == true)
-                .WhereIF(dto.type == "2", p => p.IsSuccess == false)
+                .WhereIF(!string.IsNullOrEmpty(dto.Id), p => p.Id == dto.Id)
+                .WhereIF(dto.IsSuccess.HasValue, p => p.IsSuccess == dto.IsSuccess)
                 .OrderByDescending(p => p.CreationTime)
                 .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
 
-            return new PagedDto<DsSendTask>(total, items);
+            return new PagedDto<DsSendTaskDto>(total, _mapper.Map<List<DsSendTaskDto>>(items));
         }
 
         /// <summary>
@@ -95,9 +114,9 @@ namespace DataSharing.Host.Controllers
             var items = await _taskInfoRepository.Queryable()
                 .WhereIF(dto.StartTime.HasValue, p => p.CreationTime >= dto.StartTime)
                 .WhereIF(dto.EndTime.HasValue, p => p.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.id), p => p.TaskId == dto.id)
-                .WhereIF(dto.type == "1", p => p.IsSuccess == true)
-                .WhereIF(dto.type == "2", p => p.IsSuccess == false)
+                .WhereIF(!string.IsNullOrEmpty(dto.Id), p => p.TaskId == dto.Id)
+                .WhereIF(dto.IsSuccess.HasValue, p => p.IsSuccess == dto.IsSuccess)
+                .OrderByDescending(p => p.CreationTime)
                 .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
             return new PagedDto<DsSendTaskInfo>(total, items);
         }
@@ -112,32 +131,13 @@ namespace DataSharing.Host.Controllers
         public async Task FromNewTaskSend(string id)
         {
             var dto = await _taskRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
-            await _pusherProviderService.SendProvinceDataPusher(dto, HttpContext.RequestAborted);
-        }
-
-        /// <summary>
-        /// 根据ID从新推送
-        /// </summary>
-        /// <param name="id">推送任务Id</param>
-        /// <returns></returns>
-        [HttpGet("updatetasksend")]
-        [AllowAnonymous]
-        public async Task UpdateTaskSend(string id)
-        {
-            var dto = await _taskRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
-            var dataOrder = System.Text.Json.JsonSerializer.Deserialize<SendRequestSubmitCaseInfo>(dto.Request, ProvinceJsonSerializerOptions.UnStandardDatetimeJsonOptions);
-            if (dataOrder != null)
+            if (dto != null)
             {
-                if (dataOrder.Data != null && dataOrder.Data.Items != null && dataOrder.Data.Items.Count > 0)
-                {
-                    var data = dataOrder.Data.Items[0].ToString();
-                    ///ProvinceJsonSerializerOptions.UnStandardDatetimeJsonOptions
-                    var temp = JsonConvert.DeserializeObject<SubmitCaseInfo>(data);
-
-                    var ttt = System.Text.Json.JsonSerializer.Deserialize<SubmitCaseInfo>(data, ProvinceJsonSerializerOptions.UnStandardDatetimeJsonOptions);
-                }
+                dto.IsSuccess = false;
+                dto.SendTimes = 1;
+                await _taskRepository.UpdateAsync(dto, HttpContext.RequestAborted);
             }
-            //await _pusherProviderService.SendProvinceDataPusher(dto, HttpContext.RequestAborted);
+            // await _pusherProviderService.SendProvinceDataPusher(dto, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -152,7 +152,7 @@ namespace DataSharing.Host.Controllers
             var dto = await _taskRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
             if (dto != null)
             {
-                dto.IsSuccess = true;
+                dto.SendTimes = 7;
                 await _taskRepository.UpdateAsync(dto, HttpContext.RequestAborted);
             }
         }
@@ -160,14 +160,19 @@ namespace DataSharing.Host.Controllers
         /// <summary>
         /// 查询工单及时上传列表
         /// </summary>
-        /// <param name="StartDate"></param>
-        /// <param name="EndDate"></param>
-        /// <param name="Type">查询类型:1查及时上传,其他查未及时</param>
+        /// <param name="dto"></param>
         /// <returns></returns>
         [HttpGet("getorderlist")]
         [AllowAnonymous]
         public async Task<PagedDto<DsOrder>> GetOrderlist([FromQuery] QuerySendTaskDto dto)
         {
+            if (!dto.StartTime.HasValue)
+                dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
+            if (!dto.EndTime.HasValue)
+                dto.EndTime = dto.StartTime.Value.AddDays(1).AddSeconds(-1);
+            else
+                dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
             //数据查询
             RefAsync<int> total = 0;
             var items = await _dsOrderRepository.Queryable()
@@ -198,7 +203,8 @@ namespace DataSharing.Host.Controllers
                     p.HotspotSpliceName,
                     p.ExpiredTime,
                     p.CaseType,
-                    p.CaseTypeCode
+                    p.CaseTypeCode,
+                    p.CreationTime
                 })
                 .MergeTable()
                 .Select(p => new
@@ -225,10 +231,12 @@ namespace DataSharing.Host.Controllers
                     p.HotspotSpliceName,
                     p.ExpiredTime,
                     p.CaseType,
-                    p.CaseTypeCode
+                    p.CaseTypeCode,
+                    p.CreationTime
                 })
-                .WhereIF(dto.type == "1", p => SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) <= 180)
-                .WhereIF(dto.type != "1", p => SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) > 180)
+                .WhereIF(dto.IsSuccess.HasValue && dto.IsSuccess == true, p => SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) <= 180)//及时上传
+                .WhereIF(dto.IsSuccess.HasValue && dto.IsSuccess == false, p => SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) > 180)//不及时上传
+                 .OrderByDescending(p => p.CreationTime)
                 .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
             return new PagedDto<DsOrder>(total, _mapper.Map<IReadOnlyList<DsOrder>>(items));
         }
@@ -236,14 +244,19 @@ namespace DataSharing.Host.Controllers
         /// <summary>
         /// 查询通话记录及时上传列表
         /// </summary>
-        /// <param name="StartDate"></param>
-        /// <param name="EndDate"></param>
-        /// <param name="Type">查询类型:1查及时上传,其他查未及时</param>
+        /// <param name="dto"></param>
         /// <returns></returns>
         [HttpGet("getcalllist")]
         [AllowAnonymous]
         public async Task<PagedDto<DsTelCall>> GetCalllist([FromQuery] QuerySendTaskDto dto)
         {
+            if (!dto.StartTime.HasValue)
+                dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
+            if (!dto.EndTime.HasValue)
+                dto.EndTime = dto.StartTime.Value.AddDays(1).AddSeconds(-1);
+            else
+                dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
             RefAsync<int> total = 0;
             var items = await _dsTelCallRepository.Queryable()
                 .Where(p => p.CreationTime >= dto.StartTime && p.CreationTime <= dto.EndTime)
@@ -273,8 +286,8 @@ namespace DataSharing.Host.Controllers
                     p.ProvinceNo,
                     p.FirstSendProvinceTime,
                     p.LastSendProvinceTime,
-                    p.TaskId
-
+                    p.TaskId,
+                    p.CreationTime
                 })
                 .MergeTable()
                 .Select(p => new
@@ -301,11 +314,13 @@ namespace DataSharing.Host.Controllers
                     p.ProvinceNo,
                     p.FirstSendProvinceTime,
                     p.LastSendProvinceTime,
-                    p.TaskId
+                    p.TaskId,
+                    p.CreationTime
 
                 })
-                .WhereIF(dto.type == "1", p => SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) <= 180)
-                .WhereIF(dto.type != "1", p => SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) > 180)
+                .WhereIF(dto.IsSuccess.HasValue && dto.IsSuccess == true, p => SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) <= 180)//及时
+                .WhereIF(dto.IsSuccess.HasValue && dto.IsSuccess == false, p => SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) > 180)//不及时
+                .OrderByDescending(p => p.CreationTime)
                 .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
             return new PagedDto<DsTelCall>(total, _mapper.Map<IReadOnlyList<DsTelCall>>(items));
 
@@ -314,24 +329,30 @@ namespace DataSharing.Host.Controllers
         /// <summary>
         /// 查询没匹配到通话记录的电话来源工单
         /// </summary>
-        /// <param name="StartDate"></param>
-        /// <param name="EndDate"></param>
+        /// <param name="dto"></param>
         /// <returns></returns>
         [HttpGet("getordermatchingcall")]
         [AllowAnonymous]
-        public async Task<List<DsOrder>> GetOrderMatchingCall(DateTime StartDate, DateTime EndDate)
+        public async Task<PagedDto<DsOrder>> GetOrderMatchingCall([FromQuery] QuerySendTaskDto dto)
         {
-            EndDate = EndDate.AddDays(1).AddSeconds(-1);
+            if (!dto.StartTime.HasValue)
+                dto.StartTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
+            if (!dto.EndTime.HasValue)
+                dto.EndTime = dto.StartTime.Value.AddDays(1).AddSeconds(-1);
+            else
+                dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+            RefAsync<int> total = 0;
 
             var items = await _dsOrderRepository.Queryable()
-                .LeftJoin<DsTelCall>((p, o) => p.ProvinceNo == o.ProvinceNo)
-                .Where((p, o) => p.CreationTime >= StartDate && p.CreationTime <= EndDate)
-                .Where((p, o) => p.CaseSourceCode == "RGDH")
+                .LeftJoin<DsTelCall>((p, o) => p.CallId == o.CallId)
+                .Where((p, o) => p.FirstSendProvinceTime >= dto.StartTime && p.FirstSendProvinceTime <= dto.EndTime && p.CaseSourceCode == "RGDH")
                 .Where((p, o) => p.FirstSendProvinceTime.HasValue)
-                .Where((p, o) => o.ProvinceNo == null)
-                .ToListAsync();
+                .Where((p, o) => o.CallId == null)
+                .OrderByDescending((p, o) => p.CreationTime)
+               .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
 
-            return items;
+            return new PagedDto<DsOrder>(total, _mapper.Map<IReadOnlyList<DsOrder>>(items));
         }
 
         /// <summary>
@@ -344,10 +365,14 @@ namespace DataSharing.Host.Controllers
         [AllowAnonymous]
         public async Task<CalculateUploadRateDto> CalculateUploadRate(DateTime StartDate, DateTime EndDate)
         {
+            EndDate = EndDate.AddDays(1).AddSeconds(-1);
+
+            CalculateUploadRateDto calculateUploadRateDto = new();
+
             //工单
             var orderRate = await _dsOrderRepository.Queryable()
-                   .LeftJoin<DsTelCall>((p, o) => p.ProvinceNo == o.ProvinceNo)
-                    .Where((p, o) => p.CreationTime >= StartDate && p.CreationTime <= EndDate)
+                   .LeftJoin<DsTelCall>((p, o) => p.CallId == o.CallId)
+                    .Where((p, o) => p.CreationTime >= StartDate && p.CreationTime <= EndDate && p.FirstSendProvinceTime >= StartDate && p.FirstSendProvinceTime <= EndDate)
                     .Where((p, o) => p.FirstSendProvinceTime.HasValue)
                     .Where((p, o) => p.StartTime.HasValue)
                     .Select((p, o) => new
@@ -356,7 +381,10 @@ namespace DataSharing.Host.Controllers
                         p.StartTime,
                         p.FirstSendProvinceTime,
                         p.CaseSourceCode,
-                        o.ProvinceNo
+                        o.CallId,
+                        p.HandleState,
+                        p.ExpiredTime,
+                        p.ActualHandleTime
                     }).MergeTable()
                     .Select(p => new CalculateUploadRateDto
                     {
@@ -365,33 +393,76 @@ namespace DataSharing.Host.Controllers
                         OrderNotTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.StartTime.Value, p.FirstSendProvinceTime.Value) > 180, 1, 0)),//为及时
 
                         RGDHOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH", 1, 0)),
-                        ContainTel = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH" && p.ProvinceNo != null, 1, 0)),//匹配数
-                        NotContainTel = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH" && p.ProvinceNo == null, 1, 0)),//未匹配数
+                        ContainTel = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH" && p.CallId != null, 1, 0)),//匹配数
+                        NotContainTel = SqlFunc.AggregateSum(SqlFunc.IIF(p.CaseSourceCode == "RGDH" && p.CallId == null, 1, 0)),//未匹配数
+
+                        HandleEndOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.HandleState == "办理完成", 1, 0)),//办结件数
+                        HandleEndOrderOnTime = SqlFunc.AggregateSum(SqlFunc.IIF(p.HandleState == "办理完成" && p.ExpiredTime < p.ActualHandleTime, 1, 0)),//按时办结件数
                     })
                     .ToListAsync();
 
             ///电话
             var callRate = await _dsTelCallRepository.Queryable()
-              .Where(p => p.CreationTime >= StartDate && p.CreationTime <= EndDate)
+              .Where(p => p.OverTime >= StartDate && p.OverTime <= EndDate && p.FirstSendProvinceTime >= StartDate && p.FirstSendProvinceTime <= EndDate)
               .Where(p => p.FirstSendProvinceTime.HasValue)
               .Where(p => p.OverTime.HasValue)
               .Select(p => new
               {
                   p.CallId,
                   p.OverTime,
-                  p.FirstSendProvinceTime
+                  p.FirstSendProvinceTime,
+                  p.OnState
               })
               .MergeTable()
                .Select(p => new CalculateUploadRateDto
                {
-                   TelCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.CallId != null, 1, 0)),//总工单
+                   TelCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.CallId != null, 1, 0)),//总电话
                    TelTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) <= 180, 1, 0)),//及时
                    TelNotTimely = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.DateDiff(DateType.Second, p.OverTime.Value, p.FirstSendProvinceTime.Value) > 180, 1, 0)),//为及时
+                   TelConnectCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.OnState == "1", 1, 0)),//接通数量
+                   TelNotConnectCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.OnState != "1", 1, 0)),//未接通数量
+
                })
                .ToListAsync();
 
-            CalculateUploadRateDto calculateUploadRateDto = new CalculateUploadRateDto();
+            //回访
+            var visitList = await _dsOrderVisitSendRepository.Queryable()
+                .Where(p => p.VisitTime >= StartDate && p.VisitTime <= EndDate && p.IsProvince == false && p.FirstSendProvinceTime >= StartDate && p.FirstSendProvinceTime <= EndDate)
+                .Select(p => new
+                {
+                    p.SubjectResultSatifyCode,
+                    p.VisitTime,
+                    p.IsProvince,
+                    p.Source,
+                    p.ProvinceNo
+                })
+                .MergeTable()
+                .Select(p => new CalculateUploadRateDto
+                {
+                    VisitCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.SubjectResultSatifyCode != null, 1, 0)),//回访总量
+                    SatisfactionCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.SubjectResultSatifyCode != null && p.SubjectResultSatifyCode != "2", 1, 0)),//满意数量
+                    NotSatisfiedCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(p.SubjectResultSatifyCode != null && p.SubjectResultSatifyCode == "2", 1, 0)),//不满意数量
+                })
+                .ToListAsync();
+
+            //查询知识总量
+            calculateUploadRateDto.KnowledgeCount = await _knowledgeRawDataRepository.Queryable()
+                       .Where(p => p.CreationTime >= StartDate && p.CreationTime <= EndDate)
+                       .CountAsync();
+
+            //修改知识库量-以第一次上传成功的记录为准
+            calculateUploadRateDto.UpdateKnowledgeCount = await _taskRepository.Queryable()
+                .Where(p => p.FirstTime >= StartDate && p.FirstTime <= EndDate && p.TaskType == "GetKnowledgeInfoUpdate")
+                .Select(p => new
+                {
+                    p.Id,
+                    RowID = SqlFunc.RowNumber($"{p.CreationTime} asc ")
+                })
+                .MergeTable()
+                .Where(p => p.RowID == 1)
+                .CountAsync();
 
+            //工单
             if (orderRate != null && orderRate.Count > 0)
             {
                 var orderRateData = orderRate[0];
@@ -401,19 +472,34 @@ namespace DataSharing.Host.Controllers
                 calculateUploadRateDto.RGDHOrderCount = orderRateData.RGDHOrderCount;
                 calculateUploadRateDto.ContainTel = orderRateData.ContainTel;
                 calculateUploadRateDto.NotContainTel = orderRateData.NotContainTel;
+                calculateUploadRateDto.HandleEndOrderNum = orderRateData.HandleEndOrderNum;
+                calculateUploadRateDto.HandleEndOrderOnTime = orderRateData.HandleEndOrderOnTime;
             }
 
+            //电话
             if (callRate != null && callRate.Count > 0)
             {
                 var callRateData = callRate[0];
                 calculateUploadRateDto.TelCountNum = callRateData.TelCountNum;
                 calculateUploadRateDto.TelTimely = callRateData.TelTimely;
                 calculateUploadRateDto.TelNotTimely = callRateData.TelNotTimely;
+                calculateUploadRateDto.TelConnectCountNum = callRateData.TelConnectCountNum;
+                calculateUploadRateDto.TelNotConnectCountNum = callRateData.TelNotConnectCountNum;
             }
 
+            //回访
+            if (visitList != null && visitList.Count > 0)
+            {
+                var visitRateData = visitList[0];
+                calculateUploadRateDto.VisitCountNum = visitRateData.VisitCountNum;
+                calculateUploadRateDto.SatisfactionCountNum = visitRateData.SatisfactionCountNum;
+                calculateUploadRateDto.NotSatisfiedCountNum = visitRateData.NotSatisfiedCountNum;
+            }
             return calculateUploadRateDto;
         }
 
+        #endregion
+
         #region 系统配置
 
         /// <summary>
@@ -459,5 +545,39 @@ namespace DataSharing.Host.Controllers
             }
         }
         #endregion
+
+        /// <summary>
+        /// 对接平台用户管理
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("adduserinfo")]
+        [AllowAnonymous]
+        public async Task AddUserInfo([FromBody] AddUserInfoDto dto)
+        {
+            var tokenInfo = _mapper.Map<DsUserTokenInfo>(dto);
+            if (string.IsNullOrEmpty(tokenInfo.AuthIP))
+                tokenInfo.AuthIP = "*";
+            await _dsUserTokenInfoRepository.AddAsync(tokenInfo, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 查询对接平台用户信息
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get-user-info-list")]
+        [AllowAnonymous]
+        public async Task<PagedDto<DsUserTokenInfo>> GetUserInfoList([FromQuery] PagedKeywordRequest dto)
+        {
+            RefAsync<int> total = 0;
+            var items = await _dsUserTokenInfoRepository.Queryable()
+                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), p => p.PlatformSourceName.Contains(dto.Keyword))
+                  .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
+
+            return new PagedDto<DsUserTokenInfo>(total, items);
+
+        }
+
     }
 }

+ 256 - 0
src/DataSharing.Host/Controllers/OtherPlatformsYBController.cs

@@ -0,0 +1,256 @@
+using DataSharing.Common;
+using DataSharing.ConvergenceMedia;
+using DataSharing.FwDataExchange;
+using DataSharing.RawData;
+using DataSharing.Share.Dtos;
+using DataSharing.Share.Dtos.Common;
+using DataSharing.Share.Dtos.HotlineSetting;
+using DataSharing.Share.Dtos.OtherPlatformsYB;
+using DotNetCore.CAP;
+using MapsterMapper;
+using MediatR;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using XF.Domain.Filters;
+using XF.Domain.Repository;
+
+namespace DataSharing.Host.Controllers
+{
+    /// <summary>
+    /// 智慧宜宾
+    /// </summary>
+    public class OtherPlatformsYBController : BaseDataController
+    {
+        private readonly IMapper _mapper;
+        private readonly IMediator _mediator;
+        private readonly ICapPublisher _capPublisher;
+        private readonly IRepository<DsOrder> _dataOrderRepository;
+        private readonly IRepository<DsOrderWorkFlow> _dataOrderWorkFlowRepository;
+        private readonly IRepository<DsReceiveMediaData> _dsReceiveMediaDataRepository;
+        private readonly IRepository<DsUserTokenInfo> _dsUserTokenInfoRepository;
+        private readonly FwClient _fwClient;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="mapper"></param>
+        /// <param name="mediator"></param>
+        /// <param name="capPublisher"></param>
+        /// <param name="dataOrderRepository"></param>
+        /// <param name="dataOrderWorkFlowRepository"></param>
+        /// <param name="dsReceiveMediaDataRepository"></param>
+        /// <param name="dsUserTokenInfoRepository"></param>
+        /// <param name="fwClient"></param>
+        public OtherPlatformsYBController(IMapper mapper, IMediator mediator,
+            ICapPublisher capPublisher,
+            IRepository<DsOrder> dataOrderRepository,
+            IRepository<DsOrderWorkFlow> dataOrderWorkFlowRepository,
+            IRepository<DsReceiveMediaData> dsReceiveMediaDataRepository,
+            IRepository<DsUserTokenInfo> dsUserTokenInfoRepository,
+            FwClient fwClient)
+        {
+            _mapper = mapper;
+            _mediator = mediator;
+            _capPublisher = capPublisher;
+            _dataOrderRepository = dataOrderRepository;
+            _dataOrderWorkFlowRepository = dataOrderWorkFlowRepository;
+            _dsReceiveMediaDataRepository = dsReceiveMediaDataRepository;
+            _dsUserTokenInfoRepository = dsUserTokenInfoRepository;
+            _fwClient = fwClient;
+        }
+
+        /// <summary>
+        /// 2.3.1查询受理类型
+        /// </summary>
+        /// <param name="strVailCode"></param>
+        /// <returns></returns>
+        [HttpPost("e_GetTypeID")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetAcceptType([FromForm] string strVailCode)
+        {
+            var accountDto = await CheckAccountAsync(strVailCode);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("密钥错误", "-900"));
+            List<AcceptTypeListDto> acceptTypeListDtos = new()
+            {
+                new() { Name = "咨询", Value = "10" },
+                new() { Name = "建议", Value = "15" },
+                new() { Name = "求助", Value = "20" },
+                new() { Name = "表扬", Value = "25" },
+                new() { Name = "举报", Value = "30" },
+                new() { Name = "投诉", Value = "35" },
+                new() { Name = "其他", Value = "40" },
+                new() { Name = "意见", Value = "1" },
+                new() { Name = "惠民帮助", Value = "2" },
+                new() { Name = "大气污染举报", Value = "3" }
+            };
+
+            return OpenResponse.Ok(OtherPlatformsDeResponse<List<AcceptTypeListDto>>.Success(acceptTypeListDtos));
+        }
+
+        /// <summary>
+        /// 2.3.2网上写信
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("e_WriteInfo")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> WriteInfo([FromForm] AddWriteInfoDto dto)
+        {
+            var accountDto = await CheckAccountAsync(dto.strVailCode);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("密钥错误", "-900"));
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed(strResult, "0"));
+
+            //写入原始数据
+            DsReceiveMediaData dsReceiveMediaData = new()
+            {
+                ServiceInterface = "e_WriteInfo",
+                PlatformsName= accountDto.PlatformSource,
+                ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto)
+            };
+            dsReceiveMediaData.Id = await _dsReceiveMediaDataRepository.AddAsync(dsReceiveMediaData, HttpContext.RequestAborted);
+
+            Hotline.Share.Dtos.Order.AddOrderDto data = new()
+            {
+                Title = dto.strTitle,
+                FromName = dto.strUserName,
+                Contact = dto.strPhone,
+                FullAddress = dto.strAddress,
+                Content = dto.strContent,
+                IsSecret = false,
+                AcceptTypeCode = dto.strTypeID,
+                Source = (Hotline.Share.Enums.Order.ESource)Enum.Parse(typeof(Hotline.Share.Enums.Order.ESource), accountDto.PlatformSource),
+                FromGender = dto.strGender switch
+                {
+                    "1" => Hotline.Share.Enums.Order.EGender.Male,
+                    "2" => Hotline.Share.Enums.Order.EGender.Female,
+                    _ => Hotline.Share.Enums.Order.EGender.Unknown,
+                },
+                IdentityType = Hotline.Share.Enums.Order.EIdentityType.Citizen,
+                Transpond = false,
+                IsEnforcementOrder = false,
+                ExternalId = Guid.NewGuid().ToString(),
+            };
+
+            data.SourceChannel = "智慧宜宾";
+            data.SourceChannelCode = "ZHYB";
+
+            //调用工单创建接口
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/add-anonymous", "Post", System.Text.Json.JsonSerializer.Serialize(data));
+            if (result != null && result.code == 0)
+            {
+                dsReceiveMediaData.ExternalId = result.result.id;
+                dsReceiveMediaData.OrderCode = result.result.no;
+                await _dsReceiveMediaDataRepository.UpdateAsync(dsReceiveMediaData, HttpContext.RequestAborted);
+
+                List<WriteInfoReturnDto> returnData = new()
+                {
+                    new WriteInfoReturnDto() { LetterCode = result.result.no, LetterPwd = result.result.password }
+                };
+                return OpenResponse.Ok(OtherPlatformsDeResponse<List<WriteInfoReturnDto>>.Success(returnData));
+            }
+            else
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("接口调用失败!", "0"));
+
+        }
+
+        /// <summary>
+        /// 2.3.3查询办理进度
+        /// </summary>
+        /// <param name=""></param>
+        /// <returns></returns>
+        [HttpPost("e_GetFlowInfo")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetFlowInfo([FromForm] GetFlowDetailDto dto)
+        {
+            var accountDto = await CheckAccountAsync(dto.strVailCode);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("密钥错误", "-900"));
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed(strResult, "0"));
+
+            var dataOrder = await _dsReceiveMediaDataRepository.GetAsync(p => p.OrderCode == dto.strCode, HttpContext.RequestAborted);
+            if (dataOrder == null)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("编号或密码错误", "0"));
+
+            var data = await _dataOrderRepository.GetAsync(p => p.OrderId == dataOrder.ExternalId, HttpContext.RequestAborted);
+            if (data == null)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("信件正在受理中", "0"));
+
+            var dataFlow = await _dataOrderWorkFlowRepository.Queryable()
+                .Where(p => p.OrderId == dataOrder.ExternalId)
+                .OrderBy(p => p.CreationTime)
+                .ToListAsync();
+            var list = _mapper.Map<List<GetFlowInfoReturnDto>>(dataFlow);
+
+            if (list != null && list.Count > 0 && data.HandleState == "办理完成")
+                list[list.Count - 1].AcceptEnd = "1";
+            return OpenResponse.Ok(OtherPlatformsDeResponse<List<GetFlowInfoReturnDto>>.Success(list));
+        }
+
+        /// <summary>
+        /// 2.3.4查询办理结果
+        /// </summary>
+        /// <param name=""></param>
+        /// <returns></returns>
+        [HttpPost("e_GetFlowDetail")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetFlowDetail([FromForm] GetFlowDetailDto dto)
+        {
+            var accountDto = await CheckAccountAsync(dto.strVailCode);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("密钥错误", "-900"));
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed(strResult, "0"));
+
+            var dataOrder = await _dsReceiveMediaDataRepository.GetAsync(p => p.OrderCode == dto.strCode, HttpContext.RequestAborted);
+            if (dataOrder == null)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("编号或密码错误", "0"));
+
+            var data = await _dataOrderRepository.GetAsync(p => p.OrderId == dataOrder.ExternalId, HttpContext.RequestAborted);
+            if (data == null)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("信件正在受理中", "0"));
+
+            GetFlowDetailReturnDto getFlowDetailReturn = new()
+            {
+                state = data.HandleState == "办理完成" ? "1" : "0",
+                content = data.ActualOpinion,
+                AcceptName = data.ActualHandleOrgName,
+                AcceptUser = data.ActualHandlerName,
+                AcceptDate = data.ActualHandleTime
+            };
+            return OpenResponse.Ok(OtherPlatformsDeResponse<GetFlowDetailReturnDto>.Success(getFlowDetailReturn));
+        }
+
+        /// <summary>
+        /// 验证密钥
+        /// </summary>
+        /// <param name="Code"></param>
+        /// <returns></returns>
+        private async Task<CheckAccountDto> CheckAccountAsync(string Code)
+        {
+            CheckAccountDto accountDto = new() { IsCheckAccount = false };
+            var data = await _dsUserTokenInfoRepository.GetAsync(p => p.AccountId == Code && p.State == "1", HttpContext.RequestAborted);
+            if (data is not null)
+            {
+                accountDto.PlatformSource = data.PlatformSource;
+                accountDto.IsCheckAccount = true;
+                return accountDto;
+            }
+
+            accountDto.Message = "授权账号或密码验证不通过";
+            return accountDto;
+        }
+    }
+}

+ 1 - 1
src/DataSharing.Host/Controllers/PoliceDSController.cs

@@ -140,7 +140,7 @@ namespace DataSharing.Host.Controllers
                             Content = chainAlarm.CallPoliceContent,
                             IncidentTime = Convert.ToDateTime(chainAlarm.CallPoliceTime),
                             AreaCode = chainAlarm.AreaCode,
-                            Street = chainAlarm.CallPoliceAddress,
+                            FullAddress = chainAlarm.CallPoliceAddress,
                             SourceChannel = "宜宾110平台",
                             SourceChannelCode = "YB110",
                             Source = ESource.Police110,

+ 39 - 73
src/DataSharing.Host/Controllers/ProvinceController.cs

@@ -9,7 +9,6 @@ using DotNetCore.CAP;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.Order;
-using Hotline.Share.Enums.Order;
 using MapsterMapper;
 using MediatR;
 using Microsoft.AspNetCore.Mvc;
@@ -250,7 +249,8 @@ namespace DataSharing.Host.Controllers
                     Id = data.OrderSendBackId,
                     Reason = dto.BackReason,
                     Result = dto.Result == "1" ? 1 : 0,
-                    Source = "province"
+                    Source = "province",
+                    Files = await GetFileData(dto.CliengGuid, dto.CaseSerial, "工单退回审核")
                 };
                 //向业务系统推送消息
                 await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderReturnFeedback, dataBack, cancellationToken: HttpContext.RequestAborted);
@@ -338,7 +338,7 @@ namespace DataSharing.Host.Controllers
             if (!string.IsNullOrEmpty(id))
             {
                 var data = _mapper.Map<ProvinceOrderUrgeDto>(dto);
-
+                data.DsBisId = dto.CliengGuid;
                 data.Files = await GetFileData(dto.CliengGuid, dto.CaseSerial, "工单催单");
 
                 //向业务系统推送消息
@@ -384,6 +384,7 @@ namespace DataSharing.Host.Controllers
                 ProvinceSendScreenResultDto screenResultDto = new ProvinceSendScreenResultDto()
                 {
                     ProvinceScreenResult = _mapper.Map<ProvinceScreenResult>(dto),
+                    Source = "province",
                     Files = await GetFileData(dto.CliengGuid, dto.CaseSerial, "工单甄别结果")
                 };
 
@@ -481,10 +482,11 @@ namespace DataSharing.Host.Controllers
                 if (dataOrder != null)
                 {
                     var listFiles = await GetFileData(dto.CliengGuid, dto.CaseSerial, "工单补充");
-                    OrderComplementDto complementDto = new OrderComplementDto
+                    AddOrderComplementDto complementDto = new AddOrderComplementDto
                     {
                         Opinion = dto.SupplyContent,
                         OrderId = dataOrder.OrderId,
+                        DsBisId = dto.CliengGuid,
                         Files = listFiles
                     };
                     //向业务系统推送消息
@@ -532,7 +534,7 @@ namespace DataSharing.Host.Controllers
                 {
                     Opinion = dto.RevokeReasion,
                     ProvinceNo = dto.CaseSerial,
-                    Source= "province"
+                    Source = "province"
                 };
                 //向业务系统推送消息
                 await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderRevoke, cancelOrder, cancellationToken: HttpContext.RequestAborted);
@@ -879,7 +881,7 @@ namespace DataSharing.Host.Controllers
             }
             //  @params = "{ \"token\": \"\", \"paras\":{ \"CaseSerial\":\"RGDH99511500240304000100\", \"MaterialType\":\"10\", \"CliengGuid\":\"91541fea-e1a5-4798-bc43-b25cc77ec6b7\", \"AreaCode\":\"511500\"} }";
             // 解析附件信息
-            var vmCaseMaterialInfo = System.Text.Json.JsonSerializer.Deserialize<GetCaseMaterialInfoRequest>(@params);//Newtonsoft.Json.JsonConvert.DeserializeObject<GetCaseMaterialInfoRequest>(@params);
+            var vmCaseMaterialInfo = System.Text.Json.JsonSerializer.Deserialize<GetCaseMaterialInfoRequest>(@params);
             if (vmCaseMaterialInfo is null || vmCaseMaterialInfo.paras is null)
             {
                 return OpenResponse.Ok(GetDataBaseReponse<string>.Failed("数据解析失败"));
@@ -908,8 +910,8 @@ namespace DataSharing.Host.Controllers
                 var businessFileDto = await SendFileData(file);
 
                 string strFileName = file.FileName;
-                string strSuffix = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(strFileName.LastIndexOf(".")) : "";
-
+                string strSuffix = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(strFileName.LastIndexOf(".") + 1) : "";
+                string strSubFileName = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(0, strFileName.LastIndexOf(".")) : strFileName;
                 // 新增文件到列表
                 var materialInfo = new DsGetCaseMaterialInfo()
                 {
@@ -917,7 +919,7 @@ namespace DataSharing.Host.Controllers
                     MaterialType = tmpCaseMaterialInfo.MaterialType,
                     CliengGuid = tmpCaseMaterialInfo.CliengGuid,
                     AreaCode = tmpCaseMaterialInfo.AreaCode,
-                    FileName = file.FileName,
+                    FileName = strSubFileName,
                     Type = strSuffix.Trim('.'),
                     Additions = businessFileDto.id,
                     Path = businessFileDto.path,
@@ -937,79 +939,48 @@ namespace DataSharing.Host.Controllers
                 {
                     List<FileDto> listFiles = new();
 
+                    ReceiveFilesFromDsDto receiveFilesFromDsDto = new ReceiveFilesFromDsDto()
+                    {
+                        DsBisId = tmpCaseMaterialInfo.CliengGuid,
+                        ProvinceNo = tmpCaseMaterialInfo.CaseSerial
+                    };
+
                     //根据接口处理数据
                     switch (receiveData.ServiceInterface)
                     {
                         case "receive_case_info":
                             listFiles = await InitFileData(listData, "工单受理");
-                            AddOrderDto addOrder = new()
-                            {
-                                ProvinceNo = tmpCaseMaterialInfo.CaseSerial,
-                                Files = listFiles,
-                                Source= ESource.ProvinceStraight
-                            };
-                            await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/add-anonymous", "Post", System.Text.Json.JsonSerializer.Serialize(addOrder));
+                            receiveFilesFromDsDto.DsBisType = EDsBisType.AcceptOrder;
+
                             break;
                         case "get_case_back_result":
-                            var data = await _getCaseBackApplyRepository.GetAsync(p => p.CaseSerial == tmpCaseMaterialInfo.CaseSerial, HttpContext.RequestAborted);
-                            if (data != null)
-                            {
-                                listFiles = await InitFileData(listData, "工单退回审核");
-                                //向业务系统推送消息
-                                await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderReturnFeedback, new OrderSendBackResultDto() { Id = data.OrderSendBackId, Source = "province" }, cancellationToken: HttpContext.RequestAborted);
-                            }
+                            listFiles = await InitFileData(listData, "工单退回审核");
+                            receiveFilesFromDsDto.DsBisType = EDsBisType.OrderPreviousResult;
 
                             break;
                         case "send_supervise_info":
-                            listFiles = await InitFileData(listData, "督办工单派发");
-                            ProvinceSendOrderSuperviseDto orderSuperviseDto = new ProvinceSendOrderSuperviseDto()
-                            {
-                                ProvinceOrderSuperviseDto = new() { CaseSerial = tmpCaseMaterialInfo.CaseSerial },
-                                Files = listFiles
-                            };
-                            //向业务系统推送消息
-                            await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderSupervise, orderSuperviseDto, cancellationToken: HttpContext.RequestAborted);
+                            listFiles = await InitFileData(listData, "督办申请");
+                            receiveFilesFromDsDto.DsBisType = EDsBisType.SendOrderSupervise;
+                            receiveFilesFromDsDto.SuperviseId = tmpCaseMaterialInfo.CaseSerial;
 
                             break;
                         case "remind_case_info":
-                            listFiles = await InitFileData(listData, "工单催单");
-
-                            //向业务系统推送消息
-                            await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderRemind, new ProvinceOrderUrgeDto() { CaseSerial = tmpCaseMaterialInfo.CaseSerial, Files=listFiles }, cancellationToken: HttpContext.RequestAborted);
+                            listFiles = await InitFileData(listData, "催办申请");
+                            receiveFilesFromDsDto.DsBisType = EDsBisType.SendOrderUrge;
 
                             break;
                         case "screen_case_result_receive":
-                            listFiles = await InitFileData(listData, "工单甄别结果");
-                            ProvinceSendScreenResultDto screenResultDto = new ProvinceSendScreenResultDto()
-                            {
-                                ProvinceScreenResult = new() { CaseSerial = tmpCaseMaterialInfo.CaseSerial },
-                                Files = listFiles
-                            };
-                            //向业务系统推送消息
-                            await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderScreen, screenResultDto, cancellationToken: HttpContext.RequestAborted);
-
+                            listFiles = await InitFileData(listData, "甄别上传");
+                            receiveFilesFromDsDto.DsBisType = EDsBisType.OrderScreenResult;
                             break;
                         case "delay_case_result_receive":
-                            listFiles = await InitFileData(listData, "工单延期审核结果");
-                            ProvinceSendDelayResultDto delayResultDto = new()
-                            {
-                                No = tmpCaseMaterialInfo.CaseSerial,
-                                Source = "province",
-                                Files = listFiles
-                            };
-                            //向业务系统推送消息
-                            await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderDelayResult, delayResultDto, cancellationToken: HttpContext.RequestAborted);
+                            listFiles = await InitFileData(listData, "延期上传");
+                            receiveFilesFromDsDto.DsBisType = EDsBisType.OrderDelayResult;
 
                             break;
                         case "supply_case_info_receive":
-                            listFiles = await InitFileData(listData, "工单补充");
-                            OrderComplementDto complementDto = new OrderComplementDto
-                            {
-                                OrderId = "",
-                                Files = listFiles
-                            };
-                            //向业务系统推送消息
-                            await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderSupplements, complementDto, cancellationToken: HttpContext.RequestAborted);
+                            listFiles = await InitFileData(listData, "补充上传");
+                            receiveFilesFromDsDto.DsBisType = EDsBisType.SendOrderComplement;
 
                             break;
                         case "revoke_case_info":
@@ -1025,25 +996,19 @@ namespace DataSharing.Host.Controllers
                             break;
                         case "get_case_result_send":
                             listFiles = await InitFileData(listData, "办理上传");
-                            var dataOrder = await _dataOrderRepository.GetAsync(p => p.ProvinceNo == tmpCaseMaterialInfo.CaseSerial, HttpContext.RequestAborted);
-                            OrderResultDto orderResult = new()
-                            {
-                                OrderId = dataOrder.OrderId,
-                                Files = listFiles,
-                                Source = "province"
-                            };
-
-                            //向业务系统推送消息
-                            await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderReultSend, orderResult, cancellationToken: HttpContext.RequestAborted);
+                            receiveFilesFromDsDto.DsBisType = EDsBisType.OrderHandleResult;
 
                             break;
                         case "get_visit_info_send":
                             // listFiles = await InitFileData(listData, "上报工单评价");
-
                             break;
                         default:
                             break;
                     }
+                    receiveFilesFromDsDto.Files = listFiles;
+                    //推送数据
+                    if (receiveFilesFromDsDto.Files != null && receiveFilesFromDsDto.Files.Count > 0)
+                        await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingFileInfo, receiveFilesFromDsDto, cancellationToken: HttpContext.RequestAborted);
                 }
             }
             return OpenResponse.Ok(GetDataBaseReponse<string>.Success("您已成功提交数据!"));
@@ -1062,9 +1027,10 @@ namespace DataSharing.Host.Controllers
             List<FileDto> fileDtos = new();
             foreach (var item in listData)
             {
+                string strSubFileName = item.FileName.LastIndexOf(".") > 0 ? item.FileName.Substring(0, item.FileName.LastIndexOf(".")) : item.FileName;
                 fileDtos.Add(new FileDto()
                 {
-                    Name = item.FileName,
+                    Name = strSubFileName,
                     Type = item.Type,
                     Classify = Classify,
                     Additions = item.Additions,

+ 2 - 17
src/DataSharing.Host/Controllers/WebPortalController.cs

@@ -477,11 +477,7 @@ namespace DataSharing.Host.Controllers
             data.IdentityType = Hotline.Share.Enums.Order.EIdentityType.Citizen;
             data.Transpond = false;
             data.IsEnforcementOrder = false;
-            //  await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderCreation, data, cancellationToken: HttpContext.RequestAborted);
-
-            //调用工单创建接口
-            // var result1 = await _hotlineClient.ReceiveOrderAsync(data, HttpContext.RequestAborted);
-
+           
             var result = await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/add-anonymous", "Post", System.Text.Json.JsonSerializer.Serialize(data));
 
             OrderAcceptanceReturnDto returnDto = new();
@@ -499,18 +495,7 @@ namespace DataSharing.Host.Controllers
             }
             else
                 returnDto.State = "0";
-            //OrderAcceptanceReturnDto returnDto = new()
-            //{
-            //    PWD = "12345",
-            //    Code = "12345",
-            //    State = "1"
-            //};
-
-            //dto.Pwd = "12345";
-            //dto.Code = "12345";
-            //dto.OrderId = "12345";
-            //await _webFlowAcceptRepository.AddAsync(dto, HttpContext.RequestAborted);
-
+            
             return OpenResponse.Ok(WebPortalDeResponse<OrderAcceptanceReturnDto>.Success(returnDto));
         }
 

+ 240 - 0
src/DataSharing.Host/Controllers/WllzYBController.cs

@@ -0,0 +1,240 @@
+using DataSharing.Common;
+using DataSharing.ConvergenceMedia;
+using DataSharing.FwDataExchange;
+using DataSharing.RawData;
+using DataSharing.Share.Dtos;
+using DataSharing.Share.Dtos.Common;
+using DataSharing.Share.Dtos.ConvergenceMedia;
+using DataSharing.Share.Dtos.HotlineSetting;
+using DataSharing.Share.Dtos.OtherPlatformsYB;
+using DotNetCore.CAP;
+using MapsterMapper;
+using MediatR;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using XF.Domain.Filters;
+using XF.Domain.Repository;
+
+namespace DataSharing.Host.Controllers
+{
+    /// <summary>
+    /// 网络理政
+    /// </summary>
+    public class WllzYBController : BaseDataController
+    {
+        private readonly IMapper _mapper;
+        private readonly IMediator _mediator;
+        private readonly ICapPublisher _capPublisher;
+        private readonly IRepository<DsOrder> _dataOrderRepository;
+        private readonly IRepository<DsReceiveMediaData> _dsReceiveMediaDataRepository;
+        private readonly IRepository<DsUserTokenInfo> _dsUserTokenInfoRepository;
+        private readonly FwClient _fwClient;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="mapper"></param>
+        /// <param name="mediator"></param>
+        /// <param name="capPublisher"></param>
+        /// <param name="dataOrderRepository"></param>
+        /// <param name="dsReceiveMediaDataRepository"></param>
+        /// <param name="dsUserTokenInfoRepository"></param>
+        /// <param name="fwClient"></param>
+        public WllzYBController(IMapper mapper, IMediator mediator,
+            ICapPublisher capPublisher,
+            IRepository<DsOrder> dataOrderRepository,
+            IRepository<DsReceiveMediaData> dsReceiveMediaDataRepository,
+            IRepository<DsUserTokenInfo> dsUserTokenInfoRepository,
+            FwClient fwClient)
+        {
+            _mapper = mapper;
+            _mediator = mediator;
+            _capPublisher = capPublisher;
+            _dataOrderRepository = dataOrderRepository;
+            _dsReceiveMediaDataRepository = dsReceiveMediaDataRepository;
+            _dsUserTokenInfoRepository = dsUserTokenInfoRepository;
+            _fwClient = fwClient;
+        }
+
+        /// <summary>
+        /// 1.3.1查询受理类型
+        /// </summary>
+        /// <param name="strVailCode"></param>
+        /// <returns></returns>
+        [HttpPost("e_GetTypeID")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetAcceptType([FromForm] string strVailCode)
+        {
+            var accountDto = await CheckAccountAsync(strVailCode);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("密钥错误", "-900"));
+            List<AcceptTypeListDto> acceptTypeListDtos = new()
+            {
+                new() { Name = "咨询", Value = "10" },
+                new() { Name = "建议", Value = "15" },
+                new() { Name = "求助", Value = "20" },
+                new() { Name = "表扬", Value = "25" },
+                new() { Name = "举报", Value = "30" },
+                new() { Name = "投诉", Value = "35" },
+                new() { Name = "其他", Value = "40" },
+                new() { Name = "意见", Value = "1" },
+                new() { Name = "惠民帮助", Value = "2" },
+                new() { Name = "大气污染举报", Value = "3" }
+            };
+
+            return OpenResponse.Ok(OtherPlatformsDeResponse<List<AcceptTypeListDto>>.Success(acceptTypeListDtos));
+        }
+
+        /// <summary>
+        ///1.3.2网上写信
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("e_WriteInfo")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> WriteInfo([FromForm] AddWriteInfoDto dto)
+        {
+            var accountDto = await CheckAccountAsync(dto.strVailCode);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("密钥错误", "-900"));
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed(strResult, "0"));
+
+            //写入原始数据
+            DsReceiveMediaData dsReceiveMediaData = new()
+            {
+                ServiceInterface = "e_WriteInfo",
+                PlatformsName = accountDto.PlatformSource,
+                // ExternalId = dto.strZZCode,
+                ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto)
+            };
+            dsReceiveMediaData.Id = await _dsReceiveMediaDataRepository.AddAsync(dsReceiveMediaData, HttpContext.RequestAborted);
+
+            Hotline.Share.Dtos.Order.AddOrderDto data = new()
+            {
+                Title = dto.strTitle,
+                FromName = dto.strUserName,
+                Contact = dto.strPhone,
+                FullAddress = dto.strAddress,
+                Content = dto.strContent,
+                IsSecret = false,
+                AcceptTypeCode = dto.strTypeID,
+                Source = (Hotline.Share.Enums.Order.ESource)Enum.Parse(typeof(Hotline.Share.Enums.Order.ESource), accountDto.PlatformSource),
+                FromGender = dto.strGender switch
+                {
+                    "1" => Hotline.Share.Enums.Order.EGender.Male,
+                    "2" => Hotline.Share.Enums.Order.EGender.Female,
+                    _ => Hotline.Share.Enums.Order.EGender.Unknown,
+                },
+                IdentityType = Hotline.Share.Enums.Order.EIdentityType.Citizen,
+                Transpond = false,
+                IsEnforcementOrder = false,
+                SourceChannel = "网络理政—市民中心大厅",
+                SourceChannelCode = "WLLZ"
+            };
+
+            //调用工单创建接口
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/add-anonymous", "Post", System.Text.Json.JsonSerializer.Serialize(data));
+            if (result != null && result.code == 0)
+            {
+                dsReceiveMediaData.ExternalId = result.result.id;
+                dsReceiveMediaData.OrderCode = result.result.no;
+                await _dsReceiveMediaDataRepository.UpdateAsync(dsReceiveMediaData, HttpContext.RequestAborted);
+
+                List<WriteInfoReturnDto> returnData = new()
+                {
+                    new WriteInfoReturnDto() { LetterCode = result.result.no, LetterPwd = result.result.password }
+                };
+                return OpenResponse.Ok(OtherPlatformsDeResponse<List<WriteInfoReturnDto>>.Success(returnData));
+            }
+            else
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("接口调用失败!", "0"));
+
+        }
+
+        /// <summary>
+        /// 1.3.3办件结果查询
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("e_OrderInfo")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetFlowInfo([FromForm] WllzGetOrderInfo dto)
+        {
+            var accountDto = await CheckAccountAsync(dto.strVailCode);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("密钥错误", "-900"));
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed(strResult, "0"));
+
+            //写入原始数据
+            DsReceiveMediaData dsReceiveMediaData = new()
+            {
+                ServiceInterface = "e_WriteResult",
+                PlatformsName = accountDto.PlatformSource,
+                ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto),
+                OrderCode = dto.strCodes,
+            };
+            await _dsReceiveMediaDataRepository.AddAsync(dsReceiveMediaData, HttpContext.RequestAborted);
+
+            string[] arrCode = dto.strCodes.Split(',');
+            if (arrCode == null || arrCode.Length == 0)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("工单编号错误", "0"));
+
+            List<WllzOrderInfoReturnDto> returnDtos = new();
+            foreach (var item in arrCode)
+            {
+                var itemOrder = await _dataOrderRepository.GetAsync(p => p.OrderNo == item, HttpContext.RequestAborted);
+                if (itemOrder != null)
+                {
+                    returnDtos.Add(new()
+                    {
+                        Code = itemOrder.OrderNo,
+                        State = itemOrder.HandleState,
+                        Ccontent = itemOrder.ActualOpinion,
+                        AcceptName = itemOrder.ActualHandleOrgName,
+                        AcceptDate = itemOrder.ActualHandleTime != null ? itemOrder.ActualHandleTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : ""
+                    });
+                }
+                else
+                {
+                    returnDtos.Add(new()
+                    {
+                        Code = item,
+                        State = "受理中",
+                        Ccontent = "",
+                        AcceptName = "热线中心",
+                        AcceptDate = ""
+                    });
+                }
+            }
+            return OpenResponse.Ok(OtherPlatformsDeResponse<List<WllzOrderInfoReturnDto>>.Success(returnDtos));
+        }
+
+        /// <summary>
+        /// 验证密钥
+        /// </summary>
+        /// <param name="Code"></param>
+        /// <returns></returns>
+        private async Task<CheckAccountDto> CheckAccountAsync(string Code)
+        {
+            CheckAccountDto accountDto = new() { IsCheckAccount = false };
+            var data = await _dsUserTokenInfoRepository.GetAsync(p => p.AccountId == Code && p.State == "1", HttpContext.RequestAborted);
+            if (data is not null)
+            {
+                accountDto.PlatformSource = data.PlatformSource;
+                accountDto.IsCheckAccount = true;
+                return accountDto;
+            }
+
+            accountDto.Message = "授权账号或密码验证不通过";
+            return accountDto;
+        }
+    }
+}

+ 251 - 0
src/DataSharing.Host/Controllers/ZzptYBController.cs

@@ -0,0 +1,251 @@
+using DataSharing.Common;
+using DataSharing.ConvergenceMedia;
+using DataSharing.FwDataExchange;
+using DataSharing.RawData;
+using DataSharing.Share.Dtos;
+using DataSharing.Share.Dtos.Common;
+using DataSharing.Share.Dtos.HotlineSetting;
+using DataSharing.Share.Dtos.OtherPlatformsYB;
+using DotNetCore.CAP;
+using MapsterMapper;
+using MediatR;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using XF.Domain.Filters;
+using XF.Domain.Repository;
+
+namespace DataSharing.Host.Controllers
+{
+    /// <summary>
+    /// 综治平台
+    /// </summary>
+    public class ZzptYBController : BaseDataController
+    {
+        private readonly IMapper _mapper;
+        private readonly IMediator _mediator;
+        private readonly ICapPublisher _capPublisher;
+        private readonly IRepository<DsOrder> _dataOrderRepository;
+        private readonly IRepository<DsReceiveMediaData> _dsReceiveMediaDataRepository;
+        private readonly IRepository<DsUserTokenInfo> _dsUserTokenInfoRepository;
+        private readonly FwClient _fwClient;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="mapper"></param>
+        /// <param name="mediator"></param>
+        /// <param name="capPublisher"></param>
+        /// <param name="dataOrderRepository"></param>
+        /// <param name="dsReceiveMediaDataRepository"></param>
+        /// <param name="dsUserTokenInfoRepository"></param>
+        /// <param name="fwClient"></param>
+        public ZzptYBController(IMapper mapper, IMediator mediator,
+            ICapPublisher capPublisher,
+            IRepository<DsOrder> dataOrderRepository,
+            IRepository<DsReceiveMediaData> dsReceiveMediaDataRepository,
+            IRepository<DsUserTokenInfo> dsUserTokenInfoRepository,
+            FwClient fwClient)
+        {
+            _mapper = mapper;
+            _mediator = mediator;
+            _capPublisher = capPublisher;
+            _dataOrderRepository = dataOrderRepository;
+            _dsReceiveMediaDataRepository = dsReceiveMediaDataRepository;
+            _dsUserTokenInfoRepository = dsUserTokenInfoRepository;
+            _fwClient = fwClient;
+        }
+
+        /// <summary>
+        /// 2.3.1查询受理类型
+        /// </summary>
+        /// <param name="strVailCode"></param>
+        /// <returns></returns>
+        [HttpPost("e_GetTypeID")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetAcceptType([FromForm] string strVailCode)
+        {
+            var accountDto = await CheckAccountAsync(strVailCode);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("密钥错误", "-900"));
+            List<AcceptTypeListDto> acceptTypeListDtos = new()
+            {
+                new() { Name = "咨询", Value = "10" },
+                new() { Name = "建议", Value = "15" },
+                new() { Name = "求助", Value = "20" },
+                new() { Name = "表扬", Value = "25" },
+                new() { Name = "举报", Value = "30" },
+                new() { Name = "投诉", Value = "35" },
+                new() { Name = "其他", Value = "40" },
+                new() { Name = "意见", Value = "1" },
+                new() { Name = "惠民帮助", Value = "2" },
+                new() { Name = "大气污染举报", Value = "3" }
+            };
+
+            return OpenResponse.Ok(OtherPlatformsDeResponse<List<AcceptTypeListDto>>.Success(acceptTypeListDtos));
+        }
+
+        /// <summary>
+        /// 2.3.2网上写信
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("e_WriteInfo")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> WriteInfo([FromForm] ZzptAddWriteInfoDto dto)
+        {
+            var accountDto = await CheckAccountAsync(dto.strVailCode);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("密钥错误", "-900"));
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed(strResult, "0"));
+
+            //写入原始数据
+            DsReceiveMediaData dsReceiveMediaData = new()
+            {
+                ServiceInterface = "e_WriteInfo",
+                PlatformsName = accountDto.PlatformSource,
+                ExternalId = dto.strZZCode,
+                ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto)
+            };
+            dsReceiveMediaData.Id = await _dsReceiveMediaDataRepository.AddAsync(dsReceiveMediaData, HttpContext.RequestAborted);
+
+            Hotline.Share.Dtos.Order.AddOrderDto data = new()
+            {
+                Title = dto.strTitle,
+                FromName = dto.strUserName,
+                Contact = dto.strPhone,
+                FullAddress = dto.strAddress,
+                Content = dto.strContent,
+                IsSecret = false,
+                AcceptTypeCode = dto.strTypeID,
+                Source = (Hotline.Share.Enums.Order.ESource)Enum.Parse(typeof(Hotline.Share.Enums.Order.ESource), accountDto.PlatformSource),
+                FromGender = dto.strGender switch
+                {
+                    "1" => Hotline.Share.Enums.Order.EGender.Male,
+                    "2" => Hotline.Share.Enums.Order.EGender.Female,
+                    _ => Hotline.Share.Enums.Order.EGender.Unknown,
+                },
+                IdentityType = Hotline.Share.Enums.Order.EIdentityType.Citizen,
+                Transpond = false,
+                IsEnforcementOrder = false,
+                ExternalId = dto.strZZCode,
+                AreaCode = dto.strArea
+            };
+
+            data.SourceChannel = "综治平台";
+            data.SourceChannelCode = "ZZPT";
+
+            //调用工单创建接口
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/add-anonymous", "Post", System.Text.Json.JsonSerializer.Serialize(data));
+            if (result != null && result.code == 0)
+            {
+                // dsReceiveMediaData.ExternalId = result.result.id;
+                dsReceiveMediaData.OrderCode = result.result.no;
+                await _dsReceiveMediaDataRepository.UpdateAsync(dsReceiveMediaData, HttpContext.RequestAborted);
+
+                List<WriteInfoReturnDto> returnData = new()
+                {
+                    new WriteInfoReturnDto() { LetterCode = result.result.no, LetterPwd = result.result.password }
+                };
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Success("新增成功"));
+            }
+            else
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("接口调用失败!", "0"));
+
+        }
+
+        /// <summary>
+        /// 2.3.3新增办理结果
+        /// </summary>
+        /// <param name=""></param>
+        /// <returns></returns>
+        [HttpPost("e_WriteResult")]
+        [AllowAnonymous]
+        public async Task<OpenResponse> GetFlowInfo([FromForm] ZzptWriteResult dto)
+        {
+            var accountDto = await CheckAccountAsync(dto.strVailCode);
+            if (accountDto is null || accountDto.IsCheckAccount == false)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("密钥错误", "-900"));
+
+            //验证数据
+            string strResult = dto.Validate();
+            if (!string.IsNullOrEmpty(strResult))
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed(strResult, "0"));
+
+            if (!IsDate(dto.strDate))
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("操作时间日期格式不正确", "0"));
+
+            //写入原始数据
+            DsReceiveMediaData dsReceiveMediaData = new()
+            {
+                ServiceInterface = "e_WriteResult",
+                PlatformsName = accountDto.PlatformSource,
+                ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto),
+                OrderCode = dto.strCode,
+            };
+            await _dsReceiveMediaDataRepository.AddAsync(dsReceiveMediaData, HttpContext.RequestAborted);
+
+            var orderData = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.strCode, HttpContext.RequestAborted);
+            if (orderData == null)
+                return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Failed("该工单不属于12345", "0"));
+
+            var count = await _dsReceiveMediaDataRepository.Queryable()
+                .Where(p => p.ServiceInterface == "e_WriteResult" && p.PlatformsName == accountDto.PlatformSource && p.OrderCode == dto.strCode)
+                .CountAsync();
+            if (count <= 1)
+            {
+                Hotline.Share.Dtos.DataSharing.PusherHotlineDto.OrderResultDto orderResultDto = new()
+                {
+                    OrderId = orderData.OrderId,
+                    FinishType = "1",
+                    Opinion = dto.strResult,
+                    Source = "zzpt"
+                };
+                await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderReultSend, orderResultDto, cancellationToken: HttpContext.RequestAborted);
+            }
+            return OpenResponse.Ok(OtherPlatformsDeResponse<string>.Success("新增成功"));
+
+        }
+
+        /// <summary>
+        /// 验证是否是正确日期
+        /// </summary>
+        /// <param name="strDate"></param>
+        /// <returns></returns>
+        private bool IsDate(string strDate)
+        {
+            try
+            {
+                DateTime.Parse(strDate);
+                return true;
+            }
+            catch
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 验证密钥
+        /// </summary>
+        /// <param name="Code"></param>
+        /// <returns></returns>
+        private async Task<CheckAccountDto> CheckAccountAsync(string Code)
+        {
+            CheckAccountDto accountDto = new() { IsCheckAccount = false };
+            var data = await _dsUserTokenInfoRepository.GetAsync(p => p.AccountId == Code && p.State == "1", HttpContext.RequestAborted);
+            if (data is not null)
+            {
+                accountDto.PlatformSource = data.PlatformSource;
+                accountDto.IsCheckAccount = true;
+                return accountDto;
+            }
+
+            accountDto.Message = "授权账号或密码验证不通过";
+            return accountDto;
+        }
+    }
+}

+ 1 - 0
src/DataSharing.Host/DataSharing.Host.csproj

@@ -4,6 +4,7 @@
     <TargetFramework>net8.0</TargetFramework>
     <Nullable>enable</Nullable>
     <ImplicitUsings>enable</ImplicitUsings>
+	  <GenerateDocumentationFile>True</GenerateDocumentationFile>
   </PropertyGroup>
 
   <ItemGroup>

+ 10 - 6
src/DataSharing.Host/config/appsettings.Development.json

@@ -44,7 +44,7 @@
     }
   },
   "DatabaseConfiguration": {
-    "ApplyDbMigrations": false,
+    "ApplyDbMigrations": true,
     "ApplySeed": false
   },
   "MqConfiguration": {
@@ -88,11 +88,11 @@
     },
     //市州数据交换
     "CityHandOver": {
-      "SecretKey": "AA9FF92A-5040-442A-BDFF-A50AD536BF3D",
-      "SendCityName": "宜宾12345",
-      "ReceiveCityName": "泸州12345",
-      "BaseUrl": "http://192.168.100.43:8032/",
-      "UrlAddress": "CityHandOver.asmx/FlowWrite"
+      "PushOrder": "CityHandOver.asmx/FlowWrite",
+      "PushOpinion": "CityHandOver.asmx/UndertakAdvice",
+      "NewPushOrder": "api/v1/CityDataExchange/city_hand_data",
+      "NewPushOpinion": "api/v1/CityDataExchange/city_undertak_advice_data",
+      "IsNew": true
     },
     //融媒体
     "MediaCode": {
@@ -121,6 +121,10 @@
       "DownloadUrlAddress": "file/downloadfile",
       "Source": "datasharing"
     },
+    //综治平台
+    "ZzptPlatforms": {
+      "AddressUrl": "http://www.x157123.xyz:80/"
+    },
     //110对接
     "PoliceDS": {
       //1、非警情分流推送服务_宜宾市

+ 10 - 6
src/DataSharing.Host/config/appsettings.json

@@ -13,7 +13,7 @@
   },
   "Swagger": true,
   "Cors": {
-    "Origins": [ "http://localhost:8888", "http://hotline.12345lm.cn", "http://110.188.24.28:50101", "http://110.188.24.28:50102", "http://localhost:8113", "http://bs.hotline.12345lm.cn" ]
+    "Origins": [ "http://localhost:8888", "http://hotline.12345lm.cn", "http://110.188.24.28:50101", "http://110.188.24.28:50102", "http://localhost:8113", "http://bs.hotline.12345lm.cn", "http://110.188.24.28:50301" ]
   },
   "IdentityConfiguration": {
     "Password": {
@@ -101,11 +101,11 @@
     },
     //市州数据交换
     "CityHandOver": {
-      "SecretKey": "AA9FF92A-5040-442A-BDFF-A50AD536BF3D",
-      "SendCityName": "宜宾12345",
-      "ReceiveCityName": "泸州12345",
-      "BaseUrl": "http://192.168.100.43:8032/",
-      "UrlAddress": "CityHandOver.asmx/FlowWrite"
+      "PushOrder": "CityHandOver.asmx/FlowWrite",
+      "PushOpinion": "CityHandOver.asmx/UndertakAdvice",
+      "NewPushOrder": "api/v1/CityDataExchange/city_hand_data",
+      "NewPushOpinion": "api/v1/CityDataExchange/city_undertak_advice_data",
+      "IsNew": true
     },
     //融媒体
     "MediaCode": {
@@ -127,6 +127,10 @@
       // "SystemSettingsTheme": "class=gray2",
       "SystemSettingsTheme": ""
     },
+    //综治平台
+    "ZzptPlatforms": {
+      "AddressUrl": "http://www.x157123.xyz:80/"
+    },
     //业务系统附件上传配置
     "BusinessFile": {
       "BaseUrl": "http://218.6.151.146:50106/",

+ 4 - 0
src/DataSharing.Share/DataSharing.Share.csproj

@@ -12,4 +12,8 @@
     <None Remove="Dtos\HotlineClient\**" />
   </ItemGroup>
 
+  <ItemGroup>
+    <PackageReference Include="XF.Utility.EnumExtensions" Version="1.0.5" />
+  </ItemGroup>
+
 </Project>

+ 18 - 3
src/DataSharing.Share/Dtos/Common/AddUserInfoDto.cs

@@ -1,5 +1,10 @@
 namespace DataSharing.Share.Dtos.Common
 {
+    public record UpdateUserInfoDto : AddUserInfoDto
+    {
+        public string Id { get; set; }
+    }
+
     public record AddUserInfoDto
     {
         /// <summary>
@@ -13,14 +18,19 @@
         public string AccountSecret { get; set; }
 
         /// <summary>
-        /// 所属平台名称
+        /// 所属平台Code
         /// </summary>
         public string PlatformSource { get; set; }
 
         /// <summary>
-        /// 授权IP
+        /// 所属平台名称
         /// </summary>
-        public string? AuthIP { get; set; }
+        public string? PlatformSourceName { get; set; }
+
+        ///// <summary>
+        ///// 授权IP
+        ///// </summary>
+        //public string? AuthIP { get; set; } = "*";
 
         /// <summary>
         /// 账号状态0:未启用;1:正常;2:禁用;
@@ -31,5 +41,10 @@
         /// 备注信息
         /// </summary>
         public string? Remark { get; set; }
+
+        /// <summary>
+        /// 数据推送地址
+        /// </summary>
+        public string AddressUrl { get; set; }
     }
 }

+ 14 - 0
src/DataSharing.Share/Dtos/ConvergenceMedia/ConvergenceMediaDeResponse.cs

@@ -1,5 +1,19 @@
 namespace DataSharing.Share.Dtos.ConvergenceMedia
 {
+
+    public class ReturnData
+    {
+        /// <summary>
+        /// 描述
+        /// </summary>
+        public string msg { get; set; }
+
+        public static List<ReturnData> ReturnDataInfo(string msg)
+        {
+            return new List<ReturnData> { new ReturnData() { msg = msg } };
+        }
+    }
+
     public class ConvergenceMediaDeResponse<TData>
     {
         /// <summary>

+ 2 - 2
src/DataSharing.Share/Dtos/ConvergenceMedia/MediaDataReceiveDto.cs

@@ -14,7 +14,7 @@
         /// </summary>
         [MDisplayName("受理类型编码")]
         [VRequired]
-        public int PurTypeName { get; set; }
+        public int PurTypeID { get; set; }
 
         /// <summary>
         /// 标题
@@ -43,7 +43,7 @@
         /// </summary>
         [MDisplayName("联系电话")]
         [VRequired]
-        [VStringLength(0, 12)]
+        [VStringLength(0, 20)]
         public string Mobile { get; set; }
 
         /// <summary>

+ 34 - 0
src/DataSharing.Share/Dtos/DataExchange/CityDataReceiveDto.cs

@@ -99,4 +99,38 @@
         public string Content { get; set; }
 
     }
+
+    /// <summary>
+    /// 办理结果
+    /// </summary>
+    public class CityDataUndertakAdviceDto
+    {
+        /// <summary>
+        /// 密钥
+        /// </summary>
+        [MDisplayName("密钥")]
+        [VRequired]
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 来源
+        /// </summary>
+        [MDisplayName("来源")]
+        [VRequired]
+        public string Source { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        [MDisplayName("工单编号")]
+        [VRequired]
+        public string SCDRCode { get; set; }
+
+        /// <summary>
+        /// 办理结果
+        /// </summary>
+        [MDisplayName("办理结果")]
+        [VRequired]
+        public string UndertakAdvice { get; set; }
+    }
 }

+ 9 - 0
src/DataSharing.Share/Dtos/DataExchange/CityTranspondRawDataDto.cs

@@ -32,5 +32,14 @@
         /// </summary>
         public string? CityName { get; set; }
 
+        /// <summary>
+        /// 接收方工单编号
+        /// </summary>
+        public string? NewCode { get; set; }
+
+        /// <summary>
+        /// 市州办理意见
+        /// </summary>
+        public string? ActualOpinion { get; set; }
     }
 }

+ 10 - 0
src/DataSharing.Share/Dtos/Enterprise/YbEnterpriseDefaults.cs

@@ -21,5 +21,15 @@
         /// 撤单
         /// </summary>
         public const string PathEnterprisesCancelWorkOrder = "platform/12345/cancelWorkOrder";
+
+        /// <summary>
+        /// 综治平台-推送工单
+        /// </summary>
+        public const string ZzptPlatformsSendOrder = "appeal/exchangeManagement/addAppeal.action";
+
+        /// <summary>
+        /// 综治平台-推送结果
+        /// </summary>
+        public const string ZzptPlatformsSendHandle = "appeal/exchangeManagement/addStep.action";
     }
 }

+ 80 - 24
src/DataSharing.Share/Dtos/HotlineWeb/CalculateUploadRateDto.cs

@@ -2,12 +2,21 @@
 {
     public class CalculateUploadRateDto
     {
-
         /// <summary>
         /// 工单总量
         /// </summary>
         public int OrderCountNum { get; set; }
 
+        /// <summary>
+        /// 办结件数
+        /// </summary>
+        public int HandleEndOrderNum { get; set; }
+
+        /// <summary>
+        ///按时办结数量
+        /// </summary>
+        public int HandleEndOrderOnTime { get; set; }
+
         /// <summary>
         /// 工单及时上传
         /// </summary>
@@ -21,23 +30,33 @@
         /// <summary>
         /// 工单及时率
         /// </summary>
-        public double OrderTimelinessRate => CalcOrderTimelinessRate();
+        public double OrderTimelinessRate => CalcRate(OrderCountNum, OrderTimely);
 
-        public double CalcOrderTimelinessRate()
-        {
-            if (OrderTimely != 0 && OrderCountNum != 0)
-            {
-                return Math.Round((OrderTimely / (double)OrderCountNum) * 100, 2);
-            }
-            return 0;
-        }
+        /// <summary>
+        /// 办结率
+        /// </summary>
+        public double HandleEndOrderRate => CalcRate(OrderCountNum, HandleEndOrderNum);
 
+        /// <summary>
+        /// 按时办结率
+        /// </summary>
+        public double HandleEndOrderOnTimeRate => CalcRate(OrderCountNum, HandleEndOrderOnTime);
 
         /// <summary>
         /// 电话总量
         /// </summary>
         public int TelCountNum { get; set; }
 
+        /// <summary>
+        /// 电话接通数
+        /// </summary>
+        public int TelConnectCountNum { get; set; }
+
+        /// <summary>
+        /// 电话未接通数
+        /// </summary>
+        public int TelNotConnectCountNum { get; set; }
+
         /// <summary>
         /// 电话及时上传
         /// </summary>
@@ -51,17 +70,12 @@
         /// <summary>
         /// 电话及时率
         /// </summary>
-        public double TelTimelinessRate => CalcTelTimelinessRate();
-
-        public double CalcTelTimelinessRate()
-        {
-            if (TelCountNum != 0 && TelTimely != 0)
-            {
-                return Math.Round((TelTimely / (double)TelCountNum) * 100, 2);
-            }
-            return 0;
-        }
+        public double TelTimelinessRate => CalcRate(TelCountNum, TelTimely);
 
+        /// <summary>
+        /// 电话率
+        /// </summary>
+        public double TelConnectRate => CalcRate(TelCountNum, TelConnectCountNum);
 
         /// <summary>
         /// 电话来源工单数量
@@ -81,15 +95,57 @@
         /// <summary>
         /// 匹配率
         /// </summary>
-        public double MatchingRate => CalcMatchingRate();
+        public double MatchingRate => CalcRate(RGDHOrderCount, ContainTel);
+
+        /// <summary>
+        /// 回访总量
+        /// </summary>
+        public int VisitCountNum { get; set; }
+
+        /// <summary>
+        /// 满意总量
+        /// </summary>
+        public int SatisfactionCountNum { get; set; }
 
-        public double CalcMatchingRate()
+        /// <summary>
+        /// 不满意总量
+        /// </summary>
+        public int NotSatisfiedCountNum { get; set; }
+
+        /// <summary>
+        /// 满意率
+        /// </summary>
+        public double SatisfactionRate => CalcRate(VisitCountNum, SatisfactionCountNum);
+
+        /// <summary>
+        /// 不满意率
+        /// </summary>
+        public double NotSatisfiedRate => CalcRate(VisitCountNum, NotSatisfiedCountNum);
+
+        /// <summary>
+        /// 知识库总量
+        /// </summary>
+        public int KnowledgeCount { get; set; }
+
+        /// <summary>
+        /// 更新知识库量
+        /// </summary>
+        public int UpdateKnowledgeCount { get; set; }
+
+        /// <summary>
+        /// 计算率
+        /// </summary>
+        /// <param name="CountNum">总量</param>
+        /// <param name="Num">数量</param>
+        /// <returns></returns>
+        public double CalcRate(int CountNum, int Num)
         {
-            if (ContainTel != 0 && RGDHOrderCount != 0)
+            if (CountNum != 0 && Num != 0)
             {
-                return Math.Round((ContainTel / (double)RGDHOrderCount) * 100, 2);
+                return Math.Round((Num / (double)CountNum) * 100, 2);
             }
             return 0;
         }
+
     }
 }

+ 3 - 3
src/DataSharing.Share/Dtos/HotlineWeb/QuerySendTaskDto.cs

@@ -17,11 +17,11 @@ namespace DataSharing.Share.Dtos.HotlineWeb
         /// <summary>
         /// Id,空查全部
         /// </summary>
-        public string? id { get; set; }
+        public string? Id { get; set; }
 
         /// <summary>
-        /// 空查全部,1查成功,2查失败
+        /// 是否推送成功
         /// </summary>
-        public string? type { get; set; }
+        public bool? IsSuccess { get; set; }
     }
 }

+ 123 - 0
src/DataSharing.Share/Dtos/OtherPlatformsYB/AcceptTypeListDto.cs

@@ -0,0 +1,123 @@
+namespace DataSharing.Share.Dtos.OtherPlatformsYB
+{
+    public class AcceptTypeListDto
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public string Value { get; set; }
+    }
+
+    /// <summary>
+    /// 2.3.3查询办理进度参数
+    /// </summary>
+    public class WriteInfoReturnDto
+    {
+        public string LetterCode { get; set; }
+
+        public string LetterPwd { get; set; }
+    }
+
+    /// <summary>
+    /// 2.3.3查询办理进度
+    /// </summary>
+    public class GetFlowInfoReturnDto
+    {
+        /// <summary>
+        /// 办理部门
+        /// </summary>
+        public string AcceptName { get; set; }
+
+        /// <summary>
+        /// 办理人
+        /// </summary>
+        public string AcceptUser { get; set; }
+
+        /// <summary>
+        /// 办理意见
+        /// </summary>
+        public string AcceptContent { get; set; }
+
+        /// <summary>
+        /// 办理状态
+        /// </summary>
+        public string AcceptState { get; set; }
+
+        /// <summary>
+        /// 办理时间
+        /// </summary>
+        public string AcceptDate { get; set; }
+
+        /// <summary>
+        /// 是否完结
+        /// </summary>
+        public string AcceptEnd { get; set; }
+    }
+
+    /// <summary>
+    /// 2.3.4查询办理结果
+    /// </summary>
+    public class GetFlowDetailReturnDto
+    {
+        /// <summary>
+        /// 办理状态 0办理中  1已完成
+        /// </summary>
+        public string state { get; set; }
+
+        /// <summary>
+        /// 办理结果内容
+        /// </summary>
+        public string content { get; set; }
+
+        /// <summary>
+        /// 办理部门
+        /// </summary>
+        public string AcceptName { get; set; }
+
+        /// <summary>
+        /// 办理用户
+        /// </summary>
+        public string AcceptUser { get; set; }
+
+        /// <summary>
+        /// 办理时间
+        /// </summary>
+        public DateTime? AcceptDate { get; set; }
+    }
+
+    /// <summary>
+    /// 网络理政办件结果查询
+    /// </summary>
+    public class WllzOrderInfoReturnDto
+    {
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 办理状态
+        /// </summary>
+        public string State { get; set; }
+
+        /// <summary>
+        /// 办理结果
+        /// </summary>
+        public string Ccontent { get; set; }
+
+        /// <summary>
+        /// 办理部门
+        /// </summary>
+        public string AcceptName { get; set; }
+
+        /// <summary>
+        /// 办理时间
+        /// </summary>
+        public string AcceptDate { get; set; }
+    }
+}

+ 172 - 0
src/DataSharing.Share/Dtos/OtherPlatformsYB/AddWriteInfoDto.cs

@@ -0,0 +1,172 @@
+namespace DataSharing.Share.Dtos.OtherPlatformsYB
+{
+    /// <summary>
+    /// 受理
+    /// </summary>
+    public class AddWriteInfoDto : BaseVailCodeDto
+    {
+        /// <summary>
+        /// 姓名
+        /// </summary>
+        [MDisplayName("姓名")]
+        [VRequired]
+        [VStringLength(0, 20)]
+        public string strUserName { get; set; }
+
+        /// <summary>
+        /// 性别 
+        /// </summary>
+        [MDisplayName("性别 ")]
+        [VRequired]
+        [VStringLength(0, 1)]
+        public string strGender { get; set; }
+
+        /// <summary>
+        /// 邮箱 
+        /// </summary>
+        [MDisplayName("邮箱 ")]
+        [VStringLength(0, 100)]
+        public string strEmail { get; set; }
+
+        /// <summary>
+        /// 电话 
+        /// </summary>
+        [MDisplayName("电话 ")]
+        [VRequired]
+        [VStringLength(0, 20)]
+        public string strPhone { get; set; }
+
+        /// <summary>
+        /// 地址
+        /// </summary>
+        [MDisplayName("地址")]
+        [VStringLength(0, 200)]
+        public string strAddress { get; set; }
+
+        /// <summary>
+        /// 受理类型code
+        /// </summary>
+        [MDisplayName("受理类型code")]
+        [VRequired]
+        [VStringLength(0, 6)]
+        public string strTypeID { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        [MDisplayName("标题")]
+        [VRequired]
+        [VStringLength(0, 200)]
+        public string strTitle { get; set; }
+
+        /// <summary>
+        /// 内容
+        /// </summary>
+        [MDisplayName("内容")]
+        [VRequired]
+        [VStringLength(0, 7000)]
+        public string strContent { get; set; }
+    }
+
+    /// <summary>
+    /// 2.3.3查询办理进度/查询办理结果
+    /// </summary>
+    public class GetFlowDetailDto : BaseVailCodeDto
+    {
+        /// <summary>
+        /// 查询编号
+        /// </summary>
+        [MDisplayName("查询编号")]
+        [VRequired]
+        [VStringLength(0, 30)]
+        public string strCode { get; set; }
+
+        /// <summary>
+        /// 查询密码
+        /// </summary>
+        [MDisplayName("查询密码")]
+        [VRequired]
+        [VStringLength(0, 10)]
+        public string strPwd { get; set; }
+    }
+
+    /// <summary>
+    /// 综治平台
+    /// </summary>
+    public class ZzptAddWriteInfoDto: AddWriteInfoDto
+    {
+        /// <summary>
+        /// 综治平台唯一标识
+        /// </summary>
+        [MDisplayName("综治平台唯一标识")]
+        [VRequired]
+        [VStringLength(0, 100)]
+        public string strZZCode { get; set; }
+
+        /// <summary>
+        /// 区域ID
+        /// </summary>
+        [MDisplayName("区域ID")]
+        [VRequired]
+        [VStringLength(0, 50)]
+        public string strArea { get; set; }
+
+    }
+
+    /// <summary>
+    /// 综治平台办理
+    /// </summary>
+    public class ZzptWriteResult: BaseVailCodeDto
+    {
+        /// <summary>
+        /// 12345编号
+        /// </summary>
+        [MDisplayName("12345编号")]
+        [VRequired]
+        [VStringLength(0, 30)]
+        public string strCode { get; set; }
+
+        /// <summary>
+        /// 动作
+        /// </summary>
+        [MDisplayName("动作")]
+        [VRequired]
+        public string strAction { get; set; }
+
+        /// <summary>
+        /// 操作人
+        /// </summary>
+        [MDisplayName("操作人")]
+        [VRequired]
+        [VStringLength(0, 20)]
+        public string strUser { get; set; }
+
+        /// <summary>
+        /// 操作时间
+        /// </summary>
+        [MDisplayName("操作时间")]
+        [VRequired]
+        public string strDate { get; set; }
+
+        /// <summary>
+        /// 操作结果
+        /// </summary>
+        [MDisplayName("操作结果")]
+        [VRequired]
+        public string strResult {  get; set; }
+    }
+
+    /// <summary>
+    /// 网络理政获取工单详情
+    /// </summary>
+    public class WllzGetOrderInfo : BaseVailCodeDto
+    {
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        [MDisplayName("工单编号")]
+        [VRequired]
+        public string strCodes { get; set; }
+    }
+
+}

+ 12 - 0
src/DataSharing.Share/Dtos/OtherPlatformsYB/BaseVailCodeDto.cs

@@ -0,0 +1,12 @@
+namespace DataSharing.Share.Dtos.OtherPlatformsYB
+{
+    public class BaseVailCodeDto
+    {
+        /// <summary>
+        /// 接口密钥
+        /// </summary>
+        [MDisplayName("接口密钥")]
+        [VRequired]
+        public string strVailCode { get; set; }
+    }
+}

+ 44 - 0
src/DataSharing.Share/Dtos/OtherPlatformsYB/OtherPlatformsDeResponse.cs

@@ -0,0 +1,44 @@
+namespace DataSharing.Share.Dtos.OtherPlatformsYB
+{
+    public class OtherPlatformsDeResponse<TData>
+    {
+        /// <summary>
+        /// 状态
+        /// </summary>
+        public string code { get; set; }
+
+        /// <summary>
+        /// 描述
+        /// </summary>
+        public TData msg { get; set; }
+
+        /// <summary>
+        /// 成功
+        /// </summary>
+        /// <param name="data"></param>
+        /// <returns></returns>
+        public static OtherPlatformsDeResponse<TData> Success(TData data)
+        {
+            return new OtherPlatformsDeResponse<TData>
+            {
+                code = "1",
+                msg = data
+            };
+        }
+
+        /// <summary>
+        /// 失败
+        /// </summary>
+        /// <param name="data"></param>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public static OtherPlatformsDeResponse<TData> Failed(TData data, string? code = "0")
+        {
+            return new OtherPlatformsDeResponse<TData>
+            {
+                code = code,
+                msg = data
+            };
+        }
+    }
+}

+ 18 - 0
src/DataSharing.Share/Dtos/OtherPlatformsYB/ZzptDeResponse.cs

@@ -0,0 +1,18 @@
+namespace DataSharing.Share.Dtos.OtherPlatformsYB
+{
+    /// <summary>
+    /// 综治平台请求返回
+    /// </summary>
+    public class ZzptDeResponse
+    {
+        /// <summary>
+        /// 状态
+        /// </summary>
+        public bool code { get; set; }
+
+        /// <summary>
+        /// 消息
+        /// </summary>
+        public string msg { get; set; }
+    }
+}

+ 1 - 1
src/DataSharing.Share/Dtos/Province/XieTong/Send/SendCaseInfo.cs

@@ -113,7 +113,7 @@ public class SendCaseInfo
     /// 是否回访-工单是否需要回访
     /// </summary>
     [JsonPropertyName("CASE_ISVISIT")]
-    public string CaseIsVisit { get; set; } = "0";
+    public string CaseIsVisit { get; set; } = "1";
 
     /// <summary>
     /// 紧急程度

+ 178 - 0
src/DataSharing.Share/Dtos/WebPortal/DsSendTaskDto.cs

@@ -0,0 +1,178 @@
+using DataSharing.Share.Enums;
+using XF.Utility.EnumExtensions;
+
+namespace DataSharing.Share.Dtos.WebPortal
+{
+    public class DsSendTaskDto
+    {
+        /// <summary>
+        /// ID
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 省工单编号
+        /// </summary>
+        public string? ProvinceNo { get; set; }
+
+        /// <summary>
+        /// 任务优先级(0:最低级别)
+        /// </summary>
+        public int TaskPriority { get; set; }
+
+        /// <summary>
+        /// 初次推送时间
+        /// </summary>
+        public DateTime? FirstTime { get; set; }
+
+        /// <summary>
+        /// 最近一次推送时间
+        /// </summary>
+        public DateTime? LastTime { get; set; }
+
+        /// <summary>
+        /// 推送次数
+        /// </summary>
+        public int SendTimes { get; set; }
+
+        /// <summary>
+        /// 推送成功
+        /// </summary>
+        public bool IsSuccess { get; set; }
+
+        /// <summary>
+        /// 平台名称
+        /// </summary>
+        public EPlatformSource PlatformSource { get; set; } = EPlatformSource.Province;
+        public string PlatformSourceText => PlatformSource.GetDescription();
+
+        /// <summary>
+        /// 任务类型
+        /// addOrder, expiredTimeChanged...
+        /// </summary>
+        public string TaskType { get; set; }
+
+        /// <summary>
+        /// 请求方式
+        /// </summary>
+        public string HttpMethod { get; set; }
+
+        /// <summary>
+        /// 请求地址
+        /// </summary>
+        public string Path { get; set; }
+        public string PathText => GetName();
+
+        /// <summary>
+        /// 请求参数
+        /// </summary>
+        public string Request { get; set; }
+
+        /// <summary>
+        /// 请求端口,省推送必填,协同或者汇聚
+        /// </summary>
+        public EPathType? PathType { get; set; } = EPathType.Other;
+
+        /// <summary>
+        /// 生成时间(保存工单创建时间或者通话记录生成时间)
+        /// </summary>
+        public DateTime? GenerationTime { get; set; }
+
+        /// <summary>
+        /// 附件
+        /// </summary>
+        public List<FileJson>? FileJson { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public string GetName()
+        {
+            string name = "";
+            switch (Path)
+            {
+                case "get_case_back_apply":
+                    name = "业务协同-退回申请接口";
+                    break;
+                case "send_supervise_process_info":
+                    name = "业务协同-服务工单督办过程接口";
+                    break;
+                case "send_supervise_result_info":
+                    name = "业务协同-服务工单督办结果接口";
+                    break;
+                case "screen_case_info_send":
+                    name = "业务协同-工单发起甄别接口";
+                    break;
+                case "delay_case_info_send":
+                    name = "业务协同-服务工单申请延时接口";
+                    break;
+                case "submit_case_info":
+                    name = "业务汇聚-服务工单受理接口";
+                    break;
+                case "submit_case_record":
+                    name = "业务汇聚-电话记录";
+                    break;
+                case "get_case_process_receive":
+                    name = "业务协同-服务工单交办处理过程接口";
+                    break;
+                case "submit_case_process":
+                    name = "业务汇聚-服务工单处理过程接口";
+                    break;
+                case "submit_case_total":
+                    name = "业务汇聚-统计数据接口";
+                    break;
+                case "supply_case_info_send":
+                    name = "业务协同-上报补充诉求接口";
+                    break;
+                case "revoke_case_info":
+                    name = "业务协同-服务工单撤单接口";
+                    break;
+                case "remind_case_info":
+                    name = "业务协同-服务工单催单接口";
+                    break;
+                case "get_case_result_receive":
+                    name = "业务协同-服务工单交办处理结果接口";
+                    break;
+                case "zmhd_case_info_public":
+                    name = "业务协同-政民互动提交公开";
+                    break;
+                case "get_knowledge_info_send":
+                    name = "业务协同-知识库上报接口";
+                    break;
+                case "get_knowledge_info_update":
+                    name = "业务协同-知识库变更接口";
+                    break;
+                case "get_knowledge_info_abandon":
+                    name = "业务协同-知识库下架接口";
+                    break;
+                case "sendrealtimestatus":
+                    name = "实时服务上报接口";
+                    break;
+                case "get_visit_info_receive":
+                    name = "业务协同-服务工单交办评价接口";
+                    break;
+                case "submit_visit_info":
+                    name = "业务汇聚-服务工单回访评价接口";
+                    break;
+                case "submit_case_result":
+                    name = "业务汇聚-服务工单处理结果接口";
+                    break;
+                case "submit_case_extends":
+                    name = "业务汇聚-服务工单拓展信息接口";
+                    break;
+                case "send_case_info":
+                    name = "业务协同-服务工单上报";
+                    break;
+                case "get_case_material_info":
+                    name = "业务汇聚-材料接口";
+                    break;
+                default:
+                    break;
+            }
+
+            return name;
+        }
+
+    }
+}

+ 16 - 2
src/DataSharing.Share/Enums/EPlatformSource.cs

@@ -1,4 +1,6 @@
-namespace DataSharing.Share.Enums
+using System.ComponentModel;
+
+namespace DataSharing.Share.Enums
 {
     /// <summary>
     /// 推送平台
@@ -6,33 +8,45 @@
     public enum EPlatformSource
     {
         /// <summary>
-        /// 省
+        /// 省12345
         /// </summary>
+        [Description("省12345")]
         Province = 0,
 
         /// <summary>
         /// 110
         /// </summary>
+        [Description("110")]
         Police110 = 1,
 
         /// <summary>
         /// 市州互转
         /// </summary>
+        [Description("市州互转")]
         CityDataExchange = 2,
 
         /// <summary>
         /// 宜宾融媒体
         /// </summary>
+        [Description("宜宾融媒体")]
         ConvergenceMedia = 3,
 
         /// <summary>
         /// 企业服务
         /// </summary>
+        [Description("企业服务")]
         Enterprise = 4,
 
         /// <summary>
         /// i宜宾
         /// </summary>
+        [Description("i宜宾")]
         IYIBIN = 5,
+
+        /// <summary>
+        /// 综治平台
+        /// </summary>
+        [Description("综治平台")]
+        ZZPT = 6,
     }
 }

+ 5 - 0
src/DataSharing.Share/Mq/EventNames.Order.cs

@@ -79,5 +79,10 @@
         /// 提交评价信息(门户等第三方,提交全部部门的评价)
         /// </summary>
         public const string SharingOrderVisitAllOther = "sharing.order.visit.all.other";
+
+        /// <summary>
+        /// 接受省上上传附件
+        /// </summary>
+        public const string SharingFileInfo = "sharing.file.info";
     }
 }

+ 6 - 0
src/DataSharing.YiBin/ConvergenceMedia/DsReceiveMediaData.cs

@@ -34,5 +34,11 @@ namespace DataSharing.ConvergenceMedia
         [SugarColumn(ColumnDescription = "推送数据", ColumnDataType = "text")]
         public string? ReceiveData { get; set; }
 
+        /// <summary>
+        /// 平台名称
+        /// </summary>
+        [SugarColumn(ColumnDescription = "平台名称", ColumnDataType = "varchar(50)")]
+        public string? PlatformsName { get; set; }
+
     }
 }

+ 26 - 10
src/DataSharing/ChannelConfiguration.cs

@@ -51,6 +51,11 @@
         /// 写入工单数据
         /// </summary>
         public ConfigurationHotlineClient HotlineClient { get; set; }
+
+        /// <summary>
+        /// 综治平台
+        /// </summary>
+        public ConvergenceZzptPlatforms ZzptPlatforms { get; set; }
     }
 
     /// <summary>
@@ -101,29 +106,29 @@
     public class ConfigurationCityHandOver
     {
         /// <summary>
-        /// 密钥
+        /// 信件接收接口地址
         /// </summary>
-        public string SecretKey { get; set; } = string.Empty;
+        public string PushOrder { get; set; } = string.Empty;
 
         /// <summary>
-        /// 请求市州名称
+        /// 办理结果接收地址
         /// </summary>
-        public string SendCityName { get; set; } = string.Empty;
+        public string PushOpinion { get; set; } = string.Empty;
 
         /// <summary>
-        /// 接收市州名称
+        /// 新版信件接收接口地址
         /// </summary>
-        public string ReceiveCityName { get; set; } = string.Empty;
+        public string NewPushOrder { get; set; } = string.Empty;
 
         /// <summary>
-        /// 请求地址
+        /// 新版办理结果接收地址
         /// </summary>
-        public string BaseUrl { get; set; } = string.Empty;
+        public string NewPushOpinion { get; set; } = string.Empty;
 
         /// <summary>
-        /// 接口地址
+        /// 是否是新版
         /// </summary>
-        public string UrlAddress { get; set; } = string.Empty;
+        public bool IsNew { get; set; }
     }
 
     /// <summary>
@@ -290,4 +295,15 @@
         public string AddressUrl { get; set; } = string.Empty;
 
     }
+
+    /// <summary>
+    ///综治平台
+    /// </summary>
+    public class ConvergenceZzptPlatforms
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public string AddressUrl { get; set; } = string.Empty;
+    }
 }

+ 8 - 1
src/DataSharing/ChannelConfigurationManager.cs

@@ -109,6 +109,13 @@ namespace DataSharing
             return _channelOption.Value.HotlineClient;
         }
 
-        
+        /// <summary>
+        /// 综治平台
+        /// </summary>
+        /// <returns></returns>
+        public ConvergenceZzptPlatforms GetConfigurationZzptPlatforms()
+        {
+            return _channelOption.Value.ZzptPlatforms;
+        }
     }
 }

+ 13 - 1
src/DataSharing/Common/DsUserTokenInfo.cs

@@ -23,11 +23,17 @@ namespace DataSharing.Common
         [SugarColumn(ColumnDescription = "密码")]
         public string AccountSecret { get; set; }
 
+        /// <summary>
+        /// 所属平台Code
+        /// </summary>
+        [SugarColumn(ColumnDescription = "所属平台Code")]
+        public string PlatformSource { get; set; }
+
         /// <summary>
         /// 所属平台名称
         /// </summary>
         [SugarColumn(ColumnDescription = "所属平台名称")]
-        public string PlatformSource { get; set; }
+        public string? PlatformSourceName { get; set; }
 
         /// <summary>
         /// 授权IP
@@ -46,5 +52,11 @@ namespace DataSharing.Common
         /// </summary>
         [SugarColumn(ColumnDescription = "备注信息")]
         public string? Remark { get; set; }
+
+        /// <summary>
+        /// 数据推送地址
+        /// </summary>
+        [SugarColumn(ColumnDescription = "数据推送地址")]
+        public string? AddressUrl {  get; set; }
     }
 }

+ 19 - 19
src/DataSharing/DataExchange/DataExchangeClient.cs

@@ -20,25 +20,25 @@ namespace DataSharing.DataExchange
             _httpClientFactory = httpClientFactory;
         }
 
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <typeparam name="TResponse"></typeparam>
-        /// <param name="url"></param>
-        /// <param name="httpMethod"></param>
-        /// <param name="stringContent"></param>
-        /// <param name="cancellationToken"></param>
-        /// <returns></returns>
-        public async Task<TResponse?> RequestAsync<TResponse>(string url, string httpMethod, string? stringContent = null, CancellationToken cancellationToken = default)
-        {
-            using var scope = _scopeFactory.CreateScope();
-            var provider = scope.ServiceProvider;
-            var channelconfigManager = provider.GetRequiredService<IChannelConfigurationManager>();
-            var httpInvoker = provider.GetRequiredService<IHttpInvoker>();
-            var configDataExchange = channelconfigManager.GetConfigurationCityHandOver();
-            return await httpInvoker.RequestStringContentAsync<TResponse>(url, httpMethod, stringContent,
-                d => d.SetHttpClient(configDataExchange.BaseUrl), cancellationToken: cancellationToken);
-        }
+        ///// <summary>
+        ///// 
+        ///// </summary>
+        ///// <typeparam name="TResponse"></typeparam>
+        ///// <param name="url"></param>
+        ///// <param name="httpMethod"></param>
+        ///// <param name="stringContent"></param>
+        ///// <param name="cancellationToken"></param>
+        ///// <returns></returns>
+        //public async Task<TResponse?> RequestAsync<TResponse>(string url, string httpMethod, string? stringContent = null, CancellationToken cancellationToken = default)
+        //{
+        //    using var scope = _scopeFactory.CreateScope();
+        //    var provider = scope.ServiceProvider;
+        //    var channelconfigManager = provider.GetRequiredService<IChannelConfigurationManager>();
+        //    var httpInvoker = provider.GetRequiredService<IHttpInvoker>();
+        //    var configDataExchange = channelconfigManager.GetConfigurationCityHandOver();
+        //    return await httpInvoker.RequestStringContentAsync<TResponse>(url, httpMethod, stringContent,
+        //        d => d.SetHttpClient(configDataExchange.BaseUrl), cancellationToken: cancellationToken);
+        //}
 
         /// <summary>
         /// 

+ 33 - 18
src/DataSharing/DataExchange/DataExchangePusherProviderService.cs

@@ -1,7 +1,7 @@
-using DataSharing.SendTask;
+using DataSharing.Common;
+using DataSharing.SendTask;
 using DataSharing.Share.Dtos.DataExchange;
 using DotNetCore.CAP;
-using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Logging;
 using XF.Domain.Dependency;
 using XF.Domain.Repository;
@@ -16,6 +16,8 @@ namespace DataSharing.DataExchange
         private readonly IChannelConfigurationManager _channelConfigurationManager;
         private readonly IRepository<DsReceiveDataExchangeData> _dsReceiveDataExchangeDataRepository;
         private readonly ICapPublisher _capPublisher;
+        private readonly IRepository<DsSendTaskInfo> _dsSendTaskInfoRepository;
+        private readonly IRepository<DsUserTokenInfo> _dsUserTokenInfoRepository;
 
         /// <summary>
         /// 
@@ -23,12 +25,19 @@ namespace DataSharing.DataExchange
         /// <param name="logger"></param>
         /// <param name="dataExchangeClient"></param>
         /// <param name="dsSendTaskRepository"></param>
+        /// <param name="channelConfigurationManager"></param>
+        /// <param name="dsReceiveDataExchangeDataRepository"></param>
+        /// <param name="capPublisher"></param>
+        /// <param name="dsSendTaskInfoRepository"></param>
+        /// <param name="dsUserTokenInfoRepository"></param>
         public DataExchangePusherProviderService(ILogger<DataExchangePusherProviderService> logger,
              DataExchangeClient dataExchangeClient,
             IRepository<DsSendTask> dsSendTaskRepository,
             IChannelConfigurationManager channelConfigurationManager,
             IRepository<DsReceiveDataExchangeData> dsReceiveDataExchangeDataRepository,
-            ICapPublisher capPublisher)
+            ICapPublisher capPublisher,
+            IRepository<DsSendTaskInfo> dsSendTaskInfoRepository,
+            IRepository<DsUserTokenInfo> dsUserTokenInfoRepository)
         {
             _logger = logger;
             _dataExchangeClient = dataExchangeClient;
@@ -36,6 +45,8 @@ namespace DataSharing.DataExchange
             _channelConfigurationManager = channelConfigurationManager;
             _dsReceiveDataExchangeDataRepository = dsReceiveDataExchangeDataRepository;
             _capPublisher = capPublisher;
+            _dsSendTaskInfoRepository = dsSendTaskInfoRepository;
+            _dsUserTokenInfoRepository = dsUserTokenInfoRepository;
         }
 
         /// <summary>
@@ -48,15 +59,19 @@ namespace DataSharing.DataExchange
         {
             if (dto is null)
                 return;
+            string TaskType = dto.TaskType;
 
-            var config = _channelConfigurationManager.GetConfigurationCityHandOver();
+            var userInfo = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSource == dto.TaskType, cancellationToken);
+            if (userInfo is null || string.IsNullOrEmpty(userInfo.AddressUrl))
+                return;
 
-            var baseAddress = config.BaseUrl;
+            var baseAddress = userInfo.AddressUrl;
             if (!baseAddress.EndsWith('/'))
                 baseAddress += "/";
 
             var response = await _dataExchangeClient.ExecuteAsync<DataExchangeResponseDto>(baseAddress + dto.Path, dto.HttpMethod, dto.Request, cancellationToken);
-
+            //写入推送明细表
+            DsSendTaskInfo dsSendTaskInfo = new() { TaskId = dto.Id, RequestInfo = System.Text.Json.JsonSerializer.Serialize(response) };
             //如果推送成功修改数据状态
             if (response != null)
             {
@@ -68,24 +83,24 @@ namespace DataSharing.DataExchange
                     dto.FirstTime = DateTime.Now;
 
                 if (response.Code == "1")
+                {
                     dto.IsSuccess = true;
+                    dsSendTaskInfo.IsSuccess = true;
+                }
 
-                var datarow = await _dsReceiveDataExchangeDataRepository.GetAsync(p => p.ReceiveData == dto.Id, cancellationToken);
-                if (datarow != null)
+                CityTranspondRawDataDto cityRawDataDto = new()
                 {
-                    CityTranspondRawDataDto cityRawDataDto = new()
-                    {
-                        OrderCode = datarow.ExternalId,
-                        SendTimes = dto.SendTimes,
-                        IsSuccess = dto.IsSuccess,
-                        Result = Newtonsoft.Json.JsonConvert.SerializeObject(response),
-
-                    };
-                    await _capPublisher.PublishAsync("sharing.order.transpond.city", cityRawDataDto, cancellationToken: cancellationToken);
-                }
+                    OrderCode = dto.ProvinceNo,
+                    SendTimes = dto.SendTimes,
+                    IsSuccess = dto.IsSuccess,
+                    Result = Newtonsoft.Json.JsonConvert.SerializeObject(response),
+                    NewCode = response.AcceptCode
+                };
+                await _capPublisher.PublishAsync("sharing.order.transpond.city", cityRawDataDto, cancellationToken: cancellationToken);
 
                 await _dsSendTaskRepository.UpdateAsync(dto, cancellationToken);
             }
+            await _dsSendTaskInfoRepository.AddAsync(dsSendTaskInfo, cancellationToken);
         }
     }
 }

+ 11 - 2
src/DataSharing/Enterprise/EnterprisePusherProviderService.cs

@@ -15,6 +15,7 @@ namespace DataSharing.Enterprise
         private readonly IHttpClientFactory _httpClientFactory;
         private readonly EnterpriseClient _enterpriseClient;
         private readonly IRepository<DsSendTask> _dsSendTaskRepository;
+        private readonly IRepository<DsSendTaskInfo> _dsSendTaskInfoRepository;
 
         /// <summary>
         /// 
@@ -28,13 +29,15 @@ namespace DataSharing.Enterprise
             IChannelConfigurationManager channelConfigurationManager,
             IHttpClientFactory httpClientFactory,
            EnterpriseClient enterpriseClient,
-            IRepository<DsSendTask> dsSendTaskRepository)
+            IRepository<DsSendTask> dsSendTaskRepository,
+            IRepository<DsSendTaskInfo> dsSendTaskInfoRepository)
         {
             _logger = logger;
             _channelConfigurationManager = channelConfigurationManager;
             _httpClientFactory = httpClientFactory;
             _enterpriseClient = enterpriseClient;
             _dsSendTaskRepository = dsSendTaskRepository;
+            _dsSendTaskInfoRepository = dsSendTaskInfoRepository;
         }
 
         /// <summary>
@@ -115,6 +118,8 @@ namespace DataSharing.Enterprise
                 baseAddress += "/";
 
             var enterprise = await _enterpriseClient.RequestAsync<EnterpriseResponse>(baseAddress + dto.Path, dto.HttpMethod, request, cancellationToken);
+            //写入推送明细表
+            DsSendTaskInfo dsSendTaskInfo = new() { TaskId = dto.Id, RequestInfo = System.Text.Json.JsonSerializer.Serialize(enterprise) };
             //如果推送成功修改数据状态
             if (enterprise != null)
             {
@@ -126,10 +131,14 @@ namespace DataSharing.Enterprise
                     dto.FirstTime = DateTime.Now;
 
                 if (enterprise.code == 200 && enterprise.success)
+                {
                     dto.IsSuccess = true;
-
+                    dsSendTaskInfo.IsSuccess = true;
+                }
                 await _dsSendTaskRepository.UpdateAsync(dto, cancellationToken);
             }
+
+            await _dsSendTaskInfoRepository.AddAsync(dsSendTaskInfo, cancellationToken);
         }
     }
 }

+ 6 - 0
src/DataSharing/IChannelConfigurationManager.cs

@@ -61,5 +61,11 @@
         /// </summary>
         /// <returns></returns>
         ConfigurationHotlineClient GetConfigurationHotlineClient();
+
+        /// <summary>
+        /// 综治平台
+        /// </summary>
+        /// <returns></returns>
+        ConvergenceZzptPlatforms GetConfigurationZzptPlatforms();
     }
 }

+ 15 - 0
src/DataSharing/OtherPlatformsYB/IZzptPusherProviderService.cs

@@ -0,0 +1,15 @@
+using DataSharing.SendTask;
+
+namespace DataSharing.OtherPlatformsYB
+{
+    public interface IZzptPusherProviderService
+    {
+        /// <summary>
+        /// 综治平台推送数据
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        Task SendDataPusher(DsSendTask dto, CancellationToken cancellationToken);
+    }
+}

+ 128 - 0
src/DataSharing/OtherPlatformsYB/ZzptPusherProviderService.cs

@@ -0,0 +1,128 @@
+using DataSharing.SendTask;
+using DataSharing.Share.Dtos.OtherPlatformsYB;
+using Microsoft.Extensions.Logging;
+using System.Net;
+using System.Text;
+using XF.Domain.Dependency;
+using XF.Domain.Repository;
+
+namespace DataSharing.OtherPlatformsYB
+{
+    public class ZzptPusherProviderService : IZzptPusherProviderService, IScopeDependency
+    {
+        private readonly ILogger<ZzptPusherProviderService> _logger;
+        private readonly IChannelConfigurationManager _channelConfigurationManager;
+        private readonly IRepository<DsSendTask> _dsSendTaskRepository;
+        private readonly IRepository<DsSendTaskInfo> _dsSendTaskInfoRepository;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="logger"></param>
+        /// <param name="channelConfigurationManager"></param>
+        /// <param name="dsSendTaskRepository"></param>
+        /// <param name="dsSendTaskInfoRepository"></param>
+        public ZzptPusherProviderService(ILogger<ZzptPusherProviderService> logger,
+            IChannelConfigurationManager channelConfigurationManager,
+            IRepository<DsSendTask> dsSendTaskRepository,
+            IRepository<DsSendTaskInfo> dsSendTaskInfoRepository)
+        {
+            _logger = logger;
+            _channelConfigurationManager = channelConfigurationManager;
+            _dsSendTaskRepository = dsSendTaskRepository;
+            _dsSendTaskInfoRepository = dsSendTaskInfoRepository;
+        }
+
+        /// <summary>
+        /// 综治平台推送数据
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task SendDataPusher(DsSendTask dto, CancellationToken cancellationToken)
+        {
+            if (dto is null || string.IsNullOrEmpty(dto.Request))
+                return;
+
+            var request = dto.Request;
+
+            var dicParam = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, string>>(request);
+            if (dicParam == null || dicParam.Count == 0)
+                return;
+
+            var config = _channelConfigurationManager.GetConfigurationZzptPlatforms();
+            string baseAddress = config.AddressUrl;
+            if (!baseAddress.EndsWith('/'))
+                baseAddress += "/";
+
+            string strResultJson = PostWebServiceByJson(baseAddress + dto.Path, dto.HttpMethod, dicParam);
+
+            //写入推送明细表
+            DsSendTaskInfo dsSendTaskInfo = new() { TaskId = dto.Id, RequestInfo = strResultJson };
+            if (false == string.IsNullOrEmpty(strResultJson))
+            {
+                var respone = System.Text.Json.JsonSerializer.Deserialize<ZzptDeResponse>(strResultJson);
+                if (respone != null)
+                {
+                    #region 处理推送任务表,
+
+                    dto.LastTime = DateTime.Now;
+                    dto.SendTimes = dto.SendTimes + 1;
+
+                    if (dto.FirstTime is null)
+                        dto.FirstTime = DateTime.Now;
+
+                    if (respone.code)
+                    {
+                        dto.IsSuccess = true;
+                        dsSendTaskInfo.IsSuccess = true;
+                    }
+                    await _dsSendTaskRepository.UpdateAsync(dto, cancellationToken);
+                    #endregion
+                }
+            }
+            await _dsSendTaskInfoRepository.AddAsync(dsSendTaskInfo, cancellationToken);
+        }
+
+        /// <summary>
+        /// 需要WebService支持Post调用
+        /// </summary>
+        private string PostWebServiceByJson(string URL, string Method, Dictionary<string, string> Pars)
+        {
+            try
+            {
+                string strPars = "";
+                int nIndex = 0;
+                foreach (var item in Pars)
+                {
+                    if (0 == nIndex)
+                        strPars += "?" + item.Key + "=" + item.Value;
+                    else
+                        strPars += "&" + item.Key + "=" + item.Value;
+                    nIndex++;
+                }
+                string strUrl = URL + strPars;
+                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl);
+                if (Method.ToUpper() == "POST")
+                    request.Method = "POST";
+                request.Credentials = CredentialCache.DefaultCredentials;
+                request.Timeout = 10000;
+                byte[] data = Encoding.UTF8.GetBytes(strPars);
+                request.ContentLength = data.Length;
+                Stream writer = request.GetRequestStream();
+                writer.Write(data, 0, data.Length);
+                writer.Close();
+
+                StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8);
+                String retXml = sr.ReadToEnd();
+                sr.Close();
+                return retXml;
+            }
+            catch (Exception ex)
+            {
+                return ex.Message;
+            }
+        }
+
+    }
+}

+ 241 - 20
src/DataSharing/Province/PusherProviderService.cs

@@ -1,11 +1,7 @@
 using DataSharing.RawData;
 using DataSharing.SendTask;
 using DataSharing.Share.Dtos.Province;
-using DataSharing.Share.Dtos.Province.XieTong;
-using DataSharing.Share.Dtos.Province.XieTong.Receive;
 using DataSharing.Share.Enums;
-using DotNetCore.CAP;
-using MapsterMapper;
 using Microsoft.Extensions.Logging;
 using Newtonsoft.Json;
 using System.Net;
@@ -26,6 +22,7 @@ namespace DataSharing.Province
         private readonly IRepository<DsSendTaskInfo> _dsSendTaskInfoRepository;
         private readonly IRepository<DsOrder> _dataOrderRepository;
         private readonly IRepository<DsTelCall> _dsTelCallRepository;
+        private readonly IRepository<DsOrderVisitSend> _dsOrderVisitSendRepository;
 
         /// <summary>
         /// 
@@ -47,7 +44,8 @@ namespace DataSharing.Province
             IRepository<DsSendTask> dsSendTaskRepository,
             IRepository<DsSendTaskInfo> dsSendTaskInfoRepository,
             IRepository<DsOrder> dataOrderRepository,
-            IRepository<DsTelCall> dsTelCallRepository)
+            IRepository<DsTelCall> dsTelCallRepository,
+            IRepository<DsOrderVisitSend> dsOrderVisitSendRepository)
         {
             _logger = logger;
             _channelConfigurationManager = channelConfigurationManager;
@@ -58,6 +56,7 @@ namespace DataSharing.Province
             _dsSendTaskInfoRepository = dsSendTaskInfoRepository;
             _dataOrderRepository = dataOrderRepository;
             _dsTelCallRepository = dsTelCallRepository;
+            _dsOrderVisitSendRepository = dsOrderVisitSendRepository;
         }
         #endregion
 
@@ -121,7 +120,201 @@ namespace DataSharing.Province
             "RGDH9951150024051500001",
             "RGDH9951150024051500002",
             "RGDH9951150024051500006",
-            "RGDH9951150024051500003"
+            "RGDH9951150024051500003",
+            "RGDH9951150024041200003",
+            "RGDH9951150024041200004",
+            "RGDH9951150024041200005",
+            "RGDH9951150024041300001",
+            "RGDH9951150024041300005",
+            "RGDH9951150024041300006",
+            "RGDH9951150024041300014",
+            "RGDH9951150024041300019",
+            "RGDH9951150024041300011",
+            "RGDH9951150024041300018",
+            "RGDH9951150024041300021",
+            "RGDH9951150024041300022",
+            "RGDH9951150024041300024",
+            "RGDH9951150024041400001",
+            "RGDH9951150024041400002",
+            "RGDH9951150024041400003",
+            "RGDH9951150024041400006",
+            "RGDH9951150024041500004",
+            "RGDH9951150024041500001",
+            "RGDH9951150024041500007",
+            "RGDH9951150024041500009",
+            "RGDH9951150024041500008",
+            "RGDH9951150024041500010",
+            "RGDH9951150024041500006",
+            "RGDH9951150024041600001",
+            "RGDH9951150024041700002",
+            "RGDH9951150024041700006",
+            "RGDH9951150024041700003",
+            "RGDH9951150024041700001",
+            "RGDH9951150024041700005",
+            "RGDH9951150024041800003",
+            "RGDH9951150024041800005",
+            "RGDH9951150024041800002",
+            "RGDH9951150024041800001",
+            "RGDH9951150024041800015",
+            "RGDH9951150024041800008",
+            "RGDH9951150024041800018",
+            "RGDH9951150024041800022",
+            "RGDH9951150024041800031",
+            "RGDH9951150024041800030",
+            "RGDH9951150024032900004",
+            "RGDH9951150024032900001",
+            "RGDH9951150024032900002",
+            "RGDH9951150024032900003",
+            "RGDH9951150024032900008",
+            "RGDH9951150024032900010",
+            "RGDH9951150024032900012",
+            "RGDH9951150024032900015",
+            "RGDH9951150024032900014",
+            "RGDH9951150024032900019",
+            "RGDH9951150024032900018",
+            "RGDH9951150024032900017",
+            "RGDH9951150024032900013",
+            "RGDH9951150024032900022",
+            "RGDH9951150024032900023",
+            "RGDH9951150024032900025",
+            "RGDH9951150024033000002",
+            "RGDH9951150024033000004",
+            "RGDH9951150024033000003",
+            "RGDH9951150024033000005",
+            "RGDH9951150024033100006",
+            "RGDH9951150024033100005",
+            "RGDH9951150024033100003",
+            "RGDH9951150024033100004",
+            "RGDH9951150024033100009",
+            "RGDH9951150024033100002",
+            "RGDH9951150024033100013",
+            "RGDH9951150024033100011",
+            "RGDH9951150024033100014",
+            "RGDH9951150024033100015",
+            "RGDH9951150024033100017",
+            "QT9951150024040100006",
+            "RGDH9951150024040100007",
+            "RGDH9951150024040100003",
+            "RGDH9951150024040100009",
+            "RGDH9951150024040100002",
+            "RGDH9951150024040100010",
+            "RGDH9951150024040100014",
+            "RGDH9951150024040100012",
+            "RGDH9951150024040100017",
+            "RGDH9951150024040100015",
+            "RGDH9951150024040200001",
+            "RGDH9951150024040200006",
+            "RGDH9951150024040200004",
+            "RGDH9951150024040200007",
+            "RGDH9951150024040200009",
+            "RGDH9951150024040200012",
+            "RGDH9951150024040200015",
+            "RGDH9951150024040200014",
+            "RGDH9951150024040200019",
+            "RGDH9951150024041900001",
+            "RGDH9951150024041900003",
+            "RGDH9951150024041900009",
+            "RGDH9951150024042000001",
+            "RGDH9951150024042100002",
+            "RGDH9951150024042100003",
+            "RGDH9951150024042100004",
+            "RGDH9951150024042200002",
+            "RGDH9951150024042200005",
+            "RGDH9951150024042200003",
+            "RGDH9951150024042200008",
+            "RGDH9951150024042200006",
+            "RGDH9951150024042200011",
+            "RGDH9951150024042200012",
+            "RGDH9951150024042200015",
+            "RGDH9951150024042200016",
+            "RGDH9951150024042200014",
+            "RGDH9951150024042200021",
+            "RGDH9951150024042200023",
+            "RGDH9951150024042200025",
+            "RGDH9951150024040200018",
+            "RGDH9951150024040200022",
+            "RGDH9951150024040200023",
+            "RGDH9951150024040300001",
+            "RGDH9951150024040300003",
+            "RGDH9951150024042200027",
+            "RGDH9951150024042300002",
+            "RGDH9951150024042300001",
+            "RGDH9951150024042300004",
+            "RGDH9951150024042300006",
+            "RGDH9951150024040300007",
+            "RGDH9951150024040300009",
+            "RGDH9951150024040300010",
+            "RGDH9951150024040300012",
+            "RGDH9951150024040400001",
+            "RGDH9951150024042300007",
+            "RGDH9951150024042400001",
+            "RGDH9951150024042400005",
+            "RGDH9951150024042400011",
+            "RGDH9951150024042400013",
+            "RGDH9951150024040500002",
+            "RGDH9951150024040500001",
+            "RGDH9951150024040600001",
+            "RGDH9951150024040600002",
+            "RGDH9951150024040600005",
+            "RGDH9951150024040600004",
+            "RGDH9951150024040700001",
+            "RGDH9951150024040700002",
+            "RGDH9951150024040700006",
+            "RGDH9951150024040700005",
+            "RGDH9951150024040700007",
+            "RGDH9951150024040700009",
+            "RGDH9951150024040700008",
+            "RGDH9951150024040700011",
+            "RGDH9951150024040700012",
+            "RGDH9951150024040700014",
+            "RGDH9951150024040700015",
+            "RGDH9951150024040700019",
+            "RGDH9951150024040700017",
+            "RGDH9951150024040700020",
+            "RGDH9951150024040700025",
+            "RGDH9951150024042400015",
+            "RGDH9951150024042400014",
+            "RGDH9951150024042500002",
+            "RGDH9951150024042500003",
+            "RGDH9951150024042600002",
+            "RGDH9951150024040700026",
+            "RGDH9951150024040700023",
+            "RGDH9951150024040800001",
+            "RGDH9951150024040800003",
+            "RGDH9951150024040800005",
+            "RGDH9951150024040800008",
+            "RGDH9951150024040800010",
+            "RGDH9951150024040800011",
+            "RGDH9951150024040800012",
+            "RGDH9951150024040800014",
+            "RGDH9951150024040900001",
+            "RGDH9951150024040900002",
+            "QT9951150024040900006",
+            "RGDH9951150024040900009",
+            "RGDH9951150024040900008",
+            "RGDH9951150024042600003",
+            "RGDH9951150024042600006",
+            "RGDH9951150024042800001",
+            "RGDH9951150024042800003",
+            "RGDH9951150024042800005",
+            "RGDH9951150024041000005",
+            "RGDH9951150024041000007",
+            "RGDH9951150024041000006",
+            "RGDH9951150024041000010",
+            "RGDH9951150024041000004",
+            "RGDH9951150024042800009",
+            "RGDH9951150024042800006",
+            "RGDH9951150024042800008",
+            "RGDH9951150024042800012",
+            "RGDH9951150024042900002",
+            "RGDH9951150024042900001",
+            "RGDH9951150024042900005",
+            "RGDH9951150024043000005",
+            "RGDH9951150024043000007",
+            "RGDH9951150024043000008",
+            "RGDH9951150024041100001",
+            "RGDH9951150024041100006",
+            "RGDH9951150024041100004"
         };
             for (int i = 0; i < list.Count; i++)
             {
@@ -187,23 +380,33 @@ namespace DataSharing.Province
                 {
                     if (dto.TaskType == "SubmitCaseInfo")
                     {
-                        var dataOrder = System.Text.Json.JsonSerializer.Deserialize<ProvinceListRequestSubmitCaseInfo>(dto.Request);//
-                        if (dataOrder != null && dataOrder.Data != null)
+                        var dsOrder = await _dataOrderRepository.GetAsync(p => p.ProvinceNo == dto.ProvinceNo, cancellationToken);
+                        if (dsOrder != null)
                         {
-                            var orderItems = dataOrder.Data.Items;
-                            foreach (var item in orderItems)
-                            {
-                                var dsOrder = await _dataOrderRepository.GetAsync(p => p.ProvinceNo == item.CaseSerial, cancellationToken);
-                                if (dsOrder != null)
-                                {
-                                    if (dsOrder.FirstSendProvinceTime is null)
-                                        dsOrder.FirstSendProvinceTime = DateTime.Now;
+                            if (dsOrder.FirstSendProvinceTime is null)
+                                dsOrder.FirstSendProvinceTime = DateTime.Now;
 
-                                    dsOrder.LastSendProvinceTime = DateTime.Now;
-                                    await _dataOrderRepository.UpdateAsync(dsOrder);
-                                }
-                            }
+                            dsOrder.LastSendProvinceTime = DateTime.Now;
+                            await _dataOrderRepository.UpdateAsync(dsOrder);
                         }
+
+                        //var dataOrder = System.Text.Json.JsonSerializer.Deserialize<ProvinceListRequestSubmitCaseInfo>(dto.Request);//
+                        //if (dataOrder != null && dataOrder.Data != null)
+                        //{
+                        //    var orderItems = dataOrder.Data.Items;
+                        //    foreach (var item in orderItems)
+                        //    {
+                        //        var dsOrder = await _dataOrderRepository.GetAsync(p => p.ProvinceNo == item.CaseSerial, cancellationToken);
+                        //        if (dsOrder != null)
+                        //        {
+                        //            if (dsOrder.FirstSendProvinceTime is null)
+                        //                dsOrder.FirstSendProvinceTime = DateTime.Now;
+
+                        //            dsOrder.LastSendProvinceTime = DateTime.Now;
+                        //            await _dataOrderRepository.UpdateAsync(dsOrder);
+                        //        }
+                        //    }
+                        //}
                     }
                 }
                 #endregion
@@ -225,6 +428,24 @@ namespace DataSharing.Province
                     }
                 }
                 #endregion
+
+                #region 处理回访数据推送时间
+                if (result.ReturnInfo is not null && result.ReturnInfo.Code == "1")
+                {
+                    if (dto.TaskType == "SubmitVisitInfo" || dto.TaskType == "GetVisitInfoReceive")
+                    {
+                        var visitData = await _dsOrderVisitSendRepository.GetAsync(p => p.ProvinceNo == dto.ProvinceNo, cancellationToken);
+                        if (visitData != null)
+                        {
+                            if (visitData.FirstSendProvinceTime is null)
+                                visitData.FirstSendProvinceTime = DateTime.Now;
+
+                            visitData.LastSendProvinceTime = DateTime.Now;
+                            await _dsOrderVisitSendRepository.UpdateAsync(visitData, cancellationToken);
+                        }
+                    }
+                }
+                #endregion
             }
         }
 

+ 10 - 0
src/DataSharing/RawData/DsOrder.cs

@@ -173,6 +173,16 @@ namespace DataSharing.RawData
         [SugarColumn(ColumnDescription = "办理状态--默认办理中,归档的时候更新为办理完成", IsNullable = true)]
         public string? HandleState { get; set; } = "办理中";
 
+        /// <summary>
+        /// 实际办理人Code
+        /// </summary>
+        public string? ActualHandlerId { get; set; }
+
+        /// <summary>
+        /// 实际办理人名称
+        /// </summary>
+        public string? ActualHandlerName { get; set; }
+
         /// <summary>
         /// 实际办理部门名称
         /// </summary>

+ 83 - 0
src/DataSharing/RawData/DsOrderVisitSend.cs

@@ -0,0 +1,83 @@
+using SqlSugar;
+using XF.Domain.Repository;
+
+namespace DataSharing.RawData
+{
+    /// <summary>
+    /// 推省上回访数据
+    /// </summary>
+    public class DsOrderVisitSend : CreationEntity
+    {
+        /// <summary>
+        /// 工单ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "工单ID")]
+        public string OrderId { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "工单编号")]
+        public string OrderNo { get; set; }
+
+        /// <summary>
+        /// 省编号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "省编号")]
+        public string ProvinceNo { get; set; }
+
+        /// <summary>
+        /// 回访评价方式
+        /// </summary>
+        [SugarColumn(ColumnDescription = "回访评价方式")]
+        public string VisitType { get; set; }
+
+        /// <summary>
+        /// 回访人
+        /// </summary>
+        [SugarColumn(ColumnDescription = "回访人")]
+        public string VisitName { get; set; }
+
+        /// <summary>
+        /// 回访时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "回访时间")]
+        public DateTime? VisitTime { get; set; }
+
+        /// <summary>
+        /// 回访评价情况
+        /// </summary>
+        [SugarColumn(ColumnDescription = "回访评价情况")]
+        public string VisitRemark { get; set; }
+
+        /// <summary>
+        /// 回访结果满意度
+        /// </summary>
+        [SugarColumn(ColumnDescription = "回访结果满意度")]
+        public string SubjectResultSatifyCode { get; set; }
+
+        /// <summary>
+        /// 是否省工单
+        /// </summary>
+        [SugarColumn(ColumnDescription = "是否省工单")]
+        public bool IsProvince { get; set; }
+
+        /// <summary>
+        /// 来源
+        /// </summary>
+        [SugarColumn(ColumnDescription = "来源")]
+        public string Source { get; set; }
+
+        /// <summary>
+        /// 第一次上传省上的时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "第一次上传省上的时间", IsNullable = true)]
+        public DateTime? FirstSendProvinceTime { get; set; }
+
+        /// <summary>
+        /// 最近一次推送时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "最近一次推送时间", IsNullable = true)]
+        public DateTime? LastSendProvinceTime { get; set; }
+    }
+}

+ 6 - 0
src/DataSharing/SendTask/DsSendTaskInfo.cs

@@ -28,5 +28,11 @@ namespace DataSharing.SendTask
         /// </summary>
         [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true, ColumnDescription = "返回数据")]
         public ProvinceResponse? Result { get; set; }
+
+        /// <summary>
+        /// 其他平台返回数据
+        /// </summary>
+        [SugarColumn(ColumnDataType = "text", IsNullable = true, ColumnDescription = "其他平台返回数据")]
+        public string? RequestInfo { get; set; }
     }
 }

+ 9 - 1
src/DataSharing/SendTask/SendTaskDataService.cs

@@ -1,5 +1,6 @@
 using DataSharing.DataExchange;
 using DataSharing.Enterprise;
+using DataSharing.OtherPlatformsYB;
 using DataSharing.Province;
 using Microsoft.Extensions.Logging;
 using XF.Domain.Dependency;
@@ -15,6 +16,7 @@ namespace DataSharing.SendTask
         private readonly IPusherProviderService _pusherProviderService;
         private readonly IEnterprisePusherProviderService _enterprisePusherProviderService;
         private readonly IDataExchangePusherProviderService _dataExchangePusherProviderService;
+        private readonly IZzptPusherProviderService _zzptPusherProviderService;
 
         /// <summary>
         /// 
@@ -23,15 +25,18 @@ namespace DataSharing.SendTask
         /// <param name="pusherProviderService"></param>
         /// <param name="enterprisePusherProviderService"></param>
         /// <param name="dataExchangePusherProviderService"></param>
+        /// <param name="zzptPusherProviderService"></param>
         public SendTaskDataService(ILogger<SendTaskDataService> logger,
          IPusherProviderService pusherProviderService,
          IEnterprisePusherProviderService enterprisePusherProviderService,
-         IDataExchangePusherProviderService dataExchangePusherProviderService)
+         IDataExchangePusherProviderService dataExchangePusherProviderService,
+         IZzptPusherProviderService zzptPusherProviderService)
         {
             _logger = logger;
             _pusherProviderService = pusherProviderService;
             _enterprisePusherProviderService = enterprisePusherProviderService;
             _dataExchangePusherProviderService = dataExchangePusherProviderService;
+            _zzptPusherProviderService = zzptPusherProviderService;
         }
 
         /// <summary>
@@ -60,6 +65,9 @@ namespace DataSharing.SendTask
                 case Share.Enums.EPlatformSource.Enterprise:
                     await _enterprisePusherProviderService.SendEnterpriseDataPusher(dto, cancellationToken);
                     break;
+                case Share.Enums.EPlatformSource.ZZPT:
+                    await _zzptPusherProviderService.SendDataPusher(dto, cancellationToken);
+                    break;
                 default:
                     break;
             }