Dun.Jason hai 1 ano
pai
achega
e2bb29148d

+ 81 - 7
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -161,12 +161,12 @@ namespace Hotline.Api.Controllers.Bi
         }
 
         /// <summary>
-        /// 热点数据统计
+        /// 热点数据小计统计
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [HttpGet("hotspot_data_list")]
-        public async Task<PagedDto<HotspotDataLsitVo>> HotspotDataLsit([FromQuery] HotspotReportPagedRequest dto)
+        [HttpGet("hotspot_subtotal_data_list")]
+        public async Task<PagedDto<HotspotDataLsitVo>> HotspotSubtotalDataLsit([FromQuery] HotspotSubtotalReportPagedRequest dto)
         {
 	        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
 			var query = _hotspotTypeRepository.Queryable(false, true)
@@ -187,14 +187,88 @@ namespace Hotline.Api.Controllers.Bi
             return new PagedDto<HotspotDataLsitVo>(total, items);
         }
 
-
         /// <summary>
-        /// 部门不满意统计
+        /// 热点数据统计
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        [HttpGet("visit-nosatisfied")]
-        [AllowAnonymous]
+        [HttpGet("hotspot_data_list")]
+        public async Task<object> HotspotDataLsit([FromQuery] HotspotReportPagedRequest dto)
+        {
+	        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+			var items = await _hotspotTypeRepository.Queryable(false, true)
+		        .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
+		        .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.StartTime)
+		        .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.EndTime)
+		        .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
+		        .Where((x, o) => x.ParentId == dto.Id)
+		        .Where((x, o) => x.IsDeleted == false)
+		        .GroupBy((x, o) => new { x.Id, x.HotSpotName })
+		        .Select((x, o) => new HotspotDataLsitVo
+		        {
+			        Id = x.Id,
+			        Name = x.HotSpotName,
+			        Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
+			        Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.HotSpotName != o.HotspotName, 1, 0)) > 0,
+				}).MergeTable().ToListAsync();
+			if (dto.Type > 0)
+	        {
+		        var chainStartTime = dto.StartTime;
+                var chainEndTime = dto.EndTime;
+                switch (dto.Type) 
+                {
+                    case 1://日
+                        chainStartTime = dto.StartTime.Value.AddDays(-1);
+                        chainEndTime = dto.EndTime.Value.AddDays(-1);
+						break;
+                    case 2://月
+	                    chainStartTime = dto.StartTime.Value.AddMonths(-1);
+	                    chainEndTime = dto.EndTime.Value.AddMonths(-1);
+						break;
+                    case 3://年
+	                    chainStartTime = dto.StartTime.Value.AddYears(-1);
+	                    chainEndTime = dto.EndTime.Value.AddYears(-1);
+						break;
+                }
+                var chainItems = await  _hotspotTypeRepository.Queryable(false, true)
+	                .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
+	                .WhereIF(dto.StartTime.HasValue, (x, o) => o.CreationTime >= chainStartTime)
+	                .WhereIF(dto.EndTime.HasValue, (x, o) => o.CreationTime <= chainEndTime)
+	                .WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, o) => x.HotSpotName.Contains(dto.Keyword!))
+	                .Where((x, o) => x.ParentId == dto.Id)
+	                .Where((x, o) => x.IsDeleted == false)
+	                .GroupBy((x, o) => new { x.Id, x.HotSpotName })
+	                .Select((x, o) => new 
+	                {
+		                Id = x.Id,
+		                ChainNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
+	                }).MergeTable().ToListAsync();
+                var res = (from t1 in items
+                           join t2 in chainItems on t1.Id equals t2.Id into t1_t2
+                           from item in t1_t2.DefaultIfEmpty()
+                           select new
+                           {
+                               Id = t1.Id,
+                               Name = t1.Name,
+                               Num = t1.Num,
+                               Sublevel = t1.Sublevel,
+                               Children = new List<HotspotDataLsitVo>(),
+							   ChainNum = t1_t2.Select(x => x.ChainNum).FirstOrDefault(),
+							   ChainRate = t1_t2.Select(x => x.ChainNum).FirstOrDefault() > 0 ?
+                               ((double.Parse(t1.Num.ToString()) - double.Parse(t1_t2.Select(x => x.ChainNum).FirstOrDefault().ToString())) / double.Parse(t1_t2.Select(x => x.ChainNum).FirstOrDefault().ToString()) * 100).ToString("F2")+"%" : "100%",
+                           }).ToList();
+                return res;
+			}
+	        return items;
+        }
+
+
+		/// <summary>
+		/// 部门不满意统计
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("visit-nosatisfied")]
         public async Task<object> QueryVisitNoSatisfied([FromQuery] QueryVisitNoSatiisfiedRequest dto)
         {
 	        if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");

+ 33 - 16
src/Hotline.Api/Controllers/CommonPController.cs

@@ -68,13 +68,13 @@ namespace Hotline.Api.Controllers
         public async Task<Object> GetHomeData() 
         {
             var tadayTime = DateTime.Now.ToString("yyyy-MM-dd");
-            var orderQuery = _orderRepository.Queryable(false, false, false)
-			    .Includes(d => d.Workflow, x => x.Steps);
 			//中心
 			if (_sessionContext.OrgIsCenter)
 	        {
-                //今日来电
-                var tadayCalls = await _trCallRecordRepository.Queryable()
+		        var orderQuery = _orderRepository.Queryable(false, false, false)
+			        .Includes(o => o.Workflow, w => w.Steps);
+				//今日来电
+				var tadayCalls = await _trCallRecordRepository.Queryable()
 	                .Where(x => x.CallDirection == Share.Enums.CallCenter.ECallDirection.In && tadayTime.Equals(x.CreatedTime.ToString("yyyy-MM-dd"))).ToListAsync();
 				var callNum = tadayCalls.Count();
                 var validCallNum = tadayCalls.Where(x => x.Duration > 0 || x.QueueTims > 0 || x.RingTimes > 0).Count();
@@ -83,26 +83,43 @@ namespace Hotline.Api.Controllers
                 var answeredRate = validCallNum > 0 ? (answeredNum / validCallNum * 100) + "%" : "100%";
                 //今日受理工单
                 var tadayOrders = await orderQuery
-	                .Where(x => tadayTime.Equals(x.CreationTime.ToString("yyyy-MM-dd"))).ToListAsync();
+	                .Where(o => tadayTime.Equals(o.CreationTime.ToString("yyyy-MM-dd"))).ToListAsync();
 				var orderNum = tadayOrders.Count();
-				var directlyNum = tadayOrders.Where(x=> x.ProcessType == Share.Enums.Order.EProcessType.Zhiban).Count();
+				var directlyNum = tadayOrders.Where(o=> o.ProcessType == Share.Enums.Order.EProcessType.Zhiban).Count();
                 return new { CallNum = callNum, ValidCallNum = validCallNum, AnsweredNum = answeredNum, AnsweredRate = answeredRate, OrderNum = orderNum, DirectlyNum = directlyNum };
 			}
 			//部门
 			//今日待办
             var time = DateTime.Parse(tadayTime);
-			var handleStatuses =  new[] { EWorkflowStepStatus.WaitForAccept, EWorkflowStepStatus.WaitForHandle };
-            var tasksOrderQuery = orderQuery.Where(d => d.Workflow.Steps.Any(x => handleStatuses.Contains(x.Status)));
-            var tasksOkNum = await tasksOrderQuery.Where(d => SqlFunc.JsonListObjectAny(d.Workflow.HandlerUsers, "Key", _sessionContext.RequiredUserId) && d.Workflow.ExpiredTime > time).CountAsync();
-            var tasksOkOrgNum = await tasksOrderQuery.Where(d => SqlFunc.JsonListObjectAny(d.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && d.Workflow.ExpiredTime > time).CountAsync();
-			//今日已办
-			var handleOrderQuery = orderQuery.Where(d => d.Workflow.Steps.Any(x => new[] { EWorkflowStepStatus.Handled }.Contains(x.Status)));
-			var handleNum = await handleOrderQuery.Where(d => d.Workflow.CurrentHandleTime != null && SqlFunc.JsonListObjectAny(d.Workflow.HandlerUsers, "Key", _sessionContext.RequiredUserId) && d.Workflow.CurrentHandleTime.Value.ToString("yyyy-MM-dd") == tadayTime).CountAsync();
-			var handleOrgNum = await handleOrderQuery.Where(d => d.Workflow.CurrentHandleTime != null && SqlFunc.JsonListObjectAny(d.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && d.Workflow.CurrentHandleTime.Value.ToString("yyyy-MM-dd") == tadayTime).CountAsync();
+			var tasksOkNum = await _orderRepository.Queryable(false, false, false)
+				.Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status == EWorkflowStepStatus.Handled))
+                .Where(o => SqlFunc.JsonListObjectAny(o.Workflow.HandlerUsers, "Key", _sessionContext.RequiredUserId) && o.Workflow.ExpiredTime > time).CountAsync();
+            var tasksOkOrgNum = await _orderRepository.Queryable(false, false, false)
+	            .Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status == EWorkflowStepStatus.Handled))
+                .Where(o => SqlFunc.JsonListObjectAny(o.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && o.Workflow.ExpiredTime > time).CountAsync();
+            //今日已办
+			var handleNum = await _orderRepository.Queryable(false, false, false)
+				.Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status != EWorkflowStepStatus.Handled))
+                .Where(o => o.Workflow.CurrentHandleTime != null && SqlFunc.JsonListObjectAny(o.Workflow.HandlerUsers, "Key", _sessionContext.RequiredUserId) && o.Workflow.CurrentHandleTime.Value.ToString("yyyy-MM-dd") == tadayTime).CountAsync();
+            var handleOrgNum = await _orderRepository.Queryable(false, false, false)
+	            .Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status != EWorkflowStepStatus.Handled))
+                .Where(o => o.Workflow.CurrentHandleTime != null && SqlFunc.JsonListObjectAny(o.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && o.Workflow.CurrentHandleTime.Value.ToString("yyyy-MM-dd") == tadayTime).CountAsync();
 			//部门超期
-			var exceedTasksOkNum = await tasksOrderQuery.Where(d => SqlFunc.JsonListObjectAny(d.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && d.ExpiredTime > DateTime.Now).CountAsync();
-			var exceedHandleNum = await handleOrderQuery.Where(d => SqlFunc.JsonListObjectAny(d.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && d.ExpiredTime > DateTime.Now).CountAsync();
+			var exceedTasksOkNum = await _orderRepository.Queryable(false, false, false)
+				.Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status == EWorkflowStepStatus.Handled))
+                .Where(o => SqlFunc.JsonListObjectAny(o.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && o.ExpiredTime > DateTime.Now).CountAsync();
+            var exceedHandleNum = await _orderRepository.Queryable(false, false, false)
+	            .Includes(o => o.Workflow, w => w.Steps)
+                .Where(o => o.Workflow.Steps.Any(s => s.Status != EWorkflowStepStatus.Handled))
+                .Where(o => SqlFunc.JsonListObjectAny(o.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId) && o.ExpiredTime > DateTime.Now).CountAsync();
             return new { TasksOkNum = tasksOkNum, TasksOkOrgNum = tasksOkOrgNum, HandleNum = handleNum, HandleOrgNum = handleOrgNum, ExceedTasksOkNum = exceedTasksOkNum, ExceedHandleNum = exceedHandleNum };
+
+            return new { };
         }
 	}
 }

