Explorar o código

refactor: 特提指派对象生成

xfe hai 2 meses
pai
achega
f3a8b78423

+ 43 - 36
src/Hotline.Api/Controllers/OrderController.cs

@@ -5984,15 +5984,21 @@ public class OrderController : BaseController
                 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);
+            // 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;
+            
             var orderDto = _mapper.Map<OrderDto>(order);
             await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
                 cancellationToken: HttpContext.RequestAborted);
@@ -6007,16 +6013,16 @@ public class OrderController : BaseController
             var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) = await _workflowDomainService.RecallAsync(recall,
                 dto.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Recall,
                 expiredTime.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.Recall,
-                async (workflow, currentStep, targetStepDefine, newStep) =>
+                async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
                 {
                     var basicWorkflowDto = _mapper.Map<BasicWorkflowDto>(dto);
-                    var stepAssignInfo = await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, currentStep,
+                    var stepAssignInfo = await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
                         basicWorkflowDto, HttpContext.RequestAborted);
                     if (stepAssignInfo is null) return;
                     var validator = new StepAssignInfoValidator();
                     await validator.ValidateAndThrowAsync(stepAssignInfo, HttpContext.RequestAborted);
 
-                    newStep.Assign(stepAssignInfo);
+                    targetStepNew.Assign(stepAssignInfo);
                 },
                 HttpContext.RequestAborted);
 
@@ -6037,9 +6043,9 @@ public class OrderController : BaseController
             {
                 order.CenterToOrgHandlerId = newStep.HandlerId;
                 order.CenterToOrgHandlerName = newStep.HandlerName;
-                await _orderRepository.Updateable(order)
-                    .UpdateColumns(d => new { d.CenterToOrgHandlerId, d.CenterToOrgHandlerName })
-                    .ExecuteCommandAsync(HttpContext.RequestAborted);
+                // await _orderRepository.Updateable(order)
+                //     .UpdateColumns(d => new { d.CenterToOrgHandlerId, d.CenterToOrgHandlerName })
+                //     .ExecuteCommandAsync(HttpContext.RequestAborted);
             }
 
             if (order.Status >= EOrderStatus.Filed)
@@ -6079,19 +6085,20 @@ public class OrderController : BaseController
                         new PublishSpecialDto { Order = _mapper.Map<OrderDto>(order), Special = _mapper.Map<OrderSpecialDto>(model) },
                         cancellationToken: HttpContext.RequestAborted);
                 }
-
-                //try
-                //{
-                //    await _provinceService.RevokeOrder(
-                //        new PublishSpecialDto
-                //        { Order = _mapper.Map<OrderDto>(order), Special = _mapper.Map<OrderSpecialDto>(model) },
-                //        HttpContext.RequestAborted);
-                //}
-                //catch (Exception e)
-                //{
-                //    _logger.LogError("_provinceService.RevokeOrder throw exception: {ex}", e.Message);
-                //}
             }
+            
+            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
         {
@@ -6260,15 +6267,15 @@ public class OrderController : BaseController
             var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) = await _workflowDomainService.RecallAsync(
                 recall, recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.Redo,
                 endTime, order.Status >= EOrderStatus.Filed, EHandleMode.Redo,
-                async (workflow, prevStepDefine, prevStep, newStep) =>
+                async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
                 {
                     var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
-                                         ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, prevStep, prevStepDefine,
+                                         ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
                                              recall, HttpContext.RequestAborted);
                     if (stepAssignInfo is null) return;
                     var validator = new StepAssignInfoValidator();
                     await validator.ValidateAndThrowAsync(stepAssignInfo, HttpContext.RequestAborted);
-                    newStep.Assign(stepAssignInfo);
+                    targetStepNew.Assign(stepAssignInfo);
                 }, HttpContext.RequestAborted);
 
             //记录特提后最新的流程节点
@@ -6462,15 +6469,15 @@ public class OrderController : BaseController
             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, prevStepDefine, prevStep, newStep) =>
+                async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
                 {
                     var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
-                                         ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow,  prevStep,prevStepDefine,
+                                         ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow,  targetStepDefine, targetStep,
                                              recall, HttpContext.RequestAborted);
                     if (stepAssignInfo is null) return;
                     var validator = new StepAssignInfoValidator();
                     await validator.ValidateAndThrowAsync(stepAssignInfo, HttpContext.RequestAborted);
-                    newStep.Assign(stepAssignInfo);
+                    targetStepNew.Assign(stepAssignInfo);
                 }, HttpContext.RequestAborted);
 
             if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)
@@ -6650,15 +6657,15 @@ public class OrderController : BaseController
                 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, prevStepDefine, prevStep, newStep) =>
+                    async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
                     {
                         var stepAssignInfo = recall.NextHandlers.FirstOrDefault()
-                                             ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow,  prevStep,prevStepDefine,
+                                             ?? await _orderApplication.GetOrderRecallAssignInfoAsync(workflow,  targetStepDefine, targetStep,
                                                  recall, HttpContext.RequestAborted);
                         if (stepAssignInfo is null) return;
                         var validator = new StepAssignInfoValidator();
                         await validator.ValidateAndThrowAsync(stepAssignInfo, HttpContext.RequestAborted);
-                        newStep.Assign(stepAssignInfo);
+                        targetStepNew.Assign(stepAssignInfo);
                     }, HttpContext.RequestAborted);
 
                 if (_appOptions.Value.IsZiGong && dto.BusinessType == EBusinessType.Send)

+ 1 - 1
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -417,7 +417,7 @@ namespace Hotline.Application.Orders
         /// <summary>
         /// 查询特提操作目标节点的指派对象
         /// </summary>
-        Task<StepAssignInfo?> GetOrderRecallAssignInfoAsync(Workflow workflow, StepDefine targetStepDefine, WorkflowStep currentStep,
+        Task<StepAssignInfo?> GetOrderRecallAssignInfoAsync(Workflow workflow, StepDefine targetStepDefine, WorkflowStep targetStep,
             BasicWorkflowDto dto, CancellationToken cancellationToken);
     }
 }

+ 255 - 213
src/Hotline.Application/Orders/OrderApplication.cs

@@ -350,7 +350,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                 (step.FlowAssignType == EFlowAssignType.Role && !string.IsNullOrEmpty(step.RoleId) &&
                                  _sessionContextProvider.SessionContext.Roles.Contains(step.RoleId))))
                 .Any())
