Browse Source

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

xf 4 months ago
parent
commit
c12833d64f

+ 286 - 106
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -1010,29 +1010,29 @@ namespace Hotline.Api.Controllers.Bi
         }
 
 
-		/// <summary>
-		/// 受理类型前十
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		[HttpGet("accept_type_top10_list")]
+        /// <summary>
+        /// 受理类型前十
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("accept_type_top10_list")]
         public async Task<object> AcceptTypeTop10List([FromQuery] ReportPagedRequest dto)
         {
-            var (areaList, returnList,data) = await _orderApplication.AcceptTypeTop10List(dto,false);
+            var (areaList, returnList, data) = await _orderApplication.AcceptTypeTop10List(dto, false);
 
-            return new { List = areaList ,Data = returnList };
+            return new { List = areaList, Data = returnList };
         }
 
-		/// <summary>
-		/// 受理类型前十导出
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		[HttpPost("accept_type_top10_list-export")]
+        /// <summary>
+        /// 受理类型前十导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("accept_type_top10_list-export")]
         public async Task<FileStreamResult> AcceptTypeTop10ListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
         {
-			var (areaList, returnList,data) = await _orderApplication.AcceptTypeTop10List(dto.QueryDto,true);
-			var stream = ExcelHelper.CreateStream(data);
+            var (areaList, returnList, data) = await _orderApplication.AcceptTypeTop10List(dto.QueryDto, true);
+            var stream = ExcelHelper.CreateStream(data);
             return ExcelStreamResult(stream, "受理类型前十统计");
         }
 
@@ -1075,9 +1075,9 @@ namespace Hotline.Api.Controllers.Bi
             var SumModel = new VisitMeasureStatisticsModelDto()
             {
                 VisitName = "合计",
-                CallVisitCount = list.Sum(x=>x.CallVisitCount),
-                ArtificialVisitCount = list.Sum(x=>x.ArtificialVisitCount),
-                SumCount = list.Sum(x=>x.SumCount)
+                CallVisitCount = list.Sum(x => x.CallVisitCount),
+                ArtificialVisitCount = list.Sum(x => x.ArtificialVisitCount),
+                SumCount = list.Sum(x => x.SumCount)
             };
             list.Add(SumModel);
             dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
@@ -1113,7 +1113,7 @@ namespace Hotline.Api.Controllers.Bi
                      ArtificialVisitCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.VisitType != EVisitType.CallVisit, 1, 0)),
                      SumCount = SqlFunc.AggregateCount(x.EmployeeId)
                  });
-            var list =await query.ToListAsync();
+            var list = await query.ToListAsync();
             var returnModel = new VisitMeasureStatisticsDto();
             returnModel.VisitMeasureStatisticsModelList = list;
 
@@ -1206,85 +1206,130 @@ namespace Hotline.Api.Controllers.Bi
             }
         }
 
-		/// <summary>
-		/// 热点类型小类统计导出
-		/// </summary>
-		/// <param name="StartTime"></param>
-		/// <param name="EndTime"></param>
-		/// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
-		/// <returns></returns>
-		[HttpPost("hotspot-statistics/export")]
-		public async Task<FileStreamResult> HotspotStatisticsExprot([FromBody] ExportExcelDto<HotspotStatisticsRep> dto)
-		{
-			var IsCenter = _sessionContext.OrgIsCenter;
+        /// <summary>
+        /// 热点类型小类统计导出
+        /// </summary>
+        /// <param name="StartTime"></param>
+        /// <param name="EndTime"></param>
+        /// <param name="TypeId">0:全部 ,1:市民,2:企业</param>
+        /// <returns></returns>
+        [HttpPost("hotspot-statistics/export")]
+        public async Task<FileStreamResult> HotspotStatisticsExprot([FromBody] ExportExcelDto<HotspotStatisticsRep> dto)
+        {
+            var IsCenter = _sessionContext.OrgIsCenter;
             DataTable data = new DataTable();
 
-			if (string.IsNullOrEmpty(dto.QueryDto.HotspotCode))
-			{
-				data = await _hotspotTypeRepository.Queryable()
-				.LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
-				.Where((it, o) => o.CreationTime >= dto.QueryDto.StartTime && o.CreationTime <= dto.QueryDto.EndTime && o.Id != null)
-				.WhereIF(dto.QueryDto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
-				.WhereIF(dto.QueryDto.TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
-				.WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
-				.GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")) })
-				.Select((it, o) => new
-				{
-					HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")),
-					SumCount = SqlFunc.AggregateCount(it.HotSpotName)
-				})
-				.MergeTable()
-				.LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
-				.Select((x, q) => new
-				{
-					SumCount = x.SumCount,
-					HotspotName = q.HotSpotName
-				})
-				.ToDataTableAsync();
-			}
-			else
-			{
-				string count = (dto.QueryDto.HotspotCode.Length + 2).ToString();
-				string countx = dto.QueryDto.HotspotCode.Length.ToString();
-				 data = await _hotspotTypeRepository.Queryable()
-				.LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
-				.Where((it, o) => o.CreationTime >= dto.QueryDto.StartTime && o.CreationTime <= dto.QueryDto.EndTime && it.ParentId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(countx)) == dto.QueryDto.HotspotCode)
-				.WhereIF(dto.QueryDto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
-				.WhereIF(dto.QueryDto.TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
-				.WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
-				.GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
-				.Select((it, o) => new
-				{
-					HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
-					SumCount = SqlFunc.AggregateCount(it.HotSpotName)
-				})
-				.MergeTable()
-				.LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
-				.Select((x, q) => new
-				{
-					SumCount = x.SumCount,
-					HotspotName = q.HotSpotName,
-				})
-				.ToDataTableAsync();
-
-			}
+            if (string.IsNullOrEmpty(dto.QueryDto.HotspotCode))
+            {
+                data = await _hotspotTypeRepository.Queryable()
+                .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
+                .Where((it, o) => o.CreationTime >= dto.QueryDto.StartTime && o.CreationTime <= dto.QueryDto.EndTime && o.Id != null)
+                .WhereIF(dto.QueryDto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
+                .WhereIF(dto.QueryDto.TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
+                .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
+                .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")) })
+                .Select((it, o) => new
+                {
+                    HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("2")),
+                    SumCount = SqlFunc.AggregateCount(it.HotSpotName)
+                })
+                .MergeTable()
+                .LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
+                .Select((x, q) => new
+                {
+                    SumCount = x.SumCount,
+                    HotspotName = q.HotSpotName
+                })
+                .ToDataTableAsync();
+            }
+            else
+            {
+                string count = (dto.QueryDto.HotspotCode.Length + 2).ToString();
+                string countx = dto.QueryDto.HotspotCode.Length.ToString();
+                data = await _hotspotTypeRepository.Queryable()
+               .LeftJoin<Order>((it, o) => it.Id == o.HotspotId)
+               .Where((it, o) => o.CreationTime >= dto.QueryDto.StartTime && o.CreationTime <= dto.QueryDto.EndTime && it.ParentId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(countx)) == dto.QueryDto.HotspotCode)
+               .WhereIF(dto.QueryDto.TypeId == 1, (it, o) => o.IdentityType == EIdentityType.Citizen)
+               .WhereIF(dto.QueryDto.TypeId == 2, (it, o) => o.IdentityType == EIdentityType.Enterprise)
+               .WhereIF(IsCenter == false, (it, o) => o.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId))
+               .GroupBy((it, o) => new { Id = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)) })
+               .Select((it, o) => new
+               {
+                   HotspotCode = it.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(count)),
+                   SumCount = SqlFunc.AggregateCount(it.HotSpotName)
+               })
+               .MergeTable()
+               .LeftJoin<Hotspot>((x, q) => x.HotspotCode == q.Id)
+               .Select((x, q) => new
+               {
+                   SumCount = x.SumCount,
+                   HotspotName = q.HotSpotName,
+               })
+               .ToDataTableAsync();
+
+            }
             data.Columns["HotspotName"].SetOrdinal(0);
-			data.Columns["SumCount"].ColumnName = "分类统计";
-			data.Columns["HotspotName"].ColumnName = "热点名称";
+            data.Columns["SumCount"].ColumnName = "分类统计";
+            data.Columns["HotspotName"].ColumnName = "热点名称";
             //合计
-			DataRow sumRow = data.NewRow();
-			sumRow["热点名称"] = "合计";
-			decimal totalAmount = 0;
-			foreach (DataRow row in data.Rows)
-			{
-				totalAmount += Convert.ToDecimal(row["分类统计"]);
-			}
-			sumRow["分类统计"] = totalAmount;
-			data.Rows.Add(sumRow);
+            DataRow sumRow = data.NewRow();
+            sumRow["热点名称"] = "合计";
+            decimal totalAmount = 0;
+            foreach (DataRow row in data.Rows)
+            {
+                totalAmount += Convert.ToDecimal(row["分类统计"]);
+            }
+            sumRow["分类统计"] = totalAmount;
+            data.Rows.Add(sumRow);
 
-			var stream = ExcelHelper.CreateStream(data);
-			return ExcelStreamResult(stream, "热点类型小类统计");
-		}
+            var stream = ExcelHelper.CreateStream(data);
+            return ExcelStreamResult(stream, "热点类型小类统计");
+        }
+
+        /// <summary>
+        /// 热点类型小类统计明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("hotspot-statistics-detail")]
+        public async Task<PagedDto<OrderDto>> HotspotStatisticsDetail([FromQuery] HotspotStatisticsRep dto)
+        {
+            var (total, items) = await _orderApplication.HotspotStatisticsDetail(dto)
+                .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+            return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+        }
+
+        /// <summary>
+        /// 热点类型小类统计明细导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("hotspot-statistics-detail/export")]
+        public async Task<FileStreamResult> HotspotStatisticsDetailExport([FromBody] ExportExcelDto<HotspotStatisticsRep> dto)
+        {
+            var query = _orderApplication.HotspotStatisticsDetail(dto.QueryDto);
+            List<Order> data;
+            if (dto.IsExportAll)
+            {
+                data = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                data = items;
+            }
+            var orderDtos = _mapper.Map<IReadOnlyList<OrderDto>>(data);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = orderDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "热点类型小类统计明细");
+        }
 
         /// <summary>
         /// 部门满意度统计表基础数据
