Prechádzať zdrojové kódy

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

tangjiang 2 mesiacov pred
rodič
commit
1c981263c3

+ 288 - 469
src/Hotline.Api/Controllers/OrderController.cs

@@ -76,6 +76,7 @@ using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
 using OrderDto = Hotline.Share.Dtos.Order.OrderDto;
+using System.Threading;
 
 namespace Hotline.Api.Controllers;
 
@@ -4436,19 +4437,79 @@ public class OrderController : BaseController
         if (!validResult.IsValid)
             throw new UserFriendlyException(
                 $"非法参数, {string.Join(',', validResult.Errors.Select(d => d.ErrorMessage))}");
-        var order = await _orderApplication.SaveOrderWorkflowInfo(dto, HttpContext.RequestAborted);
+
+		var workflow = await _workflowDomainService.GetWorkflowAsync(dto.Workflow.WorkflowId, withDefine: true, withSteps: true, withTraces: true,
+		  cancellationToken: HttpContext.RequestAborted);
+
+		#region 中心归档,自动延期一天
+		if (dto.Workflow.StepType == EStepType.End && dto.Workflow.NextStepCode == "end" && _appOptions.Value.IsYiBin && _sessionContext.OrgIsCenter)
+		{
+			var dOrder = await _orderRepository.GetAsync(workflow.ExternalId, HttpContext.RequestAborted);
+			if (dOrder != null && dOrder.ExpiredTime < DateTime.Now)
+			{
+				var delays = await _orderDelayRepository.Queryable().Where(x => x.OrderId == dOrder.Id && x.AutomaticDelayNum > 0).ToListAsync(HttpContext.RequestAborted);
+				var delayOrder = new OrderDelay();
+				if (delays.Any())
+				{
+					delayOrder = delays.First();
+					var startTime = DateTime.Now;
+					if (dOrder.CenterToOrgTime.HasValue)
+					{
+						startTime = dOrder.CenterToOrgTime.Value;
+					}
+					delayOrder.AfterDelay = (await _expireTime
+						.CalcEndTime(delayOrder.BeforeDelay.Value, startTime, delayOrder.DelayUnit, delayOrder.DelayNum, dOrder.AcceptTypeCode))?.EndTime; //todo
+					await _orderDelayRepository.Updateable().SetColumns(x => new OrderDelay() { AutomaticDelayNum = x.AutomaticDelayNum + 1, ApplyDelayTime = DateTime.Now, AfterDelay = delayOrder.AfterDelay })
+						.Where(x => x.Id == delayOrder.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
+				}
+				else
+				{
+					delayOrder.OrderId = dOrder.Id;
+					delayOrder.EmployeeId = "";
+					delayOrder.EmployeeName = "系统自动延期";
+					delayOrder.ApplyOrgName = OrgSeedData.CenterName;
+					delayOrder.ApplyOrgCode = OrgSeedData.CenterId;
+					delayOrder.DelayApplyType = EDelayApplyType.LocalApply;
+					delayOrder.BeforeDelay = dOrder.ExpiredTime;
+					delayOrder.DelayState = EDelayState.Pass;
+					delayOrder.DelayReason = "系统自动延期";
+					delayOrder.ApplyDelayTime = DateTime.Now;
+					delayOrder.No = dOrder.No;
+					delayOrder.AutomaticDelayNum = 1;
+					delayOrder.DelayNum = 1;
+					delayOrder.DelayUnit = Share.Enums.Settings.ETimeType.WorkDay;
+					delayOrder.IsProDelay = false;
+					delayOrder.CreatorOrgId = OrgSeedData.CenterId;
+					delayOrder.CreatorOrgName = OrgSeedData.CenterName;
+					delayOrder.CreatorName = "系统自动延期";
+					var startTime = DateTime.Now;
+					if (dOrder.CenterToOrgTime.HasValue)
+					{
+						startTime = dOrder.CenterToOrgTime.Value;
+					}
+					if (delayOrder.BeforeDelay != null)
+					{
+						delayOrder.AfterDelay = (await _expireTime
+							.CalcEndTime(delayOrder.BeforeDelay.Value, startTime, delayOrder.DelayUnit, delayOrder.DelayNum, dOrder.AcceptTypeCode))?.EndTime; //todo
+					}
+					await _orderDelayRepository.AddAsync(delayOrder, false, HttpContext.RequestAborted);
+				}
+				//处理工单延期
+				await _orderApplication.DelayOrderExpiredTimeAsync(dOrder.Id, delayOrder.DelayNum,
+					delayOrder.DelayUnit, delayOrder.IsProDelay, HttpContext.RequestAborted);
+			}
+		}
+		#endregion
+
+		var order = await _orderApplication.SaveOrderWorkflowInfo(dto, HttpContext.RequestAborted);
 
         // 随手拍业务处理
         if (_systemSettingCacheManager.Snapshot)
         {
             await _orderSnapshotApplication.SaveOrderWorkflowInfo(dto);
-        }
-
-        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.Workflow.WorkflowId, withDefine: true, withSteps: true, withTraces: true,
-            cancellationToken: HttpContext.RequestAborted);
-
-        //await _workflowApplication.NextAsync(dto.WorkflowDto, order.ExpiredTime, HttpContext.RequestAborted);
-        var startStep = workflow.Steps.First(d => d.Id == dto.Workflow.StepId);
+        }	
+		//await _workflowApplication.NextAsync(dto.WorkflowDto, order.ExpiredTime, HttpContext.RequestAborted);
+		var startStep = workflow.Steps.First(d => d.Id == dto.Workflow.StepId);
         await HandleOrderAsync(order, workflow, startStep, dto.Data, dto.Workflow, HttpContext.RequestAborted);
 
         if (_appOptions.Value.IsZiGong && dto.Data.Transpond.HasValue && dto.Data.Transpond.Value)
@@ -6006,35 +6067,16 @@ public class OrderController : BaseController
         if (specialAny) throw UserFriendlyException.SameMessage("工单已存在待审批特提信息!");
         var order = await _orderRepository.Queryable().Includes(d => d.Workflow).FirstAsync(d => d.Id == dto.OrderId);
         await _orderApplication.SpecialVerify(dto, order, HttpContext.RequestAborted);
-        if (string.IsNullOrEmpty(dto.Cause))
-        {
-            dto.Cause = dto.Reason;
-        }
 
-        // var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true,
-        //     cancellationToken: HttpContext.RequestAborted);
-        // var currentStep = workflow.Steps.FirstOrDefault(x => x.Status != EWorkflowStepStatus.Handled);
-        // if (currentStep is null)
-        //     currentStep = workflow.Steps.OrderByDescending(x => x.CreationTime).FirstOrDefault(x => x.StepType == EStepType.End);
-
-        if (string.IsNullOrEmpty(dto.Cause))
-        {
-            dto.Cause = dto.Reason;
-        }
-
-        var model = _mapper.Map<OrderSpecial>(dto);
-        // model.OrgId = currentStep is null ? _sessionContext.RequiredOrgId : currentStep.HandlerOrgId;
-        // model.OrgName = currentStep is null ? _sessionContext.OrgName : currentStep.HandlerOrgName;
-        model.OrgId = _sessionContext.RequiredOrgId;
-        model.OrgName = _sessionContext.OrgName;
-        //var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
-        // model.StepName = step.Name;
-        // model.StepCode = step.Code;
-        model.Status = order.Status;
+        dto.Cause ??= dto.Reason;
+        var special = _mapper.Map<OrderSpecial>(dto);
+        special.OrgId = _sessionContext.RequiredOrgId;
+        special.OrgName = _sessionContext.OrgName;
+        special.Status = order.Status;
 
         var audit = true;
-        var specialAduit = _systemSettingCacheManager.GetSetting(SettingConstants.SpecialAduit);
-        if (bool.Parse(specialAduit?.SettingValue[0]))
+        var specialAudit = _systemSettingCacheManager.GetSetting(SettingConstants.SpecialAduit);
+        if (bool.Parse(specialAudit?.SettingValue[0]))
         {
             //if (!dto.Audit) model.State = 1;
             //取消根据进入界面判断是否审批  最新按照系统配置设定
@@ -6051,28 +6093,14 @@ public class OrderController : BaseController
             audit = false;
         }
 
-        if (!audit) model.State = 1;
+        if (!audit) special.State = 1;
 
-        model.InitId();
+        special.InitId();
         if (dto.Files.Any())
