浏览代码

Merge branch 'test' into lib/test

libin 1 月之前
父节点
当前提交
8a848f35c0

+ 12 - 34
src/Hotline.Api/Controllers/OrderController.cs

@@ -3947,33 +3947,6 @@ public class OrderController : BaseController
         return _sessionContext.OrgIsCenter ? dto : dto.DataMask();
     }
 
-
-    /// <summary>
-    /// 上传附件
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <returns></returns>
-    //[HttpPost]
-    //[LogFilterAlpha("上传附件")]
-    //public async Task UploadFiles(OrderUploadFiles dto) { 
-
-    //       var fileJson = await _fileRepository.AddFileAsync(dto.Files, dto.Id, "", HttpContext.RequestAborted);
-
-    //       if (fileJson.Any())
-    //       {
-    //		var order = await _orderRepository.GetAsync(dto.Id);
-    //           if (order.FileJson != null && order.FileJson.Any())
-    //           {
-    //               order.FileJson.AddRange(fileJson);
-    //           }
-    //           else {
-    //               order.FileJson = fileJson;
-    //		}
-    //           await _orderRepository.Updateable().SetColumns(x => new Order { FileJson = order.FileJson }).Where(x => x.Id == dto.Id).ExecuteCommandAsync();
-    //	}
-    //}
-
-
     /// <summary>
     /// 新增工单
     /// </summary>
@@ -4723,8 +4696,10 @@ public class OrderController : BaseController
                     // }).Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 }
 
-                var (_, currentStep, _, _) = await _workflowDomainService.NextAsync(_sessionContext, nextDto, order.ExpiredTime,
-                    isAutoFillSummaryOpinion, cancellationToken: cancellationToken);
+                var (_, currentStep, _, _) = await _workflowDomainService.NextAsync(_sessionContext, nextDto, 
+                    expiredTime:  order.ExpiredTime,
+                    isAutoFillSummaryOpinion: isAutoFillSummaryOpinion, 
+                    cancellationToken: cancellationToken);
                 if (currentStep.BusinessType is EBusinessType.Send)
                 {
                     await _orderRepository.Updateable().SetColumns(o => new Order()
@@ -4763,7 +4738,8 @@ public class OrderController : BaseController
                             OrgId = unhandleStep.HandlerOrgId,
                             OrgName = unhandleStep.HandlerOrgName,
                         };
-                        var (_, _, _, nextSteps) = await _workflowDomainService.NextAsync(operater, nextflowDto, order.ExpiredTime,
+                        var (_, _, _, nextSteps) = await _workflowDomainService.NextAsync(operater, nextflowDto, 
+                            EHandleMode.CrossLevel, order.ExpiredTime,
                             isAutoFillSummaryOpinion, cancellationToken: cancellationToken);
                         tempSteps.AddRange(nextSteps);
                     }
@@ -4819,8 +4795,10 @@ public class OrderController : BaseController
         NextWorkflowDto? flowDto, DateTime? expiredTime, bool isAutoFillSummaryOpinion, CancellationToken cancellation)
     {
         if (flowDto is null || !flowDto.NextHandlers.Any()) return;
-        var (_, _, _, currentSteps) = await _workflowDomainService.NextAsync(current, flowDto, expiredTime,
-            isAutoFillSummaryOpinion, cancellationToken: cancellation);
+        var (_, _, _, currentSteps) = await _workflowDomainService.NextAsync(current, flowDto, 
+            expiredTime: expiredTime,
+            isAutoFillSummaryOpinion: isAutoFillSummaryOpinion, 
+            cancellationToken: cancellation);
 
         foreach (var currentStep in currentSteps)
         {
@@ -6897,9 +6875,9 @@ public class OrderController : BaseController
         if (_appOptions.Value.IsZiGong)
         {
             step.Steps = step.Steps.Where(x => x.Key.ToLower() != "start").ToList();
-            if (step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1).Any())
+            if (step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.StepType == EStepType.Normal && x.OrgLevel == 1).Any())
             {
-                var stepdDefault = step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1)
+                var stepdDefault = step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.StepType == EStepType.Normal && x.OrgLevel == 1)
                     .FirstOrDefault();
                 defaultStepKey = stepdDefault.Key;
             }

