Ver código fonte

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

Dun.Jason 4 meses atrás
pai
commit
a6d4610956

+ 112 - 495
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -1911,7 +1911,11 @@ namespace Hotline.Api.Controllers.Bi
                 .Select(o => new CenterReportCallDto
                 {
                     EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.On, 1, 0)),//有效
-                    InvalidCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.NoOn /*&& o.BeginIvrTime.HasValue && o.BeginQueueTime.HasValue && o.BeginRingTime.HasValue*/, 1, 0)), //无效(排除队列挂断和IVR挂断)
+					InTotal = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In, 1, 0)),//呼入总量
+					OutTotal = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.Out, 1, 0)),//呼出总量
+					InConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.AnsweredTime != null, 1, 0)),//呼入接通量
+					OutConnectionQuantity = SqlFunc.AggregateSum(SqlFunc.IIF(o.TelNo != "0" && o.CallDirection == ECallDirection.Out && o.AnsweredTime != null, 1, 0)),//呼出接通量
+					InvalidCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.NoOn /*&& o.BeginIvrTime.HasValue && o.BeginQueueTime.HasValue && o.BeginRingTime.HasValue*/, 1, 0)), //无效(排除队列挂断和IVR挂断)
                     QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.QueueTims > 0 && o.RingTimes == 0 && o.OnState == EOnState.NoOn, 1, 0)), //队列挂断
                     IvrByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.BeginIvrTime.HasValue && !o.BeginQueueTime.HasValue && !o.BeginRingTime.HasValue && o.OnState == EOnState.NoOn, 1, 0)), //IVR挂断
                 })
@@ -1919,7 +1923,7 @@ namespace Hotline.Api.Controllers.Bi
             if (callData != null)
                 callData.InvalidCount = callData.InvalidCount - callData.QueueByeCount - callData.IvrByeCount;
 
-            if (listOld != null && callData != null)
+            if (listOld != null && listOld.Rows.Count > 0 && callData != null)
             {
                 callData.EffectiveCount = callData.EffectiveCount + Convert.ToInt32(listOld.Rows[0]["CallInConn"]);   // 有效
                 callData.InvalidCount = callData.InvalidCount + Convert.ToInt32(listOld.Rows[0]["CallInNotConn"]);    // 无效
@@ -1960,14 +1964,14 @@ namespace Hotline.Api.Controllers.Bi
                 })
                 .FirstAsync();
 
-            if (listOld != null && orderData != null)
+            if (listOld != null && listOld.Rows.Count > 0 && orderData != null)
             {
                 orderData.EffectiveCount = orderData.EffectiveCount + Convert.ToInt32(listOld.Rows[0]["OrderNormalNum"]);   // 有效
                 orderData.InvalidCount = orderData.InvalidCount + Convert.ToInt32(listOld.Rows[0]["OrderInvalidNum"]);      // 无效
                 orderData.CompletedCount = orderData.CompletedCount + Convert.ToInt32(listOld.Rows[0]["OrderEndNum"]);      // 已办
                 orderData.InProgressCount = orderData.InProgressCount + Convert.ToInt32(listOld.Rows[0]["OrderWaitNum"]);   // 在办
             }
-            if (listInfo != null && orderData != null)
+            if (listInfo != null && listOld.Rows.Count > 0 && orderData != null)
             {
                 orderData.CityAccept = orderData.CityAccept + Convert.ToInt32(listInfo.Rows[0]["OrderCityCount"]);           // 市级部门受理
                 orderData.CountyAccept = orderData.CountyAccept + Convert.ToInt32(listInfo.Rows[0]["OrderCountyCount"]);     // 县(区)受理
@@ -1994,7 +1998,7 @@ namespace Hotline.Api.Controllers.Bi
                 })
                 .FirstAsync();
 
-            if (listInfo != null && orderCompletedData != null)
+            if (listInfo != null && listInfo.Rows.Count > 0 && orderCompletedData != null)
             {
                 orderCompletedData.ExpiredTimeCompletedCount = orderCompletedData.ExpiredTimeCompletedCount + Convert.ToInt32(listInfo.Rows[0]["OrderAlready"]) - Convert.ToInt32(listInfo.Rows[0]["CompleteOnTime"]);
                 orderCompletedData.CityExpiredTimeCompletedCount = orderCompletedData.CityExpiredTimeCompletedCount + Convert.ToInt32(listInfo.Rows[0]["CityAlready"]) - Convert.ToInt32(listInfo.Rows[0]["CityCompleteOnTime"]);
@@ -2005,7 +2009,7 @@ namespace Hotline.Api.Controllers.Bi
                 orderCompletedData.CenterCompletedCount = orderCompletedData.CenterCompletedCount + Convert.ToInt32(listInfo.Rows[0]["CenterAlready"]);
             }
 
-            centerReportStatisticsDto.orderCompletedDto = orderCompletedData;
+            centerReportStatisticsDto.OrderCompletedDto = orderCompletedData;
 
             //工单办理时效
             var orderAgingData = await _orderRepository.Queryable()
@@ -2032,7 +2036,7 @@ namespace Hotline.Api.Controllers.Bi
                 })
                 .FirstAsync();
 
-            if (listInfo != null && orderAgingData != null)
+            if (listInfo != null && listInfo.Rows.Count > 0 && orderAgingData != null)
             {
                 orderAgingData.OrderCount = orderAgingData.OrderCount + Convert.ToInt32(listInfo.Rows[0]["AllCount"]);
                 orderAgingData.CompletedAging = orderAgingData.CompletedAging + Convert.ToInt32(listInfo.Rows[0]["OrderWorkTime"]);
@@ -2044,7 +2048,7 @@ namespace Hotline.Api.Controllers.Bi
                 orderAgingData.CenterCompletedAging = orderAgingData.CenterCompletedAging + Convert.ToInt32(listInfo.Rows[0]["CenterWorkTime"]);
             }
 
-            centerReportStatisticsDto.orderAgingDto = orderAgingData;
+            centerReportStatisticsDto.OrderAgingDto = orderAgingData;
             #endregion
 
             #region 信件来源
@@ -2077,13 +2081,14 @@ namespace Hotline.Api.Controllers.Bi
             {
                 sourceChannel.Add(new CenterReportOrderSourceChannelDto
                 {
-                    Name = item.DicDataName,
+					AllCountNum = sourceChannelCount,
+					Name = item.DicDataName,
                     Code = item.DicTypeCode,
                     CountNum = sourceChannelData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0
                 });
             }
 
-            if (listOld != null && sourceChannel != null)
+            if (listOld != null && listOld.Rows.Count > 0 && sourceChannel != null)
             {
                 foreach (var item in sourceChannel)
                 {
@@ -2167,7 +2172,7 @@ namespace Hotline.Api.Controllers.Bi
                 });
             }
 
-            if (listPurOld != null && acceptType != null)
+            if (listPurOld != null && listPurOld.Rows.Count > 0 && acceptType != null)
             {
                 foreach (var item in acceptType)
                 {
@@ -2249,7 +2254,7 @@ namespace Hotline.Api.Controllers.Bi
             centerReportVisitd.CityDissatisfied = data.CityDissatisfied;
             centerReportVisitd.CountyDissatisfied = data.CountyDissatisfied;
 
-            if (listOld != null && centerReportVisitd != null)
+            if (listOld != null && listOld.Rows.Count > 0 && centerReportVisitd != null)
             {
                 centerReportVisitd.Visitd = centerReportVisitd.Visitd + Convert.ToInt32(listOld.Rows[0]["VisitAlreadyNum"]);                    // 已回访
                 centerReportVisitd.WaitVisitd = centerReportVisitd.WaitVisitd + Convert.ToInt32(listOld.Rows[0]["VisitWaitNum"]);               // 待回访
@@ -2257,7 +2262,7 @@ namespace Hotline.Api.Controllers.Bi
                 centerReportVisitd.OrgRate = Math.Round((centerReportVisitd.OrgRate + Convert.ToDouble(listOld.Rows[0]["SatisfactionDepartment"])) / 2, 2);   // 部门满意度
             }
 
-            if (listInfo != null && centerReportVisitd != null)
+            if (listInfo != null && listInfo.Rows.Count > 0 && centerReportVisitd != null)
             {
                 //总体满意率
                 centerReportVisitd.AllRate = Math.Round(centerReportVisitd.AllRate + Convert.ToDouble(listInfo.Rows[0]["SatisfactionRate"]) / 2, 2);
@@ -2465,7 +2470,7 @@ namespace Hotline.Api.Controllers.Bi
                 })
                 .FirstAsync();
 
-            centerReportStatisticsDto.enterpriseOrderDto = enterpriseOrderDto;
+            centerReportStatisticsDto.EnterpriseOrderDto = enterpriseOrderDto;
             var enterpriseOrderDto2 = await _orderVisitDetailRepository.Queryable()
                 .Includes(it => it.OrderVisit, ov => ov.Order)
                 .LeftJoin<SystemOrganize>((it, so) => it.VisitOrgCode == so.Id)
@@ -2483,492 +2488,99 @@ namespace Hotline.Api.Controllers.Bi
                  })
                 .FirstAsync();
 
-            centerReportStatisticsDto.enterpriseOrderDto.VisitdCount = enterpriseOrderDto2.VisitdCount;
-            centerReportStatisticsDto.enterpriseOrderDto.Dissatisfied = enterpriseOrderDto2.Dissatisfied;
-            centerReportStatisticsDto.enterpriseOrderDto.CityDissatisfied = enterpriseOrderDto2.CityDissatisfied;
-            centerReportStatisticsDto.enterpriseOrderDto.CountyDissatisfied = enterpriseOrderDto2.CountyDissatisfied;
-            centerReportStatisticsDto.enterpriseOrderDto.Satisfied = enterpriseOrderDto2.Satisfied;
-            centerReportStatisticsDto.enterpriseOrderDto.CitySatisfied = enterpriseOrderDto2.CitySatisfied;
-            centerReportStatisticsDto.enterpriseOrderDto.CountySatisfied = enterpriseOrderDto2.CountySatisfied;
+            if (enterpriseOrderDto2 != null)
+            {
+				centerReportStatisticsDto.EnterpriseOrderDto.VisitdCount = enterpriseOrderDto2.VisitdCount;
+				centerReportStatisticsDto.EnterpriseOrderDto.Dissatisfied = enterpriseOrderDto2.Dissatisfied;
+				centerReportStatisticsDto.EnterpriseOrderDto.CityDissatisfied = enterpriseOrderDto2.CityDissatisfied;
+				centerReportStatisticsDto.EnterpriseOrderDto.CountyDissatisfied = enterpriseOrderDto2.CountyDissatisfied;
+				centerReportStatisticsDto.EnterpriseOrderDto.Satisfied = enterpriseOrderDto2.Satisfied;
+				centerReportStatisticsDto.EnterpriseOrderDto.CitySatisfied = enterpriseOrderDto2.CitySatisfied;
+				centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied = enterpriseOrderDto2.CountySatisfied;
+			}
 
