Kaynağa Gözat

Merge branch 'test' into lib/test

libin 1 ay önce
ebeveyn
işleme
cfc6a57ad6

+ 1 - 1
Hotline.sln

@@ -61,7 +61,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hotline.Ai.XingTang", "src\
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hotline.Pdf", "src\Hotline.Pdf\Hotline.Pdf.csproj", "{3AB75B51-A69D-4145-A564-1D9D1695992E}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hotline.Tests", "test\Hotline.Tests\Hotline.Tests.csproj", "{31855124-4EFC-47B9-A4D5-64822DE036E6}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hotline.Tests", "test\Hotline.Tests\Hotline.Tests.csproj", "{31855124-4EFC-47B9-A4D5-64822DE036E6}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

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

@@ -4276,11 +4276,7 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("highmatter-warning")]
         public async Task<PagedDto<HighMatterWarningDto>> HighMatterWarning([FromQuery] HighMatterWarningRequest dto)
         {
-            List<string> filterTitle = new List<string>();
-            filterTitle.Add("无声");
-            filterTitle.Add("骚扰");
-            filterTitle.Add("错拨");
-            filterTitle.Add("测试");
+            var filterTitle = _systemSettingCacheManager.GetSetting(SettingConstants.HighMatterWarningFilterTitle).SettingValue;
 
             var (total, items) = await _orderRepository.Queryable()
                 .Where(x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
@@ -4338,11 +4334,7 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("highmatter-warning-detail")]
         public async Task<PagedDto<OrderDto>> HighMatterWarningDetail([FromQuery] HighMatterWarningDetailRequest dto)
         {
-            List<string> filterTitle = new List<string>();
-            filterTitle.Add("无声");
-            filterTitle.Add("骚扰");
-            filterTitle.Add("错拨");
-            filterTitle.Add("测试");
+            var filterTitle = _systemSettingCacheManager.GetSetting(SettingConstants.HighMatterWarningFilterTitle).SettingValue;
 
             var (total, items) = await _orderRepository.Queryable()
             .Includes(x => x.OrderScreens)

+ 6 - 8
src/Hotline.Api/Controllers/Bigscreen/DataScreenController.cs

@@ -1,4 +1,5 @@
 using DocumentFormat.OpenXml.Drawing;
+using Hotline.Caching.Interfaces;
 using Hotline.Configurations;
 using Hotline.KnowledgeBase;
 using Hotline.Orders;
@@ -33,12 +34,14 @@ namespace Hotline.Api.Controllers.Bigscreen
         private readonly IRepository<SystemArea> _systemAreaRepository;
         private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
         private readonly IRepository<OrderSecondaryHandling> _orderSecondaryHandlingRepository;
+        private readonly ISystemSettingCacheManager _systemSettingCacheManager;
 
         public DataScreenController(IOrderRepository orderRepository, IRepository<OrderVisit> orderVisitRepository,
             IRepository<OrderDelay> orderDelayRepository, IRepository<Knowledge> knowledgeRepository, IRepository<KnowledgePv> knowledgePvRepository,
             IMapper mapper, IRepository<OrderVisitDetail> orderVisitDetailRepository, IRepository<SystemArea> systemAreaRepository,
             IOptionsSnapshot<AppConfiguration> appOptions,
-            IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository)
+            IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository,
+            ISystemSettingCacheManager systemSettingCacheManager)
         {
             _orderRepository = orderRepository;
             _orderVisitRepository = orderVisitRepository;
@@ -50,6 +53,7 @@ namespace Hotline.Api.Controllers.Bigscreen
             _systemAreaRepository = systemAreaRepository;
             _appOptions = appOptions;
             _orderSecondaryHandlingRepository = orderSecondaryHandlingRepository;
+            _systemSettingCacheManager = systemSettingCacheManager;
         }
 
         /// <summary>
@@ -477,13 +481,7 @@ namespace Hotline.Api.Controllers.Bigscreen
             //var endDate = DateTime.Now.Date.AddDays(1).AddSeconds(-1);
             //var startDate = endDate.AddDays(-30).Date;
 
-
-            List<string> filterTitle = new List<string>();
-            filterTitle.Add("无声");
-            filterTitle.Add("骚扰");
-            filterTitle.Add("错拨");
-            filterTitle.Add("测试");
-
+            var filterTitle = _systemSettingCacheManager.GetSetting(SettingConstants.HighMatterWarningFilterTitle).SettingValue;
 
             var list = await _orderRepository.Queryable(false, false, false)
                 .Where(x => x.CreationTime >= StartTime && x.CreationTime <= EndTime)

+ 19 - 42
src/Hotline.Api/Controllers/OrderController.cs

@@ -1412,12 +1412,15 @@ public class OrderController : BaseController
             Histories = histories,
             IsCanUpdate = isCanUpdate
         };
