Browse Source

新增丰窝呼叫中心通话记录上传

tangjiang 7 months ago
parent
commit
b473b9ca1d

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

@@ -5,6 +5,7 @@ using DataSharing.Share.Dtos.Province.XieTong.Receive;
 using DataSharing.Share.Dtos.Province.XieTong.Send;
 using DataSharing.Share.Dtos.YiBin.Enterprise;
 using DataSharing.Share.Dtos.YiBin.ZzptPlatformsYB;
+using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Share.Enums.CallCenter;
@@ -214,6 +215,21 @@ namespace DataSharing.Application.Mappers
             .Map(d => d.AccordUrl, x => x.RecordingFileUrl)
             ;
 
+            //通话记录
+            config.ForType<CallNativeDto, SubmitCaseRecordInfo>()
+            .Map(d => d.PhoneNumber, x => x.FromNo)
+            .Map(d => d.PhoneStatus, x => x.AnsweredTime != null ? "10" : "20")
+            .Map(d => d.IsPhoneCall, x => x.Direction == ECallDirection.Out ? "1" : "0")
+            .Map(d => d.CallStart, x => x.AnsweredTime)
+            .Map(d => d.CallEnd, x => x.EndTime)
+            .Map(d => d.InIvr, x => x.BeginIvrTime)
+            .Map(d => d.InQueue, x => x.BeginQueueTime)
+            .Map(d => d.CallTime, x => x.BeginRingTime)
+            .Map(d => d.CallLength, x => x.Duration)
+            .Map(d => d.SeatNumber, x => x.StaffNo)
+            .Map(d => d.AccordUrl, x => x.AudioFile)
+            ;
+
             //发起甄别
             config.ForType<PublishScreenDto, ScreenCaseInfoSendInfo>()
             .Map(d => d.CaseSerial, x => x.Order.ProvinceNo)
@@ -625,6 +641,30 @@ namespace DataSharing.Application.Mappers
             .Map(d => d.AcceptEnd, x => "0")
        ;
 
+            //通话记录----丰窝最新
+            config.ForType<CallNativeDto, DsTelCall>()
+            .Map(d => d.CallId, x => x.Id)
+            .Map(d => d.CPN, x => x.FromNo)
+            .Map(d => d.CDPN, x => x.ToNo)
+            .Map(d => d.CallDirection, x => x.Direction == ECallDirection.Out ? "1" : "0")
+            .Map(d => d.TelNo, x => x.TelNo)
+            .Map(d => d.UserId, x => x.UserId)
+            .Map(d => d.UserName, x => x.UserName)
+            .Map(d => d.BeginIvrTime, x => x.BeginIvrTime)
+            .Map(d => d.EndIvrTime, x => x.EndIvrTime)
+            .Map(d => d.BeginQueueTime, x => x.BeginQueueTime)
+            .Map(d => d.EndQueueTime, x => x.EndQueueTime)
+            .Map(d => d.BeginRingTime, x => x.BeginRingTime)
+            .Map(d => d.EndRingTimg, x => x.EndRingTime)
+            .Map(d => d.AnsweredTime, x => x.AnsweredTime)
+            .Map(d => d.OverTime, x => x.EndTime)
+            .Map(d => d.Duration, x => x.Duration)
+            .Map(d => d.RingTimes, x => x.RingDuration)
+            .Map(d => d.QueueTims, x => x.WaitDuration)
+            .Map(d => d.OnState, x => x.AnsweredTime != null ? "1" : "2")
+            .Map(d => d.RecordingFileUrl, x => x.AudioFile)
+            ;
+
         }
     }
 

+ 19 - 0
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.CallCenter;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Dtos.Order;
@@ -604,6 +605,24 @@ namespace DataSharing.Application.Receivers
 
         }
 
+        /// <summary>
+        /// 挂电话推送----电话记录--丰窝最新
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        [CapSubscribe(Hotline.Share.Mq.EventNames.HotlineCallAdd)]
+        public async Task SubmitCaseRecordFwAsync(List<CallNativeDto> dto, CancellationToken cancellationToken)
+        {
+            if (!dto.Any())
+                return;
+            foreach (var item in dto)
+            {
+                await _provinceService.SubmitCaseRecordFwAsync(item, cancellationToken);
+            }
+
+        }
+
         /// <summary>
         /// 挂电话推送----电话记录
         /// </summary>

