Browse Source

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

xf 1 year ago
parent
commit
c9444ff4b3

+ 2 - 1
src/Hotline.Api/Controllers/AiController.cs

@@ -66,6 +66,7 @@ namespace Hotline.Api.Controllers
         [AllowAnonymous]
         public async Task<bool> AccessConfirm([FromQuery]int count) 
         {
+
             //获取是否开启智能语音队列
             bool isAiIvr = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsAIIVR)?.SettingValue[0]);
             if (!isAiIvr)
@@ -73,7 +74,7 @@ namespace Hotline.Api.Controllers
 
             //获取智能语音队列数
             var queueNum = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.QueueNum)?.SettingValue[0]);
-            if (count <= queueNum)
+            if (count < queueNum)
                 return false;
 
             //判断是否在时间段内

+ 149 - 17
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -1,24 +1,23 @@
-using Hotline.Orders;
+using Hotline.Caching.Interfaces;
+using Hotline.CallCenter.Calls;
+using Hotline.FlowEngine.Workflows;
+using Hotline.Orders;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.Order;
-using Microsoft.AspNetCore.Mvc;
-using SqlSugar;
 using Hotline.Share.Requests;
-using XF.Domain.Repository;
-using Hotline.Caching.Interfaces;
-using Hotline.FlowEngine.Workflows;
-using Hotline.Share.Dtos.CallCenter;
 using MapsterMapper;
-using XF.Domain.Exceptions;
 using Microsoft.AspNetCore.Authorization;
