Browse Source

修改市州互转

tangjiang 8 months ago
parent
commit
bf91c4454b
31 changed files with 351 additions and 213 deletions
  1. 30 0
      src/DataSharing.Application/Identity/DefaultSessionContext.cs
  2. 13 0
      src/DataSharing.Application/Identity/ISharingSessionContext.cs
  3. 7 3
      src/DataSharing.Application/Identity/IdentityAppService.cs
  4. 6 25
      src/DataSharing.Application/Receivers/ProvinceReceiver.cs
  5. 117 2
      src/DataSharing.Host/Controllers/CityDataExchangeController.cs
  6. 13 1
      src/DataSharing.Host/Controllers/TestController.cs
  7. 4 10
      src/DataSharing.Host/config/appsettings.Development.json
  8. 0 34
      src/DataSharing.Share/Dtos/FileJson.cs
  9. 2 1
      src/DataSharing.YiBin/Enterprise/EnterpriseService.cs
  10. 2 2
      src/DataSharing.YiBin/YiBinSendTaskDataService.cs
  11. 2 3
      src/DataSharing.ZiGong/ZiGongSendTaskDataService.cs
  12. 9 0
      src/DataSharing/AppClaimTypes.cs
  13. 0 14
      src/DataSharing/ChannelConfiguration.cs
  14. 13 1
      src/DataSharing/ChannelConfigurationManager.cs
  15. 62 1
      src/DataSharing/CityStateDataExchange/CityStateDataExchangeClient.cs
  16. 2 2
      src/DataSharing/CityStateDataExchange/CityStateDataExchangePusherProviderService.cs
  17. 25 104
      src/DataSharing/CityStateDataExchange/CityStateDataExchangeService.cs
  18. 1 2
      src/DataSharing/CityStateDataExchange/ICityStateDataExchangeService.cs
  19. 2 1
      src/DataSharing/FwDataExchange/FwClient.cs
  20. 1 0
      src/DataSharing/Province/ProvinceService.cs
  21. 1 0
      src/DataSharing/Province/SendTask/ProvinceOther/DsSendTaskProvinceOther.cs
  22. 1 0
      src/DataSharing/Province/SendTask/ProvinceOther/DsWaitSendTaskProvinceOther.cs
  23. 1 1
      src/DataSharing/RawData/DsOrder.cs
  24. 1 0
      src/DataSharing/RawData/DsOrderWorkFlow.cs
  25. 1 0
      src/DataSharing/SendTask/DsSendTask.cs
  26. 3 2
      src/DataSharing/SendTask/IInitPushDataService.cs
  27. 1 2
      src/DataSharing/SendTask/ISendTaskDataService.cs
  28. 3 2
      src/DataSharing/SendTask/InitPushDataService.cs
  29. 1 0
      src/DataSharing/SendTask/OtherPlatforms/DsSendTaskOtherPlatforms.cs
  30. 1 0
      src/DataSharing/SendTask/OtherPlatforms/DsWaitSendTaskOtherPlatforms.cs
  31. 26 0
      src/DataSharing/SharingConfiguration.cs

+ 30 - 0
src/DataSharing.Application/Identity/DefaultSessionContext.cs

@@ -0,0 +1,30 @@
+using Microsoft.AspNetCore.Http;
+using System.Security.Claims;
+using XF.Domain.Dependency;
+
+namespace DataSharing.Application.Identity
+{
+    public class DefaultSessionContext : ISharingSessionContext, IScopeDependency
+    {
+        public DefaultSessionContext(IHttpContextAccessor httpContextAccessor)
+        {
+            var httpContext = httpContextAccessor.HttpContext;
+            if (httpContext is null)
+                return;
+
+            var user = httpContext.User;
+            Id = user.FindFirstValue(ClaimTypes.NameIdentifier);
+            AccountId = user.FindFirstValue(AppClaimTypes.AccountId);
+            PlatformSource = user.FindFirstValue(AppClaimTypes.PlatformSource);
+            PlatformSourceName = user.FindFirstValue(AppClaimTypes.PlatformSourceName);
+        }
+
+        public string? Id { get; set; }
+
+        public string? AccountId { get; set; }
+
+        public string? PlatformSource { get; set; }
+
+        public string? PlatformSourceName { get; set; }
+    }
+}

+ 13 - 0
src/DataSharing.Application/Identity/ISharingSessionContext.cs

@@ -0,0 +1,13 @@
+namespace DataSharing.Application.Identity
+{
+    public interface ISharingSessionContext
+    {
+        string? Id { get; set; }
+
+        string? AccountId { get; set; }
+
+        string? PlatformSource { get; set; }
+
+        string? PlatformSourceName { get; set; }
+    }
+}

+ 7 - 3
src/DataSharing.Application/Identity/IdentityAppService.cs

@@ -47,7 +47,9 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
             //new(JwtClaimTypes.Id, account.Id),
             new(JwtClaimTypes.Subject, account.Id),
             new(JwtClaimTypes.Scope, jwtOptions.Scope),
-            new(JwtClaimTypes.Name, account.AccountId)
+            new(AppClaimTypes.AccountId, account.AccountId),
+            new(AppClaimTypes.PlatformSource, account.PlatformSource),
+            new(AppClaimTypes.PlatformSourceName, account.PlatformSourceName),
         };
 
         var token = _jwtSecurity.EncodeJwtToken(claims);
