tangjiang 4 mesi fa
parent
commit
c028dd509e

+ 74 - 2
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -5,6 +5,7 @@ using Hotline.Application.StatisticalReport;
 using Hotline.Application.Systems;
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
+using Hotline.Configurations;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
@@ -28,6 +29,7 @@ using Hotline.Tools;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
 using Org.BouncyCastle.Utilities.Collections;
 using SqlSugar;
 using System.Data;
@@ -74,6 +76,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IWorkflowApplication _workflowApplication;
         private readonly ISystemOrganizeRepository _organizeRepository;
         private readonly IRepository<CallNative> _callNativeRepository;
+        private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
         public BiOrderController(
             IOrderRepository orderRepository,
@@ -109,7 +112,8 @@ namespace Hotline.Api.Controllers.Bi
             BaseDataApplication baseDataApplication,
             IExportApplication exportApplication,
             IOrderVisitApplication orderVisitApplication,
-            IRepository<CallNative> callNativeRepository)
+            IRepository<CallNative> callNativeRepository,
+            IOptionsSnapshot<AppConfiguration> appOptions)
         {
             _orderRepository = orderRepository;
             _hotspotTypeRepository = hotspotTypeRepository;
@@ -145,6 +149,7 @@ namespace Hotline.Api.Controllers.Bi
             _exportApplication = exportApplication;
             _orderVisitApplication = orderVisitApplication;
             _callNativeRepository = callNativeRepository;
+            _appOptions = appOptions;
         }
 
         /// <summary>
@@ -1397,7 +1402,8 @@ namespace Hotline.Api.Controllers.Bi
         {
             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)
+                    .Where((ov, o) => ov.VisitTime >= dto.StartTime.Value && ov.VisitTime <= dto.EndTime.Value && ov.VisitState == EVisitState.Visited && o.SeatEvaluate != null
+                    && o.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied && o.SeatEvaluate != ESeatEvaluate.Normal)
                      .Select((ov, o) => new SeatSatisfactionStatisticsEvaluateDto
                      {
                          Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(o.SeatEvaluate != ESeatEvaluate.NoSatisfied && o.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied, 1, 0)),
@@ -1479,6 +1485,72 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "坐席满意度明细表");
         }
 
+        /// <summary>
+        /// 坐席满意度工单明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("query-seat-satisfaction-order-visit-list")]
+        public async Task<PagedDto<OrderVisitDto>> QuerySeatSatisfactionOrderVisitList([FromQuery] SeatSatisfactionOrderVisitRequest dto)
+        {
+            var (total, items) = await _orderApplication.QuerySeatSatisfactionOrderVisitList(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<OrderVisitDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDto>>(items));
+        }
+
+        /// <summary>
+        /// 坐席满意度工单明细表基础数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("query-seat-satisfaction-base-data")]
+        public async Task<object> QuerySeatSatisfactionBaseData()
+        {
+            var seatEvaluate = EnumExts.GetDescriptions<ESeatEvaluate>();
+            if (_appOptions.Value.IsZiGong == false)
+            {
+                seatEvaluate = seatEvaluate.Where(m => new int[] { 1, 3 }.Contains(m.Key) == false).ToList();
+            }
+            return new
+            {
+                SeatEvaluate = seatEvaluate
+            };
+        }
+
+        /// <summary>
+        /// 坐席满意度工单明细导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("query-seat-satisfaction-order-visit-list/export")]
+        public async Task<FileStreamResult> ExportQuerySeatSatisfactionOrderVisitList([FromBody] ExportExcelDto<SeatSatisfactionOrderVisitRequest> dto)
+        {
+            var query = _orderApplication.QuerySeatSatisfactionOrderVisitList(dto.QueryDto);
+            List<OrderVisit> orders;
+            if (dto.IsExportAll)
+            {
+                orders = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                orders = items;
+            }
+
+            var orderDtos = _mapper.Map<ICollection<OrderVisitDto>>(orders);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = orderDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderVisitDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "坐席满意度工单明细");
+        }
+
+
         /// <summary>
         /// 部门满意度统计
         /// </summary>

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