-             .WhereIF(orgLevel == 2 || orgLevel == 1, d => SqlFunc.Subqueryable<WorkflowStep>()
+            .WhereIF(orgLevel == 2 || orgLevel == 1, d => SqlFunc.Subqueryable<WorkflowStep>()
                 .Where(step => step.ExternalId == d.Id &&
                                step.Status != EWorkflowStepStatus.Handled &&
                                (!string.IsNullOrEmpty(step.HandlerOrgId) && step.HandlerOrgId.StartsWith(orgCode)))
@@ -368,16 +368,16 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
             .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门
-                                                                                                                                   //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
-                                                                                                                                   //.Where(d => d.ExpiredTime != null &&
-                                                                                                                                   //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
+            //&& stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value
+            //.Where(d => d.ExpiredTime != null &&
+            //         d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
             .Where(d => d.Status < EOrderStatus.Filed && dateTime > d.NearlyExpiredTime && dateTime < d.ExpiredTime)
             .OrderByIF(dto is { SortField: "no", SortRule: 0 }, x => x.No, OrderByType.Asc) //工单编号升序
             .OrderByIF(dto is { SortField: "no", SortRule: 1 }, x => x.No, OrderByType.Desc) //工单编号降序
-            .OrderByIF(dto is { SortField: "isProvinceText", SortRule: 0 }, x => x.IsProvince, OrderByType.Asc)//是否省工单升序
-            .OrderByIF(dto is { SortField: "isProvinceText", SortRule: 1 }, x => x.IsProvince, OrderByType.Desc)//是否省工单降序
-            .OrderByIF(dto is { SortField: "currentStepName", SortRule: 0 }, x => x.CurrentStepName, OrderByType.Asc)//当前节点升序
-            .OrderByIF(dto is { SortField: "currentStepName", SortRule: 1 }, x => x.CurrentStepName, OrderByType.Desc)//当前节点降序
+            .OrderByIF(dto is { SortField: "isProvinceText", SortRule: 0 }, x => x.IsProvince, OrderByType.Asc) //是否省工单升序
+            .OrderByIF(dto is { SortField: "isProvinceText", SortRule: 1 }, x => x.IsProvince, OrderByType.Desc) //是否省工单降序
+            .OrderByIF(dto is { SortField: "currentStepName", SortRule: 0 }, x => x.CurrentStepName, OrderByType.Asc) //当前节点升序
+            .OrderByIF(dto is { SortField: "currentStepName", SortRule: 1 }, x => x.CurrentStepName, OrderByType.Desc) //当前节点降序
             .OrderByIF(dto is { SortField: "delayText", SortRule: 0 }, x => x.OrderDelays.Count, OrderByType.Asc) //是否延期升序
             .OrderByIF(dto is { SortField: "delayText", SortRule: 1 }, x => x.OrderDelays.Count, OrderByType.Desc) //是否延期升序
             .OrderByIF(dto is { SortField: "statusText", SortRule: 0 }, x => x.Status, OrderByType.Asc) //工单状态升序
@@ -386,18 +386,18 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, x => x.StartTime, OrderByType.Desc) //受理时间降序
             .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, x => x.ExpiredTime, OrderByType.Asc) //期满时间升序
             .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, x => x.ExpiredTime, OrderByType.Desc) //期满时间降序
-            .OrderByIF(dto is { SortField: "actualHandleOrgName", SortRule: 0 }, x => x.ActualHandleOrgName, OrderByType.Asc)// 接办部门升序
-            .OrderByIF(dto is { SortField: "actualHandleOrgName", SortRule: 1 }, x => x.ActualHandleOrgName, OrderByType.Desc)// 接办部门降序
+            .OrderByIF(dto is { SortField: "actualHandleOrgName", SortRule: 0 }, x => x.ActualHandleOrgName, OrderByType.Asc) // 接办部门升序
+            .OrderByIF(dto is { SortField: "actualHandleOrgName", SortRule: 1 }, x => x.ActualHandleOrgName, OrderByType.Desc) // 接办部门降序
             .OrderByIF(dto is { SortField: "acceptType", SortRule: 0 }, x => x.AcceptTypeCode, OrderByType.Asc) //受理类型升序
             .OrderByIF(dto is { SortField: "acceptType", SortRule: 1 }, x => x.AcceptTypeCode, OrderByType.Desc) //受理类型降序
             .OrderByIF(dto is { SortField: "counterSignTypeText", SortRule: 0 }, x => x.CounterSignType, OrderByType.Asc) //是否会签升序
             .OrderByIF(dto is { SortField: "counterSignTypeText", SortRule: 1 }, x => x.CounterSignType, OrderByType.Desc) //是否会签降序
             .OrderByIF(dto is { SortField: "orgLevelOneName", SortRule: 0 }, x => x.OrgLevelOneName, OrderByType.Asc) //一级部门升序
-            .OrderByIF(dto is { SortField: "orgLevelOneName", SortRule: 1 }, x => x.OrgLevelOneName, OrderByType.Desc)//一级部门降序
+            .OrderByIF(dto is { SortField: "orgLevelOneName", SortRule: 1 }, x => x.OrgLevelOneName, OrderByType.Desc) //一级部门降序
             .OrderByIF(dto is { SortField: "hotspotName", SortRule: 0 }, x => x.HotspotId, OrderByType.Asc) //热点升序
             .OrderByIF(dto is { SortField: "hotspotName", SortRule: 1 }, x => x.HotspotId, OrderByType.Desc) //热点降序
-            .OrderByIF(dto is { SortField: "acceptorName", SortRule: 0 }, x => x.AcceptorName, OrderByType.Asc)// 受理人升序
-            .OrderByIF(dto is { SortField: "acceptorName", SortRule: 1 }, x => x.AcceptorName, OrderByType.Desc);// 受理人升序
+            .OrderByIF(dto is { SortField: "acceptorName", SortRule: 0 }, x => x.AcceptorName, OrderByType.Asc) // 受理人升序
+            .OrderByIF(dto is { SortField: "acceptorName", SortRule: 1 }, x => x.AcceptorName, OrderByType.Desc); // 受理人升序
     }
 
     /// <summary>
@@ -764,10 +764,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
             .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
             .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone == dto.FromPhone) //来电号码
-                                                                                              //.WhereIF(!string.IsNullOrEmpty(dto.PubMan),
-                                                                                              //    d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
-                                                                                              //.WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
-                                                                                              //.WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
+            //.WhereIF(!string.IsNullOrEmpty(dto.PubMan),
+            //    d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
+            //.WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
+            //.WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
             .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
             .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Source != ESource.ProvinceStraight)
             //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
@@ -851,7 +851,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     public async Task<(int, IList<PublishedOrderStatisticsDto>)> QueryPublishedOrderAsync(QueryOrderPublishStatisticsDto dto, bool isFull)
     {
         var orders = await _orderRepository.Queryable()
-           .LeftJoin<User>((order, user) => order.WaitForPublisherId == user.Id)
+            .LeftJoin<User>((order, user) => order.WaitForPublisherId == user.Id)
             .Where((order, user) => !string.IsNullOrEmpty(order.WaitForPublisherId))
             .WhereIF(dto.ProcessType != null && dto.ProcessType == EProcessType.Zhiban, (order, user) => order.FileOrgIsCenter == true)
             .WhereIF(dto.ProcessType != null && dto.ProcessType == EProcessType.Jiaoban, (order, user) => order.FileOrgIsCenter == false)
@@ -894,16 +894,16 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
 
         var res = (from t1 in items
-                   join t2 in orders on t1.Name equals t2.Name into t1_t2
-                   from item in t1_t2.DefaultIfEmpty()
-                   select new PublishedOrderStatisticsDto
-                   {
-                       Name = t1.Name,
-                       PublishTime = t1.PublishTime,
-                       WaitCount = t1_t2.Select(x => x.WaitCount).FirstOrDefault(),
-                       PublicCount = t1.PublicCount,
-                       PrivateCount = t1.PrivateCount
-                   }).ToList();
+            join t2 in orders on t1.Name equals t2.Name into t1_t2
+            from item in t1_t2.DefaultIfEmpty()
+            select new PublishedOrderStatisticsDto
+            {
+                Name = t1.Name,
+                PublishTime = t1.PublishTime,
+                WaitCount = t1_t2.Select(x => x.WaitCount).FirstOrDefault(),
+                PublicCount = t1.PublicCount,
+                PrivateCount = t1.PrivateCount
+            }).ToList();
 
         return (total, res);
     }
@@ -931,7 +931,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
         var query = _orderRepository.Queryable()
             .Includes(order => order.OrderPublish)