@@ -86,9 +88,11 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
         var claims = new List<Claim>
         {
             //new(JwtClaimTypes.Id, account.Id),
-            new(JwtClaimTypes.Subject, account.Id),
+          new(JwtClaimTypes.Subject, account.Id),
             new(JwtClaimTypes.Scope, jwtOptions.Scope),
-            new(JwtClaimTypes.Name, account.AccountId)
+            new(AppClaimTypes.AccountId, account.AccountId),
+            new(AppClaimTypes.PlatformSource, account.PlatformSource),
+            new(AppClaimTypes.PlatformSourceName, account.PlatformSourceName),
         };
 
         var token = _jwtSecurity.EncodeJwtToken(claims);

+ 6 - 25
src/DataSharing.Application/Receivers/ProvinceReceiver.cs

@@ -7,6 +7,7 @@ using DataSharing.SendTask;
 using DataSharing.Share.Dtos.Province.HuiJu;
 using DataSharing.Share.Dtos.Province.XieTong.Send;
 using DotNetCore.CAP;
+using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.TrCallCenter;
@@ -195,7 +196,7 @@ namespace DataSharing.Application.Receivers
                     HandleState = dto.Status >= EOrderStatus.Filed ? "办理完成" : "办理中",
                     StartTime = dto.StartTime,
                     CallId = dto.CallId,
-                    FileJson = _mapper.Map<List<DataSharing.Share.Dtos.FileJson>>(dto.FileJson)
+                    FileJson = _mapper.Map<List<FileJson>>(dto.FileJson)
                 };
 
                 try
@@ -231,7 +232,7 @@ namespace DataSharing.Application.Receivers
                         dataOrderNew.StartTime = dto.StartTime;
                         dataOrderNew.CallId = dto.CallId;
                         dataOrderNew.ActualHandleTime = dto.ActualHandleTime;
-                        dataOrderNew.FileJson = _mapper.Map<List<DataSharing.Share.Dtos.FileJson>>(dto.FileJson);
+                        dataOrderNew.FileJson = _mapper.Map<List<FileJson>>(dto.FileJson);
                         await _dsOrderRepository.UpdateAsync(dataOrderNew, cancellationToken);
                     }
                 }
@@ -261,7 +262,7 @@ namespace DataSharing.Application.Receivers
                 dataOrder.StartTime = dto.StartTime;
                 dataOrder.CallId = dto.CallId;
                 dataOrder.ActualHandleTime = dto.ActualHandleTime;
-                dataOrder.FileJson = _mapper.Map<List<DataSharing.Share.Dtos.FileJson>>(dto.FileJson);
+                dataOrder.FileJson = _mapper.Map<List<FileJson>>(dto.FileJson);
 
                 await _dsOrderRepository.UpdateAsync(dataOrder, cancellationToken);
             }
@@ -493,7 +494,7 @@ namespace DataSharing.Application.Receivers
                     ActualHandleTime = order.ActualHandleTime,
                     StartTime = order.StartTime,
                     CallId = order.CallId,
-                    FileJson = _mapper.Map<List<DataSharing.Share.Dtos.FileJson>>(order.FileJson)
+                    FileJson = _mapper.Map<List<FileJson>>(order.FileJson)
                 };
 
                 try
@@ -753,28 +754,8 @@ namespace DataSharing.Application.Receivers
             //泸州市州数据提交
             if (dto.Transpond == true)
             {
-                //判断推送市州
-                string PlatformSource = "";
-                switch (dto.TranspondCityValue)
-                {
-                    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 _sendTaskDataService.TranspondCityAsync(dto, PlatformSource, cancellationToken);
+                await _sendTaskDataService.TranspondCityAsync(dto, cancellationToken);
             }
         }
         #endregion

+ 117 - 2
src/DataSharing.Host/Controllers/CityDataExchangeController.cs

@@ -1,10 +1,12 @@
-using DataSharing.CityStateDataExchange;
+using DataSharing.Application.Identity;
+using DataSharing.CityStateDataExchange;
 using DataSharing.FwDataExchange;
 using DataSharing.RawData;
 using DataSharing.Share.Dtos;
 using DataSharing.Share.Dtos.CityStateDataExchange;
 using DataSharing.Share.Dtos.HotlineSetting;
 using DotNetCore.CAP;
+using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.OrderTranspond;
 using Hotline.Share.Enums.Order;
 using MapsterMapper;
@@ -14,6 +16,7 @@ using Microsoft.AspNetCore.Mvc;
 using System.Security.Cryptography;
 using System.Text;
 using System.Web;
+using XF.Domain.Authentications;
 using XF.Domain.Filters;
 using XF.Domain.Repository;
 
@@ -31,6 +34,7 @@ namespace DataSharing.Host.Controllers
         private readonly IRepository<DsReceiveDataExchangeData> _dsReceiveDataExchangeDataRepository;
         private readonly FwClient _fwClient;
         private readonly IRepository<DsUserTokenInfo> _dsUserTokenInfoRepository;
+        private readonly ISharingSessionContext _sessionContext;
 
         /// <summary>
         /// 
@@ -47,7 +51,8 @@ namespace DataSharing.Host.Controllers
             IChannelConfigurationManager channelConfigurationManager,
             IRepository<DsReceiveDataExchangeData> dsReceiveDataExchangeDataRepository,
             FwClient fwClient,