@@ -377,5 +377,12 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         ISugarQueryable<SeatSatisfactionStatisticsListDetailDto> SeatSatisfactionStatisticsListDetail(PagedKeywordRequest dto);
 
+        /// <summary>
+        /// 坐席满意度工单明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderVisit> QuerySeatSatisfactionOrderVisitList(SeatSatisfactionOrderVisitRequest dto);
+
     }
 }

+ 72 - 49
src/Hotline.Application/Orders/OrderApplication.cs

@@ -988,18 +988,18 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne, dto.Workflow.Opinion,
                 _sessionContextProvider.SessionContext.RequiredUserId, _sessionContextProvider.SessionContext.UserName,
                 canUpdateOrderSender);
-			//TODO发送短信即将超期
-			//_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
-			//自动延期订阅
-			var enabled = _systemSettingCacheManager.GetSetting(SettingConstants.EnabledAutomaticDelay)?.SettingValue[0];
-			if (bool.Parse(enabled))
-			{
-				await _capPublisher.PublishDelayAsync(
-                    expiredTimeConfig.ExpiredTime - DateTime.Now.AddHours(1), 
+            //TODO发送短信即将超期
+            //_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
+            //自动延期订阅
+            var enabled = _systemSettingCacheManager.GetSetting(SettingConstants.EnabledAutomaticDelay)?.SettingValue[0];
+            if (bool.Parse(enabled))
+            {
+                await _capPublisher.PublishDelayAsync(
+                    expiredTimeConfig.ExpiredTime - DateTime.Now.AddHours(1),
                     EventNames.HotlineOrderAutomaticDelay,
-					new PublishAutomaticDelayDto() { OrderId = order.Id },
+                    new PublishAutomaticDelayDto() { OrderId = order.Id },
                     cancellationToken: cancellationToken);
-			}
+            }
         }
         else if (dto.Workflow.FlowDirection is EFlowDirection.CenterToOrg)
         {
@@ -1011,15 +1011,15 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 expiredTimeConfig.NearlyExpiredTime, expiredTimeConfig.NearlyExpiredTimeOne, dto.Workflow.Opinion,
                 _sessionContextProvider.SessionContext.RequiredUserId, _sessionContextProvider.SessionContext.UserName,
                 canUpdateOrderSender);
-			//TODO发送短信即将超期
-			//_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
-			//自动延期订阅
-			var enabled = _systemSettingCacheManager.GetSetting(SettingConstants.EnabledAutomaticDelay)?.SettingValue[0];
-			if (bool.Parse(enabled))
-			{
-				_capPublisher.PublishDelay(expiredTimeConfig.ExpiredTime - DateTime.Now.AddHours(1), EventNames.HotlineOrderAutomaticDelay,
-					new PublishAutomaticDelayDto() { OrderId = order.Id });
-			}
+            //TODO发送短信即将超期
+            //_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
+            //自动延期订阅
+            var enabled = _systemSettingCacheManager.GetSetting(SettingConstants.EnabledAutomaticDelay)?.SettingValue[0];
+            if (bool.Parse(enabled))
+            {
+                _capPublisher.PublishDelay(expiredTimeConfig.ExpiredTime - DateTime.Now.AddHours(1), EventNames.HotlineOrderAutomaticDelay,
+                    new PublishAutomaticDelayDto() { OrderId = order.Id });
+            }
         }
         else if (dto.Workflow.FlowDirection is EFlowDirection.CenterToCenter)
         {
@@ -1029,15 +1029,15 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 order.CenterToCenter(expiredTimeConfig.TimeText, expiredTimeConfig.Count,
                     expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime,
                     expiredTimeConfig.NearlyExpiredTimeOne);
-				//TODO发送短信即将超期
-				//_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
-				//自动延期订阅
-				var enabled = _systemSettingCacheManager.GetSetting(SettingConstants.EnabledAutomaticDelay)?.SettingValue[0];
-				if (bool.Parse(enabled))
-				{
-					_capPublisher.PublishDelay(expiredTimeConfig.ExpiredTime - DateTime.Now.AddHours(1), EventNames.HotlineOrderAutomaticDelay,
-						new PublishAutomaticDelayDto() { OrderId = order.Id });
-				}
+                //TODO发送短信即将超期
+                //_capPublisher.PublishDelay(expiredTimeConfig.NearlyExpiredTime - DateTime.Now, EventNames.HotlineOrderNearlyExpiredTimeSms, new PublishNearlyExpiredTimeSmsDto() { OrderId = order.Id });
+                //自动延期订阅
+                var enabled = _systemSettingCacheManager.GetSetting(SettingConstants.EnabledAutomaticDelay)?.SettingValue[0];
+                if (bool.Parse(enabled))
+                {
+                    _capPublisher.PublishDelay(expiredTimeConfig.ExpiredTime - DateTime.Now.AddHours(1), EventNames.HotlineOrderAutomaticDelay,
+                        new PublishAutomaticDelayDto() { OrderId = order.Id });
+                }
 
             }
         }