-            model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", HttpContext.RequestAborted);
-        //await _orderSpecialRepository.AddAsync(model, HttpContext.RequestAborted);
-        if (model.State == 1)
-        {
-            //var handler = dto.NextHandlers.FirstOrDefault();
-            // if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)
-            // {
-            //     // 平均派单
-            //     var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
-            //     if (averageSendOrder)
-            //     {
-            //         handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-            //         dto.NextHandlers = new List<FlowStepHandler> { handler };
-            //         await _orderSpecialRepository.Updateable().SetColumns(x => new OrderSpecial { NextHandlers = dto.NextHandlers })
-            //             .Where(x => x.Id == model.Id).ExecuteCommandAsync();
-            //     }
-            // }
+            special.FileJson = await _fileRepository.AddFileAsync(dto.Files, special.Id, "", HttpContext.RequestAborted);
 
+        if (special.State == 1)
+        {
             var recall = new RecallDto
             {
                 WorkflowId = dto.WorkflowId!,
@@ -6084,21 +6112,11 @@ public class OrderController : BaseController
                 HandlerType = dto.HandlerType,
                 BusinessType = dto.BusinessType
             };
-            // 计算期满时间
-            //if (dto.AlterTime)
-            //{
-            // var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
-
-            ExpiredTimeWithConfig? expiredTime = new ExpiredTimeWithConfig();
 
-            if (dto.FlowDirection is EFlowDirection.OrgToOrg)
-            {
-                expiredTime.ExpiredTime = order.ExpiredTime.Value;
-                expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-                expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-            }
-            else
+            if (dto.FlowDirection is not EFlowDirection.OrgToOrg)
             {
+                //重新计算期满时间
+                ExpiredTimeWithConfig expiredTime;
                 if (_appOptions.Value.IsZiGong)
                 {
                     if (dto.FlowDirection != null)
@@ -6115,47 +6133,22 @@ public class OrderController : BaseController
                 {
                     expiredTime = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, order.AcceptTypeCode);
                 }
-            }
-
-            var processType = dto.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
-                ? EProcessType.Zhiban
-                : EProcessType.Jiaoban;
-            if (expiredTime.ExpiredTime < order.ExpiredTime)
-            {
-                expiredTime.ExpiredTime = order.ExpiredTime.Value;
-                expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-                expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-            }
 
-            // await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-            //     {
-            //         ExpiredTime = expiredTime.ExpiredTime,
-            //         NearlyExpiredTime = expiredTime.NearlyExpiredTime,
-            //         NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
-            //         ProcessType = processType,
-            //         Status = EOrderStatus.Special
-            //     })
-            //     .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-            order.ExpiredTime = expiredTime.ExpiredTime;
-            order.NearlyExpiredTime = expiredTime.NearlyExpiredTime;
-            order.NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne;
-            order.ProcessType = processType;
-            order.Status = EOrderStatus.Special;
+                if (expiredTime?.ExpiredTime > order.ExpiredTime)
+                {
+                    order.ExpiredTime = expiredTime.ExpiredTime;
+                    order.NearlyExpiredTime = expiredTime.NearlyExpiredTime;
+                    order.NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne;
 
-            var orderDto = _mapper.Map<OrderDto>(order);
-            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
-                cancellationToken: HttpContext.RequestAborted);
-            // if (dto.BusinessType == EBusinessType.Send && recall.NextHandlers.Any())
-            // {
-            //     var flowStepHandler = recall.NextHandlers.FirstOrDefault();
-            //     await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-            //             { CenterToOrgHandlerId = flowStepHandler.UserId, CenterToOrgHandlerName = flowStepHandler.Username })
-            //         .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-            // }
+                    var orderDto = _mapper.Map<OrderDto>(order);
+                    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
+                        cancellationToken: HttpContext.RequestAborted);
+                }
+            }
 
             var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) = await _workflowDomainService.RecallAsync(recall,
                 dto.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Recall,
-                expiredTime.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.Recall,
+                order.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.Recall,
                 async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
                 {
                     var basicWorkflowDto = _mapper.Map<BasicWorkflowDto>(dto);
@@ -6171,24 +6164,21 @@ public class OrderController : BaseController
 
             if (string.IsNullOrEmpty(currentStep?.HandlerOrgId))
             {
-                model.OrgId = currentStep.HandlerOrgId;
-                model.OrgName = currentStep.HandlerOrgName;
-                model.StepName = currentStep.Name;
-                model.StepCode = currentStep.Code;
+                special.OrgId = currentStep.HandlerOrgId;
+                special.OrgName = currentStep.HandlerOrgName;
+                special.StepName = currentStep.Name;
+                special.StepCode = currentStep.Code;
             }
 
             if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)
             {
-                model.NextHandlers = new List<StepAssignInfo> { newStep.GetWorkflowStepHandler() };
+                special.NextHandlers = new List<StepAssignInfo> { newStep.GetWorkflowStepHandler() };
             }
 
             if (dto.BusinessType == EBusinessType.Send)
             {
                 order.CenterToOrgHandlerId = newStep.HandlerId;
                 order.CenterToOrgHandlerName = newStep.HandlerName;
-                // await _orderRepository.Updateable(order)
-                //     .UpdateColumns(d => new { d.CenterToOrgHandlerId, d.CenterToOrgHandlerName })
-                //     .ExecuteCommandAsync(HttpContext.RequestAborted);
             }
 
             _mapper.Map(workflow, order);
@@ -6197,7 +6187,11 @@ public class OrderController : BaseController
                 ? EOrderStatus.SpecialToUnAccept
                 : EOrderStatus.Special;
 
-            if (order.Status >= EOrderStatus.Filed)
+            order.ProcessType = dto.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
+                ? EProcessType.Zhiban
+                : EProcessType.Jiaoban;
+
+            if (special.Status >= EOrderStatus.Filed)
             {
                 var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == dto.OrderId);
                 if (publish != null)
@@ -6225,33 +6219,18 @@ public class OrderController : BaseController
             await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
 
             var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
-            CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
-            if (order != null && (cityBase.CityProvince.OrgId.Equals(model.OrgId) ||
-                                  cityBase.CityProvinceAssign.OrgId.Equals(model.OrgId) || cityBase.CityEnterprise.OrgId.Equals(model.OrgId) ||
-                                  cityBase.PublicSecurity.OrgId.Equals(model.OrgId)))
+            var cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
+            if (order != null && (cityBase.CityProvince.OrgId.Equals(special.OrgId) ||
+                                  cityBase.CityProvinceAssign.OrgId.Equals(special.OrgId) || cityBase.CityEnterprise.OrgId.Equals(special.OrgId) ||
+                                  cityBase.PublicSecurity.OrgId.Equals(special.OrgId)))
             {
-                if (order.Status < EOrderStatus.Filed)
+                if (special.Status < EOrderStatus.Filed)
                 {
-                    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFlowRecalled,
-                        new PublishSpecialDto { Order = _mapper.Map<OrderDto>(order), Special = _mapper.Map<OrderSpecialDto>(model) },
+                    await _capPublisher.PublishAsync(EventNames.HotlineOrderFlowRecalled,
+                        new PublishSpecialDto { Order = _mapper.Map<OrderDto>(order), Special = _mapper.Map<OrderSpecialDto>(special) },
                         cancellationToken: HttpContext.RequestAborted);
                 }
             }
-
-            //await _orderRepository.Updateable(order)
-            //    .UpdateColumns(d => new
-            //    {
-            //        d.CenterToOrgHandlerId,
-            //        d.CenterToOrgHandlerName,
-            //        d.ExpiredTime,
-            //        d.NearlyExpiredTime,
-            //        d.NearlyExpiredTimeOne,
-            //        d.ProcessType,
-            //        d.Status,
-            //    })
-            //    .ExecuteCommandAsync(HttpContext.RequestAborted);
-
-            
         }
         else
         {
@@ -6259,7 +6238,7 @@ public class OrderController : BaseController
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
         }
 
-        await _orderSpecialRepository.AddAsync(model, HttpContext.RequestAborted);
+        await _orderSpecialRepository.AddAsync(special, HttpContext.RequestAborted);
     }
 
     /// <summary>
@@ -6289,32 +6268,20 @@ public class OrderController : BaseController
             throw UserFriendlyException.SameMessage(order.No + " 工单存在正在审核中的退回,不能办理");
         }
 
-        var model = _mapper.Map<OrderSpecial>(dto);
-
-        // var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true,
-        //     cancellationToken: HttpContext.RequestAborted);
-        // var currentStep = workflow.Steps.FirstOrDefault(x => x.Status != EWorkflowStepStatus.Handled);
-        // if (currentStep is null)
-        //     currentStep = workflow.Steps.OrderByDescending(x => x.CreationTime).FirstOrDefault(x => x.StepType == EStepType.End);
-
-        // model.OrgId = currentStep is null ? _sessionContext.RequiredOrgId : currentStep.HandlerOrgId;
-        // model.OrgName = currentStep is null ? _sessionContext.OrgName : currentStep.HandlerOrgName;
-        model.OrgId = _sessionContext.RequiredOrgId;
-        model.OrgName = _sessionContext.OrgName;
-        // var step = await _workflowDomainService.FindLastStepAsync(model.WorkflowId, HttpContext.RequestAborted);
-        // model.StepName = step.Name;
-        // model.StepCode = step.Code;
-        model.State = 1;
-        model.SpecialType = dto.SpecialType;
-        model.LastFileOpinion = order.FileOpinion;
-        model.FirstFileOpinion = order.FileOpinion;
+        var special = _mapper.Map<OrderSpecial>(dto);
+        special.OrgId = _sessionContext.RequiredOrgId;
+        special.OrgName = _sessionContext.OrgName;
+        special.State = 1;
+        special.SpecialType = dto.SpecialType;
+        special.LastFileOpinion = order.FileOpinion;
+        special.FirstFileOpinion = order.FileOpinion;
         var firstSpecial = await _orderSpecialRepository.Queryable().Where(x => x.OrderId == dto.OrderId).FirstAsync();
         if (firstSpecial is not null)
