瀏覽代碼

解决冲突

Dun.Jason 10 月之前
父節點
當前提交
cfe93e5118
共有 25 個文件被更改,包括 1243 次插入608 次删除
  1. 99 59
      src/Hotline.Api/Controllers/Bi/BiCallController.cs
  2. 415 358
      src/Hotline.Api/Controllers/Bi/BiOrderController.cs
  3. 72 35
      src/Hotline.Api/Controllers/OrderController.cs
  4. 19 7
      src/Hotline.Api/Controllers/TestController.cs
  5. 1 1
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  6. 4 2
      src/Hotline.Application/Mappers/OrderMapperConfigs.cs
  7. 49 0
      src/Hotline.Application/Orders/IOrderApplication.cs
  8. 339 8
      src/Hotline.Application/Orders/OrderApplication.cs
  9. 2 2
      src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs
  10. 16 1
      src/Hotline.Application/StatisticalReport/IOrderReportApplication.cs
  11. 145 85
      src/Hotline.Application/StatisticalReport/OrderReportApplication.cs
  12. 6 6
      src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs
  13. 3 3
      src/Hotline.Share/Dtos/Bi/BiOrderDto.cs
  14. 2 1
      src/Hotline.Share/Dtos/FlowEngine/Workflow/ChangeHandlerDto.cs
  15. 3 1
      src/Hotline.Share/Dtos/Order/Migration/GetOrderMigrationDto.cs
  16. 14 10
      src/Hotline.Share/Dtos/Order/OrderBiDto.cs
  17. 1 1
      src/Hotline.Share/Enums/Order/EScreenStatus.cs
  18. 16 16
      src/Hotline.Share/Requests/DepartmentalProcessingStatisticsDto.cs
  19. 22 1
      src/Hotline.Share/Requests/PagedKeywordRequest.cs
  20. 1 1
      src/Hotline/Article/Bulletin.cs
  21. 1 1
      src/Hotline/Article/Circular.cs
  22. 2 1
      src/Hotline/Orders/Order.cs
  23. 4 1
      src/Hotline/Orders/OrderDomainService.cs
  24. 2 2
      src/Hotline/Orders/OrderPublish.cs
  25. 5 5
      src/Hotline/Orders/OrderPublishHistory.cs

+ 99 - 59
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -11,6 +11,7 @@ using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.User;
 using Hotline.Share.Requests;
+using Hotline.Tools;
 using Hotline.Users;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
@@ -39,7 +40,7 @@ public class BiCallController : BaseController
 
 
 
-	public BiCallController(
+    public BiCallController(
         IRepository<TrCallRecord> trCallRecordRepository,
         IRepository<User> userRepository,
         IRepository<TelRest> telRestRepository,
@@ -47,7 +48,7 @@ public class BiCallController : BaseController
         ITrCallRecordRepository trCallRecordRepositoryEx,
         ISystemSettingCacheManager systemSettingCacheManager,
         ISystemDicDataCacheManager sysDicDataCacheManager,
-		IRepository<Work> workRepository)
+        IRepository<Work> workRepository)
     {
         _trCallRecordRepository = trCallRecordRepository;
         _userRepository = userRepository;
@@ -58,8 +59,13 @@ public class BiCallController : BaseController
         _workRepository = workRepository;
         _sysDicDataCacheManager = sysDicDataCacheManager;
 
-	}
+    }
 
+    /// <summary>
+    /// 话务统计分析
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
     [HttpGet("calls")]
     [AllowAnonymous]
     public async Task<List<BiCallDto>> QueryCallsAsync([FromQuery] BiQueryCallsDto dto)
@@ -111,16 +117,49 @@ public class BiCallController : BaseController
         #endregion
         dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 
-         return await _trCallRecordRepositoryEx.GetQueryCalls(dto.StartTime.Value, dto.EndTime.Value);
+        return await _trCallRecordRepositoryEx.GetQueryCalls(dto.StartTime.Value, dto.EndTime.Value);
 
     }
 
-    //[HttpPost()]
-    //[AllowAnonymous]
-    //public async Task<FileStreamResult> ExportCalls([FromBody]ExportExcelDto<BiQueryCallsDto> dto)
-    //{
+    /// <summary>
+    /// 话务统计分析---导出
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("calls_export")]
+    [AllowAnonymous]
+    public async Task<FileStreamResult> ExportQueryCallsAsync([FromBody] ExportExcelDto<BiQueryCallsDto> dto)
+    {
+        if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
 
-    //}
+        dto.QueryDto.EndTime = dto.QueryDto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+        var list = await _trCallRecordRepositoryEx.GetQueryCalls(dto.QueryDto.StartTime.Value, dto.QueryDto.EndTime.Value);
+
+        if (list != null && list.Count > 0)
+        {
+            list.Add(new BiCallDto()
+            {
+                HourRange = "合计",
+                Hour = 13,
+                Total = list.Sum(p => p.Total),
+                Answered = list.Sum(p => p.Answered),
+                Hanguped = list.Sum(p => p.Hanguped)
+            });
+        }
+
+
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+        var dtos = list
+            .Select(stu => _mapper.Map(stu, typeof(BiCallDto), dynamicClass))
+            .Cast<object>()
+            .ToList();
+
+        var stream = ExcelHelper.CreateStream(dtos);
+
+        return ExcelStreamResult(stream, "话务统计分析");
+    }
 
 
     /// <summary>
@@ -165,17 +204,17 @@ public class BiCallController : BaseController
               .ToListAsync(HttpContext.RequestAborted);
 
 
-        list.ForEach(d=>
+        list.ForEach(d =>
         {
             d.LoginDuration = _workRepository.Queryable().Where(q => q.UserId == d.UserId && q.CreationTime >= dto.StartTime && q.CreationTime <= dto.EndTime).Sum(q => q.WorkingDuration);
-            if (d.LoginDuration!=null)
+            if (d.LoginDuration != null)
             {
-                d.LoginDuration = Math.Round(d.LoginDuration.Value, digits:2);
+                d.LoginDuration = Math.Round(d.LoginDuration.Value, digits: 2);
             }
             d.RestDuration = _telRestRepository.Queryable().Where(q => q.UserId == d.UserId && q.CreationTime >= dto.StartTime && q.CreationTime <= dto.EndTime).Sum(q => q.RestDuration);
-            d.RestDuration = Math.Round(d.RestDuration, digits:2);
+            d.RestDuration = Math.Round(d.RestDuration, digits: 2);
         });
-              
+
 
         return list;
     }
@@ -187,7 +226,7 @@ public class BiCallController : BaseController
     /// <returns></returns>
     [HttpGet("rests")]
     [AllowAnonymous]
-    public async Task<IReadOnlyList<BiSeatRestDto>> QuerySeatRest([FromQuery]QuerySeatRestRequest dto)
+    public async Task<IReadOnlyList<BiSeatRestDto>> QuerySeatRest([FromQuery] QuerySeatRestRequest dto)
     {
         if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
         dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
@@ -206,8 +245,8 @@ public class BiCallController : BaseController
                 RestCount = SqlFunc.AggregateCount(x.Id),
                 RestDuration = SqlFunc.AggregateSum(x.RestDuration / 60) / SqlFunc.AggregateCount(x.Id)
             })
-            .OrderByIF(dto.SortRule ==0,a=> a.RestDuration,OrderByType.Asc)
-            .OrderByIF(dto.SortRule ==1,a=> a.RestDuration,OrderByType.Desc)
+            .OrderByIF(dto.SortRule is 0, a => a.RestDuration, OrderByType.Asc)
+            .OrderByIF(dto.SortRule is 1, a => a.RestDuration, OrderByType.Desc)
             .MergeTable()
             .ToListAsync(HttpContext.RequestAborted);
     }
@@ -219,19 +258,20 @@ public class BiCallController : BaseController
     /// <returns></returns>
     [HttpGet("seatswitch")]
     [AllowAnonymous]
-    public async Task<PagedDto<BiSeatSwitchDto>> QuerySeatSwitch([FromQuery]QuerySeatSwitchRequest dto)
+    public async Task<PagedDto<BiSeatSwitchDto>> QuerySeatSwitch([FromQuery] QuerySeatSwitchRequest dto)
     {
         if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
 
         dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 
-        var (total,items) = await _trCallRecordRepository.Queryable()
+        var (total, items) = await _trCallRecordRepository.Queryable()
             .Where(x => !string.IsNullOrEmpty(x.AgentTransferNumber))
             .WhereIF(!string.IsNullOrEmpty(dto.UserName), x => x.UserName.Contains(dto.UserName))
             .WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.CDPN.Contains(dto.CDPN))
-            .WhereIF(dto.StartTime.HasValue,x=>x.CreatedTime >= dto.StartTime.Value)
-            .WhereIF(dto.EndTime.HasValue,x=>x.CreatedTime <= dto.EndTime.Value)
-            .Select(x=> new BiSeatSwitchDto { 
+            .WhereIF(dto.StartTime.HasValue, x => x.CreatedTime >= dto.StartTime.Value)
+            .WhereIF(dto.EndTime.HasValue, x => x.CreatedTime <= dto.EndTime.Value)
+            .Select(x => new BiSeatSwitchDto
+            {
                 UserId = x.UserId,
                 CPN = x.CPN,
                 CDPN = x.CDPN,
@@ -251,56 +291,56 @@ public class BiCallController : BaseController
     /// <returns></returns>
     [HttpGet("hourcall")]
     [AllowAnonymous]
-    public async Task<List<TrCallHourDto>> QueryHourCall([FromQuery]DateTime beginDate,DateTime? endDate, string source)
+    public async Task<List<TrCallHourDto>> QueryHourCall([FromQuery] DateTime beginDate, DateTime? endDate, string source)
     {
         //获取配置
         int noConnectByeTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.NoConnectByeTimes)?.SettingValue[0]);
         int effectiveTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.EffectiveTimes)?.SettingValue[0]);
         int connectByeTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.ConnectByeTimes)?.SettingValue[0]);
-        var list = await _trCallRecordRepositoryEx.GetCallHourList(beginDate,endDate,noConnectByeTimes,effectiveTimes,connectByeTimes,source);
+        var list = await _trCallRecordRepositoryEx.GetCallHourList(beginDate, endDate, noConnectByeTimes, effectiveTimes, connectByeTimes, source);
         return list;
     }
 
-	/// <summary>
-	/// 通话时段统计明细
-	/// </summary>
-	/// <returns></returns>
-	[HttpGet("hourcall_list")]
-	public async Task<object> QueryCallList([FromQuery] DateTime beginDate, DateTime? endDate, string type, string source, TimeSpan? startHourTo , int pageIndex, int pageSize)
-	{
-		//获取配置
-		int noConnectByeTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.NoConnectByeTimes)?.SettingValue[0]);
-		int effectiveTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.EffectiveTimes)?.SettingValue[0]);
-		int connectByeTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.ConnectByeTimes)?.SettingValue[0]);
-		var list = await _trCallRecordRepositoryEx.GetCallList(beginDate, endDate, noConnectByeTimes, effectiveTimes, connectByeTimes, type, source, startHourTo,pageIndex, pageSize);
-		return list;
-	}
-
-	/// <summary>
-	/// 通话时段统计明细获取基本信息
-	/// </summary>
-	/// <param name="id"></param>
-	/// <returns></returns>
-	[HttpGet("hourcall_list_base")]
+    /// <summary>
+    /// 通话时段统计明细
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("hourcall_list")]
+    public async Task<object> QueryCallList([FromQuery] DateTime beginDate, DateTime? endDate, string type, string source, TimeSpan? startHourTo, int pageIndex, int pageSize)
+    {
+        //获取配置
+        int noConnectByeTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.NoConnectByeTimes)?.SettingValue[0]);
+        int effectiveTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.EffectiveTimes)?.SettingValue[0]);
+        int connectByeTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.ConnectByeTimes)?.SettingValue[0]);
+        var list = await _trCallRecordRepositoryEx.GetCallList(beginDate, endDate, noConnectByeTimes, effectiveTimes, connectByeTimes, type, source, startHourTo, pageIndex, pageSize);
+        return list;
+    }
+
+    /// <summary>
+    /// 通话时段统计明细获取基本信息
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    [HttpGet("hourcall_list_base")]
     public async Task<object> ReTransactBaseData()
     {
-	    var rsp = new
-	    {
-		    CallForwardingSource = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingSource),
-		    CallForwardingType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingType),
-		};
-	    return rsp;
+        var rsp = new
+        {
+            CallForwardingSource = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingSource),
+            CallForwardingType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.CallForwardingType),
+        };
+        return rsp;
     }
 
-	/// <summary>
-	/// 热线号码统计
-	/// </summary>
-	/// <param name="StartDate"></param>
-	/// <param name="EndDate"></param>
-	/// <returns></returns>
-	[AllowAnonymous]
+    /// <summary>
+    /// 热线号码统计
+    /// </summary>
+    /// <param name="StartDate"></param>
+    /// <param name="EndDate"></param>
+    /// <returns></returns>
+    [AllowAnonymous]
     [HttpGet("gateway-query")]
-    public async Task<List<CallHotLineDto>> QueryGateWay(DateTime beginDate, DateTime endDate,string gateway)
+    public async Task<List<CallHotLineDto>> QueryGateWay(DateTime beginDate, DateTime endDate, string gateway)
     {
         //获取配置
         int noConnectByeTimes = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.NoConnectByeTimes)?.SettingValue[0]);

+ 415 - 358
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -120,115 +120,89 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("org_data_list_detail")]
         public async Task<PagedDto<OrderDto>> OrgDataListDetail([FromQuery] OrgDataListDetailRequest dto)
         {
-            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
-
-            var quer = _orderRepository.Queryable()
-                    .InnerJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id)
-                    .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
-                    .WhereIF(dto.QueryType == 1, x => x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) //业务已办超期
-                    .WhereIF(dto.QueryType == 3, x => x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()) //业务待办超期
-                    .WhereIF(dto.QueryType == 5, x =>
-                        (x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) || (x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()))
-                    .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3 && dto.OrgCode == "001", x => x.ActualHandleOrgCode == dto.OrgCode)
-                    .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3 && dto.OrgCode != "001", x => x.ActualHandleOrgCode.StartsWith(dto.OrgCode))
-                    .MergeTable();
-
-            if (dto.QueryType is 2 or 4 or 5)
-            {
-                var queryCountersign = _workflowCountersignRepository.Queryable()
-                    .LeftJoin<WorkflowCountersignMember>((x, o) => x.Id == o.WorkflowCountersignId)
-                    .Where((x, o) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime && x.IsExpired.HasValue && x.IsExpired.Value == true)
-                    .WhereIF(dto.QueryType == 2, (x, o) => o.IsHandled == true) //会签已办超期
-                    .WhereIF(dto.QueryType == 4, (x, o) => o.IsHandled == false) //会签待办超期
-                    .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 2 or 4 or 5, (x, o) => o.Key.StartsWith(dto.OrgCode))
-                    //.GroupBy((x,o)=>x.WorkflowId)
-                    .Select((x, o) => new { Id = x.WorkflowId })
-                    .MergeTable();
-
-                quer = quer.InnerJoin(queryCountersign, (x, c) => x.WorkflowId == c.Id);
-
-            }
+            var quer = _orderApplication.QueryOrgDataListDetail(dto);
             var (total, items) = await quer.ToPagedListAsync(dto.PageIndex, dto.PageSize);
 
             return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
         }
 