@@ -1717,7 +1717,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     {
         bool IsCenter = _sessionContextProvider.SessionContext.OrgIsCenter;
         int orgLevel = _sessionContextProvider.SessionContext.OrgLevel;
-        string orgLevelStr = ((orgLevel+1) * 3).ToString();
+        string orgLevelStr = ((orgLevel + 1) * 3).ToString();
         var list = _orderVisitDetailRepository.Queryable()
             .Where(x => x.OrderVisit.VisitTime >= dto.StartTime.Value && x.OrderVisit.VisitTime <= dto.EndTime.Value &&
                         x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
@@ -1815,7 +1815,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                         SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))), //未接通
                 })
                 .MergeTable()
-                .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id && (o.Level == orgLevel || o.Level == (orgLevel+1)))
+                .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id && (o.Level == orgLevel || o.Level == (orgLevel + 1)))
                 .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
                 {
                     OrgName = o.Name,
@@ -1857,7 +1857,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.VisitType != null, (x, it) => it.OrderVisit.VisitType == dto.VisitType)
             .GroupBy((x, it) => new
             {
-                VisitOrgCode = it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"),SqlFunc.MappingColumn<int>("9"))
+                VisitOrgCode = it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9"))
             })
             .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
             {
@@ -2900,7 +2900,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         var query = _orderVisitRepository.Queryable()
             .Includes(d => d.Order)
             .Includes(d => d.Employee)
-            .Includes(d=>d.OrderVisitDetails)
+            .Includes(d => d.OrderVisitDetails)
             .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoVisit,
                 d => d.VisitState == EVisitState.WaitForVisit ||
                      d.VisitState == EVisitState.NoSatisfiedWaitForVisit)
@@ -2951,23 +2951,23 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         return query;
     }
 
-	/// <summary>
-	/// 热点类型小类统计明细
-	/// </summary>
-	/// <param name="dto"></param>
-	/// <returns></returns>
+    /// <summary>
+    /// 热点类型小类统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
 
-	public ISugarQueryable<Order> HotspotStatisticsDetail(HotspotStatisticsRep dto)
+    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;
+        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>
@@ -2979,7 +2979,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     {
         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)