-        if (_appOptions.Value.IsLuZhou
-            && !_sessionContext.OrgIsCenter
-            && rsp.OrderVisitModel.Order.IsSecret)
+        if (!_sessionContext.OrgIsCenter && rsp.OrderVisitModel.Order.IsSecret)
         {
-            rsp.OrderVisitModel.Order.FromPhone = "****";//rsp.OrderVisitModel.Order.FromPhone?.Replace(rsp.OrderVisitModel.Order.FromPhone.Substring(3, 4), "****");
-            rsp.OrderVisitModel.Order.Contact = "****"; //rsp.OrderVisitModel.Order.Contact?.Replace(rsp.OrderVisitModel.Order.Contact.Substring(3, 4), "****");
+            if (_appOptions.Value.IsZiGong)
+                rsp.OrderVisitModel.Order = rsp.OrderVisitModel.Order.DataMask();
+            if (_appOptions.Value.IsLuZhou)
+            {
+                rsp.OrderVisitModel.Order.FromPhone = "****";//rsp.OrderVisitModel.Order.FromPhone?.Replace(rsp.OrderVisitModel.Order.FromPhone.Substring(3, 4), "****");
+                rsp.OrderVisitModel.Order.Contact = "****"; //rsp.OrderVisitModel.Order.Contact?.Replace(rsp.OrderVisitModel.Order.Contact.Substring(3, 4), "****");
+            }
         }
 
         return rsp;
@@ -2632,31 +2635,11 @@ public class OrderController : BaseController
         }
 
         var (total, items) = await _orderApplication.MayScreenList(dto)
-            .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+       .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
         var data = _mapper.Map<List<OrderVisitDetailDto>>(items);
         var isAdmin = _orderDomainService.IsCheckAdmin();
-        foreach (var item in data)
-        {
-            if ((dto.ScreenType == EOrderScreenType.Org && item.VisitOrgCode == _sessionContext.OrgId) || isAdmin == true || (dto.ScreenType == EOrderScreenType.Seat))
-                item.IsShowOperate = true;
-            if (_appOptions.Value.IsZiGong && !_sessionContext.OrgIsCenter && item.Order != null)
-            {
-                if (item.Order.IsSecret == true)
-                {
-                    var maskString = "***";
-                    item.Order.Contact = maskString;
-                    item.Order.FromName = maskString;
-                    item.Order.FromGender = EGender.Unknown;
-                    item.Order.FromPhone = maskString;
-                    item.Order.FullAddress = maskString;
-                    item.Order.Address = maskString;
-                    item.Order.City = maskString;
-                    item.Order.Street = maskString;
-                    item.Order.ContactMask = maskString;
-                }
-            }
-        }
-
+        data.ForEach(d => d.IsShowOperate = (dto.ScreenType == EOrderScreenType.Org && d.VisitOrgCode == _sessionContext.OrgId)
+        || isAdmin == true || (dto.ScreenType == EOrderScreenType.Seat));
         return new PagedDto<OrderVisitDetailDto>(total, data);
     }
 
