Bläddra i källkod

Merge branch 'dev' of http://110.188.24.182:10023/Fengwo/hotline into dev

田爽 6 månader sedan
förälder
incheckning
07b2b665ae

+ 115 - 2
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -538,6 +538,119 @@ namespace Hotline.Api.Controllers.Bi
             return new PagedDto<HotspotDataLsitVo>(total, items);
         }
 
+        /// <summary>
+        /// 热点数据统计导出
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPost("hotspot_data_list/export")]
+        public async Task<FileStreamResult> HotspotDataLsitExprot([FromBody] ExportExcelDto<HotspotReportPagedRequest> dto)
+        {
+            if (!dto.QueryDto.StartTime.HasValue || !dto.QueryDto.EndTime.HasValue) throw UserFriendlyException.SameMessage("请选择时间!");
+            if (dto.QueryDto.Type == 0 && (!dto.QueryDto.ChainStartTime.HasValue || !dto.QueryDto.ChainEndTime.HasValue)) throw UserFriendlyException.SameMessage("请选择环比时间!");
+
+            dto.QueryDto.EndTime = dto.QueryDto.EndTime.Value.AddDays(1).AddSeconds(-1);
+
+            var IsCenter = _sessionContext.OrgIsCenter;
+
+            if (dto.QueryDto.Type == 0)
+            {
+                dto.QueryDto.ChainEndTime = dto.QueryDto.ChainEndTime.Value.AddDays(1).AddSeconds(-1);
+            }
+
+            var items = await _hotspotTypeRepository.Queryable(false, true)
+                .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
+                .WhereIF(dto.QueryDto.StartTime.HasValue, (x, o) => o.CreationTime >= dto.QueryDto.StartTime)
+                .WhereIF(dto.QueryDto.EndTime.HasValue, (x, o) => o.CreationTime <= dto.QueryDto.EndTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.Keyword), (x, o) => x.HotSpotName.Contains(dto.QueryDto.Keyword!))
+                .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
+                .Where((x, o) => x.IsDeleted == false)
+                .GroupBy((x, o) => new { x.Id, x.HotSpotName })
+                .Select((x, o) => new HotspotDataLsitVo
+                {
+                    Id = x.Id,
+                    Name = x.HotSpotName,
+                    Num = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
+                    Sublevel = SqlFunc.AggregateSum(SqlFunc.IIF(x.HotSpotName != o.HotspotName, 1, 0)) > 0,
+                }).MergeTable().ToListAsync();
+            var chainStartTime = dto.QueryDto.StartTime;
+            var chainEndTime = dto.QueryDto.EndTime;
+            switch (dto.QueryDto.Type)
+            {
+                case 1://日
+                    chainStartTime = dto.QueryDto.StartTime.Value.AddDays(-1);
+                    chainEndTime = dto.QueryDto.EndTime.Value.AddDays(-1);
+                    break;
+                case 2://月
+                    chainStartTime = dto.QueryDto.StartTime.Value.AddMonths(-1);
+                    chainEndTime = dto.QueryDto.EndTime.Value.AddMonths(-1);
+                    break;
+                case 3://年
+                    chainStartTime = dto.QueryDto.StartTime.Value.AddYears(-1);
+                    chainEndTime = dto.QueryDto.EndTime.Value.AddYears(-1);
+                    break;
+                case 0:
+                    chainStartTime = dto.QueryDto.ChainStartTime.Value;
+                    chainEndTime = dto.QueryDto.ChainEndTime.Value;
+                    break;
+            }
+            var chainItems = await _hotspotTypeRepository.Queryable(false, true)
+                .LeftJoin<Order>((x, o) => o.HotspotSpliceName != null && (x.HotSpotName == o.HotspotSpliceName || o.HotspotSpliceName.Contains(x.HotSpotName)) && o.IsDeleted == false)
+                .WhereIF(dto.QueryDto.StartTime.HasValue, (x, o) => o.CreationTime >= chainStartTime)
+                .WhereIF(dto.QueryDto.EndTime.HasValue, (x, o) => o.CreationTime <= chainEndTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.QueryDto.Keyword), (x, o) => x.HotSpotName.Contains(dto.QueryDto.Keyword!))
+                .WhereIF(IsCenter == false, (x, o) => o.ActualHandleOrgCode == _sessionContext.RequiredOrgId)
+                .Where((x, o) => x.IsDeleted == false)
+                .GroupBy((x, o) => new { x.Id, x.HotSpotName })
+                .Select((x, o) => new
+                {
+                    Id = x.Id,
+                    ChainNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.Id != null, 1, 0)),
+                }).MergeTable().ToListAsync();
+            var res = (from t1 in items
+                       join t2 in chainItems on t1.Id equals t2.Id into t1_t2
+                       from item in t1_t2.DefaultIfEmpty()
+                       select new HotspotDataLsitVo
+                       {
+                           Id = t1.Id,
+                           Name = t1.Name,
+                           Num = t1.Num,
+                           Sublevel = t1.Sublevel,
+                           Children = new List<HotspotDataLsitVo>(),
+                           ChainNum = t1_t2.Select(x => x.ChainNum).FirstOrDefault(),
+                           ChainRate = t1_t2.Select(x => x.ChainNum).FirstOrDefault() > 0 ?
+                           ((double.Parse(t1.Num.ToString()) - double.Parse(t1_t2.Select(x => x.ChainNum).FirstOrDefault().ToString())) / double.Parse(t1_t2.Select(x => x.ChainNum).FirstOrDefault().ToString()) * 100).ToString("F2") + "%" : "100.00%",
+                       }).ToList();
+            var total = new HotspotDataLsitVo()
+            {
+                Id = "0",
+                Name = "合计",
+                Num = res.Sum(x => x.Num),
+                Sublevel = false,
+                Children = new List<HotspotDataLsitVo>(),
+                ChainNum = res.Sum(x => x.ChainNum),
+                ChainRate = res.Sum(x => x.ChainNum) > 0 ? ((double.Parse(res.Sum(x => x.Num).ToString()) - double.Parse(res.Sum(x => x.ChainNum).ToString())) / double.Parse(res.Sum(x => x.ChainNum).ToString()) * 100).ToString("F2") + "%" : "100.00%"
+            };
+            res.Add(total);
+
+            List<HotspotDataLsitVo> data;
+            data = res;
+
+            var dataDtos = _mapper.Map<ICollection<HotspotDataLsitVo>>(data);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = dataDtos
+                .Select(stu => _mapper.Map(stu, typeof(HotspotDataLsitVo), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "部门不满意统计明细");
+            //return new { List = res, Total = total };
+        }
+
         /// <summary>
         /// 热点数据统计 TODO和前端沟通
         /// </summary>