+               .Where(x => x.VisitTime >= dto.StartTime.Value && x.VisitTime <= dto.EndTime.Value && x.VisitState == EVisitState.Visited && x.Order.SeatEvaluate != null
+               && x.Order.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied && x.Order.SeatEvaluate != ESeatEvaluate.Normal)
                .GroupBy(x => x.Order.SeatEvaluate)
                .Select(x => new SeatSatisfactionStatisticsDto
                {
@@ -2998,7 +2999,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     {
         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)
+                 .Where((ov, o) => ov.VisitTime >= dto.StartTime.Value && ov.VisitTime <= dto.EndTime.Value && ov.VisitState == EVisitState.Visited && o.SeatEvaluate != null
+                 && o.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied && o.SeatEvaluate != ESeatEvaluate.Normal)
                  .GroupBy((ov, o) => new
                  {
                      o.AcceptorName,
@@ -3020,6 +3022,27 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         return query;
     }
 
+    /// <summary>
+    /// 坐席满意度工单明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderVisit> QuerySeatSatisfactionOrderVisitList(SeatSatisfactionOrderVisitRequest dto)
+    {
+        var query = _orderVisitRepository.Queryable()
+            .Includes(d => d.Order)
+            .Includes(d => d.Employee)
+            .Includes(d => d.OrderVisitDetails)
+           .Where(p => p.VisitTime >= dto.StartTime.Value && p.VisitTime <= dto.EndTime.Value && p.VisitState == EVisitState.Visited && p.Order.SeatEvaluate != null
+           && p.Order.SeatEvaluate != ESeatEvaluate.VeryNoSatisfied && p.Order.SeatEvaluate != ESeatEvaluate.Normal)
+           .WhereIF(!string.IsNullOrEmpty(dto.UserId), p => p.Order.AcceptorId == dto.UserId)
+           .WhereIF(dto.SeatEvaluate.HasValue, p => p.Order.SeatEvaluate == dto.SeatEvaluate)
+           .WhereIF(!string.IsNullOrEmpty(dto.UserName), p => p.Order.AcceptorName == dto.UserName)
+           .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Order.Title.Contains(dto.Title))
+           .WhereIF(!string.IsNullOrEmpty(dto.No), p => p.Order.No.Contains(dto.No))
+            .OrderByDescending(p => p.VisitTime);
+        return query;
+    }
 
     #region private
     /// <summary>

+ 8 - 3
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -320,7 +320,7 @@ namespace Hotline.Share.Dtos.Order
         /// 非常满意
         /// </summary>
         public int VerySatisfied { get; set; }
-        public int VerySatisfiedKey { get; set; }=5;
+        public int VerySatisfiedKey { get; set; } = 5;
         public string VerySatisfiedRate => CalcRate(VerySatisfied);
 
         /// <summary>
@@ -340,11 +340,16 @@ namespace Hotline.Share.Dtos.Order
         /// <summary>
         /// 小计
         /// </summary>
-        public int Count => DefaultSatisfied + VeryNoSatisfied + NoSatisfied + Normal + Satisfied + VerySatisfied + NoConnect + NoEvaluate;
+        public int Count => DefaultSatisfied + NoSatisfied + Satisfied + VerySatisfied + NoConnect + NoEvaluate;
+
+        /// <summary>
+        /// 总满意率
+        /// </summary>
+        public string CountRate => CalcRate(DefaultSatisfied + Satisfied + VerySatisfied + NoConnect + NoEvaluate);
 
         public string CalcRate(int num)
         {
-            int counNum = DefaultSatisfied + VeryNoSatisfied + NoSatisfied + Normal + Satisfied + VerySatisfied + NoConnect + NoEvaluate;
+            int counNum = DefaultSatisfied + NoSatisfied + Satisfied + VerySatisfied + NoConnect + NoEvaluate;
             if (num == 0 || counNum == 0)
             {
                 return "0.000%";

+ 167 - 155
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -62,26 +62,26 @@ public record PagedKeywordSonRequest : PagedRequest
 }
 public record VisitAndHotspotPagedKeywordRequest : PagedKeywordRequest
 {
-	/// <summary>
-	/// 热点名称
-	/// </summary>
-	public string? HotspotName { get; set; }
-
-	/// <summary>
-	/// 热点id
-	/// </summary>
-	public string? HotspotId { get; set; }
-
-	/// <summary>
-	/// 1:办件结果 2:办件态度
-	/// </summary>
-	public int TypeId { get; set; }
-
-	/// <summary>
-	/// 标题名称
-	/// </summary>
-
-	public string? TitleCode { get; set; }
+    /// <summary>
+    /// 热点名称
+    /// </summary>
+    public string? HotspotName { get; set; }
+
+    /// <summary>
+    /// 热点id
+    /// </summary>
+    public string? HotspotId { get; set; }
+
+    /// <summary>
+    /// 1:办件结果 2:办件态度
+    /// </summary>
+    public int TypeId { get; set; }
+
+    /// <summary>
+    /// 标题名称
+    /// </summary>
+
+    public string? TitleCode { get; set; }
 }
 public record ReportPagedRequest : PagedKeywordRequest
 {
@@ -143,87 +143,87 @@ public record OrgDataListDetailRequest : PagedRequest
 /// </summary>
 public record OrgDataListAllDetailRequest : PagedRequest
 {
-	/// <summary>
-	/// 开始时间
-	/// </summary>
-	public DateTime StartTime { get; set; }
-	/// <summary>
-	/// 结束时间
-	/// </summary>
-	public DateTime EndTime { get; set; }
-	/// <summary>
-	/// 部门Code
-	/// </summary>
-	public string OrgName { get; set; }
-
-	/// <summary>
-	/// 工单编号
-	/// </summary>
-	public string? No { get; set; }
-
-	/// <summary>
-	/// 超期类型 1:系统中超期  2:申请延期超期
-	/// </summary>
-	public int ExpiredType { get; set; }
-
-	/// <summary>
-	/// 工单状态(√)
-	/// </summary>
-	public List<EOrderStatus> Statuses { get; set; } = new();
+    /// <summary>
+    /// 开始时间
+    /// </summary>
+    public DateTime StartTime { get; set; }
+    /// <summary>
+    /// 结束时间
+    /// </summary>
+    public DateTime EndTime { get; set; }
+    /// <summary>
+    /// 部门Code
+    /// </summary>
+    public string OrgName { get; set; }
+
+    /// <summary>
+    /// 工单编号
+    /// </summary>
+    public string? No { get; set; }
+
+    /// <summary>
+    /// 超期类型 1:系统中超期  2:申请延期超期
+    /// </summary>
+    public int ExpiredType { get; set; }
+
+    /// <summary>
+    /// 工单状态(√)
+    /// </summary>
+    public List<EOrderStatus> Statuses { get; set; } = new();
 }
 
 public record PublishedPagedRequest : PagedKeywordRequest
 {
-	/// <summary>
-	/// 是否解决
-	/// </summary>
-	public bool? Resolve { get; set; }
-
-	/// <summary>
-	/// 工单编号
-	/// </summary>
-	public string? No { get; set; }
-
-	/// <summary>
-	/// 工单标题
-	/// </summary>
-	public string? Title { get; set; }
-
-	/// <summary>
-	/// 受理时间(工单创建时间)
-	/// </summary>
-	public DateTime? CreationTimeStart { get; set; }
-	public DateTime? CreationTimeEnd { get; set; }
-
-	/// <summary>
-	/// 来电号码(×)
-	/// </summary>
-	public string? FromPhone { get; set; }
-
-	/// <summary>
-	/// 接办名称(综合查询使用)
-	/// </summary>
-	public string? ActualHandleOrgName { get; set; }
-
-	/// <summary>
-	/// 受理类型(√)
-	/// </summary>
-	public string? AcceptType { get; set; }
-
-	/// <summary>
-	/// 热点分类关键词
-	/// </summary>
-	public string? Hotspot { get; set; }
-
-	/// <summary>
-	/// 受理坐席名字或工号(×)
-	/// </summary>
-	public string? NameOrNo { get; set; }
-
-	/// <summary>
-	/// 发布人名称
-	/// </summary>
-	public string? PublishName { get; set; }
+    /// <summary>
+    /// 是否解决
+    /// </summary>
+    public bool? Resolve { get; set; }
+
+    /// <summary>
+    /// 工单编号
+    /// </summary>
+    public string? No { get; set; }
+
+    /// <summary>
+    /// 工单标题
+    /// </summary>
+    public string? Title { get; set; }
+
+    /// <summary>
+    /// 受理时间(工单创建时间)
+    /// </summary>
+    public DateTime? CreationTimeStart { get; set; }
+    public DateTime? CreationTimeEnd { get; set; }
+
+    /// <summary>
+    /// 来电号码(×)
+    /// </summary>
+    public string? FromPhone { get; set; }
+
+    /// <summary>
+    /// 接办名称(综合查询使用)
+    /// </summary>
+    public string? ActualHandleOrgName { get; set; }
+
+    /// <summary>
+    /// 受理类型(√)
+    /// </summary>
+    public string? AcceptType { get; set; }
+
+    /// <summary>
+    /// 热点分类关键词
+    /// </summary>
+    public string? Hotspot { get; set; }
+
+    /// <summary>
+    /// 受理坐席名字或工号(×)
+    /// </summary>
+    public string? NameOrNo { get; set; }
+
+    /// <summary>
+    /// 发布人名称
+    /// </summary>
+    public string? PublishName { get; set; }
 
     /// <summary>
     /// 是否超期
@@ -265,7 +265,7 @@ public record VisitMeasureStatisticsRequest
 {
     public DateTime StartTime { get; set; }
     public DateTime EndTime { get; set; }
-    
+
     public string? VisitName { get; set; }
 }
 
@@ -460,7 +460,7 @@ public record TimeSharingPagedKeywordRequest : PagedKeywordRequest
     /// <summary>
     /// 来电/信人身份0:全部 ,1:市民,2:企业
     /// </summary>
-    public int? TypeId {  get; set; }
+    public int? TypeId { get; set; }
 
     /// <summary>
     /// 导出列名
@@ -469,7 +469,7 @@ public record TimeSharingPagedKeywordRequest : PagedKeywordRequest
 }
 
 
-public record OrgVisitDetailListReq: PagedKeywordRequest
+public record OrgVisitDetailListReq : PagedKeywordRequest
 {
     /// <summary>
     /// 一级部门(id或名称)
@@ -579,7 +579,7 @@ public record HotspotAndAreaStatisticsReq
 
 }
 
-public record AcceptTypeStatisticsByDateDetailReq:PagedRequest
+public record AcceptTypeStatisticsByDateDetailReq : PagedRequest
 {
     /// <summary>
     /// 日期
@@ -636,11 +636,11 @@ public class AcceptTypeStatisticsReq
 
     public string Gateway { get; set; }
 
-   
+
 
 }
 
-public record HotspotAndAreaStatisticsDetailReq:PagedRequest
+public record HotspotAndAreaStatisticsDetailReq : PagedRequest
 {
     public string? AreaCode { get; set; }
 
@@ -816,7 +816,7 @@ public class AcceptTypeStatisticsDto
     /// <summary>
     /// 办结率
     /// </summary>
-    public string CompletionRate => SumCount > 0 ? Math.Round((double)CompletionCount / (double)SumCount * 100, digits: 3)+"%" : 0.000+"%";
+    public string CompletionRate => SumCount > 0 ? Math.Round((double)CompletionCount / (double)SumCount * 100, digits: 3) + "%" : 0.000 + "%";
 
     /// <summary>
     /// 回访量
@@ -826,7 +826,7 @@ public class AcceptTypeStatisticsDto
     /// <summary>
     /// 回访率
     /// </summary>
-    public string VisitRate => SumCount > 0 ? Math.Round((double)VisitCount / (double)SumCount *100, digits: 3)+"%" : 0.000+"%";
+    public string VisitRate => SumCount > 0 ? Math.Round((double)VisitCount / (double)SumCount * 100, digits: 3) + "%" : 0.000 + "%";
 
     /// <summary>
     /// 占比
@@ -836,63 +836,63 @@ public class AcceptTypeStatisticsDto
 
 public record HotspotAndAcceptTypeStatisticsReq
 {
-	public int HotspotLevel { get; set; }
+    public int HotspotLevel { get; set; }
 
-	public DateTime StartTime { get; set; }
+    public DateTime StartTime { get; set; }
 
-	public DateTime EndTime { get; set; }
+    public DateTime EndTime { get; set; }
 
-	/// <summary>
-	/// 导出列名
-	/// </summary>
-	public List<string> AddColumnName { get; set; } = new();
+    /// <summary>
+    /// 导出列名
+    /// </summary>
+    public List<string> AddColumnName { get; set; } = new();
 
 }
 
 public record HotspotAndAcceptTypeStatisticsDetailReq : PagedRequest
 {
-	public string? AcceptTypeCode { get; set; }
+    public string? AcceptTypeCode { get; set; }
 
-	public string HotspotId { get; set; }
+    public string HotspotId { get; set; }
 
-	public DateTime StartTime { get; set; }
+    public DateTime StartTime { get; set; }
 
-	public DateTime EndTime { get; set; }
+    public DateTime EndTime { get; set; }
 }
 
 public record OrderScreenApplyPagedRequest : PagedKeywordRequest
 {
-	/// <summary>
-	/// 提起人
-	/// </summary>
-	public string ApplyUserName { get; set; }
-
-	/// <summary>
-	/// 部门名称
-	/// </summary>
-	public string ApplyOrgName { get; set; }
+    /// <summary>
+    /// 提起人
+    /// </summary>
+    public string ApplyUserName { get; set; }
+
+    /// <summary>
+    /// 部门名称
+    /// </summary>
+    public string ApplyOrgName { get; set; }
 }
 
 public record OrderScreenAuditPagedRequest : PagedKeywordRequest
 {
-	/// <summary>
-	/// 审批人
-	/// </summary>
-	public string AuditUserName { get; set; }
+    /// <summary>
+    /// 审批人
+    /// </summary>
+    public string AuditUserName { get; set; }
 
-	/// <summary>
-	///  1 中心班长   2 中心领导
-	/// </summary>
-	public int? AuditType { get; set; }
+    /// <summary>
+    ///  1 中心班长   2 中心领导
+    /// </summary>
+    public int? AuditType { get; set; }
 
 }
 
 public record OrderCenterAcceptPagedRequest : PagedKeywordRequest
 {
-	/// <summary>
-	/// 来电/信人身份0:全部 ,1:市民,2:企业
-	/// </summary>
-	public int? TypeCode { get; set; }
+    /// <summary>
+    /// 来电/信人身份0:全部 ,1:市民,2:企业
+    /// </summary>
+    public int? TypeCode { get; set; }
 
 }
 
@@ -1078,7 +1078,7 @@ public class OrderDataInventoryRep
         //ExpiredStatus
         if (ExpiredTime.HasValue)
         {
-           
+
             if (dateTime < NearlyExpiredTime)
             {
                 return EExpiredStatusEx.Normal;
@@ -1299,7 +1299,7 @@ public class OrderVisitJudeStatisticsRep
     /// <summary>
     /// 部门扭转审批失败件
     /// </summary>
-    public int OrgJudeFailCount { get;set; }
+    public int OrgJudeFailCount { get; set; }
 
     /// <summary>
     /// 坐席扭转总件
@@ -1324,7 +1324,7 @@ public class OrderVisitJudeStatisticsRep
 }
 
 
-public record OrderVisitJudeDetailReq: PagedRequest
+public record OrderVisitJudeDetailReq : PagedRequest
 {
 
 }
@@ -1336,19 +1336,19 @@ public class OrderVisitJudeDetailRep
 }
 
 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; }
+{
+    ///// <summary>
+    ///// 开始时间
+    ///// </summary>
+    //public DateTime? StartTime { get; set; }
+
+    ///// <summary>
+    ///// 结束时间
+    ///// </summary>
+    //public DateTime? EndTime { get; set; }
+
+    public int TypeId { get; set; }
+    public string? HotspotCode { get; set; }
 }
 
 public record SysLogPagedKeywordRequest : PagedKeywordRequest
@@ -1379,6 +1379,18 @@ public record SysLogPagedKeywordRequest : PagedKeywordRequest
     public bool? IsAll { get; set; }
 }
 
+public record SeatSatisfactionOrderVisitRequest : PagedKeywordRequest
+{
+    public ESeatEvaluate? SeatEvaluate { get; set; }
+
+    public string? UserId { get; set; }
+
+    public string? UserName { get; set; }
+
+    public string? Title { get; set; }
+
+    public string? No {  get; set; }
+}
 
 #region 智能回访
 
@@ -1405,7 +1417,7 @@ public class QueryAiVisitStatisticsResp
     /// <summary>
     /// 智能回访有效量(去重)
     /// </summary>
-    public int AiVisitSuccessCount { get; set;}
+    public int AiVisitSuccessCount { get; set; }
 
     /// <summary>
     /// 人工待复核量
@@ -1444,7 +1456,7 @@ public class QueryAiVisitEffectiveAnalysisResp
     /// <summary>
     /// 有一个答案的数量
     /// </summary>
-    public int AiVisitHaveOneAnswerCount{ get; set; }
+    public int AiVisitHaveOneAnswerCount { get; set; }
 
     /// <summary>
     /// 有两个答案的数量