+ 40 - 32
src/Hotline.Application/Bigscreen/BigscreenDataShowRefreshService.cs

@@ -48,43 +48,51 @@ namespace Hotline.Application.Bigscreen
 
             while (!stoppingToken.IsCancellationRequested)
             {
-                var now = DateTime.Now;
-                var today = now.Date;
-                var month = now.Month;
-                var secRange = (now - _lastModifyTime).TotalSeconds;
-                
-
-                if (secRange >= 10)
+                try
                 {
-                    //area1
-                    var todayTotal = await orderRepository.CountAsync(d => d.CreationTime.Date == today, stoppingToken);
-                    var todayCompleted =
-                        await orderRepository.CountAsync(d => d.FiledTime.HasValue && d.FiledTime.Value.Date == today,
-                            stoppingToken);
-                    var monthTotal = await orderRepository.CountAsync(d => d.CreationTime.Month == month, stoppingToken);
-                    var monthCompleted = await orderRepository.CountAsync(d => d.FiledTime.HasValue && d.FiledTime.Value.Month == month, stoppingToken);
-                    await realtimeService.BsDataShowChanged1Async(new { todayTotal, todayCompleted, monthTotal, monthCompleted }, stoppingToken);
 
-                    //area3
-                    var calls = await callRepository.Queryable()
-                        .OrderByDescending(d => d.CreationTime)
-                        .Take(20)
-                        .Select(d => new { creationTime = d.CreatedTime, from = d.CPNName, to = d.CDPN, d.Duration })
-                        .ToListAsync(stoppingToken);
-                    await realtimeService.BsDataShowChanged3Async(calls, stoppingToken);
+                    var now = DateTime.Now;
+                    var today = now.Date;
+                    var month = now.Month;
+                    var secRange = (now - _lastModifyTime).TotalSeconds;
 
-                    //area8
-                    var orders = await orderRepository.Queryable(workflowFilter: false)
-                        .OrderByDescending(d => d.CreationTime)
-                        .Take(20)
-                        .Select(d => new { d.No, d.Title, d.Address, d.CreationTime, d.AcceptType })
-                        .ToListAsync(stoppingToken);
-                    await realtimeService.BsDataShowChanged8Async(orders, stoppingToken);
 
-                    logger.LogInformation($"send msg: {orders.First().Address}");
-                    _lastModifyTime = DateTime.Now;
-                }
+                    if (secRange >= 10)
+                    {
+                        //area1
+                        var todayTotal = await orderRepository.CountAsync(d => d.CreationTime.Date == today, stoppingToken);
+                        var todayCompleted =
+                            await orderRepository.CountAsync(d => d.FiledTime.HasValue && d.FiledTime.Value.Date == today,
+                                stoppingToken);
+                        var monthTotal = await orderRepository.CountAsync(d => d.CreationTime.Month == month, stoppingToken);
+                        var monthCompleted = await orderRepository.CountAsync(d => d.FiledTime.HasValue && d.FiledTime.Value.Month == month, stoppingToken);
+                        await realtimeService.BsDataShowChanged1Async(new { todayTotal, todayCompleted, monthTotal, monthCompleted }, stoppingToken);
+
+                        //area3
+                        var calls = await callRepository.Queryable()
+                            .OrderByDescending(d => d.CreationTime)
+                            .Take(20)
+                            .Select(d => new { creationTime = d.CreatedTime, from = d.CPNName, to = d.CDPN, d.Duration })
+                            .ToListAsync(stoppingToken);
+                        await realtimeService.BsDataShowChanged3Async(calls, stoppingToken);
+
+                        //area8
+                        var orders = await orderRepository.Queryable(workflowFilter: false)
+                            .OrderByDescending(d => d.CreationTime)
+                            .Take(20)
+                            .Select(d => new { d.No, d.Title, d.Address, d.CreationTime, d.AcceptType })
+                            .ToListAsync(stoppingToken);
+                        await realtimeService.BsDataShowChanged8Async(orders, stoppingToken);
 
+                        logger.LogInformation($"send msg: {orders.First().Address}");
+                        _lastModifyTime = DateTime.Now;
+                    }
+
+                }
+                catch (Exception)
+                {
+                    
+                }
                 await Task.Delay(times, stoppingToken);
             }
         }

+ 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/Order/OrderBiDto.cs

@@ -56,7 +56,9 @@ namespace Hotline.Share.Dtos.Order
 		public string Id { get; set; }
 
 		public int Num { get; set; }
+		public bool Sublevel { get; set; }
 
+		List<HotspotDataLsitVo> Children { get; set; }
 	}
 
 

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

@@ -30,6 +30,12 @@ public record ReportPagedRequest : PagedKeywordRequest
 
 }
 
+public record HotspotSubtotalReportPagedRequest : ReportPagedRequest
+{
+
+	public string Id { get; set; }
+}
+
 public record HotPortJoinOrgStatisticsRequest
 {
 	public DateTime StartTime { get; set; }
@@ -41,6 +47,11 @@ public record HotPortJoinOrgStatisticsRequest
 public record HotspotReportPagedRequest : ReportPagedRequest { 
 
 	public string Id { get; set; }
+
+	/// <summary>
+	/// 查询类型  年 3 月 2 日 1 自定义 0
+	/// </summary>
+	public int Type { get; set; }
 }