-            model.FirstFileOpinion = firstSpecial.FirstFileOpinion;
-        model.InitId();
+            special.FirstFileOpinion = firstSpecial.FirstFileOpinion;
+        special.InitId();
         if (dto.Files.Any())
-            model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", HttpContext.RequestAborted);
-        // await _orderSpecialRepository.AddAsync(model, HttpContext.RequestAborted);
+            special.FileJson = await _fileRepository.AddFileAsync(dto.Files, special.Id, "", HttpContext.RequestAborted);
+
         if (dto.ReTransactError != null && dto.ReTransactError.Any())
         {
             List<OrderSpecialDetail> details = new();
@@ -6322,29 +6289,15 @@ public class OrderController : BaseController
             {
                 var detail = new OrderSpecialDetail();
                 _mapper.Map(item, detail);
-                detail.SpecialId = model.Id;
+                detail.SpecialId = special.Id;
                 details.Add(detail);
             }
 
             await _orderSpecialDetailRepository.AddRangeAsync(details, HttpContext.RequestAborted);
         }
 
-        if (model.State == 1)
+        if (special.State == 1)
         {
-            //var handler = dto.NextHandlers.FirstOrDefault();
-            // if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)
-            // {
-            //     // 平均派单
-            //     var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
-            //     if (averageSendOrder)
-            //     {
-            //         handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-            //         dto.NextHandlers = new List<FlowStepHandler> { handler };
-            //         await _orderSpecialRepository.Updateable().SetColumns(x => new OrderSpecial { NextHandlers = dto.NextHandlers })
-            //             .Where(x => x.Id == model.Id).ExecuteCommandAsync();
-            //     }
-            // }
-
             var recall = new RecallDto
             {
                 WorkflowId = dto.WorkflowId!,
@@ -6359,46 +6312,53 @@ public class OrderController : BaseController
             DateTime endTime = order.ExpiredTime!.Value;
             //todo
             //宜宾需求:1. 坐席申请特提:指派给申请人办理 2. 派单员申请特提:所有派单员都能办 3.其他特提场景:按节点原配置办理
-            var processType = dto.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
+            order.ProcessType = dto.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
                 ? EProcessType.Zhiban
                 : EProcessType.Jiaoban;
             // 计算期满时间
             if (dto.AlterTime)
             {
                 DateTime startTime = DateTime.Now;
-                if (order.CenterToOrgTime.HasValue && processType == EProcessType.Jiaoban)
+                if (order.CenterToOrgTime.HasValue && order.ProcessType == EProcessType.Jiaoban)
                 {
                     startTime = order.CenterToOrgTime.Value;
                 }
-                else if (processType == EProcessType.Zhiban)
+                else if (order.ProcessType == EProcessType.Zhiban)
                 {
                     startTime = order.StartTime.Value;
                 }
 
-                var expiredTime =
-                    // _timeLimitDomainService.CalcEndTime(
-                    await _expireTime.CalcEndTime(
-                        DateTime.Now, startTime,
-                        ETimeType.WorkDay,
-                        dto.TimeLimit.Value, order.AcceptTypeCode);
-                if (expiredTime.EndTime < order.ExpiredTime.Value)
-                {
-                    expiredTime.EndTime = order.ExpiredTime.Value;
-                    expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-                    expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-                }
+                //var expiredTime = await _expireTime.CalcEndTime(
+                //    DateTime.Now, startTime, ETimeType.WorkDay,
+                //    dto.TimeLimit.Value, order.AcceptTypeCode);
+                var expiredTime = await _expireTime.CalcEndTime(DateTime.Now, startTime, order.AcceptTypeCode);
+
+                //if (expiredTime.EndTime < order.ExpiredTime.Value)
+                //{
+                //    expiredTime.EndTime = order.ExpiredTime.Value;
+                //    expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
+                //    expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
+                //}
 
-                endTime = expiredTime.EndTime;
-                await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
+                //endTime = expiredTime.EndTime;
+                //await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
+                //{
+                //    ExpiredTime = expiredTime.EndTime,
+                //    NearlyExpiredTime = expiredTime.NearlyExpiredTime,
+                //    NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne
+                //})
+                //    .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
+
+                if (expiredTime?.ExpiredTime > order.ExpiredTime)
                 {
-                    ExpiredTime = expiredTime.EndTime,
-                    NearlyExpiredTime = expiredTime.NearlyExpiredTime,
-                    NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne
-                })
-                    .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-                var orderDto = _mapper.Map<OrderDto>(order);
-                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
-                    cancellationToken: HttpContext.RequestAborted);
+                    order.ExpiredTime = expiredTime.ExpiredTime;
+                    order.NearlyExpiredTime = expiredTime.NearlyExpiredTime;
+                    order.NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne;
+
+                    var orderDto = _mapper.Map<OrderDto>(order);
+                    await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
+                        cancellationToken: HttpContext.RequestAborted);
+                }
             }
 
             // if (dto.BusinessType == EBusinessType.Send && recall.NextHandlers.Any())
@@ -6409,14 +6369,6 @@ public class OrderController : BaseController
             //         .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
             // }
 
-            // StepAssignInfo? stepAssignInfo = null;
-            // if (handler is not null)
-            // {
-            //     stepAssignInfo = _mapper.Map<StepAssignInfo>(handler);
-            //     stepAssignInfo.FlowAssignType = EFlowAssignType.User;
-            // }
-
-            // var reverseFlowStepAssignInfo = _orderDomainService.GetOrderRecallAssignInfo(dto.BusinessType, stepAssignInfo);
             var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) = await _workflowDomainService.RecallAsync(
                 recall, recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Redo,
                 endTime, order.Status >= EOrderStatus.Filed, EHandleMode.Redo,
@@ -6432,20 +6384,20 @@ public class OrderController : BaseController
                 }, HttpContext.RequestAborted);
 
             //记录特提后最新的流程节点
-            if (newStep != null && !string.IsNullOrEmpty(newStep.Id))
-                model.NewCurrentStepId = newStep.Id;
+            if (!string.IsNullOrEmpty(newStep.Id))
+                special.NewCurrentStepId = newStep.Id;
 
             if (string.IsNullOrEmpty(currentStep?.HandlerOrgId))
             {
-                model.OrgId = currentStep.HandlerOrgId;
-                model.OrgName = currentStep.HandlerOrgName;
-                model.StepName = currentStep.Name;
-                model.StepCode = currentStep.Code;
+                special.OrgId = currentStep.HandlerOrgId;
+                special.OrgName = currentStep.HandlerOrgName;
+                special.StepName = currentStep.Name;
+                special.StepCode = currentStep.Code;
             }
 
             if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)
             {
-                model.NextHandlers = new List<StepAssignInfo> { newStep.GetWorkflowStepHandler() };
+                special.NextHandlers = new List<StepAssignInfo> { newStep.GetWorkflowStepHandler() };
             }
 
             if (dto.BusinessType == EBusinessType.Send)
@@ -6454,22 +6406,36 @@ public class OrderController : BaseController
                 order.CenterToOrgHandlerName = newStep.HandlerName;
             }
 
