Browse Source

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

Xfedge 4 months ago
parent
commit
f89beafecc
24 changed files with 655 additions and 251 deletions
  1. 17 0
      src/Hotline.Api/Controllers/Bi/BiCallController.cs
  2. 1 1
      src/Hotline.Api/Controllers/Bi/BiOrderController.cs
  3. 111 54
      src/Hotline.Api/Controllers/OrderController.cs
  4. 59 3
      src/Hotline.Api/Controllers/PushProvinceController.cs
  5. 1 1
      src/Hotline.Api/Controllers/TestController.cs
  6. 1 1
      src/Hotline.Api/StartupHelper.cs
  7. 7 0
      src/Hotline.Application/Orders/IOrderApplication.cs
  8. 96 34
      src/Hotline.Application/Orders/OrderApplication.cs
  9. 128 119
      src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs
  10. 5 0
      src/Hotline.Application/StatisticalReport/CallReport/CallReportApplicationBase.cs
  11. 15 0
      src/Hotline.Application/StatisticalReport/CallReport/YiBinCallReportApplication.cs
  12. 8 0
      src/Hotline.Application/StatisticalReport/ICallReportApplication.cs
  13. 19 0
      src/Hotline.Repository.SqlSugar/CallCenter/TrCallRecordRepository.cs
  14. 4 3
      src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs
  15. 114 1
      src/Hotline.Share/Dtos/CallCenter/BiQueryCallsDto.cs
  16. 1 1
      src/Hotline.Share/Dtos/Order/OrderBiDto.cs
  17. 13 1
      src/Hotline.Share/Dtos/Order/OrderVisitDto.cs
  18. 8 1
      src/Hotline.Share/Dtos/Order/Publish/QueryOrderPublishDto.cs
  19. 7 0
      src/Hotline.Share/Dtos/Order/PublishedDto.cs
  20. 12 0
      src/Hotline.Share/Requests/PagedKeywordRequest.cs
  21. 8 0
      src/Hotline/CallCenter/Calls/ITrCallRecordRepository.cs
  22. 1 27
      src/Hotline/Orders/OrderDomainService.cs
  23. 1 0
      src/Hotline/Settings/TimeLimitDomain/ExpireTimeLimitBase.cs
  24. 18 4
      src/Hotline/Settings/TimeLimitDomain/ExpireTimeSupplier/WorkDaySupplier.cs

+ 17 - 0
src/Hotline.Api/Controllers/Bi/BiCallController.cs

@@ -519,4 +519,21 @@ public class BiCallController : BaseController
                 await _callReportApplication.GetCallHotLineListAsync(dto.QueryDto, HttpContext.RequestAborted)
                 )
             , "热线号码统计");
+
+
+    #region 宜宾话务表
+
+    /// <summary>
+    /// 话务日期统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("query-calldate-statistics")]
+    [AllowAnonymous]
+    public async Task<List<QueryCallDateStatisticsDetailResp>> QueryCallDateStatisticsDetail([FromQuery] QueryCallDateStatisticsDetailDto dto)
+    {
+        return await _callReportApplication.QueryCallDateStatisticsDetail(dto);
+    }
+
+    #endregion
 }

+ 1 - 1
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -1103,7 +1103,7 @@ namespace Hotline.Api.Controllers.Bi
         {
             var query = _orderVisitRepository.Queryable()
                 .Includes(x => x.Employee)
-                 .Where(x => x.VisitTime >= dto.StartTime && x.VisitTime <= dto.EndTime && x.VisitState == EVisitState.Visited)
+                 .Where(x => x.VisitTime >= dto.StartTime && x.VisitTime <= dto.EndTime && x.VisitState == EVisitState.Visited && x.EmployeeId != "" && x.EmployeeId != null)
                  .WhereIF(!string.IsNullOrEmpty(dto.VisitName), x => x.Employee.Name.Contains(dto.VisitName))
                  .GroupBy(x => new { x.EmployeeId, x.Employee.Name })
                  .Select(x => new VisitMeasureStatisticsModelDto()

+ 111 - 54
src/Hotline.Api/Controllers/OrderController.cs

@@ -284,7 +284,7 @@ public class OrderController : BaseController
     #region 工单发布
 
     /// <summary>
-    /// 发布办(集合)
+    /// 发布办(集合)
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
@@ -297,7 +297,7 @@ public class OrderController : BaseController
     }
 
     /// <summary>
-    /// 发布
+    /// 发布
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
@@ -307,6 +307,40 @@ public class OrderController : BaseController
         return await _orderApplication.GetPublishOrderList(dto).CountAsync(HttpContext.RequestAborted);
     }
 
+    /// <summary>
+    /// 发布待办数据--导出
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("publishorder/export")]
+    public async Task<FileStreamResult> ExportPublishOrders([FromBody] ExportExcelDto<QueryOrderPublishDto> dto)
+    {
+        var query = _orderApplication.GetPublishOrderList(dto.QueryDto);
+        List<Order> orders;
+        if (dto.IsExportAll)
+        {
+            orders = await query.ToListAsync(HttpContext.RequestAborted);
+        }
+        else
+        {
+            var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+            orders = items;
+        }
+
+        var orderDtos = _mapper.Map<ICollection<PublishDto>>(orders);
+
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+        var dtos = orderDtos
+            .Select(stu => _mapper.Map(stu, typeof(PublishDto), dynamicClass))
+            .Cast<object>()
+            .ToList();
+
+        var stream = ExcelHelper.CreateStream(dtos);
+
+        return ExcelStreamResult(stream, "发布待办数据");
+    }
+
     /// <summary>
     /// 查询(工单发布)
     /// </summary>
@@ -557,7 +591,7 @@ public class OrderController : BaseController
         //任何类型的省工单都不需要发送短信
         try
         {
-            if (order.Source != ESource.ProvinceStraight)
+            if (order.Source != ESource.ProvinceStraight && _appOptions.Value.IsYiBin)
             {
                 var code = "";
                 //受理类型为“投诉、举报”
@@ -725,6 +759,40 @@ public class OrderController : BaseController
         return await _orderApplication.GetPublishedOrder(dto).CountAsync();
     }
 
+    /// <summary>
+    /// 发布列表数据--导出
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("publishedorder/export")]
+    public async Task<FileStreamResult> ExportPublishedOrders([FromBody] ExportExcelDto<PublishedPagedRequest> dto)
+    {
+        var query = _orderApplication.GetPublishedOrder(dto.QueryDto);
+        List<OrderPublish> orders;
+        if (dto.IsExportAll)
+        {
+            orders = await query.ToListAsync(HttpContext.RequestAborted);
+        }
+        else
+        {
+            var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+            orders = items;
+        }
+
+        var orderDtos = _mapper.Map<ICollection<PublishedDto>>(orders);
+
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+        var dtos = orderDtos
+            .Select(stu => _mapper.Map(stu, typeof(PublishedDto), dynamicClass))
+            .Cast<object>()
+            .ToList();
+
+        var stream = ExcelHelper.CreateStream(dtos);
+
+        return ExcelStreamResult(stream, "发布列表数据");
+    }
+
     /// <summary>
     /// 发布详情
     /// </summary>
