浏览代码

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

Dun.Jason 7 月之前
父节点
当前提交
da3858b862

+ 32 - 29
src/Hotline.Api/Controllers/OrderController.cs

@@ -135,7 +135,7 @@ public class OrderController : BaseController
     private readonly IRepository<OrderPushType> _orderPushTypeRepository;
     private readonly IOptions<CityBaseConfiguration> _cityBaseConfiguration;
 
-	public OrderController(
+    public OrderController(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowApplication workflowApplication,
@@ -257,7 +257,7 @@ public class OrderController : BaseController
         _expireTime = expireTime;
         _orderPushTypeRepository = orderPushTypeRepository;
         _cityBaseConfiguration = cityBaseConfiguration;
-	}
+    }
     #endregion 
 
     #region 工单发布
@@ -386,7 +386,7 @@ public class OrderController : BaseController
                     orgDetail.VisitOrgCode = order.ActualHandleOrgCode;
                     orgDetail.VisitOrgName = order.ActualHandleOrgName;
                     orgDetail.VisitTarget = EVisitTarget.Org;
-                    if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null , IsProvince: false })
+                    if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null, IsProvince: false })
                     {
                         var satisfy = new Kv() { Key = "4", Value = "满意" };
                         orgDetail.OrgProcessingResults = satisfy;
@@ -548,7 +548,7 @@ public class OrderController : BaseController
             visitedDetail.Add(orgDetail);
         }
 
-        if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null,IsProvince:false })
+        if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null, IsProvince: false })
         {
             seatDetail.VoiceEvaluate = EVoiceEvaluate.Satisfied;
             seatDetail.SeatEvaluate = ESeatEvaluate.Satisfied;
@@ -1019,14 +1019,14 @@ public class OrderController : BaseController
                     IsAgain = false,
                     VisitDetails = new List<VisitDetailDto>
                     {
-                new()
-                {
-                Id = seatDetail.Id,
-                VisitId = visit.VisitId,
-                VisitContent = dto.SeatVisitContent,
-                SeatEvaluate = dto.SeatEvaluate,
-                                VisitTarget = EVisitTarget.Seat
-                }
+			new()
+			{
+			Id = seatDetail.Id,
+			VisitId = visit.VisitId,
+			VisitContent = dto.SeatVisitContent,
+			SeatEvaluate = dto.SeatEvaluate,
+			VisitTarget = EVisitTarget.Seat
+			}
                     }
                 };
 
@@ -1034,16 +1034,19 @@ public class OrderController : BaseController
                 foreach (var orgDetail in orgDetails)
                 {
                     visitDto.VisitDetails.Add(
-            new()
-            {
-                Id = orgDetail.Id,
-                VisitId = visit.VisitId,
-                VisitContent = dto.OrgVisitContent,
-                VisitTarget = EVisitTarget.Org,
-                OrgNoSatisfiedReason = dto.OrgNoSatisfiedReason,
-                OrgProcessingResults = dto.OrgProcessingResults,
-                OrgHandledAttitude = dto.OrgHandledAttitude
-            });
+		    new()
+		    {
+			Id = orgDetail.Id,
+			VisitId = visit.VisitId,
+			VisitContent = dto.OrgVisitContent,
+			VisitTarget = EVisitTarget.Org,
+			OrgNoSatisfiedReason = dto.OrgNoSatisfiedReason,
+			OrgProcessingResults = dto.OrgProcessingResults,
+			OrgHandledAttitude = dto.OrgHandledAttitude,
+			VisitOrgName = orgDetail.VisitOrgName,
+			VisitOrgCode = orgDetail.VisitOrgCode,
+
+		    });
                 }
                 await _orderApplication.SaveOrderVisit(visitDto, HttpContext.RequestAborted);
                 outDto.CompleteCount += 1;
@@ -2679,7 +2682,7 @@ public class OrderController : BaseController
     /// 查询总数
     /// </summary>
     [HttpGet("count")]
