Browse Source

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

田爽 1 năm trước cách đây
mục cha
commit
e3456b02db

+ 92 - 15
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -7,6 +7,7 @@ using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Bi;
+using Hotline.Share.Dtos.Bigscreen;
 using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.CallCenter;
@@ -1348,45 +1349,44 @@ namespace Hotline.Api.Controllers.Bi
         /// <summary>
         /// 高频来电统计
         /// </summary>
-        /// <param name="StartDate"></param>
-        /// <param name="EndDate"></param>
-        /// <param name="PhoneNum"></param>
+        /// <param name="dto"></param>
         /// <returns></returns>
         [HttpGet("high_frequency_call_statistics")]
-        public async Task<object> HighFrequencyCallStatistics(DateTime? StartDate, DateTime? EndDate, string PhoneNum)
+        public async Task<PagedDto<HighFrequencyCallStatisticsDto>> HighFrequencyCallStatistics([FromQuery] HighFrequencyCallStatisticsRequest dto)
         {
-            if (!StartDate.HasValue || !EndDate.HasValue)
+            if (!dto.StartDate.HasValue || !dto.EndDate.HasValue)
                 throw UserFriendlyException.SameMessage("请选择时间!");
 
+            dto.EndDate = dto.EndDate.Value.AddDays(1).AddSeconds(-1);
             int CallCount = 2;
             var HighFrequencyCallStatistics = _systemSettingCacheManager.GetSetting(SettingConstants.HighFrequencyCallStatistics)?.SettingValue[0];
             if (HighFrequencyCallStatistics != null)
                 CallCount = int.Parse(HighFrequencyCallStatistics);
 
-            EndDate = EndDate.Value.AddDays(1).AddSeconds(-1);
-            var data = await _trCallRecordRepository.Queryable()
+            var (total, items) = await _trCallRecordRepository.Queryable()
                      .LeftJoin<Order>((p, o) => p.ExternalId == o.Id)
-                   .Where((p, o) => p.OverTime >= StartDate && p.OverTime <= EndDate)
+                   .Where((p, o) => p.OverTime >= dto.StartDate && p.OverTime <= dto.EndDate)
                    .Where((p, o) => p.CallOrderType == ECallOrderType.Order)
                    .Where((p, o) => p.ExternalId != null && o.Id != null)
-                    .WhereIF(!string.IsNullOrEmpty(PhoneNum), (p, o) => p.CPN == PhoneNum)
-                   .Select((p, o) => new
+                    .WhereIF(!string.IsNullOrEmpty(dto.PhoneNum), (p, o) => p.CPN == dto.PhoneNum)
+                   .Select((p, o) => new 
                    {
                        p.CPN,
                        p.ExternalId
                    })
                    .MergeTable()
                    .GroupBy(p => p.CPN)
-                   .Select(p => new
+                   .Select(p => new HighFrequencyCallStatisticsDto
                    {
                        Callnum = p.CPN,
                        OrderCountNum = SqlFunc.AggregateCount(p.CPN),//总量
                    })
-                 .MergeTable()
+                  .MergeTable()
                  .Where(p => p.OrderCountNum >= CallCount)
-                 .ToListAsync();
+                 .OrderByDescending(p => p.OrderCountNum)
+                 .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
-            return data;
+            return new PagedDto<HighFrequencyCallStatisticsDto>(total, _mapper.Map<IReadOnlyList<HighFrequencyCallStatisticsDto>>(items));
         }
 
         /// <summary>
@@ -1395,7 +1395,7 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpGet("high_frequency_call_statistics_order_list")]
-        public async Task<PagedDto<OrderDto>> HighFrequencyCallStatisticsOrderList([FromQuery] HighFrequencyCallStatisticsRequest dto)
+        public async Task<PagedDto<OrderDto>> HighFrequencyCallStatisticsOrderList([FromQuery] HighFrequencyCallStatisticsListRequest dto)
         {
             if (!dto.StartDate.HasValue || !dto.EndDate.HasValue)
                 throw UserFriendlyException.SameMessage("请选择时间!");
@@ -1456,5 +1456,82 @@ namespace Hotline.Api.Controllers.Bi
             return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
 
         }
+
+        /// <summary>
+        /// 高频事项预警
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("highmatter-warning")]
+        public async Task<PagedDto<HighMatterWarningDto>> HighMatterWarning([FromQuery] HighMatterWarningRequest dto)
+        {
+            var (total, items) = await _orderRepository.Queryable(false, false, false)
+                .Where(x => x.CreationTime >= dto.StartDate && x.CreationTime <= dto.EndDate)
+                .LeftJoin<SystemArea>((it, o) => it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == o.Id)
+                .WhereIF(dto.AreaCodes.Any(), (it, o) => dto.AreaCodes.Contains(it.AreaCode)) //区域
+                .WhereIF(dto.HotspotIds.Any(), (it, o) => dto.HotspotIds.Contains(it.HotspotId)) //热点类型
+                .WhereIF(dto.AcceptTypeCodes.Any(), (it, o) => dto.AcceptTypeCodes.Contains(it.AcceptTypeCode)) //受理类型
+                .GroupBy((it, o) => new
+                {
+                    it.AcceptTypeCode,
+                    it.AcceptType,
+                    it.HotspotId,
+                    it.HotspotName,
+                    AreaCode = it.AreaCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                    o.AreaName,
+                    o.Id,
+                })
+                .Having((it, o) => SqlFunc.AggregateCount(it.HotspotName) >= 5)
+                .Select((it, o) => new HighMatterWarningDto()
+                {
+                    AcceptTypeCode = it.AcceptTypeCode,
+                    AcceptType = it.AcceptType,
+                    AreaName = o.AreaName,
+                    HotspotName = it.HotspotName,
+                    HotspotId = it.HotspotId,
+                    SumCount = SqlFunc.AggregateCount(it.HotspotName),
+                    Id = SqlFunc.AggregateMin(it.Id),
+                    AreaCode = o.Id
+                })
+                .MergeTable()
+                .LeftJoin<Order>((x, d) => x.Id == d.Id)
+                .Select((x, d) => new HighMatterWarningDto()
+                {
+                    AreaName = x.AreaName,
+                    HotspotName = x.HotspotName,
+                    HotspotId = x.HotspotId,
+                    Title = d.Title,
+                    SumCount = x.SumCount,
+                    Id = d.Id,
+                    AcceptTypeCode = x.AcceptTypeCode,
+                    AcceptType = x.AcceptType,
+                    AreaCode = x.AreaCode
+                })
+                .MergeTable()
+                .OrderByDescending(d => d.SumCount).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
+            return new PagedDto<HighMatterWarningDto>(total, _mapper.Map<IReadOnlyList<HighMatterWarningDto>>(items));
+        }
+
+        /// <summary>
+        /// 高频事项预警明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("highmatter-warning-detail")]
+        public async Task<PagedDto<OrderDto>> HighMatterWarningDetail([FromQuery] HighMatterWarningDetailRequest dto)
+        {
+            var (total, items) = await _orderRepository.Queryable(viewFilter: true)
+            .Includes(x => x.OrderScreens)
+            .Where(d => d.AcceptTypeCode == dto.AcceptTypeCode) //受理类型
+            .Where(d => d.HotspotId == dto.HotspotId) //热点类型
+            .Where(d => d.CreationTime >= dto.StartDate) //受理时间开始
+            .Where(d => d.CreationTime <= dto.EndDate) //受理时间结束
+            .Where(d => d.AreaCode == dto.AreaCode) //区域
+            .OrderByDescending(d => d.CreationTime)
+            .ToPagedListAsync(dto, HttpContext.RequestAborted);
+            return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+        }
+
     }
 }

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

