TANG JIANG 1 gadu atpakaļ
vecāks
revīzija
2d08d2013d

+ 124 - 67
src/Hotline.Api/Controllers/Bigscreen/EnforcementScreenController.cs

@@ -1,13 +1,7 @@
 using Hotline.JudicialManagement;
-using Hotline.KnowledgeBase;
 using Hotline.Orders;
-using Hotline.Repository.SqlSugar.Orders;
 using Hotline.Settings;
-using Hotline.Settings.Hotspots;
-using Hotline.Share.Dtos.Bigscreen;
 using Hotline.Share.Dtos.JudicialManagement;
-using Hotline.Share.Dtos.Order;
-using Hotline.Share.Enums.KnowledgeBase;
 using Hotline.Share.Enums.Order;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
@@ -22,40 +16,22 @@ namespace Hotline.Api.Controllers.Bigscreen
     /// </summary>
     public class EnforcementScreenController : BaseController
     {
-        private readonly IRepository<EnforcementOrders> _enforcementOrdersRepository;
-        private readonly IRepository<JudicialComplaintsEventType> _judicialComplaintsEventTypeRepository;
-        private readonly IRepository<EnforcementHotspot> _enforcementHotspotRepository;
-        private readonly IOrderRepository _orderRepository;
-        private readonly IRepository<OrderDelay> _orderDelayRepository;
-        private readonly IRepository<OrderVisit> _orderVisitRepository;
-        private readonly IRepository<Knowledge> _knowledgeRepository;
-        private readonly IRepository<KnowledgePv> _knowledgePvRepository;
         private readonly IMapper _mapper;
-        private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
+        private readonly IRepository<EnforcementOrders> _enforcementOrdersRepository;
         private readonly IRepository<SystemArea> _systemAreaRepository;
 
-        public EnforcementScreenController(IRepository<EnforcementOrders> enforcementOrdersRepository,
-            IRepository<JudicialComplaintsEventType> judicialComplaintsEventTypeRepository,
-            IRepository<EnforcementHotspot> enforcementHotspotRepository,
-            IOrderRepository orderRepository,
-            IRepository<OrderVisit> orderVisitRepository,
-            IRepository<OrderDelay> orderDelayRepository,
-            IRepository<Knowledge> knowledgeRepository,
-            IRepository<KnowledgePv> knowledgePvRepository,
-            IMapper mapper,
-            IRepository<OrderVisitDetail> orderVisitDetailRepository,
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="mapper"></param>
+        /// <param name="enforcementOrdersRepository"></param>
+        /// <param name="systemAreaRepository"></param>
+        public EnforcementScreenController(IMapper mapper,
+            IRepository<EnforcementOrders> enforcementOrdersRepository,
             IRepository<SystemArea> systemAreaRepository)
         {
-            _enforcementOrdersRepository = enforcementOrdersRepository;
-            _judicialComplaintsEventTypeRepository = judicialComplaintsEventTypeRepository;
-            _enforcementHotspotRepository = enforcementHotspotRepository;
-            _orderRepository = orderRepository;
-            _orderVisitRepository = orderVisitRepository;
-            _orderDelayRepository = orderDelayRepository;
-            _knowledgeRepository = knowledgeRepository;
-            _knowledgePvRepository = knowledgePvRepository;
             _mapper = mapper;
-            _orderVisitDetailRepository = orderVisitDetailRepository;
+            _enforcementOrdersRepository = enforcementOrdersRepository;
             _systemAreaRepository = systemAreaRepository;
         }
 
@@ -190,7 +166,7 @@ namespace Hotline.Api.Controllers.Bigscreen
         }
 
         /// <summary>
-        /// 区域地图数据
+        /// 中上区域地图数据
         /// </summary>
         /// <param name="StartDate"></param>
         /// <param name="EndDate"></param>
@@ -235,7 +211,7 @@ namespace Hotline.Api.Controllers.Bigscreen
                 var data = await _enforcementOrdersRepository.Queryable()
                 .LeftJoin<Order>((x, o) => x.Id == o.Id)
                 .Where((x, o) => o.Id != null)
-                .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.AreaCode == item.Id)
+                .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.AreaCode.StartsWith(item.Id))
                 .Select((x, o) => new
                 {
                     x.Id,
@@ -270,26 +246,48 @@ namespace Hotline.Api.Controllers.Bigscreen
         }
 
         /// <summary>
-        /// 办理中工单概览
+        /// 中下行政执法工单概览
         /// </summary>
         /// <returns></returns>
         [AllowAnonymous]
-        [HttpGet("order-handling-query")]
-        public async Task<List<EnforcementOrderListDto>> OrderHandlingDetailQuery()
+        [HttpGet("order-overview")]
+        public async Task<List<OrderOverviewDto>> GetOrderOverviewAsync()
         {
             var list = await _enforcementOrdersRepository.Queryable()
-            .Includes(d => d.Order)
-            .Where(d => d.Order.Id != null)
-            .Where(d => d.Order.Status > EOrderStatus.WaitForAccept && d.Order.StartTime.Value.Date == DateTime.Now.Date)
-            .OrderByDescending(d => d.Order.StartTime)
-            .Take(50)
-            .ToListAsync();
-
-            return _mapper.Map<List<EnforcementOrderListDto>>(list);
+                  .LeftJoin<Order>((x, o) => x.Id == o.Id)
+                  .LeftJoin<SystemArea>((x, o, p) => o.AreaCode == p.Id)
+                  .Where((x, o, p) => o.Id != null)
+                  .Where((x, o) => o.Status > EOrderStatus.WaitForAccept && o.StartTime.Value.Date == DateTime.Now.Date)
+                  .Select((x, o, p) => new OrderOverviewDto
+                  {
+                      Id = o.Id,
+                      WorkflowId = o.WorkflowId,
+                      SourceChannel = o.SourceChannel,
+                      SourceChannelCode = o.SourceChannelCode,
+                      Title = o.Title,
+                      AcceptType = o.AcceptType,
+                      AcceptTypeCode = o.AcceptTypeCode,
+                      HotspotId = o.HotspotId,
+                      HotspotName = o.HotspotName,
+                      ActualHandleOrgName = o.ActualHandleOrgName,
+                      ActualHandleOrgCode = o.ActualHandleOrgCode,
+                      Status = o.Status,
+                      ActualHandleTime = o.ActualHandleTime,
+                      ExpiredTime = o.ExpiredTime,
+                      NearlyExpiredTime = o.NearlyExpiredTime,
+                      StartTime = o.StartTime,
+                      AreaName = p.AreaName
+                  })
+                  .MergeTable()
+                  .OrderByDescending(d => d.StartTime)
+                  .Take(50)
+                  .ToListAsync();
+
+            return _mapper.Map<List<OrderOverviewDto>>(list);
         }
 
         /// <summary>
-        /// 部门满意度排行榜
+        /// 右上部门满意度排行榜
         /// </summary>
         /// <param name="StartDate"></param>
         /// <param name="EndDate"></param>
@@ -328,47 +326,106 @@ namespace Hotline.Api.Controllers.Bigscreen
             return list;
         }
 
