Browse Source

质检合并

田爽 10 months ago
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 IMapper _mapper;
         private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
-        private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
+        //private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
         private readonly IRepository<OrderSpecial> _orderSpecialRepository;
         private readonly IRepository<OrderVisit> _orderVisitRepository;
         private readonly IRepository<TrCallRecord> _trCallRecordRepository;
@@ -56,7 +56,7 @@ namespace Hotline.Api.Controllers.Bi
         private readonly IOrderApplication _orderApplication;
         private readonly ITimeLimitDomainService _timeLimitDomainService;
 
-		public BiOrderController(
+        public BiOrderController(
             IOrderRepository orderRepository,
             IRepository<Hotspot> hotspotTypeRepository,
             ISystemDicDataCacheManager sysDicDataCacheManager,
@@ -75,11 +75,11 @@ namespace Hotline.Api.Controllers.Bi
             IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<OrderScreen> orderScreenRepository,
-            IRepository<WorkflowStepHandler> workflowStepHandleRepository,
+            //IRepository<WorkflowStepHandler> workflowStepHandleRepository,
             IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
             IOrderApplication orderApplication,
             ITimeLimitDomainService timeLimitDomainService
-			)
+            )
         {
             _orderRepository = orderRepository;
             _hotspotTypeRepository = hotspotTypeRepository;
@@ -99,11 +99,11 @@ namespace Hotline.Api.Controllers.Bi
             _orderSpecialDetailRepository = orderSpecialDetailRepository;
             _workflowTraceRepository = workflowTraceRepository;
             _orderScreenRepository = orderScreenRepository;
-            _workflowStepHandleRepository = workflowStepHandleRepository;
+            //_workflowStepHandleRepository = workflowStepHandleRepository;
             _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
             _orderApplication = orderApplication;
             _timeLimitDomainService = timeLimitDomainService;
-		}
+        }
 
         /// <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()))
                     .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))
-					.MergeTable();
+                    .MergeTable();
 
             if (dto.QueryType is 2 or 4 or 5)
             {
@@ -184,13 +184,13 @@ namespace Hotline.Api.Controllers.Bi
                 .Select((x, o) => new OrderBiOrgDataListVo
                 {
                     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)),
                 }).MergeTable();
 
             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
                 {
                     OrgName = so.Name,
@@ -201,7 +201,7 @@ namespace Hotline.Api.Controllers.Bi
                     CounterNoHandlerExtendedNum = SqlFunc.AggregateSum(co.CounterNoHandlerExtendedNum)
                 }).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)
             {
                 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)
                 .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 == 2, x => SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == dto.DateValue)
                 .WhereIF(!string.IsNullOrEmpty(dto.LineNum), x => x.OrderVisit.Order.CallRecord.Gateway == dto.LineNum)
@@ -1649,18 +1649,19 @@ namespace Hotline.Api.Controllers.Bi
 
             #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()
               .WhereIF(IsCenter == false, it => it.OrgCode.StartsWith(_sessionContext.RequiredOrgId))
@@ -2005,20 +2006,21 @@ namespace Hotline.Api.Controllers.Bi
 
             #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()
              .GroupBy(d => new { d.OrgCode })
@@ -2329,15 +2331,16 @@ namespace Hotline.Api.Controllers.Bi
                                  .Select(it => new SelectOrderId { Id = it.Id })
                                  .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();
 
                 var queryData = await _orderRepository.OrderListUnionAll(ybQuery, hqybquery)
@@ -2455,26 +2458,27 @@ namespace Hotline.Api.Controllers.Bi
             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);
                 var dtos = queryCountersign.Select(d =>
                 {
-                    var dto = _mapper.Map<OrderDto>(d.p);
+                    var dto = _mapper.Map<OrderDto>(d.o);
                     return dto;
                 }).ToList();
 
@@ -2497,19 +2501,20 @@ namespace Hotline.Api.Controllers.Bi
                          .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();
 
                 var queryData = await _orderRepository.OrderListUnionAll(queryOrder, queryCountersign)
@@ -2821,39 +2826,40 @@ namespace Hotline.Api.Controllers.Bi
 
             var items = await _workflowTraceRepository.Queryable()
                 .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)
