Bladeren bron

Merge branch 'feature/task_275' into dev

qinchaoyue 3 maanden geleden
bovenliggende
commit
65ca48c4a0

+ 52 - 15
src/Hotline.Application.Tests/Domain/OrderVisitDomainServiceTest.cs

@@ -104,15 +104,16 @@ public class OrderVisitDomainServiceTest : TestBase
     }
 
     [Theory]
-    [InlineData("4", "SMSUnsatisfied", "2", "不满意")]
-    [InlineData("1", "Visited", "5", "非常满意")]
-    [InlineData("非常满意", "Visited", "5", "非常满意")]
-    [InlineData("满意", "Visited", "4", "满意")]
-    [InlineData("一般", "Visited", "4", "满意")]
-    [InlineData("不满意", "SMSUnsatisfied", "2", "不满意")]
-    [InlineData("非常不满意", "SMSUnsatisfied", "2", "不满意")]
-    [InlineData("0", "Visited", "0", "默认满意")]
-    public async Task UpdateSmsReply_Test(string content, string visitState, string orgResuktKey, string orgResuktValue)
+    [InlineData("4", "SMSUnsatisfied", "2", "不满意", "不满意")]
+    [InlineData("1", "Visited", "5", "非常满意", "非常满意")]
+    //[InlineData("非常满意", "Visited", "5", "非常满意")]
+    [InlineData("2", "Visited", "4", "满意", "满意")]
+    [InlineData("3", "Visited", "4", "满意", "满意")]
+    //[InlineData("不满意", "SMSUnsatisfied", "2", "不满意")]
+    [InlineData("5", "SMSUnsatisfied", "2", "不满意", "不满意")]
+    [InlineData("0", "Visited", "0", "默认满意", "超过48小时自动回访")]
+    [InlineData("都没有办理好", "SMSUnsatisfied", "", "", "都没有办理好")]
+    public async Task UpdateSmsReply_Test(string content, string visitState, string orgResuktKey, string orgResuktValue, string visitContent)
     {
         SetZuoXi();
         var order = _orderServiceMock.CreateOrder()
@@ -153,6 +154,7 @@ public class OrderVisitDomainServiceTest : TestBase
             orderEntity.Status.ShouldBe(EOrderStatus.Visited);
         }
 
+        var smsReply = _orderVisitDomainService.GetVisitEvaluateByReplyTxt(content);
         await _orderVisitDetailRepository.Queryable()
             .Where(m => m.VisitId == visit.Id && m.VisitTarget == EVisitTarget.Org)
             .FirstAsync()
@@ -161,17 +163,49 @@ public class OrderVisitDomainServiceTest : TestBase
                 org.OrgProcessingResults.ShouldNotBeNull();
                 org.OrgProcessingResults.Key.ShouldBe(orgResuktKey);
                 org.OrgProcessingResults.Value.ShouldBe(orgResuktValue);
+                org.VisitContent.ShouldBe(visitContent);
 
                 // 验证跟新工单上的字段是否成功
-                orderEntity.OrgProcessingResults.ShouldNotBeNull();
-                orderEntity.OrgProcessingResults.Key.ShouldBe(orgResuktKey);
-                orderEntity.OrgProcessingResults.Value.ShouldBe(orgResuktValue);
+                if (new string[] { "4", "5", "不满意", "非常不满意" }.Contains(content) == false)
+                {
+                    orderEntity.OrgProcessingResults.ShouldNotBeNull();
+                    orderEntity.OrgProcessingResults.Key.ShouldBe(orgResuktKey);
+                    orderEntity.OrgProcessingResults.Value.ShouldBe(orgResuktValue);
+                }
 
                 org.OrgHandledAttitude.ShouldNotBeNull();
                 org.OrgHandledAttitude.Key.ShouldBe(orgResuktKey);
                 org.OrgHandledAttitude.Value.ShouldBe(orgResuktValue);
+                if (smsReply.IsReplyToOrgVisitContent == true)
+                {
+                    org.VisitContent = content;
+                }
                 return Task.CompletedTask;
             });