@@ -2713,14 +2696,8 @@ public class OrderController : BaseController
     public async Task<PagedDto<OrderScreenListDto>> ScreenList([FromQuery] ScreenListDto dto)
     {
         var (total, items) = await _orderApplication.OrderScreenList(dto)
-            .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
-        var data = _mapper.Map<List<OrderScreenListDto>>(items);
-        if (_appOptions.Value.IsZiGong && !_sessionContext.OrgIsCenter)
-        {
-            data.ForEach(d => d.Order = d.Order.DataMask());
-        }
-
-        return new PagedDto<OrderScreenListDto>(total, data);
+    .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+        return new PagedDto<OrderScreenListDto>(total, _mapper.Map<IReadOnlyList<OrderScreenListDto>>(items));
     }
 
 
@@ -5486,15 +5463,15 @@ public class OrderController : BaseController
         if (string.IsNullOrEmpty(order.WorkflowId))
             throw UserFriendlyException.SameMessage("该工单未开启流程");
         var dto = await _workflowApplication.GetNextStepsAsync(order.WorkflowId, HttpContext.RequestAborted);
+        var isShowWanggeyuan = false;
         if (isSnapshotEnable)
         {
             var orderSnapShot = await _orderSnapshotRepository.GetAsync(orderId, HttpContext.RequestAborted);
-            if (orderSnapShot != null && string.CompareOrdinal(orderSnapShot.IndustryName, "安全隐患") != 0)
-            {
-                dto.Steps = dto.Steps.Where(d => string.CompareOrdinal(d.Value, "网格员") != 0
-                && string.CompareOrdinal(d.Value, "工单标记") != 0).ToList();
-            }
+            isShowWanggeyuan = orderSnapShot != null && string.CompareOrdinal(orderSnapShot.IndustryName, "安全隐患") == 0;
         }
+        if(!isShowWanggeyuan)
+            dto.Steps = dto.Steps.Where(d => string.CompareOrdinal(d.Value, "网格员") != 0
+                                             && string.CompareOrdinal(d.Value, "工单标记") != 0).ToList();
 
         dto.ExpiredTime = order.ExpiredTime;
         dto.Content = order.Content;
@@ -5833,7 +5810,7 @@ public class OrderController : BaseController
             if (step.FileJson != null && step.FileJson.Any())
             {
                 var ids = step.FileJson.Select(x => x.Id).ToList();
-                var stepFiles = await _fileRepository.GetPermissionFilesAsync(ids, HttpContext.RequestAborted);
+                var stepFiles = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
                 stepFiles.ForEach(x => x.GetStepName(step.Name));
                 allFiles.AddRange(stepFiles);
             }

+ 162 - 144
src/Hotline.Application/OrderApp/OrderAnalysisApplication.cs

@@ -1,4 +1,5 @@
-using Hotline.Orders;
+using Hotline.Caching.Interfaces;
+using Hotline.Orders;
 using Hotline.Settings;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