-                .Select((x, w, wsh, su) => new BiOrderSendVo
+                .Select((x, w, su) => new BiOrderSendVo
                 {
                     UserId = su.UserId,
                     UserName = su.UserName,
                     SendOrderNum = SqlFunc.AggregateDistinctCount(w.ExternalId),
                     NoSendOrderNum = SqlFunc.AggregateSum(SqlFunc.IIF(x.HandlerId == null || x.HandlerId == "", 1, 0)),
                 }).ToListAsync();
+
             var items2 = await _workflowTraceRepository.Queryable()
                 .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()
                 .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
                 .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,
                     UserName = su.UserName,
@@ -2892,15 +2898,15 @@ namespace Hotline.Api.Controllers.Bi
 
             var (total, items) = await _workflowTraceRepository.Queryable()
                 .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()
                 .LeftJoin<Order>((a, b) => a.Id == b.Id)
                 .Select((a, b) => b)
@@ -2910,22 +2916,22 @@ namespace Hotline.Api.Controllers.Bi
             {
                 (total, items) = await _workflowTraceRepository.Queryable()
                        .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()
                        .LeftJoin<WorkflowTrace>((a, wt) => a.Id == wt.WorkflowId)
                        .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()
                        .LeftJoin<Order>((a, b) => a.Id == b.Id)
                        .Select((a, b) => b)
@@ -3198,51 +3204,51 @@ namespace Hotline.Api.Controllers.Bi
         [HttpGet("unsigned_order_report")]
         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);
             foreach (var item in itemsVo)
             {
                 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)
         {
-	        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);
             }
 
-			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)
             {
                 model.CallOrderType = ECallOrderType.Order;
@@ -438,7 +439,8 @@ namespace Hotline.Api.Controllers
             }
             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)
                 {
                     model.CallOrderType = ECallOrderType.Visit;
@@ -614,7 +616,8 @@ namespace Hotline.Api.Controllers
         [HttpPost("link-callrecord")]
         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 (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 dissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason);
         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 recordingBaseAddress = "";
         var recordingAbsolutePath = "";
@@ -1357,7 +1358,7 @@ public class OrderController : BaseController
     {
         var isHandled = dto.IsApply.HasValue && dto.IsApply.Value;
         var (total, items) = await _orderDelayRepository
-            .Queryable(canView: true, hasHandled: !isHandled)
+            .Queryable(hasHandled: !isHandled)
             .Includes(x => x.Order)
             .Includes(x => x.Workflow)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
@@ -2326,7 +2327,8 @@ public class OrderController : BaseController
             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)
         {
             dto.RecordingBaseAddress = call.RecordingBaseAddress;
@@ -2382,7 +2384,8 @@ public class OrderController : BaseController
         }
 
         //工单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))
         {
             callRecord.ExternalId = order.Id;
@@ -2893,7 +2896,7 @@ public class OrderController : BaseController
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 
         var (total, items) = await _orderRepository
-            .Queryable(canView: true, hasHandled: !isHandled)
+            .Queryable(hasHandled: !isHandled)
             .Includes(d => d.OrderSpecials)
             .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))
@@ -2962,7 +2965,7 @@ public class OrderController : BaseController
             dto.StartTimeEnd = dto.StartTimeEnd.Value.AddDays(1).AddSeconds(-1);
 
         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.Status != EOrderStatus.BackToProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No!.Contains(dto.No!))
@@ -3013,7 +3016,7 @@ public class OrderController : BaseController
         if (dto.EndTime.HasValue)
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
         var (total, items) = await _orderRepository
-            .Queryable(canView: true, hasHandled: !isHandled)
+            .Queryable(hasHandled: !isHandled)
             .Includes(d => d.OrderSpecials)
             .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))
@@ -3106,7 +3109,7 @@ public class OrderController : BaseController
                     SendBackOrgName = prevStep.HandlerOrgName,//prevStep!.AcceptorOrgName,
                     WorkflowOrgId = _sessionContext.RequiredOrgId,
                     WorkflowUserId = _sessionContext.RequiredUserId,
-                    WorkflowRoleIds =  _sessionContext.Roles.ToList()
+                    WorkflowRoleIds = _sessionContext.Roles.ToList()
                 };
                 await _orderSendBackAuditRepository.AddAsync(audit, HttpContext.RequestAborted);
             }