-    public async Task<int> Count([FromQuery] QueryOrderFixedDto dto)
+    public async Task<int> Count([FromQuery] QueryOrderDto dto)
     {
         var query = _orderApplication.QueryOrders(dto);
         return await query.CountAsync(HttpContext.RequestAborted);
@@ -3686,7 +3689,7 @@ public class OrderController : BaseController
     public async Task<PagedDto<OrderDto>> QueryWaited([FromQuery] QueryOrderWaitedDto dto)
     {
         var isHandled = dto.IsHandled.HasValue && dto.IsHandled.Value;
-       
+
         var isAdmin = _orderDomainService.IsCheckAdmin();
 
         var (total, items) = await _orderRepository
@@ -4804,12 +4807,12 @@ public class OrderController : BaseController
             var orderStatus = EOrderStatus.SendBack;
             var orderStartStatus = EOrderStatus.BackToUnAccept;
 
-			if (_appOptions.Value.IsZiGong)
+            if (_appOptions.Value.IsZiGong)
             {
-	            orderStatus = model.SpecialType == ESpecialType.SendBack ? EOrderStatus.SendBack : EOrderStatus.Special;
-	            orderStartStatus = model.SpecialType == ESpecialType.SendBack ? EOrderStatus.BackToUnAccept : EOrderStatus.SpecialToUnAccept;
-			}
-			var Status = model.StepType == EStepType.Start ? orderStartStatus : orderStatus;
+                orderStatus = model.SpecialType == ESpecialType.SendBack ? EOrderStatus.SendBack : EOrderStatus.Special;
+                orderStartStatus = model.SpecialType == ESpecialType.SendBack ? EOrderStatus.BackToUnAccept : EOrderStatus.SpecialToUnAccept;
+            }
+            var Status = model.StepType == EStepType.Start ? orderStartStatus : orderStatus;
             await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { ProcessType = processType, ReTransactNum = reTransactNum, Status = Status }).Where(o => o.Id == order.Id)
                 .ExecuteCommandAsync(HttpContext.RequestAborted);
 

+ 6 - 0
src/Hotline.Application.Tests/Application/OrderApplicationTest.cs

@@ -25,12 +25,18 @@ public class OrderApplicationTest
     [Theory]
     [InlineData(1)]
     [InlineData(2)]
