田爽 3 місяців тому
батько
коміт
6bbb788205

+ 60 - 16
src/Hotline.Api/Controllers/Bi/BiQualityController.cs

@@ -3,30 +3,74 @@ using Hotline.Share.Dtos;
 using Hotline.Share.Requests;
 using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
+using Hotline.Application.Quality;
+using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Share.Dtos.Quality;
+using Hotline.Tools;
 
 namespace Hotline.Api.Controllers.Bi
 {
 	public class BiQualityController : BaseController
 	{
 		private readonly IMapper _mapper;
+		private readonly IQualityApplication _qualityApplication;
 		public BiQualityController(
-			IMapper mapper
-			) {
+			IMapper mapper,
+			IQualityApplication qualityApplication
+			)
+		{
 			_mapper = mapper;
-		}	
+			_qualityApplication = qualityApplication;
+		}
 
-	}
 
-	   /// <summary>
-        /// 坐席质检分析
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        //[HttpGet("seats_quality_analyse")]
-		//public async Task<PagedDto<object>> SeatsQualityAnalyse([FromQuery] PagedKeywordRequest dto)
-		//{
-		//	var (total, items) = await _orderApplication.QueryKnowledgeQuoteList(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
-
-		//	return new PagedDto<OrderTsDetailsDto>(total, _mapper.Map<IReadOnlyList<OrderTsDetailsDto>>(items));
-		//}
+		/// <summary>
+		/// 坐席质检分析
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("seats_quality_analyse")]
+		public async Task<PagedDto<SeatsQualityAnalyseDto>> SeatsQualityAnalyse([FromQuery] PagedKeywordRequest dto)
+		{
+			var (total, items) = await _qualityApplication.SeatsQualityAnalyse(dto, HttpContext.RequestAborted).ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+			return new PagedDto<SeatsQualityAnalyseDto>(total, _mapper.Map<IReadOnlyList<SeatsQualityAnalyseDto>>(items));
+		}
+
+		/// <summary>
+		/// 坐席质检分析导出
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpPost("seats_quality_analyse/export")]
+		public async Task<FileStreamResult> SeatsQualityAnalyseExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+		{
+			var query = _qualityApplication.SeatsQualityAnalyse(dto.QueryDto, HttpContext.RequestAborted);
+
+			List<Hotline.Quality.Quality> lists;
+			if (dto.IsExportAll)
+			{
+				lists = await query.ToListAsync(HttpContext.RequestAborted);
+			}
+			else
+			{
+				var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+				lists = items;
+			}
+
+			var listDtos = _mapper.Map<ICollection<SeatsQualityAnalyseDto>>(lists);
+
+			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+			var dtos = listDtos
+				.Select(stu => _mapper.Map(stu, typeof(SeatsQualityAnalyseDto), dynamicClass))
+				.Cast<object>()
+				.ToList();
+
+			var stream = ExcelHelper.CreateStream(dtos);
+
+			return ExcelStreamResult(stream, "坐席质检分析");
+
+		}
 	}
+}

+ 3 - 0
src/Hotline.Application/Quality/IQualityApplication.cs

@@ -1,5 +1,7 @@
 using Hotline.Share.Dtos.Quality;
 using Hotline.Share.Enums.Quality;
+using Hotline.Share.Requests;
+using SqlSugar;
 
 namespace Hotline.Application.Quality
 {
@@ -12,6 +14,7 @@ namespace Hotline.Application.Quality
 		Task AiResultAsync(List<AiQualityResultDto> model, CancellationToken cancellationToken);
 
 		Task Transfer_XT(string Id, CancellationToken cancellationToken);
+		ISugarQueryable<Hotline.Quality.Quality> SeatsQualityAnalyse(PagedKeywordRequest dto, CancellationToken cancellationToken);
 
 	}
 }

+ 26 - 14
src/Hotline.Application/Quality/QualityApplication.cs

@@ -441,22 +441,34 @@ namespace Hotline.Application.Quality
 		}
 
 
