Browse Source

Merge branch 'master' of http://110.188.24.182:10023/Fengwo/hotline

xf 1 year ago
parent
commit
39ac8f54a1

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

@@ -163,6 +163,25 @@ namespace Hotline.Api.Controllers.Bigscreen
             return list;
         }
 
+        /// <summary>
+        /// 获取区域信息
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("get_system_area")]
+        [AllowAnonymous]
+        public async Task<object> GetSystemAreaAsync()
+        {
+            return await _systemAreaRepository.Queryable()
+                .Where(p => p.Id == "511500" || p.ParentId == "511500")
+                .Select(p => new
+                {
+                    p.AreaName,
+                    p.Id
+                })
+                .OrderBy(p => p.Id)
+                .ToListAsync();
+        }
+
         /// <summary>
         /// 预警热点
         /// </summary>
@@ -175,7 +194,7 @@ namespace Hotline.Api.Controllers.Bigscreen
         public async Task<List<EarlyWarningHotsPotsStatisticsDto>> EarlyWarningHotsPotsStatistics(DateTime StartDate, DateTime EndDate,string AreaCode)
         {
             EndDate = EndDate.AddDays(1).AddSeconds(-1);
-            if (AreaCode.Length==6 && AreaCode.IndexOf("0") == 5)
+            if (AreaCode.Length==6 && AreaCode.IndexOf("00") == 4)
             {
                 AreaCode = AreaCode.Remove(4);
             }

+ 377 - 0
src/Hotline.Api/Controllers/Bigscreen/EnforcementScreenController.cs

@@ -0,0 +1,377 @@
+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;
+using Microsoft.AspNetCore.Mvc;
+using SqlSugar;
+using XF.Domain.Repository;
+
+namespace Hotline.Api.Controllers.Bigscreen
+{
+    /// <summary>
+    /// 司法行政监督管理大屏  
+    /// </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<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,
+            IRepository<SystemArea> systemAreaRepository)
+        {
+            _enforcementOrdersRepository = enforcementOrdersRepository;
+            _judicialComplaintsEventTypeRepository = judicialComplaintsEventTypeRepository;
+            _enforcementHotspotRepository = enforcementHotspotRepository;
+            _orderRepository = orderRepository;
+            _orderVisitRepository = orderVisitRepository;
+            _orderDelayRepository = orderDelayRepository;
+            _knowledgeRepository = knowledgeRepository;
+            _knowledgePvRepository = knowledgePvRepository;
+            _mapper = mapper;
+            _orderVisitDetailRepository = orderVisitDetailRepository;
+            _systemAreaRepository = systemAreaRepository;
+        }
+
+        /// <summary>
+        /// 左上工单数据模块
+        /// </summary>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpGet("order-module-statistics")]
+        public async Task<OrderModuleDto> GetOrderModuleStatisticsAsync(DateTime StartDate, DateTime EndDate)
+        {
+            EndDate = EndDate.AddDays(1).AddSeconds(-1);
+            var dto = new OrderModuleDto();
+
+            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)
+                .Select((x, o) => new
+                {
+                    x.Id,
+                    x.IsEnforcementOrder,
+                    x.IsTheClueTrue,
+                    x.IsPassTheBuckOrder
+                })
+                .MergeTable()
+                .Select(d => new OrderModuleDto
+                {
+                    OrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Id != null, 1, 0)),
+                    EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder, 1, 0)),
+                    TheClueIsTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
+                    TheClueIsNotTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
+                    PassTheBuckOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder, 1, 0))
+                })
+                .ToListAsync();
+            if (data != null && data.Count > 0)
+            {
+                dto.OrderCountNum = data[0].OrderCountNum;
+                dto.EnforcementOrderNum = data[0].EnforcementOrderNum;
+                dto.TheClueIsTrueNum = data[0].TheClueIsTrueNum;
+                dto.TheClueIsNotTrueNum = data[0].TheClueIsNotTrueNum;
+                dto.PassTheBuckOrderNum = data[0].PassTheBuckOrderNum;
+            }
+
+            dto.SatisfiedCount = await _enforcementOrdersRepository.Queryable()
+                .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
+                .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
+               .Where((x, o, p) => o.VisitTime >= StartDate && o.VisitTime <= EndDate && p.VisitTarget == EVisitTarget.Org)
+               .Where((x, o, p) => o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode))
+               .Where((x, o, p) => SqlFunc.JsonField(o.NowEvaluate, "Key") != "1" && SqlFunc.JsonField(o.NowEvaluate, "Key") != "2")
+               .CountAsync();
+
+            return dto;
+        }
+
+        /// <summary>
+        /// 左中受理类型
+        /// </summary>
+        /// <param name="StartDate"></param>
+        /// <param name="EndDate"></param>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpGet("order-accept-type-statistics")]
+        public async Task<List<OrderAcceptTypeStatisticsDto>> GetOrderAcceptTypeStatisticsAsync(DateTime StartDate, DateTime EndDate)
+        {
+            EndDate = EndDate.AddDays(1).AddSeconds(-1);
+
+            var list = await _enforcementOrdersRepository.Queryable()
+                .LeftJoin<Order>((x, o) => x.Id == o.Id)
+                .Where((x, o) => o.Id != null && o.Status > EOrderStatus.Handling && !string.IsNullOrEmpty(o.AcceptType))
+                .Where((x, o) => o.StartTime >= StartDate && o.StartTime <= EndDate)
+                .Select((x, o) => new
+                {
+                    x.Id,
+                    o.AcceptType,
+                    o.Status,
+                    o.ExpiredStatus
+                })
+                .MergeTable()
+                 .GroupBy(x => x.AcceptType)
+                .Select(x => new OrderAcceptTypeStatisticsDto
+                {
+                    AcceptType = x.AcceptType,
+                    SumCount = SqlFunc.AggregateCount(x.Id),
+                    HandlingCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Handling && x.Status < EOrderStatus.Filed, 1, 0)),
+                    FiledCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),
+                    OverTimeCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.ExpiredStatus == EExpiredStatus.Expired, 1, 0))
+                }).ToListAsync();
+
+            return list;
+        }
+
+        /// <summary>
+        /// 左下高频事项统计
+        /// </summary>
+        /// <param name="StartDate"></param>
+        /// <param name="EndDate"></param>
+        /// <param name="AreaCode"></param>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpGet("order-event-type-statistics")]
+        public async Task<List<OrderEventTypeStatisticsDto>> GetOrderEventTypeStatisticsAsync(DateTime StartDate, DateTime EndDate, string AreaCode)
+        {
+            EndDate = EndDate.AddDays(1).AddSeconds(-1);
+            if (AreaCode.Length == 6 && AreaCode.IndexOf("00") == 4)
+                AreaCode = AreaCode.Remove(4);
+
+            var list = await _enforcementOrdersRepository.Queryable()
+               .LeftJoin<Order>((x, o) => x.Id == o.Id)
+               .LeftJoin<JudicialComplaintsEventType>((x, o, j) => x.EventTypeOneLevelId == j.Id)
+               .Where((x, o, j) => o.Id != null && x.EventTypeOneLevelId != null && j.Id != null)
+               .Where((x, o, j) => o.StartTime >= StartDate && o.StartTime <= EndDate && o.AreaCode.StartsWith(AreaCode))
+               .Select((x, o, j) => new
+               {
+                   x.Id,
+                   EventTypeId = x.EventTypeOneLevelId,
+                   j.EventTypeName
+               })
+               .MergeTable()
+                .GroupBy(p => new { p.EventTypeId, p.EventTypeName })
+                .Select(p => new OrderEventTypeStatisticsDto
+                {
+                    EventTypeId = p.EventTypeId,
+                    EventTypeName = p.EventTypeName,
+                    SumCount = SqlFunc.AggregateCount(p.Id)
+                })
+                .OrderByDescending(p => p.SumCount)
+                .Take(5)
+                .ToListAsync();
+
+            return list;
+        }
+
+        /// <summary>
+        /// 区域地图数据
+        /// </summary>
+        /// <param name="StartDate"></param>
+        /// <param name="EndDate"></param>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpGet("order-area-query")]
+        public async Task<List<OrderAreaQueryDto>> GetOrderAreaQueryAsync(DateTime StartDate, DateTime EndDate)
+        {
+            EndDate = EndDate.AddDays(1).AddSeconds(-1);
+
+            var areaList = await _systemAreaRepository.Queryable()
+                .Where(x => !x.Id.EndsWith("00"))
+                .GroupBy(x => new
+                {
+                    Id = x.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                })
+                .Select(x => new
+                {
+                    Id = x.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                })
+                .MergeTable()
+                .LeftJoin<SystemArea>((it, o) => it.Id == o.Id)
+                .Select((it, o) => new
+                {
+                    it.Id,
+                    Name = o.AreaName
+                })
+                .ToListAsync();
+
+            var list = new List<OrderAreaQueryDto>();
+
+            foreach (var item in areaList)
+            {
+                #region 单个获取
+
+                var dto = new OrderAreaQueryDto
+                {
+                    AreaCode = item.Id,
+                    AreaName = item.Name
+                };
+
+                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)
+                .Select((x, o) => new
+                {
+                    x.Id,
+                    x.IsEnforcementOrder,
+                    x.IsTheClueTrue,
+                    x.IsPassTheBuckOrder
+                })
+                .MergeTable()
+                .Select(d => new OrderModuleDto
+                {
+                    OrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.Id != null, 1, 0)),
+                    EnforcementOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsEnforcementOrder, 1, 0)),
+                    TheClueIsTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == true, 1, 0)),
+                    TheClueIsNotTrueNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsTheClueTrue.HasValue && d.IsTheClueTrue.Value == false, 1, 0)),
+                    PassTheBuckOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(d.IsPassTheBuckOrder, 1, 0))
+                })
+                .ToListAsync();
+                if (data != null && data.Count > 0)
+                {
+                    dto.OrderCountNum = data[0].OrderCountNum;
+                    dto.EnforcementOrderNum = data[0].EnforcementOrderNum;
+                    dto.TheClueIsTrueNum = data[0].TheClueIsTrueNum;
+                    dto.TheClueIsNotTrueNum = data[0].TheClueIsNotTrueNum;
+                    dto.PassTheBuckOrderNum = data[0].PassTheBuckOrderNum;
+                }
+
+                list.Add(dto);
+
+                #endregion
+            }
+            return list;
+        }
+
+        /// <summary>
+        /// 办理中工单概览
+        /// </summary>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpGet("order-handling-query")]
+        public async Task<List<EnforcementOrderListDto>> OrderHandlingDetailQuery()
+        {
+            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);
+        }
+
+        /// <summary>
+        /// 部门满意度排行榜
+        /// </summary>
+        /// <param name="StartDate"></param>
+        /// <param name="EndDate"></param>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpGet("order-visitorg-statistics")]
+        public async Task<List<OrderVisitOrgStatisticsDto>> GetOrderVisitOrgStatisticsAsync(DateTime StartDate, DateTime EndDate)
+        {
+            EndDate = EndDate.AddDays(1).AddSeconds(-1);
+
+            var list = await _enforcementOrdersRepository.Queryable()
+                 .LeftJoin<OrderVisit>((x, o) => x.Id == o.OrderId)
+                 .LeftJoin<OrderVisitDetail>((x, o, p) => o.Id == p.VisitId)
+                .Where((x, o, p) => o.VisitTime >= StartDate && o.VisitTime <= EndDate && p.VisitTarget == EVisitTarget.Org &&
+                o.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(p.VisitOrgCode) && p.VisitOrgCode.Length >= 6)
+                .Select((x, o, p) => new
+                {
+                    p.VisitOrgCode,
+                    p.VisitOrgName,
+                    p.OrgProcessingResults
+                })
+                .MergeTable()
+                .GroupBy(x => new
+                {
+                    VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                    x.VisitOrgName
+                })
+                 .Select(x => new OrderVisitOrgStatisticsDto()
+                 {
+                     VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                     VisitOrgName = x.VisitOrgName,
+                     SatisfiedCount = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") != "1" && SqlFunc.JsonField(x.OrgProcessingResults, "Key") != "2", 1, 0)),
+                     VisitCount = SqlFunc.AggregateCount(x.VisitOrgName)
+                 }).MergeTable().OrderByDescending(x => x.SatisfiedCount).Take(10).ToListAsync();
+
+            return list;
+        }
+
+
+
+        /// <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)
+        {
+            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();
+            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()
+                {
+                    Name = x.SourceChannel,
+                    SumCount = SumCount,
+                    HasCount = SqlFunc.AggregateCount(x.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()
+                {
+                    Name = x.AcceptType,
+                    SumCount = SumCount,
+                    HasCount = SqlFunc.AggregateCount(x.AcceptTypeCode),
+                }).ToListAsync();
+                return list;
+            }
+        }
+
+    }
+}