-
         /// <summary>
-        /// 部门超期统计
+        /// 部门超期统计明细导出
         /// </summary>
-        /// <param name="dto"></param>
         /// <returns></returns>
-        [HttpGet("org_data_list")]
-        public async Task<PagedDto<OrderBiOrgDataListVo>> OrgDataList([FromQuery] ReportPagedRequest dto)
+        [HttpPost("org_data_list_detail/_export")]
+        public async Task<FileStreamResult> OrgDataListDetailExport([FromBody] ExportExcelDto<OrgDataListDetailRequest> dto)
         {
-            if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
-
-            dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+            var query = _orderApplication.QueryOrgDataListDetail(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 IsCenter = _sessionContext.OrgIsCenter;
+            var dataDtos = _mapper.Map<ICollection<OrderDto>>(data);
 
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
 
-            var queryOrder = _systemOrganizeRepository.Queryable()
-                .LeftJoin<Order>((x, o) => x.Id == o.ActualHandleOrgCode)
-                .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
-                .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
-                .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
-                .GroupBy((x, o) => new { x.Id, x.Name })
-                .Select((x, o) => new OrderBiOrgDataListVo
-                {
-                    OrgName = x.Name,
-                    OrgId = x.Id,
-                    HandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Status >= EOrderStatus.Filed && o.ExpiredTime < o.FiledTime, 1, 0)),
-                    NoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Status < EOrderStatus.Filed && o.ExpiredTime < SqlFunc.GetDate(), 1, 0)),
-                }).MergeTable();
+            var dtos = dataDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
 
-            var queryCountersign = _workflowCountersignRepository.Queryable()
-                .LeftJoin<WorkflowCountersignMember>((x, o) => x.Id == o.WorkflowCountersignId)
-                .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-                .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-                .GroupBy((x, o) => o.Key)
-                .Select((x, o) => new OrderBiOrgDataListVo
-                {
-                    OrgId = o.Key,
-                    CounterHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsHandled && x.IsExpired.HasValue && x.IsExpired.Value == true, 1, 0)),
-                    CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsHandled == false && x.IsExpired.HasValue && x.IsExpired.Value == true, 1, 0)),
-                }).MergeTable();
+            var stream = ExcelHelper.CreateStream(dtos);
 
-            var query = queryOrder.LeftJoin(queryCountersign, (or, co) => or.OrgId == co.OrgId)
-                .LeftJoin<SystemOrganize>((or, co, so) => or.OrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == so.Id)
-                .GroupBy((or, co, so) => new { so.Id, so.Name })
-                .Select((or, co, so) => new OrderBiOrgDataListVo
-                {
-                    OrgName = so.Name,
-                    OrgId = so.Id,
-                    HandlerExtendedNum = SqlFunc.AggregateSum(or.HandlerExtendedNum),
-                    NoHandlerExtendedNum = SqlFunc.AggregateSum(or.NoHandlerExtendedNum),
-                    CounterHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterHandlerExtendedNum),
-                    CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterNoHandlerExtendedNum)
-                }).MergeTable();
+            return ExcelStreamResult(stream, "部门超期统计明细数据");
+        }
 
-            query = query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrgName.Contains(dto.Keyword!)).Where(x => x.HandlerExtendedNum > 0 || x.NoHandlerExtendedNum > 0 || x.CounterHandlerExtendedNum > 0 || x.CounterNoHandlerExtendedNum > 0);
-            switch (dto.SortField)
-            {
-                case "handlerExtendedNum":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.HandlerExtendedNum) : query.OrderByDescending(x => x.HandlerExtendedNum);
-                    break;
-                case "counterHandlerExtendedNum":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.CounterHandlerExtendedNum) : query.OrderByDescending(x => x.CounterHandlerExtendedNum);
-                    break;
-                case "noHandlerExtendedNum":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.NoHandlerExtendedNum) : query.OrderByDescending(x => x.NoHandlerExtendedNum);
-                    break;
-                case "counterNoHandlerExtendedNum":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.CounterNoHandlerExtendedNum) : query.OrderByDescending(x => x.CounterNoHandlerExtendedNum);
-                    break;
-            }
 
+        /// <summary>
+        /// 部门超期统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("org_data_list")]
+        public async Task<PagedDto<OrderBiOrgDataListVo>> OrgDataList([FromQuery] ReportPagedRequest dto)
+        {
+            var query = _orderApplication.QueryOrgDataList(dto);
             var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
+            items.Add(new OrderBiOrgDataListVo
+            {
+                OrgName = "合计",
+                HandlerExtendedNum = items.Select(s => s.HandlerExtendedNum).Sum(),
+                CounterHandlerExtendedNum = items.Select(s => s.CounterHandlerExtendedNum).Sum(),
+                NoHandlerExtendedNum = items.Select(s => s.NoHandlerExtendedNum).Sum(),
+                CounterNoHandlerExtendedNum = items.Select(s => s.CounterNoHandlerExtendedNum).Sum(),
+            });
             return new PagedDto<OrderBiOrgDataListVo>(total, items);
         }
 
+        /// <summary>
+        /// 部门超期统计导出
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("org_data_list/_export")]
+        public async Task<FileStreamResult> OrgDataListExport([FromBody] ExportExcelDto<ReportPagedRequest> dto)
+        {
+            var query = _orderApplication.QueryOrgDataList(dto.QueryDto);
+            List<OrderBiOrgDataListVo> data;
+            data = await query.ToListAsync(HttpContext.RequestAborted);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = data
+             .Select(stu => _mapper.Map(stu, typeof(OrderBiOrgDataListVo), dynamicClass))
+             .Cast<object>()
+             .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "部门超期统计数据");
+        }
+
+
         /// <summary>
         /// 话务员办件统计
         /// </summary>
@@ -264,22 +238,22 @@ namespace Hotline.Api.Controllers.Bi
             switch (dto.SortField)
             {
                 case "centreArchive":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.CentreArchive) : query.OrderByDescending(x => x.CentreArchive);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreArchive) : query.OrderByDescending(x => x.CentreArchive);
                     break;
                 case "centreCareOf":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.CentreCareOf) : query.OrderByDescending(x => x.CentreCareOf);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.CentreCareOf) : query.OrderByDescending(x => x.CentreCareOf);
                     break;
                 case "noCentreCareOf":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.NoCentreCareOf) : query.OrderByDescending(x => x.NoCentreCareOf);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.NoCentreCareOf) : query.OrderByDescending(x => x.NoCentreCareOf);
                     break;
                 case "invalid":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Invalid) : query.OrderByDescending(x => x.Invalid);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Invalid) : query.OrderByDescending(x => x.Invalid);
                     break;
                 case "repeat":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Repeat) : query.OrderByDescending(x => x.Repeat);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Repeat) : query.OrderByDescending(x => x.Repeat);
                     break;
                 case "subtotal":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Subtotal) : query.OrderByDescending(x => x.Subtotal);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Subtotal) : query.OrderByDescending(x => x.Subtotal);
                     break;
             }
 
@@ -508,31 +482,50 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("order-delay-data-list")]
         public async Task<IReadOnlyList<BiOrderDelayDataDto>> QueryOrderDelayDataList([FromQuery] QueryOrderDelayDataListRequest dto)
         {
-            if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+            return await _orderReportApplication.QueryOrderDelayDataList(dto).ToListAsync();
 
-            dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+        }
 
-            var IsCenter = _sessionContext.OrgIsCenter;
+        /// <summary>
+        /// 部门延期统计---导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("order-delay-data-list-export")]
+        public async Task<FileStreamResult> ExportQueryOrderDelayDataList([FromBody] ExportExcelDto<QueryOrderDelayDataListRequest> dto)
+        {
+            var query = _orderReportApplication.QueryOrderDelayDataList(dto.QueryDto);
+            List<BiOrderDelayDataDto> list;
+            if (dto.IsExportAll)
+            {
+                list = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                list = items;
+            }
 
-            var list = await _orderDelayRepository.Queryable()
-                .LeftJoin<SystemOrganize>((x, o) => x.ApplyOrgCode == o.Id)
-                .WhereIF(dto.StartTime.HasValue, (x, o) => x.CreationTime >= dto.StartTime)
-                .WhereIF(dto.EndTime.HasValue, (x, o) => x.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Contains(dto.OrgName))
-                .WhereIF(IsCenter == false, x => x.ApplyOrgCode.StartsWith(_sessionContext.RequiredOrgId))
-                .GroupBy(x => new { x.ApplyOrgCode, x.ApplyOrgName })
-                .Select(x => new BiOrderDelayDataDto
-                {
-                    OrgName = x.ApplyOrgName,
-                    OrgCode = x.ApplyOrgCode,
-                    PassTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Pass, 1, 0)),
-                    NoPassTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.NoPass, 1, 0)),
-                    ExaminingTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Examining, 1, 0)),
-                    AllTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Pass, 1, 0)) + SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.NoPass, 1, 0)) + SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Examining, 1, 0))
+            list.Add(new BiOrderDelayDataDto()
+            {
+                OrgName = "合计",
+                OrgCode = "",
+                AllTotal = list.Sum(p => p.AllTotal),
+                PassTotal = list.Sum(p => p.PassTotal),
+                NoPassTotal = list.Sum(p => p.NoPassTotal),
+                ExaminingTotal = list.Sum(p => p.ExaminingTotal)
+            });
 
-                }).ToListAsync();
+            var orderDtos = _mapper.Map<ICollection<BiOrderDelayDataDto>>(list);
 
-            return list;
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = orderDtos
+                .Select(stu => _mapper.Map(stu, typeof(BiOrderDelayDataDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "部门延期统计数据");
         }
 
         /// <summary>
@@ -543,22 +536,43 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("order-delay-data-detail")]
         public async Task<PagedDto<OrderDelayDto>> QueryOrderDelayDataDetail([FromQuery] QueryOrderDelayDataDetailRequest dto)
         {
-            if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+            var (total, items) = await _orderReportApplication.QueryOrderDelayDataDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
-            dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+            return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
+        }
 
-            var (total, items) = await _orderDelayRepository.Queryable()
-                .Includes(x => x.Order)
-                .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-                .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), x => x.ApplyOrgCode == dto.OrgCode)
-                .WhereIF(dto.Type is 1, x => x.DelayState == EDelayState.Pass)
-                .WhereIF(dto.Type is 2, x => x.DelayState == EDelayState.NoPass)
-                .WhereIF(dto.Type is 3, x => x.DelayState == EDelayState.Examining)
-                .WhereIF(dto.Type is 4, x => x.DelayState < EDelayState.Withdraw)
-                .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+        /// <summary>
+        /// 部门延期统计明细--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("order-delay-data-detail-export")]
+        public async Task<FileStreamResult> ExportQueryOrderDelayDataDetail([FromBody] ExportExcelDto<QueryOrderDelayDataDetailRequest> dto)
+        {
+            var query = _orderReportApplication.QueryOrderDelayDataDetail(dto.QueryDto);
+            List<OrderDelay> list;
+            if (dto.IsExportAll)
+            {
+                list = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                list = items;
+            }
 
-            return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
+
+            var orderDtos = _mapper.Map<ICollection<OrderDelayDto>>(list);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = orderDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderDelayDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "部门延期统计明细数据");
         }
 
         /// <summary>
@@ -590,13 +604,13 @@ namespace Hotline.Api.Controllers.Bi
             switch (dto.SortField)
             {
                 case "cause":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Cause) : query.OrderByDescending(x => x.Cause);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Cause) : query.OrderByDescending(x => x.Cause);
                     break;
                 case "orderNum":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.OrderNum) : query.OrderByDescending(x => x.OrderNum);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.OrderNum) : query.OrderByDescending(x => x.OrderNum);
                     break;
                 case "maxSpecialTime":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.MaxSpecialTime) : query.OrderByDescending(x => x.MaxSpecialTime);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.MaxSpecialTime) : query.OrderByDescending(x => x.MaxSpecialTime);
                     break;
             }
             var (total, items) = await query.ToPagedListAsync(dto, HttpContext.RequestAborted);
@@ -671,34 +685,34 @@ namespace Hotline.Api.Controllers.Bi
             switch (dto.SortField)
             {
                 case "validAccept":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.ValidAccept) : query.OrderByDescending(x => x.ValidAccept);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.ValidAccept) : query.OrderByDescending(x => x.ValidAccept);
                     break;
                 case "consult":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Consult) : query.OrderByDescending(x => x.Consult);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Consult) : query.OrderByDescending(x => x.Consult);
                     break;
                 case "report":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Report) : query.OrderByDescending(x => x.Report);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Report) : query.OrderByDescending(x => x.Report);
                     break;
                 case "complaint":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Complaint) : query.OrderByDescending(x => x.Complaint);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Complaint) : query.OrderByDescending(x => x.Complaint);
                     break;
                 case "seekHelp":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.SeekHelp) : query.OrderByDescending(x => x.SeekHelp);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.SeekHelp) : query.OrderByDescending(x => x.SeekHelp);
                     break;
                 case "suggest":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Suggest) : query.OrderByDescending(x => x.Suggest);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Suggest) : query.OrderByDescending(x => x.Suggest);
                     break;
                 case "opinion":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Opinion) : query.OrderByDescending(x => x.Opinion);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Opinion) : query.OrderByDescending(x => x.Opinion);
                     break;
                 case "rests":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Rests) : query.OrderByDescending(x => x.Rests);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Rests) : query.OrderByDescending(x => x.Rests);
                     break;
                 case "benefitThePeople":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.BenefitThePeople) : query.OrderByDescending(x => x.BenefitThePeople);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.BenefitThePeople) : query.OrderByDescending(x => x.BenefitThePeople);
                     break;
                 case "praise":
-                    query = dto.SortRule == 0 ? query.OrderBy(x => x.Praise) : query.OrderByDescending(x => x.Praise);
+                    query = dto.SortRule is 0 ? query.OrderBy(x => x.Praise) : query.OrderByDescending(x => x.Praise);
                     break;
                 default:
                     query = query.OrderByDescending(x => x.ValidAccept);
@@ -847,95 +861,11 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="LineNum"></param>
         /// <returns></returns>
         [HttpGet("visit-org-satisfaction-statistics")]