-            IRepository<DsUserTokenInfo> dsUserTokenInfoRepository)
+            IRepository<DsUserTokenInfo> dsUserTokenInfoRepository,
+            ISharingSessionContext sessionContext)
         {
             _mapper = mapper;
             _mediator = mediator;
@@ -56,6 +61,116 @@ namespace DataSharing.Host.Controllers
             _dsReceiveDataExchangeDataRepository = dsReceiveDataExchangeDataRepository;
             _fwClient = fwClient;
             _dsUserTokenInfoRepository = dsUserTokenInfoRepository;
+            _sessionContext = sessionContext;
+        }
+
+        /// <summary>
+        /// 市州互转
+        /// </summary>
+        /// <param name="dto">数据互换</param>
+        /// <returns></returns>
+        [HttpPost("city_exchange_add_order")]
+        public async Task<OpenResponse> CityExchangeAddOrder([FromBody] OrderDto dto)
+        {
+            // 验证
+            if (dto is null)
+                return OpenResponse.Ok(CityStateDataExchangeDeReponse.Failed(description: "数据解析失败"));
+
+            //写入原始数据表
+            var data = new DsReceiveDataExchangeData()
+            {
+                ExternalId = dto.No,
+                ServiceInterface = "city_exchange_add_order",
+                ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto)
+            };
+            await _dsReceiveDataExchangeDataRepository.AddAsync(data, HttpContext.RequestAborted);
+
+            var orderData = _mapper.Map<AddOrderDto>(dto);
+            orderData.SourceChannel = "市州互转";
+            orderData.SourceChannelCode = "SZHZ";
+            orderData.ExternalId = dto.Id;
+            switch (_sessionContext.PlatformSource)
+            {
+                case "CityDataExchangeYB":
+                    orderData.Source = ESource.CityDataExchangeYB;
+                    break;
+                case "CityDataExchangeLz":
+                    orderData.Source = ESource.CityDataExchangeLz;
+                    break;
+                case "CityDataExchangeZG":
+                    orderData.Source = ESource.CityDataExchangeZG;
+                    break;
+                default:
+                    break;
+            }
+
+            var result = await _fwClient.RequestNoTokenAsync<HotlineClientResponse>("api/v1/Order/add-anonymous", "Post", System.Text.Json.JsonSerializer.Serialize(orderData));
+
+            if (result != null && result.code == 0)
+            {
+                var cityName = "";
+                switch (dto.Source)
+                {
+                    case ESource.CityDataExchangeLz:
+                        cityName = "泸州12345";
+                        break;
+                    case ESource.CityDataExchangeYB:
+                        cityName = "宜宾12345";
+                        break;
+                    case ESource.CityDataExchangeZG:
+                        cityName = "自贡12345";
+                        break;
+                    default:
+                        break;
+                }
+                TranspondCityRawDataDto cityRawDataDto = new()
+                {
+                    OrderCode = dto.No,
+                    TransferOutTime = DateTime.Now,
+                    SendTimes = 1,
+                    IsSuccess = true,
+                    Result = System.Text.Json.JsonSerializer.Serialize(dto),
+                    CityName = cityName,
+                    Direction = ETranspondDirection.In,
+                    NewCode = result.result.no
+                };
+                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.SharingOrderReceiveTranspondCity, cityRawDataDto, cancellationToken: HttpContext.RequestAborted);
+
+                return OpenResponse.Ok(CityStateDataExchangeDeReponse.Success(result.result.no, result.result.password, "您已成功提交数据!"));
+            }
+            else
+                return OpenResponse.Ok(CityStateDataExchangeDeReponse.Failed(description: "接口调用失败!"));
+        }
+
+        /// <summary>
+        /// 办理结果
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("city_exchange_add_opinion")]
+        public async Task<OpenResponse> CityExchangeAddOpinion([FromForm] OrderDto dto)
+        {
+            // 验证
+            if (dto is null)
+                return OpenResponse.Ok(CityStateDataExchangeDeReponse.Failed(description: "数据解析失败"));
+
+            //写入原始数据表
+            var data = new DsReceiveDataExchangeData()
+            {
+                ExternalId = dto.ExternalId,
+                ServiceInterface = "city_exchange_add_opinion",
+                ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto)
+            };
+            await _dsReceiveDataExchangeDataRepository.AddAsync(data, HttpContext.RequestAborted);
+
+            TranspondCityOrderResultDto transpondCityOrderResultDto = new()
+            {
+                No = dto.ExternalId,
+                Opinion = dto.ActualOpinion
+            };
+            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.SharingOrderReceiveHandleOpinionTranspondCity, transpondCityOrderResultDto, cancellationToken: HttpContext.RequestAborted);
+
+            return OpenResponse.Ok(CityStateDataExchangeDeReponse.Success("", "", "您已成功提交数据!"));
         }
 
         /// <summary>

+ 13 - 1
src/DataSharing.Host/Controllers/TestController.cs

@@ -43,6 +43,7 @@ namespace DataSharing.Host.Controllers
         private readonly IRepository<DsWaitSendTaskSubmitCaseRecord> _waitSendTaskSubmitCaseRecordRepository;
         private readonly IRepository<DsOrderSend> _dsOrderSendRepository;
         private readonly IRepository<DsOrder> _dsOrderRepository;
+        private readonly ISharingSessionContext _sessionContext;
 
 
 
@@ -65,7 +66,8 @@ namespace DataSharing.Host.Controllers
               ISharingConfigurationManager sharingConfigurationManager,
               IRepository<DsWaitSendTaskSubmitCaseRecord> waitSendTaskSubmitCaseRecordRepository,
             IRepository<DsOrderSend> dsOrderSendRepository,
-           IRepository<DsOrder> dsOrderRepository
+           IRepository<DsOrder> dsOrderRepository,
+           ISharingSessionContext sessionContext
 
               )
         {
@@ -89,9 +91,19 @@ namespace DataSharing.Host.Controllers
             _waitSendTaskSubmitCaseRecordRepository = waitSendTaskSubmitCaseRecordRepository;
             _dsOrderSendRepository = dsOrderSendRepository;
             _dsOrderRepository = dsOrderRepository;
+            _sessionContext = sessionContext;
         }
         #endregion
 