-            //await _workflowApplication.RecallAsync(recall, endTime, order.Status >= EOrderStatus.Filed, EWorkflowTraceType.Redo,
-            //    HttpContext.RequestAborted);
-            //var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == dto.OrderId);
-            //if (publish != null)
-            //{
-            //    var publishHistory = _mapper.Map<OrderPublishHistory>(publish);
-            //    publishHistory.OrderPublishId = publish.Id;
-            //    publishHistory.ArrangeTitleAfter = publish.ArrangeTitle;
-            //    publishHistory.ArrangeTitleBefor = publish.ArrangeTitle;
-            //    publishHistory.ArrangeContentAfter = publish.ArrangeContent;
-            //    publishHistory.ArrangeContentBefor = publish.ArrangeContent;
-            //    publishHistory.ArrangeOpinionAfter = publish.ArrangeOpinion;
-            //    publishHistory.ArrangeOpinionBefor = publish.ArrangeOpinion;
-            //    await _orderPublishHistoryRepository.AddAsync(publishHistory, HttpContext.RequestAborted);
-            //    await _orderPublishRepository.RemoveAsync(publish, false, HttpContext.RequestAborted);
-            //}
+            _mapper.Map(workflow, order);
+            order.FileEmpty();
+            order.Status = targetStepDefine.StepType is EStepType.Start
+                ? EOrderStatus.SpecialToUnAccept
+                : EOrderStatus.Special;
+
+            if (special.Status >= EOrderStatus.Filed)
+            {
+                var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == dto.OrderId);
+                if (publish != null)
+                {
+                    var publishHistory = _mapper.Map<OrderPublishHistory>(publish);
+                    publishHistory.OrderPublishId = publish.Id;
+                    publishHistory.ArrangeTitleAfter = publish.ArrangeTitle;
+                    publishHistory.ArrangeTitleBefor = publish.ArrangeTitle;
+                    publishHistory.ArrangeContentAfter = publish.ArrangeContent;
+                    publishHistory.ArrangeContentBefor = publish.ArrangeContent;
+                    publishHistory.ArrangeOpinionAfter = publish.ArrangeOpinion;
+                    publishHistory.ArrangeOpinionBefor = publish.ArrangeOpinion;
+                    await _orderPublishHistoryRepository.AddAsync(publishHistory, HttpContext.RequestAborted);
+                    await _orderPublishRepository.RemoveAsync(publish, false, HttpContext.RequestAborted);
+                }
+
+                var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == dto.OrderId && x.VisitState != EVisitState.None);
+                if (visit != null)
+                {
+                    visit.VisitState = EVisitState.None;
+                    await _orderVisitRepository.UpdateAsync(visit, HttpContext.RequestAborted);
+                }
+            }
 
             //var reTransactNum = order.ReTransactNum.HasValue ? order.ReTransactNum.Value + 1 : 1;
             var orderStatus = EOrderStatus.SendBack;
@@ -6477,22 +6443,13 @@ public class OrderController : BaseController
 
             if (_appOptions.Value.IsZiGong)
             {
-                orderStatus = model.SpecialType == ESpecialType.SendBack ? EOrderStatus.SendBack : EOrderStatus.Special;
-                orderStartStatus = model.SpecialType == ESpecialType.SendBack ? EOrderStatus.BackToUnAccept : EOrderStatus.SpecialToUnAccept;
+                orderStatus = special.SpecialType == ESpecialType.SendBack ? EOrderStatus.SendBack : EOrderStatus.Special;
+                orderStartStatus = special.SpecialType == ESpecialType.SendBack ? EOrderStatus.BackToUnAccept : EOrderStatus.SpecialToUnAccept;
             }
 
             //ReTransactNum = reTransactNum,
-            order.Status = model.StepType == EStepType.Start ? orderStartStatus : orderStatus;
-            order.ProcessType = processType;
-            await _orderRepository.Updateable(order)
-                .UpdateColumns(d => new
-                {
-                    d.CenterToOrgHandlerId,
-                    d.CenterToOrgHandlerName,
-                    d.ProcessType,
-                    d.Status
-                })
-                .ExecuteCommandAsync(HttpContext.RequestAborted);
+            order.Status = special.StepType == EStepType.Start ? orderStartStatus : orderStatus;
+            await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
 
             // 重办清空已取消发布的工单的回访信息
             await _orderDomainService.VisitNoneByCancelPublishAsync(order.Id, HttpContext.RequestAborted);
@@ -6504,7 +6461,7 @@ public class OrderController : BaseController
             //}
         }
 
-        await _orderSpecialRepository.AddAsync(model, HttpContext.RequestAborted);
+        await _orderSpecialRepository.AddAsync(special, HttpContext.RequestAborted);
     }
 
     /// <summary>
@@ -6528,124 +6485,11 @@ public class OrderController : BaseController
             special.ReplyFileJson = await _fileRepository.AddFileAsync(dto.Files, special.Id, "", HttpContext.RequestAborted);
         else
             special.ReplyFileJson = new List<Share.Dtos.File.FileJson>();
-        //await _orderSpecialRepository.UpdateAsync(special, HttpContext.RequestAborted);
+
         var order = await _orderRepository.GetAsync(x => x.Id == special.OrderId);
         if (special.State == 1)
         {
-            //var handler = dto.NextHandlers.FirstOrDefault();
-            // if (_appOptions.Value.IsZiGong && special.BusinessType == EBusinessType.Send)
-            // {
-            //     // 平均派单
-            //     var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
-            //     if (averageSendOrder)
-            //     {
-            //         handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-            //         special.NextHandlers = new List<FlowStepHandler> { handler };
-            //         await _orderSpecialRepository.Updateable().SetColumns(x => new OrderSpecial { NextHandlers = special.NextHandlers })
-            //             .Where(x => x.Id == special.Id).ExecuteCommandAsync();
-            //     }
-            // }
-
-            var recall = new RecallDto
-            {
-                WorkflowId = special.WorkflowId!,
-                NextStepCode = special.NextStepCode,
-                NextStepName = special.NextStepName,
-                NextHandlers = special.NextHandlers,
-                // Opinion = dto.Opinion,
-                Opinion = "【特提理由】" + special.Reason,
-                FlowDirection = special.FlowDirection,
-                HandlerType = special.HandlerType.Value,
-                BusinessType = special.BusinessType.Value
-            };
-            ExpiredTimeWithConfig? expiredTime = new ExpiredTimeWithConfig();
-
-            if (dto.FlowDirection is EFlowDirection.OrgToOrg)
-            {
-                expiredTime.ExpiredTime = order.ExpiredTime.Value;
-                expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-                expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-            }
-            else
-            {
-                if (_appOptions.Value.IsZiGong)
-                {
-                    if (dto.FlowDirection != null)
-                    {
-                        expiredTime = await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, dto.FlowDirection.Value,
-                            order.Adapt<OrderTimeClacInfo>());
-                    }
-                    else
-                    {
-                        expiredTime = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, order.AcceptTypeCode);
-                    }
-                }
-                else
-                {
-                    expiredTime = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, order.AcceptTypeCode);
-                }
-            }
-
-            if (expiredTime.ExpiredTime < order.ExpiredTime)
-            {
-                expiredTime.ExpiredTime = order.ExpiredTime.Value;
-                expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-                expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-            }
-
-            var processType = special.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
-                ? EProcessType.Zhiban
-                : EProcessType.Jiaoban;
-            await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-            {
-                ExpiredTime = expiredTime.ExpiredTime,
-                NearlyExpiredTime = expiredTime.NearlyExpiredTime,
-                NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
-                ProcessType = processType,
-                Status = EOrderStatus.Special
-            })
-                .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-            var orderDto = _mapper.Map<OrderDto>(order);
-            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
-                cancellationToken: HttpContext.RequestAborted);
-            //}
-            // if (special.BusinessType == EBusinessType.Send && recall.NextHandlers.Any())
-            // {
-            //     var flowStepHandler = recall.NextHandlers.FirstOrDefault();
-            //     await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-            //             { CenterToOrgHandlerId = flowStepHandler.UserId, CenterToOrgHandlerName = flowStepHandler.Username })
-            //         .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-            // }
-
-            //todo 特提重办,按审批通过时间依据中心派至部门的规则计算期满时间,更新order
-
-            var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) = await _workflowDomainService.RecallAsync(
-                recall, recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Recall,
-                expiredTime.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.Recall,
-                async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
-                {
-                    var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
-                                         ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
-                                             recall, HttpContext.RequestAborted);
-                    if (stepAssignInfo is null) return;
-                    var validator = new StepAssignInfoValidator();
-                    await validator.ValidateAndThrowAsync(stepAssignInfo, HttpContext.RequestAborted);
-                    targetStepNew.Assign(stepAssignInfo);
-                }, HttpContext.RequestAborted);
-
-            if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)
-            {
-                special.NextHandlers = new List<StepAssignInfo> { newStep.GetWorkflowStepHandler() };
-            }
-
-            if (dto.BusinessType == EBusinessType.Send)
-            {
-                order.CenterToOrgHandlerId = newStep.HandlerId;
-                order.CenterToOrgHandlerName = newStep.HandlerName;
-                await _orderRepository.Updateable(order)
-                    .UpdateColumns(d => new { d.CenterToOrgHandlerId, d.CenterToOrgHandlerName })
-                    .ExecuteCommandAsync(HttpContext.RequestAborted);
-            }
+            await _orderApplication.RecallAsync(dto, special, order, HttpContext.RequestAborted);
 
             if (order.Status >= EOrderStatus.Filed)
             {
@@ -6673,7 +6517,7 @@ public class OrderController : BaseController
             }
 
             var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
-            CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
+            var cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
             if (order != null && (cityBase.CityProvince.OrgId.Equals(special.OrgId) ||
                                   cityBase.CityProvinceAssign.OrgId.Equals(special.OrgId) || cityBase.CityEnterprise.OrgId.Equals(special.OrgId) ||
                                   cityBase.PublicSecurity.OrgId.Equals(special.OrgId)))
@@ -6718,122 +6562,97 @@ public class OrderController : BaseController
                 special.ReplyFileJson = await _fileRepository.AddFileAsync(dto.Files, special.Id, "", HttpContext.RequestAborted);
             else
                 special.ReplyFileJson = new List<Share.Dtos.File.FileJson>();
