Forráskód Böngészése

Merge branch 'master' of http://git.fwt.com/Hotline/hotline

TANG JIANG 1 éve
szülő
commit
a20a44888e

+ 2 - 2
src/Hotline.Api/Realtimes/RealtimeService.cs

@@ -1,10 +1,10 @@
 using Hotline.Caching.Interfaces;
+using Hotline.Caching.Services;
 using Hotline.Realtimes;
 using Hotline.Share.Dtos.Realtime;
 using Microsoft.AspNetCore.SignalR;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
-using static Hotline.Caching.Services.CallCacheManager;
 
 namespace Hotline.Api.Realtimes;
 
@@ -105,7 +105,7 @@ public class RealtimeService : IRealtimeService, IScopeDependency
     /// <param name="list"></param>
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    public async Task CallQueueAsync(List<CallDtoRedis> list, CancellationToken cancellationToken)
+    public async Task CallQueueAsync(List<CallCacheManager.CallDtoRedis> list, CancellationToken cancellationToken)
     {
         var works = _userCacheManager.GetWorks();
         if (works!=null)

+ 7 - 0
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -212,6 +212,13 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public bool AcceptSms { get; set; }
 
+        /// <summary>
+        /// 是否已发送短信
+        /// </summary>
+        public bool SmsSended { get; set; }
+
+        public string SmsSendedText => SmsSended ? "已发送" : "未发送";
+
         /// <summary>
         /// 是否需要联系
         /// </summary>

+ 19 - 1
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -218,12 +218,30 @@ public class Workflow : CreationEntity
     public void ResetOption() => Opinion = "办理中...";
 
     /// <summary>
-    /// 更新当前办理人(代办人或部门)
+    /// 重新设置办理人(删除当前待办人/部门),撤回/跳转场景,因当前办理人不是流程指定办理人
+    /// </summary>
+    /// <param name="assignType"></param>
+    /// <param name="handlerObjects"></param>
+    public void ResetHandlers(EFlowAssignType assignType, List<HandlerGroupItem> handlerObjects)
+    {
+        HandlerOrgs = new List<HandlerGroupItem>();
+        HandlerUsers = new List<HandlerGroupItem>();
+
+        SetHandlers(assignType, handlerObjects);
+    }
+
+    /// <summary>
+    /// 更新当前办理人(待办人或部门),正常流转场景
     /// </summary>
     public void UpdateHandlers(string handlerId, string handlerOrg, EFlowAssignType assignType, List<HandlerGroupItem> handlerObjects)
     {
         RemoveCurrentHandleGroup(handlerId, handlerOrg);
 
+        SetHandlers(assignType, handlerObjects);
+    }
+
+    private void SetHandlers(EFlowAssignType assignType, List<HandlerGroupItem> handlerObjects)
+    {
         switch (assignType)
         {
             case EFlowAssignType.Org:

+ 14 - 27
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -485,14 +485,16 @@ namespace Hotline.FlowEngine.Workflows
             //if (currentStepBox.StepType is EStepType.Start)
             //    throw UserFriendlyException.SameMessage("当前流程已退回到开始节点");
 
+            //update uncompleted traces
+            await RecallTraceAsync(workflow.Id, dto, cancellationToken);
+
             var targetStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Code == dto.NextStepCode);
             if (targetStepBox is null)
                 throw UserFriendlyException.SameMessage("该流程尚未流转至该节点");
 
-            await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, cancellationToken);
+            await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, EWorkflowTraceStatus.Recall, cancellationToken);
 
-            workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
-                flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
+            workflow.ResetHandlers(flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
             await _mediator.Publish(new RecallNotify(workflow, dto), cancellationToken);
@@ -558,11 +560,10 @@ namespace Hotline.FlowEngine.Workflows
             else
             {
                 //返回之前节点
-                await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, cancellationToken);
+                await RecallAsync(workflow, dto, targetStepDefine, targetStepBox, isStartCountersign, EWorkflowTraceStatus.Jump, cancellationToken);
             }
 