+ 33 - 2
src/Hotline.Application/Orders/Handles/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs

@@ -3,9 +3,12 @@ using Hotline.Configurations;
 using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Orders;
+using Hotline.Push.Notifies;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Push;
+using Hotline.Users;
 using MapsterMapper;
 using MediatR;
 using Microsoft.Extensions.Options;
@@ -24,6 +27,8 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
     private readonly ISessionContext _sessionContext;
     private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
     private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
+    private readonly IMediator _mediator;
+    private readonly IRepository<User> _userRepository;
 
     public OrderScreenEndWorkflowHandler(
         IOrderRepository orderRepository,
@@ -34,7 +39,9 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
         IRepository<OrderVisit> orderVisitRepository,
         ISessionContext sessionContext,
         IRepository<OrderScreenDetail> orderScreenDetailRepository,
-         IOptionsSnapshot<AppConfiguration> appOptions)
+        IOptionsSnapshot<AppConfiguration> appOptions,
+        IMediator mediator,
+        IRepository<User> userRepository)
     {
         _orderRepository = orderRepository;
         _capPublisher = capPublisher;
@@ -45,7 +52,8 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
         _sessionContext = sessionContext;
         _orderScreenDetailRepository = orderScreenDetailRepository;
         _appOptions = appOptions;
-
+        _mediator = mediator;
+        _userRepository = userRepository;
     }
 
     /// <summary>Handles a notification</summary>
@@ -142,6 +150,29 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
                 };
                 detail.Audit(_sessionContext.UserId, _sessionContext.UserName, _sessionContext.OrgId, _sessionContext.OrgName, 1);
                 await _orderScreenDetailRepository.AddAsync(detail, cancellationToken);
+
+                //这里处理甄别完成后发送短信
+                if (_appOptions.Value.IsZiGong)
+                {
+                    var user = await _userRepository.GetAsync(p => p.Id == screen.CreatorId, cancellationToken);
+                    if (user != null)
+                    {
+                        var isReviewPassText = isReviewPass == true ? "审批通过" : "审批拒绝";
+                        var messageDto = new Share.Dtos.Push.MessageDto
+                        {
+                            PushBusiness = EPushBusiness.ScreenEnd,
+                            ExternalId = screen.Id,
+                            OrderId = screen.Id,
+                            PushPlatform = EPushPlatform.Sms,
+                            Remark = screen.No + isReviewPassText,
+                            Name = screen.CreatorName,
+                            TemplateCode = "1019",
+                            Params = new List<string>() { screen.No, isReviewPassText },
+                            TelNumber = user.PhoneNo,
+                        };
+                        await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+                    }
+                }
             }
         }
     }

+ 14 - 14
src/Hotline.Application/Orders/OrderApplication.cs

@@ -3082,6 +3082,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(x => x.HandlerName != null && x.HandlerName != "")
             .WhereIF(dto.AuditType is 1, x => x.Name == "班长审批")
             .WhereIF(dto.AuditType is 2, x => x.Name == "中心领导")
+             .WhereIF(_appOptions.Value.IsZiGong && dto.AuditType is 3, x => x.Name == "中心初审")
             .GroupBy(x => new { x.HandlerName })
             .Select(x => new OrderScreenAuditVo
             {
@@ -3273,33 +3274,30 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             //    x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
             //.WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason),
             //    x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
-            .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle);
+            .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
+            .WhereIF(dto.DataScope is 1, x => x.VisitOrgCode == _sessionContext.OrgId);
         if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
         {
-            query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                    x => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
-                         x.OrderVisit.Order.No.Contains(dto.Keyword!))
-                .Where(x => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode == _sessionContext.OrgId && (
+            query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderVisit.Order.Title.Contains(dto.Keyword!) || x.OrderVisit.Order.No.Contains(dto.Keyword!))
+                .Where(x => 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"
-                ));
+                ))
+                .WhereIF(dto.DataScope is 0, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId))
+                ;
         }
         else
         {
-            query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                    x => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
-                         x.OrderVisit.Order.No.Contains(dto.Keyword!))
+            query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderVisit.Order.Title.Contains(dto.Keyword!) || x.OrderVisit.Order.No.Contains(dto.Keyword!))
                 .WhereIF(dto.ScreenType == EOrderScreenType.Org, x => 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"
                 ))
