Przeglądaj źródła

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

Dun.Jason 2 miesięcy temu
rodzic
commit
ff1fb210b1

+ 20 - 20
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -2186,7 +2186,7 @@ namespace Hotline.Api.Controllers.Bi
                 })
                 .FirstAsync();
 
-            if (listInfo != null && listInfo.Rows.Count > 0 && orderAgingData != null)
+			if (listInfo != null && listInfo.Rows.Count > 0 && orderAgingData != null)
             {
                 orderAgingData.OrderCount = orderAgingData.OrderCount + Convert.ToInt32(listInfo.Rows[0]["AllCount"]);
                 orderAgingData.CompletedAging = orderAgingData.CompletedAging + Convert.ToInt32(listInfo.Rows[0]["OrderWorkTime"]);
@@ -2636,7 +2636,7 @@ namespace Hotline.Api.Controllers.Bi
                 })
                 .FirstAsync();
 
-            enterpriseOrderDto.InProgressCount = enterpriseOrderData.InProgressCount;
+			enterpriseOrderDto.InProgressCount = enterpriseOrderData.InProgressCount;
             enterpriseOrderDto.CompletedCount = enterpriseOrderData.CompletedCount;
             enterpriseOrderDto.CenterCount = enterpriseOrderData.CenterCount;
             enterpriseOrderDto.CityCount = enterpriseOrderData.CityCount;
@@ -2647,27 +2647,27 @@ namespace Hotline.Api.Controllers.Bi
                 .LeftJoin<SystemOrganize>((it, so) => it.VisitOrgCode == so.Id)
                 .Where((it, so) => it.VisitTarget == EVisitTarget.Org && it.OrderVisit.VisitTime >= StartTime && it.OrderVisit.VisitTime <= EndTime && it.OrderVisit.VisitState == EVisitState.Visited && it.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
                 .GroupBy((it, so) => it.Id)
-                 .Select((it, so) => new EnterpriseOrderDto
+                .Select((it, so) => new EnterpriseOrderDto
                  {
-                     VisitdCount = SqlFunc.AggregateSum(SqlFunc.IIF(true, 1, 0)),
-                     Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
+                     VisitdCount = SqlFunc.AggregateCount(1),
+					 Dissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
                      Satisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2"), 1, 0)),
                      CityDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2")) && so.OrgType == EOrgType.City, 1, 0)),
                      CitySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2") && so.OrgType == EOrgType.City, 1, 0)),
                      CountyDissatisfied = SqlFunc.AggregateSum(SqlFunc.IIF((SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") || SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2")) && so.OrgType == EOrgType.County, 1, 0)),
                      CountySatisfied = SqlFunc.AggregateSum(SqlFunc.IIF(!SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "1") && !SqlFunc.JsonListObjectAny(it.OrgProcessingResults, "key", "2") && so.OrgType == EOrgType.County, 1, 0)),
                  })
-                .FirstAsync();
+                .ToListAsync();
 
-            if (enterpriseOrderDto2 != null)
+			if (enterpriseOrderDto2.Any())
             {
-                centerReportStatisticsDto.EnterpriseOrderDto.VisitdCount = enterpriseOrderDto2.VisitdCount;
-                centerReportStatisticsDto.EnterpriseOrderDto.Dissatisfied = enterpriseOrderDto2.Dissatisfied;
-                centerReportStatisticsDto.EnterpriseOrderDto.CityDissatisfied = enterpriseOrderDto2.CityDissatisfied;
-                centerReportStatisticsDto.EnterpriseOrderDto.CountyDissatisfied = enterpriseOrderDto2.CountyDissatisfied;
-                centerReportStatisticsDto.EnterpriseOrderDto.Satisfied = enterpriseOrderDto2.Satisfied;
-                centerReportStatisticsDto.EnterpriseOrderDto.CitySatisfied = enterpriseOrderDto2.CitySatisfied;
-                centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied = enterpriseOrderDto2.CountySatisfied;
+                centerReportStatisticsDto.EnterpriseOrderDto.VisitdCount = enterpriseOrderDto2.Sum(x=>x.VisitdCount);
+                centerReportStatisticsDto.EnterpriseOrderDto.Dissatisfied = enterpriseOrderDto2.Sum(x => x.Dissatisfied);
+                centerReportStatisticsDto.EnterpriseOrderDto.CityDissatisfied = enterpriseOrderDto2.Sum(x => x.CityDissatisfied);
+                centerReportStatisticsDto.EnterpriseOrderDto.CountyDissatisfied = enterpriseOrderDto2.Sum(x => x.CountyDissatisfied);
+                centerReportStatisticsDto.EnterpriseOrderDto.Satisfied = enterpriseOrderDto2.Sum(x => x.Satisfied);
+                centerReportStatisticsDto.EnterpriseOrderDto.CitySatisfied = enterpriseOrderDto2.Sum(x => x.CitySatisfied);
+                centerReportStatisticsDto.EnterpriseOrderDto.CountySatisfied = enterpriseOrderDto2.Sum(x => x.CountySatisfied);
             }
 
             if (listInfo != null && listInfo.Rows.Count > 0 && centerReportStatisticsDto.EnterpriseOrderDto != null)