+        /// <summary>
+        /// 右中工单月份趋势图
+        /// </summary>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpGet("order-monthly-trend")]
+        public async Task<List<OrderMonthlyTrendDto>> GetOrderMonthlyTrendStatisticsAsync(int Year)
+        {
+            if (Year == 0)
+                Year = DateTime.Now.Year;
+
+            int monthCount = 12;
+            DateTime StartDate = DateTime.Parse(Year + "-01-01 00:00:00");
+            DateTime EndDate = StartDate.AddYears(1).AddSeconds(-1);
+            if (Year == DateTime.Now.Year)
+            {
+                monthCount = DateTime.Now.Month;
+                EndDate = DateTime.Now;
+            }
+
+            var queryData = await _enforcementOrdersRepository.Queryable()
+                       .LeftJoin<Order>((x, o) => x.Id == o.Id)
+                       .Where((x, o) => o.Id != null)
+                       .Where((x, o) => o.Status > EOrderStatus.WaitForAccept && o.StartTime >= StartDate && o.StartTime <= EndDate)
+                       .Select((x, o) => new
+                       {
+                           o.Id,
+                           Month = o.StartTime.Value.Month
+                       })
+                       .MergeTable()
+                       .GroupBy(x => x.Month)
+                       .Select(x => new OrderMonthlyTrendDto
+                       {
+                           Month = x.Month,
+                           SumCount = SqlFunc.AggregateCount(x.Month)
+                       })
+                       .ToListAsync();
+
+            var orderMonthlyTrends = new List<OrderMonthlyTrendDto>();
+            for (int i = 1; i <= monthCount; i++)
+            {
+                var data = queryData.Find(p => p.Month == i);
+                var SumCount = 0;
+                if (data != null)
+                    SumCount = data.SumCount;
+                orderMonthlyTrends.Add(new OrderMonthlyTrendDto { Month = i, SumCount = SumCount });
+            }
 
+            return orderMonthlyTrends;
+        }
 
         /// <summary>
