田爽 10 сар өмнө
parent
commit
8d94e6395b

+ 159 - 153
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -40,7 +40,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IRepository<OrderDelay> _orderDelayRepository;
         private readonly IRepository<OrderDelay> _orderDelayRepository;
         private readonly IMapper _mapper;
         private readonly IMapper _mapper;
         private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
         private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
-        private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
+        //private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
         private readonly IRepository<OrderSpecial> _orderSpecialRepository;
         private readonly IRepository<OrderSpecial> _orderSpecialRepository;
         private readonly IRepository<OrderVisit> _orderVisitRepository;
         private readonly IRepository<OrderVisit> _orderVisitRepository;
         private readonly IRepository<TrCallRecord> _trCallRecordRepository;
         private readonly IRepository<TrCallRecord> _trCallRecordRepository;
@@ -56,7 +56,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IOrderApplication _orderApplication;
         private readonly IOrderApplication _orderApplication;
         private readonly ITimeLimitDomainService _timeLimitDomainService;
         private readonly ITimeLimitDomainService _timeLimitDomainService;
 
 
-		public BiOrderController(
+        public BiOrderController(
             IOrderRepository orderRepository,
             IOrderRepository orderRepository,
             IRepository<Hotspot> hotspotTypeRepository,
             IRepository<Hotspot> hotspotTypeRepository,
             ISystemDicDataCacheManager sysDicDataCacheManager,
             ISystemDicDataCacheManager sysDicDataCacheManager,
@@ -75,11 +75,11 @@ namespace Hotline.Api.Controllers.Bi
             IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
             IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<OrderScreen> orderScreenRepository,
             IRepository<OrderScreen> orderScreenRepository,
-            IRepository<WorkflowStepHandler> workflowStepHandleRepository,
+            //IRepository<WorkflowStepHandler> workflowStepHandleRepository,
             IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
             IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
             IOrderApplication orderApplication,
             IOrderApplication orderApplication,
             ITimeLimitDomainService timeLimitDomainService
             ITimeLimitDomainService timeLimitDomainService
-			)
+            )
         {
         {
             _orderRepository = orderRepository;
             _orderRepository = orderRepository;
             _hotspotTypeRepository = hotspotTypeRepository;
             _hotspotTypeRepository = hotspotTypeRepository;
@@ -99,11 +99,11 @@ namespace Hotline.Api.Controllers.Bi
             _orderSpecialDetailRepository = orderSpecialDetailRepository;
             _orderSpecialDetailRepository = orderSpecialDetailRepository;
             _workflowTraceRepository = workflowTraceRepository;
             _workflowTraceRepository = workflowTraceRepository;
             _orderScreenRepository = orderScreenRepository;
             _orderScreenRepository = orderScreenRepository;
-            _workflowStepHandleRepository = workflowStepHandleRepository;
+            //_workflowStepHandleRepository = workflowStepHandleRepository;
             _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
             _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
             _orderApplication = orderApplication;
             _orderApplication = orderApplication;
             _timeLimitDomainService = timeLimitDomainService;
             _timeLimitDomainService = timeLimitDomainService;
-		}
+        }
 
 
         /// <summary>
         /// <summary>
         /// 部门超期统计明细
         /// 部门超期统计明细
@@ -124,7 +124,7 @@ namespace Hotline.Api.Controllers.Bi
                         (x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) || (x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()))
                         (x.Status >= EOrderStatus.Filed && x.ExpiredTime < x.FiledTime) || (x.Status < EOrderStatus.Filed && x.ExpiredTime < SqlFunc.GetDate()))
                     .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3 && dto.OrgCode == "001", x => x.ActualHandleOrgCode == dto.OrgCode)
                     .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3 && dto.OrgCode == "001", x => x.ActualHandleOrgCode == dto.OrgCode)
                     .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3 && dto.OrgCode != "001", x => x.ActualHandleOrgCode.StartsWith(dto.OrgCode))
                     .WhereIF(!string.IsNullOrEmpty(dto.OrgCode) && dto.QueryType is 1 or 3 && dto.OrgCode != "001", x => x.ActualHandleOrgCode.StartsWith(dto.OrgCode))
-					.MergeTable();
+                    .MergeTable();
 
 
             if (dto.QueryType is 2 or 4 or 5)
             if (dto.QueryType is 2 or 4 or 5)
             {
             {
@@ -184,13 +184,13 @@ namespace Hotline.Api.Controllers.Bi
                 .Select((x, o) => new OrderBiOrgDataListVo
                 .Select((x, o) => new OrderBiOrgDataListVo
                 {
                 {
                     OrgId = o.Key,
                     OrgId = o.Key,
-					CounterHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsHandled, 1, 0)),
+                    CounterHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsHandled, 1, 0)),
                     CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsHandled == false, 1, 0)),
                     CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(SqlFunc.IIF(o.IsHandled == false, 1, 0)),
                 }).MergeTable();
                 }).MergeTable();
 
 
             var query = queryOrder.LeftJoin(queryCountersign, (or, co) => or.OrgId == co.OrgId)
             var query = queryOrder.LeftJoin(queryCountersign, (or, co) => or.OrgId == co.OrgId)
-                .LeftJoin<SystemOrganize>((or,co,so)=> or.OrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == so.Id )
-                .GroupBy((or, co, so) => new { so.Id,so.Name})
+                .LeftJoin<SystemOrganize>((or, co, so) => or.OrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) == so.Id)
+                .GroupBy((or, co, so) => new { so.Id, so.Name })
                 .Select((or, co, so) => new OrderBiOrgDataListVo
                 .Select((or, co, so) => new OrderBiOrgDataListVo
                 {
                 {
                     OrgName = so.Name,
                     OrgName = so.Name,
@@ -201,7 +201,7 @@ namespace Hotline.Api.Controllers.Bi
                     CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterNoHandlerExtendedNum)
                     CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterNoHandlerExtendedNum)
                 }).MergeTable();
                 }).MergeTable();
 
 
