فهرست منبع

Merge branch 'dev' into dev_tj

tangjiang 1 سال پیش
والد
کامیت
824a01b931
23فایلهای تغییر یافته به همراه512 افزوده شده و 193 حذف شده
  1. 4 4
      src/Hotline.Api/Controllers/Bi/BiCallController.cs
  2. 110 64
      src/Hotline.Api/Controllers/Bi/BiOrderController.cs
  3. 11 1
      src/Hotline.Api/Controllers/Bigscreen/DataScreenController.cs
  4. 65 10
      src/Hotline.Api/Controllers/OrderController.cs
  5. 57 57
      src/Hotline.Api/Controllers/TestController.cs
  6. 1 1
      src/Hotline.Api/config/appsettings.Development.json
  7. 1 1
      src/Hotline.Api/config/appsettings.json
  8. 6 7
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  9. 12 0
      src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs
  10. 26 17
      src/Hotline.Repository.SqlSugar/CallCenter/TrCallRecordRepository.cs
  11. 2 2
      src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs
  12. 2 0
      src/Hotline.Share/Dtos/Bigscreen/BigscreenDto.cs
  13. 5 1
      src/Hotline.Share/Dtos/CallCenter/TrCallDto.cs
  14. 6 1
      src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowTraceDto.cs
  15. 21 2
      src/Hotline.Share/Dtos/Order/OrderBiDto.cs
  16. 63 0
      src/Hotline.Share/Dtos/Order/OrderWaitedDto.cs
  17. 2 5
      src/Hotline.Share/Dtos/Position.cs
  18. 30 0
      src/Hotline.Share/Enums/Order/EFileUserType.cs
  19. 12 1
      src/Hotline.Share/Requests/PagedKeywordRequest.cs
  20. 2 2
      src/Hotline/CallCenter/Calls/ITrCallRecordRepository.cs
  21. 10 0
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  22. 6 0
      src/Hotline/FlowEngine/Workflows/WorkflowTrace.cs
  23. 58 17
      src/Hotline/Orders/Order.cs

+ 4 - 4
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -241,13 +241,13 @@ public class BiCallController : BaseController
     /// <returns></returns>
     [HttpGet("hourcall")]
     [AllowAnonymous]
-    public async Task<List<TrCallHourDto>> QueryHourCall([FromQuery]DateTime beginDate,DateTime? endDate)
+    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);
+        var list = await _trCallRecordRepositoryEx.GetCallHourList(beginDate,endDate,noConnectByeTimes,effectiveTimes,connectByeTimes,source);
         return list;
     }
 
@@ -256,13 +256,13 @@ public class BiCallController : BaseController
 	/// </summary>
 	/// <returns></returns>
 	[HttpGet("hourcall_list")]
-	public async Task<object> QueryCallList([FromQuery] DateTime beginDate, DateTime? endDate, string type, string source, int pageIndex, int pageSize)
+	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, pageIndex, pageSize);
+		var list = await _trCallRecordRepositoryEx.GetCallList(beginDate, endDate, noConnectByeTimes, effectiveTimes, connectByeTimes, type, source, startHourTo,pageIndex, pageSize);
 		return list;
 	}
 

+ 110 - 64
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -92,36 +92,51 @@ namespace Hotline.Api.Controllers.Bi
             _workflowStepHandleRepository = workflowStepHandleRepository;
         }
 
-        /// <summary>
-        /// 部门超期统计明细
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [HttpGet("org_data_list_detail")]
-        public async Task<PagedDto<OrderDto>> OrgDataListDetail([FromQuery] OrgDataListDetailRequest dto)
-        {
-            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
-
-            var (total, items) = await _orderRepository.Queryable()
-            .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== 2,) //会签已办超期
-            .WhereIF(dto.QueryType == 3, x => x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()) //业务待办超期
-            .WhereIF(string.IsNullOrEmpty(dto.OrgCode), x => x.ActualHandleOrgCode == dto.OrgCode)
-            //.WhereIF(dto.QueryType ==4,) //会签待办超期
-            //.MergeTable();
-            .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")]
+		/// <summary>
+		/// 部门超期统计明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[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()
+					.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, x => x.ActualHandleOrgCode == dto.OrgCode);
+
+			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)
+                    .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 == 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 (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)
         {
             if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
@@ -145,22 +160,6 @@ namespace Hotline.Api.Controllers.Bi
                     NoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Status < EOrderStatus.Filed && o.ExpiredTime < SqlFunc.GetDate(), 1, 0)),
                 }).MergeTable();
 
-
-
-            //var queryOrder = _orderRepository.Queryable(false, false, false)
-            //    .LeftJoin<SystemOrganize>((x, o) => x.ActualHandleOrgCode == o.Id)
-            //    .WhereIF(dto.StartTime.HasValue, (x, o) => x.CreationTime >= dto.StartTime)
-            //    .WhereIF(dto.EndTime.HasValue, (x, o) => x.CreationTime <= dto.EndTime)
-            //    .WhereIF(IsCenter == false, (x, o) => x.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
-            //    .GroupBy((x, o) => new { x.ActualHandleOrgCode, o.Name })
-            //    .Select((x, o) => new OrderBiOrgDataListVo
-            //    {
-            //        OrgName = o.Name,
-            //        OrgId = x.ActualHandleOrgCode,
-            //        HandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime, 1, 0)),
-            //        NoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed && x.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)
@@ -218,21 +217,22 @@ namespace Hotline.Api.Controllers.Bi
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 
             var query = _orderRepository.Queryable(false, false, false)
-                .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-                .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.AcceptorName.Contains(dto.Keyword!))
-                .GroupBy(x => new { x.AcceptorId, x.AcceptorName })
-                .Select(x => new OrderBiCentreDataListVo
+                .WhereIF(dto.StartTime.HasValue, it => it.CreationTime >= dto.StartTime)
+                .WhereIF(dto.EndTime.HasValue, it => it.CreationTime <= dto.EndTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), it => it.SignerName.Contains(dto.Keyword!))
+                .GroupBy(it => new { it.SignerId, it.SignerName })
+                .Select(it => new OrderBiCentreDataListVo
                 {
-                    UserName = x.AcceptorName,
-                    UserId = x.AcceptorId,
+                    UserName = it.SignerName,
+                    UserId = it.SignerId,
                     //Subtotal = SqlFunc.AggregateCount(x.AcceptorId),
-                    CentreArchive = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ProcessType == EProcessType.Zhiban, 1, 0)),
-                    CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed && x.ProcessType == EProcessType.Jiaoban, 1, 0)),
+                    CentreArchive = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Zhiban, 1, 0)),
+                    //CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Jiaoban, 1, 0)),
+                    CentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF((it.Status >= EOrderStatus.Filed && it.ProcessType == EProcessType.Jiaoban),1,0)),
                     //NoCentreCareOf = SqlFunc.AggregateSum(SqlFunc.IIF((int)x.Status < 300 && x.ExpiredTime > x.FiledTime, 1, 0)),
