瀏覽代碼

Merge branch 'feature/order_handle_main_secondary' into dev

xf 4 月之前
父節點
當前提交
548c81930d

+ 17 - 9
src/Hotline.Api/Controllers/OrderController.cs

@@ -147,6 +147,7 @@ public class OrderController : BaseController
     private readonly IRepository<OrderPushType> _orderPushTypeRepository;
     private readonly IRepository<OrderPushType> _orderPushTypeRepository;
     private readonly IRepository<OrderRevoke> _orderRevokeRepository;
     private readonly IRepository<OrderRevoke> _orderRevokeRepository;
     private readonly IOrderTerminateRepository _orderTerminateRepository;
     private readonly IOrderTerminateRepository _orderTerminateRepository;
+    private readonly ISystemLogApplication _systemLogApplication;
     private readonly IRepository<OrderCarboncopy> _orderCarboncopy;
     private readonly IRepository<OrderCarboncopy> _orderCarboncopy;
 
 
     public OrderController(
     public OrderController(
@@ -3499,6 +3500,13 @@ public class OrderController : BaseController
             var exists = await _orderRepository.AnyAsync(d => d.CallId == dto.CallId, HttpContext.RequestAborted);
             var exists = await _orderRepository.AnyAsync(d => d.CallId == dto.CallId, HttpContext.RequestAborted);
             if (exists)
             if (exists)
                 throw new UserFriendlyException($"来电已保存工单, phone:{dto.FromPhone}, callId: {dto.CallId}", "来电已保存工单");
                 throw new UserFriendlyException($"来电已保存工单, phone:{dto.FromPhone}, callId: {dto.CallId}", "来电已保存工单");
+            exists = await _systemLogApplication.HasByIpUrlAsync(dto.CallId);
+            if (exists)
+            {
+                // IpUrl 里面存的是 callId, 用来判断是工单的 CallId 是否已经被修复过了.
+                // 存入的地方是 Hotline.Application.CallCenter.OrderRelateCallHandlerAsync
+                throw new UserFriendlyException($"来电已保存工单, phone:{dto.FromPhone}, callId: {dto.CallId} !", "来电已保存工单!");
+            }
         }
         }
 
 
         var order = _mapper.Map<Orders.Order>(dto);
         var order = _mapper.Map<Orders.Order>(dto);
