Dun.Jason 1 year ago
parent
commit
f97883076f
100 changed files with 601 additions and 1006 deletions
  1. 9 4
      src/Hotline.Api/Controllers/ArticleController.cs
  2. 4 4
      src/Hotline.Api/Controllers/IdentityController.cs
  3. 59 84
      src/Hotline.Api/Controllers/OrderController.cs
  4. 55 2
      src/Hotline.Api/Controllers/PushMessageController.cs
  5. 4 1
      src/Hotline.Api/Controllers/RoleController.cs
  6. 43 2
      src/Hotline.Api/Controllers/WorkflowController.cs
  7. 4 4
      src/Hotline.Api/StartupExtensions.cs
  8. 1 1
      src/Hotline.Application.Contracts/Validators/Identity/LoginDtoValidator.cs
  9. 2 2
      src/Hotline.Application/FlowEngine/IWorkflowApplication.cs
  10. 43 31
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  11. 0 417
      src/Hotline.Application/FlowEngine/WorkflowApplication1.cs
  12. 1 1
      src/Hotline.Application/Handlers/CallCenter/CallState/AlertExtToExtNotificationHandler.cs
  13. 1 1
      src/Hotline.Application/Handlers/CallCenter/CallState/AlertExtToOuterNotificationHandler.cs
  14. 1 1
      src/Hotline.Application/Handlers/CallCenter/CallState/AlertMenuToOuterNotificationHandler.cs
  15. 1 1
      src/Hotline.Application/Handlers/CallCenter/CallState/AlertVisitorToExtNotificationHandler.cs
  16. 1 1
      src/Hotline.Application/Handlers/CallCenter/CallState/DtmfNotificationHandler.cs
  17. 1 1
      src/Hotline.Application/Handlers/CallCenter/CallState/FailedNotificationHandler.cs
  18. 1 1
      src/Hotline.Application/Handlers/CallCenter/CallState/RingExtToExtNotificationHandler.cs
  19. 1 1
      src/Hotline.Application/Handlers/CallCenter/CallState/RingExtToOuterNotificationHandler.cs
  20. 1 1
      src/Hotline.Application/Handlers/CallCenter/CallState/RingMenuToExtNotificationHandler.cs
  21. 1 1
      src/Hotline.Application/Handlers/CallCenter/CallState/RingVisitorToExtNotificationHandler.cs
  22. 1 1
      src/Hotline.Application/Handlers/CallCenter/ExtState/BusyNotificationHandler.cs
  23. 1 1
      src/Hotline.Application/Handlers/CallCenter/ExtState/IdleNotificationHandler.cs
  24. 1 1
      src/Hotline.Application/Handlers/CallCenter/ExtState/OfflineNotificationHandler.cs
  25. 1 1
      src/Hotline.Application/Handlers/CallCenter/ExtState/OnlineNotificationHandler.cs
  26. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/AnswerExtToExtNoificationHandler.cs
  27. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/AnswerExtToOuterNotificationHandler.cs
  28. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/AnswerViisitorToExtNotificationHandler.cs
  29. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/AnsweredExtToExtNotificationHandler.cs
  30. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/AnsweredExtToOuterNotificationHandler.cs
  31. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/AnsweredExtToOuterToExtNotificationHandler.cs
  32. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/AnsweredVisitorToExtNotificationHandler.cs
  33. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeExtAndExtNotificationHandler.cs
  34. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeExtAndOuterOneNotificationHandler.cs
  35. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeExtAndOuterTwoNotificationHandler.cs
  36. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeOuterAndOuterNotificationHandler.cs
  37. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeVisitorAndExtNotificationHandler.cs
  38. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeVisitorAndMenuNotificationHandler.cs
  39. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeVisitorAndOuterNotificationHandler.cs
  40. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeVisitorOffNotificationHandler.cs
  41. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/CdrNotificationHandler.cs
  42. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/DivertVisitorToExtNotificationHandler.cs
  43. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/EndOfAnnOuterToMenuNotificationHandler.cs
  44. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/EndOfAnnVisitorToMenuNotificationHandler.cs
  45. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/IncomingNotificationHandler.cs
  46. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/InviteNotificationHandler.cs
  47. 1 1
      src/Hotline.Application/Handlers/CallCenter/FlowControl/QueueVisitorToGroupBusyNotificationHandler.cs
  48. 1 1
      src/Hotline.Application/Handlers/CallCenter/System/BootupNotificationHandler.cs
  49. 1 1
      src/Hotline.Application/Handlers/CallCenter/Transient/TransientOuterNotificationHandler.cs
  50. 1 1
      src/Hotline.Application/Handlers/CallCenter/Transient/TransinetVisitorNotificationHandler.cs
  51. 0 96
      src/Hotline.Application/Handlers/FlowEngine/RejectHandler.cs
  52. 2 2
      src/Hotline.Application/Handlers/FlowEngine/WorkflowEndHandler.cs
  53. 4 4
      src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs
  54. 5 2
      src/Hotline.Application/Handlers/FlowEngine/WorkflowPreviousHandler.cs
  55. 5 2
      src/Hotline.Application/Handlers/FlowEngine/WorkflowRecallHandler.cs
  56. 4 4
      src/Hotline.Application/Handlers/FlowEngine/WorkflowStartHandler.cs
  57. 22 11
      src/Hotline.Application/Identity/IdentityAppService.cs
  58. 1 1
      src/Hotline.Application/Mappers/WorkflowMapperConfigs.cs
  59. 1 1
      src/Hotline.NewRock/Handlers/DeviceEventHandler.cs
  60. 1 1
      src/Hotline.NewRock/Mappers/EventConfigs.cs
  61. 53 2
      src/Hotline.Share/Dtos/Article/BulletinDto.cs
  62. 16 0
      src/Hotline.Share/Dtos/FlowEngine/Workflow/QueryWorkflowCountersignDto.cs
  63. 125 0
      src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowCountersignDto.cs
  64. 1 1
      src/Hotline.Share/Dtos/Identity/LoginDto.cs
  65. 7 2
      src/Hotline.Share/Dtos/Order/OrderSpecialDto.cs
  66. 5 0
      src/Hotline.Share/Dtos/Order/PublishedDto.cs
  67. 14 0
      src/Hotline.Share/Dtos/Push/FWMessage/MessageDataDto.cs
  68. 5 5
      src/Hotline.Share/Dtos/Push/MessageDto.cs
  69. 1 1
      src/Hotline.Share/Dtos/Push/MessagePagedDto.cs
  70. 2 1
      src/Hotline.Share/Enums/Order/EOrderStatus.cs
  71. 0 6
      src/Hotline.Share/Enums/Order/EVoiceEvaluate.cs
  72. 8 1
      src/Hotline.Share/Enums/Push/EPushBusiness.cs
  73. 6 1
      src/Hotline.Share/Enums/Push/EPushPlatform.cs
  74. 0 13
      src/Hotline.Share/Notifications/AlertMenuToOuterNotification.cs
  75. 0 12
      src/Hotline.Share/Notifications/AnswerExtToExtNotification.cs
  76. 0 18
      src/Hotline.Share/Notifications/AnswerExtToOuterNotification.cs
  77. 0 9
      src/Hotline.Share/Notifications/BootupNotification.cs
  78. 0 13
      src/Hotline.Share/Notifications/BusyNotification.cs
  79. 0 12
      src/Hotline.Share/Notifications/ByeExtAndExtNotification.cs
  80. 0 14
      src/Hotline.Share/Notifications/ByeExtAndOuterOneNotification.cs
  81. 0 12
      src/Hotline.Share/Notifications/ByeExtAndOuterTwoNotification.cs
  82. 0 12
      src/Hotline.Share/Notifications/ByeOuterAndOuterNotification.cs
  83. 0 12
      src/Hotline.Share/Notifications/ByeVisitorAndMenuNotification.cs
  84. 0 14
      src/Hotline.Share/Notifications/ByeVisitorAndOuterNotification.cs
  85. 0 13
      src/Hotline.Share/Notifications/ByeVisitorOffNotification.cs
  86. 0 10
      src/Hotline.Share/Notifications/DivertExtToExtNotification.cs
  87. 0 11
      src/Hotline.Share/Notifications/DivertVisitorToExtNotification.cs
  88. 0 12
      src/Hotline.Share/Notifications/EndOfAnnExtToMenuNotification.cs
  89. 0 12
      src/Hotline.Share/Notifications/EndOfAnnOuterToMenuNotification.cs
  90. 0 12
      src/Hotline.Share/Notifications/EndOfAnnVisitorToMenuNotification.cs
  91. 0 16
      src/Hotline.Share/Notifications/FailedNotification.cs
  92. 0 13
      src/Hotline.Share/Notifications/IdleNotification.cs
  93. 0 12
      src/Hotline.Share/Notifications/IncomingNotification.cs
  94. 0 12
      src/Hotline.Share/Notifications/InviteNotification.cs
  95. 2 2
      src/Hotline.Share/Notifications/NewRockCallCenter/AlertExtToExtNotification.cs
  96. 2 2
      src/Hotline.Share/Notifications/NewRockCallCenter/AlertExtToOuterNotification.cs
  97. 13 0
      src/Hotline.Share/Notifications/NewRockCallCenter/AlertMenuToOuterNotification.cs
  98. 3 3
      src/Hotline.Share/Notifications/NewRockCallCenter/AlertVisitorToExtNotification.cs
  99. 12 0
      src/Hotline.Share/Notifications/NewRockCallCenter/AnswerExtToExtNotification.cs
  100. 18 0
      src/Hotline.Share/Notifications/NewRockCallCenter/AnswerExtToOuterNotification.cs

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

@@ -89,6 +89,7 @@ namespace Hotline.Api.Controllers
         {
             var (total, items) = await _circularRepository.Queryable()
                 .Includes(x => x.CircularReadGroups)
+                .Includes(x=>x.ExaminMan)
                 .WhereIF(!string.IsNullOrEmpty(dto.CircularTypeId), d => d.CircularTypeId == dto.CircularTypeId)
                 .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
                 .WhereIF(dto.CircularTimeStart.HasValue, d => d.CircularTime >= dto.CircularTimeStart)
@@ -115,7 +116,8 @@ namespace Hotline.Api.Controllers
         {
             var (total, items) = await _circularRepository.Queryable()
                 .Includes(x => x.CircularReadGroups)
-                .WhereIF(!string.IsNullOrEmpty(dto.CircularTypeId), d => d.CircularTypeId == dto.CircularTypeId)
+                .Includes(x => x.ExaminMan)
+				.WhereIF(!string.IsNullOrEmpty(dto.CircularTypeId), d => d.CircularTypeId == dto.CircularTypeId)
                 .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
                 .WhereIF(dto.CircularTimeStart.HasValue, d => d.CircularTime >= dto.CircularTimeStart)
                 .WhereIF(dto.CircularTimeEnd.HasValue, d => d.CircularTime <= dto.CircularTimeEnd)
@@ -136,7 +138,8 @@ namespace Hotline.Api.Controllers
         {
             var model = await _circularRepository.Queryable()
                 .Includes(x => x.CircularReadGroups)
-                .FirstAsync(x => x.Id == id, HttpContext.RequestAborted);
+                .Includes(x => x.ExaminMan)
+				.FirstAsync(x => x.Id == id, HttpContext.RequestAborted);
             return _mapper.Map<CircularDto>(model);
         }
 
@@ -430,7 +433,8 @@ namespace Hotline.Api.Controllers
         public async Task<PagedDto<BulletinDto>> QueryBulletinList([FromQuery] QueryBulletinListRequestDto dto)
         {
             var (total, items) = await _bulletinRepository.Queryable()
-                .WhereIF(!string.IsNullOrEmpty(dto.BulletinTypeId), d => d.BulletinTypeId == dto.BulletinTypeId)
+	            .Includes(x => x.ExaminMan)
+				.WhereIF(!string.IsNullOrEmpty(dto.BulletinTypeId), d => d.BulletinTypeId == dto.BulletinTypeId)
                 .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title))
                 .WhereIF(dto.BulletinTimeStart.HasValue, d => d.BulletinTime >= dto.BulletinTimeStart)
                 .WhereIF(dto.BulletinTimeEnd.HasValue, d => d.BulletinTime <= dto.BulletinTimeEnd)
@@ -452,7 +456,8 @@ namespace Hotline.Api.Controllers
         public async Task<BulletinDto> BulletinEntity(string id)
         {
             var model = await _bulletinRepository.Queryable()
-                .FirstAsync(x => x.Id == id, HttpContext.RequestAborted);
+	            .Includes(x => x.ExaminMan)
+				.FirstAsync(x => x.Id == id, HttpContext.RequestAborted);
             return _mapper.Map<BulletinDto>(model);
         }
 

+ 4 - 4
src/Hotline.Api/Controllers/IdentityController.cs

@@ -74,7 +74,7 @@ jxrWXHbT1FB6DqkdOnBbQqS1Azqz5HxLlSyEK3F60e3SgB5iZsDZ
 
     [AllowAnonymous]
     [ApiExplorerSettings(IgnoreApi = true)]
-    [HttpPost("login/token")]
+    [HttpPost("token")]
     public async Task<string> LoginWithoutCrypt([FromBody] LoginDto dto)
     {
         return await _identityAppService.LoginAsync(dto, HttpContext.RequestAborted);
@@ -96,15 +96,15 @@ jxrWXHbT1FB6DqkdOnBbQqS1Azqz5HxLlSyEK3F60e3SgB5iZsDZ
 
     private LoginDto Decrypt(LoginDto dto)
     {
-        if (string.IsNullOrEmpty(dto.UserName) || string.IsNullOrEmpty(dto.Password))
+        if (string.IsNullOrEmpty(dto.Username) || string.IsNullOrEmpty(dto.Password))
             throw UserFriendlyException.SameMessage("非法参数");
 
         var pkcs1 = new RsaPkcs1Util(Encoding.UTF8, PublicKey, PrivateKey);
         try
         {
-            var uname = pkcs1.Decrypt(dto.UserName, RSAEncryptionPadding.Pkcs1);
+            var uname = pkcs1.Decrypt(dto.Username, RSAEncryptionPadding.Pkcs1);
             var pwd = pkcs1.Decrypt(dto.Password, RSAEncryptionPadding.Pkcs1);
-            return new LoginDto { UserName = uname, Password = pwd };
+            return new LoginDto { Username = uname, Password = pwd };
         }
         catch (Exception e)
         {

+ 59 - 84
src/Hotline.Api/Controllers/OrderController.cs

@@ -302,7 +302,6 @@ public class OrderController : BaseController
         return res;
     }
 
-
     /// <summary>
     /// 已发布列表
     /// </summary>
@@ -452,8 +451,8 @@ public class OrderController : BaseController
         int visitCount = await _orderVisitRepository.CountAsync(
             x => x.OrderId == orderVisit.OrderId && x.VisitState == Share.Enums.Order.EVisitState.Visited,
             HttpContext.RequestAborted);
-        int againCount = await _orderVisitRepository.CountAsync(
-            x => x.OrderId == orderVisit.OrderId && x.AgainState == EAgainState.DoAgain, HttpContext.RequestAborted);
+        //int againCount = await _orderVisitRepository.CountAsync(
+        //    x => x.OrderId == orderVisit.OrderId && x.AgainState == EAgainState.DoAgain, HttpContext.RequestAborted);
         var voiceEvaluate = EnumExts.GetDescriptions<EVoiceEvaluate>();
         var seatEvaluate = EnumExts.GetDescriptions<ESeatEvaluate>();
         var visitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction);
@@ -464,7 +463,7 @@ public class OrderController : BaseController
         {
             OrderVisitModel = orderVisit,
             VisitCount = visitCount,
-            AgainCount = againCount,
+            //AgainCount = againCount,
             VisitSatisfaction = visitSatisfaction,
             DissatisfiedReason = dissatisfiedReason,
             VisitManner = visitManner,
@@ -517,15 +516,6 @@ public class OrderController : BaseController
 
         var first = dto.VisitDetails.FirstOrDefault(x => x.VisitTarget == EVisitTarget.Org);
 
-
-        //更新主表
-        if (dto.IsPutThrough)
-        {
-            visit.VisitState = Share.Enums.Order.EVisitState.Visited;
-            visit.VisitTime = DateTime.Now;
-            visit.VisitType = EVisitType.ArtificialVisit;
-        }
-
         visit.IsPutThrough = dto.IsPutThrough;
         visit.AgainState = dto.IsAgain ? EAgainState.NeedAgain : EAgainState.NoAgain;
         visit.EmployeeId = _sessionContext.UserId;
@@ -533,12 +523,13 @@ public class OrderController : BaseController
         {
             visit.NowEvaluate = first.OrgProcessingResults;
         }
-        //await _orderVisitRepository.UpdateAsync(visit,HttpContext.RequestAborted);
-
         //update order
         if (dto.IsPutThrough)
         {
-            if (first != null)
+	        visit.VisitState = Share.Enums.Order.EVisitState.Visited;
+	        visit.VisitTime = DateTime.Now;
+	        visit.VisitType = EVisitType.ArtificialVisit;
+			if (first != null)
             {
                 visit.Order.Visited(first.OrgProcessingResults.Key, first.OrgProcessingResults.Value);
             }
@@ -576,7 +567,6 @@ public class OrderController : BaseController
                         ClientGuid = ""
                     });
             }
-
             if (first != null)
             {
                 //写入质检
@@ -584,6 +574,7 @@ public class OrderController : BaseController
                     HttpContext.RequestAborted);
             }
         }