@@ -3196,7 +3199,7 @@ public class OrderController : BaseController
             if (sendBack.State == ESendBackAuditState.End)
             {
                 var flowDirection = await _workflowApplication.PreviousAsync(sendBack.SendBackData,
-                    sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(), 
+                    sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(),
                     _sessionContext, 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;

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

@@ -150,7 +150,8 @@ namespace Hotline.Api.Controllers
 				.FirstAsync(x => x.Id == id);
 			var qualityDto = _mapper.Map<QualityDto>(quality);
 			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)
                 {
 					qualityDto.Order.RecordingBaseAddress = call.RecordingBaseAddress;
@@ -159,8 +160,9 @@ namespace Hotline.Api.Controllers
 			}
 			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.RecordingAbsolutePath = call.RecordingAbsolutePath;
@@ -669,8 +671,9 @@ namespace Hotline.Api.Controllers
 			if (order != null && !string.IsNullOrEmpty(order.CallId))
 			{
 				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);
 			}
 		}

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

@@ -90,7 +90,7 @@ public class TestController : BaseController
     private readonly IExportApplication _exportApplication;
     private readonly IAiVisitService _aiVisitService;
     private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
-    private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
+    //private readonly IRepository<WorkflowStepHandler> _workflowStepHandleRepository;
 
     private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
     private readonly IOrderRepository _orderRepository;
@@ -129,7 +129,7 @@ public class TestController : BaseController
         IExportApplication exportApplication,
         IAiVisitService aiVisitService,
         IRepository<WorkflowTrace> workflowTraceRepository,
-        IRepository<WorkflowStepHandler> workflowStepHandleRepository,
+        //IRepository<WorkflowStepHandler> workflowStepHandleRepository,
         IRepository<SystemOrganize> systemOrganizeRepository,
         IOrderRepository orderRepository,
         IMapper mapper
@@ -159,7 +159,7 @@ public class TestController : BaseController
         _exportApplication = exportApplication;
         _aiVisitService = aiVisitService;
         _workflowTraceRepository = workflowTraceRepository;
-        _workflowStepHandleRepository = workflowStepHandleRepository;
+        //_workflowStepHandleRepository = workflowStepHandleRepository;
         _systemOrganizeRepository = systemOrganizeRepository;
         _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,
             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,
             new FlowStepHandler
@@ -159,13 +159,12 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 Username = current.UserName,
                 OrgId = current.RequiredOrgId,
                 OrgName = current.OrgName
-            },
-            startStepHandles, expiredTime);
+            }, expiredTime);
 
         var flowAssignInfo =
             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);
 
@@ -181,10 +180,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             startStep.FileJson =
                 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);
 
         //starttrace
@@ -204,7 +203,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             current.OrgName);
 
         await _workflowDomainService.StartAsync(workflow, startStep, dto, firstStepDefine, isNextDynamic,
-            flowAssignInfo, counterSignType, expiredTime, firstStepHandlers, current, cancellationToken);
+            flowAssignInfo, counterSignType, expiredTime, current, cancellationToken);
 
         return workflow.Id;
     }
@@ -264,10 +263,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var flowAssignInfo =
             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,
-            flowAssignInfo, expiredTime, nextStepHandlers, current, cancellationToken);
+            flowAssignInfo, expiredTime, current, cancellationToken);
 
         return workflow;
     }
@@ -298,7 +297,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         return await _workflowDomainService.PreviousAsync(workflow, dto,
             applicantId, applicantOrgId, applicantRoleIds, _sessionContext, cancellationToken);
     }
-    
+
     /// <summary>
     /// 撤回至任意节点
     /// </summary>
@@ -321,9 +320,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.IsStartCountersign,
             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>
@@ -482,7 +481,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 var sb = new StringBuilder();
                 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();
 
@@ -533,7 +533,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             string.IsNullOrEmpty(dto.Opinion))
         {
             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;
@@ -1160,45 +1160,45 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             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>
     /// 按流程模板配置创建下一步办理对象
@@ -1307,7 +1307,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withSteps: true, withTraces: true,
             cancellationToken: cancellationToken);
         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)
         {
             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;
 
                 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
                 {
                     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 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)
                     {
                         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.Workflow)
             .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>()

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

@@ -24,7 +24,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         Task StartAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto, StepDefine firstStepDefine,
             bool isNextDynamic, FlowAssignInfo flowAssignInfo, ECounterSignType? counterSignType, DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers, ISessionContext current, CancellationToken cancellationToken);
