ソースを参照

merge conflict

xf 10 ヶ月 前
コミット
9c92e8c06f

+ 18 - 0
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -8,6 +8,7 @@ using Hotline.CallCenter.Tels;
 using Hotline.Orders;
 using Hotline.Permissions;
 using Hotline.Quality;
+using Hotline.Repository.SqlSugar.CallCenter;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Settings;
 using Hotline.Share.Dtos;
@@ -696,6 +697,23 @@ namespace Hotline.Api.Controllers
         }
         #endregion
 
+        #region 话务队列信息
+        /// <summary>
+        /// 今日等待数
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("query-todaywaitnum")]
+        public async Task<int> QueryToDayWaitNum()
+        {
+            int count = await _trCallRecordRepository.Queryable()
+                        .Where(x => x.CreatedTime.Date == DateTime.Now.Date)
+                        .Where(x => x.QueueTims > 0 && x.Duration == 0)
+                        .CountAsync();
+            return count;
+        }
+
+        #endregion
+
         #endregion
     }
 }

+ 1 - 1
src/Hotline.Api/Controllers/KnowledgeCommonController.cs

@@ -140,7 +140,7 @@ namespace Hotline.Api.Controllers
         public async Task<List<KnowledgeType>> GetTreeList(bool? IsEnable)
         {
             return await _knowledgeTypeRepository.Queryable().WhereIF(IsEnable.HasValue, p => p.IsEnable == IsEnable)
-				 .Where(x => x.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId)).OrderBy(p => p.Sort).ToTreeAsync(it => it.children, it => it.ParentId, null,it=> it.Id);
+				 .Where(x => x.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId) || x.KnowledgeTypeOrgs.Any() == false).OrderBy(p => p.Sort).ToTreeAsync(it => it.children, it => it.ParentId, null,it=> it.Id);
         }
 
         /// <summary>

+ 2 - 2
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -515,7 +515,7 @@ namespace Hotline.Api.Controllers
                 .Includes(x=>x.KnowledgeType)
                 //.Includes(x=>x.KnowledgeRelationTypes,t=> t.)
                 .Where(x => x.IsDeleted == false)
-                .Where(x=>x.KnowledgeType.Any(t=>t.KnowledgeType.KnowledgeTypeOrgs.Any(to=>to.OrgId == _sessionContext.RequiredOrgId)))
+                .Where(x=>x.KnowledgeType.Any(t=>t.KnowledgeType.KnowledgeTypeOrgs.Any(to=>to.OrgId == _sessionContext.RequiredOrgId) || t.KnowledgeType.KnowledgeTypeOrgs.Any() == false))
                 .Where(x => (x.Status == EKnowledgeStatus.Drafts && x.CreatorId == _sessionContext.UserId) || (x.Status != EKnowledgeStatus.Drafts))
                 .WhereIF(!string.IsNullOrEmpty(pagedDto.Title), x => x.Title.Contains(pagedDto.Title!))
                 .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), x => x.Title.Contains(pagedDto.Keyword!) || x.CreatorName.Contains(pagedDto.Keyword!) || x.CreatorOrgName.Contains(pagedDto.Keyword!) || x.SourceOrganize.Name.Contains(pagedDto.Keyword!))
@@ -562,7 +562,7 @@ namespace Hotline.Api.Controllers
                 .Includes(x => x.HotspotType)
                 .Where(x => x.IsDeleted == false)
                 .Where(x => x.Status == EKnowledgeStatus.OnShelf)
-                .Where(x => x.KnowledgeType.Any(t => t.KnowledgeType.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId)))
+                .Where(x => x.KnowledgeType.Any(t => t.KnowledgeType.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId) || t.KnowledgeType.KnowledgeTypeOrgs.Any() == false))
 				.WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.All && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Title.Contains(pagedDto.Keyword!) || d.Content.Contains(pagedDto.Keyword!))// || d.Additions.Contains(pagedDto.Keyword)
                 .WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Title && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Title.Contains(pagedDto.Keyword!))
                 .WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Content && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Content.Contains(pagedDto.Keyword!))

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

@@ -382,8 +382,6 @@ public class OrderController : BaseController
             throw UserFriendlyException.SameMessage("未找到工单,无法发布");
 
         //新增发布工单
-
-
         var orderPublish = _mapper.Map<OrderPublish>(dto);
         orderPublish.OrderId = order.Id;
         orderPublish.No = order.No;
