Эх сурвалжийг харах

Merge branch 'dev' into release

Dun.Jason 9 сар өмнө
parent
commit
8487d32160

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

@@ -710,7 +710,7 @@ namespace Hotline.Api.Controllers
                                 {
                                     aiOrderVisitDetail.OrderVisit.NowEvaluate = orgProcessingResults;
                                 }
-                                //处理是否回访完成TODO
+                                //处理是否回访完成
 
 
                                 await _orderVisitRepository.UpdateAsync(aiOrderVisitDetail.OrderVisit, HttpContext.RequestAborted);

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

@@ -167,6 +167,49 @@ namespace Hotline.Api.Controllers
             return list;// _mapper.Map<IReadOnlyList<TrTelStateDto>>(tels.AgentList);
         }
 
+        /// <summary>
+        /// 查询坐席分机状态及通话信息
+        /// </summary>
+        /// <param name="telno"></param>
+        /// <returns></returns>
+        [HttpGet("query-telstate/{telno}")]
+        [AllowAnonymous]
+        public async Task<TrTelStateDto> TrQueryTelStateByTelNo([FromQuery]string? telno)
+        {
+            var tels = await _trClient.QueryTelStateAsync(new QueryTelStateRequest() { TelNo = telno }, HttpContext.RequestAborted);
+            var tel = tels.AgentList.FirstOrDefault();
+            if (tel != null)
+            {
+                var work = _userCacheManager.GetWorkByTel(tel.TelNo);
+                var result = new TrTelStateDto
+                {
+                    Id = tel.Id,
+                    TelNo = tel.TelNo,
+                    ChannelUUid = tel.ChannelUUid,
+                    TelName = tel.TelName,
+                    Type = tel.Type,
+                    Weight = tel.Weight,
+                    Queue = tel.Queue,
+                    State = tel.State,
+                    OldState = tel.OldState,
+                    Device = tel.Device,
+                    SipIp = tel.SipIp,
+                    PrivateData = tel.PrivateData,
+                    SipState = tel.SipState,
+                    CreatedAt = tel.CreatedAt,
+                    UpdatedAt = tel.UpdatedAt,
+                    CallDirection = tel.CallDirection,
+                    OtherNumber = tel.OtherNumber,
+                    GateWay = tel.GateWay,
+                    AnsweredAt = tel.AnsweredAt,
+                    WorkUserId = (work != null) ? work.UserId : "",
+                    WorkUserName = (work != null) ? work.UserName : "",
+                };
+                return result;
+            }
+            return null;
+        }
+
 
         
 

+ 7 - 5
src/Hotline.Api/Controllers/OrderController.cs

@@ -41,6 +41,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Push;
 using Hotline.Share.Enums.Quality;
 using Hotline.Share.Enums.Settings;
+using Hotline.Share.Mq;
 using Hotline.Share.Requests;
 using Hotline.Tools;
 using Hotline.Users;
@@ -1258,7 +1259,7 @@ public class OrderController : BaseController
         visitApplyModel.ExaminManId = _sessionContext.RequiredUserId;
         visitApplyModel.ExaminTime = DateTime.Now;
         await _orderVisitApplyRepository.UpdateAsync(visitApplyModel, HttpContext.RequestAborted);
-        //TODO 处理通过后的业务
+        //处理通过后的业务
         if (dto.IsPass)
         {
             //处理申请单
@@ -3247,8 +3248,8 @@ public class OrderController : BaseController
                 expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne, dto.Opinion,
                 _sessionContext.RequiredUserId, _sessionContext.UserName,
                 canUpdateOrderSender);
-            //TODO 发送短信超期和即将超期
-
+            //发送短信即将超期
+            _capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
         }
         else if (dto.FlowDirection is EFlowDirection.CenterToOrg)
         {
@@ -3260,8 +3261,8 @@ public class OrderController : BaseController
                 expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne, dto.Opinion,
                 _sessionContext.RequiredUserId, _sessionContext.UserName,
                 canUpdateOrderSender);
-            //TODO 发送短信超期和即将超期
-
+            //发送短信即将超期
+           _capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
             //写入质检
             await _qualityApplication.AddQualityAsync(EQualitySource.Send, order.Id, HttpContext.RequestAborted);
         }