-            if (listInfo != null && centerReportStatisticsDto.enterpriseOrderDto != null)
+            if (listInfo != null && listInfo.Rows.Count > 0 && centerReportStatisticsDto.EnterpriseOrderDto != null)
             {
                 // 企业办件
-                centerReportStatisticsDto.enterpriseOrderDto.OrderCount = centerReportStatisticsDto.enterpriseOrderDto.OrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseAllCount"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CompletedAging = centerReportStatisticsDto.enterpriseOrderDto.CompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseWorkTime"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CityOrderCount = centerReportStatisticsDto.enterpriseOrderDto.CityOrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCity"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CityCompletedAging = centerReportStatisticsDto.enterpriseOrderDto.CityCompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCityWorkTime"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CountyOrderCount = centerReportStatisticsDto.enterpriseOrderDto.CountyOrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCounty"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CountyCompletedAging = centerReportStatisticsDto.enterpriseOrderDto.CountyCompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCountyWorkTime"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CenterOrderCount = centerReportStatisticsDto.enterpriseOrderDto.CenterOrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCenter"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CenterCompletedAging = centerReportStatisticsDto.enterpriseOrderDto.CenterCompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCenterWorkTime"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.OrderCount = centerReportStatisticsDto.EnterpriseOrderDto.OrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseAllCount"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CompletedAging = centerReportStatisticsDto.EnterpriseOrderDto.CompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseWorkTime"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CityOrderCount = centerReportStatisticsDto.EnterpriseOrderDto.CityOrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCity"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CityCompletedAging = centerReportStatisticsDto.EnterpriseOrderDto.CityCompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCityWorkTime"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CountyOrderCount = centerReportStatisticsDto.EnterpriseOrderDto.CountyOrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCounty"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CountyCompletedAging = centerReportStatisticsDto.EnterpriseOrderDto.CountyCompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCountyWorkTime"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CenterOrderCount = centerReportStatisticsDto.EnterpriseOrderDto.CenterOrderCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCenter"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CenterCompletedAging = centerReportStatisticsDto.EnterpriseOrderDto.CenterCompletedAging + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCenterWorkTime"]);
                 // 企业满意度
-                centerReportStatisticsDto.enterpriseOrderDto.VisitdCount = centerReportStatisticsDto.enterpriseOrderDto.VisitdCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseVisit"]);
-                centerReportStatisticsDto.enterpriseOrderDto.Dissatisfied = centerReportStatisticsDto.enterpriseOrderDto.Dissatisfied + Convert.ToInt32(listInfo.Rows[0]["EnterpriseDisSatisfaction"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CityDissatisfied = centerReportStatisticsDto.enterpriseOrderDto.CityDissatisfied + Convert.ToInt32(listInfo.Rows[0]["CityCount"]) - Convert.ToInt32(listInfo.Rows[0]["CitySatisfactionCount"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CountyDissatisfied = centerReportStatisticsDto.enterpriseOrderDto.CountyDissatisfied + Convert.ToInt32(listInfo.Rows[0]["CountyCount"]) - Convert.ToInt32(listInfo.Rows[0]["CountySatisfactionCount"]);
-                centerReportStatisticsDto.enterpriseOrderDto.Satisfied = centerReportStatisticsDto.enterpriseOrderDto.Satisfied + Convert.ToInt32(listInfo.Rows[0]["AllCount"]) - Convert.ToInt32(listInfo.Rows[0]["SatisfactionCount"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CitySatisfied = centerReportStatisticsDto.enterpriseOrderDto.CitySatisfied + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCitySatisfaction"]);
-                centerReportStatisticsDto.enterpriseOrderDto.CountySatisfied = centerReportStatisticsDto.enterpriseOrderDto.CountySatisfied + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCountySatisfaction"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.VisitdCount = centerReportStatisticsDto.EnterpriseOrderDto.VisitdCount + Convert.ToInt32(listInfo.Rows[0]["EnterpriseVisit"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.Dissatisfied = centerReportStatisticsDto.EnterpriseOrderDto.Dissatisfied + Convert.ToInt32(listInfo.Rows[0]["EnterpriseDisSatisfaction"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CityDissatisfied = centerReportStatisticsDto.EnterpriseOrderDto.CityDissatisfied + Convert.ToInt32(listInfo.Rows[0]["CityCount"]) - Convert.ToInt32(listInfo.Rows[0]["CitySatisfactionCount"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CountyDissatisfied = centerReportStatisticsDto.EnterpriseOrderDto.CountyDissatisfied + Convert.ToInt32(listInfo.Rows[0]["CountyCount"]) - Convert.ToInt32(listInfo.Rows[0]["CountySatisfactionCount"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.Satisfied = centerReportStatisticsDto.EnterpriseOrderDto.Satisfied + Convert.ToInt32(listInfo.Rows[0]["AllCount"]) - Convert.ToInt32(listInfo.Rows[0]["SatisfactionCount"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CitySatisfied = centerReportStatisticsDto.EnterpriseOrderDto.CitySatisfied + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCitySatisfaction"]);
+                centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied = centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied + Convert.ToInt32(listInfo.Rows[0]["EnterpriseCountySatisfaction"]);
             }
 
-            #endregion
-
-            return centerReportStatisticsDto;
+			#endregion
+
+			#region 企业信件分类
+			//信件来源
+			var enterpriseAcceptTypeData = await _orderRepository.Queryable(false, false, false)
+				.Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime && p.IdentityType == EIdentityType.Enterprise)
+				.Select(it => new
+				{
+					AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode),
+					FileOrgIsCenter = it.FileOrgIsCenter.HasValue ? it.FileOrgIsCenter : true,
+					CreationTimeHandleDurationWorkday = it.CreationTimeHandleDurationWorkday.HasValue ? it.CenterToOrgHandleDurationWorkday : 0,
+					CenterToOrgHandleDurationWorkday = it.CenterToOrgHandleDurationWorkday.HasValue ? it.CenterToOrgHandleDurationWorkday : 0,
+				})
+				.MergeTable()//将查询出来的结果合并成一个新表
+				 .GroupBy(temp => new { temp.AcceptTypeCode })//对新表进行分组
+				 .Select(temp => new CenterReportOrderSourceChannelDto
+				 {
+					 Code = temp.AcceptTypeCode,
+					 CountNum = SqlFunc.AggregateCount(temp.AcceptTypeCode),
+					 CompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == true, temp.CreationTimeHandleDurationWorkday, temp.CenterToOrgHandleDurationWorkday))
+				 })
+				 .ToListAsync();
+			List<CenterReportOrderSourceChannelDto> enterpriseAcceptType = new();
+			var enterpriseAcceptTypeDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType);
+			foreach (var item in enterpriseAcceptTypeDic)
+			{
+				enterpriseAcceptType.Add(new CenterReportOrderSourceChannelDto
+				{
+					AllCountNum = sourceChannelCount,
+					Name = item.DicDataName,
+					Code = item.DicTypeCode,
+					CountNum = enterpriseAcceptTypeData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0,
+					CompletedAging = enterpriseAcceptTypeData.Find(p => p.Code == item.DicDataValue)?.CompletedAging ?? 0
+				});
+			}
+
+			if (listPurOld != null && listPurOld.Rows.Count > 0 && enterpriseAcceptType != null)
+			{
+				foreach (var item in enterpriseAcceptType)
+				{
+					if (item.Code == "10")
+						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Consult"]);            // 咨询
+					else if (item.Code == "15")
+						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Suggest"]);            // 建议
+					else if (item.Code == "20")
+						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["SeekHelp"]);           // 求助
+					else if (item.Code == "25")
+						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Praise"]);             // 表扬
+					else if (item.Code == "30")
+						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Report"]);             // 举报
+					else if (item.Code == "35")
+						item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Complaint"]);          // 投诉
+				}
+			}
+
+			centerReportStatisticsDto.EnterpriseCenterReportOrderAcceptTypes = enterpriseAcceptType;
+			#endregion
+
+			return centerReportStatisticsDto;
         }
 