-                    Invalid = SqlFunc.AggregateSum(SqlFunc.IIF(x.AcceptType == "无效", 1, 0)),
-                    Repeat = SqlFunc.AggregateSum(SqlFunc.IIF(x.DuplicateIds != null && SqlFunc.JsonArrayLength(x.DuplicateIds) > 0, 1, 0)),
-                    Subtotal = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed || x.AcceptType == "无效" || (x.DuplicateIds != null && SqlFunc.JsonArrayLength(x.DuplicateIds) > 0), 1, 0))
+                    Invalid = SqlFunc.AggregateSum(SqlFunc.IIF(it.AcceptType == "无效", 1, 0)),
+                    Repeat = SqlFunc.AggregateSum(SqlFunc.IIF(it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0, 1, 0)),
+                    Subtotal = SqlFunc.AggregateSum(SqlFunc.IIF(it.Status >= EOrderStatus.Filed || it.AcceptType == "无效" || (it.DuplicateIds != null && SqlFunc.JsonArrayLength(it.DuplicateIds) > 0), 1, 0))
                 }).MergeTable();
             switch (dto.SortField)
             {
@@ -255,6 +255,12 @@ namespace Hotline.Api.Controllers.Bi
                     query = dto.SortRule == 0 ? query.OrderBy(x => x.Subtotal) : query.OrderByDescending(x => x.Subtotal);
                     break;
             }
+
+            if (string.IsNullOrEmpty(dto.SortField))
+            {
+                query = query.OrderByDescending(x => x.Subtotal);
+            }
+
             var (total, items) = await query.Where(x => (x.CentreArchive + x.CentreCareOf + x.Invalid + x.Repeat) != 0).ToPagedListAsync(dto, HttpContext.RequestAborted);
             return new PagedDto<OrderBiCentreDataListVo>(total, items);
         }
@@ -502,12 +508,38 @@ namespace Hotline.Api.Controllers.Bi
             return list;
         }
 