-                .WhereIF(dto.ScreenType == EOrderScreenType.Seat,
-                    x => x.VisitTarget == EVisitTarget.Seat &&
-                         (x.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied || x.SeatEvaluate == ESeatEvaluate.NoSatisfied))
+                .WhereIF(dto.ScreenType == EOrderScreenType.Seat, x => x.VisitTarget == EVisitTarget.Seat && (x.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied || x.SeatEvaluate == ESeatEvaluate.NoSatisfied))
                 ;
         }
 
@@ -3311,7 +3309,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .OrderByIF(dto is { SortRule: 1, SortField: "order.filedTime" }, x => x.OrderVisit.Order.FiledTime, OrderByType.Desc)
             .OrderByIF(dto is { SortRule: 0, SortField: "orderVisit.visitTime" }, x => x.OrderVisit.VisitTime, OrderByType.Asc)
             .OrderByIF(dto is { SortRule: 1, SortField: "orderVisit.visitTime" }, x => x.OrderVisit.VisitTime, OrderByType.Desc)
-            .OrderByIF(dto is { SortRule: 0, SortField: "screenByEndTime" }, x => x.ScreenByEndTime, OrderByType.Asc)
+            .OrderByIF(dto is { SortRule: 0, SortField: "screenByEndTime" }, x => x.ScreenByEndTime, OrderByType.Asc)//截止申请日期排序
             .OrderByIF(dto is { SortRule: 1, SortField: "screenByEndTime" }, x => x.ScreenByEndTime, OrderByType.Desc)
             .OrderByIF(dto.SortRule is null, x => x.CreationTime, OrderByType.Desc);
     }
@@ -3641,7 +3639,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _sessionContext.ChangeSession(startStep.HandlerId);
         var isAutoFillSummaryOpinion = _systemSettingCacheManager.IsAutoFillSummaryOpinion;
 
-        await _workflowDomainService.NextAsync(operater, nextDto, order.ExpiredTime, isAutoFillSummaryOpinion,
+        await _workflowDomainService.NextAsync(operater, nextDto,
+            expiredTime: order.ExpiredTime, 
+            isAutoFillSummaryOpinion: isAutoFillSummaryOpinion,
             cancellationToken: cancellationToken);
     }
 

+ 19 - 1
src/Hotline.Repository.SqlSugar/File/FileRepository.cs

@@ -45,7 +45,25 @@ namespace Hotline.Repository.SqlSugar.File
             return entities.Select(x => new FileJson { Id = x.Id, FileId = x.Additions, Path = x.Path, FileName = x.Name, FileType = x.Type }).ToList();
         }
 
-        public async Task<List<FileJson>> AddFileAsync(List<FileDto> files, string id, string flowId = "", CancellationToken cancellationToken = default) 
+		public async Task<List<FileJson>> AddFileAsync(IList<FileDto> files, string id, CancellationToken requestAborted)
+		{
+			var entities = files.Adapt<List<Hotline.File.File>>();
+			foreach (var file in entities)
+			{
+				var names = file.FileName.Split(".");
+				file.Name = names[0];
+				file.Type = names[1];
+				file.Key = id;
+				file.OrgName = _sessionContext.OrgName;
+				file.OrgId = _sessionContext.OrgId;
+				file.UserId = _sessionContext.UserId;
+				file.UserName = _sessionContext.UserName;
+			}
+			await AddRangeAsync(entities, requestAborted);
+			return entities.Select(x => new FileJson { Id = x.Id, FileId = x.Additions, Path = x.Path, FileName = x.Name, FileType = x.Type }).ToList();
+		}
+
+		public async Task<List<FileJson>> AddFileAsync(List<FileDto> files, string id, string flowId = "", CancellationToken cancellationToken = default) 
 		{
 			List<Hotline.File.File> newFiles =  new List<Hotline.File.File>();
 			var classify = files[0].Classify;

+ 5 - 0
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -855,6 +855,11 @@ namespace Hotline.Share.Dtos.Order
         /// 受理坐席名字或工号(×)
         /// </summary>
         public string? NameOrNo { get; set; }
+
+        /// <summary>
+        /// 0 全部  1 我的(本部门)
+        /// </summary>
+        public int? DataScope { get; set; }
     }
 
     public record UrgeListDto : PagedKeywordRequest