@@ -4066,16 +4074,16 @@ public class OrderController : BaseController
       NextWorkflowDto? flowDto, DateTime? expiredTime, bool isAutoFillSummaryOpinion, CancellationToken cancellation)
       NextWorkflowDto? flowDto, DateTime? expiredTime, bool isAutoFillSummaryOpinion, CancellationToken cancellation)
     {
     {
         if (flowDto is null || !flowDto.NextHandlers.Any()) return;
         if (flowDto is null || !flowDto.NextHandlers.Any()) return;
-        var nextSteps = await _workflowDomainService.NextAsync(current, flowDto, expiredTime,
+        var currentSteps = await _workflowDomainService.NextAsync(current, flowDto, expiredTime,
             isAutoFillSummaryOpinion, cancellation);
             isAutoFillSummaryOpinion, cancellation);
 
 
-        foreach (var nextStep in nextSteps)
+        foreach (var currentStep in currentSteps)
         {
         {
-            var nextStepHandlerOrgId = nextStep?.HandlerOrgId;
-            if (string.IsNullOrEmpty(nextStepHandlerOrgId))
-                throw new UserFriendlyException($"数据异常, 待办部门id为空, stepId: {nextStep.Id}");
-            var nextStepHandlerOrgLevel = nextStepHandlerOrgId.CalcOrgLevel();
-            var nextHandlers = orgs.Where(d => d.Level == nextStepHandlerOrgLevel && d.Id.StartsWith(nextStepHandlerOrgId))
+            var currentStepHandlerOrgId = currentStep?.HandlerOrgId;
+            if (string.IsNullOrEmpty(currentStepHandlerOrgId))
+                throw new UserFriendlyException($"数据异常, 待办部门id为空, stepId: {currentStep.Id}");
+            var nextStepHandlerOrgLevel = currentStepHandlerOrgId.CalcOrgLevel() + 1;
+            var nextHandlers = orgs.Where(d => d.Level == nextStepHandlerOrgLevel && d.Id.StartsWith(currentStepHandlerOrgId))
                 .Select(d => new FlowStepHandler
                 .Select(d => new FlowStepHandler
                 {
                 {
                     Key = d.Id,
                     Key = d.Id,
@@ -4086,7 +4094,7 @@ public class OrderController : BaseController
                 .ToList();
                 .ToList();
             if (nextHandlers.Any())
             if (nextHandlers.Any())
             {
             {
-                var nextStepDefine = definition.FindStepDefines(nextStep.NextSteps.Select(d => d.Code))
+                var nextStepDefine = definition.FindStepDefines(currentStep.NextSteps.Select(d => d.Code))
                     .FirstOrDefault(d =>
                     .FirstOrDefault(d =>
                         d.HandlerType == EHandlerType.OrgLevel &&
                         d.HandlerType == EHandlerType.OrgLevel &&
                         d.HandlerTypeItems.Any(x => x.Key == nextStepHandlerOrgLevel.ToString()));
                         d.HandlerTypeItems.Any(x => x.Key == nextStepHandlerOrgLevel.ToString()));
@@ -4096,7 +4104,7 @@ public class OrderController : BaseController
                 var nextDto = new NextWorkflowDto
                 var nextDto = new NextWorkflowDto
                 {
                 {
                     WorkflowId = flowDto.WorkflowId,
                     WorkflowId = flowDto.WorkflowId,
-                    StepId = nextStep.Id,
+                    StepId = currentStep.Id,
                     NextStepCode = nextStepDefine.Code,
                     NextStepCode = nextStepDefine.Code,
                     NextStepName = nextStepDefine.Name,
                     NextStepName = nextStepDefine.Name,
                     FlowDirection = EFlowDirection.OrgToOrg,
                     FlowDirection = EFlowDirection.OrgToOrg,

+ 3 - 1
src/Hotline.Api/Controllers/OrderModuleControllers/OrderCarbonCopyController.cs

@@ -15,6 +15,7 @@ using XF.Domain.Authentications;
 using XF.Domain.Repository;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
 using XF.Utility.EnumExtensions;
 using Hotline.Caching.Interfaces;
 using Hotline.Caching.Interfaces;
+using Mapster;
 
 
 namespace Hotline.Api.Controllers.OrderModuleControllers
 namespace Hotline.Api.Controllers.OrderModuleControllers
 {
 {
@@ -45,7 +46,8 @@ namespace Hotline.Api.Controllers.OrderModuleControllers
                 .Query(dto)
                 .Query(dto)
                 .ToPageListWithoutTotalAsync(dto, HttpContext.RequestAborted);
                 .ToPageListWithoutTotalAsync(dto, HttpContext.RequestAborted);
 
 
-            return _mapper.Map<IReadOnlyList<OrderDto>>(orderccs);
+            var orderdtos = orderccs.Select(d => d.Order.Adapt<OrderDto>()).ToList();
+            return orderdtos;
         }
         }
 
 
         [HttpGet("count")]
         [HttpGet("count")]

+ 2 - 2
src/Hotline.Application/CallCenter/DefaultCallApplication.cs

@@ -405,7 +405,7 @@ public abstract class DefaultCallApplication : ICallApplication
     /// </summary>
     /// </summary>
     public virtual async Task<CallNative> GetCallByCallNoAsync(string callNo, CancellationToken cancellationToken)
     public virtual async Task<CallNative> GetCallByCallNoAsync(string callNo, CancellationToken cancellationToken)
     {
     {
-        return  await _callNativeRepository.Queryable()
+        return await _callNativeRepository.Queryable()
             .Where(m => m.CallNo == callNo && !string.IsNullOrEmpty(m.AudioFile))
             .Where(m => m.CallNo == callNo && !string.IsNullOrEmpty(m.AudioFile))
             .FirstAsync(cancellationToken);
             .FirstAsync(cancellationToken);
     }
     }
@@ -580,7 +580,7 @@ public abstract class DefaultCallApplication : ICallApplication
             TrCallRecordDto = call.Adapt<TrCallDto>()
             TrCallRecordDto = call.Adapt<TrCallDto>()
         }, cancellationToken: cancellationToken);
         }, cancellationToken: cancellationToken);
         var msg = $"原CallId: {orderCall.CallId}, 更新CallId: {call.Id}";
         var msg = $"原CallId: {orderCall.CallId}, 更新CallId: {call.Id}";
-        _systemLogRepository.Add("延迟更新工单通话", orderId, msg, status: 1);
+        _systemLogRepository.Add("延迟更新工单通话", orderId, msg,status:1, ipUrl: orderCall.CallId);
         return msg + "(完成推省上)";
         return msg + "(完成推省上)";
     }
     }
 
 

+ 0 - 3
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -265,8 +265,5 @@ public class OrderMapperConfigs : IRegister
             .IgnoreIf((s, d) => s.OrgHandledAttitude == null, d => d.OrgHandledAttitude)
             .IgnoreIf((s, d) => s.OrgHandledAttitude == null, d => d.OrgHandledAttitude)
             .Map(d => d.OrgHandledAttitude, s => s.OrgHandledAttitude.Value)
             .Map(d => d.OrgHandledAttitude, s => s.OrgHandledAttitude.Value)
             ;
             ;
-
-        config.ForType<OrderCarboncopy, OrderDto>()
-            .Map(d => d, s => s.Order);
     }
     }
 }
 }

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

@@ -3766,7 +3766,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                              (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
                              (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
                              (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
                              (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)) ||
                              (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
                              (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
-                              && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId)))
+                              && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
+                            && step.Status < EWorkflowStepStatus.Handled)
                         .OrderByDescending(step => step.CreationTime)
                         .OrderByDescending(step => step.CreationTime)
                         .Take(1)
                         .Take(1)
                         .ToList())
                         .ToList())
