Selaa lähdekoodia

Merge branch 'release' of http://110.188.24.182:10023/Fengwo/hotline into release

田爽 7 kuukautta sitten
vanhempi
commit
38b28ab842

+ 33 - 23
src/Hotline.Api/Controllers/Bigscreen/SeatController.cs

@@ -1,20 +1,26 @@
 using Hotline.Application.Bigscreen;
 using Hotline.Caching.Interfaces;
 using Hotline.Settings;
+using Hotline.Share.Dtos.TrCallCenter;
+using Mapster;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
+using Tr.Sdk;
+using Tr.Sdk.Tels;
 
 namespace Hotline.Api.Controllers.Bigscreen
 {
-	public class SeatController : BaseController
-	{
-		private readonly ISeatStateDataService _seatStateDataService;
-		private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+    public class SeatController : BaseController
+    {
+        private readonly ISeatStateDataService _seatStateDataService;
+        private readonly ITrClient _trClient;
+        private readonly ISystemSettingCacheManager _systemSettingCacheManager;
 
-        public SeatController(ISeatStateDataService seatStateDataService, ISystemSettingCacheManager systemSettingCacheManager)
+        public SeatController(ISeatStateDataService seatStateDataService, ISystemSettingCacheManager systemSettingCacheManager, ITrClient trClient)
         {
             _seatStateDataService = seatStateDataService;
             _systemSettingCacheManager = systemSettingCacheManager;
+            _trClient = trClient;
         }
 
         /// <summary>
@@ -22,28 +28,32 @@ namespace Hotline.Api.Controllers.Bigscreen
         /// </summary>
         /// <returns></returns>
         [AllowAnonymous]
-		[HttpGet("base_data")]
-		public async Task<object> GetSeatStateData() {
-			var call24 = await _seatStateDataService.GetCall24(HttpContext.RequestAborted);
-			var callTop10 = await _seatStateDataService.GetCallTop10(HttpContext.RequestAborted);
-			var callList =await _seatStateDataService.GetCallList(HttpContext.RequestAborted);
-			var callAverage = await _seatStateDataService.GetCallAverage(HttpContext.RequestAborted);
-			
+        [HttpGet("base_data")]
+        public async Task<object> GetSeatStateData()
+        {
+            var call24 = await _seatStateDataService.GetCall24(HttpContext.RequestAborted);
+            var callTop10 = await _seatStateDataService.GetCallTop10(HttpContext.RequestAborted);
+            var callList = await _seatStateDataService.GetCallList(HttpContext.RequestAborted);
+            var callAverage = await _seatStateDataService.GetCallAverage(HttpContext.RequestAborted);
+
 
             return new object[] { call24, callTop10, callList, callAverage };
-		}
+        }
 
 
-		/// <summary>
-		/// 获取监听分机
-		/// </summary>
-		/// <returns></returns>
-		[AllowAnonymous]
-		[HttpGet("query-listentels")]
-		public async Task<object> GetListenTels()
-		{
+        /// <summary>
+        /// 获取监听分机
+        /// </summary>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpGet("query-listentels")]
+        public async Task<List<TelOutDto>> GetListenTels()
+        {
             var listenTels = _systemSettingCacheManager.GetSetting(SettingConstants.ListenTels)?.SettingValue;
-			return listenTels;
+            return (await _trClient.QueryTelsAsync(new QueryTelRequest(), HttpContext.RequestAborted))
+                .Where(m => listenTels.Contains(m.TelNo))
+                .ToList()
+                .Adapt<List<TelOutDto>>();
         }
-	}
+    }
 }

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

@@ -120,6 +120,8 @@ namespace Hotline.Api.Controllers
         public async Task<List<TrTelDto>> TrQueryTels()
         {
             var tels = await _trClient.QueryTelsAsync(new QueryTelRequest() { }, HttpContext.RequestAborted);
+            var listenTels = _systemSettingCacheManager.GetSetting(SettingConstants.ListenTels)?.SettingValue;
+            tels = tels.Where(m => listenTels.Contains(m.TelNo) ==  false).ToList();
             var returnlist = _mapper.Map<List<TrTelDto>>(tels);
             string callOutQueueId = _systemSettingCacheManager.GetSetting(SettingConstants.CallOutQueueId).SettingValue[0];
             returnlist.ForEach(x =>
@@ -136,10 +138,10 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         [HttpGet("query-telstate")]
         [AllowAnonymous]
-        public async Task<IReadOnlyList<TrTelStateDto>> TrQueryTelState([FromQuery] string? state)
+        public async Task<IReadOnlyList<TrTelStateDto>> TrQueryTelState([FromQuery] string? state, bool hasListen)
         {
             var tels = await _trClient.QueryTelStateAsync(new QueryTelStateRequest() { State = state }, HttpContext.RequestAborted);
-            //var workList = _userCacheManager.GetWorks();
+            var listenTels = _systemSettingCacheManager.GetSetting(SettingConstants.ListenTels)?.SettingValue;
             var workList = await _workRepository.Queryable().Where(d=> 1 == 1 && !d.EndTime.HasValue).ToListAsync();
             var query = from tel in tels.AgentList
                         join works in workList on tel.TelNo equals works.TelNo into workD
@@ -168,6 +170,10 @@ namespace Hotline.Api.Controllers
                             WorkUserId = (work != null) ? work.UserId: "",
                             WorkUserName = (work != null) ? work.UserName: "",
                         };
+            if (hasListen == false)
+            {
+                query = query.Where(m => listenTels.Contains(m.TelNo) == false);
+            }
             var list = query.OrderBy(x=>x.TelNo).OrderByDescending(x=>x.CreatedAt).ToList();
             return list;// _mapper.Map<IReadOnlyList<TrTelStateDto>>(tels.AgentList);
         }
@@ -182,6 +188,10 @@ namespace Hotline.Api.Controllers
         public async Task<TrTelStateDto> TrQueryTelStateByTelNo([FromQuery]string? telno)
         {
             var tels = await _trClient.QueryTelStateAsync(new QueryTelStateRequest() { TelNo = telno }, HttpContext.RequestAborted);
+
+            var listenTels = _systemSettingCacheManager.GetSetting(SettingConstants.ListenTels)?.SettingValue;
+            tels.Agents = tels.Agents?.Where(m => listenTels.Contains(m.TelNo) == false).ToList();
+
             var tel = tels.Agents?.FirstOrDefault();
             if (tel != null)
             {

+ 1 - 0
src/Hotline.Application.Tests/Domain/ZiGongExpireTimeTest.cs

@@ -51,6 +51,7 @@ public class ZiGongExpireTimeTest
     [InlineData("企业投诉件单元测试", "2024-09-05 14:00:00", "CenterToOrg", "2024-09-09 14:00:00")]
     [InlineData("四川省12345咨询件单元测试", "2024-09-05 14:00:00", "CenterToOrg", "2024-09-06 14:00:00")]
     [InlineData("四川省12345建议件单元测试", "2024-09-05 14:00:00", "CenterToOrg", "2024-09-10 14:00:00")]
+    [InlineData("中心到中心24小时", "2024-09-12 14:00:00", "CenterToCenter", "2024-09-13 14:00:00")]
     public async Task CalcExpiredTime_Test(string title, string beginTxt, string flowTxt, string expected)
     {
         var beginTime = DateTime.Parse(beginTxt);

+ 1 - 0
src/Hotline.Application.Tests/Hotline.Application.Tests.csproj

@@ -36,6 +36,7 @@
     <ProjectReference Include="..\Hotline.Api\Hotline.Api.csproj" />
     <ProjectReference Include="..\Hotline.Application\Hotline.Application.csproj" />
     <ProjectReference Include="..\Hotline.Repository.SqlSugar\Hotline.Repository.SqlSugar.csproj" />
+    <ProjectReference Include="..\Tr.Sdk\Tr.Sdk.csproj" />
     <ProjectReference Include="..\XF.Domain.Repository\XF.Domain.Repository.csproj" />
     <ProjectReference Include="..\XF.Domain\XF.Domain.csproj" />
   </ItemGroup>

+ 10 - 0
src/Hotline.Application.Tests/Startup.cs

@@ -1,4 +1,5 @@
 using Microsoft.AspNetCore.Hosting;
+using Tr.Sdk;
 using Hotline.Repository.SqlSugar.Extensions;
 using Microsoft.AspNetCore.TestHost;
 using Microsoft.Extensions.Configuration;
@@ -36,6 +37,7 @@ using XF.Domain.Options;
 using Hotline.Settings.TimeLimitDomain;
 using Hotline.Settings.TimeLimitDomain.ExpireTimeSupplier;
 using Microsoft.AspNetCore.WebSockets;
+using Hotline.CallCenter.Configs;
 
 namespace Hotline.Application.Tests;
 public class Startup
@@ -75,6 +77,14 @@ public class Startup
             var appConfigurationSection = configuration.GetRequiredSection(nameof(AppConfiguration));
             var appConfiguration = appConfigurationSection.Get<AppConfiguration>();
             if (appConfiguration is null) throw new ArgumentNullException(nameof(appConfiguration));
+
+            //var callCenterConfigurationSection = configuration.GetRequiredSection(nameof(CallCenterConfiguration));
+            //var callCenterConfiguration = callCenterConfigurationSection.Get<CallCenterConfiguration>();
+            //services.AddTrSdk(callCenterConfiguration.TianRun.Address,
+            //            callCenterConfiguration.TianRun.Username,
+            //            callCenterConfiguration.TianRun.Password);
+
+
             services.Configure<AppConfiguration>(d => appConfigurationSection.Bind(d));
             services.Configure<IdentityConfiguration>(d => configuration.GetSection(nameof(IdentityConfiguration)).Bind(d));
 

+ 5 - 0
src/Hotline.Application/Mappers/MapperConfigs.cs

@@ -10,6 +10,7 @@ using Hotline.Share.Dtos.OrderExportWord;
 using Hotline.Share.Dtos.Org;
 using Hotline.Share.Dtos.Push.FWMessage;
 using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Share.Enums.Order;
 using Mapster;
 using XF.Domain.Entities;
@@ -20,6 +21,10 @@ namespace Hotline.Application.Mappers
     {
         public void Register(TypeAdapterConfig config)
         {
+            config.ForType<Tr.Sdk.Tels.QueryTelResponse, TelOutDto>()
+                .Map(m => m.TelPwd, x => x.Password)
+                .Map(m =>m.Queue, x => x.QueueId);
+
             config.ForType<TimeLimitSettingInventory, TimeConfig>()
                 .Map(d => d.Count, m => m.TimeValue);
             config.ForType<TimeResult, ExpiredTimeWithConfig>()

+ 1 - 0
src/Hotline.Application/Tels/ITelApplication.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Dtos.TrCallCenter;
 using Microsoft.AspNetCore.Http;
 
 namespace Hotline.Application.Tels

+ 11 - 5
src/Hotline.Application/Tels/TelApplication.cs

@@ -1,9 +1,12 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
 using Hotline.CallCenter.Tels;
+using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Users;
 using Microsoft.AspNetCore.Http;
+using Tr.Sdk;
+using Tr.Sdk.Tels;
 using XF.Domain.Cache;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
@@ -14,6 +17,7 @@ namespace Hotline.Application.Tels;
 public class TelApplication : ITelApplication, IScopeDependency
 {
     private readonly IUserCacheManager _userCacheManager;
+    private readonly ITrClient _trClient;
     private readonly ITelRestRepository _telRestRepository;
     private readonly ITypedCache<Work> _cacheWork;
     private readonly IWorkRepository _workRepository;
@@ -24,13 +28,15 @@ public class TelApplication : ITelApplication, IScopeDependency
         ITelRestRepository telRestRepository,
         ITypedCache<Work> cacheWork,
         IWorkRepository workRepository,
-        IRepository<TelActionRecord> telActionRecordRepository)
+        IRepository<TelActionRecord> telActionRecordRepository,
+        ITrClient trClient)
     {
         _userCacheManager = userCacheManager;
         _telRestRepository = telRestRepository;
         _cacheWork = cacheWork;
         _workRepository = workRepository;
         _telActionRecordRepository = telActionRecordRepository;
+        _trClient = trClient;
     }
 
     /// <summary>
@@ -52,7 +58,7 @@ public class TelApplication : ITelApplication, IScopeDependency
         await _workRepository.UpdateAsync(work, cancellationToken);
         _cacheWork.Remove(work.GetKey(KeyMode.UserId));
         _cacheWork.Remove(work.GetKey(KeyMode.TelNo));
-        
+
         var list = await _telActionRecordRepository.Queryable().Where(x => x.TelNo == work.TelNo && !x.EndTime.HasValue).ToListAsync();
         foreach (var item in list)
         {
@@ -75,7 +81,7 @@ public class TelApplication : ITelApplication, IScopeDependency
         //}
     }
 
-    public async Task SignOutByTelNoAsync(string telNo,CancellationToken cancellationToken)
+    public async Task SignOutByTelNoAsync(string telNo, CancellationToken cancellationToken)
     {
         var work = _userCacheManager.GetWorkByTelNoExp(telNo);
         if (work is null) return;
@@ -95,7 +101,7 @@ public class TelApplication : ITelApplication, IScopeDependency
 
 
         var list = await _telActionRecordRepository.Queryable().Where(x => x.TelNo == work.TelNo && !x.EndTime.HasValue).ToListAsync();
-        foreach ( var item in list )
+        foreach (var item in list)
         {
             item.EndAction();
             await _telActionRecordRepository.UpdateAsync(item);
@@ -115,4 +121,4 @@ public class TelApplication : ITelApplication, IScopeDependency
         //    await _telActionRecordRepository.UpdateAsync(telarrangeAction);
         //}
     }
-}
+  }

+ 8 - 2
src/Hotline.Share/Dtos/Settings/TimeConfig.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Tools;
@@ -27,9 +28,14 @@ namespace Hotline.Share.Dtos.Settings
         public string? AcceptTypeCode { get; set; }
 
         /// <summary>
-        /// 24小时办结
+        /// 流程方向
         /// </summary>
-        [NoCode] // 不需要查询 BusCode
+        public EFlowDirection FlowDirection { get; set; }
+
+       /// <summary>
+       /// 24小时办结
+       /// </summary>
+       [NoCode] // 不需要查询 BusCode
         public bool Is24HoursComplete { get; set; }
 
         /// <summary>

+ 7 - 0
src/Hotline.Share/Dtos/TrCallCenter/TrTelDao.cs

@@ -195,6 +195,13 @@ namespace Hotline.Share.Dtos.TrCallCenter
         public bool isCallOut { get; set; }
     }
 
+    public class TelOutDto
+    {
+        public string TelNo { get; set; }
+        public string TelPwd { get; set; }
+        public string Queue { get; set; }
+    }
+
     public class TrOnDutyResponseDto
     {
         public string? TelNo { get; set; }

+ 2 - 1
src/Hotline/Settings/TimeLimitDomain/ZiGongExpireTimeLimit.cs

@@ -42,7 +42,8 @@ public class ZiGongExpireTimeLimit : ExpireTimeLimitBase, ICalcExpireTime, IScop
 
     public override async Task<ExpiredTimeWithConfig> CalcExpiredTime(DateTime beginTime, EFlowDirection flowDirection, OrderTimeClacInfo order)
     {
-        if (EFlowDirection.CenterToOrg == flowDirection)
+        order.FlowDirection = flowDirection;
+        if (EFlowDirection.CenterToOrg == flowDirection || EFlowDirection.CenterToCenter == flowDirection)
         {
             var timeConfig = await GetTimeConfigByOrderAsync(order);
             timeConfig.WorkTime = GetWorkTimes(SettingConstants.WorkTime);