-using Hotline.CallCenter.Calls;
-using Hotline.Share.Enums.CallCenter;
-using Org.BouncyCastle.Utilities;
-using Polly.Caching;
+using Microsoft.AspNetCore.Mvc;
+using SharpCompress.Archives;
+using SqlSugar;
+using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 
 namespace Hotline.Api.Controllers.Bi
 {
@@ -34,6 +33,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<OrderSpecial> _orderSpecialRepository;
         private readonly IRepository<OrderVisit> _orderVisitRepository;
         private readonly IRepository<TrCallRecord> _trCallRecordRepository;
+        private readonly IRepository<OrderPublish> _orderPublishRepository;
 
 
         public BiOrderController(
@@ -46,7 +46,8 @@ namespace Hotline.Api.Controllers.Bi
             IRepository<OrderSpecial> orderSpecialRepository,
             IMapper mapper,
             IRepository<OrderVisit> orderVisitRepository,
-            IRepository<TrCallRecord> trCallRecordRepository
+            IRepository<TrCallRecord> trCallRecordRepository,
+            IRepository<OrderPublish> orderPublishRepository
             )
         {
             _orderRepository = orderRepository;
@@ -59,6 +60,7 @@ namespace Hotline.Api.Controllers.Bi
             _mapper = mapper;
             _orderVisitRepository = orderVisitRepository;
             _trCallRecordRepository = trCallRecordRepository;
+            _orderPublishRepository = orderPublishRepository;
         }
 
         /// <summary>
@@ -667,7 +669,7 @@ namespace Hotline.Api.Controllers.Bi
             CenterReportStatisticsDto centerReportStatisticsDto = new();
 
             //信件总量
-            int sourceChannelCount = await _orderRepository.Queryable(false, false, false).Where(p => p.CreationTime >= StartDate && p.CreationTime <= EndDate).CountAsync();
+            int sourceChannelCount = await _orderRepository.Queryable().Where(p => p.CreationTime >= StartDate && p.CreationTime <= EndDate).CountAsync();
 
             #region 通话记录
             //通话记录
@@ -687,7 +689,7 @@ namespace Hotline.Api.Controllers.Bi
 
             #region 工单
             //工单
-            var orderData = await _orderRepository.Queryable(false, false, false)
+            var orderData = await _orderRepository.Queryable()
                 .Where(p => p.CreationTime >= StartDate && p.CreationTime <= EndDate)
                 .Select(x => new CenterReportOrderDto
                 {
@@ -703,7 +705,7 @@ namespace Hotline.Api.Controllers.Bi
 
             #region 信件来源
             //信件来源
-            var sourceChannelData = await _orderRepository.Queryable(false, false, false)
+            var sourceChannelData = await _orderRepository.Queryable()
                 .Where(p => p.CreationTime >= StartDate && p.CreationTime <= EndDate)
                 .Select(it => new
                 {
@@ -919,7 +921,7 @@ namespace Hotline.Api.Controllers.Bi
         }
 
         /// <summary>
-        /// 
+        /// 部门受理类型统计周期--明细列表
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
@@ -936,5 +938,135 @@ namespace Hotline.Api.Controllers.Bi
 
             return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
         }
+
+        /// <summary>
+        /// 部门办件统计表-----未完成
+        /// </summary>
+        /// <param name="StartDate"></param>
+        /// <param name="EndDate"></param>
+        /// <param name="OrgCode"></param>
+        /// <param name="OrgName"></param>
+        /// <returns></returns>
+        [HttpGet("departmental_processing_statistics")]
+        [AllowAnonymous]
+        public async Task<object> DepartmentalProcessingStatistics(DateTime StartDate, DateTime EndDate, string? OrgCode, string? OrgName)
+        {
+
+
+            EndDate = EndDate.AddDays(1).AddSeconds(-1);
+
+            var handeOrgDownNum = 0;
+            if (!string.IsNullOrEmpty(OrgCode) && OrgCode != "001")
+            {
+                handeOrgDownNum = OrgCode.Length + 3;
+            }
+
+            //工单
+            var query = _orderRepository.Queryable()
+                      .Where(it => it.CreationTime >= StartDate && it.CreationTime <= EndDate)
+                      .Select(it => new
+                      {
+                          it.Id,
+                          OrgLevelOneCode = SqlFunc.IIF(it.ActualHandleOrgCode != "001", SqlFunc.Substring(it.ActualHandleOrgCode, 0, 6), it.ActualHandleOrgCode),
+
+                          OrgLevelDownCode = SqlFunc.IIF(!string.IsNullOrEmpty(OrgCode) && OrgCode != "001" && it.ActualHandleOrgCode.Length >= handeOrgDownNum
+                          , SqlFunc.Substring(it.ActualHandleOrgCode, 0, handeOrgDownNum), it.ActualHandleOrgCode),
+
+                          it.ActualHandleOrgCode,
+                          it.Status,//工单状态
+                          it.ExpiredTime,//期满时间
+                          it.ActualHandleTime,//办理时间
+                          it.CounterSignType,//会签
+                      }).MergeTable()
+                      .WhereIF(!string.IsNullOrEmpty(OrgCode) && OrgCode == "001", it => it.OrgLevelOneCode == OrgCode)
+                      .WhereIF(!string.IsNullOrEmpty(OrgCode) && OrgCode != "001", it => it.OrgLevelDownCode.Contains(OrgCode))
+                      .MergeTable()
+                       .Select(it => new DepartmentalProcessingStatisticsDto
+                       {
+                           Id = it.Id,
+                           OrgCode = SqlFunc.IIF(!string.IsNullOrEmpty(OrgCode), it.OrgLevelDownCode, it.OrgLevelOneCode),
+                           ActualHandleOrgCode = it.ActualHandleOrgCode,
+                           Status = it.Status,//工单状态
+                           ExpiredTime = it.ExpiredTime,//期满时间
+                           ActualHandleTime = it.ActualHandleTime,//办理时间
+                           CounterSignType = it.CounterSignType,//会签
+
+                       }).MergeTable();
+
+            //发布
+            var queryPublish = _orderPublishRepository.Queryable()
+                .Where(p => p.CreationTime >= StartDate && p.CreationTime <= EndDate)
+                .GroupBy(it => new
+                {
+                    it.OrderId,
+                    it.PublishState
+                })
+                .Select(it => new DepartmentalProcessingStatisticsDto
+                {
+                    Id = it.OrderId,
+                    PublishState = it.PublishState
+                });
+
+
+            //会签
+            var queryCountersign = _workflowCountersignRepository.Queryable()
+                .LeftJoin<WorkflowCountersignMember>((x, o) => x.Id == o.WorkflowCountersignId)
+                 .Where(x => x.CreationTime >= StartDate && x.CreationTime <= EndDate)
+                .GroupBy((x, o) => o.Key)
+                .Select((x, o) => new OrderBiOrgDataListVo
+                {
+                    OrgId = o.Key,
+                    CounterHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsHandled, 1, 0)),
+                    CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(!o.IsHandled, 1, 0)),
+                }).MergeTable();
+
+
+
+
+
+
+
+            var queryPush = query.LeftJoin(queryPublish, (it, o) => it.Id == o.Id).Where(it => it.OrgCode != null);
+
+
+
+
+
+
+            return await queryPush.GroupBy((it, o) => new
+            {
+                it.OrgCode
+            })
+                      .Select((it, o) => new
+                      {
+                          //办件信息完整
+                          OrgCode = it.OrgCode,
+                          OrderCountNum = SqlFunc.AggregateCount(it.OrgCode),//总量
+                          YBOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF((int)it.Status >= 300, 1, 0)),//已办
+                          ZBOrderCountNum = SqlFunc.AggregateSum(SqlFunc.IIF((int)it.Status < 300, 1, 0)),//在办
+
+
+                          YBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF((int)it.Status >= 300 &&  it.ActualHandleTime > it.ExpiredTime, 1, 0)),//已办超期
+                          ZBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF((int)it.Status < 300 &&  it.ExpiredTime < SqlFunc.GetDate(), 1, 0)),//待办超期
+
+                          HQYBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF((int)it.Status >= 300 && it.CounterSignType != null && it.ActualHandleTime > it.ExpiredTime, 1, 0)),//会签已办超期
+                          HQZBOverdue = SqlFunc.AggregateSum(SqlFunc.IIF((int)it.Status < 300 && it.CounterSignType != null && it.ExpiredTime < SqlFunc.GetDate(), 1, 0)),//会签待办超期
+
+                          //归档完整
+                          Archived = SqlFunc.AggregateSum(SqlFunc.IIF((int)it.Status >= 300, 1, 0)),//已归档
+                          ToBeArchived = 0,//待归档
+
+                          //发布完整
+                          WaitPublished = SqlFunc.AggregateSum(SqlFunc.IIF((int)it.Status == 300, 1, 0)),//待发布  --已归档的就是待发布
+                          PublishedOpen = SqlFunc.AggregateSum(SqlFunc.IIF((int)it.Status >= 400 && o.PublishState, 1, 0)),//已发布公开
+                          PublishedNoOpen = SqlFunc.AggregateSum(SqlFunc.IIF((int)it.Status >= 400 && !o.PublishState, 1, 0)),//已发布不公开
+                      }).ToListAsync();
+
+
+
+
+        }
+
+
     }
 }