-        public async Task SeatsQualityAnalyse(PagedKeywordRequest dto) { 
-        
-    //        var query = _qualityRepository.Queryable()
-    //            .Includes(x=>x.Order)
-    //            .Includes(x=>x.QualityDetails)
-    //            .Where(x=>x.Source == EQualitySource.Accepted && x.QualityTime >= dto.StartTime && x.QualityTime <= dto.EndTime && x.State == EQualityState.End)
-    //            .Select(x=>  new SeatsQualityAnalyseDto 
-    //            { 
-    //                AcceptorName = x.Order.AcceptorName,
-    //                Grade =x.Grade,
-    //                No = x.Order.No,
-    //                //QualityItem =   x.QualityDetails
+        /// <summary>
+        /// 坐席质检分析
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<Hotline.Quality.Quality> SeatsQualityAnalyse(PagedKeywordRequest dto, CancellationToken cancellationToken) {
+
+            var query = _qualityRepository.Queryable()
+                .Includes(x => x.Order)
+                .Includes(x => x.QualityDetails)
+                .Where(x => x.Source == EQualitySource.Accepted && x.QualityTime >= dto.StartTime && x.QualityTime <= dto.EndTime && x.State == EQualityState.End);
+            return query;
+        }
+
+        public  ISugarQueryable<QualityOrderOverviewDto>  QualityOrderOverview(QualityWorkAnalysisRequest dto, int allOrderNum, CancellationToken cancellationToken) {
 
-				//}
-				//)
+            //var allOrderNum =  await _qualityRepository.Queryable().Where(x => x.Source == EQualitySource.Accepted && x.QualityTime >= dto.StartTime && x.QualityTime <= dto.EndTime && x.State == EQualityState.End).CountAsync();
 
+            var query = _qualiteyDetail.Queryable()
+                .Includes(x => x.Quality)
+                .GroupBy(x => x.Name)
+                .Select(x => new QualityOrderOverviewDto
+                {
+
+                });
+            return query;
+                
+        
         }
 	}
 }

+ 55 - 4
src/Hotline.Share/Dtos/Quality/BiQualityDto.cs

@@ -1,4 +1,5 @@
-using System;
+using Hotline.Share.Dtos.Order;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -12,24 +13,74 @@ namespace Hotline.Share.Dtos.Quality
 
 	public class SeatsQualityAnalyseDto {
 
+		/// <summary>
+		///  工单
+		/// </summary>
+		public OrderDto? Order { get; set; }
+
 		/// <summary>
 		/// 受理人名称
 		/// </summary>
-		public string? AcceptorName { get; set; }
+		public string? AcceptorName => Order.AcceptorName;
 
 		/// <summary>
 		/// 工单编码
 		/// </summary>
-		public string? No { get; set; }
+		public string? No => Order.No;
+
+		/// <summary>
+		///  质检明细
+		/// </summary>
+		public List<QualityDetailDto>? QualityDetails { get; set; }
 
 		/// <summary>
 		/// 质检项
 		/// </summary>
-		public string? QualityItem { get; set; }
+		public string? QualityDetail => QualityDetails != null && QualityDetails.Any() ? string.Join(";", QualityDetails.Select(x => x.Name)) : string.Empty;
+
 
 		/// <summary>
 		/// 质检分数
 		/// </summary>
 		public int? Grade { get; set; }
 	}
+
+
+	public class QualityOrderOverviewDto 
+	{
+		/// <summary>
+		/// 质检项
+		/// </summary>
+		public string? QualityItem { get; set; }
+
+		/// <summary>
+		/// 质检工单数
+		/// </summary>
+		public int OrderNum { get; set; }
+
+		/// <summary>
+		/// 全量质检工单数
+		/// </summary>
+		public int AllOrderNum { get; set; }
+
+		/// <summary>
+		/// 占比
+		/// </summary>
+		public string? Rate => GetRate();
+
+		/// <summary>
+		/// 计算占比
+		/// </summary>
+		/// <returns></returns>
+		public string GetRate()
+		{
+			if (OrderNum != 0 && AllOrderNum != 0)
+			{
+				return Math.Round((OrderNum / (double)AllOrderNum) * 100, 2) + "%";
+			}
+			return "0%";
+		}
+
+	}
+
 }

+ 12 - 0
src/Hotline.Share/Dtos/Quality/QualityDto.cs

@@ -172,6 +172,18 @@ namespace Hotline.Share.Dtos.Quality
 		/// </summary>
 		public bool AiQuality { get; set; }
 
+		/// <summary>
+		/// 转写状态
+		/// </summary>
+		public EQualityTransferState? TransferState { get; set; }
+
+		public string TransferStateText => TransferState.GetDescription();
+
+		/// <summary>
+		/// 转写内容
+		/// </summary>
+		public List<Transfer>? Transfer { get; set; }
+
 	}
 	public class QualityBaseDto {
 		public DateTime? LastModificationTime { get; set; }

+ 20 - 0
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -1392,6 +1392,26 @@ public record SeatSatisfactionOrderVisitRequest : PagedKeywordRequest
     public string? No {  get; set; }
 }
 
+public record QualityWorkAnalysisRequest :PagedKeywordRequest
+{
+
+	/// <summary>
+	/// 最大质检分数
+	/// </summary>
+	public int? MaxGrade { get; set; }
+
+    /// <summary>
+    ///// 最小质检分数
+    /// </summary>
+    public int? MinGrade { get; set; }
+
+    /// <summary>
+    /// 受理人
+    /// </summary>
+    public string? AcceptorId { get; set; }
+
+}
+
 #region 智能回访
 
 public class QueryAiVisitStatisticsRequest