-        /// <summary>
-        /// 特提统计
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [HttpGet("special_data_list")]
+		/// <summary>
+		/// 部门延期统计明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("order-delay-data-detail")]
+        public async Task<PagedDto<OrderDelayDto>> QueryOrderDelayDataDetail([FromQuery] QueryOrderDelayDataDetailRequest dto)
+        {
+	        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+
+	        dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+	        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);
+
+			return new PagedDto<OrderDelayDto>(total, _mapper.Map<IReadOnlyList<OrderDelayDto>>(items));
+		}
+
+		/// <summary>
+		/// 特提统计
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("special_data_list")]
         public async Task<PagedDto<OrderBiSpecialListVo>> SpecialDataList([FromQuery] ReportPagedRequest dto)
         {
             if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
@@ -2524,8 +2556,15 @@ namespace Hotline.Api.Controllers.Bi
 
             dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
 
+            List<string> filterTitle = new List<string>();
+            filterTitle.Add("无声");
+            filterTitle.Add("骚扰");
+            filterTitle.Add("错拨");
+            filterTitle.Add("测试");
+
             var (total, items) = await _orderRepository.Queryable()
                 .Where(x => x.CreationTime >= dto.StartDate && x.CreationTime <= dto.EndDate)
+                .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
                 .LeftJoin<SystemArea>((it, o) => it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
                 .WhereIF(dto.AreaCodes.Any(), (it, o) => dto.AreaCodes.Contains(it.AreaCode)) //区域
                 .WhereIF(dto.HotspotIds.Any(), (it, o) => dto.HotspotIds.Contains(it.HotspotId)) //热点类型
@@ -2580,6 +2619,12 @@ namespace Hotline.Api.Controllers.Bi
         public async Task<PagedDto<OrderDto>> HighMatterWarningDetail([FromQuery] HighMatterWarningDetailRequest dto)
         {
             dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
+            List<string> filterTitle = new List<string>();
+            filterTitle.Add("无声");
+            filterTitle.Add("骚扰");
+            filterTitle.Add("错拨");
+            filterTitle.Add("测试");
+
             var (total, items) = await _orderRepository.Queryable()
             .Includes(x => x.OrderScreens)
             .Where(d => d.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
@@ -2587,6 +2632,7 @@ namespace Hotline.Api.Controllers.Bi
             .Where(d => d.CreationTime >= dto.StartDate) //受理时间开始
             .Where(d => d.CreationTime <= dto.EndDate) //受理时间结束
             .Where(d => d.AreaCode == dto.AreaCode) //区域
+            .Where(x => filterTitle.Any(s => x.Title.Contains(s)) == false)
             .OrderByDescending(d => d.CreationTime)
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
             return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));

+ 11 - 1
src/Hotline.Api/Controllers/Bigscreen/DataScreenController.cs

@@ -201,11 +201,12 @@ namespace Hotline.Api.Controllers.Bigscreen
             EndDate = EndDate.AddDays(1).AddSeconds(-1);
              var list = await _orderRepository.Queryable(false, false, false)
                 .Where(x => x.StartTime >= StartDate && x.StartTime <= EndDate && x.AreaCode.StartsWith(AreaCode) && !x.HotspotId.StartsWith("18"))
-                .GroupBy(x => new { x.HotspotId, x.HotspotName })
+                .GroupBy(x => new { x.HotspotId, x.HotspotName,x.HotspotSpliceName })
                 .Select(x => new EarlyWarningHotsPotsStatisticsDto()
                 {
                      HotspotId = x.HotspotId,
                      HotspotName = x.HotspotName,
+                     HotspotSpliceName = x.HotspotSpliceName,
                      SumCount = SqlFunc.AggregateCount(x.Id)
                 }).OrderByDescending(x=>x.SumCount).Take(5).ToListAsync();
             return list;
@@ -411,8 +412,17 @@ namespace Hotline.Api.Controllers.Bigscreen
             //var endDate = DateTime.Now.Date.AddDays(1).AddSeconds(-1);
             //var startDate = endDate.AddDays(-30).Date;
 
+
+            List<string> filterTitle = new List<string>();
+            filterTitle.Add("无声");
+            filterTitle.Add("骚扰");
+            filterTitle.Add("错拨");
+            filterTitle.Add("测试");
+
+
             var list = await _orderRepository.Queryable(false, false, false)
                 .Where(x => x.CreationTime >= StartDate && x.CreationTime <= EndDate)
+                .Where(x=> filterTitle.Any(s=> x.Title.Contains(s)) == false)
                 .LeftJoin<SystemArea>((it, o) => it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
                 .GroupBy((it, o) => new
                 {

+ 65 - 10
src/Hotline.Api/Controllers/OrderController.cs

@@ -20,6 +20,7 @@ using Hotline.Push.FWMessage;
 using Hotline.Push.Notifies;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Repository.SqlSugar.Ts;
+using Hotline.SeedData;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Settings.TimeLimits;
@@ -43,6 +44,7 @@ using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using MiniExcelLibs;
 using SqlSugar;
+using System;
 using XF.Domain.Authentications;
 using XF.Domain.Cache;
 using XF.Domain.Constants;
@@ -2626,8 +2628,11 @@ public class OrderController : BaseController
         else if (dto.FlowDirection is EFlowDirection.CenterToOrg)
         {
             expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.AcceptTypeCode);
-            order.CenterToOrg(expiredTimeConfig.TimeText, expiredTimeConfig.Count,
-                expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, expiredTimeConfig.NearlyExpiredTime);
+            order.CenterToOrg(
+                expiredTimeConfig.TimeText, expiredTimeConfig.Count,
+                expiredTimeConfig.TimeType, expiredTimeConfig.ExpiredTime, 
+                expiredTimeConfig.NearlyExpiredTime, dto.Opinion, 
+                _sessionContext.RequiredUserId, _sessionContext.UserName);
             //写入质检
             await _qualityApplication.AddQualityAsync(EQualitySource.Send, order.Id, HttpContext.RequestAborted);
         }
@@ -2869,14 +2874,64 @@ public class OrderController : BaseController
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
         return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
-    }
+	}
 
-    /// <summary>
-    /// 首页查询
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <returns></returns>
-    [HttpGet("waited/home")]
+
+	/// <summary>
+	/// 查询中心待办
+	/// </summary>
+	[HttpGet("waited/center")]
+	public async Task<PagedDto<OrderDto>> QueryWaitedForCenter([FromQuery] QueryOrderWaitedCenterDto dto) 
+    {
+        if (dto.EndCreationTime.HasValue)
+            dto.EndCreationTime = dto.EndCreationTime.Value.AddDays(1).AddSeconds(-1);
+        if (dto.StartTimeEnd.HasValue)
+	        dto.StartTimeEnd = dto.StartTimeEnd.Value.AddDays(1).AddSeconds(-1);
+
+		var (total, items) = await _orderRepository.Queryable(viewFilter: false)
+            .Where(x => x.Workflow.Steps.Any(s => s.Status < EWorkflowStepStatus.Handled && s.StepHandlers.Any(d => d.OrgId == OrgSeedData.CenterId) ))
+            .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
+			.Where(x => x.Status != EOrderStatus.BackToProvince)
+            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No!.Contains(dto.No!))
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title!.Contains(dto.Title!))
+            .WhereIF(dto is { StCreationTime: not null, EndCreationTime: not null }, x => x.CreationTime >= dto.StCreationTime && x.CreationTime <= dto.EndCreationTime)
+            .WhereIF(dto is { StartTimeSt: not null, StartTimeEnd: not null }, x => x.CreationTime >= dto.StartTimeSt && x.CreationTime <= dto.StartTimeEnd)
+			.WhereIF(!string.IsNullOrEmpty(dto.StepName), x => x.Workflow.Steps.Any(s=>s.Name == dto.StepName))
+            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), x => x.ActualHandleOrgName!.Contains(dto.ActualHandleOrgName!))
+            .WhereIF(dto.Status.HasValue, x => x.Status == dto.Status)
+            .WhereIF(!string.IsNullOrEmpty(dto.AcceptorName), x => x.AcceptorName!.Contains(dto.AcceptorName!))
+            .WhereIF(dto.ExpiredStatus is EExpiredStatus.Normal, x => DateTime.Now < x.NearlyExpiredTime)
+            .WhereIF(dto.ExpiredStatus is EExpiredStatus.GoingToExpired, x => DateTime.Now > x.NearlyExpiredTime && DateTime.Now < x.ExpiredTime)
+            .WhereIF(dto.ExpiredStatus is EExpiredStatus.Expired, x => DateTime.Now >= x.ExpiredTime)
+			.OrderBy(x => x.Status)
+			.OrderBy(x => x.CreationTime, OrderByType.Desc)
+			.ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+		return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+	}
+
+	/// <summary>
+	/// 查询中心待办基础数据
+	/// </summary>
+	/// <returns></returns>
+	[HttpGet("waited/center/base")]
+	public async Task<object> WaitedForCenterBaseData()
+	{
+		var rsp = new
+		{
+			OrderStatus = EnumExts.GetDescriptions<EOrderStatus>(),
+			ExpiredStatus = EnumExts.GetDescriptions<EExpiredStatus>(),
+            StepNames = new  string[] { "话务部", "派单组" }
+		};
+		return rsp;
+	}
+
+	/// <summary>
+	/// 首页查询
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[HttpGet("waited/home")]
 
     public async Task<Object> QueryWaitedHome([FromQuery] QueryOrderWaitedDto dto) {
 
@@ -3038,7 +3093,7 @@ public class OrderController : BaseController
              .WhereIF(dto.AuditState == 1, d => d.State == ESendBackAuditState.Apply)
              .WhereIF(dto.AuditState == 2 && !dto.State.HasValue, d => d.State > ESendBackAuditState.Apply)
              .WhereIF(dto.AuditState == 2 && dto.State.HasValue, d => d.State == dto.State)
-             .WhereIF(_sessionContext.Roles.Contains("123") == false, x => x.SendBackOrgId == _sessionContext.OrgId);// 123 系统管理员
+             .WhereIF(_sessionContext.Roles.Contains("role_sysadmin") == false, x => x.SendBackOrgId == _sessionContext.OrgId);// 123 系统管理员
 
         var (total, items) = await query.OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);