+            ISessionContext current, CancellationToken cancellationToken);
 
         /// <summary>
         /// 查询工作流
@@ -49,22 +49,22 @@ namespace Hotline.FlowEngine.Workflows
         /// 办理(流转至下一节点)
         /// </summary>
         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);
 
         /// <summary>
         /// 退回(返回前一节点)
         /// </summary>
         /// <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);
-        
+
         /// <summary>
         /// 撤回(返回到之前任意节点)
         /// </summary>
         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>
         /// 撤回至开始节点
@@ -148,7 +148,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建开始节点
         /// </summary>
         WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine, BasicWorkflowDto dto,
-            FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime);
+            FlowStepHandler handler, DateTime? expiredTime);
 
         /// <summary>
         /// 查询未完成节点

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

@@ -30,10 +30,10 @@ public abstract class StepBasicEntity : CreationEntity
 
     #endregion
 
-	/// <summary>
-	/// 流程指派类型
-	/// </summary>
-	public EFlowAssignType? FlowAssignType { get; set; }
+    /// <summary>
+    /// 流程指派类型
+    /// </summary>
+    public EFlowAssignType? FlowAssignType { get; set; }
 
     /// <summary>
     /// 该节点指派办理对象(依据不同指派方式可能为:orgId或userId),该字段subStep才会存在,stepBox不存在
@@ -140,7 +140,7 @@ public abstract class StepBasicEntity : CreationEntity
     #endregion
 
     #endregion
-    
+
     #region 接办
 
     /// <summary>
@@ -420,7 +420,7 @@ public abstract class StepBasicEntity : CreationEntity
     public void Assign(
         string? handlerId, string? handlerName,
         string? handlerOrgId, string? handlerOrgName,
-        string? roleId, string? roleName)
+        string? roleId = null, string? roleName = null)
     {
         HandlerId = handlerId;
         HandlerName = handlerName;
@@ -435,6 +435,17 @@ public abstract class StepBasicEntity : CreationEntity
     /// </summary>
     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
 }
 

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

@@ -789,12 +789,12 @@ public partial class Workflow
     /// <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;
         AcceptorName = userName;
         AcceptorStaffNo = staffNo;
-        AcceptorOrgId = orgCode;
+        AcceptorOrgId = orgId;
         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<WorkflowSupplement> _workflowSupplementRepository;
         private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
-        private readonly IRepository<WorkflowStepHandler> _workflowStepHandlerRepository;
+        //private readonly IRepository<WorkflowStepHandler> _workflowStepHandlerRepository;
         private readonly ISessionContext _sessionContext;
         private readonly IMapper _mapper;
         private readonly IMediator _mediator;
@@ -42,7 +42,7 @@ namespace Hotline.FlowEngine.Workflows
             IRepository<WorkflowTrace> workflowTraceRepository,
             IRepository<WorkflowSupplement> workflowSupplementRepository,
             IRepository<WorkflowCountersign> workflowCountersignRepository,
-            IRepository<WorkflowStepHandler> workflowStepHandlerRepository,
+            //IRepository<WorkflowStepHandler> workflowStepHandlerRepository,
             ISessionContext sessionContext,
             IMapper mapper,
             IMediator mediator,
@@ -54,7 +54,7 @@ namespace Hotline.FlowEngine.Workflows
             _workflowTraceRepository = workflowTraceRepository;
             _workflowSupplementRepository = workflowSupplementRepository;
             _workflowCountersignRepository = workflowCountersignRepository;
-            _workflowStepHandlerRepository = workflowStepHandlerRepository;
+            //_workflowStepHandlerRepository = workflowStepHandlerRepository;
             _sessionContext = sessionContext;
             _mapper = mapper;
             _mediator = mediator;