-            // await _orderSpecialRepository.UpdateAsync(special, HttpContext.RequestAborted);
+            
             var order = await _orderRepository.GetAsync(x => x.Id == special.OrderId);
             if (special.State == 1)
             {
-                // var handler = dto.NextHandlers.FirstOrDefault();
-                // if (_appOptions.Value.IsZiGong && special.BusinessType == EBusinessType.Send)
-                // {
-                //     // 平均派单
-                //     var averageSendOrder = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.AverageSendOrder).SettingValue[0]);
-                //     if (averageSendOrder)
-                //     {
-                //         handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-                //         special.NextHandlers = new List<FlowStepHandler> { handler };
-                //         await _orderSpecialRepository.Updateable().SetColumns(x => new OrderSpecial { NextHandlers = special.NextHandlers })
-                //             .Where(x => x.Id == special.Id).ExecuteCommandAsync();
-                //     }
-                // }
-
-                var recall = new RecallDto
-                {
-                    WorkflowId = special.WorkflowId!,
-                    NextStepCode = special.NextStepCode,
-                    NextStepName = special.NextStepName,
-                    NextHandlers = special.NextHandlers,
-                    Opinion = "【特提理由】" + dto.Opinion,
-                    FlowDirection = special.FlowDirection,
-                    HandlerType = special.HandlerType.Value,
-                    BusinessType = special.BusinessType.Value
-                };
-                ExpiredTimeWithConfig? expiredTime = new ExpiredTimeWithConfig();
-
-                if (dto.FlowDirection is EFlowDirection.OrgToOrg)
-                {
-                    expiredTime.ExpiredTime = order.ExpiredTime.Value;
-                    expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-                    expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-                }
-                else
-                {
-                    if (_appOptions.Value.IsZiGong)
-                    {
-                        if (dto.FlowDirection != null)
-                        {
-                            expiredTime = await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, dto.FlowDirection.Value,
-                                order.Adapt<OrderTimeClacInfo>());
-                        }
-                        else
-                        {
-                            expiredTime = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, order.AcceptTypeCode);
-                        }
-                    }
-                    else
-                    {
-                        expiredTime = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, order.AcceptTypeCode);
-                    }
-                }
-
-                if (expiredTime.ExpiredTime < order.ExpiredTime)
-                {
-                    expiredTime.ExpiredTime = order.ExpiredTime.Value;
-                    expiredTime.NearlyExpiredTime = order.NearlyExpiredTime.Value;
-                    expiredTime.NearlyExpiredTimeOne = order.NearlyExpiredTimeOne.Value;
-                }
-
-                var processType = special.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
-                    ? EProcessType.Zhiban
-                    : EProcessType.Jiaoban;
-                await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-                {
-                    ExpiredTime = expiredTime.ExpiredTime,
-                    NearlyExpiredTime = expiredTime.NearlyExpiredTime,
-                    NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
-                    ProcessType = processType,
-                    Status = EOrderStatus.Special
-                })
-                    .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-                var orderDto = _mapper.Map<OrderDto>(order);
-                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
-                    cancellationToken: HttpContext.RequestAborted);
+                //var recall = new RecallDto
+                //{
+                //    WorkflowId = special.WorkflowId!,
+                //    NextStepCode = special.NextStepCode,
+                //    NextStepName = special.NextStepName,
+                //    NextHandlers = special.NextHandlers,
+                //    Opinion = "【特提理由】" + dto.Opinion,
+                //    FlowDirection = special.FlowDirection,
+                //    HandlerType = special.HandlerType.Value,
+                //    BusinessType = special.BusinessType.Value
+                //};
+
+                //if (dto.FlowDirection is not EFlowDirection.OrgToOrg)
+                //{
+                //    //重新计算期满时间
+                //    ExpiredTimeWithConfig expiredTime;
+                //    if (_appOptions.Value.IsZiGong)
+                //    {
+                //        if (dto.FlowDirection != null)
+                //        {
+                //            expiredTime = await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, dto.FlowDirection.Value,
+                //                order.Adapt<OrderTimeClacInfo>());
+                //        }
+                //        else
+                //        {
+                //            expiredTime = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, order.AcceptTypeCode);
+                //        }
+                //    }
+                //    else
+                //    {
+                //        expiredTime = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, order.AcceptTypeCode);
+                //    }
+
+                //    if (expiredTime?.ExpiredTime > order.ExpiredTime)
+                //    {
+                //        order.ExpiredTime = expiredTime.ExpiredTime;
+                //        order.NearlyExpiredTime = expiredTime.NearlyExpiredTime;
+                //        order.NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne;
+
+                //        var orderDto = _mapper.Map<OrderDto>(order);
+                //        await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
+                //            cancellationToken: HttpContext.RequestAborted);
+                //    }
                 //}
-                // if (special.BusinessType == EBusinessType.Send && recall.NextHandlers.Any())
-                // {
-                //     var flowStepHandler = recall.NextHandlers.FirstOrDefault();
-                //     await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-                //             { CenterToOrgHandlerId = flowStepHandler.UserId, CenterToOrgHandlerName = flowStepHandler.Username })
-                //         .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
-                // }
-                //todo 特提重办,按审批通过时间依据中心派至部门的规则计算期满时间,更新order
 
-                var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) = await _workflowDomainService.RecallAsync(
-                    recall, recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Recall,
-                    expiredTime.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.Recall,
-                    async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
-                    {
-                        var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
-                                             ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
-                                                 recall, HttpContext.RequestAborted);
-                        if (stepAssignInfo is null) return;
-                        var validator = new StepAssignInfoValidator();
-                        await validator.ValidateAndThrowAsync(stepAssignInfo, HttpContext.RequestAborted);
-                        targetStepNew.Assign(stepAssignInfo);
-                    }, HttpContext.RequestAborted);
+                //order.ProcessType = special.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
+                //    ? EProcessType.Zhiban
+                //    : EProcessType.Jiaoban;
+                ////}
+                //// if (special.BusinessType == EBusinessType.Send && recall.NextHandlers.Any())
+                //// {
+                ////     var flowStepHandler = recall.NextHandlers.FirstOrDefault();
+                ////     await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
+                ////             { CenterToOrgHandlerId = flowStepHandler.UserId, CenterToOrgHandlerName = flowStepHandler.Username })
+                ////         .Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
+                //// }
+                ////todo 特提重办,按审批通过时间依据中心派至部门的规则计算期满时间,更新order
+
+                //var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) = await _workflowDomainService.RecallAsync(
+                //    recall, recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Recall,
+                //    order.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.Recall,
+                //    async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
+                //    {
+                //        var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
+                //                             ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
+                //                                 recall, HttpContext.RequestAborted);
+                //        if (stepAssignInfo is null) return;
+                //        var validator = new StepAssignInfoValidator();
+                //        await validator.ValidateAndThrowAsync(stepAssignInfo, HttpContext.RequestAborted);
+                //        targetStepNew.Assign(stepAssignInfo);
+                //    }, HttpContext.RequestAborted);
+
+                //if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)
+                //{
+                //    special.NextHandlers = new List<StepAssignInfo> { newStep.GetWorkflowStepHandler() };
+                //}
 
-                if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)
-                {
-                    special.NextHandlers = new List<StepAssignInfo> { newStep.GetWorkflowStepHandler() };
-                }
+                //if (dto.BusinessType == EBusinessType.Send)
+                //{
+                //    order.CenterToOrgHandlerId = newStep.HandlerId;
+                //    order.CenterToOrgHandlerName = newStep.HandlerName;
+                //    await _orderRepository.Updateable(order)
+                //        .UpdateColumns(d => new { d.CenterToOrgHandlerId, d.CenterToOrgHandlerName })
+                //        .ExecuteCommandAsync(HttpContext.RequestAborted);
+                //}
 
-                if (dto.BusinessType == EBusinessType.Send)
-                {
-                    order.CenterToOrgHandlerId = newStep.HandlerId;
-                    order.CenterToOrgHandlerName = newStep.HandlerName;
-                    await _orderRepository.Updateable(order)
-                        .UpdateColumns(d => new { d.CenterToOrgHandlerId, d.CenterToOrgHandlerName })
-                        .ExecuteCommandAsync(HttpContext.RequestAborted);
-                }
+                await _orderApplication.RecallAsync(dto, special, order, HttpContext.RequestAborted);
 
                 if (order.Status >= EOrderStatus.Filed)
                 {
@@ -6861,7 +6680,7 @@ public class OrderController : BaseController
                 }
 
                 var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