+ 57 - 57
src/Hotline.Api/Controllers/TestController.cs

@@ -326,67 +326,67 @@ public class TestController : BaseController
     [HttpGet("wfdefine")]
     public async Task GetWorkflowDefine([FromQuery] string id)
     {
-        var query = _workflowTraceRepository.Queryable()
-            .LeftJoin<Workflow>((t, w) => t.WorkflowId == w.Id)
-            .LeftJoin<Order>((t, w, o) => w.ExternalId == o.Id)
-            .Where((t, w, o) => o.No.Length == 14);
-
-        if (!string.IsNullOrEmpty(id))
-            query = query.Where(d => d.WorkflowId == id);
-        var list = await query
-            .Select((t, w, o) => new { t, w, o })
-            .ToListAsync(HttpContext.RequestAborted);
+        //var query = _workflowTraceRepository.Queryable()
+        //    .LeftJoin<Workflow>((t, w) => t.WorkflowId == w.Id)
+        //    .LeftJoin<Order>((t, w, o) => w.ExternalId == o.Id)
+        //    .Where((t, w, o) => o.No.Length == 14);
+
+        //if (!string.IsNullOrEmpty(id))
+        //    query = query.Where(d => d.WorkflowId == id);
+        //var list = await query
+        //    .Select((t, w, o) => new { t, w, o })
+        //    .ToListAsync(HttpContext.RequestAborted);
         
-        var toUsers = list.Where(d => d.t.FlowAssignType == EFlowAssignType.User).ToList();
-        var userIds = toUsers.SelectMany(d => d.t.Handlers).Select(d => d.Key).Distinct().ToList();
-        var users = await _userRepository.Queryable()
-            .Includes(d => d.Organization)
-            .Where(d => userIds.Contains(d.Id))
-            .ToListAsync(HttpContext.RequestAborted);
-        //var orgTraces = list.Where(d => d.FlowAssignType == EFlowAssignType.Org).ToList();
-        var stepHandlers = new List<WorkflowStepHandler>();
-        foreach (var toUser in toUsers)
-        {
-            foreach (var traceHandler in toUser.t.Handlers)
-            {
-                var user = users.FirstOrDefault(d => d.Id == traceHandler.Key);
-                if (user != null)
-                    stepHandlers.Add(new WorkflowStepHandler
-                    {
-                        WorkflowId = toUser.w.Id,
-                        ExternalId = toUser.w.ExternalId,
-                        WorkflowStepId = toUser.t.StepId,
-                        FlowAssignType = toUser.t.FlowAssignType.Value,
-                        UserId = user.Id,
-                        Username = user.Name,
-                        OrgId = user.OrgId,
-                        OrgName = user.Organization.Name,
-                        IsActualHandler = user.Id == toUser.t.HandlerId
-                    });
-            }
-        }
+        //var toUsers = list.Where(d => d.t.FlowAssignType == EFlowAssignType.User).ToList();
+        //var userIds = toUsers.SelectMany(d => d.t.Handlers).Select(d => d.Key).Distinct().ToList();
+        //var users = await _userRepository.Queryable()
+        //    .Includes(d => d.Organization)
+        //    .Where(d => userIds.Contains(d.Id))
+        //    .ToListAsync(HttpContext.RequestAborted);
+        ////var orgTraces = list.Where(d => d.FlowAssignType == EFlowAssignType.Org).ToList();
+        //var stepHandlers = new List<WorkflowStepHandler>();
+        //foreach (var toUser in toUsers)
+        //{
+        //    foreach (var traceHandler in toUser.t.Handlers)
+        //    {
+        //        var user = users.FirstOrDefault(d => d.Id == traceHandler.Key);
+        //        if (user != null)
+        //            stepHandlers.Add(new WorkflowStepHandler
+        //            {
+        //                WorkflowId = toUser.w.Id,
+        //                ExternalId = toUser.w.ExternalId,
+        //                WorkflowStepId = toUser.t.StepId,
+        //                FlowAssignType = toUser.t.FlowAssignType.Value,
+        //                UserId = user.Id,
+        //                Username = user.Name,
+        //                OrgId = user.OrgId,
+        //                OrgName = user.Organization.Name,
+        //                IsActualHandler = user.Id == toUser.t.HandlerId
+        //            });
+        //    }
+        //}
 
-        var toOrgs = list.Where(d => d.t.FlowAssignType == EFlowAssignType.Org).ToList();
-        foreach (var toOrg in toOrgs)
-        {
-            foreach (var handler in toOrg.t.Handlers)
-            {
-                stepHandlers.Add(new WorkflowStepHandler
-                {
-                    WorkflowId = toOrg.w.Id,
-                    ExternalId = toOrg.w.ExternalId,
-                    WorkflowStepId = toOrg.t.StepId,
-                    FlowAssignType = toOrg.t.FlowAssignType.Value,
-                    OrgId = handler.Key,
-                    OrgName = handler.Value,
-                    IsActualHandler = handler.Key == toOrg.t.HandlerOrgId
-                });
-            }
-        }
+        //var toOrgs = list.Where(d => d.t.FlowAssignType == EFlowAssignType.Org).ToList();
+        //foreach (var toOrg in toOrgs)
+        //{
+        //    foreach (var handler in toOrg.t.Handlers)
+        //    {
+        //        stepHandlers.Add(new WorkflowStepHandler
+        //        {
+        //            WorkflowId = toOrg.w.Id,
+        //            ExternalId = toOrg.w.ExternalId,
+        //            WorkflowStepId = toOrg.t.StepId,
+        //            FlowAssignType = toOrg.t.FlowAssignType.Value,
+        //            OrgId = handler.Key,
+        //            OrgName = handler.Value,
+        //            IsActualHandler = handler.Key == toOrg.t.HandlerOrgId
+        //        });
+        //    }
+        //}
 
-        _logger.LogInformation($"生成handlers: {stepHandlers.Count} 条");
+        //_logger.LogInformation($"生成handlers: {stepHandlers.Count} 条");
 
-        await _workflowStepHandleRepository.AddRangeAsync(stepHandlers, HttpContext.RequestAborted);
+        //await _workflowStepHandleRepository.AddRangeAsync(stepHandlers, HttpContext.RequestAborted);
     }
 
     [AllowAnonymous]

