Kaynağa Gözat

Merge branch 'master' of http://git.12345lm.cn/Fengwo/hotline

Dun.Jason 1 yıl önce
ebeveyn
işleme
0543015421

+ 80 - 77
src/Hotline.Api/Controllers/OrderController.cs

@@ -717,74 +717,74 @@ public class OrderController : BaseController
         //update order
         //if (dto.IsPutThrough)
         //{
-            visit.VisitState = Share.Enums.Order.EVisitState.Visited;
-            visit.VisitTime = DateTime.Now;
-            if (!string.IsNullOrEmpty(visit.CallId))
-            {
-                visit.VisitType = EVisitType.CallVisit;
-            }
-            if (visit.VisitType is null)
-            {
-                visit.VisitType = EVisitType.ArtificialVisit;
-            }
-            if (first != null)
-            {
-                visit.Order.Visited(first.OrgProcessingResults.Key, first.OrgProcessingResults.Value);
-            }
+        visit.VisitState = Share.Enums.Order.EVisitState.Visited;
+        visit.VisitTime = DateTime.Now;
+        if (!string.IsNullOrEmpty(visit.CallId))
+        {
+            visit.VisitType = EVisitType.CallVisit;
+        }
+        if (visit.VisitType is null)
+        {
+            visit.VisitType = EVisitType.ArtificialVisit;
+        }
+        if (first != null)
+        {
+            visit.Order.Visited(first.OrgProcessingResults.Key, first.OrgProcessingResults.Value);
+        }
 
-            //_mapper.Map(dto.VisitDetails,visit.OrderVisitDetails);
-            for (int i = 0; i < visit.OrderVisitDetails.Count; i++)
+        //_mapper.Map(dto.VisitDetails,visit.OrderVisitDetails);
+        for (int i = 0; i < visit.OrderVisitDetails.Count; i++)
+        {
+            var detail = visit.OrderVisitDetails[i];
+            var detaildto = dto.VisitDetails.FirstOrDefault(x => x.Id == detail.Id);
+            if (detaildto != null)
             {
-                var detail = visit.OrderVisitDetails[i];
-                var detaildto = dto.VisitDetails.FirstOrDefault(x => x.Id == detail.Id);
-                if (detaildto != null)
-                {
-                    _mapper.Map(detaildto, visit.OrderVisitDetails[i]);
-                }
+                _mapper.Map(detaildto, visit.OrderVisitDetails[i]);
             }
+        }
 
-            await _orderVisitRepository.UpdateAsync(visit, HttpContext.RequestAborted);
-            await _orderVisitedDetailRepository.UpdateRangeAsync(visit.OrderVisitDetails, HttpContext.RequestAborted);
-            await _orderRepository.UpdateAsync(visit.Order, HttpContext.RequestAborted);
-            var orderDto = _mapper.Map<OrderDto>(visit.Order);
-            if (first != null)
-            {
-                //推省上
-                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
-                        new PublishVisitDto()
-                        {
-                            Order = orderDto,
-                            No = visit.No,
-                            VisitType = visit.VisitType,
-                            VisitName = visit.CreatorName,
-                            VisitTime = visit.VisitTime,
-                            VisitRemark = first.VisitContent,
-                            AreaCode = visit.Order.AreaCode!,
-                            SubjectResultSatifyCode = first.OrgProcessingResults.Key,
-                            FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
-                            ClientGuid = ""
-                        }, cancellationToken: HttpContext.RequestAborted);
-
-                //推门户
-                await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
-                {
-                    Id = visit.Id,
-                    Order = orderDto,
-                    OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(visit.OrderVisitDetails),
-                    VisitName = _sessionContext.UserName,
-                    VisitTime = visit.VisitTime,
-                    VisitType = visit.VisitType,
-                    VisitState = visit.VisitState,
-                    PublishTime = visit.PublishTime,
-                }, cancellationToken: HttpContext.RequestAborted);
-            }
+        await _orderVisitRepository.UpdateAsync(visit, HttpContext.RequestAborted);
+        await _orderVisitedDetailRepository.UpdateRangeAsync(visit.OrderVisitDetails, HttpContext.RequestAborted);
+        await _orderRepository.UpdateAsync(visit.Order, HttpContext.RequestAborted);
+        var orderDto = _mapper.Map<OrderDto>(visit.Order);
+        if (first != null)
+        {
+            //推省上
+            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisited,
+                    new PublishVisitDto()
+                    {
+                        Order = orderDto,
+                        No = visit.No,
+                        VisitType = visit.VisitType,
+                        VisitName = visit.CreatorName,
+                        VisitTime = visit.VisitTime,
+                        VisitRemark = first.VisitContent,
+                        AreaCode = visit.Order.AreaCode!,
+                        SubjectResultSatifyCode = first.OrgProcessingResults.Key,
+                        FirstSatisfactionCode = visit.Order.FirstVisitResultCode!,
+                        ClientGuid = ""
+                    }, cancellationToken: HttpContext.RequestAborted);
 
