Bläddra i källkod

新增未签收统计

tangjiang 8 månader sedan
förälder
incheckning
55629017ef

+ 172 - 53
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -55,7 +55,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
         private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
         private readonly IRepository<WorkflowStep> _workflowStepRepository;
-		private readonly IRepository<OrderScreen> _orderScreenRepository;
+        private readonly IRepository<OrderScreen> _orderScreenRepository;
         private readonly IOrderSecondaryHandlingApplication _orderSecondaryHandlingApplication;
         private readonly IOrderApplication _orderApplication;
         private readonly ITimeLimitDomainService _timeLimitDomainService;
@@ -123,7 +123,7 @@ namespace Hotline.Api.Controllers.Bi
             _systemDicDataCacheManager = systemDicDataCacheManager;
             _workflowStepRepository = workflowStepRepository;
 
-		}
+        }
 
         /// <summary>
         /// 部门超期统计明细
@@ -2312,7 +2312,7 @@ namespace Hotline.Api.Controllers.Bi
                 .Where((x, su) => x.CreationTime >= dto.StartTime.Value && x.CreationTime <= dto.EndTime.Value && su.UserId == dto.UserId)
                 .WhereIF(dto.TitleCode.ToUpper() == "NOSENDORDERNUM", (x, su) => x.Status != EWorkflowStepStatus.Handled)
                 .WhereIF(dto.TitleCode.ToUpper() == "SENDORDERNUM", (x, su) => x.Status == EWorkflowStepStatus.Handled)
-				.GroupBy((x, su) => x.ExternalId)
+                .GroupBy((x, su) => x.ExternalId)
                 .Select((x, su) => new { Id = x.ExternalId })
                 .MergeTable()
                 .LeftJoin<Order>((a, b) => a.Id == b.Id)
@@ -3382,65 +3382,184 @@ namespace Hotline.Api.Controllers.Bi
         public async Task<object> HotspotAndAcceptTypeStatistics([FromQuery] HotspotAndAcceptTypeStatisticsReq dto)
         {
 
-	        var (areaList, returnList) = await _orderApplication.HotspotAndAcceptTypeStatistics(dto);
+            var (areaList, returnList) = await _orderApplication.HotspotAndAcceptTypeStatistics(dto);
 
-	        return new { AreaList = areaList, Data = returnList };
+            return new { AreaList = areaList, Data = returnList };
         }
 
-		/// <summary>
-		/// 热点受理类型统计导出
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		[HttpPost("hotspot-accepttype-statistics-export")]
+        /// <summary>
+        /// 热点受理类型统计导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("hotspot-accepttype-statistics-export")]
         public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsExport([FromBody] HotspotAndAcceptTypeStatisticsReq dto)
         {
-	        var returnList = await _orderApplication.HotspotAndAcceptTypeStatisticsExport(dto);
-	        var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
-	        var stream = ExcelHelper.CreateStream(table);
-	        return ExcelStreamResult(stream, "热点受理类型统计");
+            var returnList = await _orderApplication.HotspotAndAcceptTypeStatisticsExport(dto);
+            var table = _orderApplication.InitHotspotTable(returnList, dto.AddColumnName, dto.HotspotLevel);
+            var stream = ExcelHelper.CreateStream(table);
+            return ExcelStreamResult(stream, "热点受理类型统计");
         }
 