+ 1 - 1
src/Hotline.Api/config/appsettings.Development.json

@@ -29,7 +29,7 @@
   },
   "Swagger": true,
   "Cors": {
-    "Origins": [ "http://localhost:8888", "http://admin.hotline.fw.com", "http://localhost:80" ]
+    "Origins": [ "http://localhost:8888", "http://admin.hotline.fw.com", "http://localhost:80","http://localhost:8113" ]
   },
   "IdentityConfiguration": {
     "Password": {

+ 1 - 1
src/Hotline.Api/config/appsettings.json

@@ -29,7 +29,7 @@
   },
   "Swagger": true,
   "Cors": {
-    "Origins": [ "http://localhost:8888", "http://hotline.12345lm.cn", "http://110.188.24.28:50101", "http://110.188.24.28:50102", "http://110.188.24.28:50301", "http://bs.hotline.12345lm.cn" ]
+    "Origins": [ "http://localhost:8888", "http://localhost:8113", "http://hotline.12345lm.cn", "http://110.188.24.28:50101", "http://110.188.24.28:50102", "http://110.188.24.28:50301", "http://bs.hotline.12345lm.cn" ]
   },
   "IdentityConfiguration": {
     "Password": {

+ 6 - 7
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -207,8 +207,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         CancellationToken cancellationToken = default)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
-            withCountersigns: true,
-            cancellationToken: cancellationToken);
+            withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
         //await NextAsync(workflow, dto, dto.ExpiredTime, dto.IsStartCountersign, cancellationToken);
 
         ////未超期工单,节点超期时间不能小于当前时间,不能大于流程整体超期时间
@@ -276,8 +275,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// </summary>
     public async Task PreviousAsync(PreviousWorkflowDto dto, CancellationToken cancellationToken)
     {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true,
-            withCountersigns: true, cancellationToken: cancellationToken);
+        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true, 
+            withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
         var user = await _userRepository.Queryable()
             .Includes(x => x.Organization)
             .FirstAsync(x => x.Id == _sessionContext.RequiredUserId, cancellationToken);
@@ -289,8 +288,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// </summary>
     public async Task PreviousAsync(PreviousWorkflowDto dto, string userId, CancellationToken cancellationToken)
     {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true,
-            withCountersigns: true, cancellationToken: cancellationToken);
+        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true, 
+            withTraces: true, withCountersigns: true, cancellationToken: cancellationToken);
         var user = await _userRepository.Queryable()
             .Includes(x => x.Organization)
             .FirstAsync(x => x.Id == userId, cancellationToken);
@@ -308,7 +307,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             throw new UserFriendlyException(string.Join(',', validationResult.Errors));
 
         var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
-            cancellationToken: cancellationToken);
+           withTraces: true, cancellationToken: cancellationToken);
 
         //await _orderDomainService.ReadyToRecallAsync(workflow.ExternalId, cancellationToken);
 

+ 12 - 0
src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs

@@ -157,6 +157,18 @@ public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
                     order.ProcessType is EProcessType.Zhiban)
                     : 0;
                 order.File(now, handleDuration, fileDuration, allDuration);
+                order.FileUserId = notification.Trace.HandlerId;
+                order.FileUserName = notification.Trace.HandlerName;
+                order.FileUserOrgId = notification.Trace.HandlerOrgId;
+                order.FileUserOrgName = notification.Trace.HandlerOrgName;
+
+                if (order.ProcessType == EProcessType.Jiaoban)
+                {
+                    order.FileUserRole = EFileUserType.Org;
+                }
+                //TODO
+
+               
                 await _orderRepository.UpdateAsync(order, cancellationToken);
                 var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken);
                 var orderFlowDto = new OrderFlowDto

+ 26 - 17
src/Hotline.Repository.SqlSugar/CallCenter/TrCallRecordRepository.cs

@@ -63,7 +63,7 @@ namespace Hotline.Repository.SqlSugar.CallCenter
             return returnList;
         }
 