-            if (first != null)
+            //推门户
+            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderVisitedWeb, new PublishVisitAllDto()
             {
-                //写入质检
-                await _qualityApplication.AddQualityAsync(EQualitySource.Visit, visit.Order.Id, visit.Id,
-                    HttpContext.RequestAborted);
-            }
+                Id = visit.Id,
+                Order = orderDto,
+                OrderVisitDetails = _mapper.Map<List<VisitDetailDto>>(visit.OrderVisitDetails),
+                VisitName = _sessionContext.UserName,
+                VisitTime = visit.VisitTime,
+                VisitType = visit.VisitType,
+                VisitState = visit.VisitState,
+                PublishTime = visit.PublishTime,
+            }, cancellationToken: HttpContext.RequestAborted);
+        }
+
+        if (first != null)
+        {
+            //写入质检
+            await _qualityApplication.AddQualityAsync(EQualitySource.Visit, visit.Order.Id, visit.Id,
+                HttpContext.RequestAborted);
+        }
         //}
         //else
         //{
@@ -1389,7 +1389,7 @@ public class OrderController : BaseController
     {
         dto.CreationTimeEnd = DateTime.Now;
         dto.CreationTimeStart = DateTime.Now;
-        if (dto.IsHomePage!=null && dto.IsHomePage==true)
+        if (dto.IsHomePage != null && dto.IsHomePage == true)
         {
             dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
         }
@@ -1400,7 +1400,7 @@ public class OrderController : BaseController
             .Includes(x => x.OrderVisit, y => y.Employee)
             .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && (int)s.Status < 2 && s.IsDeleted == false)
             .Where((x, s) => s.Id == null)
-            .WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage==true ,x=>x.OrderVisit.VisitTime< dto.CreationTimeEnd && x.OrderVisit.VisitTime> dto.CreationTimeStart)
+            .WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage == true, x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
             .Where((x, s) => x.OrderVisit.VisitState != EVisitState.None && x.OrderVisit.IsCanHandle);
         if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
         {
@@ -1770,7 +1770,7 @@ public class OrderController : BaseController
         await _orderSuperviseRepository.UpdateAsync(supervise, HttpContext.RequestAborted);
         var order = await _orderRepository.GetAsync(supervise.OrderId, HttpContext.RequestAborted);
         //推省上
-        if (supervise.Province.HasValue  && supervise.Province.Value)
+        if (supervise.Province.HasValue && supervise.Province.Value)
         {
             var orderDto = _mapper.Map<OrderDto>(order);
             var superviseDto = _mapper.Map<SuperviseOrderDto>(supervise);
@@ -2062,12 +2062,12 @@ public class OrderController : BaseController
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!)) //标题
             .WhereIF(!string.IsNullOrEmpty(dto.ProvinceNo), d => d.ProvinceNo.Contains(dto.ProvinceNo)) //省本地编号
             .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No)) //工单编码
-            //.WhereIF(!string.IsNullOrEmpty(dto.Content), d => d.Content.Contains(dto.Content!))
+                                                                                //.WhereIF(!string.IsNullOrEmpty(dto.Content), d => d.Content.Contains(dto.Content!))
             .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType)) //受理类型
             .WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
             .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
             .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!)) //转接号码
-            //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
+                                                                                                                  //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
             .WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
             .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
@@ -2621,8 +2621,8 @@ public class OrderController : BaseController
                 d => d.No.Contains(dto.Keyword) || d.Title.Contains(dto.Keyword))
             .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
             .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => !d.CounterSignType.HasValue)
-            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == true,d=> d.ExpiredTime < DateTime.Now) //超期 未办
-            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false,d=>d.NearlyExpiredTime< DateTime.Now &&  d.ExpiredTime>DateTime.Now)//即将超期 未办
+            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == true, d => d.ExpiredTime < DateTime.Now) //超期 未办
+            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false, d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now)//即将超期 未办
             .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
             .Where(x => x.Status != EOrderStatus.BackToProvince)
             .OrderByDescending(d => d.StartTime)