+ 5 - 2
src/DataSharing.Host/StartupExtensions.cs

@@ -51,11 +51,10 @@ internal static class StartupExtensions
             services.AddScoped<IZzptService, ZzptService>();//综治平台
             services.AddScoped<ICityStateDataExchangeService, CityStateDataExchangeService>();//市州互转
 
-            ////应急管理局业务
+            //应急管理局业务
             if (sharingConfig.CityYiBin.YingJiGuanLiJu != null && sharingConfig.CityYiBin.YingJiGuanLiJu.DbConnectionString != null)
             {
                 services.AddYingJiDb(sharingConfig.CityYiBin.YingJiGuanLiJu);
-                //services.AddScoped<IYjgljReceiver, YjgljReceiver>();
             }
         }
         else if (sharingConfig != null && sharingConfig.CityCode == ConfigurationConsts.ZiGong)//自贡
@@ -64,6 +63,10 @@ internal static class StartupExtensions
             services.AddScoped<IPoliceService, DcjtService>();//110
             services.AddScoped<ICityStateDataExchangeService, CityStateDataExchangeService>();//市州互转
         }
+        else if (sharingConfig != null && sharingConfig.CityCode == ConfigurationConsts.LuZhou)//泸州
+        {
+
+        }
 
         services
             .BatchInjectServices()

+ 1 - 1
src/DataSharing/DataSharing.csproj

@@ -8,7 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="FluentValidation" Version="11.6.0" />
-    <PackageReference Include="Hotline.Share" Version="1.0.91" />
+    <PackageReference Include="Hotline.Share" Version="1.0.92" />
     <PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
     <PackageReference Include="Quartz.Jobs" Version="3.8.0" />
     <PackageReference Include="RestSharp" Version="110.2.0" />

+ 10 - 0
src/DataSharing/Province/IProvinceService.cs

@@ -1,5 +1,6 @@
 using DataSharing.Share.Dtos.Province.HuiJu;
 using DataSharing.Share.Dtos.Province.XieTong.Send;
+using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.TrCallCenter;
@@ -94,6 +95,15 @@ namespace DataSharing.Province
         /// <returns></returns>
         Task SubmitVisitInfoDataAsync(PublishVisitDto dto, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// 挂电话推送----电话记录--丰窝最新
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        /// <exception cref="UserFriendlyException"></exception>
+        Task SubmitCaseRecordFwAsync(CallNativeDto dto, CancellationToken cancellationToken);
+
         /// <summary>
         /// 挂电话推送----电话记录
         /// </summary>

+ 101 - 6
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.CallCenter;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.Knowledge;
 using Hotline.Share.Dtos.Order;
@@ -699,6 +700,54 @@ namespace DataSharing.Province
 
         }
 
+        /// <summary>
+        /// 挂电话推送----电话记录--丰窝最新
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        /// <exception cref="UserFriendlyException"></exception>
+        public async Task SubmitCaseRecordFwAsync(CallNativeDto dto, CancellationToken cancellationToken)
+        {
+            //验证是否需要推送未接数据
+            if (dto != null && dto.AnsweredTime == null)
+            {
+                if (await IsPublishMissedCall(dto.EndTime, cancellationToken) == false)
+                    return;
+            }
+
+            var data = _mapper.Map<SubmitCaseRecordInfo>(dto);
+
+            data.AreaCode = _sharingConfigurationManager.GetCityCode();
+
+            if (string.IsNullOrEmpty(data.CaseSerial))
+                data.CaseSerial = "";
+
+            if (string.IsNullOrEmpty(data.AccordUrl))
+                data.AccordUrl = "";
+
+            //处理通话记录时间
+            SetCallTime(data);
+            var validator = new SubmitCaseRecordInfoValidator();
+            var validResult = await validator.ValidateAsync(data, cancellationToken);
+            if (!validResult.IsValid)
+                throw new UserFriendlyException(string.Join(',', validResult.Errors.Select(d => d.ErrorMessage)));
+            #region 处理请求参数
+            var configProvince = _channelConfigurationManager.GetConfigurationProvince();
+            var request = new ProvinceListRequest<SubmitCaseRecordInfo>(configProvince.ClientId, configProvince.ClientSecret);
+            request.SetData(new List<SubmitCaseRecordInfo>() { data });
+            var jsonData = request.ToString();
+            jsonData = jsonData.Replace("0001-01-01 00:00:00", "");
+            #endregion
+
+            var startTime = dto.BeginIvrTime;
+            //将待推送数据写入待推送表
+            var taskId = await _initPushDataService.InitDsSendTaskSubmitCaseRecord(data.CaseSerial, jsonData, data, startTime, cancellationToken);
+
+            //本地保存通话记录数据
+            await InitTelFwCallData(dto, data.CaseSerial, taskId, cancellationToken);
+        }
+
         /// <summary>
         /// 挂电话推送----电话记录
         /// </summary>
