Переглянути джерело

fixed: 工单接办状态办理时置空,接办时赋值

xf 6 місяців тому
батько
коміт
3a647749f8

+ 116 - 77
src/Hotline.Api/Controllers/OrderController.cs

@@ -302,11 +302,11 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.CenterToOrgHandlerName), d => d.CenterToOrgHandlerName == dto.CenterToOrgHandlerName!) //派单人
             .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName == dto.NameOrNo! || d.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
-            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType)//受理类型
+            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.AcceptTypeCode == dto.AcceptType) //受理类型
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
             .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(!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)
@@ -396,6 +396,7 @@ public class OrderController : BaseController
                     {
                         orderVisit.EmployeeId = string.Empty;
                     }
+
                     if (order is { ProcessType: EProcessType.Zhiban, CounterSignType: null } && !order.IsProvince)
                     {
                         orderVisit.VisitState = EVisitState.Visited;
@@ -549,6 +550,7 @@ public class OrderController : BaseController
         {
             orderVisit.EmployeeId = _sessionContext.RequiredUserId;
         }
+
         if (_appOptions.Value.IsZiGong)
         {
             orderVisit.EmployeeId = string.Empty;
@@ -694,15 +696,17 @@ public class OrderController : BaseController
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.Order.CreationTime >= dto.CreationTimeStart)
             .WhereIF(dto.CreationTimeEnd.HasValue, d => d.Order.CreationTime <= dto.CreationTimeEnd)
             .WhereIF(!string.IsNullOrEmpty(dto.FromPhone), d => d.Order.FromPhone == dto.FromPhone) //来电号码
-            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.Order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
-            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.Order.AcceptTypeCode == dto.AcceptType)//受理类型
+            .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName),
+                d => d.Order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
+            .WhereIF(!string.IsNullOrEmpty(dto.AcceptType), d => d.Order.AcceptTypeCode == dto.AcceptType) //受理类型
             .WhereIF(!string.IsNullOrEmpty(dto.Hotspot), d => d.Order.HotspotSpliceName != null && d.Order.HotspotSpliceName.Contains(dto.Hotspot))
             .WhereIF(!string.IsNullOrEmpty(dto.PublishName), d => d.CreatorName.Contains(dto.PublishName!))
-            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.Order.AcceptorName == dto.NameOrNo! || d.Order.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
+            .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo),
+                d => d.Order.AcceptorName == dto.NameOrNo! || d.Order.AcceptorStaffNo == dto.NameOrNo!) //受理人/坐席
             .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
             .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
             .WhereIF(dto.Resolve.HasValue, x => x.Resolve == dto.Resolve)
-             .WhereIF(dto.IsOverTime == true,
+            .WhereIF(dto.IsOverTime == true,
                 d => (d.Order.ExpiredTime < DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
                      (d.Order.ExpiredTime < d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //是 超期
             .WhereIF(dto.IsOverTime == false,
@@ -904,7 +908,7 @@ public class OrderController : BaseController
                 d => d.OrderVisitDetails.Any(m => dto.OrgProcessingResults.Contains(SqlFunc.JsonField(m.OrgProcessingResults, "Key"))))
             .WhereIF(dto.OrgHandledAttitude.Any(),
                 d => d.OrderVisitDetails.Any(q => dto.OrgHandledAttitude.Contains(SqlFunc.JsonField(q.OrgHandledAttitude, "Key"))))
-             .WhereIF(dto.IsOverTime == true,
+            .WhereIF(dto.IsOverTime == true,
                 d => (d.Order.ExpiredTime < DateTime.Now && d.Order.Status < EOrderStatus.Filed) ||
                      (d.Order.ExpiredTime < d.Order.ActualHandleTime && d.Order.Status >= EOrderStatus.Filed)) //是 超期
             .WhereIF(dto.IsOverTime == false,
@@ -1964,7 +1968,7 @@ public class OrderController : BaseController
     {
         if (_appOptions.Value.IsYiBin) dto.ScreenType = EOrderScreenType.Org;
 
-		dto.CreationTimeEnd = DateTime.Now;
+        dto.CreationTimeEnd = DateTime.Now;
         dto.CreationTimeStart = DateTime.Now;
         if (dto.IsHomePage != null && dto.IsHomePage == true)
         {
@@ -1978,12 +1982,16 @@ public class OrderController : BaseController
             .Includes(x => x.OrderVisit, y => y.Employee)
             //.LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.IsDeleted == false)
             .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
+            .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
             )
             .WhereIF(dto.ScreenType == EOrderScreenType.Seat, x => x.OrderVisit.Order.IsProvince == false)
-            .WhereIF(dto.ScreenSendBack is 1, x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true))
-            .WhereIF(dto.ScreenSendBack is 2, x => x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply != true)) == false)
+            .WhereIF(dto.ScreenSendBack is 1,
+                x => x.OrderScreens.Any(s => s.Status == EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply == true))
+            .WhereIF(dto.ScreenSendBack is 2,
+                x => x.OrderScreens.Any(s => (s.Status != EScreenStatus.SendBack && s.ScreenType == dto.ScreenType && s.SendBackApply != true)) ==
+                     false)
             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
             .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!))
             .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
@@ -2037,7 +2045,9 @@ public class OrderController : BaseController
                     SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
                     SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
                 ))
-                .WhereIF(dto.ScreenType == EOrderScreenType.Seat, x => x.VisitTarget == EVisitTarget.Seat && (x.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied || x.SeatEvaluate == ESeatEvaluate.NoSatisfied))
+                .WhereIF(dto.ScreenType == EOrderScreenType.Seat,
+                    x => x.VisitTarget == EVisitTarget.Seat &&
+                         (x.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied || x.SeatEvaluate == ESeatEvaluate.NoSatisfied))
                 ;
         }
 