-            .Where(order => order.OrderPublish.CreationTime >= dto.StartTime && order.OrderPublish.CreationTime <= dto.EndTime && order.ActualHandleOrgName != null)
+            .Where(order => order.OrderPublish.CreationTime >= dto.StartTime && order.OrderPublish.CreationTime <= dto.EndTime &&
+                            order.ActualHandleOrgName != null)
             .GroupBy(order => new { Name = order.ActualHandleOrgName, PublishTime = order.CreationTime.ToString("YYYY-MM-DD") })
             .Select(order => new PublishedOrderStatisticsDto
             {
@@ -952,16 +953,16 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         }
 
         var res = (from t1 in items
-                   join t2 in orders on t1.Name equals t2.Name into t1_t2
-                   from item in t1_t2.DefaultIfEmpty()
-                   select new PublishedOrderStatisticsDto
-                   {
-                       Name = t1.Name,
-                       PublishTime = t1.PublishTime,
-                       WaitCount = t1_t2.Select(x => x.WaitCount).FirstOrDefault(),
-                       PublicCount = t1.PublicCount,
-                       PrivateCount = t1.PrivateCount
-                   }).ToList();
+            join t2 in orders on t1.Name equals t2.Name into t1_t2
+            from item in t1_t2.DefaultIfEmpty()
+            select new PublishedOrderStatisticsDto
+            {
+                Name = t1.Name,
+                PublishTime = t1.PublishTime,
+                WaitCount = t1_t2.Select(x => x.WaitCount).FirstOrDefault(),
+                PublicCount = t1.PublicCount,
+                PrivateCount = t1.PrivateCount
+            }).ToList();
 
         return (total, res);
     }
@@ -1023,6 +1024,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     _mapper.Map(detaildto, visit.OrderVisitDetails[i]);
                 }
             }
+
             var seat = visit.OrderVisitDetails.FirstOrDefault(x => x.VisitTarget == EVisitTarget.Seat);
             seat.SeatEvaluate = ESeatEvaluate.DefaultSatisfied;
             seat.VoiceEvaluate = EVoiceEvaluate.DefaultSatisfied;
@@ -1464,15 +1466,15 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .WhereIF(dto.IsReTransact.HasValue && dto.IsReTransact.Value == false, d => d.ReTransactNum == null || d.ReTransactNum == 0)
                 .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No)) //工单编码
                 .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
-                                                                                                         //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
+                //.WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptTypeCode)) //受理类型
                 .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.SourceChannelCode == dto.Channel)
                 //.WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
                 //.WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
                 .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
                 .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone == dto.TransferPhone!) //转接号码
-                                                                                                               //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
-                                                                                                               //.WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
-                                                                                                               //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
+                //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
+                //.WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
+                //.WhereIF(!string.IsNullOrEmpty(dto.OrgId), d => d.CurrentHandleOrgId == dto.OrgId)//接办部门
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName)) //一级部门
                 .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
                 .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
@@ -1480,16 +1482,16 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd) //受理时间结束
                 .WhereIF(dto.StartTimeStart.HasValue, d => d.StartTime >= dto.StartTimeStart) //流程开启时间开始
                 .WhereIF(dto.StartTimeEnd.HasValue, d => d.StartTime <= dto.StartTimeEnd) //流程开启时间结束
-                                                                                          //.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))  //紧急程度
+                //.WhereIF(dto.EmergencyLevels.Any(), d => dto.EmergencyLevels.Contains(d.EmergencyLevel))  //紧急程度
                 .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.FromPhone.Contains(dto.FromPhone)) //来电号码
                 .WhereIF(!string.IsNullOrEmpty(dto.PhoneNo), d => d.Contact.Contains(dto.PhoneNo)) //联系电话
-                                                                                                   //.WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
+                //.WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), d => d.PushTypeCode == dto.PushTypeCode) //推送分类
                 .WhereIF(!string.IsNullOrEmpty(dto.PushTypeCode), x => x.OrderPushTypes.Any(opt => opt.PushTypeCode == dto.PushTypeCode)) //推送分类
                 .WhereIF(dto.ExpiredTimeStart.HasValue, d => d.ExpiredTime >= dto.ExpiredTimeStart) //超期时间开始
                 .WhereIF(dto.ExpiredTimeEnd.HasValue, d => d.ExpiredTime <= dto.ExpiredTimeEnd) //超期时间结束
-                                                                                                //.WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status))  //工单状态
+                //.WhereIF(dto.Statuses.Any(), d => dto.Statuses.Contains(d.Status))  //工单状态
                 .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status) //工单状态
-                                                                           //.WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
+                //.WhereIF(dto.Statuses.Any(d => d == EOrderStatus.SpecialToUnAccept), d => d.Status <= EOrderStatus.SpecialToUnAccept)
                 .WhereIF(!string.IsNullOrEmpty(dto.ActualHandlerName), d => d.ActualHandlerName == dto.ActualHandlerName) //接办人
                 .WhereIF(dto.IsScreen == true, d => d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //有甄别
                 .WhereIF(dto.IsScreen == false, d => !d.OrderScreens.Any(x => x.Status != EScreenStatus.Refuse)) //无甄别
@@ -1504,8 +1506,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                          (d.ExpiredTime > d.FiledTime && d.Status >= EOrderStatus.Filed)) //否 超期
                 .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
                 .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName == dto.FromName) //来电人姓名
-                                                                                               //.WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
-                                                                                               //.WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)//区域
+                //.WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
+                //.WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)//区域
                 .WhereIF(!string.IsNullOrEmpty(dto.AreaCode) && dto.AreaCode.LastIndexOf("00") > 0,
                     d => d.AreaCode.StartsWith(SqlFunc.Substring(dto.AreaCode, 0, 4)))
                 .WhereIF(!string.IsNullOrEmpty(dto.AreaCode) && dto.AreaCode.LastIndexOf("00") <= 0, d => d.AreaCode.StartsWith(dto.AreaCode))
@@ -1521,14 +1523,14 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     d.SourceChannelCode == "SZMHD" && d.IsProvince == true) //政民互动
                 .WhereIF(!string.IsNullOrEmpty(dto.ProvinceChannel) && dto.ProvinceChannel == "3", d => d.Source == ESource.ProvinceStraight &&
                     d.SourceChannelCode == "S12345" && d.IsProvince == true) //省12345
-                                                                             //.WhereIF(!string.IsNullOrEmpty(dto.ContentRetrieval),d => d.Title.Contains(dto.ContentRetrieval) || d.Content.Contains(dto.ContentRetrieval) || d.FileOpinion.Contains(dto.ContentRetrieval) || d.ActualOpinion.Contains(dto.ContentRetrieval))
+                //.WhereIF(!string.IsNullOrEmpty(dto.ContentRetrieval),d => d.Title.Contains(dto.ContentRetrieval) || d.Content.Contains(dto.ContentRetrieval) || d.FileOpinion.Contains(dto.ContentRetrieval) || d.ActualOpinion.Contains(dto.ContentRetrieval))
                 .WhereIF(!string.IsNullOrEmpty(dto.ContentRetrieval), d => d.Content.Contains(dto.ContentRetrieval!))
                 .WhereIF(!string.IsNullOrEmpty(dto.FileOption), d => d.FileOpinion.Contains(dto.FileOption!))
                 .WhereIF(dto.IsSgin.HasValue && dto.IsSgin == true, d => d.CurrentStepAcceptTime != null)
                 .WhereIF(dto.IsSgin.HasValue && dto.IsSgin == false, d => d.CurrentStepAcceptTime == null)
                 .WhereIF(dto.FiledType is FiledType.CenterFiled, d => d.FileOrgIsCenter == true) //d => d.ProcessType == EProcessType.Zhiban
                 .WhereIF(dto.FiledType is FiledType.OrgFiled, d => d.FileOrgIsCenter == false) //d => d.ProcessType == EProcessType.Jiaoban