-        /// <summary>
-        /// 中心报表统计--宜宾
-        /// </summary>
-        /// <param name="StartTime"></param>
-        /// <param name="EndTime"></param>
-        /// <returns></returns>
-        [HttpGet("center_report_forms_statistics_v1")]
-        public async Task<CenterReportStatisticsDto> CenterReportFormsStatisticsV1(DateTime StartTime, DateTime EndTime)
-        {
-            CenterReportStatisticsDto centerReportStatisticsDto = new();
-
-            // 查询工单老数据
-            var listOld = await _orderRepository.CenterReportFormsStatistics(StartTime, EndTime);
-            // 查询类型老数据
-            var listPurOld = await _orderRepository.CenterReportPurTypeStatistics(StartTime, EndTime);
-            // 查询部门老数据
-            var listCity = await _orderRepository.CenterReportDepartStatistics(StartTime, EndTime, "市直部门");
-            var listCounty = await _orderRepository.CenterReportDepartStatistics(StartTime, EndTime, "区县部门");
-
-            // 查询老数据详情
-            //var listTest = await _orderRepository.CenterReportNewStatistics(StartTime, EndTime);
-
-            //信件总量
-            int sourceChannelCount = await _orderRepository.Queryable().Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime).CountAsync();
-
-            #region 通话记录
-            //通话记录
-            var callData = await _trCallRecordRepository.Queryable()
-                .Where(p => p.CreatedTime >= StartTime && p.CreatedTime <= EndTime && p.Gateway != "82826886" && SqlFunc.Length(p.Gateway) != 4)
-                .Select(o => new CenterReportCallDto
-                {
-                    EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.On, 1, 0)),//有效
-                    InvalidCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.OnState == EOnState.NoOn /*&& o.BeginIvrTime.HasValue && o.BeginQueueTime.HasValue && o.BeginRingTime.HasValue*/, 1, 0)), //无效(排除队列挂断和IVR挂断)
-                    QueueByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.QueueTims > 0 && o.RingTimes == 0 && o.OnState == EOnState.NoOn, 1, 0)), //队列挂断
-                    IvrByeCount = SqlFunc.AggregateSum(SqlFunc.IIF(o.CallDirection == ECallDirection.In && o.BeginIvrTime.HasValue && !o.BeginQueueTime.HasValue && !o.BeginRingTime.HasValue && o.OnState == EOnState.NoOn, 1, 0)), //IVR挂断
-                })
-                .FirstAsync();
-            if (callData != null)
-                callData.InvalidCount = callData.InvalidCount - callData.QueueByeCount - callData.IvrByeCount;
-
-            if (listOld != null && callData != null)
-            {
-                callData.EffectiveCount = callData.EffectiveCount + Convert.ToInt32(listOld.Rows[0]["CallInConn"]);   // 有效
-                callData.InvalidCount = callData.InvalidCount + Convert.ToInt32(listOld.Rows[0]["CallInNotConn"]);    // 无效
-                callData.QueueByeCount = callData.QueueByeCount + Convert.ToInt32(listOld.Rows[0]["CallInQueue"]);    // 队列挂断
-                callData.IvrByeCount = callData.IvrByeCount + Convert.ToInt32(listOld.Rows[0]["CallInIVR"]);          // IVR挂断
-            }
-
-            centerReportStatisticsDto.CenterReportCall = callData;
-
-            #endregion
-
-            #region 工单
-            //工单
-            var orderData = await _orderRepository.Queryable()
-                .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
-                .Select(x => new CenterReportOrderDto
-                {
-                    EffectiveCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
-                    InvalidCount = 0,
-                    CompletedCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status >= EOrderStatus.Filed, 1, 0)),
-                    InProgressCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Status < EOrderStatus.Filed, 1, 0))
-                })
-                .FirstAsync();
-
-            if (listOld != null && orderData != null)
-            {
-                orderData.EffectiveCount = orderData.EffectiveCount + Convert.ToInt32(listOld.Rows[0]["OrderNormalNum"]);   // 有效
-                orderData.InvalidCount = orderData.InvalidCount + Convert.ToInt32(listOld.Rows[0]["OrderInvalidNum"]);      // 无效
-                orderData.CompletedCount = orderData.CompletedCount + Convert.ToInt32(listOld.Rows[0]["OrderEndNum"]);      // 已办
-                orderData.InProgressCount = orderData.InProgressCount + Convert.ToInt32(listOld.Rows[0]["OrderWaitNum"]);   // 在办
-            }
-
-            centerReportStatisticsDto.CenterReportOrder = orderData;
-            #endregion
-
-            #region 信件来源
-            //信件来源
-            var sourceChannelData = await _orderRepository.Queryable()
-                .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
-                .Select(it => new
-                {
-                    SourceChannelCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.SourceChannelCode), "QT", it.SourceChannelCode)
-                })
-                .MergeTable()//将查询出来的结果合并成一个新表
-                 .GroupBy(it => new { it.SourceChannelCode })//对新表进行分组
-                 .Select(it => new CenterReportOrderSourceChannelDto
-                 {
-                     Code = it.SourceChannelCode,
-                     CountNum = SqlFunc.AggregateCount(it.SourceChannelCode)
-                 })
-                 .ToListAsync();
-            List<CenterReportOrderSourceChannelDto> sourceChannel = new()
-            {
-                new CenterReportOrderSourceChannelDto
-                {
-                    Name = "来源总量",
-                    Code = "All",
-                    CountNum = sourceChannelCount
-                }
-            };
-            var sourceChannelDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SourceChannel);
-            foreach (var item in sourceChannelDic)
-            {
-                sourceChannel.Add(new CenterReportOrderSourceChannelDto
-                {
-                    Name = item.DicDataName,
-                    Code = item.DicDataValue,
-                    CountNum = sourceChannelData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0
-                });
-            }
-
-            if (listOld != null && sourceChannel != null)
-            {
-                foreach (var item in sourceChannel)
-                {
-                    if (item.Code == "All")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromAllNum"]);            //总量
-                    else if (item.Code == "YTW")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromInternet"]);          // 英特网
-                    else if (item.Code == "RGDH")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPhone"]);             // 电话
-                    else if (item.Code == "YBS")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformYBS"]);       // 宜办事
-                    else if (item.Code == "QT")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromOther"]);             // 其他
-                    else if (item.Code == "ZJ")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromSelfBuild"]);         // 自建
-                    else if (item.Code == "WX")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromWeChat"]);            // 微信
-                    else if (item.Code == "WB")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromWeibo"]);             // 微博
-                    else if (item.Code == "AP")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromApp"]);               // APP
-                    else if (item.Code == "ZHYB")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromSmartYibin"]);        // 智慧宜宾
-                    else if (item.Code == "ZZPT")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformZZ"]);        // 综治平台
-                    else if (item.Code == "S12328")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatform12328"]);     // 省12328平台
-                    else if (item.Code == "SZYSM")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromMayorNetizen"]);      // 市长与市民
-                    else if (item.Code == "YBRMT")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformRMT"]);       // 宜宾融媒体
-                    else if (item.Code == "S12345")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformProvince"]);  // 省12345平台
-                    else if (item.Code == "SZMHD")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformZMHD"]);      // 省政民互动
-                    else if (item.Code == "SZHZ")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformSZHZ"]);      // 市州互转
-                    else if (item.Code == "YB110")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatform110"]);       // 宜宾110平台
-                    else if (item.Code == "SMZXBNCS")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformBBCS"]);      // 市民中心办不成事窗口
-                    else if (item.Code == "IYB")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listOld.Rows[0]["FromPlatformIYB"]);       // i宜宾
-                }
-            }
-
-            centerReportStatisticsDto.CenterReportOrderSourceChannels = sourceChannel;
-
-            #endregion
-
-            #region 信件分类
-            //信件来源
-            var acceptTypeData = await _orderRepository.Queryable(false, false, false)
-                .Where(p => p.CreationTime >= StartTime && p.CreationTime <= EndTime)
-                .Select(it => new
-                {
-                    AcceptTypeCode = SqlFunc.IIF(SqlFunc.IsNullOrEmpty(it.AcceptTypeCode), "40", it.AcceptTypeCode)
-                })
-                .MergeTable()//将查询出来的结果合并成一个新表
-                 .GroupBy(it => new { it.AcceptTypeCode })//对新表进行分组
-                 .Select(it => new CenterReportOrderSourceChannelDto
-                 {
-                     Code = it.AcceptTypeCode,
-                     CountNum = SqlFunc.AggregateCount(it.AcceptTypeCode)
-                 })
-                 .ToListAsync();
-            List<CenterReportOrderSourceChannelDto> acceptType = new();
-            var acceptTypeDic = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType);
-            foreach (var item in acceptTypeDic)
-            {
-                acceptType.Add(new CenterReportOrderSourceChannelDto
-                {
-                    AllCountNum = sourceChannelCount,
-                    Name = item.DicDataName,
-                    Code = item.DicDataValue,
-                    CountNum = acceptTypeData.Find(p => p.Code == item.DicDataValue)?.CountNum ?? 0
-                });
-            }
-
-            if (listPurOld != null && acceptType != null)
-            {
-                foreach (var item in acceptType)
-                {
-                    if (item.Code == "10")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Consult"]);            // 咨询
-                    else if (item.Code == "15")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Suggest"]);            // 建议
-                    else if (item.Code == "20")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["SeekHelp"]);           // 求助
-                    else if (item.Code == "25")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Praise"]);             // 表扬
-                    else if (item.Code == "30")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Report"]);             // 举报
-                    else if (item.Code == "35")
-                        item.CountNum = item.CountNum + Convert.ToInt32(listPurOld.Rows[0]["Complaint"]);          // 投诉
-                }
-            }
-
-            centerReportStatisticsDto.CenterReportOrderAcceptTypes = acceptType;
-            #endregion
-
-            #region 信件回访量
-            //信件回访量
-            CenterReportVisitdDto centerReportVisitd = new()
-            {
-                Visitd = await _orderVisitRepository.Queryable()
-              .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime && x.VisitState == EVisitState.Visited).CountAsync(),
-                WaitVisitd = await _orderVisitRepository.Queryable()
-             .Where(x => x.VisitTime >= StartTime && x.VisitTime <= EndTime && x.VisitState != EVisitState.None && x.VisitState != EVisitState.Visited).CountAsync()
-            };
-
-            //部门
-            var listOrg = await _orderVisitDetailRepository.Queryable()
-                .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
-                .Where((it, o) => it.VisitTarget == EVisitTarget.Org && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
-                 .Select((it, o) => new Satisfaction
-                 {
-                     Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
-                     Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 0, 1)),
-                 })
-                .ToListAsync();
-
-            if (listOrg != null && listOrg.Count > 0)
-            {
-                var SatisfiedCount = listOrg[0].Satisfied + listOrg[0].Satisfied;
-                if (SatisfiedCount > 0 && listOrg[0].Satisfied > 0)
-                    centerReportVisitd.OrgRate = Math.Round((listOrg[0].Satisfied / (double)SatisfiedCount) * 100, 2);
-            }
-
-            //if (centerReportVisitd.Visitd > 0 && listOrg != null && listOrg.Count > 0 && listOrg[0].Satisfied > 0)
-            //centerReportVisitd.OrgRate = Math.Round((listOrg[0].Satisfied / (double)centerReportVisitd.Visitd) * 100, 2);
-
-            //坐席
-            var listSet = await _orderVisitDetailRepository.Queryable()
-                .LeftJoin<OrderVisit>((it, o) => it.VisitId == o.Id)
-                .Where((it, o) => it.VisitTarget == EVisitTarget.Seat && o.VisitTime >= StartTime && o.VisitTime <= EndTime && o.VisitState == EVisitState.Visited)
-                .Select((it, o) => new Satisfaction
-                {
-                    Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate == ESeatEvaluate.NoSatisfied, 1, 0)),
-                    Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(it.SeatEvaluate != ESeatEvaluate.NoSatisfied, 1, 0)),
-                }).ToListAsync();
-
-            if (listSet != null && listSet.Count > 0)
-            {
-                var SatisfiedCount = listSet[0].Satisfied + listSet[0].Satisfied;
-                if (SatisfiedCount > 0 && listSet[0].Satisfied > 0)
-                    centerReportVisitd.OrgRate = Math.Round((listSet[0].Satisfied / (double)SatisfiedCount) * 100, 2);
-            }
-
-            //if (centerReportVisitd.Visitd > 0 && listSet != null && listSet.Count > 0 && listSet[0].Satisfied > 0)
-            //    centerReportVisitd.SeatsRate = Math.Round((listSet[0].Satisfied / (double)centerReportVisitd.Visitd) * 100, 2);
-
-            if (listOld != null && centerReportVisitd != null)
-            {
-                centerReportVisitd.Visitd = centerReportVisitd.Visitd + Convert.ToInt32(listOld.Rows[0]["VisitAlreadyNum"]);                    // 已回访
-                centerReportVisitd.WaitVisitd = centerReportVisitd.WaitVisitd + Convert.ToInt32(listOld.Rows[0]["VisitWaitNum"]);               // 待回访
-                centerReportVisitd.SeatsRate = Math.Round((centerReportVisitd.SeatsRate + Convert.ToDouble(listOld.Rows[0]["SatisfactionSeat"])) / 2, 2);      // 坐席满意度
-                centerReportVisitd.OrgRate = Math.Round((centerReportVisitd.OrgRate + Convert.ToDouble(listOld.Rows[0]["SatisfactionDepartment"])) / 2, 2);   // 部门满意度
-            }
-
-            centerReportStatisticsDto.CenterReportVisitd = centerReportVisitd;
-            #endregion
-
-            #region 信件分布情况
-            //市直部门
-
-            var listOrgStatisticsCityAll = await _orderRepository.Queryable()
-                .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
-                .Select(o => new
-                {
-                    OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
-                })
-                .MergeTable()
-                .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
-                 .Where((o, s) => s.OrgType == EOrgType.City || s.OrgType == EOrgType.Province)
-                .GroupBy((o, s) => new
-                {
-                    o.OrgCode,
-                    s.Name
-                })
-                .Select((o, s) => new OrgStatistics
-                {
-                    CountNum = SqlFunc.AggregateCount(o.OrgCode),
-                    OrgCode = o.OrgCode,
-                    OrgName = s.Name
-                }).ToListAsync();
-
-            if (listCity != null && listOrgStatisticsCityAll != null)
-            {
-                var arrOrgCode = "";
-                foreach (var item in listOrgStatisticsCityAll)
-                {
-                    for (int i = 0; i < listCity.Rows.Count; i++)
-                    {
-                        var orgCode1 = item.OrgCode;
-                        var orgCode2 = listCity.Rows[i]["OrgCode"].ToString();
-                        if (orgCode1 == orgCode2)
-                        {
-                            arrOrgCode += "'" + orgCode1 + "',";
-                            item.CountNum = item.CountNum + Convert.ToInt32(listCity.Rows[i]["OrderAllNum"]);
-                        }
-                    }
-                }
-                for (int i = 0; i < listCity.Rows.Count; i++)
-                {
-                    var orgCode = listCity.Rows[i]["OrgCode"].ToString();
-                    if (arrOrgCode.IndexOf("'" + orgCode + "'") == -1)
-                    {
-                        listOrgStatisticsCityAll.Add(
-                        new OrgStatistics
-                        {
-                            OrgCode = listCity.Rows[i]["OrgCode"].ToString(),
-                            OrgName = listCity.Rows[i]["Name"].ToString(),
-                            CountNum = Convert.ToInt32(listCity.Rows[i]["OrderAllNum"])
-                        });
-                    }
-                }
-            }
-
-            centerReportStatisticsDto.OrgStatisticsCityAll = new OrgStatisticsAll
-            {
-                OrgStatistics = listOrgStatisticsCityAll
-            };
-
-            //区县部门
-            var listOrgStatisticsAreaAll = await _orderRepository.Queryable()
-                .Where(o => o.CreationTime >= StartTime && o.CreationTime <= EndTime)
-                .Select(o => new
-                {
-                    OrgCode = o.ActualHandleOrgCode == null || o.ActualHandleOrgCode == "" ? "001" : o.ActualHandleOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
-                })
-                .MergeTable()
-                .LeftJoin<SystemOrganize>((o, s) => o.OrgCode == s.Id)
-                 .Where((o, s) => s.OrgType == EOrgType.County)
-                .GroupBy((o, s) => new
-                {
-                    o.OrgCode,
-                    s.Name
-                })
-                .Select((o, s) => new OrgStatistics
-                {
-                    CountNum = SqlFunc.AggregateCount(o.OrgCode),
-                    OrgCode = o.OrgCode,
-                    OrgName = s.Name
-                }).ToListAsync();
-
-            if (listCounty != null && listOrgStatisticsAreaAll != null)
-            {
-                var arrOrgCode = "";
-                foreach (var item in listOrgStatisticsAreaAll)
-                {
-                    for (int i = 0; i < listCounty.Rows.Count; i++)
-                    {
-                        var orgCode1 = item.OrgCode;
-                        var orgCode2 = listCounty.Rows[i]["OrgCode"].ToString();
-                        if (orgCode1 == orgCode2)
-                        {
-                            arrOrgCode += "'" + orgCode1 + "',";
-                            item.CountNum = item.CountNum + Convert.ToInt32(listCounty.Rows[i]["OrderAllNum"]);
-                        }
-                    }
-                }
-                for (int i = 0; i < listCounty.Rows.Count; i++)
-                {
-                    var orgCode = listCounty.Rows[i]["OrgCode"].ToString();
-                    if (arrOrgCode.IndexOf("'" + orgCode + "'") == -1)
-                    {
-                        listOrgStatisticsAreaAll.Add(
-                        new OrgStatistics
-                        {
-                            OrgCode = listCounty.Rows[i]["OrgCode"].ToString(),
-                            OrgName = listCounty.Rows[i]["Name"].ToString(),
-                            CountNum = Convert.ToInt32(listCounty.Rows[i]["OrderAllNum"])
-                        });
-                    }
-                }
-            }
-
-            centerReportStatisticsDto.OrgStatisticsAreaAll = new OrgStatisticsAll
-            {
-                OrgStatistics = listOrgStatisticsAreaAll
-            };
-            #endregion
-
-            #region 企业服务办件情况
-            var enterpriseOrderDto = await _orderRepository.Queryable()
-                .LeftJoin<SystemOrganize>((x, so) => x.ActualHandleOrgCode == so.Id)
-                .Where((x, so) => x.CreationTime >= StartTime && x.CreationTime <= EndTime && x.IdentityType == EIdentityType.Enterprise)
-                .Select((x, so) => new
-                {
-                    FileOrgIsCenter = x.FileOrgIsCenter.Value,
-                    CreationTimeHandleDurationWorkday = x.CreationTimeHandleDurationWorkday.HasValue ? x.CreationTimeHandleDurationWorkday : 0,
-                    CenterToOrgHandleDurationWorkday = x.CenterToOrgHandleDurationWorkday.HasValue ? x.CenterToOrgHandleDurationWorkday : 0,
-                    OrgType = so.OrgType
-                })
-                .MergeTable()
-                .Select(temp => new EnterpriseOrderDto
-                {
-                    OrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
-                    CompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter, temp.CreationTimeHandleDurationWorkday, temp.CenterToOrgHandleDurationWorkday)),
-                    CityOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.City, 1, 0)),//市级
-                    CityCompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.City, temp.CenterToOrgHandleDurationWorkday, 0)),
-                    CountyOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.County, 1, 0)),//区县
-                    CountyCompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter == false && temp.OrgType == EOrgType.County, temp.CenterToOrgHandleDurationWorkday, 0)),
-                    CenterOrderCount = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter, 1, 0)),//中心
-                    CenterCompletedAging = SqlFunc.AggregateSum(SqlFunc.IIF(temp.FileOrgIsCenter, temp.CreationTimeHandleDurationWorkday, 0)),
-                })
-                .FirstAsync();
-
-            centerReportStatisticsDto.enterpriseOrderDto = enterpriseOrderDto;
-            var enterpriseOrderDto2 = await _orderVisitDetailRepository.Queryable()
-                .Includes(it => it.OrderVisit, ov => ov.Order)
-                .LeftJoin<SystemOrganize>((it, so) => it.VisitOrgCode == so.Id)
-                .Where((it, so) => it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitTime >= StartTime && it.OrderVisit.VisitTime <= EndTime && it.OrderVisit.VisitState == EVisitState.Visited)
-                .GroupBy((it, so) => it.Id)
-                 .Select((it, so) => new EnterpriseOrderDto
-                 {
-                     VisitdCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
-                     Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
-                     Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
-                     CityDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2")) && so.OrgType == EOrgType.City, 1, 0)),
-                     CitySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2") && so.OrgType == EOrgType.City, 1, 0)),
-                     CountyDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2")) && so.OrgType == EOrgType.County, 1, 0)),
-                     CountySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2") && so.OrgType == EOrgType.County, 1, 0)),
-                 })
-                .FirstAsync();
-
-            centerReportStatisticsDto.enterpriseOrderDto.VisitdCount = enterpriseOrderDto2.VisitdCount;
-            centerReportStatisticsDto.enterpriseOrderDto.Dissatisfied = enterpriseOrderDto2.Dissatisfied;
-            centerReportStatisticsDto.enterpriseOrderDto.CityDissatisfied = enterpriseOrderDto2.CityDissatisfied;
-            centerReportStatisticsDto.enterpriseOrderDto.CountyDissatisfied = enterpriseOrderDto2.CountyDissatisfied;
-            centerReportStatisticsDto.enterpriseOrderDto.Satisfied = enterpriseOrderDto2.Satisfied;
-            centerReportStatisticsDto.enterpriseOrderDto.CitySatisfied = enterpriseOrderDto2.CitySatisfied;
-            centerReportStatisticsDto.enterpriseOrderDto.CountySatisfied = enterpriseOrderDto2.CountySatisfied;
-
-            #endregion
-
-            return centerReportStatisticsDto;
-        }
 
         /// <summary>
         /// 中心报表统计--自贡