-        /// 占比分析
+        /// 右下占比分析
         /// </summary>
         /// <param name="StartDate"></param>
         /// <param name="EndDate"></param>
         /// <param name="IsSource"></param>
         /// <returns></returns>
         [AllowAnonymous]
-        [HttpGet("order-source-accepttype-statistics")]
-        public async Task<List<OrderSourceAndAcceptTtoeStatisticsDto>> OrderSourceAndAcceptTtoeStatistics(DateTime StartDate, DateTime EndDate, bool IsSource)
+        [HttpGet("order-proportion-statistics")]
+        public async Task<List<OrderProportionStatisticsDto>> GetOrderProportionStatisticsAsync(DateTime StartDate, DateTime EndDate, bool IsSource)
         {
             EndDate = EndDate.AddDays(1).AddSeconds(-1);
 
-            int SumCount = await _orderRepository.Queryable(false, false, false)
-               .Where(x => x.StartTime >= StartDate && x.StartTime <= EndDate && x.Status > EOrderStatus.WaitForAccept).CountAsync();
+            var SumCount = await _enforcementOrdersRepository.Queryable()
+               .LeftJoin<Order>((x, o) => x.Id == o.Id)
+                .Where((x, o) => o.Id != null)
+               .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.Status > EOrderStatus.WaitForAccept)
+               .CountAsync();
+
             if (IsSource)
             {
-                var list = await _orderRepository.Queryable(false, false, false)
-                .Where(x => x.StartTime >= StartDate && x.StartTime <= EndDate && x.Status > EOrderStatus.WaitForAccept)
-                .GroupBy(x => new { x.SourceChannelCode, x.SourceChannel })
-                .Select(x => new OrderSourceAndAcceptTtoeStatisticsDto()
+                var list = await _enforcementOrdersRepository.Queryable()
+                .LeftJoin<Order>((x, o) => x.Id == o.Id)
+                .Where((x, o) => o.Id != null)
+                .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.Status > EOrderStatus.WaitForAccept)
+                .GroupBy((x, o) => new { o.SourceChannelCode, o.SourceChannel })
+                .Select((x, o) => new OrderProportionStatisticsDto()
                 {
-                    Name = x.SourceChannel,
+                    Name = o.SourceChannel,
                     SumCount = SumCount,
-                    HasCount = SqlFunc.AggregateCount(x.SourceChannel)
-                }).ToListAsync();
+                    HasCount = SqlFunc.AggregateCount(o.SourceChannel)
+                })
+                .ToListAsync();
                 return list;
             }
             else
             {
-                var list = await _orderRepository.Queryable(false, false, false)
-                .Where(x => x.StartTime >= StartDate && x.StartTime <= EndDate && x.Status > EOrderStatus.WaitForAccept)
-                .GroupBy(x => new { x.AcceptTypeCode, x.AcceptType })
-                .Select(x => new OrderSourceAndAcceptTtoeStatisticsDto()
+                var list = await _enforcementOrdersRepository.Queryable()
+                .LeftJoin<Order>((x, o) => x.Id == o.Id)
+                .Where((x, o) => o.Id != null)
+                .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.Status > EOrderStatus.WaitForAccept)
+                .GroupBy((x, o) => new { o.AcceptTypeCode, o.AcceptType })
+                .Select((x, o) => new OrderProportionStatisticsDto()
                 {
-                    Name = x.AcceptType,
+                    Name = o.AcceptType,
                     SumCount = SumCount,
-                    HasCount = SqlFunc.AggregateCount(x.AcceptTypeCode),
-                }).ToListAsync();
+                    HasCount = SqlFunc.AggregateCount(o.AcceptTypeCode),
+                })
+                .ToListAsync();
                 return list;
             }
         }

+ 0 - 1
src/Hotline.Application/Mappers/MapperConfigs.cs

@@ -72,7 +72,6 @@ namespace Hotline.Application.Mappers
                 .Map(d => d.EventTypeName, x => x.EventTypeName)
                 .Map(d => d.EventTypeId, x => x.EventTypeId)
                 .Map(d => d.EventTypeSpliceName, x => x.EventTypeSpliceName)
-                .Map(d => d.AreaName, x => string.IsNullOrEmpty(x.Order.County) == true ? x.Order.City : x.Order.County)
                  ;
 
 

+ 144 - 5
src/Hotline.Share/Dtos/JudicialManagement/EnforcementBigscreenDto.cs

@@ -1,8 +1,5 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using Hotline.Share.Enums.Order;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.JudicialManagement
 {
@@ -137,6 +134,115 @@ namespace Hotline.Share.Dtos.JudicialManagement
         public int OrderCountNum { get; set; }
     }
 
