Prechádzať zdrojové kódy

Merge branch 'dev' into feature_batchoutcall_dss

Dun.Jason 11 mesiacov pred
rodič
commit
e6ac4d65e4

+ 3 - 1
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -116,7 +116,9 @@ namespace Hotline.Api.Controllers.Bi
                     .WhereIF(dto.QueryType == 3, x => x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()) //业务待办超期
                     .WhereIF(dto.QueryType == 5, x =>
                         (x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) || (x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()))
-                    .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3, x => x.ActualHandleOrgCode.StartsWith(dto.OrgCode));
+                    .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3 && dto.OrgCode == "001", x => x.ActualHandleOrgCode == dto.OrgCode)
+                    .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3 && dto.OrgCode != "001", x => x.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+					.MergeTable();
 
             if (dto.QueryType is 2 or 4 or 5)
             {

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

@@ -314,8 +314,13 @@ namespace Hotline.Api.Controllers
             if (work is null)
                 throw UserFriendlyException.SameMessage("分机未签入,不能操作");
 
-            var telAction = new TelActionRecord(work.UserId, work.UserName, work.TelNo, work.QueueId, (EActionType)actionType);
-            await _telActionRecordRepository.AddAsync(telAction, HttpContext.RequestAborted);
+            //判断如果已经存在未结束的该动作就不新增
+            var ishas = await _telActionRecordRepository.AnyAsync(x => x.TelNo == work.TelNo && x.ActionType == (EActionType)actionType && !x.EndTime.HasValue, HttpContext.RequestAborted);
+            if (!ishas)
+            {
+                var telAction = new TelActionRecord(work.UserId, work.UserName, work.TelNo, work.QueueId, (EActionType)actionType);
+                await _telActionRecordRepository.AddAsync(telAction, HttpContext.RequestAborted);
+            }
         }
 
         /// <summary>

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

@@ -4658,12 +4658,11 @@ public class OrderController : BaseController
 
         if (!string.IsNullOrEmpty(order.WorkflowId))
         {
-            var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId,
-                    cancellationToken: HttpContext.RequestAborted);
-            workflow.HandlerOrgs = new();
-            workflow.HandlerUsers = new();
-            workflow.Assign(EFlowAssignType.User, _sessionContext.RequiredUserId);
-            await _workflowRepository.UpdateAsync(workflow, HttpContext.RequestAborted);
+            var workflow = await _workflowDomainService.SignToSomebodyAsync(
+                order.WorkflowId,
+                _sessionContext.RequiredUserId, _sessionContext.UserName, 
+                _sessionContext.RequiredOrgId, _sessionContext.OrgName,
+                HttpContext.RequestAborted);
 
             order.HandlerOrgs = workflow.HandlerOrgs;
             order.HandlerUsers= workflow.HandlerUsers;
@@ -4988,7 +4987,7 @@ public class OrderController : BaseController
             .Where(x=>x.OrderId == dto.OrderId)
 			.WhereIF(!string.IsNullOrEmpty(dto.Keyword),x => x.No.Contains(dto.Keyword!))
 			.OrderByDescending(x => x.CreationTime)
-			.ToPagedListAsync(1, 1, HttpContext.RequestAborted);
+			.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 		return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
 	}
 

+ 24 - 2
src/Hotline.Application/Handlers/FlowEngine/WorkflowRecallHandler.cs

@@ -1,4 +1,5 @@
 using DotNetCore.CAP;
+using Hotline.Caching.Interfaces;
 using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
@@ -10,6 +11,7 @@ using Hotline.Share.Enums.Order;
 using MapsterMapper;
 using MediatR;
 using Microsoft.Extensions.Logging;
+using XF.Domain.Constants;
 
 namespace Hotline.Application.Handlers.FlowEngine;
 
@@ -19,6 +21,7 @@ public class WorkflowRecallHandler : INotificationHandler<RecallNotify>
     private readonly IOrderRepository _orderRepository;
     private readonly IWorkflowDomainService _workflowDomainService;
     private readonly ITimeLimitDomainService _timeLimitDomainService;
+    private readonly ISystemSettingCacheManager _systemSettingCacheManager;
     private readonly ICapPublisher _capPublisher;
     private readonly IMapper _mapper;
     private readonly ILogger<WorkflowRecallHandler> _logger;
@@ -28,6 +31,7 @@ public class WorkflowRecallHandler : INotificationHandler<RecallNotify>
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
         ITimeLimitDomainService timeLimitDomainService,
+        ISystemSettingCacheManager systemSettingCacheManager,
         ICapPublisher capPublisher,
         IMapper mapper,
         ILogger<WorkflowRecallHandler> logger)
@@ -36,6 +40,7 @@ public class WorkflowRecallHandler : INotificationHandler<RecallNotify>
         _orderRepository = orderRepository;
         _workflowDomainService = workflowDomainService;
         _timeLimitDomainService = timeLimitDomainService;
+        _systemSettingCacheManager = systemSettingCacheManager;
         _capPublisher = capPublisher;
         _mapper = mapper;
         _logger = logger;