-                                                                                               //.WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTagCode == dto.OrderTagCode)// 工单标签
+                //.WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTagCode == dto.OrderTagCode)// 工单标签
                 .WhereIF(!string.IsNullOrEmpty(dto.OrderTagCode), d => d.OrderTags.Any(ot => ot.DicDataValue == dto.OrderTagCode)) //工单标签
                 .WhereIF(!string.IsNullOrEmpty(dto.FocusOnEvents), d => SqlFunc.SplitIn(d.FocusOnEvents, dto.FocusOnEvents))
                 .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc) //默认排序时间为创建时间
@@ -1816,7 +1818,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(x => x.OrderSpecial.SpecialType == ESpecialType.ReTransact || x.OrderSpecial.SpecialType == ESpecialType.SendBack)
             .Where(x => x.OrderSpecial.CreationTime >= dto.StartTime)
             .Where(x => x.OrderSpecial.CreationTime <= dto.EndTime)
-            .WhereIF(!_sessionContext.OrgIsCenter,x=>x.OrgId.StartsWith(_sessionContext.RequiredOrgId))
+            .WhereIF(!_sessionContext.OrgIsCenter, x => x.OrgId.StartsWith(_sessionContext.RequiredOrgId))
             .MergeTable()
             .GroupBy(x => new { Time = x.OrderSpecial.CreationTime.ToString("yyyy-MM-dd"), x.OrgId, x.OrgName })
             .Select(x => new OrderReTransactVo
@@ -1942,9 +1944,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (IsCenter && list != null)
         {
             data = await list.GroupBy(x => new
-            {
-                VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
-            })
+                {
+                    VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+                })
                 .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
                 {
                     OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
@@ -2001,9 +2003,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         else
         {
             data = await list.GroupBy(x => new
-            {
-                VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr))
-            })
+                {
+                    VisitOrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr))
+                })
                 .Select(x => new VisitAndOrgSatisfactionStatisticsDto()
                 {
                     OrgCode = x.VisitOrgCode.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr)),
@@ -2070,20 +2072,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             if (IsCenter)
             {
                 oldData = await query.GroupBy((x, so) => new
-                {
-                    VisitOrgCode = so.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
-                }).Select((x, so) => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgCode = so.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
-                    TotalSumCount = SqlFunc.AggregateSum(x.Total),
-                    VerySatisfiedCount = SqlFunc.AggregateSum(x.VerySatisfaction), //非常满意数
-                    SatisfiedCount = SqlFunc.AggregateSum(x.Satisfaction), //满意数
-                    RegardedAsSatisfiedCount = SqlFunc.AggregateSum(x.TreatSatisfaction), //视为满意
-                    DefaultSatisfiedCount = SqlFunc.AggregateSum(x.DefaultSatisfaction), //默认满意
-                    NoSatisfiedCount = SqlFunc.AggregateSum(x.Dissatisfaction), //不满意
-                    NoEvaluateCount = SqlFunc.AggregateSum(x.NotEvaluated), //未做评价
-                    NoPutThroughCount = SqlFunc.AggregateSum(x.BlockCall), //未接通
-                })
+                    {
+                        VisitOrgCode = so.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6"))
+                    }).Select((x, so) => new VisitAndOrgSatisfactionStatisticsDto()
+                    {
+                        OrgCode = so.Id.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")),
+                        TotalSumCount = SqlFunc.AggregateSum(x.Total),
+                        VerySatisfiedCount = SqlFunc.AggregateSum(x.VerySatisfaction), //非常满意数
+                        SatisfiedCount = SqlFunc.AggregateSum(x.Satisfaction), //满意数
+                        RegardedAsSatisfiedCount = SqlFunc.AggregateSum(x.TreatSatisfaction), //视为满意
+                        DefaultSatisfiedCount = SqlFunc.AggregateSum(x.DefaultSatisfaction), //默认满意
+                        NoSatisfiedCount = SqlFunc.AggregateSum(x.Dissatisfaction), //不满意
+                        NoEvaluateCount = SqlFunc.AggregateSum(x.NotEvaluated), //未做评价
+                        NoPutThroughCount = SqlFunc.AggregateSum(x.BlockCall), //未接通
+                    })
                     .MergeTable()
                     .LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id)
                     .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
@@ -2106,20 +2108,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             else
             {
                 oldData = await query.GroupBy((x, so) => new
-                {
-                    VisitOrgCode = so.Id
-                }).Select((x, so) => new VisitAndOrgSatisfactionStatisticsDto()
-                {
-                    OrgCode = so.Id, //.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr)),
-                    TotalSumCount = SqlFunc.AggregateSum(x.Total),
-                    VerySatisfiedCount = SqlFunc.AggregateSum(x.VerySatisfaction), //非常满意数
-                    SatisfiedCount = SqlFunc.AggregateSum(x.Satisfaction), //满意数
-                    RegardedAsSatisfiedCount = SqlFunc.AggregateSum(x.TreatSatisfaction), //视为满意
-                    DefaultSatisfiedCount = SqlFunc.AggregateSum(x.DefaultSatisfaction), //默认满意
-                    NoSatisfiedCount = SqlFunc.AggregateSum(x.Dissatisfaction), //不满意
-                    NoEvaluateCount = SqlFunc.AggregateSum(x.NotEvaluated), //未做评价
-                    NoPutThroughCount = SqlFunc.AggregateSum(x.BlockCall), //未接通
-                })
+                    {
+                        VisitOrgCode = so.Id
+                    }).Select((x, so) => new VisitAndOrgSatisfactionStatisticsDto()
+                    {
+                        OrgCode = so.Id, //.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr)),
+                        TotalSumCount = SqlFunc.AggregateSum(x.Total),
+                        VerySatisfiedCount = SqlFunc.AggregateSum(x.VerySatisfaction), //非常满意数
+                        SatisfiedCount = SqlFunc.AggregateSum(x.Satisfaction), //满意数
+                        RegardedAsSatisfiedCount = SqlFunc.AggregateSum(x.TreatSatisfaction), //视为满意
+                        DefaultSatisfiedCount = SqlFunc.AggregateSum(x.DefaultSatisfaction), //默认满意
+                        NoSatisfiedCount = SqlFunc.AggregateSum(x.Dissatisfaction), //不满意
+                        NoEvaluateCount = SqlFunc.AggregateSum(x.NotEvaluated), //未做评价
+                        NoPutThroughCount = SqlFunc.AggregateSum(x.BlockCall), //未接通
+                    })
                     .MergeTable().LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id && (o.Level == orgLevel || o.Level == (orgLevel + 1)))
                     .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
                     {
@@ -2139,22 +2141,22 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             }
 
             data = (from t1 in data
-                    join t2 in oldData on t1.OrgCode equals t2.OrgCode into t1_t2
-                    from item in t1_t2.DefaultIfEmpty()
-                    select new VisitAndOrgSatisfactionStatisticsDto()
-                    {
-                        OrgName = t1.OrgName,
-                        OrgCode = t1.OrgCode,
-                        OrgType = t1.OrgType,
-                        TotalSumCount = t1.TotalSumCount + t1_t2.Select(x => x.TotalSumCount).FirstOrDefault(),
-                        VerySatisfiedCount = t1.VerySatisfiedCount + t1_t2.Select(x => x.VerySatisfiedCount).FirstOrDefault(), //非常满意数
-                        SatisfiedCount = t1.SatisfiedCount + t1_t2.Select(x => x.SatisfiedCount).FirstOrDefault(), //满意数
-                        RegardedAsSatisfiedCount = t1.RegardedAsSatisfiedCount + t1_t2.Select(x => x.RegardedAsSatisfiedCount).FirstOrDefault(), //视为满意
-                        DefaultSatisfiedCount = t1.DefaultSatisfiedCount + t1_t2.Select(x => x.DefaultSatisfiedCount).FirstOrDefault(), //默认满意
-                        NoSatisfiedCount = t1.NoSatisfiedCount + t1_t2.Select(x => x.NoSatisfiedCount).FirstOrDefault(), //不满意
-                        NoEvaluateCount = t1.NoEvaluateCount + t1_t2.Select(x => x.NoEvaluateCount).FirstOrDefault(), //未做评价
-                        NoPutThroughCount = t1.NoPutThroughCount + t1_t2.Select(x => x.NoPutThroughCount).FirstOrDefault(), //未接通
-                    }).ToList();
+                join t2 in oldData on t1.OrgCode equals t2.OrgCode into t1_t2
+                from item in t1_t2.DefaultIfEmpty()
+                select new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgName = t1.OrgName,
+                    OrgCode = t1.OrgCode,
+                    OrgType = t1.OrgType,
+                    TotalSumCount = t1.TotalSumCount + t1_t2.Select(x => x.TotalSumCount).FirstOrDefault(),
+                    VerySatisfiedCount = t1.VerySatisfiedCount + t1_t2.Select(x => x.VerySatisfiedCount).FirstOrDefault(), //非常满意数
+                    SatisfiedCount = t1.SatisfiedCount + t1_t2.Select(x => x.SatisfiedCount).FirstOrDefault(), //满意数
+                    RegardedAsSatisfiedCount = t1.RegardedAsSatisfiedCount + t1_t2.Select(x => x.RegardedAsSatisfiedCount).FirstOrDefault(), //视为满意
+                    DefaultSatisfiedCount = t1.DefaultSatisfiedCount + t1_t2.Select(x => x.DefaultSatisfiedCount).FirstOrDefault(), //默认满意
+                    NoSatisfiedCount = t1.NoSatisfiedCount + t1_t2.Select(x => x.NoSatisfiedCount).FirstOrDefault(), //不满意
+                    NoEvaluateCount = t1.NoEvaluateCount + t1_t2.Select(x => x.NoEvaluateCount).FirstOrDefault(), //未做评价
+                    NoPutThroughCount = t1.NoPutThroughCount + t1_t2.Select(x => x.NoPutThroughCount).FirstOrDefault(), //未接通
+                }).ToList();
         }
 
         #endregion