@@ -558,7 +556,10 @@ public class OrderController : BaseController
     [LogFilter("修改发布内容")]
     public async Task PublishedModify([FromBody] PublishOrderModifyDto dto)
     {
-        var publishOrder = await _orderPublishRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+        var publishOrder = await _orderPublishRepository.Queryable()
+            .Includes(x=>x.Order)
+            .Where(x => x.Id == dto.Id)
+            .FirstAsync(HttpContext.RequestAborted);
 
         if (publishOrder is null)
         {
@@ -572,6 +573,8 @@ public class OrderController : BaseController
         history.ArrangeContentAfter = dto.ArrangeContent;
         history.ArrangeOpinionBefor = publishOrder.ArrangeOpinion;
         history.ArrangeOpinionAfter = dto.ArrangeOpinion;
+        history.PublishStateBefor = publishOrder.PublishState;
+        history.PublishStateAfter = dto.PublishState;
         history.No = publishOrder.No;
         history.OrderId = publishOrder.OrderId;
         history.OrderPublishId = publishOrder.Id;
@@ -580,9 +583,15 @@ public class OrderController : BaseController
         publishOrder.ArrangeTitle = dto.ArrangeTitle;
         publishOrder.ArrangeContent = dto.ArrangeContent;
         publishOrder.ArrangeOpinion = dto.ArrangeOpinion;
+        publishOrder.PublishState = dto.PublishState;
 
         await _orderPublishRepository.UpdateAsync(publishOrder, HttpContext.RequestAborted);
         await _orderPublishHistoryRepository.AddAsync(history, HttpContext.RequestAborted);
+
+        //推省上
+        var publishPublishOrder = _mapper.Map<PublishPublishOrderDto>(publishOrder);
+        publishPublishOrder.Order = _mapper.Map<OrderDto>(publishOrder.Order);
+        await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderPublishOrder, publishPublishOrder);
     }
 
     /// <summary>
@@ -926,23 +935,16 @@ public class OrderController : BaseController
     public async Task<JudgeVisitRsp> JudgeVisit([FromBody] JudgeVisitReq dto)
     {
         int error = 0;
-        foreach (var id in dto.Ids)
-        {
-            var visit = await _orderVisitRepository.Queryable().FirstAsync(d => d.Id == id, HttpContext.RequestAborted);
-            if (visit != null && visit.VisitState == EVisitState.Visited)
-            {
-                visit.JudgeState = dto.IsAgree ? EJudgeState.Agreed : EJudgeState.UnAgreed;
-                visit.JudgeUserId = _sessionContext.RequiredUserId;
-                visit.JudgeUserName = _sessionContext.UserName;
-                visit.JudgeTime = DateTime.Now;
-                visit.JudgeContent = dto.JudgeContent;
-                await _orderVisitRepository.UpdateAsync(visit, HttpContext.RequestAborted);
-            }
-            else
-            {
-                error++;
-            }
-        }
+        var list = await _orderVisitRepository.Queryable().Where(x => dto.Ids.Contains(x.Id) && x.VisitState == EVisitState.Visited).ToListAsync(HttpContext.RequestAborted);
+        list.ForEach(visit =>
+        {
+            visit.JudgeState = dto.IsAgree ? EJudgeState.Agreed : EJudgeState.UnAgreed;
+            visit.JudgeUserId = _sessionContext.RequiredUserId;
+            visit.JudgeUserName = _sessionContext.UserName;
+            visit.JudgeTime = DateTime.Now;
+            visit.JudgeContent = dto.JudgeContent;
+        });
+        await _orderVisitRepository.UpdateRangeAsync(list, HttpContext.RequestAborted);
         return new JudgeVisitRsp() { ErrorCount = error, SuccessCount = dto.Ids.Count - error };
     }
 
@@ -2372,6 +2374,7 @@ public class OrderController : BaseController
         var order = await _orderRepository.Queryable()
             .Includes(d => d.OrderExtension)
             .Includes(d => d.OrderDelays)
+            .Includes(d=> d.OrderPublish)
             //.Includes(d => d.OrderScreens)
             .Includes(d => d.OrderVisits, x => x.OrderVisitDetails)
             .Includes(d => d.OrderVisits, x => x.Employee)
@@ -2437,6 +2440,11 @@ public class OrderController : BaseController
 
         //dto.CanPrevious = canPrevious;
 