@@ -2118,13 +2128,15 @@ public class OrderController : BaseController
         if (screenAny)
             throw UserFriendlyException.SameMessage("该工单已提起甄别申请,正在审批过程中,不能申请");
 
-        var isNoPass = await _orderScreenRepository.AnyAsync(x => x.Status == EScreenStatus.Refuse && x.ScreenType == dto.Data.ScreenType && x.VisitDetailId == dto.Data.VisitDetailId);
+        var isNoPass = await _orderScreenRepository.AnyAsync(x =>
+            x.Status == EScreenStatus.Refuse && x.ScreenType == dto.Data.ScreenType && x.VisitDetailId == dto.Data.VisitDetailId);
         if (isNoPass)
             throw UserFriendlyException.SameMessage("该工单已被拒绝过甄别申请,不能再次申请");
 
         var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ScreenApplyNum);
         int count = await _orderScreenRepository.CountAsync(x =>
-            x.OrderId == dto.Data.OrderId && x.Status == EScreenStatus.Refuse && x.ScreenType == dto.Data.ScreenType && x.VisitDetailId == dto.Data.VisitDetailId);
+            x.OrderId == dto.Data.OrderId && x.Status == EScreenStatus.Refuse && x.ScreenType == dto.Data.ScreenType &&
+            x.VisitDetailId == dto.Data.VisitDetailId);
         if (count > int.Parse(setting?.SettingValue[0]) && int.Parse(setting?.SettingValue[0]) > -1)
             throw UserFriendlyException.SameMessage("甄别申请已超过系统预定设置,不能申请");
 
@@ -2453,10 +2465,12 @@ public class OrderController : BaseController
                 {
                 }
             }
+
             var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
             CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
             //推省上
-            if (!string.IsNullOrEmpty(model.Id) && (cityBase.CityProvince.OrgId.Equals(model.OrgId) || cityBase.CityProvinceAssign.OrgId.Equals(model.OrgId)))
+            if (!string.IsNullOrEmpty(model.Id) &&
+                (cityBase.CityProvince.OrgId.Equals(model.OrgId) || cityBase.CityProvinceAssign.OrgId.Equals(model.OrgId)))
             {
                 var orderDto = _mapper.Map<OrderDto>(order);
                 var supervise = await _orderSuperviseRepository.GetAsync(x => x.Id == model.Id);
@@ -2699,10 +2713,12 @@ public class OrderController : BaseController
                 {
                 }
             }
+
             var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
             CityBaseConfiguration cityBase = JsonSerializer.Deserialize<CityBaseConfiguration>(setting);
             //推省上
-            if (!string.IsNullOrEmpty(model.Id) && (cityBase.CityProvince.OrgId.Equals(model.OrgId) || cityBase.CityProvinceAssign.OrgId.Equals(model.OrgId)))
+            if (!string.IsNullOrEmpty(model.Id) &&
+                (cityBase.CityProvince.OrgId.Equals(model.OrgId) || cityBase.CityProvinceAssign.OrgId.Equals(model.OrgId)))
             {
                 var orderDto = _mapper.Map<OrderDto>(order);
                 var urge = await _orderUrgeRepository.GetAsync(x => x.Id == model.Id);
@@ -2819,7 +2835,7 @@ public class OrderController : BaseController
     public async Task<IReadOnlyList<OrderDto>> QueryFixed([FromQuery] QueryOrderFixedDto dto)
     {
         var hasSetting = Int32.TryParse(
-         _systemSettingCacheManager.GetSetting(SettingConstants.FixedQueryCount)?.SettingValue[0], out var queryCount);
+            _systemSettingCacheManager.GetSetting(SettingConstants.FixedQueryCount)?.SettingValue[0], out var queryCount);
         var query = _orderApplication.QueryOrders(dto);
         var orders = await query.ToFixedListAsync(dto.QueryIndex, hasSetting ? queryCount : null, HttpContext.RequestAborted);
         return _mapper.Map<IReadOnlyList<OrderDto>>(orders);
@@ -2932,7 +2948,7 @@ public class OrderController : BaseController
             .Includes(d => d.OrderDelays)
             .Includes(d => d.OrderPublish)
             .Includes(d => d.OrderPushTypes)
-            .Includes(d=>d.OrderComplements)
+            .Includes(d => d.OrderComplements)
             //.Includes(d => d.OrderScreens)
             .Includes(d => d.OrderVisits.Where(x => x.VisitState == EVisitState.Visited).ToList(), x => x.OrderVisitDetails)
             .Includes(d => d.OrderVisits.Where(x => x.VisitState == EVisitState.Visited).ToList(), x => x.Employee)
@@ -2961,16 +2977,10 @@ public class OrderController : BaseController
                 var setting = _systemSettingCacheManager.GetSetting(SettingConstants.SeatsMonitor);
                 var settingStr = setting?.SettingValue;
                 var roles = _sessionContext.Roles;
-                foreach (var item in settingStr)
+                if ((settingStr?.Any() ?? false) && roles.Any())
                 {
-                    if (roles != null && roles.Contains(item))
-                    {
-                        canInsteadHandle = true;
-                    }
-                    else
-                    {
-                        canInsteadHandle = false;
-                    }
+                    var intersectRoles = settingStr.Intersect(roles);
+                    canInsteadHandle = intersectRoles.Any();
                 }
 
                 if (canInsteadHandle)
@@ -3015,16 +3025,32 @@ public class OrderController : BaseController
                 }
             }
 
