Selaa lähdekoodia

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

田爽 4 kuukautta sitten
vanhempi
commit
f10e2b6a77

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

@@ -146,6 +146,7 @@ public class OrderController : BaseController
     private readonly IRepository<OrderPushType> _orderPushTypeRepository;
     private readonly IRepository<OrderRevoke> _orderRevokeRepository;
     private readonly IOrderTerminateRepository _orderTerminateRepository;
+    private readonly ISystemLogApplication _systemLogApplication;
 
     public OrderController(
         IOrderDomainService orderDomainService,
@@ -211,7 +212,8 @@ public class OrderController : BaseController
         IRepository<OrderRevoke> orderRevokeRepository,
         BaseDataApplication baseDataApplication,
         IOrderTerminateRepository orderTerminateRepository,
-        ITypedCache<string> typeCache)
+        ITypedCache<string> typeCache,
+        ISystemLogApplication systemLogApplication)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -278,6 +280,7 @@ public class OrderController : BaseController
         _orderRevokeRepository = orderRevokeRepository;
         _typeCache = typeCache;
         _baseDataApplication = baseDataApplication;
+        _systemLogApplication = systemLogApplication;
     }
 
     #endregion
@@ -3495,6 +3498,13 @@ public class OrderController : BaseController
             var exists = await _orderRepository.AnyAsync(d => d.CallId == dto.CallId, HttpContext.RequestAborted);
             if (exists)
                 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);

+ 13 - 1
src/Hotline.Application.Tests/Controller/OrderControllerTest.cs

@@ -59,7 +59,7 @@ public class OrderControllerTest : TestBase
     private readonly IOrderVisitRepository _orderVisitRepository;
     private readonly IRepository<SystemSetting> _systemSettingRepository;
     private readonly ISystemSettingCacheManager _systemSettingCacheManager;
-    private readonly IRepository<CallNative> _callNativeRepository; 
+    private readonly IRepository<CallNative> _callNativeRepository;
     private readonly IRepository<CallidRelation> _callIdRelationRepository;
     private readonly XingTangCallApplication _defaultCallApplication;
     private readonly ISqlSugarClient _capSqlClient;
@@ -90,6 +90,7 @@ public class OrderControllerTest : TestBase
     /// 验证: 
     /// 测试在延迟消息后会不会把工单测CallId修复成正确的CallId
     /// 推送的省上数据是否正确
+    /// 测试修复后的CallId 再次保存功能, 能通过 systemLog 查询修复记录, 拦截工单保存
     /// </summary>
     /// <returns></returns>
     [Fact]
@@ -136,6 +137,17 @@ public class OrderControllerTest : TestBase
         message.Value.Order.ShouldNotBeNull("推送的工单信息为空");
         message.Value.Order.ProvinceNo.ShouldNotBeNull("省工单编号不能为空");
         message.Value.Order.No.ShouldBe(order.No, "推送的工单编号错误");
+
+        try
+        {
+            order = _orderServiceMock.CreateOrder(callNo)
+                       .办理到派单员()
+                       .GetCreateResult();
+        }
+        catch (UserFriendlyException e)
+        {
+            e.FriendlyMessage.ShouldBe("来电已保存工单!");
+        }
     }
 
     /// <summary>

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

@@ -405,7 +405,7 @@ public abstract class DefaultCallApplication : ICallApplication
     /// </summary>
     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))
             .FirstAsync(cancellationToken);
     }
@@ -580,7 +580,7 @@ public abstract class DefaultCallApplication : ICallApplication
             TrCallRecordDto = call.Adapt<TrCallDto>()
         }, cancellationToken: cancellationToken);
         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 + "(完成推省上)";
     }
 

+ 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.Role && !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)
                         .Take(1)
                         .ToList())
@@ -3778,8 +3779,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                          (step.FlowAssignType == EFlowAssignType.OrgAndRole && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId)
                                           && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId))
                                         && 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
                         && (d.Status <= EOrderStatus.HandOverToUnAccept

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

@@ -10,5 +10,8 @@ namespace Hotline.Application.Systems
 	public interface ISystemLogApplication
 	{
 		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
 {
-	public class SystemLogApplication: ISystemLogApplication, IScopeDependency
+    public class SystemLogApplication : ISystemLogApplication, IScopeDependency
 	{
 		private readonly IMapper _mapper;
 		private readonly IRepository<SystemLog> _systemLogRepository;
@@ -43,5 +43,10 @@ namespace Hotline.Application.Systems
 			if (!string.IsNullOrEmpty(crName))
 				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
         {
@@ -28,7 +28,8 @@ public class SystemLogRepository : BaseRepository<SystemLog>, ISystemLogReposito
                 ExecuteParam = executeParam,
                 ExecuteUrl = executeUrl,
                 Remark = remark,
-                Status = status
+                Status = status,
+                IpUrl = ipUrl
             };
             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="status">状态(0失败 1成功)</param>
     /// <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 = "");
 }