@@ -4091,7 +4091,7 @@ namespace Hotline.Api.Controllers.Bi
             //总计
             var total = new SecondaryHandlingSatisfactionVo
             {
-                OrgId = "0",
+                OrgId = "",
                 OrgName = "总计",
                 TotalSumCount = list.Select(x => x.TotalSumCount).Sum(),
                 VerySatisfiedCount = list.Select(x => x.VerySatisfiedCount).Sum(),
@@ -4109,7 +4109,7 @@ namespace Hotline.Api.Controllers.Bi
             var countyList = list.Where(x => x.OrgType == EOrgType.County).ToList();
             var countyTotal = new SecondaryHandlingSatisfactionVo
             {
-                OrgId = "0",
+                OrgId = "",
                 OrgName = "区县合计",
                 TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
                 VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
@@ -4128,7 +4128,7 @@ namespace Hotline.Api.Controllers.Bi
             var cityList = list.Where(x => x.OrgType == EOrgType.City).ToList();
             var cityTotal = new SecondaryHandlingSatisfactionVo
             {
-                OrgId = "0",
+                OrgId = "",
                 OrgName = "市直合计",
                 TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
                 VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),
@@ -4158,7 +4158,7 @@ namespace Hotline.Api.Controllers.Bi
             //总计
             var total = new SecondaryHandlingSatisfactionVo
             {
-                OrgId = "0",
+                OrgId = "",
                 OrgName = "总计",
                 TotalSumCount = secondaryHandling.Select(x => x.TotalSumCount).Sum(),
                 VerySatisfiedCount = secondaryHandling.Select(x => x.VerySatisfiedCount).Sum(),
@@ -4174,7 +4174,7 @@ namespace Hotline.Api.Controllers.Bi
             var countyList = secondaryHandling.Where(x => x.OrgType == EOrgType.County).ToList();
             var countyTotal = new SecondaryHandlingSatisfactionVo
             {
-                OrgId = "0",
+                OrgId = "",
                 OrgName = "区县合计",
                 TotalSumCount = countyList.Select(x => x.TotalSumCount).Sum(),
                 VerySatisfiedCount = countyList.Select(x => x.VerySatisfiedCount).Sum(),
@@ -4190,7 +4190,7 @@ namespace Hotline.Api.Controllers.Bi
             var cityList = secondaryHandling.Where(x => x.OrgType == EOrgType.City).ToList();
             var cityTotal = new SecondaryHandlingSatisfactionVo
             {
-                OrgId = "0",
+                OrgId = "",
                 OrgName = "市直合计",
                 TotalSumCount = cityList.Select(x => x.TotalSumCount).Sum(),
                 VerySatisfiedCount = cityList.Select(x => x.VerySatisfiedCount).Sum(),

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

@@ -8,6 +8,7 @@ using Hotline.Application.Orders;
 using Hotline.Application.Quality;
 using Hotline.Application.Snapshot;
 using Hotline.Application.Systems;
+using Hotline.Article;
 using Hotline.Authentications;
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
@@ -156,6 +157,7 @@ public class OrderController : BaseController
     private readonly IRepository<SystemDicData> _sysDicDataRepository;
     private readonly IRepository<SystemOrganize> _systemOrganizeRepository;
     private readonly IRepository<OrderComplement> _orderComplementRepository;
+    private readonly ICircularRecordDomainService _circularRecordDomainService;
 
     public OrderController(
         IOrderDomainService orderDomainService,
@@ -229,7 +231,8 @@ public class OrderController : BaseController
         IOrderSnapshotApplication orderSnapshotApplication,
         IRepository<SystemDicData> sysDicDataRepository,
         IRepository<SystemOrganize> systemOrganizeRepository,
-        IRepository<OrderComplement> orderComplementRepository)
+        IRepository<OrderComplement> orderComplementRepository,
+        ICircularRecordDomainService circularRecordDomainService)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -303,6 +306,7 @@ public class OrderController : BaseController
         _sysDicDataRepository = sysDicDataRepository;
         _systemOrganizeRepository = systemOrganizeRepository;
         _orderComplementRepository = orderComplementRepository;
+        _circularRecordDomainService = circularRecordDomainService;
     }
 
     #endregion
@@ -3165,7 +3169,7 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.Order.ActualHandleOrgName.Contains(dto.ActualHandleOrgName)) //接办部门(综合查询模糊)
             .WhereIF(!string.IsNullOrEmpty(dto.CurrentStepCode), d => d.Order.CurrentStepCode == dto.CurrentStepCode) //当前办理节点
                .WhereIF(_sessionContext.OrgIsCenter == false, d =>
-               (SqlFunc.IsNullOrEmpty(d.RoleId)==true&& d.OrgId.StartsWith(_sessionContext.RequiredOrgId)) ||
+               (SqlFunc.IsNullOrEmpty(d.RoleId) == true && d.OrgId.StartsWith(_sessionContext.RequiredOrgId)) ||
                (SqlFunc.IsNullOrEmpty(d.RoleId) == false && d.OrgId.StartsWith(_sessionContext.RequiredOrgId) && _sessionContext.Roles.Contains(d.RoleId))
                )
 
@@ -6448,7 +6452,7 @@ public class OrderController : BaseController
                 special.StepCode = currentStep.Code;
             }
 
-            if (order.Status >= EOrderStatus.Filed)
+            if (special.Status >= EOrderStatus.Filed)
             {
                 var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == special.OrderId);
                 if (publish != null)
@@ -6625,7 +6629,7 @@ public class OrderController : BaseController
                     special.StepCode = currentStep.Code;
                 }
 
-                if (order.Status >= EOrderStatus.Filed)
+                if (special.Status >= EOrderStatus.Filed)
                 {
                     var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == special.OrderId);
                     if (publish != null)
@@ -8890,6 +8894,7 @@ public class OrderController : BaseController
                     {
                         circularDto.CircularReadGroups = users;
                         //调用推送消息通用接口
+                        await _circularRecordDomainService.AddCircularMessage(circularDto, HttpContext.RequestAborted);
                     }
                 }
             }

+ 2 - 2
src/Hotline.Api/Controllers/WebPortalController.cs

@@ -1674,7 +1674,7 @@ namespace Hotline.Api.Controllers
                 var data = await _knowledgeRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
                 if (data != null)
                 {
-                    data.PageView = data.PageView++;
+                    data.PageView = data.PageView + 1;
                     await _knowledgeRepository.UpdateAsync(data, HttpContext.RequestAborted);
                     detailsDto = new()
                     {
@@ -1698,7 +1698,7 @@ namespace Hotline.Api.Controllers
                 var data = await _bulletinRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted);
                 if (data != null)
                 {
-                    data.ReadedNum = data.ReadedNum++;
+                    data.ReadedNum = data.ReadedNum + 1;
                     await _bulletinRepository.UpdateAsync(data, HttpContext.RequestAborted);
                     detailsDto = new()
                     {

+ 3 - 1
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -48,7 +48,8 @@ namespace Hotline.Application.FlowEngine
         /// </summary>
         Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
                 WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
-            PreviousAsync(PreviousWorkflowDto dto,
+            PreviousAsync(PreviousWorkflowDto dto, 
+                EHandleMode handleMode = EHandleMode.Previous,
                 Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
                 CancellationToken cancellationToken = default);
 
@@ -58,6 +59,7 @@ namespace Hotline.Application.FlowEngine
         Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
                 WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
             PreviousAsync(PreviousWorkflowDto dto, string applicantId, string applicantOrgId, string[] applicantRoleIds,
+                EHandleMode handleMode = EHandleMode.Previous,
                 Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
                 CancellationToken cancellationToken = default);
 

+ 5 - 3
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -347,6 +347,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     public async Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
             WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
         PreviousAsync(PreviousWorkflowDto dto,
+            EHandleMode handleMode = EHandleMode.Previous,
             Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
     {
@@ -358,7 +359,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             _sessionContextProvider.SessionContext.RequiredOrgId, _sessionContextProvider.SessionContext.OrgName,
             _sessionContextProvider.SessionContext.OrgAreaCode, _sessionContextProvider.SessionContext.OrgAreaName,
             _sessionContextProvider.SessionContext.OrgIsCenter, _sessionContextProvider.SessionContext.Roles,
-            _sessionContextProvider.SessionContext.OrgLevel), newStepConfig, cancellationToken);
+            _sessionContextProvider.SessionContext.OrgLevel), handleMode, newStepConfig, cancellationToken);
     }
 
     /// <summary>
@@ -367,6 +368,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     public async Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
             WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
         PreviousAsync(PreviousWorkflowDto dto, string applicantId, string applicantOrgId, string[] applicantRoleIds,
+            EHandleMode handleMode = EHandleMode.Previous,
             Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
             CancellationToken cancellationToken = default)
     {
@@ -381,7 +383,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             applicantOrgId, user.Organization.Name,
             user.Organization.AreaCode, user.Organization.AreaName,
             user.Organization.IsCenter, applicantRoleIds,
-            user.Organization.Level), newStepConfig, cancellationToken);
+            user.Organization.Level), handleMode, newStepConfig, cancellationToken);
     }
 
     ///// <summary>
@@ -1867,7 +1869,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <summary>
     /// 检查退回节点信息
     /// </summary>
-    public async Task<(WorkflowStep currentStep, WorkflowStep prevStep,List<WorkflowStep> steps, bool isOrgToCenter, bool isSecondToFirstOrgLevel)>
+    public async Task<(WorkflowStep currentStep, WorkflowStep prevStep, List<WorkflowStep> steps, bool isOrgToCenter, bool isSecondToFirstOrgLevel)>
         GetPreviousInformationAsync(string workflowId, string operatorId, string operatorOrgId, string[] roles,
             CancellationToken cancellationToken)
     {

+ 215 - 17
src/Hotline.Application/IndustryClassification/IndustryClassificationApplication.cs

@@ -3,6 +3,7 @@ using Hotline.IndustryClassification;
 using Hotline.Orders;
 using Hotline.Settings;
 using Hotline.Share.Dtos.IndustryClassification;
+using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
 using MapsterMapper;
@@ -18,16 +19,19 @@ namespace Hotline.Application.IndustryClassification
         private readonly ISystemOrganizeRepository _organizeRepository;
         private readonly IIndustryClassificationRepositpry _industrialManagementRepository;
         private readonly ISessionContext _sessionContext;
+        private readonly IOrderRepository _orderRepository;
 
         public IndustryClassificationApplication(IMapper mapper,
             ISystemOrganizeRepository organizeRepository,
             IIndustryClassificationRepositpry industrialManagementRepository,
-            ISessionContext sessionContext)
+            ISessionContext sessionContext,
+            IOrderRepository orderRepository)
         {
             _mapper = mapper;
             _organizeRepository = organizeRepository;
             _industrialManagementRepository = industrialManagementRepository;
             _sessionContext = sessionContext;
+            _orderRepository = orderRepository;
         }
 
         /// <summary>