+    /// <summary>
+    /// 中下行政执法工单概览
+    /// </summary>
+    public class OrderOverviewDto
+    {
+        public string Id { get; set; }
+        public string WorkflowId { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string? SourceChannel { get; set; }
+        public string? SourceChannelCode { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string Title { get; set; }
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string? AcceptType { get; set; }
+        public string? AcceptTypeCode { get; set; }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string? HotspotId { get; set; }
+        public string? HotspotName { get; set; }
+
+        /// <summary>
+        /// 实际办理部门名称
+        /// </summary>
+        public string? ActualHandleOrgName { get; set; }
+
+        /// <summary>
+        /// 实际办理部门编码
+        /// </summary>
+        public string? ActualHandleOrgCode { get; set; }
+
+        /// <summary>
+        /// 过期状态
+        /// </summary>
+        public EExpiredStatus? ExpiredStatus => CalculateExpiredState();
+
+        /// <summary>
+        /// 过期状态
+        /// </summary>
+        public string ExpiredStatusText => ExpiredStatus?.GetDescription() ?? string.Empty;
+
+        /// <summary>
+        /// 工单状态
+        /// </summary>
+        public EOrderStatus Status { get; set; }
+        public string StatusText => Status.GetDescription();
+
+        /// <summary>
+        /// 实际办理时间
+        /// </summary>
+        public DateTime? ActualHandleTime { get; set; }
+
+        /// <summary>
+        /// 超期时间(期满时间)
+        /// </summary>
+        public DateTime? ExpiredTime { get; set; }
+
+        /// <summary>
+        /// 即将超期时间
+        /// </summary>
+        public DateTime? NearlyExpiredTime { get; set; }
+
+        /// <summary>
+        /// 工单开始时间(受理/接办时间=流程开启时间)
+        /// </summary>
+        public DateTime? StartTime { get; set; }
+
+        /// <summary>
+        /// 区域
+        /// </summary>
+        public string AreaName { get; set; }
+
+        public EExpiredStatus? CalculateExpiredState()
+        {
+            DateTime? dateTime = DateTime.Now;
+            if (Status >= EOrderStatus.Filed)
+            {
+                dateTime = ActualHandleTime;
+            }
+            //ExpiredStatus
+            if (ExpiredTime.HasValue)
+            {
+                if (dateTime < NearlyExpiredTime)
+                {
+                    return EExpiredStatus.Normal;
+                }
+                else if (dateTime > NearlyExpiredTime && dateTime < ExpiredTime)
+                {
+                    return EExpiredStatus.GoingToExpired;
+                }
+                else
+                {
+                    return EExpiredStatus.Expired;
+                }
+            }
+            return null;
+        }
+    }
+
     /// <summary>
     /// 右上满意度排行榜
     /// </summary>
@@ -176,4 +282,37 @@ namespace Hotline.Share.Dtos.JudicialManagement
             return Math.Round((SatisfiedCount / (double)VisitCount) * 100, 2);
         }
     }
+
+    /// <summary>
+    /// 工单月份趋势图
+    /// </summary>
+    public class OrderMonthlyTrendDto
+    {
+        public int Month { get; set; }
+
+        public int SumCount { get; set; }
+    }
+
+    /// <summary>
+    /// 右下占比分析
+    /// </summary>
+    public class OrderProportionStatisticsDto
+    {
+        public string Name { get; set; }
+
+        public int SumCount { get; set; }
+
+        public int HasCount { get; set; }
+
+        public double HasRate => CalcHasRate();
+
+        public double CalcHasRate()
+        {
+            if (HasCount == 0 || SumCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((HasCount / (double)SumCount) * 100, 2);
+        }
+    }
 }

+ 0 - 7
src/Hotline.Share/Dtos/JudicialManagement/EnforcementOrderListDto.cs

@@ -177,11 +177,6 @@ namespace Hotline.Share.Dtos.JudicialManagement
         /// </summary>
         public bool IsShowUpdateButton { get; set; }
 
-        /// <summary>
-        /// 区域名称
-        /// </summary>
-        public string AreaName { get; set; }
-
         public EExpiredStatus? CalculateExpiredState()
         {
             DateTime? dateTime = DateTime.Now;
@@ -209,8 +204,6 @@ namespace Hotline.Share.Dtos.JudicialManagement
         }
     }
 
-
-
     public  class EnforcementOrgSatisfactionOrderListDto: EnforcementOrderListDto
     {
         /// <summary>