+ 8 - 26
src/Hotline.Api/Controllers/EnforcementOrderController.cs

@@ -148,24 +148,6 @@ namespace Hotline.Api.Controllers
             return rsp;
         }
 
-        /// <summary>
-        /// 获取区域信息
-        /// </summary>
-        /// <returns></returns>
-        [HttpGet("get_system_area")]
-        public async Task<object> GetSystemAreaAsync()
-        {
-            return await _systemAreaRepository.Queryable()
-                .Where(p => p.Id == "511500" || p.ParentId == "511500")
-                .Select(p => new
-                {
-                    p.AreaName,
-                    p.Id
-                })
-                .OrderBy(p => p.Id)
-                .ToListAsync();
-        }
-
         /// <summary>
         /// 线索核实  
         /// </summary>
@@ -242,7 +224,7 @@ namespace Hotline.Api.Controllers
             var items = await _judicialComplaintsEventTypeRepository.Queryable()
              .LeftJoin<EnforcementOrders>((x, o) => o.EventTypeSpliceName != null && (x.EventTypeName == o.EventTypeSpliceName || o.EventTypeSpliceName.Contains(x.EventTypeName)))
             .LeftJoin<Order>((x, o, p) => p.Id == o.Id)
-            .Where((x, o, p) => p.CreationTime >= StartDate && p.CreationTime <= EndDate)
+            .Where((x, o, p) => p.StartTime >= StartDate && p.StartTime <= EndDate)
             .WhereIF(!string.IsNullOrEmpty(AreaCode), (x, o, p) => p.AreaCode == AreaCode)
              .Where((x, o, p) => x.ParentId == Id)
              .GroupBy((x, o, p) => new { x.Id, x.EventTypeName })