-            query = query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrgName.Contains(dto.Keyword!)).Where(x=>x.HandlerExtendedNum > 0 || x.NoHandlerExtendedNum > 0 || x.CounterHandlerExtendedNum >0 || x.CounterNoHandlerExtendedNum > 0);
+            query = query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrgName.Contains(dto.Keyword!)).Where(x => x.HandlerExtendedNum > 0 || x.NoHandlerExtendedNum > 0 || x.CounterHandlerExtendedNum > 0 || x.CounterNoHandlerExtendedNum > 0);
             switch (dto.SortField)
             switch (dto.SortField)
             {
             {
                 case "handlerExtendedNum":
                 case "handlerExtendedNum":
@@ -1094,10 +1094,10 @@ namespace Hotline.Api.Controllers.Bi
                 .Where(x => x.OrderVisit.VisitTime >= dto.StartDate && x.OrderVisit.VisitTime <= dto.EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
                 .Where(x => x.OrderVisit.VisitTime >= dto.StartDate && x.OrderVisit.VisitTime <= dto.EndDate && x.VisitTarget == EVisitTarget.Org && x.OrderVisit.VisitState == EVisitState.Visited)
                 .WhereIF(dto.OrgCode == "001", x => x.VisitOrgCode == dto.OrgCode)
                 .WhereIF(dto.OrgCode == "001", x => x.VisitOrgCode == dto.OrgCode)
                 //.WhereIF(dto.OrgCode != "001", x => x.VisitOrgCode == dto.OrgCode).
                 //.WhereIF(dto.OrgCode != "001", x => x.VisitOrgCode == dto.OrgCode).
-                .WhereIF(dto.IsOnlyMy==true,x=>x.VisitOrgCode == dto.OrgCode)
-                .WhereIF(IsCenter==true && dto.IsOnlyMy==true,x=>x.VisitOrgCode == dto.OrgCode)
-                .WhereIF(IsCenter==true && dto.IsOnlyMy==null,x=>x.VisitOrgCode.StartsWith(dto.OrgCode))
-                .WhereIF(IsCenter==false,x=>x.VisitOrgCode == dto.OrgCode)
+                .WhereIF(dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
+                .WhereIF(IsCenter == true && dto.IsOnlyMy == true, x => x.VisitOrgCode == dto.OrgCode)
+                .WhereIF(IsCenter == true && dto.IsOnlyMy == null, x => x.VisitOrgCode.StartsWith(dto.OrgCode))
+                .WhereIF(IsCenter == false, x => x.VisitOrgCode == dto.OrgCode)
                 .WhereIF(dto.TypeId == 1, x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.DateValue)
                 .WhereIF(dto.TypeId == 1, x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.DateValue)
                 .WhereIF(dto.TypeId == 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == dto.DateValue)
                 .WhereIF(dto.TypeId == 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == dto.DateValue)
                 .WhereIF(!string.IsNullOrEmpty(dto.LineNum), x => x.OrderVisit.Order.CallRecord.Gateway == dto.LineNum)
                 .WhereIF(!string.IsNullOrEmpty(dto.LineNum), x => x.OrderVisit.Order.CallRecord.Gateway == dto.LineNum)
@@ -1649,18 +1649,19 @@ namespace Hotline.Api.Controllers.Bi
 
 
             #region 会签(已办超期、待办超期)
             #region 会签(已办超期、待办超期)
             //会签(已办超期、待办超期)
             //会签(已办超期、待办超期)
-            var queryCountersign = _workflowStepHandleRepository.Queryable()
-             .LeftJoin<WorkflowTrace>((x, o) => x.WorkflowStepId == o.StepId)
-             .LeftJoin<Order>((x, o, p) => p.WorkflowId == o.WorkflowId)
-             .Where((x, o, p) => o.ModuleCode == WorkflowModuleConsts.OrderHandle && o.CreationTime >= StartDate && o.CreationTime <= EndDate)
-             .WhereIF(IsProvince.HasValue && IsProvince == true, (x, o, p) => p.Source == ESource.ProvinceStraight)
-             .Select((x, o, p) => new
+            //var queryCountersign = _workflowStepHandleRepository.Queryable()
+            // .LeftJoin<WorkflowTrace>((x, o) => x.WorkflowStepId == o.StepId)
+            var queryCountersign = _workflowTraceRepository.Queryable()
+             .LeftJoin<Order>((t, o) => t.ExternalId == o.Id)
+             .Where((t, o) => t.ModuleCode == WorkflowModuleConsts.OrderHandle && t.CreationTime >= StartDate && t.CreationTime <= EndDate)
+             .WhereIF(IsProvince.HasValue && IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
+             .Select((t, o) => new
              {
              {
-                 OrgCode = IsCenter == true ? x.OrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) : x.OrgId.Substring(0, _sessionContext.RequiredOrgId.Length + 3),// d.OrgId,
-                 o.HandleTime,
-                 o.StepExpiredTime,
-                 o.Status,
-                 o.CountersignPosition
+                 OrgCode = IsCenter == true ? t.HandlerOrgId.Substring(SqlFunc.MappingColumn<int>("0"), SqlFunc.MappingColumn<int>("6")) : t.HandlerOrgId.Substring(0, _sessionContext.RequiredOrgId.Length + 3),// d.OrgId,
+                 t.HandleTime,
+                 t.StepExpiredTime,
+                 t.Status,
+                 t.CountersignPosition
              })
              })
               .MergeTable()
               .MergeTable()
               .WhereIF(IsCenter == false, it => it.OrgCode.StartsWith(_sessionContext.RequiredOrgId))
               .WhereIF(IsCenter == false, it => it.OrgCode.StartsWith(_sessionContext.RequiredOrgId))
@@ -2005,20 +2006,21 @@ namespace Hotline.Api.Controllers.Bi
 
 
             #region 会签(已办超期、待办超期)
             #region 会签(已办超期、待办超期)
             //会签(已办超期、待办超期)
             //会签(已办超期、待办超期)
-            var queryCountersign = _workflowStepHandleRepository.Queryable()
-             .LeftJoin<WorkflowTrace>((x, o) => x.WorkflowStepId == o.StepId)
-             .LeftJoin<Order>((x, o, p) => p.WorkflowId == o.WorkflowId)
-             .Where((x, o, p) => o.ModuleCode == WorkflowModuleConsts.OrderHandle && o.CreationTime >= StartDate && o.CreationTime <= EndDate)
-             .WhereIF(OrgCode == "001", (x, o, p) => x.OrgId == OrgCode)
-             .WhereIF(OrgCode != "001", (x, o, p) => x.OrgId.StartsWith(OrgCode))
-              .WhereIF(IsProvince.HasValue && IsProvince == true, (x, o, p) => p.Source == ESource.ProvinceStraight)
-             .Select((x, o, p) => new
+            //var queryCountersign = _workflowStepHandleRepository.Queryable()
+            // .LeftJoin<WorkflowTrace>((x, o) => x.WorkflowStepId == o.StepId)
+            var queryCountersign = _workflowTraceRepository.Queryable()
+             .LeftJoin<Order>((t, o) => t.ExternalId == o.Id)
+             .Where((t, o) => t.ModuleCode == WorkflowModuleConsts.OrderHandle && t.CreationTime >= StartDate && t.CreationTime <= EndDate)
+             .WhereIF(OrgCode == "001", (t, o) => t.HandlerOrgId == OrgCode)
+             .WhereIF(OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(OrgCode))
+              .WhereIF(IsProvince.HasValue && IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
+             .Select((t, o) => new
              {
              {
-                 OrgCode = x.OrgId.Substring(0, OrgCode.Length + 3),
-                 o.HandleTime,
-                 o.StepExpiredTime,
-                 o.Status,
-                 o.CountersignPosition,
+                 OrgCode = t.HandlerOrgId.Substring(0, OrgCode.Length + 3),
+                 t.HandleTime,
+                 t.StepExpiredTime,
+                 t.Status,
+                 t.CountersignPosition,
              })
              })
               .MergeTable()
               .MergeTable()
              .GroupBy(d => new { d.OrgCode })
              .GroupBy(d => new { d.OrgCode })
@@ -2329,15 +2331,16 @@ namespace Hotline.Api.Controllers.Bi
                                  .Select(it => new SelectOrderId { Id = it.Id })
                                  .Select(it => new SelectOrderId { Id = it.Id })
                                  .MergeTable();
                                  .MergeTable();
 
 
-                var hqybquery = _workflowStepHandleRepository.Queryable()
-                  .LeftJoin<WorkflowTrace>((x, o) => x.WorkflowStepId == o.StepId)
-                  .LeftJoin<Order>((x, o, p) => o.WorkflowId == p.WorkflowId)
-                  .Where((x, o, p) => o.ModuleCode == WorkflowModuleConsts.OrderHandle && o.CreationTime >= dto.StartDate && o.CreationTime <= dto.EndDate)
-                  .WhereIF(dto.OrgCode == "001", (x, o, p) => x.OrgId == dto.OrgCode)
-                  .WhereIF(dto.OrgCode != "001", (x, o, p) => x.OrgId.StartsWith(dto.OrgCode))
-                  .WhereIF(dto.StatisticsType == EStatisticsType.YBOrderCountNum, (x, o, p) => o.Status >= EWorkflowStepStatus.Handled && o.CountersignPosition > ECountersignPosition.None)//会签已办
-                  .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (x, o, p) => p.Source == ESource.ProvinceStraight)
-                  .Select((x, o, p) => new SelectOrderId { Id = p.Id })
+                //var hqybquery = _workflowStepHandleRepository.Queryable()
+                //  .LeftJoin<WorkflowTrace>((x, o) => x.WorkflowStepId == o.StepId)
+                var hqybquery = _workflowTraceRepository.Queryable()
+                    .LeftJoin<Order>((t, o) => t.ExternalId == o.Id)
+                  .Where((t, o) => t.ModuleCode == WorkflowModuleConsts.OrderHandle && t.CreationTime >= dto.StartDate && t.CreationTime <= dto.EndDate)
+                  .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
+                  .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+                  .WhereIF(dto.StatisticsType == EStatisticsType.YBOrderCountNum, (t, o) => t.Status >= EWorkflowStepStatus.Handled && t.CountersignPosition > ECountersignPosition.None)//会签已办
+                  .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
+                  .Select((t, o) => new SelectOrderId { Id = o.Id })
                   .MergeTable();
                   .MergeTable();
 
 
                 var queryData = await _orderRepository.OrderListUnionAll(ybQuery, hqybquery)
                 var queryData = await _orderRepository.OrderListUnionAll(ybQuery, hqybquery)
@@ -2455,26 +2458,27 @@ namespace Hotline.Api.Controllers.Bi
             if (stye == "5")
             if (stye == "5")
             {
             {
                 //会签(已办超期、待办超期)
                 //会签(已办超期、待办超期)
-                var queryCountersign = await _workflowStepHandleRepository.Queryable()
-               .LeftJoin<WorkflowTrace>((x, o) => x.WorkflowStepId == o.StepId)
-               .LeftJoin<Order>((x, o, p) => o.WorkflowId == p.WorkflowId)
-               .Where((x, o, p) => o.ModuleCode == WorkflowModuleConsts.OrderHandle && o.CreationTime >= dto.StartDate && o.CreationTime <= dto.EndDate)
-               .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (x, o, p) => p.Source == ESource.ProvinceStraight)
-               .WhereIF(dto.OrgCode == "001", (x, o, p) => x.OrgId == dto.OrgCode)
-               .WhereIF(dto.OrgCode != "001", (x, o, p) => x.OrgId.StartsWith(dto.OrgCode))
-               .WhereIF(dto.StatisticsType == EStatisticsType.HQYBOverdue, (x, o, p) => o.Status >= EWorkflowStepStatus.Handled && o.HandleTime > o.StepExpiredTime && o.CountersignPosition > ECountersignPosition.None)//会签已办超期
-               .WhereIF(dto.StatisticsType == EStatisticsType.HQZBOverdue, (x, o, p) => o.Status < EWorkflowStepStatus.Handled && DateTime.Now >= o.StepExpiredTime && o.CountersignPosition > ECountersignPosition.None)//会签待办超期
-               .WhereIF(dto.StatisticsType == EStatisticsType.DelayEnd, (x, o, p) => o.Status >= EWorkflowStepStatus.Handled && o.CountersignPosition > ECountersignPosition.None)//会签已办
-               .WhereIF(dto.StatisticsType == EStatisticsType.DelayWait, (x, o, p) => o.Status < EWorkflowStepStatus.Handled && o.CountersignPosition > ECountersignPosition.None)//会签待办
-               .WhereIF(dto.StatisticsType == EStatisticsType.ZBOrderCountNum, (x, o, p) => o.Status < EWorkflowStepStatus.Handled)//在办总量
-                .WhereIF(dto.StatisticsType == EStatisticsType.ZBOverdue, (x, o, p) => o.Status < EWorkflowStepStatus.Handled && DateTime.Now >= o.StepExpiredTime)//在办超期
-
-               .OrderByDescending((x, o, p) => p.CreationTime)
-                .Select((x, o, p) => new { p })
+                // var queryCountersign = await _workflowStepHandleRepository.Queryable()
+                //.LeftJoin<WorkflowTrace>((x, o) => x.WorkflowStepId == o.StepId)
+                var queryCountersign = await _workflowTraceRepository.Queryable()
+               .LeftJoin<Order>((t, o) => t.ExternalId == o.Id)
+               .Where((t, o) => t.ModuleCode == WorkflowModuleConsts.OrderHandle && t.CreationTime >= dto.StartDate && t.CreationTime <= dto.EndDate)
+               .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
+               .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
+               .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+               .WhereIF(dto.StatisticsType == EStatisticsType.HQYBOverdue, (t, o) => t.Status >= EWorkflowStepStatus.Handled && t.HandleTime > t.StepExpiredTime && t.CountersignPosition > ECountersignPosition.None)//会签已办超期
+               .WhereIF(dto.StatisticsType == EStatisticsType.HQZBOverdue, (t, o) => t.Status < EWorkflowStepStatus.Handled && DateTime.Now >= t.StepExpiredTime && t.CountersignPosition > ECountersignPosition.None)//会签待办超期
+               .WhereIF(dto.StatisticsType == EStatisticsType.DelayEnd, (t, o) => t.Status >= EWorkflowStepStatus.Handled && t.CountersignPosition > ECountersignPosition.None)//会签已办
+               .WhereIF(dto.StatisticsType == EStatisticsType.DelayWait, (t, o) => t.Status < EWorkflowStepStatus.Handled && t.CountersignPosition > ECountersignPosition.None)//会签待办
+               .WhereIF(dto.StatisticsType == EStatisticsType.ZBOrderCountNum, (t, o) => t.Status < EWorkflowStepStatus.Handled)//在办总量
+                .WhereIF(dto.StatisticsType == EStatisticsType.ZBOverdue, (t, o) => t.Status < EWorkflowStepStatus.Handled && DateTime.Now >= t.StepExpiredTime)//在办超期
+
+               .OrderByDescending((t, o) => o.CreationTime)
+                .Select((t, o) => new { o })
                 .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
                 .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
                 var dtos = queryCountersign.Select(d =>
                 var dtos = queryCountersign.Select(d =>
                 {
                 {
-                    var dto = _mapper.Map<OrderDto>(d.p);
+                    var dto = _mapper.Map<OrderDto>(d.o);
                     return dto;
                     return dto;
                 }).ToList();
                 }).ToList();
 
 
@@ -2497,19 +2501,20 @@ namespace Hotline.Api.Controllers.Bi
                          .MergeTable();
                          .MergeTable();
 
 
                 //会签(已办超期、待办超期)
                 //会签(已办超期、待办超期)
-                var queryCountersign = _workflowStepHandleRepository.Queryable()
-               .LeftJoin<WorkflowTrace>((x, o) => x.WorkflowStepId == o.StepId)
-               .LeftJoin<Order>((x, o, p) => o.WorkflowId == p.WorkflowId)
-               .Where((x, o, p) => o.ModuleCode == WorkflowModuleConsts.OrderHandle && o.CreationTime >= dto.StartDate && o.CreationTime <= dto.EndDate)
-               .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (x, o, p) => p.Source == ESource.ProvinceStraight)
-               .WhereIF(dto.OrgCode == "001", (x, o, p) => x.OrgId == dto.OrgCode)
-               .WhereIF(dto.OrgCode != "001", (x, o, p) => x.OrgId.StartsWith(dto.OrgCode))
-
-               .WhereIF(dto.StatisticsType == EStatisticsType.SubtotalOverdue, (x, o, p) => (o.Status >= EWorkflowStepStatus.Handled && o.CountersignPosition > ECountersignPosition.None && o.HandleTime > o.StepExpiredTime)
-                        || (o.Status < EWorkflowStepStatus.Handled && o.CountersignPosition > ECountersignPosition.None && DateTime.Now >= o.StepExpiredTime)
-                        || (o.Status < EWorkflowStepStatus.Handled && DateTime.Now >= o.StepExpiredTime))//会签已办超期/会签待办超期/待办超期
-
-                .Select((x, o, p) => new SelectOrderId { Id = p.Id })
+                //var queryCountersign = _workflowStepHandleRepository.Queryable()
+                //.LeftJoin<WorkflowTrace>((x, o) => x.WorkflowStepId == o.StepId)
+                var queryCountersign = _workflowTraceRepository.Queryable()
+               .LeftJoin<Order>((t, o) => t.ExternalId == o.Id)
+               .Where((t, o) => t.ModuleCode == WorkflowModuleConsts.OrderHandle && t.CreationTime >= dto.StartDate && t.CreationTime <= dto.EndDate)
+               .WhereIF(dto.IsProvince.HasValue && dto.IsProvince == true, (t, o) => o.Source == ESource.ProvinceStraight)
+               .WhereIF(dto.OrgCode == "001", (t, o) => t.HandlerOrgId == dto.OrgCode)
+               .WhereIF(dto.OrgCode != "001", (t, o) => t.HandlerOrgId.StartsWith(dto.OrgCode))
+
+               .WhereIF(dto.StatisticsType == EStatisticsType.SubtotalOverdue, (t, o) => (t.Status >= EWorkflowStepStatus.Handled && t.CountersignPosition > ECountersignPosition.None && t.HandleTime > t.StepExpiredTime)
+                        || (t.Status < EWorkflowStepStatus.Handled && t.CountersignPosition > ECountersignPosition.None && DateTime.Now >= t.StepExpiredTime)
+                        || (t.Status < EWorkflowStepStatus.Handled && DateTime.Now >= t.StepExpiredTime))//会签已办超期/会签待办超期/待办超期
+
+                .Select((t, o) => new SelectOrderId { Id = o.Id })
                .MergeTable();
                .MergeTable();
 
 
                 var queryData = await _orderRepository.OrderListUnionAll(queryOrder, queryCountersign)
                 var queryData = await _orderRepository.OrderListUnionAll(queryOrder, queryCountersign)
@@ -2821,39 +2826,40 @@ namespace Hotline.Api.Controllers.Bi
 
 
             var items = await _workflowTraceRepository.Queryable()
             var items = await _workflowTraceRepository.Queryable()
                 .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
                 .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
-                .LeftJoin<WorkflowStepHandler>((x, w, wsh) => x.StepId == wsh.WorkflowStepId && wsh.IsActualHandler == true)
-                .InnerJoin<SchedulingUser>((x, w, wsh, su) => wsh.UserId == su.UserId)
-                .Where((x, w, wsh, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
-                .Where((x, w, wsh, su) => x.CreationTime >= dto.StartTime.Value)
-                .Where((x, w, wsh, su) => x.CreationTime <= dto.EndTime.Value)
-                .WhereIF(!string.IsNullOrEmpty(dto.UserName), (x, w, wsh, su) => su.UserName == dto.UserName)
-                .GroupBy((x, w, wsh, su) => new { su.UserId, su.UserName })
+                //.LeftJoin<WorkflowStepHandler>((x, w, wsh) => x.StepId == wsh.WorkflowStepId && wsh.IsActualHandler == true)
+                .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
+                .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status == EWorkflowStepStatus.Handled)
+                .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
+                .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
+                .WhereIF(!string.IsNullOrEmpty(dto.UserName), (x, w, su) => su.UserName == dto.UserName)
+                .GroupBy((x, w, su) => new { su.UserId, su.UserName })
                 //.Having((x, w, wsh, su) => SqlFunc.AggregateCount(x.WorkflowId) == 1)
                 //.Having((x, w, wsh, su) => SqlFunc.AggregateCount(x.WorkflowId) == 1)
-                .Select((x, w, wsh, su) => new BiOrderSendVo
+                .Select((x, w, su) => new BiOrderSendVo
                 {
                 {
                     UserId = su.UserId,
                     UserId = su.UserId,
                     UserName = su.UserName,
                     UserName = su.UserName,
                     SendOrderNum = SqlFunc.AggregateDistinctCount(w.ExternalId),
                     SendOrderNum = SqlFunc.AggregateDistinctCount(w.ExternalId),
                     NoSendOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.HandlerId == null || x.HandlerId == "", 1, 0)),
                     NoSendOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.HandlerId == null || x.HandlerId == "", 1, 0)),
                 }).ToListAsync();
                 }).ToListAsync();
+
             var items2 = await _workflowTraceRepository.Queryable()
             var items2 = await _workflowTraceRepository.Queryable()
                 .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
                 .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
-                .LeftJoin<WorkflowStepHandler>((x, w, wfsh) => x.StepId == wfsh.WorkflowStepId && wfsh.IsActualHandler == true)
-                .InnerJoin<SchedulingUser>((x, w, wfsh, su) => wfsh.UserId == su.UserId)
-                .Where((x, w, wfsh, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
-                .Where((x, w, wfsh, su) => x.CreationTime >= dto.StartTime.Value)
-                .Where((x, w, wfsh, su) => x.CreationTime <= dto.EndTime.Value)
-                .GroupBy((x, w, wfsh, su) => x.WorkflowId)
-                .Having((x, w, wfsh, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
-                .Select((x, w, wfsh, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(wfsh.CreationTime) })
+                //.LeftJoin<WorkflowStepHandler>((x, w, wfsh) => x.StepId == wfsh.WorkflowStepId && wfsh.IsActualHandler == true)
+                .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
+                .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send && x.Status == EWorkflowStepStatus.Handled)
+                .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
+                .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
+                .GroupBy((x, w, su) => x.WorkflowId)
+                .Having((x, w, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
+                .Select((x, w, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
                 .MergeTable()
                 .MergeTable()
                 .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
                 .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
                 .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
                 .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
-                .LeftJoin<WorkflowStepHandler>((a, wt, wf, wsh) => wt.StepId == wsh.WorkflowStepId && wsh.CreationTime == a.CreationTime)
-                .InnerJoin<SchedulingUser>((a, wt, wf, wsh, su) => wsh.UserId == su.UserId)
-                .WhereIF(!string.IsNullOrEmpty(dto.UserName), ((a, wt, wf, wsh, su) => su.UserName == dto.UserName))
-                .GroupBy((a, wt, wf, wsh, su) => new { su.UserId, su.UserName })
-                .Select((a, wt, wf, wsh, su) => new BiOrderSendVo
+                //.LeftJoin<WorkflowStepHandler>((a, wt, wf, wsh) => wt.StepId == wsh.WorkflowStepId && wsh.CreationTime == a.CreationTime)
+                .InnerJoin<SchedulingUser>((a, wt, wf, su) => wt.HandlerId == su.UserId)
+                .WhereIF(!string.IsNullOrEmpty(dto.UserName), ((a, wt, wf, su) => su.UserName == dto.UserName))
+                .GroupBy((a, wt, wf, su) => new { su.UserId, su.UserName })
+                .Select((a, wt, wf, su) => new BiOrderSendVo
                 {
                 {
                     UserId = su.UserId,
                     UserId = su.UserId,
                     UserName = su.UserName,
                     UserName = su.UserName,
@@ -2892,15 +2898,15 @@ namespace Hotline.Api.Controllers.Bi
 
 
             var (total, items) = await _workflowTraceRepository.Queryable()
             var (total, items) = await _workflowTraceRepository.Queryable()
                 .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
                 .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
-                .LeftJoin<WorkflowStepHandler>((x, w, wsh) => x.StepId == wsh.WorkflowStepId && wsh.IsActualHandler == true)
-                .InnerJoin<SchedulingUser>((x, w, wsh, su) => wsh.UserId == su.UserId)
-                .Where((x, w, wsh, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
-                .Where((x, w, wsh, su) => x.CreationTime >= dto.StartTime.Value)
-                .Where((x, w, wsh, su) => x.CreationTime <= dto.EndTime.Value)
-                .Where((x, w, wsh, su) => su.UserId == dto.UserId)
-                .WhereIF(dto.TitleCode.ToUpper() == "NOSENDORDERNUM", (x, w, wsh, su) => x.HandlerId == null || x.HandlerId == "")
-                .GroupBy((x, w, wsh, su) => w.ExternalId)
-                .Select((x, w, wsh, su) => new { Id = w.ExternalId })
+                //.LeftJoin<WorkflowStepHandler>((x, w, wsh) => x.StepId == wsh.WorkflowStepId && wsh.IsActualHandler == true)
+                .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
+                .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
+                .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
+                .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
+                .Where((x, w, su) => su.UserId == dto.UserId)
+                .WhereIF(dto.TitleCode.ToUpper() == "NOSENDORDERNUM", (x, w, su) => x.HandlerId == null || x.HandlerId == "")
+                .GroupBy((x, w, su) => w.ExternalId)
+                .Select((x, w, su) => new { Id = w.ExternalId })
                 .MergeTable()
                 .MergeTable()
                 .LeftJoin<Order>((a, b) => a.Id == b.Id)
                 .LeftJoin<Order>((a, b) => a.Id == b.Id)
                 .Select((a, b) => b)
                 .Select((a, b) => b)
@@ -2910,22 +2916,22 @@ namespace Hotline.Api.Controllers.Bi
             {
             {
                 (total, items) = await _workflowTraceRepository.Queryable()
                 (total, items) = await _workflowTraceRepository.Queryable()
                        .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
                        .LeftJoin<Workflow>((x, w) => x.WorkflowId == w.Id)
-                       .LeftJoin<WorkflowStepHandler>((x, w, wfsh) => x.StepId == wfsh.WorkflowStepId && wfsh.IsActualHandler == true)
-                       .InnerJoin<SchedulingUser>((x, w, wfsh, su) => wfsh.UserId == su.UserId)
-                       .Where((x, w, wfsh, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
-                       .Where((x, w, wfsh, su) => x.CreationTime >= dto.StartTime.Value)
-                       .Where((x, w, wfsh, su) => x.CreationTime <= dto.EndTime.Value)
-                       .GroupBy((x, w, wfsh, su) => x.WorkflowId)
-                       .Having((x, w, wfsh, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
-                        .Select((x, w, wfsh, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(wfsh.CreationTime) })
+                       //.LeftJoin<WorkflowStepHandler>((x, w, wfsh) => x.StepId == wfsh.WorkflowStepId && wfsh.IsActualHandler == true)
+                       .InnerJoin<SchedulingUser>((x, w, su) => x.HandlerId == su.UserId)
+                       .Where((x, w, su) => w.ModuleCode == "OrderHandle" && x.BusinessType == EBusinessType.Send)
+                       .Where((x, w, su) => x.CreationTime >= dto.StartTime.Value)
+                       .Where((x, w, su) => x.CreationTime <= dto.EndTime.Value)
+                       .GroupBy((x, w, su) => x.WorkflowId)
+                       .Having((x, w, su) => SqlFunc.AggregateCount(x.WorkflowId) > 1)
+                        .Select((x, w, su) => new { Id = x.WorkflowId, CreationTime = SqlFunc.AggregateMin(x.CreationTime) })
                        .MergeTable()
                        .MergeTable()
                        .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
                        .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
                        .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
                        .LeftJoin<Workflow>((a, wt, wf) => wt.WorkflowId == wf.Id)
-                       .LeftJoin<WorkflowStepHandler>((a, wt, wf, wsh) => wt.StepId == wsh.WorkflowStepId && wsh.CreationTime == a.CreationTime)
-                       .InnerJoin<SchedulingUser>((a, wt, wf, wsh, su) => wsh.UserId == su.UserId)
-                       .Where((a, wt, wf, wsh, su) => su.UserId == dto.UserId)
-                       .GroupBy((a, wt, wf, wsh, su) => wf.ExternalId)
-                       .Select((a, wt, wf, wsh, su) => new { Id = wf.ExternalId })
+                       //.LeftJoin<WorkflowStepHandler>((a, wt, wf, wsh) => wt.StepId == wsh.WorkflowStepId && wsh.CreationTime == a.CreationTime)
+                       .InnerJoin<SchedulingUser>((a, wt, wf, su) => wt.HandlerId == su.UserId)
+                       .Where((a, wt, wf, su) => su.UserId == dto.UserId)
+                       .GroupBy((a, wt, wf, su) => wf.ExternalId)
+                       .Select((a, wt, wf, su) => new { Id = wf.ExternalId })
                        .MergeTable()
                        .MergeTable()
                        .LeftJoin<Order>((a, b) => a.Id == b.Id)
                        .LeftJoin<Order>((a, b) => a.Id == b.Id)
                        .Select((a, b) => b)
                        .Select((a, b) => b)
@@ -3198,51 +3204,51 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("unsigned_order_report")]
         [HttpGet("unsigned_order_report")]
         public async Task<PagedDto<UnsignedOrderDto>> UnsignedOrderReport([FromQuery] QueryUnsignedOrdersRequest dto)
         public async Task<PagedDto<UnsignedOrderDto>> UnsignedOrderReport([FromQuery] QueryUnsignedOrdersRequest dto)
         {
         {
-	        var query = _orderApplication.QueryUnsignedOrders(dto);
-	        var (total, items) = await query.Select((x,ws)=> new UnsignedOrder { Order = x , WorkflowStep = ws }).ToPagedListAsync(dto, HttpContext.RequestAborted);
+            var query = _orderApplication.QueryUnsignedOrders(dto);
+            var (total, items) = await query.Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws }).ToPagedListAsync(dto, HttpContext.RequestAborted);
             var itemsVo = _mapper.Map<IReadOnlyList<UnsignedOrderDto>>(items);
             var itemsVo = _mapper.Map<IReadOnlyList<UnsignedOrderDto>>(items);
             foreach (var item in itemsVo)
             foreach (var item in itemsVo)
             {
             {
                 item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.WorkflowStep.AcceptTime!.Value, false);
                 item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.WorkflowStep.AcceptTime!.Value, false);
             }
             }
-			return new PagedDto<UnsignedOrderDto>(total, itemsVo);
+            return new PagedDto<UnsignedOrderDto>(total, itemsVo);
         }
         }
-		/// <summary>
-		/// 未签收统计导出
-		/// </summary>
-		/// <returns></returns>
-		[HttpPost("unsigned_order_report/_export")]
+        /// <summary>
+        /// 未签收统计导出
+        /// </summary>
+        /// <returns></returns>
+        [HttpPost("unsigned_order_report/_export")]
         public async Task<FileStreamResult> UnsignedOrdersReportReport([FromBody] ExportExcelDto<QueryUnsignedOrdersRequest> dto)
         public async Task<FileStreamResult> UnsignedOrdersReportReport([FromBody] ExportExcelDto<QueryUnsignedOrdersRequest> dto)
         {
         {
-	        var query = _orderApplication.QueryUnsignedOrders(dto.QueryDto).Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws });
-	        List<UnsignedOrder>  unsignedOrders;
-	        if (dto.IsExportAll)
-	        {
-		        unsignedOrders = await query.ToListAsync(HttpContext.RequestAborted);
-	        }
-	        else
-	        {
-		        var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
-		        unsignedOrders = items;
-	        }
-
-	        var unsignedOrderDtos = _mapper.Map<ICollection<UnsignedOrderDto>>(unsignedOrders);
-
-	        foreach (var item in unsignedOrderDtos)
-	        {
+            var query = _orderApplication.QueryUnsignedOrders(dto.QueryDto).Select((x, ws) => new UnsignedOrder { Order = x, WorkflowStep = ws });
+            List<UnsignedOrder> unsignedOrders;
+            if (dto.IsExportAll)
+            {
+                unsignedOrders = await query.ToListAsync(HttpContext.RequestAborted);
+            }
+            else
+            {
+                var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+                unsignedOrders = items;
+            }
+
+            var unsignedOrderDtos = _mapper.Map<ICollection<UnsignedOrderDto>>(unsignedOrders);
+
+            foreach (var item in unsignedOrderDtos)
+            {
                 item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.WorkflowStep.AcceptTime!.Value, false);
                 item.UnsignedTime = _timeLimitDomainService.CalcWorkTimeToHour(item.WorkflowStep.CreationTime, item.WorkflowStep.Status == EWorkflowStepStatus.WaitForAccept ? DateTime.Now : item.WorkflowStep.AcceptTime!.Value, false);
             }
             }
 
 
-			dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+            dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
 
 
-	        var dtos = unsignedOrderDtos
-				.Select(stu => _mapper.Map(stu, typeof(UnsignedOrderDto), dynamicClass))
-		        .Cast<object>()
-		        .ToList();
+            var dtos = unsignedOrderDtos
+                .Select(stu => _mapper.Map(stu, typeof(UnsignedOrderDto), dynamicClass))
+                .Cast<object>()
+                .ToList();
 
 
-	        var stream = ExcelHelper.CreateStream(dtos);
+            var stream = ExcelHelper.CreateStream(dtos);
 
 
-	        return ExcelStreamResult(stream, "未签收统计列表数据");
+            return ExcelStreamResult(stream, "未签收统计列表数据");
         }
         }
-	}
+    }
 }
 }

+ 6 - 3
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -419,7 +419,8 @@ namespace Hotline.Api.Controllers
 
 
 
 
             //获取关联 工单或是回访
             //获取关联 工单或是回访
-            var order = await _orderRepository.GetAsync(x => x.CallId == model.CallAccept, HttpContext.RequestAborted);
+            //var order = await _orderRepository.GetAsync(x => x.CallId == model.CallAccept, HttpContext.RequestAborted);//由CallAccept改为OtherAccept
+            var order = await _orderRepository.GetAsync(x => x.CallId == model.OtherAccept, HttpContext.RequestAborted);
             if (order != null)
             if (order != null)
             {
             {
                 model.CallOrderType = ECallOrderType.Order;
                 model.CallOrderType = ECallOrderType.Order;
@@ -438,7 +439,8 @@ namespace Hotline.Api.Controllers
             }
             }
             else
             else
             {
             {
-                var orderVisit = await _orderVisitRepository.GetAsync(x => x.CallId == model.CallAccept, HttpContext.RequestAborted);
+                //var orderVisit = await _orderVisitRepository.GetAsync(x => x.CallId == model.CallAccept, HttpContext.RequestAborted);//由CallAccept改为OtherAccept
+                var orderVisit = await _orderVisitRepository.GetAsync(x => x.CallId == model.OtherAccept, HttpContext.RequestAborted);
                 if (orderVisit != null)
                 if (orderVisit != null)
                 {
                 {
                     model.CallOrderType = ECallOrderType.Visit;
                     model.CallOrderType = ECallOrderType.Visit;
@@ -614,7 +616,8 @@ namespace Hotline.Api.Controllers
         [HttpPost("link-callrecord")]
         [HttpPost("link-callrecord")]
         public async Task LinkCallRecord([FromBody] LinkCallRecordDto dto)
         public async Task LinkCallRecord([FromBody] LinkCallRecordDto dto)
         {
         {
-            var trRecord = await _trCallRecordRepository.GetAsync(x => x.CallAccept == dto.CallId, HttpContext.RequestAborted);
+            //var trRecord = await _trCallRecordRepository.GetAsync(x => x.CallAccept == dto.CallId, HttpContext.RequestAborted);//由CallAccept改为OtherAccept
+            var trRecord = await _trCallRecordRepository.GetAsync(x => x.OtherAccept == dto.CallId, HttpContext.RequestAborted);
             if (dto.IsOrder)
             if (dto.IsOrder)
             {
             {
                 if (trRecord.CallOrderType == ECallOrderType.Order && !string.IsNullOrEmpty(trRecord.ExternalId))
                 if (trRecord.CallOrderType == ECallOrderType.Order && !string.IsNullOrEmpty(trRecord.ExternalId))

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

@@ -666,7 +666,8 @@ public class OrderController : BaseController
         var visitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction).Where(x => x.DicDataValue != "-1");
         var visitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction).Where(x => x.DicDataValue != "-1");
         var dissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason);
         var dissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason);
         var visitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x => x.DicDataValue != "-1");
         var visitManner = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitManner).Where(x => x.DicDataValue != "-1");
-        var callRecord = await _trCallRecordRepository.GetAsync(x => x.CallAccept == orderVisit.CallId);
+        //var callRecord = await _trCallRecordRepository.GetAsync(x => x.CallAccept == orderVisit.CallId); //由CallAccept改为OtherAccept
+        var callRecord = await _trCallRecordRepository.GetAsync(x => x.OtherAccept == orderVisit.CallId);
         var recordingFileUrl = "";
         var recordingFileUrl = "";
         var recordingBaseAddress = "";
         var recordingBaseAddress = "";
         var recordingAbsolutePath = "";
         var recordingAbsolutePath = "";
@@ -1357,7 +1358,7 @@ public class OrderController : BaseController
     {
     {
         var isHandled = dto.IsApply.HasValue && dto.IsApply.Value;
         var isHandled = dto.IsApply.HasValue && dto.IsApply.Value;
         var (total, items) = await _orderDelayRepository
         var (total, items) = await _orderDelayRepository
-            .Queryable(canView: true, hasHandled: !isHandled)
+            .Queryable(hasHandled: !isHandled)
             .Includes(x => x.Order)
             .Includes(x => x.Order)
             .Includes(x => x.Workflow)
             .Includes(x => x.Workflow)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
@@ -2326,7 +2327,8 @@ public class OrderController : BaseController
             dto.Files = files.Where(x => string.IsNullOrEmpty(x.FlowKey)).ToList();
             dto.Files = files.Where(x => string.IsNullOrEmpty(x.FlowKey)).ToList();
         }
         }
 
 
-        var call = await _trCallRecordRepository.Queryable().Where(x => x.CallAccept == order.CallId).FirstAsync();
+        //var call = await _trCallRecordRepository.Queryable().Where(x => x.CallAccept == order.CallId).FirstAsync();//由CallAccept改为OtherAccept
+        var call = await _trCallRecordRepository.Queryable().Where(x => x.OtherAccept == order.CallId).FirstAsync();
         if (call != null)
         if (call != null)
         {
         {
             dto.RecordingBaseAddress = call.RecordingBaseAddress;
             dto.RecordingBaseAddress = call.RecordingBaseAddress;
@@ -2382,7 +2384,8 @@ public class OrderController : BaseController
         }
         }
 
 
         //工单ID跟通话记录相关联
         //工单ID跟通话记录相关联
-        var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, HttpContext.RequestAborted);
+        //var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, HttpContext.RequestAborted);//由CallAccept改为OtherAccept
+        var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept== order.CallId, HttpContext.RequestAborted);
         if (callRecord != null && string.IsNullOrEmpty(callRecord.ExternalId))
         if (callRecord != null && string.IsNullOrEmpty(callRecord.ExternalId))
         {
         {
             callRecord.ExternalId = order.Id;
             callRecord.ExternalId = order.Id;
@@ -2893,7 +2896,7 @@ public class OrderController : BaseController
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 
 
         var (total, items) = await _orderRepository
         var (total, items) = await _orderRepository
-            .Queryable(canView: true, hasHandled: !isHandled)
+            .Queryable(hasHandled: !isHandled)
             .Includes(d => d.OrderSpecials)
             .Includes(d => d.OrderSpecials)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.No.Contains(dto.Keyword) || d.Title.Contains(dto.Keyword))
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.No.Contains(dto.Keyword) || d.Title.Contains(dto.Keyword))
@@ -2962,7 +2965,7 @@ public class OrderController : BaseController
             dto.StartTimeEnd = dto.StartTimeEnd.Value.AddDays(1).AddSeconds(-1);
             dto.StartTimeEnd = dto.StartTimeEnd.Value.AddDays(1).AddSeconds(-1);
 
 
         var (total, items) = await _orderRepository.Queryable(canView: false)
         var (total, items) = await _orderRepository.Queryable(canView: false)
-            .Where(x => x.Workflow.Steps.Any(s => s.Status < EWorkflowStepStatus.Handled && s.StepHandlers.Any(d => d.OrgId == OrgSeedData.CenterId)))
+            .Where(x => x.Workflow.Steps.Any(s => s.Status < EWorkflowStepStatus.Handled && s.HandlerOrgId == OrgSeedData.CenterId))
             .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
             .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
             .Where(x => x.Status != EOrderStatus.BackToProvince)
             .Where(x => x.Status != EOrderStatus.BackToProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No!.Contains(dto.No!))
             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No!.Contains(dto.No!))
@@ -3013,7 +3016,7 @@ public class OrderController : BaseController
         if (dto.EndTime.HasValue)
         if (dto.EndTime.HasValue)
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
         var (total, items) = await _orderRepository
         var (total, items) = await _orderRepository
-            .Queryable(canView: true, hasHandled: !isHandled)
+            .Queryable(hasHandled: !isHandled)
             .Includes(d => d.OrderSpecials)
             .Includes(d => d.OrderSpecials)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.No.Contains(dto.Keyword) || d.Title.Contains(dto.Keyword))
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.No.Contains(dto.Keyword) || d.Title.Contains(dto.Keyword))
@@ -3106,7 +3109,7 @@ public class OrderController : BaseController
                     SendBackOrgName = prevStep.HandlerOrgName,//prevStep!.AcceptorOrgName,
                     SendBackOrgName = prevStep.HandlerOrgName,//prevStep!.AcceptorOrgName,
                     WorkflowOrgId = _sessionContext.RequiredOrgId,
                     WorkflowOrgId = _sessionContext.RequiredOrgId,
                     WorkflowUserId = _sessionContext.RequiredUserId,
                     WorkflowUserId = _sessionContext.RequiredUserId,
-                    WorkflowRoleIds =  _sessionContext.Roles.ToList()
+                    WorkflowRoleIds = _sessionContext.Roles.ToList()
                 };
                 };
                 await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
                 await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
             }
             }
@@ -3196,7 +3199,7 @@ public class OrderController : BaseController
             if (sendBack.State == ESendBackAuditState.End)
             if (sendBack.State == ESendBackAuditState.End)
             {
             {
                 var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData,
                 var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData,
-                    sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(), 
+                    sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
                     _sessionContext, HttpContext.RequestAborted);
                     _sessionContext, HttpContext.RequestAborted);
                 //var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId, HttpContext.RequestAborted);
                 //var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId, HttpContext.RequestAborted);
                 var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban;
                 var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban;

+ 8 - 5
src/Hotline.Api/Controllers/QualityController.cs

@@ -150,7 +150,8 @@ namespace Hotline.Api.Controllers
 				.FirstAsync(x => x.Id == id);
 				.FirstAsync(x => x.Id == id);
 			var qualityDto = _mapper.Map<QualityDto>(quality);
 			var qualityDto = _mapper.Map<QualityDto>(quality);
 			if (qualityDto.Order != null) {
 			if (qualityDto.Order != null) {
-				var call = await _trCallRecordRepository.Queryable().Where(x => x.CallAccept == qualityDto.Order.CallId).FirstAsync();
+                //var call = await _trCallRecordRepository.Queryable().Where(x => x.CallAccept == qualityDto.Order.CallId).FirstAsync(); //由CallAccept改为OtherAccept
+                var call = await _trCallRecordRepository.Queryable().Where(x => x.OtherAccept == qualityDto.Order.CallId).FirstAsync();
                 if (call != null)
                 if (call != null)
                 {
                 {
 					qualityDto.Order.RecordingBaseAddress = call.RecordingBaseAddress;
 					qualityDto.Order.RecordingBaseAddress = call.RecordingBaseAddress;
@@ -159,8 +160,9 @@ namespace Hotline.Api.Controllers
 			}
 			}
 			if (qualityDto.Visit != null)
 			if (qualityDto.Visit != null)
 			{
 			{
-				var call = await _trCallRecordRepository.Queryable().Where(x => x.CallAccept == qualityDto.Visit.CallId).FirstAsync();
-				if (call != null)
+                //var call = await _trCallRecordRepository.Queryable().Where(x => x.CallAccept == qualityDto.Visit.CallId).FirstAsync(); //由CallAccept改为OtherAccept
+                var call = await _trCallRecordRepository.Queryable().Where(x => x.OtherAccept == qualityDto.Visit.CallId).FirstAsync();
+                if (call != null)
                 {
                 {
                     qualityDto.Visit.RecordingBaseAddress = call.RecordingBaseAddress;
                     qualityDto.Visit.RecordingBaseAddress = call.RecordingBaseAddress;
                     qualityDto.Visit.RecordingAbsolutePath = call.RecordingAbsolutePath;
                     qualityDto.Visit.RecordingAbsolutePath = call.RecordingAbsolutePath;
@@ -669,8 +671,9 @@ namespace Hotline.Api.Controllers
 			if (order != null && !string.IsNullOrEmpty(order.CallId))
 			if (order != null && !string.IsNullOrEmpty(order.CallId))
 			{
 			{
 				quality.AiQuality = true;
 				quality.AiQuality = true;
-				var call = await _trCallRecordRepository.GetAsync(x => x.CallAccept == order.CallId, HttpContext.RequestAborted);
-				await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, HttpContext.RequestAborted);
+                //var call = await _trCallRecordRepository.GetAsync(x => x.CallAccept == order.CallId, HttpContext.RequestAborted); //由CallAccept改为OtherAccept
+                var call = await _trCallRecordRepository.GetAsync(x => x.OtherAccept == order.CallId, HttpContext.RequestAborted);
+                await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, HttpContext.RequestAborted);
 				await _qualitey.UpdateAsync(quality, HttpContext.RequestAborted);
 				await _qualitey.UpdateAsync(quality, HttpContext.RequestAborted);
 			}
 			}
 		}
 		}

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

@@ -90,7 +90,7 @@ public class TestController : BaseController
     private readonly IExportApplication _exportApplication;
     private readonly IExportApplication _exportApplication;
     private readonly IAiVisitService _aiVisitService;
     private readonly IAiVisitService _aiVisitService;
     private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
     private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
-    private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
+    //private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
 
 
     private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
     private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
     private readonly IOrderRepository _orderRepository;
     private readonly IOrderRepository _orderRepository;
@@ -129,7 +129,7 @@ public class TestController : BaseController
         IExportApplication exportApplication,
         IExportApplication exportApplication,
         IAiVisitService aiVisitService,
         IAiVisitService aiVisitService,
         IRepository<WorkflowTrace> workflowTraceRepository,
         IRepository<WorkflowTrace> workflowTraceRepository,
-        IRepository<WorkflowStepHandler> workflowStepHandleRepository,
+        //IRepository<WorkflowStepHandler> workflowStepHandleRepository,
         IRepository<SystemOrganize> systemOrganizeRepository,
         IRepository<SystemOrganize> systemOrganizeRepository,
         IOrderRepository orderRepository,
         IOrderRepository orderRepository,
         IMapper mapper
         IMapper mapper
@@ -159,7 +159,7 @@ public class TestController : BaseController
         _exportApplication = exportApplication;
         _exportApplication = exportApplication;
         _aiVisitService = aiVisitService;
         _aiVisitService = aiVisitService;
         _workflowTraceRepository = workflowTraceRepository;
         _workflowTraceRepository = workflowTraceRepository;
-        _workflowStepHandleRepository = workflowStepHandleRepository;
+        //_workflowStepHandleRepository = workflowStepHandleRepository;
         _systemOrganizeRepository = systemOrganizeRepository;
         _systemOrganizeRepository = systemOrganizeRepository;
         _orderRepository = orderRepository;
         _orderRepository = orderRepository;
         _orderRepository = orderRepository;
         _orderRepository = orderRepository;

+ 59 - 58
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -146,9 +146,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             current.RequiredUserId, current.RequiredOrgId,
             current.RequiredUserId, current.RequiredOrgId,
             externalId, cancellationToken);
             externalId, cancellationToken);
 
 
-        var startStepHandles = new List<WorkflowStepHandler>{WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-            EFlowAssignType.User, current.RequiredUserId, current.UserName,
-            current.RequiredOrgId, current.OrgName)};
+        //var startStepHandles = new List<WorkflowStepHandler>{WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+        //    EFlowAssignType.User, current.RequiredUserId, current.UserName,
+        //    current.RequiredOrgId, current.OrgName)};
 
 
         var startStep = _workflowDomainService.CreateStartStep(workflow, startStepDefine, dto,
         var startStep = _workflowDomainService.CreateStartStep(workflow, startStepDefine, dto,
             new FlowStepHandler
             new FlowStepHandler
@@ -159,13 +159,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 Username = current.UserName,
                 Username = current.UserName,
                 OrgId = current.RequiredOrgId,
                 OrgId = current.RequiredOrgId,
                 OrgName = current.OrgName
                 OrgName = current.OrgName
-            },
-            startStepHandles, expiredTime);
+            }, expiredTime);
 
 
         var flowAssignInfo =
         var flowAssignInfo =
             await GetNextStepFlowAssignInfoAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic, cancellationToken);
             await GetNextStepFlowAssignInfoAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic, cancellationToken);
 
 