+        else { await _orderVisitRepository.UpdateAsync(visit, HttpContext.RequestAborted); }
     }
 
     /// <summary>
@@ -626,7 +617,7 @@ public class OrderController : BaseController
     public async Task<PagedDto<OrderCanVisitAgainDto>> OrderVisitAgainList([FromQuery] OrderVisitAgainListDto dto)
     {
         var (total, items) = await _orderVisitedDetailRepository.Queryable()
-            .Includes(x => x.OrderVisit,x=>x.Order)
+            .Includes(x => x.OrderVisit, x => x.Order)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderVisit.Order.No.Contains(dto.Keyword))
             .Where(x => x.OrderVisit.VisitState == EVisitState.Visited &&
                         (x.OrderVisit.VisitType == EVisitType.SmsVisit ||
@@ -776,8 +767,8 @@ public class OrderController : BaseController
     {
         var (total, items) = await _orderVisitApplyRepository.Queryable()
             .Includes(d => d.Order)
-            .Includes(d=>d.OrderVisit,d=>d.OrderVisitDetails.Where(x=>x.VisitTarget == EVisitTarget.Org).ToList())
-            .Includes(d=>d.OrderVisit,d=>d.Employee)
+            .Includes(d => d.OrderVisit, d => d.OrderVisitDetails.Where(x => x.VisitTarget == EVisitTarget.Org).ToList())
+            .Includes(d => d.OrderVisit, d => d.Employee)
             .Includes(d => d.Employee)
             .WhereIF(dto.VisitApplyState != null, x => x.VisitApplyState == dto.VisitApplyState)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderNo.Contains(dto.Keyword))
@@ -795,7 +786,7 @@ public class OrderController : BaseController
     [HttpGet("visitapply/{id}")]
     public async Task<VisitApplyDto> VisitApplyEntity(string id)
     {
-        var model = await _orderVisitApplyRepository.GetExtAsync(x => x.Id == id,x=>x.Includes(d=>d.Order)) ;
+        var model = await _orderVisitApplyRepository.GetExtAsync(x => x.Id == id, x => x.Includes(d => d.Order));
 
         return _mapper.Map<VisitApplyDto>(model);
     }
@@ -1375,6 +1366,7 @@ public class OrderController : BaseController
             .WhereIF(dto.SuperviseState > -1, x => x.State == dto.SuperviseState)
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
             .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
+            .Where(x => x.OrgId == _sessionContext.OrgId)
             .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
@@ -1556,6 +1548,7 @@ public class OrderController : BaseController
             .WhereIF(dto.UrgeState > -1, x => x.State == dto.UrgeState)
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
             .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
+            .Where(x => x.OrgId == _sessionContext.OrgId)
             .OrderByDescending(x => x.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
 
@@ -1820,6 +1813,8 @@ public class OrderController : BaseController
     {
         //todo dto validation
         var order = _mapper.Map<Order>(dto);
+        order.SignerId = _sessionContext.UserId;
+        order.SignerName = _sessionContext.UserName;
         var orderId = await _orderDomainService.AddAsync(order, HttpContext.RequestAborted);
         //if (dto.Tags.Any()) await _repositoryts.AddVectorAsync(orderId, DateTime.Now, dto.Tags, HttpContext.RequestAborted);
         if (dto.Files.Any()) await _fileRepository.AddFileAsync(dto.Files, orderId, HttpContext.RequestAborted);
@@ -1853,7 +1848,8 @@ public class OrderController : BaseController
 
             if (order.Source is ESource.ProvinceStraight)
             {
-                var orderExtension = await _orderDomainService.GetOrderExtensionsAsync(dto.ProvinceNo, HttpContext.RequestAborted);
+                var orderExtension =
+                    await _orderDomainService.GetOrderExtensionsAsync(dto.ProvinceNo, HttpContext.RequestAborted);
                 if (orderExtension is not null)
                 {
                     orderExtension.Id = orderId;
@@ -1872,8 +1868,8 @@ public class OrderController : BaseController
         {
             if (order.Source is ESource.ProvinceStraight)
             {
-                //todo 特提(撤回至派单
-                await _workflowApplication.RecallToSendAsync(order.WorkflowId, "省工单重派", HttpContext.RequestAborted);
+                //todo 特提(撤回至发起
+                await _workflowApplication.RecallToStartAsync(order.WorkflowId, "省工单重派", HttpContext.RequestAborted);
             }
 
             return _mapper.Map<AddOrderResponse>(order);
@@ -1935,7 +1931,7 @@ public class OrderController : BaseController
             .FirstAsync(d => d.Id == dto.Id);
         if (order == null)
             throw UserFriendlyException.SameMessage("无效工单编号");
-        if (order.Status != EOrderStatus.WaitForAccept || !string.IsNullOrEmpty(order.WorkflowId))
+        if (order.Status > EOrderStatus.BackToUnAccept)
             throw UserFriendlyException.SameMessage("工单已发起流程");
 
         if (order.Content != dto.Content)
@@ -2132,27 +2128,18 @@ public class OrderController : BaseController
                 ? new[] { EWorkflowStepStatus.Handled }
                 : new[] { EWorkflowStepStatus.WaitForAccept, EWorkflowStepStatus.WaitForHandle };
 
-        RefAsync<int> total = 0;
-        var dtos = await _workflowStepRepository.Queryable()
-            .InnerJoin<Workflow>((s, w) => s.WorkflowId == w.Id)
-            .LeftJoin<Order>((s, w, o) => w.ExternalId == o.Id)
-            .Where((s, w, o) => SqlFunc.JsonListObjectAny(s.Handlers, "Key", _sessionContext.RequiredUserId) ||
-                                SqlFunc.JsonListObjectAny(s.Handlers, "Key", _sessionContext.RequiredOrgId))
-            .WhereIF(dto.IsProvince.HasValue, (s, w, o) => o.IsProvince == dto.IsProvince)
-            .WhereIF(dto.IsHandled.HasValue, (s, w, o) => handleStatuses.Contains(s.Status))
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                (s, w, o) => o.No.Contains(dto.Keyword) || o.Title.Contains(dto.Keyword))
-            .OrderByDescending((s) => s.StepExpiredTime)
-            .Select((s, w, o) => new OrderDto
-            {
-                Id = o.Id,
-                ExpiredTime = o.ExpiredTime,
-                //StepExpiredTime = s.StepExpiredTime,
-                Status = o.Status
-            }, true)
-            .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
+        var (total, items) = await _orderRepository.Queryable(workflowFilter: false)
+            .Includes(d => d.Workflow, x => x.Steps)
+            .Where(d => SqlFunc.JsonListObjectAny(d.Workflow.HandlerUsers, "Key", _sessionContext.RequiredUserId) ||
+                        SqlFunc.JsonListObjectAny(d.Workflow.HandlerOrgs, "Key", _sessionContext.RequiredOrgId))
+            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+            .WhereIF(dto.IsHandled.HasValue, d => d.Workflow.Steps.Any(x => handleStatuses.Contains(x.Status)))
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.No.Contains(dto.Keyword) || d.Title.Contains(dto.Keyword))
+            .OrderByDescending(d => d.ExpiredTime)
+            .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
-        return new PagedDto<OrderDto>(total, dtos);
+
+        return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
     }
 
     /// <summary>
@@ -2310,7 +2297,7 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dtos"></param>
     /// <returns></returns>
-    //[Permission(EPermission.AddCitizen)]
+    [Permission(EPermission.ApplySpecial)]
     [HttpPost("special")]
     public async Task Add([FromBody] OrderSpecialAddDto dto)
     {
@@ -2326,21 +2313,14 @@ public class OrderController : BaseController
         {
             var recall = new RecallDto
             {
-				WorkflowId = dto.WorkflowId!,
-				NextStepCode = dto.NextStepCode,
-				NextStepName = dto.NextStepName,
-				NextHandlers = dto.NextHandlers,
-				Opinion = dto.Cause
-			};
-            if (dto.AlterTime)
-            {
-				recall.External = new External
-				{
-					TimeLimit = dto.TimeLimit,
-					TimeLimitUnit = dto.TimeLimitUnit
-				};
-            }
-            if (dto.Files.Any()) recall.Additions = dto.Files;
+                WorkflowId = dto.WorkflowId!,
+                NextStepCode = dto.NextStepCode,
+                NextStepName = dto.NextStepName,
+                NextHandlers = dto.NextHandlers,
+                Opinion = dto.Cause
+            };
+            if (dto.AlterTime) recall.External = new External { TimeLimit = dto.TimeLimit, TimeLimitUnit = dto.TimeLimitUnit };
+			if (dto.Files.Any()) recall.Additions = dto.Files;
 			await _workflowApplication.RecallAsync(recall, HttpContext.RequestAborted);
 		}
     }
@@ -2350,7 +2330,7 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    //[Permission(EPermission.UpdateCitizen)]
+    [Permission(EPermission.AuditSpecial)]
     [HttpPut("special")]
     public async Task Update([FromBody] AuditOrderSpecialDto dto)
     {
@@ -2361,25 +2341,18 @@ public class OrderController : BaseController
         await _orderSpecialRepository.UpdateAsync(special, HttpContext.RequestAborted);
         if (special.State == 1)
         {
-			var recall = new RecallDto
-			{
-				WorkflowId = dto.WorkflowId!,
-				NextStepCode = dto.NextStepCode,
-				NextStepName = dto.NextStepName,
-				NextHandlers = dto.NextHandlers,
-				Opinion = dto.Opinion
-			};
-			if (dto.AlterTime)
-			{
-				recall.External = new External
-				{
-					TimeLimit = dto.TimeLimit,
-					TimeLimitUnit = dto.TimeLimitUnit
-				};
-			}
+            var recall = new RecallDto
+            {
+                WorkflowId = dto.WorkflowId!,
+                NextStepCode = dto.NextStepCode,
+                NextStepName = dto.NextStepName,
+                NextHandlers = dto.NextHandlers,
+                Opinion = dto.Opinion
+            };
+            if (dto.AlterTime) recall.External = new External { TimeLimit = dto.TimeLimit, TimeLimitUnit = dto.TimeLimitUnit };
             if (dto.Files.Any()) recall.Additions = dto.Files;
-			await _workflowApplication.RecallAsync(recall, HttpContext.RequestAborted);
-		}
+            await _workflowApplication.RecallAsync(recall, HttpContext.RequestAborted);
+        }
     }
 
     /// <summary>
@@ -2387,7 +2360,7 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
-    //[Permission(EPermission.CitizenList)]
+    [Permission(EPermission.SpecialOrderList)]
     [HttpGet("special/list")]
     public async Task<PagedDto<OrderSpecialDto>> List([FromQuery] OrderSpecialListDto dto)
     {
@@ -2406,6 +2379,7 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="dto"></param>
     /// <returns></returns>
+    [Permission(EPermission.ApplySpecialOrderList)]
     [HttpGet("special/apply_list")]
     public async Task<PagedDto<OrderDto>> SpecialList([FromQuery] QueryOrderDto dto)
     {
@@ -2449,7 +2423,7 @@ public class OrderController : BaseController
     /// </summary>
     /// <param name="id"></param>
     /// <returns></returns>
-    //[Permission(EPermission.CitizenEntity)]
+    [Permission(EPermission.SpecialEntity)]
     [HttpGet("special/{id}")]
     public async Task<OrderSpecialDto> SpecialEntity(string id)
     {
@@ -2471,7 +2445,7 @@ public class OrderController : BaseController
             SpecialTimeType = EnumExts.GetDescriptions<ETimeType>(),
             SpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
             Step = await _workflowApplication.GetRecallStepsAsync(id, HttpContext.RequestAborted)
-		};
+        };
         return rsp;
     }
 
@@ -2484,7 +2458,8 @@ public class OrderController : BaseController
     public async Task<int> SpecialHandleTime([FromQuery] OrderSpecialHandleTime dto)
     {
         var order = await _orderRepository.GetAsync(dto.OrderId);
-        if (dto.FlowDirection == EFlowDirection.OrgToCenter) return _timeLimitDomainService.GetOrderTimeLimitConfig(string.Empty);
+        if (dto.FlowDirection != null && dto.FlowDirection == EFlowDirection.OrgToCenter)
+            return _timeLimitDomainService.GetOrderTimeLimitConfig(string.Empty);
         return _timeLimitDomainService.GetOrderTimeLimitConfig(order.AcceptTypeCode);
     }
 

+ 55 - 2
src/Hotline.Api/Controllers/PushMessageController.cs

@@ -4,12 +4,15 @@ using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Push;
 using Hotline.Share.Dtos.Push.FWMessage;
+using Hotline.Share.Enums.Push;
 using MapsterMapper;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
+using XF.Domain.Exceptions;
 using System.Security.Permissions;
 using XF.Domain.Filters;
 using XF.Domain.Repository;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Api.Controllers
 {
@@ -31,7 +34,7 @@ namespace Hotline.Api.Controllers
             _messageRepository = messageRepository;
             _mapper = mapper;
             _pushDomainService = pushDomainService;
-        } 
+        }
         #endregion
 
         #region 新增
@@ -45,6 +48,38 @@ namespace Hotline.Api.Controllers
         {
             await _pushDomainService.PushAsync(dto, HttpContext.RequestAborted);
         }
+
+        /// <summary>
+        /// 再次发送
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        [HttpGet("{id}")]
+        public async Task ResendMessage(string id)
+        {
+            var data = await _messageRepository.GetAsync(p => p.Id == id, HttpContext.RequestAborted);
+            if (data is null)
+                throw UserFriendlyException.SameMessage("重新发送失败");
+
+            //修改重发次数
+            data.ResendCount++;
+            await _messageRepository.UpdateAsync(data, HttpContext.RequestAborted);
+             //组装数据
+            MessageDto dto = new()
+            {
+                PushBusiness = data.PushBusiness,
+                ExternalId = data.ExternalId,
+                PushPlatform = data.PushPlatform,
+                //  Status = EPushStatus.Pushing,
+                Template = data.Template,
+                Content = data.Content,
+                Remark = data.Remark,
+                Name = data.Name,
+                TelNumber = data.TelNumber,
+                OrderId = data.OrderId
+            };
+            await _pushDomainService.PushAsync(dto, HttpContext.RequestAborted);
+        }
         #endregion
 
         #region 查询短信剩余数量
@@ -107,7 +142,7 @@ namespace Hotline.Api.Controllers
                     .Includes(it => it.SystemOrganize)
                     .Includes(it => it.Order)
                     .WhereIF(pagedDto.PushBusiness.HasValue, d => d.PushBusiness == pagedDto.PushBusiness)
-                    .WhereIF(pagedDto.Status.HasValue, d => d.Status == pagedDto.Status)
+                    .WhereIF(pagedDto.Status.HasValue, d => d.SendState == pagedDto.Status)
                     .WhereIF(!string.IsNullOrEmpty(pagedDto.Keyword), d => d.Name.Contains(pagedDto.Keyword!) || d.Content.Contains(pagedDto.Keyword!) || d.TelNumber.Contains(pagedDto.Keyword!) || d.User.Name.Contains(pagedDto.Keyword!) || d.SystemOrganize.Name.Contains(pagedDto.Keyword!))
                     .WhereIF(pagedDto.StartTime.HasValue, d => d.SendTime >= pagedDto.StartTime)
                     .WhereIF(pagedDto.EndTime.HasValue, d => d.SendTime <= pagedDto.EndTime)
@@ -118,7 +153,25 @@ namespace Hotline.Api.Controllers
 
         }
 