-            order.CurrentStepAcceptTime = DateTime.Now;
-            await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
-
-            result.Workflow.UpdateCurrentStepAcceptTime(order.CurrentStepAcceptTime.Value);
-            await _mediator.Publish(new GetOrderDetailNotify(result.Workflow,
-                _sessionContext.RequiredUserId, _sessionContext.UserName,
-                _sessionContext.RequiredOrgId, _sessionContext.OrgName,
-                _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName));
+            //
+            // order.CurrentStepAcceptTime = DateTime.Now;
+            // await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
+            //
+            // result.Workflow.UpdateCurrentStepAcceptTime(order.CurrentStepAcceptTime.Value);
+            // await _mediator.Publish(new GetOrderDetailNotify(result.Workflow,
+            //     _sessionContext.RequiredUserId, _sessionContext.UserName,
+            //     _sessionContext.RequiredOrgId, _sessionContext.OrgName,
+            //     _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName));
+            if (result.CanHandle)
+            {
+                var acceptTime = await _workflowDomainService.AcceptAsync(result.Workflow,
+                    _sessionContext.RequiredUserId, _sessionContext.UserName,
+                    _sessionContext.RequiredOrgId, _sessionContext.OrgName,
+                    _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
+                    HttpContext.RequestAborted);
+                if (acceptTime != null)
+                {
+                    order.ActualHandleStepAcceptTime = acceptTime;
+                    await _orderRepository.Updateable().UpdateColumns(d => d.ActualHandleStepAcceptTime)
+                        .ExecuteCommandAsync(HttpContext.RequestAborted);
+                }
+            }
         }
 
+        dto.CanSign = string.IsNullOrEmpty(dto.SignerId) || !order.ActualHandleStepAcceptTime.HasValue;
 
         //var dto = _mapper.Map<OrderDto>(order!);
         //dto.CountersignId = countersignId;
@@ -3122,7 +3148,7 @@ public class OrderController : BaseController
                 cancellationToken: HttpContext.RequestAborted);
 
             List<OrderRemarksDto> remarks = workflow.Steps.Where(x => !string.IsNullOrEmpty(x.Remark)).Select(x => new OrderRemarksDto
-            { Remark = x.Remark, RemarkTime = x.CreationTime, RemarkUser = x.CreatorName }).ToList();
+                { Remark = x.Remark, RemarkTime = x.CreationTime, RemarkUser = x.CreatorName }).ToList();
             dto.OrderRemarks = remarks;
             if (order.Status == EOrderStatus.SendBack || order.Status == EOrderStatus.SendBackAudit || order.Status == EOrderStatus.BackToUnAccept)
             {
@@ -3171,10 +3197,12 @@ public class OrderController : BaseController
         {
             dto.ProvinceRevokeString = "该工单已由省平台发送撤单!请直接归档办理!";
         }
+
         //终止
         var orderTerminateList = await _orderTerminateRepository.Queryable().Where(x => x.OrderId == order.Id).ToListAsync();
-        dto.OrderTerminateStatus = orderTerminateList.Any(x => x.Status == ETerminateStatus.End) ? "同意" : orderTerminateList.Any(x => x.Status == ETerminateStatus.Refuse) ?
-            "不同意" : orderTerminateList.Any(x => x.Status == ETerminateStatus.Approval || x.Status == ETerminateStatus.SendBack) ? "审批中" : null;
+        dto.OrderTerminateStatus = orderTerminateList.Any(x => x.Status == ETerminateStatus.End) ? "同意" :
+            orderTerminateList.Any(x => x.Status == ETerminateStatus.Refuse) ? "不同意" :
+            orderTerminateList.Any(x => x.Status == ETerminateStatus.Approval || x.Status == ETerminateStatus.SendBack) ? "审批中" : null;
 
 
         return _sessionContext.OrgIsCenter ? dto : dto.DataMask();
@@ -3485,7 +3513,7 @@ public class OrderController : BaseController
         //敏感分词
         await _orderApplication.OrderSensitiveParticiple(dto.Content, order.Id, HttpContext.RequestAborted);
 
-        return new { Id = order.Id, No = order.No, Password = order.Password , CallId = order.CallId};
+        return new { Id = order.Id, No = order.No, Password = order.Password, CallId = order.CallId };
     }
 
     /// <summary>
@@ -3531,6 +3559,7 @@ public class OrderController : BaseController
                 expiredTimeConfig = await _expireTime.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.Adapt<OrderTimeClacInfo>());
             }
         }
+
         order.IsForwarded = dto.Workflow.IsForwarded;
         _mapper.Map(expiredTimeConfig, order);
 
@@ -3588,6 +3617,7 @@ public class OrderController : BaseController
         {
             outDto.Opinion = await _typeCache.GetAsync($"tmp_opinion_{orderId}{_sessionContext.UserId}", HttpContext.RequestAborted);
         }
+
         return outDto;
     }
 
@@ -3655,7 +3685,8 @@ public class OrderController : BaseController
         }
     }
 