+        /// <summary>
+        /// 
+        /// </summary>
+        [HttpGet("aaaaaaaaa")]
+        public  void asdaa()
+        {
+            var ss = _sessionContext;
+        }
+
         /// <summary>
         /// 处理历史数据标题
         /// </summary>

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

@@ -117,11 +117,8 @@
 
       //市州数据交换
       "CityHandOver": {
-        "PushOrder": "CityHandOver.asmx/FlowWrite",
-        "PushOpinion": "CityHandOver.asmx/UndertakAdvice",
-        "NewPushOrder": "api/v1/CityDataExchange/city_hand_data",
-        "NewPushOpinion": "api/v1/CityDataExchange/city_undertak_advice_data",
-        "IsNew": false
+        "PushOrder": "api/v1/CityDataExchange/city_hand_data",
+        "PushOpinion": "api/v1/CityDataExchange/city_undertak_advice_data"
       },
 
       //新老数据交换配置
@@ -209,11 +206,8 @@
 
       //市州数据交换
       "CityHandOver": {
-        "PushOrder": "CityHandOver.asmx/FlowWrite",
-        "PushOpinion": "CityHandOver.asmx/UndertakAdvice",
-        "NewPushOrder": "api/v1/CityDataExchange/city_hand_data",
-        "NewPushOpinion": "api/v1/CityDataExchange/city_undertak_advice_data",
-        "IsNew": false
+        "PushOrder": "api/v1/CityDataExchange/city_hand_data",
+        "PushOpinion": "api/v1/CityDataExchange/city_undertak_advice_data",
       },
 
       //新老数据交换配置

+ 0 - 34
src/DataSharing.Share/Dtos/FileJson.cs

@@ -1,34 +0,0 @@
-namespace DataSharing.Share.Dtos
-{
-    /// <summary>
-    /// 附件
-    /// </summary>
-    public class FileJson
-    {
-        /// <summary>
-        /// Id
-        /// </summary>
-        public string Id { get; set; }
-
-        /// <summary>
-        /// 附件名称
-        /// </summary>
-        public string FileName { get; set; }
-
-        /// <summary>
-        /// 附件后缀
-        /// </summary>
-        public string FileType { get; set; }
-
-        /// <summary>
-        /// 附件Id
-        /// </summary>
-        public string FileId { get; set; }
-
-        /// <summary>
-        /// 附件地址
-        /// </summary>
-
-        public string Path { get; set; }
-    }
-}

+ 2 - 1
src/DataSharing.YiBin/Enterprise/EnterpriseService.cs

@@ -2,6 +2,7 @@
 using DataSharing.SendTask;
 using DataSharing.Share.Dtos.YiBin.Enterprise;
 using DataSharing.Share.Enums;
+using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.Order;
 using MapsterMapper;
 using Microsoft.Extensions.Logging;
@@ -41,7 +42,7 @@ namespace DataSharing.YiBin.Enterprise
         public async Task InitEnterpriseDataAsync(OrderDto dto, CancellationToken cancellationToken)
         {
             var enterpriseData = _mapper.Map<PushWorkOrder>(dto);
-            var fileJson = _mapper.Map<List<DataSharing.Share.Dtos.FileJson>>(dto.FileJson);
+            var fileJson = _mapper.Map<List<FileJson>>(dto.FileJson);
 
             //将待推送数据写入待推送表
             //await _initPushDataService.InitPushDataAsync("EnterprisePushWorkOrder", YbEnterpriseDefaults.PathEnterprisesWorkOrder, System.Text.Json.JsonSerializer.Serialize(enterpriseData), dto.ProvinceNo,

+ 2 - 2
src/DataSharing.YiBin/YiBinSendTaskDataService.cs

@@ -141,10 +141,10 @@ namespace DataSharing.YiBin
         /// <param name="PlatformSource"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task TranspondCityAsync(OrderDto dto,string PlatformSource, CancellationToken cancellationToken)
+        public async Task TranspondCityAsync(OrderDto dto, CancellationToken cancellationToken)
         {
             //数据推送
-            await _cityStateDataExchangeService.InitCityDataAsync(dto, PlatformSource, cancellationToken);
+            await _cityStateDataExchangeService.InitCityDataAsync(dto, cancellationToken);
         }
     }
 }

+ 2 - 3
src/DataSharing.ZiGong/ZiGongSendTaskDataService.cs

@@ -101,13 +101,12 @@ namespace DataSharing.ZiGong
         /// 市州互转
         /// </summary>
         /// <param name="dto"></param>
-        /// <param name="PlatformSource"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task TranspondCityAsync(OrderDto dto, string PlatformSource, CancellationToken cancellationToken)
+        public async Task TranspondCityAsync(OrderDto dto, CancellationToken cancellationToken)
         {
             //数据推送
-            await _cityStateDataExchangeService.InitCityDataAsync(dto, PlatformSource, cancellationToken);
+            await _cityStateDataExchangeService.InitCityDataAsync(dto, cancellationToken);
         }
     }
 }

+ 9 - 0
src/DataSharing/AppClaimTypes.cs

@@ -0,0 +1,9 @@
+namespace DataSharing
+{
+    public class AppClaimTypes
+    {
+        public const string AccountId = "account_id";
+        public const string PlatformSource = "platform_source";
+        public const string PlatformSourceName = "platform_source_name";
+    }
+}

+ 0 - 14
src/DataSharing/ChannelConfiguration.cs