+        /// <summary>
+        /// 列表页面基础数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("list-data")]
+        public async Task<object> ListData()
+        {
+            var rsp = new
+            {
+                EPushBusinessData = EnumExts.GetDescriptions<EPushBusiness>(),
+                ESendStateData = EnumExts.GetDescriptions<ESendState>()
+            };
+            return rsp;
+        }
+
+
         #endregion
 
+
+
     }
 }

+ 4 - 1
src/Hotline.Api/Controllers/RoleController.cs

@@ -136,7 +136,10 @@ public class RoleController : BaseController
     [HttpPut]
     public async Task Update([FromBody] UpdateRoleDto dto)
     {
-        await _roleRepository.UpdateAsync(_mapper.Map<Role>(dto), HttpContext.RequestAborted);
+        var role = await _roleRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+        if (role == null) throw new UserFriendlyException("无效角色编号");
+        _mapper.Map(dto, role);
+        await _roleRepository.UpdateAsync(role, HttpContext.RequestAborted);
     }
 
     #region 应用权限管理

+ 43 - 2
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -20,6 +20,9 @@ using XF.Utility.EnumExtensions;
 using XF.Domain.Repository;
 using Hotline.Share.Dtos.FlowEngine.Workflow;
 using Hotline.Caching.Interfaces;
+using Hotline.Orders;
+using Hotline.Share.Dtos.Order;
+using Mapster;
 
 namespace Hotline.Api.Controllers;
 
@@ -39,8 +42,9 @@ public class WorkflowController : BaseController
     private readonly ISystemDomainService _systemDomainService;
     private readonly IWfModuleDomainService _wfModuleDomainService;
     private readonly IRepository<WorkflowModule> _wfModuleRepository;
-    private readonly ISessionContext _sessionContext;
     private IRepository<WorkflowTrace> _workflowTraceRepository;
+    private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
+    private readonly ISessionContext _sessionContext;
     private readonly IMapper _mapper;
     private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
 
@@ -56,8 +60,9 @@ public class WorkflowController : BaseController
         ISystemDomainService systemDomainService,
         IWfModuleDomainService wfModuleDomainService,
         IRepository<WorkflowModule> wfModuleRepository,
-        ISessionContext sessionContext,
         IRepository<WorkflowTrace> workflowTraceRepository,
+        IRepository<WorkflowCountersign> workflowCountersignRepository,
+        ISessionContext sessionContext,
         IMapper mapper,
         ISystemDicDataCacheManager systemDicDataCacheManager
     )
@@ -76,6 +81,7 @@ public class WorkflowController : BaseController
         _sessionContext = sessionContext;
         _mapper = mapper;
         _workflowTraceRepository = workflowTraceRepository;
+        _workflowCountersignRepository = workflowCountersignRepository;
         _systemDicDataCacheManager = systemDicDataCacheManager;
     }
 
@@ -564,4 +570,39 @@ public class WorkflowController : BaseController
             await _wfModuleDomainService.MatchDefinitionAsync(dto, HttpContext.RequestAborted);
         }
     }
+
+    /// <summary>
+    /// 查询会签信息
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpGet("countersign")]
+    public async Task<PagedDto<WorkflowCountersignDto>> QueryWorkflowCountersigns([FromQuery] QueryWorkflowCountersignDto dto)
+    {
+        RefAsync<int> total = 0;
+        var query = _workflowCountersignRepository.Queryable()
+            .LeftJoin<Workflow>((c, w) => c.WorkflowId == w.Id)
+            .InnerJoin<Order>((c, w, o) => w.ExternalId == o.Id)
+            .WhereIF(dto.IsProvince.HasValue, (c, w, o) => o.IsProvince == dto.IsProvince.Value)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
+                (c, w, o) => o.No.Contains(dto.Keyword) || o.Title.Contains(dto.Keyword));
+
+        if (dto.IsOnlyStarter)
+            query = query.Where((c, w, o) => c.StarterId == _sessionContext.RequiredUserId);
+
+        var items = await query
+            .OrderByDescending((c, w, o) => w.ExpiredTime)
+            .Select((c, w, o) => new { c, o })
+            .ToPageListAsync(dto.PageIndex, dto.PageSize, total, HttpContext.RequestAborted);
+
+        var dtos = items.Select(d =>
+        {
+            var dto = _mapper.Map<WorkflowCountersignDto>(d.c);
+            dto.Order = _mapper.Map<OrderDto>(d.o);
+            return dto;
+        }).ToList();
+
+        return new PagedDto<WorkflowCountersignDto>(total, dtos);
+
+    }
 }

+ 4 - 4
src/Hotline.Api/StartupExtensions.cs

@@ -46,7 +46,7 @@ internal static class StartupExtensions
             .BatchInjectServices()
             .RegisterRepository()
             .AddApplication()
-            .AddClientCore(configuration)
+            //.AddClientCore(configuration)
             .AddScoped<IPasswordHasher<Account>, PasswordHasher<Account>>()
             ;
 
@@ -85,8 +85,8 @@ internal static class StartupExtensions
         //迅时IPPBX
         services.AddNewRock(callCenterConfiguration.DeviceConfigs.Address);
 
-        //wex
-        services.AddWex(callCenterConfiguration.Wex.Address);
+        ////wex
+        //services.AddWex(callCenterConfiguration.Wex.Address);
 
         //tr
         var trConfig = configuration.GetRequiredSection("Tr").Get<TrConfiguration>();
@@ -94,7 +94,7 @@ internal static class StartupExtensions
 
         //sqlsugar
         services.AddSqlSugar(configuration);
-        services.AddWexDb(configuration);
+        //services.AddWexDb(configuration);
 
         //cache
         services.AddCache(d =>

+ 1 - 1
src/Hotline.Application.Contracts/Validators/Identity/LoginDtoValidator.cs

@@ -12,7 +12,7 @@ namespace Hotline.Application.Contracts.Validators.Identity
     {
         public LoginDtoValidator()
         {
-            RuleFor(d => d.UserName).NotEmpty();
+            RuleFor(d => d.Username).NotEmpty();
             RuleFor(d => d.Password).NotEmpty();
         }
     }

+ 2 - 2
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -26,9 +26,9 @@ namespace Hotline.Application.FlowEngine
         Task RecallAsync(RecallDto dto, CancellationToken cancellationToken);
 
         /// <summary>
-        /// 撤回至派单节点
+        /// 撤回至发起人节点
         /// </summary>
-        Task RecallToSendAsync(string workflowId, string opinion, CancellationToken cancellationToken);
+        Task RecallToStartAsync(string workflowId, string opinion, CancellationToken cancellationToken);
 
         /// <summary>
         /// 跳转至任意节点

+ 43 - 31
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -149,6 +149,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             IsOrigin = true,
             Status = EWorkflowStepStatus.WaitForHandle,
             PrevChosenStepCode = null,
+            StepExpiredTime = workflow.ExpiredTime,
         };
         var startDefine = workflow.WorkflowDefinition.FindStartStepDefine();
         _mapper.Map(startDefine, startStep);
@@ -225,7 +226,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         }
 
         var flowAssignInfo =
-            await GetNextStepFlowAssignInfoAsync(workflow, currentStepDefine, currentStep, nextStepDefine, dto, cancellationToken);
+            await GetNextStepFlowAssignInfoAsync(workflow, currentStepDefine, currentStep, nextStepDefine, dto,
+                cancellationToken);
 
         await _workflowDomainService.NextAsync(workflow, currentStep, dto, nextStepDefine, flowAssignInfo,
             cancellationToken);
@@ -236,7 +238,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// </summary>
     public async Task RecallAsync(RecallDto dto, CancellationToken cancellationToken)
     {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, cancellationToken: cancellationToken);
+        var workflow =
+            await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, cancellationToken: cancellationToken);
 
         //await _orderDomainService.ReadyToRecallAsync(workflow.ExternalId, cancellationToken);
 
@@ -245,23 +248,26 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             throw UserFriendlyException.SameMessage("结束节点不支持撤回");
         //var isStartCountersign = targetStepDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
         var flowAssignInfo =
-            await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers, cancellationToken);
+            await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers,
+                cancellationToken);
         await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, cancellationToken);
     }
 
     /// <summary>
     /// 撤回至派单节点
     /// </summary>
-    public async Task RecallToSendAsync(string workflowId, string opinion, CancellationToken cancellationToken)
+    public async Task RecallToStartAsync(string workflowId, string opinion, CancellationToken cancellationToken)
     {
-        //var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
+        var workflow =
+            await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
 
-        //await _orderDomainService.ReadyToRecallAsync(workflow.ExternalId, cancellationToken);
+        var targetStepDefine = workflow.WorkflowDefinition.FindSendStepDefine();
 
-        //var targetStep = workflow.WorkflowDefinition.FindSendStepDefine();
         //var targetStepDefine = _workflowDomainService.GetStepDefine(workflow.WorkflowDefinition, targetStep.Code);
         //var flowAssignInfo = await GetNextStepFlowAssignInfoByDefineAsync(targetStepDefine, false, dto.NextHandlers, cancellationToken);
         //await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignInfo, cancellationToken);
+
+        //todo 
     }
 
     /// <summary>
@@ -432,7 +438,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         //    DynamicPolicy = startStep.InstancePolicy
         //};
 
