Przeglądaj źródła

Merge branch 'dev' of http://git.12345lm.cn/Fengwo/hotline into dev

tangjiang 10 miesięcy temu
rodzic
commit
204c9abb9b

+ 165 - 162
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -861,95 +861,11 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="LineNum"></param>
         /// <returns></returns>
         [HttpGet("visit-org-satisfaction-statistics")]
-        public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgSatisfactionStatistics(DateTime StartDate, DateTime EndDate, string OrgName, int TypeId, string? LineNum)
+        public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgSatisfactionStatistics([FromBody] PagedKeywordSonRequest dto)
         {
-            EndDate = EndDate.AddDays(1).AddSeconds(-1);
-
-            bool IsCenter = _sessionContext.OrgIsCenter;
-
-            var list = _orderVisitDetailRepository.Queryable()
-                .Where(x => x.OrderVisit.VisitTime >= StartDate && x.OrderVisit.VisitTime <= EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
-                .WhereIF(string.IsNullOrEmpty(OrgName) == false, x => x.VisitOrgName.Contains(OrgName))
-                .WhereIF(string.IsNullOrEmpty(LineNum) == false, x => x.OrderVisit.Order.CallRecord.Gateway.Contains(LineNum))
-                .WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId));
+            var data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto);
 
-            var data = new List<VisitAndOrgSatisfactionStatisticsDto>();
-
-            if (IsCenter && list != null)
-            {
-                data = await list.GroupBy(x => new
-                {
-                    VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
-                })
-                .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
-                    TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
-                    VerySatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
-                    SatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
-                    RegardedAsSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
-                    DefaultSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
-                    NoSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
-                    NoEvaluateCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
-                    NoPutThroughCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
-                })
-                .MergeTable()
-                .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
-                .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgName = o.Name,
-                    OrgCode = it.OrgCode,
-                    OrgType = o.OrgType,
-                    TotalSumCount = it.TotalSumCount,
-                    VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
-                    SatisfiedCount = it.SatisfiedCount, //满意数
-                    RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
-                    DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
-                    NoSatisfiedCount = it.NoSatisfiedCount,//不满意
-                    NoEvaluateCount = it.NoEvaluateCount,//未做评价
-                    NoPutThroughCount = it.NoPutThroughCount,//未接通
-                })
-                .ToListAsync();
-            }
-            else
-            {
-                data = await list.GroupBy(x => new
-                {
-                    x.VisitOrgCode
-                })
-                .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgCode = x.VisitOrgCode,
-                    TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
-                    VerySatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
-                    SatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
-                    RegardedAsSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
-                    DefaultSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
-                    NoSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
-                    NoEvaluateCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
-                    NoPutThroughCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
-                })
-                .MergeTable()
-                .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
-                .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgName = o.Name,
-                    OrgCode = it.OrgCode,
-                    OrgType = o.OrgType,
-                    TotalSumCount = it.TotalSumCount,
-                    VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
-                    SatisfiedCount = it.SatisfiedCount, //满意数
-                    RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
-                    DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
-                    NoSatisfiedCount = it.NoSatisfiedCount,//不满意
-                    NoEvaluateCount = it.NoEvaluateCount,//未做评价
-                    NoPutThroughCount = it.NoPutThroughCount,//未接通
-                })
-                .ToListAsync();
-            }
-
-
-            var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
             {
                 OrgName = "区县合计",
                 TotalSumCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
@@ -992,6 +908,63 @@ namespace Hotline.Api.Controllers.Bi
             return new VisitAndOrgSatisfactionStatisticsResultDto { DataList = data, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
         }
 
+        /// <summary>
+        /// 部门满意度统计导出
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("visit-org-satisfaction-statistics/_export")]
+        public async Task<FileStreamResult> VisitAndOrgSatisfactionStatisticsExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
+        {
+	        List<VisitAndOrgSatisfactionStatisticsDto> data = await _orderApplication.VisitAndOrgSatisfactionStatistics(dto.QueryDto);
+			var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "区县合计",
+				TotalSumCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
+			};
+            data.Add(countySumModel);
+			var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "市直合计",
+				TotalSumCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = data.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
+			};
+			data.Add(citySumModel);
+			var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "总计",
+				TotalSumCount = data.Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = data.Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = data.Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = data.Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = data.Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = data.Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = data.Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = data.Sum(x => x.NoPutThroughCount),
+			};
+			data.Add(sumModel);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            var dtos = data
+             .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
+             .Cast<object>()
+             .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "部门满意度统计数据");
+        }
 
 
         /// <summary>