-        public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgSatisfactionStatistics(DateTime StartDate, DateTime EndDate, string OrgName, int TypeId, string? LineNum)
+        public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgSatisfactionStatistics([FromQuery] PagedKeywordSonRequest dto)
         {
-            EndDate = EndDate.AddDays(1).AddSeconds(-1);
-
-            bool IsCenter = _sessionContext.OrgIsCenter;
-
-            var list = _orderVisitDetailRepository.Queryable()
-                .Where(x => x.OrderVisit.VisitTime >= StartDate && x.OrderVisit.VisitTime <= EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
-                .WhereIF(string.IsNullOrEmpty(OrgName) == false, x => x.VisitOrgName.Contains(OrgName))
-                .WhereIF(string.IsNullOrEmpty(LineNum) == false, x => x.OrderVisit.Order.CallRecord.Gateway.Contains(LineNum))
-                .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId));
-
-            var data = new List<VisitAndOrgSatisfactionStatisticsDto>();
-
-            if (IsCenter && list != null)
-            {
-                data = await list.GroupBy(x => new
-                {
-                    VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
-                })
-                .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
-                    TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
-                    VerySatisfiedCount = SqlFunc.IIF(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(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(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(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(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(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(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))),//未接通
-                })
-                .MergeTable()
-                .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
-                .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgName = o.Name,
-                    OrgCode = it.OrgCode,
-                    OrgType = o.OrgType,
-                    TotalSumCount = it.TotalSumCount,
-                    VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
-                    SatisfiedCount = it.SatisfiedCount, //满意数
-                    RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
-                    DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
-                    NoSatisfiedCount = it.NoSatisfiedCount,//不满意
-                    NoEvaluateCount = it.NoEvaluateCount,//未做评价
-                    NoPutThroughCount = it.NoPutThroughCount,//未接通
-                })
-                .ToListAsync();
-            }
-            else
-            {
-                data = await list.GroupBy(x => new
-                {
-                    x.VisitOrgCode
-                })
-                .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgCode = x.VisitOrgCode,
-                    TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
-                    VerySatisfiedCount = SqlFunc.IIF(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(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(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(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(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(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(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))),//未接通
-                })
-                .MergeTable()
-                .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
-                .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgName = o.Name,
-                    OrgCode = it.OrgCode,
-                    OrgType = o.OrgType,
-                    TotalSumCount = it.TotalSumCount,
-                    VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
-                    SatisfiedCount = it.SatisfiedCount, //满意数
-                    RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
-                    DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
-                    NoSatisfiedCount = it.NoSatisfiedCount,//不满意
-                    NoEvaluateCount = it.NoEvaluateCount,//未做评价
-                    NoPutThroughCount = it.NoPutThroughCount,//未接通
-                })
-                .ToListAsync();
-            }
-
+            var data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto);
 
-            var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
             {
                 OrgName = "区县合计",
                 TotalSumCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
@@ -978,6 +908,63 @@ namespace Hotline.Api.Controllers.Bi
             return new VisitAndOrgSatisfactionStatisticsResultDto { DataList = data, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
         }
 
+        /// <summary>
+        /// 部门满意度统计导出
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("visit-org-satisfaction-statistics/_export")]
+        public async Task<FileStreamResult> VisitAndOrgSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
+        {
+	        List<VisitAndOrgSatisfactionStatisticsDto> data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto.QueryDto);
+			var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "区县合计",
+				TotalSumCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
+			};
+			var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "市直合计",
+				TotalSumCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
+			};
+			var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "总计",
+				TotalSumCount = data.Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = data.Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
+			};
+			data.Add(countySumModel);
+			data.Add(citySumModel);
+			data.Add(sumModel);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = data
+             .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
+             .Cast<object>()
+             .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "部门满意度统计数据");
+        }
 
 
         /// <summary>
@@ -990,54 +977,10 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="LineNum"></param>
         /// <returns></returns>
         [HttpGet("visit-org-statisfaction-org-detail")]
-        public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgStatisfactionOrgDetail(DateTime StartDate, DateTime EndDate, string OrgCode, int TypeId, string? LineNum)
+        public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgStatisfactionOrgDetail([FromQuery] PagedKeywordSonRequest dto)
         {
-            EndDate = EndDate.AddDays(1).AddSeconds(-1);
-
-            bool IsCenter = _sessionContext.OrgIsCenter;
-
-            var list = await _systemOrganizeRepository.Queryable().Where(x => x.Id.StartsWith(OrgCode))
-                .LeftJoin<OrderVisitDetail>((x, it) => x.Id == it.VisitOrgCode)
-                .Where((x, it) => it.OrderVisit.VisitTime >= StartDate && it.OrderVisit.VisitTime <= EndDate && it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
-                .WhereIF(OrgCode == "001", (x, it) => it.VisitOrgCode == OrgCode)
-                .WhereIF(OrgCode != "001", (x, it) => it.VisitOrgCode.StartsWith(OrgCode))
-                .WhereIF(!string.IsNullOrEmpty(LineNum), (x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(LineNum))
-                .WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
-                 .GroupBy((x, it) => new
-                 {
-                     VisitOrgCode = it.VisitOrgCode
-                 })
-                 .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
-                 {
-                     OrgCode = it.VisitOrgCode,
-                     TotalSumCount = SqlFunc.AggregateCount(it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9"))),
-                     VerySatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
-                     SatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
-                     RegardedAsSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
-                     DefaultSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
-                     NoSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
-                     NoEvaluateCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
-                     NoPutThroughCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "6", 1, 0)))//未接通
-                 })
-                 .MergeTable()
-                 .LeftJoin<SystemOrganize>((x, it) => x.OrgCode == it.Id)
-                .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgName = it.Name,
-                    OrgCode = x.OrgCode,
-                    OrgType = it.OrgType,
-                    TotalSumCount = x.TotalSumCount,
-                    VerySatisfiedCount = x.VerySatisfiedCount,//非常满意数
-                    SatisfiedCount = x.SatisfiedCount, //满意数
-                    RegardedAsSatisfiedCount = x.RegardedAsSatisfiedCount,//视为满意
-                    DefaultSatisfiedCount = x.DefaultSatisfiedCount,//默认满意
-                    NoSatisfiedCount = x.NoSatisfiedCount,//不满意
-                    NoEvaluateCount = x.NoEvaluateCount,//未做评价
-                    NoPutThroughCount = x.NoPutThroughCount,//未接通
-                })
-                .ToListAsync();
-
-            var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto);
+			var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
             {
                 OrgName = "区县合计",
                 TotalSumCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
@@ -1079,40 +1022,113 @@ namespace Hotline.Api.Controllers.Bi
             return new VisitAndOrgSatisfactionStatisticsResultDto { DataList = list, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
         }
 
-
-        /// <summary>
-        /// 部门满意度明细
-        /// </summary>
-        /// <param name="StartDate"></param>
-        /// <param name="EndDate"></param>
-        /// <param name="OrgCode"></param>
-        /// <param name="TypeId"></param>
-        /// <param name="LineNum"></param>
-        /// <returns></returns>
-        [HttpGet("visit-org-satisfaction-detail")]
+		/// <summary>
+		/// 部门满意度统计导出
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("visit-org-statisfaction-org-detail/_export")]
+		public async Task<FileStreamResult> VisitAndOrgStatisfactionOrgDetailExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
+		{
+			var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto.QueryDto);
+			var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "区县合计",
+				TotalSumCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
+			};
+			var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "市直合计",
+				TotalSumCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
+			};
+			var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "总计",
+				TotalSumCount = list.Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = list.Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
+			};
+			list.Add(countySumModel);
+			list.Add(citySumModel);
+			list.Add(sumModel);
+			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+			var dtos = list
+			 .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
+			 .Cast<object>()
+			 .ToList();
+
+			var stream = ExcelHelper.CreateStream(dtos);
+
+			return ExcelStreamResult(stream, "部门满意度统计数据");
+		}
+
+		/// <summary>
+		/// 部门满意度明细
+		/// </summary>
+		/// <param name="StartDate"></param>
+		/// <param name="EndDate"></param>
+		/// <param name="OrgCode"></param>
+		/// <param name="TypeId"></param>
+		/// <param name="LineNum"></param>
+		/// <returns></returns>
+		[HttpGet("visit-org-satisfaction-detail")]
         public async Task<PagedDto<OrderVisitDetailDto>> VisitAndOrgSatisfactionDetail([FromQuery] VisitAndOrgSatisfactionDetailDto dto)
         {
-            dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
-
-            bool IsCenter = _sessionContext.OrgIsCenter;
-
-            var (total, items) = await _orderVisitDetailRepository.Queryable()
-                .Includes(x => x.OrderVisit, o => o.Order, d => d.CallRecord)
-                .Where(x => x.OrderVisit.VisitTime >= dto.StartDate && x.OrderVisit.VisitTime <= dto.EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
-                .WhereIF(dto.OrgCode == "001", x => x.VisitOrgCode == dto.OrgCode)
-                //.WhereIF(dto.OrgCode != "001", x => x.VisitOrgCode == dto.OrgCode).
-                .WhereIF(dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
-                .WhereIF(IsCenter == true && dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
-                .WhereIF(IsCenter == true && dto.IsOnlyMy == null, x => x.VisitOrgCode.StartsWith(dto.OrgCode))
-                .WhereIF(IsCenter == false, x => x.VisitOrgCode == dto.OrgCode)
-                .WhereIF(dto.TypeId == 1, x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.DateValue)
-                .WhereIF(dto.TypeId == 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == dto.DateValue)
-                .WhereIF(!string.IsNullOrEmpty(dto.LineNum), x => x.OrderVisit.Order.CallRecord.Gateway == dto.LineNum)
-                .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+            var (total, items) = await _orderApplication.VisitAndOrgSatisfactionDetail(dto)
+				.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
             return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
         }
 
+		/// <summary>
+		/// 部门满意度明细导出
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("visit-org-satisfaction-detail/_export")]
+        public async Task<FileStreamResult> VisitAndOrgSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndOrgSatisfactionDetailDto> dto)
+        {
+            var query = _orderApplication.VisitAndOrgSatisfactionDetail(dto.QueryDto);
+            List<OrderVisitDetail> data;
+            if (dto.IsExportAll)
+            {
+	            data = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                data = items;
+            }
+
+            var dataDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(data);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = dataDtos
+				.Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
 
+            return ExcelStreamResult(stream, "部门满意度明细数据");
+        }
 
 
         /// <summary>
@@ -1564,18 +1580,18 @@ namespace Hotline.Api.Controllers.Bi
                 OrgName = "合计",
                 OrgType = EOrgType.City,
                 // OrderCountNum = items.Sum(p => p.OrderCountNum),
-                YBOrderCountNum = items.Sum(p => p.YBOrderCountNum),
-                ZBOrderCountNum = items.Sum(p => p.ZBOrderCountNum),
+                YbOrderCountNum = items.Sum(p => p.YbOrderCountNum),
+                ZbOrderCountNum = items.Sum(p => p.ZbOrderCountNum),
                 Archived = items.Sum(p => p.Archived),
                 ToBeArchived = items.Sum(p => p.ToBeArchived),
                 WaitPublished = items.Sum(p => p.WaitPublished),
                 PublishedOpen = items.Sum(p => p.PublishedOpen),
                 PublishedNoOpen = items.Sum(p => p.PublishedNoOpen),
-                YBOverdue = items.Sum(p => p.YBOverdue),
-                ZBOverdue = items.Sum(p => p.ZBOverdue),
+                YbOverdue = items.Sum(p => p.YbOverdue),
+                ZbOverdue = items.Sum(p => p.ZbOverdue),
                 CompleteOnTime = items.Sum(p => p.CompleteOnTime),
-                HQYBOverdue = items.Sum(p => p.HQYBOverdue),
-                HQZBOverdue = items.Sum(p => p.HQZBOverdue),
+                HqybOverdue = items.Sum(p => p.HqybOverdue),
+                HqzbOverdue = items.Sum(p => p.HqzbOverdue),
                 DelayEnd = items.Sum(p => p.DelayEnd),
                 DelayWait = items.Sum(p => p.DelayWait),
                 OrderDelayCount = items.Sum(p => p.OrderDelayCount),
@@ -1616,18 +1632,18 @@ namespace Hotline.Api.Controllers.Bi
                 OrgName = "合计",
                 OrgType = EOrgType.City,
                 // OrderCountNum = items.Sum(p => p.OrderCountNum),
-                YBOrderCountNum = list.Sum(p => p.YBOrderCountNum),
-                ZBOrderCountNum = list.Sum(p => p.ZBOrderCountNum),
+                YbOrderCountNum = list.Sum(p => p.YbOrderCountNum),
+                ZbOrderCountNum = list.Sum(p => p.ZbOrderCountNum),
                 Archived = list.Sum(p => p.Archived),
                 ToBeArchived = list.Sum(p => p.ToBeArchived),
                 WaitPublished = list.Sum(p => p.WaitPublished),
                 PublishedOpen = list.Sum(p => p.PublishedOpen),
                 PublishedNoOpen = list.Sum(p => p.PublishedNoOpen),
-                YBOverdue = list.Sum(p => p.YBOverdue),
-                ZBOverdue = list.Sum(p => p.ZBOverdue),
+                YbOverdue = list.Sum(p => p.YbOverdue),
+                ZbOverdue = list.Sum(p => p.ZbOverdue),
                 CompleteOnTime = list.Sum(p => p.CompleteOnTime),
-                HQYBOverdue = list.Sum(p => p.HQYBOverdue),
-                HQZBOverdue = list.Sum(p => p.HQZBOverdue),
+                HqybOverdue = list.Sum(p => p.HqybOverdue),
+                HqzbOverdue = list.Sum(p => p.HqzbOverdue),
                 DelayEnd = list.Sum(p => p.DelayEnd),
                 DelayWait = list.Sum(p => p.DelayWait),
                 OrderDelayCount = list.Sum(p => p.OrderDelayCount),
@@ -1671,18 +1687,18 @@ namespace Hotline.Api.Controllers.Bi
                 OrgName = "合计",
                 OrgType = EOrgType.City,
                 // OrderCountNum = items.Sum(p => p.OrderCountNum),
-                YBOrderCountNum = items.Sum(p => p.YBOrderCountNum),
-                ZBOrderCountNum = items.Sum(p => p.ZBOrderCountNum),
+                YbOrderCountNum = items.Sum(p => p.YbOrderCountNum),
+                ZbOrderCountNum = items.Sum(p => p.ZbOrderCountNum),
                 Archived = items.Sum(p => p.Archived),
                 ToBeArchived = items.Sum(p => p.ToBeArchived),
                 WaitPublished = items.Sum(p => p.WaitPublished),
                 PublishedOpen = items.Sum(p => p.PublishedOpen),
                 PublishedNoOpen = items.Sum(p => p.PublishedNoOpen),
-                YBOverdue = items.Sum(p => p.YBOverdue),
-                ZBOverdue = items.Sum(p => p.ZBOverdue),
+                YbOverdue = items.Sum(p => p.YbOverdue),
+                ZbOverdue = items.Sum(p => p.ZbOverdue),
                 CompleteOnTime = items.Sum(p => p.CompleteOnTime),
-                HQYBOverdue = items.Sum(p => p.HQYBOverdue),
-                HQZBOverdue = items.Sum(p => p.HQZBOverdue),
+                HqybOverdue = items.Sum(p => p.HqybOverdue),
+                HqzbOverdue = items.Sum(p => p.HqzbOverdue),
                 DelayEnd = items.Sum(p => p.DelayEnd),
                 DelayWait = items.Sum(p => p.DelayWait),
                 OrderDelayCount = items.Sum(p => p.OrderDelayCount),
@@ -1723,18 +1739,18 @@ namespace Hotline.Api.Controllers.Bi
                 OrgName = "合计",
                 OrgType = EOrgType.City,
                 // OrderCountNum = items.Sum(p => p.OrderCountNum),
-                YBOrderCountNum = list.Sum(p => p.YBOrderCountNum),
-                ZBOrderCountNum = list.Sum(p => p.ZBOrderCountNum),
+                YbOrderCountNum = list.Sum(p => p.YbOrderCountNum),
+                ZbOrderCountNum = list.Sum(p => p.ZbOrderCountNum),
                 Archived = list.Sum(p => p.Archived),
                 ToBeArchived = list.Sum(p => p.ToBeArchived),
                 WaitPublished = list.Sum(p => p.WaitPublished),
                 PublishedOpen = list.Sum(p => p.PublishedOpen),
                 PublishedNoOpen = list.Sum(p => p.PublishedNoOpen),
-                YBOverdue = list.Sum(p => p.YBOverdue),
-                ZBOverdue = list.Sum(p => p.ZBOverdue),
+                YbOverdue = list.Sum(p => p.YbOverdue),
+                ZbOverdue = list.Sum(p => p.ZbOverdue),
                 CompleteOnTime = list.Sum(p => p.CompleteOnTime),
-                HQYBOverdue = list.Sum(p => p.HQYBOverdue),
-                HQZBOverdue = list.Sum(p => p.HQZBOverdue),
+                HqybOverdue = list.Sum(p => p.HqybOverdue),
+                HqzbOverdue = list.Sum(p => p.HqzbOverdue),
                 DelayEnd = list.Sum(p => p.DelayEnd),
                 DelayWait = list.Sum(p => p.DelayWait),
                 OrderDelayCount = list.Sum(p => p.OrderDelayCount),
@@ -1796,11 +1812,11 @@ namespace Hotline.Api.Controllers.Bi
             var query = _orderReportApplication.GetDepartmentalProcessingStatisticsList(dto.QueryDto, HttpContext.RequestAborted)
                  .LeftJoin<Order>((x, o) => x.Id == o.Id)
                  .Select((x, o) => new { o });
-            List<Orders.Order> list = new List<Order>();
+            List<OrderDto> list = new List<OrderDto>();
             if (dto.IsExportAll)
             {
                 var listData = await query.ToListAsync(HttpContext.RequestAborted);
-                listData.Select(d =>
+                list = listData.Select(d =>
                 {
                     var dto = _mapper.Map<OrderDto>(d.o);
                     return dto;
@@ -1810,18 +1826,18 @@ namespace Hotline.Api.Controllers.Bi
             {
                 RefAsync<int> total = 0;
                 var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
-                listData.Select(d =>
+                list = listData.Select(d =>
                 {
                     var dto = _mapper.Map<OrderDto>(d.o);
                     return dto;
                 }).ToList();
             }
 
-            var orderDtos = _mapper.Map<ICollection<OrderDto>>(list);
+            //   var orderDtos = _mapper.Map<ICollection<OrderDto>>(list);
 
             dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
 
-            var dtos = orderDtos
+            var dtos = list
                 .Select(stu => _mapper.Map(stu, typeof(DepartmentalProcessingStatisticsDataDto), dynamicClass))
                 .Cast<object>()
                 .ToList();
@@ -2049,26 +2065,39 @@ namespace Hotline.Api.Controllers.Bi
             if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
                 throw UserFriendlyException.SameMessage("请选择时间!");
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
-            var (total, items) = await _orderSpecialDetailRepository.Queryable()
-                .Includes(x => x.OrderSpecial)
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName!))
-                .Where(x => x.OrderSpecial.ESpecialType == ESpecialType.ReTransact)
-                .Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
-                .Where(x => x.OrderSpecial.CreationTime <= dto.EndTime)
-                .GroupBy(x => new { Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"), x.OrgId, x.OrgName })
-                .Select(x => new OrderReTransactVo
-                {
-                    Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"),
-                    OrgId = x.OrgId,
-                    OrgName = x.OrgName,
-                    Num = SqlFunc.AggregateCount(1)
-                }).MergeTable()
-                .OrderByIF(dto.SortRule == 0, x => x.Num, OrderByType.Asc)
-                .OrderByIF(dto.SortRule == 1, x => x.Num, OrderByType.Desc)
+            var query = _orderApplication.OrderReTransact(dto);
+            var (total, items) = await query
                 .ToPagedListAsync(dto, HttpContext.RequestAborted);
+            items.Add(new OrderReTransactVo
+            {
+                OrgName = "合计",
+                Num = items.Select(s => s.Num).Sum(),
+            });
             return new PagedDto<OrderReTransactVo>(total, _mapper.Map<IReadOnlyList<OrderReTransactVo>>(items));
         }
 
+        /// <summary>
+        /// 回退错件导出
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("reTransact/_export")]
+        public async Task<FileStreamResult> OrderReTransactExport([FromBody] ExportExcelDto<QueryOrderReTransactRequest> dto)
+        {
+            var query = _orderApplication.OrderReTransact(dto.QueryDto);
+            List<OrderReTransactVo> data;
+            data = await query.ToListAsync(HttpContext.RequestAborted);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = data
+             .Select(stu => _mapper.Map(stu, typeof(OrderReTransactVo), dynamicClass))
+             .Cast<object>()
+             .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "回退错件统计数据");
+        }
+
+
         /// <summary>
         /// 回退错件明细
         /// </summary>
@@ -2080,24 +2109,52 @@ namespace Hotline.Api.Controllers.Bi
             if (!dto.StartTime.HasValue || !dto.EndTime.HasValue)
                 throw UserFriendlyException.SameMessage("请选择时间!");
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
-            var (total, items) = await _orderSpecialDetailRepository.Queryable()
-                .Includes(x => x.OrderSpecial, s => s.Order)
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName!))
-                .WhereIF(!string.IsNullOrEmpty(dto.ErrorName), x => x.ErrorName.Contains(dto.ErrorName!))
-                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderSpecial!.Order!.No!.Contains(dto.No!))
-                .Where(x => x.OrderSpecial.ESpecialType == ESpecialType.ReTransact)
-                .Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
-                .Where(x => x.OrderSpecial.CreationTime <= dto.EndTime)
-                .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+            var query = _orderApplication.QueryOrderSourceDetail(dto);
+            var (total, items) = await
+                query.ToPagedListAsync(dto, HttpContext.RequestAborted);
             return new PagedDto<OrderSpecialDetailDto>(total, _mapper.Map<IReadOnlyList<OrderSpecialDetailDto>>(items));
         }
 