@@ -11,147 +12,164 @@ using XF.Utility.SequentialId;
 
 namespace Hotline.Application.OrderApp
 {
-	public class OrderAnalysisApplication : IOrderAnalysisApplication, IScopeDependency
-	{
-		private readonly IRepository<OrderAnalysis> _orderAnalysisRepository;
-		private readonly IMapper _mapper;
-		private readonly IOrderRepository _orderRepository;
-		private readonly IRepository<SystemArea> _systemAreaRepository;
-
-		public OrderAnalysisApplication(
-			IMapper mapper,
-			IOrderRepository orderRepository,
-			IRepository<SystemArea> systemAreaRepository,
-			IRepository<OrderAnalysis> orderAnalysisRepository
-			) 
-		{
-			_mapper = mapper;
-			_orderRepository = orderRepository;
-			_orderAnalysisRepository = orderAnalysisRepository;
-			_systemAreaRepository = systemAreaRepository;
-		}
-
-		/// <summary>
-		/// 新增
-		/// </summary>
-		/// <returns></returns>
-		public async Task AddAsync(AddOrderAnalysisDto dto, CancellationToken cancellationToken) {
-			var analysisAny =  await _orderAnalysisRepository.Queryable().AnyAsync(x => x.AnalysisName == dto.AnalysisName, cancellationToken);
-			if (analysisAny)
-				throw UserFriendlyException.SameMessage("当前报告名称已经存在,请修改报告名称!");
-
-			var analysisId = SequentialStringGenerator.Create();
-			var generatedTime = DateTime.Now;
-			var analysiss = new List<OrderAnalysis>();
-			foreach (var item in dto.AnalysisList)
-			{
-				var analysis = _mapper.Map<OrderAnalysis>(item);
-				analysis.AnalysisId = analysisId;
-				analysis.AnalysisName =  dto.AnalysisName;
-				analysis.Remark = dto.Remark;
-				analysis.GeneratedTime = generatedTime;
-				analysiss.Add(analysis);
-			}
-			await _orderAnalysisRepository.AddRangeAsync(analysiss, cancellationToken);
-		}
-		
-		/// <summary>
-		/// 修改
-		/// </summary>
-		/// <returns></returns>
-		public async Task UpdateAsync(UpdateOrderAnalysisDto dto, CancellationToken cancellationToken) 
-		{
-			var analysisIdAny = await _orderAnalysisRepository.Queryable().AnyAsync(x =>  x.AnalysisId == dto.AnalysisId, cancellationToken);
-			if (!analysisIdAny)
-				throw UserFriendlyException.SameMessage("当前报告不存在,请查询报告是否已变更!");
-			var analysisNameAny = await _orderAnalysisRepository.Queryable().AnyAsync(x => x.AnalysisName == dto.AnalysisName && x.AnalysisId != dto.AnalysisId, cancellationToken);
-			if (analysisNameAny)
-				throw UserFriendlyException.SameMessage("当前报告名称已经存在,请修改报告名称!");
-			await _orderAnalysisRepository.Updateable().SetColumns(x => new OrderAnalysis { AnalysisName = dto.AnalysisName, Remark = dto.Remark })
-				.Where(x => x.AnalysisId == dto.AnalysisId).ExecuteCommandAsync(cancellationToken);
-		}
-
-		/// <summary>
-		/// 删除
-		/// </summary>
-		/// <returns></returns>
-		public async Task DeleteAsync(DeleteOrderAnalysisDto dto, CancellationToken cancellationToken) {
-
-			await _orderAnalysisRepository.Removeable().In(x => x.AnalysisId, dto.AnalysisIds).ExecuteCommandAsync(cancellationToken);
-		}
-
-
-		/// <summary>
-		/// 查询列表
-		/// </summary>
-		/// <returns></returns>
-		public ISugarQueryable<OrderAnalysisDto> ListQuery(OrderAnalysisListDto dto, CancellationToken cancellationToken) {
-			if (dto.GeneratedEndTime.HasValue)
-				dto.GeneratedEndTime = dto.GeneratedEndTime.Value.AddDays(1).AddSeconds(-1);
-			var query = _orderAnalysisRepository.Queryable()
-				.WhereIF(!string.IsNullOrEmpty(dto.AnalysisName), x => x.AnalysisName == dto.AnalysisName)
-				.WhereIF(dto.GeneratedStartTime.HasValue && dto.GeneratedEndTime.HasValue, x => x.GeneratedTime >= dto.GeneratedStartTime && x.GeneratedTime <= dto.GeneratedEndTime)
-				.GroupBy(x => new { x.AnalysisId, x.AnalysisName, x.Remark, x.GeneratedTime })
-				.Select(x => new OrderAnalysisDto { AnalysisId = x.AnalysisId, AnalysisName = x.AnalysisName, Remark = x.Remark, GeneratedTime = x.GeneratedTime })
-				.OrderByDescending(x=> x.GeneratedTime);
-			return query;
-		}
-
-		/// <summary>
-		///  查看预警事件
-		/// </summary>
-		/// <returns></returns>
-		public ISugarQueryable<Order> DetailQuery(OrderAnalysisDetailDto dto, CancellationToken cancellationToken) {
-			var query = _orderAnalysisRepository.Queryable()
-				.LeftJoin<Order>((a, o) => a.AcceptTypeCode == o.AcceptTypeCode && a.HotspotId == o.HotspotId && o.AreaCode.StartsWith(a.AreaCode))
-				.Where((a, o) => a.AnalysisId == dto.AnalysisId)
-				.Select((a, o) => o);
-			return query;
-		}
-
-		/// <summary>
-		/// 生成报告
-		/// </summary>
-		/// <returns></returns>
-		public async Task<object> ReportQuery(OrderAnalysisDetailDto dto, CancellationToken cancellationToken) {
-
-			var analysis = await _orderAnalysisRepository.Queryable()
-				.Where(x => x.AnalysisId == dto.AnalysisId)
-				.GroupBy(x => new { x.AnalysisId, x.AnalysisName, x.GeneratedTime, x.Remark })
-				.Select(x => new { x.AnalysisId, x.AnalysisName, x.GeneratedTime, x.Remark }).FirstAsync(cancellationToken);
-
-			var orders = await _orderAnalysisRepository.Queryable()
-				.LeftJoin<Order>((a, o) => a.AcceptTypeCode == o.AcceptTypeCode && a.HotspotId == o.HotspotId && o.AreaCode.StartsWith(a.AreaCode))
-				.Where((a, o) => a.AnalysisId == dto.AnalysisId)
-				.Select((a, o) => o).ToListAsync(cancellationToken) ;
-			var introductionData = orders.GroupBy(x=>x.SourceChannel)
-				.Select(x=>new { SourceChannel = x.Key, Num  = x.Count(), Rate = Math.Round((x.Count() /(double)orders.Count) * 100, 2) })
-				.OrderByDescending(x=>x.Num);
-			var introduction = new { total = orders.Count, data = introductionData };
-			var orderAreas = orders.GroupBy(x=>x.AreaCode.Substring(0,6))
-				.Select(x=> new { AreaCode =x.Key, Num = x.Count(), Rate = Math.Round((x.Count() / (double)orders.Count) * 100, 2) })
-				.OrderByDescending(x => x.Num);
-			var areaList = await _systemAreaRepository.Queryable().Where(x=>x.Id.Length == 6).ToListAsync(cancellationToken);
-			var areaData = (from t1 in orderAreas
-							join t2 in areaList on t1.AreaCode equals t2.Id into t1_t2
-				from item in t1_t2.DefaultIfEmpty()
-				select new
-				{
-					AreaCode = t1.AreaCode,
-					Num = t1.Num,
-					Rate = t1.Rate,
-					AreaName = t1_t2.Select(x => x.AreaName).FirstOrDefault(),
-				}).OrderByDescending(x=>x.Num).ToList();
-			var areaNames = areaData.Select(x=>x.AreaName).ToList();
-
-			var area = new { AreaNames = areaNames, data = areaData };
-
-			var handle = new { HandleFiled = orders.Count(x => x.Status >= EOrderStatus.Filed), Handle = orders.Count(x => x.Status < Share.Enums.Order.EOrderStatus.Filed) };
-
-			var first = _mapper.Map<List<OrderDto>>(orders.OrderByDescending(x=>x.CreationTime).Take(2).ToList());
-			return new { Analysis = analysis, Introduction = introduction, Area = area, Handle = handle, First = first };
-		}
-
-
-	}
+    public class OrderAnalysisApplication : IOrderAnalysisApplication, IScopeDependency
+    {
+        private readonly IRepository<OrderAnalysis> _orderAnalysisRepository;
+        private readonly IMapper _mapper;
+        private readonly IOrderRepository _orderRepository;
+        private readonly IRepository<SystemArea> _systemAreaRepository;
+        private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+
+        public OrderAnalysisApplication(
+            IMapper mapper,
+            IOrderRepository orderRepository,
+            IRepository<SystemArea> systemAreaRepository,
+            IRepository<OrderAnalysis> orderAnalysisRepository,
+            ISystemSettingCacheManager systemSettingCacheManager
+            )
+        {
+            _mapper = mapper;
+            _orderRepository = orderRepository;
+            _orderAnalysisRepository = orderAnalysisRepository;
+            _systemAreaRepository = systemAreaRepository;
+            _systemSettingCacheManager = systemSettingCacheManager;
+        }
+
+        /// <summary>
+        /// 新增
+        /// </summary>
+        /// <returns></returns>
+        public async Task AddAsync(AddOrderAnalysisDto dto, CancellationToken cancellationToken)
+        {
+            var analysisAny = await _orderAnalysisRepository.Queryable().AnyAsync(x => x.AnalysisName == dto.AnalysisName, cancellationToken);
+            if (analysisAny)
+                throw UserFriendlyException.SameMessage("当前报告名称已经存在,请修改报告名称!");
+
+            var analysisId = SequentialStringGenerator.Create();
+            var generatedTime = DateTime.Now;
+            var analysiss = new List<OrderAnalysis>();
+            foreach (var item in dto.AnalysisList)
+            {
+                var analysis = _mapper.Map<OrderAnalysis>(item);
+                analysis.AnalysisId = analysisId;
+                analysis.AnalysisName = dto.AnalysisName;
+                analysis.Remark = dto.Remark;
+                analysis.GeneratedTime = generatedTime;
+                analysis.StartTime = dto.StartTime;
+                analysis.EndTime = dto.EndTime;
+                analysiss.Add(analysis);
+            }
+            await _orderAnalysisRepository.AddRangeAsync(analysiss, cancellationToken);
+        }
+
+        /// <summary>
+        /// 修改
+        /// </summary>
+        /// <returns></returns>
+        public async Task UpdateAsync(UpdateOrderAnalysisDto dto, CancellationToken cancellationToken)
+        {
+            var analysisIdAny = await _orderAnalysisRepository.Queryable().AnyAsync(x => x.AnalysisId == dto.AnalysisId, cancellationToken);
+            if (!analysisIdAny)
+                throw UserFriendlyException.SameMessage("当前报告不存在,请查询报告是否已变更!");
+            var analysisNameAny = await _orderAnalysisRepository.Queryable().AnyAsync(x => x.AnalysisName == dto.AnalysisName && x.AnalysisId != dto.AnalysisId, cancellationToken);
+            if (analysisNameAny)
+                throw UserFriendlyException.SameMessage("当前报告名称已经存在,请修改报告名称!");
+            await _orderAnalysisRepository.Updateable().SetColumns(x => new OrderAnalysis { AnalysisName = dto.AnalysisName, Remark = dto.Remark })
+                .Where(x => x.AnalysisId == dto.AnalysisId).ExecuteCommandAsync(cancellationToken);
+        }
+
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <returns></returns>
+        public async Task DeleteAsync(DeleteOrderAnalysisDto dto, CancellationToken cancellationToken)
+        {
+
+            await _orderAnalysisRepository.Removeable().In(x => x.AnalysisId, dto.AnalysisIds).ExecuteCommandAsync(cancellationToken);
+        }
+
+
+        /// <summary>
+        /// 查询列表
+        /// </summary>
+        /// <returns></returns>
+        public ISugarQueryable<OrderAnalysisDto> ListQuery(OrderAnalysisListDto dto, CancellationToken cancellationToken)
+        {
+            if (dto.GeneratedEndTime.HasValue)
+                dto.GeneratedEndTime = dto.GeneratedEndTime.Value.AddDays(1).AddSeconds(-1);
+            var query = _orderAnalysisRepository.Queryable()
+                .WhereIF(!string.IsNullOrEmpty(dto.AnalysisName), x => x.AnalysisName == dto.AnalysisName)
+                .WhereIF(dto.GeneratedStartTime.HasValue && dto.GeneratedEndTime.HasValue, x => x.GeneratedTime >= dto.GeneratedStartTime && x.GeneratedTime <= dto.GeneratedEndTime)
+                .GroupBy(x => new { x.AnalysisId, x.AnalysisName, x.Remark, x.GeneratedTime })
+                .Select(x => new OrderAnalysisDto { AnalysisId = x.AnalysisId, AnalysisName = x.AnalysisName, Remark = x.Remark, GeneratedTime = x.GeneratedTime })
+                .OrderByDescending(x => x.GeneratedTime);
+            return query;
+        }
+
+        /// <summary>
+        ///  查看预警事件
+        /// </summary>
+        /// <returns></returns>
+        public ISugarQueryable<Order> DetailQuery(OrderAnalysisDetailDto dto, CancellationToken cancellationToken)
+        {
+            var filterTitle = _systemSettingCacheManager.GetSetting(SettingConstants.HighMatterWarningFilterTitle).SettingValue;
+
+            var query = _orderAnalysisRepository.Queryable()
+                .LeftJoin<Order>((a, o) => a.AcceptTypeCode == o.AcceptTypeCode && a.HotspotId == o.HotspotId && o.AreaCode.StartsWith(a.AreaCode))
+                .Where((a, o) => a.AnalysisId == dto.AnalysisId)
+                .Where((a, o) => o.CreationTime >= a.StartTime && o.CreationTime <= a.EndTime)
+                .Where((a, o) => filterTitle.Any(s => o.Title.Contains(s)) == false)
+                .Select((a, o) => o);
+            return query;
+        }
+
+        /// <summary>
+        /// 生成报告
+        /// </summary>
+        /// <returns></returns>
+        public async Task<object> ReportQuery(OrderAnalysisDetailDto dto, CancellationToken cancellationToken)
+        {
+            var filterTitle = _systemSettingCacheManager.GetSetting(SettingConstants.HighMatterWarningFilterTitle).SettingValue;
+
+            var analysis = await _orderAnalysisRepository.Queryable()
+                .Where(x => x.AnalysisId == dto.AnalysisId)
+                .GroupBy(x => new { x.AnalysisId, x.AnalysisName, x.GeneratedTime, x.Remark, x.StartTime, x.EndTime })
+                .Select(x => new { x.AnalysisId, x.AnalysisName, x.GeneratedTime, x.Remark, x.StartTime, x.EndTime }).FirstAsync(cancellationToken);
+
+            var orders = await _orderAnalysisRepository.Queryable()
+                .LeftJoin<Order>((a, o) => a.AcceptTypeCode == o.AcceptTypeCode && a.HotspotId == o.HotspotId && o.AreaCode.StartsWith(a.AreaCode))
+                .Where((a, o) => a.AnalysisId == dto.AnalysisId)
+                .Where((a, o) => o.CreationTime >= a.StartTime && o.CreationTime <= a.EndTime)
+                 .Where((a, o) => filterTitle.Any(s => o.Title.Contains(s)) == false)
+                .Select((a, o) => o).ToListAsync(cancellationToken);
+            var introductionData = orders.GroupBy(x => x.SourceChannel)
+                .Select(x => new { SourceChannel = x.Key, Num = x.Count(), Rate = Math.Round((x.Count() / (double)orders.Count) * 100, 2) })
+                .OrderByDescending(x => x.Num);
+            var introduction = new { total = orders.Count, data = introductionData };
+            var orderAreas = orders.GroupBy(x => x.AreaCode.Substring(0, 6))
+                .Select(x => new { AreaCode = x.Key, Num = x.Count(), Rate = Math.Round((x.Count() / (double)orders.Count) * 100, 2) })
+                .OrderByDescending(x => x.Num);
+            var areaList = await _systemAreaRepository.Queryable().Where(x => x.Id.Length == 6).ToListAsync(cancellationToken);
+            var areaData = (from t1 in orderAreas
+                            join t2 in areaList on t1.AreaCode equals t2.Id into t1_t2
+                            from item in t1_t2.DefaultIfEmpty()
+                            select new
+                            {
+                                AreaCode = t1.AreaCode,
+                                Num = t1.Num,
+                                Rate = t1.Rate,
+                                AreaName = t1_t2.Select(x => x.AreaName).FirstOrDefault(),
+                            }).OrderByDescending(x => x.Num).ToList();
+            var areaNames = areaData.Select(x => x.AreaName).ToList();
+
+            var area = new { AreaNames = areaNames, data = areaData };
+
+            var handle = new { HandleFiled = orders.Count(x => x.Status >= EOrderStatus.Filed), Handle = orders.Count(x => x.Status < Share.Enums.Order.EOrderStatus.Filed) };
+
+            var first = _mapper.Map<List<OrderDto>>(orders.OrderByDescending(x => x.CreationTime).Take(2).ToList());
+            return new { Analysis = analysis, Introduction = introduction, Area = area, Handle = handle, First = first };
+        }
+
+
+    }
 }