@@ -4792,11 +4404,16 @@ namespace Hotline.Api.Controllers.Bi
 
             var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted);
             var definition = wfModule.Definition;
+            var attitudeType = EnumExts.GetDescriptions<EAttitudeType>();
+            if (_appOptions.Value.IsZiGong == false)
+            {
+                attitudeType = attitudeType.Where(m => new int[] { 2 }.Contains(m.Key) == false).ToList();
+            }
             return new Dictionary<string, dynamic>
             {
                 { "visitSatisfaction", _systemDicDataCacheManager.GetVisitSatisfaction() },
                 { "orgsOptions", items },
-                { "attitudeType", EnumExts.GetDescriptions<EAttitudeType>() },
+                { "attitudeType", attitudeType},
                 { "visitType",EnumExts.GetDescriptions<EVisitType>() },
                 { "channelOptions",_sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.SourceChannel) },
                 { "acceptTypeOptions",_sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType)},
@@ -5936,7 +5553,7 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("query_order_ts_details_list/export")]
-        public async Task<FileStreamResult> ExportQueryOrderTsDetailsList([FromQuery] ExportExcelDto<PagedKeywordRequest> dto)
+        public async Task<FileStreamResult> ExportQueryOrderTsDetailsList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
         {
             var query = _orderApplication.QueryOrderTsDetailsList(dto.QueryDto);
 
@@ -5998,7 +5615,7 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("query_knowledge_quote_list/export")]
-        public async Task<FileStreamResult> ExportQueryKnowledgeQuoteList([FromQuery] ExportExcelDto<PagedKeywordRequest> dto)
+        public async Task<FileStreamResult> ExportQueryKnowledgeQuoteList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
         {
             var query = _orderApplication.QueryKnowledgeQuoteList(dto.QueryDto);
 

+ 2 - 2
src/Hotline.Api/Controllers/FileController.cs

@@ -219,7 +219,7 @@ namespace Hotline.Api.Controllers
                 throw UserFriendlyException.SameMessage("请选择需要删除的数据");
             foreach (var item in Ids)
             {
-                await _uploadAudioFilesRepository.RemoveAsync(p => p.Id == item, true, HttpContext.RequestAborted);
+                await _uploadAudioFilesRepository.RemoveAsync(p => p.Id == item, false, HttpContext.RequestAborted);
             }
         }
 
