Ver código fonte

修复短信回访问题

qinchaoyue 3 meses atrás
pai
commit
151443c92e

+ 80 - 58
src/Hotline.Application.Tests/Domain/OrderVisitDomainServiceTest.cs

@@ -1,6 +1,7 @@
 using Hotline.Api.Controllers;
 using Hotline.Application.Tests.Mock;
 using Hotline.Caching.Interfaces;
+using Hotline.Configurations;
 using Hotline.EventBus;
 using Hotline.Identity.Accounts;
 using Hotline.Identity.Roles;
@@ -18,6 +19,7 @@ using Hotline.Users;
 using Mapster;
 using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
 using Shouldly;
 using XF.Domain.Repository;
 
@@ -32,8 +34,9 @@ public class OrderVisitDomainServiceTest : TestBase
     private readonly OrderServiceMock _orderServiceMock;
     private readonly ISettingOrderVisitSmsReplyRuleRepository _settingOrderVisitSmsReplyRuleRepository;
     private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
+    private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
-    public OrderVisitDomainServiceTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, IOrderVisitDomainService orderVisitDomainService, IOrderVisitRepository orderVisitRepository, IRepository<OrderVisitDetail> orderVisitDetailRepository, Publisher publisher, IOrderRepository orderRepository, OrderServiceMock orderServiceMock, IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdService, IThirdAccountRepository thirdAccount, ISettingOrderVisitSmsReplyRuleRepository settingOrderVisitSmsReplyRuleRepository, ISystemDicDataCacheManager systemDicDataCacheManager) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdService, thirdAccount)
+    public OrderVisitDomainServiceTest(IAccountRepository accountRepository, IRepository<Role> roleRepository, UserController userController, IServiceScopeFactory scopeFactory, IRepository<User> userRepository, IOrderVisitDomainService orderVisitDomainService, IOrderVisitRepository orderVisitRepository, IRepository<OrderVisitDetail> orderVisitDetailRepository, Publisher publisher, IOrderRepository orderRepository, OrderServiceMock orderServiceMock, IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdService, IThirdAccountRepository thirdAccount, ISettingOrderVisitSmsReplyRuleRepository settingOrderVisitSmsReplyRuleRepository, ISystemDicDataCacheManager systemDicDataCacheManager, IOptionsSnapshot<AppConfiguration> appOptions) : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdService, thirdAccount)
     {
         _orderVisitDomainService = orderVisitDomainService;
         _orderVisitRepository = orderVisitRepository;
@@ -43,6 +46,7 @@ public class OrderVisitDomainServiceTest : TestBase
         _orderServiceMock = orderServiceMock;
         _settingOrderVisitSmsReplyRuleRepository = settingOrderVisitSmsReplyRuleRepository;
         _systemDicDataCacheManager = systemDicDataCacheManager;
+        _appOptions = appOptions;
     }
 
 
@@ -104,17 +108,22 @@ public class OrderVisitDomainServiceTest : TestBase
     }
 
     [Theory]
-    [InlineData("4", "SMSUnsatisfied", "2", "不满意", "不满意")]
+    [InlineData("4", "SMSUnsatisfied", "2", "不满意", "不满意", "Published")]
     [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)