@@ -267,7 +249,7 @@ namespace Hotline.Api.Controllers
             var data = await _enforcementOrdersRepository.Queryable()
                 .Includes(x => x.Order)
                 .Where(d => d.Order.Id != null)
-                .Where(d => d.Order.CreationTime >= StartDate && d.Order.CreationTime <= EndDate)
+                .Where(d => d.Order.StartTime >= StartDate && d.Order.StartTime <= EndDate)
                 .GroupBy(d => d.Id)
                  .Select(d => new EventClassificationOrderCountDto
                  {
@@ -302,7 +284,7 @@ namespace Hotline.Api.Controllers
             var (total, items) = await _enforcementOrdersRepository.Queryable()
             .Includes(x => x.Order)
             .Where(d => d.Order.Id != null)
-            .Where(d => d.Order.CreationTime >= dto.StartDate && d.Order.CreationTime <= dto.EndDate && d.EventTypeId != null)
+            .Where(d => d.Order.StartTime >= dto.StartDate && d.Order.StartTime <= dto.EndDate && d.EventTypeId != null)
             .WhereIF(!string.IsNullOrEmpty(dto.EventTypeId), d => d.EventTypeId.StartsWith(dto.EventTypeId))
             .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.Order.AreaCode == dto.AreaCode)
               .OrderByDescending(d => d.CreationTime)
@@ -325,7 +307,7 @@ namespace Hotline.Api.Controllers
             var data = await _enforcementOrdersRepository.Queryable()
                    .Includes(x => x.Order)
                    .Where(d => d.Order.Id != null)
-                   .Where(d => d.Order.CreationTime >= StartDate && d.Order.CreationTime <= EndDate)
+                   .Where(d => d.Order.StartTime >= StartDate && d.Order.StartTime <= EndDate)
                     .GroupBy(d => new
                     {
                         OrgCode = d.Order.OrgLevelOneCode,
@@ -363,7 +345,7 @@ namespace Hotline.Api.Controllers
             var data = await _enforcementOrdersRepository.Queryable()
                    .Includes(x => x.Order)
                    .Where(d => d.Order.Id != null)
-                   .Where(d => d.Order.CreationTime >= StartDate && d.Order.CreationTime <= EndDate)
+                   .Where(d => d.Order.StartTime >= StartDate && d.Order.StartTime <= EndDate)
                    .WhereIF(OrgCode == "001", d => d.Order.ActualHandleOrgCode == OrgCode)
                    .WhereIF(OrgCode != "001", d => d.Order.ActualHandleOrgCode.StartsWith(OrgCode))
                     .GroupBy(d => new
@@ -399,7 +381,7 @@ namespace Hotline.Api.Controllers
             var (total, items) = await _enforcementOrdersRepository.Queryable()
             .Includes(x => x.Order)
             .Where(d => d.Order.Id != null)
-            .Where(d => d.Order.CreationTime >= dto.StartDate && d.Order.CreationTime <= dto.EndDate)
+            .Where(d => d.Order.StartTime >= dto.StartDate && d.Order.StartTime <= dto.EndDate)
             .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode == "001", d => d.Order.ActualHandleOrgCode == dto.OrgCode)
             .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.OrgCode != "001", d => d.Order.ActualHandleOrgCode.StartsWith(dto.OrgCode))
             .WhereIF(dto.TheClueIsTrue == true, d => d.IsTheClueTrue == true)
@@ -423,7 +405,7 @@ namespace Hotline.Api.Controllers
             var list = await _enforcementOrdersRepository.Queryable()
                .Includes(x => x.Order)
                .Where(x => x.Order.Id != null)
-               .Where(x => x.Order.CreationTime >= StartDate && x.Order.CreationTime <= EndDate)
+               .Where(x => x.Order.StartTime >= StartDate && x.Order.StartTime <= EndDate)
                .LeftJoin<SystemArea>((x, o) => x.Order.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
                .Where((x, o) => x.Order.Status >= EOrderStatus.Filed)
                .GroupBy((x, o) => new
@@ -459,7 +441,7 @@ namespace Hotline.Api.Controllers
             var (total, items) = await _enforcementOrdersRepository.Queryable()
             .Includes(x => x.Order)
             .Where(d => d.Order.Id != null)
-            .Where(d => d.Order.CreationTime >= dto.StartDate && d.Order.CreationTime <= dto.EndDate)
+            .Where(d => d.Order.StartTime >= dto.StartDate && d.Order.StartTime <= dto.EndDate)
             .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.Order.AreaCode == dto.AreaCode)
             .WhereIF(dto.TheClueIsTrue == true, d => d.IsTheClueTrue == true)
             .WhereIF(dto.TheClueIsNotTrue == true, d => d.IsTheClueTrue == false)

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

@@ -1450,10 +1450,10 @@ public class OrderController : BaseController
             .WhereIF(dto.CounterSignType.HasValue ,x=> x.OrderVisit.Order!.CounterSignType == dto.CounterSignType)
             .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrderVisit.Order!.OrgLevelOneName!.Contains(dto.OrgLevelOneName!))
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleStepName), x => x.OrderVisit.Order!.ActualHandleStepName!.Contains(dto.ActualHandleStepName!))
-            .WhereIF(dto.ActualHandleTime.HasValue, x => x.OrderVisit.Order!.ActualHandleTime == dto.ActualHandleTime)
-            .WhereIF(dto.FiledTime.HasValue, x => x.OrderVisit.Order!.FiledTime == dto.FiledTime)
-            .WhereIF(dto.CreationTime.HasValue, x => x.OrderVisit.Order!.CreationTime == dto.CreationTime)
-            .WhereIF(dto.VisitTime.HasValue, x => x.OrderVisit.VisitTime == dto.VisitTime)
+            .WhereIF(dto.ActualHandleTime.HasValue && dto.EndActualHandleTime.HasValue, x => x.OrderVisit.Order!.ActualHandleTime >= dto.ActualHandleTime && x.OrderVisit.Order!.ActualHandleTime <= dto.EndActualHandleTime)
+            .WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue, x => x.OrderVisit.Order!.FiledTime == dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime)
+            .WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue, x => x.OrderVisit.Order!.CreationTime == dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime)
+            .WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue, x => x.OrderVisit.VisitTime == dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
             .WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!))
             .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonListObjectAny(x.OrgProcessingResults, "Value", dto.OrgProcessingResults))
             .WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude), x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Value", dto.OrgHandledAttitude))