@@ -180,7 +180,8 @@ namespace Hotline.Api.Controllers.Bigscreen
                 AreaCode = AreaCode.Remove(4);
             }
             EndDate = EndDate.AddDays(1).AddSeconds(-1);
-             var list = await _orderRepository.Queryable(false, false, false).Where(x => x.StartTime >= StartDate && x.StartTime <= EndDate && x.AreaCode.StartsWith(AreaCode))
+             var list = await _orderRepository.Queryable(false, false, false)
+                .Where(x => x.StartTime >= StartDate && x.StartTime <= EndDate && x.AreaCode.StartsWith(AreaCode) && !x.HotspotId.StartsWith("18"))
                 .GroupBy(x => new { x.HotspotId, x.HotspotName })
                 .Select(x => new EarlyWarningHotsPotsStatisticsDto()
                 {

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

@@ -637,9 +637,9 @@ public class OrderController : BaseController
         //    x => x.OrderId == orderVisit.OrderId && x.AgainState == EAgainState.DoAgain, HttpContext.RequestAborted);
         var voiceEvaluate = EnumExts.GetDescriptions<EVoiceEvaluate>();
         var seatEvaluate = EnumExts.GetDescriptions<ESeatEvaluate>();
-        var visitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction).Where(x=>x.DicDataValue!="-1");
+        var visitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction).Where(x => x.DicDataValue != "-1");
         var dissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason);