@@ -247,7 +247,7 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("getaudiofileslist/export")]
-        public async Task<FileStreamResult> ExportGetAudioFilesList([FromQuery] ExportExcelDto<PagedKeywordRequest> dto)
+        public async Task<FileStreamResult> ExportGetAudioFilesList([FromBody] ExportExcelDto<PagedKeywordRequest> dto)
         {
             var query = _uploadAudioFilesRepository.Queryable()
                 .Where(p => p.CreationTime >= dto.QueryDto.StartTime && p.CreationTime <= dto.QueryDto.EndTime)

+ 13 - 0
src/Hotline.Api/Controllers/OrderController.cs

@@ -3357,6 +3357,10 @@ public class OrderController : BaseController
         var delayModel = order.OrderDelays.MaxBy(x => x.CreationTime);
         if (delayModel != null)
         {
+            if (delayModel.IsProDelay)
+            {
+                dto.ProvinceDelayString = "该工单已向省平台发送延期申请!延期状态:" + delayModel.DelayState.GetDescription();
+            }
             var workFlow = await _workflowRepository.GetAsync(delayModel.WorkflowId);
             switch (delayModel.DelayState)
             {
@@ -3379,6 +3383,7 @@ public class OrderController : BaseController
         else
         {
             dto.DelayString = "";
+            dto.ProvinceDelayString = "";
         }
 
         //dto.CanPrevious = canPrevious;
@@ -3487,6 +3492,14 @@ public class OrderController : BaseController
             dto.ProvinceRevokeString = "该工单已由省平台发送撤单!请直接归档办理!";
         }
 
+        //省甄别
+        var orderScreen = await _orderScreenRepository.Queryable().Where(x => x.OrderId == order.Id && x.IsProScreen == true).OrderByDescending(x => x.CreationTime)
+                 .FirstAsync();
+        if (orderScreen != null)
+        {
+            dto.ProvinceScreenString = "该工单已向省平台发送甄别申请!甄别状态:" + orderScreen.Status.GetDescription();
+        }
+
         //终止
         var orderTerminateList = await _orderTerminateRepository.Queryable().Where(x => x.OrderId == order.Id).ToListAsync();
         dto.OrderTerminateStatus = orderTerminateList.Any(x => x.Status == ETerminateStatus.End) ? "同意" :

+ 1 - 0
src/Hotline.Api/Controllers/OrderTerminateController.cs

@@ -199,6 +199,7 @@ namespace Hotline.Api.Controllers
 			else
 				model.FileJson = new List<Share.Dtos.File.FileJson>();
 
+			model.Status = ETerminateStatus.Approval;
 			model.Content = dto.Data.Content;
 			model.IsRecommit = true;
 			await _orderTerminateRepository.UpdateAsync(model, HttpContext.RequestAborted);

+ 103 - 29
src/Hotline.Api/Controllers/PlanController.cs

@@ -12,6 +12,9 @@ using Hotline.Share.Tools;
 using Hotline.Share.Enums.Planlibrary;
 using Hotline.Application.ExportWord;
 using Hotline.Application.Tools;
+using Hotline.KnowledgeBase;
+using Hotline.Share.Dtos.Knowledge;
+using System.Data;
 
 namespace Hotline.Api.Controllers
 {
@@ -129,6 +132,30 @@ namespace Hotline.Api.Controllers
 
         #region 预案库管理
 
+        /// <summary>
+        /// 预案库分类列表
+        /// </summary>
+        /// <param name="IsEnable"></param>
+        /// <returns></returns>
+        [HttpGet("list/treelist")]
+        public async Task<List<PlanTypeDto>> QueryAllPlanTypeTreeList(bool? IsEnable)
+        {
+            return await _planTypeRepository.Queryable()
+                .WhereIF(IsEnable.HasValue, x => x.IsEnable == IsEnable)
+                .Where(x => SqlFunc.Subqueryable<PlanTypeOrg>().Where(to => to.TypeId == x.Id).Any() ||
+                SqlFunc.Subqueryable<PlanTypeOrg>().Where(to => to.TypeId == x.Id).NotAny()
+                )
+                .Select(x => new PlanTypeDto()
+                {
+                    Id = x.Id.SelectAll(),
+                    PlanNum = SqlFunc.Subqueryable<PlanRelationType>().LeftJoin<PlanList>((kr, k) => kr.PlanId == k.Id)
+                         .Where((kr, k) => kr.PlanTypeSpliceName.StartsWith(x.SpliceName))
+                         .DistinctCount(kr => kr.PlanId)
+                }
+                )
+                .OrderBy(x => x.Sort).ToTreeAsync(it => it.children, it => it.ParentId, null, it => it.Id);
+        }
+
         /// <summary>
         /// 预案库列表
         /// </summary>
@@ -146,14 +173,39 @@ namespace Hotline.Api.Controllers
         /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPost("list/draft")]
-        public async Task<string> AddPlanDraft([FromBody] AddPlanListDto dto)
+        public async Task<string> PlanDraft([FromBody] AddPlanListDto dto)
         {
-            dto.Status = EPlanStatus.Drafts;
+            dto.Status = EPlanStatus.NewDrafts;
             return await _planApplication.AddPlanAsync(dto, HttpContext.RequestAborted);
         }
 
         /// <summary>
-        /// 预案库新增
+        /// 预案库草稿修改
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPut("list/draftupdate")]
+        public async Task UpdatePlanDraft([FromBody] UpdatePlanListDto dto)
+        {
+            dto.Status = EPlanStatus.NewDrafts;
+            await _planApplication.UpdatePlanAsync(dto, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 预案库草稿上架到审核
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpPut("list/draftadd")]
+        public async Task AddPlanDraft([FromBody] UpdatePlanListDto dto)
+        {
+            dto.ApplyStatus = EPlanApplyStatus.Add;
+            dto.Status = EPlanStatus.Auditing;
+            await _planApplication.UpdatePlanAsync(dto, HttpContext.RequestAborted);
+        }
+
+        /// <summary>
+        /// 预案库新增到审核
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
@@ -166,7 +218,7 @@ namespace Hotline.Api.Controllers
         }
 
         /// <summary>
-        /// 预案库编辑
+        /// 预案库编辑提交到审核
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
@@ -183,7 +235,7 @@ namespace Hotline.Api.Controllers
         /// </summary>
         /// <param name="Id">预案库ID</param>
         /// <returns></returns>
-        [HttpPut("list/offshelf")]
+        [HttpGet("list/offshelf/{Id}")]
         public async Task OffshelfPlan(string Id)
         {
             UpdatePlanListDto dto = new UpdatePlanListDto();
@@ -191,29 +243,28 @@ namespace Hotline.Api.Controllers
             dto.ApplyStatus = EPlanApplyStatus.Offshelf;
             dto.Status = EPlanStatus.Auditing;
 
-            await _planApplication.UpdatePlanAsync(dto, HttpContext.RequestAborted);
+            await _planApplication.AuditPlanAsync(dto, HttpContext.RequestAborted);
         }
 
         /// <summary>
         /// 预案库审核(新增、修改、下架)
         /// </summary>
-        /// <param name="Id">预案库ID</param>
-        /// <param name="state">0不通过 1通过</param>
+        /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPut("list/examin")]
-        public async Task ExaminPlan(string Id, int state)
+        public async Task ExaminPlan([FromBody] AuditPlanListDto dto)
         {
-            var plan = await _planListRepository.GetAsync(Id);
+            var plan = await _planListRepository.GetAsync(dto.Id);
             if (plan == null)
                 throw UserFriendlyException.SameMessage("预案库查询失败");
 
             var planDto = _mapper.Map<UpdatePlanListDto>(plan);
 
-            if (state == 0)
+            if (dto.State == 0)
             {//不同意
-                planDto.Status = EPlanStatus.Drafts;
+                planDto.Status = EPlanStatus.Revert;
             }
-            else if (state == 1)
+            else if (dto.State == 1)
             {//同意 
                 if (planDto.ApplyStatus == EPlanApplyStatus.Add)
                 {
@@ -222,63 +273,63 @@ namespace Hotline.Api.Controllers
                 if (planDto.ApplyStatus == EPlanApplyStatus.Update)
                 {
                     planDto.Status = EPlanStatus.OnShelf;
+                    planDto.UpdateTime = DateTime.Now;
                 }
                 if (planDto.ApplyStatus == EPlanApplyStatus.Offshelf)
                 {
                     planDto.Status = EPlanStatus.OffShelf;
                 }
             }
-            planDto.Id = Id;
+            planDto.Id = dto.Id;
             planDto.ExaminTime = DateTime.Now;
             planDto.ExaminManId = _sessionContext.UserId;
             planDto.ExaminOrganizeId = _sessionContext.OrgId;
 
-            await _planApplication.UpdatePlanAsync(planDto, HttpContext.RequestAborted);
+            await _planApplication.AuditPlanAsync(planDto, HttpContext.RequestAborted);
         }
 
         /// <summary>
         /// 预案库详情
         /// </summary>
-        /// <param name="Id">预案库ID</param>
-        /// <param name="IsAddPv">默认不增加,false不增加,true增加浏览量</param>
+        /// <param name="dto"></param>
         /// <returns></returns>
-        [HttpGet("list/info/{Id}")]
-        public async Task<PlanInfoDto> GetPlan(string Id, bool? IsAddPv)
+        [HttpGet("list/info")]
+        public async Task<PlanInfoDto> GetPlan([FromBody] PvPlanListDto dto)
         {
-            return await _planApplication.GetPlanAsync(Id, IsAddPv, HttpContext.RequestAborted);
+            return await _planApplication.GetPlanAsync(dto.Id, dto.IsAddPv, HttpContext.RequestAborted);
         }
 
         /// <summary>
         /// 预案库评分
         /// </summary>
-        /// <param name="Id">预案库ID</param>
-        /// <param name="Score">评分</param>
+        /// <param name="dto"></param>
         /// <returns></returns>
         [HttpPut("list/score")]
-        public async Task ScorePlan(string Id, decimal Score)
+        public async Task ScorePlan([FromBody] PvPlanListDto dto)
         {
-            var collect = await _planCollectRepository.GetAsync(x => x.PlanId == Id && x.CreatorId == _sessionContext.UserId);
+            var collect = await _planCollectRepository.GetAsync(x => x.PlanId == dto.Id && x.CreatorId == _sessionContext.UserId);
             if (collect != null)
             {
                 if (collect.Score > 0)
                     throw UserFriendlyException.SameMessage("当前知识已经评分");
 
-                collect.Score = Score;
+                collect.Score = dto.Score;
                 await _planCollectRepository.UpdateAsync(collect, HttpContext.RequestAborted);
             }
             else
             {
-                collect.PlanId = Id;
-                collect.Score = Score;
+                collect = new PlanCollect();
+                collect.PlanId = dto.Id;
+                collect.Score = dto.Score;
                 await _planCollectRepository.AddAsync(collect, HttpContext.RequestAborted);
             }
 
             //计算总分
-            var sugar = _planCollectRepository.Queryable().Where(x => x.PlanId == Id);
+            var sugar = _planCollectRepository.Queryable().Where(x => x.PlanId == dto.Id);
             var count = await sugar.CountAsync();
             var collects = await sugar.SumAsync(x => x.Score);
             var scoreTemp = collects / count;
-            var plan = await _planListRepository.GetAsync(x => x.Id == Id);
+            var plan = await _planListRepository.GetAsync(x => x.Id == dto.Id);
             if (plan != null)
             {
                 plan.Score = decimal.Round(scoreTemp.Value, 1);
@@ -324,5 +375,28 @@ namespace Hotline.Api.Controllers
 
         #endregion
 
+        #region 预案库检索
+
+        /// <summary>
+        /// 预案库列表前10
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("list/top10")]
+        public async Task<List<PlanPageViewDto>> QueryTop10PlanList()
+        {
+            return await _planListRepository.Queryable()
+                .Take(10)
+                .Where(x => x.Status == EPlanStatus.OnShelf)
+                .Select(x => new PlanPageViewDto
+                {
+                    Id = x.Id,
+                    Title = x.Title,
+                    PageView = x.PageView
+                })
+                .OrderBy(x => x.PageView, OrderByType.Desc)
+                .ToListAsync();
+        }
+
+        #endregion
     }
 }