@@ -1004,54 +977,10 @@ namespace Hotline.Api.Controllers.Bi
         /// <param name="LineNum"></param>
         /// <returns></returns>
         [HttpGet("visit-org-statisfaction-org-detail")]
-        public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgStatisfactionOrgDetail(DateTime StartDate, DateTime EndDate, string OrgCode, int TypeId, string? LineNum)
+        public async Task<VisitAndOrgSatisfactionStatisticsResultDto> VisitAndOrgStatisfactionOrgDetail([FromBody] PagedKeywordSonRequest dto)
         {
-            EndDate = EndDate.AddDays(1).AddSeconds(-1);
-
-            bool IsCenter = _sessionContext.OrgIsCenter;
-
-            var list = await _systemOrganizeRepository.Queryable().Where(x => x.Id.StartsWith(OrgCode))
-                .LeftJoin<OrderVisitDetail>((x, it) => x.Id == it.VisitOrgCode)
-                .Where((x, it) => it.OrderVisit.VisitTime >= StartDate && it.OrderVisit.VisitTime <= EndDate && it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
-                .WhereIF(OrgCode == "001", (x, it) => it.VisitOrgCode == OrgCode)
-                .WhereIF(OrgCode != "001", (x, it) => it.VisitOrgCode.StartsWith(OrgCode))
-                .WhereIF(!string.IsNullOrEmpty(LineNum), (x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(LineNum))
-                .WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
-                 .GroupBy((x, it) => new
-                 {
-                     VisitOrgCode = it.VisitOrgCode
-                 })
-                 .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
-                 {
-                     OrgCode = it.VisitOrgCode,
-                     TotalSumCount = SqlFunc.AggregateCount(it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9"))),
-                     VerySatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
-                     SatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
-                     RegardedAsSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
-                     DefaultSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
-                     NoSatisfiedCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
-                     NoEvaluateCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
-                     NoPutThroughCount = SqlFunc.IIF(TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "6", 1, 0)))//未接通
-                 })
-                 .MergeTable()
-                 .LeftJoin<SystemOrganize>((x, it) => x.OrgCode == it.Id)
-                .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgName = it.Name,
-                    OrgCode = x.OrgCode,
-                    OrgType = it.OrgType,
-                    TotalSumCount = x.TotalSumCount,
-                    VerySatisfiedCount = x.VerySatisfiedCount,//非常满意数
-                    SatisfiedCount = x.SatisfiedCount, //满意数
-                    RegardedAsSatisfiedCount = x.RegardedAsSatisfiedCount,//视为满意
-                    DefaultSatisfiedCount = x.DefaultSatisfiedCount,//默认满意
-                    NoSatisfiedCount = x.NoSatisfiedCount,//不满意
-                    NoEvaluateCount = x.NoEvaluateCount,//未做评价
-                    NoPutThroughCount = x.NoPutThroughCount,//未接通
-                })
-                .ToListAsync();
-
-            var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto);
+			var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
             {
                 OrgName = "区县合计",
                 TotalSumCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
@@ -1093,40 +1022,114 @@ namespace Hotline.Api.Controllers.Bi
             return new VisitAndOrgSatisfactionStatisticsResultDto { DataList = list, CountySumModel = countySumModel, CitySumModel = citySumModel, SumModel = sumModel };
         }
 