-        var visitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x=>x.DicDataValue!="-1");
+        var visitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x => x.DicDataValue != "-1");
         var callRecord = await _trCallRecordRepository.GetAsync(x => x.CallAccept == orderVisit.CallId);
         var recordingFileUrl = "";
         var recordingBaseAddress = "";
@@ -1174,7 +1174,7 @@ public class OrderController : BaseController
         var setting = _systemSettingCacheManager.GetSetting(SettingConstants.DelayNum);
         if (int.Parse(setting?.SettingValue[0]) != 0)
         {
-            int count = await _orderDelayRepository.CountAsync(x => x.OrderId == delaydto.OrderId && x.ApplyOrgCode== _sessionContext.RequiredOrgId && x.DelayState == EDelayState.Pass);
+            int count = await _orderDelayRepository.CountAsync(x => x.OrderId == delaydto.OrderId && x.ApplyOrgCode == _sessionContext.RequiredOrgId && x.DelayState == EDelayState.Pass);
             if (count >= int.Parse(setting?.SettingValue[0]))
                 throw UserFriendlyException.SameMessage("延期申请已超过系统预定设置,不能申请");
         }
@@ -1251,16 +1251,16 @@ public class OrderController : BaseController
     [HttpGet("delay/{workflowId}/nextsteps")]
     public async Task<NextStepsDto> OrderDelayNextsteps(string workflowId)
     {
-        var workflow = await _workflowRepository.GetAsync(workflowId,HttpContext.RequestAborted);
-        if (workflow!=null)
+        var workflow = await _workflowRepository.GetAsync(workflowId, HttpContext.RequestAborted);
+        if (workflow != null)
         {
-            var orderDelay = await _orderDelayRepository.Queryable().Includes(x=>x.Order).Where(x => x.Id == workflow.ExternalId).FirstAsync(HttpContext.RequestAborted);
-            if (orderDelay!=null)
+            var orderDelay = await _orderDelayRepository.Queryable().Includes(x => x.Order).Where(x => x.Id == workflow.ExternalId).FirstAsync(HttpContext.RequestAborted);
+            if (orderDelay != null)
             {
                 var result = await _workflowApplication.GetNextStepsAsync(workflowId, HttpContext.RequestAborted);
                 if (!orderDelay.Order.IsProvince)
                 {
-                    if(result.Steps.Any(x => x.Value == "省审批"))
+                    if (result.Steps.Any(x => x.Value == "省审批"))
                     {
                         result.Steps.Remove(result.Steps.First(x => x.Value == "省审批"));
                     }
@@ -1307,7 +1307,7 @@ public class OrderController : BaseController
     [HttpGet("delay")]
     public async Task<PagedDto<OrderDelayDto>> DelayList([FromQuery] DelayListDto dto)
     {
-        var (total, items) = await _orderDelayRepository.Queryable(viewFilter:true)
+        var (total, items) = await _orderDelayRepository.Queryable(viewFilter: true)
             .Includes(x => x.Order)
             .Includes(x => x.Workflow)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
@@ -1635,7 +1635,7 @@ public class OrderController : BaseController
                 var result = await _workflowApplication.GetNextStepsAsync(workflowId, HttpContext.RequestAborted);
                 if (!orderScreen.Order.IsProvince)
                 {
-                    if (result.Steps.Any(x=>x.Value == "省审批"))
+                    if (result.Steps.Any(x => x.Value == "省审批"))
                     {
                         result.Steps.Remove(result.Steps.First(x => x.Value == "省审批"));
                     }
@@ -1752,7 +1752,7 @@ public class OrderController : BaseController
                 try
                 {
                     //查询部门所有账号
-                    var userlist = await _userRepository.Queryable().Where(x => x.OrgId == model.OrgId && !string.IsNullOrEmpty(x.PhoneNo) && x.Roles.Any(d=>d.Id== "08dae71e-0eca-4bc4-89fe-7eaefae8a98e")).ToListAsync();
+                    var userlist = await _userRepository.Queryable().Where(x => x.OrgId == model.OrgId && !string.IsNullOrEmpty(x.PhoneNo) && x.Roles.Any(d => d.Id == "08dae71e-0eca-4bc4-89fe-7eaefae8a98e")).ToListAsync();
                     //发送短信
                     foreach (var user in userlist)
                     {
@@ -2121,7 +2121,7 @@ public class OrderController : BaseController
     [HttpGet]
     public async Task<PagedDto<OrderDto>> Query([FromQuery] QueryOrderDto dto)
     {
-        var (total, items) = await _orderRepository.Queryable(viewFilter:true)
+        var (total, items) = await _orderRepository.Queryable(viewFilter: true)
             .Includes(x => x.OrderScreens)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!)) //标题
             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo.Contains(dto.ProvinceNo)) //省本地编号
@@ -2131,7 +2131,7 @@ public class OrderController : BaseController
             .WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
             .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
             .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!)) //转接号码
-            //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
+                                                                                                                  //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
             .WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
             .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
@@ -2235,14 +2235,14 @@ public class OrderController : BaseController
         dto.CountersignId = countersignId;
         dto.CanHandle = order.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgId);
         dto.IsCanDelay = !order.OrderDelays.Any(x => x.DelayState == EDelayState.Examining);
-        if (order.OrderDelays.Any(x=>x.DelayState == EDelayState.Examining && x.ApplyOrgCode == _sessionContext.RequiredOrgId))
+        if (order.OrderDelays.Any(x => x.DelayState == EDelayState.Examining && x.ApplyOrgCode == _sessionContext.RequiredOrgId))
         {
             dto.CanHandle = false;
         }
         dto.IsCanCancelDelay = order.OrderDelays.Any(x => x.DelayState == EDelayState.Examining && x.ApplyOrgCode == _sessionContext.RequiredOrgId);
-        
+
         var delayModel = order.OrderDelays.MaxBy(x => x.AfterDelay);
-        if (delayModel!=null)
+        if (delayModel != null)
         {
             var workFlow = await _workflowRepository.GetAsync(delayModel.WorkflowId);
             switch (delayModel.DelayState)
@@ -2251,24 +2251,24 @@ public class OrderController : BaseController
                     dto.DelayString = "延期状态:审批中  当前节点:" + workFlow?.ActualHandleStepName;
                     break;
                 case EDelayState.Pass:
-                    dto.DelayString = "已延期"+delayModel?.DelayNum + "个" + delayModel?.DelayUnit.GetDescription();
+                    dto.DelayString = "已延期" + delayModel?.DelayNum + "个" + delayModel?.DelayUnit.GetDescription();
                     break;
                 case EDelayState.NoPass:
                     dto.DelayString = "延期状态:拒绝 当前节点:" + workFlow?.ActualHandleStepName;
                     break;
                 case EDelayState.Withdraw:
-                    dto.DelayString = "延期状态:撤销 当前节点:"+ workFlow?.ActualHandleStepName;
+                    dto.DelayString = "延期状态:撤销 当前节点:" + workFlow?.ActualHandleStepName;
                     break;
                 default:
                     break;
             }
-            
+
         }
         else
         {
             dto.DelayString = "";
         }
-        
+
         dto.CanPrevious = canPrevious;
 
         if (dto.FileJson != null && dto.FileJson.Any())
@@ -2387,6 +2387,16 @@ public class OrderController : BaseController
         return await _orderApplication.ReceiveOrderFromExternalAsync(dto, HttpContext.RequestAborted);
     }
 
+    /// <summary>
+    /// 提供ds调用
+    /// </summary>
+    [HttpPost("update-orderfiles")]
+    [AllowAnonymous]
+    public async Task UpdateOrderFilesAnonymous([FromBody] UpdateOrderFilesDto dto)
+    {
+        await _orderApplication.UpdateOrderFilesAnonymousAsync(dto, HttpContext.RequestAborted);
+    }
+
     /// <summary>
     /// 删除工单
     /// </summary>
@@ -2724,10 +2734,11 @@ public class OrderController : BaseController
     /// </summary>
     /// <returns></returns>
     [HttpPost("trigger_average_order")]
-	[AllowAnonymous]
-	public async Task TriggerAverageOrder() {
-       await  _orderDomainService.TriggerAverageOrder(HttpContext.RequestAborted);
-	}
+    [AllowAnonymous]
+    public async Task TriggerAverageOrder()
+    {
+        await _orderDomainService.TriggerAverageOrder(HttpContext.RequestAborted);
+    }
     #endregion
 
     #region 工单待办
@@ -2745,7 +2756,7 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.No.Contains(dto.Keyword) || d.Title.Contains(dto.Keyword))
             .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
             .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => !d.CounterSignType.HasValue)