@@ -56,7 +60,7 @@ namespace Hotline.Application.IndustryClassification
         /// </summary>
         /// <param name="dto"></param>
         /// <returns></returns>
-        public ISugarQueryable<IndustrialManagementOrderDto> GetIndustrialManagementOrderList(IndustrialManagementRequestDto dto)
+        public  ISugarQueryable<IndustrialManagementOrderDto> GetIndustrialManagementOrderList(IndustrialManagementRequestDto dto)
         {
             string industrialId = "";
             if (!_sessionContext.OrgIsCenter)
@@ -70,11 +74,72 @@ namespace Hotline.Application.IndustryClassification
                     industrialId = "-1";
             }
 
-            var query = _industrialManagementRepository.Queryable()
+            var queryorder = _industrialManagementRepository.Queryable()
+             .InnerJoin<IndustryAssociations>((i, io) => i.Id == io.IndustrialManagementId)
+             .InnerJoin<Order>((i, io, o) => io.OrganizeId == o.ActualHandleOrgCode)
+             // .InnerJoin<Order>((i, io, s, o) => s.ExternalId == o.Id)
+             .Where((i, io, o) => o.Status >= EOrderStatus.Filed)
+             .WhereIF(!string.IsNullOrEmpty(industrialId), (i, io, o) => io.IndustrialManagementId == industrialId)
+             .OrderBy((i, io, o) => i.Id)
+             .GroupBy((i, io, o) => new
+             {
+                 o.Id,
+                 o.Status,
+                 IndustrialId = i.Id,
+                 i.IndustrialName,
+                 o.Title,
+                 o.No,
+                 o.AcceptType,
+                 o.AcceptTypeCode,
+                 o.HotspotId,
+                 o.HotspotName,
+                 o.HotspotSpliceName,
+                 o.HotspotExternal,
+                 o.CreationTime,
+                 o.StartTime,
+                 o.OrgLevelOneCode,
+                 o.OrgLevelOneName,
+                 o.ActualHandleOrgName,
+                 o.ActualHandleOrgCode,
+                 o.CounterSignType,
+                 o.FiledTime,
+                 o.ExpiredTime,
+                 o.NearlyExpiredTime,
+                 o.NearlyExpiredTimeOne
+             })
+             .Select((i, io, o) => new IndustrialManagementOrderDto
+             {
+
+                 Id = o.Id,
+                 Status = o.Status,
+                 IndustrialId = i.Id,
+                 IndustrialName = i.IndustrialName,
+                 Title = o.Title,
+                 No = o.No,
+                 AcceptType = o.AcceptType,
+                 AcceptTypeCode = o.AcceptTypeCode,
+                 HotspotId = o.HotspotId,
+                 HotspotName = o.HotspotName,
+                 HotspotSpliceName = o.HotspotSpliceName,
+                 HotspotExternal = o.HotspotExternal,
+                 CreationTime = o.CreationTime,
+                 StartTime = o.StartTime,
+                 OrgLevelOneCode = o.OrgLevelOneCode,
+                 OrgLevelOneName = o.OrgLevelOneName,
+                 ActualHandleOrgName = o.ActualHandleOrgName,
+                 ActualHandleOrgCode = o.ActualHandleOrgCode,
+                 CounterSignType = o.CounterSignType,
+                 FiledTime = o.FiledTime,
+                 ExpiredTime = o.ExpiredTime,
+                 NearlyExpiredTime = o.NearlyExpiredTime,
+                 NearlyExpiredTimeOne = o.NearlyExpiredTimeOne
+             }).MergeTable()
+               ;
+            var queryhuiqian = _industrialManagementRepository.Queryable()
                 .InnerJoin<IndustryAssociations>((i, io) => i.Id == io.IndustrialManagementId)
-                .InnerJoin<WorkflowStep>((i, io, s) => io.OrganizeId == s.HandlerOrgId)
+                .InnerJoin<WorkflowTrace>((i, io, s) => io.OrganizeId == s.HandlerOrgId)
                 .InnerJoin<Order>((i, io, s, o) => s.ExternalId == o.Id)
-                .Where((i, io, s, o) => o.Status >= EOrderStatus.Filed)
+                .Where((i, io, s, o) => o.Status >= EOrderStatus.Filed && s.CountersignPosition == ECountersignPosition.Direct)
                 .WhereIF(!string.IsNullOrEmpty(industrialId), (i, io, s, o) => io.IndustrialManagementId == industrialId)
                 .OrderBy((i, io, s, o) => i.Id)
                 .GroupBy((i, io, s, o) => new
@@ -130,20 +195,153 @@ namespace Hotline.Application.IndustryClassification
                     NearlyExpiredTime = o.NearlyExpiredTime,
                     NearlyExpiredTimeOne = o.NearlyExpiredTimeOne
                 }).MergeTable()
-                .WhereIF(!string.IsNullOrEmpty(dto.IndustrialName), d => d.IndustrialName.Contains(dto.IndustrialName))
-                .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
-                .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No))
-                .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.AcceptTypeCode == dto.AcceptTypeCode)
-                  .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime) //受理时间开始
-                .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime) //受理时间结束
-                .WhereIF(!string.IsNullOrEmpty(dto.HotspotSpliceName), d => d.HotspotSpliceName.Contains(dto.HotspotSpliceName))
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName))
-                .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName))
-                .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc) //默认排序时间为创建时间
-                .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //工单创建时间
-                .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //工单创建时间降序
                 ;
+
+            var query = _orderRepository.UnionAll(queryorder, queryhuiqian)
+                       .OrderBy(d => d.Id)
+                       .GroupBy(d => new
+                       {
+                           d.Id,
+                           d.Status,
+                           d.IndustrialId,
+                           d.IndustrialName,
+                           d.Title,
+                           d.No,
+                           d.AcceptType,
+                           d.AcceptTypeCode,
+                           d.HotspotId,
+                           d.HotspotName,
+                           d.HotspotSpliceName,
+                           d.HotspotExternal,
+                           d.CreationTime,
+                           d.StartTime,
+                           d.OrgLevelOneCode,
+                           d.OrgLevelOneName,
+                           d.ActualHandleOrgName,
+                           d.ActualHandleOrgCode,
+                           d.CounterSignType,
+                           d.FiledTime,
+                           d.ExpiredTime,
+                           d.NearlyExpiredTime,
+                           d.NearlyExpiredTimeOne
+                       })
+                       .Select(d => new IndustrialManagementOrderDto
+                       {
+
+                           Id = d.Id,
+                           Status = d.Status,
+                           IndustrialId = d.IndustrialId,
+                           IndustrialName = d.IndustrialName,
+                           Title = d.Title,
+                           No = d.No,
+                           AcceptType = d.AcceptType,
+                           AcceptTypeCode = d.AcceptTypeCode,
+                           HotspotId = d.HotspotId,
+                           HotspotName = d.HotspotName,
+                           HotspotSpliceName = d.HotspotSpliceName,
+                           HotspotExternal = d.HotspotExternal,
+                           CreationTime = d.CreationTime,
+                           StartTime = d.StartTime,
+                           OrgLevelOneCode = d.OrgLevelOneCode,
+                           OrgLevelOneName = d.OrgLevelOneName,
+                           ActualHandleOrgName = d.ActualHandleOrgName,
+                           ActualHandleOrgCode = d.ActualHandleOrgCode,
+                           CounterSignType = d.CounterSignType,
+                           FiledTime = d.FiledTime,
+                           ExpiredTime = d.ExpiredTime,
+                           NearlyExpiredTime = d.NearlyExpiredTime,
+                           NearlyExpiredTimeOne = d.NearlyExpiredTimeOne
+                       }).MergeTable()
+                       .WhereIF(!string.IsNullOrEmpty(dto.IndustrialName), d => d.IndustrialName.Contains(dto.IndustrialName))
+                       .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
+                       .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No))
+                       .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.AcceptTypeCode == dto.AcceptTypeCode)
+                         .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime) //受理时间开始
+                       .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime) //受理时间结束
+                       .WhereIF(!string.IsNullOrEmpty(dto.HotspotSpliceName), d => d.HotspotSpliceName.Contains(dto.HotspotSpliceName))
+                       .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName))
+                       .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName))
+                       .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc) //默认排序时间为创建时间
+                       .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //工单创建时间
+                       .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //工单创建时间降序
+                       ;
+
             return query;