-
-        /// <summary>
-        /// 部门满意度明细
-        /// </summary>
-        /// <param name="StartDate"></param>
-        /// <param name="EndDate"></param>
-        /// <param name="OrgCode"></param>
-        /// <param name="TypeId"></param>
-        /// <param name="LineNum"></param>
-        /// <returns></returns>
-        [HttpGet("visit-org-satisfaction-detail")]
+		/// <summary>
+		/// 部门满意度统计导出
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("visit-org-statisfaction-org-detail/_export")]
+		public async Task<FileStreamResult> VisitAndOrgStatisfactionOrgDetailExport([FromBody] ExportExcelDto<PagedKeywordSonRequest> dto)
+		{
+			var list = await _orderApplication.VisitAndOrgStatisfactionOrgDetail(dto.QueryDto);
+			var countySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "区县合计",
+				TotalSumCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.County).Sum(x => x.NoPutThroughCount),
+			};
+			list.Add(countySumModel);
+			var citySumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "市直合计",
+				TotalSumCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = list.Where(x => x.OrgType == EOrgType.City).Sum(x => x.NoPutThroughCount),
+			};
+			list.Add(citySumModel);
+			var sumModel = new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = "总计",
+				TotalSumCount = list.Sum(x => x.TotalSumCount),
+				VerySatisfiedCount = list.Sum(x => x.VerySatisfiedCount),
+				SatisfiedCount = list.Sum(x => x.SatisfiedCount),
+				RegardedAsSatisfiedCount = list.Sum(x => x.RegardedAsSatisfiedCount),
+				DefaultSatisfiedCount = list.Sum(x => x.DefaultSatisfiedCount),
+				NoSatisfiedCount = list.Sum(x => x.NoSatisfiedCount),
+				NoEvaluateCount = list.Sum(x => x.NoEvaluateCount),
+				NoPutThroughCount = list.Sum(x => x.NoPutThroughCount),
+			};
+			list.Add(sumModel);
+
+			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+			var dtos = list
+			 .Select(stu => _mapper.Map(stu, typeof(VisitAndOrgSatisfactionStatisticsDto), dynamicClass))
+			 .Cast<object>()
+			 .ToList();
+
+			var stream = ExcelHelper.CreateStream(dtos);
+
+			return ExcelStreamResult(stream, "部门满意度统计数据");
+		}
+
+		/// <summary>
+		/// 部门满意度明细
+		/// </summary>
+		/// <param name="StartDate"></param>
+		/// <param name="EndDate"></param>
+		/// <param name="OrgCode"></param>
+		/// <param name="TypeId"></param>
+		/// <param name="LineNum"></param>
+		/// <returns></returns>
+		[HttpGet("visit-org-satisfaction-detail")]
         public async Task<PagedDto<OrderVisitDetailDto>> VisitAndOrgSatisfactionDetail([FromQuery] VisitAndOrgSatisfactionDetailDto dto)
         {
-            dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
-
-            bool IsCenter = _sessionContext.OrgIsCenter;
-
-            var (total, items) = await _orderVisitDetailRepository.Queryable()
-                .Includes(x => x.OrderVisit, o => o.Order, d => d.CallRecord)
-                .Where(x => x.OrderVisit.VisitTime >= dto.StartDate && x.OrderVisit.VisitTime <= dto.EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
-                .WhereIF(dto.OrgCode == "001", x => x.VisitOrgCode == dto.OrgCode)
-                //.WhereIF(dto.OrgCode != "001", x => x.VisitOrgCode == dto.OrgCode).
-                .WhereIF(dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
-                .WhereIF(IsCenter == true && dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
-                .WhereIF(IsCenter == true && dto.IsOnlyMy == null, x => x.VisitOrgCode.StartsWith(dto.OrgCode))
-                .WhereIF(IsCenter == false, x => x.VisitOrgCode == dto.OrgCode)
-                .WhereIF(dto.TypeId == 1, x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.DateValue)
-                .WhereIF(dto.TypeId == 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == dto.DateValue)
-                .WhereIF(!string.IsNullOrEmpty(dto.LineNum), x => x.OrderVisit.Order.CallRecord.Gateway == dto.LineNum)
-                .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+            var (total, items) = await _orderApplication.VisitAndOrgSatisfactionDetail(dto)
+				.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
             return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
         }
 
+		/// <summary>
+		/// 部门满意度明细导出
+		/// </summary>
+		/// <returns></returns>
+		[HttpPost("visit-org-satisfaction-detail/_export")]
+        public async Task<FileStreamResult> VisitAndOrgSatisfactionDetailExport([FromBody] ExportExcelDto<VisitAndOrgSatisfactionDetailDto> dto)
+        {
+            var query = _orderApplication.VisitAndOrgSatisfactionDetail(dto.QueryDto);
+            List<OrderVisitDetail> data;
+            if (dto.IsExportAll)
+            {
+	            data = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                data = items;
+            }
 
+            var dataDtos = _mapper.Map<ICollection<OrderVisitDetailDto>>(data);
+
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+            var dtos = dataDtos
+				.Select(stu => _mapper.Map(stu, typeof(OrderVisitDetailDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
+
+            var stream = ExcelHelper.CreateStream(dtos);
+
+            return ExcelStreamResult(stream, "部门满意度明细数据");
+        }
 
 
         /// <summary>

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

@@ -8,6 +8,7 @@ using System.Threading.Tasks;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Bi;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Share.Dtos.Order;
@@ -124,5 +125,25 @@ namespace Hotline.Application.Orders
 		/// <param name="dto"></param>
 		/// <returns></returns>
 		ISugarQueryable<OrderSpecialDetail> QueryOrderSourceDetail(QueryOrderReTransactDetailRequest dto);
+
+		/// <summary>
+		/// 部门满意度统计
+		/// </summary>
+		/// <returns></returns>
+		Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgSatisfactionStatistics(PagedKeywordSonRequest dto);
+
+		/// <summary>
+		/// 子部门满意度
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgStatisfactionOrgDetail(PagedKeywordSonRequest dto);
+
+		/// <summary>
+		/// 部门满意度明细
+		/// </summary>
+		/// <param name="dto"></param>
+		/// <returns></returns>
+		ISugarQueryable<OrderVisitDetail> VisitAndOrgSatisfactionDetail(VisitAndOrgSatisfactionDetailDto dto);
 	}
 }

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

@@ -33,6 +33,8 @@ using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using Hotline.Repository.SqlSugar.System;
+using Microsoft.AspNetCore.Mvc;
+using Hotline.Share.Dtos.Bi;
 
 namespace Hotline.Application.Orders;
 
@@ -731,7 +733,173 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 		    .Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
 		    .Where(x => x.OrderSpecial.CreationTime <= dto.EndTime);
 	}
+	/// <summary>
+	/// 部门满意度统计
+	/// </summary>
+	/// <returns></returns>
+	public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgSatisfactionStatistics(PagedKeywordSonRequest dto) {
+	    dto.EndDate = dto.EndDate.Value.AddDays(1).AddSeconds(-1);
+
+		bool IsCenter = _sessionContext.OrgIsCenter;
+
+		var list = _orderVisitDetailRepository.Queryable()
+			.Where(x => x.OrderVisit.VisitTime >= dto.StartDate.Value && x.OrderVisit.VisitTime <= dto.EndDate.Value && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited && !string.IsNullOrEmpty(x.VisitOrgCode))
+			.WhereIF(string.IsNullOrEmpty(dto.OrgName) == false, x => x.VisitOrgName.Contains(dto.OrgName))
+			.WhereIF(string.IsNullOrEmpty(dto.LineNum) == false, x => x.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
+			.WhereIF(IsCenter == false, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId));
+
+		var data = new List<VisitAndOrgSatisfactionStatisticsDto>();
+
+		if (IsCenter && list != null)
+		{
+			data = await list.GroupBy(x => new
+			{
+				VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+			})
+			.Select(x => new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+				TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
+				VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
+				SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+				RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
+				DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
+				NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
+				NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
+				NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
+			})
+			.MergeTable()
+			.LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
+			.Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = o.Name,
+				OrgCode = it.OrgCode,
+				OrgType = o.OrgType,
+				TotalSumCount = it.TotalSumCount,
+				VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
+				SatisfiedCount = it.SatisfiedCount, //满意数
+				RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
+				DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
+				NoSatisfiedCount = it.NoSatisfiedCount,//不满意
+				NoEvaluateCount = it.NoEvaluateCount,//未做评价
+				NoPutThroughCount = it.NoPutThroughCount,//未接通
+			})
+			.ToListAsync();
+		}
+		else
+		{
+			data = await list.GroupBy(x => new
+			{
+				x.VisitOrgCode
+			})
+			.Select(x => new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgCode = x.VisitOrgCode,
+				TotalSumCount = SqlFunc.AggregateCount(x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))),
+				VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
+				SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+				RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
+				DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
+				NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
+				NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
+				NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通
+			})
+			.MergeTable()
+			.LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
+			.Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = o.Name,
+				OrgCode = it.OrgCode,
+				OrgType = o.OrgType,
+				TotalSumCount = it.TotalSumCount,
+				VerySatisfiedCount = it.VerySatisfiedCount,//非常满意数
+				SatisfiedCount = it.SatisfiedCount, //满意数
+				RegardedAsSatisfiedCount = it.RegardedAsSatisfiedCount,//视为满意
+				DefaultSatisfiedCount = it.DefaultSatisfiedCount,//默认满意
+				NoSatisfiedCount = it.NoSatisfiedCount,//不满意
+				NoEvaluateCount = it.NoEvaluateCount,//未做评价
+				NoPutThroughCount = it.NoPutThroughCount,//未接通
+			})
+			.ToListAsync();
+		}
+        return data;
+	}
+
+	/// <summary>
+	/// 子部门满意度
+	/// </summary>
+	/// <returns></returns>
+	public async Task<List<VisitAndOrgSatisfactionStatisticsDto>> VisitAndOrgStatisfactionOrgDetail(PagedKeywordSonRequest dto)
+	{
+		dto.EndDate = dto.EndDate.Value.AddDays(1).AddSeconds(-1);
+
+		bool IsCenter = _sessionContext.OrgIsCenter;
+
+		var list = await _systemOrganizeRepository.Queryable().Where(x => x.Id.StartsWith(dto.OrgCode))
+			.LeftJoin<OrderVisitDetail>((x, it) => x.Id == it.VisitOrgCode)
+			.Where((x, it) => it.OrderVisit.VisitTime >= dto.StartDate.Value && it.OrderVisit.VisitTime <= dto.EndDate.Value && it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
+			.WhereIF(dto.OrgCode == "001", (x, it) => it.VisitOrgCode == dto.OrgCode)
+			.WhereIF(dto.OrgCode != "001", (x, it) => it.VisitOrgCode.StartsWith(dto.OrgCode))
+			.WhereIF(!string.IsNullOrEmpty(dto.LineNum), (x, it) => it.OrderVisit.Order.CallRecord.Gateway.Contains(dto.LineNum))
+			.WhereIF(IsCenter == false, (x, it) => it.VisitOrgCode.StartsWith(_sessionContext.OrgId))
+			 .GroupBy((x, it) => new
+			 {
+				 VisitOrgCode = it.VisitOrgCode
+			 })
+			 .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
+			 {
+				 OrgCode = it.VisitOrgCode,
+				 TotalSumCount = SqlFunc.AggregateCount(it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9"))),
+				 VerySatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数
+				 SatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数
+				 RegardedAsSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意
+				 DefaultSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意
+				 NoSatisfiedCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意
+				 NoEvaluateCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价
+				 NoPutThroughCount = SqlFunc.IIF(dto.TypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(it.OrgHandledAttitude, "Key") == "6", 1, 0)))//未接通
+			 })
+			 .MergeTable()
+			 .LeftJoin<SystemOrganize>((x, it) => x.OrgCode == it.Id)
+			.Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
+			{
+				OrgName = it.Name,
+				OrgCode = x.OrgCode,
+				OrgType = it.OrgType,
+				TotalSumCount = x.TotalSumCount,
+				VerySatisfiedCount = x.VerySatisfiedCount,//非常满意数
+				SatisfiedCount = x.SatisfiedCount, //满意数
+				RegardedAsSatisfiedCount = x.RegardedAsSatisfiedCount,//视为满意
+				DefaultSatisfiedCount = x.DefaultSatisfiedCount,//默认满意
+				NoSatisfiedCount = x.NoSatisfiedCount,//不满意
+				NoEvaluateCount = x.NoEvaluateCount,//未做评价
+				NoPutThroughCount = x.NoPutThroughCount,//未接通
+			})
+			.ToListAsync();
+        return list;
+	}
 