@@ -95,7 +95,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task StartAsync(Workflow workflow, WorkflowStep startStep, BasicWorkflowDto dto,
             StepDefine firstStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
-            ECounterSignType? counterSignType, DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers,
+            ECounterSignType? counterSignType, DateTime? expiredTime,
             ISessionContext current, CancellationToken cancellationToken)
         {
             //1. 创建first节点 (和trace)2.办理开始节点 
@@ -115,7 +115,7 @@ namespace Hotline.FlowEngine.Workflows
 
             //firststeps
             var firstSteps = await CreateNextStepsAsync(workflow, startStep, dto, firstStepDefine,
-                isNextDynamic, flowAssignInfo, expiredTime, stepHandlers, dto.IsStartCountersign, cancellationToken);
+                isNextDynamic, flowAssignInfo, expiredTime, dto.IsStartCountersign, cancellationToken);
             if (firstSteps.Any())
                 workflow.Steps.AddRange(firstSteps);
 
@@ -187,7 +187,7 @@ namespace Hotline.FlowEngine.Workflows
             if (withCountersigns)
                 query = query.Includes(d => d.Countersigns, x => x.Members);
             if (withSteps)
-                query = query.Includes(d => d.Steps, x => x.StepHandlers);
+                query = query.Includes(d => d.Steps);
             //if (withTraces)
             //    query = query.Includes(d => d.Traces);
 
@@ -308,8 +308,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task NextAsync(Workflow workflow, WorkflowStep currentStep, NextWorkflowDto dto,
             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);
             //CheckWhetherRunnable(workflow.Status);
@@ -422,10 +421,10 @@ namespace Hotline.FlowEngine.Workflows
                     .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);
 
@@ -461,7 +460,7 @@ namespace Hotline.FlowEngine.Workflows
 
             //创建下一/N个节点(会签汇总节点:会签未全部办理时不创建,最后一个会签办理节点创建会签汇总节点)
             var nextSteps = await CreateNextStepsAsync(workflow, currentStep, dto,
-                nextStepDefine, isNextDynamic, flowAssignInfo, expiredTime, stepHandlers, isStartCountersign,
+                nextStepDefine, isNextDynamic, flowAssignInfo, expiredTime, isStartCountersign,
                 cancellationToken);
 
             ////赋值当前节点的下级办理节点
@@ -659,7 +658,7 @@ namespace Hotline.FlowEngine.Workflows
             var steps = await _workflowStepRepository.Queryable()
                 .Includes(d => d.Workflow)
                 .Includes(d => d.WorkflowTrace)
-                .Includes(d => d.StepHandlers)
+                //.Includes(d => d.StepHandlers)
                 .Where(d => stepsIds.Contains(d.Id))
                 .ToListAsync(cancellationToken);
             foreach (var handler in handlers)
@@ -674,10 +673,10 @@ namespace Hotline.FlowEngine.Workflows
                 var thisSteps = steps.Where(d => handler.stepIds.Contains(d.Id)).ToList();
                 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;
 
@@ -700,7 +699,7 @@ namespace Hotline.FlowEngine.Workflows
             await _workflowStepRepository.UpdateNav(steps)
                 .Include(d => d.WorkflowTrace)
                 .Include(d => d.Workflow)
-                .Include(d => d.StepHandlers)
+                //.Include(d => d.StepHandlers)
                 .ExecuteCommandAsync();
 
             return steps.Select(d => d.WorkflowId).ToList();
@@ -711,20 +710,33 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         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();
 
+
             return orgs;
             //var workflow = await GetWorkflowAsync(workflowId, withSteps: true, cancellationToken: cancellation);
             //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)
         {
             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)
                 .FirstAsync(cancellation);
         }
@@ -808,7 +821,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         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.HandlerOrgs = new();
@@ -830,15 +843,22 @@ namespace Hotline.FlowEngine.Workflows
             startStep.AcceptorOrgId = orgId;
             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)
