123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- using Hotline.Api.Controllers;
- using Hotline.Application.Tests.Mock;
- using Hotline.Caching.Interfaces;
- using Hotline.EventBus;
- using Hotline.Identity.Accounts;
- using Hotline.Identity.Roles;
- using Hotline.Orders;
- using Hotline.Push.FWMessage;
- using Hotline.Push.Notifies;
- using Hotline.Settings;
- using Hotline.Share.Dtos;
- using Hotline.Share.Dtos.Push;
- using Hotline.Share.Enums.Order;
- using Hotline.Share.Enums.Push;
- using Hotline.Share.Tools;
- using Hotline.Snapshot.Interfaces;
- using Hotline.Users;
- using Mapster;
- using Microsoft.AspNetCore.Http;
- using Microsoft.Extensions.DependencyInjection;
- using Shouldly;
- using XF.Domain.Repository;
- namespace Hotline.Application.Tests.Domain;
- public class OrderVisitDomainServiceTest : TestBase
- {
- private readonly IOrderVisitDomainService _orderVisitDomainService;
- private readonly IOrderVisitRepository _orderVisitRepository;
- private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
- private readonly Publisher _publisher;
- private readonly IOrderRepository _orderRepository;
- private readonly OrderServiceMock _orderServiceMock;
- private readonly ISettingOrderVisitSmsReplyRuleRepository _settingOrderVisitSmsReplyRuleRepository;
- private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
- 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)
- {
- _orderVisitDomainService = orderVisitDomainService;
- _orderVisitRepository = orderVisitRepository;
- _orderVisitDetailRepository = orderVisitDetailRepository;
- _publisher = publisher;
- _orderRepository = orderRepository;
- _orderServiceMock = orderServiceMock;
- _settingOrderVisitSmsReplyRuleRepository = settingOrderVisitSmsReplyRuleRepository;
- _systemDicDataCacheManager = systemDicDataCacheManager;
- }
- //[Fact]
- public async Task UpdateSmsReplyDefault_Test()
- {
- var visit = await _orderVisitRepository
- .Queryable()
- .Where(m => m.VisitState == EVisitState.SMSVisiting)
- .OrderByDescending(m => m.CreationTime)
- .FirstAsync();
- visit.ShouldNotBeNull("缺少测试数据");
- var msg = new MessageDto()
- {
- ExternalId = visit.Id,
- };
- await _orderVisitDomainService.UpdateSmsReplyDefaultAsync(msg);
- var replyTxt = "默认满意";
- var smsReply = _orderVisitDomainService.GetVisitEvaluateByReplyTxt("默认满意");
- var kv = smsReply.GetOrgProcessingResults(_systemDicDataCacheManager.VisitSatisfaction);
- var order = await _orderRepository.Queryable()
- .Includes(m => m.OrderVisits)
- .Where(m => m.OrderVisits.Any(o => o.Id == visit.Id))
- .FirstAsync();
- order.Status.ShouldBe(EOrderStatus.Visited);
- var visitDetail = await _orderVisitDetailRepository.Queryable()
- .Where(m => m.VisitId == visit.Id)
- .ToListAsync();
- foreach (var detail in visitDetail)
- {
- if (detail.VisitTarget == EVisitTarget.Seat)
- {
- var seatEvaluate = smsReply.SeatEvaluate;
- var voiceEvaluate = smsReply.VoiceEvaluate;
- detail.SeatEvaluate.ShouldBe(seatEvaluate);
- detail.VoiceEvaluate.ShouldBe(voiceEvaluate);
- }
- if (detail.VisitTarget == EVisitTarget.Org)
- {
- detail.OrgProcessingResults.Key.ShouldBe(kv.Key);
- detail.OrgProcessingResults.Value.ShouldBe(kv.Value);
- detail.OrgHandledAttitude.Key.ShouldBe(kv.Key);
- detail.OrgHandledAttitude.Value.ShouldBe(kv.Value);
- }
- }
- }
- //[Fact]
- public async Task OnSmsUpdate_Test()
- {
- var data = new Message() { IsSmsReply = true, SmsReplyContent = "1", PushBusiness = EPushBusiness.VisitSms };
- await _publisher.PublishAsync(data.Adapt<ReceiveMessageNotify>(), PublishStrategy.ParallelNoWait, new CancellationToken());
- }
- [Theory]
- [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()
- .办理到一级部门()
- .办理到二级部门(Set一级部门)
- .办理一级部门汇总(Set二级部门)
- .办理到归档(Set一级部门)
- .发布工单(SetZuoXi)
- .发送回访短信(SetZuoXi)
- .GetCreateResult();
- order.Id.ShouldNotBeNull();
- var visit = await _orderVisitRepository.Queryable()
- .Includes(m => m.Order)
- .Where(m => m.VisitState == EVisitState.SMSVisiting)
- .OrderByDescending(m => m.CreationTime)
- .FirstAsync();
- if (visit == null) return;
- visit.ShouldNotBeNull("缺少测试数据");
- var message = new MessageDto { ExternalId = visit.Id, IsSmsReply = true, SmsReplyContent = content, TelNumber = visit.Order.Contact };
- var dto = new PushReceiveMessageDto();
- 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);
- var orderEntity = await _orderRepository.GetAsync(order.Id);
- orderEntity.ShouldNotBeNull();
- if (content == "4" || content == "5" || content == "不满意" || content == "非常不满意")
- {
- visit.VisitType.ShouldBeNull();
- orderEntity.Status.ShouldNotBe(EOrderStatus.Visited);
- }
- else
- {
- orderEntity.Status.ShouldBe(EOrderStatus.Visited);
- }
- var smsReply = _orderVisitDomainService.GetVisitEvaluateByReplyTxt(content);
- await _orderVisitDetailRepository.Queryable()
- .Where(m => m.VisitId == visit.Id && m.VisitTarget == EVisitTarget.Org)
- .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)
- {
- 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]
- [InlineData("1", "非常满意", "Visited", "VerySatisfied", "VerySatisfied", "非常满意|5")]
- [InlineData("2", "满意", "Visited", "Satisfied", "Satisfied", "满意|4")]
- [InlineData("3", "一般", "Visited", "Normal", "Normal", "满意|4")]
- [InlineData("4", "不满意", "SMSUnsatisfied", "NoSatisfied", "NoSatisfied", "不满意|2")]
- [InlineData("5", "非常不满意", "SMSUnsatisfied", "NoSatisfied", "VeryNoSatisfied", "不满意|2")]
- [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);
- var replyString = smsReply.VisitContent;
- replyString.ShouldBe(assertReplyTxt);
- var visitStateEnum = smsReply.VisitState;
- visitStateEnum.ShouldBe(visitState.ToEnum<EVisitState>());
- var seatEvaluateEnum = smsReply.SeatEvaluate;
- seatEvaluateEnum.ShouldBe(seatEvaluate.ToEnum<ESeatEvaluate>());
- var voiceEvaluateEnum = smsReply.VoiceEvaluate;
- voiceEvaluateEnum.ShouldBe(voiceEvaluate.ToEnum<EVoiceEvaluate>());
- var kvResult = smsReply.GetOrgProcessingResults(_systemDicDataCacheManager.VisitSatisfaction);
- var sp = kv.Split('|');
- var kV = new Kv(sp[1].ToString(), sp[0].ToString());
- kvResult.Key.ShouldBe(kV.Key);
- kvResult.Value.ShouldBe(kV.Value);
- }
- [Fact]
- public async Task Init_SettingOrderVisitSmsReplyRule_Data()
- {
- 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= 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 = "默认满意", VisitContent = "超过48小时自动回访", VisitState = EVisitState.Visited, SeatEvaluate = ESeatEvaluate.DefaultSatisfied,VoiceEvaluate = EVoiceEvaluate.DefaultSatisfied,OrgProcessingResults=0, OrgHandledAttitude = 0 }
- ];
- foreach (var item in entities)
- {
- item.UniqueKey = (item.AppScope + item.ReplyRegular).GetMD5();
- if (await _settingOrderVisitSmsReplyRuleRepository.AnyAsync(m => m.UniqueKey == item.UniqueKey) == false)
- await _settingOrderVisitSmsReplyRuleRepository.AddAsync(item);
- }
- }
- }
|