-        public async Task<List<TrCallHourDto>?> GetCallHourList(DateTime beginDate,DateTime? endDate,int noConnectByeTimes,int effectiveTimes,int connectByeTimes)
+        public async Task<List<TrCallHourDto>?> GetCallHourList(DateTime beginDate,DateTime? endDate,int noConnectByeTimes,int effectiveTimes,int connectByeTimes, string source)
         {
             //计算小时差
             if (!endDate.HasValue)
@@ -89,8 +89,9 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 
             var list = await Db.Reportable(dts).ToQueryable<DateTime>()
                 .LeftJoin<TrCallRecord>((it, o) => o.CreatedTime >= it.ColumnName && o.CreatedTime < it.ColumnName.AddHours(1) && o.CallDirection == ECallDirection.In)
-                //.Where((it, o) => o.CallDirection == ECallDirection.In)
-                .GroupBy((it,o) => it.ColumnName)
+				 //.Where((it, o) => o.CallDirection == ECallDirection.In)
+				 .WhereIF(!string.IsNullOrEmpty(source), (it,o) => o.CDPN == source)
+				.GroupBy((it,o) => it.ColumnName)
                 .Select((it, o) => new TrCallHourDto()
                 {
                     DateTimeTo = it.ColumnName, 
@@ -109,7 +110,9 @@ namespace Hotline.Repository.SqlSugar.CallCenter
                 .Select(x=> new TrCallHourDto() { 
                     Hour = x.Key,
                     HourTo = x.Key.ToString().PadLeft(2, '0') + ":00 - " + (x.Key).ToString().PadLeft(2, '0') + ":59",
-                    EffectiveCount = x.Sum(d=>d.EffectiveCount),
+                    StartHourTo= x.Key.ToString().PadLeft(2, '0') + ":00",
+                    EndHourTo = x.Key.ToString().PadLeft(2, '0') + ":59",
+					EffectiveCount = x.Sum(d=>d.EffectiveCount),
                     ConnectByeCount = x.Sum(d=>d.ConnectByeCount),
                     NoConnectByeCount = x.Sum(d=>d.NoConnectByeCount),
                     QueueByeCount = x.Sum(d=>d.QueueByeCount),
@@ -123,26 +126,32 @@ namespace Hotline.Repository.SqlSugar.CallCenter
 		/// 通话时段统计明细
 		/// </summary>
 		/// <returns></returns>
-        public async Task<object> GetCallList(DateTime beginDate, DateTime? endDate, int noConnectByeTimes, int effectiveTimes, int connectByeTimes, string type, string source ,int pageIndex, int pageSize)
+        public async Task<object> GetCallList(DateTime beginDate, DateTime? endDate, int noConnectByeTimes, int effectiveTimes, int connectByeTimes, string type, string source , TimeSpan? startHourTo, int pageIndex, int pageSize)
         {
+            TimeSpan endHourTo = DateTime.Now.TimeOfDay;
+			if (startHourTo.HasValue)
+	        {
+                 endHourTo = startHourTo.Value.Add(new TimeSpan(1, 0, 0));
+			}
 	        endDate = endDate.Value.Date.AddDays(1).AddSeconds(-1);
 	        RefAsync<int> total = 0;
 			var res = await Db.Queryable<TrCallRecord>()
                 .Where(x => x.CreatedTime >= beginDate && x.CreatedTime <= endDate)
                 .Where(x => x.CallDirection == ECallDirection.In)
                 .WhereIF(!string.IsNullOrEmpty(source), x => x.CDPN == source)
-                .WhereIF(!string.IsNullOrEmpty(type) && ("QueueBye".Equals(type) || "queueByeCount".Equals(type)), x => x.QueueTims > 0 && x.RingTimes == 0)
-                .WhereIF(!string.IsNullOrEmpty(type) &&("IvrBye".Equals(type)|| "ivrByeCount".Equals(type)) , x => x.BeginIvrTime.HasValue && !x.BeginQueueTime.HasValue && !x.BeginRingTime.HasValue && x.OnState == EOnState.NoOn)
-                .WhereIF(!string.IsNullOrEmpty(type) && ("Effective".Equals(type) || "effectiveCount".Equals(type)), x => x.Duration >= effectiveTimes)
-                .WhereIF(!string.IsNullOrEmpty(type) && "Invalid".Equals(type) , x => x.Duration < effectiveTimes)
-                .WhereIF(!string.IsNullOrEmpty(type) && "connectByeCount".Equals(type) , x => x.Duration > 0 && x.Duration <= connectByeTimes)
-                .WhereIF(!string.IsNullOrEmpty(type) && "noConnectByeCount".Equals(type), x => x.Duration == 0 && x.RingTimes <= noConnectByeTimes && x.RingTimes > 0)
-                .WhereIF(!string.IsNullOrEmpty(type) && "count".Equals(type), x => 
-                (x.Duration == 0 && x.RingTimes <= noConnectByeTimes && x.RingTimes > 0)
-                ||(x.Duration == 0 && x.RingTimes <= noConnectByeTimes && x.RingTimes > 0)
-				||(x.Duration >= effectiveTimes)
-				||(x.BeginIvrTime.HasValue && !x.BeginQueueTime.HasValue && !x.BeginRingTime.HasValue && x.OnState == EOnState.NoOn)
-				||(x.QueueTims > 0 && x.RingTimes == 0))
+                .WhereIF(!string.IsNullOrEmpty(type) && ("QueueBye".Equals(type) || "queueByeCount".Equals(type)), x => x.QueueTims > 0 && x.RingTimes == 0) //队列挂断
+				.WhereIF(!string.IsNullOrEmpty(type) &&("IvrBye".Equals(type)|| "ivrByeCount".Equals(type)) , x => x.BeginIvrTime.HasValue && !x.BeginQueueTime.HasValue && !x.BeginRingTime.HasValue && x.OnState == EOnState.NoOn)//IVR挂断
+				.WhereIF(!string.IsNullOrEmpty(type) && ("Effective".Equals(type) || "effectiveCount".Equals(type)), x => x.Duration >= effectiveTimes) //有效接通
+				.WhereIF(!string.IsNullOrEmpty(type) && "Invalid".Equals(type) , x => x.Duration > 0 && x.Duration < effectiveTimes)//无效接通
+				.WhereIF(!string.IsNullOrEmpty(type) && "connectByeCount".Equals(type) , x => x.Duration > 0 && x.Duration <= connectByeTimes)  //接通秒挂
+				.WhereIF(!string.IsNullOrEmpty(type) && "noConnectByeCount".Equals(type), x => x.Duration == 0 && x.RingTimes <= noConnectByeTimes && x.RingTimes > 0)  //未接通秒挂
+				.WhereIF(!string.IsNullOrEmpty(type) && "count".Equals(type), x => 
+                (x.Duration == 0 && x.RingTimes <= noConnectByeTimes && x.RingTimes > 0)  //未接通秒挂
+				|| (x.Duration > 0 && x.Duration <= connectByeTimes)  //接通秒挂
+				|| (x.Duration >= effectiveTimes)//有效接通
+				|| (x.BeginIvrTime.HasValue && !x.BeginQueueTime.HasValue && !x.BeginRingTime.HasValue && x.OnState == EOnState.NoOn) //IVR挂断
+				|| (x.QueueTims > 0 && x.RingTimes == 0))//队列挂断
+				.WhereIF(startHourTo.HasValue, x=>SqlFunc.ToTime(x.CreatedTime.ToString("HH:mm:ss")) >= startHourTo.Value && SqlFunc.ToTime(x.CreatedTime.ToString("HH:mm:ss")) < endHourTo)
 				.Select(x=> new { 
                     CPN = x.CPN,
                     CDPN= x.CDPN,

+ 2 - 2
src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs

@@ -207,8 +207,8 @@ namespace Hotline.Repository.SqlSugar.Extensions
             /***写AOP等方法***/
             db.Aop.OnLogExecuting = (sql, pars) =>
             {
-                Log.Information("Sql: {0}", sql);
-                Log.Information("SqlParameters: {0}", string.Join(',', pars.Select(d => d.Value)));
+                //Log.Information("Sql: {0}", sql);
+                //Log.Information("SqlParameters: {0}", string.Join(',', pars.Select(d => d.Value)));
             };
             db.Aop.OnError = (exp) =>//SQL报错
             {

+ 2 - 0
src/Hotline.Share/Dtos/Bigscreen/BigscreenDto.cs

@@ -94,6 +94,8 @@ namespace Hotline.Share.Dtos.Bigscreen
         public string HotspotName { get; set; }
 
         public int SumCount { get; set; }
+
+        public string HotspotSpliceName { get; set; }
     }
 
     public class OrderCountStatisticsDto

+ 5 - 1
src/Hotline.Share/Dtos/CallCenter/TrCallDto.cs

@@ -14,7 +14,11 @@ namespace Hotline.Share.Dtos.CallCenter
 
         public string HourTo { get; set; }
 
-        public DateTime DateTimeTo { get; set; }
+        public string StartHourTo { get; set; }
+
+        public string EndHourTo { get; set; }
+
+		public DateTime DateTimeTo { get; set; }
 
         /// <summary>
         /// 总计

+ 6 - 1
src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowTraceDto.cs

@@ -19,7 +19,7 @@ public class WorkflowTraceDto : StepBasicDto
     /// </summary>
     public EWorkflowTraceType TraceType { get; set; }
     
-    public string StatusText => TraceType.GetDescription();
+    public string TraceTypeText => TraceType.GetDescription();
 
     /// <summary>
     /// 过期时间(生成流转记录时取值当前workflow的过期时间)
@@ -31,6 +31,11 @@ public class WorkflowTraceDto : StepBasicDto
     /// </summary>
     public string? ParentId { get; set; }
 
+    /// <summary>
+    /// 派单组办理次数
+    /// </summary>
+    public int SendHandleTimes { get; set; }
+
     /// <summary>
     /// 会签流转记录
     /// </summary>

+ 21 - 2
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -38,18 +38,37 @@ namespace Hotline.Share.Dtos.Order
 
 	public class OrderBiCentreDataListVo
 	{
+		/// <summary>
+		/// 用户名
+		/// </summary>
 		public string UserName { get; set; }
 
+		/// <summary>
+		/// 用户ID
+		/// </summary>
 		public string UserId { get; set; }
 
+		/// <summary>
+		/// 中心归档件
+		/// </summary>
 		public int CentreArchive { get; set; }
 
+		/// <summary>
+		/// 转办信件
+		/// </summary>
 		public int CentreCareOf { get; set; }
 
+		/// <summary>
+		/// 待转办
+		/// </summary>
 		public int NoCentreCareOf { get; set; }
-
+		/// <summary>
+		/// 无效件
+		/// </summary>
 		public int Invalid { get; set; }
-
+		/// <summary>
+		/// 重复件
+		/// </summary>
 		public int Repeat { get; set; }
 
         //public int Subtotal => CentreArchive + CentreCareOf + NoCentreCareOf + Invalid + Repeat;

+ 63 - 0
src/Hotline.Share/Dtos/Order/OrderWaitedDto.cs

@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
 
 namespace Hotline.Share.Dtos.Order
@@ -24,4 +25,66 @@ namespace Hotline.Share.Dtos.Order
     }
 
     public record QueryOrderWaitedDto(bool? IsProvince, bool? IsHandled,bool? IsCounterSign,bool? ExpiredOrAlmostOverdue) : PagedKeywordRequest;
+
+    /// <summary>
+    /// 中心待办
+    /// </summary>
+    public record QueryOrderWaitedCenterDto : PagedKeywordRequest
+	{
+		/// <summary>
+		/// 编号
+		/// </summary>
+		public string? No { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string? Title { get; set; }
+        
+        /// <summary>
+        /// 开始生成时间
+        /// </summary>
+        public DateTime? StCreationTime { get; set; }
+
+        /// <summary>
+        /// 结束生成时间
+        /// </summary>
+        public DateTime? EndCreationTime { get; set; }
+
+        /// <summary>
+        /// 开始受理时间
+        /// </summary>
+        public DateTime? StartTimeEnd { get; set; }
+
+        /// <summary>
+        /// 结束受理时间
+        /// </summary>
+        public DateTime? StartTimeSt { get; set; }
+        
+        /// <summary>
+        /// 当前节点名称
+        /// </summary>
+        public string? StepName { get; set; }
+
+        /// <summary>
+        /// 接办部门
+        /// </summary>
+        public string? ActualHandleOrgName { get; set; }
+
+        /// <summary>
+        /// 状态
+        /// </summary>
+        public EOrderStatus? Status { get; set; }
+
+        /// <summary>
+        /// 受理人
+        /// </summary>
+        public string? AcceptorName { get; set; }
+
+        /// <summary>
+        /// 过期状态
+        /// </summary>
+        public EExpiredStatus? ExpiredStatus { get; set; }
+
+    }
 }

+ 2 - 5
src/Hotline.Share/Dtos/Position.cs

@@ -54,10 +54,7 @@ public class Position
 
     public void InitAddress()
     {
-        if (string.IsNullOrEmpty(Address))
-        {
-            Address = $"{Province}{City}{County}{Town}";
-            FullAddress = $"{Address}{Street}";
-        }
+        Address = $"{Province}{City}{County}{Town}";
+        FullAddress = $"{Address}{Street}";
     }
 }

+ 30 - 0
src/Hotline.Share/Enums/Order/EFileUserType.cs

@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Enums.Order
+{
+    public enum EFileUserType
+    {
+        /// <summary>
+        /// 坐席
+        /// </summary>
+        [Description("坐席")]
+        Seat = 1,
+
+        /// <summary>
+        /// 派单员
+        /// </summary>
+        [Description("派单员")]
+        Dispatch =2,
+
+        /// <summary>
+        /// 部门
+        /// </summary>
+        [Description("部门")]
+        Org = 3,
+    }
+}

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

@@ -51,7 +51,7 @@ public record OrgDataListDetailRequest:PagedRequest
 	public string? No { get; set; }
 
 	/// <summary>
-	/// 查询状态 1:业务已办超期  2:会签已办超期  3:业务待办超期  4:会签待办超期
+	/// 查询状态 1:业务已办超期  2:会签已办超期  3:业务待办超期  4:会签待办超期  5:小计
 	/// </summary>
 	public int QueryType { get; set; }
 
@@ -136,6 +136,17 @@ public record QueryOrderDelayDataListRequest:ReportPagedRequest
 	public string? OrgName { get; set; }
 }
 
+public record QueryOrderDelayDataDetailRequest : ReportPagedRequest
+{
+	public string? OrgCode { get; set; }
+
+	/// <summary>
+	/// 查询类型  1已同意次数 2 未同意次数 3  审批中次数 4 小计
+	/// </summary>
+	public int? Type { get; set; }
+
+}
+
 public record QueryOrderReTransactRequest : ReportPagedRequest
 {
 	public string? OrgName { get; set; }

+ 2 - 2
src/Hotline/CallCenter/Calls/ITrCallRecordRepository.cs

@@ -7,12 +7,12 @@ namespace Hotline.CallCenter.Calls
     {
 
         Task<List<BiCallDto>?> GetQueryCalls(DateTime beginDate, DateTime endDate);
-        Task<List<TrCallHourDto>?> GetCallHourList(DateTime beginDate, DateTime? endDate, int noConnectByeTimes, int effectiveTimes,int connectByeTimes);
+        Task<List<TrCallHourDto>?> GetCallHourList(DateTime beginDate, DateTime? endDate, int noConnectByeTimes, int effectiveTimes,int connectByeTimes, string source);
 
 
         Task<List<CallHotLineDto>> GetCallHotLineList(DateTime beginDate, DateTime endDate, string lineNum, int noConnectByeTimes, int effectiveTimes, int connectByeTimes,int ringTims);
 
-        Task<object> GetCallList(DateTime beginDate, DateTime? endDate, int noConnectByeTimes, int effectiveTimes, int connectByeTimes, string type, string source, int pageIndex, int pageSize);
+        Task<object> GetCallList(DateTime beginDate, DateTime? endDate, int noConnectByeTimes, int effectiveTimes, int connectByeTimes, string type, string source, TimeSpan? startHourTo, int pageIndex, int pageSize);
 
 	}
 }

+ 10 - 0
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1786,8 +1786,18 @@ namespace Hotline.FlowEngine.Workflows
             EWorkflowTraceType traceType = EWorkflowTraceType.Normal,
             CancellationToken cancellationToken = default)
         {
+            var sendHandleTimes = 0;
+            if (step.BusinessType == EBusinessType.Send)
+            {
+                var sendHandleCount = workflow.Traces.Count(d => d.StepType == EStepType.Normal &&
+                                                                 d.BusinessType == EBusinessType.Send);
+                sendHandleTimes = sendHandleCount + 1;
+            }
+
+
             var trace = _mapper.Map<WorkflowTrace>(step);
             trace.TraceType = traceType;
+            trace.SendHandleTimes = sendHandleTimes;
 
             if (step.IsInCountersign())
             {

+ 6 - 0
src/Hotline/FlowEngine/Workflows/WorkflowTrace.cs

@@ -24,6 +24,12 @@ public class WorkflowTrace : StepBasicEntity
     /// </summary>
     public EWorkflowTraceType? TraceType { get; set; }
 
+    /// <summary>
+    /// 派单组办理次数
+    /// </summary>
+    [SugarColumn(DefaultValue = "0")]
+    public int SendHandleTimes { get; set; }
+
     /// <summary>
     /// 会签流转记录
     /// </summary>

+ 58 - 17
src/Hotline/Orders/Order.cs

@@ -50,7 +50,7 @@ namespace Hotline.Orders
         /// </summary>
         public string? CallId { get; set; }
 
-       
+
         /// <summary>
         /// 来电归属地
         /// </summary>
@@ -314,6 +314,17 @@ namespace Hotline.Orders
         /// </summary>
         public DateTime? CenterToOrgTime { get; set; }
 
+        /// <summary>
+        /// 交办意见
+        /// </summary>
+        public string? CenterToOrgOpinion{ get; set; }
+
+        /// <summary>
+        /// 交班人
+        /// </summary>
+        public string? CenterToOrgHandlerId { get; set; }
+        public string? CenterToOrgHandlerName { get; set; }
+
         /// <summary>
         /// 归档时间(暂为流程结束时间,因流程结束自动归档)
         /// </summary>
@@ -578,29 +589,29 @@ namespace Hotline.Orders
         /// </summary>
         public string? AcceptorOrgName { get; set; }
 
-		#endregion
-		#region 派单人
+        #endregion
+        #region 派单人
 
-		/// <summary>
-		/// 派单人id
-		/// </summary>
-		public string? SendOrderId { get; set; }
+        /// <summary>
+        /// 派单人id
+        /// </summary>
+        public string? SendOrderId { get; set; }
 
-		/// <summary>
-		/// 派单人名称
-		/// </summary>
-		public string? SendOrderName { get; set; }
+        /// <summary>
+        /// 派单人名称
+        /// </summary>
+        public string? SendOrderName { get; set; }
 
         /// <summary>
         /// 派单次数
         /// </summary>
         public int? SendOrderNumber { get; set; } = 0;
-		#endregion
+        #endregion
 
-		/// <summary>
-		/// 会签类型
-		/// </summary>
-		public ECounterSignType? CounterSignType { get; set; }
+        /// <summary>
+        /// 会签类型
+        /// </summary>
+        public ECounterSignType? CounterSignType { get; set; }
 
         #region 签收
 
@@ -616,6 +627,34 @@ namespace Hotline.Orders
 
         #endregion
 
+        #region 归档冗余字段
+
+        /// <summary>
+        /// 归档人名称
+        /// </summary>
+        public string? FileUserName { get; set; }
+        /// <summary>
+        /// 归档人ID
+        /// </summary>
+        public string? FileUserId { get; set; }
+
+        /// <summary>
+        /// 归档人部门Id
+        /// </summary>
+        public string? FileUserOrgId { get; set; }
+
+        /// <summary>
+        /// 归档人部门名称
+        /// </summary>
+        public string? FileUserOrgName { get; set; }
+
+        /// <summary>
+        /// 归档人类型
+        /// </summary>
+        public EFileUserType? FileUserRole{get;set;}
+
+        #endregion
+
         #endregion
 
         #region 省工单字段
@@ -849,7 +888,9 @@ namespace Hotline.Orders
             Status = EOrderStatus.Visited;
         }
 
-        public void CenterToOrg(string timelimit, int timelimitCount, ETimeType timilimitUnit, DateTime expiredTime, DateTime nearlyExpiredTime)
+        public void CenterToOrg(string timelimit, int timelimitCount, ETimeType timilimitUnit, 
+            DateTime expiredTime, DateTime nearlyExpiredTime,
+            string opinion, string handlerId, string handlerName)
         {
             ProcessType = EProcessType.Jiaoban;
             TimeLimit = timelimit;