-        var firstStepHandlers = await GetNextStepHandlersAsync(workflow, firstStepDefine, dto, cancellationToken);
+        //var firstStepHandlers = await GetNextStepHandlersAsync(workflow, firstStepDefine, dto, cancellationToken);
 
 
         var counterSignType = _workflowDomainService.GetCounterSignType(startStep.BusinessType);
         var counterSignType = _workflowDomainService.GetCounterSignType(startStep.BusinessType);
 
 
@@ -181,10 +180,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             startStep.FileJson =
             startStep.FileJson =
                 await _fileRepository.AddFileAsync(dto.Files, workflow.ExternalId, startStep.Id, cancellationToken);
                 await _fileRepository.AddFileAsync(dto.Files, workflow.ExternalId, startStep.Id, cancellationToken);
 
 
-        //await _workflowStepRepository.AddAsync(startStep, cancellationToken);
-        await _workflowStepRepository.AddNav(startStep)
-            .Include(d => d.StepHandlers)
-            .ExecuteCommandAsync();
+        await _workflowStepRepository.AddAsync(startStep, cancellationToken);
+        //await _workflowStepRepository.AddNav(startStep)
+        //    .Include(d => d.StepHandlers)
+        //    .ExecuteCommandAsync();
         workflow.Steps.Add(startStep);
         workflow.Steps.Add(startStep);
 
 
         //starttrace
         //starttrace