+ 6 - 0
src/Hotline.Share/Enums/FlowEngine/EHandleMode.cs

@@ -13,6 +13,12 @@ public enum EHandleMode
     [Description("正常")]
     Normal = 0,
 
+    /// <summary>
+    /// 跨级派单
+    /// </summary>
+    [Description("跨级派单")]
+    CrossLevel = 1,
+
     /// <summary>
     /// 审核通过(审批流程特有)
     /// </summary>

+ 3 - 0
src/Hotline.Share/Enums/Push/EPushBusiness.cs

@@ -87,4 +87,7 @@ public enum EPushBusiness
 
     [Description("随手拍短信")]
     Snapshot = 13,
+
+    [Description("甄别完成")]
+    ScreenEnd=14,
 }

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

@@ -1008,7 +1008,7 @@ public record OrderScreenAuditPagedRequest : PagedKeywordRequest
     public string AuditUserName { get; set; }
 
     /// <summary>
-    ///  1 中心班长   2 中心领导
+    ///  1 中心班长   2 中心领导 3中心初审
     /// </summary>
     public int? AuditType { get; set; }
 

+ 3 - 1
src/Hotline/File/IFileRepository.cs

@@ -18,5 +18,7 @@ namespace Hotline.File
 		Task<List<WorkflowTraceDto>> WorkflowTraceRecursion(List<WorkflowTraceDto> dto, CancellationToken cancellationToken);
 		Task<List<Hotline.File.File>> GetByKeyAsync(string key, CancellationToken cancellationToken);
         Task<List<FileJson>> AddFileAsync(IList<SnapshotFileInDto> files, string id, CancellationToken requestAborted);
-    }
+		Task<List<FileJson>> AddFileAsync(IList<FileDto> files, string id, CancellationToken requestAborted);
+
+	}
 }

+ 3 - 1
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -38,7 +38,9 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// new
         /// </summary>