-		/// <summary>
-		/// 热点受理类型明细
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		[HttpGet("hotspot-accepttype-statistics-detail")]
+        /// <summary>
+        /// 热点受理类型明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("hotspot-accepttype-statistics-detail")]
         public async Task<PagedDto<OrderDto>> HotspotAndAcceptTypeStatisticsDetail([FromQuery] HotspotAndAcceptTypeStatisticsDetailReq dto)
         {
-	        var (total, items) = await _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
-	        return  new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
-		}
-		/// <summary>
-		/// 热点受理类型明细导出
-		/// </summary>
-		/// <param name="dto"></param>
-		/// <returns></returns>
-		[HttpPost("hotspot-accepttype-statistics-detail-export")]
+            var (total, items) = await _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+            return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+        }
+        /// <summary>
+        /// 热点受理类型明细导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("hotspot-accepttype-statistics-detail-export")]
         public async Task<FileStreamResult> HotspotAndAcceptTypeStatisticsDetailExport([FromBody] ExportExcelDto<HotspotAndAcceptTypeStatisticsDetailReq> dto)
         {
-	        var query = _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto.QueryDto);
-
-	        List<Order> orders;
-	        if (dto.IsExportAll)
-	        {
-		        orders = await query.ToListAsync(HttpContext.RequestAborted);
-	        }
-	        else
-	        {
-		        var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
-		        orders = items;
-	        }
-	        var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
-	        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
-	        var dtos = ordersDtos
-		        .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
-		        .Cast<object>()
-		        .ToList();
-
-	        var stream = ExcelHelper.CreateStream(dtos);
-	        return ExcelStreamResult(stream, "热点受理类型明细");
-        }
-	}
+            var query = _orderApplication.HotspotAndAcceptTypeStatisticsDetail(dto.QueryDto);
+
+            List<Order> orders;
+            if (dto.IsExportAll)
+            {
+                orders = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                orders = items;
+            }
+            var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = ordersDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+            return ExcelStreamResult(stream, "热点受理类型明细");
+        }
+
+        /// <summary>
+        /// 未签收统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_order_nosigen")]
+        public async Task<object> GetOrderNoSigen([FromQuery] OrderNoSigenRequestDto dto)
+        {
+            var items = await _orderReportApplication.GetOrderNoSigen(dto);
+
+            var total = new OrderNoSigenDto
+            {
+                OrgName = "合计",
+                OrgCode = "",
+                OrderNoSigen = items.Sum(p => p.OrderNoSigen),
+                CounterNoSign = items.Sum(p => p.CounterNoSign)
+            };
+
+            return new { List = items, Total = total };
+        }
+
+        /// <summary>
+        /// 未签收统计--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("get_order_nosigen_export")]
+        public async Task<FileStreamResult> ExportGetOrderNoSigen([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
+        {
+            var list = await _orderReportApplication.GetOrderNoSigen(dto.QueryDto);
+
+            //增加合计
+            list.Add(new OrderNoSigenDto
+            {
+                OrgName = "合计",
+                OrgCode = "",
+                OrderNoSigen = list.Sum(p => p.OrderNoSigen),
+                CounterNoSign = list.Sum(p => p.CounterNoSign)
+            });
+
+            var orderDtos = _mapper.Map<ICollection<OrderNoSigenDto>>(list);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = orderDtos
+                .Select(stu => _mapper.Map(stu, typeof(OrderNoSigenDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "未签收统计数据");
+        }
+
+        /// <summary>
+        /// 未签收统计--明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("get_order_nosigen_detail")]
+        public async Task<PagedDto<OrderDto>> GetOrderNoSigenDetail([FromQuery] OrderNoSigenRequestDto dto)
+        {
+            RefAsync<int> total = 0;
+
+            var queryData = await _orderReportApplication.GetOrderNoSigenDetail(dto)
+                         .Select(o => new { o })
+                        .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
+
+            var dtos = queryData.Select(d =>
+            {
+                var dto = _mapper.Map<OrderDto>(d.o);
+                return dto;
+            }).ToList();
+            return new PagedDto<OrderDto>(total, dtos);
+        }
+
+        /// <summary>
+        /// 未签收统计--明细--导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("get_order_nosigen_detail_export")]
+        public async Task<FileStreamResult> ExportGetOrderNoSigenDetail([FromBody] ExportExcelDto<OrderNoSigenRequestDto> dto)
+        {
+            var query = _orderReportApplication.GetOrderNoSigenDetail(dto.QueryDto).Select(o => new { o });
+
+            List<OrderDto> list = new();
+            if (dto.IsExportAll)
+            {
+                var listData = await query.ToListAsync(HttpContext.RequestAborted);
+                list = listData.Select(d =>
+                {
+                    var dto = _mapper.Map<OrderDto>(d.o);
+                    return dto;
+                }).ToList();
+            }
+            else
+            {
+                RefAsync<int> total = 0;
+                var listData = await query.ToPageListAsync(dto.QueryDto.PageIndex, dto.QueryDto.PageSize, total, HttpContext.RequestAborted);
+                list = listData.Select(d =>
+                {
+                    var dto = _mapper.Map<OrderDto>(d.o);
+                    return dto;
+                }).ToList();
+            }
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = list
+                .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "未签收统计明细数据");
+        }
+    }
 }

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

@@ -65,7 +65,7 @@
     "Host": "110.188.24.182",
     "Port": 50179,
     "Password": "fengwo123!$!$",
-    "Database": 3 //release:3, dev:5
+    "Database": 5 //release:3, dev:5
   },
   "Swagger": true,
   "Cors": {
@@ -100,7 +100,7 @@
     }
   },
   "DatabaseConfiguration": {
-    "ApplyDbMigrations": true,
+    "ApplyDbMigrations": false,
     "ApplySeed": false
   },
   "MqConfiguration": {

+ 14 - 0
src/Hotline.Application/StatisticalReport/IOrderReportApplication.cs

@@ -119,5 +119,19 @@ namespace Hotline.Application.StatisticalReport
         /// <param name="list"></param>
         /// <returns></returns>
         Task<DataTable> ExportQueryVisitNoSatisfiedAsync(IReadOnlyList<SystemDicData> dissatisfiedReason, List<dynamic>? list, List<string> addColumnName);
+
+        /// <summary>
+        /// 未签收统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<List<OrderNoSigenDto>> GetOrderNoSigen(OrderNoSigenRequestDto dto);
+
+        /// <summary>
+        /// 未签收统计--明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<Order> GetOrderNoSigenDetail(OrderNoSigenRequestDto dto);
     }
 }