+ 25 - 4
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -1,4 +1,5 @@
 using DotNetCore.CAP;
+using Hotline.Ai.Quality;
 using Hotline.Application.CallCenter.Calls;
 using Hotline.Application.Tels;
 using Hotline.Caching.Interfaces;
@@ -6,12 +7,14 @@ using Hotline.CallCenter.Calls;
 using Hotline.CallCenter.Tels;
 using Hotline.Orders;
 using Hotline.Permissions;
+using Hotline.Quality;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Settings;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Share.Enums.CallCenter;
+using Hotline.Share.Enums.Quality;
 using Hotline.Users;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
@@ -45,16 +48,20 @@ namespace Hotline.Api.Controllers
         private readonly ITelRestRepository _telRestRepository;
         private readonly IRepository<User> _userRepository;
         private readonly ITelApplication _telApplication;
+        private readonly IRepository<Quality.Quality> _qualiteyRepository;
+        private readonly IAiQualityService _aiQualityService;
+        private readonly IRepository<QualityTemplate> _qualityTemplate;
 
 
-        public IPPbxController(ITrClient trClient, IMapper mapper, IUserDomainService userDomainService,
+		public IPPbxController(ITrClient trClient, IMapper mapper, IUserDomainService userDomainService,
             ISessionContext sessionContext, IRepository<TrCallRecord> trCallRecordRepository,
             ITrApplication trApplication, IRepository<TrCallEvaluate> trCallRecord,
             ISystemDicDataCacheManager systemDicDataCacheManager, ILogger<IPPbxController> logger,
             IOrderRepository orderRepository, IRepository<OrderVisit> orderVisitRepository,
             IUserCacheManager userCacheManager, ICapPublisher capPublisher,
             ITelRestRepository telRestRepository, IRepository<User> userRepository,
-            ITelApplication telApplication)
+            ITelApplication telApplication, IRepository<Quality.Quality> qualiteyRepository,
+            IAiQualityService aiQualityService, IRepository<QualityTemplate> qualityTemplate)
         {
             _trClient = trClient;
             _mapper = mapper;
@@ -72,7 +79,10 @@ namespace Hotline.Api.Controllers
             _telRestRepository = telRestRepository;
             _userRepository = userRepository;
             _telApplication = telApplication;
-        }
+            _qualiteyRepository = qualiteyRepository;
+            _aiQualityService = aiQualityService;
+            _qualityTemplate = qualityTemplate; 
+		}
 
         #region 添添呼
 
