ソースを参照

新增 区域分时统计

tangjiang 10 ヶ月 前
コミット
81b98b459f

+ 62 - 27
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -25,7 +25,6 @@ using Hotline.Tools;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
-using Microsoft.EntityFrameworkCore.Migrations.Operations;
 using NPOI.SS.Formula.Functions;
 using Org.BouncyCastle.Utilities;
 using SqlSugar;
@@ -64,7 +63,6 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IOrderApplication _orderApplication;
         private readonly ITimeLimitDomainService _timeLimitDomainService;
         private readonly IOrderReportApplication _orderReportApplication;
-        private readonly IRepository<SystemArea> _systemAreaRepository;
 
         public BiOrderController(
             IOrderRepository orderRepository,
@@ -89,8 +87,7 @@ namespace Hotline.Api.Controllers.Bi
             IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
             IOrderApplication orderApplication,
             ITimeLimitDomainService timeLimitDomainService,
-            IOrderReportApplication orderReportApplication,
-             IRepository<SystemArea> systemAreaRepository
+            IOrderReportApplication orderReportApplication
             )
         {
             _orderRepository = orderRepository;
@@ -116,7 +113,6 @@ namespace Hotline.Api.Controllers.Bi
             _orderApplication = orderApplication;
             _timeLimitDomainService = timeLimitDomainService;
             _orderReportApplication = orderReportApplication;
-            _systemAreaRepository = systemAreaRepository;
         }
 
         /// <summary>
@@ -2677,26 +2673,65 @@ namespace Hotline.Api.Controllers.Bi
             return ExcelStreamResult(stream, "信件来源统计明细数据");
         }
 
-        /// <summary>
-        /// 区域分时统计
-        /// </summary>
-        /// <param name="dto"></param>
-        /// <returns></returns>
-        [HttpPost("order_area_time")]
-        [AllowAnonymous]
-        public async Task<object> OrderAreaTime([FromQuery] PagedKeywordRequest dto)
-        {
-            var item = await _orderRepository.OrderAreaTime(dto.StartTime, dto.EndTime);
-
-            var titleData = await _systemAreaRepository.Queryable()
-                .Where(p => p.Id.Length == 6 && p.Id != "510000")
-                .Select(p => new
-                {
-                    Key = p.Id,
-                    Value = p.AreaName
-                }).ToListAsync();
-
-            return new { Item = item, TitleData = titleData };
-        }
-    }
+		/// <summary>
+		/// 信件来源分时统计列表
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("order_source_hours_report_list")]
+        public async Task<List<OrderSourceHeaderVo>> QueryOrderSourceHoursReportList([FromQuery] QueryOrderSourceRequest dto)
+        {
+	        var data = await _orderApplication.QueryOrderSourceHoursList(dto);
+	        return data;
+        }
+
+		/// <summary>
+		/// 信件来源分时统计表头
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		[HttpGet("order_source_hours_report_header")]
+		public async Task<List<Kv>> QueryOrderSourceHoursReportHeader()
+		{
+            List<Kv> res = new List<Kv>
+            {
+	            new Kv { Key = "宜宾110平台", Value = "Platform110" },
+	            new Kv { Key = "电话", Value = "Phone" },
+	            new Kv { Key = "因特网", Value = "Web" },
+	            new Kv { Key = "其他", Value = "Rests" },
+	            new Kv { Key = "自建", Value = "Created" },
+	            new Kv { Key = "微信", Value = "WeChat" },
+	            new Kv { Key = "APP", Value = "App" },
+	            new Kv { Key = "智慧宜宾", Value = "WisdomYB" },
+	            new Kv { Key = "综治平台", Value = "Platform" },
+	            new Kv { Key = "省12328平台", Value = "Platform12328" },
+	            new Kv { Key = "市州与网民", Value = "MayorAndNetizens" },
+	            new Kv { Key = "宜宾融媒体", Value = "MediaYB" },
+	            new Kv { Key = "省12345平台", Value = "Platform12345" },
+	            new Kv { Key = "省政民互动", Value = "Interaction" },
+	            new Kv { Key = "宜办事", Value = "ServiceYB" },
+	            new Kv { Key = "市州互转", Value = "CityTransfer" },
+	            new Kv { Key = "办不成事反映窗口", Value = "NoService" },
+	            new Kv { Key = "I宜宾", Value = "Iyb" }
+            };
+            return res;
+		}
+
+		/// <summary>
+		/// 信件来源分时统计导出
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("order_source_hours_list/_export")]
+        public async Task<FileStreamResult> QueryOrderSourceHoursReportList([FromBody] ExportExcelDto<QueryOrderSourceRequest> dto)
+        {
+	        var data = await _orderApplication.QueryOrderSourceHoursList(dto.QueryDto);
+	        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+	        var dtos = data
+		        .Select(stu => _mapper.Map(stu, typeof(OrderSourceHeaderVo), dynamicClass))
+		        .Cast<object>()
+		        .ToList();
+	        var stream = ExcelHelper.CreateStream(dtos);
+	        return ExcelStreamResult(stream, "信件来源分时统计列表数据");
+        }
+	}
 }

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