@@ -81,20 +81,6 @@
         /// </summary>
         public string PushOpinion { get; set; } = string.Empty;
 
-        /// <summary>
-        /// 新版信件接收接口地址
-        /// </summary>
-        public string NewPushOrder { get; set; } = string.Empty;
-
-        /// <summary>
-        /// 新版办理结果接收地址
-        /// </summary>
-        public string NewPushOpinion { get; set; } = string.Empty;
-
-        /// <summary>
-        /// 是否是新版
-        /// </summary>
-        public bool IsNew { get; set; }
     }
 
     /// <summary>

+ 13 - 1
src/DataSharing/ChannelConfigurationManager.cs

@@ -117,6 +117,12 @@ namespace DataSharing
         /// </summary>
         /// <returns></returns>
         CityZiGongConfig GetZiGongConfig();
+
+        /// <summary>
+        /// 获取泸州配置
+        /// </summary>
+        /// <returns></returns>
+        CityLuZhouConfig GetLuZhouConfig();
     }
 
     /// <summary>
@@ -159,7 +165,7 @@ namespace DataSharing
         /// 
         /// </summary>
         /// <returns></returns>
-        public string GetHotlineName()=> _sharingOption.Value.HotlineName;
+        public string GetHotlineName() => _sharingOption.Value.HotlineName;
 
         /// <summary>
         /// 
@@ -190,5 +196,11 @@ namespace DataSharing
         /// </summary>
         /// <returns></returns>
         public CityZiGongConfig GetZiGongConfig() => _sharingOption.Value.CityZiGong;
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public CityLuZhouConfig GetLuZhouConfig() => _sharingOption.Value.CityLuZhou;
     }
 }

+ 62 - 1
src/DataSharing/CityStateDataExchange/CityStateDataExchangeClient.cs

@@ -1,11 +1,18 @@
-using Microsoft.AspNetCore.Http;
+using DataSharing.Province;
+using DataSharing.RawData;
+using DataSharing.Share.Dtos;
+using DataSharing.Share.Dtos.Province;
+using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.DependencyInjection;
+using XF.Domain.Cache;
 using XF.Domain.Dependency;
+using XF.Domain.Exceptions;
 
 namespace DataSharing.CityStateDataExchange
 {
     public class CityStateDataExchangeClient : ISingletonDependency, ISelfDependency
     {
+        private static readonly string KeyToken = "KeyFwToken";
         private readonly IServiceScopeFactory _scopeFactory;
         private readonly IHttpClientFactory _httpClientFactory;
 
@@ -51,5 +58,59 @@ namespace DataSharing.CityStateDataExchange
             return System.Text.Json.JsonSerializer.Deserialize<TResponse>(rsp);
         }
 
+        /// <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>(DsUserTokenInfo userInfo, string url, string httpMethod, string? stringContent = null, CancellationToken cancellationToken = default)
+        {
+            using var scope = _scopeFactory.CreateScope();
+            var provider = scope.ServiceProvider;
+            var sharingConfigurationManager = provider.GetRequiredService<ISharingConfigurationManager>();
+            var httpInvoker = provider.GetRequiredService<IHttpInvoker>();
+            var cacheToken = provider.GetRequiredService<ITypedCache<ProvinceTokenInfo>>();
+            var token = cacheToken.GetOrSet(KeyToken + "_" + userInfo.PlatformSource,
+                   d => GetToken(userInfo.AddressUrl, userInfo.AccountId, userInfo.AccountSecret, cancellationToken).GetAwaiter().GetResult(),
+                   TimeSpan.FromMinutes(598));
+            return await httpInvoker.RequestStringContentAsync<TResponse>(url, httpMethod, stringContent,
+                d => d.SetHttpClient(userInfo.AddressUrl, token?.Token ?? string.Empty), cancellationToken);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<ProvinceTokenInfo> GetToken(string AddressUrl, string ClientID, string Secret, CancellationToken cancellationToken)
+        {
+            using var scope = _scopeFactory.CreateScope();
+            var provider = scope.ServiceProvider;
+            var cacheToken = provider.GetRequiredService<ITypedCache<ProvinceTokenInfo>>();
+            var httpInvoker = provider.GetRequiredService<IHttpInvoker>();
+
+            var sharingConfigurationManager = provider.GetRequiredService<ISharingConfigurationManager>();
+
+            string url = $"api/token?ClientID={ClientID}&Secret={Secret}";
+
+            var baseAddress = AddressUrl;
+            if (!baseAddress.EndsWith('/'))
+                baseAddress += "/";
+
+            var toke = await httpInvoker.RequestStringContentAsync<GetDataBaseReponse<ProvinceTokenInfo>>(baseAddress + url, "Get",
+                    null, d => d.SetHttpClient(AddressUrl), cancellationToken);
+
+            if (toke is null || toke.data is null)
+                throw new UserFriendlyException("获取token请求失败");
+            var dataToken = toke.data;
+            if (dataToken is null || string.IsNullOrEmpty(dataToken.Token))
+                throw new UserFriendlyException("获取token请求失败");
+
+            return dataToken;
+        }
     }
 }

+ 2 - 2
src/DataSharing/CityStateDataExchange/CityStateDataExchangePusherProviderService.cs

@@ -74,13 +74,13 @@ namespace DataSharing.CityStateDataExchange
             string error = "";
             try
             {
-                response = await _dataExchangeClient.ExecuteAsync<CityStateDataExchangeResponseDto>(baseAddress + dto.Path, dto.HttpMethod, dto.Request, cancellationToken);
+                response = await _dataExchangeClient.RequestAsync<CityStateDataExchangeResponseDto>(userInfo, baseAddress + dto.Path, dto.HttpMethod, dto.Request, cancellationToken);
             }
             catch (Exception ex)
             {
                 error = ex.Message;
             }