@@ -711,7 +760,7 @@ namespace DataSharing.Province
             //验证是否需要推送未接数据
             if (dto != null && dto.TrCallRecordDto != null && dto.TrCallRecordDto.OnState == EOnState.NoOn && dto.Order == null)
             {
-                if (await IsPublishMissedCall(dto.TrCallRecordDto, cancellationToken) == false)
+                if (await IsPublishMissedCall(dto.TrCallRecordDto.OverTime, cancellationToken) == false)
                     return;
             }
 
@@ -1862,10 +1911,10 @@ namespace DataSharing.Province
         /// <summary>
         /// 检查是否需要推送未接通话记录
         /// </summary>
-        /// <param name="dto"></param>
+        /// <param name="endTime"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        private async Task<bool> IsPublishMissedCall(TrCallDto dto, CancellationToken cancellationToken)
+        private async Task<bool> IsPublishMissedCall(DateTime endTime, CancellationToken cancellationToken)
         {
             var key = MissedCallKey + DateTime.Now.ToString("yyyyMMdd");
             int missedCallCount = 0;
@@ -1884,12 +1933,12 @@ namespace DataSharing.Province
             if (dataCache != null)
             {
                 //如果存在值,检查是否已经达到推送最大值
-                if (dataCache.IsMax==false && dataCache.DateTimeList.Count > 0)
+                if (dataCache.IsMax == false && dataCache.DateTimeList.Count > 0)
                 {
                     //没有达到最大值
                     //检查第一条数据是否匹配当前推送时间
                     var list = dataCache.DateTimeList;
-                    if (list[0] < dto.OverTime)
+                    if (list[0] < endTime)
                     {
                         _logger.LogWarning("匹配到需要上传的,原始数据:------------------------" + JsonSerializer.Serialize(list));
                         //处理数据
@@ -1926,7 +1975,7 @@ namespace DataSharing.Province
                 timeLists.Sort();
                 #endregion
 
-                if (timeLists[0] < dto.OverTime)
+                if (timeLists[0] < endTime)
                     //处理数据
                     timeLists.RemoveAt(0);
 
@@ -1991,6 +2040,52 @@ namespace DataSharing.Province
 
             }
         }
+
+        /// <summary>
+        /// 初始化上传通话记录----丰窝
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="ProvinceNo"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        private async Task InitTelFwCallData(CallNativeDto dto, string ProvinceNo, string taskId, CancellationToken cancellationToken)
+        {
+            var tellCall = await _dsTelCallRepository.GetAsync(p => p.CallId == dto.Id, cancellationToken);
+            if (tellCall != null)
+            {
+                //修改
+                _mapper.Map(dto, tellCall);
+                tellCall.ProvinceNo = ProvinceNo;
+                tellCall.TaskId = taskId;
+                await _dsTelCallRepository.UpdateAsync(tellCall, cancellationToken);
+            }
+            else
+            {
+                //新增
+                tellCall = new DsTelCall();
+                tellCall = _mapper.Map<DsTelCall>(dto);
+                tellCall.ProvinceNo = ProvinceNo;
+                tellCall.TaskId = taskId;
+                tellCall.Id = dto.Id;
+                try
+                {
+                    await _dsTelCallRepository.AddAsync(tellCall, cancellationToken);
+                }
+                catch (Exception ex)
+                {
+                    var tellCallNew = await _dsTelCallRepository.GetAsync(p => p.CallId == dto.Id, cancellationToken);
+                    if (tellCallNew != null)
+                    {
+                        //修改
+                        _mapper.Map(dto, tellCallNew);
+                        tellCallNew.ProvinceNo = ProvinceNo;
+                        tellCallNew.TaskId = taskId;
+                        await _dsTelCallRepository.UpdateAsync(tellCallNew, cancellationToken);
+                    }
+                }
+
+            }
+        }
         #endregion
 
         #endregion