QualityApplication.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using Hotline.Ai.Quality;
  2. using Hotline.Caching.Interfaces;
  3. using Hotline.CallCenter.Calls;
  4. using Hotline.Orders;
  5. using Hotline.Quality;
  6. using Hotline.Share.Dtos.Quality;
  7. using Hotline.Share.Enums.Quality;
  8. using MapsterMapper;
  9. using XF.Domain.Authentications;
  10. using XF.Domain.Constants;
  11. using XF.Domain.Dependency;
  12. using XF.Domain.Exceptions;
  13. using XF.Domain.Repository;
  14. namespace Hotline.Application.Quality
  15. {
  16. public class QualityApplication : IQualityApplication, IScopeDependency
  17. {
  18. private readonly ISessionContext _sessionContext;
  19. private readonly IMapper _mapper;
  20. private readonly IRepository<QualityDetail> _qualiteyDetail;
  21. private readonly IQualityRepository _qualityRepository;
  22. private readonly IAiQualityService _aiQualityService;
  23. private readonly IOrderRepository _orderRepository;
  24. private readonly IRepository<TrCallRecord> _trCallRecordRepository;
  25. private readonly IRepository<QualityTemplate> _qualityTemplate;
  26. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  27. public QualityApplication(
  28. ISessionContext sessionContext,
  29. IMapper mapper,
  30. IRepository<QualityDetail> qualiteyDetail,
  31. IQualityRepository qualityRepository,
  32. IAiQualityService aiQualityService,
  33. IRepository<TrCallRecord> trCallRecordRepository,
  34. IRepository<QualityTemplate> qualityTemplate,
  35. IOrderRepository orderRepository,
  36. ISystemSettingCacheManager systemSettingCacheManager
  37. )
  38. {
  39. _sessionContext = sessionContext;
  40. _mapper = mapper;
  41. _qualiteyDetail = qualiteyDetail;
  42. _qualityRepository = qualityRepository;
  43. _aiQualityService = aiQualityService;
  44. _trCallRecordRepository = trCallRecordRepository;
  45. _qualityTemplate = qualityTemplate;
  46. _orderRepository = orderRepository;
  47. _systemSettingCacheManager = systemSettingCacheManager;
  48. }
  49. public async Task AddQualityAsync(EQualitySource Source, string OrderId, string VisitId, CancellationToken cancellationToken)
  50. {
  51. QualityAddDto quality = new QualityAddDto
  52. {
  53. Source = Source,
  54. OrderId = OrderId,
  55. VisitId = VisitId
  56. };
  57. var count = await _qualityRepository.CountAsync(x => x.OrderId == OrderId && x.Source == Source, cancellationToken);
  58. if (count <= 0)
  59. await AddQualityAsync(quality, cancellationToken);
  60. else
  61. {
  62. if (Source == EQualitySource.Visit) await _qualityRepository.Updateable().SetColumns(x => x.VisitId == VisitId).Where(x => x.OrderId == OrderId && x.Source == Source).ExecuteCommandAsync();
  63. }
  64. }
  65. public async Task AddQualityAsync(EQualitySource Source, string OrderId, CancellationToken cancellationToken)
  66. {
  67. QualityAddDto quality = new QualityAddDto
  68. {
  69. Source = Source,
  70. OrderId = OrderId
  71. };
  72. var count = await _qualityRepository.CountAsync(x => x.OrderId == OrderId && x.Source == Source, cancellationToken);
  73. if (count <= 0)
  74. await AddQualityAsync(quality, cancellationToken);
  75. }
  76. public async Task AddQualityAsync(QualityAddDto model, CancellationToken cancellationToken)
  77. {
  78. var quality = _mapper.Map<Hotline.Quality.Quality>(model);
  79. quality.InitId();
  80. if (model.QualityDetails.Any())
  81. {
  82. foreach (var item in model.QualityDetails)
  83. {
  84. item.QualityId = quality.Id;
  85. }
  86. List<QualityDetail> details = _mapper.Map<List<QualityDetail>>(model.QualityDetails);
  87. await _qualiteyDetail.AddRangeAsync(details, cancellationToken);
  88. }
  89. //受理智能质检
  90. if (model.Source == EQualitySource.Accepted)
  91. {
  92. var teAny = await _qualityTemplate.Queryable()
  93. .LeftJoin<QualityTemplateDetail>((x, d) => x.Id == d.TemplateId)
  94. .LeftJoin<QualityItem>((x, d, i) => d.ItemId == i.Id)
  95. .Where((x, d, i) => i.IsIntelligent == 1).AnyAsync();
  96. if (teAny)
  97. {
  98. var order = await _orderRepository.GetAsync(model.OrderId);
  99. if (order != null && !string.IsNullOrEmpty(order.CallId))
  100. {
  101. quality.AiQuality = true;
  102. quality.Mode = "智能质检";
  103. //var call = await _trCallRecordRepository.GetAsync(x => x.CallAccept == order.CallId); //由CallAccept改成OtherAccept
  104. var call = await _trCallRecordRepository.GetAsync(x => x.OtherAccept == order.CallId);
  105. var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ViteRecordPrefix);
  106. await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, setting?.SettingValue[0], cancellationToken);
  107. }
  108. }
  109. }
  110. await _qualityRepository.AddAsync(quality, cancellationToken);
  111. }
  112. public async Task UpdateQualityAsync(UpdateQualityDto model, CancellationToken cancellationToken)
  113. {
  114. //验证工单是否可以申请
  115. var quality = await _qualityRepository.GetAsync(model.Id, cancellationToken);
  116. if (quality is null)
  117. throw UserFriendlyException.SameMessage("无效质检");
  118. _mapper.Map(model, quality);
  119. quality.State = EQualityState.End;
  120. quality.UserName = _sessionContext.UserName;
  121. quality.QualityTime = DateTime.Now;
  122. await _qualityRepository.UpdateAsync(quality, cancellationToken);
  123. List<QualityDetail> deleteDetails = await _qualiteyDetail.Queryable().Where(x => x.QualityId == model.Id).ToListAsync(cancellationToken);
  124. await _qualiteyDetail.RemoveRangeAsync(deleteDetails, cancellationToken);
  125. if (model.QualityDetails.Any())
  126. {
  127. foreach (var item in model.QualityDetails)
  128. {
  129. item.QualityId = model.Id;
  130. }
  131. List<QualityDetail> details = _mapper.Map<List<QualityDetail>>(model.QualityDetails);
  132. await _qualiteyDetail.AddRangeAsync(details, cancellationToken);
  133. }
  134. }
  135. }
  136. }