+        /// <summary>
+        /// 回退错件明细导出
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("reTransact_detail/_export")]
+        public async Task<FileStreamResult> OrderReTransactDetailExport([FromBody] ExportExcelDto<QueryOrderReTransactDetailRequest> dto)
+        {
+            var query = _orderApplication.QueryOrderSourceDetail(dto.QueryDto);
+            List<OrderSpecialDetail> data;
+            if (dto.IsExportAll)
+            {
+                data = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                data = items;
+            }
+
+            var dataDtos = _mapper.Map<ICollection<OrderSpecialDetailDto>>(data);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = dataDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderSpecialDetailDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "回退错件明细列表数据");
+        }
+
         /// <summary>
         /// 获取基本信息
         /// </summary>
         /// <param name="id"></param>
         /// <returns></returns>
-		[HttpGet("reTransact_base")]
+        [HttpGet("reTransact_base")]
         public async Task<object> ReTransactBaseData()
         {
             var rsp = new

+ 72 - 35
src/Hotline.Api/Controllers/OrderController.cs

@@ -1580,7 +1580,7 @@ public class OrderController : BaseController
             .Includes(x => x.OrderVisit)
             .Includes(x => x.OrderVisit, y => y.Order)
             .Includes(x => x.OrderVisit, y => y.Employee)
-            .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && (int)s.Status < 2 && s.IsDeleted == false)
+            .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status <  EScreenStatus.End && s.IsDeleted == false)
             .Where((x, s) => s.Id == null)
             .WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage == true, x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
@@ -2423,11 +2423,18 @@ public class OrderController : BaseController
                 _sessionContext.RequiredOrgId, _sessionContext.OrgName,
                 _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName));
         }
-
-        //var dto = _mapper.Map<OrderDto>(order!);
-        //dto.CountersignId = countersignId;
-        //dto.CanHandle = order.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
-        dto.IsCanDelay = !order.OrderDelays.Any(x => x.DelayState == EDelayState.Examining);
+		var setting = _systemSettingCacheManager.GetSetting(SettingConstants.SeatsMonitor);
+		var settingStr = setting?.SettingValue;
+		var roles = _sessionContext.Roles;
+		foreach (var item in settingStr)
+		{
+			if (roles != null && roles.Contains(item)) dto.CanHandle = true;
+		}
+
+		//var dto = _mapper.Map<OrderDto>(order!);
+		//dto.CountersignId = countersignId;
+		//dto.CanHandle = order.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
+		dto.IsCanDelay = !order.OrderDelays.Any(x => x.DelayState == EDelayState.Examining);
         if (order.OrderDelays.Any(x => x.DelayState == EDelayState.Examining && x.ApplyOrgCode == _sessionContext.RequiredOrgId))
         {
             dto.CanHandle = false;
@@ -3214,16 +3221,18 @@ public class OrderController : BaseController
             dto.StartTimeEnd = dto.StartTimeEnd.Value.AddDays(1).AddSeconds(-1);
 
         var (total, items) = await _orderRepository.Queryable()
-	        .LeftJoin<WorkflowStep>((d, step) => d.Id == step.ExternalId)
-	        .Where((d, step) =>
-		        ((string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)) ||
-		         (!string.IsNullOrEmpty(d.WorkflowId) &&
-		          ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
-		           (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
-		           (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))) &&
-		          ( step.Status != EWorkflowStepStatus.Handled )
-		         )))
-			//.Where(d => d.Workflow.Steps.Any(s => s.Status < EWorkflowStepStatus.Handled && s.HandlerOrgId == OrgSeedData.CenterId))
+            //.LeftJoin<WorkflowStep>((d, step) => d.Id == step.ExternalId)
+            //.Where((d, step) =>
+            // ((string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)) ||
+            //  (!string.IsNullOrEmpty(d.WorkflowId) &&
+            //   ((step.FlowAssignType == EFlowAssignType.User && !string.IsNullOrEmpty(step.HandlerId) && step.HandlerId == _sessionContext.RequiredUserId) ||
+            //    (step.FlowAssignType == EFlowAssignType.Org && !string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId == _sessionContext.RequiredOrgId) ||
+            //    (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) && _sessionContext.Roles.Contains(step.RoleId))) &&
+            //   ( step.Status != EWorkflowStepStatus.Handled )
+            //  )))
+            //.Where(d => d.Workflow.Steps.Any(s => s.Status < EWorkflowStepStatus.Handled && s.HandlerOrgId == OrgSeedData.CenterId))
+            .LeftJoin<WorkflowStep>((d, step) => d.Id == step.ExternalId)
+            .Where((d, step) => (step.Id == null || (step.HandlerOrgId == OrgSeedData.CenterId && step.Status < EWorkflowStepStatus.Handled )))
             .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
             .Where(d => d.Status != EOrderStatus.BackToProvince && d.Status < EOrderStatus.Filed)
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No!.Contains(dto.No!))
@@ -5025,8 +5034,9 @@ public class OrderController : BaseController
         if (order.IsSigned())
             throw new UserFriendlyException("该工单已被签收");
         order.Sign(_sessionContext.RequiredUserId, _sessionContext.UserName);
+        order.AutoAccept(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.StaffNo);
 