@@ -914,58 +982,47 @@ public class OrderController : BaseController
     [HttpGet("visit")]
     public async Task<PagedDto<OrderVisitDto>> QueryOrderVisitList([FromQuery] QueryOrderVisitDto dto)
     {
-        var (total, items) = await _orderVisitRepository.Queryable()
-            .Includes(d => d.Order)
-            .Includes(d => d.Employee)
-            .Includes(d => d.OrderVisitDetails)
-            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoVisit,
-                d => d.VisitState == EVisitState.WaitForVisit ||
-                     d.VisitState == EVisitState.NoSatisfiedWaitForVisit)
-            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.Visited, d => d.VisitState == EVisitState.Visited)
-            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSUnsatisfied, d => d.VisitState == EVisitState.SMSUnsatisfied)
-            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSVisiting, d => d.VisitState == EVisitState.SMSVisiting)
-            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough, d => d.IsPutThrough == false && d.VisitState != EVisitState.Visited)
-            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.ChipVoiceVisiting, d => d.VisitState == EVisitState.AiVisiting)//任务 162:回访状态快捷查询条件
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.StartsWith(dto.Keyword!))
-            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
-            .WhereIF(dto.VisitType != null, d => d.VisitType == dto.VisitType)
-              //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.ProcessType == EProcessType.Zhiban)
-              //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.ProcessType == EProcessType.Jiaoban)
-              .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.FileOrgIsCenter == true)
-            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.FileOrgIsCenter == false)
-            .WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.Order.CounterSignType != null)
-            .WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.Order.CounterSignType == null)
-            .WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.EmployeeId == _sessionContext.RequiredUserId)
-            .WhereIF(!string.IsNullOrEmpty(dto.EmployeeName), d => !string.IsNullOrEmpty(d.EmployeeId) && d.Employee.Name.Contains(dto.EmployeeName))
-            .WhereIF(dto.IsProvince != null && dto.IsProvince == true, d => d.Order.IsProvince == true)
-            .WhereIF(dto.IsProvince != null && dto.IsProvince == false, d => d.Order.IsProvince == false)
-            .WhereIF(dto.IsEffectiveAiVisit != null, d => d.IsEffectiveAiVisit == dto.IsEffectiveAiVisit)
-            .WhereIF(dto.FromPhone.NotNullOrEmpty(), d => d.Order.FromPhone == dto.FromPhone)
-            .WhereIF(dto.Contact.NotNullOrEmpty(), d => d.Order.Contact == dto.Contact)
-            .WhereIF(dto.VoiceEvaluate.Any(), d => d.OrderVisitDetails.Any(m => dto.VoiceEvaluate.Contains(m.VoiceEvaluate.Value)))
-            .WhereIF(dto.SeatEvaluate.Any(), d => d.OrderVisitDetails.Any(m => dto.SeatEvaluate.Contains(m.SeatEvaluate.Value)))
-            .WhereIF(dto.OrgProcessingResults.Any(),
-                d => d.OrderVisitDetails.Any(m => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(m.OrgProcessingResults, "Key"))))
-            .WhereIF(dto.OrgHandledAttitude.Any(),
-                d => d.OrderVisitDetails.Any(q => dto.OrgHandledAttitude.Contains(SqlFunc.JsonField(q.OrgHandledAttitude, "Key"))))
-            .WhereIF(dto.IsOverTime == true,
-                d => (d.Order.ExpiredTime < DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
-                     (d.Order.ExpiredTime < d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //是 超期
-            .WhereIF(dto.IsOverTime == false,
-                d => (d.Order.ExpiredTime > DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
-                     (d.Order.ExpiredTime > d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //否 超期
-            .WhereIF(dto.StartTime.HasValue, d => d.VisitTime >= dto.StartTime)
-            .WhereIF(dto.EndTime.HasValue, d => d.VisitTime <= dto.EndTime)
-            .WhereIF(dto.StartPublishTime.HasValue && dto.EndPublishTime.HasValue, d => d.PublishTime >= dto.StartPublishTime && d.PublishTime <= dto.EndPublishTime) // 发布时间
-            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.Order.ActualHandleOrgName == dto.ActualHandleOrgName) //接办部门
-            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
-            .OrderByDescending(x => x.PublishTime)
-            .WhereIF(dto.Channel.NotNullOrEmpty(), d => d.Order.SourceChannelCode == dto.Channel)
-            .OrderByDescending(d => d.PublishTime)
-            .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+        var (total, items) = await _orderApplication.QueryOrderVisitList(dto).ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+
         return new PagedDto<OrderVisitDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDto>>(items));
     }
 
+    /// <summary>
+    /// 回访列表--导出
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("visit/export")]
+    public async Task<FileStreamResult> ExportOrderVisit([FromBody] ExportExcelDto<QueryOrderVisitDto> dto)
+    {
+        var query = _orderApplication.QueryOrderVisitList(dto.QueryDto);
+        List<OrderVisit> orders;
+        if (dto.IsExportAll)
+        {
+            orders = await query.ToListAsync(HttpContext.RequestAborted);
+        }
+        else
+        {
+            var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+            orders = items;
+        }
+
+        var orderDtos = _mapper.Map<ICollection<OrderVisitDto>>(orders);
+
+        dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+
+        var dtos = orderDtos
+            .Select(stu => _mapper.Map(stu, typeof(OrderVisitDto), dynamicClass))
+            .Cast<object>()
+            .ToList();
+
+        var stream = ExcelHelper.CreateStream(dtos);
+        var excelTitle = dto.QueryDto.VisitStateQuery == EVisitStateQuery.NoVisit ? "回访待办数据" : "回访列表数据";
+
+        return ExcelStreamResult(stream, excelTitle);
+    }
+
+
     /// <summary>
     /// 发送 回访短信
     /// </summary>
@@ -1044,8 +1101,8 @@ public class OrderController : BaseController
         {
             CallNative? call = null;
             if (orderVisit.CallId == null && orderVisit.VisitTime.HasValue)
-            { 
-                call = await _callApplication.GetCallByTimeAndToNoAsync(orderVisit.Order.Contact, orderVisit.VisitTime.Value,  HttpContext.RequestAborted);
+            {
+                call = await _callApplication.GetCallByTimeAndToNoAsync(orderVisit.Order.Contact, orderVisit.VisitTime.Value, HttpContext.RequestAborted);
             }
             call = await _callApplication.GetCallAsync(orderVisit.CallId, HttpContext.RequestAborted);
             if (call is not null)

+ 59 - 3
src/Hotline.Api/Controllers/PushProvinceController.cs

@@ -15,7 +15,10 @@ using Microsoft.Extensions.Options;
 using Microsoft.VisualBasic;
 using SqlSugar;
 using System.Text;
+using NPOI.SS.Formula.Functions;
 using XF.Domain.Repository;
+using Hotline.FlowEngine.WorkflowModules;
+using MediatR;
 
 namespace Hotline.Api.Controllers
 {
@@ -28,14 +31,16 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
         private readonly ICallApplication _callApplication;
         private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
+        private readonly IOrderScreenRepository _orderScreenRepository;
 
-        public PushProvinceController(ILogger<PushProvinceController> logger,
+		public PushProvinceController(ILogger<PushProvinceController> logger,
              IOrderRepository orderRepository,
              IMapper mapper,
              ICapPublisher capPublisher,
              IRepository<WorkflowTrace> workflowTraceRepository,
              ICallApplication callApplication,
-             IOptionsSnapshot<AppConfiguration> appOptions)
+             IOrderScreenRepository orderScreenRepository,
+			 IOptionsSnapshot<AppConfiguration> appOptions)
         {
             _logger = logger;
             _orderRepository = orderRepository;
@@ -44,7 +49,8 @@ namespace Hotline.Api.Controllers
             _workflowTraceRepository = workflowTraceRepository;
             _callApplication = callApplication;
             _appOptions = appOptions;
-        }
+            _orderScreenRepository = orderScreenRepository;
+		}
 
         /// <summary>
         /// 推送最新工单信息
@@ -225,5 +231,55 @@ namespace Hotline.Api.Controllers
             }
             return sbs;
         }
+
+        /// <summary>
+        /// 甄别申请重推
+        /// </summary>
+        /// <param name="Provinces"></param>
+        /// <returns></returns>
+        [HttpPost("order_screen_push_province")]
+        [AllowAnonymous]
+        public async Task OrderScreenPushProvince([FromBody] string Provinces)
+        {
+	        Provinces = Provinces.Trim();
+	        string[] provinceNos = Provinces.Split(',');
+	        for (int i = 0; i < provinceNos.Length; i++)
+	        {
+		        provinceNos[i] = provinceNos[i].Trim();
+	        }
+
+	        var unpublishScreens = await _orderScreenRepository.Queryable().Includes(x=>x.Order)
+		        .Where(x => provinceNos.Contains(x.Order.ProvinceNo) && !string.IsNullOrEmpty(x.Order.ProvinceNo) && x.Order.Status >= EOrderStatus.Filed)
+		        .ToListAsync(HttpContext.RequestAborted);
+	        if (unpublishScreens != null && unpublishScreens.Any())
+	        {
+		        foreach (var screen in unpublishScreens)
+		        {
+					var traces = await _workflowTraceRepository.Queryable()
+						.Where(d => d.WorkflowId == screen.WorkflowId  && d.ModuleCode == WorkflowModuleConsts.OrderScreen).ToListAsync(HttpContext.RequestAborted);
+					var currentStep = traces
+						.FirstOrDefault(x => x.Status == EWorkflowStepStatus.WaitForAccept ||
+						                     x.Status == EWorkflowStepStatus.WaitForHandle);
+					var prevStep = traces.FirstOrDefault(x => x.Id == currentStep.PrevStepId);
+
+					var screenDto = _mapper.Map<OrderScreenListDto>(screen);
+					var screenOrderDto = _mapper.Map<OrderDto>(screen.Order);
+					//省件甄别--以省审批前一个节点整理的甄别意见为准推送省上 宜宾
+					if (_appOptions.Value.IsYiBin && prevStep is not null &&  !string.IsNullOrEmpty(prevStep.Opinion))
+					{
+						screenDto.Content = prevStep.Opinion;
+						screenDto.Files = new List<Share.Dtos.File.FileDto>();
+					}
+					//推省上
+					_capPublisher.Publish(Hotline.Share.Mq.EventNames.HotlineOrderScreenApply, new PublishScreenDto()
+					{
+						Order = screenOrderDto,
+						Screen = screenDto,
+						ClientGuid = ""
+					});
+				}
+	        }
+        }
+
     }
 }