@@ -204,7 +203,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             current.OrgName);
             current.OrgName);
 
 
         await _workflowDomainService.StartAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic,
         await _workflowDomainService.StartAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic,
-            flowAssignInfo, counterSignType, expiredTime, firstStepHandlers, current, cancellationToken);
+            flowAssignInfo, counterSignType, expiredTime, current, cancellationToken);
 
 
         return workflow.Id;
         return workflow.Id;
     }
     }
@@ -264,10 +263,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var flowAssignInfo =
         var flowAssignInfo =
             await GetNextStepFlowAssignInfoAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic, cancellationToken);
             await GetNextStepFlowAssignInfoAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic, cancellationToken);
 
 
-        var nextStepHandlers = await GetNextStepHandlersAsync(workflow, nextStepDefine, dto, cancellationToken);
+        //var nextStepHandlers = await GetNextStepHandlersAsync(workflow, nextStepDefine, dto, cancellationToken);
 
 
         await _workflowDomainService.NextAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic,
         await _workflowDomainService.NextAsync(workflow, currentStep, dto, nextStepDefine, isNextDynamic,
-            flowAssignInfo, expiredTime, nextStepHandlers, current, cancellationToken);
+            flowAssignInfo, expiredTime, current, cancellationToken);
 
 
         return workflow;
         return workflow;
     }
     }
@@ -298,7 +297,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         return await _workflowDomainService.PreviousAsync(workflow, dto,
         return await _workflowDomainService.PreviousAsync(workflow, dto,
             applicantId, applicantOrgId, applicantRoleIds, _sessionContext, cancellationToken);
             applicantId, applicantOrgId, applicantRoleIds, _sessionContext, cancellationToken);
     }
     }
-    
+
     /// <summary>
     /// <summary>
     /// 撤回至任意节点
     /// 撤回至任意节点
     /// </summary>
     /// </summary>
@@ -321,9 +320,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.IsStartCountersign,
         var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.IsStartCountersign,
             dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList(), cancellationToken);
             dto.NextHandlers.Select(d => new Kv(d.Key, d.Value)).ToList(), cancellationToken);
 
 
-        var stepHandlers = await GetNextStepHandlersAsync(workflow, targetStepDefine, dto, cancellationToken);
+        //var stepHandlers = await GetNextStepHandlersAsync(workflow, targetStepDefine, dto, cancellationToken);
 
 
-        await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, stepHandlers, expiredTime, _sessionContext, cancellationToken);
+        await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, expiredTime, _sessionContext, cancellationToken);
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -482,7 +481,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 var sb = new StringBuilder();
                 var sb = new StringBuilder();
                 foreach (var countersignHandleStep in countersignHandleSteps)
                 foreach (var countersignHandleStep in countersignHandleSteps)
                 {
                 {
-                    sb.AppendLine($"{countersignHandleStep.GetActualHandler()?.GetHandler().Value} : {countersignHandleStep.Opinion}");
+                    //sb.AppendLine($"{countersignHandleStep.GetActualHandler()?.GetHandler().Value} : {countersignHandleStep.Opinion}");
+                    sb.AppendLine($"{countersignHandleStep.GetHandler().Value} : {countersignHandleStep.Opinion}");
                 }
                 }
                 dto.Opinion = sb.ToString();
                 dto.Opinion = sb.ToString();
 
 
@@ -533,7 +533,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             string.IsNullOrEmpty(dto.Opinion))
             string.IsNullOrEmpty(dto.Opinion))
         {
         {
             var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PrevStepId);
             var prevStep = workflow.Steps.FirstOrDefault(d => d.Id == currentStep.PrevStepId);
-            dto.Opinion = $"{prevStep?.GetActualHandler()?.GetHandler().Value} : {prevStep?.Opinion}";
+            dto.Opinion = $"{prevStep?.GetHandler().Value} : {prevStep?.Opinion}";
         }
         }
 
 
         return dto;
         return dto;
@@ -1160,45 +1160,45 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             cancellationToken);
             cancellationToken);
     }
     }
 
 
-    private async ValueTask<List<WorkflowStepHandler>> GetNextStepHandlersAsync(Workflow workflow,
-        StepDefine nextStepDefine, BasicWorkflowDto dto, CancellationToken cancellationToken)
-    {
-        var assignType = FlowAssignInfo.GetAssignType(dto.HandlerType);
-        //var assignType = AssignInfo.GetAssignType(nextStepDefine.HandlerType, dto.NextHandlers.Any());
-        switch (assignType)
-        {
-            case EFlowAssignType.Org:
-                return dto.NextHandlers.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-                    assignType, orgId: d.Key, orgName: d.Value)).ToList();
-            case EFlowAssignType.User:
-                if (!dto.NextHandlers.Any() && dto.HandlerType is EHandlerType.Role)
-                {
-                    var stepOption = await GetConfigStepAsync(EFlowType.Handle, nextStepDefine, cancellationToken);
-                    var uIds = stepOption.Items.Select(d => d.Key).ToList();
-                    var users1 = await _userRepository.Queryable()
-                        .Includes(d => d.Organization)
-                        .Where(d => uIds.Contains(d.Id))
-                        .ToListAsync(cancellationToken);
-                    return users1.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-                            assignType, d.Id, d.Name, d.OrgId, d.Organization.Name))
-                        .ToList();
-                }
-                var userIds = dto.NextHandlers.Select(d => d.Key).ToList();
-                var users = await _userRepository.Queryable()
-                    .Includes(d => d.Organization)
-                    .Where(d => userIds.Contains(d.Id))
-                    .ToListAsync(cancellationToken);
-                return users.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-                        assignType, d.Id, d.Name, d.OrgId, d.Organization.Name))
-                    .ToList();
-            //case EFlowAssignType.Role:
-            //    handlers = dto.NextHandlers.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
-            //        assignType, roleId: d.Key, roleName: d.Value)).ToList();
-            //    break;
-            default:
-                throw new ArgumentOutOfRangeException();
-        }
-    }
+    //private async ValueTask<List<WorkflowStepHandler>> GetNextStepHandlersAsync(Workflow workflow,
+    //    StepDefine nextStepDefine, BasicWorkflowDto dto, CancellationToken cancellationToken)
+    //{
+    //    var assignType = FlowAssignInfo.GetAssignType(dto.HandlerType);
+    //    //var assignType = AssignInfo.GetAssignType(nextStepDefine.HandlerType, dto.NextHandlers.Any());
+    //    switch (assignType)
+    //    {
+    //        case EFlowAssignType.Org:
+    //            return dto.NextHandlers.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+    //                assignType, orgId: d.Key, orgName: d.Value)).ToList();
+    //        case EFlowAssignType.User:
+    //            if (!dto.NextHandlers.Any() && dto.HandlerType is EHandlerType.Role)
+    //            {
+    //                var stepOption = await GetConfigStepAsync(EFlowType.Handle, nextStepDefine, cancellationToken);
+    //                var uIds = stepOption.Items.Select(d => d.Key).ToList();
+    //                var users1 = await _userRepository.Queryable()
+    //                    .Includes(d => d.Organization)
+    //                    .Where(d => uIds.Contains(d.Id))
+    //                    .ToListAsync(cancellationToken);
+    //                return users1.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+    //                        assignType, d.Id, d.Name, d.OrgId, d.Organization.Name))
+    //                    .ToList();
+    //            }
+    //            var userIds = dto.NextHandlers.Select(d => d.Key).ToList();
+    //            var users = await _userRepository.Queryable()
+    //                .Includes(d => d.Organization)
+    //                .Where(d => userIds.Contains(d.Id))
+    //                .ToListAsync(cancellationToken);
+    //            return users.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+    //                    assignType, d.Id, d.Name, d.OrgId, d.Organization.Name))
+    //                .ToList();
+    //        //case EFlowAssignType.Role:
+    //        //    handlers = dto.NextHandlers.Select(d => WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId,
+    //        //        assignType, roleId: d.Key, roleName: d.Value)).ToList();
+    //        //    break;
+    //        default:
+    //            throw new ArgumentOutOfRangeException();
+    //    }
+    //}
 
 
     /// <summary>
     /// <summary>
     /// 按流程模板配置创建下一步办理对象
     /// 按流程模板配置创建下一步办理对象