-                CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
+                var cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
                 if (order != null && (cityBase.CityProvince.OrgId.Equals(special.OrgId) ||
                                       cityBase.CityProvinceAssign.OrgId.Equals(special.OrgId) ||
                                       cityBase.CityEnterprise.OrgId.Equals(special.OrgId) ||

+ 7 - 5
src/Hotline.Api/Controllers/SettingController.cs

@@ -33,16 +33,17 @@ namespace Hotline.Api.Controllers
         private readonly IMapper _mapper;
         private readonly IBusinessTagRepository _businessTag;
         private readonly IRepositoryTextSearch<OrderTs> _repositoryts;
+        private readonly IDaySettingCacheManager _daySettingCacheManager;
 
-		public SettingController(
+        public SettingController(
             IVoiceFileDomainService voiceFileDomainService,
             IRepository<SystemSetting> systemSettingsRepository,
             ISystemSettingCacheManager systemSettingCacheManager,
             IDaySettingRepository daySettingRepository,
             IMapper mapper,
             IBusinessTagRepository businessTag,
-            IRepositoryTextSearch<OrderTs> repositoryts
-			)
+            IRepositoryTextSearch<OrderTs> repositoryts,
+            IDaySettingCacheManager daySettingCacheManager)
         {
             _voiceFileDomainService = voiceFileDomainService;
             _systemSettingsRepository = systemSettingsRepository;
@@ -51,8 +52,8 @@ namespace Hotline.Api.Controllers
             _mapper = mapper;
             _businessTag = businessTag;
             _repositoryts = repositoryts;
-
-		}
+            _daySettingCacheManager = daySettingCacheManager;
+        }
 
         /// <summary>
         /// 查询语音文件
@@ -175,6 +176,7 @@ namespace Hotline.Api.Controllers
         [HttpPost("setdaysettings")]
         public async Task SetDaySettings([FromBody]SetDaySettingsRequest request)
         {
+            _daySettingCacheManager.DelDaySetting();
             foreach (var item in request.list)
             {
                 var day = await _daysettingRepository.GetAsync(x => x.Day.Date == item.Date, HttpContext.RequestAborted);

+ 0 - 59
src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs

@@ -124,65 +124,6 @@ public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
                     await _telDomainService.TelRestApplyPassAsync(workflow.ExternalId, cancellationToken);
                     break;
                 case WorkflowModuleConsts.OrderHandle:
-					//中心归档,自动延期一天
-					if (_appOptions.Value.IsYiBin && notification.Trace.HandlerOrgIsCenter.HasValue && notification.Trace.HandlerOrgIsCenter.Value)
-                    {
-						var dOrder = await _orderRepository.GetAsync(workflow.ExternalId, cancellationToken);
-                        if (dOrder != null && dOrder.ExpiredTime < DateTime.Now)
-                        {
-							var delays = await _orderDelayRepository.Queryable().Where(x => x.OrderId == dOrder.Id && x.AutomaticDelayNum > 0).ToListAsync(cancellationToken);
-							var delayOrder = new OrderDelay();
-							if (delays.Any())
-							{
-								delayOrder = delays.First();
-								var startTime = DateTime.Now;
-								if (dOrder.CenterToOrgTime.HasValue)
-								{
-									startTime = dOrder.CenterToOrgTime.Value;
-								}
-								delayOrder.AfterDelay = (await _expireTime
-									.CalcEndTime(delayOrder.BeforeDelay.Value, startTime, delayOrder.DelayUnit, delayOrder.DelayNum, dOrder.AcceptTypeCode))?.EndTime; //todo
-								await _orderDelayRepository.Updateable().SetColumns(x => new OrderDelay() { AutomaticDelayNum = x.AutomaticDelayNum + 1, ApplyDelayTime = DateTime.Now, AfterDelay = delayOrder.AfterDelay })
-									.Where(x => x.Id == delayOrder.Id).ExecuteCommandAsync(cancellationToken);
-							}
-							else
-							{
-								delayOrder.OrderId = dOrder.Id;
-								delayOrder.EmployeeId = "";
-								delayOrder.EmployeeName = "系统自动延期";
-								delayOrder.ApplyOrgName = OrgSeedData.CenterName;
-								delayOrder.ApplyOrgCode = OrgSeedData.CenterId;
-								delayOrder.DelayApplyType = EDelayApplyType.LocalApply;
-								delayOrder.BeforeDelay = dOrder.ExpiredTime;
-								delayOrder.DelayState = EDelayState.Pass;
-								delayOrder.DelayReason = "系统自动延期";
-								delayOrder.ApplyDelayTime = DateTime.Now;
-								delayOrder.No = dOrder.No;
-								delayOrder.AutomaticDelayNum = 1;
-								delayOrder.DelayNum = 1;
-								delayOrder.DelayUnit = Share.Enums.Settings.ETimeType.WorkDay;
-								delayOrder.IsProDelay = false;
-								delayOrder.CreatorOrgId = OrgSeedData.CenterId;
-								delayOrder.CreatorOrgName = OrgSeedData.CenterName;
-								delayOrder.CreatorName = "系统自动延期";
-								var startTime = DateTime.Now;
-								if (dOrder.CenterToOrgTime.HasValue)
-								{
-									startTime = dOrder.CenterToOrgTime.Value;
-								}
-								if (delayOrder.BeforeDelay != null)
-								{
-									delayOrder.AfterDelay = (await _expireTime
-										.CalcEndTime(delayOrder.BeforeDelay.Value, startTime, delayOrder.DelayUnit, delayOrder.DelayNum, dOrder.AcceptTypeCode))?.EndTime; //todo
-								}
-								await _orderDelayRepository.AddAsync(delayOrder, false, cancellationToken);
-							}
-							//处理工单延期
-							await _orderApplication.DelayOrderExpiredTimeAsync(dOrder.Id, delayOrder.DelayNum,
-								delayOrder.DelayUnit, delayOrder.IsProDelay, cancellationToken);
-						}
-					}
-
                     var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId,
                         withExtension: true, cancellationToken: cancellationToken);
                     //order.CheckIfFiled();

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

@@ -419,5 +419,10 @@ namespace Hotline.Application.Orders
         /// </summary>
         Task<StepAssignInfo?> GetOrderRecallAssignInfoAsync(Workflow workflow, StepDefine targetStepDefine, WorkflowStep targetStep,
             BasicWorkflowDto dto, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 工单特提
+        /// </summary>
+        Task<Order> RecallAsync(AuditOrderSpecialDto dto, OrderSpecial special, Order? order, CancellationToken cancellation);
     }
 }

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

@@ -4006,6 +4006,99 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         return rsp;
     }
 
+    /// <summary>
+    /// 工单特提
+    /// </summary>
+    public async Task<Order> RecallAsync(AuditOrderSpecialDto dto, OrderSpecial special, Order? order, CancellationToken cancellation)
+    {
+        var recall = new RecallDto
+        {
+            WorkflowId = special.WorkflowId!,
+            NextStepCode = special.NextStepCode,
+            NextStepName = special.NextStepName,
+            NextHandlers = special.NextHandlers,
+            // Opinion = dto.Opinion,
+            Opinion = "【特提理由】" + special.Reason,
+            FlowDirection = special.FlowDirection,
+            HandlerType = special.HandlerType.Value,
+            BusinessType = special.BusinessType.Value
+        };
+
+        if (dto.FlowDirection is not EFlowDirection.OrgToOrg)
+        {
+            //重新计算期满时间
+            ExpiredTimeWithConfig expiredTime;
+            if (_appOptions.Value.IsZiGong)
+            {
+                if (dto.FlowDirection != null)
+                {
+                    expiredTime = await _expireTime.CalcExpiredTime(DateTime.Now, DateTime.Now, dto.FlowDirection.Value,
+                        order.Adapt<OrderTimeClacInfo>());
+                }
+                else
+                {
+                    expiredTime = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, order.AcceptTypeCode);
+                }
+            }
+            else
+            {
+                expiredTime = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, order.AcceptTypeCode);
+            }
+
+            if (expiredTime?.ExpiredTime > order.ExpiredTime)
+            {
+                order.ExpiredTime = expiredTime.ExpiredTime;
+                order.NearlyExpiredTime = expiredTime.NearlyExpiredTime;
+                order.NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne;
+
+                var orderDto = _mapper.Map<OrderDto>(order);
+                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
+                    cancellationToken: cancellation);
+            }
+        }
+
+        order.ProcessType = special.FlowDirection is EFlowDirection.OrgToCenter or EFlowDirection.CenterToCenter or EFlowDirection.FiledToCenter
+            ? EProcessType.Zhiban
+            : EProcessType.Jiaoban;
+
+        //todo 特提重办,按审批通过时间依据中心派至部门的规则计算期满时间,更新order
+
+        var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) = await _workflowDomainService.RecallAsync(
+            recall, recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Recall,
+            order.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.Recall,
+            async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
+            {
+                var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
+                                     ?? await GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
+                                         recall, cancellation);
+                if (stepAssignInfo is null) return;
+                var validator = new StepAssignInfoValidator();
+                await validator.ValidateAndThrowAsync(stepAssignInfo, cancellation);
+                targetStepNew.Assign(stepAssignInfo);
+            }, cancellation);
+
+        if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)
+        {
+            special.NextHandlers = new List<StepAssignInfo> { newStep.GetWorkflowStepHandler() };
+        }
+
+        if (dto.BusinessType == EBusinessType.Send)
+        {
+            order.CenterToOrgHandlerId = newStep.HandlerId;
+            order.CenterToOrgHandlerName = newStep.HandlerName;
+        }
+
+        _mapper.Map(workflow, order);
+        order.FileEmpty();
+        order.Status = targetStepDefine.StepType is EStepType.Start
+            ? EOrderStatus.SpecialToUnAccept
+            : EOrderStatus.Special;
+
+        await _orderRepository.UpdateAsync(order, cancellation);
+
+        return order;
+    }
+
     #region private
 
     /// <summary>

