using DotNetCore.CAP; using Hotline.Application.FlowEngine; using Hotline.File; using Hotline.FlowEngine.Workflows; using Hotline.Orders; using Hotline.Repository.SqlSugar.Orders; using Hotline.Settings.TimeLimits; using Hotline.Share.Dtos; using Hotline.Share.Dtos.FlowEngine; using Hotline.Share.Dtos.Order; using Hotline.Share.Enums.Order; using MapsterMapper; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using SqlSugar; using System.Threading; using Hotline.Repository.SqlSugar.Extensions; using XF.Domain.Authentications; using XF.Domain.Dependency; using XF.Domain.Exceptions; using XF.Domain.Repository; using Hotline.Share.Requests; using Hotline.Settings; using Novacode; using Hotline.Share.Enums.FlowEngine; using Hotline.Settings.TimeLimitDomain; namespace Hotline.Application.Orders { public class OrderSecondaryHandlingApplication : IOrderSecondaryHandlingApplication, IScopeDependency { private readonly IMapper _mapper; private readonly IRepository _orderSecondaryHandlingRepository; private readonly IFileRepository _fileRepository; private readonly IRepository _orderVisitRepository; private readonly ISessionContext _sessionContext; private readonly IOrderRepository _orderRepository; private readonly ITimeLimitDomainService _timeLimitDomainService; private readonly ICalcExpireTime _expireTime; private readonly ICapPublisher _capPublisher; private readonly IWorkflowApplication _workflowApplication; private readonly IRepository _orderPublishRepository; private readonly IRepository _orderPublishHistoryRepository; private readonly IWorkflowDomainService _workflowDomainService; private readonly IRepository _orderVisitedDetailRepository; private readonly IOrderDomainService _orderDomainService; public OrderSecondaryHandlingApplication( IMapper mapper, IRepository orderSecondaryHandlingRepository, IFileRepository fileRepository, IRepository orderVisitRepository, ISessionContext sessionContext, IOrderRepository orderRepository, ITimeLimitDomainService timeLimitDomainService, ICapPublisher capPublisher, IWorkflowApplication workflowApplication, IRepository orderPublishRepository, IRepository orderPublishHistoryRepository, IWorkflowDomainService workflowDomainService, IRepository orderVisitedDetailRepository, IOrderDomainService orderDomainService , ICalcExpireTime expireTime) { _mapper = mapper; _orderSecondaryHandlingRepository = orderSecondaryHandlingRepository; _fileRepository = fileRepository; _orderVisitRepository = orderVisitRepository; _sessionContext = sessionContext; _orderRepository = orderRepository; _timeLimitDomainService = timeLimitDomainService; _capPublisher = capPublisher; _workflowApplication = workflowApplication; _orderPublishRepository = orderPublishRepository; _orderPublishHistoryRepository = orderPublishHistoryRepository; _workflowDomainService = workflowDomainService; _orderVisitedDetailRepository = orderVisitedDetailRepository; _orderDomainService = orderDomainService; _expireTime = expireTime; } /// /// 二次办理新增 /// /// public async Task AddAsync(AddOrderSecondaryHandlingDto dto, CancellationToken cancellationToken) { var model = _mapper.Map(dto); if (string.IsNullOrEmpty(dto.Id)) { model.InitId(); } else { model = await _orderSecondaryHandlingRepository.GetAsync(dto.Id, cancellationToken); model.Content = dto.Content; } model.State = ESecondaryHandlingState.Apply; model.ApplyOrgId = _sessionContext.OrgId; model.ApplyOrgName = _sessionContext.OrgName; if (dto.Files.Any()) model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken); var visit = await _orderVisitRepository.GetAsync(x => x.Id == dto.VisitId && x.VisitState != EVisitState.None, cancellationToken); if (visit != null) { model.VisitState = visit.VisitState; //visit.VisitState = EVisitState.None; visit.IsCanHandle = false; await _orderVisitRepository.UpdateAsync(visit, cancellationToken); } if (!string.IsNullOrEmpty(dto.Id)) { await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken); } else { await _orderSecondaryHandlingRepository.AddAsync(model, cancellationToken); } } public async Task SendBackAsync(SendBackOrderSecondaryHandlingDto dto, CancellationToken cancellationToken) { var model = await _orderSecondaryHandlingRepository.GetAsync(dto.Id, cancellationToken); model.State = ESecondaryHandlingState.NotApply; model.SendBackContent = dto.SendBackContent; model.AuditUser = _sessionContext.UserName; model.AuditTime = DateTime.Now; model.SendBackNum = model.SendBackNum is null ? 1 : model.SendBackNum + 1; await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken); var visit = await _orderVisitRepository.GetAsync(x => x.Id == model.VisitId, cancellationToken); if (visit != null) { //visit.VisitState = model.VisitState; visit.IsCanHandle = true; await _orderVisitRepository.UpdateAsync(visit, cancellationToken); } } /// /// 二次办理审批 /// /// public async Task AuditAsync(AuditOrderSecondaryHandlingDto dto, OrderSecondaryHandling model, CancellationToken cancellationToken) { model.State = dto.State; model.AuditContent = dto.AuditContent; model.AuditId = _sessionContext.UserId; model.AuditUser = _sessionContext.UserName; model.AuditTime = DateTime.Now; var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == model.OrderId, cancellationToken); if (model.State == ESecondaryHandlingState.End) { var order = await _orderRepository.GetAsync(x => x.Id == model.OrderId, cancellationToken); if (string.IsNullOrEmpty(order.WorkflowId)) throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程信息!"); var step = order.CounterSignType == ECounterSignType.Department ? await _workflowDomainService.FindTopHandleStepAsync(order.WorkflowId, cancellationToken) : await _workflowDomainService.FindLastHandleStepAsync(order.WorkflowId, model.ApplyOrgId, cancellationToken); if (step == null) throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程节点!"); var recall = new RecallDto { WorkflowId = order.WorkflowId!, NextStepCode = step.Code, NextStepName = step.Name, NextHandlers = new List { step.GetWorkflowStepHandler() }, Opinion = dto.AuditContent, FlowDirection = Share.Enums.FlowEngine.EFlowDirection.CenterToOrg, HandlerType = step.HandlerType, BusinessType = step.BusinessType }; var reTransactNum = order.ReTransactNum is null ? 1 : order.ReTransactNum + 1; //var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode); var expiredTime = await _expireTime.CalcEndTime(DateTime.Now, order.AcceptTypeCode); var processType = step.FlowDirection == EFlowDirection.OrgToCenter || step.FlowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban; var isOrderFiled = order.Status >= EOrderStatus.Filed; await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ReTransactNum = reTransactNum, ProcessType = processType, Status = EOrderStatus.Handling }) .Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken); var orderDto = _mapper.Map(order); await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken); var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == model.OrderId); if (publish != null) { var publishHistory = _mapper.Map(publish); publishHistory.OrderPublishId = publish.Id; publishHistory.ArrangeTitleAfter = publish.ArrangeTitle; publishHistory.ArrangeTitleBefor = publish.ArrangeTitle; publishHistory.ArrangeContentAfter = publish.ArrangeContent; publishHistory.ArrangeContentBefor = publish.ArrangeContent; publishHistory.ArrangeOpinionAfter = publish.ArrangeOpinion; publishHistory.ArrangeOpinionBefor = publish.ArrangeOpinion; await _orderPublishHistoryRepository.AddAsync(publishHistory, cancellationToken); await _orderPublishRepository.RemoveAsync(publish, false, cancellationToken); } await _workflowApplication.RecallAsync(recall, expiredTime.ExpiredTime, isOrderFiled, EWorkflowTraceType.SecondHandle, cancellationToken); visit.VisitState = EVisitState.None; await _orderVisitRepository.UpdateAsync(visit, cancellationToken); } else { visit.IsCanHandle = true; await _orderVisitRepository.UpdateAsync(visit, cancellationToken); } await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken); } /// /// 获取申请列表 /// /// public ISugarQueryable ApplyQuery(MayScreenListDto dto, CancellationToken cancellationToken) { //dto.CreationTimeEnd = DateTime.Now; ////dto.CreationTimeStart = DateTime.Now; //dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5); var isAdmin = _orderDomainService.IsCheckAdmin(); var query = _orderVisitedDetailRepository.Queryable(false, true) .Includes(x => x.OrderVisit) .Includes(x => x.OrderVisit, y => y.Order) .Includes(x => x.OrderVisit, y => y.Employee) .Includes(x => x.SecondaryHandling) .Where(x => x.OrderVisit.Order.IsProvince == false) .LeftJoin((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false) .Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null)) //.Where(x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart) .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!)) .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince) .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!)) .WhereIF(!string.IsNullOrEmpty(dto.SourceChannel), x => x.OrderVisit.Order!.SourceChannelCode! == dto.SourceChannel!) .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), x => x.OrderVisit.Order!.AcceptTypeCode! == dto.AcceptType!) .WhereIF(dto.CounterSignType.HasValue, x => x.OrderVisit.Order!.CounterSignType == dto.CounterSignType) .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), x => x.OrderVisit.Order!.OrgLevelOneName!.Contains(dto.OrgLevelOneName!)) .WhereIF(!string.IsNullOrEmpty(dto.CurrentHandleOrgName), x => x.OrderVisit.Order!.CurrentHandleOrgName!.Contains(dto.CurrentHandleOrgName!)) .WhereIF(dto.CurrentHandleTime.HasValue && dto.EndCurrentHandleTime.HasValue, x => x.OrderVisit.Order!.ActualHandleTime >= dto.CurrentHandleTime && x.OrderVisit.Order!.ActualHandleTime <= dto.EndCurrentHandleTime) .WhereIF(dto.FiledTime.HasValue && dto.EndFiledTime.HasValue, x => x.OrderVisit.Order!.FiledTime >= dto.FiledTime && x.OrderVisit.Order!.FiledTime <= dto.EndFiledTime) .WhereIF(dto.CreationTime.HasValue && dto.EndCreationTime.HasValue, x => x.OrderVisit.Order!.CreationTime >= dto.CreationTime && x.OrderVisit.Order!.CreationTime <= dto.EndCreationTime) .WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue, x => x.OrderVisit.VisitTime >= dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime) .WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!)) .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults) .WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude), x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude)) .WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason), x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason) .Where((x, s) => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle) .WhereIF(!isAdmin, (x, s) => (x.OrderVisit.Order.CounterSignType == ECounterSignType.Department || x.OrderVisit.Order.CounterSignType == null) && x.VisitOrgCode.StartsWith(_sessionContext.OrgId)) ; if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter) { query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) || x.OrderVisit.Order.No.Contains(dto.Keyword!)) .Where((x, s) => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode.StartsWith(_sessionContext.OrgId) && ( SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2" )); } else { query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), (x, s) => x.OrderVisit.Order.Title.Contains(dto.Keyword!) || x.OrderVisit.Order.No.Contains(dto.Keyword!)) .Where((x, s) => x.VisitTarget == EVisitTarget.Org && ( SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" || SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" || SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2" )); } return query.OrderByDescending((x, s) => x.CreationTime); } /// /// 二次办理列表查询 /// /// public ISugarQueryable Query(SecondaryHandlingListDto dto, CancellationToken cancellationToken) { if (dto.CreationTimeEnd.HasValue) dto.CreationTimeEnd = dto.CreationTimeEnd.Value.AddDays(1).AddSeconds(-1); var quer = _orderSecondaryHandlingRepository.Queryable() .Includes(x => x.Order) .Includes(x => x.VisitDetail) .Includes(x => x.Visit, d => d.Order) .Where(x => x.State > ESecondaryHandlingState.NotApply) .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Visit.Order.Title.Contains(dto.Keyword!) || x.Visit.Order.No.Contains(dto.Keyword!)) .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Visit.Order.Title.Contains(dto.Title!)) .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Visit.Order.No.Contains(dto.No!)) .WhereIF(dto.Status is ESecondaryHandlingState.Apply, x => x.State == ESecondaryHandlingState.Apply) .WhereIF(dto.Status is ESecondaryHandlingState.Handled, x => x.State != ESecondaryHandlingState.Apply) .WhereIF(dto.Status is ESecondaryHandlingState.End || dto.Status is ESecondaryHandlingState.Refuse || dto.Status is ESecondaryHandlingState.NotApply, x => x.State == dto.Status) .WhereIF(dto.CreationTimeStart.HasValue, x => x.CreationTime >= dto.CreationTimeStart) .WhereIF(dto.CreationTimeEnd.HasValue, x => x.CreationTime <= dto.CreationTimeEnd) .WhereIF(!string.IsNullOrEmpty(dto.OrderId), x => x.OrderId == dto.OrderId); if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter) { quer.Where(x => x.ApplyOrgId.StartsWith(_sessionContext.OrgId)); } return quer.OrderByDescending(x => x.CreationTime); } /// /// 获取实体 /// /// public async Task Entity(string id, CancellationToken cancellationToken) { return await _orderSecondaryHandlingRepository.Queryable() .FirstAsync(x => x.Id == id, cancellationToken); } /// /// 二次办理统计 /// /// /// public ISugarQueryable SecondaryHandlingReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken) { if (dto.EndTime.HasValue) dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1); return _orderSecondaryHandlingRepository.Queryable() .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime) .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime) .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName)) .Where(x => x.State == ESecondaryHandlingState.End) .GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName }) .Select(x => new SecondaryHandlingVo { OrgId = x.ApplyOrgId, OrgName = x.ApplyOrgName, Num = SqlFunc.AggregateCount(x.Id) }) .OrderByIF(dto.SortRule is 0, x => x.Num, OrderByType.Asc) .OrderByIF(dto.SortRule is 1, x => x.Num, OrderByType.Desc); } /// /// 二次办理统计明细 /// /// /// public ISugarQueryable SecondaryHandlingDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken) { if (dto.EndTime.HasValue) dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1); return _orderSecondaryHandlingRepository.Queryable() .Includes(x => x.Order) .Includes(x => x.Visit) .Includes(x => x.VisitDetail) .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime) .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime) .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName)) .Where(x => x.ApplyOrgId == dto.OrgId) .Where(x => x.State == ESecondaryHandlingState.End); } /// /// 二次办理满意度统计 /// /// /// public ISugarQueryable SecondaryHandlingSatisfactionReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken) { if (dto.EndTime.HasValue) dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1); return _orderSecondaryHandlingRepository.Queryable() .Includes(x => x.Order) .Includes(x => x.Visit) .Includes(x => x.VisitDetail) .Includes(x => x.Order, o => o.CallRecord) .LeftJoin((x, o) => x.ApplyOrgId == o.Id) .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime) .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime) .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName)) .WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN)) .GroupBy((x, o) => new { x.ApplyOrgId, x.ApplyOrgName, o.OrgType }) .Select((x, o) => new SecondaryHandlingSatisfactionVo() { OrgId = x.ApplyOrgId, OrgName = x.ApplyOrgName, OrgType = o.OrgType, TotalSumCount = SqlFunc.AggregateCount(x.Id), VerySatisfiedCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "5", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "5", 1, 0))),//非常满意数 SatisfiedCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "4", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "4", 1, 0))), //满意数 RegardedAsSatisfiedCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "-1", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "-1", 1, 0))),//视为满意 DefaultSatisfiedCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "0", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "0", 1, 0))),//默认满意 NoSatisfiedCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "2", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "2", 1, 0))),//不满意 NoEvaluateCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "7", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "7", 1, 0))),//未做评价 NoPutThroughCount = SqlFunc.IIF(dto.VisitTypeId == 1, SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == "6", 1, 0)), SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == "6", 1, 0))),//未接通 }); } /// /// 二次办理满意度统计明细 /// /// /// public ISugarQueryable SecondaryHandlingSatisfactionDetailReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken) { var key = string.Empty; if (dto.EndTime.HasValue) dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1); if (!string.IsNullOrEmpty(dto.Header)) { switch (dto.Header) { case "verySatisfiedCount": key = "5"; break; case "satisfiedCount": key = "4"; break; case "regardedAsSatisfiedCount": key = "-1"; break; case "defaultSatisfiedCount": key = "0"; break; case "noSatisfiedCount": key = "2"; break; case "noEvaluateCount": key = "7"; break; case "noPutThroughCount": key = "6"; break; } } return _orderSecondaryHandlingRepository.Queryable() .Includes(x => x.Order) .Includes(x => x.Visit) .Includes(x => x.VisitDetail) .Includes(x => x.Order, o => o.CallRecord) .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime) .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime) .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName)) .WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN)) .WhereIF(dto.VisitTypeId is 1 && !string.IsNullOrEmpty(key), x => SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == key) .WhereIF(dto.VisitTypeId is 2 && !string.IsNullOrEmpty(key), x => SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == key) .Where(x => x.ApplyOrgId == dto.OrgId) .Where(x => x.State == ESecondaryHandlingState.End); } } }