Forráskód Böngészése

Merge branch 'master' of http://git.12345lm.cn/Fengwo/hotline

Dun.Jason 1 éve
szülő
commit
900d3f17e4

+ 19 - 5
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -958,11 +958,18 @@ namespace Hotline.Api.Controllers
         [HttpGet("knowledge_correction/list")]
         public async Task<PagedDto<KnowledgeCorrectionDto>> List([FromQuery] KnowledgeCorrectionListDto dto)
         {
-            var (total, items) = await _knowledgeCorrectionRepository.Queryable()
+            var typeSpliceName = string.Empty;
+			if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
+	        {
+		        var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == dto.KnowledgeTypeId);
+		        typeSpliceName = type?.SpliceName;
+	        }
+			var (total, items) = await _knowledgeCorrectionRepository.Queryable()
                 .Includes(x => x.Knowledge)
                 //.WhereIF(!string.IsNullOrEmpty(dto.KnowledgeTypeId), x => x.Knowledge.KnowledgeTypeId == dto.KnowledgeTypeId!)
                 .WhereIF(!string.IsNullOrEmpty(dto.CreatorName), x => x.CreatorName == dto.CreatorName!)
-                .Where(x => !string.IsNullOrEmpty(x.Knowledge.Id))
+                .WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => SqlFunc.JsonLike(x.Knowledge.KnowledgeType, typeSpliceName))
+				.Where(x => !string.IsNullOrEmpty(x.Knowledge.Id))
                 .OrderByDescending(x => x.CreationTime)
                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
             return new PagedDto<KnowledgeCorrectionDto>(total, _mapper.Map<IReadOnlyList<KnowledgeCorrectionDto>>(items));
@@ -1055,10 +1062,17 @@ namespace Hotline.Api.Controllers
         [HttpGet("knowledge_questions/list")]
         public async Task<PagedDto<KnowledgeQuestionsDto>> List([FromQuery] KnowledgeQuestionsListDto dto)
         {
-            var (total, items) = await _knowledgeQuestionsRepository.Queryable()
+	        var typeSpliceName = string.Empty;
+	        if (!string.IsNullOrEmpty(dto.KnowledgeTypeId))
+	        {
+		        var type = await _knowledgeTypeRepository.GetAsync(x => x.Id == dto.KnowledgeTypeId);
+		        typeSpliceName = type?.SpliceName;
+	        }
+			var (total, items) = await _knowledgeQuestionsRepository.Queryable()
                 .Includes(x => x.Knowledge)
-                //.WhereIF(!string.IsNullOrEmpty(dto.KnowledgeTypeId), x => x.Knowledge.KnowledgeTypeId == dto.KnowledgeTypeId!)
-                .WhereIF(!string.IsNullOrEmpty(dto.CreatorName), x => x.CreatorName == dto.CreatorName!)
+				 //.WhereIF(!string.IsNullOrEmpty(dto.KnowledgeTypeId), x => x.Knowledge.KnowledgeTypeId == dto.KnowledgeTypeId!)
+				.WhereIF(!string.IsNullOrEmpty(typeSpliceName), x => SqlFunc.JsonLike(x.Knowledge.KnowledgeType, typeSpliceName))
+				.WhereIF(!string.IsNullOrEmpty(dto.CreatorName), x => x.CreatorName == dto.CreatorName!)
                 .Where(x => !string.IsNullOrEmpty(x.Knowledge.Id))
                 .OrderByDescending(x => x.CreationTime)
                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);

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

@@ -2557,6 +2557,11 @@ public class OrderController : BaseController
 
         _mapper.Map(expiredTimeConfig, order);
         await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
+        // 平均派单
+   //     if (dto.BusinessType == EBusinessType.Send)
+   //     {;
+			//dto.NextHandlers = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
+   //     }
 
         await _workflowApplication.NextAsync(dto, order.ExpiredTime, HttpContext.RequestAborted);
 
@@ -2721,7 +2726,7 @@ public class OrderController : BaseController
     [HttpPost("trigger_average_order")]
 	[AllowAnonymous]
 	public async Task TriggerAverageOrder() {
-       await  _orderDomainService.TriggerAverageOrder();
+       await  _orderDomainService.TriggerAverageOrder(HttpContext.RequestAborted);
 	}
     #endregion
 

+ 5 - 5
src/Hotline.Application/Identity/IdentityAppService.cs

@@ -98,7 +98,7 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
         if (user == null)
             throw UserFriendlyException.SameMessage("未查询到用户数据");
         //平均派单
-        await AverageOrderScheduling(account.Id);
+        //await AverageOrderScheduling(account.Id,cancellationToken);
 
 		var jwtOptions = _identityOptionsAccessor.Value.Jwt;
         var claims = new List<Claim>
@@ -134,20 +134,20 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
         return token;
     }
 