-                .Include(d => d.StepHandlers)
+                //.Include(d => d.StepHandlers)
+                .Include(d => d.WorkflowTrace)
                 .ExecuteCommandAsync();
 
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
@@ -870,7 +890,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 撤回(返回到之前任意节点)
         /// </summary>
         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)
         {
             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);
 
             var isOrgToCenter = await RecallAsync(workflow, dto, flowAssignInfo, targetStepDefine, targetStep,
-                EWorkflowTraceType.Recall, stepHandlers, expiredTime, cancellationToken);
+                EWorkflowTraceType.Recall, expiredTime, cancellationToken);
 
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
@@ -1211,7 +1231,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 创建开始节点
         /// </summary>
         public WorkflowStep CreateStartStep(Workflow workflow, StepDefine startStepDefine,
-            BasicWorkflowDto dto, FlowStepHandler handler, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime)
+            BasicWorkflowDto dto, FlowStepHandler handler, DateTime? expiredTime)
         {
             //startstep
             var nextSteps = _mapper.Map<List<StepSimple>>(startStepDefine.NextSteps);
@@ -1226,7 +1246,7 @@ namespace Hotline.FlowEngine.Workflows
             _mapper.Map(workflow, startStep);
             startStep.FlowAssignType = EFlowAssignType.User;
             startStep.Handlers = new List<Kv> { new(handler.Key, handler.Value) };
-            startStep.StepHandlers = stepHandlers;
+            //startStep.StepHandlers = stepHandlers;
             startStep.NextSteps = nextSteps;
             startStep.IsMain = true;
             startStep.IsOrigin = true;
@@ -1255,14 +1275,14 @@ namespace Hotline.FlowEngine.Workflows
             StepDefine endStepDefine, WorkflowStep currentStep, ISessionContext current,
             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
-            var endStep = await CreateEndStepAsync(current, workflow, endStepDefine, currentStep, endStepHandles, cancellationToken);
+            var endStep = await CreateEndStepAsync(current, workflow, endStepDefine, currentStep, cancellationToken);
             workflow.Steps.Add(endStep);
 
             //update endTrace
@@ -1363,14 +1383,14 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         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)
         {
-            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);
             return startStep;
         }
@@ -1394,7 +1414,7 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         private async Task<List<WorkflowStep>> CreateNextStepsAsync(Workflow workflow, WorkflowStep currentStep,
             BasicWorkflowDto dto, StepDefine nextStepDefine, bool isNextDynamic, FlowAssignInfo flowAssignInfo,
-            DateTime? expiredTime, List<WorkflowStepHandler> stepHandlers, bool isStartCountersign,
+            DateTime? expiredTime, bool isStartCountersign,
             CancellationToken cancellationToken)
         {
             List<WorkflowStep> nextSteps = new();
@@ -1410,13 +1430,13 @@ namespace Hotline.FlowEngine.Workflows
                         {
                             //依据会签策略创建会签下一级节点
                             nextSteps = await CreateCountersignStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
+                                flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign, cancellationToken);
                         }
                         else
                         {
                             //创建普通节点(根据配置)
                             nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto,
-                                flowAssignInfo, EWorkflowTraceType.Normal, expiredTime, stepHandlers, cancellationToken);
+                                flowAssignInfo, EWorkflowTraceType.Normal, expiredTime, cancellationToken);
                         }
                     }
                     else
@@ -1428,14 +1448,13 @@ namespace Hotline.FlowEngine.Workflows
                             if (csStartStep is null)
                                 throw new UserFriendlyException("未查询到会签节点");
 
-                            nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, stepHandlers,
-                                expiredTime, cancellationToken);
+                            nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, csStartStep, dto, expiredTime, cancellationToken);
                         }
                         else
                         {
                             //依据会签策略创建会签下一级节点
                             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)
                     {
                         // check if cs all complete, create next
-                        nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, currentStep, dto, stepHandlers,
+                        nextSteps = await CreateCsEndStepsByTargetPrevAsync(workflow, currentStep, dto,
                             expiredTime, cancellationToken);
                     }
                     else
                     {
                         //依据会签策略创建会签下一级节点
                         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,
-                    flowAssignInfo.FlowAssignType, expiredTime, stepHandlers, isStartCountersign, cancellationToken);
+                    flowAssignInfo.FlowAssignType, expiredTime, isStartCountersign, cancellationToken);
             }
             else if (isNextDynamic)
             {
                 //创建动态下一级节点
                 nextSteps = await CreateDynamicStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
-                    expiredTime, stepHandlers, cancellationToken);
+                    expiredTime, cancellationToken);
             }
             else
             {
                 //创建普通节点(根据配置)
                 nextSteps = await CreateConfigStepsAsync(workflow, nextStepDefine, currentStep, dto, flowAssignInfo,
-                    EWorkflowTraceType.Normal, expiredTime, stepHandlers, cancellationToken);
+                    EWorkflowTraceType.Normal, expiredTime, cancellationToken);
             }
 
             return nextSteps;