@@ -298,7 +308,18 @@ namespace Hotline.Api.Controllers
             {
                 model.CallOrderType = ECallOrderType.Order;
                 model.ExternalId = order.Id;
-            }
+                // 写入智能质检
+                var teAny = await _qualityTemplate.Queryable()
+	                .LeftJoin<QualityTemplateDetail>((x, d) => x.Id == d.TemplateId)
+	                .LeftJoin<QualityItem>((x, d, i) => d.ItemId == i.Id)
+	                .Where((x, d, i) => i.IsIntelligent == 1)
+                    .Where((x, d, i) => x.Grouping == ETemplateGrouping.Accepted).AnyAsync();
+                if (teAny)
+                {
+	                var quality = await _qualiteyRepository.Queryable().Where(x => x.OrderId == order.Id && x.Source == Share.Enums.Quality.EQualitySource.Accepted).FirstAsync();
+					await _aiQualityService.CreateAiOrderQualityTask(quality, model, order, HttpContext.RequestAborted);
+				}
+			}
             else
             {
                 var orderVisit = await _orderVisitRepository.GetAsync(x => x.CallId == model.CallAccept, HttpContext.RequestAborted);

+ 77 - 32
src/Hotline.Api/Controllers/QualityController.cs

@@ -559,45 +559,90 @@ namespace Hotline.Api.Controllers
 		}
 
 		/// <summary>
-		/// 智能质检结果返回接收 [FromBody] List<AiQualityResultDto> dto
+		/// 智能质检结果返回接收
 		/// </summary>
 		/// <param name="dto"></param>
 		/// <returns></returns>
 		[AllowAnonymous]
 		[HttpPost("AiResult")]
 		[LogFilter("智能质检结果返回接收")]