+ 5 - 1
src/Hotline.Api/StartupExtensions.cs

@@ -234,7 +234,11 @@ internal static class StartupExtensions
         if (swaggerEnable)
         {
             app.UseSwagger();
-            app.UseSwaggerUI();
+            app.UseSwaggerUI(options =>
+            {
+                options.DefaultModelsExpandDepth(1);
+                options.DefaultModelExpandDepth(5);
+            });
             //app.UseSwaggerUI(c =>
             //{
             //    //c.DocExpansion(DocExpansion.None);

+ 10 - 0
src/Hotline.Application/Orders/OrderApplication.cs

@@ -1876,6 +1876,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     NoSatisfiedCount = it.NoSatisfiedCount, //不满意
                     NoEvaluateCount = it.NoEvaluateCount, //未做评价
                     NoPutThroughCount = it.NoPutThroughCount, //未接通
+                    NormalCount=it.NormalCount,
+                    VeryNoSatisfiedCount=it.VeryNoSatisfiedCount
                 })
                 .ToListAsync();
         }
@@ -3454,6 +3456,14 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         {
             order = _mapper.Map<Order>(dto);
             order.InitId();
+            if (!string.IsNullOrEmpty(order.AcceptTypeCode))
+            { 
+                var acceptModel = _sysDicDataCacheManager.AcceptType.Where(x => x.DicDataValue == order.AcceptTypeCode).FirstOrDefault();
+                if (acceptModel != null)
+                {
+                    order.AcceptType = acceptModel.DicDataName;
+                }
+            }
             if (order.IsSecret == true)
             {
                 order.FocusOnEventsName = "保密";

+ 7 - 0
src/Hotline.Application/Planlibrary/IPlanApplication.cs

@@ -54,6 +54,13 @@ namespace Hotline.Application.Planlibrary
         /// <returns></returns>
         Task UpdatePlanAsync(UpdatePlanListDto dto, CancellationToken cancellationToken);
 
+        /// <summary>
+        ///预案库类型 - 下架审核
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task AuditPlanAsync(UpdatePlanListDto dto, CancellationToken cancellationToken);
+
         /// <summary>
         ///预案库类型 - 详情
         /// </summary>

+ 52 - 16
src/Hotline.Application/Planlibrary/PlanApplication.cs

@@ -14,6 +14,10 @@ using Hotline.File;
 using Hotline.Application.Bulletin;
 using Hotline.Share.Tools;
 using Hotline.Application.Tools;
+using Hotline.KnowledgeBase;
+using NPOI.SS.Formula.Functions;
+using SqlSugar;
+using Senparc.CO2NET.Extensions;
 
 namespace Hotline.Application.Planlibrary
 {
@@ -177,10 +181,10 @@ namespace Hotline.Application.Planlibrary
         /// <returns></returns>
         public async Task<(int, IList<PlanDataDto>)> QueryAllPlanListAsync(PlanListDto pagedDto, CancellationToken cancellationToken)
         {
-            if (!_sessionContext.OrgIsCenter)
-            {// 部门只能查询【部门预案库】
-                pagedDto.Attribution = "部门预案库";
-            }
+            //if (!_sessionContext.OrgIsCenter)
+            //{// 部门只能查询【部门预案库】
+            //    pagedDto.Attribution = "部门预案库";
+            //}
 
             var typeSpliceName = string.Empty;
             var hotspotHotSpotFullName = string.Empty;
@@ -199,8 +203,8 @@ namespace Hotline.Application.Planlibrary
 
             //单表分页
             var (total, temp) = await _planListRepository.Queryable()
-                //.Includes(x => x.PlanTypes)
-
+                .Includes(x => x.PlanTypes)
+                .Includes(x => x.HotspotType)
                 .Where(x => x.IsDeleted == false)
                 .Where(x => (x.Status == EPlanStatus.Drafts && x.CreatorId == _sessionContext.UserId) || (x.Status != EPlanStatus.Drafts))
                 .WhereIF(OrgSeedData.CenterId != pagedDto.CreateOrgId && !string.IsNullOrEmpty(pagedDto.CreateOrgId), x => x.CreatorOrgId != null && x.CreatorOrgId.StartsWith(pagedDto.CreateOrgId!))
@@ -234,7 +238,11 @@ namespace Hotline.Application.Planlibrary
                 .WhereIF(pagedDto.ExaminTimeStart.HasValue, x => x.ExaminTime >= pagedDto.ExaminTimeStart)
                 .WhereIF(pagedDto.ExaminTimeEnd.HasValue, x => x.ExaminTime <= pagedDto.ExaminTimeEnd)
 
-                .OrderByDescending(d => d.CreationTime)
+                .OrderByIF(string.IsNullOrEmpty(pagedDto.SortField), d => d.CreationTime, OrderByType.Desc)
+                .OrderByIF(pagedDto is { SortField: "PageView" }, d => d.PageView, OrderByType.Desc)         //阅读量
+                .OrderByIF(pagedDto is { SortField: "Score" }, d => d.Score, OrderByType.Desc)               //评分
+                .OrderByIF(pagedDto is { SortField: "CreationTime" }, d => d.CreationTime, OrderByType.Desc) //创建时间
+
                 .ToPagedListAsync(pagedDto.PageIndex, pagedDto.PageSize, cancellationToken);
 
             return (total, _mapper.Map<IList<PlanDataDto>>(temp));
@@ -258,7 +266,7 @@ namespace Hotline.Application.Planlibrary
             if (any)
                 throw UserFriendlyException.SameMessage("当前知识标题存在重复标题!");
 
-            if (dto.Files != null)
+            if (dto.Files != null && dto.Files.Count > 0)
                 pList.FileJson = await _fileRepository.AddFileAsync(dto.Files, pList.Id, "", cancellationToken);
             await _planListRepository.AddAsync(pList, cancellationToken);
 
@@ -285,6 +293,7 @@ namespace Hotline.Application.Planlibrary
         public async Task UpdatePlanAsync(UpdatePlanListDto dto, CancellationToken cancellationToken)
         {
             var plan = await _planListRepository.GetAsync(dto.Id);
+
             if (plan == null)
                 throw UserFriendlyException.SameMessage("预案库查询失败");
 
@@ -299,7 +308,7 @@ namespace Hotline.Application.Planlibrary
 
             plan.HotspotId = dto.HotspotId;
 
-            if (dto.Files.Any())
+            if (dto.Files != null && dto.Files.Count > 0)
                 plan.FileJson = await _fileRepository.AddFileAsync(dto.Files, plan.Id, "", cancellationToken);
             else
                 plan.FileJson = new List<Share.Dtos.File.FileJson>();
@@ -318,6 +327,33 @@ namespace Hotline.Application.Planlibrary
 
         #endregion
 
+        #region 预案库 - 下架审核
+
+        /// <summary>
+        /// 下架审核
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task AuditPlanAsync(UpdatePlanListDto dto, CancellationToken cancellationToken)
+        {
+            var plan = await _planListRepository.GetAsync(dto.Id);
+
+            if (plan == null)
+                throw UserFriendlyException.SameMessage("预案库查询失败");
+
+            plan.Status = (EPlanStatus)dto.Status!;
+            plan.ApplyStatus = (EPlanApplyStatus)dto.ApplyStatus!;
+            plan.ExaminTime = dto.ExaminTime;
+            plan.ExaminManId = dto.ExaminManId;
+            plan.ExaminOrganizeId = dto.ExaminOrganizeId;
+            plan.UpdateTime = dto.UpdateTime;
+
+            await _planListRepository.UpdateNullAsync(plan, cancellationToken);
+        }
+
+        #endregion
+
         #region 预案库 - 详情
 
         /// <summary>
@@ -342,11 +378,6 @@ namespace Hotline.Application.Planlibrary
             //var hot = await _hotspotTypeRepository.GetAsync(plan.HotspotId, cancellationToken);
             //if (hot != null)
             //    planDto.HotspotId = hot.HotSpotFullName;
-            
-            // 收藏
-            //var collect = await _knowledgeCollectRepository.GetAsync(x => x.KnowledgeId == Id && x.CreatorId == _sessionContext.UserId);
-            //if (collect != null)
-            //    knowledgeShowInfoDto.Collect = _mapper.Map<KnowledgeCollectDto>(collect);
 
             if (planInfoDto.FileJson != null && planInfoDto.FileJson.Any())
             {
@@ -355,8 +386,13 @@ namespace Hotline.Application.Planlibrary
             }
 
             // 更新浏览量
-            //if (IsAddPv == true)
-            //    _mediator.Publish(new GetKnowledgeInfoNotify(knowledge));
+            if (IsAddPv == true)
+            {
+                //修改浏览量
+                plan.PageView++;
+                //修改点击量
+                await _planListRepository.UpdateAsync(plan, cancellationToken);
+            }
             return planInfoDto;
         }
 

+ 51 - 12
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -552,7 +552,13 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<DataTable> CenterReportFormsStatistics(DateTime StartTime, DateTime EndTime)
         {
-            var list = await Db.Queryable<StatisticsCenter>()
+            var listAny = await Db.Queryable<StatisticsCenter>()
+                .Where(x => x.Time >= StartTime && x.Time <= EndTime).AnyAsync();
+            if (!listAny)
+            {
+                return null;
+            }
+			var list = await Db.Queryable<StatisticsCenter>()
                 .Where(x => x.Time >= StartTime && x.Time <= EndTime)
                 .Select(x => new StatisticsCenter
                 {
@@ -605,7 +611,14 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<DataTable> CenterReportPurTypeStatistics(DateTime StartTime, DateTime EndTime)
         {
-            var list = await Db.Queryable<StatisticsPurTypeSatisfied>()
+            var any = await Db.Queryable<StatisticsPurTypeSatisfied>()
+                .Where(x => x.Time >= StartTime && x.Time <= EndTime).AnyAsync();
+            if (!any)
+            {
+                return null;
+            }
+
+			var list = await Db.Queryable<StatisticsPurTypeSatisfied>()
                 .Where(x => x.Time >= StartTime && x.Time <= EndTime)
                 .Select(x => new StatisticsPurTypeSatisfied
                 {
@@ -637,7 +650,16 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<DataTable> CenterReportDepartStatistics(DateTime StartTime, DateTime EndTime, string Type)
         {
-            var list = await Db.Queryable<StatisticsDepart>()
+            var any = await Db.Queryable<StatisticsDepart>()
+                .LeftJoin<SystemOrganize>((x, so) => x.DepartmentId == so.oldBmid)
+                .Where(x => x.Time >= StartTime && x.Time <= EndTime && x.Type == Type).AnyAsync();
+            if (!any)
+            {
+                return null;
+            }
+
+
+			var list = await Db.Queryable<StatisticsDepart>()
                 .LeftJoin<SystemOrganize>((x, so) => x.DepartmentId == so.oldBmid)
                 .Where(x => x.Time >= StartTime && x.Time <= EndTime && x.Type == Type)
                 .GroupBy((x, so) => new
@@ -669,6 +691,13 @@ namespace Hotline.Repository.SqlSugar.Orders
         /// <returns></returns>
         public async Task<DataTable> CenterReportNewStatistics(DateTime StartTime, DateTime EndTime)
         {
+            var any = await Db.Queryable<StatisticsBaseInfo>()
+                .Where(x => x.AddDate >= StartTime && x.AddDate <= EndTime).AnyAsync();
+
+			if (!any)
+            {
+                return null;
+            }
             var list = await Db.Queryable<StatisticsBaseInfo>()
                 .Where(x => x.AddDate >= StartTime && x.AddDate <= EndTime)
                 .Select(x => new
@@ -1748,6 +1777,8 @@ namespace Hotline.Repository.SqlSugar.Orders
         public ISugarQueryable<OrgVisitDetailListResp> OrgVisitDetailList(OrgVisitDetailListReq dto)
         {
             var IsCenter = _sessionContext.OrgIsCenter;
+            if (dto.OrgProcessingResults == null || !dto.OrgProcessingResults.Any() || dto.OrgProcessingResults.First() == null)
+                dto.OrgProcessingResults = null;
 
             return _orderVisitDetailRepository.Queryable()
                 .Includes(x => x.OrderVisit, x => x.Order)
@@ -1762,10 +1793,14 @@ namespace Hotline.Repository.SqlSugar.Orders
                 .WhereIF(dto.Keyword.NotNullOrEmpty(), x => x.OrderVisit.Order.Title.Contains(dto.Keyword)) // 根据关键字匹配
                 .WhereIF(dto.TypeCode != 0, x => x.OrderVisit.Order.IdentityType == (EIdentityType)dto.TypeCode)
                 //任务 218 市州通用-部门满意度明细:办件结果查询优化为多选
-                .WhereIF(dto.OrgProcessingResults != null && dto.OrgProcessingResults.Any(),
-                      x => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(x.OrgProcessingResults, "Key")))
-                .WhereIF(dto.OrgHandledAttitude != null && dto.OrgHandledAttitude.Any(),
-                     x => dto.OrgHandledAttitude.Contains(SqlFunc.JsonField(x.OrgHandledAttitude, "Key")))
+                //.WhereIF(dto.OrgProcessingResults != null && dto.OrgProcessingResults.Any(),
+                //      x => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(x.OrgProcessingResults, "Key")))
+                //.WhereIF(dto.OrgHandledAttitude != null && dto.OrgHandledAttitude.Any(),
+                //     x => dto.OrgHandledAttitude.Contains(SqlFunc.JsonField(x.OrgHandledAttitude, "Key")))
+                .WhereIF(dto.OrgProcessingResults != null && dto.OrgProcessingResults.Count > 0,
+                    dto.AttitudeType == EAttitudeType.ProcessingResult ?
+                    x => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(x.OrgProcessingResults, "Key")) :
+                    x => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(x.OrgHandledAttitude, "Key")))
                 .WhereIF(!string.IsNullOrEmpty(dto.VisitUser), x => x.OrderVisit.Employee.Name.Contains(dto.VisitUser))
                 .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order.No == dto.No)
                 .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order.Title.Contains(dto.Title))
@@ -1893,11 +1928,15 @@ namespace Hotline.Repository.SqlSugar.Orders
                 .WhereIF(dto.OrgVisitStatisticsType.HasValue, x => x.OrderVisit.Order.FileOrgIsCenter == (dto.OrgVisitStatisticsType == EOrgVisitStatisticsType.CallCenter))
                 .WhereIF(dto.Keyword.NotNullOrEmpty(), x => x.OrderVisit.Order.Title.Contains(dto.Keyword)) // 根据关键字匹配
                 .WhereIF(dto.TypeCode != 0, x => x.OrderVisit.Order.IdentityType == (EIdentityType)dto.TypeCode)
-                //任务 218 市州通用-部门满意度明细:办件结果查询优化为多选
-                .WhereIF(dto.OrgProcessingResults != null && dto.OrgProcessingResults.Any(),
-                      x => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(x.OrgProcessingResults, "Key")))
-                .WhereIF(dto.OrgHandledAttitude != null && dto.OrgHandledAttitude.Any(),
-                     x => dto.OrgHandledAttitude.Contains(SqlFunc.JsonField(x.OrgHandledAttitude, "Key")))
+                  //任务 218 市州通用-部门满意度明细:办件结果查询优化为多选
+                  //.WhereIF(dto.OrgProcessingResults != null && dto.OrgProcessingResults.Any(),
+                  //      x => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(x.OrgProcessingResults, "Key")))
+                  //.WhereIF(dto.OrgHandledAttitude != null && dto.OrgHandledAttitude.Any(),
+                  //     x => dto.OrgHandledAttitude.Contains(SqlFunc.JsonField(x.OrgHandledAttitude, "Key")))
+                  .WhereIF(dto.OrgProcessingResults != null && dto.OrgProcessingResults.Any(),
+                    dto.AttitudeType == EAttitudeType.ProcessingResult ?
+                    x => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(x.OrgProcessingResults, "Key")) :
+                    x => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(x.OrgHandledAttitude, "Key")))
 
                 .WhereIF(!string.IsNullOrEmpty(dto.VisitUser), x => x.OrderVisit.Employee.Name.Contains(dto.VisitUser))
                 .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order.No == dto.No)

+ 76 - 22
src/Hotline.Share/Dtos/CallCenter/CenterReportStatisticsDto.cs

@@ -9,12 +9,12 @@ namespace Hotline.Share.Dtos.CallCenter
     public class CenterReportStatisticsDto
     {
         /// <summary>
-        /// 电话
+        /// 电话--自贡
         /// </summary>
         public CenterReportCallInfoDto CenterReportCallInfoDto { get; set; }
 
         /// <summary>
-        /// 电话
+        /// 电话--宜宾
         /// </summary>
         public CenterReportCallDto CenterReportCall { get; set; }
 
@@ -31,17 +31,17 @@ namespace Hotline.Share.Dtos.CallCenter
         /// <summary>
         /// 按时办结情况
         /// </summary>
-        public OrderCompletedDto orderCompletedDto { get; set; }
+        public OrderCompletedDto OrderCompletedDto { get; set; }
 
         /// <summary>
         /// 办理时效
         /// </summary>
-        public OrderAgingDto orderAgingDto { get; set; }
+        public OrderAgingDto OrderAgingDto { get; set; }
 
 		/// <summary>
 		/// 企业办件情况
 		/// </summary>
-		public EnterpriseOrderDto enterpriseOrderDto { get; set; }
+		public EnterpriseOrderDto EnterpriseOrderDto { get; set; }
 
 		/// <summary>
 		/// 信件回访量
@@ -58,10 +58,15 @@ namespace Hotline.Share.Dtos.CallCenter
         /// </summary>
         public List<CenterReportOrderSourceChannelDto> CenterReportOrderAcceptTypes { get; set; }
 
-        /// <summary>
-        /// 专线统计
-        /// </summary>
-        public List<CenterReportOrderSourceChannelDto>  CenterReportOrderDedicatedLine{get;set ;}
+		/// <summary>
+		/// 信件分类
+		/// </summary>
+		public List<CenterReportOrderSourceChannelDto> EnterpriseCenterReportOrderAcceptTypes { get; set; }
+
+		/// <summary>
+		/// 专线统计
+		/// </summary>
+		public List<CenterReportOrderSourceChannelDto>  CenterReportOrderDedicatedLine{get;set ;}
 
         /// <summary>
         /// 市直部门
@@ -136,14 +141,39 @@ namespace Hotline.Share.Dtos.CallCenter
     public class CenterReportCallDto
     {
         /// <summary>
-        /// 话总量
+        /// 话总量
         /// </summary>
-        public int AllCallCount => EffectiveCount + InvalidCount + QueueByeCount + IvrByeCount;
+        public int AllCallCount => InTotal + OutTotal;
 
-        /// <summary>
-        /// 有效
-        /// </summary>
-        public int EffectiveCount { get; set; }
+		/// <summary>
+		/// 接通总量
+		/// </summary>
+		public int AllConnectionCount => InConnectionQuantity + OutConnectionQuantity;
+
+		/// <summary>
+		/// 呼入总量
+		/// </summary>
+		public int InTotal { get; set; }
+
+		/// <summary>
+		/// 呼出总量
+		/// </summary>
+		public int OutTotal { get; set; }
+
+		/// <summary>
+		/// 呼入接通量
+		/// </summary>
+		public int InConnectionQuantity { get; set; }
+
+		/// <summary>
+		/// 呼出接通量
+		/// </summary>
+		public int OutConnectionQuantity { get; set; }
+
+		/// <summary>
+		/// 有效
+		/// </summary>
+		public int EffectiveCount { get; set; }
 
         /// <summary>
         /// 无效
@@ -161,6 +191,12 @@ namespace Hotline.Share.Dtos.CallCenter
         public int IvrByeCount { get; set; }
 
 
+		/// <summary>
+		/// 挂断总量
+		/// </summary>
+		public int AllByeCount => QueueByeCount + IvrByeCount;
+
+
 		/// <summary>
 		/// 总体接通率
 		/// </summary>
@@ -452,7 +488,7 @@ namespace Hotline.Share.Dtos.CallCenter
 		public int CityExpiredTimeCompletedCount { get; set; }
 
 		/// <summary>
-		/// 市级办结率
+		/// 市级按时办结率
 		/// </summary>
 		public double CityCompletedRate => GetCityCompletedRate();
 
@@ -469,7 +505,7 @@ namespace Hotline.Share.Dtos.CallCenter
 		public int CountyExpiredTimeCompletedCount { get; set; }
 
 		/// <summary>
-		/// 区县办结率
+		/// 区县按时办结率
 		/// </summary>
 		public double CountyCompletedRate => GetCountyCompletedRate();
 
@@ -480,13 +516,25 @@ namespace Hotline.Share.Dtos.CallCenter
 			return 0;
 		}
 
+		/// <summary>
+		/// 部门办结率
+		/// </summary>
+		public double OrgCompletedRate => GetOrgCompletedRate();
+
+		public double GetOrgCompletedRate()
+		{
+			if (CityCompletedCount > 0 || CountyCompletedCount > 0)
+				return Math.Round(((double)((CityCompletedCount + CountyCompletedCount) - (CityExpiredTimeCompletedCount + CountyExpiredTimeCompletedCount)) / (CityCompletedCount + CountyCompletedCount) ) * 100, 2);
+			return 0;
+		}
+
 		/// <summary>
 		/// 中心超期已办办结
 		/// </summary>
 		public int CenterExpiredTimeCompletedCount { get; set; }
 
 		/// <summary>
-		/// 中心办结率
+		/// 中心按时办结率
 		/// </summary>
 		public double CenterCompletedRate => GetCenterCompletedRate();
 
@@ -763,10 +811,16 @@ namespace Hotline.Share.Dtos.CallCenter
     /// </summary>
     public class CenterReportVisitdDto
     {
-        /// <summary>
-        /// 已回访
-        /// </summary>
-        public int Visitd { get; set; }
+
+		/// <summary>
+		/// 回访总量
+		/// </summary>
+		public int AllVisitd => Visitd + WaitVisitd;
+
+		/// <summary>
+		/// 已回访
+		/// </summary>
+		public int Visitd { get; set; }
 
         /// <summary>
         /// 已回访--电话

+ 7 - 0
src/Hotline.Share/Dtos/File/UploadAudioFilesRequestDto.cs

@@ -2,6 +2,8 @@
 {
     public class UploadAudioFilesRequestDto
     {
+        public string Id { get; set; }
+
         /// <summary>
         /// 附件Id
         /// </summary>
@@ -31,5 +33,10 @@
         /// 完整附件路径
         /// </summary>
         public string? AllPath { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        public DateTime CreationTime { get; set; }
     }
 }

+ 10 - 0
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -749,6 +749,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int NormalCount { get; set; }
 
+        /// <summary>
+        /// 一般Key
+        /// </summary>
+        public string NormalKey => "3";
+
         /// <summary>
         /// 一般率
         /// </summary>
@@ -770,6 +775,11 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int VeryNoSatisfiedCount { get; set; }
 
+        /// <summary>
+        /// 非常不满意数Key
+        /// </summary>
+        public string VeryNoSatisfiedKey => "1";
+
         /// <summary>
         /// 非常不满意率
         /// </summary>

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

@@ -907,6 +907,16 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string ProvinceRevokeString { get; set; }
 
+        /// <summary>
+        /// 省甄别
+        /// </summary>
+        public string ProvinceScreenString { get; set; }
+
+        /// <summary>
+        /// 省延期
+        /// </summary>
+        public string? ProvinceDelayString { get; set; }
+
         /// <summary>
         /// 省工单退回
         /// </summary>

+ 23 - 15
src/Hotline.Share/Dtos/Planlibrary/PlanDataDto.cs

@@ -93,38 +93,38 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// </summary>
         public string StatusName => NewStatus.GetDescription();
 
-        public HotspotDto HotspotType { get; set; }
-
-        /// <summary>
-        /// 热点
-        /// </summary>
-        public string HotspotName => HotspotType != null ? HotspotType.HotSpotFullName : string.Empty;
-
         /// <summary>
-        /// 知识分类名称
+        /// 预案分类
         /// </summary>
-        public string KnowledgeTypeText => GetKnowledgeTypeText(KnowledgeType);
+        public List<PlanRelationTypeDto> PlanTypes { get; set; }
 
         /// <summary>
-        /// 知识分类
+        /// 预案分类名称
         /// </summary>
-        public List<PlanRelationTypeDto> KnowledgeType { get; set; }
+        public string PlanTypeText => GetPlanTypeText(PlanTypes);
 
         /// <summary>
-        /// 获取知识分类名称
+        /// 获取预案分类名称
         /// </summary>
         /// <returns></returns>
-        public string GetKnowledgeTypeText(List<PlanRelationTypeDto> items)
+        public string GetPlanTypeText(List<PlanRelationTypeDto> items)
         {
 
-            if (KnowledgeType != null && KnowledgeType.Any())
+            if (PlanTypes != null && PlanTypes.Any())
             {
-                var names = KnowledgeType.Select(x => x.PlanTypeName).ToList();
+                var names = PlanTypes.Select(x => x.PlanTypeName).ToList();
                 return string.Join(",", names);
             }
             return "";
         }
 
+        public HotspotDto HotspotType { get; set; }
+
+        /// <summary>
+        /// 热点
+        /// </summary>
+        public string HotspotName => HotspotType != null ? HotspotType.HotSpotFullName : string.Empty;
+
     }
 
     public record PlanRelationTypeDto
@@ -178,4 +178,12 @@ public class PlanInfoExportDto
     /// 导出格式
     /// </summary>
     public EFileType FileType { get; set; }
+}
+
+
+public class PlanPageViewDto
+{
+    public string Id { get; set; }
+    public string Title { get; set; }
+    public int PageView { get; set; }
 }

+ 51 - 5
src/Hotline.Share/Dtos/Planlibrary/PlanListDto.cs

@@ -140,6 +140,16 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// 评分
         /// </summary>
         public decimal? Score { get; set; } = decimal.Zero;
+
+        /// <summary>
+        /// 排序(需要被排序的字段名)
+        /// </summary>
+        public string? SortField { get; set; }
+
+        /// <summary>
+        /// 排序方向 (0: 升序Asc; 1: 降序Desc)
+        /// </summary>
+        public int OrderByType { get; set; } = 1;
     }
 
 
@@ -163,12 +173,12 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// <summary>
         /// 预案归属
         /// </summary>
-        public string? Attribution { get; set; }
+        public string Attribution { get; set; }
 
-        /// <summary>
-        /// 分类ID
-        /// </summary>
-        public string? PlanTypeID { get; set; }
+        ///// <summary>
+        ///// 分类ID
+        ///// </summary>
+        //public string? PlanTypeID { get; set; }
 
         /// <summary>
         /// 分类
@@ -227,6 +237,11 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// 审核时间
         /// </summary>
         public DateTime? ExaminTime { get; set; }
+
+        /// <summary>
+        /// 修改时间
+        /// </summary>
+        public DateTime? UpdateTime { get; set; }
     }
 
     public record DelPlanListDto
@@ -305,4 +320,35 @@ namespace Hotline.Share.Dtos.Planlibrary
         /// </summary>
         public List<FileJson>? FileJson { get; set; }
     }
+
+    public record AuditPlanListDto
+    {
+        /// <summary>
+        /// 预案库ID
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 审核状态 0不同意 1同意
+        /// </summary>
+        public int State { get; set; }
+    }
+
+    public record PvPlanListDto
+    {
+        /// <summary>
+        /// 预案库ID
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 浏览量:默认不增加,false不增加,true增加浏览量
+        /// </summary>
+        public bool IsAddPv { get; set; } = false;
+
+        /// <summary>
+        /// 评分
+        /// </summary>
+        public decimal Score { get; set; }
+    }
 }

+ 1 - 6
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -485,12 +485,7 @@ public record OrgVisitDetailListReq : PagedKeywordRequest
     /// <summary>
     /// 部门办件结果
     /// </summary>
-    public List<string>? OrgProcessingResults { get; set; }
-
-    /// <summary>
-    /// 部门办件态度
-    /// </summary>
-    public List<string>? OrgHandledAttitude { get; set; }
+    public List<string>? OrgProcessingResults { get; set; } 
 
     /// <summary>
     /// 回访人

+ 4 - 0
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -998,6 +998,10 @@ namespace Hotline.FlowEngine.Workflows
                 prevStep.FlowAssignType = prevStep.BusinessType is EBusinessType.Seat ? EFlowAssignType.Role :
                     prevStep.BusinessType is EBusinessType.Send ? EFlowAssignType.User : EFlowAssignType.Org;
             }
+            if (workflow.FlowType == EFlowType.Review &&  workflow.ModuleCode == WorkflowModuleConsts.OrderScreen)
+            {
+                prevStep.FlowAssignType = prevStep.StepType == EStepType.Start ? EFlowAssignType.Org : prevStep.FlowAssignType;
+			}
 
             //复制上一个节点为待接办
             // var newPrevStep =

+ 2 - 2
src/Hotline/Planlibrary/PlanList.cs

@@ -53,7 +53,7 @@ public class PlanList : CreationEntity
     /// 预案归属
     /// </summary>
     [SugarColumn(ColumnDescription = "预案归属")]
-    public string? Attribution { get; set; }
+    public string Attribution { get; set; }
 
     /// <summary>
     /// 热点
@@ -71,7 +71,7 @@ public class PlanList : CreationEntity
     /// 是否公开
     /// </summary>
     [SugarColumn(ColumnDescription = "是否公开")]
-    public bool? IsPublic { get; set; }
+    public bool IsPublic { get; set; }
 
     /// <summary>
     /// 是否删除