+
+            //var query = _industrialManagementRepository.Queryable()
+            //    .InnerJoin<IndustryAssociations>((i, io) => i.Id == io.IndustrialManagementId)
+            //    .InnerJoin<WorkflowStep>((i, io, s) => io.OrganizeId == s.HandlerOrgId)
+            //    .InnerJoin<Order>((i, io, s, o) => s.ExternalId == o.Id)
+            //    .Where((i, io, s, o) => o.Status >= EOrderStatus.Filed)
+            //    .WhereIF(!string.IsNullOrEmpty(industrialId), (i, io, s, o) => io.IndustrialManagementId == industrialId)
+            //    .OrderBy((i, io, s, o) => i.Id)
+            //    .GroupBy((i, io, s, o) => new
+            //    {
+            //        o.Id,
+            //        o.Status,
+            //        IndustrialId = i.Id,
+            //        i.IndustrialName,
+            //        o.Title,
+            //        o.No,
+            //        o.AcceptType,
+            //        o.AcceptTypeCode,
+            //        o.HotspotId,
+            //        o.HotspotName,
+            //        o.HotspotSpliceName,
+            //        o.HotspotExternal,
+            //        o.CreationTime,
+            //        o.StartTime,
+            //        o.OrgLevelOneCode,
+            //        o.OrgLevelOneName,
+            //        o.ActualHandleOrgName,
+            //        o.ActualHandleOrgCode,
+            //        o.CounterSignType,
+            //        o.FiledTime,
+            //        o.ExpiredTime,
+            //        o.NearlyExpiredTime,
+            //        o.NearlyExpiredTimeOne
+            //    })
+            //    .Select((i, io, s, o) => new IndustrialManagementOrderDto
+            //    {
+
+            //        Id = o.Id,
+            //        Status = o.Status,
+            //        IndustrialId = i.Id,
+            //        IndustrialName = i.IndustrialName,
+            //        Title = o.Title,
+            //        No = o.No,
+            //        AcceptType = o.AcceptType,
+            //        AcceptTypeCode = o.AcceptTypeCode,
+            //        HotspotId = o.HotspotId,
+            //        HotspotName = o.HotspotName,
+            //        HotspotSpliceName = o.HotspotSpliceName,
+            //        HotspotExternal = o.HotspotExternal,
+            //        CreationTime = o.CreationTime,
+            //        StartTime = o.StartTime,
+            //        OrgLevelOneCode = o.OrgLevelOneCode,
+            //        OrgLevelOneName = o.OrgLevelOneName,
+            //        ActualHandleOrgName = o.ActualHandleOrgName,
+            //        ActualHandleOrgCode = o.ActualHandleOrgCode,
+            //        CounterSignType = o.CounterSignType,
+            //        FiledTime = o.FiledTime,
+            //        ExpiredTime = o.ExpiredTime,
+            //        NearlyExpiredTime = o.NearlyExpiredTime,
+            //        NearlyExpiredTimeOne = o.NearlyExpiredTimeOne
+            //    }).MergeTable()
+            //    .WhereIF(!string.IsNullOrEmpty(dto.IndustrialName), d => d.IndustrialName.Contains(dto.IndustrialName))
+            //    .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
+            //    .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No))
+            //    .WhereIF(!string.IsNullOrEmpty(dto.AcceptTypeCode), d => d.AcceptTypeCode == dto.AcceptTypeCode)
+            //      .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime) //受理时间开始
+            //    .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime) //受理时间结束
+            //    .WhereIF(!string.IsNullOrEmpty(dto.HotspotSpliceName), d => d.HotspotSpliceName.Contains(dto.HotspotSpliceName))
+            //    .WhereIF(!string.IsNullOrEmpty(dto.OrgLevelOneName), d => d.OrgLevelOneName.Contains(dto.OrgLevelOneName))
+            //    .WhereIF(!string.IsNullOrEmpty(dto.ActualHandleOrgName), d => d.ActualHandleOrgName.Contains(dto.ActualHandleOrgName))
+            //    .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.CreationTime, OrderByType.Desc) //默认排序时间为创建时间
+            //    .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //工单创建时间
+            //    .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //工单创建时间降序
+            //    ;
+
         }
     }
 }

+ 5 - 4
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -113,7 +113,8 @@ public class OrderMapperConfigs : IRegister
             .Map(d => d.OrderExtension.Id, x => x.Id)
             //.IgnoreIf((s, d) => !string.IsNullOrEmpty(s.FileOpinion), d => d.FileOpinion)
             //.IgnoreIf((s, d) => !string.IsNullOrEmpty(s.CenterOpinion), d => d.CenterToOrgOpinion)
-            .Ignore(d => d.ProvinceNo);
+            .Ignore(d => d.ProvinceNo)
+            .Ignore(d => d.SmsSended);
 
         config.ForType<Workflow, Order>()
             .Map(d => d.WorkflowId, s => s.Id)