@@ -1307,7 +1307,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withSteps: true, withTraces: true,
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withSteps: true, withTraces: true,
             cancellationToken: cancellationToken);
             cancellationToken: cancellationToken);
         var step = workflow.Steps.FirstOrDefault(d =>
         var step = workflow.Steps.FirstOrDefault(d =>
-            d.StepHandlers.Any(d => d.OrgId == "001171" || d.OrgId == "001178"));
+            //d.StepHandlers.Any(d => d.OrgId == "001171" || d.OrgId == "001178"));
+            d.HandlerOrgId == "001171" || d.HandlerOrgId == "001178");
         if (step is not null)
         if (step is not null)
         {
         {
             step.FileJson = await _fileRepository.AddFileAsync(files, workflow.ExternalId, step.Id, cancellationToken);
             step.FileJson = await _fileRepository.AddFileAsync(files, workflow.ExternalId, step.Id, cancellationToken);

+ 2 - 1
src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs

@@ -180,7 +180,8 @@ public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
                 order.IsResolved = notification.External == null ? false : notification.External.IsResolved;
                 order.IsResolved = notification.External == null ? false : notification.External.IsResolved;
 
 
                 await _orderRepository.UpdateAsync(order, cancellationToken);
                 await _orderRepository.UpdateAsync(order, cancellationToken);
-                var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken);
+                //var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken); //由CallAccept改为OtherAccept
+                var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept == order.CallId, cancellationToken);
                 var orderFlowDto = new OrderFlowDto
                 var orderFlowDto = new OrderFlowDto
                 {
                 {
                     Order = _mapper.Map<OrderDto>(order),
                     Order = _mapper.Map<OrderDto>(order),

+ 2 - 1
src/Hotline.Application/Handlers/FlowEngine/WorkflowStartHandler.cs

@@ -94,7 +94,8 @@ namespace Hotline.Application.Handlers.FlowEngine
 
 
                     var publishCallRecordDto = new PublishCallRecrodDto() { };
                     var publishCallRecordDto = new PublishCallRecrodDto() { };
                     //查询通话记录
                     //查询通话记录
-                    var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken);
+                    //var callRecord = await _trCallRecordRepository.GetAsync(p => p.CallAccept == order.CallId, cancellationToken); //由CallAccept改为OtherAccept
+                    var callRecord = await _trCallRecordRepository.GetAsync(p => p.OtherAccept == order.CallId, cancellationToken);
                     if (callRecord != null)
                     if (callRecord != null)
                     {
                     {
                         publishCallRecordDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);
                         publishCallRecordDto.TrCallRecordDto = _mapper.Map<TrCallDto>(callRecord);

+ 1 - 1
src/Hotline.Application/Mappers/WorkflowMapperConfigs.cs

@@ -37,7 +37,7 @@ public class WorkflowMapperConfigs : IRegister
             //.Ignore(d => d.StepExpiredTime)
             //.Ignore(d => d.StepExpiredTime)
             .Ignore(d => d.Workflow)
             .Ignore(d => d.Workflow)
             .Ignore(d => d.WorkflowTrace)
             .Ignore(d => d.WorkflowTrace)
-            .IgnoreIf((d, s) => s.StepHandlers == null || !s.StepHandlers.Any(), d => d.StepHandlers)
+            //.IgnoreIf((d, s) => s.StepHandlers == null || !s.StepHandlers.Any(), d => d.StepHandlers)
             ;
             ;
 
 
         config.ForType<WorkflowStep, WorkflowTrace>()
         config.ForType<WorkflowStep, WorkflowTrace>()

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

@@ -24,7 +24,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         /// </summary>
         Task StartAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto, StepDefine firstStepDefine,
         Task StartAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto, StepDefine firstStepDefine,
             bool isNextDynamic, FlowAssignInfo flowAssignInfo, ECounterSignType? counterSignType, DateTime? expiredTime,
             bool isNextDynamic, FlowAssignInfo flowAssignInfo, ECounterSignType? counterSignType, DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers, ISessionContext current, CancellationToken cancellationToken);
+            ISessionContext current, CancellationToken cancellationToken);
 
 
         /// <summary>
         /// <summary>
         /// 查询工作流
         /// 查询工作流
@@ -49,22 +49,22 @@ namespace Hotline.FlowEngine.Workflows
         /// 办理(流转至下一节点)
         /// 办理(流转至下一节点)
         /// </summary>
         /// </summary>
         Task NextAsync(Workflow workflow, WorkflowStep currentStep, NextWorkflowDto dto, StepDefine nextStepDefine,
         Task NextAsync(Workflow workflow, WorkflowStep currentStep, NextWorkflowDto dto, StepDefine nextStepDefine,
-            bool isNextDynamic, FlowAssignInfo flowAssignInfo, DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers,
+            bool isNextDynamic, FlowAssignInfo flowAssignInfo, DateTime? expiredTime,
             ISessionContext current, CancellationToken cancellationToken);
             ISessionContext current, CancellationToken cancellationToken);
 
 
         /// <summary>
         /// <summary>
         /// 退回(返回前一节点)
         /// 退回(返回前一节点)
         /// </summary>
         /// </summary>
         /// <returns></returns>
         /// <returns></returns>
-        Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, 
-            string applicantId, string applicantOrgId, string[] applicantRoleIds, 
+        Task<EFlowDirection> PreviousAsync(Workflow workflow, PreviousWorkflowDto dto,
+            string applicantId, string applicantOrgId, string[] applicantRoleIds,
             ISessionContext current, CancellationToken cancellationToken);
             ISessionContext current, CancellationToken cancellationToken);
-        
+
         /// <summary>
         /// <summary>
         /// 撤回(返回到之前任意节点)
         /// 撤回(返回到之前任意节点)
         /// </summary>
         /// </summary>
         Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine, FlowAssignInfo flowAssignInfo,
         Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine, FlowAssignInfo flowAssignInfo,
-            List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime, ISessionContext current, CancellationToken cancellationToken);
+            DateTime? expiredTime, ISessionContext current, CancellationToken cancellationToken);
 
 
         /// <summary>
         /// <summary>
         /// 撤回至开始节点
         /// 撤回至开始节点
@@ -148,7 +148,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建开始节点
         /// 创建开始节点
         /// </summary>
         /// </summary>
         WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto,
         WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto,
-            FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime);
+            FlowStepHandler handler, DateTime? expiredTime);
 
 
         /// <summary>
         /// <summary>
         /// 查询未完成节点
         /// 查询未完成节点

+ 17 - 6
src/Hotline/FlowEngine/Workflows/StepBasicEntity.cs

@@ -30,10 +30,10 @@ public abstract class StepBasicEntity : CreationEntity
 
 
     #endregion
     #endregion
 
 
-	/// <summary>
-	/// 流程指派类型
-	/// </summary>
-	public EFlowAssignType? FlowAssignType { get; set; }
+    /// <summary>
+    /// 流程指派类型
+    /// </summary>
+    public EFlowAssignType? FlowAssignType { get; set; }
 
 
     /// <summary>
     /// <summary>
     /// 该节点指派办理对象(依据不同指派方式可能为:orgId或userId),该字段subStep才会存在,stepBox不存在
     /// 该节点指派办理对象(依据不同指派方式可能为:orgId或userId),该字段subStep才会存在,stepBox不存在
@@ -140,7 +140,7 @@ public abstract class StepBasicEntity : CreationEntity
     #endregion
     #endregion
 
 
     #endregion
     #endregion
-    
+
     #region 接办
     #region 接办
 
 
     /// <summary>
     /// <summary>
@@ -420,7 +420,7 @@ public abstract class StepBasicEntity : CreationEntity
     public void Assign(
     public void Assign(
         string? handlerId, string? handlerName,
         string? handlerId, string? handlerName,
         string? handlerOrgId, string? handlerOrgName,
         string? handlerOrgId, string? handlerOrgName,
-        string? roleId, string? roleName)
+        string? roleId = null, string? roleName = null)
     {
     {
         HandlerId = handlerId;
         HandlerId = handlerId;
         HandlerName = handlerName;
         HandlerName = handlerName;
@@ -435,6 +435,17 @@ public abstract class StepBasicEntity : CreationEntity
     /// </summary>
     /// </summary>
     public bool IsInCountersign() => CountersignPosition != ECountersignPosition.None;
     public bool IsInCountersign() => CountersignPosition != ECountersignPosition.None;
 
 
+    public Kv GetHandler()
+    {
+        return FlowAssignType switch
+        {
+            EFlowAssignType.Org => new Kv(HandlerOrgId, HandlerOrgName),
+            EFlowAssignType.User => new Kv(HandlerId, HandlerName),
+            EFlowAssignType.Role => new Kv(RoleId, RoleName),
+            _ => throw new ArgumentOutOfRangeException()
+        };
+    }
+
     #endregion
     #endregion
 }
 }
 
 

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

@@ -789,12 +789,12 @@ public partial class Workflow
     /// <summary>
     /// <summary>
     /// 更新受理人信息
     /// 更新受理人信息
     /// </summary>
     /// </summary>
-    public void UpdateAcceptor(string userId, string? userName, string? staffNo, string orgCode, string? orgName)
+    public void UpdateAcceptor(string userId, string? userName, string? staffNo, string orgId, string? orgName)
     {
     {
         AcceptorId = userId;
         AcceptorId = userId;
         AcceptorName = userName;
         AcceptorName = userName;
         AcceptorStaffNo = staffNo;
         AcceptorStaffNo = staffNo;
-        AcceptorOrgId = orgCode;
+        AcceptorOrgId = orgId;
         AcceptorOrgName = orgName;
         AcceptorOrgName = orgName;
     }
     }
 
 

+ 114 - 101
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -28,7 +28,7 @@ namespace Hotline.FlowEngine.Workflows
         private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
         private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
         private readonly IRepository<WorkflowSupplement> _workflowSupplementRepository;
         private readonly IRepository<WorkflowSupplement> _workflowSupplementRepository;
         private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
         private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
-        private readonly IRepository<WorkflowStepHandler> _workflowStepHandlerRepository;
+        //private readonly IRepository<WorkflowStepHandler> _workflowStepHandlerRepository;
         private readonly ISessionContext _sessionContext;
         private readonly ISessionContext _sessionContext;
         private readonly IMapper _mapper;
         private readonly IMapper _mapper;
         private readonly IMediator _mediator;
         private readonly IMediator _mediator;
@@ -42,7 +42,7 @@ namespace Hotline.FlowEngine.Workflows
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<WorkflowSupplement> workflowSupplementRepository,
             IRepository<WorkflowSupplement> workflowSupplementRepository,
             IRepository<WorkflowCountersign> workflowCountersignRepository,
             IRepository<WorkflowCountersign> workflowCountersignRepository,
-            IRepository<WorkflowStepHandler> workflowStepHandlerRepository,
+            //IRepository<WorkflowStepHandler> workflowStepHandlerRepository,
             ISessionContext sessionContext,
             ISessionContext sessionContext,
             IMapper mapper,
             IMapper mapper,
             IMediator mediator,
             IMediator mediator,
@@ -54,7 +54,7 @@ namespace Hotline.FlowEngine.Workflows
             _workflowTraceRepository = workflowTraceRepository;
             _workflowTraceRepository = workflowTraceRepository;
             _workflowSupplementRepository = workflowSupplementRepository;
             _workflowSupplementRepository = workflowSupplementRepository;
             _workflowCountersignRepository = workflowCountersignRepository;
             _workflowCountersignRepository = workflowCountersignRepository;
-            _workflowStepHandlerRepository = workflowStepHandlerRepository;
+            //_workflowStepHandlerRepository = workflowStepHandlerRepository;
             _sessionContext = sessionContext;
             _sessionContext = sessionContext;
             _mapper = mapper;
             _mapper = mapper;
             _mediator = mediator;
             _mediator = mediator;
@@ -95,7 +95,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         /// </summary>
         public async Task StartAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto,
         public async Task StartAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto,
             StepDefine firstStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
             StepDefine firstStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
-            ECounterSignType? counterSignType, DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers,
+            ECounterSignType? counterSignType, DateTime? expiredTime,
             ISessionContext current, CancellationToken cancellationToken)
             ISessionContext current, CancellationToken cancellationToken)
         {
         {
             //1. 创建first节点 (和trace)2.办理开始节点 
             //1. 创建first节点 (和trace)2.办理开始节点 
@@ -115,7 +115,7 @@ namespace Hotline.FlowEngine.Workflows
 
 
             //firststeps
             //firststeps
             var firstSteps = await CreateNextStepsAsync(workflow, startStep, dto, firstStepDefine,
             var firstSteps = await CreateNextStepsAsync(workflow, startStep, dto, firstStepDefine,
-                isNextDynamic, flowAssignInfo, expiredTime, stepHandlers, dto.IsStartCountersign, cancellationToken);
+                isNextDynamic, flowAssignInfo, expiredTime, dto.IsStartCountersign, cancellationToken);
             if (firstSteps.Any())
             if (firstSteps.Any())
                 workflow.Steps.AddRange(firstSteps);
                 workflow.Steps.AddRange(firstSteps);
 
 
@@ -187,7 +187,7 @@ namespace Hotline.FlowEngine.Workflows
             if (withCountersigns)
             if (withCountersigns)
                 query = query.Includes(d => d.Countersigns, x => x.Members);
                 query = query.Includes(d => d.Countersigns, x => x.Members);
             if (withSteps)
             if (withSteps)
-                query = query.Includes(d => d.Steps, x => x.StepHandlers);
+                query = query.Includes(d => d.Steps);
             //if (withTraces)
             //if (withTraces)
             //    query = query.Includes(d => d.Traces);
             //    query = query.Includes(d => d.Traces);
 
 
@@ -308,8 +308,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         /// </summary>
         public async Task NextAsync(Workflow workflow, WorkflowStep currentStep, NextWorkflowDto dto,
         public async Task NextAsync(Workflow workflow, WorkflowStep currentStep, NextWorkflowDto dto,
             StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
             StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
-            DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers, ISessionContext current,
-            CancellationToken cancellationToken)
+            DateTime? expiredTime, ISessionContext current, CancellationToken cancellationToken)
         {
         {
             ValidatePermission(workflow, current.RequiredOrgId, current.RequiredUserId, current.Roles);
             ValidatePermission(workflow, current.RequiredOrgId, current.RequiredUserId, current.Roles);
             //CheckWhetherRunnable(workflow.Status);
             //CheckWhetherRunnable(workflow.Status);
@@ -422,10 +421,10 @@ namespace Hotline.FlowEngine.Workflows
                     .ExecuteCommandAsync();
                     .ExecuteCommandAsync();
             }
             }
 
 
-            //await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
-            await _workflowStepRepository.UpdateNav(updateSteps)
-                .Include(d => d.StepHandlers)
-                .ExecuteCommandAsync();
+            await _workflowStepRepository.UpdateRangeAsync(updateSteps, cancellationToken);
+            //await _workflowStepRepository.UpdateNav(updateSteps)
+            //    .Include(d => d.StepHandlers)
+            //    .ExecuteCommandAsync();
 
 
             await NextTraceAsync(workflow, dto, currentStep, cancellationToken);
             await NextTraceAsync(workflow, dto, currentStep, cancellationToken);
 
 
@@ -461,7 +460,7 @@ namespace Hotline.FlowEngine.Workflows
 
 
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
             var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
             var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
-                nextStepDefine, isNextDynamic, flowAssignInfo, expiredTime, stepHandlers, isStartCountersign,
+                nextStepDefine, isNextDynamic, flowAssignInfo, expiredTime, isStartCountersign,
                 cancellationToken);
                 cancellationToken);
 
 
             ////赋值当前节点的下级办理节点
             ////赋值当前节点的下级办理节点
@@ -659,7 +658,7 @@ namespace Hotline.FlowEngine.Workflows
             var steps = await _workflowStepRepository.Queryable()
             var steps = await _workflowStepRepository.Queryable()
                 .Includes(d => d.Workflow)
                 .Includes(d => d.Workflow)
                 .Includes(d => d.WorkflowTrace)
                 .Includes(d => d.WorkflowTrace)
-                .Includes(d => d.StepHandlers)
+                //.Includes(d => d.StepHandlers)
                 .Where(d => stepsIds.Contains(d.Id))
                 .Where(d => stepsIds.Contains(d.Id))
                 .ToListAsync(cancellationToken);
                 .ToListAsync(cancellationToken);
             foreach (var handler in handlers)
             foreach (var handler in handlers)