-            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == true, d => (d.ExpiredTime < DateTime.Now && d.Status< EOrderStatus.Filed) || (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
+            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == true, d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) || (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
             .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false, d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now)//即将超期 未办
             .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
             .Where(x => x.Status != EOrderStatus.BackToProvince)
@@ -2801,21 +2812,21 @@ public class OrderController : BaseController
         var twoSendBack = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.TwoOrgSendBack)?.SettingValue[0]);
         if (oneSendBack || twoSendBack)
         {
-			var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
-			var (currentStep, prevStep,isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
+            var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true, cancellationToken: HttpContext.RequestAborted);
+            var (currentStep, prevStep, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
                 dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, HttpContext.RequestAborted);
             var sendBack = await _orderSendBackAuditRepository.Queryable().Where(x => x.OrderId == workflow.ExternalId && x.State == ESendBackAuditState.Apply).AnyAsync();
             if (sendBack)
-	            throw UserFriendlyException.SameMessage("当前工单已经生成退回记录");
+                throw UserFriendlyException.SameMessage("当前工单已经生成退回记录");
 
             var order = await _orderRepository
-	            .Queryable()
-	            .Includes(d => d.Workflow)
-	            .FirstAsync(d => d.Id == workflow.ExternalId);
+                .Queryable()
+                .Includes(d => d.Workflow)
+                .FirstAsync(d => d.Id == workflow.ExternalId);
             if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行退回!");
             if ((oneSendBack && isOrgToCenter) || (twoSendBack && isSecondToFirstOrgLevel))
             {
-               
+
                 var audit = new OrderSendBackAudit
                 {
                     OrderId = workflow.ExternalId,
@@ -2836,7 +2847,7 @@ public class OrderController : BaseController
                 await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
                 //发送短信TODO
             }
-		}
+        }
         else
         {
             await _workflowApplication.PreviousAsync(dto, HttpContext.RequestAborted);
@@ -3552,8 +3563,8 @@ public class OrderController : BaseController
         var oneCallTime = calls != null && calls.Count() > 0 ? calls[0].CreatedTime : DateTime.Now;
         var lastNum = calls != null && calls.Count() > 0 ? calls.Count() - 1 : -1;
         var lastCallTime = lastNum >= 0 ? calls[lastNum].CreatedTime : DateTime.Now;
-		//工单历史 
-		var oders = await _orderRepository.Queryable().Where(x => x.Contact == phone)
+        //工单历史 
+        var oders = await _orderRepository.Queryable().Where(x => x.Contact == phone)
             .OrderBy(x => x.CreationTime, OrderByType.Desc).ToListAsync();
         var allOrderNum = oders.Count;
         var endOrderNum = oders.Count(x => (int)x.Status >= 300);
@@ -3572,12 +3583,12 @@ public class OrderController : BaseController
         var callBackNum = 0;
         if (callsHistory != null && callsHistory.Any())
         {
-			 allCallNum = callsHistory.Count(x => x.CallDirection == ECallDirection.In);
-			 connectNum = callsHistory.Count(x => x.CallDirection == ECallDirection.In && x.Duration > 0);
-			 callBackNum = callsHistory.Count(x => x.CallDirection == ECallDirection.Out);
-		}
-		//关注诉求
-		var hotspotNames = string.Join(",", oders.Select(x => x.HotspotName).Distinct().Take(5).ToList());
+            allCallNum = callsHistory.Count(x => x.CallDirection == ECallDirection.In);
+            connectNum = callsHistory.Count(x => x.CallDirection == ECallDirection.In && x.Duration > 0);
+            callBackNum = callsHistory.Count(x => x.CallDirection == ECallDirection.Out);
+        }
+        //关注诉求
+        var hotspotNames = string.Join(",", oders.Select(x => x.HotspotName).Distinct().Take(5).ToList());
         var rsp = new
         {
             Citizen = citizen,
@@ -3756,7 +3767,7 @@ public class OrderController : BaseController
             .Includes(x => x.Details, y => y.Order)
             .FirstAsync(x => x.Id == dto.Id);
         return _mapper.Map<RepeatableEventDto>(repeatableEvent);
-	}
+    }
 
     #endregion
 