+ 118 - 2
src/Hotline.Application/StatisticalReport/OrderReportApplication.cs

@@ -16,6 +16,7 @@ using JiebaNet.Segmenter.Common;
 using MapsterMapper;
 using MediatR;
 using Microsoft.IdentityModel.Tokens;
+using NPOI.SS.Formula.Functions;
 using SqlSugar;
 using System.Data;
 using XF.Domain.Authentications;
@@ -1574,7 +1575,6 @@ namespace Hotline.Application.StatisticalReport
                  .MergeTable();
         }
 
-
         /// <summary>
         /// 满意度明细
         /// </summary>
@@ -1605,7 +1605,6 @@ namespace Hotline.Application.StatisticalReport
 
         }
 
-
         /// <summary>
         /// 受理类型统计
         /// </summary>
@@ -1746,5 +1745,122 @@ namespace Hotline.Application.StatisticalReport
             }
             return dataTable;
         }
+
+        /// <summary>
+        /// 未签收统计
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public async Task<List<OrderNoSigenDto>> GetOrderNoSigen(OrderNoSigenRequestDto dto)
+        {
+            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+
+            var isCenter = _sessionContext.OrgIsCenter;
+            //工单未超期
+            var queryOrderNoSigen = _orderRepository.Queryable()
+               .LeftJoin<WorkflowStep>((o, w) => o.Id == w.ExternalId)
+               .Where((o, w) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && w.ModuleCode == WorkflowModuleConsts.OrderHandle
+                       && w.Status == EWorkflowStepStatus.WaitForAccept && w.CountersignPosition == ECountersignPosition.None)
+               .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (o, w) => o.Source == ESource.ProvinceStraight)
+               .WhereIF(dto.TypeId != null && dto.TypeId == 1, (o, w) => o.IdentityType == EIdentityType.Citizen)
+               .WhereIF(dto.TypeId != null && dto.TypeId == 2, (o, w) => o.IdentityType == EIdentityType.Enterprise)
+               .Select((o, w) => new
+               {
+                   OrgCode = isCenter == true ? w.HandlerOrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) : w.HandlerOrgId.Substring(0, _sessionContext.RequiredOrgId.Length + 3),
+               })
+               .MergeTable()
+               .LeftJoin<SystemOrganize>((it, sy) => it.OrgCode == sy.Id)
+                // .WhereIF(!string.IsNullOrEmpty(dto.OrgName), (it, sy) => sy.Name.Contains(dto.OrgName))
+                .GroupBy((it, sy) => new
+                {
+                    it.OrgCode,
+                    sy.Name,
+                })
+                 .Select((it, sy) => new OrderNoSigenDto
+                 {
+                     OrgName = it.OrgCode == "001" ? "市民热线服务中心" : sy.Name,
+                     OrgCode = it.OrgCode,
+                     OrderNoSigen = SqlFunc.AggregateSum(1),
+                     CounterNoSign = 0
+                 }).MergeTable();
+
+            //会签未签收
+            var queryCounterNoSign = _orderRepository.Queryable()
+                .LeftJoin<WorkflowStep>((o, w) => o.Id == w.ExternalId)
+                .Where((o, w) => w.CreationTime >= dto.StartTime && w.CreationTime <= dto.EndTime && w.ModuleCode == WorkflowModuleConsts.OrderHandle
+                        && w.Status == EWorkflowStepStatus.WaitForAccept && w.CountersignPosition > ECountersignPosition.None)
+                .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (o, w) => o.Source == ESource.ProvinceStraight)
+                .WhereIF(dto.TypeId != null && dto.TypeId == 1, (o, w) => o.IdentityType == EIdentityType.Citizen)
+                .WhereIF(dto.TypeId != null && dto.TypeId == 2, (o, w) => o.IdentityType == EIdentityType.Enterprise)
+                .Select((o, w) => new
+                {
+                    OrgCode = isCenter == true ? w.HandlerOrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) : w.HandlerOrgId.Substring(0, _sessionContext.RequiredOrgId.Length + 3),
+                })
+                .MergeTable()
+                .LeftJoin<SystemOrganize>((it, sy) => it.OrgCode == sy.Id)
+                 //  .WhereIF(!string.IsNullOrEmpty(dto.OrgName), (it, sy) => sy.Name.Contains(dto.OrgName))
+                 .GroupBy((it, sy) => new
+                 {
+                     it.OrgCode,
+                     sy.Name,
+                 })
+                  .Select((it, sy) => new OrderNoSigenDto
+                  {
+                      OrgName = it.OrgCode == "001" ? "市民热线服务中心" : sy.Name,
+                      OrgCode = it.OrgCode,
+                      OrderNoSigen = 0,
+                      CounterNoSign = SqlFunc.AggregateSum(1)
+                  }).MergeTable();
+
+            return await _orderRepository.UnionAll(queryOrderNoSigen, queryCounterNoSign).GroupBy(p => new { p.OrgCode, p.OrgName })
+                .Select(p => new OrderNoSigenDto
+                {
+                    OrgName = p.OrgName,
+                    OrgCode = p.OrgCode,
+                    OrderNoSigen = SqlFunc.AggregateSum(p.OrderNoSigen),
+                    CounterNoSign = SqlFunc.AggregateSum(p.CounterNoSign),
+                })
+                .ToListAsync();
+
+        }
+
+        /// <summary>
+        /// 未签收统计--明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        public ISugarQueryable<Order> GetOrderNoSigenDetail(OrderNoSigenRequestDto dto)
+        {
+            dto.EndTime = dto.EndTime.AddDays(1).AddSeconds(-1);
+
+            if (dto.DataSoure == 2)
+            {
+                //会签未签收
+                return _orderRepository.Queryable()
+                    .LeftJoin<WorkflowStep>((o, w) => o.Id == w.ExternalId)
+                    .Where((o, w) => w.CreationTime >= dto.StartTime && w.CreationTime <= dto.EndTime && w.ModuleCode == WorkflowModuleConsts.OrderHandle
+                            && w.Status == EWorkflowStepStatus.WaitForAccept && w.CountersignPosition > ECountersignPosition.None)
+                    .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (o, w) => o.Source == ESource.ProvinceStraight)
+                    .WhereIF(dto.TypeId != null && dto.TypeId == 1, (o, w) => o.IdentityType == EIdentityType.Citizen)
+                    .WhereIF(dto.TypeId != null && dto.TypeId == 2, (o, w) => o.IdentityType == EIdentityType.Enterprise)
+                    .WhereIF(dto.OrgCode == "001", (o, w) => w.HandlerOrgId == dto.OrgCode)
+                   .WhereIF(dto.OrgCode != "001", (o, w) => w.HandlerOrgId.StartsWith(dto.OrgCode))
+                   .MergeTable();
+            }
+            else
+            {
+                //工单未超期
+                return _orderRepository.Queryable()
+                    .LeftJoin<WorkflowStep>((o, w) => o.Id == w.ExternalId)
+                    .Where((o, w) => o.CreationTime >= dto.StartTime && o.CreationTime <= dto.EndTime && w.ModuleCode == WorkflowModuleConsts.OrderHandle
+                            && w.Status == EWorkflowStepStatus.WaitForAccept && w.CountersignPosition == ECountersignPosition.None)
+                    .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (o, w) => o.Source == ESource.ProvinceStraight)
+                    .WhereIF(dto.TypeId != null && dto.TypeId == 1, (o, w) => o.IdentityType == EIdentityType.Citizen)
+                    .WhereIF(dto.TypeId != null && dto.TypeId == 2, (o, w) => o.IdentityType == EIdentityType.Enterprise)
+                    .WhereIF(dto.OrgCode == "001", (o, w) => w.HandlerOrgId == dto.OrgCode)
+                    .WhereIF(dto.OrgCode != "001", (o, w) => w.HandlerOrgId.StartsWith(dto.OrgCode))
+                  .MergeTable();
+            }
+        }
     }
 }