-    private async Task HandleOrderAsync(Order order, WorkflowStep startStep, OrderHandleFlowDto orderHandleFlowDto, BasicWorkflowDto workflowDto, CancellationToken cancellationToken)
+    private async Task HandleOrderAsync(Order order, WorkflowStep startStep, OrderHandleFlowDto orderHandleFlowDto, BasicWorkflowDto workflowDto,
+        CancellationToken cancellationToken)
     {
         switch (orderHandleFlowDto.OrderAssignMode)
         {
@@ -3685,7 +3716,7 @@ public class OrderController : BaseController
                 orderHandleFlowDto.CrossSteps = orderHandleFlowDto.CrossSteps.OrderBy(d => d.Sort).ToList();
                 var stepCount = orderHandleFlowDto.CrossSteps.Count;
                 var unhandleSteps = new List<WorkflowStep> { startStep };
-                for (int i = 0;i < stepCount;i++)
+                for (int i = 0; i < stepCount; i++)
                 {
                     var crossStep = orderHandleFlowDto.CrossSteps[i];
                     var tempSteps = new List<WorkflowStep>();
@@ -3709,6 +3740,7 @@ public class OrderController : BaseController
                         var nextSteps = await _workflowDomainService.NextAsync(operater, nextflowDto, order.ExpiredTime, cancellationToken);
                         tempSteps.AddRange(nextSteps);
                     }
+
                     unhandleSteps = tempSteps;
                 }
 
@@ -3773,7 +3805,8 @@ public class OrderController : BaseController
     [HttpPost("steps/temp")]
     public async Task TempSaveAsync([FromBody] StepTempInDto dto)
     {
-        await _typeCache.SetAsync($"tmp_opinion_{dto.OrderId}{_sessionContext.UserId}", dto.Opinion, TimeSpan.FromDays(3), HttpContext.RequestAborted);
+        await _typeCache.SetAsync($"tmp_opinion_{dto.OrderId}{_sessionContext.UserId}", dto.Opinion, TimeSpan.FromDays(3),
+            HttpContext.RequestAborted);
     }
 
     /// <summary>
@@ -3996,7 +4029,8 @@ public class OrderController : BaseController
         {
             query.WhereIF(dto.QueryType is 1, d => d.IsForwarded == false)
                 .WhereIF(dto.QueryType is 2, d => d.IsForwarded == true)
-                .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.SpecialType == ESpecialType.ReTransact).NotAny());
+                .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.SpecialType == ESpecialType.ReTransact)
+                    .NotAny());
         }
 
         var (total, items) = await query
@@ -4004,7 +4038,8 @@ public class OrderController : BaseController
                         d.Status != EOrderStatus.BackToUnAccept &&
                         d.Status != EOrderStatus.SpecialToUnAccept &&
                         d.Status != EOrderStatus.HandOverToUnAccept)
-            .WhereIF(dto.QueryType is 3, d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.SpecialType == ESpecialType.ReTransact).Any())
+            .WhereIF(dto.QueryType is 3,
+                d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.SpecialType == ESpecialType.ReTransact).Any())
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
@@ -4858,13 +4893,13 @@ public class OrderController : BaseController
             //	ETimeType.WorkDay,
             //	dto.TimeLimit.Value, order.AcceptTypeCode);
             await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-            {
-                ExpiredTime = expiredTime.ExpiredTime,
-                NearlyExpiredTime = expiredTime.NearlyExpiredTime,
-                NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne,
-                ProcessType = processType,
-                Status = EOrderStatus.Special
-            })
+                {
+                    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,
@@ -5020,11 +5055,11 @@ public class OrderController : BaseController
 
                 endTime = expiredTime.EndTime;
                 await _orderRepository.Updateable().SetColumns(o => new Orders.Order()
-                {
-                    ExpiredTime = expiredTime.EndTime,
-                    NearlyExpiredTime = expiredTime.NearlyExpiredTime,
-                    NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne
-                })
+                    {
+                        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,
@@ -5129,13 +5164,13 @@ public class OrderController : BaseController
                 ? 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
-            })
+                {
+                    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,
@@ -5252,13 +5287,13 @@ public class OrderController : BaseController
                     ? 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
-                })
+                    {
+                        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,
@@ -5293,10 +5328,12 @@ public class OrderController : BaseController
                         await _orderVisitRepository.UpdateAsync(visit, HttpContext.RequestAborted);
                     }
                 }
+
                 var setting = _systemSettingCacheManager.GetSetting(SettingConstants.CityBaseConfiguration)?.SettingValue[0];
                 CityBaseConfiguration 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.CityProvinceAssign.OrgId.Equals(special.OrgId) ||
+                                      cityBase.CityEnterprise.OrgId.Equals(special.OrgId) ||
                                       cityBase.PublicSecurity.OrgId.Equals(special.OrgId)))
                 {
                     await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFlowRecalled,
@@ -5411,7 +5448,7 @@ public class OrderController : BaseController
                 d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
             //.WhereIF(!string.IsNullOrEmpty(dto.Content), d => d.Content.Contains(dto.Content!))
             .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(!string.IsNullOrEmpty(dto.Hotspot), d => d.HotspotSpliceName != null && d.HotspotSpliceName.Contains(dto.Hotspot))
             .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!))
@@ -5505,7 +5542,8 @@ public class OrderController : BaseController
             SpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
             InstaShotSpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.InstaShotSpecialReason),
             Step = step,
-            IsTerminate = await _orderTerminateRepository.Queryable().Where(d => d.OrderId == order.Id && d.Status == ETerminateStatus.End).AnyAsync(),
+            IsTerminate =
+                await _orderTerminateRepository.Queryable().Where(d => d.OrderId == order.Id && d.Status == ETerminateStatus.End).AnyAsync(),
             BaseTypeId = baseTypeId
         };
         return rsp;
@@ -5534,7 +5572,8 @@ public class OrderController : BaseController
                 ? _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.InstaShotSpecialReason)
                 : _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
             ReTransactErrorType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.ReTransactErrorType),
-            IsTerminate = await _orderTerminateRepository.Queryable().Where(d => d.OrderId == order.Id && d.Status == ETerminateStatus.End).AnyAsync(),
+            IsTerminate =
+                await _orderTerminateRepository.Queryable().Where(d => d.OrderId == order.Id && d.Status == ETerminateStatus.End).AnyAsync(),
             Step = step,
             Orgs = orgs,
         };