@@ -674,10 +673,10 @@ namespace Hotline.FlowEngine.Workflows
                 var thisSteps = steps.Where(d => handler.stepIds.Contains(d.Id)).ToList();
                 var thisSteps = steps.Where(d => handler.stepIds.Contains(d.Id)).ToList();
                 foreach (var thisStep in thisSteps)
                 foreach (var thisStep in thisSteps)
                 {
                 {
-                    var stepHandler = WorkflowStepHandler.Create(thisStep.Workflow.Id, thisStep.Workflow.ExternalId,
-                        thisStep.FlowAssignType ?? EFlowAssignType.User, handler.userId, handler.username, handler.orgId, handler.orgName);
-                    thisStep.StepHandlers.Clear();
-                    thisStep.StepHandlers.Add(stepHandler);
+                    //var stepHandler = WorkflowStepHandler.Create(thisStep.Workflow.Id, thisStep.Workflow.ExternalId,
+                    //    thisStep.FlowAssignType ?? EFlowAssignType.User, handler.userId, handler.username, handler.orgId, handler.orgName);
+                    //thisStep.StepHandlers.Clear();
+                    //thisStep.StepHandlers.Add(stepHandler);
 
 
                     thisStep.Handlers = thisHandlers;
                     thisStep.Handlers = thisHandlers;
 
 
@@ -700,7 +699,7 @@ namespace Hotline.FlowEngine.Workflows
             await _workflowStepRepository.UpdateNav(steps)
             await _workflowStepRepository.UpdateNav(steps)
                 .Include(d => d.WorkflowTrace)
                 .Include(d => d.WorkflowTrace)
                 .Include(d => d.Workflow)
                 .Include(d => d.Workflow)
-                .Include(d => d.StepHandlers)
+                //.Include(d => d.StepHandlers)
                 .ExecuteCommandAsync();
                 .ExecuteCommandAsync();
 
 
             return steps.Select(d => d.WorkflowId).ToList();
             return steps.Select(d => d.WorkflowId).ToList();
@@ -711,20 +710,33 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         /// </summary>
         public async Task<ICollection<Kv>> GetLevelOneOrgsAsync(string workflowId, CancellationToken cancellation)
         public async Task<ICollection<Kv>> GetLevelOneOrgsAsync(string workflowId, CancellationToken cancellation)
         {
         {
-            var handlers = await _workflowStepHandlerRepository.Queryable()
-                .InnerJoin<WorkflowTrace>((wsh, wt) => wsh.WorkflowStepId == wt.StepId)
-                .LeftJoin<SystemOrganize>((wsh, wt, o) => wsh.OrgId == o.Id)
-                .Where((wsh, wt, o) => wsh.WorkflowId == workflowId &&
-                                    //wt.BusinessType == EBusinessType.Department &&
-                                    //wt.HandlerType == EHandlerType.OrgLevel &&
-                                    !string.IsNullOrEmpty(wsh.OrgId) &&
-                                    o.Level == 1)
-                .ToListAsync(cancellation);
+            var traces = await _workflowTraceRepository.Queryable()
+                 .LeftJoin<SystemOrganize>((t, o) => t.HandlerOrgId == o.Id)
+                 .Where((t, o) => t.WorkflowId == workflowId &&
+                                  !string.IsNullOrEmpty(t.HandlerOrgId) &&
+                                  o.Level == 1)
+                 .ToListAsync(cancellation);
+
+            //var handlers = await _workflowStepHandlerRepository.Queryable()
+            //    .InnerJoin<WorkflowTrace>((wsh, wt) => wsh.WorkflowStepId == wt.StepId)
+            //    .LeftJoin<SystemOrganize>((wsh, wt, o) => wsh.OrgId == o.Id)
+            //    .Where((wsh, wt, o) => wsh.WorkflowId == workflowId &&
+            //                        //wt.BusinessType == EBusinessType.Department &&
+            //                        //wt.HandlerType == EHandlerType.OrgLevel &&
+            //                        !string.IsNullOrEmpty(wsh.OrgId) &&
+            //                        o.Level == 1)
+            //    .ToListAsync(cancellation);
+
+            //var orgs = handlers.Select(d => new Kv(d.OrgId, d.OrgName))
+            //    .DistinctBy(d => d.Key)
+            //    .ToList();
 
 
-            var orgs = handlers.Select(d => new Kv(d.OrgId, d.OrgName))
-                .DistinctBy(d => d.Key)
+            var orgs = traces
+                .DistinctBy(d => d.HandlerOrgId)
+                .Select(d => new Kv(d.HandlerOrgId, d.HandlerOrgName))
                 .ToList();
                 .ToList();
 
 
+
             return orgs;
             return orgs;
             //var workflow = await GetWorkflowAsync(workflowId, withSteps: true, cancellationToken: cancellation);
             //var workflow = await GetWorkflowAsync(workflowId, withSteps: true, cancellationToken: cancellation);
             //var list = workflow.Steps.Distinct().Where(d => d.BusinessType == EBusinessType.Department &&
             //var list = workflow.Steps.Distinct().Where(d => d.BusinessType == EBusinessType.Department &&
@@ -764,7 +776,8 @@ namespace Hotline.FlowEngine.Workflows
         public async Task<WorkflowStep> FindLastHandleStepAsync(string workflowId, string orgId, CancellationToken cancellation)
         public async Task<WorkflowStep> FindLastHandleStepAsync(string workflowId, string orgId, CancellationToken cancellation)
         {
         {
             return await _workflowStepRepository.Queryable()
             return await _workflowStepRepository.Queryable()
-                .Where(d => d.StepHandlers.Any(sh => sh.OrgId == orgId) && d.WorkflowId == workflowId)
+                .Where(d => d.WorkflowId == workflowId && d.HandlerOrgId == orgId)
+                //.Where(d => d.StepHandlers.Any(sh => sh.OrgId == orgId) && d.WorkflowId == workflowId)
                 .OrderByDescending(d => d.HandleTime)
                 .OrderByDescending(d => d.HandleTime)
                 .FirstAsync(cancellation);
                 .FirstAsync(cancellation);
         }
         }
@@ -808,7 +821,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         /// </summary>
         public async Task<Workflow> SignToSomebodyAsync(string workflowId, string userId, string username, string orgId, string orgName, CancellationToken cancellationToken)
         public async Task<Workflow> SignToSomebodyAsync(string workflowId, string userId, string username, string orgId, string orgName, CancellationToken cancellationToken)
         {
         {
-            var workflow = await GetWorkflowAsync(workflowId, withSteps: true, cancellationToken: cancellationToken);
+            var workflow = await GetWorkflowAsync(workflowId, withSteps: true, withTraces: true, cancellationToken: cancellationToken);
             workflow.Assign(EFlowAssignType.User, _sessionContext.RequiredUserId);
             workflow.Assign(EFlowAssignType.User, _sessionContext.RequiredUserId);
 
 
             workflow.HandlerOrgs = new();
             workflow.HandlerOrgs = new();
@@ -830,15 +843,22 @@ namespace Hotline.FlowEngine.Workflows
             startStep.AcceptorOrgId = orgId;
             startStep.AcceptorOrgId = orgId;
             startStep.AcceptorOrgName = orgName;
             startStep.AcceptorOrgName = orgName;
 
 
-            var stepHandler = startStep.StepHandlers.First();
-            startStep.StepHandlers.RemoveAll(d => d.Id != stepHandler.Id);
-            stepHandler.UserId = userId;
-            stepHandler.Username = username;
-            stepHandler.OrgId = orgId;
-            stepHandler.OrgName = orgName;
+            startStep.FlowAssignType = EFlowAssignType.User;
+            startStep.Assign(userId,username,orgId,orgName);
+
+            //var stepHandler = startStep.StepHandlers.First();
+            //startStep.StepHandlers.RemoveAll(d => d.Id != stepHandler.Id);
+            //stepHandler.UserId = userId;
+            //stepHandler.Username = username;
+            //stepHandler.OrgId = orgId;
+            //stepHandler.OrgName = orgName;
+
+            startStep.WorkflowTrace = workflow.Traces.First(d => d.Id == startStep.Id);
+            _mapper.Map(startStep, startStep.WorkflowTrace);
 
 
             await _workflowStepRepository.UpdateNav(startStep)
             await _workflowStepRepository.UpdateNav(startStep)
-                .Include(d => d.StepHandlers)
+                //.Include(d => d.StepHandlers)
+                .Include(d => d.WorkflowTrace)
                 .ExecuteCommandAsync();
                 .ExecuteCommandAsync();
 
 
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
@@ -870,7 +890,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 撤回(返回到之前任意节点)
         /// 撤回(返回到之前任意节点)
         /// </summary>
         /// </summary>
         public async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
         public async Task RecallAsync(Workflow workflow, RecallDto dto, StepDefine targetStepDefine,
-            FlowAssignInfo flowAssignInfo, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime,
+            FlowAssignInfo flowAssignInfo, DateTime? expiredTime,
             ISessionContext current, CancellationToken cancellationToken)
             ISessionContext current, CancellationToken cancellationToken)
         {
         {
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
             var targetStep = workflow.Steps.FirstOrDefault(d => d.Code == dto.NextStepCode && d.IsOrigin);
@@ -881,7 +901,7 @@ namespace Hotline.FlowEngine.Workflows
             await RecallTraceAsync(workflow.Id, dto.Opinion, current, cancellationToken);
             await RecallTraceAsync(workflow.Id, dto.Opinion, current, cancellationToken);
 
 
             var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
             var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
-                EWorkflowTraceType.Recall, stepHandlers, expiredTime, cancellationToken);
+                EWorkflowTraceType.Recall, expiredTime, cancellationToken);
 
 
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
 
@@ -1211,7 +1231,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建开始节点
         /// 创建开始节点
         /// </summary>
         /// </summary>
         public WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine,
         public WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine,
-            BasicWorkflowDto dto, FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime)
+            BasicWorkflowDto dto, FlowStepHandler handler, DateTime? expiredTime)
         {
         {
             //startstep
             //startstep
             var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
             var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
@@ -1226,7 +1246,7 @@ namespace Hotline.FlowEngine.Workflows
             _mapper.Map(workflow, startStep);
             _mapper.Map(workflow, startStep);
             startStep.FlowAssignType = EFlowAssignType.User;
             startStep.FlowAssignType = EFlowAssignType.User;
             startStep.Handlers = new List<Kv> { new(handler.Key, handler.Value) };
             startStep.Handlers = new List<Kv> { new(handler.Key, handler.Value) };
-            startStep.StepHandlers = stepHandlers;
+            //startStep.StepHandlers = stepHandlers;
             startStep.NextSteps = nextSteps;
             startStep.NextSteps = nextSteps;
             startStep.IsMain = true;
             startStep.IsMain = true;
             startStep.IsOrigin = true;
             startStep.IsOrigin = true;
@@ -1255,14 +1275,14 @@ namespace Hotline.FlowEngine.Workflows
             StepDefine endStepDefine, WorkflowStep currentStep, ISessionContext current,
             StepDefine endStepDefine, WorkflowStep currentStep, ISessionContext current,
             CancellationToken cancellationToken)
             CancellationToken cancellationToken)
         {
         {
-            var endStepHandles = new List<WorkflowStepHandler>
-            {
-                WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId, EFlowAssignType.User,
-                    current.RequiredUserId, current.UserName, current.RequiredOrgId, current.OrgName)
-            };
+            //var endStepHandles = new List<WorkflowStepHandler>
+            //{
+            //    WorkflowStepHandler.Create(workflow.Id, workflow.ExternalId, EFlowAssignType.User,
+            //        current.RequiredUserId, current.UserName, current.RequiredOrgId, current.OrgName)
+            //};
 
 
             //create endStep
             //create endStep
-            var endStep = await CreateEndStepAsync(current, workflow, endStepDefine, currentStep, endStepHandles, cancellationToken);
+            var endStep = await CreateEndStepAsync(current, workflow, endStepDefine, currentStep, cancellationToken);
             workflow.Steps.Add(endStep);
             workflow.Steps.Add(endStep);
 
 
             //update endTrace
             //update endTrace
@@ -1363,14 +1383,14 @@ namespace Hotline.FlowEngine.Workflows
         }
         }
 
 
         private async Task<WorkflowStep> CreateStartStepAsync(Workflow workflow, StepDefine startStepDefine,
         private async Task<WorkflowStep> CreateStartStepAsync(Workflow workflow, StepDefine startStepDefine,
-            BasicWorkflowDto dto, FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, EWorkflowTraceType traceType,
+            BasicWorkflowDto dto, FlowStepHandler handler, EWorkflowTraceType traceType,
             DateTime? expiredTime, CancellationToken cancellationToken)
             DateTime? expiredTime, CancellationToken cancellationToken)
         {
         {
-            var startStep = CreateStartStep(workflow, startStepDefine, dto, handler, stepHandlers, expiredTime);
-            //await _workflowStepRepository.AddAsync(startStep, cancellationToken);
-            await _workflowStepRepository.AddNav(startStep)
-                .Include(d => d.StepHandlers)
-                .ExecuteCommandAsync();
+            var startStep = CreateStartStep(workflow, startStepDefine, dto, handler, expiredTime);
+            await _workflowStepRepository.AddAsync(startStep, cancellationToken);
+            //await _workflowStepRepository.AddNav(startStep)
+            //    .Include(d => d.StepHandlers)
+            //    .ExecuteCommandAsync();
             await CreateTraceAsync(workflow, startStep, traceType, cancellationToken);
             await CreateTraceAsync(workflow, startStep, traceType, cancellationToken);
             return startStep;
             return startStep;
         }
         }
@@ -1394,7 +1414,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         /// </summary>
         private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
         private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
             BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
             BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
-            DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers, bool isStartCountersign,
+            DateTime? expiredTime, bool isStartCountersign,
             CancellationToken cancellationToken)
             CancellationToken cancellationToken)
         {
         {
             List<WorkflowStep> nextSteps = new();
             List<WorkflowStep> nextSteps = new();
@@ -1410,13 +1430,13 @@ namespace Hotline.FlowEngine.Workflows
                         {
                         {
                             //依据会签策略创建会签下一级节点
                             //依据会签策略创建会签下一级节点
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
+                                flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign, cancellationToken);
                         }
                         }
                         else
                         else
                         {
                         {
                             //创建普通节点(根据配置)
                             //创建普通节点(根据配置)
                             nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
                             nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                flowAssignInfo, EWorkflowTraceType.Normal, expiredTime, stepHandlers, cancellationToken);
+                                flowAssignInfo, EWorkflowTraceType.Normal, expiredTime, cancellationToken);
                         }
                         }
                     }
                     }
                     else
                     else
@@ -1428,14 +1448,13 @@ namespace Hotline.FlowEngine.Workflows
                             if (csStartStep is null)
                             if (csStartStep is null)
                                 throw new UserFriendlyException("未查询到会签节点");
                                 throw new UserFriendlyException("未查询到会签节点");
 
 
-                            nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, stepHandlers,
-                                expiredTime, cancellationToken);
+                            nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, expiredTime, cancellationToken);
                         }
                         }
                         else
                         else
                         {
                         {
                             //依据会签策略创建会签下一级节点
                             //依据会签策略创建会签下一级节点
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
+                                flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign, cancellationToken);
                         }
                         }
                     }
                     }
                 }
                 }
@@ -1444,14 +1463,14 @@ namespace Hotline.FlowEngine.Workflows
                     if (dto.BackToCountersignEnd)
                     if (dto.BackToCountersignEnd)
                     {
                     {
                         // check if cs all complete, create next
                         // check if cs all complete, create next
-                        nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, currentStep, dto, stepHandlers,
+                        nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, currentStep, dto,
                             expiredTime, cancellationToken);
                             expiredTime, cancellationToken);
                     }
                     }
                     else
                     else
                     {
                     {
                         //依据会签策略创建会签下一级节点
                         //依据会签策略创建会签下一级节点
                         nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
                         nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                            flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
+                            flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign, cancellationToken);
                     }
                     }
                 }
                 }
             }
             }
@@ -1459,19 +1478,19 @@ namespace Hotline.FlowEngine.Workflows
             {
             {
                 //依据会签策略创建会签下一级节点
                 //依据会签策略创建会签下一级节点
                 nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
                 nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                    flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
+                    flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign, cancellationToken);
             }
             }
             else if (isNextDynamic)
             else if (isNextDynamic)
             {
             {
                 //创建动态下一级节点
                 //创建动态下一级节点
                 nextSteps = await CreateDynamicStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
                 nextSteps = await CreateDynamicStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
-                    expiredTime, stepHandlers, cancellationToken);
+                    expiredTime, cancellationToken);
             }
             }
             else
             else
             {
             {
                 //创建普通节点(根据配置)
                 //创建普通节点(根据配置)
                 nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
                 nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
-                    EWorkflowTraceType.Normal, expiredTime, stepHandlers, cancellationToken);
+                    EWorkflowTraceType.Normal, expiredTime, cancellationToken);
             }
             }
 
 
             return nextSteps;
             return nextSteps;
@@ -1484,7 +1503,6 @@ namespace Hotline.FlowEngine.Workflows
             BasicWorkflowDto dto,
             BasicWorkflowDto dto,
             FlowAssignInfo flowAssignInfo,
             FlowAssignInfo flowAssignInfo,
             DateTime? expiredTime,
             DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers,
             CancellationToken cancellationToken)
             CancellationToken cancellationToken)
         {
         {
             var handlerType = nextStepDefine.InstancePolicy switch
             var handlerType = nextStepDefine.InstancePolicy switch
@@ -1498,7 +1516,7 @@ namespace Hotline.FlowEngine.Workflows
             };
             };
 
 
             return await CreateStepsAsync(workflow, nextStepDefine, prevStep, dto,
             return await CreateStepsAsync(workflow, nextStepDefine, prevStep, dto,
-                flowAssignInfo.FlowAssignType, dto.NextHandlers, stepHandlers, null, EWorkflowStepStatus.WaitForAccept,
+                flowAssignInfo.FlowAssignType, dto.NextHandlers, null, EWorkflowStepStatus.WaitForAccept,
                 ECountersignPosition.None, false, EWorkflowTraceType.Normal, handlerType, expiredTime,
                 ECountersignPosition.None, false, EWorkflowTraceType.Normal, handlerType, expiredTime,
                 cancellationToken: cancellationToken);
                 cancellationToken: cancellationToken);
         }
         }
