|
@@ -11,6 +11,7 @@ using XF.Domain.Exceptions;
|
|
using XF.Domain.Repository;
|
|
using XF.Domain.Repository;
|
|
using Hotline.CallCenter.Calls;
|
|
using Hotline.CallCenter.Calls;
|
|
using Hotline.File;
|
|
using Hotline.File;
|
|
|
|
+using Hotline.FlowEngine.Workflows;
|
|
using Hotline.Schedulings;
|
|
using Hotline.Schedulings;
|
|
using Hotline.Users;
|
|
using Hotline.Users;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Http;
|
|
@@ -37,6 +38,8 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
|
|
private readonly IRepository<Scheduling> _schedulingRepository;
|
|
private readonly IRepository<Scheduling> _schedulingRepository;
|
|
private readonly IRepository<User> _userRepository;
|
|
private readonly IRepository<User> _userRepository;
|
|
private readonly ISystemSettingCacheManager _systemSettingCacheManager;
|
|
private readonly ISystemSettingCacheManager _systemSettingCacheManager;
|
|
|
|
+ private readonly IWorkflowDomainService _workflowDomainService;
|
|
|
|
+
|
|
|
|
|
|
public OrderDomainService(
|
|
public OrderDomainService(
|
|
IOrderRepository orderRepository,
|
|
IOrderRepository orderRepository,
|
|
@@ -54,7 +57,8 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
|
|
IRepository<WexCallRecord> wexCallRecordRepository,
|
|
IRepository<WexCallRecord> wexCallRecordRepository,
|
|
IRepository<User> userRepository,
|
|
IRepository<User> userRepository,
|
|
ISystemSettingCacheManager systemSettingCacheManager,
|
|
ISystemSettingCacheManager systemSettingCacheManager,
|
|
- IRepository<Scheduling> schedulingRepository)
|
|
|
|
|
|
+ IRepository<Scheduling> schedulingRepository,
|
|
|
|
+ IWorkflowDomainService workflowDomainService)
|
|
{
|
|
{
|
|
_orderRepository = orderRepository;
|
|
_orderRepository = orderRepository;
|
|
_orderRedoRepository = orderRedoRepository;
|
|
_orderRedoRepository = orderRedoRepository;
|
|
@@ -71,6 +75,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
|
|
_userRepository = userRepository;
|
|
_userRepository = userRepository;
|
|
_schedulingRepository = schedulingRepository;
|
|
_schedulingRepository = schedulingRepository;
|
|
_systemSettingCacheManager = systemSettingCacheManager;
|
|
_systemSettingCacheManager = systemSettingCacheManager;
|
|
|
|
+ _workflowDomainService = workflowDomainService;
|
|
}
|
|
}
|
|
|
|
|
|
public async Task<Order> GetOrderAsync(string? orderId, bool withHotspot = false, bool withAcceptor = false,
|
|
public async Task<Order> GetOrderAsync(string? orderId, bool withHotspot = false, bool withAcceptor = false,
|
|
@@ -172,10 +177,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
|
|
/// 平均派单
|
|
/// 平均派单
|
|
/// </summary>
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
/// <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"));
|
|
DateTime time = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd"));
|
|
//根据当前时间获取排班信息
|
|
//根据当前时间获取排班信息
|
|
var scheduling = await _schedulingRepository.Queryable().Includes(x => x.SchedulingUser)
|
|
var scheduling = await _schedulingRepository.Queryable().Includes(x => x.SchedulingUser)
|
|
@@ -187,7 +191,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
|
|
scheduling.SendOrderNum++;
|
|
scheduling.SendOrderNum++;
|
|
await _schedulingRepository.UpdateAsync(scheduling);
|
|
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>
|
|
/// <summary>
|
|
@@ -195,22 +201,88 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
|
|
/// </summary>
|
|
/// </summary>
|
|
/// <param name="userId"></param>
|
|
/// <param name="userId"></param>
|
|
/// <returns></returns>
|
|
/// <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>
|
|
/// 触发平均派单
|
|
/// 触发平均派单
|
|
/// </summary>
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
/// <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
|
|
|
|
|
|
#endregion
|
|
#endregion
|