-            workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
-                flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
+            workflow.ResetHandlers(flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
             await _workflowRepository.UpdateAsync(workflow, cancellationToken);
 
             await _mediator.Publish(new JumpNotify(workflow, dto, flowAssignMode), cancellationToken);
@@ -719,7 +720,7 @@ namespace Hotline.FlowEngine.Workflows
                     d.WorkflowId == workflowId && string.IsNullOrEmpty(d.UserId));
             foreach (var trace in uncompleteTraces)
             {
-                trace.Recall(
+                trace.Complete(
                     _sessionContext.RequiredUserId,
                     _sessionContext.UserName,
                     _sessionContext.RequiredOrgCode,
@@ -733,7 +734,7 @@ namespace Hotline.FlowEngine.Workflows
         {
             var trace = await GetWorkflowTraceAsync(workflowId, step.Id, cancellationToken);
             _mapper.Map(dto, trace);
-            trace.Previous(
+            trace.Complete(
                 _sessionContext.RequiredUserId,
                 _sessionContext.UserName,
                 _sessionContext.RequiredOrgCode,
@@ -821,7 +822,7 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         private async Task RecallAsync(Workflow workflow, NextWorkflowDto dto, StepDefine targetStepDefine, WorkflowStep targetStepBox,
-            bool isStartCountersign, CancellationToken cancellationToken)
+            bool isStartCountersign, EWorkflowTraceStatus traceStatus, CancellationToken cancellationToken)
         {
             //get targetStep's previous
             var targetPrevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == targetStepBox.PreviousId);
@@ -832,32 +833,18 @@ namespace Hotline.FlowEngine.Workflows
             if (targetPrevStep == null)
                 throw new UserFriendlyException($"{nameof(RecallAsync)}, 未找到目标节点的前一节点, flowId: {workflow.Id}");
 
-            ////remove completedSteps include target stepBox
-            //var removeSteps = GetStepsIncludeStepBox(targetStepBox);
-            //var tempStepBox = currentStepBox;
-            //while (tempStepBox.Code != targetStepBox.Code)
-            //{
-            //    removeSteps.AddRange(GetStepsIncludeStepBox(tempStepBox));
-            //    var prevStepBox = workflow.StepBoxes.FirstOrDefault(d => d.Id == tempStepBox.PreviousId);
-            //    if (prevStepBox is null)
-            //        throw new UserFriendlyException($"{nameof(RecallAsync)}, 未查询到节点, workflowId: {workflow.Id}, prevStepBoxId: {tempStepBox.PreviousId}");
-            //    tempStepBox = prevStepBox;
-            //}
-            //
             //查询所有目标节点之后的节点,然后删掉(包括目标节点)
             var removeSteps = GetStepsBehindTargetStepBox(workflow.StepBoxes, targetStepBox);
             await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
+            workflow.StepBoxes.RemoveAll(d => removeSteps.Contains(d));
 
             //recreate targetStep
             await CreateStepAsync(isStartCountersign, workflow, targetStepDefine, dto, EWorkflowStepStatus.Assigned,
-                targetPrevStepBox, targetPrevStep, EWorkflowTraceStatus.Recall, cancellationToken);
+                targetPrevStepBox, targetPrevStep, traceStatus, cancellationToken);
 
             //flow manage
             await ResetWorkflowCurrentStepInfo(workflow, dto, targetStepBox, isStartCountersign, cancellationToken);
 
-            //update uncompleted traces
-            await RecallTraceAsync(workflow.Id, dto, cancellationToken);
-
         }
 
         private IEnumerable<WorkflowStep> GetStepsBehindTargetStepBox(List<WorkflowStep> stepBoxes, WorkflowStep currentStepBox)
@@ -894,13 +881,13 @@ namespace Hotline.FlowEngine.Workflows
         private static void CheckWhetherRunnable(EWorkflowStatus status)
         {
             if (status != EWorkflowStatus.Runnable && status != EWorkflowStatus.Marked)
-                throw new UserFriendlyException("当前流程状态不可继续流转");
+                throw UserFriendlyException.SameMessage("当前流程状态不可继续流转");
         }
 
         private void ValidatePermission(Workflow workflow)
         {
             if (!workflow.CanHandle(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode))
-                throw new UserFriendlyException("无办理权限");
+                throw UserFriendlyException.SameMessage("无办理权限");
         }
 
         /// <summary>

+ 6 - 7
src/Hotline/FlowEngine/Workflows/WorkflowTrace.cs

@@ -41,11 +41,11 @@ public class WorkflowTrace : StepBasicEntity
 
     #region method
 
-    public void Previous(string userId, string userName, string orgCode, string orgName) =>
-        Complete(userId, userName, orgCode, orgName, EWorkflowTraceStatus.Back);
+    //public void Previous(string userId, string userName, string orgCode, string orgName) =>
+    //    Complete(userId, userName, orgCode, orgName, EWorkflowTraceStatus.Back);
 
-    public void Recall(string userId, string userName, string orgCode, string orgName) =>
-        Complete(userId, userName, orgCode, orgName, EWorkflowTraceStatus.Recall);
+    //public void Recall(string userId, string userName, string orgCode, string orgName) =>
+    //    Complete(userId, userName, orgCode, orgName, EWorkflowTraceStatus.Recall);
 
     public void Jump(string userId, string userName, string orgCode, string orgName, string opinion)
     {
@@ -58,18 +58,17 @@ public class WorkflowTrace : StepBasicEntity
             AcceptOrgName = orgName;
             AcceptTime = DateTime.Now;
         }
-        Complete(userId, userName, orgCode, orgName, EWorkflowTraceStatus.Jump);
+        Complete(userId, userName, orgCode, orgName);
         Opinion = opinion;
     }
 
-    public void Complete(string userId, string userName, string orgCode, string orgName, EWorkflowTraceStatus status = EWorkflowTraceStatus.Normal)
+    public void Complete(string userId, string userName, string orgCode, string orgName)
     {
         OrgCode = orgCode;
         OrgName = orgName;
         UserId = userId;
         UserName = userName;
         CompleteTime = DateTime.Now;
-        Status = status;
     }
 
     #endregion

+ 5 - 0
src/Hotline/Orders/Order.cs

@@ -95,6 +95,11 @@ namespace Hotline.Orders
         /// </summary>
         public bool AcceptSms { get; set; }
 
+        /// <summary>
+        /// 是否已发送短信
+        /// </summary>
+        public bool SmsSended { get; set; }
+
         /// <summary>
         /// 是否需要联系
         /// </summary>