@@ -3459,10 +3459,8 @@ public class OrderController : BaseController
 			// 计算期满时间
 			//if (dto.AlterTime)
 			//{
-			var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now,
-				ETimeType.WorkDay,
-				dto.TimeLimit.Value, order.AcceptTypeCode);
-			await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.EndTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime })
+			var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
+			await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime })
 				.Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
 			var orderDto = _mapper.Map<OrderDto>(order);
 			await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: HttpContext.RequestAborted);
@@ -3470,7 +3468,7 @@ public class OrderController : BaseController
 
 			//todo 特提重办,按审批通过时间依据中心派至部门的规则计算期满时间,更新order
 
-			await _workflowApplication.RecallAsync(recall, special.Order.ExpiredTime, HttpContext.RequestAborted);
+			await _workflowApplication.RecallAsync(recall, order.ExpiredTime, HttpContext.RequestAborted);
             var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == special.OrderId);
             if (publish != null)
             {

+ 1 - 1
src/Hotline.Api/Controllers/UserController.cs

@@ -163,7 +163,7 @@ public class UserController : BaseController
              .WhereIF(!string.IsNullOrEmpty(dto.Role), d => d.Roles.Any(x => x.Id == dto.Role))
              .OrderBy(d => d.Account.Status)
              .OrderBy(d => d.Organization.OrgType)
-             .OrderBy(d => d.Organization.Id)
+             //.OrderBy(d => d.Organization.Id)
              .OrderByDescending(d => d.CreationTime)
              .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 

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

@@ -72,7 +72,7 @@ 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)
                  ;
 
 