+ 1 - 1
src/Hotline.Api/Controllers/TestController.cs

@@ -519,7 +519,7 @@ ICallApplication callApplication,
         //var r = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToCenter, batchId);
         //var r = _timeLimitDomainService.CalcEndTime(DateTime.Parse("2024-09-12 14:45:47"), Share.Enums.Settings.ETimeType.WorkDay, 2, 80, 50);
         //_capPublisher.PublishDelay((DateTime.Now.AddMinutes(2) - DateTime.Now), EventNames.OrderRelateCall, "123");
-        var times = _expireTime.CalcExpiredTime(DateTime.Parse("2024-12-10 20:37:58"), DateTime.Parse("2024-12-10 20:37:58"), EFlowDirection.CenterToOrg,new OrderTimeClacInfo() { AcceptTypeCode= "10" });
+        var times = _expireTime.CalcExpiredTime(DateTime.Parse("2024-12-11 14:45:58"), DateTime.Parse("2024-12-11 14:45:58"), EFlowDirection.CenterToOrg,new OrderTimeClacInfo() { AcceptTypeCode= "20" });
         //await _capPublisher.PublishDelay(EventNames.OrderRelateCall, "123", cancellationToken: HttpContext.RequestAborted);
         return OpenResponse.Ok(times.Result);
     }

+ 1 - 1
src/Hotline.Api/StartupHelper.cs

@@ -288,7 +288,7 @@ namespace Hotline.Api
                             .WithIdentity("task-send-order-trigger")
                             .ForJob(autoSendOrderKey)
                             .StartNow()
-                            .WithCronSchedule("0 0 9 * * ?")
+                            .WithCronSchedule("0 10 9 * * ?")
                         );
                         break;
                     case AppDefaults.AppScope.ZiGong:

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

@@ -348,5 +348,12 @@ namespace Hotline.Application.Orders
         Task EndCountersign(EndCountersignDto dto, CancellationToken cancellationToken);
         ISugarQueryable<OrderPublish> GetPublishedOrder(PublishedPagedRequest dto);
         ISugarQueryable<Order> GetPublishOrderList(QueryOrderPublishDto dto);
+
+        /// <summary>
+        /// 回访列表
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        ISugarQueryable<OrderVisit> QueryOrderVisitList(QueryOrderVisitDto dto);
     }
 }

+ 96 - 34
src/Hotline.Application/Orders/OrderApplication.cs

@@ -1,55 +1,54 @@
 using DotNetCore.CAP;
 using Hotline.Application.Quality;
+using Hotline.Authentications;
 using Hotline.Caching.Interfaces;
+using Hotline.Configurations;
+using Hotline.EventBus;
 using Hotline.File;
+using Hotline.FlowEngine.WorkflowModules;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
+using Hotline.Orders.Notifications;
+using Hotline.OrderTranspond;
+using Hotline.Push.Notifies;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Repository.SqlSugar.Ts;
+using Hotline.Schedulings;
+using Hotline.SeedData;
+using Hotline.Settings;
+using Hotline.Settings.Hotspots;
+using Hotline.Settings.TimeLimitDomain;
 using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.Order.Publish;
+using Hotline.Share.Dtos.Push;
 using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Push;
 using Hotline.Share.Enums.Quality;
 using Hotline.Share.Enums.Settings;
+using Hotline.Share.Mq;
 using Hotline.Share.Requests;
 using Hotline.Tools;
+using Hotline.Users;
+using Mapster;
 using MapsterMapper;
+using MediatR;
+using Microsoft.Extensions.Options;
+using PanGu;
 using SqlSugar;
 using System.Data;
 using System.Dynamic;
-using Hotline.Settings;
 using XF.Domain.Authentications;
 using XF.Domain.Dependency;
+using XF.Domain.Entities;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
-using PanGu;
-using Hotline.Users;
-using Hotline.Settings.Hotspots;
-using Hotline.Share.Enums.FlowEngine;
-using Hotline.Authentications;
-using MediatR;
-using Hotline.Share.Mq;
-using WordInfo = PanGu.WordInfo;
-using Hotline.Schedulings;
-using XF.Domain.Entities;
-using Hotline.Settings.TimeLimitDomain;
-using Hotline.FlowEngine.WorkflowModules;
-using Hotline.SeedData;
-using Hotline.Share.Enums.Push;
-using Hotline.Push.Notifies;
-using Hotline.Configurations;
-using Microsoft.Extensions.Options;
-using Mapster;
-using Hotline.Share.Dtos.Push;
-using Hotline.EventBus;
-using Hotline.Orders.Notifications;
-using Hotline.OrderTranspond;
 using XF.Utility.EnumExtensions;