@@ -2408,8 +2408,15 @@ public class OrderController : BaseController
             return new();
 
         var dto = _mapper.Map<OrderDto>(order);
-
-        if (!string.IsNullOrEmpty(order.WorkflowId))
+        //班长代办--  判断不是会签件  流程判断业务类型
+        //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;
+        //}
+		if (!string.IsNullOrEmpty(order.WorkflowId))
         {
             var result = await _workflowDomainService.GetWorkflowHandlePermissionAsync(
                 order.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles,
@@ -2424,14 +2431,6 @@ public class OrderController : BaseController
                 _sessionContext.RequiredOrgId, _sessionContext.OrgName,
                 _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName));
         }
-        //班长代办
-        //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;

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

@@ -98,6 +98,13 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         ISugarQueryable<Order> QueryOrderSourceDetail(QueryOrderSourceDetailRequest dto);
 
+		/// <summary>
+		/// 信件来源分时统计列表
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		Task<List<OrderSourceHeaderVo>> QueryOrderSourceHoursList(QueryOrderSourceRequest dto);
+
 		/// <summary>
 		/// 部门超期统计
 		/// </summary>

+ 84 - 11
src/Hotline.Application/Orders/OrderApplication.cs

@@ -35,6 +35,7 @@ using XF.Domain.Repository;
 using Hotline.Repository.SqlSugar.System;
 using Microsoft.AspNetCore.Mvc;
 using Hotline.Share.Dtos.Bi;
+using System.Net;
 
 namespace Hotline.Application.Orders;
 
@@ -580,7 +581,13 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         return data;
     }
 
-    public ISugarQueryable<Order> QueryOrderSourceDetail(QueryOrderSourceDetailRequest dto)
+
+	/// <summary>
+	/// 信件来源统计明细
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	public ISugarQueryable<Order> QueryOrderSourceDetail(QueryOrderSourceDetailRequest dto)
     {
 
         return _orderRepository.Queryable()
@@ -590,12 +597,78 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(d => d.SourceChannel != null && d.SourceChannel != "");
     }
 