+ 179 - 0
src/Hotline.Share/Dtos/JudicialManagement/EnforcementBigscreenDto.cs

@@ -0,0 +1,179 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos.JudicialManagement
+{
+    /// <summary>
+    /// 左上工单数据模块
+    /// </summary>
+    public class OrderModuleDto
+    {
+        /// <summary>
+        /// 行政执法工单
+        /// </summary>
+        public int EnforcementOrderNum { get; set; }
+
+        /// <summary>
+        /// 线索属实
+        /// </summary>
+        public int TheClueIsTrueNum { get; set; }
+
+        /// <summary>
+        /// 线索不属实
+        /// </summary>
+        public int TheClueIsNotTrueNum { get; set; }
+
+        /// <summary>
+        /// 推诿工单
+        /// </summary>
+        public int PassTheBuckOrderNum { get; set; }
+
+        /// <summary>
+        /// 满意工单
+        /// </summary>
+        public int SatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 工单总量
+        /// </summary>
+        public int OrderCountNum { get; set; }
+
+
+    }
+
+    /// <summary>
+    /// 左中受理类型
+    /// </summary>
+    public class OrderAcceptTypeStatisticsDto
+    {
+        /// <summary>
+        /// 类型名称
+        /// </summary>
+        public string AcceptType { get; set; }
+
+        /// <summary>
+        /// 总量
+        /// </summary>
+        public int SumCount { get; set; }
+
+        /// <summary>
+        /// 在办
+        /// </summary>
+        public int HandlingCount { get; set; }
+
+        /// <summary>
+        /// 已办
+        /// </summary>
+        public int FiledCount { get; set; }
+
+        /// <summary>
+        /// 超期
+        /// </summary>
+        public int OverTimeCount { get; set; }
+    }
+
+    /// <summary>
+    /// 左下高频事项统计
+    /// </summary>
+    public class OrderEventTypeStatisticsDto
+    {
+        /// <summary>
+        /// id
+        /// </summary>
+        public string EventTypeId { get; set; }
+
+        /// <summary>
+        /// 名称
+        /// </summary>
+        public string EventTypeName { get; set; }
+
+        /// <summary>
+        /// 总量
+        /// </summary>
+        public int SumCount { get; set; }
+    }
+
+    /// <summary>
+    /// 中上区域数据统计
+    /// </summary>
+    public class OrderAreaQueryDto
+    {
+        /// <summary>
+        /// 区域Id
+        /// </summary>
+        public string AreaCode { get; set; }
+
+        /// <summary>
+        /// 区域名称
+        /// </summary>
+        public string AreaName { get; set; }
+
+        /// <summary>
+        /// 行政执法工单
+        /// </summary>
+        public int EnforcementOrderNum { get; set; }
+
+        /// <summary>
+        /// 线索属实
+        /// </summary>
+        public int TheClueIsTrueNum { get; set; }
+
+        /// <summary>
+        /// 线索不属实
+        /// </summary>
+        public int TheClueIsNotTrueNum { get; set; }
+
+        /// <summary>
+        /// 推诿工单
+        /// </summary>
+        public int PassTheBuckOrderNum { get; set; }
+
+        /// <summary>
+        /// 工单总量
+        /// </summary>
+        public int OrderCountNum { get; set; }
+    }
+
+    /// <summary>
+    /// 右上满意度排行榜
+    /// </summary>
+    public class OrderVisitOrgStatisticsDto
+    {
+        /// <summary>
+        /// 部门Code
+        /// </summary>
+        public string VisitOrgCode { get; set; }
+
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string VisitOrgName { get; set; }
+
+        /// <summary>
+        /// 满意量
+        /// </summary>
+        public int SatisfiedCount { get; set; }
+
+        /// <summary>
+        /// 总量
+        /// </summary>
+        public int VisitCount { get; set; }
+
+        /// <summary>
+        /// 满意率
+        /// </summary>
+        public double SatisfiedRate => CalcSatisfiedRate();
+
+        public double CalcSatisfiedRate()
+        {
+            if (SatisfiedCount == 0 || VisitCount == 0)
+            {
+                return 0;
+            }
+            return Math.Round((SatisfiedCount / (double)VisitCount) * 100, 2);
+        }
+    }
+}

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