@@ -3270,6 +3271,7 @@ public class OrderController : BaseController
             expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToCenter, order.AcceptTypeCode);
             order.CenterToCenter(expiredTimeConfig.TimeText, expiredTimeConfig.Count,
                 expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne);
+            _capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
         }
 
         _mapper.Map(expiredTimeConfig, order);

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

@@ -1143,8 +1143,8 @@ IRepository<Hotspot> hotspotRepository
             //ISessionContext current
             ISessionContext current = new ProvinceSessionContext
             {
-                UserId = startStep.HandlerId,
-                UserName = startStep.HandlerName,
+                //UserId = startStep.HandlerId,
+                //UserName = startStep.HandlerName,
                 OrgId = startStep.HandlerOrgId,
                 OrgName = startStep.HandlerOrgName,
                 OrgAreaCode = startStep.HandlerOrgAreaCode,

+ 4 - 1
src/Hotline.Application/Orders/OrderApplication.cs

@@ -42,6 +42,8 @@ using PanGu.Match;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Authentications;
+using MediatR;
+using Hotline.Share.Mq;
 
 namespace Hotline.Application.Orders;
 
@@ -69,7 +71,6 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly IRepository<WorkflowStep> _workflowStepRepository;
 
 
-
     public OrderApplication(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
@@ -130,6 +131,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         order.TimeLimitUnit = expiredTimeConfig.TimeType;
         order.ExpiredTime = expiredTimeConfig.ExpiredTime;
         order.NearlyExpiredTime = expiredTimeConfig.NearlyExpiredTime;
+        //发送即将超期(延时发送)
+        _capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms,new PublishNearlyExpiredTimeSmsDto() { OrderId= order.Id }) ;
         if (IsProDelay)
         {
             order.ExpiredTimeProvince = expiredTimeConfig.ExpiredTime;

+ 165 - 0
src/Hotline.Application/Subscribers/InternalCapSubscriber.cs

@@ -0,0 +1,165 @@
+using DotNetCore.CAP;
+using Hotline.Orders;
+using Hotline.Push.Notifies;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Push;
+using Hotline.Share.Mq;
+using Hotline.Users;
+using MediatR;
+using Microsoft.AspNetCore.Http;
+using XF.Domain.Dependency;
+using XF.Domain.Repository;
+
+namespace Hotline.Application.Subscribers
+{
+    public class InternalCapSubscriber: ICapSubscribe, ITransientDependency
+    {
+        private readonly IOrderRepository _orderRepository;
+        private readonly IMediator _mediator;
+        private readonly IRepository<User> _userRepository;
+        private readonly ICapPublisher _capPublisher;
+
+        public InternalCapSubscriber(IOrderRepository orderRepository,IMediator mediator,IRepository<User> userRepository,ICapPublisher capPublisher)
+        {
+            _orderRepository = orderRepository;
+            _mediator = mediator;
+            _userRepository = userRepository;
+            _capPublisher = capPublisher;
+        }
+
+        /// <summary>
+        /// 工单即将超期短信发送(延迟消息)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        [CapSubscribe(EventNames.HotlineOrderNearlyExpiredTimeSms)]
+        public async Task SendOrderNearlyExpiredTimeSms(PublishNearlyExpiredTimeSmsDto dto,CancellationToken cancellationToken)
+        {
+            var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
+            if (order!=null && order.Status< Share.Enums.Order.EOrderStatus.Filed && order.NearlyExpiredTime?.ToString("yyyy-MM-dd hh:mm") == DateTime.Now.ToString("yyyy-MM-dd hh:mm"))
+            {
+                //当前办理人不为空发短信给个人
+                if (!string.IsNullOrEmpty(order.CurrentHandlerId))
+                {
+                    //查询人员
+                    var user = await _userRepository.GetAsync(order.CurrentHandlerId, cancellationToken);
+                    if(user!=null && !string.IsNullOrEmpty(user.PhoneNo))
+                    {
+                        //发送短信
+                        var messageDto = new Share.Dtos.Push.MessageDto
+                        {
+                            PushBusiness = EPushBusiness.OrderUrge,
+                            ExternalId = order.Id,
+                            OrderId = order.Id,
+                            PushPlatform = EPushPlatform.Sms,
+                            Remark = order.Title,
+                            Name = user.Name,
+                            TemplateCode = "1001",
+                            Params = new List<string>() { order.No },
+                            TelNumber = user.PhoneNo,
+                        };
+                        await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+                    }
+                }
+                //当前办理部门不为空,发短信给部门经办人
+                else if(!string.IsNullOrEmpty(order.CurrentHandleOrgId))
+                {
+                    //查询部门经办人
+                    var userlist = await _userRepository.Queryable().Where(x =>
+                        x.OrgId == order.CurrentHandleOrgId && !string.IsNullOrEmpty(x.PhoneNo) &&
+                        x.Roles.Any(d => d.Id == "08dae71e-0eca-4bc4-89fe-7eaefae8a98e")).ToListAsync();
+                    foreach (var user in userlist)
+                    {
+                        if (!string.IsNullOrEmpty(user.PhoneNo))
+                        {
+                            //发送短信
+                            var messageDto = new Share.Dtos.Push.MessageDto
+                            {
+                                PushBusiness = EPushBusiness.OrderUrge,
+                                ExternalId = order.Id,
+                                OrderId = order.Id,
+                                PushPlatform = EPushPlatform.Sms,
+                                Remark = order.Title,
+                                Name = user.Name,
+                                TemplateCode = "1001",
+                                Params = new List<string>() { order.No },
+                                TelNumber = user.PhoneNo,
+                            };
+                            await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+                        }
+                    }
+                }
+                //发送超期短信(延时发送)
+                _capPublisher.PublishDelay(order.ExpiredTime.Value- DateTime.Now, EventNames.HotlineOrderExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
+            }
+        }
+
+        /// <summary>
+        /// 工单超期短信发送(延迟消息)
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        [CapSubscribe(EventNames.HotlineOrderExpiredTimeSms)]
+        public async Task SendOrderExpiredTimeSms(PublishNearlyExpiredTimeSmsDto dto,CancellationToken cancellationToken)
+        {
+            var order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
+            if (order != null && order.Status < Share.Enums.Order.EOrderStatus.Filed && order.NearlyExpiredTime?.ToString("yyyy-MM-dd hh:mm") == DateTime.Now.ToString("yyyy-MM-dd hh:mm"))
+            {
+                //当前办理人不为空发短信给个人
+                if (!string.IsNullOrEmpty(order.CurrentHandlerId))
+                {
+                    //查询人员
+                    var user = await _userRepository.GetAsync(order.CurrentHandlerId, cancellationToken);
+                    if (user != null && !string.IsNullOrEmpty(user.PhoneNo))
+                    {
+                        //发送短信
+                        var messageDto = new Share.Dtos.Push.MessageDto
+                        {
+                            PushBusiness = EPushBusiness.OrderUrge,
+                            ExternalId = order.Id,
+                            OrderId = order.Id,
+                            PushPlatform = EPushPlatform.Sms,
+                            Remark = order.Title,
+                            Name = user.Name,
+                            TemplateCode = "1009",
+                            Params = new List<string>() { order.No },
+                            TelNumber = user.PhoneNo,
+                        };
+                        await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+                    }
+                }
+                //当前办理部门不为空,发短信给部门经办人
+                else if (!string.IsNullOrEmpty(order.CurrentHandleOrgId))
+                {
+                    //查询部门经办人
+                    var userlist = await _userRepository.Queryable().Where(x =>
+                        x.OrgId == order.CurrentHandleOrgId && !string.IsNullOrEmpty(x.PhoneNo) &&
+                        x.Roles.Any(d => d.Id == "08dae71e-0eca-4bc4-89fe-7eaefae8a98e")).ToListAsync();
+                    foreach (var user in userlist)
+                    {
+                        if (!string.IsNullOrEmpty(user.PhoneNo))
+                        {
+                            //发送短信
+                            var messageDto = new Share.Dtos.Push.MessageDto
+                            {
+                                PushBusiness = EPushBusiness.OrderUrge,
+                                ExternalId = order.Id,
+                                OrderId = order.Id,
+                                PushPlatform = EPushPlatform.Sms,
+                                Remark = order.Title,
+                                Name = user.Name,
+                                TemplateCode = "1009",
+                                Params = new List<string>() { order.No },
+                                TelNumber = user.PhoneNo,
+                            };
+                            await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+                        }
+                    }
+                }
+            }
+        }
+
+    }
+}

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

@@ -1062,4 +1062,9 @@ namespace Hotline.Share.Dtos.Order
         public DateTime RemarkTime { get; set; }
 
     }
+
+    public class PublishNearlyExpiredTimeSmsDto
+    {
+        public string OrderId { get; set; }
+    }
 }

+ 10 - 0
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -515,6 +515,16 @@ namespace Hotline.Share.Dtos.Order
         /// 评判意见
         /// </summary>
         public string? JudgeContent { get; set; }
+
+        /// <summary>
+        /// 是否有效智能回访
+        /// </summary>
+        public bool? IsEffectiveAiVisit { get; set; }
+        /// <summary>
+        /// 是否有效智能回访
+        /// </summary>
+        public string IsEffectiveAiVisitText => IsEffectiveAiVisit == true ? "是" : IsEffectiveAiVisit == false ? "否" : "";
+
     }
 
     public class OrderVisitDetailDto