-        if (!string.IsNullOrEmpty(order.WorkflowId))
+		if (!string.IsNullOrEmpty(order.WorkflowId))
         {
             var workflow = await _workflowDomainService.SignToSomebodyAsync(
                 order.WorkflowId,
@@ -5655,22 +5665,24 @@ public class OrderController : BaseController
     [HttpGet("migration/{orderId}")]
     public async Task<GetOrderMigrationDto> Migration(string orderId)
     {
-        var steps = await _workflowStepRepository.Queryable()
-            .Where(d => d.ExternalId == orderId && d.Status != EWorkflowStepStatus.Handled)
-            .ToListAsync(HttpContext.RequestAborted);
-
-        if (!steps.Any())
-            throw new UserFriendlyException("未查询到待办理节点");
-        if (steps.Count > 1)
-            throw new UserFriendlyException("多个待办理节点暂不支持平移");
-        var step = steps.First();
-        if (step.BusinessType is not EBusinessType.Center and not EBusinessType.Send)
-            throw UserFriendlyException.SameMessage("当前办理节点非中心暂不支持平移");
-
-        var setting = step.BusinessType is EBusinessType.Center
-            ? _systemSettingCacheManager.GetSetting(SettingConstants.RoleZuoXi)
-            : _systemSettingCacheManager.GetSetting(SettingConstants.RolePaiDan);
-        var roles = setting?.SettingValue.ToList();
+        var order = await _orderRepository.GetAsync(orderId, HttpContext.RequestAborted);
+        var step = new WorkflowStep();
+        var setting = _systemSettingCacheManager.GetSetting(SettingConstants.RoleZuoXi);
+        if (!string.IsNullOrEmpty(order.WorkflowId))
+        {
+	        var steps = await _workflowStepRepository.Queryable()
+		        .Where(d => d.ExternalId == orderId && d.Status != EWorkflowStepStatus.Handled)
+		        .ToListAsync(HttpContext.RequestAborted);
+			if (steps.Count > 1)
+		        throw new UserFriendlyException("多个待办理节点暂不支持平移");
+	        step = steps.First();
+	        if (step.BusinessType is not EBusinessType.Center and not EBusinessType.Send)
+		        throw UserFriendlyException.SameMessage("当前办理节点非中心暂不支持平移");
+	        setting = step.BusinessType is EBusinessType.Center
+		        ? _systemSettingCacheManager.GetSetting(SettingConstants.RoleZuoXi)
+		        : _systemSettingCacheManager.GetSetting(SettingConstants.RolePaiDan);
+		}
+		var roles = setting?.SettingValue.ToList();
         var users = await _userRepository.Queryable()
             .Includes(d => d.Organization)
             .Includes(d => d.Roles)
@@ -5679,7 +5691,8 @@ public class OrderController : BaseController
         return new GetOrderMigrationDto
         {
             StepId = step.Id,
-            Handlers = users.Select(d => new OrderMigrationHandler
+            OrderId = orderId,
+			Handlers = users.Select(d => new OrderMigrationHandler
             {
                 UserId = d.Id,
                 Username = d.Name,
@@ -5690,5 +5703,29 @@ public class OrderController : BaseController
         };
     }
 
-    #endregion
+
+	/// <summary>
+	/// 工单平移
+	/// </summary>
+	[HttpPost("change-handler")]
+    public async Task ChangeHandler([FromBody] ChangeHandlerDto dto)
+    {
+        if (string.IsNullOrEmpty(dto.StepId))
+        {
+	        await _orderRepository.Updateable().SetColumns(o => new Orders.Order() { SignerId = dto.Handler.UserId, SignerName = dto.Handler.Username })
+		        .Where(o => o.Id == dto.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
+		}
+        else {
+			var step = await _workflowStepRepository.Queryable()
+				.Includes(d => d.WorkflowTrace)
+				.FirstAsync(d => d.Id == dto.StepId, HttpContext.RequestAborted);
+			if (step is null)
+				throw new UserFriendlyException("无效节点编号");
+			await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, ICollection<WorkflowStep> steps)>
+			{
+				new(dto.Handler.UserId,dto.Handler.Username,dto.Handler.OrgId,dto.Handler.OrgName, new List<WorkflowStep>{step})
+			}, HttpContext.RequestAborted);
+		}
+    }
+	#endregion
 }

+ 19 - 7
src/Hotline.Api/Controllers/TestController.cs

@@ -587,8 +587,8 @@ public class TestController : BaseController
 
         var workflowIds = orders.Select(d => d.WorkflowId).ToList();
         var workflows = await _workflowRepository.Queryable()
-            .Includes(d=>d.Steps)
-            .Includes(d=>d.Traces)
+            .Includes(d=>d.Steps, x=>x.WorkflowTrace)
+            //.Includes(d=>d.Traces)
             .Where(d => workflowIds.Contains(d.Id))
             .ToListAsync(HttpContext.RequestAborted);
 
@@ -613,11 +613,23 @@ public class TestController : BaseController
                 : 0;
             order.File(now, handleDuration, fileDuration, allDuration);
 
-            var endTrace = workflow.Traces.FirstOrDefault(d => d.StepType == EStepType.End);
-            if(endTrace is null) continue;
-            var trace = workflow.Traces.FirstOrDefault(d => d.Id == endTrace.PrevStepId);
-            if(trace is null) continue;
+            var endStep = workflow.Steps.FirstOrDefault(d => d.StepType == EStepType.End);
+            //var endTrace = workflow.Steps.FirstOrDefault(d => d.WorkflowTrace.StepType == EStepType.End)?.WorkflowTrace;
+            if (endStep is null)
+            {
+                _logger.LogWarning($"endStep 为空, orderNo:{order.No}");
+                continue;
+            }
 
+            var step = workflow.Steps.FirstOrDefault(d => d.Id == endStep.PrevStepId);
+            //var trace = workflow.Steps.FirstOrDefault(d => d.WorkflowTrace.Id == endTrace.PrevStepId)?.WorkflowTrace;
+            if (step is null)
+            {
+                _logger.LogWarning($"step 为空, orderNo:{order.No}");
+                continue;
+            }
+
+            var trace = step.WorkflowTrace;
             order.FileUserId = trace.HandlerId;
             order.FileUserName = trace.HandlerName;
             order.FileUserOrgId = trace.HandlerOrgId;
@@ -645,12 +657,12 @@ public class TestController : BaseController
             updateOrders.Add(order);
 
             //var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken); //由CallAccept改为OtherAccept
-            var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept == order.CallId, HttpContext.RequestAborted);
             var orderFlowDto = new OrderFlowDto
             {
                 Order = _mapper.Map<OrderDto>(order),
                 WorkflowTrace = _mapper.Map<WorkflowTraceDto>(trace)
             };
+            var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept == order.CallId, HttpContext.RequestAborted);
             if (callRecord != null)
             {
                 orderFlowDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);

+ 1 - 1
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -190,7 +190,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var startTrace = _mapper.Map<WorkflowTrace>(startStep);
         startTrace.StepId = startStep.Id;
         startTrace.TraceType = EWorkflowTraceType.Normal;
-        _mapper.Map(dto, startTrace);
+        //_mapper.Map(dto, startTrace);
         await _workflowTraceRepository.AddAsync(startTrace, cancellationToken);
         workflow.Traces.Add(startTrace);
         startStep.WorkflowTrace = startTrace;

+ 4 - 2
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -67,8 +67,10 @@ public class OrderMapperConfigs : IRegister
             .Map(d => d.StartTime, s => s.CreationTime)
             .Ignore(d => d.Status)
             .Ignore(d => d.Title)
-            .Ignore(d => d.ExternalId)
-            .AfterMapping((s, d) =>
+            .Ignore(d => d.AcceptorId)
+            .Ignore(d => d.AcceptorName)
+            .Ignore(d => d.AcceptorStaffNo)
+			.AfterMapping((s, d) =>
             {
                 d.UpdateHandlingStatus(s.IsInCountersign);
             })

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

@@ -8,6 +8,7 @@ using System.Threading.Tasks;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Bi;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
@@ -96,5 +97,53 @@ namespace Hotline.Application.Orders
         /// <param name="dto"></param>
         /// <returns></returns>
         ISugarQueryable<Order> QueryOrderSourceDetail(QueryOrderSourceDetailRequest dto);
+
+		/// <summary>
+		/// 部门超期统计
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		ISugarQueryable<OrderBiOrgDataListVo> QueryOrgDataList(ReportPagedRequest dto);
+
+        /// <summary>
+        /// 部门超期统计明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+		ISugarQueryable<Order> QueryOrgDataListDetail(OrgDataListDetailRequest dto);
+
+		/// <summary>
+		/// 回退错件统计
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		ISugarQueryable<OrderReTransactVo> OrderReTransact(QueryOrderReTransactRequest dto);
+
+		/// <summary>
+		/// 回退错件明细统计
+        /// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		ISugarQueryable<OrderSpecialDetail> QueryOrderSourceDetail(QueryOrderReTransactDetailRequest dto);
+
+		/// <summary>
+		/// 部门满意度统计
+		/// </summary>
+		/// <returns></returns>
+		Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgSatisfactionStatistics(PagedKeywordSonRequest dto);
+
+		/// <summary>
+		/// 子部门满意度
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgStatisfactionOrgDetail(PagedKeywordSonRequest dto);
+
+		/// <summary>
+		/// 部门满意度明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		ISugarQueryable<OrderVisitDetail> VisitAndOrgSatisfactionDetail(VisitAndOrgSatisfactionDetailDto dto);
 	}
 }

+ 339 - 8
src/Hotline.Application/Orders/OrderApplication.cs

@@ -32,6 +32,9 @@ using XF.Domain.Constants;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
+using Hotline.Repository.SqlSugar.System;
+using Microsoft.AspNetCore.Mvc;
+using Hotline.Share.Dtos.Bi;
 
 namespace Hotline.Application.Orders;
 
@@ -51,8 +54,11 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
     private readonly IQualityApplication _qualityApplication;
     private readonly ICapPublisher _capPublisher;
+    private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
+    private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
+    private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
 
-    public OrderApplication(
+	public OrderApplication(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -66,8 +72,11 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         IRepository<OrderVisit> orderVisitRepository,
         IRepository<OrderVisitDetail> orderVisitDetailRepository,
         IQualityApplication qualityApplication,
-        ICapPublisher capPublisher
-        )
+        ICapPublisher capPublisher,
+        IRepository<SystemOrganize> systemOrganizeRepository,
+        IRepository<WorkflowCountersign> workflowCountersignRepository,
+        IRepository<OrderSpecialDetail> orderSpecialDetailRepository
+		)
     {
         _orderDomainService = orderDomainService;
         _workflowDomainService = workflowDomainService;
@@ -83,7 +92,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _orderVisitDetailRepository = orderVisitDetailRepository;
         _qualityApplication = qualityApplication;
         _capPublisher = capPublisher;
-    }
+		_systemOrganizeRepository = systemOrganizeRepository;
+		_workflowCountersignRepository = workflowCountersignRepository;
+        _orderSpecialDetailRepository = orderSpecialDetailRepository;
+	}
 
     /// <summary>
     /// 更新工单办理期满时间(延期调用,其他不调用)
@@ -569,15 +581,334 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(d => d.SourceChannel != null && d.SourceChannel != "");
     }
 
-    #region private
+    /// <summary>
+    /// 部门超期统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderBiOrgDataListVo> QueryOrgDataList(ReportPagedRequest dto)
+    {
+		if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+
+		dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+		var IsCenter = _sessionContext.OrgIsCenter;
+
+
+		var queryOrder = _systemOrganizeRepository.Queryable()
+			.LeftJoin<Order>((x, o) => x.Id == o.ActualHandleOrgCode)
+			.WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
+			.WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
+			.WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
+			.GroupBy((x, o) => new { x.Id, x.Name })
+			.Select((x, o) => new OrderBiOrgDataListVo
+			{
+				OrgName = x.Name,
+				OrgId = x.Id,
+				HandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Status >= EOrderStatus.Filed && o.ExpiredTime < o.FiledTime, 1, 0)),
+				NoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Status < EOrderStatus.Filed && o.ExpiredTime < SqlFunc.GetDate(), 1, 0)),
+			}).MergeTable();
+
+		var queryCountersign = _workflowCountersignRepository.Queryable()
+			.LeftJoin<WorkflowCountersignMember>((x, o) => x.Id == o.WorkflowCountersignId)
+			.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+			.WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+			.GroupBy((x, o) => o.Key)
+			.Select((x, o) => new OrderBiOrgDataListVo
+			{
+				OrgId = o.Key,
+				CounterHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsHandled && x.IsExpired.HasValue && x.IsExpired.Value == true, 1, 0)),
+				CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsHandled == false && x.IsExpired.HasValue && x.IsExpired.Value == true, 1, 0)),
+			}).MergeTable();
+
+		var query = queryOrder.LeftJoin(queryCountersign, (or, co) => or.OrgId == co.OrgId)
+			.LeftJoin<SystemOrganize>((or, co, so) => or.OrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == so.Id)
+			.GroupBy((or, co, so) => new { so.Id, so.Name })
+			.Select((or, co, so) => new OrderBiOrgDataListVo
+			{
+				OrgName = so.Name,
+				OrgId = so.Id,
+				HandlerExtendedNum = SqlFunc.AggregateSum(or.HandlerExtendedNum),
+				NoHandlerExtendedNum = SqlFunc.AggregateSum(or.NoHandlerExtendedNum),
+				CounterHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterHandlerExtendedNum),
+				CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterNoHandlerExtendedNum)
+			}).MergeTable();
+
+		query = query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrgName.Contains(dto.Keyword!)).Where(x => x.HandlerExtendedNum > 0 || x.NoHandlerExtendedNum > 0 || x.CounterHandlerExtendedNum > 0 || x.CounterNoHandlerExtendedNum > 0);
+		switch (dto.SortField)
+		{
+			case "handlerExtendedNum":
+				query = dto.SortRule is 0 ? query.OrderBy(x => x.HandlerExtendedNum) : query.OrderByDescending(x => x.HandlerExtendedNum);
+				break;
+			case "counterHandlerExtendedNum":
+				query = dto.SortRule is 0 ? query.OrderBy(x => x.CounterHandlerExtendedNum) : query.OrderByDescending(x => x.CounterHandlerExtendedNum);
+				break;
+			case "noHandlerExtendedNum":
+				query = dto.SortRule is 0 ? query.OrderBy(x => x.NoHandlerExtendedNum) : query.OrderByDescending(x => x.NoHandlerExtendedNum);
+				break;
+			case "counterNoHandlerExtendedNum":
+				query = dto.SortRule is 0 ? query.OrderBy(x => x.CounterNoHandlerExtendedNum) : query.OrderByDescending(x => x.CounterNoHandlerExtendedNum);
+				break;
+		}
+        return query;
+	}
 
     /// <summary>
-    /// 接受外部工单(除省平台)
+    /// 部门超期统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+	public ISugarQueryable<Order> QueryOrgDataListDetail(OrgDataListDetailRequest dto)
+	{
+		dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+
+		var quer = _orderRepository.Queryable()
+			.InnerJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id)
+			.Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
+			.WhereIF(dto.QueryType == 1, x => x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) //业务已办超期
+			.WhereIF(dto.QueryType == 3, x => x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()) //业务待办超期
+			.WhereIF(dto.QueryType == 5, x =>
+				(x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) || (x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()))
+			.WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3 && dto.OrgCode == "001", x => x.ActualHandleOrgCode == dto.OrgCode)
+			.WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3 && dto.OrgCode != "001", x => x.ActualHandleOrgCode.StartsWith(dto.OrgCode))
+			.MergeTable();
+
+		if (dto.QueryType is 2 or 4 or 5)
+		{
+			var queryCountersign = _workflowCountersignRepository.Queryable()
+				.LeftJoin<WorkflowCountersignMember>((x, o) => x.Id == o.WorkflowCountersignId)
+				.Where((x, o) => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime && x.IsExpired.HasValue && x.IsExpired.Value == true)
+				.WhereIF(dto.QueryType == 2, (x, o) => o.IsHandled == true) //会签已办超期
+				.WhereIF(dto.QueryType == 4, (x, o) => o.IsHandled == false) //会签待办超期
+				.WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 2 or 4 or 5, (x, o) => o.Key.StartsWith(dto.OrgCode))
+				//.GroupBy((x,o)=>x.WorkflowId)
+				.Select((x, o) => new { Id = x.WorkflowId })
+				.MergeTable();
+
+			quer = quer.InnerJoin(queryCountersign, (x, c) => x.WorkflowId == c.Id);
+
+		}
+        return quer;
+	}
+
+    /// <summary>
+    /// 回退错件统计
     /// </summary>
     /// <param name="dto"></param>