+    [InlineData("5", "SMSUnsatisfied", "2", "不满意", "不满意", "Published")]
+    [InlineData("默认满意", "Visited", "0", "默认满意", "超过48小时自动回访")]
+    [InlineData("都没有办理好", "SMSUnsatisfied", "", "", "都没有办理好", "Published", "YiBin")]
+    [InlineData("1", "Visited", "4", "满意", "满意", "Visited", "YiBin")]
+    [InlineData("2", "SMSUnsatisfied", "2", "不满意", "不满意", "Published", "YiBin")]
+    public async Task UpdateSmsReply_Test(string content, string visitState, string orgResuktKey, string orgResuktValue, string visitContent, string visited = "Visited", string appScope = "ZiGong")
     {
+        if (appScope != "ZiGong")
+            ChangeAppScopeYiBin();
+        else
+            ChangeAppScopeZiGong();
+        var appScopeFile = _appOptions.Value.AppScope;
         SetZuoXi();
         var order = _orderServiceMock.CreateOrder()
             .办理到一级部门()
@@ -139,19 +148,18 @@ public class OrderVisitDomainServiceTest : TestBase
         await _orderVisitDomainService.UpdateSmsReplyAsync(message);
         visit = _orderVisitRepository.Get(visit.Id);
         visit.VisitState.ShouldBe(visitState.ToEnum<EVisitState>());
-        visit.NowEvaluate.ShouldNotBeNull();
-        visit.NowEvaluate.Key.ShouldBe(orgResuktKey);
-        visit.NowEvaluate.Value.ShouldBe(orgResuktValue);
+        if (orgResuktKey.NotNullOrEmpty())
+        {
+            visit.NowEvaluate.ShouldNotBeNull();
+            visit.NowEvaluate.Key.ShouldBe(orgResuktKey);
+            visit.NowEvaluate.Value.ShouldBe(orgResuktValue);
+        }
         var orderEntity = await _orderRepository.GetAsync(order.Id);
         orderEntity.ShouldNotBeNull();
-        if (content == "4" || content == "5" || content == "不满意" || content == "非常不满意")
+        orderEntity.Status.ShouldBe(visited.ToEnum<EOrderStatus>());
+        if (content == "4" || content == "5" || content == "不满意" || content == "非常不满意" || content == "都没有办理好")
         {
             visit.VisitType.ShouldBeNull();
-            orderEntity.Status.ShouldNotBe(EOrderStatus.Visited);
-        }
-        else
-        {
-            orderEntity.Status.ShouldBe(EOrderStatus.Visited);
         }
 
         var smsReply = _orderVisitDomainService.GetVisitEvaluateByReplyTxt(content);
@@ -160,50 +168,62 @@ public class OrderVisitDomainServiceTest : TestBase
             .FirstAsync()
             .Then(org =>
             {
-                org.OrgProcessingResults.ShouldNotBeNull();
-                org.OrgProcessingResults.Key.ShouldBe(orgResuktKey);
-                org.OrgProcessingResults.Value.ShouldBe(orgResuktValue);
-                org.VisitContent.ShouldBe(visitContent);
-
-                // 验证跟新工单上的字段是否成功
-                if (new string[] { "4", "5", "不满意", "非常不满意" }.Contains(content) == false)
+                if (content != "都没有办理好")
                 {
-                    orderEntity.OrgProcessingResults.ShouldNotBeNull();
-                    orderEntity.OrgProcessingResults.Key.ShouldBe(orgResuktKey);
-                    orderEntity.OrgProcessingResults.Value.ShouldBe(orgResuktValue);
-                }
+                    org.OrgProcessingResults.ShouldNotBeNull();
+                    org.OrgProcessingResults.Key.ShouldBe(orgResuktKey);
+                    org.OrgProcessingResults.Value.ShouldBe(orgResuktValue);
+                    org.VisitContent.ShouldBe(visitContent);
 
-                org.OrgHandledAttitude.ShouldNotBeNull();
-                org.OrgHandledAttitude.Key.ShouldBe(orgResuktKey);
-                org.OrgHandledAttitude.Value.ShouldBe(orgResuktValue);
-                if (smsReply.IsReplyToOrgVisitContent == true)
-                {
-                    org.VisitContent = content;
+                    // 验证跟新工单上的字段是否成功
+                    if (new string[] { "4", "5", "不满意", "非常不满意"}.Contains(content) == false)
+                    {
+                        if (appScope != "YiBin" && content != "2")
+                        {
+                            orderEntity.OrgProcessingResults.ShouldNotBeNull();
+                            orderEntity.OrgProcessingResults.Key.ShouldBe(orgResuktKey);
+                            orderEntity.OrgProcessingResults.Value.ShouldBe(orgResuktValue);
+                        }
+                    }
+
+                    if (appScope != "YiBin")
+                    {
+                        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 =>
+          .Then(seat =>
           {
-              // 验证跟新工单上的字段是否成功
-              if (new string[] { "4", "5", "不满意", "非常不满意" }.Contains(content) == true)
+              if (content != "都没有办理好")
               {
-                  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);
-              }
 
+                  // 验证跟新工单上的字段是否成功
+                  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;
           });
     }
@@ -249,15 +269,17 @@ public class OrderVisitDomainServiceTest : TestBase
     public async Task Init_SettingOrderVisitSmsReplyRule_Data()
     {
         IEnumerable<SettingOrderVisitSmsReplyRule> entities = [
-            new () {Name = "非常满意的规则", AppScope = "ZiGong", ReplyRegular = "1", VisitContent = "非常满意", VisitState = EVisitState.Visited, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults=5, OrgHandledAttitude = 5, VisitType = EVisitType.SmsVisit},
-            new () {Name = "满意的规则", AppScope = "ZiGong", ReplyRegular = "2", VisitContent = "满意", VisitState = EVisitState.Visited, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults=4, OrgHandledAttitude = 4 , VisitType = EVisitType.SmsVisit},
-            new () {Name = "一般的规则", AppScope = "ZiGong", ReplyRegular = "3", VisitContent = "一般", VisitState = EVisitState.Visited, SeatEvaluate = null, VoiceEvaluate = null,OrgProcessingResults= 4, OrgHandledAttitude = 4 , VisitType = EVisitType.SmsVisit},
-            new () {Name = "不满意的规则", AppScope = "ZiGong", ReplyRegular = "4", VisitContent = "不满意", VisitState = EVisitState.SMSUnsatisfied, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults=2, OrgHandledAttitude = 2 , VisitType = null},
-            new () {Name = "非常不满意的规则", AppScope = "ZiGong", ReplyRegular = "5", VisitContent = "非常不满意", VisitState = EVisitState.SMSUnsatisfied, SeatEvaluate = null, VoiceEvaluate = null,OrgProcessingResults=2, OrgHandledAttitude = 2, VisitType = null},
-            new () {Name = "默认满意的规则", AppScope = "ZiGong", ReplyRegular = "0", VisitContent = "超过48小时自动回访", VisitState = EVisitState.Visited, SeatEvaluate = null, VoiceEvaluate = null,OrgProcessingResults=0, OrgHandledAttitude = 0, VisitType = EVisitType.SmsVisit},
-            new () {Name = "对部门处理结果满意", AppScope = "YiBin", ReplyRegular = "1", VisitContent = "满意", VisitState = EVisitState.Visited, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults = 4 , OrgHandledAttitude = null, VisitType = EVisitType.SmsVisit},
-            new () {Name = "默认满意的规则", AppScope = "YiBin", ReplyRegular = "0", VisitContent = "超过48小时自动回访", VisitState = EVisitState.Visited, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults=0, OrgHandledAttitude = 0 , VisitType = EVisitType.SmsVisit},
-            new () {Name = "对部门处理结果不满意的规则", AppScope = "YiBin", ReplyRegular = "2", VisitContent = "不满意", VisitState = EVisitState.Visited, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults=0, OrgHandledAttitude = 0 , VisitType = null},
+            new () {Name = "非常满意的规则", AppScope = "ZiGong", ReplyRegular = "1", VisitContent = "非常满意", VisitState = EVisitState.Visited, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults=5, OrgHandledAttitude = 5, VisitType = EVisitType.SmsVisit, SortOrder = 1},
+            new () {Name = "满意的规则", AppScope = "ZiGong", ReplyRegular = "2", VisitContent = "满意", VisitState = EVisitState.Visited, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults=4, OrgHandledAttitude = 4 , VisitType = EVisitType.SmsVisit, SortOrder = 2},
+            new () {Name = "一般的规则", AppScope = "ZiGong", ReplyRegular = "3", VisitContent = "一般", VisitState = EVisitState.Visited, SeatEvaluate = null, VoiceEvaluate = null,OrgProcessingResults= 4, OrgHandledAttitude = 4 , VisitType = EVisitType.SmsVisit, SortOrder = 3},
+            new () {Name = "不满意的规则", AppScope = "ZiGong", ReplyRegular = "4", VisitContent = "不满意", VisitState = EVisitState.SMSUnsatisfied, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults=2, OrgHandledAttitude = 2 , VisitType = null, SortOrder = 4},
+            new () {Name = "非常不满意的规则", AppScope = "ZiGong", ReplyRegular = "5", VisitContent = "不满意", VisitState = EVisitState.SMSUnsatisfied, SeatEvaluate = null, VoiceEvaluate = null,OrgProcessingResults=2, OrgHandledAttitude = 2, VisitType = null, SortOrder = 5},
+            new () {Name = "默认满意的规则", AppScope = "ZiGong", ReplyRegular = "默认满意", VisitContent = "超过48小时自动回访", VisitState = EVisitState.Visited, SeatEvaluate = null, VoiceEvaluate = null,OrgProcessingResults=0, OrgHandledAttitude = 0, VisitType = EVisitType.SmsVisit, SortOrder = 0},
+            new () {Name = "用户回答非1,2,3,4,5的匹配规则", AppScope = "ZiGong", ReplyRegular = "^(?!.*[12345]).*$", VisitContent = "默认满意", VisitState = EVisitState.Visited, SeatEvaluate = null, VoiceEvaluate = null,OrgProcessingResults=0, OrgHandledAttitude = 0, VisitType = EVisitType.SmsVisit, SortOrder = 6},
+            new () {Name = "对部门处理结果满意", AppScope = "YiBin", ReplyRegular = "1", VisitContent = "满意", VisitState = EVisitState.Visited, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults = 4 , OrgHandledAttitude = null, VisitType = EVisitType.SmsVisit, SortOrder = 1},
+            new () {Name = "默认满意的规则", AppScope = "YiBin", ReplyRegular = "默认满意", VisitContent = "超过48小时自动回访", VisitState = EVisitState.Visited, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults=0, OrgHandledAttitude = 0 , VisitType = EVisitType.SmsVisit, SortOrder = 0},
+            new () {Name = "对部门处理结果不满意的规则", AppScope = "YiBin", ReplyRegular = "2", VisitContent = "不满意", VisitState = EVisitState.SMSUnsatisfied, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults=2, OrgHandledAttitude = null , VisitType = null, SortOrder = 2},
+            new () {Name = "用户回复的非1和2的规则", AppScope = "YiBin", ReplyRegular = "^(?!.*[12]).*$", VisitContent = "不满意", VisitState = EVisitState.SMSUnsatisfied, SeatEvaluate = null,VoiceEvaluate = null,OrgProcessingResults= null, OrgHandledAttitude = null , VisitType = null, SortOrder = 3, IsReplyToOrgVisitContent = true},
             ];
 
         foreach (var item in entities)

+ 1 - 1
src/Hotline.Application.Tests/Hotline.Application.Tests.csproj

@@ -15,7 +15,7 @@
 
   <ItemGroup>
     <Content Include="appsettings.Development.json">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
       <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
       <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
     </Content>

+ 41 - 0
src/Hotline.Application.Tests/Mock/OptionsSnapshotMock.cs

@@ -0,0 +1,41 @@
+using Hotline.Configurations;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Options;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Claims;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Authentications;
+using static Hotline.AppDefaults;
+
+namespace Hotline.Application.Tests.Mock;
+public class OptionsSnapshotMock : IOptionsSnapshot<AppConfiguration>
+{
+    private readonly IHttpContextAccessor _contextAccessor;
+    private readonly IConfiguration _configuration;
+
+    public OptionsSnapshotMock(IHttpContextAccessor contextAccessor, IConfiguration configuration)
+    {
+        _contextAccessor = contextAccessor;
+        _configuration = configuration;
+    }
+
+    public AppConfiguration Value
+    {
+        get
+        {
+            var appConfiguration = _configuration.GetRequiredSection(nameof(AppConfiguration)).Get<AppConfiguration>();
+            if (_contextAccessor != null && _contextAccessor.HttpContext != null)
+                appConfiguration.AppScope = _contextAccessor.HttpContext.User.FindFirstValue("AppScope");
+            return appConfiguration;
+        }
+    }
+
+    public AppConfiguration Get(string? name)
+    {
+        throw new NotImplementedException();
+    }
+}

+ 3 - 1
src/Hotline.Application.Tests/Startup.cs

@@ -67,6 +67,7 @@ using Hotline.Application.Tests.Mock.Interfaces;
 using Hotline.Orders.DatabaseEventHandler;
 using Hotline.Orders;
 using XF.Domain.Repository.Events;
+using Microsoft.Extensions.Options;
 
 namespace Hotline.Application.Tests;
 public class Startup
@@ -85,7 +86,7 @@ public class Startup
             .UseTestServerAndAddDefaultHttpClient()
             .ConfigureAppConfiguration((hostingContext, config) =>
             {
-                config.AddJsonFile(JsonFile);
+                config.AddJsonFile(JsonFile, optional: true, reloadOnChange: true);
             })
             .UseStartup<AspNetCoreStartup>());
     }
@@ -113,6 +114,7 @@ public class Startup
             services.Configure<AppConfiguration>(d => appConfigurationSection.Bind(d));
             services.Configure<IdentityConfiguration>(d => configuration.GetSection(nameof(IdentityConfiguration)).Bind(d));
             services.Configure<CityBaseConfiguration>(d => configuration.GetSection(nameof(CityBaseConfiguration)).Bind(d));
+            services.AddScoped<IOptionsSnapshot<AppConfiguration>, OptionsSnapshotMock>();
 
             services.RegisterMapper();
             //services.AddControllers()

+ 51 - 6
src/Hotline.Application.Tests/TestBase.cs

@@ -1,18 +1,25 @@
-using AutoFixture;
+using Amazon.Auth.AccessControlPolicy;
+using AutoFixture;
+using DocumentFormat.OpenXml.Spreadsheet;
 using Hotline.Api.Controllers;
 using Hotline.Application.Tests.Infrastructure;
+using Hotline.Configurations;
 using Hotline.Identity.Accounts;
 using Hotline.Identity.Roles;
 using Hotline.Settings;
 using Hotline.Share.Dtos.Users;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.User;
+using Hotline.Snapshot;
 using Hotline.Snapshot.Interfaces;
 using Hotline.Users;
 using IdentityModel;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using Newtonsoft.Json;
 using System.Security.Claims;
 using XF.Domain.Authentications;
 using XF.Domain.Repository;
@@ -55,6 +62,40 @@ public class TestBase
 
     }
 
+    public void ChangeAppScopeYiBin()
+    {
+        ChangeAppScope("YiBin");
+    }
+
+    public void ChangeAppScope(string appScope)
+    {
+        var changeDto = _httpContextAccessor.HttpContext.User;
+        List<Claim> userClaims = [
+            new(JwtClaimTypes.Subject, changeDto.FindFirstValue(JwtClaimTypes.Subject)),
+            new(JwtClaimTypes.PhoneNumber, changeDto.FindFirstValue(JwtClaimTypes.PhoneNumber)),
+            new(ClaimTypes.NameIdentifier, changeDto.FindFirstValue(ClaimTypes.NameIdentifier)),
+            new(AppClaimTypes.UserDisplayName, changeDto.FindFirstValue(AppClaimTypes.UserDisplayName)),
+            new(AppClaimTypes.DepartmentId, changeDto.FindFirstValue(AppClaimTypes.DepartmentId)),
+            new(AppClaimTypes.DepartmentIsCenter, changeDto.FindFirstValue(AppClaimTypes.DepartmentIsCenter)),
+            new(AppClaimTypes.DepartmentName, changeDto.FindFirstValue(AppClaimTypes.DepartmentName)),
+            new(AppClaimTypes.DepartmentAreaCode, changeDto.FindFirstValue(AppClaimTypes.DepartmentAreaCode)),
+            new(AppClaimTypes.DepartmentAreaName, changeDto.FindFirstValue(AppClaimTypes.DepartmentAreaName)),
+            new(AppClaimTypes.DepartmentLevel, changeDto.FindFirstValue(AppClaimTypes.DepartmentLevel)),
+            new(AppClaimTypes.AreaId, changeDto.FindFirstValue(AppClaimTypes.AreaId)),
+            new(AppClaimTypes.OpenId, changeDto.FindFirstValue(AppClaimTypes.OpenId)),
+            new("AppScope", appScope)
+        ];
+        ClaimsIdentity identity = new ClaimsIdentity(userClaims);
+        var principal = new ClaimsPrincipal(identity);
+        _httpContextAccessor.HttpContext.User = principal;
+    }
+
+    public void ChangeAppScopeZiGong()
+    {
+        ChangeAppScope("ZiGong");
+    }
+
+
     public void SetPaiDanYuan()
     {
         SetOperator("派单员", "市民热线服务中心", "单元测试派单员", "001", "13408389849", EUserType.Normal, TestSettingConstants.PaiDanYuanAccountName);
@@ -125,6 +166,14 @@ public class TestBase
         var third = _thirdIdentiyService.GetTokenAsync(new Share.Dtos.Snapshot.ThirdTokenDto()).GetAwaiter().GetResult();
         var thirdAccount = _thirdAccountRepository.Get(d => d.OpenId == third.OpenId);
 
+        var appScope = "ZiGong";
+        if (_httpContextAccessor != null && _httpContextAccessor.HttpContext != null)
+        {
+            var m = _httpContextAccessor.HttpContext.User.FindFirstValue("AppScope");
+            if (m != null)
+                appScope = m;
+        }
+
         List<Claim> userClaims = [
             new(JwtClaimTypes.Subject, account.Id ?? thirdAccount.Id),
             new(JwtClaimTypes.PhoneNumber, account.PhoneNo ?? thirdAccount.PhoneNumber),
@@ -138,14 +187,10 @@ public class TestBase
             new(AppClaimTypes.DepartmentLevel, user.Organization?.Level.ToString() ?? string.Empty),
             new(AppClaimTypes.AreaId, user.OrgId?.GetHigherOrgId() ?? string.Empty),
             new(AppClaimTypes.OpenId, thirdAccount?.OpenId ?? string.Empty),
+            new("AppScope", appScope)
         ];
         ClaimsIdentity identity = new ClaimsIdentity(userClaims);
         var principal = new ClaimsPrincipal(identity);
         _httpContextAccessor.HttpContext.User = principal;
-
-        //TestSessionConstants.UserId = account.Id;
-        //TestSessionConstants.Roles = account.Roles.Select(m => m.Id).ToArray();
-        //TestSessionConstants.UserName = account.UserName;
-        //TestSessionConstants.OrgId = user.OrgId;
     }
 }