+ 15 - 0
src/Hotline.Share/Mq/EventNames.Order.cs

@@ -111,5 +111,20 @@ namespace Hotline.Share.Mq
         public const string HotlineOrderContingencyManagementState = "hotline.order.contingency.management.state";
 
         #endregion
+
+
+        #region 内部订阅
+
+        /// <summary>
+        /// 即将超期短信(延迟消息)
+        /// </summary>
+        public const string HotlineOrderNearlyExpiredTimeSms = "hotline.order.nearlyexpiredtime.sms";
+
+        /// <summary>
+        /// 超期短信(延迟消息)
+        /// </summary>
+        public const string HotlineOrderExpiredTimeSms = "hotline.order.expiredtime.sms";
+
+        #endregion
     }
 }

+ 4 - 4
src/Hotline/Authentications/ProvinceSessionContext.cs

@@ -13,19 +13,19 @@ namespace Hotline.Authentications
             OrgLevel = 1;
         }
 
-        //TODO 取消写入
+        //取消写入
         /// <summary>
         /// Id of current tenant or null for host
         /// </summary>
-        public string? UserId { get; set; }
+        public string? UserId { get; }
 
         /// <summary>
         /// Id of current user or throw Exception for guest
         /// </summary>
         /// <exception cref="AuthenticationException"></exception>
         public string RequiredUserId => UserId ?? throw new ArgumentNullException();