@@ -1293,11 +1338,146 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("visit-org-satisfaction-statisticsBaseData")]
         public async Task<object> VisitAndOrgSatisfactionStatisticsBaseData()
         {
-            return new { 
+            return new
+            {
                 VisitType = EnumExts.GetDescriptions<EVisitType>(),
             };
         }
 
+        /// <summary>
+        /// 坐席总体满意度分析
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("seat-satisfaction-statistics")]
+        public async Task<List<SeatSatisfactionStatisticsDto>> SeatSatisfactionStatistics([FromQuery] PagedKeywordRequest dto)
+        {
+            return await _orderApplication.SeatSatisfactionStatistics(dto).ToListAsync();
+        }
+
+        /// <summary>
+        /// 坐席总体满意度分析导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("seat-satisfaction-statistics/export")]
+        public async Task<FileStreamResult> SeatSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+        {
+            var query = _orderApplication.SeatSatisfactionStatistics(dto.QueryDto);
+            List<SeatSatisfactionStatisticsDto> data;
+            if (dto.IsExportAll)
+            {
+                data = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                data = items;
+            }
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = data
+                .Select(stu => _mapper.Map(stu, typeof(SeatSatisfactionStatisticsDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "坐席总体满意度分析");
+        }
+
+        /// <summary>
+        /// 坐席总体满意率分析
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("seat-satisfaction-statistics-rate")]
+        public async Task<SeatSatisfactionStatisticsEvaluateDto> SeatSatisfactionStatisticsRate([FromQuery] PagedKeywordRequest dto)
+        {
+            var data = await _orderVisitRepository.Queryable()
+                  .LeftJoin<Order>((ov, o) => ov.OrderId == o.Id)
+                    .Where((ov, o) => ov.VisitTime >= dto.StartTime.Value && ov.VisitTime <= dto.EndTime.Value && ov.VisitState == EVisitState.Visited && o.SeatEvaluate != null)
+                     .Select((ov, o) => new SeatSatisfactionStatisticsEvaluateDto
+                     {
+                         Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate != ESeatEvaluate.NoSatisfied && o.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied, 1, 0)),
+                         NoSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate == ESeatEvaluate.NoSatisfied || o.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied, 1, 0))
+                     })
+                     .FirstAsync();
+            return data;
+        }
+
+        /// <summary>
+        /// 坐席满意度明细表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("seat-satisfaction-statistics-list-detail")]
+        public async Task<object> SeatSatisfactionStatisticsListDetail([FromQuery] PagedKeywordRequest dto)
+        {
+            var list = await _orderApplication.SeatSatisfactionStatisticsListDetail(dto).ToListAsync();
+
+            var sumModel = new SeatSatisfactionStatisticsListDetailDto()
+            {
+                UserName = "合计",
+                UserId = "",
+                DefaultSatisfied = list.Sum(x => x.DefaultSatisfied),
+                VeryNoSatisfied = list.Sum(x => x.VeryNoSatisfied),
+                NoSatisfied = list.Sum(x => x.NoSatisfied),
+                Normal = list.Sum(x => x.Normal),
+                Satisfied = list.Sum(x => x.Satisfied),
+                VerySatisfied = list.Sum(x => x.VerySatisfied),
+                NoConnect = list.Sum(x => x.NoConnect),
+                NoEvaluate = list.Sum(x => x.NoEvaluate),
+            };
+            return new { List = list, Total = sumModel };
+        }
+
+        /// <summary>
+        /// 坐席总体满意度分析导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("seat-satisfaction-statistics-list-detail/export")]
+        public async Task<FileStreamResult> SeatSatisfactionStatisticsListDetailExport([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
+        {
+            var query = _orderApplication.SeatSatisfactionStatisticsListDetail(dto.QueryDto);
+            List<SeatSatisfactionStatisticsListDetailDto> data;
+            if (dto.IsExportAll)
+            {
+                data = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                data = items;
+            }
+            var sumModel = new SeatSatisfactionStatisticsListDetailDto()
+            {
+                UserName = "合计",
+                UserId = "",
+                DefaultSatisfied = data.Sum(x => x.DefaultSatisfied),
+                VeryNoSatisfied = data.Sum(x => x.VeryNoSatisfied),
+                NoSatisfied = data.Sum(x => x.NoSatisfied),
+                Normal = data.Sum(x => x.Normal),
+                Satisfied = data.Sum(x => x.Satisfied),
+                VerySatisfied = data.Sum(x => x.VerySatisfied),
+                NoConnect = data.Sum(x => x.NoConnect),
+                NoEvaluate = data.Sum(x => x.NoEvaluate),
+            };
+            data.Add(sumModel);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = data
+                .Select(stu => _mapper.Map(stu, typeof(SeatSatisfactionStatisticsListDetailDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "坐席满意度明细表");
+        }
 
         /// <summary>
         /// 部门满意度统计
@@ -1325,14 +1505,14 @@ namespace Hotline.Api.Controllers.Bi
             var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
             {
                 OrgName = "市直合计",
-                TotalSumCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode!="001").Sum(x => x.TotalSumCount),
+                TotalSumCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.TotalSumCount),
                 VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.VerySatisfiedCount),
                 SatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.SatisfiedCount),
                 RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.RegardedAsSatisfiedCount),
                 DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.DefaultSatisfiedCount),
                 NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NoSatisfiedCount),
                 NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NoEvaluateCount),
-                NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode!="001").Sum(x => x.NoPutThroughCount),
+                NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.City && x.OrgCode != "001").Sum(x => x.NoPutThroughCount),
             };
 
             var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
@@ -2513,15 +2693,15 @@ namespace Hotline.Api.Controllers.Bi
 
             var queryData = await _orderReportApplication.DepartmentalProcessingStatisticsDetailsList(dto)
                         .LeftJoin<Order>((x, o) => x.Id == o.Id)
-                        .OrderByIF(string.IsNullOrEmpty(dto.SortField),(x,o)=> o.CreationTime,OrderByType.Desc)
-                        .OrderByIF(dto is { SortField : "startTime", SortRule :0 },(x,o)=> o.StartTime,OrderByType.Asc) //受理时间升序
-                        .OrderByIF(dto is { SortField : "startTime", SortRule: 1 }, (x, o) => o.StartTime, OrderByType.Desc) //受理时间降序
-                        .OrderByIF(dto is { SortField: "expiredTime", SortRule:0 },(x,o)=> o.ExpiredTime,OrderByType.Asc) //工单期满时间升序
+                        .OrderByIF(string.IsNullOrEmpty(dto.SortField), (x, o) => o.CreationTime, OrderByType.Desc)
+                        .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, (x, o) => o.StartTime, OrderByType.Asc) //受理时间升序
+                        .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, (x, o) => o.StartTime, OrderByType.Desc) //受理时间降序
+                        .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, (x, o) => o.ExpiredTime, OrderByType.Asc) //工单期满时间升序
                         .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, (x, o) => o.ExpiredTime, OrderByType.Desc) //工单期满时间降序
-                        .OrderByIF(dto is { SortField: "filedTime",SortRule:0 },(x,o)=> o.FiledTime,OrderByType.Asc)// 办结时间升序
-                        .OrderByIF(dto is { SortField: "filedTime",SortRule:1 },(x,o)=> o.FiledTime,OrderByType.Desc) //办结时间降序
+                        .OrderByIF(dto is { SortField: "filedTime", SortRule: 0 }, (x, o) => o.FiledTime, OrderByType.Asc)// 办结时间升序
+                        .OrderByIF(dto is { SortField: "filedTime", SortRule: 1 }, (x, o) => o.FiledTime, OrderByType.Desc) //办结时间降序
                         .Select((x, o) => new { o })
-                        
+
                         .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
 
             var dtos = queryData.Select(d =>
@@ -4653,7 +4833,7 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpGet("aivisit-effective-analysis")]
-        public async Task<QueryAiVisitEffectiveAnalysisResp> QueryAiVisitEffectiveAnalysis([FromQuery]QueryAiVisitStatisticsRequest dto)
+        public async Task<QueryAiVisitEffectiveAnalysisResp> QueryAiVisitEffectiveAnalysis([FromQuery] QueryAiVisitStatisticsRequest dto)
         {
             var model = await _orderRepository.QueryAiVisitEffectiveAnalysis(dto);
             return model;
@@ -4722,6 +4902,6 @@ namespace Hotline.Api.Controllers.Bi
         }
 
 
-        
+
     }
 }

+ 22 - 0
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -355,5 +355,27 @@ namespace Hotline.Application.Orders
         /// <param name="dto"></param>
         /// <returns></returns>
         ISugarQueryable<OrderVisit> QueryOrderVisitList(QueryOrderVisitDto dto);
+
+		/// <summary>
+		/// 热点类型小类统计明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		ISugarQueryable<Order> HotspotStatisticsDetail(HotspotStatisticsRep dto);
+
+        /// <summary>
+        /// 坐席总体满意度分析
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<SeatSatisfactionStatisticsDto> SeatSatisfactionStatistics(PagedKeywordRequest dto);
+
+        /// <summary>
+        /// 坐席满意度明细表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<SeatSatisfactionStatisticsListDetailDto> SeatSatisfactionStatisticsListDetail(PagedKeywordRequest dto);
+
     }
 }

+ 116 - 0
src/Hotline.Application/Orders/OrderApplication.cs

@@ -18,6 +18,7 @@ using Hotline.SeedData;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Settings.TimeLimitDomain;
+using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
@@ -37,6 +38,7 @@ using Hotline.Users;
 using Mapster;
 using MapsterMapper;
 using MediatR;
+using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
 using PanGu;
 using SqlSugar;
@@ -1664,6 +1666,49 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(x => x.OrderSpecial.CreationTime <= dto.EndTime);
     }
 
+    ///// <summary>
+    ///// 
+    ///// </summary>
+    ///// <param name="dto"></param>
+    ///// <returns></returns>
+    //public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> SeatSatisfactionStatistics(PagedKeywordSonRequest dto)
+    //{
+    //    _orderVisitRepository.Queryable()
+    //        .Includes(d => d.Order)
+    //        .Where(x => x.VisitTime >= dto.StartTime.Value && x.VisitTime <= dto.EndTime.Value && x.VisitState == EVisitState.Visited)
+    //        .GroupBy(x=>new {
+    //            AcceptorId = x.Order.AcceptorId,
+    //            AcceptorName=  x.Order.AcceptorName
+    //        }).Select(x => new VisitAndOrgSatisfactionStatisticsDto()
+    //        {
+    //            OrgCode = x.Order.AcceptorId,
+    //            TotalSumCount =
+    //                    SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
+    //            VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)),
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))), //非常满意数
+    //            SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)),
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+    //            RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)),
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))), //视为满意
+    //            DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)),
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))), //默认满意
+    //            NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1,
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)),
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))), //不满意
+    //            NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1,
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)),
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))), //未做评价
+    //            NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1,
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)),
+    //                    SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))), //未接通
+    //        })
+    //    return null;
+    //}
+
     /// <summary>
     /// 部门满意度统计
     /// </summary>
@@ -2855,6 +2900,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var query = _orderVisitRepository.Queryable()
             .Includes(d => d.Order)
             .Includes(d => d.Employee)
+            .Includes(d=>d.OrderVisitDetails)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoVisit,
                 d => d.VisitState == EVisitState.WaitForVisit ||
                      d.VisitState == EVisitState.NoSatisfiedWaitForVisit)
@@ -2905,6 +2951,76 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         return query;
     }
 
+	/// <summary>
+	/// 热点类型小类统计明细
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+
+	public ISugarQueryable<Order> HotspotStatisticsDetail(HotspotStatisticsRep dto)
+    {
+	    var IsCenter = _sessionContext.OrgIsCenter;
+	    var query = _orderRepository.Queryable()
+		    .Includes(d => d.OrderVisits)
+		    .Where(d => d.CreationTime >= dto.StartTime && d.CreationTime <= dto.EndTime)
+		    .Where(d => d.HotspotId.StartsWith(dto.HotspotCode))
+		    .WhereIF(dto.TypeId == 1, d => d.IdentityType == EIdentityType.Citizen)
+		    .WhereIF(dto.TypeId == 2, d => d.IdentityType == EIdentityType.Enterprise)
+		    .WhereIF(IsCenter == false, d => d.ActualHandleOrgCode.StartsWith(_sessionContext.RequiredOrgId));
+	    return query;
+    }
+
+    /// <summary>
+    /// 坐席总体满意度分析
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<SeatSatisfactionStatisticsDto> SeatSatisfactionStatistics(PagedKeywordRequest dto)
+    {
+        var list = _orderVisitRepository.Queryable()
+               .Includes(d => d.Order)
+               .Where(x => x.VisitTime >= dto.StartTime.Value && x.VisitTime <= dto.EndTime.Value && x.VisitState == EVisitState.Visited && x.Order.SeatEvaluate != null)
+               .GroupBy(x => x.Order.SeatEvaluate)
+               .Select(x => new SeatSatisfactionStatisticsDto
+               {
+                   SeatEvaluate = x.Order.SeatEvaluate,
+                   Count = SqlFunc.AggregateCount(x.Id)
+               });
+        return list;
+    }
+
+    /// <summary>
+    /// 坐席满意度明细表
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<SeatSatisfactionStatisticsListDetailDto> SeatSatisfactionStatisticsListDetail(PagedKeywordRequest dto)
+    {
+        var query = _orderVisitRepository.Queryable()
+                 .LeftJoin<Order>((ov, o) => ov.OrderId == o.Id)
+                 .Where((ov, o) => ov.VisitTime >= dto.StartTime.Value && ov.VisitTime <= dto.EndTime.Value && ov.VisitState == EVisitState.Visited && o.SeatEvaluate != null)
+                 .GroupBy((ov, o) => new
+                 {
+                     o.AcceptorName,
+                     o.AcceptorId
+                 })
+                 .Select((ov, o) => new SeatSatisfactionStatisticsListDetailDto
+                 {
+                     UserName = o.AcceptorName,
+                     UserId = o.AcceptorId,
+                     DefaultSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate == ESeatEvaluate.DefaultSatisfied, 1, 0)),
+                     VeryNoSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied, 1, 0)),
+                     NoSatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate == ESeatEvaluate.NoSatisfied, 1, 0)),
+                     Normal = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate == ESeatEvaluate.Normal, 1, 0)),
+                     Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate == ESeatEvaluate.Satisfied, 1, 0)),
+                     VerySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate == ESeatEvaluate.VerySatisfied, 1, 0)),
+                     NoConnect = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate == ESeatEvaluate.NoConnect, 1, 0)),
+                     NoEvaluate = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate == ESeatEvaluate.NoEvaluate, 1, 0))
+                 });
+        return query;
+    }
+
+
     #region private
     /// <summary>
     /// 接受外部工单(除省平台)