@@ -237,15 +238,15 @@ public class OrderMapperConfigs : IRegister
             .Map(d => d.ArrangeOpinion, s => s.OrderPublish.ArrangeOpinion)
             .AfterMapping((s, d) =>
             {
-                if(s.TraceStyle == ETraceStyle.Visit 
-                   && s.OrderVisit != null 
+                if (s.TraceStyle == ETraceStyle.Visit
+                   && s.OrderVisit != null
                    && s.OrderVisit.OrderVisitDetails.Any(x => x.VisitTarget == EVisitTarget.Seat))
                 {
                     d.VoiceEvaluate = s.OrderVisit.OrderVisitDetails.First(x => x.VisitTarget == EVisitTarget.Seat).VoiceEvaluate;
                     d.SeatEvaluate = s.OrderVisit.OrderVisitDetails.First(x => x.VisitTarget == EVisitTarget.Seat).SeatEvaluate;
                     d.VisitContent = s.OrderVisit.OrderVisitDetails.First(x => x.VisitTarget == EVisitTarget.Seat).VisitContent;
                 }
-                if(s.TraceStyle == ETraceStyle.Visit
+                if (s.TraceStyle == ETraceStyle.Visit
                    && s.OrderVisit != null
                    && s.OrderVisit.OrderVisitDetails.Any(x => x.VisitTarget == EVisitTarget.Org))
                 {

+ 92 - 60
src/Hotline.Application/Orders/OrderApplication.cs

@@ -109,9 +109,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     private readonly IRepository<OrderTsDetails> _orderTsDetailsRepository;
     private readonly IRepository<KnowledgeQuote> _knowledgeQuoteRepository;
     private readonly IRepository<OrderSpecial> _orderSpecialRepository;
-	private readonly IWorkflowApplication _workflowApplication;
+    private readonly IWorkflowApplication _workflowApplication;
 
-	public OrderApplication(
+    public OrderApplication(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -155,7 +155,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         IRepository<OrderTsDetails> orderTsDetailsRepository,
         IRepository<KnowledgeQuote> knowledgeQuoteRepository,
         IRepository<OrderSpecial> orderSpecialRepository,
-		IWorkflowApplication workflowApplication)
+        IWorkflowApplication workflowApplication)
     {
         _orderDomainService = orderDomainService;
         _workflowDomainService = workflowDomainService;
@@ -202,7 +202,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _orderSpecialRepository = orderSpecialRepository;
         _workflowApplication = workflowApplication;
 
-	}
+    }
 
     /// <summary>
     /// 更新工单办理期满时间(延期调用,其他不调用)
@@ -777,8 +777,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                                                                               //    d => d.AcceptorName.Contains(dto.PubMan!) || d.AcceptorStaffNo.Contains(dto.PubMan!))
                                                                                               //.WhereIF(dto.PubRange == EPublicState.Pub, d => d.OrderPublish.PublishState)
                                                                                               //.WhereIF(dto.PubRange == EPublicState.NoPub, d => !d.OrderPublish.PublishState)
-            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
-            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Source != ESource.ProvinceStraight)
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.IsProvince == true)
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.IsProvince == false)
             //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.ProcessType == EProcessType.Zhiban)
             //.WhereIF(dto.FiledType != null && dto.FiledType == FiledType.OrgFiled, d => d.ProcessType == EProcessType.Jiaoban)
             .WhereIF(dto.FiledType != null && dto.FiledType == FiledType.CenterFiled, d => d.FileOrgIsCenter == true)
@@ -1528,8 +1528,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                 .WhereIF(!string.IsNullOrEmpty(dto.AreaCode) && dto.AreaCode.LastIndexOf("00") > 0,
                     d => d.AreaCode.StartsWith(SqlFunc.Substring(dto.AreaCode, 0, 4)))
                 .WhereIF(!string.IsNullOrEmpty(dto.AreaCode) && dto.AreaCode.LastIndexOf("00") <= 0, d => d.AreaCode.StartsWith(dto.AreaCode))
-                .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.Source == ESource.ProvinceStraight)
-                .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.Source != ESource.ProvinceStraight)
+                .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true, d => d.IsProvince == true)
+                .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false, d => d.IsProvince == false)
                 .WhereIF(!string.IsNullOrEmpty(dto.SensitiveWord), d => SqlFunc.JsonArrayAny(d.Sensitive, dto.SensitiveWord))
                 .WhereIF(dto.IsSensitiveWord.HasValue && dto.IsSensitiveWord == true,
                     d => d.Sensitive != null && SqlFunc.JsonArrayLength(d.Sensitive) > 0)
@@ -5153,41 +5153,72 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
     #region 退回重写
 
-	public async Task OrderPrevious(OrderSendBackAudit sendBack,Order order, CancellationToken cancellationToken) {
-
-		var (workflow, currentStep, prevDefine, prevStep, newStep, flowDirection) =
-			   await _workflowApplication.PreviousAsync(sendBack.SendBackData,
-				   async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
-				   {
-					   var stepAssignInfo =
-						   await GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1, cancellationToken);
-					   if (stepAssignInfo is null) return;
-					   var validator = new StepAssignInfoValidator();
-					   await validator.ValidateAndThrowAsync(stepAssignInfo);
-					   newStep.Assign(stepAssignInfo);
-					   if (sendBack.AssignStepId != prevStep1.Id) prevStep1.HandleMode = EHandleMode.PreviousNoDisplay;
-				   },
-				   cancellationToken);
-
-		if (sendBack.IsAssign.Value)
+    public async Task OrderPrevious(OrderSendBackAudit sendBack, Order order, CancellationToken cancellationToken)
+    {
+
+        //var (workflow, currentStep, prevDefine, prevStep, newStep, flowDirection) =
+        //       await _workflowApplication.PreviousAsync(sendBack.SendBackData,
+        //           async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
+        //           {
+        //               var stepAssignInfo =
+        //                   await GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1, cancellationToken);
+        //               if (stepAssignInfo is null) return;
+        //               var validator = new StepAssignInfoValidator();
+        //               await validator.ValidateAndThrowAsync(stepAssignInfo);
+        //               newStep.Assign(stepAssignInfo);
+        //               if (sendBack.AssignStepId != prevStep1.Id) prevStep1.HandleMode = EHandleMode.PreviousNoDisplay;
+        //           },
+        //           cancellationToken);
+
+        //if (sendBack.IsAssign.Value)
+        //{
+        //    while (sendBack.AssignStepId != prevStep.Id)
+        //    {
+        //        (workflow, currentStep, prevDefine, prevStep, newStep, flowDirection) =
+        //       await _workflowApplication.PreviousAsync(sendBack.SendBackData,
+        //           async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
+        //           {
+        //               var stepAssignInfo =
+        //                   await GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1, cancellationToken);
+        //               if (stepAssignInfo is null) return;
+        //               var validator = new StepAssignInfoValidator();
+        //               await validator.ValidateAndThrowAsync(stepAssignInfo);
+        //               newStep.Assign(stepAssignInfo);
+        //               if (sendBack.AssignStepId != prevStep.Id) prevStep1.HandleMode = EHandleMode.PreviousNoDisplay;
+        //           },
+        //           cancellationToken);
+        //    }
+        //}
+
+        var handleMode = EHandleMode.Previous;
+        WorkflowStep? currentStep, prevStep, newStep, startStep = null;
+        EFlowDirection flowDirection;
+        var userId = _sessionContextProvider.SessionContext.RequiredUserId;
+        var orgId = _sessionContextProvider.SessionContext.RequiredOrgId;
+        var roles = _sessionContextProvider.SessionContext.Roles;
+        do
         {
-			while (sendBack.AssignStepId != prevStep.Id)
-			{
-                (workflow, currentStep, prevDefine, prevStep, newStep, flowDirection) =
-               await _workflowApplication.PreviousAsync(sendBack.SendBackData,
-                   async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
-                   {
-                       var stepAssignInfo =
-                           await GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1, cancellationToken);
-                       if (stepAssignInfo is null) return;
-                       var validator = new StepAssignInfoValidator();
-                       await validator.ValidateAndThrowAsync(stepAssignInfo);
-                       newStep.Assign(stepAssignInfo);
-                       if (sendBack.AssignStepId != prevStep.Id) prevStep1.HandleMode = EHandleMode.PreviousNoDisplay;
-                   },
-                   cancellationToken);
-			}
-		}
+            (_, currentStep, _, prevStep, newStep, flowDirection) =
+                await _workflowApplication.PreviousAsync(sendBack.SendBackData,
+                    userId, orgId, roles, handleMode,
+                    async (workflow1, currentStep1, prevStepDefine, prevStep1, newStep) =>
+                    {
+                        var stepAssignInfo =
+                            await GetOrderPreviousAssignInfoAsync(workflow1, prevStepDefine, prevStep1, cancellationToken);
+                        if (stepAssignInfo is null) return;
+                        var validator = new StepAssignInfoValidator();
+                        await validator.ValidateAndThrowAsync(stepAssignInfo);
+                        newStep.Assign(stepAssignInfo);
+
+                        if (sendBack.AssignStepId != prevStep1.Id) handleMode = EHandleMode.PreviousNoDisplay;
+                    },
+                    cancellationToken);
+
+            startStep ??= currentStep;
+            userId = prevStep.HandlerId;
+            orgId = prevStep.HandlerOrgId;
+            roles = [prevStep.RoleId];
+        } while (sendBack.AssignStepId != prevStep.Id && prevStep.StepType is not EStepType.Start && !prevStep.IsOrigin);
 
         sendBack.ApplyOrgId = currentStep.AcceptorOrgId;
         sendBack.ApplyOrgName = currentStep!.AcceptorOrgName;
@@ -5196,29 +5227,30 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         sendBack.SendBackStepName = prevStep.Name;
         sendBack.WorkflowStepSendBackCrTime = currentStep.CreationTime;
         sendBack.TraceId = currentStep.Id;