@@ -1510,7 +1528,6 @@ namespace Hotline.FlowEngine.Workflows
             BasicWorkflowDto dto,
             BasicWorkflowDto dto,
             EFlowAssignType flowAssignType,
             EFlowAssignType flowAssignType,
             DateTime? expiredTime,
             DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers,
             bool isStartCountersign,
             bool isStartCountersign,
             CancellationToken cancellationToken = default
             CancellationToken cancellationToken = default
         )
         )
@@ -1533,7 +1550,7 @@ namespace Hotline.FlowEngine.Workflows
                 : ECountersignPosition.Single;
                 : ECountersignPosition.Single;
 
 
             return CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignType, dto.NextHandlers,
             return CreateStepsAsync(workflow, stepDefine, prevStep, dto, flowAssignType, dto.NextHandlers,
-                stepHandlers, countersignId, EWorkflowStepStatus.WaitForAccept, nextStepCountersignPosition,
+                countersignId, EWorkflowStepStatus.WaitForAccept, nextStepCountersignPosition,
                 false, EWorkflowTraceType.Normal, handlerType, expiredTime, cancellationToken: cancellationToken);
                 false, EWorkflowTraceType.Normal, handlerType, expiredTime, cancellationToken: cancellationToken);
         }
         }
 
 
@@ -1541,7 +1558,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 根据传入节点的上一节点创建会签汇总节点(汇总传入节点的前一节点)
         /// 根据传入节点的上一节点创建会签汇总节点(汇总传入节点的前一节点)
         /// </summary>
         /// </summary>
         private async Task<List<WorkflowStep>> CreateCsEndStepsByTargetPrevAsync(Workflow workflow, WorkflowStep step,
         private async Task<List<WorkflowStep>> CreateCsEndStepsByTargetPrevAsync(Workflow workflow, WorkflowStep step,
-            BasicWorkflowDto dto, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime, CancellationToken cancellationToken)
+            BasicWorkflowDto dto, DateTime? expiredTime, CancellationToken cancellationToken)
         {
         {
             var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == step.PrevStepId);
             var countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == step.PrevStepId);
             if (countersignStartStep is null)
             if (countersignStartStep is null)
@@ -1554,7 +1571,7 @@ namespace Hotline.FlowEngine.Workflows
             {
             {
                 // 创建会签汇总节点
                 // 创建会签汇总节点
                 var countersignEndStep =
                 var countersignEndStep =
-                    await CreateCountersignEndStepAsync(countersignStartStep, dto, stepHandlers, expiredTime, cancellationToken);
+                    await CreateCountersignEndStepAsync(countersignStartStep, dto, expiredTime, cancellationToken);
                 nextSteps = new List<WorkflowStep> { countersignEndStep };
                 nextSteps = new List<WorkflowStep> { countersignEndStep };
 
 
                 //create trace
                 //create trace
@@ -1567,7 +1584,7 @@ namespace Hotline.FlowEngine.Workflows
         }
         }
 
 
         private async Task<WorkflowStep> CreateCountersignEndStepAsync(WorkflowStep countersignStartStep,
         private async Task<WorkflowStep> CreateCountersignEndStepAsync(WorkflowStep countersignStartStep,
-            BasicWorkflowDto dto, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime,
+            BasicWorkflowDto dto, DateTime? expiredTime,
             CancellationToken cancellationToken = default)
             CancellationToken cancellationToken = default)
         {
         {
             var csEndStep = _mapper.Map<WorkflowStep>(countersignStartStep);
             var csEndStep = _mapper.Map<WorkflowStep>(countersignStartStep);
@@ -1587,15 +1604,15 @@ namespace Hotline.FlowEngine.Workflows
             csEndStep.Handlers = countersignStartStep.Handlers
             csEndStep.Handlers = countersignStartStep.Handlers
                 .Where(d => d.Key == countersignStartStep.HandlerId || d.Key == countersignStartStep.HandlerOrgId)
                 .Where(d => d.Key == countersignStartStep.HandlerId || d.Key == countersignStartStep.HandlerOrgId)
                 .ToList();
                 .ToList();
-            csEndStep.StepHandlers = stepHandlers;
+            //csEndStep.StepHandlers = stepHandlers;
 
 
             csEndStep.Reset();
             csEndStep.Reset();
             csEndStep.ResetParameters();
             csEndStep.ResetParameters();
 
 
-            //await _workflowStepRepository.AddAsync(csEndStep, cancellationToken);
-            await _workflowStepRepository.AddNav(csEndStep)
-                .Include(d => d.StepHandlers)
-                .ExecuteCommandAsync();
+            await _workflowStepRepository.AddAsync(csEndStep, cancellationToken);
+            //await _workflowStepRepository.AddNav(csEndStep)
+            //    .Include(d => d.StepHandlers)
+            //    .ExecuteCommandAsync();
             return csEndStep;
             return csEndStep;
         }
         }
 
 
@@ -1627,9 +1644,9 @@ namespace Hotline.FlowEngine.Workflows
                  current.OrgAreaCode, current.OrgAreaName,
                  current.OrgAreaCode, current.OrgAreaName,
                  current.OrgIsCenter, opinion, nextStepCode);
                  current.OrgIsCenter, opinion, nextStepCode);
 
 
-            var handler = step.FindActualHandler(current.Roles, current.RequiredUserId, current.RequiredOrgId);
-            if (handler is not null)
-                handler.IsActualHandler = true;
+            //var handler = step.FindActualHandler(current.Roles, current.RequiredUserId, current.RequiredOrgId);
+            //if (handler is not null)
+            //    handler.IsActualHandler = true;
         }
         }
 
 
 
 
@@ -1720,14 +1737,14 @@ namespace Hotline.FlowEngine.Workflows
             newStep.IsOrigin = step.IsOrigin;
             newStep.IsOrigin = step.IsOrigin;
             //newStep.ParentId = step.ParentId;
             //newStep.ParentId = step.ParentId;
             newStep.Handlers = step.Handlers;
             newStep.Handlers = step.Handlers;
-            newStep.StepHandlers = _mapper.Map<List<WorkflowStepHandler>>(step.StepHandlers);
+            //newStep.StepHandlers = _mapper.Map<List<WorkflowStepHandler>>(step.StepHandlers);
             newStep.StartCountersignId = step.StartCountersignId;
             newStep.StartCountersignId = step.StartCountersignId;
             newStep.CountersignId = step.CountersignId;
             newStep.CountersignId = step.CountersignId;
             newStep.IsStartedCountersignEnd = step.IsStartedCountersignEnd;
             newStep.IsStartedCountersignEnd = step.IsStartedCountersignEnd;
-            //await _workflowStepRepository.AddAsync(newStep, cancellationToken);
-            await _workflowStepRepository.AddNav(newStep)
-                .Include(d => d.StepHandlers)
-                .ExecuteCommandAsync();
+            await _workflowStepRepository.AddAsync(newStep, cancellationToken);
+            //await _workflowStepRepository.AddNav(newStep)
+            //    .Include(d => d.StepHandlers)
+            //    .ExecuteCommandAsync();
 
 
             await CreateTraceAsync(workflow, newStep, traceType, cancellationToken);
             await CreateTraceAsync(workflow, newStep, traceType, cancellationToken);
 
 
@@ -1910,7 +1927,7 @@ namespace Hotline.FlowEngine.Workflows
 
 
         private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
         private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
             StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
             StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
-            List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime, CancellationToken cancellationToken)
+            DateTime? expiredTime, CancellationToken cancellationToken)
         {
         {
             var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
             var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
 
 
@@ -1941,9 +1958,9 @@ namespace Hotline.FlowEngine.Workflows
 
 
             var targetStepNew = targetIsStartStep
             var targetStepNew = targetIsStartStep
                 ? await CreateStartStepAsync(workflow, targetStepDefine, dto,
                 ? await CreateStartStepAsync(workflow, targetStepDefine, dto,
-                    dto.NextHandlers.First(), stepHandlers, traceType, expiredTime, cancellationToken)
+                    dto.NextHandlers.First(), traceType, expiredTime, cancellationToken)
                 : (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
                 : (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
-                    flowAssignInfo.FlowAssignType, dto.NextHandlers, stepHandlers,
+                    flowAssignInfo.FlowAssignType, dto.NextHandlers,
                     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
                     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
                     null, expiredTime, cancellationToken: cancellationToken)).First();
                     null, expiredTime, cancellationToken: cancellationToken)).First();
 
 
@@ -1997,7 +2014,6 @@ namespace Hotline.FlowEngine.Workflows
             Workflow workflow,
             Workflow workflow,
             StepDefine endStepDefine,
             StepDefine endStepDefine,
             WorkflowStep prevStep,
             WorkflowStep prevStep,
-            List<WorkflowStepHandler> stepHandlers,
             CancellationToken cancellationToken)
             CancellationToken cancellationToken)
         {
         {
             if (workflow.Steps.Any(d => d.StepType == EStepType.End))
             if (workflow.Steps.Any(d => d.StepType == EStepType.End))
@@ -2014,7 +2030,7 @@ namespace Hotline.FlowEngine.Workflows
             };
             };
 
 
             var step = CreateStep(workflow, endStepDefine, prevStep, null, handler,
             var step = CreateStep(workflow, endStepDefine, prevStep, null, handler,
-                stepHandlers, null, null, EWorkflowStepStatus.WaitForAccept,
+                 null, null, EWorkflowStepStatus.WaitForAccept,
                 ECountersignPosition.None, DateTime.Now, endStepDefine.Name, true);
                 ECountersignPosition.None, DateTime.Now, endStepDefine.Name, true);
 
 
             //step.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName,
             //step.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName,
@@ -2039,7 +2055,6 @@ namespace Hotline.FlowEngine.Workflows
             FlowAssignInfo flowAssignInfo,
             FlowAssignInfo flowAssignInfo,
             EWorkflowTraceType traceType,
             EWorkflowTraceType traceType,
             DateTime? expiredTime,
             DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers,
             CancellationToken cancellationToken)
             CancellationToken cancellationToken)
         {
         {
             //List<Kv> handlers;
             //List<Kv> handlers;
@@ -2067,7 +2082,7 @@ namespace Hotline.FlowEngine.Workflows
             //}
             //}
 
 
             return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, /*dto.IsStartCountersign,*/
             return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, /*dto.IsStartCountersign,*/
-                flowAssignInfo.FlowAssignType, handlers, stepHandlers, null,
+                flowAssignInfo.FlowAssignType, handlers, null,
                 EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
                 EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
                 true, traceType, null, expiredTime, cancellationToken);
                 true, traceType, null, expiredTime, cancellationToken);
         }
         }
@@ -2080,7 +2095,6 @@ namespace Hotline.FlowEngine.Workflows
             //bool isStartCountersign,
             //bool isStartCountersign,
             EFlowAssignType? flowAssignType,
             EFlowAssignType? flowAssignType,
             List<FlowStepHandler> handlers,
             List<FlowStepHandler> handlers,
-            List<WorkflowStepHandler> stepHandlers,
             string? countersignId,
             string? countersignId,
             EWorkflowStepStatus stepStatus,
             EWorkflowStepStatus stepStatus,
             ECountersignPosition csPosition,
             ECountersignPosition csPosition,
@@ -2099,7 +2113,7 @@ namespace Hotline.FlowEngine.Workflows
             {
             {
                 var isMain = handlers.Count == 1 || (handlers.Count > 1 && handler.Key == dto.NextMainHandler);
                 var isMain = handlers.Count == 1 || (handlers.Count > 1 && handler.Key == dto.NextMainHandler);
                 var step = CreateStep(workflow, stepDefine, prevStep, flowAssignType,
                 var step = CreateStep(workflow, stepDefine, prevStep, flowAssignType,
-                    handler, stepHandlers, dto.NextStepCode, countersignId, stepStatus, csPosition, expiredTime,
+                    handler, dto.NextStepCode, countersignId, stepStatus, csPosition, expiredTime,
                     dto.NextStepName, isOrigin, isMain, handlerType, dto.BusinessType);
                     dto.NextStepName, isOrigin, isMain, handlerType, dto.BusinessType);
 
 
                 //var stepHandler = stepHandlers.First(d => d.GetHandler().Key == handler.Key);
                 //var stepHandler = stepHandlers.First(d => d.GetHandler().Key == handler.Key);
@@ -2117,10 +2131,10 @@ namespace Hotline.FlowEngine.Workflows
             //    steps.Add(step);
             //    steps.Add(step);
             //}
             //}
 
 
-            //await _workflowStepRepository.AddRangeAsync(steps, cancellationToken);
-            await _workflowStepRepository.AddNav(steps)
-                .Include(d => d.StepHandlers)
-                .ExecuteCommandAsync();
+            await _workflowStepRepository.AddRangeAsync(steps, cancellationToken);
+            //await _workflowStepRepository.AddNav(steps)
+            //    .Include(d => d.StepHandlers)
+            //    .ExecuteCommandAsync();
 
 
             //create traces todo add range traces
             //create traces todo add range traces
             foreach (var step in steps)
             foreach (var step in steps)
@@ -2374,7 +2388,6 @@ namespace Hotline.FlowEngine.Workflows
             WorkflowStep prevStep,
             WorkflowStep prevStep,
             EFlowAssignType? flowAssignType,
             EFlowAssignType? flowAssignType,
             FlowStepHandler handler,
             FlowStepHandler handler,
-            List<WorkflowStepHandler> stepHandlers,
             string nextStepCode,
             string nextStepCode,
             string? countersignId,
             string? countersignId,
             EWorkflowStepStatus stepStatus,
             EWorkflowStepStatus stepStatus,
@@ -2397,7 +2410,7 @@ namespace Hotline.FlowEngine.Workflows
 
 
             step.FlowAssignType = flowAssignType;
             step.FlowAssignType = flowAssignType;
             step.Handlers = new List<Kv> { new(handler.Key, handler.Value) };
             step.Handlers = new List<Kv> { new(handler.Key, handler.Value) };
-            step.StepHandlers = stepHandlers;
+            //step.StepHandlers = stepHandlers;
             step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
             step.NextStepCode = step.StepType is EStepType.End ? string.Empty : nextStepCode;
             step.IsMain = isMainHandler;
             step.IsMain = isMainHandler;
             step.PrevStepId = prevStep.Id;
             step.PrevStepId = prevStep.Id;

+ 7 - 7
src/Hotline/FlowEngine/Workflows/WorkflowStep.cs

@@ -19,8 +19,8 @@ public class WorkflowStep : StepBasicEntity
         nameof(Workflows.WorkflowTrace.StepId))]
         nameof(Workflows.WorkflowTrace.StepId))]
     public WorkflowTrace WorkflowTrace { get; set; }
     public WorkflowTrace WorkflowTrace { get; set; }
 
 
-    [Navigate(NavigateType.OneToMany, nameof(WorkflowStepHandler.WorkflowStepId))]
-    public List<WorkflowStepHandler> StepHandlers { get; set; }
+    //[Navigate(NavigateType.OneToMany, nameof(WorkflowStepHandler.WorkflowStepId))]
+    //public List<WorkflowStepHandler> StepHandlers { get; set; }
 
 
     #region Method
     #region Method
 
 
@@ -181,12 +181,12 @@ public class WorkflowStep : StepBasicEntity
         return IsCountersignEndStep && CountersignStartStepId == topCountersignStepId;
         return IsCountersignEndStep && CountersignStartStepId == topCountersignStepId;
     }
     }
 
 