+ 5 - 0
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -43,5 +43,10 @@ namespace Hotline.Application.Orders
         /// 接收外部平台工单
         /// </summary>
         Task<AddOrderResponse> ReceiveOrderFromExternalAsync(AddOrderDto dto, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 接收外部平台修改工单附件
+        /// </summary>
+        Task UpdateOrderFilesAnonymousAsync(UpdateOrderFilesDto dto, CancellationToken cancellationToken);
     }
 }

+ 19 - 2
src/Hotline.Application/Orders/OrderApplication.cs

@@ -148,7 +148,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         DateTime stTime = DateTime.Now.AddDays(int.Parse(value));
         stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
         DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
-        var (total, items) = await _orderRepository.Queryable(viewFilter:true)
+        var (total, items) = await _orderRepository.Queryable(viewFilter: true)
             .WhereIF(dto.IsProvince.HasValue, x => x.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Title.Contains(dto.Keyword!) || x.No.Contains(dto.Keyword!))
             .Where(x => x.ExpiredTime != null &&
@@ -194,7 +194,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     public async Task<PagedDto<OrderDto>> GetToExpireAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
     {
         DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
-        var (total, items) = await _orderRepository.Queryable(viewFilter:true)
+        var (total, items) = await _orderRepository.Queryable(viewFilter: true)
             .WhereIF(dto.IsProvince.HasValue, x => x.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Title.Contains(dto.Keyword!) || x.No.Contains(dto.Keyword!))
             //.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No == dto.No)
@@ -280,6 +280,23 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
     }
 
+    /// <summary>
+    /// 接收外部平台修改工单附件
+    /// </summary>
+    public async Task UpdateOrderFilesAnonymousAsync(UpdateOrderFilesDto dto, CancellationToken cancellationToken)
+    {
+        if (string.IsNullOrEmpty(dto.Id) && string.IsNullOrEmpty(dto.OrderNo))
+            throw new UserFriendlyException("工单外部编号不能为空");
+
+        var order = await _orderRepository.Queryable()
+              .FirstAsync(d => d.Id == dto.Id || d.No == dto.OrderNo, cancellationToken);
+        if (order != null && dto.Files != null && dto.Files.Any())
+        {
+            order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, "", cancellationToken);
+            await _orderRepository.UpdateAsync(order, cancellationToken);
+        }
+    }
+
 
     #region private
 