+	/// <summary>
+	/// 部门满意度明细统计
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	public ISugarQueryable<OrderVisitDetail> VisitAndOrgSatisfactionDetail(VisitAndOrgSatisfactionDetailDto dto)
+	{
+		dto.EndDate = dto.EndDate.AddDays(1).AddSeconds(-1);
+		bool IsCenter = _sessionContext.OrgIsCenter;
+        return _orderVisitDetailRepository.Queryable()
+            .Includes(x => x.OrderVisit, o => o.Order, d => d.CallRecord)
+            .Where(x => x.OrderVisit.VisitTime >= dto.StartDate && x.OrderVisit.VisitTime <= dto.EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
+            .WhereIF(dto.OrgCode == "001", x => x.VisitOrgCode == dto.OrgCode)
+            //.WhereIF(dto.OrgCode != "001", x => x.VisitOrgCode == dto.OrgCode).
+            .WhereIF(dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
+            .WhereIF(IsCenter == true && dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
+            .WhereIF(IsCenter == true && dto.IsOnlyMy == null, x => x.VisitOrgCode.StartsWith(dto.OrgCode))
+            .WhereIF(IsCenter == false, x => x.VisitOrgCode == dto.OrgCode)
+            .WhereIF(dto.TypeId is 1, x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.DateValue)
+            .WhereIF(dto.TypeId is 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == dto.DateValue)
+            .WhereIF(!string.IsNullOrEmpty(dto.LineNum), x => x.OrderVisit.Order.CallRecord.Gateway == dto.LineNum);
+	}
 	#region private
 
 	/// <summary>

+ 3 - 3
src/Hotline.Share/Dtos/Bi/BiOrderDto.cs

@@ -6,9 +6,9 @@ namespace Hotline.Share.Dtos.Bi
     {
         public DateTime StartDate { get; set; }
         public DateTime EndDate { get; set; }
-        public string OrgCode { get; set; }
-        public int TypeId { get; set; }
-        public string DateValue { get; set; }
+        public string? OrgCode { get; set; }
+        public int? TypeId { get; set; }
+        public string? DateValue { get; set; }
 
         public string? LineNum { get; set; }
 

+ 21 - 0
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -16,6 +16,27 @@ public record PagedKeywordRequest : PagedRequest
 
 	public string? Keyword { get; set; }
 }
+public record PagedKeywordSonRequest : PagedRequest
+{
+	/// <summary>
+	/// 开始时间
+	/// </summary>
+	public DateTime? StartDate { get; set; }
+
+	/// <summary>
+	/// 结束时间
+	/// </summary>
+	public DateTime? EndDate { get; set; }
+
+	public string? OrgName { get; set; }
+	public string? OrgCode { get; set; }
+	/// <summary>
+	/// 1:办件结果 2:办件态度
+	/// </summary>
+	public int? TypeId { get; set; }
+
+	public string? LineNum { get; set; }
+}
 
 public record ReportPagedRequest : PagedKeywordRequest 
 {