-    public async Task AverageOrderScheduling(string id) {
+    public async Task AverageOrderScheduling(string id, CancellationToken cancellationToken) {
         try
         {
             DateTime time = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
             //根据当前时间获取排班信息
             var scheduling = await _schedulingRepository.Queryable().Includes(x => x.SchedulingUser)
                 .Where(x => x.SchedulingTime == time && x.WorkingTime <= DateTime.Now.TimeOfDay && x.OffDutyTime >= DateTime.Now.TimeOfDay && x.AtWork!.Value && x.SchedulingUser.UserId == id)
-                .OrderBy(x => x.SendOrderNum).FirstAsync();
+                .OrderBy(x => x.SendOrderNum).FirstAsync(cancellationToken);
             if (scheduling != null)
             {
                 scheduling.AtWork = true;
-                await _schedulingRepository.UpdateAsync(scheduling);
+                await _schedulingRepository.UpdateAsync(scheduling, cancellationToken);
                 //执行登录平均派单
-                await _orderDomainService.LogAverageOrder(id);
+                await _orderDomainService.LogAverageOrder(id, cancellationToken);
 			}
         }
         catch 

+ 6 - 1
src/Hotline.Share/Dtos/FlowEngine/NextWorkflowDto.cs

@@ -52,5 +52,10 @@ public class NextWorkflowDto : BasicWorkflowDto
     /// </summary>
     public bool? RealContactLocale { get; set; }
 
-    #endregion
+    /// <summary>
+    /// 模板配置节点业务类型
+    /// </summary>
+    public EBusinessType BusinessType { get; set; }
+
+	#endregion
 }

+ 1 - 0
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -219,5 +219,6 @@ namespace Hotline.FlowEngine.Workflows
         Task ChangeHandlerRangeAsync(string sendPoolId,
             IReadOnlyList<(string userId, string username, IReadOnlyList<string> stepIds)> handlers,
             CancellationToken cancellationToken);
+
     }
 }

+ 3 - 3
src/Hotline/Orders/IOrderDomainService.cs

@@ -60,20 +60,20 @@ namespace Hotline.Orders
         /// 平均派单
         /// </summary>
         /// <returns></returns>
-        Task<Kv> AverageOrder();
+        Task<List<Kv>> AverageOrder(CancellationToken cancellationToken);
         
         /// <summary>
         /// 登录平均派单
         /// </summary>
         /// <param name="userId"></param>
         /// <returns></returns>
-        Task LogAverageOrder(string userId);
+        Task LogAverageOrder(string userId, CancellationToken cancellationToken);
 
         /// <summary>
         /// 触发平均派单
         /// </summary>
         /// <returns></returns>
-        Task TriggerAverageOrder();
+        Task TriggerAverageOrder(CancellationToken cancellationToken);
 		#endregion
 	}
 }

+ 87 - 15
src/Hotline/Orders/OrderDomainService.cs

@@ -11,6 +11,7 @@ using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using Hotline.CallCenter.Calls;
 using Hotline.File;
+using Hotline.FlowEngine.Workflows;
 using Hotline.Schedulings;
 using Hotline.Users;
 using Microsoft.AspNetCore.Http;
@@ -37,6 +38,8 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     private readonly IRepository<Scheduling> _schedulingRepository;
     private readonly IRepository<User> _userRepository;
     private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+    private readonly IWorkflowDomainService _workflowDomainService;
+
 
 	public OrderDomainService(
         IOrderRepository orderRepository,
@@ -54,7 +57,8 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         IRepository<WexCallRecord> wexCallRecordRepository,
         IRepository<User> userRepository,
         ISystemSettingCacheManager systemSettingCacheManager,
-		IRepository<Scheduling> schedulingRepository)
+		IRepository<Scheduling> schedulingRepository,
+        IWorkflowDomainService workflowDomainService)
     {
         _orderRepository = orderRepository;
         _orderRedoRepository = orderRedoRepository;
@@ -71,6 +75,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         _userRepository = userRepository;
 		_schedulingRepository = schedulingRepository;
 		_systemSettingCacheManager = systemSettingCacheManager;
+		_workflowDomainService = workflowDomainService; 
 	}
 
     public async Task<Order> GetOrderAsync(string? orderId, bool withHotspot = false, bool withAcceptor = false,
@@ -172,10 +177,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
 	/// 平均派单
 	/// </summary>
 	/// <returns></returns>
-	public async Task<Kv> AverageOrder()
+	public async Task<List<Kv>> AverageOrder(CancellationToken cancellationToken)
 	{
-		var setting = _systemSettingCacheManager.GetSetting(SettingConstants.DefaultDispatchClerk);
-		var user = await _userRepository.GetAsync(x => x.Id == setting!.SettingValue[0]);
+		var user = await _userRepository.GetAsync(x => x.Id == OrderDefaults.SourceChannel.SendPoolId);
 		DateTime time = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
 		//根据当前时间获取排班信息
 		var scheduling = await _schedulingRepository.Queryable().Includes(x => x.SchedulingUser)
@@ -187,7 +191,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             scheduling.SendOrderNum++;
             await _schedulingRepository.UpdateAsync(scheduling);
 		}
-		return new Kv { Key = user.Id, Value = user.Name };
+        List<Kv> res = new List<Kv>();
+        res.Add(new Kv { Key = user.Id, Value = user.Name });
+		return res;
 	}
 
     /// <summary>