-		public async Task AiResult() 
+		public async Task AiResult([FromBody] List<AiQualityResultDto> dto) 
 		{
-			Request.EnableBuffering();
-			var sr = new StreamReader(Request.Body);
-			var data = await sr.ReadToEndAsync(HttpContext.RequestAborted);
-			_logger.LogInformation(data);
-			//foreach (var item in dto)
-			//{
-			//	var quality = await _qualitey.GetAsync(item.record_id);
-			//	if (quality is { State: EQualityState.Apply } && item.score_items != null && item.score_items.Any())
-			//	{
-			//		List<QualityDetail> details = new List<QualityDetail>();
-			//		foreach (var item2 in item.score_items)
-			//		{
-			//			if (item2.score > 0)
-			//			{
-			//				QualityDetail detail = new QualityDetail
-			//				{
-			//					QualityId = quality.Id,
-			//					Second = 0,
-			//					Name = item2.name,
-			//					Content = item2.description,
-			//					Intelligent = true,
-			//					Grade = item2.score,
-			//					Check = true,
-			//				};
-			//				details.Add(detail);
-			//			}
-			//		}
-			//		await _qualiteyDetail.AddRangeAsync(details);
-			//	}
-			//}
+			//Request.EnableBuffering();
+			//var sr = new StreamReader(Request.Body);
+			//var data = await sr.ReadToEndAsync(HttpContext.RequestAborted);
+			//_logger.LogInformation(data);
+			foreach (var item in dto)
+			{
+				var quality = await _qualitey.GetAsync(item.record_id);
+				if (quality is { State: EQualityState.Apply } && item.score_items != null && item.score_items.Any())
+				{
+					List<QualityDetail> details = new List<QualityDetail>();
+					foreach (var item2 in item.score_items)
+					{
+						if (item2.score > 0)
+						{
+							var detailsSentence = new List<QualityDetail>();
+							QualityDetail detail = new QualityDetail
+							{
+								QualityId = quality.Id,
+								Second = 0,
+								Name = item2.name,
+								Content = item2.description,
+								Intelligent = true,
+								Grade = item2.score,
+								Check = true,
+							};
+							if (item2?.qualityModels.Count > 0)
+							{
+								foreach (var models  in item2.qualityModels)
+								{
+									if (models?.sentenceResults.Count > 0)
+									{
+										foreach (var sentence in models.sentenceResults)
+										{
+											if (sentence?.index > 0)
+											{
+												var sentenceList = item.trans_data.sentence_list.First(x => x.index == sentence.index);
+												detail.Second = sentenceList.start;
+												detail.EndSecond = sentenceList.end;
+												detail.Content = sentenceList.text;
+												detailsSentence.Add(detail);
+											}
+										}
+									}
+								}
+							}
+							if (item2?.audioAttributes.Count > 0)
+							{
+								foreach (var audio in item2.audioAttributes)
+								{
+									if (audio?.sentenceResults.Count > 0)
+									{
+										foreach (var sentence in audio.sentenceResults)
+										{
+											var sentenceList = item.trans_data.sentence_list.First(x => x.index == sentence.index);
+											detail.Second = sentenceList.start;
+											detail.EndSecond = sentenceList.end;
+											detail.Content = sentenceList.text;
+											detailsSentence.Add(detail);
+										}
+									}
+									
+								}
+							}
+							if (detailsSentence.Count == 0)
+							{
+								details.Add(detail);
+							}
+							else {
+								details.AddRange(detailsSentence);
+							}
+						}
+					}
+					await _qualiteyDetail.AddRangeAsync(details);
+				}
+			}
 		}
 
 		/// <summary>

+ 8 - 2
src/Hotline.Application/Bigscreen/DataScreenRefreshService.cs

@@ -84,7 +84,7 @@ namespace Hotline.Application.Bigscreen
                     }
                     else
                     {
-                        dto.ToYearQoQ = Math.Round(((dto.ToYearCount - beforToYearCount) / (double)beforToYearCount) * 100, 4);
+                        dto.ToYearQoQ = Math.Round(((dto.ToYearCount - beforToYearCount) / (double)beforToYearCount) * 100, 2);
                     }
                     #endregion
 
@@ -94,7 +94,13 @@ namespace Hotline.Application.Bigscreen
 
                 try
                 {
-                    var list = await _orderRepository.Queryable(false, false, false).Where(x => x.Status > EOrderStatus.WaitForAccept && x.Status < EOrderStatus.Filed).ToListAsync();
+                    var list = await _orderRepository
+                        .Queryable(false, false, false)
+                        //.Where(x => x.Status > EOrderStatus.WaitForAccept && x.Status < EOrderStatus.Filed)
+                        .Where(x => x.Status > EOrderStatus.WaitForAccept && x.StartTime.Value.Date == DateTime.Parse("2024-03-14").Date)
+                        .OrderByDescending(x => x.StartTime)
+                        .Take(50)
+                        .ToListAsync();
                     var orderlist = _mapper.Map<List<OrderDto>>(list);
 
                     await realtimeService.OrderHandlingDetailAsync(orderlist, stoppingToken);

+ 0 - 17
src/Hotline.Application/Quality/QualityApplication.cs

@@ -88,23 +88,6 @@ namespace Hotline.Application.Quality
                 List<QualityDetail> details = _mapper.Map<List<QualityDetail>>(model.QualityDetails);
                 await _qualiteyDetail.AddRangeAsync(details, cancellationToken);
             }