-        //TODO 取消写入
-		public string? UserName { get; set; }
+        //取消写入
+		public string? UserName { get; }
         public string? Phone { get; }
 
         /// <summary>

+ 3 - 3
src/Hotline/CallCenter/Calls/CallDomainService.cs

@@ -69,7 +69,7 @@ namespace Hotline.CallCenter.Calls
         {
             //调用设备接口转外线
             await _deviceManager.VisitorToOuterAsync(_options.Value.NewRock, request.VisitorId, request.OuterPhoneNum, cancellationToken);
-            //TODO 写入数据库通话记录
+            //写入数据库通话记录
         }
 
         /// <summary>
@@ -82,7 +82,7 @@ namespace Hotline.CallCenter.Calls
         {
             //调用设备接口转语音菜单
             await _deviceManager.VisitorToMenuAsync(_options.Value.NewRock, request.VisitorId, request.MenuId, cancellationToken);
-            //TODO 写入数据库通话记录
+            //写入数据库通话记录
         }
 
         /// <summary>
@@ -94,7 +94,7 @@ namespace Hotline.CallCenter.Calls
         public async Task VisitorToTelGroupAsync(VisitorToTelGroupRequest request, CancellationToken cancellationToken)
         {
             await _deviceManager.VisitorToGroupAsync(_options.Value.NewRock, request.VisitorId, request.GroupId, cancellationToken);
-            //TODO 写入数据库通话记录
+            //写入数据库通话记录
         }
 
         #endregion