-		//记录退回后最新的流程节点
-		if (newStep != null && !string.IsNullOrEmpty(newStep.Id))
-			sendBack.NewCurrentStepId = newStep.Id;
+        //记录退回后最新的流程节点
+        if (newStep != null && !string.IsNullOrEmpty(newStep.Id))
+            sendBack.NewCurrentStepId = newStep.Id;
 
-		var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
-			? EProcessType.Zhiban
-			: EProcessType.Jiaoban;
-		if (currentStep.AcceptorOrgId != OrgSeedData.CenterId && prevStep.BusinessType == EBusinessType.Send)
-			order.SendBackNum = order.SendBackNum.HasValue ? order.SendBackNum.Value + 1 : 1;
+        var processType = flowDirection == EFlowDirection.OrgToCenter || flowDirection == EFlowDirection.CenterToCenter
+            ? EProcessType.Zhiban
+            : EProcessType.Jiaoban;
+        if (currentStep.AcceptorOrgId != OrgSeedData.CenterId && prevStep.BusinessType == EBusinessType.Send)
+            order.SendBackNum = order.SendBackNum.HasValue ? order.SendBackNum.Value + 1 : 1;
 
-		if (prevStep.BusinessType == EBusinessType.Send)
+        if (prevStep.BusinessType == EBusinessType.Send)
         {
             await _orderRepository.Updateable().SetColumns(o => new Order()
             { CenterToOrgHandlerId = newStep.HandlerId, CenterToOrgHandlerName = newStep.HandlerName, ProcessType = processType, SendBackNum = order.SendBackNum })
                 .Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
         }
-        else {
-			await _orderRepository.Updateable().SetColumns(o => new Order() { ProcessType = processType, SendBackNum = order.SendBackNum })
-			.Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
-		}
-	
-
-		await _orderSendBackAuditRepository.AddAsync(sendBack, cancellationToken);
-	}
-	#endregion
+        else
+        {
+            await _orderRepository.Updateable().SetColumns(o => new Order() { ProcessType = processType, SendBackNum = order.SendBackNum })
+            .Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
+        }
+
+
+        await _orderSendBackAuditRepository.AddAsync(sendBack, cancellationToken);
+    }
+    #endregion
 }

+ 86 - 71
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -31,6 +31,7 @@ using DocumentFormat.OpenXml.Office2010.Excel;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Validators.FlowEngine;
 using FluentValidation;
+using Hotline.Authentications;
 
 namespace Hotline.Application.Orders
 {
@@ -53,9 +54,9 @@ namespace Hotline.Application.Orders
         private readonly IOrderDomainService _orderDomainService;
         private readonly IOrderScreenRepository _orderScreenRepository;
         private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
-		private readonly IOrderApplication _orderApplication;
+        private readonly IOrderApplication _orderApplication;
 
-		public OrderSecondaryHandlingApplication(
+        public OrderSecondaryHandlingApplication(
             IMapper mapper,
             IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository,
             IFileRepository fileRepository,
@@ -72,8 +73,8 @@ namespace Hotline.Application.Orders
             IOrderDomainService orderDomainService,
             IOrderScreenRepository orderScreenRepository,
             IOptionsSnapshot<AppConfiguration> appOptions,
-			ICalcExpireTime expireTime,
-			IOrderApplication orderApplication)
+            ICalcExpireTime expireTime,
+            IOrderApplication orderApplication)
         {
             _mapper = mapper;
             _orderSecondaryHandlingRepository = orderSecondaryHandlingRepository;
@@ -92,8 +93,8 @@ namespace Hotline.Application.Orders
             _expireTime = expireTime;
             _orderScreenRepository = orderScreenRepository;
             _appOptions = appOptions;
-			_orderApplication = orderApplication;
-		}
+            _orderApplication = orderApplication;
+        }
 
         /// <summary>
         ///  二次办理新增
@@ -149,9 +150,9 @@ namespace Hotline.Application.Orders
             var visit = await _orderVisitRepository.GetAsync(x => x.Id == model.VisitId, cancellationToken);
             if (visit != null)
             {
-				//visit.VisitState = model.VisitState;
-				visit.IsCanHandle = true;
-				await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
+                //visit.VisitState = model.VisitState;
+                visit.IsCanHandle = true;
+                await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
             }
         }
 
@@ -167,15 +168,15 @@ namespace Hotline.Application.Orders
             model.AuditId = _sessionContext.UserId;
             model.AuditUser = _sessionContext.UserName;
             model.AuditTime = DateTime.Now;
-            var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == model.OrderId, cancellationToken);
-			if (model.State == ESecondaryHandlingState.End)
+            var visit = await _orderVisitRepository.GetAsync(x => x.OrderId == model.OrderId && x.VisitState == EVisitState.Visited, cancellationToken);
+            if (model.State == ESecondaryHandlingState.End)
             {
                 var order = await _orderRepository.GetAsync(x => x.Id == model.OrderId, cancellationToken);
                 if (string.IsNullOrEmpty(order.WorkflowId))
                     throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程信息!");
                 string orgId = order.CounterSignType == ECounterSignType.Department ? model.ApplyOrgId.Substring(0, 6) : model.ApplyOrgId;
-				var step = await _workflowDomainService.FindLastHandleStepAsync(order.WorkflowId, orgId, cancellationToken);
-				if (step == null)
+                var step = await _workflowDomainService.FindLastHandleStepAsync(order.WorkflowId, orgId, cancellationToken);
+                if (step == null)
                     throw UserFriendlyException.SameMessage("无效二次办理审批信息,没有找到对应流程节点!");
                 var recall = new RecallDto
                 {
@@ -190,18 +191,18 @@ namespace Hotline.Application.Orders
                 };
                 var reTransactNum = order.ReTransactNum is null ? 1 : order.ReTransactNum + 1;
                 //var expiredTime = _timeLimitDomainService.CalcEndTime(DateTime.Now, order.AcceptTypeCode);
-                
-                var expiredTime = await _expireTime.CalcEndTime(DateTime.Now,DateTime.Now, order.AcceptTypeCode);
+
+                var expiredTime = await _expireTime.CalcEndTime(DateTime.Now, DateTime.Now, order.AcceptTypeCode);
                 var processType = step.FlowDirection == EFlowDirection.OrgToCenter || step.FlowDirection == EFlowDirection.CenterToCenter ? EProcessType.Zhiban : EProcessType.Jiaoban;
                 var isOrderFiled = order.Status >= EOrderStatus.Filed;
                 order.ExpiredTime = expiredTime.ExpiredTime;
-				order.NearlyExpiredTime = expiredTime.NearlyExpiredTime;
-				order.NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne;
-				order.ReTransactNum = reTransactNum;
-				order.ProcessType = processType;
-				order.Status = EOrderStatus.Special;
+                order.NearlyExpiredTime = expiredTime.NearlyExpiredTime;
+                order.NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne;
+                order.ReTransactNum = reTransactNum;
+                order.ProcessType = processType;
+                order.Status = EOrderStatus.Special;
 
-				await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ReTransactNum = reTransactNum, ProcessType = processType, Status = EOrderStatus.Handling })
+                await _orderRepository.Updateable().SetColumns(o => new Order() { ExpiredTime = expiredTime.ExpiredTime, NearlyExpiredTime = expiredTime.NearlyExpiredTime, NearlyExpiredTimeOne = expiredTime.NearlyExpiredTimeOne, ReTransactNum = reTransactNum, ProcessType = processType, Status = EOrderStatus.Handling })
                     .Where(o => o.Id == order.Id).ExecuteCommandAsync(cancellationToken);
                 var orderDto = _mapper.Map<OrderDto>(order);
                 await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto, cancellationToken: cancellationToken);