+        await _orderVisitDetailRepository.Queryable()
+          .Where(m => m.VisitId == visit.Id && m.VisitTarget == EVisitTarget.Seat)
+          .FirstAsync()
+          .Then( seat =>
+          {
+              // 验证跟新工单上的字段是否成功
+              if (new string[] { "4", "5", "不满意", "非常不满意" }.Contains(content) == true)
+              {
+                  seat.SeatEvaluate.ShouldNotBe(ESeatEvaluate.NoSatisfied);
+                  seat.SeatEvaluate.ShouldNotBe(ESeatEvaluate.VeryNoSatisfied);
+                  seat.VoiceEvaluate.ShouldNotBe(EVoiceEvaluate.NoSatisfied);
+                  seat.VoiceEvaluate.ShouldNotBe(EVoiceEvaluate.VeryNoSatisfied);
+              }
+              else 
+              {
+                  if (smsReply.SeatEvaluate != null)
+                    seat.SeatEvaluate.ShouldBe(smsReply.SeatEvaluate);
+                  if (smsReply.VoiceEvaluate != null)
+                      seat.VoiceEvaluate.ShouldBe(smsReply.VoiceEvaluate);
+              }
+
+
+              return Task.CompletedTask;
+          });
     }
 
     [Theory]
@@ -180,7 +214,9 @@ public class OrderVisitDomainServiceTest : TestBase
     [InlineData("3", "一般", "Visited", "Normal", "Normal", "满意|4")]
     [InlineData("4", "不满意", "SMSUnsatisfied", "NoSatisfied", "NoSatisfied", "不满意|2")]
     [InlineData("5", "非常不满意", "SMSUnsatisfied", "NoSatisfied", "VeryNoSatisfied", "不满意|2")]