-using Hotline.Share.Dtos.Order.Publish;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using WordInfo = PanGu.WordInfo;
 
 namespace Hotline.Application.Orders;
 
@@ -675,8 +674,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             //.WhereIF(dto.PubState == EPubState.NoPub, d => d.Status == EOrderStatus.Filed)
             .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
             .WhereIF(!string.IsNullOrEmpty(dto.OrderTag), d => d.OrderTagCode == dto.OrderTag!) //工单标签
-            .WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), d => d.CenterToOrgHandlerName == dto.CenterToOrgHandlerName!) //派单人
-            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
+            .WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), d => d.CenterToOrgHandlerName.Contains(dto.CenterToOrgHandlerName)) //派单人
+            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo) || d.AcceptorStaffNo.Contains(dto.NameOrNo)) //受理人/坐席
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
             .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
@@ -691,7 +690,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
             //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
             .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.FileOrgIsCenter == true)
-            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d =>d. FileOrgIsCenter == false)
+            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.FileOrgIsCenter == false)
             .WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.CounterSignType != null)
             .WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.CounterSignType == null)
             .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
@@ -702,6 +701,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.FiledTimeStart.HasValue, d => d.FiledTime >= dto.FiledTimeStart)
             .WhereIF(dto.FiledTimeEnd.HasValue, d => d.FiledTime <= dto.FiledTimeEnd)
             .WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.WaitForPublisherId == _sessionContext.RequiredUserId)
+             .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
             .WhereIF(dto.IsOverTime == true,
                 d => (d.ExpiredTime < DateTime.Now && d.Status < EOrderStatus.Filed) ||
                      (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //是 超期
@@ -727,10 +727,12 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.Order.HotspotSpliceName != null && d.Order.HotspotSpliceName.Contains(dto.Hotspot))
             .WhereIF(!string.IsNullOrEmpty(dto.PublishName), d => d.CreatorName.Contains(dto.PublishName!))
             .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo),
-                d => d.Order.AcceptorName == dto.NameOrNo! || d.Order.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
+                d => d.Order.AcceptorName.Contains(dto.NameOrNo) || d.Order.AcceptorStaffNo.Contains(dto.NameOrNo)) //受理人/坐席
             .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
             .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
             .WhereIF(dto.Resolve.HasValue, x => x.Resolve == dto.Resolve)
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
+            .WhereIF(dto.IdentityType != null, d => d.Order.IdentityType == dto.IdentityType) //来电主体
             .WhereIF(dto.IsOverTime == true,
                 d => (d.Order.ExpiredTime < DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
                      (d.Order.ExpiredTime < d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //是 超期
@@ -753,8 +755,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .LeftJoin<User>((order, user) => order.WaitForPublisherId == user.Id)
             .Where((order, user) => order.CreationTime >= dto.StartTime && order.CreationTime <= dto.EndTime &&
                                     !string.IsNullOrEmpty(order.WaitForPublisherId))
-                 //  .WhereIF(dto.ProcessType != null, (order, user) => order.ProcessType == dto.ProcessType)
-             .WhereIF(dto.ProcessType != null && dto.ProcessType ==EProcessType.Zhiban, (order, user) => order.FileOrgIsCenter == true)
+             //  .WhereIF(dto.ProcessType != null, (order, user) => order.ProcessType == dto.ProcessType)
+             .WhereIF(dto.ProcessType != null && dto.ProcessType == EProcessType.Zhiban, (order, user) => order.FileOrgIsCenter == true)
             .WhereIF(dto.ProcessType != null && dto.ProcessType == EProcessType.Jiaoban, (order, user) => order.FileOrgIsCenter == false)
 
             .GroupBy((order, user) => new { order.WaitForPublisherId, user.Name })
@@ -1793,7 +1795,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     {
         bool IsCenter = _sessionContextProvider.SessionContext.OrgIsCenter;
 
-        var list = await _systemOrganizeRepository.Queryable().Where(x => x.ParentId == dto.OrgCode)
+        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.StartTime.Value && it.OrderVisit.VisitTime <= dto.EndTime.Value &&
                               it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitState == EVisitState.Visited)
@@ -1806,11 +1808,11 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.VisitType != null, (x, it) => it.OrderVisit.VisitType == dto.VisitType)
             .GroupBy((x, it) => new
             {
-                VisitOrgCode = it.VisitOrgCode
+                VisitOrgCode = it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"),SqlFunc.MappingColumn<int>("9"))
             })
             .Select((x, it) => new VisitAndOrgSatisfactionStatisticsDto()
             {
-                OrgCode = it.VisitOrgCode,
+                OrgCode = it.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("9")),
                 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)),
@@ -2839,6 +2841,66 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     }
     #endregion
 