@@ -7146,7 +7185,7 @@ public class OrderController : BaseController
         {
             await _orderRepository.Updateable()
                 .SetColumns(o => new Orders.Order()
-                { SignerId = dto.Handler.UserId, SignerName = dto.Handler.Username, Status = EOrderStatus.HandOverToUnAccept })
+                    { SignerId = dto.Handler.UserId, SignerName = dto.Handler.Username, Status = EOrderStatus.HandOverToUnAccept })
                 .Where(o => o.Id == dto.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
         }
         else

+ 1 - 1
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -514,7 +514,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
 
         if (workflow.Steps.All(d => d.StepType != EStepType.End))
         {
-            await _workflowDomainService.EndAsync(workflow, dto,
+            await _workflowDomainService.EndAsync(current, workflow, dto,
                 endStepDefine, currentStep, expiredTime, cancellationToken);
         }
     }

+ 49 - 21
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -19,17 +19,21 @@ namespace Hotline.Share.Dtos.Order
         /// 是否甄别
         /// </summary>
         public bool IsScreen { get; set; }
+
         public string No { get; set; }
 
         /// <summary>
         /// 当前节点名称
         /// </summary>
         public string CurrentStepName { get; set; }
+
         public DateTime CreationTime { get; set; }
+
         /// <summary>
         /// 工单状态
         /// </summary>
         public EOrderStatus Status { get; set; }
+
         public string StatusText => Status.GetDescription();
     }
 
@@ -41,6 +45,7 @@ namespace Hotline.Share.Dtos.Order
         /// 工单状态
         /// </summary>
         public EOrderStatus Status { get; set; }
+
         public string StatusText => Status.GetDescription();
 
         /// <summary>
@@ -74,9 +79,9 @@ namespace Hotline.Share.Dtos.Order
         public string No { get; set; }
 
         /// <summary>
-		/// 是否110来的工单
-		/// </summary>
-		public bool IsNo110 { get; set; }
+        /// 是否110来的工单
+        /// </summary>
+        public bool IsNo110 { get; set; }
 
         public string? TagNames { get; set; }
 
@@ -133,11 +138,11 @@ namespace Hotline.Share.Dtos.Order
 
         public string GetAllDurationHour()
         {
-
             if (Status >= EOrderStatus.Filed)
             {
                 return Math.Round(Math.Round((FiledTime - CreationTime).Value.TotalSeconds) / 60 / 60, 2).ToString() + "小时";
             }
+
             return "-";
         }
 
@@ -223,6 +228,7 @@ namespace Hotline.Share.Dtos.Order
         /// 办理时选择的办理对象,可能是部门也可能是用户
         /// </summary>
         public string? ActualHandlerValue { get; set; }
+
         public string? ActualHandlerKey { get; set; }
         public EHandlerType? ActualHandlerType { get; set; }
 
@@ -383,6 +389,7 @@ namespace Hotline.Share.Dtos.Order
         /// 会签类型
         /// </summary>
         public ECounterSignType? CounterSignType { get; set; }
+
         public string? CounterSignTypeText => CounterSignType?.GetDescription() ?? "未会签";
 
         #region 签收
@@ -401,7 +408,6 @@ namespace Hotline.Share.Dtos.Order
 
         #endregion
 
-
         #endregion
 
         public DateTime CreationTime { get; set; }
@@ -457,12 +463,13 @@ namespace Hotline.Share.Dtos.Order
         /// 是否可编辑
         /// </summary>
         public bool CanEdit => !string.IsNullOrEmpty(SignerId) &&
-                               (Status is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept or EOrderStatus.HandOverToUnAccept);
+                               (Status is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept
+                                   or EOrderStatus.HandOverToUnAccept);
 
         /// <summary>
         /// 是否可签收
         /// </summary>
-        public bool CanSign => string.IsNullOrEmpty(SignerId);
+        public bool CanSign { get; set; }
 
         /// <summary>
         /// 待结束会签编号
@@ -562,11 +569,13 @@ namespace Hotline.Share.Dtos.Order
                 var days = (FiledTime.Value - ExpiredTime.Value).TotalDays;
                 return $"超期{days:N1}天";
             }
+
             if (ExpiredTime.HasValue)
             {
                 var days = (dateTime.Value - ExpiredTime.Value).TotalDays;
                 return $"超期{days:N1}天";
             }
+
             return string.Empty;
         }
 
@@ -582,6 +591,7 @@ namespace Hotline.Share.Dtos.Order
             {
                 dateTime = FiledTime;
             }
+
             //ExpiredStatus
             if (ExpiredTime.HasValue)
             {
@@ -606,6 +616,7 @@ namespace Hotline.Share.Dtos.Order
                     return EExpiredStatus.Expired;
                 }
             }
+
             return null;
         }
 
@@ -633,6 +644,7 @@ namespace Hotline.Share.Dtos.Order
         /// 可直接访问的通话录音地址
         /// </summary>
         public string? RecordingBaseAddress { get; set; }
+
         public string? RecordingAbsolutePath { get; set; }
 
         public int ReTransactNum { get; set; }
@@ -650,6 +662,7 @@ namespace Hotline.Share.Dtos.Order
         /// 部门是否解决
         /// </summary>
         public bool IsResolved { get; set; }
+
         public string IsResolvedText => IsResolved ? "已解决" : "未解决";
 
         #region 副本工单
@@ -658,6 +671,7 @@ namespace Hotline.Share.Dtos.Order
         /// 修改人	
         /// </summary>
         public string AuditUserName { get; set; }
+
         public string AuditUserId { get; set; }
 
         /// <summary>
@@ -669,6 +683,7 @@ namespace Hotline.Share.Dtos.Order
         /// 副本工单id
         /// </summary>
         public string CopyId { get; set; }