-    /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    private async Task<AddOrderResponse> ReceiveOrderFromOtherPlatformAsync(AddOrderDto dto, List<FileDto> files,
+    public ISugarQueryable<OrderReTransactVo> OrderReTransact(QueryOrderReTransactRequest dto)
+    {
+
+		return _orderSpecialDetailRepository.Queryable()
+			.Includes(x => x.OrderSpecial)
+			.WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName!))
+			.Where(x => x.OrderSpecial.ESpecialType == ESpecialType.ReTransact)
+			.Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
+			.Where(x => x.OrderSpecial.CreationTime <= dto.EndTime)
+			.GroupBy(x => new { Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"), x.OrgId, x.OrgName })
+			.Select(x => new OrderReTransactVo
+			{
+				Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"),
+				OrgId = x.OrgId,
+				OrgName = x.OrgName,
+				Num = SqlFunc.AggregateCount(1)
+			}).MergeTable()
+			.OrderByIF(dto.SortRule is 0, x => x.Num, OrderByType.Asc)
+			.OrderByIF(dto.SortRule is 1, x => x.Num, OrderByType.Desc); ;
+    }
+    /// <summary>
+    /// 回退错件明细统计
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderSpecialDetail> QueryOrderSourceDetail(QueryOrderReTransactDetailRequest dto)
+    {
+
+	    return  _orderSpecialDetailRepository.Queryable()
+		    .Includes(x => x.OrderSpecial, s => s.Order)
+		    .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.OrgName.Contains(dto.OrgName!))
+		    .WhereIF(!string.IsNullOrEmpty(dto.ErrorName), x => x.ErrorName.Contains(dto.ErrorName!))
+		    .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderSpecial!.Order!.No!.Contains(dto.No!))
+		    .Where(x => x.OrderSpecial.ESpecialType == ESpecialType.ReTransact)
+		    .Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
+		    .Where(x => x.OrderSpecial.CreationTime <= dto.EndTime);
+	}
+	/// <summary>
+	/// 部门满意度统计
+	/// </summary>
+	/// <returns></returns>
+	public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgSatisfactionStatistics(PagedKeywordSonRequest dto) {
+	    dto.EndDate = dto.EndDate.Value.AddDays(1).AddSeconds(-1);
+
+		bool IsCenter = _sessionContext.OrgIsCenter;
+
+		var list = _orderVisitDetailRepository.Queryable()
+			.Where(x => x.OrderVisit.VisitTime >= dto.StartDate.Value && x.OrderVisit.VisitTime <= dto.EndDate.Value && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
+			.WhereIF(string.IsNullOrEmpty(dto.OrgName) == false, x => x.VisitOrgName.Contains(dto.OrgName))
+			.WhereIF(string.IsNullOrEmpty(dto.LineNum) == false, x => x.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
+			.WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId));
+
+		var data = new List<VisitAndOrgSatisfactionStatisticsDto>();
+
+		if (IsCenter && list != null)
+		{
+			data = await list.GroupBy(x => new
+			{
+				VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+			})
+			.Select(x => new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+				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))),//未接通
+			})
+			.MergeTable()
+			.LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
+			.Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = o.Name,
+				OrgCode = it.OrgCode,
+				OrgType = o.OrgType,
+				TotalSumCount = it.TotalSumCount,
+				VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
+				SatisfiedCount = it.SatisfiedCount, //满意数
+				RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
+				DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
+				NoSatisfiedCount = it.NoSatisfiedCount,//不满意
+				NoEvaluateCount = it.NoEvaluateCount,//未做评价
+				NoPutThroughCount = it.NoPutThroughCount,//未接通
+			})
+			.ToListAsync();
+		}
+		else
+		{
+			data = await list.GroupBy(x => new
+			{
+				x.VisitOrgCode
+			})
+			.Select(x => new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgCode = x.VisitOrgCode,
+				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))),//未接通
+			})
+			.MergeTable()
+			.LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
+			.Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = o.Name,
+				OrgCode = it.OrgCode,
+				OrgType = o.OrgType,
+				TotalSumCount = it.TotalSumCount,
+				VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
+				SatisfiedCount = it.SatisfiedCount, //满意数
+				RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
+				DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
+				NoSatisfiedCount = it.NoSatisfiedCount,//不满意
+				NoEvaluateCount = it.NoEvaluateCount,//未做评价
+				NoPutThroughCount = it.NoPutThroughCount,//未接通
+			})
+			.ToListAsync();
+		}
+        return data;
+	}
+
+	/// <summary>
+	/// 子部门满意度
+	/// </summary>
+	/// <returns></returns>
+	public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgStatisfactionOrgDetail(PagedKeywordSonRequest dto)
+	{
+		dto.EndDate = dto.EndDate.Value.AddDays(1).AddSeconds(-1);
+
+		bool IsCenter = _sessionContext.OrgIsCenter;
+
+		var list = await _systemOrganizeRepository.Queryable().Where(x => x.Id.StartsWith(dto.OrgCode))
+			.LeftJoin<OrderVisitDetail>((x, it) => x.Id == it.VisitOrgCode)
+			.Where((x, it) => it.OrderVisit.VisitTime >= dto.StartDate.Value && it.OrderVisit.VisitTime <= dto.EndDate.Value && it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
+			.WhereIF(dto.OrgCode == "001", (x, it) => it.VisitOrgCode == dto.OrgCode)
+			.WhereIF(dto.OrgCode != "001", (x, it) => it.VisitOrgCode.StartsWith(dto.OrgCode))
+			.WhereIF(!string.IsNullOrEmpty(dto.LineNum), (x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
+			.WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
+			 .GroupBy((x, it) => new
+			 {
+				 VisitOrgCode = it.VisitOrgCode
+			 })
+			 .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
+			 {
+				 OrgCode = it.VisitOrgCode,
+				 TotalSumCount = SqlFunc.AggregateCount(it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9"))),
+				 VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
+				 SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+				 RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
+				 DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
+				 NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
+				 NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
+				 NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "6", 1, 0)))//未接通
+			 })
+			 .MergeTable()
+			 .LeftJoin<SystemOrganize>((x, it) => x.OrgCode == it.Id)
+			.Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = it.Name,
+				OrgCode = x.OrgCode,
+				OrgType = it.OrgType,
+				TotalSumCount = x.TotalSumCount,
+				VerySatisfiedCount = x.VerySatisfiedCount,//非常满意数
+				SatisfiedCount = x.SatisfiedCount, //满意数
+				RegardedAsSatisfiedCount = x.RegardedAsSatisfiedCount,//视为满意
+				DefaultSatisfiedCount = x.DefaultSatisfiedCount,//默认满意
+				NoSatisfiedCount = x.NoSatisfiedCount,//不满意
+				NoEvaluateCount = x.NoEvaluateCount,//未做评价
+				NoPutThroughCount = x.NoPutThroughCount,//未接通
+			})
+			.ToListAsync();
+        return list;
+	}
+
+	/// <summary>
+	/// 部门满意度明细统计
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	public ISugarQueryable<OrderVisitDetail> VisitAndOrgSatisfactionDetail(VisitAndOrgSatisfactionDetailDto dto)
+	{
+		dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
+		bool IsCenter = _sessionContext.OrgIsCenter;
+        return _orderVisitDetailRepository.Queryable()
+            .Includes(x => x.OrderVisit, o => o.Order, d => d.CallRecord)
+            .Where(x => x.OrderVisit.VisitTime >= dto.StartDate && x.OrderVisit.VisitTime <= dto.EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
+            .WhereIF(dto.OrgCode == "001", x => x.VisitOrgCode == dto.OrgCode)
+            //.WhereIF(dto.OrgCode != "001", x => x.VisitOrgCode == dto.OrgCode).
+            .WhereIF(dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
+            .WhereIF(IsCenter == true && dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
+            .WhereIF(IsCenter == true && dto.IsOnlyMy == null, x => x.VisitOrgCode.StartsWith(dto.OrgCode))
+            .WhereIF(IsCenter == false, x => x.VisitOrgCode == dto.OrgCode)
+            .WhereIF(dto.TypeId is 1, x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.DateValue)
+            .WhereIF(dto.TypeId is 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == dto.DateValue)
+            .WhereIF(!string.IsNullOrEmpty(dto.LineNum), x => x.OrderVisit.Order.CallRecord.Gateway == dto.LineNum);
+	}
+	#region private
+
+	/// <summary>
+	/// 接受外部工单(除省平台)
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <param name="cancellationToken"></param>
+	/// <returns></returns>
+	private async Task<AddOrderResponse> ReceiveOrderFromOtherPlatformAsync(AddOrderDto dto, List<FileDto> files,
         ISessionContext current, CancellationToken cancellationToken)
     {
         if (string.IsNullOrEmpty(dto.ExternalId))

+ 2 - 2
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -317,8 +317,8 @@ namespace Hotline.Application.Orders
                     OrgName = x.ApplyOrgName,
                     Num = SqlFunc.AggregateCount(x.Id)
                 })
-                .OrderByIF(dto.SortRule == 0, x => x.Num, OrderByType.Asc)
-                .OrderByIF(dto.SortRule == 1, x => x.Num, OrderByType.Desc);
+                .OrderByIF(dto.SortRule is 0, x => x.Num, OrderByType.Asc)
+                .OrderByIF(dto.SortRule is 1, x => x.Num, OrderByType.Desc);
         }
 
         /// <summary>

+ 16 - 1
src/Hotline.Application/StatisticalReport/IOrderReportApplication.cs

@@ -1,4 +1,6 @@
-using Hotline.Share.Requests;
+using Hotline.Orders;
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Requests;
 using SqlSugar;
 
 namespace Hotline.Application.StatisticalReport
@@ -26,5 +28,18 @@ namespace Hotline.Application.StatisticalReport
         /// <returns></returns>
         ISugarQueryable<SelectOrderId> GetDepartmentalProcessingStatisticsList(DepartmentalProcessingStatisticsRequest dto, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// 部门延期统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<BiOrderDelayDataDto> QueryOrderDelayDataList(QueryOrderDelayDataListRequest dto);
+
+        /// <summary>
+        /// 部门延期统计明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderDelay> QueryOrderDelayDataDetail(QueryOrderDelayDataDetailRequest dto);
     }
 }

+ 145 - 85
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -23,6 +23,8 @@ using System.Threading.Tasks;
 using XF.Domain.Authentications;
 using XF.Domain.Dependency;
 using XF.Domain.Repository;
+using Microsoft.AspNetCore.Mvc;
+using XF.Domain.Exceptions;
 
 namespace Hotline.Application.StatisticalReport
 {
@@ -132,18 +134,18 @@ namespace Hotline.Application.StatisticalReport
                          {
                              OrgCode = it.OrgCode,
                              // OrderCountNum = SqlFunc.AggregateCount(it.OrgCode),//总量
-                             YBOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed, 1, 0)),//已办// SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed, 1, 0)),//已办
-                             ZBOrderCountNum = 0, //ZBOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status < EOrderStatus.Filed, 1, 0)),//在办
+                             YbOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed, 1, 0)),//已办// SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed, 1, 0)),//已办
+                             ZbOrderCountNum = 0, //ZbOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status < EOrderStatus.Filed, 1, 0)),//在办
                              Archived = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed, 1, 0)),//已归档
                              ToBeArchived = 0,
                              WaitPublished = 0,
                              PublishedOpen = 0,
                              PublishedNoOpen = 0,
-                             YBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ActualHandleTime > it.ExpiredTime, 1, 0)),//已办超期
-                             ZBOverdue = 0,// SqlFunc.AggregateSum(SqlFunc.IIF(it.Status < EOrderStatus.Filed && it.ExpiredTime < SqlFunc.GetDate(), 1, 0)),//待办超期
+                             YbOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ActualHandleTime > it.ExpiredTime, 1, 0)),//已办超期
+                             ZbOverdue = 0,// SqlFunc.AggregateSum(SqlFunc.IIF(it.Status < EOrderStatus.Filed && it.ExpiredTime < SqlFunc.GetDate(), 1, 0)),//待办超期
                              CompleteOnTime = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ActualHandleTime <= it.ExpiredTime, 1, 0)),//按时办结
-                             HQYBOverdue = 0,
-                             HQZBOverdue = 0,
+                             HqybOverdue = 0,
+                             HqzbOverdue = 0,
                              DelayEnd = 0,
                              DelayWait = 0,
                              OrderDelayCount = 0,
@@ -177,18 +179,18 @@ namespace Hotline.Application.StatisticalReport
                 {
                     OrgCode = it.OrgCode,
                     //  OrderCountNum = 0,//总量
-                    YBOrderCountNum = 0,//已办
-                    ZBOrderCountNum = 0,//在办
+                    YbOrderCountNum = 0,//已办
+                    ZbOrderCountNum = 0,//在办
                     Archived = 0,
                     ToBeArchived = 0,
                     WaitPublished = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status == EOrderStatus.Filed, 1, 0)),//待发布  --已归档的就是待发布
                     PublishedOpen = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Published && it.PublishState, 1, 0)),//已发布公开
                     PublishedNoOpen = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Published && !it.PublishState, 1, 0)),//已发布不公开
-                    YBOverdue = 0,
-                    ZBOverdue = 0,
+                    YbOverdue = 0,
+                    ZbOverdue = 0,
                     CompleteOnTime = 0,
-                    HQYBOverdue = 0,
-                    HQZBOverdue = 0,
+                    HqybOverdue = 0,
+                    HqzbOverdue = 0,
                     DelayEnd = 0,
                     DelayWait = 0,
                     OrderDelayCount = 0,
@@ -221,23 +223,23 @@ namespace Hotline.Application.StatisticalReport
              })
               .MergeTable()
               .WhereIF(IsCenter == false, it => it.OrgCode.StartsWith(_sessionContext.RequiredOrgId))
-             .GroupBy(d => new { d.OrgCode})
+             .GroupBy(d => new { d.OrgCode })
              .Select(d => new DepartmentalProcessingStatisticsDataDto
              {
                  OrgCode = d.OrgCode,
                  //OrderCountNum = 0,//总量
-                 YBOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status >= EWorkflowStepStatus.Handled, 1, 0)),// 0,//已办
-                 ZBOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Status < EWorkflowStepStatus.Handled, 1, 0)),// 0,//在办
+                 YbOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status >= EWorkflowStepStatus.Handled, 1, 0)),// 0,//已办
+                 ZbOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Status < EWorkflowStepStatus.Handled, 1, 0)),// 0,//在办
                  Archived = 0,
                  ToBeArchived = 0,
                  WaitPublished = 0,
                  PublishedOpen = 0,
                  PublishedNoOpen = 0,
-                 YBOverdue = 0,
-                 ZBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition == ECountersignPosition.None && d.Status < EWorkflowStepStatus.Handled && DateTime.Now >= d.StepExpiredTime, 1, 0)),// 0,
+                 YbOverdue = 0,
+                 ZbOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition == ECountersignPosition.None && d.Status < EWorkflowStepStatus.Handled && DateTime.Now >= d.StepExpiredTime, 1, 0)),// 0,
                  CompleteOnTime = 0,
-                 HQYBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status >= EWorkflowStepStatus.Handled && d.HandleTime > d.StepExpiredTime, 1, 0)),
-                 HQZBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status < EWorkflowStepStatus.Handled && DateTime.Now >= d.StepExpiredTime, 1, 0)),
+                 HqybOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status >= EWorkflowStepStatus.Handled && d.HandleTime > d.StepExpiredTime, 1, 0)),
+                 HqzbOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status < EWorkflowStepStatus.Handled && DateTime.Now >= d.StepExpiredTime, 1, 0)),
                  DelayEnd = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status >= EWorkflowStepStatus.Handled, 1, 0)),
                  DelayWait = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status < EWorkflowStepStatus.Handled, 1, 0)),
                  OrderDelayCount = 0,
@@ -269,18 +271,18 @@ namespace Hotline.Application.StatisticalReport
                 {
                     OrgCode = x.OrgCode,
                     //  OrderCountNum = 0,//总量
-                    YBOrderCountNum = 0,//已办
-                    ZBOrderCountNum = 0,//在办
+                    YbOrderCountNum = 0,//已办
+                    ZbOrderCountNum = 0,//在办
                     Archived = 0,
                     ToBeArchived = 0,
                     WaitPublished = 0,
                     PublishedOpen = 0,
                     PublishedNoOpen = 0,
-                    YBOverdue = 0,
-                    ZBOverdue = 0,
+                    YbOverdue = 0,
+                    ZbOverdue = 0,
                     CompleteOnTime = 0,
-                    HQYBOverdue = 0,
-                    HQZBOverdue = 0,
+                    HqybOverdue = 0,
+                    HqzbOverdue = 0,
                     DelayEnd = 0,
                     DelayWait = 0,
                     OrderDelayCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Pass, 1, 0)),