-        if (startStepDefine.InstanceMode is EInstanceMode.Dynamic && !DynamicShouldTerminal(startStepDefine, _sessionContext.OrgLevel))
+        if (startStepDefine.InstanceMode is EInstanceMode.Dynamic &&
+            !DynamicShouldTerminal(startStepDefine, _sessionContext.OrgLevel))
         {
             //var nextStepOption = CreateDynamicStep(startStep.InstancePolicy);
             //dto.Steps = new List<NextStepOption> { nextStepOption };
@@ -454,7 +461,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         //        .ToList();
         return new NextStepsDto
         {
-            Steps = await GetConfigStepsAsync(definition.FlowType, startStepDefine.StepType, startStepDefine.BusinessType, firstStepDefines,
+            Steps = await GetConfigStepsAsync(definition.FlowType, startStepDefine.StepType, startStepDefine.BusinessType,
+                firstStepDefines,
                 cancellationToken)
         };
         //dto.Steps = steps;
@@ -466,8 +474,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// </summary>
     public async Task<NextStepsDto> GetNextStepsAsync(string workflowId, CancellationToken cancellationToken)
     {
-        var workflow =
-            await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
+        var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true,
+            cancellationToken: cancellationToken);
         var currentStep = _workflowDomainService.FindCurrentStepWaitForHandle(workflow);
         if (currentStep.StepType is EStepType.End)
             throw new UserFriendlyException("结束节点无需办理");
@@ -484,7 +492,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         if (currentStep.InstanceMode is EInstanceMode.Dynamic && !DynamicShouldTerminal(currentStep))
         {
             //动态生成下一步
-            var nextStepOption = await GetDynamicStepAsync(currentStep.InstancePolicy.Value, currentStep.StepType, currentStep.BusinessType,
+            var nextStepOption = await GetDynamicStepAsync(currentStep.InstancePolicy.Value, currentStep.StepType,
+                currentStep.BusinessType,
                 cancellationToken);
             dto.Steps = new List<NextStepOption> { nextStepOption };
             return dto;
@@ -516,7 +525,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 var countersignEndOption = GetCsEndStepByPrev(workflow.Steps, currentStep);
                 //按会签策略
                 var nextStepOption =
-                    await GetDynamicStepAsync(currentStep.CountersignPolicy.Value, currentStep.StepType, currentStep.BusinessType, cancellationToken);
+                    await GetDynamicStepAsync(currentStep.CountersignPolicy.Value, currentStep.StepType, currentStep.BusinessType,
+                        cancellationToken);
                 dto.Steps = new List<NextStepOption> { nextStepOption, countersignEndOption };
                 return dto;
             }
@@ -526,7 +536,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         if (!nextDefines.Any())
             throw new UserFriendlyException("未正确配置下一节点");
 
-        dto.Steps = await GetConfigStepsAsync(workflow.FlowType, currentStep.StepType, currentStep.BusinessType, nextDefines, cancellationToken);
+        dto.Steps = await GetConfigStepsAsync(workflow.FlowType, currentStep.StepType, currentStep.BusinessType, nextDefines,
+            cancellationToken);
 
         if (currentStep.IsInCountersign() && currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
         {
@@ -537,12 +548,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         }
 
         return dto;
-
-
-        //return new NextStepsDto
-        //{
-        //    Steps = nextDefines.Select(d => new NextStepOption { Key = d.Code, Value = d.Name }).ToList()
-        //};
     }
 
     /// <summary>
@@ -550,8 +555,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// </summary>
     public async Task<RecallStepsDto> GetRecallStepsAsync(string workflowId, CancellationToken cancellationToken)
     {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
-        var originSteps = workflow.Steps.Where(d => d.StepType != EStepType.End && d.IsOrigin).ToList();
+        var workflow =
+            await _workflowDomainService.GetWorkflowAsync(workflowId, true, true, cancellationToken: cancellationToken);
+        var originSteps = workflow.Steps.Where(d => d.StepType != EStepType.End && d.IsOrigin).ToList(); //todo 恢复到可撤回至发起人节点
         var stepCodes = originSteps.Select(d => d.Code).ToList();
         var stepDefines = workflow.WorkflowDefinition.FindStepDefines(stepCodes);
         var currentStep = workflow.Steps.FirstOrDefault(d => d.Id == workflow.CurrentStepId);
@@ -565,7 +571,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
 
         var steps = await GetRecallConfigStepsAsync(originSteps, stepDefines, currentStep,
             workflow.FlowType,
-            workflow.Status is EWorkflowStatus.Completed, 
+            workflow.Status is EWorkflowStatus.Completed,
             cancellationToken);
         dto.Steps = steps;
 
@@ -599,7 +605,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                         : null
                 : CheckFlowDirection(currentStep.BusinessType, stepDefine.BusinessType);
 
-            if (originStep.NextHandlers.Any()) stepOption.Handler = originStep.NextHandlers.First(d => d.Key == originStep.HandlerId || d.Key == originStep.HandlerOrgId);
+            if (originStep.Handlers.Any())
+                stepOption.Handler =
+                    originStep.Handlers.FirstOrDefault(d => d.Key == originStep.HandlerId || d.Key == originStep.HandlerOrgId);
 
             steps.Add(stepOption);
         }
@@ -659,24 +667,26 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         foreach (var stepDefine in stepDefines)
         {
             var nextStepOption = await GetConfigStepAsync(flowType, stepDefine, cancellationToken);
+            nextStepOption.InputRealHandler = currentStepType == EStepType.Normal && stepDefine.StepType is EStepType.Summary or EStepType.End;
+            stepOptions.Add(nextStepOption);
+
             if (stepDefine.StepType is EStepType.End)
             {
-                stepOptions.Add(nextStepOption);
                 continue;
             }
 
-            nextStepOption.InputRealHandler = currentStepType != EStepType.Summary && stepDefine.StepType == EStepType.Summary;
             nextStepOption.FlowDirection = CheckFlowDirection(currentBusinessType, stepDefine.BusinessType);
-            stepOptions.Add(nextStepOption);
+            //stepOptions.Add(nextStepOption);
         }
 
         return stepOptions;
     }
 
-    public async Task<NextStepOption> GetConfigStepAsync(EFlowType flowType, StepDefine stepDefine, CancellationToken cancellationToken)
+    public async Task<NextStepOption> GetConfigStepAsync(EFlowType flowType, StepDefine stepDefine,
+        CancellationToken cancellationToken)
     {
         var handlers = new List<Kv>();
-        if (stepDefine.StepType is EStepType.End)
+        if (stepDefine.StepType is EStepType.Start or EStepType.End)
         {
             return new NextStepOption
             {
@@ -1160,7 +1170,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <summary>
     /// 查询下一节点办理对象类型(user or org)及实际办理对象
     /// </summary>
-    public async Task<FlowAssignInfo> GetNextStepFlowAssignInfoAsync(Workflow workflow, StepDefine currentStepDefine, WorkflowStep currentStep,
+    public async Task<FlowAssignInfo> GetNextStepFlowAssignInfoAsync(Workflow workflow, StepDefine currentStepDefine,
+        WorkflowStep currentStep,
         StepDefine nextStepDefine, BasicWorkflowDto dto, CancellationToken cancellationToken)
     {
         if (nextStepDefine.StepType is EStepType.End) return new();
@@ -1207,7 +1218,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             }
         }
 
-        if (currentStep.InstanceMode is EInstanceMode.Dynamic && !DynamicShouldTerminal(currentStepDefine, _sessionContext.OrgLevel))
+        if (currentStep.InstanceMode is EInstanceMode.Dynamic &&
+            !DynamicShouldTerminal(currentStepDefine, _sessionContext.OrgLevel))
             return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
 
         return await GetNextStepFlowAssignInfoByDefineAsync(nextStepDefine, isStartCountersign, handlers,

+ 0 - 417
src/Hotline.Application/FlowEngine/WorkflowApplication1.cs

@@ -1,417 +0,0 @@
-//using Hotline.Application.Contracts.Validators.FlowEngine;
-//using Hotline.Caching.Interfaces;
-//using Hotline.Caching.Services;
-//using Hotline.FlowEngine;
-//using Hotline.FlowEngine.Definitions;
-//using Hotline.FlowEngine.WorkflowModules;
-//using Hotline.FlowEngine.Workflows;
-//using Hotline.Identity.Accounts;
-//using Hotline.Identity.Roles;
-//using Hotline.Orders;
-//using Hotline.SeedData;
-//using Hotline.Settings;
-//using Hotline.Settings.TimeLimits;
-//using Hotline.Share.Dtos;
-//using Hotline.Share.Dtos.FlowEngine;
-//using Hotline.Share.Enums.FlowEngine;
-//using Hotline.Share.Enums.Identity;
-//using Hotline.Users;
-//using MapsterMapper;
-//using SqlSugar;
-//using XF.Domain.Authentications;
-//using XF.Domain.Dependency;
-//using XF.Domain.Entities;
-//using XF.Domain.Exceptions;
-//using XF.Domain.Repository;
-
-//namespace Hotline.Application.FlowEngine;
-
-//public class WorkflowApplication1 : IWorkflowApplication, IScopeDependency
-//{
-//    private readonly IDefinitionDomainService _definitionDomainService;
-//    private readonly IWorkflowDomainService _workflowDomainService;
-//    private readonly IOrderDomainService _orderDomainService;
-//    private readonly IWorkflowRepository _workflowRepository;
-//    private readonly IRepository<WorkflowAssign> _workflowAssignRepository;
-//    private readonly IRepository<User> _userRepository;
-//    private readonly IAccountRepository _accountRepository;
-//    private readonly ISystemOrganizeRepository _organizeRepository;
-//    private readonly IRepository<Role> _roleRepository;
-//    private readonly IWfModuleCacheManager _wfModuleCacheManager;
-//    private readonly ISystemDomainService _systemDomainService;
-//    private readonly IUserDomainService _userDomainService;
-//    private readonly IAccountDomainService _accountDomainService;
-//    private readonly ISessionContext _sessionContext;
-//    private readonly IMapper _mapper;
-
-//    public WorkflowApplication(
-//        IDefinitionDomainService definitionDomainService,
-//        IWorkflowDomainService workflowDomainService,
-//        IOrderDomainService orderDomainService,
-//        IWorkflowRepository workflowRepository,
-//        IRepository<WorkflowAssign> workflowAssignRepository,
-//        IRepository<User> userRepository,
-//        IAccountRepository accountRepository,
-//        ISystemOrganizeRepository organizeRepository,
-//        IRepository<Role> roleRepository,
-//        IWfModuleCacheManager wfModuleCacheManager,
-//        ISystemDomainService systemDomainService,
-//        ISessionContext sessionContext,
-//        IMapper mapper)
-//    {
-//        _definitionDomainService = definitionDomainService;
-//        _workflowDomainService = workflowDomainService;
-//        _orderDomainService = orderDomainService;
-//        _workflowRepository = workflowRepository;
-//        _workflowAssignRepository = workflowAssignRepository;
-//        _userRepository = userRepository;
-//        _accountRepository = accountRepository;
-//        _organizeRepository = organizeRepository;
-//        _roleRepository = roleRepository;
-//        _wfModuleCacheManager = wfModuleCacheManager;
-//        _systemDomainService = systemDomainService;
-//        _sessionContext = sessionContext;
-//        _mapper = mapper;
-//    }
-
-//    public async Task StartWorkflowAsync(StartWorkflowDto dto, string externalId, CancellationToken cancellationToken)
-//    {
-//        var validator = new StartWorkflowDtoValidator();
-//        var validResult = validator.Validate(dto);
-//        if (!validResult.IsValid)
-//            throw new UserFriendlyException($"非法参数, {string.Join(',', validResult.Errors.Select(d => d.ErrorMessage))}");
-
-//        var wfModule = await GetWorkflowModuleAsync(dto.DefinitionModuleCode, cancellationToken);
-//        var definition = wfModule.Definition;
-//        if (definition == null)
-//            throw new UserFriendlyException("无效模板编码");
-//        if (definition.Status is not EDefinitionStatus.Enable)
-//            throw new UserFriendlyException("该模板不可用");
-
-//        var nextStepBoxDefine = _workflowDomainService.GetStepBoxDefine(definition, dto.NextStepCode);
-//        if (dto.IsStartCountersign &&
-//            (nextStepBoxDefine.StepType is EStepType.Summary || nextStepBoxDefine.CountersignMode is not ECountersignMode.Support))
-//            throw UserFriendlyException.SameMessage("下一节点不支持办理会签");
-
-//        //1. 如果不是按角色指派,handlers必填 2. 如果按角色指派,handlers可以不选
-//        if (nextStepBoxDefine.HandlerType is not EHandlerType.Role && !dto.NextHandlers.Any())
-//            throw UserFriendlyException.SameMessage("未指派办理人");
-
-//        var workflow = await _workflowDomainService.CreateWorkflowAsync(wfModule, dto.Title,
-//            _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, externalId, cancellationToken);
-
-//        var flowAssignMode = await GetFlowAssignModeAsync(nextStepBoxDefine, dto.IsStartCountersign, dto.NextHandlers, cancellationToken);
-
-//        await _workflowDomainService.StartAsync(workflow, dto, nextStepBoxDefine, flowAssignMode, cancellationToken);
-
-//        ////更新接办部门(详情页面展示)
-//        //await AddOrUpdateAssignAsync(workflow, dto, nextStepBoxDefine, cancellationToken);
-//    }
-
-//    /// <summary>
-//    /// 流转至下一节点(节点办理)
-//    /// </summary>
-//    public async Task NextAsync(NextWorkflowDto dto, CancellationToken cancellationToken)
-//    {
-//        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, withCountersigns: true, cancellationToken: cancellationToken);
-//        //await NextAsync(workflow, dto, dto.ExpiredTime, dto.IsStartCountersign, cancellationToken);
-
-//        //未超期工单,节点超期时间不能小于当前时间,不能大于流程整体超期时间
-//        if (workflow.ExpiredTime > DateTime.Now && (dto.ExpiredTime <= DateTime.Now || dto.ExpiredTime > workflow.ExpiredTime))
-//            throw UserFriendlyException.SameMessage("节点期满时间无效");
-
-//        var nextStepBoxDefine = _workflowDomainService.GetStepBoxDefine(workflow.WorkflowDefinition, dto.NextStepCode);
-
-//        //需求:按角色选择办理人可以不选,表示该角色下所有人都可以办理,同时依据配置:是否本部门人办理显示待选办理人。角色下只要一人办理即可(即:角色下不发起会签)
-//        if (nextStepBoxDefine.HandlerType != EHandlerType.Role && !dto.NextHandlers.Any())
-//            throw new UserFriendlyException("未指定节点处理者");
-
-//        if (dto.IsStartCountersign &&
-//            (nextStepBoxDefine.StepType is EStepType.Summary || nextStepBoxDefine.CountersignMode is not ECountersignMode.Support))
-//            throw UserFriendlyException.SameMessage("下一节点不支持办理会签");
-
-//        var flowAssignMode = await GetFlowAssignModeAsync(nextStepBoxDefine, dto.IsStartCountersign, dto.NextHandlers, cancellationToken);
-
-//        await _workflowDomainService.NextAsync(workflow, dto, nextStepBoxDefine, flowAssignMode, dto.ExpiredTime, cancellationToken);
-
-//        ////更新接办部门(详情页面展示)
-//        //await AddOrUpdateAssignAsync(workflow, dto, nextStepBoxDefine, cancellationToken);
-//    }
-
-//    /// <summary>
-//    /// 撤回至任意节点
-//    /// </summary>
-//    public async Task RecallAsync(RecallDto dto, CancellationToken cancellationToken)
-//    {
-//        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, cancellationToken: cancellationToken);
-
-//        await _orderDomainService.ReadyToRecallAsync(workflow.ExternalId, cancellationToken);
-
-//        var targetStepDefine = _workflowDomainService.GetStepBoxDefine(workflow.WorkflowDefinition, dto.NextStepCode);
-//        //var isStartCountersign = targetStepDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
-//        var flowAssignMode = await GetFlowAssignModeAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers, cancellationToken);
-//        await _workflowDomainService.RecallAsync(workflow, dto, targetStepDefine, flowAssignMode, cancellationToken);
-//    }
-
-//    /// <summary>
-//    /// 跳转至任意节点
-//    /// </summary>
-//    public async Task JumpAsync(RecallDto dto, CancellationToken cancellationToken)
-//    {
-//        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, cancellationToken: cancellationToken);
-
-//        await _orderDomainService.ReadyToRecallAsync(workflow.ExternalId, cancellationToken);
-
-//        var targetStepDefine = _workflowDomainService.GetStepBoxDefine(workflow.WorkflowDefinition, dto.NextStepCode);
-//        //var isStartCountersign = targetStepDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
-//        var flowAssignMode = await GetFlowAssignModeAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers, cancellationToken);
-//        await _workflowDomainService.JumpAsync(workflow, dto, targetStepDefine, dto.IsStartCountersign, flowAssignMode, cancellationToken);
-//    }
-
-//    /// <summary>
-//    /// 重办
-//    /// </summary>
-//    public async Task RedoAsync(RecallDto dto, CancellationToken cancellationToken)
-//    {
-//        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, true, true, cancellationToken: cancellationToken);
-//        var targetStepDefine = _workflowDomainService.GetStepBoxDefine(workflow.WorkflowDefinition, dto.NextStepCode);
-//        var flowAssignInfo = await GetFlowAssignModeAsync(targetStepDefine, dto.IsStartCountersign, dto.NextHandlers, cancellationToken);
-//        await _workflowDomainService.RedoAsync(workflow, dto, targetStepDefine, flowAssignInfo, cancellationToken);
-//    }
-
-//    public async Task<DefinedStepDto> GetStartOptionsAsync(string moduleCode, CancellationToken cancellationToken)
-//    {
-//        var wfModule = await GetWorkflowModuleAsync(moduleCode, cancellationToken);
-//        var definition = wfModule.Definition;
-//        if (definition == null)
-//            throw new UserFriendlyException("无效模板编码");
-//        if (definition.Status is not EDefinitionStatus.Enable)
-//            throw new UserFriendlyException("该模板不可用");
-
-//        var startStep = definition.Steps.FirstOrDefault(d => d.StepType == EStepType.Start);
-//        if (startStep == null)
-//            throw new UserFriendlyException("未正确配置开始节点");
-//        //var firstStepDefines = definition.FindStepDefines(startStep.NextSteps.Select(d => d.Code));
-//        var firstStepDefine = definition.FindStepDefine(startStep.NextSteps.First().Code);
-//        if (firstStepDefine == null)
-//            throw new UserFriendlyException("未正确配置首个办理节点");
-
-//        var secondStepDefines = definition.FindStepDefines(firstStepDefine.NextSteps.Select(d => d.Code));
-
-//        if (firstStepDefine.PathPolicy is not EPathPolicy.None && firstStepDefine.NextSteps.Count > 1)
-//            _workflowDomainService.NextStepDefineFilter(firstStepDefine.PathPolicy, secondStepDefines);
-
-//        return new DefinedStepDto
-//        {
-//            DefinitionId = definition.Id,
-//            Steps = _mapper.Map<IReadOnlyList<StepBasicDto>>(secondStepDefines),//secondStepDefines.Select(d => new KeyValuePair<string, string>(d.Code, d.Name)).ToList()
-//            Components = firstStepDefine.Components
-//        };
-//    }
-
-//    /// <summary>
-//    /// 根据节点配置查询待选参数
-//    /// </summary>
-//    /// <param name="stepDefine"></param>
-//    /// <param name="cancellationToken"></param>
-//    /// <returns></returns>
-//    /// <exception cref="ArgumentOutOfRangeException"></exception>
-//    public async Task<NextStepOptionDto> GetNextStepOptionsAsync(StepDefine stepDefine, CancellationToken cancellationToken)
-//    {
-//        if (stepDefine.StepType == EStepType.End) return new();
-
-//        var handlers = new List<Kv>();
-//        switch (stepDefine.HandlerType)
-//        {
-//            case EHandlerType.AssignedUser:
-//                var users = await _userRepository.QueryAsync(d =>
-//                    !d.IsDeleted &&
-//                    stepDefine.HandlerTypeItems.Select(d => d.Key).Contains(d.Id));
-//                handlers = users.Select(d => new Kv(d.Id, d.Name)).ToList();
-//                break;
-//            case EHandlerType.AssignedOrg:
-//                var orgs = await _organizeRepository.QueryAsync(d =>
-//                    d.IsEnable &&
-//                    stepDefine.HandlerTypeItems.Select(d => d.Key).Contains(d.Id));
-//                handlers = orgs.Select(d => new Kv(d.Id, d.Name))
-//                    .ToList();
-//                break;
-//            case EHandlerType.Role:
-//                var roles = await _roleRepository.Queryable()
-//                    .Includes(d => d.Accounts.Where(x => !x.IsDeleted && x.Status == EAccountStatus.Normal).ToList(), x => x.User)
-//                    .Where(d => stepDefine.HandlerTypeItems.Select(d => d.Key).Contains(d.Name))
-//                    .ToListAsync(cancellationToken);
-//                var users1 = roles.SelectMany(d => d.Accounts).Select(d => d.User);
-//                handlers = users1.Select(d => new Kv(d.Id, d.Name)).ToList();
-//                break;
-//            case EHandlerType.OrgLevel:
-//                //当前操作人所属部门的下级部门并且属于配置orgLevel的部门
-//                var levels = stepDefine.HandlerTypeItems.Select(d => d.Key).Select(d => int.Parse(d));
-//                var levelOneOrg = _sessionContext.RequiredOrgId.GetHigherOrgCode();
-//                //var orgs1 = await _organizeRepository.QueryAsync(d =>
-//                //    d.IsEnable && d.OrgCode.StartsWith(levelOneOrg) &&
-//                //    levels.Contains(d.OrgLevel));
-
-//                var orgs1 = await _organizeRepository.Queryable()
-//                    .Where(d => d.IsEnable && levels.Contains(d.Level))
-//                    .WhereIF(!levelOneOrg.IsCenter(), d => d.Id.StartsWith(levelOneOrg))
-//                    .ToListAsync(cancellationToken);
-
-//                handlers = orgs1.Select(d => new Kv(d.Id, d.Name)).ToList();
-//                break;
-//            case EHandlerType.OrgType:
-//                var types = stepDefine.HandlerTypeItems.Select(d => d.Key)
-//                    .Select(d => Enum.Parse<EOrgType>(d));
-//                var levelOneOrg1 = _sessionContext.RequiredOrgId.GetHigherOrgCode();
-//                //var org2 = await _organizeRepository.QueryAsync(d =>
-//                //    d.IsEnable && d.OrgCode.StartsWith(levelOneOrg1) &&
-//                //    types.Contains(d.OrgType));
-
-//                var orgs2 = await _organizeRepository.Queryable()
-//                .Where(d => d.IsEnable && types.Contains(d.OrgType))
-//                    .WhereIF(!levelOneOrg1.IsCenter(), d => d.Id.StartsWith(levelOneOrg1))
-//                    .ToListAsync(cancellationToken);
-
-//                handlers = orgs2.Select(d => new Kv(d.Id, d.Name)).ToList();
-//                break;
-//            default:
-//                throw new ArgumentOutOfRangeException();
-//        }
-
-//        var dto = new NextStepOptionDto { Handlers = handlers };
-
-//        if (stepDefine.Components.Contains(SysDicTypeConsts.OrderRedoReason))
-//        {
-//            var orderRedoReasons = await _systemDomainService.GetSysDicDataByCodeAsync(SysDicTypeConsts.OrderRedoReason, cancellationToken);
-//            dto.OrderRedoReasonOptions = orderRedoReasons.Select(d => new Kv(d.DicDataValue, d.DicDataName)).ToList();
-//        }
-
-//        return dto;
-//    }
-
-//    /// <summary>
-//    /// 查询指派办理人的处理方式及实际办理人
-//    /// </summary>
-//    public async Task<FlowAssignInfo> GetFlowAssignModeAsync(StepDefine stepDefine, bool isStartCountersign, List<Kv> handlers, CancellationToken cancellationToken)
-//    {
-//        if (stepDefine.StepType is EStepType.Start or EStepType.End) return new();
-//        switch (stepDefine.HandlerType)
-//        {
-//            case EHandlerType.Role:
-//                if (!handlers.Any())
-//                {
-//                    var roles = await _roleRepository.Queryable()
-//                        .Includes(d => d.Accounts, x => x.User)
-//                        .Where(d => stepDefine.HandlerTypeItems.Select(d => d.Key).Contains(d.Name))
-//                        .ToListAsync(cancellationToken);
-//                    handlers = roles.SelectMany(d => d.Accounts).Distinct().Select(d => new Kv(d.Id, d.User.Name)).ToList();
-//                }
-
-//                return FlowAssignInfo.Create(EFlowAssignType.User, handlers, isStartCountersign);
-
-//            case EHandlerType.OrgLevel:
-//            case EHandlerType.OrgType:
-//            case EHandlerType.AssignedOrg:
-//                return FlowAssignInfo.Create(EFlowAssignType.Org, handlers, isStartCountersign);
-
-//            case EHandlerType.AssignedUser:
-//                return FlowAssignInfo.Create(EFlowAssignType.User, handlers, isStartCountersign);
-
-//            default:
-//                throw new ArgumentOutOfRangeException();
-//        }
-//    }
-
-
-//    #region private
-
-//    /// <summary>
-//    /// 查询流程业务模块
-//    /// </summary>
-//    /// <param name="code"></param>
-//    /// <returns></returns>
-//    /// <exception cref="UserFriendlyException"></exception>
-//    private async Task<WorkflowModule> GetWorkflowModuleAsync(string code, CancellationToken cancellationToken)
-//    {
-//        var wfModule = await _wfModuleCacheManager.GetWorkflowModuleAsync(code, cancellationToken);
-//        if (wfModule == null)
-//            throw UserFriendlyException.SameMessage("无效流程模块编码");
-//        if (wfModule.Definition is null)
-//            throw new UserFriendlyException($"{code} 未配置流程模板", "未配置流程模板");
-//        return wfModule;
-//    }
-
-//    /// <summary>
-//    /// 更新接办部门
-//    /// </summary>
-//    private async Task AddOrUpdateAssignAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine nextStepBoxDefine, CancellationToken cancellationToken)
-//    {
-//        if (nextStepBoxDefine.StepType is EStepType.Normal)
-//        {
-//            await _workflowAssignRepository.RemoveAsync(d =>
-//                    d.WorkflowId == workflow.Id && d.OrgCode == _sessionContext.RequiredOrgId,
-//                cancellationToken: cancellationToken);
-
-//            var assigns = new List<WorkflowAssign>();
-//            switch (nextStepBoxDefine.HandlerType)
-//            {
-//                case EHandlerType.Role:
-//                    if (dto.NextHandlers.Any())
-//                    {
-//                        //选了handler,handler为userId 
-//                        var users1 = await _userRepository.Queryable()
-//                            .Includes(d => d.Organization)
-//                            .Where(d => dto.NextHandlers.Select(x => x.Key).Contains(d.Id))
-//                            .ToListAsync(cancellationToken);
-//                        assigns = users1.Select(d => WorkflowAssign.Create(workflow.Id, d.Id, d.Organization.Name))
-//                            .ToList();
-//                    }
-//                    else
-//                    {
-//                        ////如果模板配置为本部门办理,则为当前办理人orgCode,非本部门办理:属于该角色的所有用户所属部门
-//                        //if (nextStepBoxDefine.OnlySelfOrg.HasValue && nextStepBoxDefine.OnlySelfOrg.Value)
-//                        //{
-//                        //    assigns = new List<WorkflowAssign>
-//                        //    {
-//                        //        WorkflowAssign.Create(workflow.Id, _sessionContext.RequiredOrgCode, _sessionContext.OrgName)
-//                        //    };
-//                        //}
-//                        //else
-//                        //{
-//                        var accounts = await _accountRepository.Queryable()
-//                            .Includes(d => d.User, d => d.Organization)
-//                            .Where(d => dto.NextHandlers.Select(d => d.Key).Contains(d.Name))
-//                            .ToListAsync(cancellationToken);
-//                        assigns = accounts.Select(d => d.User.Organization).Select(d =>
-//                            WorkflowAssign.Create(workflow.Id, d.Id, d.Name)).ToList();
-//                        //}
-//                    }
-
-//                    break;
-
-//                case EHandlerType.OrgLevel:
-//                case EHandlerType.OrgType:
-//                case EHandlerType.AssignedOrg:
-//                    assigns = dto.NextHandlers.Select(d => WorkflowAssign.Create(workflow.Id, d.Key, d.Value)).ToList();
-//                    break;
-
-//                case EHandlerType.AssignedUser:
-//                    //指定人所属部门
-//                    var users = await _userRepository.Queryable()
-//                        .Includes(d => d.Organization)
-//                        .Where(d => dto.NextHandlers.Select(x => x.Key).Contains(d.Id))
-//                        .ToListAsync(cancellationToken);
-//                    assigns = users.Select(d => WorkflowAssign.Create(workflow.Id, d.Id, d.Organization.Name))
-//                        .ToList();
-//                    break;
-//                default:
-//                    throw new ArgumentOutOfRangeException();
-//            }
-
-//            if (assigns.Any())
-//                await _workflowAssignRepository.AddRangeAsync(assigns, cancellationToken);
-//        }
-//    }
-
-//    #endregion
-//}

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/CallState/AlertExtToExtNotificationHandler.cs

@@ -2,7 +2,7 @@
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/CallState/AlertExtToOuterNotificationHandler.cs

@@ -3,7 +3,7 @@ using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using Hotline.Tools;
 using MediatR;
 

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/CallState/AlertMenuToOuterNotificationHandler.cs

@@ -1,6 +1,6 @@
 using Hotline.CallCenter.Calls;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.CallState

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/CallState/AlertVisitorToExtNotificationHandler.cs

@@ -1,6 +1,6 @@
 using Hotline.CallCenter.Calls;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.CallState

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/CallState/DtmfNotificationHandler.cs

@@ -4,7 +4,7 @@ using Hotline.CallCenter.Devices;
 using Hotline.CallCenter.Ivrs;
 using Hotline.Realtimes;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using Microsoft.Extensions.Options;
 using NewRock.Sdk;

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/CallState/FailedNotificationHandler.cs

@@ -1,5 +1,5 @@
 using Hotline.CallCenter.Calls;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.CallState

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/CallState/RingExtToExtNotificationHandler.cs

@@ -3,7 +3,7 @@ using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using System;
 using System.Collections.Generic;

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/CallState/RingExtToOuterNotificationHandler.cs

@@ -1,7 +1,7 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using Hotline.Tools;
 using MediatR;
 

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/CallState/RingMenuToExtNotificationHandler.cs

@@ -1,4 +1,4 @@
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.CallState

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/CallState/RingVisitorToExtNotificationHandler.cs

@@ -2,7 +2,7 @@
 using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.CallState

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/ExtState/BusyNotificationHandler.cs

@@ -1,7 +1,7 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Tels;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using XF.Domain.Cache;
 

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/ExtState/IdleNotificationHandler.cs

@@ -5,7 +5,7 @@ using Hotline.CallCenter.Tels;
 using Hotline.Realtimes;
 using Hotline.Repository.SqlSugar.CallCenter;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using XF.Domain.Cache;
 using XF.Domain.Exceptions;

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/ExtState/OfflineNotificationHandler.cs

@@ -1,7 +1,7 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Tels;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using XF.Domain.Cache;
 

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/ExtState/OnlineNotificationHandler.cs

@@ -1,7 +1,7 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Tels;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using XF.Domain.Cache;
 

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/AnswerExtToExtNoificationHandler.cs

@@ -2,7 +2,7 @@
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/AnswerExtToOuterNotificationHandler.cs

@@ -3,7 +3,7 @@ using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/AnswerViisitorToExtNotificationHandler.cs

@@ -3,7 +3,7 @@ using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/AnsweredExtToExtNotificationHandler.cs

@@ -2,7 +2,7 @@
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/AnsweredExtToOuterNotificationHandler.cs

@@ -3,7 +3,7 @@ using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/AnsweredExtToOuterToExtNotificationHandler.cs

@@ -3,7 +3,7 @@ using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/AnsweredVisitorToExtNotificationHandler.cs

@@ -2,7 +2,7 @@
 using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeExtAndExtNotificationHandler.cs

@@ -1,7 +1,7 @@
 using Hotline.Caching.Interfaces;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeExtAndOuterOneNotificationHandler.cs

@@ -3,7 +3,7 @@ using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeExtAndOuterTwoNotificationHandler.cs

@@ -4,7 +4,7 @@ using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeOuterAndOuterNotificationHandler.cs

@@ -1,6 +1,6 @@
 using Hotline.CallCenter.Calls;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeVisitorAndExtNotificationHandler.cs

@@ -2,7 +2,7 @@
 using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeVisitorAndMenuNotificationHandler.cs

@@ -3,7 +3,7 @@ using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using System;
 using System.Collections.Generic;

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeVisitorAndOuterNotificationHandler.cs

@@ -1,5 +1,5 @@
 using Hotline.CallCenter.Calls;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/ByeVisitorOffNotificationHandler.cs

@@ -2,7 +2,7 @@
 using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using Serilog.Enrichers.Span;
 

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/CdrNotificationHandler.cs

@@ -4,7 +4,7 @@ using Hotline.CallCenter.Tels;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/DivertVisitorToExtNotificationHandler.cs

@@ -1,6 +1,6 @@
 using Hotline.CallCenter.Calls;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/EndOfAnnOuterToMenuNotificationHandler.cs

@@ -4,7 +4,7 @@ using Hotline.CallCenter.Devices;
 using Hotline.CallCenter.Ivrs;
 using Hotline.Realtimes;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using Microsoft.Extensions.Options;
 using NewRock.Sdk;

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/EndOfAnnVisitorToMenuNotificationHandler.cs

@@ -4,7 +4,7 @@ using Hotline.CallCenter.Devices;
 using Hotline.CallCenter.Ivrs;
 using Hotline.Realtimes;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using Microsoft.Extensions.Options;
 using NewRock.Sdk;

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/IncomingNotificationHandler.cs

@@ -5,7 +5,7 @@ using Hotline.CallCenter.Ivrs;
 using Hotline.Realtimes;
 using Hotline.Settings;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 using Microsoft.Extensions.Logging;
 using Microsoft.Extensions.Options;

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/InviteNotificationHandler.cs

@@ -4,7 +4,7 @@ using Hotline.CallCenter.Calls;
 using Hotline.CallCenter.Devices;
 using Hotline.Settings;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using Hotline.Tools;
 using MediatR;
 using Microsoft.Extensions.Options;

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/FlowControl/QueueVisitorToGroupBusyNotificationHandler.cs

@@ -1,7 +1,7 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
 using Hotline.Realtimes;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.FlowControl

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/System/BootupNotificationHandler.cs

@@ -2,7 +2,7 @@
 using Hotline.CallCenter.Devices;
 using Hotline.CallCenter.Ivrs;
 using Hotline.CallCenter.Tels;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.System

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/Transient/TransientOuterNotificationHandler.cs

@@ -1,7 +1,7 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Calls;
 using Hotline.Share.Enums.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using Hotline.Tools;
 using MediatR;
 

+ 1 - 1
src/Hotline.Application/Handlers/CallCenter/Transient/TransinetVisitorNotificationHandler.cs

@@ -1,5 +1,5 @@
 using Hotline.CallCenter.Calls;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MediatR;
 
 namespace Hotline.Application.Handlers.CallCenter.Transient

+ 0 - 96
src/Hotline.Application/Handlers/FlowEngine/RejectHandler.cs

@@ -1,96 +0,0 @@
-//using DotNetCore.CAP;
-//using Hotline.Article;
-//using Hotline.FlowEngine.Notifications;
-//using Hotline.FlowEngine.WorkflowModules;
-//using Hotline.Orders;
-//using Hotline.Share.Dtos.Order;
-//using Hotline.Share.Enums.Order;
-//using Hotline.Share.Mq;
-//using MapsterMapper;
-//using MediatR;
-//using Microsoft.Extensions.Logging;
-//using OracleInternal.SqlAndPlsqlParser.LocalParsing;
-//using XF.Domain.Repository;
-
-//namespace Hotline.Application.Handlers.FlowEngine;
-
-//public class RejectHandler : INotificationHandler<RejectNotify>
-//{
-//    private readonly IOrderDomainService _orderDomainService;
-//    private readonly IOrderRepository _orderRepository;
-//    private readonly ICapPublisher _capPublisher;
-//    private readonly IMapper _mapper;
-//    private readonly ILogger<RejectHandler> _logger;
-//    private readonly IRepository<OrderScreen> _orderScreenRepository;
-//    private readonly IRepository<Bulletin> _bulletinRepository;
-//    private readonly IRepository<Circular> _circularRepository;
-//    private readonly IRepository<OrderDelay> _orderDelayRepository;
-
-//    public RejectHandler(
-//        IOrderDomainService orderDomainService,
-//        IOrderRepository orderRepository,
-//        ICapPublisher capPublisher,
-//        IMapper mapper,
-//        ILogger<RejectHandler> logger,
-//        IRepository<OrderScreen> orderScreenRepository,
-//        IRepository<Bulletin> bulletinRepository,
-//        IRepository<Circular> circularRepository,
-//        IRepository<OrderDelay> orderDelayRepository)
-//    {
-//        _orderDomainService = orderDomainService;
-//        _orderRepository = orderRepository;
-//        _capPublisher = capPublisher;
-//        _mapper = mapper;
-//        _logger = logger;
-//        _orderScreenRepository = orderScreenRepository;
-//        _bulletinRepository = bulletinRepository;
-//        _circularRepository = circularRepository;
-//        _orderDelayRepository = orderDelayRepository;
-//    }
-
-//    /// <summary>Handles a notification</summary>
-//    /// <param name="notification">The notification</param>
-//    /// <param name="cancellationToken">Cancellation token</param>
-//    public async Task Handle(RejectNotify notification, CancellationToken cancellationToken)
-//    {
-//        var workflow = notification.Workflow;
-//        var data = notification.Dto;
-
-//        switch (workflow.ModuleCode)
-//        {
-//            case WorkflowModuleConsts.OrderDelay:
-//                var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);
-//                if (delay != null)
-//                {
-//                    delay.DelayState = EDelayState.NoPass;
-//                    await _orderDelayRepository.UpdateAsync(delay, cancellationToken);
-//                }
-//                break;
-//            case WorkflowModuleConsts.OrderScreen:
-//                var screen = await _orderScreenRepository.GetAsync(workflow.ExternalId, cancellationToken);
-//                if (screen != null)
-//                {
-//                    screen.Status = EScreenStatus.Refuse;
-//                    screen.ReplyContent = workflow.ActualOpinion;
-//                    await _orderScreenRepository.UpdateAsync(screen, cancellationToken);
-//                }
-//                break;
-//            case WorkflowModuleConsts.BulletinApply:
-//                var bulletin = await _bulletinRepository.GetAsync(workflow.ExternalId, cancellationToken);
-//                if (bulletin != null)
-//                {
-//                    bulletin.BulletinState = Share.Enums.Article.EBulletinState.ReviewNoPass;
-//                    await _bulletinRepository.UpdateAsync(bulletin, cancellationToken);
-//                }
-//                break;
-//            case WorkflowModuleConsts.CircularApply:
-//                var circular = await _circularRepository.GetAsync(workflow.ExternalId, cancellationToken);
-//                if (circular != null)
-//                {
-//                    circular.CircularState = Share.Enums.Article.ECircularState.ReviewNoPass;
-//                    await _circularRepository.UpdateAsync(circular, cancellationToken);
-//                }
-//                break;
-//        }
-//    }
-//}

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

@@ -23,7 +23,7 @@ using XF.Domain.Repository;
 
 namespace Hotline.Application.Handlers.FlowEngine;
 
-public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
+public class WorkflowEndHandler : INotificationHandler<EndWorkflowNotify>
 {
 
     private readonly IKnowledgeDomainService _knowledgeDomainService;
@@ -44,7 +44,7 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
     private readonly IRepository<OrderVisitApply> _orderVisitApplyRepository;
     private readonly IMediator _mediator;
 
-    public EndWorkflowHandler(
+    public WorkflowEndHandler(
         IKnowledgeDomainService knowledgeDomainService,
         IOrderDomainService orderDomainService,
         ITelDomainService telDomainService,

+ 4 - 4
src/Hotline.Application/Handlers/FlowEngine/NextStepHandler.cs → src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -30,7 +30,7 @@ using XF.Domain.Repository;
 
 namespace Hotline.Application.Handlers.FlowEngine;
 
-public class NextStepHandler : INotificationHandler<NextStepNotify>
+public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
 {
     private readonly IOrderDomainService _orderDomainService;
     private readonly IKnowledgeDomainService _knowledgeDomainService;
@@ -39,11 +39,11 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
     private readonly IWorkflowDomainService _workflowDomainService;
     private readonly ICapPublisher _capPublisher;
     private readonly IMapper _mapper;
-    private readonly ILogger<NextStepHandler> _logger;
+    private readonly ILogger<WorkflowNextHandler> _logger;
     private readonly IRepository<OrderScreen> _orderScreenRepository;
     private readonly IQualityRepository _qualityRepository;
 
-	public NextStepHandler(
+	public WorkflowNextHandler(
         IOrderDomainService orderDomainService,
         IKnowledgeDomainService knowledgeDomainService,
         IOrderRepository orderRepository,
@@ -51,7 +51,7 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
         IWorkflowDomainService workflowDomainService,
         ICapPublisher capPublisher,
         IMapper mapper,
-        ILogger<NextStepHandler> logger,
+        ILogger<WorkflowNextHandler> logger,
         IRepository<OrderScreen> orderScreenRepository,
         IQualityRepository qualityRepository)
     {

+ 5 - 2
src/Hotline.Application/Handlers/FlowEngine/PreviousStepHandler.cs → src/Hotline.Application/Handlers/FlowEngine/WorkflowPreviousHandler.cs

@@ -21,7 +21,7 @@ using Microsoft.Extensions.Logging;
 
 namespace Hotline.Application.Handlers.FlowEngine
 {
-    public class PreviousStepHandler : INotificationHandler<PreviousNotify>
+    public class WorkflowPreviousHandler : INotificationHandler<PreviousNotify>
     {
         private readonly IOrderDomainService _orderDomainService;
         private readonly IOrderRepository _orderRepository;
@@ -30,7 +30,7 @@ namespace Hotline.Application.Handlers.FlowEngine
         private readonly ICapPublisher _capPublisher;
         private readonly IMapper _mapper;
 
-        public PreviousStepHandler(
+        public WorkflowPreviousHandler(
             IOrderDomainService orderDomainService,
             IOrderRepository orderRepository,
             IWorkflowDomainService workflowDomainService,
@@ -61,7 +61,10 @@ namespace Hotline.Application.Handlers.FlowEngine
                     order.CheckIfFiled();
                     _mapper.Map(workflow, order);
                     if (notification.TargetStep.StepType is EStepType.Start)
+                    {
                         order.Status = EOrderStatus.BackToUnAccept;
+                        order.BackToUnsign();
+                    }
                     await _orderRepository.UpdateAsync(order, cancellationToken);
                     if (notification.IsOrgToCenter)
                     {

+ 5 - 2
src/Hotline.Application/Handlers/FlowEngine/RecallStepHandler.cs → src/Hotline.Application/Handlers/FlowEngine/WorkflowRecallHandler.cs

@@ -14,7 +14,7 @@ using MediatR;
 
 namespace Hotline.Application.Handlers.FlowEngine;
 
-public class RecallStepHandler : INotificationHandler<RecallNotify>
+public class WorkflowRecallHandler : INotificationHandler<RecallNotify>
 {
     private readonly IOrderDomainService _orderDomainService;
     private readonly IOrderRepository _orderRepository;
@@ -23,7 +23,7 @@ public class RecallStepHandler : INotificationHandler<RecallNotify>
     private readonly ICapPublisher _capPublisher;
     private readonly IMapper _mapper;
 
-    public RecallStepHandler(
+    public WorkflowRecallHandler(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowDomainService workflowDomainService,
@@ -53,7 +53,10 @@ public class RecallStepHandler : INotificationHandler<RecallNotify>
                 var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, cancellationToken);
                 _mapper.Map(workflow, order);
                 if (notification.TargetStep.StepType is EStepType.Start)
+                {
                     order.Status = EOrderStatus.BackToUnAccept;
+                    order.BackToUnsign();
+                }
                 await _orderRepository.UpdateAsync(order, cancellationToken);
 
                 if (data.FlowDirection.HasValue && data.External.TimeLimit.HasValue && data.External.TimeLimitUnit.HasValue)

+ 4 - 4
src/Hotline.Application/Handlers/FlowEngine/StartWorkflowHandler.cs → src/Hotline.Application/Handlers/FlowEngine/WorkflowStartHandler.cs

@@ -18,7 +18,7 @@ using Microsoft.Extensions.Logging;
 
 namespace Hotline.Application.Handlers.FlowEngine
 {
-    public class StartWorkflowHandler : INotificationHandler<StartWorkflowNotify>
+    public class WorkflowStartHandler : INotificationHandler<StartWorkflowNotify>
     {
         private readonly IOrderDomainService _orderDomainService;
         private readonly IKnowledgeDomainService _knowledgeDomainService;
@@ -26,17 +26,17 @@ namespace Hotline.Application.Handlers.FlowEngine
         private readonly IOrderRepository _orderRepository;
         private readonly ICapPublisher _capPublisher;
         private readonly IMapper _mapper;
-        private readonly ILogger<StartWorkflowHandler> _logger;
+        private readonly ILogger<WorkflowStartHandler> _logger;
         private readonly IQualityRepository _qualityRepository;
 
-		public StartWorkflowHandler(
+		public WorkflowStartHandler(
             IOrderDomainService orderDomainService,
             IKnowledgeDomainService knowledgeDomainService,
             ITelDomainService telDomainService,
             IOrderRepository orderRepository,
             ICapPublisher capPublisher,
             IMapper mapper,
-            ILogger<StartWorkflowHandler> logger,
+            ILogger<WorkflowStartHandler> logger,
             IQualityRepository qualityRepository)
         {
             _orderDomainService = orderDomainService;

+ 22 - 11
src/Hotline.Application/Identity/IdentityAppService.cs

@@ -40,7 +40,7 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
     public async Task<string> LoginAsync(LoginDto dto, CancellationToken cancellationToken)
     {
         var account = await _accountRepository.GetExtAsync(
-            d => d.UserName == dto.UserName,
+            d => d.UserName == dto.Username,
             d => d.Includes(x => x.Roles));
         if (account == null)
             throw UserFriendlyException.SameMessage("用户名或密码错误!");
@@ -62,9 +62,12 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
             throw UserFriendlyException.SameMessage("账号名或密码错误!");
         }
 
-        account.LockoutEnd = null;
-        account.AccessFailedCount = 0;
-        await _accountRepository.UpdateAsync(account, cancellationToken);
+        if (account.LockoutEnd.HasValue || account.AccessFailedCount > 0)
+        {
+            account.LockoutEnd = null;
+            account.AccessFailedCount = 0;
+            await _accountRepository.UpdateAsync(account, cancellationToken);
+        }
 
         var user = await _userRepository.Queryable()
             .Includes(d => d.Organization)
@@ -81,15 +84,23 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
             new(AppClaimTypes.UserDisplayName, account.Name),
             new(JwtClaimTypes.Scope, jwtOptions.Scope),
             new(AppClaimTypes.UserPasswordChanged, account.PasswordChanged.ToString()),
-            new(AppClaimTypes.DepartmentId, user.OrgId ?? string.Empty),
-            new(AppClaimTypes.DepartmentIsCenter, user.Organization.IsCenter.ToString()),
-            new(AppClaimTypes.DepartmentName, user.Organization?.Name ?? string.Empty),
-            new(AppClaimTypes.DepartmentAreaCode, user.Organization?.AreaCode ?? string.Empty),
-            new(AppClaimTypes.DepartmentAreaName, user.Organization?.AreaName ?? string.Empty),
-            new(AppClaimTypes.DepartmentLevel, user.Organization?.Level.ToString() ?? string.Empty),
-            new(AppClaimTypes.AreaId, user.OrgId?.GetHigherOrgCode() ?? string.Empty),
             new(AppClaimTypes.StaffNo, user.StaffNo ?? string.Empty),
         };
+        if (!string.IsNullOrEmpty(user.OrgId) && user.Organization is not null)
+        {
+            claims.AddRange(
+                new List<Claim>
+                {
+                    new(AppClaimTypes.DepartmentId, user.OrgId ?? string.Empty),
+                    new(AppClaimTypes.DepartmentIsCenter, user.Organization?.IsCenter.ToString()),
+                    new(AppClaimTypes.DepartmentName, user.Organization?.Name ?? string.Empty),
+                    new(AppClaimTypes.DepartmentAreaCode, user.Organization?.AreaCode ?? string.Empty),
+                    new(AppClaimTypes.DepartmentAreaName, user.Organization?.AreaName ?? string.Empty),
+                    new(AppClaimTypes.DepartmentLevel, user.Organization?.Level.ToString() ?? string.Empty),
+                    new(AppClaimTypes.AreaId, user.OrgId?.GetHigherOrgCode() ?? string.Empty),
+                }
+            );
+        }
         claims.AddRange(account.Roles.Select(d => new Claim(JwtClaimTypes.Role, d.Name)));
         var token = _jwtSecurity.EncodeJwtToken(claims);
         return token;

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

@@ -33,7 +33,7 @@ public class WorkflowMapperConfigs : IRegister
             .Ignore(d => d.IsSms)
             .Ignore(d => d.Opinion)
             .Ignore(d => d.Additions)
-            .Ignore(d => d.StepExpiredTime)
+            //.Ignore(d => d.StepExpiredTime)
             ;
 
         config.ForType<WorkflowStep, WorkflowTrace>()

+ 1 - 1
src/Hotline.NewRock/Handlers/DeviceEventHandler.cs

@@ -1,7 +1,7 @@
 using System.Security.Authentication;
 using Hotline.CallCenter;
 using Hotline.CallCenter.Devices;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using MapsterMapper;
 using MediatR;
 using Microsoft.Extensions.Logging;

+ 1 - 1
src/Hotline.NewRock/Mappers/EventConfigs.cs

@@ -1,6 +1,6 @@
 using Hotline.CallCenter.Tels;
 using Hotline.Share.Dtos.CallCenter;
-using Hotline.Share.Notifications;
+using Hotline.Share.Notifications.NewRockCallCenter;
 using Mapster;
 using NewRock.Sdk.Control.Response;
 using NewRock.Sdk.Events;

+ 53 - 2
src/Hotline.Share/Dtos/Article/BulletinDto.cs

@@ -6,6 +6,7 @@ using System.Diagnostics;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Dtos.Users;
 using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Article
@@ -78,7 +79,32 @@ namespace Hotline.Share.Dtos.Article
 
         public string? CreatorName { get; set; }
 
-        public string BulletinStateText => BulletinState.GetDescription();
+        /// <summary>
+        /// 提交时间
+        /// </summary>
+        public DateTime? CommitTime { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string? ExaminOpinion { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? ExaminManId { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public UserDto? ExaminMan { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? ExaminTime { get; set; }
+
+		public string BulletinStateText => BulletinState.GetDescription();
 
         public string PushRangesText => PushRanges.Any() ? string.Join("、", PushRanges.Select(x => x.Value)) : "-";
 
@@ -167,7 +193,32 @@ namespace Hotline.Share.Dtos.Article
         /// 阅读明细
         /// </summary>
         public List<CircularReadGroupDto> CircularReadGroups { get; set; }
-    }
+
+        /// <summary>
+        /// 提交时间
+        /// </summary>
+        public DateTime? CommitTime { get; set; }
+
+        /// <summary>
+        /// 审核意见
+        /// </summary>
+        public string? ExaminOpinion { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public string? ExaminManId { get; set; }
+
+        /// <summary>
+        /// 审核人
+        /// </summary>
+        public UserDto? ExaminMan { get; set; }
+
+        /// <summary>
+        /// 审核时间
+        /// </summary>
+        public DateTime? ExaminTime { get; set; }
+	}
 
     public record CircularReadGroupDto
     {

+ 16 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/QueryWorkflowCountersignDto.cs

@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Hotline.Share.Requests;
+
+namespace Hotline.Share.Dtos.FlowEngine.Workflow
+{
+    /// <summary>
+    /// 分页查询会签信息
+    /// </summary>
+    /// <param name="IsOnlyStarter">根据发起人过滤会签信息</param>
+    /// <param name="IsProvince"></param>
+    public record QueryWorkflowCountersignDto(bool IsOnlyStarter, bool? IsProvince) : PagedKeywordRequest;
+}

+ 125 - 0
src/Hotline.Share/Dtos/FlowEngine/Workflow/WorkflowCountersignDto.cs

@@ -0,0 +1,125 @@
+using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.FlowEngine;
+
+namespace Hotline.Share.Dtos.FlowEngine.Workflow
+{
+    public class WorkflowCountersignDto
+    {
+        public string Id { get; set; }
+
+        public DateTime CreationTime { get; set; }
+
+        public string WorkflowId { get; set; }
+
+
+        #region 发起会签
+
+        /// <summary>
+        /// 发起会签节点id(从开始节点直接发起的会签,该id和code为start节点的id与code)
+        /// </summary>
+        public string StartStepId { get; set; }
+
+        //冗余
+        public string StartStepCode { get; set; }
+
+        /// <summary>
+        /// 业务属性
+        /// </summary>
+        public EBusinessType StartStepBusiType { get; set; }
+
+        /// <summary>
+        /// 发起人
+        /// </summary>
+        public string StarterId { get; set; }
+
+        public string StarterName { get; set; }
+
+        /// <summary>
+        /// 发起人部门code
+        /// </summary>
+        public string StarterOrgId { get; set; }
+
+        public string? StarterOrgName { get; set; }
+
+        /// <summary>
+        /// 发起人部门行政区划代码
+        /// </summary>
+        public string StarterOrgAreaCode { get; set; }
+
+        /// <summary>
+        /// 发起人部门行政区划名称
+        /// </summary>
+        public string StarterOrgAreaName { get; set; }
+
+        #endregion
+
+        #region 结束会签
+
+        /// <summary>
+        /// 会签汇总节点id
+        /// </summary>
+        public string? EndStepId { get; set; }
+
+        //冗余
+        public string? EndStepCode { get; set; }
+
+        /// <summary>
+        /// 业务属性
+        /// </summary>
+        public EBusinessType EndStepBusiType { get; set; }
+
+        /// <summary>
+        /// 接办人
+        /// </summary>
+        public string? FinisherId { get; set; }
+
+        public string? FinisherName { get; set; }
+
+        /// <summary>
+        /// 接办人部门code
+        /// </summary>
+        public string? FinisherOrgId { get; set; }
+
+        public string? FinisherOrgName { get; set; }
+
+        /// <summary>
+        /// 接办人部门行政区划代码
+        /// </summary>
+        public string? FinisherOrgAreaCode { get; set; }
+
+        /// <summary>
+        /// 接办人部门行政区划名称
+        /// </summary>
+        public string? FinisherOrgAreaName { get; set; }
+
+        /// <summary>
+        /// 会签结束时间
+        /// </summary>
+        public DateTime? EndTime { get; set; }
+
+
+        #endregion
+
+        /// <summary>
+        /// 会签嵌套会签场景记录上级会签Id
+        /// </summary>
+        public string? ParentId { get; set; }
+
+        /// <summary>
+        /// 该会签参与成员数量
+        /// </summary>
+        public int Members { get; set; }
+
+        /// <summary>
+        /// 会签类型
+        /// </summary>
+        public ECounterSignType CounterSignType { get; set; }
+
+        /// <summary>
+        /// 发起会签节点设置的期满时间(冗余)
+        /// </summary>
+        public DateTime StartExpiredTime { get; set; }
+
+        public OrderDto Order{ get; set; }
+    }
+}

+ 1 - 1
src/Hotline.Share/Dtos/Identity/LoginDto.cs

@@ -8,7 +8,7 @@ namespace Hotline.Share.Dtos.Identity
 {
     public class LoginDto
     {
-        public string UserName { get; set; }
+        public string Username { get; set; }
         public string Password { get; set; }
     }
 

+ 7 - 2
src/Hotline.Share/Dtos/Order/OrderSpecialDto.cs

@@ -128,10 +128,15 @@ namespace Hotline.Share.Dtos.Order
 
 		public string OrderId { get; set; }
 
+		public string WorkflowId { get; set; }
+
 		/// <summary>
-		/// 节点Id
+		/// 下一节点code(defineStep.code)
 		/// </summary>
-		public string StepId { get; set; }
+		public string NextStepCode { get; set; } = string.Empty;
+		public string NextStepName { get; set; } = string.Empty;
+
+		public List<Kv> NextHandlers { get; set; }
 
 		/// <summary>
 		/// 特提原因

+ 5 - 0
src/Hotline.Share/Dtos/Order/PublishedDto.cs

@@ -26,6 +26,11 @@ public class PublishedDto
     public DateTime? PublishTime { get; set; }
 
     public string? PublishMan { get; set; }
+
+    /// <summary>
+    /// 最近更新时间
+    /// </summary>
+    public DateTime? LastModificationTime { get; set; }
 }
 
 public class PublishDto : OrderDto

+ 14 - 0
src/Hotline.Share/Dtos/Push/FWMessage/MessageDataDto.cs

@@ -1,13 +1,20 @@
 using Hotline.Share.Enums.Push;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Push.FWMessage
 {
     public record MessageDataDto
     {
+        /// <summary>
+        /// ID
+        /// </summary>
+        public string Id { get; set; }
+
         /// <summary>
         /// 消息推送业务
         /// </summary>
         public EPushBusiness PushBusiness { get; set; }
+        public string PushBusinessText => PushBusiness.GetDescription();
 
         /// <summary>
         /// 接收姓名
@@ -63,6 +70,7 @@ namespace Hotline.Share.Dtos.Push.FWMessage
         /// 推送状态
         /// </summary>
         public EPushStatus Status { get; set; }
+        public string StatusText => Status.GetDescription();
 
         /// <summary>
         /// 发送失败原因
@@ -78,5 +86,11 @@ namespace Hotline.Share.Dtos.Push.FWMessage
         /// 短信发送状态
         /// </summary>
         public ESendState SendState { get; set; }
+        public string SendStateText => SendState.GetDescription();
+
+        /// <summary>
+        /// 从发次数
+        /// </summary>
+        public int ResendCount { get; set; }
     }
 }

+ 5 - 5
src/Hotline.Share/Dtos/Push/MessageDto.cs

@@ -19,10 +19,10 @@ namespace Hotline.Share.Dtos.Push
         /// </summary>
         public EPushPlatform PushPlatform { get; set; }
 
-        /// <summary>
-        /// 推送状态
-        /// </summary>
-        public EPushStatus Status { get; set; }
+        ///// <summary>
+        ///// 推送状态
+        ///// </summary>
+        //public EPushStatus Status { get; set; }
 
         /// <summary>
         /// 模板
@@ -32,7 +32,7 @@ namespace Hotline.Share.Dtos.Push
         /// <summary>
         /// 内容
         /// </summary>
-        public string Content { get; set; }
+        public string? Content { get; set; }
 
         /// <summary>
         /// 备注

+ 1 - 1
src/Hotline.Share/Dtos/Push/MessagePagedDto.cs

@@ -11,5 +11,5 @@ namespace Hotline.Share.Dtos.Push
     /// <param name="Status"></param>
     /// <param name="StartTime"></param>
     /// <param name="EndTime"></param>
-    public record MessagePagedDto(EPushBusiness? PushBusiness, EPushStatus? Status, DateTime? StartTime, DateTime? EndTime) : PagedKeywordRequest;
+    public record MessagePagedDto(EPushBusiness? PushBusiness, ESendState? Status, DateTime? StartTime, DateTime? EndTime) : PagedKeywordRequest;
 }

+ 2 - 1
src/Hotline.Share/Enums/Order/EOrderStatus.cs

@@ -7,13 +7,14 @@ public enum EOrderStatus
     /// <summary>
     /// 待受理
     /// </summary>
+    [Description("待受理")]
     WaitForAccept = 0,
 
     /// <summary>
     /// 已开启流程,退回/撤回/跳转到开始节点
     /// 待受理,可编辑
     /// </summary>
-    [Description("待受理")]
+    [Description("退回待受理")]
     BackToUnAccept = 1,
 
     /// <summary>

+ 0 - 6
src/Hotline.Share/Enums/Order/EVoiceEvaluate.cs

@@ -21,12 +21,6 @@ namespace Hotline.Share.Enums.Order
         [Description("满意")]
         Satisfied = 20,
 
-        /// <summary>
-        /// 甄别为满意
-        /// </summary>
-        [Description("甄别为满意")]
-        ScreenToSatisfied = 30,
-
         /// <summary>
         /// 一般
         /// </summary>

+ 8 - 1
src/Hotline.Share/Enums/Push/EPushBusiness.cs

@@ -1,4 +1,6 @@
-namespace Hotline.Share.Enums.Push;
+using System.ComponentModel;
+
+namespace Hotline.Share.Enums.Push;
 
 /// <summary>
 /// 消息推送业务
@@ -8,25 +10,30 @@ public enum EPushBusiness
     /// <summary>
     /// 工单派单
     /// </summary>
+    [Description("工单派单")]
     OrderSend = 0,
 
     /// <summary>
     /// 工单受理
     /// </summary>
+    [Description("工单受理")]
     OrderAccept = 1,
 
     /// <summary>
     /// 工单超期
     /// </summary>
+    [Description("工单超期")]
     OrderExpire = 2,
 
     /// <summary>
     /// 工单催办
     /// </summary>
+    [Description("工单催办")]
     OrderUrge = 3,
 
     /// <summary>
     /// 工单回访
     /// </summary>
+    [Description("工单回访")]
     OrderCallback = 4,
 }

+ 6 - 1
src/Hotline.Share/Enums/Push/EPushPlatform.cs

@@ -1,4 +1,6 @@
-namespace Hotline.Share.Enums.Push;
+using System.ComponentModel;
+
+namespace Hotline.Share.Enums.Push;
 
 /// <summary>
 /// 推送平台
@@ -8,15 +10,18 @@ public enum EPushPlatform
     /// <summary>
     /// 短信
     /// </summary>
+    [Description("短信")]
     Sms = 1,
 
     /// <summary>
     /// 微信公众号
     /// </summary>
+    [Description("微信公众号")]
     WeChat = 2,
 
     /// <summary>
     /// 微信小程序
     /// </summary>
+    [Description("微信小程序")]
     WeChatMiniProgram = 3,
 }

+ 0 - 13
src/Hotline.Share/Notifications/AlertMenuToOuterNotification.cs

@@ -1,13 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    /// <summary>
-    /// 语音菜单呼外部电话,外部电话回铃
-    /// </summary>
-    public class AlertMenuToOuterNotification: BaseEvent, INotification
-    {
-        public BaseOuter Outer { get; set; }
-    }
-}

+ 0 - 12
src/Hotline.Share/Notifications/AnswerExtToExtNotification.cs

@@ -1,12 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class AnswerExtToExtNotification: BaseEvent, INotification
-    {
-        public string FromTelNo { get; set; }
-
-        public string ToTelNo { get; set; }
-    }
-}

+ 0 - 18
src/Hotline.Share/Notifications/AnswerExtToOuterNotification.cs

@@ -1,18 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class AnswerExtToOuterNotification:BaseEvent,INotification
-    {
-        /// <summary>
-        /// 分机号
-        /// </summary>
-        public string TelNo { get; set; }
-
-        /// <summary>
-        /// 去电
-        /// </summary>
-        public BaseOuter Outer{ get; set; }
-    }
-}

+ 0 - 9
src/Hotline.Share/Notifications/BootupNotification.cs

@@ -1,9 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class BootupNotification: BaseEvent,INotification
-    {
-    }
-}

+ 0 - 13
src/Hotline.Share/Notifications/BusyNotification.cs

@@ -1,13 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class BusyNotification: BaseEvent, INotification
-    {
-        /// <summary>
-        /// 分机号
-        /// </summary>
-        public string TelNo { get; set; }
-    }
-}

+ 0 - 12
src/Hotline.Share/Notifications/ByeExtAndExtNotification.cs

@@ -1,12 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class ByeExtAndExtNotification: BaseEvent, INotification
-    {
-        public string FromTelNo { get; set; }
-        public string ToTelNo { get; set; }
-        public string Recording { get; set; }
-    }
-}

+ 0 - 14
src/Hotline.Share/Notifications/ByeExtAndOuterOneNotification.cs

@@ -1,14 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class ByeExtAndOuterOneNotification: BaseEvent, INotification
-    {
-        public string TelNo { get; set; }
-
-        public BaseOuter Outer { get; set; }
-
-        public string Recording { get; set; }
-    }
-}

+ 0 - 12
src/Hotline.Share/Notifications/ByeExtAndOuterTwoNotification.cs

@@ -1,12 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class ByeExtAndOuterTwoNotification: BaseEvent, INotification
-    {
-        public BaseOuter Outer { get; set; }
-
-        public string Recording { get; set; }
-    }
-}

+ 0 - 12
src/Hotline.Share/Notifications/ByeOuterAndOuterNotification.cs

@@ -1,12 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class ByeOuterAndOuterNotification: BaseEvent, INotification
-    {
-        public BaseOuter Outer { get; set; }
-
-        public string Recording { get; set; }
-    }
-}

+ 0 - 12
src/Hotline.Share/Notifications/ByeVisitorAndMenuNotification.cs

@@ -1,12 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class ByeVisitorAndMenuNotification:BaseEvent,INotification
-    {
-        public BaseVisitor Visitor { get; set; }
-
-        public BaseMenu Menu { get; set; }
-    }
-}

+ 0 - 14
src/Hotline.Share/Notifications/ByeVisitorAndOuterNotification.cs

@@ -1,14 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class ByeVisitorAndOuterNotification: BaseEvent, INotification
-    {
-        public BaseVisitor Visitor { get; set; }
-
-        public BaseOuter Outer { get; set; }
-        
-        public string Recording { get; set; }
-    }
-}

+ 0 - 13
src/Hotline.Share/Notifications/ByeVisitorOffNotification.cs

@@ -1,13 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class ByeVisitorOffNotification: BaseEvent, INotification
-    {
-
-        public BaseVisitor Visitor { get; set; }
-
-        public string Recording { get; set; }
-    }
-}

+ 0 - 10
src/Hotline.Share/Notifications/DivertExtToExtNotification.cs

@@ -1,10 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class DivertExtToExtNotification: BaseEvent, INotification
-    {
-        public string TelNo { get; set; }
-    }
-}

+ 0 - 11
src/Hotline.Share/Notifications/DivertVisitorToExtNotification.cs

@@ -1,11 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-
-    public class DivertVisitorToExtNotification: BaseEvent, INotification
-    {
-        public BaseVisitor Visitor { get; set; }
-    }
-}

+ 0 - 12
src/Hotline.Share/Notifications/EndOfAnnExtToMenuNotification.cs

@@ -1,12 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class EndOfAnnExtToMenuNotification: BaseEvent, INotification
-    {
-        public string TelNo { get; set; }
-
-        public string MenuId { get; set; }
-    }
-}

+ 0 - 12
src/Hotline.Share/Notifications/EndOfAnnOuterToMenuNotification.cs

@@ -1,12 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class EndOfAnnOuterToMenuNotification: BaseEvent, INotification
-    {
-        public string MenuId { get; set; }
-
-        public BaseOuter Outer { get; set; }
-    }
-}

+ 0 - 12
src/Hotline.Share/Notifications/EndOfAnnVisitorToMenuNotification.cs

@@ -1,12 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class EndOfAnnVisitorToMenuNotification: BaseEvent, INotification
-    {
-        public string MenuId { get; set; }
-
-        public BaseVisitor Visitor { get; set; }
-    }
-}

+ 0 - 16
src/Hotline.Share/Notifications/FailedNotification.cs

@@ -1,16 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class FailedNotification: BaseEvent, INotification
-    {
-        public string CalledId { get; set; }
-
-        public string Code { get; set; }
-
-        public string Reason { get; set; }
-    }
-
-    
-}

+ 0 - 13
src/Hotline.Share/Notifications/IdleNotification.cs

@@ -1,13 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class IdleNotification: BaseEvent, INotification
-    {
-        /// <summary>
-        /// 分机号
-        /// </summary>
-        public string TelNo { get; set; }
-    }
-}

+ 0 - 12
src/Hotline.Share/Notifications/IncomingNotification.cs

@@ -1,12 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class IncomingNotification: BaseEvent, INotification
-    {
-        public string TrunkId { get; set; }
-
-        public BaseVisitor Visitor { get; set; }
-    }
-}

+ 0 - 12
src/Hotline.Share/Notifications/InviteNotification.cs

@@ -1,12 +0,0 @@
-using Hotline.Share.Notifications.Base;
-using MediatR;
-
-namespace Hotline.Share.Notifications
-{
-    public class InviteNotification: BaseEvent, INotification
-    {
-        public string TrunkId { get; set; }
-
-        public BaseVisitor Visitor { get; set; }
-    }
-}

+ 2 - 2
src/Hotline.Share/Notifications/AlertExtToExtNotification.cs → src/Hotline.Share/Notifications/NewRockCallCenter/AlertExtToExtNotification.cs

@@ -1,7 +1,7 @@
-using Hotline.Share.Notifications.Base;
+using Hotline.Share.Notifications.NewRockCallCenter.Base;
 using MediatR;
 
-namespace Hotline.Share.Notifications
+namespace Hotline.Share.Notifications.NewRockCallCenter
 {
     /// <summary>
     /// 分机呼分机,被叫分机回铃

+ 2 - 2
src/Hotline.Share/Notifications/AlertExtToOuterNotification.cs → src/Hotline.Share/Notifications/NewRockCallCenter/AlertExtToOuterNotification.cs

@@ -1,7 +1,7 @@
-using Hotline.Share.Notifications.Base;
+using Hotline.Share.Notifications.NewRockCallCenter.Base;
 using MediatR;
 
-namespace Hotline.Share.Notifications
+namespace Hotline.Share.Notifications.NewRockCallCenter
 {
     /// <summary>
     /// 分机外呼,外部电话回铃

+ 13 - 0
src/Hotline.Share/Notifications/NewRockCallCenter/AlertMenuToOuterNotification.cs

@@ -0,0 +1,13 @@
+using Hotline.Share.Notifications.NewRockCallCenter.Base;
+using MediatR;
+
+namespace Hotline.Share.Notifications.NewRockCallCenter
+{
+    /// <summary>
+    /// 语音菜单呼外部电话,外部电话回铃
+    /// </summary>
+    public class AlertMenuToOuterNotification : BaseEvent, INotification
+    {
+        public BaseOuter Outer { get; set; }
+    }
+}

+ 3 - 3
src/Hotline.Share/Notifications/AlertVisitorToExtNotification.cs → src/Hotline.Share/Notifications/NewRockCallCenter/AlertVisitorToExtNotification.cs

@@ -1,12 +1,12 @@
-using Hotline.Share.Notifications.Base;
+using Hotline.Share.Notifications.NewRockCallCenter.Base;
 using MediatR;
 
-namespace Hotline.Share.Notifications
+namespace Hotline.Share.Notifications.NewRockCallCenter
 {
     /// <summary>
     /// 来电转分机,分机回铃
     /// </summary>
-    public class AlertVisitorToExtNotification: BaseEvent, INotification
+    public class AlertVisitorToExtNotification : BaseEvent, INotification
     {
         /// <summary>
         /// 分机号

+ 12 - 0
src/Hotline.Share/Notifications/NewRockCallCenter/AnswerExtToExtNotification.cs

@@ -0,0 +1,12 @@
+using Hotline.Share.Notifications.NewRockCallCenter.Base;
+using MediatR;
+
+namespace Hotline.Share.Notifications.NewRockCallCenter
+{
+    public class AnswerExtToExtNotification : BaseEvent, INotification
+    {
+        public string FromTelNo { get; set; }
+
+        public string ToTelNo { get; set; }
+    }
+}

+ 18 - 0
src/Hotline.Share/Notifications/NewRockCallCenter/AnswerExtToOuterNotification.cs

@@ -0,0 +1,18 @@
+using Hotline.Share.Notifications.NewRockCallCenter.Base;
+using MediatR;
+
+namespace Hotline.Share.Notifications.NewRockCallCenter
+{
+    public class AnswerExtToOuterNotification : BaseEvent, INotification
+    {
+        /// <summary>
+        /// 分机号
+        /// </summary>
+        public string TelNo { get; set; }
+
+        /// <summary>
+        /// 去电
+        /// </summary>
+        public BaseOuter Outer { get; set; }
+    }
+}

Some files were not shown because too many files changed in this diff