@@ -57,11 +62,28 @@ public class WorkflowRecallHandler : INotificationHandler<RecallNotify>
                 _mapper.Map(workflow, order);
                 if (notification.TargetStep.StepType is EStepType.Start)
                 {
+                    if (!bool.TryParse(
+                            _systemSettingCacheManager.GetSetting(SettingConstants.IsRecallToSeatDesignated)?.SettingValue[0],
+                            out var isRecallToSeatDesignated))
+                        isRecallToSeatDesignated = false;
+                    //var isRecallToSeatDesignated = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsRecallToSeatDesignated).SettingValue[0]);
                     order.Status = EOrderStatus.SpecialToUnAccept;
-                    order.BackToUnsign();
+                    if (isRecallToSeatDesignated)
+                    {
+                        if (data.HandlerType is EHandlerType.Role or EHandlerType.AssignedUser)
+                        {
+                            var handler = data.NextHandlers.First();
+                            order.SignerId = handler.Key;
+                            order.SignerName = handler.Value;
+                        }
+                    }
+                    else
+                    {
+                        order.BackToUnsign();
+                    }
                 }
                 await _orderRepository.UpdateAsync(order, false, cancellationToken);
-				break;
+                break;
             case WorkflowModuleConsts.KnowledgeAdd:
             case WorkflowModuleConsts.KnowledgeUpdate:
             case WorkflowModuleConsts.KnowledgeDelete:

+ 6 - 2
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -239,7 +239,11 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 查询流转方向
         /// </summary>
-        EFlowDirection GetFlowDirection(EBusinessType sourceStepBusinessType,
-            EBusinessType directionStepBusinessType);
+        EFlowDirection GetFlowDirection(EBusinessType sourceStepBusinessType, EBusinessType directionStepBusinessType);
+
+        /// <summary>
+        /// 流程被签收至某个用户(更新流转对象,办理对象,节点办理对象以及stepHandlers)
+        /// </summary>
+        Task<Workflow> SignToSomebodyAsync(string workflowId, string userId, string username, string orgId, string orgName, CancellationToken cancellationToken);
     }
 }

+ 44 - 1
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -85,7 +85,7 @@ namespace Hotline.FlowEngine.Workflows
                 Traces = new(),
                 WorkflowDefinition = definition,
                 ExternalId = externalId ?? string.Empty,
-                FlowedOrgIds = new List<string> { orgId },
+                //FlowedOrgIds = new List<string> { orgId },
                 FlowedUserIds = new List<string> { userId },
                 FlowType = definition.FlowType,
             };
@@ -809,6 +809,49 @@ namespace Hotline.FlowEngine.Workflows
             }
         }
 
+        /// <summary>
+        /// 流程被签收至某个用户(更新流转对象,办理对象,节点办理对象以及stepHandlers)
+        /// </summary>
+        public async Task<Workflow> SignToSomebodyAsync(string workflowId, string userId, string username, string orgId, string orgName, CancellationToken cancellationToken)
+        {
+            var workflow = await GetWorkflowAsync(workflowId, withSteps: true, cancellationToken: cancellationToken);
+            workflow.Assign(EFlowAssignType.User, _sessionContext.RequiredUserId);
+
+            workflow.HandlerOrgs = new();
+            workflow.HandlerUsers = new List<HandlerGroupItem>
+            {
+                new()
+                {
+                    GroupId = Guid.NewGuid().ToString(),
+                    Key = userId,
+                    Value = username
+                }
+            };
+
+            var startStep = workflow.Steps.First(d => d.StepType == EStepType.Start && d.IsOrigin);
+            startStep.Handlers = new List<Kv> { new(userId, username) };
+            startStep.AcceptorId = userId;
+            startStep.AcceptorName = username;
+            startStep.AcceptTime = DateTime.Now;
+            startStep.AcceptorOrgId = orgId;
+            startStep.AcceptorOrgName = orgName;
+
+            var stepHandler = startStep.StepHandlers.First();
+            startStep.StepHandlers.RemoveAll(d => d.Id != stepHandler.Id);
+            stepHandler.UserId = userId;
+            stepHandler.Username = username;
+            stepHandler.OrgId = orgId;
+            stepHandler.OrgName = orgName;
+
+            await _workflowStepRepository.UpdateNav(startStep)
+                .Include(d => d.StepHandlers)
+                .ExecuteCommandAsync();
+
+            await _workflowRepository.UpdateAsync(workflow, cancellationToken);
+
+            return workflow;
+        }
+
         /// <summary>
         /// 查找当前会签内所有节点(含start,end)
         /// </summary>

+ 32 - 32
src/Hotline/Orders/Order.cs

@@ -317,7 +317,7 @@ namespace Hotline.Orders
         /// <summary>
         /// 交办意见
         /// </summary>
-        public string? CenterToOrgOpinion{ get; set; }
+        public string? CenterToOrgOpinion { get; set; }
 
         /// <summary>
         /// 交班人
@@ -651,7 +651,7 @@ namespace Hotline.Orders
         /// <summary>
         /// 归档人类型
         /// </summary>