@@ -314,18 +316,18 @@ namespace Hotline.Application.StatisticalReport
                 {
                     OrgCode = x.OrgCode,
                     // OrderCountNum = 0,//总量
-                    YBOrderCountNum = 0,//已办
-                    ZBOrderCountNum = 0,//在办
+                    YbOrderCountNum = 0,//已办
+                    ZbOrderCountNum = 0,//在办
                     Archived = 0,
                     ToBeArchived = 0,
                     WaitPublished = 0,
                     PublishedOpen = 0,
                     PublishedNoOpen = 0,
-                    YBOverdue = 0,
-                    ZBOverdue = 0,
+                    YbOverdue = 0,
+                    ZbOverdue = 0,
                     CompleteOnTime = 0,
-                    HQYBOverdue = 0,
-                    HQZBOverdue = 0,
+                    HqybOverdue = 0,
+                    HqzbOverdue = 0,
                     DelayEnd = 0,
                     DelayWait = 0,
                     OrderDelayCount = 0,
@@ -358,18 +360,18 @@ namespace Hotline.Application.StatisticalReport
             {
                 OrgCode = x.OrgCode,
                 //  OrderCountNum = 0,//总量
-                YBOrderCountNum = 0,//已办
-                ZBOrderCountNum = 0,//在办
+                YbOrderCountNum = 0,//已办
+                ZbOrderCountNum = 0,//在办
                 Archived = 0,
                 ToBeArchived = 0,
                 WaitPublished = 0,
                 PublishedOpen = 0,
                 PublishedNoOpen = 0,
-                YBOverdue = 0,
-                ZBOverdue = 0,
+                YbOverdue = 0,
+                ZbOverdue = 0,
                 CompleteOnTime = 0,
-                HQYBOverdue = 0,
-                HQZBOverdue = 0,
+                HqybOverdue = 0,
+                HqzbOverdue = 0,
                 DelayEnd = 0,
                 DelayWait = 0,
                 OrderDelayCount = 0,
@@ -392,18 +394,18 @@ namespace Hotline.Application.StatisticalReport
                       OrgName = o.Name,
                       OrgType = o.OrgType,
                       //OrderCountNum = p.OrderCountNum,
-                      YBOrderCountNum = p.YBOrderCountNum,
-                      ZBOrderCountNum = p.ZBOrderCountNum,
+                      YbOrderCountNum = p.YbOrderCountNum,
+                      ZbOrderCountNum = p.ZbOrderCountNum,
                       Archived = p.Archived,
                       ToBeArchived = p.ToBeArchived,
                       WaitPublished = p.WaitPublished,
                       PublishedOpen = p.PublishedOpen,
                       PublishedNoOpen = p.PublishedNoOpen,
-                      YBOverdue = p.YBOverdue,
-                      ZBOverdue = p.ZBOverdue,
+                      YbOverdue = p.YbOverdue,
+                      ZbOverdue = p.ZbOverdue,
                       CompleteOnTime = p.CompleteOnTime,
-                      HQYBOverdue = p.HQYBOverdue,
-                      HQZBOverdue = p.HQZBOverdue,
+                      HqybOverdue = p.HqybOverdue,
+                      HqzbOverdue = p.HqzbOverdue,
                       DelayEnd = p.DelayEnd,
                       DelayWait = p.DelayWait,
                       OrderDelayCount = p.OrderDelayCount,
@@ -453,18 +455,18 @@ namespace Hotline.Application.StatisticalReport
                       {
                           OrgCode = it.OrgCode,
                           //  OrderCountNum = SqlFunc.AggregateCount(it.OrgCode),//总量
-                          YBOrderCountNum = 0,//SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed, 1, 0)),//已办
-                          ZBOrderCountNum = 0,//  ZBOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status < EOrderStatus.Filed, 1, 0)),//在办
+                          YbOrderCountNum = 0,//SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed, 1, 0)),//已办
+                          ZbOrderCountNum = 0,//  ZbOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status < EOrderStatus.Filed, 1, 0)),//在办
                           Archived = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed, 1, 0)),//已归档
                           ToBeArchived = 0,
                           WaitPublished = 0,
                           PublishedOpen = 0,
                           PublishedNoOpen = 0,
-                          YBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ActualHandleTime > it.ExpiredTime, 1, 0)),//已办超期
-                          ZBOverdue = 0,// SqlFunc.AggregateSum(SqlFunc.IIF(it.Status < EOrderStatus.Filed && it.ExpiredTime < SqlFunc.GetDate(), 1, 0)),//待办超期
+                          YbOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ActualHandleTime > it.ExpiredTime, 1, 0)),//已办超期
+                          ZbOverdue = 0,// SqlFunc.AggregateSum(SqlFunc.IIF(it.Status < EOrderStatus.Filed && it.ExpiredTime < SqlFunc.GetDate(), 1, 0)),//待办超期
                           CompleteOnTime = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ActualHandleTime <= it.ExpiredTime, 1, 0)),//按时办结
-                          HQYBOverdue = 0,
-                          HQZBOverdue = 0,
+                          HqybOverdue = 0,
+                          HqzbOverdue = 0,
                           DelayEnd = 0,
                           DelayWait = 0,
                           OrderDelayCount = 0,
@@ -499,18 +501,18 @@ namespace Hotline.Application.StatisticalReport
                 {
                     OrgCode = it.OrgCode,
                     // OrderCountNum = 0,//总量
-                    YBOrderCountNum = 0,//已办
-                    ZBOrderCountNum = 0,//在办
+                    YbOrderCountNum = 0,//已办
+                    ZbOrderCountNum = 0,//在办
                     Archived = 0,
                     ToBeArchived = 0,
                     WaitPublished = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status == EOrderStatus.Filed, 1, 0)),//待发布  --已归档的就是待发布
                     PublishedOpen = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Published && it.PublishState, 1, 0)),//已发布公开
                     PublishedNoOpen = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Published && !it.PublishState, 1, 0)),//已发布不公开
-                    YBOverdue = 0,
-                    ZBOverdue = 0,
+                    YbOverdue = 0,
+                    ZbOverdue = 0,
                     CompleteOnTime = 0,
-                    HQYBOverdue = 0,
-                    HQZBOverdue = 0,
+                    HqybOverdue = 0,
+                    HqzbOverdue = 0,
                     DelayEnd = 0,
                     DelayWait = 0,
                     OrderDelayCount = 0,
@@ -549,18 +551,18 @@ namespace Hotline.Application.StatisticalReport
              {
                  OrgCode = d.OrgCode,
                  // OrderCountNum = 0,//总量
-                 YBOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status >= EWorkflowStepStatus.Handled, 1, 0)),//已办
-                 ZBOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Status < EWorkflowStepStatus.Handled, 1, 0)),// 0,//在办
+                 YbOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status >= EWorkflowStepStatus.Handled, 1, 0)),//已办
+                 ZbOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Status < EWorkflowStepStatus.Handled, 1, 0)),// 0,//在办
                  Archived = 0,
                  ToBeArchived = 0,
                  WaitPublished = 0,
                  PublishedOpen = 0,
                  PublishedNoOpen = 0,
-                 YBOverdue = 0,
-                 ZBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.Status < EWorkflowStepStatus.Handled && DateTime.Now >= d.StepExpiredTime, 1, 0)),// 0, 
+                 YbOverdue = 0,
+                 ZbOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.Status < EWorkflowStepStatus.Handled && DateTime.Now >= d.StepExpiredTime, 1, 0)),// 0, 
                  CompleteOnTime = 0,
-                 HQYBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status >= EWorkflowStepStatus.Handled && d.HandleTime > d.StepExpiredTime, 1, 0)),
-                 HQZBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status < EWorkflowStepStatus.Handled && DateTime.Now >= d.StepExpiredTime, 1, 0)),
+                 HqybOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status >= EWorkflowStepStatus.Handled && d.HandleTime > d.StepExpiredTime, 1, 0)),
+                 HqzbOverdue = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status < EWorkflowStepStatus.Handled && DateTime.Now >= d.StepExpiredTime, 1, 0)),
                  DelayEnd = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status >= EWorkflowStepStatus.Handled, 1, 0)),
                  DelayWait = SqlFunc.AggregateSum(SqlFunc.IIF(d.CountersignPosition > ECountersignPosition.None && d.Status < EWorkflowStepStatus.Handled, 1, 0)),
                  OrderDelayCount = 0,
@@ -593,18 +595,18 @@ namespace Hotline.Application.StatisticalReport
                 {
                     OrgCode = x.OrgCode,
                     //  OrderCountNum = 0,//总量
-                    YBOrderCountNum = 0,//已办
-                    ZBOrderCountNum = 0,//在办
+                    YbOrderCountNum = 0,//已办
+                    ZbOrderCountNum = 0,//在办
                     Archived = 0,
                     ToBeArchived = 0,
                     WaitPublished = 0,
                     PublishedOpen = 0,
                     PublishedNoOpen = 0,
-                    YBOverdue = 0,
-                    ZBOverdue = 0,
+                    YbOverdue = 0,
+                    ZbOverdue = 0,
                     CompleteOnTime = 0,
-                    HQYBOverdue = 0,
-                    HQZBOverdue = 0,
+                    HqybOverdue = 0,
+                    HqzbOverdue = 0,
                     DelayEnd = 0,
                     DelayWait = 0,
                     OrderDelayCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Pass, 1, 0)),
@@ -639,18 +641,18 @@ namespace Hotline.Application.StatisticalReport
                 {
                     OrgCode = x.OrgCode,
                     //  OrderCountNum = 0,//总量
-                    YBOrderCountNum = 0,//已办
-                    ZBOrderCountNum = 0,//在办
+                    YbOrderCountNum = 0,//已办
+                    ZbOrderCountNum = 0,//在办
                     Archived = 0,
                     ToBeArchived = 0,
                     WaitPublished = 0,
                     PublishedOpen = 0,
                     PublishedNoOpen = 0,
-                    YBOverdue = 0,
-                    ZBOverdue = 0,
+                    YbOverdue = 0,
+                    ZbOverdue = 0,
                     CompleteOnTime = 0,
-                    HQYBOverdue = 0,
-                    HQZBOverdue = 0,
+                    HqybOverdue = 0,
+                    HqzbOverdue = 0,
                     DelayEnd = 0,
                     DelayWait = 0,
                     OrderDelayCount = 0,
@@ -684,18 +686,18 @@ namespace Hotline.Application.StatisticalReport
             {
                 OrgCode = x.OrgCode,
                 // OrderCountNum = 0,//总量
-                YBOrderCountNum = 0,//已办
-                ZBOrderCountNum = 0,//在办
+                YbOrderCountNum = 0,//已办
+                ZbOrderCountNum = 0,//在办
                 Archived = 0,
                 ToBeArchived = 0,
                 WaitPublished = 0,
                 PublishedOpen = 0,
                 PublishedNoOpen = 0,
-                YBOverdue = 0,
-                ZBOverdue = 0,
+                YbOverdue = 0,
+                ZbOverdue = 0,
                 CompleteOnTime = 0,
-                HQYBOverdue = 0,
-                HQZBOverdue = 0,
+                HqybOverdue = 0,
+                HqzbOverdue = 0,
                 DelayEnd = 0,
                 DelayWait = 0,
                 OrderDelayCount = 0,
@@ -718,18 +720,18 @@ namespace Hotline.Application.StatisticalReport
                     OrgName = o.Name,
                     OrgType = o.OrgType,
                     //OrderCountNum = p.OrderCountNum,
-                    YBOrderCountNum = p.YBOrderCountNum,
-                    ZBOrderCountNum = p.ZBOrderCountNum,
+                    YbOrderCountNum = p.YbOrderCountNum,
+                    ZbOrderCountNum = p.ZbOrderCountNum,
                     Archived = p.Archived,
                     ToBeArchived = p.ToBeArchived,
                     WaitPublished = p.WaitPublished,
                     PublishedOpen = p.PublishedOpen,
                     PublishedNoOpen = p.PublishedNoOpen,
-                    YBOverdue = p.YBOverdue,
-                    ZBOverdue = p.ZBOverdue,
+                    YbOverdue = p.YbOverdue,
+                    ZbOverdue = p.ZbOverdue,
                     CompleteOnTime = p.CompleteOnTime,
-                    HQYBOverdue = p.HQYBOverdue,
-                    HQZBOverdue = p.HQZBOverdue,
+                    HqybOverdue = p.HqybOverdue,
+                    HqzbOverdue = p.HqzbOverdue,
                     DelayEnd = p.DelayEnd,
                     DelayWait = p.DelayWait,
                     OrderDelayCount = p.OrderDelayCount,
@@ -985,5 +987,63 @@ namespace Hotline.Application.StatisticalReport
             return null;
         }
 
+        /// <summary>
+        /// 部门延期统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<BiOrderDelayDataDto> QueryOrderDelayDataList(QueryOrderDelayDataListRequest dto)
+        {
+            if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+
+            dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+            var IsCenter = _sessionContext.OrgIsCenter;
+
+            return _orderDelayRepository.Queryable()
+                .LeftJoin<SystemOrganize>((x, o) => x.ApplyOrgCode == o.Id)
+                .WhereIF(dto.StartTime.HasValue, (x, o) => x.CreationTime >= dto.StartTime)
+                .WhereIF(dto.EndTime.HasValue, (x, o) => x.CreationTime <= dto.EndTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Contains(dto.OrgName))
+                .WhereIF(IsCenter == false, x => x.ApplyOrgCode.StartsWith(_sessionContext.RequiredOrgId))
+                .GroupBy(x => new { x.ApplyOrgCode, x.ApplyOrgName })
+                .Select(x => new BiOrderDelayDataDto
+                {
+                    OrgName = x.ApplyOrgName,
+                    OrgCode = x.ApplyOrgCode,
+                    PassTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Pass, 1, 0)),
+                    NoPassTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.NoPass, 1, 0)),
+                    ExaminingTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Examining, 1, 0)),
+                    AllTotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Pass, 1, 0)) + SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.NoPass, 1, 0)) + SqlFunc.AggregateSum(SqlFunc.IIF(x.DelayState == EDelayState.Examining, 1, 0))
+
+                }).MergeTable();
+
+
+        }
+
+        /// <summary>
+        /// 部门延期统计明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<OrderDelay> QueryOrderDelayDataDetail(QueryOrderDelayDataDetailRequest dto)
+        {
+            if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+
+            dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+            return _orderDelayRepository.Queryable()
+                 .Includes(x => x.Order)
+                 .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+                 .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+                 .WhereIF(!string.IsNullOrEmpty(dto.OrgCode), x => x.ApplyOrgCode == dto.OrgCode)
+                 .WhereIF(dto.Type is 1, x => x.DelayState == EDelayState.Pass)
+                 .WhereIF(dto.Type is 2, x => x.DelayState == EDelayState.NoPass)
+                 .WhereIF(dto.Type is 3, x => x.DelayState == EDelayState.Examining)
+                 .WhereIF(dto.Type is 4, x => x.DelayState < EDelayState.Withdraw)
+             .MergeTable();
+
+        }
+
     }
 }