+ 16 - 5
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -44,8 +44,9 @@ namespace Hotline.Application.Orders
         private readonly IWorkflowDomainService _workflowDomainService;
         private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
         private readonly IOrderDomainService _orderDomainService;
+        private readonly IOrderScreenRepository _orderScreenRepository;
 
-        public OrderSecondaryHandlingApplication(
+		public OrderSecondaryHandlingApplication(
             IMapper mapper,
             IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository,
             IFileRepository fileRepository,
@@ -59,9 +60,9 @@ namespace Hotline.Application.Orders
             IRepository<OrderPublishHistory> orderPublishHistoryRepository,
             IWorkflowDomainService workflowDomainService,
             IRepository<OrderVisitDetail> orderVisitedDetailRepository,
-            IOrderDomainService orderDomainService
-,
-            ICalcExpireTime expireTime)
+            IOrderDomainService orderDomainService,
+            IOrderScreenRepository orderScreenRepository,
+			ICalcExpireTime expireTime)
         {
             _mapper = mapper;
             _orderSecondaryHandlingRepository = orderSecondaryHandlingRepository;
@@ -78,7 +79,8 @@ namespace Hotline.Application.Orders
             _orderVisitedDetailRepository = orderVisitedDetailRepository;
             _orderDomainService = orderDomainService;
             _expireTime = expireTime;
-        }
+            _orderScreenRepository = orderScreenRepository;
+		}
 
         /// <summary>
         ///  二次办理新增
@@ -202,6 +204,15 @@ namespace Hotline.Application.Orders
                     await _orderPublishHistoryRepository.AddAsync(publishHistory, cancellationToken);
                     await _orderPublishRepository.RemoveAsync(publish, false, cancellationToken);
                 }
+
+                var screen = await _orderScreenRepository.Queryable().FirstAsync(
+	                x => x.OrderId == model.OrderId &&
+	                     (x.Status != EScreenStatus.End && x.Status != EScreenStatus.Refuse), cancellationToken);
+                if (screen != null)
+                {
+	                await _orderScreenRepository.RemoveAsync(screen, false, cancellationToken);
+                }
+
                 await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, isOrderFiled, EWorkflowTraceType.SecondHandle, cancellationToken);
                 visit.VisitState = EVisitState.None;
                 await _orderVisitRepository.UpdateAsync(visit, cancellationToken);

+ 1301 - 1165
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -1,4 +1,5 @@
 using Hotline.Settings;
+using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
 using Microsoft.VisualBasic;