@@ -612,7 +725,7 @@ namespace Hotline.Api.Controllers.Bi
             var res = (from t1 in items
                        join t2 in chainItems on t1.Id equals t2.Id into t1_t2
                        from item in t1_t2.DefaultIfEmpty()
-                       select new
+                       select new HotspotDataLsitVo()
                        {
                            Id = t1.Id,
                            Name = t1.Name,
@@ -623,7 +736,7 @@ namespace Hotline.Api.Controllers.Bi
                            ChainRate = t1_t2.Select(x => x.ChainNum).FirstOrDefault() > 0 ?
                            ((double.Parse(t1.Num.ToString()) - double.Parse(t1_t2.Select(x => x.ChainNum).FirstOrDefault().ToString())) / double.Parse(t1_t2.Select(x => x.ChainNum).FirstOrDefault().ToString()) * 100).ToString("F2") + "%" : "100.00%",
                        }).ToList();
-            var total = new
+            var total = new HotspotDataLsitVo()
             {
                 Id = "0",
                 Name = "合计",

+ 7 - 2
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -93,8 +93,13 @@ namespace Hotline.Share.Dtos.Order
 		public int Num { get; set; }
 		public bool Sublevel { get; set; }
 
-		List<HotspotDataLsitVo> Children { get; set; }
-	}
+		public List<HotspotDataLsitVo> Children { get; set; }
+
+		public int ChainNum { get; set; }
+
+		public string ChainRate { get; set; }
+
+    }
 
 
 	public class AcceptTypeTop10Volod {