+ 3 - 3
src/Hotline.Application/Snapshot/SnapshotOrderApplication.cs

@@ -215,9 +215,9 @@ public class SnapshotOrderApplication : IOrderSnapshotApplication, IScopeDepende
             .LeftJoin<Order>((snapshot, order) => snapshot.Id == order.Id)
             .LeftJoin<WorkflowStep>((snapshot, order, step) => step.ExternalId == order.Id)
             .Where((snapshot, order, step) => snapshot.IndustryName == "安全隐患")
-            .WhereIF(dto.Status == 0, (snapshot, order, step) => step.Tag == TagDefaults.OrderMark) // 全部
-            .WhereIF(dto.Status == 1, (snapshot, order, step) => step.Tag == TagDefaults.OrderMark && step.Status != EWorkflowStepStatus.Handled && step.HandlerId == _sessionContext.UserId) // 待标记
-            .WhereIF(dto.Status == 2, (snapshot, order, step) => step.Tag == TagDefaults.OrderMark && step.Status == EWorkflowStepStatus.Handled) // 已标记
+            //.WhereIF(dto.Status == 0, (snapshot, order, step) => step.Tag == TagDefaults.OrderMark) // 全部
+            .WhereIF(dto.Status == 1, (snapshot, order, step) => step.Tag == TagDefaults.OrderMark && step.Status != EWorkflowStepStatus.Handled &&  _sessionContext.Roles.Contains(step.RoleId)) // 待标记
+            .WhereIF(dto.Status == 2, (snapshot, order, step) => snapshot.IsSafetyDepartment != null) // 已标记
             .WhereIF(dto.No.NotNullOrEmpty(), (snapshot, order, step) => order.No.Contains(dto.No))
             .WhereIF(dto.Title.NotNullOrEmpty(), (snapshot, order, step) => order.Title.Contains(dto.Title))
             .OrderByDescending((snapshot, order, step) => snapshot.CreationTime)

+ 5 - 0
src/Hotline/Settings/SettingConstants.cs

@@ -780,5 +780,10 @@ namespace Hotline.Settings
         /// 签入是否处理是否有小休
         /// </summary>
         public const string SignInCheckRest = "SignInCheckRest";
+
+        /// <summary>
+        /// 高频预警许排除的工单标题
+        /// </summary>
+        public const string HighMatterWarningFilterTitle = "HighMatterWarningFilterTitle";
     }
 }