+ 1 - 1
src/Hotline.Repository.SqlSugar/System/SettingOrderVisitSmsReplyRuleRepository.cs

@@ -17,6 +17,6 @@ public class SettingOrderVisitSmsReplyRuleRepository : BaseRepository<SettingOrd
 
     public List<SettingOrderVisitSmsReplyRule> GetByAppScope(string appscope)
     {
-        return Queryable().Where(x => x.AppScope == appscope).ToList();
+        return Queryable().Where(x => x.AppScope == appscope).OrderBy(x => x.SortOrder).ToList();
     }
 }

+ 1 - 2
src/Hotline/Orders/OrderVisitDomainService.cs

@@ -96,7 +96,7 @@ public class OrderVisitDomainService : IOrderVisitDomainService, IScopeDependenc
             .Then(async orderVisit =>
             {
                 // 默认满意
-                await UpdateSmsReplyAsync(orderVisit, "0");
+                await UpdateSmsReplyAsync(orderVisit, "默认满意");
             });
     }
 
@@ -200,6 +200,5 @@ public class OrderVisitDomainService : IOrderVisitDomainService, IScopeDependenc
                 }, cancellationToken: CancellationToken.None);
 
         }
-
     }
 }

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

@@ -86,6 +86,13 @@ public class SettingOrderVisitSmsReplyRule : FullStateEntity
     [SugarColumn(ColumnDescription = "是否回填用户短信内容到部门回访内容")]
     public bool? IsReplyToOrgVisitContent { get; set; }
 
+    /// <summary>
+    /// 匹配的顺序,从小到大
+    /// </summary>
+
+    [SugarColumn(ColumnDescription = "匹配的顺序,从小到大")]
+    public int SortOrder { get; set; }
+
     public Kv? GetOrgHandledAttitude(IReadOnlyCollection<SystemDicDataOutDto> visitSatisfaction)
     {
         if (this.OrgHandledAttitude == null) return null;