+
         #endregion
 
         public string OverDays => GetOverDays();
@@ -688,6 +703,7 @@ namespace Hotline.Share.Dtos.Order
                     overDays = (DateTime.Now - ExpiredTime).Value.Days + "天";
                 }
             }
+
             return overDays;
         }
 
@@ -788,8 +804,8 @@ namespace Hotline.Share.Dtos.Order
             {
                 if (this.OrderVisits == null) return null;
                 var visitEntity = this.OrderVisits
-                            .OrderByDescending(m => m.CreationTime)
-                            .FirstOrDefault();
+                    .OrderByDescending(m => m.CreationTime)
+                    .FirstOrDefault();
                 if (visitEntity == null) return null;
                 return visitEntity.NowEvaluate;
             }
@@ -805,8 +821,8 @@ namespace Hotline.Share.Dtos.Order
             {
                 if (this.OrderVisits == null) return null;
                 var visitEntity = this.OrderVisits
-                           .OrderByDescending(m => m.CreationTime)
-                           .FirstOrDefault();
+                    .OrderByDescending(m => m.CreationTime)
+                    .FirstOrDefault();
                 if (visitEntity == null) return null;
                 var now = visitEntity.NowEvaluate;
                 if (now == null) return null;
@@ -823,8 +839,8 @@ namespace Hotline.Share.Dtos.Order
             {
                 if (this.OrderVisits == null) return null;
                 var visitEntity = this.OrderVisits
-                          .OrderByDescending(m => m.CreationTime)
-                          .FirstOrDefault();
+                    .OrderByDescending(m => m.CreationTime)
+                    .FirstOrDefault();
                 if (visitEntity == null) return null;
                 return visitEntity.OrderVisitDetails.Where(m => m.VisitTarget == EVisitTarget.Seat)
                     .FirstOrDefault()?.SeatEvaluate;
@@ -832,8 +848,9 @@ namespace Hotline.Share.Dtos.Order
         }
 
         public string? SeatEvaluateTxt => SeatEvaluate?.GetDescription();
+
         #endregion
-        
+
         /// <summary>
         /// 工单补充
         /// </summary>
@@ -848,6 +865,7 @@ namespace Hotline.Share.Dtos.Order
         /// 中心意见
         /// </summary>
         public string CenterOpinion { get; set; }
+
         /// <summary>
         /// 归档意见
         /// </summary>
@@ -857,7 +875,6 @@ namespace Hotline.Share.Dtos.Order
         /// 能否编辑,true:任何节点可以编辑;false:未发起流程可以编辑
         /// </summary>
         public bool IsEdit { get; set; }
-
     }
 
     public class AddOrderDto : Position
@@ -868,6 +885,7 @@ namespace Hotline.Share.Dtos.Order
         /// 来源渠道
         /// </summary>
         public string? SourceChannel { get; set; }
+
         public string? SourceChannelCode { get; set; }
 
         /// <summary>
@@ -957,6 +975,7 @@ namespace Hotline.Share.Dtos.Order
         /// 受理类型
         /// </summary>
         public string? AcceptType { get; set; }
+
         public string? AcceptTypeCode { get; set; }
 
         public string Title { get; set; }
@@ -965,6 +984,7 @@ namespace Hotline.Share.Dtos.Order
         /// 工单标签(自贡)
         /// </summary>
         public string? OrderTag { get; set; }
+
         public string? OrderTagCode { get; set; }
 
         #region 热点
@@ -973,6 +993,7 @@ namespace Hotline.Share.Dtos.Order
         /// 热点
         /// </summary>
         public string? HotspotId { get; set; }
+
         //public string? HotspotCode { get; set; }
         public string? HotspotName { get; set; }
         public string? HotspotSpliceName { get; set; }
@@ -1056,6 +1077,7 @@ namespace Hotline.Share.Dtos.Order
         /// 企业Code
         /// </summary>
         public string? EnterpriseCode { get; set; }
+
         /// <summary>
         /// 专班名称
         /// </summary>
@@ -1066,8 +1088,10 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string? ZhuanBanCode { get; set; }
 
-        #region  重复性事件
+        #region 重复性事件
+
         public List<RepeatableEventDetailOpDto> RepeatableEventDetails { get; set; } = new();
+
         #endregion
 
         /// <summary>
@@ -1124,6 +1148,7 @@ namespace Hotline.Share.Dtos.Order
         #endregion
 
         #region 市州工单互转
+
         /// <summary>
         /// 是否转发
         /// </summary>
@@ -1143,6 +1168,7 @@ namespace Hotline.Share.Dtos.Order
         /// 转发市州Value
         /// </summary>
         public string? TranspondCityValue { get; set; }
+
         #endregion
 
         /// <summary>
@@ -1208,7 +1234,6 @@ namespace Hotline.Share.Dtos.Order
 
     public record CanLinkCallRecordOrderDto : PagedKeywordRequest
     {
-
     }
 
     /// <summary>
@@ -1234,7 +1259,6 @@ namespace Hotline.Share.Dtos.Order
 
     public class UnsignedOrderDto
     {
-
         public OrderDto Order { get; set; }
 
         public WorkflowStepDto WorkflowStep { get; set; }
@@ -1258,7 +1282,6 @@ namespace Hotline.Share.Dtos.Order
         /// 备注时间
         /// </summary>
         public DateTime RemarkTime { get; set; }
-
     }
 
     public class PublishNearlyExpiredTimeSmsDto
@@ -1274,6 +1297,7 @@ namespace Hotline.Share.Dtos.Order
 
         public int ExpiredTimeOrderCount { get; set; }
     }