-            //受理智能质检
-            if (model.Source == EQualitySource.Accepted) {
-                var teAny = await _qualityTemplate.Queryable()
-                    .LeftJoin<QualityTemplateDetail>((x, d) => x.Id == d.TemplateId)
-                    .LeftJoin<QualityItem>((x, d, i) => d.ItemId == i.Id)
-                    .Where((x, d, i) => i.IsIntelligent == 1).Where((x,d,i)=>x.Grouping == ETemplateGrouping.Accepted).AnyAsync();
-                if (teAny)
-                {
-					var order = await _orderRepository.GetAsync(model.OrderId);
-					if (order != null && !string.IsNullOrEmpty(order.CallId))
-					{
-                        quality.AiQuality = true;
-						var call = await _trCallRecordRepository.GetAsync(x=>x.CallAccept == order.CallId);
-						await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, cancellationToken);
-					}
-				}
-            }
             await _qualityRepository.AddAsync(quality, cancellationToken);
 		}
 

+ 36 - 14
src/Hotline.Share/Dtos/Quality/AiQualityDto.cs

@@ -76,6 +76,7 @@ namespace Hotline.Share.Dtos.Quality
 
 	public class AiQualityResultDto : AiQualitySourceData
 	{
+		public TransData trans_data { get; set; }
 	}
 	public class AiQualitySourceData : AiQualityAnalysisData
 	{
@@ -255,10 +256,20 @@ namespace Hotline.Share.Dtos.Quality
 		/// <summary>
 		/// 质检模型信息
 		/// </summary>
-		public List<qualityModels> quality_models { get; set; }
+		public List<QualityModels> qualityModels { get; set; }
+
+		public List<AudioAttributes> audioAttributes { get; set; }
+	}
+	public class AudioAttributes {
+		public List<SentenceResults> sentenceResults { get; set; }
 	}
 
-	public class qualityModels 
+	public class SentenceResults 
+	{
+		public int index { get; set; }
+	}
+
+	public class QualityModels 
 	{
 		/// <summary>
 		/// 模型UID
@@ -278,29 +289,40 @@ namespace Hotline.Share.Dtos.Quality
 		/// <summary>
 		/// 质检结果
 		/// </summary>
-		public List<SentenceResult> sentence_results { get; set; }
+		public List<SentenceResults> sentenceResults { get; set; }
 	}
-	public class SentenceResult 
+
+	public class TransData
 	{
+		public List<Sentence_List> sentence_list { get; set; }
+	}
+
+	public class Sentence_List 
+	{
+
 		/// <summary>
-		/// 句子INDEX
+		/// 角色
 		/// </summary>
-		public string index { get; set; }
+		public string role { get; set; }
+
 		/// <summary>
-		/// 命中文本
+		/// 开始时间
 		/// </summary>
-		public string hit_text { get; set; }
+		public int start { get; set; }
+
 		/// <summary>
-		/// 短语
+		/// 结束时间
 		/// </summary>
-		public string phrase { get; set; }
+		public int end { get; set; }
+		
 		/// <summary>
-		/// pos_begin
+		/// index
 		/// </summary>
-		public string pos_begin { get; set; }
+		public int index { get; set; }
+
 		/// <summary>
-		/// pos_end
+		/// 内容
 		/// </summary>
-		public string pos_end { get; set; }
+		public string text { get; set; }
 	}
 }

+ 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.58</Version>
+    <Version>1.0.59</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 151 - 0
src/Hotline.Share/Requests/DepartmentalProcessingStatisticsDto.cs