@@ -2267,20 +2269,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .Where((x, so) => x.Time >= dto.StartTime.Value && x.Time <= dto.EndTime.Value);
 
             oldData = await query.GroupBy((x, so) => new
-            {
-                VisitOrgCode = so.Id
-            }).Select((x, so) => new VisitAndOrgSatisfactionStatisticsDto()
-            {
-                OrgCode = so.Id, //.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr)),
-                TotalSumCount = SqlFunc.AggregateSum(x.Total),
-                VerySatisfiedCount = SqlFunc.AggregateSum(x.VerySatisfaction), //非常满意数
-                SatisfiedCount = SqlFunc.AggregateSum(x.Satisfaction), //满意数
-                RegardedAsSatisfiedCount = SqlFunc.AggregateSum(x.TreatSatisfaction), //视为满意
-                DefaultSatisfiedCount = SqlFunc.AggregateSum(x.DefaultSatisfaction), //默认满意
-                NoSatisfiedCount = SqlFunc.AggregateSum(x.Dissatisfaction), //不满意
-                NoEvaluateCount = SqlFunc.AggregateSum(x.NotEvaluated), //未做评价
-                NoPutThroughCount = SqlFunc.AggregateSum(x.BlockCall), //未接通
-            })
+                {
+                    VisitOrgCode = so.Id
+                }).Select((x, so) => new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgCode = so.Id, //.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>(orgLevelStr)),
+                    TotalSumCount = SqlFunc.AggregateSum(x.Total),
+                    VerySatisfiedCount = SqlFunc.AggregateSum(x.VerySatisfaction), //非常满意数
+                    SatisfiedCount = SqlFunc.AggregateSum(x.Satisfaction), //满意数
+                    RegardedAsSatisfiedCount = SqlFunc.AggregateSum(x.TreatSatisfaction), //视为满意
+                    DefaultSatisfiedCount = SqlFunc.AggregateSum(x.DefaultSatisfaction), //默认满意
+                    NoSatisfiedCount = SqlFunc.AggregateSum(x.Dissatisfaction), //不满意
+                    NoEvaluateCount = SqlFunc.AggregateSum(x.NotEvaluated), //未做评价
+                    NoPutThroughCount = SqlFunc.AggregateSum(x.BlockCall), //未接通
+                })
                 .MergeTable().LeftJoin<SystemOrganize>((it, o) => it.OrgCode == o.Id && (o.Level == org.Level || o.Level == (org.Level + 1)))
                 .Select((it, o) => new VisitAndOrgSatisfactionStatisticsDto()
                 {
@@ -2298,22 +2300,22 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 })
                 .ToListAsync();
             mainList = (from t1 in mainList
-                        join t2 in oldData on t1.OrgCode equals t2.OrgCode into t1_t2
-                        from item in t1_t2.DefaultIfEmpty()
-                        select new VisitAndOrgSatisfactionStatisticsDto()
-                        {
-                            OrgName = t1.OrgName,
-                            OrgCode = t1.OrgCode,
-                            OrgType = t1.OrgType,
-                            TotalSumCount = t1.TotalSumCount + t1_t2.Select(x => x.TotalSumCount).FirstOrDefault(),
-                            VerySatisfiedCount = t1.VerySatisfiedCount + t1_t2.Select(x => x.VerySatisfiedCount).FirstOrDefault(), //非常满意数
-                            SatisfiedCount = t1.SatisfiedCount + t1_t2.Select(x => x.SatisfiedCount).FirstOrDefault(), //满意数
-                            RegardedAsSatisfiedCount = t1.RegardedAsSatisfiedCount + t1_t2.Select(x => x.RegardedAsSatisfiedCount).FirstOrDefault(), //视为满意
-                            DefaultSatisfiedCount = t1.DefaultSatisfiedCount + t1_t2.Select(x => x.DefaultSatisfiedCount).FirstOrDefault(), //默认满意
-                            NoSatisfiedCount = t1.NoSatisfiedCount + t1_t2.Select(x => x.NoSatisfiedCount).FirstOrDefault(), //不满意
-                            NoEvaluateCount = t1.NoEvaluateCount + t1_t2.Select(x => x.NoEvaluateCount).FirstOrDefault(), //未做评价
-                            NoPutThroughCount = t1.NoPutThroughCount + t1_t2.Select(x => x.NoPutThroughCount).FirstOrDefault(), //未接通
-                        }).ToList();
+                join t2 in oldData on t1.OrgCode equals t2.OrgCode into t1_t2
+                from item in t1_t2.DefaultIfEmpty()
+                select new VisitAndOrgSatisfactionStatisticsDto()
+                {
+                    OrgName = t1.OrgName,
+                    OrgCode = t1.OrgCode,
+                    OrgType = t1.OrgType,
+                    TotalSumCount = t1.TotalSumCount + t1_t2.Select(x => x.TotalSumCount).FirstOrDefault(),
+                    VerySatisfiedCount = t1.VerySatisfiedCount + t1_t2.Select(x => x.VerySatisfiedCount).FirstOrDefault(), //非常满意数
+                    SatisfiedCount = t1.SatisfiedCount + t1_t2.Select(x => x.SatisfiedCount).FirstOrDefault(), //满意数
+                    RegardedAsSatisfiedCount = t1.RegardedAsSatisfiedCount + t1_t2.Select(x => x.RegardedAsSatisfiedCount).FirstOrDefault(), //视为满意
+                    DefaultSatisfiedCount = t1.DefaultSatisfiedCount + t1_t2.Select(x => x.DefaultSatisfiedCount).FirstOrDefault(), //默认满意
+                    NoSatisfiedCount = t1.NoSatisfiedCount + t1_t2.Select(x => x.NoSatisfiedCount).FirstOrDefault(), //不满意
+                    NoEvaluateCount = t1.NoEvaluateCount + t1_t2.Select(x => x.NoEvaluateCount).FirstOrDefault(), //未做评价
+                    NoPutThroughCount = t1.NoPutThroughCount + t1_t2.Select(x => x.NoPutThroughCount).FirstOrDefault(), //未接通
+                }).ToList();
         }
 
         #endregion