-             
+
             //写入推送明细表
             DsSendTaskDetailInfo dsSendTaskInfo = new()
             {

+ 25 - 104
src/DataSharing/CityStateDataExchange/CityStateDataExchangeService.cs

@@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging;
 using System.Security.Cryptography;
 using System.Text;
 using System.Text.Json;
+using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 
 namespace DataSharing.CityStateDataExchange
@@ -49,65 +50,36 @@ namespace DataSharing.CityStateDataExchange
         /// 市州工单互转
         /// </summary>
         /// <param name="dto"></param>
-        /// <param name="platformSource"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task InitCityDataAsync(OrderDto dto, string platformSource, CancellationToken cancellationToken)
+        public async Task InitCityDataAsync(OrderDto dto, CancellationToken cancellationToken)
         {
-            //判断推送市州
-            string sendSource = _sharingConfigurationManager.GetHotlineName();
-
-            var userInfo = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSource == platformSource && p.State == "1", cancellationToken);
-            if (userInfo is null)
-                return;
-
-            string secretKey = GetMD5(sendSource + userInfo.AccountSecret);
-
-            var serverName = dto.IdentityType == EIdentityType.Enterprise ? "企业" : "市民";
-            Dictionary<string, string> dicParam = new()
-            {
-                { "Code", secretKey },
-                { "FSHCode", dto.No },
-                { "ServerName",  serverName},
-                { "PurTypeName", dto.AcceptType },
-                { "ConTypeName",  dto.HotspotSpliceName},
-                { "Title",  dto.Title},
-                { "LinkName",  dto.FromName},
-                { "Gender",dto.FromGender switch
-                    {
-                        EGender.Female => "2",
-                        EGender.Male => "1",
-                        _ => "0",
-                    }
-                },
-                { "Mobile", dto.Contact},
-                { "Mail","" },
-                { "Address",   dto.FullAddress },
-                { "Content",  dto.Content},
-                { "Source",sendSource }
-            };
 
             ConfigurationCityHandOver config = new();
             if (_sharingConfigurationManager.IsCity(ConfigurationConsts.YiBin))
+            {
+                dto.Source = ESource.CityDataExchangeYB;
                 config = _sharingConfigurationManager.GetYiBinConfig().CityHandOver;
+            }
             else if (_sharingConfigurationManager.IsCity(ConfigurationConsts.ZiGong))
+            {
+                dto.Source = ESource.CityDataExchangeZG;
                 config = _sharingConfigurationManager.GetZiGongConfig().CityHandOver;
+            }
+            else if (_sharingConfigurationManager.IsCity(ConfigurationConsts.LuZhou))
+            {
+                dto.Source = ESource.CityDataExchangeLz;
+                config = _sharingConfigurationManager.GetLuZhouConfig().CityHandOver;
+            }
 
-            if (config == null)
-                return;
-
-            string path = "";
-            if (config.IsNew)
-                path = config.NewPushOrder;
-            else
-                path = config.PushOrder;
-            //写入待推送数据
-            //  await _initPushDataService.InitPushDataAsync(platformSource, path, System.Text.Json.JsonSerializer.Serialize(dicParam),
-            //  dto.No, platformSource: EPlatformSource.CityDataExchange, cancellationToken: cancellationToken);
+            var userInfo = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSource == dto.Source.ToString() && p.State == "1", cancellationToken);
+            if (userInfo is null)
+                throw UserFriendlyException.SameMessage("未配置接收市州!");
 
-            var request = JsonSerializer.Serialize(dicParam, ProvinceJsonSerializerOptions.UnStandardDatetimeJsonOptions);
-            await _initPushDataService.InitDsSendTaskOtherPlatforms(platformSource, path, dto.No,
+            var request = JsonSerializer.Serialize(dto, ProvinceJsonSerializerOptions.UnStandardDatetimeJsonOptions);
+            await _initPushDataService.InitDsSendTaskOtherPlatforms(dto.Source.ToString(), config.PushOrder, dto.No,
                 request, request, EPlatformSource.CityDataExchange, cancellationToken: cancellationToken);
+
         }
 
         /// <summary>