+
     public class PublishAutomaticDelayDto
     {
         public string OrderId { get; set; }
@@ -1327,6 +1351,7 @@ namespace Hotline.Share.Dtos.Order
             {
                 dateTime = FiledTime;
             }
+
             //ExpiredStatus
             if (ExpiredTime.HasValue)
             {
@@ -1351,6 +1376,7 @@ namespace Hotline.Share.Dtos.Order
                     return EExpiredStatus.Expired;
                 }
             }
+
             return null;
         }
 
@@ -1482,6 +1508,7 @@ namespace Hotline.Share.Dtos.Order
         /// 受理类型
         /// </summary>
         public string AcceptType { get; set; }
+
         public string AcceptTypeCode { get; set; }
 
         /// <summary>
@@ -1515,6 +1542,7 @@ namespace Hotline.Share.Dtos.Order
         /// 是否可编辑
         /// </summary>
         public bool CanEdit => !string.IsNullOrEmpty(SignerId) &&
-                               (Status is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept or EOrderStatus.HandOverToUnAccept);
+                               (Status is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept
+                                   or EOrderStatus.HandOverToUnAccept);
     }
-}
+}

+ 2 - 8
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -2,7 +2,6 @@
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Settings;
 using Hotline.Share.Dtos;
-using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Settings;
@@ -54,7 +53,7 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 受理,接办
         /// </summary>
-        Task AcceptAsync(Workflow workflow, string userId, string? userName, string orgId, string? orgName,
+        Task<DateTime?> AcceptAsync(Workflow workflow, string userId, string? userName, string orgId, string? orgName,
             string? orgAreaCode, string? orgAreaName, CancellationToken cancellationToken);
 
         /// <summary>
@@ -131,7 +130,7 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 结束流程(流程直接流转至结束节点)
         /// </summary>
-        Task<WorkflowTrace> EndAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine endStepDefine,
+        Task<WorkflowTrace> EndAsync(ISessionContext current, Workflow workflow, BasicWorkflowDto dto, StepDefine endStepDefine,
             WorkflowStep currentStep, DateTime? expiredTime, CancellationToken cancellationToken);
 
         StepDefine GetStepDefine(WorkflowDefinition workflowDefinition, string stepCode);
@@ -297,10 +296,5 @@ namespace Hotline.FlowEngine.Workflows
         /// 根据汇总对象id找到被汇总节点,生成指派到用户的办理对象
         /// </summary>
         FlowStepHandler GetSummaryTargetFlowStepHandler(Workflow workflow, string summaryTargetStepCode);
-
-        /// <summary>
-        /// 追加归档信息(接收ds推送12315归档信息)
-        /// </summary>
-        Task AppendFileOpinionAsync(string workflowId, string opinion, List<FileDto> files, CancellationToken cancellationToken);
     }
 }

+ 0 - 2
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -558,8 +558,6 @@ public partial class Workflow
         //     UpdateLevelOneOrg(CurrentHandleOrgId, CurrentHandleOrgName);
     }
 
-    public void UpdateCurrentStepAcceptTime(DateTime acceptTime) => CurrentStepAcceptTime = acceptTime;
-
     /// <summary>
     /// 办理时调用
     /// </summary>

+ 37 - 30
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -113,7 +113,8 @@ namespace Hotline.FlowEngine.Workflows
                 workflow.UpdateCurrentStepWhenHandle(startStep, _sessionContextProvider.SessionContext.OrgAreaCode,
                     _sessionContextProvider.SessionContext.OrgAreaName, _sessionContextProvider.SessionContext.OrgLevel);
 
-                var endTrace = await EndAsync(workflow, dto, firstStepDefine, startStep, expiredTime, cancellationToken);
+                var endTrace = await EndAsync(_sessionContextProvider.SessionContext, workflow, dto, firstStepDefine, startStep, expiredTime,
+                    cancellationToken);
                 return;
             }
 
@@ -295,9 +296,18 @@ namespace Hotline.FlowEngine.Workflows
             //需求:按角色选择办理人可以不选,表示该角色下所有人都可以办理,同时依据配置:是否本部门人办理显示待选办理人。角色下只要一人办理即可(即:角色下不发起会签)
             if (nextStepDefine.HandlerType != EHandlerType.Role && !dto.NextHandlers.Any())
                 throw new UserFriendlyException("未指定节点处理者");
+            //todo 加入到重构获取办理对象方法中
             if (nextStepDefine.HandlerType == EHandlerType.Role && !dto.NextHandlers.Any())
             {
                 //todo 指派给配置的角色
+                var handler = nextStepDefine.HandlerTypeItems.First();
+                dto.NextHandlers.Add(new FlowStepHandler
+                {
+                    Key = handler.Key,
+                    Value = handler.Value,
+                    RoleId = handler.Key,
+                    RoleName = handler.Value
+                });
             }
 
             if (dto.IsStartCountersign)
@@ -436,22 +446,21 @@ namespace Hotline.FlowEngine.Workflows
                     workflow.EndCountersign();
             }
 