@@ -1484,7 +1503,6 @@ namespace Hotline.FlowEngine.Workflows
             BasicWorkflowDto dto,
             FlowAssignInfo flowAssignInfo,
             DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers,
             CancellationToken cancellationToken)
         {
             var handlerType = nextStepDefine.InstancePolicy switch
@@ -1498,7 +1516,7 @@ namespace Hotline.FlowEngine.Workflows
             };
 
             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,
                 cancellationToken: cancellationToken);
         }
@@ -1510,7 +1528,6 @@ namespace Hotline.FlowEngine.Workflows
             BasicWorkflowDto dto,
             EFlowAssignType flowAssignType,
             DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers,
             bool isStartCountersign,
             CancellationToken cancellationToken = default
         )
@@ -1533,7 +1550,7 @@ namespace Hotline.FlowEngine.Workflows
                 : ECountersignPosition.Single;
 
             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);
         }
 
@@ -1541,7 +1558,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 根据传入节点的上一节点创建会签汇总节点(汇总传入节点的前一节点)
         /// </summary>
         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);
             if (countersignStartStep is null)
@@ -1554,7 +1571,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 // 创建会签汇总节点
                 var countersignEndStep =
-                    await CreateCountersignEndStepAsync(countersignStartStep, dto, stepHandlers, expiredTime, cancellationToken);
+                    await CreateCountersignEndStepAsync(countersignStartStep, dto, expiredTime, cancellationToken);
                 nextSteps = new List<WorkflowStep> { countersignEndStep };
 
                 //create trace
@@ -1567,7 +1584,7 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         private async Task<WorkflowStep> CreateCountersignEndStepAsync(WorkflowStep countersignStartStep,
-            BasicWorkflowDto dto, List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime,
+            BasicWorkflowDto dto, DateTime? expiredTime,
             CancellationToken cancellationToken = default)
         {
             var csEndStep = _mapper.Map<WorkflowStep>(countersignStartStep);
@@ -1587,15 +1604,15 @@ namespace Hotline.FlowEngine.Workflows
             csEndStep.Handlers = countersignStartStep.Handlers
                 .Where(d => d.Key == countersignStartStep.HandlerId || d.Key == countersignStartStep.HandlerOrgId)
                 .ToList();
-            csEndStep.StepHandlers = stepHandlers;
+            //csEndStep.StepHandlers = stepHandlers;
 
             csEndStep.Reset();
             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;
         }
 
@@ -1627,9 +1644,9 @@ namespace Hotline.FlowEngine.Workflows
                  current.OrgAreaCode, current.OrgAreaName,
                  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.ParentId = step.ParentId;
             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.CountersignId = step.CountersignId;
             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);
 
@@ -1910,7 +1927,7 @@ namespace Hotline.FlowEngine.Workflows
 
         private async Task<bool> RecallAsync(Workflow workflow, BasicWorkflowDto dto, FlowAssignInfo flowAssignInfo,
             StepDefine targetStepDefine, WorkflowStep targetStep, EWorkflowTraceType traceType,
-            List<WorkflowStepHandler> stepHandlers, DateTime? expiredTime, CancellationToken cancellationToken)
+            DateTime? expiredTime, CancellationToken cancellationToken)
         {
             var targetIsStartStep = targetStepDefine.StepType is EStepType.Start;
 
@@ -1941,9 +1958,9 @@ namespace Hotline.FlowEngine.Workflows
 
             var targetStepNew = targetIsStartStep
                 ? await CreateStartStepAsync(workflow, targetStepDefine, dto,
-                    dto.NextHandlers.First(), stepHandlers, traceType, expiredTime, cancellationToken)
+                    dto.NextHandlers.First(), traceType, expiredTime, cancellationToken)
                 : (await CreateStepsAsync(workflow, targetStepDefine, targetPrevStep, dto,
-                    flowAssignInfo.FlowAssignType, dto.NextHandlers, stepHandlers,
+                    flowAssignInfo.FlowAssignType, dto.NextHandlers,
                     null, EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None, true, traceType,
                     null, expiredTime, cancellationToken: cancellationToken)).First();
 