-    /// <summary>
-    /// 部门超期统计
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <returns></returns>
-    public ISugarQueryable<OrderBiOrgDataListVo> QueryOrgDataList(ReportPagedRequest dto)
+	/// <summary>
+	/// 信件来源分时统计列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	public async Task<List<OrderSourceHeaderVo>> QueryOrderSourceHoursList(QueryOrderSourceRequest dto)
+	{
+		if (dto.EndTime.HasValue)
+			dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+        var data =await _orderRepository.Queryable()
+			.WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
+			.WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
+			.WhereIF(dto.IdentityType.HasValue, d => d.IdentityType == dto.IdentityType)
+			.Where(d => d.SourceChannel != null && d.SourceChannel != "")
+			.GroupBy(d => new { Time = d.CreationTime.ToString("HH"), d.SourceChannel })
+			.Select(d => new OrderSourceHeaderVo
+			{
+				Time = d.CreationTime.ToString("HH")+":00 - " + d.CreationTime.ToString("HH")+":59",
+                TimeSort = d.CreationTime.ToString("HH"),
+				Phone = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "RGDH", 1, 0)),
+				Web = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "YTW", 1, 0)),
+				Rests = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "QT", 1, 0)),
+				Created = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "ZJ", 1, 0)),
+				WeChat = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "WX", 1, 0)),
+				App = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "AP", 1, 0)),
+				WisdomYB = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "ZHYB", 1, 0)),
+				Platform = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "ZZPT", 1, 0)),
+				Platform12328 = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "S12328", 1, 0)),
+				MayorAndNetizens = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "SZYSM", 1, 0)),
+				MediaYB = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "YBRMT", 1, 0)),
+				Platform12345 = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "S12345", 1, 0)),
+				Interaction = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "SZMHD", 1, 0)),
+				ServiceYB = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "YBS", 1, 0)),
+				CityTransfer = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "SZHZ", 1, 0)),
+				Platform110 = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "YB110", 1, 0)),
+				NoService = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "SMZXBNCS", 1, 0)),
+				Iyb = SqlFunc.AggregateSum(SqlFunc.IIF(d.SourceChannelCode == "IYB", 1, 0))
+			}).OrderBy(d=> d.TimeSort).ToListAsync();
+
+		var totalVo = new OrderSourceHeaderVo()
+		{
+			Time = "合计",
+			Phone = data.Sum(x => x.Phone),
+			Web = data.Sum(x => x.Web),
+			Rests = data.Sum(x => x.Rests),
+			Created = data.Sum(x => x.Created),
+			WeChat = data.Sum(x => x.WeChat),
+			App = data.Sum(x => x.App),
+			WisdomYB = data.Sum(x => x.WisdomYB),
+			Platform = data.Sum(x => x.Platform),
+			Platform12328 = data.Sum(x => x.Platform12328),
+			MayorAndNetizens = data.Sum(x => x.MayorAndNetizens),
+			MediaYB = data.Sum(x => x.MediaYB),
+			Platform12345 = data.Sum(x => x.Platform12345),
+			Interaction = data.Sum(x => x.Interaction),
+			ServiceYB = data.Sum(x => x.ServiceYB),
+			CityTransfer = data.Sum(x => x.CityTransfer),
+			Platform110 = data.Sum(x => x.Platform110),
+			NoService = data.Sum(x => x.NoService),
+			Iyb = data.Sum(x => x.Iyb)
+		};
+		data.Add(totalVo);
+		return data;
+	}
+
+	/// <summary>
+	/// 部门超期统计
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	public ISugarQueryable<OrderBiOrgDataListVo> QueryOrgDataList(ReportPagedRequest dto)
     {
 		if (!dto.StartTime.HasValue || !dto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
 
@@ -747,12 +820,12 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 	/// </summary>
 	/// <returns></returns>
 	public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgSatisfactionStatistics(PagedKeywordSonRequest dto) {
-	    dto.EndDate = dto.EndDate.Value.AddDays(1).AddSeconds(-1);
+	    dto.EndTime = dto.EndTime.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))
+			.Where(x => x.OrderVisit.VisitTime >= dto.StartTime.Value && x.OrderVisit.VisitTime <= dto.EndTime.Value && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
 			.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));
@@ -840,13 +913,13 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 	/// <returns></returns>
 	public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgStatisfactionOrgDetail(PagedKeywordSonRequest dto)
 	{
-		dto.EndDate = dto.EndDate.Value.AddDays(1).AddSeconds(-1);
+		dto.EndTime = dto.EndTime.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)
+			.Where((x, it) => it.OrderVisit.VisitTime >= dto.StartTime.Value && it.OrderVisit.VisitTime <= dto.EndTime.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))

+ 6 - 0
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -765,6 +765,12 @@ namespace Hotline.Share.Dtos.Order
 		/// 日期
 		/// </summary>
 		public string? Time { get; set; }
+
+		/// <summary>
+		/// 日期(不显示)
+		/// </summary>
+		public string? TimeSort { get; set; }
+
 		/// <summary>
 		/// 小计
 		/// </summary>

+ 2 - 2
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -21,12 +21,12 @@ public record PagedKeywordSonRequest : PagedRequest
 	/// <summary>
 	/// 开始时间
 	/// </summary>
-	public DateTime? StartDate { get; set; }
+	public DateTime? StartTime { get; set; }
 
 	/// <summary>
 	/// 结束时间
 	/// </summary>
-	public DateTime? EndDate { get; set; }
+	public DateTime? EndTime { get; set; }
 
 	public string? OrgName { get; set; }
 	public string? OrgCode { get; set; }