@@ -177,6 +177,11 @@ 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;

+ 36 - 16
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -575,29 +575,49 @@ namespace Hotline.Share.Dtos.Order
         public DateTime? ActualHandleTime { get; set; }
 
         /// <summary>
-        /// 归档时间(暂为流程结束时间,因流程结束自动归档)
+        /// 实际办理时间
         /// </summary>
-        public DateTime? FiledTime { get; set; }
+        public DateTime? EndActualHandleTime { get; set; }
 
-        /// <summary>
-        /// 受理时间
-        /// </summary>
-        public DateTime? CreationTime { get; set; }
+		/// <summary>
+		/// 归档时间(暂为流程结束时间,因流程结束自动归档)
+		/// </summary>
+		public DateTime? FiledTime { get; set; }
 
         /// <summary>
-        /// 回访时间
+        /// 归档时间(暂为流程结束时间,因流程结束自动归档)
         /// </summary>
-        public DateTime? VisitTime { get; set; }
+        public DateTime? EndFiledTime { get; set; }
 
-        /// <summary>
-        /// 回访部门名称
-        /// </summary>
-        public string? VisitOrgName { get; set; }
+		/// <summary>
+		/// 受理时间
+		/// </summary>
+		public DateTime? CreationTime { get; set; }
 
-        /// <summary>
-        /// 部门办件结果
-        /// </summary>
-        public string? OrgProcessingResults { get; set; }
+		/// <summary>
+		/// 受理时间
+		/// </summary>
+		public DateTime? EndCreationTime { get; set; }
+
+		/// <summary>
+		/// 回访时间
+		/// </summary>
+		public DateTime? VisitTime { get; set; }
+
+		/// <summary>
+		/// 回访时间
+		/// </summary>
+		public DateTime? EndVisitTime { get; set; }
+
+		/// <summary>
+		/// 回访部门名称
+		/// </summary>
+		public string? VisitOrgName { get; set; }
+
+		/// <summary>
+		/// 部门办件结果
+		/// </summary>
+		public string? OrgProcessingResults { get; set; }
 
         /// <summary>
         /// 部门办件态度