@@ -0,0 +1,151 @@
+using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Order;
+
+namespace Hotline.Share.Requests
+{
+    public class DepartmentalProcessingStatisticsDto
+    {
+        public string Id { get; set; }
+
+        public string OrgCode { get; set; }
+
+        public string ActualHandleOrgCode { get; set; }
+
+        public EOrderStatus? Status { get; set; }
+
+        public DateTime? ExpiredTime { get; set; }
+
+        public DateTime? ActualHandleTime { get; set; }
+
+        public ECounterSignType? CounterSignType { get; set; }
+
+        public bool PublishState { get; set; }
+    }
+
+    public class DepartmentalProcessingStatisticsDataDto
+    {
+        /// <summary>
+        /// 部门Code
+        /// </summary>
+        public string OrgCode { get; set; }
+
+        /// <summary>
+        /// 部门名称
+        /// </summary>
+        public string OrgName { get; set; }
+
+        /// <summary>
+        /// 部门类型
+        /// </summary>
+        public string OrgType { get; set; }
+
+        /// <summary>
+        /// 信件总量
+        /// </summary>
+        public int OrderCountNum { get; set; }
+
+        /// <summary>
+        /// 信件已办总量
+        /// </summary>
+        public int YBOrderCountNum { get; set; }
+
+        /// <summary>
+        /// 信件未办总量
+        /// </summary>
+        public int ZBOrderCountNum { get; set; }
+
+        /// <summary>
+        /// 办结率
+        /// </summary>
+        public double OrderCompletionRate => CalcProportionRate();
+
+
+        /// <summary>
+        /// 已归档
+        /// </summary>
+        public int Archived { get; set; }
+
+        /// <summary>
+        /// 待归档
+        /// </summary>
+       public int ToBeArchived { get; set; }
+
+        /// <summary>
+        /// 待发布  --已归档的就是待发布
+        /// </summary>
+        public int WaitPublished { get; set; }
+
+        /// <summary>
+        /// 已发布公开
+        /// </summary>
+        public int PublishedOpen { get; set; }
+
+        /// <summary>
+        /// 已发布不公开
+        /// </summary>
+        public int PublishedNoOpen { get; set; }
+
+        /// <summary>
+        /// 已办超期
+        /// </summary>
+        public int YBOverdue { get; set; }
+
+        /// <summary>
+        /// 待办超期
+        /// </summary>
+        public int ZBOverdue { get; set; }
+
+        /// <summary>
+        /// 会签已办超期
+        /// </summary>
+        public int HQYBOverdue { get; set; }
+
+        /// <summary>
+        /// 会签待办超期
+        /// </summary>
+        public int HQZBOverdue { get; set; }
+
+        /// <summary>
+        /// 超期件数
+        /// </summary>
+        public int SubtotalOverdue => YBOverdue + ZBOverdue + HQYBOverdue + HQZBOverdue;
+
+        /// <summary>
+        /// 会签超期率
+        /// </summary>
+        public double HQOverdueRate => CalcOverdueRate();
+
+
+
+
+
+
+
+        /// <summary>
+        /// 工单计算办结率
+        /// </summary>
+        /// <returns></returns>
+        public double CalcProportionRate()
+        {
+            if (OrderCountNum != 0 && YBOrderCountNum != 0)
+            {
+                return Math.Round((YBOrderCountNum / (double)OrderCountNum) * 100, 2);
+            }
+            return 0;
+        }
+
+        /// <summary>
+        /// 计算超期率
+        /// </summary>
+        /// <returns></returns>
+        public double CalcOverdueRate()
+        {
+            if (OrderCountNum != 0 && SubtotalOverdue != 0)
+            {
+                return Math.Round((SubtotalOverdue / (double)OrderCountNum) * 100, 2);
+            }
+            return 0;
+        }
+
+    }
+}

+ 8 - 2
src/Hotline/Quality/QualityDetail.cs

@@ -15,10 +15,16 @@ namespace Hotline.Quality
 		public string QualityId { get; set; }
 
 		/// <summary>
-		/// 扣分时间点- 秒
+		/// 开始扣分时间点- 秒
 		/// </summary>
 		[SugarColumn(ColumnDescription = "扣分时间点- 秒")]
-		public int Second { get; set; }
+		public int? Second { get; set; }
+
+		/// <summary>
+		/// 结束扣分时间点- 秒
+		/// </summary>
+		[SugarColumn(ColumnDescription = "扣分时间点- 秒")]
+		public int? EndSecond { get; set; }
 
 		/// <summary>
 		/// 质检项目名称