+        if (order.OrderPublish!=null)
+        {
+            dto.PublishState = order.OrderPublish.PublishState;
+        }
+
         if (dto.FileJson != null && dto.FileJson.Any())
         {
             var ids = order.FileJson.Select(x => x.Id).ToList();

+ 9 - 0
src/Hotline.Application/CallCenter/Calls/CurrentWaitNumService.cs

@@ -8,6 +8,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Tr.Sdk;
 
 namespace Hotline.Application.CallCenter.Calls
 {
@@ -25,13 +26,21 @@ namespace Hotline.Application.CallCenter.Calls
             using var scope = _serviceScopeFactory.CreateScope();
             var realtimeService = scope.ServiceProvider.GetRequiredService<IRealtimeService>();
             var _systemSettingCacheManager = scope.ServiceProvider.GetRequiredService<ISystemSettingCacheManager>();
+            var _trClient = scope.ServiceProvider.GetRequiredService<ITrClient>();
             int times = 3000;//5秒
             var callinQueueIds = _systemSettingCacheManager.GetSetting(SettingConstants.CallInQueueId)?.SettingValue.ToList();
             while(!stoppingToken.IsCancellationRequested)
             {
                 try
                 {
+                    int count = 0;
+                    foreach (var id in callinQueueIds)
+                    {
+                        var rsp = await _trClient.QueryQueueWaitNumAsync(new Tr.Sdk.Tels.QueryQueueWaitNumRequest() { QueueId = id }, stoppingToken);
+                        count += Convert.ToInt32(rsp.Count);
+                    }
 
+                    await realtimeService.CurrentWaitNumAsync(count, stoppingToken);
                 }
                 catch{}
                 await Task.Delay(times);

+ 4 - 0
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -355,6 +355,10 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int DelayingCount => OrderDelays?.Count ?? 0;
 
+        /// <summary>
+        /// 发布范围
+        /// </summary>
+        public bool? PublishState { get; set; }
 
         /// <summary>
         /// 是否延期 

+ 5 - 0
src/Hotline.Share/Dtos/Order/PublishedDto.cs

@@ -294,6 +294,11 @@ public class PublishOrderModifyDto
     /// 整理结果
     /// </summary>
     public string ArrangeOpinion { get; set; }
+
+    /// <summary>
+    /// 发布范围
+    /// </summary>
+    public bool PublishState { get; set; }
 }
 
 public class SuperviseOrderDto

+ 2 - 2
src/Hotline/KnowledgeBase/KnowledgeTypeDomainService.cs

@@ -86,9 +86,9 @@ namespace Hotline.KnowledgeBase
 	        //如果修改了名称,对应修改子分类全称
 	        if (result)
 		        await UpdateChildNode(type.Id);
-	        if (dto.TypeOrgDtos != null && dto.TypeOrgDtos.Any())
+	        await _knowledgeTypeOrgRepository.RemoveAsync(x => x.TypeId == type.Id, false, cancellationToken);
+			if (dto.TypeOrgDtos != null && dto.TypeOrgDtos.Any())
 	        {
-                await _knowledgeTypeOrgRepository.RemoveAsync(x => x.TypeId == type.Id,false,cancellationToken);
 		        List<KnowledgeTypeOrg> orgs = _mapper.Map<List<KnowledgeTypeOrg>>(dto.TypeOrgDtos);
 		        orgs.ForEach(x => x.TypeId = type.Id);
 				await _knowledgeTypeOrgRepository.AddRangeAsync(orgs, cancellationToken);

+ 0 - 10
src/Hotline/Orders/Order.cs

@@ -610,16 +610,6 @@ namespace Hotline.Orders
 
         #region 派单人
 
-        /// <summary>
-        /// 派单人id
-        /// </summary>
-        public string? SendOrderId { get; set; }
-
-        /// <summary>
-        /// 派单人名称
-        /// </summary>
-        public string? SendOrderName { get; set; }
-
         /// <summary>
         /// 派单次数
         /// </summary>

+ 10 - 0
src/Hotline/Orders/OrderPublishHistory.cs

@@ -60,5 +60,15 @@ namespace Hotline.Orders
         [SugarColumn(ColumnDataType = "varchar(2000)")]
         public string ArrangeOpinionAfter { get; set; }
 
+        /// <summary>
+        /// 发布范围
+        /// </summary>
+        public bool? PublishStateBefor { get; set; }
+
+        /// <summary>
+        /// 发布范围
+        /// </summary>
+        public bool? PublishStateAfter { get; set; }
+
     }
 }

+ 1 - 1
src/Tr.Sdk/Tels/QueryQueueWaitNumRequest.cs

@@ -12,7 +12,7 @@ namespace Tr.Sdk.Tels
     {
         public override Method HttpMethod() => Method.Get;
 
-        public override string Path() => $"/api/ola/queues/{QueueId}/get-callers";
+        public override string Path() => $"/api/ola/queues/{QueueId}/get_callers";
 
         [RequestProperty(Name = "args")]
         public string QueueId { get; set; }

+ 1 - 0
src/Tr.Sdk/TrClient.cs

@@ -38,6 +38,7 @@ public class TrClient : ITrClient, IDisposable
     {
         var req = new RestRequest(request.Path(), request.HttpMethod())
             .AddObject(request);
+        string url = "http://222.213.23.229:29003/api/ola/queues/10010/get-callers";
         try
         {
             var response = await _client.ExecuteAsync<TResponse>(req, cancellationToken);