-    public WorkflowStepHandler?
-        FindActualHandler(ICollection<string> roles, string? userId = null, string? orgId = null) =>
-        StepHandlers.FirstOrDefault(d => d.IsHandler(roles, userId, orgId));
+    //public WorkflowStepHandler?
+    //    FindActualHandler(ICollection<string> roles, string? userId = null, string? orgId = null) =>
+    //    StepHandlers.FirstOrDefault(d => d.IsHandler(roles, userId, orgId));
 
 
-    public WorkflowStepHandler? GetActualHandler() =>
-        StepHandlers.FirstOrDefault(d => d.IsActualHandler);
+    //public WorkflowStepHandler? GetActualHandler() =>
+    //    StepHandlers.FirstOrDefault(d => d.IsActualHandler);
 
 
     public FlowStepHandler GetWorkflowStepHandler()
     public FlowStepHandler GetWorkflowStepHandler()
     {
     {

+ 102 - 102
src/Hotline/FlowEngine/Workflows/WorkflowStepHandler.cs

@@ -1,114 +1,114 @@
-using Hotline.Share.Dtos;
-using SqlSugar;
-using XF.Domain.Entities;
-using XF.Domain.Exceptions;
-using XF.Domain.Repository;
+//using Hotline.Share.Dtos;
+//using SqlSugar;
+//using XF.Domain.Entities;
+//using XF.Domain.Exceptions;
+//using XF.Domain.Repository;
 
 
-namespace Hotline.FlowEngine.Workflows;
+//namespace Hotline.FlowEngine.Workflows;
 
 
-public class WorkflowStepHandler : CreationEntity
-{
-    public string WorkflowId { get; set; }
-    public string ExternalId { get; set; }
-    public string WorkflowStepId { get; set; }
+//public class WorkflowStepHandler : CreationEntity
+//{
+//    public string WorkflowId { get; set; }
+//    public string ExternalId { get; set; }
+//    public string WorkflowStepId { get; set; }
 
 
-    /// <summary>
-    /// 流程指派类型
-    /// </summary>
-    public EFlowAssignType FlowAssignType { get; set; }
+//    /// <summary>
+//    /// 流程指派类型
+//    /// </summary>
+//    public EFlowAssignType FlowAssignType { get; set; }
 
 
-    public string? UserId { get; set; }
-    public string? Username { get; set; }
-    public string? OrgId { get; set; }
-    public string? OrgName { get; set; }
-    public string? RoleId { get; set; }
-    public string? RoleName { get; set; }
+//    public string? UserId { get; set; }
+//    public string? Username { get; set; }
+//    public string? OrgId { get; set; }
+//    public string? OrgName { get; set; }
+//    public string? RoleId { get; set; }
+//    public string? RoleName { get; set; }
 
 
-    /// <summary>
-    /// 是否为实际办理者
-    /// </summary>
-    public bool IsActualHandler { get; set; }
+//    /// <summary>
+//    /// 是否为实际办理者
+//    /// </summary>
+//    public bool IsActualHandler { get; set; }
 
 
-    [Navigate(NavigateType.ManyToOne, nameof(WorkflowStepId))]
-    public WorkflowStep WorkflowStep { get; set; }
+//    [Navigate(NavigateType.ManyToOne, nameof(WorkflowStepId))]
+//    public WorkflowStep WorkflowStep { get; set; }
 
 
-    #region method
+//    #region method
 
 
-    public static WorkflowStepHandler Create(string workflowId, string externalId, EFlowAssignType flowAssignType, string? userId = null, string? username = null,
-        string? orgId = null, string? orgName = null, string? roleId = null, string? roleName = null)
-    {
-        var handler = new WorkflowStepHandler
-        {
-            WorkflowId = workflowId,
-            ExternalId = externalId,
-        };
-        handler.Assign(flowAssignType, userId, username, orgId, orgName, roleId, roleName);
-        return handler;
-    }
+//    public static WorkflowStepHandler Create(string workflowId, string externalId, EFlowAssignType flowAssignType, string? userId = null, string? username = null,
+//        string? orgId = null, string? orgName = null, string? roleId = null, string? roleName = null)
+//    {
+//        var handler = new WorkflowStepHandler
+//        {
+//            WorkflowId = workflowId,
+//            ExternalId = externalId,
+//        };
+//        handler.Assign(flowAssignType, userId, username, orgId, orgName, roleId, roleName);
+//        return handler;
+//    }
 
 
-    public void Assign(EFlowAssignType assignType, string? userId, string? username,
-    string? orgId, string? orgName, string? roleId, string? roleName)
-    {
-        FlowAssignType = assignType;
-        switch (assignType)
-        {
-            case EFlowAssignType.Org:
-                if (string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
-                    throw new ArgumentNullException(nameof(orgId));
-                OrgId = orgId;
-                OrgName = orgName;
-                break;
-            case EFlowAssignType.User:
-                if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(username) ||
-                   string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
-                    throw new ArgumentNullException(nameof(userId));
-                UserId = userId;
-                Username = username;
-                OrgId = orgId;
-                OrgName = orgName;
-                break;
-            //case EFlowAssignType.Role:
-            //    if (string.IsNullOrEmpty(roleId) || string.IsNullOrEmpty(roleName))
-            //        throw new ArgumentNullException(nameof(roleId));
-            //    RoleId = roleId;
-            //    RoleName = roleName;
-            //    break;
-            default:
-                throw new ArgumentOutOfRangeException(nameof(assignType), assignType, null);
-        }
-    }
+//    public void Assign(EFlowAssignType assignType, string? userId, string? username,
+//    string? orgId, string? orgName, string? roleId, string? roleName)
+//    {
+//        FlowAssignType = assignType;
+//        switch (assignType)
+//        {
+//            case EFlowAssignType.Org:
+//                if (string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
+//                    throw new ArgumentNullException(nameof(orgId));
+//                OrgId = orgId;
+//                OrgName = orgName;
+//                break;
+//            case EFlowAssignType.User:
+//                if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(username) ||
+//                   string.IsNullOrEmpty(orgId) || string.IsNullOrEmpty(orgName))
+//                    throw new ArgumentNullException(nameof(userId));
+//                UserId = userId;
+//                Username = username;
+//                OrgId = orgId;
+//                OrgName = orgName;
+//                break;
+//            //case EFlowAssignType.Role:
+//            //    if (string.IsNullOrEmpty(roleId) || string.IsNullOrEmpty(roleName))
+//            //        throw new ArgumentNullException(nameof(roleId));
+//            //    RoleId = roleId;
+//            //    RoleName = roleName;
+//            //    break;
+//            default:
+//                throw new ArgumentOutOfRangeException(nameof(assignType), assignType, null);
+//        }
+//    }
 
 
-    public bool IsHandler(ICollection<string> roleIds, string? userId = null, string? orgId = null)
-    {
-        switch (FlowAssignType)
-        {
-            case EFlowAssignType.Org:
-                if (string.IsNullOrEmpty(OrgId))
-                    throw new UserFriendlyException($"数据异常, {nameof(OrgId)}");
-                return OrgId.Equals(orgId, StringComparison.OrdinalIgnoreCase);
-            case EFlowAssignType.User:
-                if (string.IsNullOrEmpty(UserId))
-                    throw new UserFriendlyException($"数据异常, {nameof(UserId)}");
-                return UserId.Equals(userId, StringComparison.OrdinalIgnoreCase);
-            //case EFlowAssignType.Role:
-            //    if (string.IsNullOrEmpty(RoleId))
-            //        throw new UserFriendlyException($"数据异常, {nameof(RoleId)}");
-            //    return roleIds.Any() && roleIds.Contains(RoleId, StringComparer.OrdinalIgnoreCase);
-            default:
-                throw new ArgumentOutOfRangeException();
-        }
-    }
+//    public bool IsHandler(ICollection<string> roleIds, string? userId = null, string? orgId = null)
+//    {
+//        switch (FlowAssignType)
+//        {
+//            case EFlowAssignType.Org:
+//                if (string.IsNullOrEmpty(OrgId))
+//                    throw new UserFriendlyException($"数据异常, {nameof(OrgId)}");
+//                return OrgId.Equals(orgId, StringComparison.OrdinalIgnoreCase);
+//            case EFlowAssignType.User:
+//                if (string.IsNullOrEmpty(UserId))
+//                    throw new UserFriendlyException($"数据异常, {nameof(UserId)}");
+//                return UserId.Equals(userId, StringComparison.OrdinalIgnoreCase);
+//            //case EFlowAssignType.Role:
+//            //    if (string.IsNullOrEmpty(RoleId))
+//            //        throw new UserFriendlyException($"数据异常, {nameof(RoleId)}");
+//            //    return roleIds.Any() && roleIds.Contains(RoleId, StringComparer.OrdinalIgnoreCase);
+//            default:
+//                throw new ArgumentOutOfRangeException();
+//        }
+//    }
 
 
-    public Kv GetHandler()
-    {
-        return FlowAssignType switch
-        {
-            EFlowAssignType.Org => new Kv(OrgId, OrgName),
-            EFlowAssignType.User => new Kv(UserId, Username),
-            //EFlowAssignType.Role => new Kv(RoleId, RoleName),
-            _ => throw new ArgumentOutOfRangeException()
-        };
-    }
+//    public Kv GetHandler()
+//    {
+//        return FlowAssignType switch
+//        {
+//            EFlowAssignType.Org => new Kv(OrgId, OrgName),
+//            EFlowAssignType.User => new Kv(UserId, Username),
+//            //EFlowAssignType.Role => new Kv(RoleId, RoleName),
+//            _ => throw new ArgumentOutOfRangeException()
+//        };
+//    }
 
 
-    #endregion
-}
+//    #endregion
+//}

+ 2 - 1
src/Hotline/Orders/Order.cs

@@ -803,7 +803,8 @@ namespace Hotline.Orders
         /// <summary>
         /// <summary>
         /// 通话记录
         /// 通话记录
         /// </summary>
         /// </summary>
-        [Navigate(NavigateType.OneToOne, nameof(CallId), nameof(TrCallRecord.CallAccept))]
+        //[Navigate(NavigateType.OneToOne, nameof(CallId), nameof(TrCallRecord.CallAccept))] //由CallAccept改成OtherAccept
+        [Navigate(NavigateType.OneToOne, nameof(CallId), nameof(TrCallRecord.OtherAccept))]
         public TrCallRecord CallRecord { get; set; }
         public TrCallRecord CallRecord { get; set; }
 
 
 
 

+ 140 - 0
src/Hotline/Permissions/EPermission.cs

@@ -1828,6 +1828,91 @@ namespace Hotline.Permissions
 
 
         #endregion
         #endregion
 
 
+        #region 外部市民管理
+        /// <summary>
+        /// 外部市民管理
+        /// </summary>
+        [Display(GroupName = "外部市民管理",Name ="外部市民管理",Description ="外部市民管理")]
+        ExtemaiCitzen  = 701300,
+        /// <summary>
+        /// 外部市民导入
+        /// </summary>
+        [Display(GroupName ="外部市民管理",Name ="外部市民导入",Description ="外部市民导入")]
+        ExtemaiCitzenImport = 701301,
+        /// <summary>
+        /// 模板下载
+        /// </summary>
+        [Display(GroupName ="外部市民管理",Name ="模板下载",Description ="模板下载")]
+        ExtemaiCitzenTemplateDown = 701302,
+
+        #endregion
+
+        #region 短信任务
+        /// <summary>
+        /// 短信任务
+        /// </summary>
+        [Display(GroupName ="短信任务",Name ="短信任务",Description ="短信任务")]
+        SmsTask = 701400,
+        /// <summary>
+        /// 创建任务
+        /// </summary>
+        [Display(GroupName ="短信任务",Name ="创建任务",Description = "创建任务")]
+        CreateSmsTask = 701401,
+        /// <summary>
+        /// 终止任务
+        /// </summary>
+        [Display(GroupName ="短信任务",Name ="终止任务",Description ="终止任务")]
+        StopSmsTask = 701402,
+
+        #endregion
+
+        #region 智能外呼任务
+        /// <summary>
+        /// 智能外呼任务
+        /// </summary>
+        [Display(GroupName ="智能外呼任务",Name ="智能外呼任务",Description ="智能外呼任务")]
+        AiCallOut = 701500,
+        #region 外呼模板配置
+        /// <summary>
+        /// 外呼模板配置
+        /// </summary>
+        [Display(GroupName ="外呼模板配置",Name ="外呼模板配置",Description ="外呼模板配置")]
+        CallOutTemplate = 701501,
+        /// <summary>
+        /// 新增外呼模板
+        /// </summary>
+        [Display(GroupName ="外呼模板配置",Name ="新增外呼模板",Description ="新增外呼模板")]
+        AddCallOutTemplate = 701502,
+        /// <summary>
+        /// 编辑外呼模板
+        /// </summary>
+        [Display(GroupName ="外呼模板配置",Name ="编辑外呼模板",Description ="编辑外呼模板")]
+        EditCallOutTemplate = 701503,
+        /// <summary>
+        /// 删除外呼模板
+        /// </summary>
+        [Display(GroupName ="外呼模板配置",Name ="删除外呼模板",Description ="删除外呼模板")]
+        DelCallOutTemplate = 701504,
+        #endregion
+
+        #region 智能外呼任务
+        /// <summary>
+        /// 智能外呼任务
+        /// </summary>
+        [Display(GroupName ="智能外呼任务",Name ="智能外呼任务",Description ="智能外呼任务")]
+        AiCallOutTask = 701505,
+        /// <summary>
+        /// 智能外呼任务
+        /// </summary>
+        [Display(GroupName ="智能外呼任务",Name = "创建任务", Description = "创建任务")]
+        CreateAiCallOutTask = 701506,
+        /// <summary>
+        /// 创建任务
+        /// </summary>
+        [Display(GroupName ="智能外呼任务",Name ="终止任务",Description = "终止任务")]
+        StopAiCallOutTask = 701507,
+        #endregion
+        #endregion
 
 
         #endregion
         #endregion
 
 
@@ -2164,6 +2249,13 @@ namespace Hotline.Permissions
         /// </summary>
         /// </summary>
         [Display(GroupName = "数据统计", Name = "二次办理满意度", Description = "二次办理满意度")]
         [Display(GroupName = "数据统计", Name = "二次办理满意度", Description = "二次办理满意度")]
         SecondHandleSatisfied = 110606,
         SecondHandleSatisfied = 110606,
+        /// <summary>
+        /// 部门未签收统计
+        /// </summary>
+        [Display(GroupName ="数据统计",Name ="部门未签收统计",Description ="部门未签收统计")]
+        OrgUnSignedSatisfied = 110607,
+
+
         #endregion
         #endregion
 
 
 
 
@@ -2231,6 +2323,54 @@ namespace Hotline.Permissions
 
 
         #endregion
         #endregion
 
 
+        #region 数据共享平台
+        /// <summary>
+        /// 数据共享平台
+        /// </summary>
+        [Display(GroupName ="数据共享平台",Name ="数据共享平台",Description ="数据共享平台")]
+        DataSharing = 130000,
+        /// <summary>
+        /// 平台配置
+        /// </summary>
+        [Display(GroupName ="数据共享平台",Name ="平台配置",Description ="平台配置")]
+        PlatformConfig = 130100,
+        /// <summary>
+        /// 推送任务
+        /// </summary>
+        [Display(GroupName = "数据共享平台", Name ="推送任务",Description = "推送任务")]
+        PushTask = 130200,
+        /// <summary>
+        /// 工单及时推送
+        /// </summary>
+        [Display(GroupName ="数据共享平台",Name ="工单及时推送",Description ="工单及时推送")]
+        OrderTimelyPush = 130300,
+        /// <summary>
+        /// 通话记录及时上传
+        /// </summary>
+        [Display(GroupName ="数据共享平台",Name ="通话记录及时上传",Description ="通话记录及时上传")]
+        CallRecordTimelyPush = 130400,
+        /// <summary>
+        /// 无通话记录工单
+        /// </summary>
+        [Display(GroupName ="数据共享平台",Name ="无通话记录工单",Description = "无通话记录工单")]
+        HasNotCallRecordOrder = 130500,
+        /// <summary>
+        /// 及时率
+        /// </summary>
+        [Display(GroupName ="数据共享平台",Name ="及时率",Description ="及时率")]
+        TimelinessRate = 130600,
+        /// <summary>
+        /// 期满时间修改
+        /// </summary>
+        [Display(GroupName ="数据共享平台",Name ="期满时间修改",Description ="期满时间修改")]
+        ExpirationTimeEdit = 130700,
+        /// <summary>
+        /// 对接平台用户管理
+        /// </summary>
+        [Display(GroupName ="数据共享平台",Name ="对接平台用户管理",Description ="对接平台用户管理")]
+        DockingPlatUserManage = 130800,
+        #endregion
+
         #region 公用(99,00,00)
         #region 公用(99,00,00)
 
 
         #region 话机操作面板权限
         #region 话机操作面板权限

+ 2 - 1
src/Hotline/Quality/QualityDomainService.cs

@@ -96,7 +96,8 @@ namespace Hotline.Quality
                     {
                     {
                         quality.AiQuality = true;
                         quality.AiQuality = true;
                         quality.Mode = "智能质检";
                         quality.Mode = "智能质检";
-						var call = await _trCallRecordRepository.GetAsync(x => x.CallAccept == order.CallId);
+                        //var call = await _trCallRecordRepository.GetAsync(x => x.CallAccept == order.CallId); //由CallAccept改成OtherAccept
+                        var call = await _trCallRecordRepository.GetAsync(x => x.OtherAccept == order.CallId);
                         await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, cancellationToken);
                         await _aiQualityService.CreateAiOrderQualityTask(quality, call, order, cancellationToken);
                     }
                     }
                 }
                 }