+    /// <summary>
+    /// 回访列表
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public ISugarQueryable<OrderVisit> QueryOrderVisitList(QueryOrderVisitDto dto)
+    {
+        var query = _orderVisitRepository.Queryable()
+            .Includes(d => d.Order)
+            .Includes(d => d.Employee)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoVisit,
+                d => d.VisitState == EVisitState.WaitForVisit ||
+                     d.VisitState == EVisitState.NoSatisfiedWaitForVisit)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.Visited, d => d.VisitState == EVisitState.Visited)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSUnsatisfied, d => d.VisitState == EVisitState.SMSUnsatisfied)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.SMSVisiting, d => d.VisitState == EVisitState.SMSVisiting)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.NoPutThrough, d => d.IsPutThrough == false && d.VisitState != EVisitState.Visited)
+            .WhereIF(dto.VisitStateQuery == EVisitStateQuery.ChipVoiceVisiting, d => d.VisitState == EVisitState.AiVisiting)//任务 162:回访状态快捷查询条件
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Order.Title.Contains(dto.Keyword!))
+            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
+            .WhereIF(dto.VisitType != null, d => d.VisitType == dto.VisitType)
+              //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.ProcessType == EProcessType.Zhiban)
+              //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.ProcessType == EProcessType.Jiaoban)
+              .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.Order.FileOrgIsCenter == true)
+            .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.Order.FileOrgIsCenter == false)
+            .WhereIF(dto.IsCountersign != null && dto.IsCountersign == true, d => d.Order.CounterSignType != null)
+            .WhereIF(dto.IsCountersign != null && dto.IsCountersign == false, d => d.Order.CounterSignType == null)
+            .WhereIF(dto.QuerySelf.HasValue && dto.QuerySelf.Value, d => d.EmployeeId == _sessionContext.RequiredUserId)
+            .WhereIF(!string.IsNullOrEmpty(dto.EmployeeName), d => !string.IsNullOrEmpty(d.EmployeeId) && d.Employee.Name.Contains(dto.EmployeeName))
+            .WhereIF(dto.IsProvince != null && dto.IsProvince == true, d => d.Order.IsProvince == true)
+            .WhereIF(dto.IsProvince != null && dto.IsProvince == false, d => d.Order.IsProvince == false)
+            .WhereIF(dto.IsEffectiveAiVisit != null, d => d.IsEffectiveAiVisit == dto.IsEffectiveAiVisit)
+            .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.Order.FromPhone == dto.FromPhone)
+            .WhereIF(!string.IsNullOrEmpty(dto.Contact), d => d.Order.Contact == dto.Contact)
+            .WhereIF(dto.VoiceEvaluate.Any(), d => d.OrderVisitDetails.Any(m => dto.VoiceEvaluate.Contains(m.VoiceEvaluate.Value)))
+            .WhereIF(dto.SeatEvaluate.Any(), d => d.OrderVisitDetails.Any(m => dto.SeatEvaluate.Contains(m.SeatEvaluate.Value)))
+            .WhereIF(dto.OrgProcessingResults.Any(),
+                d => d.OrderVisitDetails.Any(m => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(m.OrgProcessingResults, "Key"))))
+            .WhereIF(dto.OrgHandledAttitude.Any(),
+                d => d.OrderVisitDetails.Any(q => dto.OrgHandledAttitude.Contains(SqlFunc.JsonField(q.OrgHandledAttitude, "Key"))))
+            .WhereIF(dto.IsOverTime == true,
+                d => (d.Order.ExpiredTime < DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
+                     (d.Order.ExpiredTime < d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //是 超期
+            .WhereIF(dto.IsOverTime == false,
+                d => (d.Order.ExpiredTime > DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
+                     (d.Order.ExpiredTime > d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //否 超期
+            .WhereIF(dto.StartTime.HasValue, d => d.VisitTime >= dto.StartTime)
+            .WhereIF(dto.EndTime.HasValue, d => d.VisitTime <= dto.EndTime)
+            .WhereIF(dto.StartPublishTime.HasValue && dto.EndPublishTime.HasValue, d => d.PublishTime >= dto.StartPublishTime && d.PublishTime <= dto.EndPublishTime) // 发布时间
+            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.Order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门
+            .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.Order.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
+            .WhereIF(dto.IdentityType != null, d => d.Order.IdentityType == dto.IdentityType) //来电主体
+           .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart)
+            .WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd)
+            .OrderByDescending(x => x.PublishTime)
+            .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.Order.SourceChannelCode == dto.Channel)
+            .OrderByDescending(d => d.PublishTime);
+        return query;
+    }
+
     #region private
     /// <summary>
     /// 接受外部工单(除省平台)

+ 128 - 119
src/Hotline.Application/Orders/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs

@@ -9,131 +9,140 @@ using MediatR;
 using Hotline.Share.Dtos;
 using XF.Domain.Repository;
 using XF.Domain.Authentications;
+using Hotline.Configurations;
+using Microsoft.Extensions.Options;
 
 namespace Hotline.Application.Orders.OrderScreenHandler;
 public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
 {
-	private readonly IOrderRepository _orderRepository;
-	private readonly ICapPublisher _capPublisher;
-	private readonly IMapper _mapper;
-	private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
-	private readonly IRepository<OrderScreen> _orderScreenRepository;
-	private readonly IRepository<OrderVisit> _orderVisitRepository;
-	private readonly ISessionContext _sessionContext;
-	private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
+    private readonly IOrderRepository _orderRepository;
+    private readonly ICapPublisher _capPublisher;
+    private readonly IMapper _mapper;
+    private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
+    private readonly IRepository<OrderScreen> _orderScreenRepository;
+    private readonly IRepository<OrderVisit> _orderVisitRepository;
+    private readonly ISessionContext _sessionContext;
+    private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
+    private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
 
-	public OrderScreenEndWorkflowHandler(
-		IOrderRepository orderRepository,
-		ICapPublisher capPublisher,
-		IMapper mapper,
-		IRepository<OrderVisitDetail> orderVisitedDetailRepository,
-		IRepository<OrderScreen> orderScreenRepository,
-		IRepository<OrderVisit> orderVisitRepository,
-		ISessionContext sessionContext,
-		IRepository<OrderScreenDetail> orderScreenDetailRepository)
-	{
-		_orderRepository = orderRepository;
-		_capPublisher = capPublisher;
-		_mapper = mapper;
-		_orderScreenRepository = orderScreenRepository;
-		_orderVisitedDetailRepository = orderVisitedDetailRepository;
-		_orderVisitRepository = orderVisitRepository;
-		_sessionContext = sessionContext;
-		_orderScreenDetailRepository = orderScreenDetailRepository;
-	}
+    public OrderScreenEndWorkflowHandler(
+        IOrderRepository orderRepository,
+        ICapPublisher capPublisher,
+        IMapper mapper,
+        IRepository<OrderVisitDetail> orderVisitedDetailRepository,
+        IRepository<OrderScreen> orderScreenRepository,
+        IRepository<OrderVisit> orderVisitRepository,
+        ISessionContext sessionContext,
+        IRepository<OrderScreenDetail> orderScreenDetailRepository,
+         IOptionsSnapshot<AppConfiguration> appOptions)
+    {
+        _orderRepository = orderRepository;
+        _capPublisher = capPublisher;
+        _mapper = mapper;
+        _orderScreenRepository = orderScreenRepository;
+        _orderVisitedDetailRepository = orderVisitedDetailRepository;
+        _orderVisitRepository = orderVisitRepository;
+        _sessionContext = sessionContext;
+        _orderScreenDetailRepository = orderScreenDetailRepository;
+        _appOptions = appOptions;
 
-	/// <summary>Handles a notification</summary>
-	/// <param name="notification">The notification</param>
-	/// <param name="cancellationToken">Cancellation token</param>
-	public async Task Handle(EndWorkflowNotify notification, CancellationToken cancellationToken)
-	{
-		if (notification.Workflow.ModuleCode == WorkflowModuleConsts.OrderScreen) 
-		{
-			var workflow = notification.Workflow;
-			//审批是否通过
-			var isReviewPass = workflow.IsReviewPass();
+    }
 
-			var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);
-			if (screen != null)
-			{
-				screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
-				if (isReviewPass)
-				{
-					screen.Status = EScreenStatus.End;
-					screen.ReplyContent = workflow.ActualOpinion;
-					//await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
-					var visitDetail =
-						await _orderVisitedDetailRepository.GetAsync(screen.VisitDetailId, cancellationToken);
-					if (visitDetail != null)
-					{
-						if (screen.ScreenType == EOrderScreenType.Seat)
-						{
-							visitDetail.SeatEvaluate = ESeatEvaluate.DefaultSatisfied;
-							await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
-						}
-						else {
-							var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
-							visitDetail.OrgProcessingResults = screenSatisfy;
-							visitDetail.OrgNoSatisfiedReason = new List<Kv>();
-							//visitDetail.OrgHandledAttitude = screenSatisfy;
-							await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
-							// 修改主表当前评价结果
-							await _orderVisitRepository.Updateable().SetColumns(v => new OrderVisit() { NowEvaluate = screenSatisfy }).Where(v => v.Id == visitDetail.VisitId).ExecuteCommandAsync(cancellationToken);
-							//获取回访信息
-							var visit = await _orderVisitRepository.Queryable().Includes(x => x.Order)
-								.Includes(x => x.OrderVisitDetails)
-								.Where(x => x.Id == screen.VisitId).FirstAsync(cancellationToken);
-							if (visit != null)
-							{
-								//获取回访明细
-								var visitDe = visit.OrderVisitDetails.First(x => x.Id == screen.VisitDetailId);
-								//推省上
-								await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderScreenApplyed,
-									new PublishVisitDto()
-									{
-										Order = _mapper.Map<OrderDto>(visit.Order),
-										No = visit.No,
-										VisitType = visit.VisitType,
-										VisitName = visit.CreatorName,
-										VisitTime = visit.VisitTime,
-										VisitRemark = string.IsNullOrEmpty(visitDe.VisitContent) ? screenSatisfy.Value : visitDe.VisitContent,
-										AreaCode = visit.Order.AreaCode!,
-										SubjectResultSatifyCode = visitDe.OrgProcessingResults?.Key,
-										FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
-										ClientGuid = ""
-									});
+    /// <summary>Handles a notification</summary>
+    /// <param name="notification">The notification</param>
+    /// <param name="cancellationToken">Cancellation token</param>
+    public async Task Handle(EndWorkflowNotify notification, CancellationToken cancellationToken)
+    {
+        if (notification.Workflow.ModuleCode == WorkflowModuleConsts.OrderScreen)
+        {
+            var workflow = notification.Workflow;
+            //审批是否通过
+            var isReviewPass = workflow.IsReviewPass();
 
-								//推门户
-								await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
-								{
-									Id = visit.Id,
-									Order = _mapper.Map<OrderDto>(visit.Order),
-									OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(visit.OrderVisitDetails),
-									VisitName = visit.CreatorName,
-									VisitTime = visit.VisitTime,
-									VisitType = visit.VisitType,
-									VisitState = visit.VisitState,
-									PublishTime = visit.PublishTime,
-								}, cancellationToken: cancellationToken);
-							}
-						}
-					}
-				}
-				else
-				{
-					screen.Status = EScreenStatus.Refuse;
-					screen.ReplyContent = workflow.ActualOpinion;
-				}
-				await _orderRepository.OrderScreenRevisionVisit(screen.VisitId, true, cancellationToken);
-				screen.NewestAuditTime = DateTime.Now;
-				await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
-				OrderScreenDetail detail = new OrderScreenDetail
-				{
-					ScreenId = screen.Id
-				};
-				detail.Audit(_sessionContext.UserId, _sessionContext.UserName, _sessionContext.OrgId, _sessionContext.OrgName, 1);
-				await _orderScreenDetailRepository.AddAsync(detail, cancellationToken);
-			}
-		}
-	}
+            var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);
+            if (screen != null)
+            {
+                screen.Flowed(workflow.FlowedUserIds, workflow.FlowedOrgIds, workflow.HandlerUsers, workflow.HandlerOrgs);
+                if (isReviewPass)
+                {
+                    screen.Status = EScreenStatus.End;
+                    screen.ReplyContent = workflow.ActualOpinion;
+                    //await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
+                    var visitDetail =
+                        await _orderVisitedDetailRepository.GetAsync(screen.VisitDetailId, cancellationToken);
+                    if (visitDetail != null)
+                    {
+                        if (screen.ScreenType == EOrderScreenType.Seat)
+                        {
+                            visitDetail.SeatEvaluate = ESeatEvaluate.DefaultSatisfied;
+                            await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
+                        }
+                        else
+                        {
+                            var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
+                            visitDetail.OrgProcessingResults = screenSatisfy;
+                            if (_appOptions.Value.IsYiBin)
+                                visitDetail.OrgNoSatisfiedReason = new List<Kv>();
+
+                            //visitDetail.OrgHandledAttitude = screenSatisfy;
+                            await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
+                            // 修改主表当前评价结果
+                            await _orderVisitRepository.Updateable().SetColumns(v => new OrderVisit() { NowEvaluate = screenSatisfy }).Where(v => v.Id == visitDetail.VisitId).ExecuteCommandAsync(cancellationToken);
+                            //获取回访信息
+                            var visit = await _orderVisitRepository.Queryable().Includes(x => x.Order)
+                                .Includes(x => x.OrderVisitDetails)
+                                .Where(x => x.Id == screen.VisitId).FirstAsync(cancellationToken);
+                            if (visit != null)
+                            {
+                                //获取回访明细
+                                var visitDe = visit.OrderVisitDetails.First(x => x.Id == screen.VisitDetailId);
+                                //推省上
+                                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderScreenApplyed,
+                                    new PublishVisitDto()
+                                    {
+                                        Order = _mapper.Map<OrderDto>(visit.Order),
+                                        No = visit.No,
+                                        VisitType = visit.VisitType,
+                                        VisitName = visit.CreatorName,
+                                        VisitTime = visit.VisitTime,
+                                        VisitRemark = string.IsNullOrEmpty(visitDe.VisitContent) ? screenSatisfy.Value : visitDe.VisitContent,
+                                        AreaCode = visit.Order.AreaCode!,
+                                        SubjectResultSatifyCode = visitDe.OrgProcessingResults?.Key,
+                                        FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
+                                        ClientGuid = ""
+                                    });
+
+                                //推门户
+                                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
+                                {
+                                    Id = visit.Id,
+                                    Order = _mapper.Map<OrderDto>(visit.Order),
+                                    OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(visit.OrderVisitDetails),
+                                    VisitName = visit.CreatorName,
+                                    VisitTime = visit.VisitTime,
+                                    VisitType = visit.VisitType,
+                                    VisitState = visit.VisitState,
+                                    PublishTime = visit.PublishTime,
+                                }, cancellationToken: cancellationToken);
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    screen.Status = EScreenStatus.Refuse;
+                    screen.ReplyContent = workflow.ActualOpinion;
+                }
+                await _orderRepository.OrderScreenRevisionVisit(screen.VisitId, true, cancellationToken);
+                screen.NewestAuditTime = DateTime.Now;
+                await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
+                OrderScreenDetail detail = new OrderScreenDetail
+                {
+                    ScreenId = screen.Id
+                };
+                detail.Audit(_sessionContext.UserId, _sessionContext.UserName, _sessionContext.OrgId, _sessionContext.OrgName, 1);
+                await _orderScreenDetailRepository.AddAsync(detail, cancellationToken);
+            }
+        }
+    }
 }