+ 9 - 9
src/Hotline.Repository.SqlSugar/System/DaySettingRepository.cs

@@ -12,15 +12,15 @@ namespace Hotline.Repository.SqlSugar.System
         {
         }
 
-        public async Task<bool> IsWorkDay(DateTime date)
-        {
-            var model = await Db.Queryable<DaySetting>().FirstAsync(x=> x.Day.Date == date.Date);
-            if (model!=null)
-            {
-                return model.IsWorkDay;
-            }
-            return WeekTool.IsWorkDay(date);
-        }
+        //public async Task<bool> IsWorkDay(DateTime date)
+        //{
+        //    var model = await Db.Queryable<DaySetting>().FirstAsync(x=> x.Day.Date == date.Date);
+        //    if (model!=null)
+        //    {
+        //        return model.IsWorkDay;
+        //    }
+        //    return WeekTool.IsWorkDay(date);
+        //}
 
 
         public async Task<List<DaySetting>> GetDaySettingsByMonth(int year,int month)

+ 19 - 0
src/Hotline/Caching/Interfaces/IDaySettingCacheManager.cs

@@ -0,0 +1,19 @@
+using Hotline.Settings;
+using Hotline.Settings.TimeLimits;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Caching.Interfaces
+{
+    public interface IDaySettingCacheManager
+    {
+        IReadOnlyList<DaySetting> GetDaySettingCache();
+
+        bool IsWorkDay(DateTime date);
+
+        void DelDaySetting();
+    }
+}

+ 53 - 0
src/Hotline/Caching/Services/DaySettingCacheManager.cs

@@ -0,0 +1,53 @@
+using Hotline.Caching.Interfaces;
+using Hotline.Settings;
+using Hotline.Settings.TimeLimits;
+using Hotline.Tools;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Cache;
+using XF.Domain.Dependency;
+using XF.Domain.Repository;
+
+namespace Hotline.Caching.Services
+{
+    public class DaySettingCacheManager : IDaySettingCacheManager, IScopeDependency
+    {
+        private readonly IRepository<DaySetting> _daySettingRepository;
+
+        private readonly ITypedCache<IReadOnlyList<DaySetting>> _cacheDaySetting;
+
+        public DaySettingCacheManager(IRepository<DaySetting> daySettingRepository, ITypedCache<IReadOnlyList<DaySetting>> cacheDaySetting)
+        {
+            _daySettingRepository = daySettingRepository;
+            _cacheDaySetting = cacheDaySetting;
+        }
+
+
+        public IReadOnlyList<DaySetting> GetDaySettingCache()
+        {
+            var sysDicDataList = _cacheDaySetting.GetOrSet("daysetting", k =>
+            {
+                return _daySettingRepository.Queryable().ToList();
+            });
+            return sysDicDataList;
+        }
+
+        public bool IsWorkDay(DateTime date)
+        {
+            var model = GetDaySettingCache().FirstOrDefault(x => x.Day.Date == date.Date);
+            if (model != null)
+            {
+                return model.IsWorkDay;
+            }
+            return WeekTool.IsWorkDay(date);
+        }
+
+        public void DelDaySetting()
+        {
+            _cacheDaySetting.Remove("daysetting");
+        }
+    }
+}

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