+ 6 - 6
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -126,18 +126,18 @@ namespace Hotline.Repository.SqlSugar.Orders
                        {
                            OrgCode = p.OrgCode,
                          //  OrderCountNum = SqlFunc.AggregateSum(p.OrderCountNum),
-                           YBOrderCountNum = SqlFunc.AggregateSum(p.YBOrderCountNum),
-                           ZBOrderCountNum = SqlFunc.AggregateSum(p.ZBOrderCountNum),
+                           YbOrderCountNum = SqlFunc.AggregateSum(p.YbOrderCountNum),
+                           ZbOrderCountNum = SqlFunc.AggregateSum(p.ZbOrderCountNum),
                            Archived = SqlFunc.AggregateSum(p.Archived),
                            ToBeArchived = SqlFunc.AggregateSum(p.ToBeArchived),
                            WaitPublished = SqlFunc.AggregateSum(p.WaitPublished),
                            PublishedOpen = SqlFunc.AggregateSum(p.PublishedOpen),
                            PublishedNoOpen = SqlFunc.AggregateSum(p.PublishedNoOpen),
-                           YBOverdue = SqlFunc.AggregateSum(p.YBOverdue),
-                           ZBOverdue = SqlFunc.AggregateSum(p.ZBOverdue),
+                           YbOverdue = SqlFunc.AggregateSum(p.YbOverdue),
+                           ZbOverdue = SqlFunc.AggregateSum(p.ZbOverdue),
                            CompleteOnTime= SqlFunc.AggregateSum(p.CompleteOnTime),
-                           HQYBOverdue = SqlFunc.AggregateSum(p.HQYBOverdue),
-                           HQZBOverdue = SqlFunc.AggregateSum(p.HQZBOverdue),
+                           HqybOverdue = SqlFunc.AggregateSum(p.HqybOverdue),
+                           HqzbOverdue = SqlFunc.AggregateSum(p.HqzbOverdue),
                            DelayEnd = SqlFunc.AggregateSum(p.DelayEnd),
                            DelayWait = SqlFunc.AggregateSum(p.DelayWait),
                            OrderDelayCount = SqlFunc.AggregateSum(p.OrderDelayCount),

+ 3 - 3
src/Hotline.Share/Dtos/Bi/BiOrderDto.cs

@@ -6,9 +6,9 @@ namespace Hotline.Share.Dtos.Bi
     {
         public DateTime StartDate { get; set; }
         public DateTime EndDate { get; set; }
-        public string OrgCode { get; set; }
-        public int TypeId { get; set; }
-        public string DateValue { get; set; }
+        public string? OrgCode { get; set; }
+        public int? TypeId { get; set; }
+        public string? DateValue { get; set; }
 
         public string? LineNum { get; set; }
 

+ 2 - 1
src/Hotline.Share/Dtos/FlowEngine/Workflow/ChangeHandlerDto.cs

@@ -5,5 +5,6 @@ namespace Hotline.Share.Dtos.FlowEngine.Workflow;
 public class ChangeHandlerDto
 {
     public string StepId { get; set; }
-    public FlowStepHandler Handler { get; set; }
+    public string OrderId { get; set; }
+	public FlowStepHandler Handler { get; set; }
 }

+ 3 - 1
src/Hotline.Share/Dtos/Order/Migration/GetOrderMigrationDto.cs

@@ -10,7 +10,9 @@ namespace Hotline.Share.Dtos.Order.Migration
     public class GetOrderMigrationDto
     {
         public string StepId { get; set; }
-        public IReadOnlyList<OrderMigrationHandler> Handlers { get; set; }
+        public string OrderId { get; set; }
+		
+		public IReadOnlyList<OrderMigrationHandler> Handlers { get; set; }
     }
 
     public class OrderMigrationHandler : FlowStepHandler

+ 14 - 10
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -291,8 +291,9 @@ namespace Hotline.Share.Dtos.Order
 		/// <summary>
 		/// 总满意度
 		/// </summary>
-		public double TotalSumRate => Math.Round(VerySatisfiedRate + SatisfiedRate + RegardedAsSatisfiedRate+ DefaultSatisfiedRate, 2);
+		public double TotalSumRate => Math.Round(VerySatisfiedRate + SatisfiedRate + RegardedAsSatisfiedRate+ DefaultSatisfiedRate, 2) ;
 
+		public string TotalSumRateText => TotalSumRate + "%";
 		/// <summary>
 		/// 非常满意数
 		/// </summary>
@@ -316,6 +317,7 @@ namespace Hotline.Share.Dtos.Order
 			}
 			return Math.Round((VerySatisfiedCount / (double)TotalSumCount) * 100, 2);
 		}
+		public string VerySatisfiedRateText => VerySatisfiedRate + "%";
 
 		/// <summary>
 		/// 满意数
@@ -342,7 +344,7 @@ namespace Hotline.Share.Dtos.Order
 			return Math.Round((SatisfiedCount / (double)TotalSumCount) * 100, 2);
 		}
 
-
+		public string SatisfiedRateText => SatisfiedRate + "%";
 		/// <summary>
 		/// 视为满意数
 		/// </summary>
@@ -366,7 +368,7 @@ namespace Hotline.Share.Dtos.Order
             }
             return Math.Round((RegardedAsSatisfiedCount / (double)TotalSumCount) * 100, 2);
         }
-
+		public string RegardedAsSatisfiedRateText => RegardedAsSatisfiedRate + "%";
 		/// <summary>
 		/// 默认满意数
 		/// </summary>
@@ -390,11 +392,12 @@ namespace Hotline.Share.Dtos.Order
             }
             return Math.Round((DefaultSatisfiedCount / (double)TotalSumCount) * 100, 2);
         }
+		public string DefaultSatisfiedRateText => DefaultSatisfiedRate + "%";
 
-        /// <summary>
-        /// 不满意数
-        /// </summary>
-        public int NoSatisfiedCount { get; set; }
+		/// <summary>
+		/// 不满意数
+		/// </summary>
+		public int NoSatisfiedCount { get; set; }
 
 		/// <summary>
 		/// 不满意Key
@@ -415,7 +418,7 @@ namespace Hotline.Share.Dtos.Order
 			}
 			return Math.Round((NoSatisfiedCount / (double)TotalSumCount) * 100, 2);
 		}
-
+		public string NoSatisfiedRateText => NoSatisfiedRate + "%";
 
 
 		/// <summary>
@@ -443,7 +446,7 @@ namespace Hotline.Share.Dtos.Order
 			return Math.Round((NoEvaluateCount / (double)TotalSumCount) * 100, 2);
 		}
 
-
+		public string NoEvaluateRateText => NoEvaluateRate + "%";
 
 		/// <summary>
 		/// 未接通数
@@ -469,7 +472,8 @@ namespace Hotline.Share.Dtos.Order
             }
             return Math.Round((NoPutThroughCount / (double)TotalSumCount) * 100, 2);
         }
-    }
+        public string NoPutThroughRateText => NoPutThroughRate + "%";
+	}
 
 	public class BiOrderSendVo
 	{

+ 1 - 1
src/Hotline.Share/Enums/Order/EScreenStatus.cs

@@ -34,7 +34,7 @@ namespace Hotline.Share.Enums.Order
 		Refuse = 3,
 
 		/// <summary>
-		/// 已办
+		/// 已办 只用作列表查询使用
 		/// </summary>
 		[Description("已办")]
 		MyHandle = 4,

+ 16 - 16
src/Hotline.Share/Requests/DepartmentalProcessingStatisticsDto.cs

@@ -46,17 +46,17 @@ namespace Hotline.Share.Requests
         /// <summary>
         /// 信件总量
         /// </summary>
-        public int OrderCountNum => YBOrderCountNum + ZBOrderCountNum;
+        public int OrderCountNum => YbOrderCountNum + ZbOrderCountNum;
 
         /// <summary>
         /// 信件已办总量
         /// </summary>
-        public int YBOrderCountNum { get; set; }
+        public int YbOrderCountNum { get; set; }
 
         /// <summary>
         /// 信件未办总量
         /// </summary>
-        public int ZBOrderCountNum { get; set; }
+        public int ZbOrderCountNum { get; set; }
 
         /// <summary>
         /// 按时办结
@@ -66,12 +66,12 @@ namespace Hotline.Share.Requests
         /// <summary>
         /// 按时办结率
         /// </summary>
-        public double CompleteOnTimeRate => CalcRate(YBOrderCountNum, CompleteOnTime);
+        public string CompleteOnTimeRate => CalcRate(YbOrderCountNum, CompleteOnTime);
 
         /// <summary>
         /// 办结率
         /// </summary>
-        public double OrderCompletionRate => CalcRate(OrderCountNum, YBOrderCountNum);
+        public string OrderCompletionRate => CalcRate(OrderCountNum, YbOrderCountNum);
         #endregion
 
         #region 归档
@@ -107,32 +107,32 @@ namespace Hotline.Share.Requests
         /// <summary>
         /// 已办超期
         /// </summary>
-        public int YBOverdue { get; set; }
+        public int YbOverdue { get; set; }
 
         /// <summary>
         /// 待办超期
         /// </summary>
-        public int ZBOverdue { get; set; }
+        public int ZbOverdue { get; set; }
 
         /// <summary>
         /// 会签已办超期
         /// </summary>
-        public int HQYBOverdue { get; set; }
+        public int HqybOverdue { get; set; }
 
         /// <summary>
         /// 会签待办超期
         /// </summary>
-        public int HQZBOverdue { get; set; }
+        public int HqzbOverdue { get; set; }
 
         /// <summary>
         /// 超期件数
         /// </summary>
-        public int SubtotalOverdue => YBOverdue + ZBOverdue + HQYBOverdue + HQZBOverdue;
+        public int SubtotalOverdue => YbOverdue + ZbOverdue + HqybOverdue + HqzbOverdue;
 
         /// <summary>
         /// 会签超期率
         /// </summary>
-        public double HQOverdueRate => CalcRate(OrderCountNum, SubtotalOverdue);
+        public string HqOverdueRate => CalcRate(OrderCountNum, SubtotalOverdue);
         #endregion
 
         #region 会签信息
@@ -156,7 +156,7 @@ namespace Hotline.Share.Requests
         /// <summary>
         /// 延期率
         /// </summary>
-        public double OrderDelayRate => CalcRate(OrderCountNum, OrderDelayCount);
+        public string OrderDelayRate => CalcRate(OrderCountNum, OrderDelayCount);
         #endregion
 
         #region 甄别
@@ -195,7 +195,7 @@ namespace Hotline.Share.Requests
         /// <summary>
         /// 满意率
         /// </summary>
-        public double SatisfactionRate => CalcRate(SatisfactionCount + NotSatisfactionCount, SatisfactionCount);
+        public string SatisfactionRate => CalcRate(SatisfactionCount + NotSatisfactionCount, SatisfactionCount);
         #endregion
 
 
@@ -203,13 +203,13 @@ namespace Hotline.Share.Requests
         /// 计算率
         /// </summary>
         /// <returns></returns>
-        public double CalcRate(int Count, int Quantity)
+        public string CalcRate(int Count, int Quantity)
         {
             if (Count != 0 && Quantity != 0)
             {
-                return Math.Round((Quantity / (double)Count) * 100, 2);
+                return Math.Round((Quantity / (double)Count) * 100, 2) + "%";
             }
-            return 0;
+            return "0%";
         }
 
     }

+ 22 - 1
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -16,6 +16,27 @@ public record PagedKeywordRequest : PagedRequest
 
 	public string? Keyword { get; set; }
 }
+public record PagedKeywordSonRequest : PagedRequest
+{
+	/// <summary>
+	/// 开始时间
+	/// </summary>
+	public DateTime? StartDate { get; set; }
+
+	/// <summary>
+	/// 结束时间
+	/// </summary>
+	public DateTime? EndDate { get; set; }
+
+	public string? OrgName { get; set; }
+	public string? OrgCode { get; set; }
+	/// <summary>
+	/// 1:办件结果 2:办件态度
+	/// </summary>
+	public int? TypeId { get; set; }
+
+	public string? LineNum { get; set; }
+}
 
 public record ReportPagedRequest : PagedKeywordRequest 
 {
@@ -28,7 +49,7 @@ public record ReportPagedRequest : PagedKeywordRequest
 	/// <summary>
 	/// 排序规则  0 升序  1 降序
 	/// </summary>
-	public int SortRule { get; set; }
+	public int? SortRule { get; set; }
 
 }
 

+ 1 - 1
src/Hotline/Article/Bulletin.cs

@@ -13,7 +13,7 @@ namespace Hotline.Article
     {
         public string Title { get; set; }
 
-        [SugarColumn(ColumnDataType = "varchar(2000)")]
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
         public string Content { get; set; }
 
         public string BulletinTypeId { get; set; }

+ 1 - 1
src/Hotline/Article/Circular.cs

@@ -19,7 +19,7 @@ namespace Hotline.Article
         /// <summary>
         /// 内容
         /// </summary>
-        [SugarColumn(ColumnDataType = "varchar(2000)")]
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
         public string Content { get; set; }
 
         /// <summary>

+ 2 - 1
src/Hotline/Orders/Order.cs

@@ -209,7 +209,7 @@ namespace Hotline.Orders
         /// <summary>
         /// 诉求内容
         /// </summary>
-        [SugarColumn(ColumnDataType = "varchar(2000)")]
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
         public string Content { get; set; }
 
         #endregion
@@ -661,6 +661,7 @@ namespace Hotline.Orders
         /// <summary>
         /// 归档意见
         /// </summary>
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
         public string? FileOpinion { get; set; }
 
         #endregion

+ 4 - 1
src/Hotline/Orders/OrderDomainService.cs

@@ -105,7 +105,10 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     public async Task<string> AddAsync(Order order, bool autoAccept = false, CancellationToken cancellationToken = default)
     {
         if (autoAccept)
-            order.AutoAccept(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.StaffNo);
+        {
+	        order.AutoAccept(_sessionContext.RequiredUserId, _sessionContext.UserName, _sessionContext.StaffNo);
+            order.Sign(_sessionContext.RequiredUserId, _sessionContext.UserName);
+		}
         order.Init();
         order.No = GenerateNewOrderNo();
         order.Password = Random.Shared.Next(100000, 1000000).ToString();

+ 2 - 2
src/Hotline/Orders/OrderPublish.cs

@@ -33,13 +33,13 @@ public class OrderPublish : FullStateEntity
     /// <summary>
     /// 整理内容
     /// </summary>
-    [SugarColumn(ColumnDataType = "varchar(2000)")]
+    [SugarColumn(ColumnDataType = "varchar(8000)")]
     public string ArrangeContent { get; set; }
 
     /// <summary>
     /// 整理结果
     /// </summary>
-    [SugarColumn(ColumnDataType = "varchar(2000)")]
+    [SugarColumn(ColumnDataType = "varchar(8000)")]
     public string ArrangeOpinion { get; set; }
 
     /// <summary>

+ 5 - 5
src/Hotline/Orders/OrderPublishHistory.cs

@@ -39,25 +39,25 @@ namespace Hotline.Orders
         /// <summary>
         /// 整理内容修改前
         /// </summary>
-        [SugarColumn(ColumnDataType = "varchar(2000)")]
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
         public string ArrangeContentBefor { get; set; }
-        
+
         /// <summary>
         /// 整理内容修改后
         /// </summary>
-        [SugarColumn(ColumnDataType = "varchar(2000)")]
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
         public string ArrangeContentAfter { get; set; }
 
         /// <summary>
         /// 整理结果修改前
         /// </summary>
-        [SugarColumn(ColumnDataType = "varchar(2000)")]
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
         public string ArrangeOpinionBefor { get; set; }
 
         /// <summary>
         /// 整理结果修改后
         /// </summary>
-        [SugarColumn(ColumnDataType = "varchar(2000)")]
+        [SugarColumn(ColumnDataType = "varchar(8000)")]
         public string ArrangeOpinionAfter { get; set; }
 
         /// <summary>