@@ -224,42 +225,41 @@ namespace Hotline.Application.Orders
                 if (_appOptions.Value.IsYiBin)
                 {
                     var screen = await _orderScreenRepository.Queryable().FirstAsync(
-					x => x.OrderId == model.OrderId &&
-					     (x.Status != EScreenStatus.End && x.Status != EScreenStatus.Refuse), cancellationToken);
-					if (screen != null)
-					{
-						await _orderScreenRepository.RemoveAsync(screen, false, cancellationToken);
-					}
+                    x => x.OrderId == model.OrderId &&
+                         (x.Status != EScreenStatus.End && x.Status != EScreenStatus.Refuse), cancellationToken);
+                    if (screen != null)
+                    {
+                        await _orderScreenRepository.RemoveAsync(screen, false, cancellationToken);
+                    }
                 }
 
-				var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) = await _workflowDomainService.RecallAsync(recall,
-						recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.SecondHandle,
-						order.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.SecondaryHandle,
-						async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
-						{
-							var basicWorkflowDto = _mapper.Map<BasicWorkflowDto>(dto);
-							var stepAssignInfo = await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
-								basicWorkflowDto, cancellationToken);
-							if (stepAssignInfo is null) return;
-							var validator = new StepAssignInfoValidator();
-							await validator.ValidateAndThrowAsync(stepAssignInfo, cancellationToken);
-
-							targetStepNew.Assign(stepAssignInfo);
-						},
-						cancellationToken);
+                var (workflow, targetStepDefine, currentStep, targetStep, newStep, isOrgToCenter) = await _workflowDomainService.RecallAsync(recall,
+                        recall.NextHandlers.FirstOrDefault(), EWorkflowTraceType.SecondHandle,
+                        order.ExpiredTime, order.Status >= EOrderStatus.Filed, EHandleMode.SecondaryHandle,
+                        async (workflow, currentStep, targetStepDefine, targetStep, targetStepNew) =>
+                        {
+                            var basicWorkflowDto = _mapper.Map<BasicWorkflowDto>(dto);
+                            var stepAssignInfo = await _orderApplication.GetOrderRecallAssignInfoAsync(workflow, targetStepDefine, targetStep,
+                                basicWorkflowDto, cancellationToken);
+                            if (stepAssignInfo is null) return;
+                            var validator = new StepAssignInfoValidator();
+                            await validator.ValidateAndThrowAsync(stepAssignInfo, cancellationToken);
+
+                            targetStepNew.Assign(stepAssignInfo);
+                        },
+                        cancellationToken);
                 _mapper.Map(workflow, order);
                 order.FileEmpty();
                 await _orderRepository.UpdateAsync(order, false, cancellationToken);
 
                 visit.VisitState = EVisitState.None;
-                await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
 			}
             else
             {
                 visit.IsCanHandle = true;
-				await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
             }
-            await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
+			await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
+			await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
         }
 
 
@@ -281,7 +281,7 @@ namespace Hotline.Application.Orders
                 .Where(x => x.OrderVisit.Order.IsProvince == false)
                 .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false)
                 //.Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
-                .Where(x=> SqlFunc.Subqueryable<OrderSecondaryHandling>().Where(osh => osh.VisitDetailId == x.Id &&  osh.State != ESecondaryHandlingState.NotApply).NotAny())
+                .Where(x => SqlFunc.Subqueryable<OrderSecondaryHandling>().Where(osh => osh.VisitDetailId == x.Id && osh.State != ESecondaryHandlingState.NotApply).NotAny())
                 //.Where(x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
                 .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
                 .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
@@ -301,7 +301,7 @@ namespace Hotline.Application.Orders
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason), x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
                 //.Where(x => SqlFunc.Subqueryable<OrderVisit>().Where(ov => ov.Id == x.VisitId && ov.VisitState == EVisitState.Visited && ov.IsCanHandle).Any())
                 .Where((x, s) => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
-                .WhereIF(!isAdmin, (x, s) => (x.OrderVisit.Order.CounterSignType ==  ECounterSignType.Department || x.OrderVisit.Order.CounterSignType == null) && x.VisitOrgCode.StartsWith(_sessionContext.OrgId))
+                .WhereIF(!isAdmin, (x, s) => (x.OrderVisit.Order.CounterSignType == ECounterSignType.Department || x.OrderVisit.Order.CounterSignType == null) && x.VisitOrgCode.StartsWith(_sessionContext.OrgId))
                 ;
             if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
             {
@@ -328,14 +328,14 @@ namespace Hotline.Application.Orders
                     ));
             }
 
-			return query.OrderByDescending((x, s) => x.CreationTime);
-		}
+            return query.OrderByDescending((x, s) => x.CreationTime);
+        }
 
-		/// <summary>
-		/// 二次办理列表查询
-		/// </summary>
-		/// <returns></returns>
-		public ISugarQueryable<OrderSecondaryHandling> Query(SecondaryHandlingListDto dto, CancellationToken cancellationToken)
+        /// <summary>
+        /// 二次办理列表查询
+        /// </summary>
+        /// <returns></returns>
+        public ISugarQueryable<OrderSecondaryHandling> Query(SecondaryHandlingListDto dto, CancellationToken cancellationToken)
         {
             if (dto.CreationTimeEnd.HasValue)
                 dto.CreationTimeEnd = dto.CreationTimeEnd.Value.AddDays(1).AddSeconds(-1);
@@ -345,7 +345,7 @@ namespace Hotline.Application.Orders
                 .Includes(x => x.Visit, d => d.Order)
                 .Where(x => x.State > ESecondaryHandlingState.NotApply)
                 .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Visit.Order.Title.Contains(dto.Keyword!) || x.Visit.Order.No.Contains(dto.Keyword!))
-				.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Visit.Order.Title.Contains(dto.Title!))
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Visit.Order.Title.Contains(dto.Title!))
                 .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.Visit.Order.No.Contains(dto.No!))
                 .WhereIF(dto.Status is ESecondaryHandlingState.Apply, x => x.State == ESecondaryHandlingState.Apply)
                 .WhereIF(dto.Status is ESecondaryHandlingState.Handled, x => x.State != ESecondaryHandlingState.Apply)
@@ -377,20 +377,27 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         public ISugarQueryable<SecondaryHandlingVo> SecondaryHandlingReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
         {
-            return _orderSecondaryHandlingRepository.Queryable()
-                .WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
-                .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
-                .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
-                .Where(x => x.State == ESecondaryHandlingState.End)
-                .GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName })
-                .Select(x => new SecondaryHandlingVo
-                {
-                    OrgId = x.ApplyOrgId,
-                    OrgName = x.ApplyOrgName,
-                    Num = SqlFunc.AggregateCount(x.Id)
-                })
-                .OrderByIF(dto.SortRule is 0, x => x.Num, OrderByType.Asc)
-                .OrderByIF(dto.SortRule is 1, x => x.Num, OrderByType.Desc);
+            var query = _orderSecondaryHandlingRepository.Queryable();
+
+            var isCenter = _sessionContext.OrgIsCenter;
+            if (!isCenter)
+            {
+                query.Where(x => x.ApplyOrgId.StartsWith(_sessionContext.OrgId));
+            }
+
+            return query.WhereIF(dto.StartTime.HasValue, x => x.CreationTime >= dto.StartTime)
+                        .WhereIF(dto.EndTime.HasValue, x => x.CreationTime <= dto.EndTime)
+                        .WhereIF(!string.IsNullOrEmpty(dto.OrgName), x => x.ApplyOrgName.Equals(dto.OrgName))
+                        .Where(x => x.State == ESecondaryHandlingState.End)
+                        .GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName })
+                        .Select(x => new SecondaryHandlingVo
+                        {
+                            OrgId = x.ApplyOrgId,
+                            OrgName = x.ApplyOrgName,
+                            Num = SqlFunc.AggregateCount(x.Id)
+                        })
+                        .OrderByIF(dto.SortRule is 0, x => x.Num, OrderByType.Asc)
+                        .OrderByIF(dto.SortRule is 1, x => x.Num, OrderByType.Desc);
         }
 
         /// <summary>