@@ -7,216 +8,218 @@ using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Order
 {
-	public class OrderBiOrgDataListVo
-	{
-		public string OrgName { get; set; }
-
-		public string OrgId { get; set; }
-
-		/// <summary>
-		/// 业务已办超期
-		/// </summary>
-		public int HandlerExtendedNum { get; set; }
-
-		/// <summary>
-		/// 会签已办超期
-		/// </summary>
-		public int CounterHandlerExtendedNum { get; set; }
-		/// <summary>
-		/// 业务待办超期
-		/// </summary>
-		public int NoHandlerExtendedNum { get; set; }
-		/// <summary>
-		/// 会签待办超期
-		/// </summary>
-		public int CounterNoHandlerExtendedNum { get; set; }
-
-		public int Subtotal => HandlerExtendedNum + CounterHandlerExtendedNum + NoHandlerExtendedNum + CounterNoHandlerExtendedNum;
-
-		//public int Subtotal { get; set; }
+    public class OrderBiOrgDataListVo
+    {
+        public string OrgName { get; set; }
+
+        public string OrgId { get; set; }
+
+        /// <summary>
+        /// 业务已办超期
+        /// </summary>
+        public int HandlerExtendedNum { get; set; }
+
+        /// <summary>
+        /// 会签已办超期
+        /// </summary>
+        public int CounterHandlerExtendedNum { get; set; }
+        /// <summary>
+        /// 业务待办超期
+        /// </summary>
+        public int NoHandlerExtendedNum { get; set; }
+        /// <summary>
+        /// 会签待办超期
+        /// </summary>
+        public int CounterNoHandlerExtendedNum { get; set; }
+
+        public int Subtotal => HandlerExtendedNum + CounterHandlerExtendedNum + NoHandlerExtendedNum + CounterNoHandlerExtendedNum;
+
+        //public int Subtotal { get; set; }
 
     }
 
-	public class OrderBiCentreDataListVo
-	{
-		/// <summary>
-		/// 用户名
-		/// </summary>
-		public string UserName { get; set; }
-
-		/// <summary>
-		/// 用户ID
-		/// </summary>
-		public string UserId { get; set; }
-
-		/// <summary>
-		/// 中心归档件
-		/// </summary>
-		public int CentreArchive { get; set; }
-
-		/// <summary>
-		/// 转办信件
-		/// </summary>
-		public int CentreCareOf { get; set; }
-
-		/// <summary>
-		/// 待转办
-		/// </summary>
-		public int NoCentreCareOf { get; set; }
-		/// <summary>
-		/// 无效件
-		/// </summary>
-		public int Invalid { get; set; }
-		/// <summary>
-		/// 重复件
-		/// </summary>
-		public int Repeat { get; set; }
+    public class OrderBiCentreDataListVo
+    {
+        /// <summary>
+        /// 用户名
+        /// </summary>
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// 用户ID
+        /// </summary>
+        public string UserId { get; set; }
+
+        /// <summary>
+        /// 中心归档件
+        /// </summary>
+        public int CentreArchive { get; set; }
+
+        /// <summary>
+        /// 转办信件
+        /// </summary>
+        public int CentreCareOf { get; set; }
+
+        /// <summary>
+        /// 待转办
+        /// </summary>
+        public int NoCentreCareOf { get; set; }
+        /// <summary>
+        /// 无效件
+        /// </summary>
+        public int Invalid { get; set; }
+        /// <summary>
+        /// 重复件
+        /// </summary>
+        public int Repeat { get; set; }
 
         //public int Subtotal => CentreArchive + CentreCareOf + NoCentreCareOf + Invalid + Repeat;
         public int Subtotal { get; set; }
     }
 
-	public class OrderBiSpecialListVo
-	{
-		public string Cause { get; set; }
+    public class OrderBiSpecialListVo
+    {
+        public string Cause { get; set; }
+
+        public int OrderNum { get; set; }
+
+        public DateTime MaxSpecialTime { get; set; }
+    }
+
+    public class HotspotDataLsitVo
+    {
+        public string Name { get; set; }
+
+        public string Id { get; set; }
+
+        public int Num { get; set; }
+        public bool Sublevel { get; set; }
 
-		public int OrderNum { get; set; }
+        public List<HotspotDataLsitVo> Children { get; set; }
 
-		public DateTime MaxSpecialTime { get; set; }
-	}
+        public int ChainNum { get; set; }
 
-	public class HotspotDataLsitVo { 
-		public string Name { get; set;}
+        public string ChainRate { get; set; }
 
-		public string Id { get; set; }
+    }
 
-		public int Num { get; set; }
-		public bool Sublevel { get; set; }
 
-		public List<HotspotDataLsitVo> Children { get; set; }
+    public class AcceptTypeTop10Volod
+    {
+        /// <summary>
+        /// 热点名称
+        /// </summary>
+        public string Name { get; set; }
 
-		public int ChainNum { get; set; }
+        /// <summary>
+        /// 受理类型ID
+        /// </summary>
+        public string Id { get; set; }
 
-		public string ChainRate { get; set; }
+        /// <summary>
+        /// 受理类型名称
+        /// </summary>
+        public string AcceptName { get; set; }
 
+        /// <summary>
+        /// 数量
+        /// </summary>
+        public int Num { get; set; }
     }
 
+    public class AcceptTypeTop10Vo
+    {
+        /// <summary>
+        /// 热点名称
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 有效受理
+        /// </summary>
+        public int ValidAccept { get; set; }
+
+        /// <summary>
+        /// 咨询
+        /// </summary>
+        public int Consult { get; set; }
+
+        /// <summary>
+        /// 举报
+        /// </summary>
+
+        public int Report { get; set; }
+
+        /// <summary>
+        /// 投诉
+        /// </summary>
+        public int Complaint { get; set; }
+
+        /// <summary>
+        /// 求助
+        /// </summary>
+        public int SeekHelp { get; set; }
+
+        /// <summary>
+        /// 建议
+        /// </summary>
+        public int Suggest { get; set; }
+
+        /// <summary>
+        /// 意见
+        /// </summary>
+        public int Opinion { get; set; }
+
+        /// <summary>
+        /// 其他
+        /// </summary>
+        public int Rests { get; set; }
+
+        /// <summary>
+        /// 惠民帮助
+        /// </summary>
+        public int BenefitThePeople { get; set; }
+
+        /// <summary>
+        /// 表扬
+        /// </summary>
+        public int Praise { get; set; }
+    }
 
-	public class AcceptTypeTop10Volod {
-		/// <summary>
-		/// 热点名称
-		/// </summary>
-		public string Name { get; set; }
-
-		/// <summary>
-		/// 受理类型ID
-		/// </summary>
-		public string Id { get; set; }
-
-		/// <summary>
-		/// 受理类型名称
-		/// </summary>
-		public string AcceptName { get; set; }
-
-		/// <summary>
-		/// 数量
-		/// </summary>
-		public int Num { get; set; }
-	}
-
-	public class AcceptTypeTop10Vo
-	{
-		/// <summary>
-		/// 热点名称
-		/// </summary>
-		public string Name { get; set; }
-
-		/// <summary>
-		/// 有效受理
-		/// </summary>
-		public int ValidAccept { get; set; }
-
-		/// <summary>
-		/// 咨询
-		/// </summary>
-		public int Consult { get; set; }
-
-		/// <summary>
-		/// 举报
-		/// </summary>
-
-		public int Report { get; set; }
-
-		/// <summary>
-		/// 投诉
-		/// </summary>
-		public int Complaint { get; set; }
-
-		/// <summary>
-		/// 求助
-		/// </summary>
-		public int SeekHelp { get; set; }
-
-		/// <summary>
-		/// 建议
-		/// </summary>
-		public int Suggest { get; set; }
-
-		/// <summary>
-		/// 意见
-		/// </summary>
-		public int Opinion { get; set; }
-
-		/// <summary>
-		/// 其他
-		/// </summary>
-		public int Rests { get; set; }
-
-		/// <summary>
-		/// 惠民帮助
-		/// </summary>
-		public int BenefitThePeople { get; set; }
-
-		/// <summary>
-		/// 表扬
-		/// </summary>
-		public int Praise { get; set; }
-	}
-
-	public class BiOrderDelayDataDto
-	{
-		/// <summary>
-		/// 部门名称
-		/// </summary>
-		public string OrgName { get; set; }
-		/// <summary>
-		/// 部门code
-		/// </summary>
-		public string OrgCode { get; set; }
-		/// <summary>
-		/// 小计
-		/// </summary>
-		public int AllTotal { get; set; }
-		/// <summary>
-		/// 已同意次数
-		/// </summary>
-		public int PassTotal { get; set; }
-		/// <summary>
-		/// 未同意次数
-		/// </summary>
-		public int NoPassTotal { get; set; }
-		/// <summary>
-		/// 审批中次数
-		/// </summary>
-		public int ExaminingTotal { get; set; }
+    public class BiOrderDelayDataDto
+    {
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string OrgName { get; set; }
+        /// <summary>
+        /// 部门code
+        /// </summary>
+        public string OrgCode { get; set; }
+        /// <summary>
+        /// 小计
+        /// </summary>
+        public int AllTotal { get; set; }
+        /// <summary>
+        /// 已同意次数
+        /// </summary>
+        public int PassTotal { get; set; }
+        /// <summary>
+        /// 未同意次数
+        /// </summary>
+        public int NoPassTotal { get; set; }
+        /// <summary>
+        /// 审批中次数
+        /// </summary>
+        public int ExaminingTotal { get; set; }
 
     }
 
 
 
-	public class VisitMeasureStatisticsDto
-	{
-		
+    public class VisitMeasureStatisticsDto
+    {
+
 
         /// <summary>
         /// 智能回访量
@@ -238,12 +241,12 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int AIVisitFailCount { get; set; }
 
-		public List<VisitMeasureStatisticsModelDto> VisitMeasureStatisticsModelList { get; set; }
-	
+        public List<VisitMeasureStatisticsModelDto> VisitMeasureStatisticsModelList { get; set; }
+
     }
 
-	public class VisitMeasureStatisticsModelDto
-	{
+    public class VisitMeasureStatisticsModelDto
+    {
         /// <summary>
         /// 回访员
         /// </summary>
@@ -263,22 +266,153 @@ namespace Hotline.Share.Dtos.Order
         public int SumCount { get; set; }
     }
 
+    /// <summary>
+    /// 坐席满意度明细表
+    /// </summary>
+    public class SeatSatisfactionStatisticsListDetailDto
+    {
+        /// <summary>
+        /// 用户名
+        /// </summary>
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// id
+        /// </summary>
+        public string UserId { get; set; }
+
+        /// <summary>
+        /// 默认满意
+        /// </summary>
+        public int DefaultSatisfied { get; set; }
+        public int DefaultSatisfiedKey { get; set; } = 0;
+        public string DefaultSatisfiedRate => CalcRate(DefaultSatisfied);
+
+        /// <summary>
+        /// 非常不满意
+        /// </summary>
+        public int VeryNoSatisfied { get; set; }
+        public int VeryNoSatisfiedKey { get; set; } = 1;
+        public string VeryNoSatisfiedRate => CalcRate(VeryNoSatisfied);
+
+        /// <summary>
+        /// 不满意
+        /// </summary>
+        public int NoSatisfied { get; set; }
+        public int NoSatisfiedKey { get; set; } = 2;
+        public string NoSatisfiedRate => CalcRate(NoSatisfied);
+
+        /// <summary>
+        /// 一般
+        /// </summary>
+        public int Normal { get; set; }
+        public int NormalKey { get; set; } = 3;
+        public string NormalRate => CalcRate(Normal);
+
+        /// <summary>
+        /// 满意
+        /// </summary>
+        public int Satisfied { get; set; }
+        public int SatisfiedKey { get; set; } = 4;
+        public string SatisfiedRate => CalcRate(Satisfied);
+
+        /// <summary>
+        /// 非常满意
+        /// </summary>
+        public int VerySatisfied { get; set; }
+        public int VerySatisfiedKey { get; set; }=5;
+        public string VerySatisfiedRate => CalcRate(VerySatisfied);
+
+        /// <summary>
+        /// 未接通
+        /// </summary>
+        public int NoConnect { get; set; }
+        public int NoConnectKey { get; set; } = 6;
+        public string NoConnectRate => CalcRate(NoConnect);
+
+        /// <summary>
+        /// 未做评价
+        /// </summary>
+        public int NoEvaluate { get; set; }
+        public int NoEvaluateKey { get; set; } = 7;
+        public string NoEvaluateRate => CalcRate(NoEvaluate);
+
+        /// <summary>
+        /// 小计
+        /// </summary>
+        public int Count => DefaultSatisfied + VeryNoSatisfied + NoSatisfied + Normal + Satisfied + VerySatisfied + NoConnect + NoEvaluate;
+
+        public string CalcRate(int num)
+        {
+            int counNum = DefaultSatisfied + VeryNoSatisfied + NoSatisfied + Normal + Satisfied + VerySatisfied + NoConnect + NoEvaluate;
+            if (num == 0 || counNum == 0)
+            {
+                return "0.000%";
+            }
+            return Math.Round((num / (double)counNum) * 100, 2) + "%";
+        }
+    }
+    /// <summary>
+    /// 坐席满意度
+    /// </summary>
+    public class SeatSatisfactionStatisticsDto
+    {
+        public ESeatEvaluate? SeatEvaluate { get; set; }
+
+        public string? SeatSatisfactionName => SeatEvaluate?.GetDescription();
+
+        /// <summary>
+        /// 数量
+        /// </summary>
+        public int Count { get; set; }
+
+    }
+
+    /// <summary>
+    /// 满意度
+    /// </summary>
+    public class SeatSatisfactionStatisticsEvaluateDto
+    {
+        /// <summary>
+        /// 满意
+        /// </summary>
+        public int Satisfied { get; set; }
+
+        /// <summary>
+        /// 不满意
+        /// </summary>
+        public int NoSatisfied { get; set; }
+
+        /// <summary>
+        /// 满意率
+        /// </summary>
+        public double SatisfactionRate => CalcVerySatisfiedRate();
+
+        public double CalcVerySatisfiedRate()
+        {
+            if (Satisfied == 0 || (Satisfied + NoSatisfied) == 0)
+            {
+                return 0.000;
+            }
+            return Math.Round((Satisfied / (double)(Satisfied + NoSatisfied)) * 100, 2);
+        }
 
+    }
 
     public class VisitAndOrgSatisfactionStatisticsResultDto
-	{
-		public List<VisitAndOrgSatisfactionStatisticsDto> DataList { get; set; }
+    {
+        public List<VisitAndOrgSatisfactionStatisticsDto> DataList { get; set; }
 
-		public VisitAndOrgSatisfactionStatisticsDto CountySumModel { get; set; }
+        public VisitAndOrgSatisfactionStatisticsDto CountySumModel { get; set; }
 
-		public VisitAndOrgSatisfactionStatisticsDto CitySumModel { get; set; }
+        public VisitAndOrgSatisfactionStatisticsDto CitySumModel { get; set; }
 
-		public VisitAndOrgSatisfactionStatisticsDto SumModel { get; set; }
+        public VisitAndOrgSatisfactionStatisticsDto SumModel { get; set; }
     }
 
 
-	public class OrgVisitDetailListResp
-	{
+    public class OrgVisitDetailListResp
+    {
         /// <summary>
         /// 回访子ID
         /// </summary>
@@ -289,77 +423,77 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string OrderId { get; set; }
 
-		/// <summary>
-		/// 回访ID
-		/// </summary>
-		public string VisitId { get; set; }
-		/// <summary>
-		/// 工单编号
-		/// </summary>
-		public string No { get; set; }
+        /// <summary>
+        /// 回访ID
+        /// </summary>
+        public string VisitId { get; set; }
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        public string No { get; set; }
 
-		/// <summary>
-		/// 重办次数
-		/// </summary>
-		public int? ReTransactNum { get; set; }
+        /// <summary>
+        /// 重办次数
+        /// </summary>
+        public int? ReTransactNum { get; set; }
 
-		/// <summary>
-		/// 甄别状态
-		/// </summary>
-		public EScreenStatus? OrderScreenStatus { get; set; }
-		public string? OrderScreenStatusText => OrderScreenStatus?.GetDescription();
+        /// <summary>
+        /// 甄别状态
+        /// </summary>
+        public EScreenStatus? OrderScreenStatus { get; set; }
+        public string? OrderScreenStatusText => OrderScreenStatus?.GetDescription();
 
         /// <summary>
         /// 回访内容
         /// </summary>
         public string VisitContent { get; set; }
 
-		/// <summary>
-		/// 热点全称
-		/// </summary>
-		public string HotspotSpliceName { get; set; }
+        /// <summary>
+        /// 热点全称
+        /// </summary>
+        public string HotspotSpliceName { get; set; }
 
-		/// <summary>
-		/// 一级部门
-		/// </summary>
-		public string OrgLevelOneName { get; set; }
+        /// <summary>
+        /// 一级部门
+        /// </summary>
+        public string OrgLevelOneName { get; set; }
 
-		/// <summary>
-		/// 办结部门
-		/// </summary>
-		public string CurrentHandleOrgName { get; set; }
+        /// <summary>
+        /// 办结部门
+        /// </summary>
+        public string CurrentHandleOrgName { get; set; }
 
-		/// <summary>
-		/// 受理时间
-		/// </summary>
-		public DateTime CreationTime { get; set; }
+        /// <summary>
+        /// 受理时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
 
-		/// <summary>
-		/// 工单标题
-		/// </summary>
-		public string Title { get; set; }
+        /// <summary>
+        /// 工单标题
+        /// </summary>
+        public string Title { get; set; }
 
-		/// <summary>
-		/// 回访人
-		/// </summary>
-		public string VisitUser { get; set; }
+        /// <summary>
+        /// 回访人
+        /// </summary>
+        public string VisitUser { get; set; }
 
-		/// <summary>
-		/// 回访部门
-		/// </summary>
-		public string VisitOrgName { get; set; }
+        /// <summary>
+        /// 回访部门
+        /// </summary>
+        public string VisitOrgName { get; set; }
 
-		/// <summary>
-		/// 回访方式
-		/// </summary>
-		public EVisitType? VisitType { get; set; }
+        /// <summary>
+        /// 回访方式
+        /// </summary>
+        public EVisitType? VisitType { get; set; }
 
-		public string? VisitTypeText => VisitType?.GetDescription();
+        public string? VisitTypeText => VisitType?.GetDescription();
 
-		/// <summary>
-		/// 回访时间
-		/// </summary>
-		public DateTime? VisitTime { get; set; }
+        /// <summary>
+        /// 回访时间
+        /// </summary>
+        public DateTime? VisitTime { get; set; }
 
         /// <summary>
         /// 满意度
@@ -368,943 +502,945 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string OrgProcessingResults { get; set; }
 
-		/// <summary>
-		/// 受理内容
-		/// </summary>
-		public string Content { get; set; }
+        /// <summary>
+        /// 受理内容
+        /// </summary>
+        public string Content { get; set; }
 
-		/// <summary>
-		/// 承办意见
-		/// </summary>
-		public string FileOpinion { get; set;}
+        /// <summary>
+        /// 承办意见
+        /// </summary>
+        public string FileOpinion { get; set; }
 
-		/// <summary>
-		/// 办结时间
-		/// </summary>
-		public DateTime? FiledTime { get; set; }
+        /// <summary>
+        /// 办结时间
+        /// </summary>
+        public DateTime? FiledTime { get; set; }
 
-		/// <summary>
-		/// 接办部门
-		/// </summary>
-		public string ActualHandleOrgName { get; set; }
-	}
+        /// <summary>
+        /// 接办部门
+        /// </summary>
+        public string ActualHandleOrgName { get; set; }
+    }
 
 
 
     public class VisitAndOrgSatisfactionStatisticsDto
-	{
-		public string OrgName { get; set; }
-
-		public string OrgCode { get; set; }
-
-		public EOrgType? OrgType { get; set; }
-
-		public string OrgTypeText => OrgType?.GetDescription();
-
-		/// <summary>
-		/// 总数
-		/// </summary>
-		public int TotalSumCount { get; set; }
-
-		/// <summary>
-		/// 总满意度
-		/// </summary>
-		//public double TotalSumRate => Math.Round(VerySatisfiedRate + SatisfiedRate + RegardedAsSatisfiedRate+ DefaultSatisfiedRate, 2) ;
-		public double TotalSumRate => CalcTotalSumRate();
-
-		public double CalcTotalSumRate()
-		{
-			//if ((VerySatisfiedCount + SatisfiedCount + RegardedAsSatisfiedCount + DefaultSatisfiedCount + NoSatisfiedCount) == 0)
-			//	return 0;
-			//        return Math.Round(((double)VerySatisfiedCount + SatisfiedCount + RegardedAsSatisfiedCount + DefaultSatisfiedCount) / (VerySatisfiedCount + SatisfiedCount + RegardedAsSatisfiedCount + DefaultSatisfiedCount + NoSatisfiedCount) * 100, 2);
-			if (TotalSumCount - NoSatisfiedCount <= 0)
-				return 0;
-			return Math.Round((((double)TotalSumCount - NoSatisfiedCount) / TotalSumCount) *100,2);
+    {
+        public string OrgName { get; set; }
+
+        public string OrgCode { get; set; }
+
+        public EOrgType? OrgType { get; set; }
+
+        public string OrgTypeText => OrgType?.GetDescription();
+
+        /// <summary>
+        /// 总数
+        /// </summary>
+        public int TotalSumCount { get; set; }
+
+        /// <summary>
+        /// 总满意度
+        /// </summary>
+        //public double TotalSumRate => Math.Round(VerySatisfiedRate + SatisfiedRate + RegardedAsSatisfiedRate+ DefaultSatisfiedRate, 2) ;
+        public double TotalSumRate => CalcTotalSumRate();
+
+        public double CalcTotalSumRate()
+        {
+            //if ((VerySatisfiedCount + SatisfiedCount + RegardedAsSatisfiedCount + DefaultSatisfiedCount + NoSatisfiedCount) == 0)
+            //	return 0;
+            //        return Math.Round(((double)VerySatisfiedCount + SatisfiedCount + RegardedAsSatisfiedCount + DefaultSatisfiedCount) / (VerySatisfiedCount + SatisfiedCount + RegardedAsSatisfiedCount + DefaultSatisfiedCount + NoSatisfiedCount) * 100, 2);
+            if (TotalSumCount - NoSatisfiedCount <= 0)
+                return 0;
+            return Math.Round((((double)TotalSumCount - NoSatisfiedCount) / TotalSumCount) * 100, 2);
         }
-			
-			
+
+
 
         public string TotalSumRateText => TotalSumRate + "%";
-		/// <summary>
-		/// 非常满意数
-		/// </summary>
-		public int VerySatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 非常满意Key
-		/// </summary>
-		public string VerySatisfiedKey => "5";
-
-		/// <summary>
-		/// 非常满意率
-		/// </summary>
-		public double VerySatisfiedRate => CalcVerySatisfiedRate();
-
-		public double CalcVerySatisfiedRate()
-		{
-			if (VerySatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((VerySatisfiedCount / (double)TotalSumCount) * 100, 2);
-		}
-		public string VerySatisfiedRateText => VerySatisfiedRate + "%";
-
-		/// <summary>
-		/// 满意数
-		/// </summary>
-		public int SatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 满意Key
-		/// </summary>
-		public string SatisfiedKey => "4";
-
-		/// <summary>
-		/// 满意率
-		/// </summary>
-		public double SatisfiedRate => CalcSatisfiedRate();
-
-
-		public double CalcSatisfiedRate()
-		{
-			if (SatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((SatisfiedCount / (double)TotalSumCount) * 100, 2);
-		}
-
-		public string SatisfiedRateText => SatisfiedRate + "%";
-		/// <summary>
-		/// 视为满意数
-		/// </summary>
-		public int RegardedAsSatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 视为满意Key
-		/// </summary>
-		public string RegardedAsSatisfiedKey => "-1";
-
-		/// <summary>
-		/// 视为满意率
-		/// </summary>
-		public double RegardedAsSatisfiedRate => CalcRegardedAsSatisfiedRate();
-
-		public double CalcRegardedAsSatisfiedRate()
-		{
-            if (RegardedAsSatisfiedCount == 0 || TotalSumCount == 0)
+        /// <summary>
+        /// 非常满意数
+        /// </summary>
+        public int VerySatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 非常满意Key
+        /// </summary>
+        public string VerySatisfiedKey => "5";
+
+        /// <summary>
+        /// 非常满意率
+        /// </summary>
+        public double VerySatisfiedRate => CalcVerySatisfiedRate();
+
+        public double CalcVerySatisfiedRate()
+        {
+            if (VerySatisfiedCount == 0 || TotalSumCount == 0)
             {
                 return 0;
             }
-            return Math.Round((RegardedAsSatisfiedCount / (double)TotalSumCount) * 100, 2);
+            return Math.Round((VerySatisfiedCount / (double)TotalSumCount) * 100, 2);
         }
-		public string RegardedAsSatisfiedRateText => RegardedAsSatisfiedRate + "%";
-		/// <summary>
-		/// 默认满意数
-		/// </summary>
-		public int DefaultSatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 默认满意Key
-		/// </summary>
-		public string DefaultSatisfiedKey => "0";
-
-		/// <summary>
-		/// 默认满意率
-		/// </summary>
-		public double DefaultSatisfiedRate => CalcDefaultSatisfiedRate();
-
-		public double CalcDefaultSatisfiedRate()
-		{
-            if (DefaultSatisfiedCount == 0 || TotalSumCount == 0)
+        public string VerySatisfiedRateText => VerySatisfiedRate + "%";
+
+        /// <summary>
+        /// 满意数
+        /// </summary>
+        public int SatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 满意Key
+        /// </summary>
+        public string SatisfiedKey => "4";
+
+        /// <summary>
+        /// 满意率
+        /// </summary>
+        public double SatisfiedRate => CalcSatisfiedRate();
+
+
+        public double CalcSatisfiedRate()
+        {
+            if (SatisfiedCount == 0 || TotalSumCount == 0)
             {
                 return 0;
             }
-            return Math.Round((DefaultSatisfiedCount / (double)TotalSumCount) * 100, 2);
+            return Math.Round((SatisfiedCount / (double)TotalSumCount) * 100, 2);
         }
-		public string DefaultSatisfiedRateText => DefaultSatisfiedRate + "%";
-
-		/// <summary>
-		/// 不满意数
-		/// </summary>
-		public int NoSatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 不满意Key
-		/// </summary>
-		public string NoSatisfiedKey => "2";
-
-		/// <summary>
-		/// 不满意率
-		/// </summary>
-		public double NoSatisfiedRate => CalcNoSatisfiedRate();
-
-
-		public double CalcNoSatisfiedRate()
-		{
-			if (NoSatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((NoSatisfiedCount / (double)TotalSumCount) * 100, 2);
-		}
-		public string NoSatisfiedRateText => NoSatisfiedRate + "%";
-
-
-		/// <summary>
-		/// 未做评价数
-		/// </summary>
-		public int NoEvaluateCount { get; set; }
-
-		/// <summary>
-		/// 未做评价Key
-		/// </summary>
-		public string NoEvaluateKey => "7";
-
-		/// <summary>
-		/// 未做评价率
-		/// </summary>
-		public double NoEvaluateRate => CalcNoEvaluateRate();
-
-
-		public double CalcNoEvaluateRate()
-		{
-			if (NoEvaluateCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((NoEvaluateCount / (double)TotalSumCount) * 100, 2);
-		}
-
-		public string NoEvaluateRateText => NoEvaluateRate + "%";
-
-		/// <summary>
-		/// 未接通数
-		/// </summary>
-		public int NoPutThroughCount { get; set; }
-
-		/// <summary>
-		/// 未接通Key
-		/// </summary>
-		public string NoPutThroughKey => "6";
-
-		/// <summary>
-		/// 未接通率
-		/// </summary>
-		public double NoPutThroughRate => CalcNoPutThroughRate();
 
+        public string SatisfiedRateText => SatisfiedRate + "%";
+        /// <summary>
+        /// 视为满意数
+        /// </summary>
+        public int RegardedAsSatisfiedCount { get; set; }
 
-        public double CalcNoPutThroughRate()
-		{
-            if (NoPutThroughCount == 0 || TotalSumCount == 0)
+        /// <summary>
+        /// 视为满意Key
+        /// </summary>
+        public string RegardedAsSatisfiedKey => "-1";
+
+        /// <summary>
+        /// 视为满意率
+        /// </summary>
+        public double RegardedAsSatisfiedRate => CalcRegardedAsSatisfiedRate();
+
+        public double CalcRegardedAsSatisfiedRate()
+        {
+            if (RegardedAsSatisfiedCount == 0 || TotalSumCount == 0)
             {
                 return 0;
             }
-            return Math.Round((NoPutThroughCount / (double)TotalSumCount) * 100, 2);
+            return Math.Round((RegardedAsSatisfiedCount / (double)TotalSumCount) * 100, 2);
         }
-        public string NoPutThroughRateText => NoPutThroughRate + "%";
-	}
-
-	public class BiOrderSendVo
-	{
-		public string UserId { get; set; }
-		public string UserName { get; set; }
-
-		/// <summary>
-		/// 派单量
-		/// </summary>
-		public int SendOrderNum { get; set; }
-
-		/// <summary>
-		/// 待派单量
-		/// </summary>
-		public int NoSendOrderNum { get; set; }
-
-		/// <summary>
-		/// 重办量
-		/// </summary>
-		public int ReSendOrderNum { get; set; }
-
-		public string AccuracyRate { get; set; }
-	}
-
-	public class OrderReTransactVo
-	{
-		/// <summary>
-		/// 时间
-		/// </summary>
-		public string Time { get; set; }
-
-		/// <summary>
-		/// 部门名称
-		/// </summary>
-		public string OrgName { get; set; }
-
-		/// <summary>
-		/// 部门id
-		/// </summary>
-		public string OrgId { get; set; }
-
-		/// <summary>
-		/// 次数
-		/// </summary>
-		public int Num { get; set; }
-	}
-
-	public class SecondaryHandlingVo
-	{
-		/// <summary>
-		/// 部门名称
-		/// </summary>
-		public string OrgName { get; set; }
-
-
-		/// <summary>
-		/// 部门id
-		/// </summary>
-		public string OrgId { get; set; }
-
-		/// <summary>
-		/// 次数
-		/// </summary>
-		public int Num { get; set; }
-	}
-
-	public class SecondaryHandlingSatisfactionVo
-	{
-		/// <summary>
-		/// 部门名称
-		/// </summary>
-		public string OrgName { get; set; }
-
-
-		/// <summary>
-		/// 部门id
-		/// </summary>
-		public string OrgId { get; set; }
-
-		/// <summary>
-		/// 部门类型
-		/// </summary>
-		public EOrgType OrgType { get; set; }
-
-		public string OrgTypeText => OrgType.GetDescription();
-
-		/// <summary>
-		/// 总数
-		/// </summary>
-		public int TotalSumCount { get; set; }
-
-		/// <summary>
-		/// 总满意度
-		/// </summary>
-		public double TotalSumRate => Math.Round(VerySatisfiedRate + SatisfiedRate + RegardedAsSatisfiedRate + DefaultSatisfiedRate, 2);
-
-		public string TotalSumRateText => TotalSumRate + "%";
-
-		/// <summary>
-		/// 非常满意数
-		/// </summary>
-		public int VerySatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 非常满意率
-		/// </summary>
-		public double VerySatisfiedRate => CalcVerySatisfiedRate();
-
-		public double CalcVerySatisfiedRate()
-		{
-			if (VerySatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0.000;
-			}
-			return Math.Round((VerySatisfiedCount / (double)TotalSumCount) * 100, 2);
-		}
-
-		public string VerySatisfiedRateText => VerySatisfiedRate + "%";
-
-		/// <summary>
-		/// 满意数
-		/// </summary>
-		public int SatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 满意率
-		/// </summary>
-		public double SatisfiedRate => CalcSatisfiedRate();
-
-
-		public double CalcSatisfiedRate()
-		{
-			if (SatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0.000;
-			}
-			return Math.Round((SatisfiedCount / (double)TotalSumCount) * 100, 3);
-		}
-		public string SatisfiedRateText => SatisfiedRate + "%";
-
-		/// <summary>
-		/// 视为满意数
-		/// </summary>
-		public int RegardedAsSatisfiedCount { get; set; }
-
-
-		/// <summary>
-		/// 视为满意率
-		/// </summary>
-		public double RegardedAsSatisfiedRate => CalcRegardedAsSatisfiedRate();
-
-		public double CalcRegardedAsSatisfiedRate()
-		{
-			if (RegardedAsSatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0.000;
-			}
-			return Math.Round((RegardedAsSatisfiedCount / (double)TotalSumCount) * 100, 3);
-		}
-		public string RegardedAsSatisfiedRateText => RegardedAsSatisfiedRate + "%";
-
-		/// <summary>
-		/// 默认满意数
-		/// </summary>
-		public int DefaultSatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 默认满意率
-		/// </summary>
-		public double DefaultSatisfiedRate => CalcDefaultSatisfiedRate();
-
-		public double CalcDefaultSatisfiedRate()
-		{
-			if (DefaultSatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0.000;
-			}
-			return Math.Round((DefaultSatisfiedCount / (double)TotalSumCount) * 100, 3);
-		}
-
-		public string DefaultSatisfiedRateText => DefaultSatisfiedRate + "%";
-
-		/// <summary>
-		/// 不满意数
-		/// </summary>
-		public int NoSatisfiedCount { get; set; }
-		/// <summary>
-		/// 不满意率
-		/// </summary>
-		public double NoSatisfiedRate => CalcNoSatisfiedRate();
-
-
-		public double CalcNoSatisfiedRate()
-		{
-			if (NoSatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0.000;
-			}
-			return Math.Round((NoSatisfiedCount / (double)TotalSumCount) * 100, 3);
-		}
-
-		public string NoSatisfiedRateText => NoSatisfiedRate + "%";
-
-
-
-		/// <summary>
-		/// 未做评价数
-		/// </summary>
-		public int NoEvaluateCount { get; set; }
-
-		/// <summary>
-		/// 未做评价率
-		/// </summary>
-		public double NoEvaluateRate => CalcNoEvaluateRate();
-
-
-		public double CalcNoEvaluateRate()
-		{
-			if (NoEvaluateCount == 0 || TotalSumCount == 0)
-			{
-				return 0.000;
-			}
-			return Math.Round((NoEvaluateCount / (double)TotalSumCount) * 100, 3);
-		}
-		public string NoEvaluateRateText => NoEvaluateRate + "%";
-
-
-		/// <summary>
-		/// 未接通数
-		/// </summary>
-		public int NoPutThroughCount { get; set; }
-
-		/// <summary>
-		/// 未接通率
-		/// </summary>
-		public double NoPutThroughRate => CalcNoPutThroughRate();
-
-
-		public double CalcNoPutThroughRate()
-		{
-			if (NoPutThroughCount == 0 || TotalSumCount == 0)
-			{
-				return 0.000;
-			}
-			return Math.Round((NoPutThroughCount / (double)TotalSumCount) * 100, 3);
-		}
-
-		public string NoPutThroughRateText => NoPutThroughRate + "%";
-
-	}
-
-	public class OrderSourceVo
-	{
-
-		/// <summary>
-		/// 信件来源
-		/// </summary>
-		public string Source { get; set; }
-
-		/// <summary>
-		/// 数量
-		/// </summary>
-		public int Num { get; set; }
-
-		/// <summary>
-		/// 总数
-		/// </summary>
-		public int TotalSumCount { get; set; }
-
-		/// <summary>
-		/// 占比
-		/// </summary>
-		public double Rate => GetRate();
-
-		public double GetRate()
-		{
-			if (Num == 0 || TotalSumCount == 0)
-			{
-				return 0.000;
-			}
-			return Math.Round((Num / (double)TotalSumCount) * 100, 2) ;
-		}
-
-		public string RateText => GetRate() + "%";
-	}
-	public class VisitAndHotspotSatisfactionStatisticsDto
-	{
-		public string HotspotId { get; set; }
-
-		public string HotspotName { get; set; }
-
-		/// <summary>
-		/// 总数
-		/// </summary>
-		public int TotalSumCount { get; set; }
-
-		/// <summary>
-		/// 总满意度
-		/// </summary>
-		public double TotalSumRate => Math.Round(VerySatisfiedRate + SatisfiedRate + RegardedAsSatisfiedRate + DefaultSatisfiedRate, 2);
-
-		public string TotalSumRateText => TotalSumRate + "%";
-		/// <summary>
-		/// 非常满意数
-		/// </summary>
-		public int VerySatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 非常满意Key
-		/// </summary>
-		public string VerySatisfiedKey => "5";
-
-		/// <summary>
-		/// 非常满意率
-		/// </summary>
-		public double VerySatisfiedRate => CalcVerySatisfiedRate();
-
-		public double CalcVerySatisfiedRate()
-		{
-			if (VerySatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((VerySatisfiedCount / (double)TotalSumCount) * 100, 2);
-		}
-		public string VerySatisfiedRateText => VerySatisfiedRate + "%";
-
-		/// <summary>
-		/// 满意数
-		/// </summary>
-		public int SatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 满意Key
-		/// </summary>
-		public string SatisfiedKey => "4";
-
-		/// <summary>
-		/// 满意率
-		/// </summary>
-		public double SatisfiedRate => CalcSatisfiedRate();
-
-
-		public double CalcSatisfiedRate()
-		{
-			if (SatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((SatisfiedCount / (double)TotalSumCount) * 100, 2);
-		}
-
-		public string SatisfiedRateText => SatisfiedRate + "%";
-		/// <summary>
-		/// 视为满意数
-		/// </summary>
-		public int RegardedAsSatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 视为满意Key
-		/// </summary>
-		public string RegardedAsSatisfiedKey => "-1";
-
-		/// <summary>
-		/// 视为满意率
-		/// </summary>
-		public double RegardedAsSatisfiedRate => CalcRegardedAsSatisfiedRate();
-
-		public double CalcRegardedAsSatisfiedRate()
-		{
-			if (RegardedAsSatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((RegardedAsSatisfiedCount / (double)TotalSumCount) * 100, 2);
-		}
-		public string RegardedAsSatisfiedRateText => RegardedAsSatisfiedRate + "%";
-		/// <summary>
-		/// 默认满意数
-		/// </summary>
-		public int DefaultSatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 默认满意Key
-		/// </summary>
-		public string DefaultSatisfiedKey => "0";
-
-		/// <summary>
-		/// 默认满意率
-		/// </summary>
-		public double DefaultSatisfiedRate => CalcDefaultSatisfiedRate();
-
-		public double CalcDefaultSatisfiedRate()
-		{
-			if (DefaultSatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((DefaultSatisfiedCount / (double)TotalSumCount) * 100, 2);
-		}
-		public string DefaultSatisfiedRateText => DefaultSatisfiedRate + "%";
-
-		/// <summary>
-		/// 不满意数
-		/// </summary>
-		public int NoSatisfiedCount { get; set; }
-
-		/// <summary>
-		/// 不满意Key
-		/// </summary>
-		public string NoSatisfiedKey => "2";
-
-		/// <summary>
-		/// 不满意率
-		/// </summary>
-		public double NoSatisfiedRate => CalcNoSatisfiedRate();
-
-
-		public double CalcNoSatisfiedRate()
-		{
-			if (NoSatisfiedCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((NoSatisfiedCount / (double)TotalSumCount) * 100, 2);
-		}
-		public string NoSatisfiedRateText => NoSatisfiedRate + "%";
-
-
-		/// <summary>
-		/// 未做评价数
-		/// </summary>
-		public int NoEvaluateCount { get; set; }
-
-		/// <summary>
-		/// 未做评价Key
-		/// </summary>
-		public string NoEvaluateKey => "7";
-
-		/// <summary>
-		/// 未做评价率
-		/// </summary>
-		public double NoEvaluateRate => CalcNoEvaluateRate();
-
-
-		public double CalcNoEvaluateRate()
-		{
-			if (NoEvaluateCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((NoEvaluateCount / (double)TotalSumCount) * 100, 2);
-		}
-
-		public string NoEvaluateRateText => NoEvaluateRate + "%";
-
-		/// <summary>
-		/// 未接通数
-		/// </summary>
-		public int NoPutThroughCount { get; set; }
-
-		/// <summary>
-		/// 未接通Key
-		/// </summary>
-		public string NoPutThroughKey => "6";
-
-		/// <summary>
-		/// 未接通率
-		/// </summary>
-		public double NoPutThroughRate => CalcNoPutThroughRate();
-
-
-		public double CalcNoPutThroughRate()
-		{
-			if (NoPutThroughCount == 0 || TotalSumCount == 0)
-			{
-				return 0;
-			}
-			return Math.Round((NoPutThroughCount / (double)TotalSumCount) * 100, 2);
-		}
-		public string NoPutThroughRateText => NoPutThroughRate + "%";
-	}
-	public class OrderSourceHeaderVo {
-		/// <summary>
-		/// 日期
-		/// </summary>
-		public string? Time { get; set; }
-
-		/// <summary>
-		/// 日期(不显示)
-		/// </summary>
-		public string? TimeSort { get; set; }
-
-		/// <summary>
-		/// 小计
-		/// </summary>
-		public int? Subtotal => Phone + Web + Rests + Created + WeChat + App + WisdomYB + Platform + Platform12328 + MayorAndNetizens + MediaYB + Platform12345 + Interaction + ServiceYB + CityTransfer + Platform110 + NoService + Iyb;
-
-		/// <summary>
-		/// 电话
-		/// </summary>
-		public int? Phone { get; set; }
-
-		/// <summary>
-		/// 因特网
-		/// </summary>
-		public int? Web { get; set; }
-
-		/// <summary>
-		/// 其他
-		/// </summary>
-		public int? Rests { get; set; }
-
-		/// <summary>
-		/// 自建
-		/// </summary>
-		public int? Created { get; set; }
-
-		/// <summary>
-		/// 微信
-		/// </summary>
-		public int? WeChat { get; set; }
-
-		/// <summary>
-		/// APP
-		/// </summary>
-		public int? App { get; set; }
-
-		/// <summary>
-		/// 智慧宜宾
-		/// </summary>
-		public int? WisdomYB { get; set; }
-
-		/// <summary>
-		/// 综治平台
-		/// </summary>
-		public int? Platform { get; set; }
-
-		/// <summary>
-		/// 省12328平台
-		/// </summary>
-		public int? Platform12328 { get; set; }
-
-		/// <summary>
-		/// 市长和网民
-		/// </summary>
-		public int? MayorAndNetizens { get; set; }
-
-		/// <summary>
-		/// 宜宾融媒体
-		/// </summary>
-		public int? MediaYB { get; set; }
-
-		/// <summary>
-		/// 省12345平台
-		/// </summary>
-		public int? Platform12345 { get; set; }
-
-		/// <summary>
-		/// 省政民互动
-		/// </summary>
-		public int? Interaction { get; set; }
-
-		/// <summary>
-		/// 宜办事
-		/// </summary>
-		public int? ServiceYB { get; set; }
-
-		/// <summary>
-		/// 市州互转
-		/// </summary>
-		public int? CityTransfer { get; set; }
-
-		/// <summary>
-		/// 宜宾110平台
-		/// </summary>
-		public int? Platform110 { get; set; }
-
-		/// <summary>
-		/// 办不成事反映窗口
-		/// </summary>
-		public int? NoService { get; set; }
-
-		// <summary>
-		/// i宜宾
-		/// </summary>
-		public int? Iyb { get; set; }
-	}
-
-
-	public class OrderScreenApplyVo
-	{
-		/// <summary>
-		/// 提起时间
-		/// </summary>
-		public string ApplyTime { get; set; }
-
-		/// <summary>
-		/// 提起人
-		/// </summary>
-		public string ApplyUserName { get; set; }
-
-		/// <summary>
-		/// 部门名称
-		/// </summary>
-		public string ApplyOrgName { get; set; }
-
-		/// <summary>
-		/// 数量
-		/// </summary>
-		public int ApplyNum { get; set; }
-	}
-
-	public class OrderScreenAuditVo { 
-	
-		/// <summary>
-		/// 审批人
-		/// </summary>
-		public string AuditName { get; set; }
-
-		/// <summary>
-		/// 审批数量
-		/// </summary>
-		public int AuditNum { get; set; }
-
-		/// <summary>
-		/// 退回数量
-		/// </summary>
-		public int AuditBackNum { get; set; }
-
-		/// <summary>
-		/// 小计
-		/// </summary>
-		public int Total => AuditNum + AuditBackNum;
-	}
-
-	public class OrderCenterAcceptVo: OrderCenterBaseVo
-	{
-		/// <summary>
-		/// 日期
-		/// </summary>
-		public string Time { get; set; }
-	}
-
-	public class OrderCenterAcceptUserVo : OrderCenterBaseVo
-	{
-		/// <summary>
-		/// 值班坐席
-		/// </summary>
-		public string AcceptUserName { get; set; }
-	}
-
-	public class OrderCenterAcceptHourVo : OrderCenterBaseVo
-	{
-		/// <summary>
-		/// 时间段
-		/// </summary>
-		public string Hour { get; set; }
-	}
-
-	public class OrderCenterBaseVo
-	{
-		/// <summary>
-		/// 受理总件
-		/// </summary>
-		public int AcceptNum { get; set; }
-
-		/// <summary>
-		/// 有效件
-		/// </summary>
-		public int ValidNum { get; set; }
-
-		/// <summary>
-		/// 重复件
-		/// </summary>
-		public int RepetitionNum { get; set; }
-
-		/// <summary>
-		/// 无效件
-		/// </summary>
-		public int InvalidNum { get; set; }
-
-		/// <summary>
-		/// 已办件
-		/// </summary>
-		public int HandleNum { get; set; }
-
-		/// <summary>
-		/// 待办件
-		/// </summary>
-		public int NoHandleNum { get; set; }
-
-		/// <summary>
-		/// 退回件
-		/// </summary>
-		public int BackNum { get; set; }
-
-		/// <summary>
-		/// 值班坐席
-		/// </summary>
-		public int DutyDeskNum { get; set; }
-	}
+        public string RegardedAsSatisfiedRateText => RegardedAsSatisfiedRate + "%";
+        /// <summary>
+        /// 默认满意数
+        /// </summary>
+        public int DefaultSatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 默认满意Key
+        /// </summary>
+        public string DefaultSatisfiedKey => "0";
+
+        /// <summary>
+        /// 默认满意率
+        /// </summary>
+        public double DefaultSatisfiedRate => CalcDefaultSatisfiedRate();
+
+        public double CalcDefaultSatisfiedRate()
+        {
+            if (DefaultSatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((DefaultSatisfiedCount / (double)TotalSumCount) * 100, 2);
+        }
+        public string DefaultSatisfiedRateText => DefaultSatisfiedRate + "%";
+
+        /// <summary>
+        /// 不满意数
+        /// </summary>
+        public int NoSatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 不满意Key
+        /// </summary>
+        public string NoSatisfiedKey => "2";
+
+        /// <summary>
+        /// 不满意率
+        /// </summary>
+        public double NoSatisfiedRate => CalcNoSatisfiedRate();
+
+
+        public double CalcNoSatisfiedRate()
+        {
+            if (NoSatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((NoSatisfiedCount / (double)TotalSumCount) * 100, 2);
+        }
+        public string NoSatisfiedRateText => NoSatisfiedRate + "%";
+
+
+        /// <summary>
+        /// 未做评价数
+        /// </summary>
+        public int NoEvaluateCount { get; set; }
+
+        /// <summary>
+        /// 未做评价Key
+        /// </summary>
+        public string NoEvaluateKey => "7";
+
+        /// <summary>
+        /// 未做评价率
+        /// </summary>
+        public double NoEvaluateRate => CalcNoEvaluateRate();
+
+
+        public double CalcNoEvaluateRate()
+        {
+            if (NoEvaluateCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((NoEvaluateCount / (double)TotalSumCount) * 100, 2);
+        }
+
+        public string NoEvaluateRateText => NoEvaluateRate + "%";
+
+        /// <summary>
+        /// 未接通数
+        /// </summary>
+        public int NoPutThroughCount { get; set; }
+
+        /// <summary>
+        /// 未接通Key
+        /// </summary>
+        public string NoPutThroughKey => "6";
+
+        /// <summary>
+        /// 未接通率
+        /// </summary>
+        public double NoPutThroughRate => CalcNoPutThroughRate();
+
+
+        public double CalcNoPutThroughRate()
+        {
+            if (NoPutThroughCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((NoPutThroughCount / (double)TotalSumCount) * 100, 2);
+        }
+        public string NoPutThroughRateText => NoPutThroughRate + "%";
+    }
+
+    public class BiOrderSendVo
+    {
+        public string UserId { get; set; }
+        public string UserName { get; set; }
+
+        /// <summary>
+        /// 派单量
+        /// </summary>
+        public int SendOrderNum { get; set; }
+
+        /// <summary>
+        /// 待派单量
+        /// </summary>
+        public int NoSendOrderNum { get; set; }
+
+        /// <summary>
+        /// 重办量
+        /// </summary>
+        public int ReSendOrderNum { get; set; }
+
+        public string AccuracyRate { get; set; }
+    }
+
+    public class OrderReTransactVo
+    {
+        /// <summary>
+        /// 时间
+        /// </summary>
+        public string Time { get; set; }
+
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string OrgName { get; set; }
+
+        /// <summary>
+        /// 部门id
+        /// </summary>
+        public string OrgId { get; set; }
+
+        /// <summary>
+        /// 次数
+        /// </summary>
+        public int Num { get; set; }
+    }
+
+    public class SecondaryHandlingVo
+    {
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string OrgName { get; set; }
+
+
+        /// <summary>
+        /// 部门id
+        /// </summary>
+        public string OrgId { get; set; }
+
+        /// <summary>
+        /// 次数
+        /// </summary>
+        public int Num { get; set; }
+    }
+
+    public class SecondaryHandlingSatisfactionVo
+    {
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string OrgName { get; set; }
+
+
+        /// <summary>
+        /// 部门id
+        /// </summary>
+        public string OrgId { get; set; }
+
+        /// <summary>
+        /// 部门类型
+        /// </summary>
+        public EOrgType OrgType { get; set; }
+
+        public string OrgTypeText => OrgType.GetDescription();
+
+        /// <summary>
+        /// 总数
+        /// </summary>
+        public int TotalSumCount { get; set; }
+
+        /// <summary>
+        /// 总满意度
+        /// </summary>
+        public double TotalSumRate => Math.Round(VerySatisfiedRate + SatisfiedRate + RegardedAsSatisfiedRate + DefaultSatisfiedRate, 2);
+
+        public string TotalSumRateText => TotalSumRate + "%";
+
+        /// <summary>
+        /// 非常满意数
+        /// </summary>
+        public int VerySatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 非常满意率
+        /// </summary>
+        public double VerySatisfiedRate => CalcVerySatisfiedRate();
+
+        public double CalcVerySatisfiedRate()
+        {
+            if (VerySatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0.000;
+            }
+            return Math.Round((VerySatisfiedCount / (double)TotalSumCount) * 100, 2);
+        }
+
+        public string VerySatisfiedRateText => VerySatisfiedRate + "%";
+
+        /// <summary>
+        /// 满意数
+        /// </summary>
+        public int SatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 满意率
+        /// </summary>
+        public double SatisfiedRate => CalcSatisfiedRate();
+
+
+        public double CalcSatisfiedRate()
+        {
+            if (SatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0.000;
+            }
+            return Math.Round((SatisfiedCount / (double)TotalSumCount) * 100, 3);
+        }
+        public string SatisfiedRateText => SatisfiedRate + "%";
+
+        /// <summary>
+        /// 视为满意数
+        /// </summary>
+        public int RegardedAsSatisfiedCount { get; set; }
+
+
+        /// <summary>
+        /// 视为满意率
+        /// </summary>
+        public double RegardedAsSatisfiedRate => CalcRegardedAsSatisfiedRate();
+
+        public double CalcRegardedAsSatisfiedRate()
+        {
+            if (RegardedAsSatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0.000;
+            }
+            return Math.Round((RegardedAsSatisfiedCount / (double)TotalSumCount) * 100, 3);
+        }
+        public string RegardedAsSatisfiedRateText => RegardedAsSatisfiedRate + "%";
+
+        /// <summary>
+        /// 默认满意数
+        /// </summary>
+        public int DefaultSatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 默认满意率
+        /// </summary>
+        public double DefaultSatisfiedRate => CalcDefaultSatisfiedRate();
+
+        public double CalcDefaultSatisfiedRate()
+        {
+            if (DefaultSatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0.000;
+            }
+            return Math.Round((DefaultSatisfiedCount / (double)TotalSumCount) * 100, 3);
+        }
+
+        public string DefaultSatisfiedRateText => DefaultSatisfiedRate + "%";
+
+        /// <summary>
+        /// 不满意数
+        /// </summary>
+        public int NoSatisfiedCount { get; set; }
+        /// <summary>
+        /// 不满意率
+        /// </summary>
+        public double NoSatisfiedRate => CalcNoSatisfiedRate();
+
+
+        public double CalcNoSatisfiedRate()
+        {
+            if (NoSatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0.000;
+            }
+            return Math.Round((NoSatisfiedCount / (double)TotalSumCount) * 100, 3);
+        }
+
+        public string NoSatisfiedRateText => NoSatisfiedRate + "%";
+
+
+
+        /// <summary>
+        /// 未做评价数
+        /// </summary>
+        public int NoEvaluateCount { get; set; }
+
+        /// <summary>
+        /// 未做评价率
+        /// </summary>
+        public double NoEvaluateRate => CalcNoEvaluateRate();
+
+
+        public double CalcNoEvaluateRate()
+        {
+            if (NoEvaluateCount == 0 || TotalSumCount == 0)
+            {
+                return 0.000;
+            }
+            return Math.Round((NoEvaluateCount / (double)TotalSumCount) * 100, 3);
+        }
+        public string NoEvaluateRateText => NoEvaluateRate + "%";
+
+
+        /// <summary>
+        /// 未接通数
+        /// </summary>
+        public int NoPutThroughCount { get; set; }
+
+        /// <summary>
+        /// 未接通率
+        /// </summary>
+        public double NoPutThroughRate => CalcNoPutThroughRate();
+
+
+        public double CalcNoPutThroughRate()
+        {
+            if (NoPutThroughCount == 0 || TotalSumCount == 0)
+            {
+                return 0.000;
+            }
+            return Math.Round((NoPutThroughCount / (double)TotalSumCount) * 100, 3);
+        }
+
+        public string NoPutThroughRateText => NoPutThroughRate + "%";
+
+    }
+
+    public class OrderSourceVo
+    {
+
+        /// <summary>
+        /// 信件来源
+        /// </summary>
+        public string Source { get; set; }
+
+        /// <summary>
+        /// 数量
+        /// </summary>
+        public int Num { get; set; }
+
+        /// <summary>
+        /// 总数
+        /// </summary>
+        public int TotalSumCount { get; set; }
+
+        /// <summary>
+        /// 占比
+        /// </summary>
+        public double Rate => GetRate();
+
+        public double GetRate()
+        {
+            if (Num == 0 || TotalSumCount == 0)
+            {
+                return 0.000;
+            }
+            return Math.Round((Num / (double)TotalSumCount) * 100, 2);
+        }
+
+        public string RateText => GetRate() + "%";
+    }
+    public class VisitAndHotspotSatisfactionStatisticsDto
+    {
+        public string HotspotId { get; set; }
+
+        public string HotspotName { get; set; }
+
+        /// <summary>
+        /// 总数
+        /// </summary>
+        public int TotalSumCount { get; set; }
+
+        /// <summary>
+        /// 总满意度
+        /// </summary>
+        public double TotalSumRate => Math.Round(VerySatisfiedRate + SatisfiedRate + RegardedAsSatisfiedRate + DefaultSatisfiedRate, 2);
+
+        public string TotalSumRateText => TotalSumRate + "%";
+        /// <summary>
+        /// 非常满意数
+        /// </summary>
+        public int VerySatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 非常满意Key
+        /// </summary>
+        public string VerySatisfiedKey => "5";
+
+        /// <summary>
+        /// 非常满意率
+        /// </summary>
+        public double VerySatisfiedRate => CalcVerySatisfiedRate();
+
+        public double CalcVerySatisfiedRate()
+        {
+            if (VerySatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((VerySatisfiedCount / (double)TotalSumCount) * 100, 2);
+        }
+        public string VerySatisfiedRateText => VerySatisfiedRate + "%";
+
+        /// <summary>
+        /// 满意数
+        /// </summary>
+        public int SatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 满意Key
+        /// </summary>
+        public string SatisfiedKey => "4";
+
+        /// <summary>
+        /// 满意率
+        /// </summary>
+        public double SatisfiedRate => CalcSatisfiedRate();
+
+
+        public double CalcSatisfiedRate()
+        {
+            if (SatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((SatisfiedCount / (double)TotalSumCount) * 100, 2);
+        }
+
+        public string SatisfiedRateText => SatisfiedRate + "%";
+        /// <summary>
+        /// 视为满意数
+        /// </summary>
+        public int RegardedAsSatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 视为满意Key
+        /// </summary>
+        public string RegardedAsSatisfiedKey => "-1";
+
+        /// <summary>
+        /// 视为满意率
+        /// </summary>
+        public double RegardedAsSatisfiedRate => CalcRegardedAsSatisfiedRate();
+
+        public double CalcRegardedAsSatisfiedRate()
+        {
+            if (RegardedAsSatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((RegardedAsSatisfiedCount / (double)TotalSumCount) * 100, 2);
+        }
+        public string RegardedAsSatisfiedRateText => RegardedAsSatisfiedRate + "%";
+        /// <summary>
+        /// 默认满意数
+        /// </summary>
+        public int DefaultSatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 默认满意Key
+        /// </summary>
+        public string DefaultSatisfiedKey => "0";
+
+        /// <summary>
+        /// 默认满意率
+        /// </summary>
+        public double DefaultSatisfiedRate => CalcDefaultSatisfiedRate();
+
+        public double CalcDefaultSatisfiedRate()
+        {
+            if (DefaultSatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((DefaultSatisfiedCount / (double)TotalSumCount) * 100, 2);
+        }
+        public string DefaultSatisfiedRateText => DefaultSatisfiedRate + "%";
+
+        /// <summary>
+        /// 不满意数
+        /// </summary>
+        public int NoSatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 不满意Key
+        /// </summary>
+        public string NoSatisfiedKey => "2";
+
+        /// <summary>
+        /// 不满意率
+        /// </summary>
+        public double NoSatisfiedRate => CalcNoSatisfiedRate();
+
+
+        public double CalcNoSatisfiedRate()
+        {
+            if (NoSatisfiedCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((NoSatisfiedCount / (double)TotalSumCount) * 100, 2);
+        }
+        public string NoSatisfiedRateText => NoSatisfiedRate + "%";
+
+
+        /// <summary>
+        /// 未做评价数
+        /// </summary>
+        public int NoEvaluateCount { get; set; }
+
+        /// <summary>
+        /// 未做评价Key
+        /// </summary>
+        public string NoEvaluateKey => "7";
+
+        /// <summary>
+        /// 未做评价率
+        /// </summary>
+        public double NoEvaluateRate => CalcNoEvaluateRate();
+
+
+        public double CalcNoEvaluateRate()
+        {
+            if (NoEvaluateCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((NoEvaluateCount / (double)TotalSumCount) * 100, 2);
+        }
+
+        public string NoEvaluateRateText => NoEvaluateRate + "%";
+
+        /// <summary>
+        /// 未接通数
+        /// </summary>
+        public int NoPutThroughCount { get; set; }
+
+        /// <summary>
+        /// 未接通Key
+        /// </summary>
+        public string NoPutThroughKey => "6";
+
+        /// <summary>
+        /// 未接通率
+        /// </summary>
+        public double NoPutThroughRate => CalcNoPutThroughRate();
+
+
+        public double CalcNoPutThroughRate()
+        {
+            if (NoPutThroughCount == 0 || TotalSumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((NoPutThroughCount / (double)TotalSumCount) * 100, 2);
+        }
+        public string NoPutThroughRateText => NoPutThroughRate + "%";
+    }
+    public class OrderSourceHeaderVo
+    {
+        /// <summary>
+        /// 日期
+        /// </summary>
+        public string? Time { get; set; }
+
+        /// <summary>
+        /// 日期(不显示)
+        /// </summary>
+        public string? TimeSort { get; set; }
+
+        /// <summary>
+        /// 小计
+        /// </summary>
+        public int? Subtotal => Phone + Web + Rests + Created + WeChat + App + WisdomYB + Platform + Platform12328 + MayorAndNetizens + MediaYB + Platform12345 + Interaction + ServiceYB + CityTransfer + Platform110 + NoService + Iyb;
+
+        /// <summary>
+        /// 电话
+        /// </summary>
+        public int? Phone { get; set; }
+
+        /// <summary>
+        /// 因特网
+        /// </summary>
+        public int? Web { get; set; }
+
+        /// <summary>
+        /// 其他
+        /// </summary>
+        public int? Rests { get; set; }
+
+        /// <summary>
+        /// 自建
+        /// </summary>
+        public int? Created { get; set; }
+
+        /// <summary>
+        /// 微信
+        /// </summary>
+        public int? WeChat { get; set; }
+
+        /// <summary>
+        /// APP
+        /// </summary>
+        public int? App { get; set; }
+
+        /// <summary>
+        /// 智慧宜宾
+        /// </summary>
+        public int? WisdomYB { get; set; }
+
+        /// <summary>
+        /// 综治平台
+        /// </summary>
+        public int? Platform { get; set; }
+
+        /// <summary>
+        /// 省12328平台
+        /// </summary>
+        public int? Platform12328 { get; set; }
+
+        /// <summary>
+        /// 市长和网民
+        /// </summary>
+        public int? MayorAndNetizens { get; set; }
+
+        /// <summary>
+        /// 宜宾融媒体
+        /// </summary>
+        public int? MediaYB { get; set; }
+
+        /// <summary>
+        /// 省12345平台
+        /// </summary>
+        public int? Platform12345 { get; set; }
+
+        /// <summary>
+        /// 省政民互动
+        /// </summary>
+        public int? Interaction { get; set; }
+
+        /// <summary>
+        /// 宜办事
+        /// </summary>
+        public int? ServiceYB { get; set; }
+
+        /// <summary>
+        /// 市州互转
+        /// </summary>
+        public int? CityTransfer { get; set; }
+
+        /// <summary>
+        /// 宜宾110平台
+        /// </summary>
+        public int? Platform110 { get; set; }
+
+        /// <summary>
+        /// 办不成事反映窗口
+        /// </summary>
+        public int? NoService { get; set; }
+
+        // <summary>
+        /// i宜宾
+        /// </summary>
+        public int? Iyb { get; set; }
+    }
+
+
+    public class OrderScreenApplyVo
+    {
+        /// <summary>
+        /// 提起时间
+        /// </summary>
+        public string ApplyTime { get; set; }
+
+        /// <summary>
+        /// 提起人
+        /// </summary>
+        public string ApplyUserName { get; set; }
+
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string ApplyOrgName { get; set; }
+
+        /// <summary>
+        /// 数量
+        /// </summary>
+        public int ApplyNum { get; set; }
+    }
+
+    public class OrderScreenAuditVo
+    {
+
+        /// <summary>
+        /// 审批人
+        /// </summary>
+        public string AuditName { get; set; }
+
+        /// <summary>
+        /// 审批数量
+        /// </summary>
+        public int AuditNum { get; set; }
+
+        /// <summary>
+        /// 退回数量
+        /// </summary>
+        public int AuditBackNum { get; set; }
+
+        /// <summary>
+        /// 小计
+        /// </summary>
+        public int Total => AuditNum + AuditBackNum;
+    }
+
+    public class OrderCenterAcceptVo : OrderCenterBaseVo
+    {
+        /// <summary>
+        /// 日期
+        /// </summary>
+        public string Time { get; set; }
+    }
+
+    public class OrderCenterAcceptUserVo : OrderCenterBaseVo
+    {
+        /// <summary>
+        /// 值班坐席
+        /// </summary>
+        public string AcceptUserName { get; set; }
+    }
+
+    public class OrderCenterAcceptHourVo : OrderCenterBaseVo
+    {
+        /// <summary>
+        /// 时间段
+        /// </summary>
+        public string Hour { get; set; }
+    }
+
+    public class OrderCenterBaseVo
+    {
+        /// <summary>
+        /// 受理总件
+        /// </summary>
+        public int AcceptNum { get; set; }
+
+        /// <summary>
+        /// 有效件
+        /// </summary>
+        public int ValidNum { get; set; }
+
+        /// <summary>
+        /// 重复件
+        /// </summary>
+        public int RepetitionNum { get; set; }
+
+        /// <summary>
+        /// 无效件
+        /// </summary>
+        public int InvalidNum { get; set; }
+
+        /// <summary>
+        /// 已办件
+        /// </summary>
+        public int HandleNum { get; set; }
+
+        /// <summary>
+        /// 待办件
+        /// </summary>
+        public int NoHandleNum { get; set; }
+
+        /// <summary>
+        /// 退回件
+        /// </summary>
+        public int BackNum { get; set; }
+
+        /// <summary>
+        /// 值班坐席
+        /// </summary>
+        public int DutyDeskNum { get; set; }
+    }
 }

+ 11 - 10
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -1335,16 +1335,17 @@ public class OrderVisitJudeDetailRep
 
 }
 
-public class HotspotStatisticsRep {
-	/// <summary>
-	/// 开始时间
-	/// </summary>
-	public DateTime? StartTime { get; set; }
-
-	/// <summary>
-	/// 结束时间
-	/// </summary>
-	public DateTime? EndTime { get; set; }
+public record HotspotStatisticsRep : PagedKeywordRequest
+{ 
+	///// <summary>
+	///// 开始时间
+	///// </summary>
+	//public DateTime? StartTime { get; set; }
+
+	///// <summary>
+	///// 结束时间
+	///// </summary>
+	//public DateTime? EndTime { get; set; }
 
 	public int TypeId { get; set; }
 	public string? HotspotCode { get; set; }