@@ -2639,10 +2641,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         if (IsCenter && list != null)
         {
             data = await list.GroupBy((x, h) => new
-            {
-                HotspotName = h.HotSpotName,
-                HotspotId = h.Id
-            })
+                {
+                    HotspotName = h.HotSpotName,
+                    HotspotId = h.Id
+                })
                 .Select((x, h) => new VisitAndHotspotSatisfactionStatisticsDto()
                 {
                     HotspotName = h.HotSpotName,
@@ -2677,10 +2679,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         else
         {
             data = await list.GroupBy((x, h) => new
-            {
-                HotspotName = h.HotSpotName,
-                HotspotId = h.Id
-            })
+                {
+                    HotspotName = h.HotSpotName,
+                    HotspotId = h.Id
+                })
                 .Select((x, h) => new VisitAndHotspotSatisfactionStatisticsDto()
                 {
                     HotspotName = h.HotSpotName,
@@ -2742,21 +2744,21 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .ToListAsync();
 
             data = (from t1 in data
-                    join t2 in oldList on t1.HotspotId equals t2.HotspotId into t1_t2
-                    from item in t1_t2.DefaultIfEmpty()
-                    select new VisitAndHotspotSatisfactionStatisticsDto()
-                    {
-                        HotspotName = t1.HotspotName,
-                        HotspotId = t1.HotspotId,
-                        TotalSumCount = t1.TotalSumCount + t1_t2.Select(x => x.TotalSumCount).FirstOrDefault(),
-                        VerySatisfiedCount = t1.VerySatisfiedCount + t1_t2.Select(x => x.VerySatisfiedCount).FirstOrDefault(), //非常满意数
-                        SatisfiedCount = t1.SatisfiedCount + t1_t2.Select(x => x.SatisfiedCount).FirstOrDefault(), //满意数
-                        RegardedAsSatisfiedCount = t1.RegardedAsSatisfiedCount + t1_t2.Select(x => x.RegardedAsSatisfiedCount).FirstOrDefault(), //视为满意
-                        DefaultSatisfiedCount = t1.DefaultSatisfiedCount + t1_t2.Select(x => x.DefaultSatisfiedCount).FirstOrDefault(), //默认满意
-                        NoSatisfiedCount = t1.NoSatisfiedCount + t1_t2.Select(x => x.NoSatisfiedCount).FirstOrDefault(), //不满意
-                        NoEvaluateCount = t1.NoEvaluateCount + t1_t2.Select(x => x.NoEvaluateCount).FirstOrDefault(), //未做评价
-                        NoPutThroughCount = t1.NoPutThroughCount + t1_t2.Select(x => x.NoPutThroughCount).FirstOrDefault(), //未接通
-                    }).ToList();
+                join t2 in oldList on t1.HotspotId equals t2.HotspotId into t1_t2
+                from item in t1_t2.DefaultIfEmpty()
+                select new VisitAndHotspotSatisfactionStatisticsDto()
+                {
+                    HotspotName = t1.HotspotName,
+                    HotspotId = t1.HotspotId,
+                    TotalSumCount = t1.TotalSumCount + t1_t2.Select(x => x.TotalSumCount).FirstOrDefault(),
+                    VerySatisfiedCount = t1.VerySatisfiedCount + t1_t2.Select(x => x.VerySatisfiedCount).FirstOrDefault(), //非常满意数
+                    SatisfiedCount = t1.SatisfiedCount + t1_t2.Select(x => x.SatisfiedCount).FirstOrDefault(), //满意数
+                    RegardedAsSatisfiedCount = t1.RegardedAsSatisfiedCount + t1_t2.Select(x => x.RegardedAsSatisfiedCount).FirstOrDefault(), //视为满意
+                    DefaultSatisfiedCount = t1.DefaultSatisfiedCount + t1_t2.Select(x => x.DefaultSatisfiedCount).FirstOrDefault(), //默认满意
+                    NoSatisfiedCount = t1.NoSatisfiedCount + t1_t2.Select(x => x.NoSatisfiedCount).FirstOrDefault(), //不满意
+                    NoEvaluateCount = t1.NoEvaluateCount + t1_t2.Select(x => x.NoEvaluateCount).FirstOrDefault(), //未做评价
+                    NoPutThroughCount = t1.NoPutThroughCount + t1_t2.Select(x => x.NoPutThroughCount).FirstOrDefault(), //未接通
+                }).ToList();
         }
 
         return data;
@@ -3201,7 +3203,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Includes(x => x.OrderScreens)
             .Where(x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true) ||
                         x.OrderScreens.Any() == false
-            //|| x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false
+                //|| x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.SendBackApply != true)) == false
             )
             .Where(x => x.OrderVisit.Order.ReceiveProvinceNo.StartsWith("ZGZFW") == false ||
                         string.IsNullOrEmpty(x.OrderVisit.Order.ReceiveProvinceNo))
@@ -3434,11 +3436,13 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.IdentityType != null, d => d.Order.IdentityType == dto.IdentityType) //来电主体
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart)
             .WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd)
-            .WhereIF(dto.AiVisitResult.HasValue && dto.AiVisitResult == EAiVisitResult.OrgProcessingResultsNoSatisfied, d => d.VisitState == EVisitState.WaitForVisit && d.VisitType == EVisitType.ChipVoiceVisit && d.OrderVisitDetails.Any(m => SqlFunc.JsonField(m.OrgProcessingResults, "Key") == "2"))
+            .WhereIF(dto.AiVisitResult.HasValue && dto.AiVisitResult == EAiVisitResult.OrgProcessingResultsNoSatisfied,
+                d => d.VisitState == EVisitState.WaitForVisit && d.VisitType == EVisitType.ChipVoiceVisit &&
+                     d.OrderVisitDetails.Any(m => SqlFunc.JsonField(m.OrgProcessingResults, "Key") == "2"))
             //.WhereIF(dto.IsAiVisit.HasValue && dto.IsAiVisit == false, x => x.AiVisitCount > 0)   //是否建立智能回访任务 取反(建立过)
-            .WhereIF(dto.IsAiVisit.HasValue && dto.IsAiVisit == true, x => x.AiVisitCount <= 0)   //(未建立过)
+            .WhereIF(dto.IsAiVisit.HasValue && dto.IsAiVisit == true, x => x.AiVisitCount <= 0) //(未建立过)
             .WhereIF(!string.IsNullOrEmpty(dto.Channel), d => d.Order.SourceChannelCode == dto.Channel)
-            .OrderByIF(dto.VisitStateQuery!= EVisitStateQuery.Visited,x=> x.Order.IsUrgent, OrderByType.Desc)
+            .OrderByIF(dto.VisitStateQuery != EVisitStateQuery.Visited, x => x.Order.IsUrgent, OrderByType.Desc)
             .OrderByDescending(d => d.PublishTime);
         return query;
     }