+ 5 - 0
src/Hotline.Application/StatisticalReport/CallReport/CallReportApplicationBase.cs

@@ -67,6 +67,11 @@ public abstract class CallReportApplicationBase : ICallReportApplication
         return await _callNativeRepository.GetCallList(dto, noConnectByeTimes, effectiveTimes, connectByeTimes);
     }
 
+    public virtual async Task<List<QueryCallDateStatisticsDetailResp>> QueryCallDateStatisticsDetail(QueryCallDateStatisticsDetailDto dto)
+    {
+        throw new NotImplementedException();
+    }
+
     public virtual async Task<List<BiCallDto>> QueryCallsAsync(BiQueryCallsDto dto, CancellationToken cancellationToken)
     {
         return await _callNativeRepository.GetQueryCalls(dto.StartTime.Value, dto.EndTime.Value, dto.Line);

+ 15 - 0
src/Hotline.Application/StatisticalReport/CallReport/YiBinCallReportApplication.cs

@@ -250,6 +250,21 @@ public class YiBinCallReportApplication : CallReportApplicationBase, ICallReport
         return list;
     }
 
+    /// <summary>
+    /// 话务日期统计明细
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    public override async Task<List<QueryCallDateStatisticsDetailResp>> QueryCallDateStatisticsDetail(QueryCallDateStatisticsDetailDto dto)
+    {
+        //
+
+        return await _trCallRecordRepositoryEx.QueryCallDateStatisticsDetail(dto.StartTime.Value,dto.EndTime.Value);
+    }
+
+
+
+
     //public override async Task<PagedDto<TrCallDto>> GetCallDetailListAsync(GetCallListDto dto, CancellationToken cancellationToken)
     //{
     //    var (total, items) = await _trCallRecordRepository.Queryable()

+ 8 - 0
src/Hotline.Application/StatisticalReport/ICallReportApplication.cs