@@ -419,7 +426,15 @@ namespace Hotline.Application.Orders
         /// <returns></returns>
         public ISugarQueryable<SecondaryHandlingSatisfactionVo> SecondaryHandlingSatisfactionReport(QuerySecondaryHandlingRequest dto, CancellationToken cancellationToken)
         {
-            return _orderSecondaryHandlingRepository.Queryable()
+            var query = _orderSecondaryHandlingRepository.Queryable();
+
+            var isCenter = _sessionContext.OrgIsCenter;
+            if (!isCenter)
+            {
+                query.Where(x => x.ApplyOrgId.StartsWith(_sessionContext.OrgId));
+            }
+
+            return query
                 .Includes(x => x.Order)
                 .Includes(x => x.Visit)
                 .Includes(x => x.VisitDetail)
@@ -495,7 +510,7 @@ namespace Hotline.Application.Orders
                 .WhereIF(!string.IsNullOrEmpty(dto.CDPN), x => x.Order.CallRecord.CDPN.Contains(dto.CDPN))
                 .WhereIF(dto.VisitTypeId is 1 && !string.IsNullOrEmpty(key), x => SqlFunc.JsonField(x.VisitDetail.OrgProcessingResults, "Key") == key)
                 .WhereIF(dto.VisitTypeId is 2 && !string.IsNullOrEmpty(key), x => SqlFunc.JsonField(x.VisitDetail.OrgHandledAttitude, "Key") == key)
-                .Where(x => x.ApplyOrgId == dto.OrgId)
+                .WhereIF(!string.IsNullOrEmpty(dto.OrgId), x => x.ApplyOrgId == dto.OrgId)
                 .Where(x => x.State == ESecondaryHandlingState.End);
         }
 

+ 2 - 0
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -1904,6 +1904,8 @@ namespace Hotline.Repository.SqlSugar.Orders
                 .WhereIF(dto.OrgCode == "001", x => x.VisitOrgCode == dto.OrgCode)
                 .WhereIF(dto.TypeCode != null && dto.TypeCode == 1, x => x.OrderVisit.Order.IdentityType == EIdentityType.Citizen)
                 .WhereIF(dto.TypeCode != null && dto.TypeCode == 2, x => x.OrderVisit.Order.IdentityType == EIdentityType.Enterprise)
+                .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order.No == dto.No)
+                .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order.Title.Contains(dto.Title))
                 //.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)

+ 15 - 5
src/Hotline.Share/Dtos/Bi/BiOrderDto.cs

@@ -77,11 +77,21 @@ namespace Hotline.Share.Dtos.Bi
         /// </summary>
         public string? ActualHandleOrgName { get; set; }
 
-		/// <summary>
-		/// 是否甄别
-		/// </summary>
-		public bool? IsScreen { get; set; }
-	}
+        /// <summary>
+        /// 是否甄别
+        /// </summary>
+        public bool? IsScreen { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        public string? No { get; set; }
+
+        /// <summary>
+        /// 标题
+        /// </summary>
+        public string? Title { get; set; }
+    }
 
     public record HighFrequencyCallStatisticsRequest : PagedRequest
     {

+ 8 - 8
src/Hotline.Share/Dtos/CallCenter/CenterReportStatisticsDto.cs

@@ -567,8 +567,8 @@ namespace Hotline.Share.Dtos.CallCenter
         public double CompletedAgingMean => GetCompletedAgingMean();
 
         public double GetCompletedAgingMean() {
-            if (OrderCount > 0 && CompletedAging > 0)
-				return Math.Round(((CompletedAging.Value / OrderCount) / 3600), 2);
+			if (OrderCount > 0 && CompletedAging > 0)
+				return Math.Round(((CompletedAging.Value / OrderCount) / 3600 / 24), 2);
 			return 0;
 		}
 
@@ -590,7 +590,7 @@ namespace Hotline.Share.Dtos.CallCenter
 		public double GetCityCompletedAgingMean()
 		{
 			if (CityOrderCount > 0 && CityCompletedAging > 0)
-				return Math.Round(((CityCompletedAging.Value / CityOrderCount) / 3600), 2);
+				return Math.Round(((CityCompletedAging.Value / CityOrderCount) / 3600 / 24), 2);
 			return 0;
 		}
 
@@ -612,7 +612,7 @@ namespace Hotline.Share.Dtos.CallCenter
 		public double GetCountyCompletedAgingMean()
 		{
 			if (CountyOrderCount > 0 && CountyCompletedAging > 0)
-				return Math.Round(((CountyCompletedAging.Value / CountyOrderCount) / 3600), 2);
+				return Math.Round(((CountyCompletedAging.Value / CountyOrderCount) / 3600 / 24), 2);
 			return 0;
 		}
 
@@ -634,7 +634,7 @@ namespace Hotline.Share.Dtos.CallCenter
 		public double GetCenterCompletedAgingMean()
 		{
 			if (CenterOrderCount > 0 && CenterCompletedAging > 0)
-				return Math.Round(((CenterCompletedAging.Value / CenterOrderCount) / 3600), 2);
+				return Math.Round(((CenterCompletedAging.Value / CenterOrderCount) / 3600 / 24), 2);
 			return 0;
 		}
 	}
@@ -713,7 +713,7 @@ namespace Hotline.Share.Dtos.CallCenter
 		{
 			if (Satisfied > 0 )
 				return Math.Round(((double)Satisfied / (double)(Satisfied + Dissatisfied)) * 100, 2);
-			return 0;
+			return 100;
 		}
 
 		/// <summary>
@@ -726,7 +726,7 @@ namespace Hotline.Share.Dtos.CallCenter
 		{
 			if (CitySatisfied > 0)
 				return Math.Round(((double)CitySatisfied / (double)(CitySatisfied + CityDissatisfied)) * 100, 2);
-			return 0;
+			return 100;
 		}
 
 		/// <summary>
@@ -739,7 +739,7 @@ namespace Hotline.Share.Dtos.CallCenter
 		{
 			if (CountySatisfied > 0)
 				return Math.Round(((double)CountySatisfied / (double)(CountySatisfied + CountyDissatisfied)) * 100, 2);
-			return 0;
+			return 100;
 		}
 	}
 

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

@@ -92,7 +92,8 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
                 WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)> PreviousAsync
-            (Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo,
+            (Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo, 
+                EHandleMode handleMode = EHandleMode.Previous,
                 Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
                 CancellationToken cancellationToken = default);
 

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

@@ -888,7 +888,8 @@ namespace Hotline.FlowEngine.Workflows
         /// </summary>
         public async Task<(Workflow workflow, WorkflowStep currentStep, StepDefine prevDefine,
                 WorkflowStep prevStep, WorkflowStep newStep, EFlowDirection flowDirection)>
-            PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo,
+            PreviousAsync(Workflow workflow, PreviousWorkflowDto dto, OperatorInfo operatorInfo, 
+                EHandleMode handleMode = EHandleMode.Previous,
                 Action<Workflow, WorkflowStep, StepDefine, WorkflowStep, WorkflowStep>? newStepConfig = null,
                 CancellationToken cancellationToken = default)
         {
@@ -950,7 +951,7 @@ namespace Hotline.FlowEngine.Workflows
             trace.Handle(operatorInfo.UserId, operatorInfo.UserName,
                 operatorInfo.OrgId, operatorInfo.OrgName,
                 operatorInfo.OrgAreaCode, operatorInfo.OrgAreaName,
-                operatorInfo.OrgIsCenter, EHandleMode.Previous, dto.Opinion);
+                operatorInfo.OrgIsCenter, handleMode, dto.Opinion);
 
             //如果有传入期满时间 新节点为传入的期满时间
             if (dto.ExpiredTime.HasValue)