@@ -3778,8 +3779,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                          (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
                                          (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
                                           && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
                                           && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
                                         && step.Status < EWorkflowStepStatus.Handled)
                                         && step.Status < EWorkflowStepStatus.Handled)
-                                || (SqlFunc.IsNullOrEmpty(d.WorkflowId) && SqlFunc.IsNullOrEmpty(d.SignerId)
-                                    || (!SqlFunc.IsNullOrEmpty(d.SignerId) && d.SignerId == _sessionContext.UserId))
+                                || (SqlFunc.IsNullOrEmpty(d.WorkflowId) 
+                                    && (SqlFunc.IsNullOrEmpty(d.SignerId) || (!SqlFunc.IsNullOrEmpty(d.SignerId) && d.SignerId == _sessionContext.UserId)))
                     )
                     )
                     .Where(d => d.Status < EOrderStatus.Filed
                     .Where(d => d.Status < EOrderStatus.Filed
                         && (d.Status <= EOrderStatus.HandOverToUnAccept
                         && (d.Status <= EOrderStatus.HandOverToUnAccept

+ 4 - 1
src/Hotline.Application/Systems/ISystemLogApplication.cs

@@ -10,5 +10,8 @@ namespace Hotline.Application.Systems
 	public interface ISystemLogApplication
 	public interface ISystemLogApplication
 	{
 	{
 		Task AddLog<T>(string name, string res, T entity, HttpContext context,string crName ="");
 		Task AddLog<T>(string name, string res, T entity, HttpContext context,string crName ="");
-	}
+
+		Task<bool> HasByIpUrlAsync(string ipUrl);
+
+    }
 }
 }

+ 7 - 2
src/Hotline.Application/Systems/SystemLogApplication.cs

@@ -11,7 +11,7 @@ using XF.Domain.Repository;
 
 
 namespace Hotline.Application.Systems
 namespace Hotline.Application.Systems
 {
 {
-	public class SystemLogApplication: ISystemLogApplication, IScopeDependency
+    public class SystemLogApplication : ISystemLogApplication, IScopeDependency
 	{
 	{
 		private readonly IMapper _mapper;
 		private readonly IMapper _mapper;
 		private readonly IRepository<SystemLog> _systemLogRepository;
 		private readonly IRepository<SystemLog> _systemLogRepository;
@@ -43,5 +43,10 @@ namespace Hotline.Application.Systems
 			if (!string.IsNullOrEmpty(crName))
 			if (!string.IsNullOrEmpty(crName))
 				await _systemLogRepository.Updateable().SetColumns(l => new SystemLog() { CreatorName = crName }).Where(l => l.Id == log.Id).ExecuteCommandAsync();
 				await _systemLogRepository.Updateable().SetColumns(l => new SystemLog() { CreatorName = crName }).Where(l => l.Id == log.Id).ExecuteCommandAsync();
 		}
 		}
-	}
+
+        public async Task<bool> HasByIpUrlAsync(string ipUrl)
+        {
+			return await _systemLogRepository.Queryable().Where(x => x.IpUrl == ipUrl).AnyAsync();
+        }
+    }
 }
 }

+ 3 - 2
src/Hotline.Repository.SqlSugar/System/SystemLogRepository.cs

@@ -18,7 +18,7 @@ public class SystemLogRepository : BaseRepository<SystemLog>, ISystemLogReposito
     {
     {
     }
     }
 
 
-    public void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0)
+    public void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "")
     {
     {
         try
         try
         {
         {
@@ -28,7 +28,8 @@ public class SystemLogRepository : BaseRepository<SystemLog>, ISystemLogReposito
                 ExecuteParam = executeParam,
                 ExecuteParam = executeParam,
                 ExecuteUrl = executeUrl,
                 ExecuteUrl = executeUrl,
                 Remark = remark,
                 Remark = remark,
-                Status = status
+                Status = status,
+                IpUrl = ipUrl
             };
             };
             if (executeUrl.IsNullOrEmpty())
             if (executeUrl.IsNullOrEmpty())
             {
             {

+ 1 - 1
src/Hotline/Settings/ISystemLogRepository.cs

@@ -18,5 +18,5 @@ public interface ISystemLogRepository : IRepository<SystemLog>
     /// <param name="remark">备注</param>
     /// <param name="remark">备注</param>
     /// <param name="status">状态(0失败 1成功)</param>
     /// <param name="status">状态(0失败 1成功)</param>
     /// <returns></returns>
     /// <returns></returns>
-    void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0);
+    void Add(string name, string executeParam = "", string remark = "", [CallerMemberName]string executeUrl = "", int status = 0, string ipUrl = "");
 }
 }