-    [InlineData("默认满意", "默认满意", "Visited", "DefaultSatisfied", "DefaultSatisfied", "默认满意|0")]
+    [InlineData("默认满意", "超过48小时自动回访", "Visited", "DefaultSatisfied", "DefaultSatisfied", "默认满意|0")]
+    [InlineData("0", "超过48小时自动回访", "Visited", "DefaultSatisfied", "DefaultSatisfied", "默认满意|0")]
+    [InlineData("1非常满意", "非常满意", "Visited", "VerySatisfied", "VerySatisfied", "非常满意|5")]
     public void GetVisitEvaluateByReplyTxt_Test(string replyTxt, string assertReplyTxt, string visitState, string seatEvaluate, string voiceEvaluate, string kv)
     {
         var smsReply = _orderVisitDomainService.GetVisitEvaluateByReplyTxt(replyTxt);
@@ -209,9 +245,10 @@ public class OrderVisitDomainServiceTest : TestBase
         IEnumerable<SettingOrderVisitSmsReplyRule> entities = [
             new () {AppScope = "ZiGong", ReplyRegular = "1", VisitContent = "非常满意", VisitState = EVisitState.Visited, SeatEvaluate = ESeatEvaluate.VerySatisfied,VoiceEvaluate = EVoiceEvaluate.VerySatisfied,OrgProcessingResults=5, OrgHandledAttitude = 5 },
             new () {AppScope = "ZiGong", ReplyRegular = "2", VisitContent = "满意", VisitState = EVisitState.Visited, SeatEvaluate = ESeatEvaluate.Satisfied,VoiceEvaluate = EVoiceEvaluate.Satisfied,OrgProcessingResults=4, OrgHandledAttitude = 4 },
-            new () {AppScope = "ZiGong", ReplyRegular = "3", VisitContent = "一般", VisitState = EVisitState.Visited, SeatEvaluate = ESeatEvaluate.Normal,VoiceEvaluate = EVoiceEvaluate.Normal,OrgProcessingResults=3, OrgHandledAttitude = 3 },
+            new () {AppScope = "ZiGong", ReplyRegular = "3", VisitContent = "一般", VisitState = EVisitState.Visited, SeatEvaluate = ESeatEvaluate.Normal,VoiceEvaluate = EVoiceEvaluate.Normal,OrgProcessingResults= 4, OrgHandledAttitude = 4 },
             new () {AppScope = "ZiGong", ReplyRegular = "4", VisitContent = "不满意", VisitState = EVisitState.SMSUnsatisfied, SeatEvaluate = ESeatEvaluate.NoSatisfied,VoiceEvaluate = EVoiceEvaluate.NoSatisfied,OrgProcessingResults=2, OrgHandledAttitude = 2 },
-            new () {AppScope = "ZiGong", ReplyRegular = "5", VisitContent = "非常不满意", VisitState = EVisitState.SMSUnsatisfied, SeatEvaluate = ESeatEvaluate.NoSatisfied,VoiceEvaluate = EVoiceEvaluate.VeryNoSatisfied,OrgProcessingResults=2, OrgHandledAttitude = 2 }
+            new () {AppScope = "ZiGong", ReplyRegular = "5", VisitContent = "非常不满意", VisitState = EVisitState.SMSUnsatisfied, SeatEvaluate = ESeatEvaluate.NoSatisfied,VoiceEvaluate = EVoiceEvaluate.VeryNoSatisfied,OrgProcessingResults=2, OrgHandledAttitude = 2 },
+            new () {AppScope = "ZiGong", ReplyRegular = "默认满意", VisitContent = "超过48小时自动回访", VisitState = EVisitState.Visited, SeatEvaluate = ESeatEvaluate.DefaultSatisfied,VoiceEvaluate = EVoiceEvaluate.DefaultSatisfied,OrgProcessingResults=0, OrgHandledAttitude = 0 }
             ];
 
         foreach (var item in entities)

+ 4 - 0
src/Hotline.Application/Mappers/MapperConfigs.cs

@@ -42,6 +42,10 @@ namespace Hotline.Application.Mappers
                 .Map(s => s.Key, d => d.DicDataValue)
                 .Map(s => s.Value, d => d.DicDataName);
 
+            config.ForType<SystemDicDataOutDto, Kv>()
+                .Map(s => s.Key, d => d.DicDataValue)
+                .Map(s => s.Value, d => d.DicDataName);
+
             config.ForType<Message, ReceiveMessageNotify>()
                 .Map(m => m.NotifyDto, d => d);
 

+ 0 - 20
src/Hotline/Orders/OrderVisitDetail.cs

@@ -99,26 +99,6 @@ namespace Hotline.Orders
         /// </summary>
         public EVisitTarget VisitTarget { get; set; }
 
-        /// <summary>
-        /// 短信回访回填
-        /// </summary>
-        /// <param name="visitSatisfactionKv"></param>
-        public void ReplyBackfill(Kv visitSatisfactionKv)
-        {
-            this.OrgProcessingResults = visitSatisfactionKv;
-            this.VisitContent = visitSatisfactionKv.Value;
-        }
-
-        /// <summary>
-        /// 短信回访回填
-        /// </summary>
-        /// <param name="visitSatisfactionKv"></param>
-        public void ReplyBackfill(ESeatEvaluate seatEvaluate)
-        {
-            this.SeatEvaluate ??= seatEvaluate;
-            VisitContent = seatEvaluate.GetDescription();
-        }
-
 		/// <summary>
 		/// 截至甄别时间
 		/// </summary>

+ 19 - 15
src/Hotline/Orders/OrderVisitDomainService.cs

@@ -76,17 +76,9 @@ public class OrderVisitDomainService : IOrderVisitDomainService, IScopeDependenc
     {
         var replyToEnumMap = _settingOrderVisitSmsReplyRuleRepository.GetByAppScope(_appOptions.Value.AppScope);
         if (replyToEnumMap.IsNullOrEmpty()) throw new UserFriendlyException("系统未配置短信回访规则");
-
         replyTxt = replyTxt.Trim();
-        foreach (var smsRule in replyToEnumMap)
-        {
-            var success = new Regex(smsRule.ReplyRegular).IsMatch(replyTxt);
-            if (success)
-            {
-                return smsRule;
-            }
-        }
-        throw new UserFriendlyException($"用户回复内容异常; replyTxt: {replyTxt}");
+        return replyToEnumMap.FirstOrDefault(m => new Regex(m.ReplyRegular).IsMatch(replyTxt)) 
+            ?? throw new UserFriendlyException($"用户回复内容异常; replyTxt: {replyTxt}");
     }
 
     /// <summary>
@@ -150,9 +142,18 @@ public class OrderVisitDomainService : IOrderVisitDomainService, IScopeDependenc
             .ToListAsync();
         foreach (var item in detailOrg)
         {
-            item.ReplyBackfill(visitSatisfactionKv);
-            if (_appOptions.Value.IsZiGong)
-                item.OrgHandledAttitude = visitSatisfactionKv;
+            if (smsReplyRule.OrgProcessingResults != null)
+            {
+                var processingResults = smsReplyRule.GetOrgProcessingResults(_systemDicDataCacheManager.VisitSatisfaction);
+                item.OrgProcessingResults = processingResults;
+                item.VisitContent = processingResults?.Value;
+            }
+            if (smsReplyRule.VisitContent != null)
+                item.VisitContent = smsReplyRule.VisitContent;
+            if (smsReplyRule.OrgHandledAttitude != null)
+                item.OrgHandledAttitude = smsReplyRule.GetOrgHandledAttitude(_systemDicDataCacheManager.VisitSatisfaction);
+            if (smsReplyRule.IsReplyToOrgVisitContent != null && smsReplyRule.IsReplyToOrgVisitContent == true)
+                item.VisitContent = replyTxt;
         }
         await _orderVisitDetailRepository.UpdateRangeAsync(detailOrg);
 
@@ -161,9 +162,12 @@ public class OrderVisitDomainService : IOrderVisitDomainService, IScopeDependenc
             .FirstAsync()
             .Then(async detailSeat =>
             {
-                if (smsReplyRule.SeatEvaluate != null)
+                if (smsReplyRule.SeatEvaluate != null || smsReplyRule.VoiceEvaluate != null)
                 {
-                    detailSeat.ReplyBackfill(smsReplyRule.SeatEvaluate.Value);
+                    if (smsReplyRule.SeatEvaluate != null)
+                        detailSeat.SeatEvaluate ??= smsReplyRule.SeatEvaluate;
+                    if (smsReplyRule.VoiceEvaluate != null)
+                        detailSeat.VoiceEvaluate ??= smsReplyRule.VoiceEvaluate;
                     await _orderVisitDetailRepository.UpdateAsync(detailSeat);
                 }
             });

+ 7 - 1
src/Hotline/Settings/SettingOrderVisitSmsReplyRule.cs

@@ -74,6 +74,12 @@ public class SettingOrderVisitSmsReplyRule : FullStateEntity
     [SugarColumn(ColumnDescription = "回访内容(不需要更新就填NULL)")]
     public string? VisitContent { get; set; }
 
+    /// <summary>
+    /// 是否回填用户短信内容到部门回访内容
+    /// </summary>
+    [SugarColumn(ColumnDescription = "是否回填用户短信内容到部门回访内容")]
+    public bool? IsReplyToOrgVisitContent { get; set; }
+
     public Kv? GetOrgHandledAttitude(IReadOnlyCollection<SystemDicDataOutDto> visitSatisfaction)
     {
         if (this.OrgHandledAttitude == null) return null;
@@ -83,6 +89,6 @@ public class SettingOrderVisitSmsReplyRule : FullStateEntity
     public Kv? GetOrgProcessingResults(IReadOnlyCollection<SystemDicDataOutDto> visitSatisfaction)
     {
         if (OrgProcessingResults == null) return null;
-        return visitSatisfaction.First(m => m.DicDataValue == OrgHandledAttitude.ToString()).Adapt<Kv>();
+        return visitSatisfaction.First(m => m.DicDataValue == OrgProcessingResults.ToString()).Adapt<Kv>();
     }
 }