@@ -47,5 +47,13 @@ namespace Hotline.Application.StatisticalReport
         /// <returns></returns>
         Task<(int, List<QueryCallsStatisticsDetailOutDto>)> QueryCallsStatisticsDetailAsync(QueryCallsStatisticsDetailInDto dto, CancellationToken cancellationToken);
         // Task<PagedDto<TrCallDto>> GetCallDetailListAsync(GetCallListDto dto, CancellationToken cancellationToken);
+
+
+        /// <summary>
+        /// 话务日期统计明细
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        Task<List<QueryCallDateStatisticsDetailResp>> QueryCallDateStatisticsDetail(QueryCallDateStatisticsDetailDto dto);
     }
 }

+ 19 - 0
src/Hotline.Repository.SqlSugar/CallCenter/TrCallRecordRepository.cs

@@ -286,5 +286,24 @@ namespace Hotline.Repository.SqlSugar.CallCenter
                 .OrderByDescending(x => x.CreatedTime);
         }
 
+        public async Task<List<QueryCallDateStatisticsDetailResp>> QueryCallDateStatisticsDetail(DateTime startTime, DateTime endTime)
+        {
+            return await Db.Queryable<TrCallRecord>()
+                .Where(x => x.CreatedTime >= startTime && x.CreatedTime <= endTime && SqlFunc.Length(x.Gateway) > 4 && x.CallDirection == ECallDirection.In)
+                .GroupBy(x => x.CreatedTime.ToString("yyyy-MM-dd"))
+                .Select(x => new QueryCallDateStatisticsDetailResp() {
+                    Date = x.CreatedTime.ToString("yyyy-MM-dd"),
+                    PersonCallInCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.LastOrDefault()=='1',1,0)),
+                    EnterpriseCallInCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.LastOrDefault()=='2',1,0)),
+                    AiCallInCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Gateway == "82826886",1,0)),
+                    PersonCallInPutthroughCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.LastOrDefault()=='1' && x.OnState == EOnState.On ,1,0)),
+                    EnterpriseCallInPutthroughCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.LastOrDefault()=='2' && x.OnState== EOnState.On,1,0)),
+                    AiCallInPutthroughCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.Gateway == "82826886", 1, 0)),
+                    PersonRingOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.LastOrDefault() == '1' && x.QueueTims > 0 && x.RingTimes == 0 && x.OnState == EOnState.NoOn, 1, 0)),//个人服务挂断
+                    EnterpriseRingOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.IvrDtmf.LastOrDefault() == '2' && x.QueueTims > 0 && x.RingTimes == 0 && x.OnState == EOnState.NoOn,1,0)), //企业挂断
+                    IvrRingOffCount = SqlFunc.AggregateSum(SqlFunc.IIF(x.BeginIvrTime.HasValue && !x.BeginQueueTime.HasValue && !x.BeginRingTime.HasValue && x.OnState == EOnState.NoOn, 1, 0)), //IVR挂断
+                }).ToListAsync();
+                
+        }
     }
 }

+ 4 - 3
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -1324,9 +1324,10 @@ namespace Hotline.Repository.SqlSugar.Orders
                 .WhereIF(dto.TypeCode != null && dto.TypeCode == 1, x => x.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
                 .WhereIF(dto.TypeCode != null && dto.TypeCode == 2, x => x.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
                 //.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(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 == true , 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)

+ 114 - 1
src/Hotline.Share/Dtos/CallCenter/BiQueryCallsDto.cs

@@ -192,4 +192,117 @@ public class QueryCallsStatisticsDetailOutDto
     /// 语音文件路径
     /// </summary>
     public string AudioFile { get; set; }
-}
+}
+
+
+#region 宜宾新话务报表
+
+public class QueryCallDateStatisticsDetailDto
+{
+    public DateTime? StartTime { get; set; }
+
+    public DateTime? EndTime { get; set; }
+}
+
+public class QueryCallDateStatisticsDetailResp
+{
+    /// <summary>
+    /// 日期
+    /// </summary>
+    public string Date { get; set; }
+    /// <summary>
+    /// 呼入总量(计算所得)
+    /// </summary>
+    public int CallInTotal => IvrCallInTotal + PersonCallInCount + EnterpriseCallInCount + AiCallInCount;
+
+    /// <summary>
+    /// IVR呼入总量
+    /// </summary>
+    public int IvrCallInTotal { get; set; }
+
+    /// <summary>
+    /// 个人服务呼入总量
+    /// </summary>
+    public int PersonCallInCount { get; set; }
+
+    /// <summary>
+    /// 企业服务呼入总量
+    /// </summary>
+    public int EnterpriseCallInCount { get; set; }
+
+    /// <summary>
+    /// 智能应答呼入总量
+    /// </summary>
+    public int AiCallInCount { get; set; }
+
+    /// <summary>
+    /// 接通总量(计算所得)
+    /// </summary>
+    public int PutthroughCount => PersonCallInPutthroughCount+ EnterpriseCallInPutthroughCount + AiCallInPutthroughCount;
+
+    /// <summary>
+    /// 个人服务接通量
+    /// </summary>
+    public int PersonCallInPutthroughCount { get; set; }
+
+    /// <summary>
+    /// 企业服务接通量
+    /// </summary>
+    public int EnterpriseCallInPutthroughCount { get; set; }
+
+    /// <summary>
+    /// 智能应答呼入总量
+    /// </summary>
+    public int AiCallInPutthroughCount { get; set; }
+
+    /// <summary>
+    /// 挂断总量
+    /// </summary>
+    public int RingOffCount => PersonRingOffCount + EnterpriseRingOffCount + IvrRingOffCount;
+
+    /// <summary>
+    /// 个人服务挂断总量
+    /// </summary>
+    public int PersonRingOffCount { get; set; }
+
+    /// <summary>
+    /// 企业服务挂断总量
+    /// </summary>
+    public int EnterpriseRingOffCount { get; set; }
+
+    /// <summary>
+    /// IVR挂断总量
+    /// </summary>
+    public int IvrRingOffCount { get; set; }
+
+    /// <summary>
+    /// 总体接通率
+    /// </summary>
+    public double TotalPutthroughRate => PutthroughCount == 0 ? 0 : Math.Round(((double)PutthroughCount / CallInTotal)*100,2);
+
+    /// <summary>
+    /// 总体接通率(文本)
+    /// </summary>
+    public string TotalPutthroughRateText => TotalPutthroughRate + "%";
+
+    /// <summary>
+    /// 服务接通率
+    /// </summary>
+    public double ServicePutthorughRate => PutthroughCount == 0 ? 0 : Math.Round(((double)PutthroughCount / CallInTotal) * 100, 2);
+
+    /// <summary>
+    /// 服务接通率(文本)
+    /// </summary>
+    public string ServicePutthorughRateText => ServicePutthorughRate + "%";
+
+    /// <summary>
+    /// 话务接通率
+    /// </summary>
+    public double CallPutthorughRate => (PersonCallInPutthroughCount + EnterpriseCallInPutthroughCount) == 0 ? 0 : Math.Round(((double)(PersonCallInPutthroughCount + EnterpriseCallInPutthroughCount)) / (PersonCallInCount + EnterpriseCallInCount) * 100, 2);
+
+    /// <summary>
+    /// 话务接通率(文本)
+    /// </summary>
+    public string CallPutthorughRateText => CallPutthorughRate + "%";
+}
+#endregion

+ 1 - 1
src/Hotline.Share/Dtos/Order/OrderBiDto.cs