-        Task<(Workflow, WorkflowStep, StepDefine, List<WorkflowStep>)> NextAsync(ISessionContext current, NextWorkflowDto dto,
+        Task<(Workflow, WorkflowStep, StepDefine, List<WorkflowStep>)> NextAsync(
+            ISessionContext current, NextWorkflowDto dto,
+            EHandleMode handleMode = EHandleMode.Normal,
             DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false,
             Action<Workflow, WorkflowStep, StepDefine>? currentStepConfig = null,
             Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,

+ 6 - 3
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -284,7 +284,8 @@ namespace Hotline.FlowEngine.Workflows
         /// workflow, currentStep, nextStepDefine, nextSteps
         /// </summary>
         public async Task<(Workflow, WorkflowStep, StepDefine, List<WorkflowStep>)> NextAsync(
-            ISessionContext current, NextWorkflowDto dto,
+            ISessionContext current, NextWorkflowDto dto, 
+            EHandleMode handleMode = EHandleMode.Normal,
             DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false,
             Action<Workflow, WorkflowStep, StepDefine>? currentStepConfig = null,
             Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
@@ -434,7 +435,7 @@ namespace Hotline.FlowEngine.Workflows
                 }
             }
 
-            await HandleStepAsync(currentStep, workflow, dto, counterSignType, expiredTime, EHandleMode.Normal, cancellationToken);
+            await HandleStepAsync(currentStep, workflow, dto, counterSignType, expiredTime, handleMode, cancellationToken);
 
             currentStep.IsActualHandled = CheckIsActualHandle(workflow, currentStep, nextStepDefine, dto);
 
@@ -608,7 +609,9 @@ namespace Hotline.FlowEngine.Workflows
             nextDto.WorkflowId = workflow.Id;
             nextDto.StepId = startStep.Id;
             var (_, _, _, nextSteps) =
-                await NextAsync(_sessionContextProvider.SessionContext, nextDto, expiredTime, true,
+                await NextAsync(_sessionContextProvider.SessionContext, nextDto, 
+                    expiredTime: expiredTime, 
+                    isAutoFillSummaryOpinion: true,
                     newStepConfig: newStepConfig, cancellationToken: cancellationToken);
             return nextSteps;
         }

+ 53 - 50
src/Hotline/Orders/OrderDomainService.cs

@@ -70,9 +70,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     private readonly IRepository<WorkflowStep> _workflowStepRepository;
     private readonly ISystemLogRepository _systemLogRepository;
     private readonly IOrderSnapshotRepository _orderSnapshotRepository;
-	private readonly ICalcExpireTime _expireTime;
+    private readonly ICalcExpireTime _expireTime;
 
-	public OrderDomainService(
+    public OrderDomainService(
         IOrderRepository orderRepository,
         IRepository<OrderRedo> orderRedoRepository,
         IRepository<OrderPublish> orderPublishRepository,
@@ -98,7 +98,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         ISystemLogRepository systemLogRepository,
         IOptionsSnapshot<AppConfiguration> appOptions,
         IOrderSnapshotRepository orderSnapshotRepository,
-		ICalcExpireTime expireTime)
+        ICalcExpireTime expireTime)
     {
         _orderRepository = orderRepository;
         _orderRedoRepository = orderRedoRepository;
@@ -124,9 +124,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         _systemLogRepository = systemLogRepository;
         _appOptions = appOptions;
         _orderSnapshotRepository = orderSnapshotRepository;
-		_expireTime = expireTime;
+        _expireTime = expireTime;
 
-	}
+    }
 
     /// <summary>
     /// 归档后自动发布
@@ -603,33 +603,33 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             .Where(x => x.SchedulingTime == time).CountAsync(cancellationToken);
         if (schedulings > 0)
         {
-			var sendNum = steps.Count / schedulings;
-			scheduling.SendOrderNum += sendNum;
-			if (!scheduling.LoginSendOrderNum.HasValue)
-			{
-				scheduling.LoginSendOrderNum = scheduling.LoginSendOrderNum.HasValue && scheduling.LoginSendOrderNum > sendNum ? scheduling.LoginSendOrderNum : sendNum;
-				await _schedulingRepository.Updateable()
-					.SetColumns(s => new Scheduling() { LoginSendOrderNum = scheduling.LoginSendOrderNum })
-					.Where(s => s.SchedulingTime == scheduling.SchedulingTime).ExecuteCommandAsync(cancellationToken);
-			}
-			sendNum = scheduling.LoginSendOrderNum.Value;
-			await _schedulingRepository.Updateable()
-				.SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum, AtWork = scheduling.AtWork })
-				.Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
-
-			if (sendNum <= 0) return;
-			var sendSteps = steps.Take(sendNum).ToList();
-			await _orderRepository.Updateable().SetColumns(o => new Order()
-			{
-				CenterToOrgHandlerId = user.OrgId,
-				CenterToOrgHandlerName = user.Name
-			}).Where(o => sendSteps.Any(s => s.ExternalId == o.Id)).ExecuteCommandAsync(cancellationToken);
-
-			await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)>
-			{
-				new(user.Id, user.Name, user.OrgId, user.Organization.Name,roleId,"派单员", sendSteps)
-			}, cancellationToken);
-		}
+            var sendNum = steps.Count / schedulings;
+            scheduling.SendOrderNum += sendNum;
+            if (!scheduling.LoginSendOrderNum.HasValue)
+            {
+                scheduling.LoginSendOrderNum = scheduling.LoginSendOrderNum.HasValue && scheduling.LoginSendOrderNum > sendNum ? scheduling.LoginSendOrderNum : sendNum;
+                await _schedulingRepository.Updateable()
+                    .SetColumns(s => new Scheduling() { LoginSendOrderNum = scheduling.LoginSendOrderNum })
+                    .Where(s => s.SchedulingTime == scheduling.SchedulingTime).ExecuteCommandAsync(cancellationToken);
+            }
+            sendNum = scheduling.LoginSendOrderNum.Value;
+            await _schedulingRepository.Updateable()
+                .SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum, AtWork = scheduling.AtWork })
+                .Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
+
+            if (sendNum <= 0) return;
+            var sendSteps = steps.Take(sendNum).ToList();
+            await _orderRepository.Updateable().SetColumns(o => new Order()
+            {
+                CenterToOrgHandlerId = user.OrgId,
+                CenterToOrgHandlerName = user.Name
+            }).Where(o => sendSteps.Any(s => s.ExternalId == o.Id)).ExecuteCommandAsync(cancellationToken);
+
+            await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)>
+            {
+                new(user.Id, user.Name, user.OrgId, user.Organization.Name,roleId,"派单员", sendSteps)
+            }, cancellationToken);
+        }
 
     }
 