-        public EFileUserType? FileUserRole{get;set;}
+        public EFileUserType? FileUserRole { get; set; }
 
         #endregion
 
@@ -686,9 +686,9 @@ namespace Hotline.Orders
         [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
         public List<FileJson>? FileJson { get; set; }
 
-		#endregion
+        #endregion
 
-		#region 市州工单互转
+        #region 市州工单互转
         /// <summary>
         /// 是否转发
         /// </summary>
@@ -704,25 +704,25 @@ namespace Hotline.Orders
         /// </summary>
         public string? TranspondCityName { get; set; }
 
-		/// <summary>
-		/// 转发市州Value
-		/// </summary>
-		public string? TranspondCityValue { get; set; }
-		#endregion
+        /// <summary>
+        /// 转发市州Value
+        /// </summary>
+        public string? TranspondCityValue { get; set; }
+        #endregion
 
-		#region 重办
+        #region 重办
 
         /// <summary>
         /// 重办次数
         /// </summary>
         public int? ReTransactNum { get; set; }
-		#endregion
+        #endregion
 
-		/// <summary>
-		/// 敏感标签
-		/// </summary>
-		[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
-		public List<string>? Sensitive { get; set; }
+        /// <summary>
+        /// 敏感标签
+        /// </summary>
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+        public List<string>? Sensitive { get; set; }
 
         /// <summary>
         /// 是否行政执法类
@@ -736,7 +736,7 @@ namespace Hotline.Orders
         public bool IsResolved { get; set; }
     }
 
-	public partial class Order
+    public partial class Order
     {
         /// <summary>
         /// 受理人
@@ -786,10 +786,10 @@ namespace Hotline.Orders
         [Navigate(NavigateType.OneToMany, nameof(OrderSpecial.OrderId))]
         public List<OrderSpecial> OrderSpecials { get; set; }
 
-		/// <summary>
-		/// 延期
-		/// </summary>
-		[Navigate(NavigateType.OneToMany, nameof(OrderDelay.OrderId))]
+        /// <summary>
+        /// 延期
+        /// </summary>
+        [Navigate(NavigateType.OneToMany, nameof(OrderDelay.OrderId))]
         public List<OrderDelay> OrderDelays { get; set; }
 
         /// <summary>
@@ -801,7 +801,7 @@ namespace Hotline.Orders
         /// <summary>
         /// 通话记录
         /// </summary>
-        [Navigate(NavigateType.OneToOne,nameof(CallId),nameof(TrCallRecord.CallAccept))]
+        [Navigate(NavigateType.OneToOne, nameof(CallId), nameof(TrCallRecord.CallAccept))]
         public TrCallRecord CallRecord { get; set; }
 
 
@@ -894,7 +894,7 @@ namespace Hotline.Orders
             Status = EOrderStatus.Visited;
         }
 
-        public void CenterToOrg(string timelimit, int timelimitCount, ETimeType timilimitUnit, 
+        public void CenterToOrg(string timelimit, int timelimitCount, ETimeType timilimitUnit,
             DateTime expiredTime, DateTime nearlyExpiredTime,
             string opinion, string handlerId, string handlerName)
         {
@@ -909,7 +909,7 @@ namespace Hotline.Orders
             CenterToOrgHandlerName = handlerName;
             NearlyExpiredTime = nearlyExpiredTime;
             SendOrderNumber += 1;
-		}
+        }
 
         public void OrgToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime)
         {
@@ -927,14 +927,14 @@ namespace Hotline.Orders
 
         public void CenterToCenter(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime)
         {
-	        TimeLimit = timelimit;
-	        TimeLimitCount = timelimitCount;
-	        TimeLimitUnit = timilimitUnit;
-	        ExpiredTime = expiredTime;
-	        NearlyExpiredTime = nearlyExpiredTime;
+            TimeLimit = timelimit;
+            TimeLimitCount = timelimitCount;
+            TimeLimitUnit = timilimitUnit;
+            ExpiredTime = expiredTime;
+            NearlyExpiredTime = nearlyExpiredTime;
         }
 
-		public void SetHandleDuration()
+        public void SetHandleDuration()
         {
             if (!ActualHandleTime.HasValue) return;
             if (!CenterToOrgTime.HasValue) return;
@@ -974,8 +974,8 @@ namespace Hotline.Orders
         /// </summary>
         public void BackToUnsign()
         {
-            SignerId = null;
-            SignerName = null;
+            SignerId = string.Empty;
+            SignerName = string.Empty;
         }
 
         #endregion

+ 5 - 0
src/XF.Domain/Constants/SettingConstants.cs

@@ -222,6 +222,11 @@ namespace XF.Domain.Constants
         /// </summary>
         public const string WebSystemSettingsTheme = "WebSystemSettingsTheme";
 
+        /// <summary>
+        /// 工单特提至坐席是否指派给选择对象
+        /// </summary>
+        public const string IsRecallToSeatDesignated = "IsRecallToSeatDesignated";
+
 
         #region 智能外呼