+    [InlineData(3)]
+    [InlineData(4)]
+    [InlineData(5)]
+    [InlineData(6)]
+    [InlineData(7)]
     public async Task VisitPushSMS_Test(int count)
     {
         var orderVisit = await _orderVisitRepository.Queryable()
             .Where(m => m.VisitState == EVisitState.WaitForVisit)
             .OrderByDescending(m => m.CreationTime)
             .FirstAsync();
+        orderVisit.ShouldNotBeNull("缺少 回访单 (order_visit) VisitState = 10 的数据.");
         var dto = new VisitSmsInDto
         {
             Ids = new List<string> { orderVisit.Id }

+ 10 - 4
src/Hotline.Application.Tests/Repository/OrderVisitRepositoryTest.cs

@@ -27,22 +27,28 @@ public class OrderVisitRepositoryTest
     [Theory]
     [InlineData("4", "SMSUnsatisfied", "2" , "不满意")]
     [InlineData("1", "Visited", "5", "非常满意")]
+    [InlineData("非常满意", "Visited", "5", "非常满意")]
+    [InlineData("满意", "Visited", "4", "满意")]
+    [InlineData("一般", "Visited", "4", "满意")]
+    [InlineData("不满意", "SMSUnsatisfied", "2", "不满意")]
+    [InlineData("非常不满意", "SMSUnsatisfied", "2", "不满意")]
     public async Task UpdateSmsReply_Test(string content, string visitState, string orgResuktKey,  string orgResuktValue)
     {
         var visit = await _orderVisitRepository.Queryable()
             .Where(m => m.VisitState == EVisitState.SMSVisiting)
             .OrderByDescending(m => m.CreationTime)
             .FirstAsync();
+        visit.ShouldNotBeNull("缺少测试数据");
 
-        var dto = new PushReceiveMessageDto { ExternalId = visit.Id, IsSmsReply = true, SmsReplyContent = content };
-        var message = new Message();
+        var message = new Message { ExternalId = visit.Id, IsSmsReply = true, SmsReplyContent = content };
+        var dto = new PushReceiveMessageDto();
         await _orderVisitRepository.UpdateSmsReplyAsync(dto, message);
         visit = _orderVisitRepository.Get(visit.Id);
         visit.VisitState.ShouldBe(visitState.ToEnum<EVisitState>());
-        visit.NowEvaluate.Key.ShouldBe(content);
+        visit.NowEvaluate.Key.ShouldBe(orgResuktKey);
         visit.NowEvaluate.Value.ShouldBe(orgResuktValue);
 
-        if (content == "4" || content == "5")
+        if (content == "4" || content == "5" || content == "不满意" || content == "非常不满意")
             visit.VisitType.ShouldBeNull();
 
         await _orderVisitDetailRepository.Queryable()

+ 11 - 5
src/Hotline.Repository.SqlSugar/Orders/OrderVisitRepository.cs

@@ -39,7 +39,7 @@ public class OrderVisitRepository : BaseRepository<OrderVisit>, IOrderVisitRepos
     public async Task UpdateSmsReplyAsync(PushReceiveMessageDto dto, Message data)
     {
         _logger.LogInformation($"UpdateSmsReplyAsync 收到通知: {dto.ToJson()}");
-        if (dto.IsSmsReply == false || dto.SmsReplyContent.IsNullOrEmpty() || dto.ExternalId.IsNullOrEmpty()) return;
+        if (data.IsSmsReply == false || data.SmsReplyContent.IsNullOrEmpty() || data.ExternalId.IsNullOrEmpty()) return;
 
         var orderVisit = await GetAsync(data.ExternalId)
              ?? throw new UserFriendlyException($"回访单不存在, visitId: {data.ExternalId} message: {data.ToJson()}");
@@ -51,14 +51,20 @@ public class OrderVisitRepository : BaseRepository<OrderVisit>, IOrderVisitRepos
         {
             { "1", $"非常满意|{EVisitState.Visited}|{ESeatEvaluate.VerySatisfied}|{EVoiceEvaluate.VerySatisfied}|5" },
             { "2", $"满意|{EVisitState.Visited}|{ESeatEvaluate.Satisfied}|{EVoiceEvaluate.Satisfied}|4"},
-            { "3", $"一般|{EVisitState.Visited}|{ESeatEvaluate.Satisfied}|{EVoiceEvaluate.Normal}|4"},
+            { "3", $"一般|{EVisitState.Visited}|{ESeatEvaluate.Normal}|{EVoiceEvaluate.Normal}|4"},
             { "4", $"不满意|{EVisitState.SMSUnsatisfied}|{ESeatEvaluate.NoSatisfied}|{EVoiceEvaluate.NoSatisfied}|2"},
             { "5", $"非常不满意|{EVisitState.SMSUnsatisfied}|{ESeatEvaluate.NoSatisfied}|{EVoiceEvaluate.VeryNoSatisfied}|2"},
         };
+        var replyTxt = data.SmsReplyContent.Trim();
+        var result = string.Empty;
+        if (dics.TryGetValue(replyTxt, out result) == false)
+        {
+            var m = dics.FirstOrDefault(item => item.Value.StartsWith(replyTxt));
+            replyTxt = m.Key;
+            result = m.Value;
+        }
 
-        var replyTxt = dto.SmsReplyContent.Trim();
-        var result = dics[replyTxt];
-        if (result.IsNullOrEmpty()) throw new UserFriendlyException($"用户回复短信内容异常; reply: {replyTxt}");
+        if (result.IsNullOrEmpty()) throw new UserFriendlyException($"用户回复短信内容异常; reply: {data.SmsReplyContent}");
         var replySplit = result.Split("|");
         if (new string[] { "4", "5" }.Contains(replyTxt))
         {

+ 2 - 1
src/Hotline/Settings/TimeLimitDomain/ExpireTimeLimitBase.cs

@@ -152,7 +152,8 @@ public abstract class ExpireTimeLimitBase
             EFlowDirection.CenterToOrg => GetOrderTimeLimitConfig(order.AcceptTypeCode),
             EFlowDirection.OrgToCenter => GetOrderTimeLimitConfig(),
             EFlowDirection.CenterToCenter => GetOrderTimeLimitConfig(order.AcceptTypeCode),
-            _ => throw new ArgumentOutOfRangeException(nameof(flowDirection), flowDirection, null)
+            EFlowDirection.FiledToOrg => GetOrderTimeLimitConfig(order.AcceptTypeCode),
+			_ => throw new ArgumentOutOfRangeException(nameof(flowDirection), flowDirection, null)
         };
 
         return await CalcEndTime(beginTime, timeConfig, order.AcceptTypeCode);