@@ -2641,7 +2641,7 @@ public class OrderController : BaseController
         handleStatuses = handleStatuses.WhereIF(dto.IsHandled.HasValue,
                 d => dto.IsHandled!.Value
                     ? d is not EOrderStatus.WaitForAccept and not EOrderStatus.BackToUnAccept and not EOrderStatus.SpecialToUnAccept
-					: d is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or  EOrderStatus.SpecialToUnAccept)
+                    : d is EOrderStatus.WaitForAccept or EOrderStatus.BackToUnAccept or EOrderStatus.SpecialToUnAccept)
             .ToArray();
 
         var (total, items) = await _orderRepository.Queryable(viewFilter: false)
@@ -2755,7 +2755,7 @@ public class OrderController : BaseController
         //执行退回
         if (sendBack.State == ESendBackAuditState.End)
         {
-            await _workflowApplication.OrderPreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId, HttpContext.RequestAborted);
+            await _workflowApplication.PreviousAsync(sendBack.SendBackData, sendBack.WorkflowUserId, HttpContext.RequestAborted);
             //发送短信TODO
 
         }
@@ -3044,7 +3044,7 @@ public class OrderController : BaseController
             //    var expiredTimeConfig = _timeLimitDomainService.CalcExpiredTime(DateTime.Now, EFlowDirection.CenterToOrg, order.AcceptTypeCode);
             //    _mapper.Map(expiredTimeConfig, order);
             //    await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
-                
+
             //}
 
             await _workflowApplication.RecallAsync(recall, order.ExpiredTime, HttpContext.RequestAborted);
@@ -3102,7 +3102,10 @@ public class OrderController : BaseController
     [LogFilter("审批工单特提")]
     public async Task Update([FromBody] AuditOrderSpecialDto dto)
     {
-        var special = await _orderSpecialRepository.GetAsync(dto.Id);
+        var special = await _orderSpecialRepository
+            .Queryable()
+            .Includes(d => d.Order)
+            .FirstAsync(d => d.Id == dto.Id);
         if (special is null) throw UserFriendlyException.SameMessage("无效特提审批信息!");
         if (special.State != 0) throw UserFriendlyException.SameMessage("无效特提审批信息,特提审批信息错误,该信息已审核!");
         if (string.IsNullOrEmpty(dto.NextStepName)) dto.NextStepName = special.NextStepName;
@@ -3129,7 +3132,7 @@ public class OrderController : BaseController
 
             //todo 特提重办,按审批通过时间依据中心派至部门的规则计算期满时间,更新order
 
-            await _workflowApplication.RecallAsync(recall, null, HttpContext.RequestAborted);
+            await _workflowApplication.RecallAsync(recall, special.Order.ExpiredTime, HttpContext.RequestAborted);
             var publish = await _orderPublishRepository.GetAsync(x => x.OrderId == special.OrderId);
             if (publish != null)
             {
@@ -3324,16 +3327,16 @@ public class OrderController : BaseController
     public async Task<object> SpecialBaseData(string id)
     {
         var step = await _workflowApplication.GetRecallStepsAsync(id, HttpContext.RequestAborted);
-        if (step != null && step.Steps.Any() && _sessionContext.OrgIsCenter)
+        if (step != null && step.Steps.Any() && _sessionContext.Roles.Contains("zuoxi"))
         {
             step.Steps = step.Steps.Where(x => x.Key == "start").ToList();
         }
-		var rsp = new
+        var rsp = new
         {
             SpecialTimeType = EnumExts.GetDescriptions<ETimeType>(),
             SpecialReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SpecialReason),
             Step = step
-		};
+        };
         return rsp;
     }
 

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

@@ -35,7 +35,7 @@ namespace Hotline.Application.FlowEngine
         /// <summary>
         /// 工单退回(返回前一节点)
         /// </summary>
-        Task OrderPreviousAsync(PreviousWorkflowDto dto, string userId, CancellationToken cancellationToken);
+        Task PreviousAsync(PreviousWorkflowDto dto, string userId, CancellationToken cancellationToken);
 
         /// <summary>
         /// 撤回至任意节点

+ 13 - 7
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -260,19 +260,22 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true,
             withCountersigns: true, cancellationToken: cancellationToken);
-        User user = await _userRepository.Queryable().Includes(x => x.Organization)
-            .Where(x => x.Id == _sessionContext.RequiredUserId).FirstAsync();
+        var user = await _userRepository.Queryable()
+            .Includes(x => x.Organization)
+            .FirstAsync(x => x.Id == _sessionContext.RequiredUserId, cancellationToken);
         await _workflowDomainService.PreviousAsync(workflow, dto, user, cancellationToken);
     }
 
     /// <summary>
     /// 工单退回(返回前一节点)
     /// </summary>