@@ -702,7 +702,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     {
         var valid = new OrderValidation { Validation = false, Result = "" };
         var hotspot = await _hotspotRepository.GetAsync(dto.HotspotId, cancellationToken);
-        if (hotspot.TrunkNum.Equals(AppDefaults.TrafficTrunkNum))
+        if (hotspot != null && hotspot.TrunkNum.Equals(AppDefaults.TrafficTrunkNum))
         {
             switch (dto.AcceptTypeCode)
             {
@@ -771,7 +771,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         return valid;
     }
     #endregion
-    
+
     #region 即将超期和超期短信
 
     /// <summary>
@@ -830,35 +830,38 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
 
     #region  计算甄别申请截至日期
 
-    public async Task<DateTime>  GetScreenByEndTime() {
+    public async Task<DateTime> GetScreenByEndTime()
+    {
 
         var endTime = DateTime.Now;
         var beginTime = DateTime.Now;
         var timeValue = 1;
-		if (_appOptions.Value.IsZiGong)
+        if (_appOptions.Value.IsZiGong)
         {
             timeValue = 2;
-		}
+        }
         else if (_appOptions.Value.IsLuZhou)
         {
-			DateTime firstDayOfMonth = new DateTime(beginTime.Year, beginTime.Month, 1);
-			DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
+            DateTime firstDayOfMonth = new DateTime(beginTime.Year, beginTime.Month, 1);
+            DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
             beginTime = new DateTime(lastDayOfMonth.Year, lastDayOfMonth.Month, lastDayOfMonth.Day, 23, 59, 59);
-		}
-        else {
-			var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ScreenApplyEndTime);
-            if (int.Parse(setting?.SettingValue[0]) > 0) {
+        }
+        else
+        {
+            var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ScreenApplyEndTime);
+            if (int.Parse(setting?.SettingValue[0]) > 0)
+            {
                 timeValue = int.Parse(setting?.SettingValue[0]);
-			}
-		}
-		endTime = (await _expireTime.CalcEndTime(beginTime, beginTime, ETimeType.WorkDay, timeValue, 0, 0)).EndTime;
-		return endTime;
+            }
+        }
+        endTime = (await _expireTime.CalcEndTime(beginTime, beginTime, ETimeType.WorkDay, timeValue, 0, 0)).EndTime;
+        return endTime;
     }
-	#endregion
+    #endregion
 
-	#region private
+    #region private
 
-	private async Task<Order> GetOrderByFlowIdAsync(string workflowId, CancellationToken cancellationToken)
+    private async Task<Order> GetOrderByFlowIdAsync(string workflowId, CancellationToken cancellationToken)
     {
         if (string.IsNullOrEmpty(workflowId))
             throw UserFriendlyException.SameMessage("无效流程编号");