+ 34 - 7
src/Hotline.Share/Dtos/Bi/BiOrderDto.cs

@@ -1,20 +1,47 @@
 using Hotline.Share.Requests;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 
 namespace Hotline.Share.Dtos.Bi
 {
-    public record VisitAndOrgSatisfactionDetailDto: PagedRequest
+    public record VisitAndOrgSatisfactionDetailDto : PagedRequest
     {
         public DateTime StartDate { get; set; }
         public DateTime EndDate { get; set; }
         public string OrgCode { get; set; }
         public int TypeId { get; set; }
         public string DateValue { get; set; }
-        
+
         public string? LineNum { get; set; }
     }
+
+    public record HighFrequencyCallStatisticsRequest : PagedRequest
+    {
+        public DateTime? StartDate { get; set; }
+        public DateTime? EndDate { get; set; }
+
+        public string? PhoneNum { get; set; }
+    }
+
+    public record HighMatterWarningRequest : PagedRequest
+    {
+        public DateTime StartDate { get; set; }
+        public DateTime EndDate { get; set; }
+
+        public List<string> HotspotIds { get; set; } = new();
+
+        public List<string> AreaCodes { get; set; } = new();
+
+        public List<string> AcceptTypeCodes { get; set; } = new();
+    }
+
+    public record HighMatterWarningDetailRequest : PagedRequest
+    {
+        public DateTime StartDate { get; set; }
+        public DateTime EndDate { get; set; }
+
+        public string HotspotId { get; set; }
+
+        public string AreaCode { get; set; }
+
+        public string AcceptTypeCode { get; set; }
+    }
 }