-    public async Task OrderPreviousAsync(PreviousWorkflowDto dto, string userId, CancellationToken cancellationToken)
+    public async Task PreviousAsync(PreviousWorkflowDto dto, string userId, CancellationToken cancellationToken)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId, withSteps: true,
            withCountersigns: true, cancellationToken: cancellationToken);
-        User user = await _userRepository.Queryable().Includes(x => x.Organization).Where(x => x.Id == userId).FirstAsync();
+        var user = await _userRepository.Queryable()
+            .Includes(x => x.Organization)
+            .FirstAsync(x => x.Id == userId, cancellationToken);
         await _workflowDomainService.PreviousAsync(workflow, dto, user, cancellationToken);
     }
 
@@ -604,12 +607,15 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withDefine: true, withSteps: 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.ActualHandleStepId);
         if (currentStep is null)
             throw new UserFriendlyException("无效当前节点编号");
+        var originSteps = workflow.Steps.Where(d =>
+            d.StepType != EStepType.End &&
+            d.IsOrigin &&
+            d.Id != currentStep.Id).ToList();
+        var stepCodes = originSteps.Select(d => d.Code).ToList();
+        var stepDefines = workflow.WorkflowDefinition.FindStepDefines(stepCodes);
 
         var dto = new NextStepsDto<RecallStepOption>
         {

+ 35 - 19
src/Hotline.Application/Handlers/FlowEngine/WorkflowPreviousHandler.cs

@@ -101,28 +101,44 @@ namespace Hotline.Application.Handlers.FlowEngine
                     //    //        e.Message);
                     //    //}
                     //}
-                    try
+
+                    var targetStep = notification.TargetStep;
+                    switch (targetStep.HandlerType)
                     {
-                        var user = await _userRepository.GetAsync(notification.TargetStep.HandlerId);
-                        if (!string.IsNullOrEmpty(user.PhoneNo))
-                        {
-                            var messageDto = new MessageDto()
+                        case EHandlerType.Role:
+                        case EHandlerType.AssignedUser:
+                            var users = await _userRepository.Queryable()
+                                .Where(d => targetStep.Handlers.Select(x => x.Key).Contains(d.Id))
+                                .ToListAsync(cancellationToken);
+                            foreach (var user in users)
                             {
-                                PushBusiness = EPushBusiness.OrderCallback,
-                                ExternalId = order.Id,
-                                OrderId = order.Id,
-                                PushPlatform = EPushPlatform.Sms,
-                                Remark = order.Title,
-                                Name = user.PhoneNo,
-                                TemplateCode = "1004",
-                                Params = new List<string>() { order.No },
-                                TelNumber = user.PhoneNo,
-
-                            };
-                            await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
-                        }
+                                if (!string.IsNullOrEmpty(user.PhoneNo))
+                                {
+                                    var messageDto = new MessageDto()
+                                    {
+                                        PushBusiness = EPushBusiness.OrderCallback,
+                                        ExternalId = order.Id,
+                                        OrderId = order.Id,
+                                        PushPlatform = EPushPlatform.Sms,
+                                        Remark = order.Title,
+                                        Name = user.PhoneNo,
+                                        TemplateCode = "1004",
+                                        Params = new List<string>() { order.No },
+                                        TelNumber = user.PhoneNo,
+                                    };
+                                    await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+                                }
+                            }
+                            break;
+                        case EHandlerType.OrgLevel:
+                        case EHandlerType.OrgType:
+                        case EHandlerType.AssignedOrg:
+                            //todo 部门经办人联系方式
+                            break;
+                        default:
+                            throw new ArgumentOutOfRangeException();
                     }
-                    catch { }
+
                     break;
                 case WorkflowModuleConsts.OrderDelay:
                     var delay = await _orderDelayRepository.GetAsync(workflow.ExternalId, cancellationToken);

+ 1 - 1
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -581,7 +581,7 @@ namespace Hotline.FlowEngine.Workflows
             if (prevStep == null)
                 throw UserFriendlyException.SameMessage("未查询到前一节点");
 
-            if (prevStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
+            if (workflow.IsInCountersign && prevStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
             {
                 countersignStartStep = workflow.Steps.FirstOrDefault(d => d.Id == prevStep.CountersignStartStepId);
                 if (countersignStartStep is null)