@@ -195,22 +201,88 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     /// </summary>
     /// <param name="userId"></param>
     /// <returns></returns>
-    public async Task LogAverageOrder(string userId) 
+    public async Task LogAverageOrder(string userId, CancellationToken cancellationToken) 
     {
-        //1.获取默认派单员所属的工单
-        //2.获取今天上班的人员
-        //3.给当前这个用户平均派单
-    }
+		//1.获取默认派单员所属的工单
+		//2.获取今天上班的人员
+		//3.给当前这个用户平均派单
+		var steps = await _workflowDomainService.GetUnhandleStepIdsFromSendPoolAsync(OrderDefaults.SourceChannel.SendPoolId, cancellationToken);
+        var stepsList = steps.ToList();
+
+		var user = await  _userRepository.GetAsync(userId,cancellationToken);
+		DateTime time = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
+		var schedulings = await _schedulingRepository.Queryable().Includes(x => x.SchedulingUser)
+			.Where(x => x.SchedulingTime == time && x.WorkingTime <= DateTime.Now.TimeOfDay && x.OffDutyTime >= DateTime.Now.TimeOfDay).CountAsync(cancellationToken);
+        
+        if (schedulings > 0)
+        {
+			List<string> stepIds = new List<string>();
+			var sendNum = stepsList.Count() / schedulings;
+            for (int i = 0; i < sendNum; i++)
+            {
+                stepIds.Add(stepsList[i]);
+                stepsList.Remove(stepsList[i]);
+			}
+            List<(string userId, string username, IReadOnlyList<string> stepIds)> handlers = new();
+;           handlers.Add(new ValueTuple<string, string, IReadOnlyList<string>>(user.Id, user.Name, stepIds));
+		   await  _workflowDomainService.ChangeHandlerRangeAsync(OrderDefaults.SourceChannel.SendPoolId ,handlers, cancellationToken);
+
+		}
+	}
 
     /// <summary>
     /// 触发平均派单
     /// </summary>
     /// <returns></returns>
-    public async Task TriggerAverageOrder() { 
-        //1.从排班里面获取今天上班的人
-        //2.获取默认派单员剩下的工单
-        //3.平均分配剩下的工单给今天上班的人
-    }
+    public async Task TriggerAverageOrder(CancellationToken cancellationToken) {
+		//1.从排班里面获取今天上班的人
+		//2.获取默认派单员剩下的工单
+		//3.平均分配剩下的工单给今天上班的人
+		DateTime time = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
+		var schedulings = await _schedulingRepository.Queryable().Includes(x => x.SchedulingUser)
+			.Where(x => x.SchedulingTime == time && x.WorkingTime <= DateTime.Now.TimeOfDay && x.OffDutyTime >= DateTime.Now.TimeOfDay && x.AtWork!.Value)
+			.OrderBy(x => x.SendOrderNum).ToListAsync(cancellationToken);
+
+		if (schedulings.Any())
+		{
+			var steps = await _workflowDomainService.GetUnhandleStepIdsFromSendPoolAsync(OrderDefaults.SourceChannel.SendPoolId, cancellationToken);
+			var stepsList = steps.ToList();
+
+			var sendNum = steps.Count() / schedulings.Count();
+			List<(string userId, string username, IReadOnlyList<string> stepIds)> handlers = new();
+			if (sendNum > 0)
+			{
+
+				foreach (var scheduling in schedulings)
+				{
+					List<string> stepIds = new List<string>();
+					for (int i = 0; i < sendNum; i++)
+					{
+						stepIds.Add(stepsList[i]);
+						stepsList.Remove(stepsList[i]);
+					}
+					handlers.Add(new ValueTuple<string, string, IReadOnlyList<string>>(scheduling.SchedulingUser.UserId, scheduling.SchedulingUser.UserName, stepIds));
+
+				}
+			}
+			sendNum = steps.Count() % schedulings.Count();
+			if (sendNum > 0)
+			{
+				List<string> stepIds = new List<string>();
+				for (int i = 0; i < sendNum; i++)
+				{
+					stepIds.Add(stepsList[i]);
+					stepsList.Remove(stepsList[i]);
+				}
+				handlers.Add(new ValueTuple<string, string, IReadOnlyList<string>>(schedulings[0].SchedulingUser.UserId, schedulings[0].SchedulingUser.UserName, stepIds));
+
+			}
+			if (handlers.Any())
+			{
+				await _workflowDomainService.ChangeHandlerRangeAsync(OrderDefaults.SourceChannel.SendPoolId, handlers, cancellationToken);
+			}
+		}
+	}
 	#endregion
 
 	#endregion