@@ -118,77 +90,26 @@ namespace DataSharing.CityStateDataExchange
         /// <returns></returns>
         public async Task UndertakAdviceAsync(OrderDto dto, CancellationToken cancellationToken)
         {
-            //判断推送市州
-            string sendSource = _sharingConfigurationManager.GetHotlineName();
-
-
             var userInfo = await _dsUserTokenInfoRepository.GetAsync(p => p.PlatformSource == dto.Source.ToString() && p.State == "1", cancellationToken);
             if (userInfo is null)
-                return;
-
-            string secretKey = GetMD5(sendSource + userInfo.AccountSecret);
-
-            Dictionary<string, object> dic = new()
-            {
-                { "Code", secretKey }, //请求Code
-                { "SCDRCode", dto.ExternalId }, //工单编号
-                { "UndertakAdvice",  dto.ActualOpinion.Trim()}, //承办意见
-                { "Source", sendSource } //来源
-            };
+                throw UserFriendlyException.SameMessage("未配置接收市州!");
 
             ConfigurationCityHandOver config = new();
             if (_sharingConfigurationManager.IsCity(ConfigurationConsts.YiBin))
                 config = _sharingConfigurationManager.GetYiBinConfig().CityHandOver;
             else if (_sharingConfigurationManager.IsCity(ConfigurationConsts.ZiGong))
                 config = _sharingConfigurationManager.GetZiGongConfig().CityHandOver;
+            else if (_sharingConfigurationManager.IsCity(ConfigurationConsts.LuZhou))
+                config = _sharingConfigurationManager.GetLuZhouConfig().CityHandOver;
 
             if (config == null)
-                return;
-
-            string path = "";
-            if (config.IsNew)
-                path = config.NewPushOpinion;
-            else
-                path = config.PushOpinion;
+                throw UserFriendlyException.SameMessage("未配置结果接口!");
 
-            //写入待推送数据
-            // await _initPushDataService.InitPushDataAsync(userInfo.PlatformSource, path, System.Text.Json.JsonSerializer.Serialize(dic),
-            // dto.No, platformSource: EPlatformSource.CityDataExchange, cancellationToken: cancellationToken);
-            var request = JsonSerializer.Serialize(dic, ProvinceJsonSerializerOptions.UnStandardDatetimeJsonOptions);
-            await _initPushDataService.InitDsSendTaskOtherPlatforms(userInfo.PlatformSource, path, dto.No,
+            var request = JsonSerializer.Serialize(dto, ProvinceJsonSerializerOptions.UnStandardDatetimeJsonOptions);
+            await _initPushDataService.InitDsSendTaskOtherPlatforms(userInfo.PlatformSource, config.PushOpinion, dto.No,
                 request, request, EPlatformSource.CityDataExchange, cancellationToken: cancellationToken);
 
         }
 
-        #region MD5 32位加密
-        /// <summary>
-        /// MD5 32位加密
-        /// </summary>
-        /// <param name="myString"></param>
-        /// <returns></returns>
-        private static string GetMD5(string myString)
-        {
-            string cl = myString;
-            string pwd = "";
-            try
-            {
-                //实例化一个md5对像
-                MD5 md5 = MD5.Create();
-                // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 
-                byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
-                // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
-                for (int i = 0; i < s.Length; i++)
-                {
-                    // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 
-                    pwd = pwd + s[i].ToString("X2");
-                }
-            }
-            catch (Exception)
-            {
-            }
-            return pwd;
-        }
-
-        #endregion
     }
 }

+ 1 - 2
src/DataSharing/CityStateDataExchange/ICityStateDataExchangeService.cs

@@ -8,10 +8,9 @@ namespace DataSharing.CityStateDataExchange
         /// 市州工单互转
         /// </summary>
         /// <param name="dto"></param>
-        /// <param name="platformSource"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task InitCityDataAsync(OrderDto dto, string platformSource, CancellationToken cancellationToken);
+        Task InitCityDataAsync(OrderDto dto, CancellationToken cancellationToken);
 
         /// <summary>
         /// 办理意见推送

+ 2 - 1
src/DataSharing/FwDataExchange/FwClient.cs

@@ -11,6 +11,7 @@ namespace DataSharing.FwDataExchange
     {
         private static readonly string KeyToken = "KeyFwToken";
         private readonly IServiceScopeFactory _scopeFactory;
+        private readonly ISharingConfigurationManager _sharingConfigurationManager;
 
         /// <summary>
         /// 
@@ -19,11 +20,11 @@ namespace DataSharing.FwDataExchange
         public FwClient(IServiceScopeFactory scopeFactory)
         {
             _scopeFactory = scopeFactory;
+           // _sharingConfigurationManager = sharingConfigurationManager;
         }
 
         /// <summary>
         /// 
-        private readonly ISharingConfigurationManager _sharingConfigurationManager;
         /// </summary>
         /// <typeparam name="TResponse"></typeparam>
         /// <param name="url"></param>

+ 1 - 0
src/DataSharing/Province/ProvinceService.cs

@@ -13,6 +13,7 @@ using DataSharing.Share.Enums;
 using DataSharing.Validators.HuiJu;
 using DataSharing.Validators.XieTong;
 using DotNetCore.CAP;
+using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.TrCallCenter;

+ 1 - 0
src/DataSharing/Province/SendTask/ProvinceOther/DsSendTaskProvinceOther.cs

@@ -1,5 +1,6 @@
 using DataSharing.SendTask;
 using DataSharing.Share.Dtos;
+using Hotline.Share.Dtos.File;
 using SqlSugar;
 using System.ComponentModel;
 

+ 1 - 0
src/DataSharing/Province/SendTask/ProvinceOther/DsWaitSendTaskProvinceOther.cs

@@ -1,5 +1,6 @@
 using DataSharing.SendTask;
 using DataSharing.Share.Dtos;
+using Hotline.Share.Dtos.File;
 using SqlSugar;
 using System.ComponentModel;
 

+ 1 - 1
src/DataSharing/RawData/DsOrder.cs

@@ -248,7 +248,7 @@ namespace DataSharing.RawData
         /// </summary>
 
         [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
-        public List<FileJson>? FileJson { get; set; }
+        public List<Hotline.Share.Dtos.File.FileJson>? FileJson { get; set; }
 
     }
 }

+ 1 - 0
src/DataSharing/RawData/DsOrderWorkFlow.cs

@@ -1,4 +1,5 @@
 using DataSharing.Share.Dtos;
+using Hotline.Share.Dtos.File;
 using SqlSugar;
 using System.ComponentModel;
 using XF.Domain.Repository;

+ 1 - 0
src/DataSharing/SendTask/DsSendTask.cs

@@ -1,5 +1,6 @@
 using DataSharing.Share.Dtos;
 using DataSharing.Share.Enums;
+using Hotline.Share.Dtos.File;
 using SqlSugar;
 using System.ComponentModel;
 using XF.Domain.Repository;