@@ -3768,7 +3772,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     /// <summary>
     /// 查询特提操作目标节点的指派对象
     /// </summary>
-    public async Task<StepAssignInfo?> GetOrderRecallAssignInfoAsync(Workflow workflow, StepDefine targetStepDefine, WorkflowStep currentStep,
+    public async Task<StepAssignInfo?> GetOrderRecallAssignInfoAsync(
+        Workflow workflow, StepDefine targetStepDefine, WorkflowStep targetStep,
         BasicWorkflowDto dto, CancellationToken cancellationToken)
     {
         //自贡需求:
@@ -3819,21 +3824,34 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                         rsp = new StepAssignInfo
                         {
                             FlowAssignType = EFlowAssignType.Org,
-                            OrgId = currentStep.HandlerOrgId,
-                            OrgName = currentStep.HandlerOrgName,
-                            Key = currentStep.HandlerOrgId,
-                            Value = currentStep.HandlerOrgName,
+                            OrgId = targetStep.HandlerOrgId,
+                            OrgName = targetStep.HandlerOrgName,
+                            Key = targetStep.HandlerOrgId,
+                            Value = targetStep.HandlerOrgName,
                         };
                         break;
                     case EBusinessType.DepartmentLeader:
-                        rsp = new StepAssignInfo
+                        if (targetStep.FlowAssignType is EFlowAssignType.OrgAndRole &&
+                            !string.IsNullOrEmpty(targetStep.HandlerOrgId) &&
+                            !string.IsNullOrEmpty(targetStep.RoleId))
                         {
-                            FlowAssignType = EFlowAssignType.OrgAndRole,
-                            OrgId = currentStep.HandlerOrgId,
-                            OrgName = currentStep.HandlerOrgName,
-                            Key = currentStep.HandlerOrgId,
-                            Value = currentStep.HandlerOrgName,
-                        };
+                            rsp = targetStep.GetWorkflowStepHandler();
+                        }
+                        else
+                        {
+                            var define = targetStepDefine.HandlerTypeItems.First();
+                            rsp = new StepAssignInfo
+                            {
+                                FlowAssignType = EFlowAssignType.OrgAndRole,
+                                OrgId = targetStep.HandlerOrgId,
+                                OrgName = targetStep.HandlerOrgName,
+                                RoleId = define.Key,
+                                RoleName = define.Value,
+                                Key = targetStep.HandlerOrgId,
+                                Value = targetStep.HandlerOrgName,
+                            };
+                        }
+
                         break;
                     case EBusinessType.File:
                     case EBusinessType.Unknown:
@@ -3871,21 +3889,33 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                         rsp = new StepAssignInfo
                         {
                             FlowAssignType = EFlowAssignType.Org,
-                            OrgId = currentStep.HandlerOrgId,
-                            OrgName = currentStep.HandlerOrgName,
-                            Key = currentStep.HandlerOrgId,
-                            Value = currentStep.HandlerOrgName,
+                            OrgId = targetStep.HandlerOrgId,
+                            OrgName = targetStep.HandlerOrgName,
+                            Key = targetStep.HandlerOrgId,
+                            Value = targetStep.HandlerOrgName,
                         };
                         break;
                     case EBusinessType.DepartmentLeader:
-                        rsp = new StepAssignInfo
+                        if (targetStep.FlowAssignType is EFlowAssignType.OrgAndRole &&
+                            !string.IsNullOrEmpty(targetStep.HandlerOrgId) &&
+                            !string.IsNullOrEmpty(targetStep.RoleId))
                         {
-                            FlowAssignType = EFlowAssignType.OrgAndRole,
-                            OrgId = currentStep.HandlerOrgId,
-                            OrgName = currentStep.HandlerOrgName,
-                            Key = currentStep.HandlerOrgId,
-                            Value = currentStep.HandlerOrgName,
-                        };
+                            rsp = targetStep.GetWorkflowStepHandler();
+                        }
+                        else
+                        {
+                            define = targetStepDefine.HandlerTypeItems.First();
+                            rsp = new StepAssignInfo
+                            {
+                                FlowAssignType = EFlowAssignType.OrgAndRole,
+                                OrgId = targetStep.HandlerOrgId,
+                                OrgName = targetStep.HandlerOrgName,
+                                RoleId = define.Key,
+                                RoleName = define.Value,
+                                Key = targetStep.HandlerOrgId,
+                                Value = targetStep.HandlerOrgName,
+                            };
+                        }
                         break;
                     case EBusinessType.File:
                     case EBusinessType.Unknown:
@@ -3907,31 +3937,43 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                         rsp = new StepAssignInfo
                         {
                             FlowAssignType = EFlowAssignType.User,
-                            UserId = currentStep.HandlerId,
-                            Username = currentStep.HandlerName,
-                            Key = currentStep.HandlerId,
-                            Value = currentStep.HandlerName,
+                            UserId = targetStep.HandlerId,
+                            Username = targetStep.HandlerName,
+                            Key = targetStep.HandlerId,
+                            Value = targetStep.HandlerName,
                         };
                         break;
                     case EBusinessType.Department:
                         rsp = new StepAssignInfo
                         {
                             FlowAssignType = EFlowAssignType.Org,
-                            OrgId = currentStep.HandlerOrgId,
-                            OrgName = currentStep.HandlerOrgName,
-                            Key = currentStep.HandlerOrgId,
-                            Value = currentStep.HandlerOrgName,
+                            OrgId = targetStep.HandlerOrgId,
+                            OrgName = targetStep.HandlerOrgName,
+                            Key = targetStep.HandlerOrgId,
+                            Value = targetStep.HandlerOrgName,
                         };
                         break;
                     case EBusinessType.DepartmentLeader:
-                        rsp = new StepAssignInfo
+                        if (targetStep.FlowAssignType is EFlowAssignType.OrgAndRole &&
+                            !string.IsNullOrEmpty(targetStep.HandlerOrgId) &&
+                            !string.IsNullOrEmpty(targetStep.RoleId))
                         {
-                            FlowAssignType = EFlowAssignType.OrgAndRole,
-                            OrgId = currentStep.HandlerOrgId,
-                            OrgName = currentStep.HandlerOrgName,
-                            Key = currentStep.HandlerOrgId,
-                            Value = currentStep.HandlerOrgName,
-                        };
+                            rsp = targetStep.GetWorkflowStepHandler();
+                        }
+                        else
+                        {
+                            var define = targetStepDefine.HandlerTypeItems.First();
+                            rsp = new StepAssignInfo
+                            {
+                                FlowAssignType = EFlowAssignType.OrgAndRole,
+                                OrgId = targetStep.HandlerOrgId,
+                                OrgName = targetStep.HandlerOrgName,
+                                RoleId = define.Key,
+                                RoleName = define.Value,
+                                Key = targetStep.HandlerOrgId,
+                                Value = targetStep.HandlerOrgName,
+                            };
+                        }
                         break;
                     case EBusinessType.File:
                     case EBusinessType.Unknown:
@@ -4253,20 +4295,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             }).ToListAsync();
 
         var res = (from t1 in items
-                   join t2 in items2 on t1.UserId equals t2.UserId into t1_t2
-                   from item in t1_t2.DefaultIfEmpty()
-                   select new SendOrderReportOutDto
-                   {
-                       UserId = t1.UserId,
-                       UserName = t1.UserName,
-                       SendOrderNum = t1.SendOrderNum,
-                       NoSendOrderNum = t1.NoSendOrderNum,
-                       ReSendOrderNum = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault(),
-                       ChainRate = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault() > 0
-                           ? ((double.Parse(t1.SendOrderNum.ToString()) - double.Parse(t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault().ToString())) /
-                               double.Parse(t1.SendOrderNum.ToString()) * 100).ToString("F2") + "%"
-                           : "100.00%",
-                   }).ToList();
+            join t2 in items2 on t1.UserId equals t2.UserId into t1_t2
+            from item in t1_t2.DefaultIfEmpty()
+            select new SendOrderReportOutDto
+            {
+                UserId = t1.UserId,
+                UserName = t1.UserName,
+                SendOrderNum = t1.SendOrderNum,
+                NoSendOrderNum = t1.NoSendOrderNum,
+                ReSendOrderNum = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault(),
+                ChainRate = t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault() > 0
+                    ? ((double.Parse(t1.SendOrderNum.ToString()) - double.Parse(t1_t2.Select(x => x.ReSendOrderNum).FirstOrDefault().ToString())) /
+                        double.Parse(t1.SendOrderNum.ToString()) * 100).ToString("F2") + "%"
+                    : "100.00%",
+            }).ToList();
         return res;
     }
 
@@ -4419,7 +4461,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                     )
                     .Where(d => d.Status <= EOrderStatus.HandOverToUnAccept
                                 || d.Status == EOrderStatus.Handling //指派给班长再指派回坐席时
-                                                                     //|| d.Status == EOrderStatus.Countersigning//跨级派单业务如发起会签再回到坐席会签汇总时
+                        //|| d.Status == EOrderStatus.Countersigning//跨级派单业务如发起会签再回到坐席会签汇总时
                     )
                     ;
 
@@ -4608,7 +4650,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
             .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status) //工单状态
             .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.CurrentStepCode == dto.CurrentStepCode) //当前办理节点
-                                                                                                                //.OrderByDescending(d => d.IsUrgent)
+            //.OrderByDescending(d => d.IsUrgent)
             .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.IsUrgent, OrderByType.Desc)
             .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.StartTime, OrderByType.Desc)
             .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序

+ 6 - 6
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -99,20 +99,20 @@ namespace Hotline.FlowEngine.Workflows
         Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             RecallDto dto, StepAssignInfo stepAssignInfo,
             EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default);
 
         Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
             StepDefine targetStepDefine, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default);
 
         Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
             WorkflowStep targetStep, EWorkflowTraceType traceType,
             DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default);
 
         // Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
@@ -125,14 +125,14 @@ namespace Hotline.FlowEngine.Workflows
         /// 撤回至开始节点
         /// </summary>
         Task RecallToStartStepAsync(Workflow workflow, string opinion, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 特提至派单节点(无派单节点会抛异常)
         /// </summary>
         Task RecallToSendStepAsync(Workflow workflow, string opinion, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default);
 
         /// <summary>
@@ -141,7 +141,7 @@ namespace Hotline.FlowEngine.Workflows
         /// <returns></returns>
         Task<(bool, Workflow workflow)> RecallToCenterFirstToSendAsync(string workflowId, string opinion,
             bool isOrderFiled, DateTime? expiredTime, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default);
 
         ///// <summary>

+ 33 - 13
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1528,7 +1528,7 @@ namespace Hotline.FlowEngine.Workflows
         public async Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             RecallDto dto, StepAssignInfo stepAssignInfo,
             EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var workflow = await GetWorkflowAsync(dto.WorkflowId, withDefine: true, withSteps: true,
@@ -1552,7 +1552,7 @@ namespace Hotline.FlowEngine.Workflows
         public Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
             StepDefine targetStepDefine, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
@@ -1567,7 +1567,7 @@ namespace Hotline.FlowEngine.Workflows
         public Task<(Workflow, StepDefine, WorkflowStep, WorkflowStep, WorkflowStep, bool)> RecallAsync(
             Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
             WorkflowStep targetStep, EWorkflowTraceType traceType, DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var targetStepDefine = GetStepDefine(workflow.WorkflowDefinition, dto.NextStepCode);
@@ -1588,7 +1588,7 @@ namespace Hotline.FlowEngine.Workflows
             Workflow workflow, BasicWorkflowDto dto, StepAssignInfo stepAssignInfo,
             StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
             DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
@@ -1696,12 +1696,32 @@ namespace Hotline.FlowEngine.Workflows
 
             //var stepAssignInfo = GetStepAssignInfo(reverseFlowStepAssignInfo, targetStep, targetStepDefine);
             stepAssignInfo ??= targetStep.GetWorkflowStepHandler();
-            var targetStepNew = targetIsStartStep
-                ? await CreateStartStepAsync(workflow, targetStepDefine, dto, assigner,
-                    stepAssignInfo, traceType, expiredTime, stepConfig, cancellationToken)
-                : (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto, assigner, [stepAssignInfo],
-                    null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
-                    null, expiredTime, stepConfig: stepConfig, cancellationToken: cancellationToken)).First();
+            WorkflowStep targetStepNew;
+            if (targetIsStartStep)
+            {
+                // targetStepNew = await CreateStartStepAsync(workflow, targetStepDefine, dto, assigner,
+                //     stepAssignInfo, traceType, expiredTime, stepConfig, cancellationToken);
+
+                targetStepNew = CreateStartStep(workflow, targetStepDefine, dto, assigner, stepAssignInfo, expiredTime);
+                stepConfig?.Invoke(workflow, currentStep, targetStepDefine, targetStep, targetStepNew);
+                await _workflowStepRepository.AddAsync(targetStepNew, cancellationToken);
+                workflow.Steps.Add(targetStepNew);
+                await CreateTraceAsync(workflow, targetStepNew, traceType, cancellationToken);
+            }
+            else
+            {
+                // targetStepNew = (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto, assigner, [stepAssignInfo],
+                //     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
+                //     null, expiredTime, stepConfig: stepConfig, cancellationToken: cancellationToken)).First();
+
+                targetStepNew = CreateStep(workflow, targetStepDefine, targetPrevStep, stepAssignInfo, assigner,
+                    dto.NextStepCode, null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, expiredTime,
+                    dto.NextStepName, true, true, null, dto.BusinessType, dto.FlowDirection);
+                stepConfig?.Invoke(workflow, currentStep, targetStepDefine, targetStep, targetStepNew);
+                await _workflowStepRepository.AddAsync(targetStepNew, cancellationToken);
+                workflow.Steps.Add(targetStepNew);
+                await CreateTraceAsync(workflow, targetStepNew, traceType, cancellationToken);
+            }
 
             //更新实际办理节点信息
             workflow.UpdateActualStepWhenAssign(targetStepNew, new FlowStepHandler
@@ -1740,7 +1760,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task RecallToStartStepAsync(Workflow workflow, string opinion,
             DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default)
         {
             //todo 1.当前待办节点删掉 2.当前待办trace更新(status, opinion) 3.复制startStep为待办 4.更新workflow(status, csStatus, handlers) 5.publish event
@@ -1790,7 +1810,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task RecallToSendStepAsync(Workflow workflow, string opinion,
             DateTime? expiredTime, bool isOrderFiled, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var sendStep = workflow.Steps.Where(d => d.BusinessType == EBusinessType.Send && d.IsOrigin)
@@ -1841,7 +1861,7 @@ namespace Hotline.FlowEngine.Workflows
         /// <returns>true 派单组  false 话务部</returns>
         public async Task<(bool, Workflow workflow)> RecallToCenterFirstToSendAsync(string workflowId, string opinion,
             bool isOrderFiled, DateTime? expiredTime, EHandleMode handleMode,
-            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? stepConfig = null,
+            Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? stepConfig = null,
             CancellationToken cancellationToken = default)
         {
             var isPaiDan = false;