+ 30 - 0
src/Hotline.Share/Dtos/Bi/OrderNoSigenDto.cs

@@ -0,0 +1,30 @@
+namespace Hotline.Share.Dtos.Bi
+{
+    public class OrderNoSigenDto
+    {
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string OrgName { get; set; }
+
+        /// <summary>
+        /// 部门Code
+        /// </summary>
+        public string OrgCode { get; set; }
+
+        /// <summary>
+        /// 工单未签收
+        /// </summary>
+        public int OrderNoSigen { get; set; }
+
+        /// <summary>
+        /// 会签未签收
+        /// </summary>
+        public int CounterNoSign { get; set; }
+
+        /// <summary>
+        /// 总量
+        /// </summary>
+        public int TotleNoSign => OrderNoSigen + CounterNoSign;
+    }
+}

+ 40 - 0
src/Hotline.Share/Requests/OrderNoSigenRequestDto.cs

@@ -0,0 +1,40 @@
+namespace Hotline.Share.Requests
+{
+    public record OrderNoSigenRequestDto : PagedRequest
+    {
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        public DateTime EndTime { get; set; }
+
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string? OrgName { get; set; }
+
+        /// <summary>
+        /// 部门Code
+        /// </summary>
+        public string? OrgCode { get; set; }
+
+        /// <summary>
+        /// 是否省来源
+        /// </summary>
+        public bool? IsProvince { get; set; }
+
+        /// <summary>
+        /// 来电/信人身份0:全部 ,1:市民,2:企业
+        /// </summary>
+        public int? TypeId { get; set; }
+
+        /// <summary>
+        /// 数据来源 1:工单未签收,2:会签未签收
+        /// </summary>
+        public int? DataSoure { get; set; }
+    }
+}