@@ -1997,7 +2014,6 @@ namespace Hotline.FlowEngine.Workflows
             Workflow workflow,
             StepDefine endStepDefine,
             WorkflowStep prevStep,
-            List<WorkflowStepHandler> stepHandlers,
             CancellationToken cancellationToken)
         {
             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,
-                stepHandlers, null, null, EWorkflowStepStatus.WaitForAccept,
+                 null, null, EWorkflowStepStatus.WaitForAccept,
                 ECountersignPosition.None, DateTime.Now, endStepDefine.Name, true);
 
             //step.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName,
@@ -2039,7 +2055,6 @@ namespace Hotline.FlowEngine.Workflows
             FlowAssignInfo flowAssignInfo,
             EWorkflowTraceType traceType,
             DateTime? expiredTime,
-            List<WorkflowStepHandler> stepHandlers,
             CancellationToken cancellationToken)
         {
             //List<Kv> handlers;
@@ -2067,7 +2082,7 @@ namespace Hotline.FlowEngine.Workflows
             //}
 
             return await CreateStepsAsync(workflow, stepDefine, prevStep, dto, /*dto.IsStartCountersign,*/
-                flowAssignInfo.FlowAssignType, handlers, stepHandlers, null,
+                flowAssignInfo.FlowAssignType, handlers, null,
                 EWorkflowStepStatus.WaitForAccept, ECountersignPosition.None,
                 true, traceType, null, expiredTime, cancellationToken);
         }
@@ -2080,7 +2095,6 @@ namespace Hotline.FlowEngine.Workflows
             //bool isStartCountersign,
             EFlowAssignType? flowAssignType,
             List<FlowStepHandler> handlers,
-            List<WorkflowStepHandler> stepHandlers,
             string? countersignId,
             EWorkflowStepStatus stepStatus,
             ECountersignPosition csPosition,
@@ -2099,7 +2113,7 @@ namespace Hotline.FlowEngine.Workflows
             {
                 var isMain = handlers.Count == 1 || (handlers.Count > 1 && handler.Key == dto.NextMainHandler);
                 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);
 
                 //var stepHandler = stepHandlers.First(d => d.GetHandler().Key == handler.Key);
@@ -2117,10 +2131,10 @@ namespace Hotline.FlowEngine.Workflows
             //    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
             foreach (var step in steps)
@@ -2374,7 +2388,6 @@ namespace Hotline.FlowEngine.Workflows
             WorkflowStep prevStep,
             EFlowAssignType? flowAssignType,
             FlowStepHandler handler,
-            List<WorkflowStepHandler> stepHandlers,
             string nextStepCode,
             string? countersignId,
             EWorkflowStepStatus stepStatus,
@@ -2397,7 +2410,7 @@ namespace Hotline.FlowEngine.Workflows
 
             step.FlowAssignType = flowAssignType;
             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.IsMain = isMainHandler;
             step.PrevStepId = prevStep.Id;

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

@@ -19,8 +19,8 @@ public class WorkflowStep : StepBasicEntity
         nameof(Workflows.WorkflowTrace.StepId))]
     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
 
@@ -181,12 +181,12 @@ public class WorkflowStep : StepBasicEntity
         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()
     {

+ 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>
-        [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; }
 
 

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

@@ -1828,6 +1828,91 @@ namespace Hotline.Permissions
 
         #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
 
@@ -2164,6 +2249,13 @@ namespace Hotline.Permissions
         /// </summary>
         [Display(GroupName = "数据统计", Name = "二次办理满意度", Description = "二次办理满意度")]
         SecondHandleSatisfied = 110606,
+        /// <summary>
+        /// 部门未签收统计
+        /// </summary>
+        [Display(GroupName ="数据统计",Name ="部门未签收统计",Description ="部门未签收统计")]
+        OrgUnSignedSatisfied = 110607,
+
+
         #endregion
 
 
@@ -2231,6 +2323,54 @@ namespace Hotline.Permissions
 
         #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 话机操作面板权限

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

@@ -96,7 +96,8 @@ namespace Hotline.Quality
                     {
                         quality.AiQuality = true;
                         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);
                     }
                 }