@@ -2086,6 +2086,8 @@ namespace Hotline.FlowEngine.Workflows
             {
                 EBusinessType.Seat => ECounterSignType.Center,
                 EBusinessType.Send => ECounterSignType.Center,
+                EBusinessType.CenterMonitor => ECounterSignType.Center,
+                EBusinessType.CenterLeader => ECounterSignType.Center,
                 EBusinessType.Department => ECounterSignType.Department,
                 EBusinessType.DepartmentLeader => ECounterSignType.Department,
                 EBusinessType.File => null,
@@ -2889,7 +2891,7 @@ namespace Hotline.FlowEngine.Workflows
             newStep.StepExpiredTime = expiredTime;
             newStep.InitId();
 
-            newStep.Assign(step);
+            newStep.Assign(step, EFlowAssignType.User);
 
             stepConfig?.Invoke(workflow, stepDefine, step, newStep);
 

+ 6 - 5
src/Hotline/Settings/TimeLimitDomain/ExpireTimeHandler.cs

@@ -1,4 +1,5 @@
-using Hotline.Settings.TimeLimitDomain.ExpireTimeSupplier;
+using Hotline.Caching.Interfaces;
+using Hotline.Settings.TimeLimitDomain.ExpireTimeSupplier;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos.Settings;
 using Hotline.Share.Enums.Settings;
@@ -7,13 +8,13 @@ using XF.Domain.Dependency;
 namespace Hotline.Settings.TimeLimitDomain;
 public class ExpireTimeHandler : IExpireTimeHandler, IScopeDependency
 {
-    private readonly IDaySettingRepository _daySettingRepository;
     private readonly ExpireTimeFactory _expireTimeFactory;
+    private readonly IDaySettingCacheManager _daySettingCacheManager;
 
-    public ExpireTimeHandler(IDaySettingRepository daySettingRepository, ExpireTimeFactory expireTimeFactory)
+    public ExpireTimeHandler(ExpireTimeFactory expireTimeFactory, IDaySettingCacheManager daySettingCacheManager)
     {
-        _daySettingRepository = daySettingRepository;
         _expireTimeFactory = expireTimeFactory;
+        _daySettingCacheManager = daySettingCacheManager;
     }
 
     /// <summary>
@@ -755,7 +756,7 @@ public class ExpireTimeHandler : IExpireTimeHandler, IScopeDependency
     /// <returns></returns>
     private async Task<bool> IsWorkDay(DateTime date)
     {
-        return await _daySettingRepository.IsWorkDay(date);
+        return _daySettingCacheManager.IsWorkDay(date);
     }
 
     public async Task<bool> NotWorkDay(DateTime date)

+ 4 - 4
src/Hotline/Settings/TimeLimitDomain/ExpireTimeLimitBase.cs

@@ -21,15 +21,15 @@ public abstract class ExpireTimeLimitBase
     private readonly IRepository<TimeLimitSetting> _timeLimitSettingRepository;
     private readonly IExpireTimeHandler _expireTimeHandler;
     private readonly IMapper _mapper;
-    private readonly IDaySettingRepository _daySettingRepository;
+    private readonly IDaySettingCacheManager _daySettingCacheManager;
 
-    public ExpireTimeLimitBase(ISystemSettingCacheManager systemSettingCacheManager, IRepository<TimeLimitSetting> timeLimitSettingRepository, IExpireTimeHandler expireTimeHandler, IMapper mapper, IDaySettingRepository daySettingRepository)
+    public ExpireTimeLimitBase(ISystemSettingCacheManager systemSettingCacheManager, IRepository<TimeLimitSetting> timeLimitSettingRepository, IExpireTimeHandler expireTimeHandler, IMapper mapper,  IDaySettingCacheManager daySettingCacheManager)
     {
         _systemSettingCacheManager = systemSettingCacheManager;
         _timeLimitSettingRepository = timeLimitSettingRepository;
         _expireTimeHandler = expireTimeHandler;
         _mapper = mapper;
-        _daySettingRepository = daySettingRepository;
+        _daySettingCacheManager = daySettingCacheManager;
     }
 
     public virtual async Task<int> CalcWorkTime(DateTime beginTime, DateTime endTime, bool isCenter)
@@ -339,7 +339,7 @@ public abstract class ExpireTimeLimitBase
     /// <param name="date"></param>
     /// <returns></returns>
     private async Task<bool> IsWorkDay(DateTime date) =>
-        await _daySettingRepository.IsWorkDay(date);
+        _daySettingCacheManager.IsWorkDay(date);
 
     /// <summary>
     /// 非工作日

+ 6 - 5
src/Hotline/Settings/TimeLimitDomain/ExpireTimeSupplier/WorkDaySupplier.cs

@@ -1,4 +1,5 @@
-using Hotline.Settings.TimeLimits;
+using Hotline.Caching.Interfaces;
+using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos.Settings;
 using System.ComponentModel.DataAnnotations;
 using XF.Domain.Dependency;
@@ -6,11 +7,11 @@ using XF.Domain.Dependency;
 namespace Hotline.Settings.TimeLimitDomain.ExpireTimeSupplier;
 public class WorkDaySupplier : IExpireTimeSupplier, IScopeDependency
 {
-    private readonly IDaySettingRepository _daySettingRepository;
+    private readonly IDaySettingCacheManager _daySettingCacheManager;
 
-    public WorkDaySupplier(IDaySettingRepository daySettingRepository)
+    public WorkDaySupplier(IDaySettingCacheManager daySettingCacheManager)
     {
-        _daySettingRepository = daySettingRepository;
+        _daySettingCacheManager = daySettingCacheManager;
     }
 
     //public async Task<TimeResult> CalcEndTimeAsync(DateTime beginTime, TimeConfig timeConfig)
@@ -465,7 +466,7 @@ public class WorkDaySupplier : IExpireTimeSupplier, IScopeDependency
     /// <returns></returns>
     private async Task<bool> IsWorkDay(DateTime date)
     {
-        return await _daySettingRepository.IsWorkDay(date);
+        return _daySettingCacheManager.IsWorkDay(date);
     }
 
     private async Task<bool> NotWorkDay(DateTime date)

+ 1 - 1
src/Hotline/Settings/TimeLimitDomain/LuZhouExpireTimeLimit.cs

@@ -15,7 +15,7 @@ namespace Hotline.Settings.TimeLimitDomain;
 [Injection(AppScopes = EAppScope.LuZhou)]
 public class LuZhouExpireTimeLimit : ExpireTimeLimitBase, ICalcExpireTime, IScopeDependency
 {
-    public LuZhouExpireTimeLimit(ISystemSettingCacheManager systemSettingCacheManager, IRepository<TimeLimitSetting> timeLimitSettingRepository, IExpireTimeHandler expireTimeHandler, IMapper mapper, IDaySettingRepository daySettingRepository) : base(systemSettingCacheManager, timeLimitSettingRepository, expireTimeHandler, mapper, daySettingRepository)
+    public LuZhouExpireTimeLimit(ISystemSettingCacheManager systemSettingCacheManager, IRepository<TimeLimitSetting> timeLimitSettingRepository, IExpireTimeHandler expireTimeHandler, IMapper mapper, IDaySettingCacheManager daySettingCacheManager) : base(systemSettingCacheManager, timeLimitSettingRepository, expireTimeHandler, mapper,daySettingCacheManager)
     {
     }
 }

+ 3 - 3
src/Hotline/Settings/TimeLimitDomain/YiBinExpireTimeLimit.cs

@@ -20,16 +20,16 @@ public class YiBinExpireTimeLimit : ExpireTimeLimitBase, ICalcExpireTime, IScope
     private readonly IExpireTimeHandler _expireTimeHandler;
     private readonly IMapper _mapper;
     private readonly IRepository<SystemSetting> _systemSettingRepository;
-    private readonly IDaySettingRepository _daySettingRepository;
+    private readonly IDaySettingCacheManager _daySettingCacheManager;
 
-    public YiBinExpireTimeLimit(ISystemSettingCacheManager systemSettingCacheManager, IRepository<TimeLimitSetting> timeLimitSettingRepository, IExpireTimeHandler expireTimeHandler, IMapper mapper, IRepository<SystemSetting> systemSettingRepository, IDaySettingRepository daySettingRepository) : base(systemSettingCacheManager, timeLimitSettingRepository, expireTimeHandler, mapper,daySettingRepository)
+    public YiBinExpireTimeLimit(ISystemSettingCacheManager systemSettingCacheManager, IRepository<TimeLimitSetting> timeLimitSettingRepository, IExpireTimeHandler expireTimeHandler, IMapper mapper, IRepository<SystemSetting> systemSettingRepository, IDaySettingCacheManager daySettingCacheManager) : base(systemSettingCacheManager, timeLimitSettingRepository, expireTimeHandler, mapper, daySettingCacheManager)
     {
         _systemSettingCacheManager = systemSettingCacheManager;
         _timeLimitSettingRepository = timeLimitSettingRepository;
         _expireTimeHandler = expireTimeHandler;
         _mapper = mapper;
         _systemSettingRepository = systemSettingRepository;
-        _daySettingRepository = daySettingRepository;
+        _daySettingCacheManager = daySettingCacheManager;
     }
 
 }

+ 3 - 3
src/Hotline/Settings/TimeLimitDomain/ZiGongExpireTimeLimit.cs

@@ -27,17 +27,17 @@ public class ZiGongExpireTimeLimit : ExpireTimeLimitBase, ICalcExpireTime, IScop
     private readonly IExpireTimeHandler _expireTimeHandler;
     private readonly IMapper _mapper;
     private readonly IRepository<SystemSetting> _systemSettingRepository;
-    private readonly IDaySettingRepository _daySettingRepository;
     private readonly ILogger<ZiGongExpireTimeLimit> _logger;
+    private readonly IDaySettingCacheManager _daySettingCacheManager;
 
-    public ZiGongExpireTimeLimit(ISystemSettingCacheManager systemSettingCacheManager, ITimeLimitSettingRepository timeLimitSettingRepository, IExpireTimeHandler expireTimeHandler, IMapper mapper, IRepository<SystemSetting> systemSettingRepository, IDaySettingRepository daySettingRepository, ITimeLimitSettingAttributeRepository timeLimitSettingAttributeRepository, ITimeLimitSettingInventoryRepository timeLimitSettingInventoryRepository, ILogger<ZiGongExpireTimeLimit> logger) : base(systemSettingCacheManager, timeLimitSettingRepository, expireTimeHandler, mapper, daySettingRepository)
+    public ZiGongExpireTimeLimit(ISystemSettingCacheManager systemSettingCacheManager, ITimeLimitSettingRepository timeLimitSettingRepository, IExpireTimeHandler expireTimeHandler, IMapper mapper, IRepository<SystemSetting> systemSettingRepository, IDaySettingCacheManager daySettingCacheManager, ITimeLimitSettingAttributeRepository timeLimitSettingAttributeRepository, ITimeLimitSettingInventoryRepository timeLimitSettingInventoryRepository, ILogger<ZiGongExpireTimeLimit> logger) : base(systemSettingCacheManager, timeLimitSettingRepository, expireTimeHandler, mapper, daySettingCacheManager)
     {
         _systemSettingCacheManager = systemSettingCacheManager;
         _timeLimitSettingRepository = timeLimitSettingRepository;
         _expireTimeHandler = expireTimeHandler;
         _mapper = mapper;
         _systemSettingRepository = systemSettingRepository;
-        _daySettingRepository = daySettingRepository;
+        _daySettingCacheManager = daySettingCacheManager;
         _timeLimitSettingAttributeRepository = timeLimitSettingAttributeRepository;
         _timeLimitSettingInventoryRepository = timeLimitSettingInventoryRepository;
         _logger = logger;

+ 1 - 1
src/Hotline/Settings/TimeLimits/IDaySettingRepository.cs

@@ -4,7 +4,7 @@ namespace Hotline.Settings.TimeLimits
 {
     public interface IDaySettingRepository: IRepository<DaySetting>
     {
-        Task<bool> IsWorkDay(DateTime date);
+        //Task<bool> IsWorkDay(DateTime date);
 
         Task<List<DaySetting>> GetDaySettingsByMonth(int year,int month);
     }

+ 5 - 5
src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs

@@ -17,22 +17,22 @@ namespace Hotline.Settings.TimeLimits
     public class TimeLimitDomainService : ITimeLimitDomainService, IScopeDependency
     {
         private readonly ITimeLimitRepository _timeLimitRepository;
-        private readonly IDaySettingRepository _daySettingRepository;
         private List<CalcTimeSetting> timeSettingList;
         private readonly IRepository<SystemSetting> _systemSettingRepository;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
         private readonly IMapper _mapper;
         private List<CalcTimeSetting> sourceSettingList;
+        private readonly IDaySettingCacheManager _daySettingCacheManager;
 
-        public TimeLimitDomainService(ITimeLimitRepository timeLimitRepository, IDaySettingRepository daySettingRepository, 
+        public TimeLimitDomainService(ITimeLimitRepository timeLimitRepository,
             IRepository<SystemSetting> systemSettingRepository, ISystemSettingCacheManager systemSettingCacheManager,
-            IMapper mapper)
+            IMapper mapper, IDaySettingCacheManager daySettingCacheManager)
         {
             _timeLimitRepository = timeLimitRepository;
-            _daySettingRepository = daySettingRepository;
             _systemSettingRepository = systemSettingRepository;
             _systemSettingCacheManager = systemSettingCacheManager;
             _mapper = mapper;
+            _daySettingCacheManager = daySettingCacheManager;
 
             //初始化常量TODO
             timeSettingList = new List<CalcTimeSetting>();
@@ -1012,7 +1012,7 @@ namespace Hotline.Settings.TimeLimits
 
         public bool IsWorkDay(DateTime date)
         {
-            return _daySettingRepository.IsWorkDay(date).GetAwaiter().GetResult();
+            return _daySettingCacheManager.IsWorkDay(date);
         }
 
         /// <summary>