@@ -419,7 +419,7 @@ namespace Hotline.Share.Dtos.Order
 			//        return Math.Round(((double)VerySatisfiedCount + SatisfiedCount + RegardedAsSatisfiedCount + DefaultSatisfiedCount) / (VerySatisfiedCount + SatisfiedCount + RegardedAsSatisfiedCount + DefaultSatisfiedCount + NoSatisfiedCount) * 100, 2);
 			if (TotalSumCount - NoSatisfiedCount <= 0)
 				return 0;
-			return Math.Round(((double)TotalSumCount - NoSatisfiedCount) / TotalSumCount);
+			return Math.Round((((double)TotalSumCount - NoSatisfiedCount) / TotalSumCount) *100,2);
         }
 			
 			

+ 13 - 1
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -120,7 +120,19 @@ namespace Hotline.Share.Dtos.Order
 		/// 一级部门
 		/// </summary>
 		public string? OrgLevelOneName { get; set; }
-	}
+
+        /// <summary>
+        /// 来电主体
+        /// </summary>
+        public EIdentityType? IdentityType { get; set; }
+
+        /// <summary>
+        /// 受理时间(工单创建时间)
+        /// </summary>
+        public DateTime? CreationTimeStart { get; set; }
+        public DateTime? CreationTimeEnd { get; set; }
+
+    }
 
     public record QueryOrderPublishStatisticsAllDto : PagedRequest
     {

+ 8 - 1
src/Hotline.Share/Dtos/Order/Publish/QueryOrderPublishDto.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Requests;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Requests;
 
 namespace Hotline.Share.Dtos.Order.Publish;
 
@@ -126,4 +127,10 @@ public record QueryOrderPublishDto : PagedKeywordRequest
 	/// 一级部门
 	/// </summary>
     public string? OrgLevelOneName { get; set; }
+
+    /// <summary>
+    /// 来电主体(√)(单选)
+    /// </summary>
+    public EIdentityType? IdentityType { get; set; }
+
 }

+ 7 - 0
src/Hotline.Share/Dtos/Order/PublishedDto.cs

@@ -16,6 +16,11 @@ public class PublishedDto
     /// </summary>
     public bool? PublishState { get; set; }
 
+    /// <summary>
+    /// 
+    /// </summary>
+    public string PublishStateText => PublishState == true ? "公开" : "不公开";
+
     /// <summary>
     /// 整理内容
     /// </summary>
@@ -117,6 +122,8 @@ public class PublishDto : OrderDto
     /// </summary>
     public bool? PublishState { get; set; }
 
+    public string PublishStateText => PublishState == true ? "公开" : "不公开";
+
     /// <summary>
     /// 整理内容
     /// </summary>

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

@@ -234,6 +234,18 @@ public record PublishedPagedRequest : PagedKeywordRequest
     /// 查询批次
     /// </summary>
     public int QueryIndex { get; set; }
+
+    /// <summary>
+    /// 一级部门
+    /// </summary>
+    public string? OrgLevelOneName { get; set; }
+
+    /// <summary>
+    /// 来电主体
+    /// </summary>
+    public EIdentityType? IdentityType { get; set; }
+
+
 }
 
 public record HotspotSubtotalReportPagedRequest : ReportPagedRequest

+ 8 - 0
src/Hotline/CallCenter/Calls/ITrCallRecordRepository.cs

@@ -34,5 +34,13 @@ namespace Hotline.CallCenter.Calls
         /// <param name="dto"></param>
         /// <returns></returns>
         ISugarQueryable<TrCallRecord> GetCallList(GetCallListDto dto);
+
+        /// <summary>
+        /// 话务日期统计明细
+        /// </summary>
+        /// <param name="startTime"></param>
+        /// <param name="endTime"></param>
+        /// <returns></returns>
+        Task<List<QueryCallDateStatisticsDetailResp>> QueryCallDateStatisticsDetail(DateTime startTime, DateTime endTime);
     }
 }

+ 1 - 27
src/Hotline/Orders/OrderDomainService.cs

@@ -170,32 +170,6 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         order.Publish(orderPublish.PublishState);
         await _orderRepository.UpdateAsync(order, cancellationToken);
 
-        //需求251  某些工单需自动发送短信
-        //任何类型的省工单都不需要发送短信
-        if (order.Source != ESource.ProvinceStraight)
-        {
-            var code = "";
-            //受理类型为“投诉、举报”
-            if (order.AcceptTypeCode == "30" || order.AcceptTypeCode == "35")
-                code = "1017";
-            else
-                code = "1018";
-
-            var messageDto = new Share.Dtos.Push.MessageDto
-            {
-                PushBusiness = EPushBusiness.SearchSms,
-                ExternalId = id,
-                OrderId = order.Id,
-                PushPlatform = EPushPlatform.Sms,
-                Remark = order.Title,
-                Name = order.FromName,
-                TemplateCode = code,
-                Params = new List<string>() { order.No, order.Password },
-                TelNumber = order.Contact,
-            };
-            await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
-        }
-
         //推省上
         var publishPublishOrder = orderPublish.Adapt<PublishPublishOrderDto>();
         publishPublishOrder.Order = order.Adapt<OrderDto>();
@@ -310,7 +284,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         //任何类型的省工单都不需要发送短信
         try
         {
-            if (order.Source != ESource.ProvinceStraight)
+            if (order.Source != ESource.ProvinceStraight && _appOptions.Value.IsYiBin)
             {
                 var code = "";
                 //受理类型为“投诉、举报”

+ 1 - 0
src/Hotline/Settings/TimeLimitDomain/ExpireTimeLimitBase.cs

@@ -248,6 +248,7 @@ public abstract class ExpireTimeLimitBase
         var workTime = GetWorkTimes(SettingConstants.WorkTime);
         var setting = _timeLimitSettingRepository.Queryable().First(x => x.BusCode == busCode);
         if (setting == null) return null;
+		if (timeValue > 0) setting.TimeValue = timeValue;
         return await _expireTimeHandler.CalcEndTimeAsync(beginTime,startTime, workTime,setting);
     }
 

+ 18 - 4
src/Hotline/Settings/TimeLimitDomain/ExpireTimeSupplier/WorkDaySupplier.cs

@@ -186,17 +186,28 @@ public class WorkDaySupplier : IExpireTimeSupplier, IScopeDependency
                 {
                     beginTime = WorkBeginTime;
                 }
+                while(true)
+                {
+                   
+                    if (!await IsWorkDay(beginTime))
+                        beginTime = beginTime.AddDays(1);
+                    else
+                        break;
+                }
                 int w = timeConfig.Count;
+                int days = 1;
                 while (true && w != 0)
                 {   
-                    if (await IsWorkDay(beginTime))
+                    if (await IsWorkDay(beginTime.AddDays(days)))
                     {
-                        beginTime = beginTime.AddDays(1);
+                        beginTime = beginTime.AddDays(days);
                         w--;
+                        days = 1;
                     }
                     else
                     {
-                        beginTime = beginTime.AddDays(1);
+                        //beginTime = beginTime.AddDays(1);
+                        days++;
                     }
                 }
                 beginTime = beginTime.AddSeconds(-1);
@@ -208,7 +219,10 @@ public class WorkDaySupplier : IExpireTimeSupplier, IScopeDependency
                         {
                             beginTime = DateTime.Parse(beginTime.AddDays(-1).ToShortDateString() + " " + timeConfig.WorkTime[1] + ":00");
                         }
-                        break;
+                        else
+                        {
+                            break;
+                        }
                     }
                     else if(!await IsWorkDay(beginTime))
                     {