-            if (workflow.ActualHandleStepId == currentStep.Id)
-            {
-                //更新实际办理节点信息
-                //workflow.UpdateActualStepWhenHandle(currentStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
-                UpdateActualStep(workflow, dto, nextStepDefine, nextst);
-            }
-
-            if (workflow.CurrentStepId == currentStep.Id)
-            {
-                workflow.UpdateCurrentStepWhenHandle(currentStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
-            }
+            // if (workflow.ActualHandleStepId == currentStep.Id)
+            // {
+            //     //更新实际办理节点信息
+            //     //workflow.UpdateActualStepWhenHandle(currentStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
+            // }
+            //
+            // if (workflow.CurrentStepId == currentStep.Id)
+            // {
+            //     workflow.UpdateCurrentStepWhenHandle(currentStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
+            // }
 
             //检查是否流转到流程终点
             if (nextStepDefine.StepType is EStepType.End)
             {
-                var endTrace = await EndAsync(workflow, dto, nextStepDefine, currentStep, expiredTime, cancellationToken);
+                var endTrace = await EndAsync(current, workflow, dto, nextStepDefine, currentStep, expiredTime, cancellationToken);
                 return new List<WorkflowStep>();
             }
 
@@ -557,7 +566,7 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         /// <summary>
-        /// 查询工作流包含当前用户结束会签权限(是否可结束)
+        /// 查询用户对于当前流程权限
         /// </summary>
         public async Task<(Workflow Workflow, string? CountersignId, bool CanHandle, bool CanPrevious, WorkflowTrace? Trace)>
             GetWorkflowHandlePermissionAsync(
@@ -599,22 +608,22 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 受理(接办)
         /// </summary>
-        public async Task AcceptAsync(Workflow workflow,
+        public async Task<DateTime?> AcceptAsync(Workflow workflow,
             string userId, string? userName,
             string orgId, string? orgName,
             string? orgAreaCode, string? orgAreaName,
             CancellationToken cancellationToken)
         {
             if (!workflow.IsCanHandle(_sessionContextProvider.SessionContext.RequiredUserId, _sessionContextProvider.SessionContext.RequiredOrgId,
-                    _sessionContextProvider.SessionContext.Roles)) return;
+                    _sessionContextProvider.SessionContext.Roles)) return null;
             //工单完成以后查看的场景
-            if (workflow.Status != EWorkflowStatus.Runnable) return;
+            if (workflow.Status != EWorkflowStatus.Runnable) return null;
 
             var currentStep = GetUnHandleStep(workflow.Steps, _sessionContextProvider.SessionContext.RequiredOrgId,
                 _sessionContextProvider.SessionContext.RequiredUserId, _sessionContextProvider.SessionContext.Roles);
-            if (currentStep.Status is not EWorkflowStepStatus.WaitForAccept) return;
+            if (currentStep.Status is not EWorkflowStepStatus.WaitForAccept) return null;
 
-            if (currentStep.Handlers.All(d => d.Key != orgId && d.Key != userId)) return;
+            if (currentStep.Handlers.All(d => d.Key != orgId && d.Key != userId)) return null;
 
             if (currentStep.StepType is EStepType.End)
                 throw new UserFriendlyException("当前流程已流转到最终步骤");
@@ -627,15 +636,13 @@ namespace Hotline.FlowEngine.Workflows
             _mapper.Map(currentStep, trace);
             currentStep.WorkflowTrace = trace;
 
-            //await _workflowStepRepository.UpdateAsync(currentStep, cancellationToken);
+            workflow.ActualHandleStepAcceptTime = currentStep.AcceptTime;
             await _workflowStepRepository.UpdateNav(currentStep)
                 .Include(d => d.Workflow)
                 .Include(d => d.WorkflowTrace)
                 .ExecuteCommandAsync();
 
-            //await AcceptTraceAsync(workflow, currentStep, cancellationToken);
-
-            //await _mediator.Publish(new AcceptWorkflowNotify(workflow), cancellationToken);
+            return workflow.ActualHandleStepAcceptTime;
         }
 
         /// <summary>
@@ -809,7 +816,8 @@ namespace Hotline.FlowEngine.Workflows
             //检查是否流转到流程终点
             if (nextStepDefine.StepType is EStepType.End)
             {
-                var endTrace = await EndAsync(workflow, dto, nextStepDefine, currentStep, expiredTime, cancellationToken);
+                var endTrace = await EndAsync(_sessionContextProvider.SessionContext,
+                    workflow, dto, nextStepDefine, currentStep, expiredTime, cancellationToken);
                 return;
             }
 
@@ -1853,7 +1861,7 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 流程结束
         /// </summary>
-        public async Task<WorkflowTrace> EndAsync(Workflow workflow, BasicWorkflowDto dto,
+        public async Task<WorkflowTrace> EndAsync(ISessionContext current, Workflow workflow, BasicWorkflowDto dto,
             StepDefine endStepDefine, WorkflowStep currentStep,
             DateTime? expiredTime, CancellationToken cancellationToken)
         {
@@ -1874,12 +1882,11 @@ namespace Hotline.FlowEngine.Workflows
             workflow.Complete(endStep, dto.ReviewResult);
 
             //需求调整:归档时当前节点显示为归档节点
-            workflow.UpdateCurrentStepWhenHandle(endStep, _sessionContextProvider.SessionContext.OrgAreaCode,
-                _sessionContextProvider.SessionContext.OrgAreaName, _sessionContextProvider.SessionContext.OrgLevel);
-            workflow.UpdateCurrentStepAcceptTime(endStep.AcceptTime.Value);
+            workflow.UpdateCurrentStepWhenHandle(endStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
+            workflow.CurrentStepAcceptTime = endStep.AcceptTime.Value;
 
-            //workflow.UpdateActualStepWhenHandle(endStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
-            //workflow.UpdateActualStepAcceptTime(endStep.AcceptTime.Value);
+            workflow.UpdateActualStepWhenHandle(endStep, current.OrgAreaCode, current.OrgAreaName, current.OrgLevel);
+            workflow.ActualHandleStepAcceptTime = endStep.AcceptTime.Value;
 
             if (string.IsNullOrEmpty(workflow.OrgLevelOneCode))
                 workflow.UpdateLevelOneOrg(workflow.ActualHandleOrgCode, workflow.ActualHandleOrgName);