+ 15 - 0
src/Hotline.Share/Dtos/Bigscreen/BigscreenDto.cs

@@ -150,6 +150,13 @@ namespace Hotline.Share.Dtos.Bigscreen
         public double SatisfiedRate { get; set; }
     }
 
+    public class HighFrequencyCallStatisticsDto
+    {
+        public string Callnum { get; set; }
+
+        public int OrderCountNum { get; set; }
+    }
+
     public class HighMatterWarningDto
     {
         public string AreaName { get; set; }
@@ -158,9 +165,17 @@ namespace Hotline.Share.Dtos.Bigscreen
 
         public string HotspotName { get; set; }
 
+        public string HotspotId { get; set; }
+
         public int SumCount { get; set; }
 
         public string Id { get; set; }
+
+        public string AcceptTypeCode { get; set; }
+
+        public string AcceptType { get; set; }
+
+        public string AreaCode { get; set; }
     }
 
     public class OrderVisitOrgSatisfactionRankDto

+ 15 - 0
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -701,4 +701,19 @@ namespace Hotline.Share.Dtos.Order
     {
 
     }
+
+    /// <summary>
+    /// 修改工单受理附件
+    /// </summary>
+    public class UpdateOrderFilesDto
+    {
+        public string Id { get; set; }
+
+        public string OrderNo { get; set; }
+
+        /// <summary>
+        /// 附件
+        /// </summary>
+        public List<FileDto> Files { get; set; } = new List<FileDto>();
+    }
 }

+ 1 - 1
src/Hotline.Share/Hotline.Share.csproj

@@ -7,7 +7,7 @@
     <GenerateDocumentationFile>True</GenerateDocumentationFile>
     <NoWarn>$(NoWarn);1591;8618;</NoWarn>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>1.0.63</Version>
+    <Version>1.0.64</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/Hotline.Share/Requests/HighFrequencyCallStatisticsRequest.cs → src/Hotline.Share/Requests/HighFrequencyCallStatisticsListRequest.cs

@@ -2,7 +2,7 @@
 
 namespace Hotline.Share.Requests
 {
-    public record HighFrequencyCallStatisticsRequest : QueryOrderDto
+    public record HighFrequencyCallStatisticsListRequest : QueryOrderDto
     {
         /// <summary>
         /// 查询时间段--开始