+ 3 - 2
src/DataSharing/SendTask/IInitPushDataService.cs

@@ -1,5 +1,6 @@
 using DataSharing.Share.Dtos.Province.HuiJu;
 using DataSharing.Share.Enums;
+using Hotline.Share.Dtos.File;
 
 namespace DataSharing.SendTask
 {
@@ -64,7 +65,7 @@ namespace DataSharing.SendTask
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         Task<string> InitDsSendTaskProvinceOther(string taskType, string path, string provinceNo, string request, string requestData,
-          string httpMethod = "Post", EPathType pathType = EPathType.Other, List<Share.Dtos.FileJson>? fileJson = null,
+          string httpMethod = "Post", EPathType pathType = EPathType.Other, List<FileJson>? fileJson = null,
           DateTime? generationTime = null, CancellationToken cancellationToken = default);
 
         /// <summary>
@@ -83,7 +84,7 @@ namespace DataSharing.SendTask
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         Task<string> InitDsSendTaskOtherPlatforms(string taskType, string path, string provinceNo, string request, string requestData,
-          EPlatformSource platformSource, string httpMethod = "Post", EPathType pathType = EPathType.Other, List<Share.Dtos.FileJson>? fileJson = null,
+          EPlatformSource platformSource, string httpMethod = "Post", EPathType pathType = EPathType.Other, List<FileJson>? fileJson = null,
           DateTime? generationTime = null, CancellationToken cancellationToken = default);
 
     }

+ 1 - 2
src/DataSharing/SendTask/ISendTaskDataService.cs

@@ -42,9 +42,8 @@ namespace DataSharing.SendTask
         /// 市州互转
         /// </summary>
         /// <param name="dto"></param>
-        /// <param name="PlatformSource"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task TranspondCityAsync(OrderDto dto, string PlatformSource, CancellationToken cancellationToken);
+        Task TranspondCityAsync(OrderDto dto, CancellationToken cancellationToken);
     }
 }

+ 3 - 2
src/DataSharing/SendTask/InitPushDataService.cs

@@ -6,6 +6,7 @@ using DataSharing.Province.SendTask.SubmitCaseResult;
 using DataSharing.SendTask.OtherPlatforms;
 using DataSharing.Share.Dtos.Province.HuiJu;
 using DataSharing.Share.Enums;
+using Hotline.Share.Dtos.File;
 using MapsterMapper;
 using Microsoft.Extensions.Logging;
 using XF.Domain.Dependency;
@@ -226,7 +227,7 @@ namespace DataSharing.SendTask
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         public async Task<string> InitDsSendTaskProvinceOther(string taskType, string path, string provinceNo, string request, string requestData,
-            string httpMethod = "Post", EPathType pathType = EPathType.Other, List<Share.Dtos.FileJson>? fileJson = null,
+            string httpMethod = "Post", EPathType pathType = EPathType.Other, List<FileJson>? fileJson = null,
             DateTime? generationTime = null, CancellationToken cancellationToken = default)
         {
             DsWaitSendTaskProvinceOther waitTask = new()
@@ -265,7 +266,7 @@ namespace DataSharing.SendTask
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         public async Task<string> InitDsSendTaskOtherPlatforms(string taskType, string path, string provinceNo, string request, string requestData,
-            EPlatformSource platformSource, string httpMethod = "Post", EPathType pathType = EPathType.Other, List<Share.Dtos.FileJson>? fileJson = null,
+            EPlatformSource platformSource, string httpMethod = "Post", EPathType pathType = EPathType.Other, List<FileJson>? fileJson = null,
             DateTime? generationTime = null, CancellationToken cancellationToken = default)
         {
             DsWaitSendTaskOtherPlatforms waitTask = new()

+ 1 - 0
src/DataSharing/SendTask/OtherPlatforms/DsSendTaskOtherPlatforms.cs

@@ -1,5 +1,6 @@
 using DataSharing.Share.Dtos;
 using DataSharing.Share.Enums;
+using Hotline.Share.Dtos.File;
 using SqlSugar;
 using System.ComponentModel;
 

+ 1 - 0
src/DataSharing/SendTask/OtherPlatforms/DsWaitSendTaskOtherPlatforms.cs

@@ -1,5 +1,6 @@
 using DataSharing.Share.Dtos;
 using DataSharing.Share.Enums;
+using Hotline.Share.Dtos.File;
 using SqlSugar;
 using System.ComponentModel;
 

+ 26 - 0
src/DataSharing/SharingConfiguration.cs

@@ -44,6 +44,11 @@
         /// 市州自贡
         /// </summary>
         public CityZiGongConfig CityZiGong { get; set; }
+
+        /// <summary>
+        /// 泸州
+        /// </summary>
+        public CityLuZhouConfig CityLuZhou { get; set; }
     }
 
     /// <summary>
@@ -97,4 +102,25 @@
         /// </summary>
         public ConfigurationSendDataOld SendDataOld { get; set; }
     }
+
+    /// <summary>
+    /// 泸州
+    /// </summary>
+    public class CityLuZhouConfig
+    {
+        ///// <summary>
+        ///// 大成均图110-----自贡、雅安
+        ///// </summary>
+        //public ConfigurationPoliceDCJT PoliceDCJT { get; set; }
+
+        /// <summary>
+        /// 市州数据交换
+        /// </summary>
+        public ConfigurationCityHandOver CityHandOver { get; set; }
+
+        /// <summary>
+        /// 新老数据交换
+        /// </summary>
+        public ConfigurationSendDataOld SendDataOld { get; set; }
+    }
 }