田爽 1 mesiac pred
rodič
commit
6640d83eb7

+ 20 - 39
src/Hotline.Api/Controllers/OrderController.cs

@@ -2507,7 +2507,10 @@ public class OrderController : BaseController
 
         var (total, items) = await _orderApplication.MayScreenList(dto)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
-        return new PagedDto<OrderVisitDetailDto>(total, _mapper.Map<IReadOnlyList<OrderVisitDetailDto>>(items));
+        var data = _mapper.Map<List<OrderVisitDetailDto>>(items);
+        var isAdmin = _orderDomainService.IsCheckAdmin();
+        data.ForEach(d => d.IsShowOperate = isAdmin == true || (d.VisitOrgCode == _sessionContext.OrgId));
+        return new PagedDto<OrderVisitDetailDto>(total, data);
     }
 
     /// <summary>
@@ -3963,33 +3966,6 @@ public class OrderController : BaseController
         return _sessionContext.OrgIsCenter ? dto : dto.DataMask();
     }
 
-
-    /// <summary>
-    /// 上传附件
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <returns></returns>
-    //[HttpPost]
-    //[LogFilterAlpha("上传附件")]
-    //public async Task UploadFiles(OrderUploadFiles dto) { 
-
-    //       var fileJson = await _fileRepository.AddFileAsync(dto.Files, dto.Id, "", HttpContext.RequestAborted);
-
-    //       if (fileJson.Any())
-    //       {
-    //		var order = await _orderRepository.GetAsync(dto.Id);
-    //           if (order.FileJson != null && order.FileJson.Any())
-    //           {
-    //               order.FileJson.AddRange(fileJson);
-    //           }
-    //           else {
-    //               order.FileJson = fileJson;
-    //		}
-    //           await _orderRepository.Updateable().SetColumns(x => new Order { FileJson = order.FileJson }).Where(x => x.Id == dto.Id).ExecuteCommandAsync();
-    //	}
-    //}
-
-
     /// <summary>
     /// 新增工单
     /// </summary>
@@ -4739,8 +4715,10 @@ public class OrderController : BaseController
                     // }).Where(o => o.Id == order.Id).ExecuteCommandAsync(HttpContext.RequestAborted);
                 }
 
-                var (_, currentStep, _, _) = await _workflowDomainService.NextAsync(_sessionContext, nextDto, order.ExpiredTime,
-                    isAutoFillSummaryOpinion, cancellationToken: cancellationToken);
+                var (_, currentStep, _, _) = await _workflowDomainService.NextAsync(_sessionContext, nextDto,
+                    expiredTime: order.ExpiredTime,
+                    isAutoFillSummaryOpinion: isAutoFillSummaryOpinion,
+                    cancellationToken: cancellationToken);
                 if (currentStep.BusinessType is EBusinessType.Send)
                 {
                     await _orderRepository.Updateable().SetColumns(o => new Order()
@@ -4779,7 +4757,8 @@ public class OrderController : BaseController
                             OrgId = unhandleStep.HandlerOrgId,
                             OrgName = unhandleStep.HandlerOrgName,
                         };
-                        var (_, _, _, nextSteps) = await _workflowDomainService.NextAsync(operater, nextflowDto, order.ExpiredTime,
+                        var (_, _, _, nextSteps) = await _workflowDomainService.NextAsync(operater, nextflowDto,
+                            EHandleMode.CrossLevel, order.ExpiredTime,
                             isAutoFillSummaryOpinion, cancellationToken: cancellationToken);
                         tempSteps.AddRange(nextSteps);
                     }
@@ -4835,8 +4814,10 @@ public class OrderController : BaseController
         NextWorkflowDto? flowDto, DateTime? expiredTime, bool isAutoFillSummaryOpinion, CancellationToken cancellation)
     {
         if (flowDto is null || !flowDto.NextHandlers.Any()) return;
-        var (_, _, _, currentSteps) = await _workflowDomainService.NextAsync(current, flowDto, expiredTime,
-            isAutoFillSummaryOpinion, cancellationToken: cancellation);
+        var (_, _, _, currentSteps) = await _workflowDomainService.NextAsync(current, flowDto,
+            expiredTime: expiredTime,
+            isAutoFillSummaryOpinion: isAutoFillSummaryOpinion,
+            cancellationToken: cancellation);
 
         foreach (var currentStep in currentSteps)
         {
@@ -5554,7 +5535,7 @@ public class OrderController : BaseController
             if (order.Workflow.IsInCountersign) throw UserFriendlyException.SameMessage("工单会签中,无法进行退回!");
 
             var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
-               dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles,dto.AssignStepId, HttpContext.RequestAborted);
+               dto.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, dto.AssignStepId, HttpContext.RequestAborted);
 
             if (oneSendBack && isOrgToCenter && _appOptions.Value.IsZiGong)
             {
@@ -5636,7 +5617,7 @@ public class OrderController : BaseController
             {
                 var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
                     order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(), sendBack.AssignStepId,
-					HttpContext.RequestAborted);
+                    HttpContext.RequestAborted);
 
                 if (prevStep.BusinessType == EBusinessType.Send)
                 {
@@ -5693,7 +5674,7 @@ public class OrderController : BaseController
                 {
                     var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
                         order.WorkflowId, sendBack.WorkflowUserId, sendBack.WorkflowOrgId, sendBack.WorkflowRoleIds.ToArray(), sendBack.AssignStepId,
-						HttpContext.RequestAborted);
+                        HttpContext.RequestAborted);
                     if (prevStep.BusinessType == EBusinessType.Send)
                     {
                         // 平均派单
@@ -5814,7 +5795,7 @@ public class OrderController : BaseController
             throw UserFriendlyException.SameMessage("该工单未开启流程");
 
         var (currentStep, prevStep, steps, isOrgToCenter, isSecondToFirstOrgLevel) = await _workflowApplication.GetPreviousInformationAsync(
-            order.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles,string.Empty, HttpContext.RequestAborted);
+            order.WorkflowId, _sessionContext.RequiredUserId, _sessionContext.RequiredOrgId, _sessionContext.Roles, string.Empty, HttpContext.RequestAborted);
         ///查询上一节点是否是领导节点
         ///ture 流程排除领导节点 排除当前节点 prevStep.BusinessType == EBusinessType.DepartmentLeader
         if (_appOptions.Value.IsYiBin && prevStep.Name.Contains("领导"))
@@ -6913,9 +6894,9 @@ public class OrderController : BaseController
         if (_appOptions.Value.IsZiGong)
         {
             step.Steps = step.Steps.Where(x => x.Key.ToLower() != "start").ToList();
-            if (step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1).Any())
+            if (step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.StepType == EStepType.Normal && x.OrgLevel == 1).Any())
             {
-                var stepdDefault = step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.OrgLevel == 1)
+                var stepdDefault = step.Steps.Where(x => x.BusinessType == EBusinessType.Department && x.StepType == EStepType.Normal && x.OrgLevel == 1)
                     .FirstOrDefault();
                 defaultStepKey = stepdDefault.Key;
             }

+ 33 - 2
src/Hotline.Application/Orders/Handles/OrderScreenHandler/OrderScreenEndWorkflowHandler.cs

@@ -3,9 +3,12 @@ using Hotline.Configurations;
 using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.WorkflowModules;
 using Hotline.Orders;
+using Hotline.Push.Notifies;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Push;
+using Hotline.Users;
 using MapsterMapper;
 using MediatR;
 using Microsoft.Extensions.Options;
@@ -24,6 +27,8 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
     private readonly ISessionContext _sessionContext;
     private readonly IRepository<OrderScreenDetail> _orderScreenDetailRepository;
     private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
+    private readonly IMediator _mediator;
+    private readonly IRepository<User> _userRepository;
 
     public OrderScreenEndWorkflowHandler(
         IOrderRepository orderRepository,
@@ -34,7 +39,9 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
         IRepository<OrderVisit> orderVisitRepository,
         ISessionContext sessionContext,
         IRepository<OrderScreenDetail> orderScreenDetailRepository,
-         IOptionsSnapshot<AppConfiguration> appOptions)
+        IOptionsSnapshot<AppConfiguration> appOptions,
+        IMediator mediator,
+        IRepository<User> userRepository)
     {
         _orderRepository = orderRepository;
         _capPublisher = capPublisher;
@@ -45,7 +52,8 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
         _sessionContext = sessionContext;
         _orderScreenDetailRepository = orderScreenDetailRepository;
         _appOptions = appOptions;
-
+        _mediator = mediator;
+        _userRepository = userRepository;
     }
 
     /// <summary>Handles a notification</summary>
@@ -142,6 +150,29 @@ public class OrderScreenEndWorkflowHandler : INotificationHandler<EndWorkflowNot
                 };
                 detail.Audit(_sessionContext.UserId, _sessionContext.UserName, _sessionContext.OrgId, _sessionContext.OrgName, 1);
                 await _orderScreenDetailRepository.AddAsync(detail, cancellationToken);
+
+                //这里处理甄别完成后发送短信
+                if (_appOptions.Value.IsZiGong)
+                {
+                    var user = await _userRepository.GetAsync(p => p.Id == screen.CreatorId, cancellationToken);
+                    if (user != null)
+                    {
+                        var isReviewPassText = isReviewPass == true ? "审批通过" : "审批拒绝";
+                        var messageDto = new Share.Dtos.Push.MessageDto
+                        {
+                            PushBusiness = EPushBusiness.ScreenEnd,
+                            ExternalId = screen.Id,
+                            OrderId = screen.Id,
+                            PushPlatform = EPushPlatform.Sms,
+                            Remark = screen.No + isReviewPassText,
+                            Name = screen.CreatorName,
+                            TemplateCode = "1019",
+                            Params = new List<string>() { screen.No, isReviewPassText },
+                            TelNumber = user.PhoneNo,
+                        };
+                        await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
+                    }
+                }
             }
         }
     }

+ 21 - 16
src/Hotline.Application/Orders/OrderApplication.cs

@@ -61,6 +61,7 @@ using Quartz.Simpl;
 using J2N.Text;
 using Hotline.Application.FlowEngine;
 using Hotline.Article;
+using Hotline.Share.Dtos.CallCenter;
 
 namespace Hotline.Application.Orders;
 
@@ -744,9 +745,13 @@ public class OrderApplication : IOrderApplication, IScopeDependency
 
         var order = await _orderRepository.Queryable()
             .FirstAsync(d => d.Id == dto.Id || d.No == dto.OrderNo, cancellationToken);
+
         if (order != null && dto.Files != null && dto.Files.Any())
         {
-            order.FileJson = await _fileRepository.AddFileAsync(dto.Files, order.Id, "", cancellationToken);
+            List<FileJson> file = order.FileJson;
+            List<FileJson> fileNew = await _fileRepository.AddFileAsync(dto.Files, order.Id, cancellationToken);
+            file.AddRange(fileNew);
+            order.FileJson = file;
             await _orderRepository.UpdateAsync(order, cancellationToken);
         }
     }
@@ -3081,6 +3086,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .Where(x => x.HandlerName != null && x.HandlerName != "")
             .WhereIF(dto.AuditType is 1, x => x.Name == "班长审批")
             .WhereIF(dto.AuditType is 2, x => x.Name == "中心领导")
+             .WhereIF(_appOptions.Value.IsZiGong && dto.AuditType is 3, x => x.Name == "中心初审")
             .GroupBy(x => new { x.HandlerName })
             .Select(x => new OrderScreenAuditVo
             {
@@ -3272,33 +3278,30 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             //    x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
             //.WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason),
             //    x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
-            .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle);
+            .Where(x => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
+            .WhereIF(dto.DataScope is 1, x => x.VisitOrgCode == _sessionContext.OrgId);
         if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
         {
-            query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                    x => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
-                         x.OrderVisit.Order.No.Contains(dto.Keyword!))
-                .Where(x => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode == _sessionContext.OrgId && (
+            query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderVisit.Order.Title.Contains(dto.Keyword!) || x.OrderVisit.Order.No.Contains(dto.Keyword!))
+                .Where(x => x.VisitTarget == EVisitTarget.Org && (
                     SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
                     SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
                     SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
                     SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
-                ));
+                ))
+                .WhereIF(dto.DataScope is 0, x => x.VisitOrgCode.StartsWith(_sessionContext.OrgId))
+                ;
         }
         else
         {
-            query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
-                    x => x.OrderVisit.Order.Title.Contains(dto.Keyword!) ||
-                         x.OrderVisit.Order.No.Contains(dto.Keyword!))
+            query.WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderVisit.Order.Title.Contains(dto.Keyword!) || x.OrderVisit.Order.No.Contains(dto.Keyword!))
                 .WhereIF(dto.ScreenType == EOrderScreenType.Org, x => x.VisitTarget == EVisitTarget.Org && (
                     SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
                     SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" ||
                     SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
                     SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
                 ))
-                .WhereIF(dto.ScreenType == EOrderScreenType.Seat,
-                    x => x.VisitTarget == EVisitTarget.Seat &&
-                         (x.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied || x.SeatEvaluate == ESeatEvaluate.NoSatisfied))
+                .WhereIF(dto.ScreenType == EOrderScreenType.Seat, x => x.VisitTarget == EVisitTarget.Seat && (x.SeatEvaluate == ESeatEvaluate.VeryNoSatisfied || x.SeatEvaluate == ESeatEvaluate.NoSatisfied))
                 ;
         }
 
@@ -3310,7 +3313,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             .OrderByIF(dto is { SortRule: 1, SortField: "order.filedTime" }, x => x.OrderVisit.Order.FiledTime, OrderByType.Desc)
             .OrderByIF(dto is { SortRule: 0, SortField: "orderVisit.visitTime" }, x => x.OrderVisit.VisitTime, OrderByType.Asc)
             .OrderByIF(dto is { SortRule: 1, SortField: "orderVisit.visitTime" }, x => x.OrderVisit.VisitTime, OrderByType.Desc)
-            .OrderByIF(dto is { SortRule: 0, SortField: "screenByEndTime" }, x => x.ScreenByEndTime, OrderByType.Asc)
+            .OrderByIF(dto is { SortRule: 0, SortField: "screenByEndTime" }, x => x.ScreenByEndTime, OrderByType.Asc)//截止申请日期排序
             .OrderByIF(dto is { SortRule: 1, SortField: "screenByEndTime" }, x => x.ScreenByEndTime, OrderByType.Desc)
             .OrderByIF(dto.SortRule is null, x => x.CreationTime, OrderByType.Desc);
     }
@@ -3640,7 +3643,9 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         _sessionContext.ChangeSession(startStep.HandlerId);
         var isAutoFillSummaryOpinion = _systemSettingCacheManager.IsAutoFillSummaryOpinion;
 
-        await _workflowDomainService.NextAsync(operater, nextDto, order.ExpiredTime, isAutoFillSummaryOpinion,
+        await _workflowDomainService.NextAsync(operater, nextDto,
+            expiredTime: order.ExpiredTime,
+            isAutoFillSummaryOpinion: isAutoFillSummaryOpinion,
             cancellationToken: cancellationToken);
     }
 
@@ -5024,7 +5029,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     {
         var query = _orderSendBackAuditRepository.Queryable()
             .Where(x => x.ApplyOrgId.Length == 6 && x.CreationTime > x.OrderExpiredTime)
-            .WhereIF(!_sessionContext.OrgIsCenter, x=>x.ApplyOrgId == _sessionContext.OrgId)
+            .WhereIF(!_sessionContext.OrgIsCenter, x => x.ApplyOrgId == _sessionContext.OrgId)
             .WhereIF(dto.StartTime.HasValue && dto.EndTime.HasValue, x => x.CreationTime >= dto.StartTime && x.CreationTime <= dto.EndTime)
             .GroupBy(x => new { x.ApplyOrgId, x.ApplyOrgName })
             .Select(x => new ExtendedSendBackVo()

+ 2 - 2
src/Hotline.Application/StatisticalReport/CallReport/YiBinCallReportApplication.cs

@@ -318,7 +318,7 @@ public class YiBinCallReportApplication : CallReportApplicationBase, ICallReport
                   InTimeImmediate = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime != null && c.RingTimes <= ringTimes, 1, 0)),//按时接通量
                   InHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime == null, 1, 0)), //呼入未接通
                   InHangupImmediate = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime == null && c.RingTimes <= noConnectByeTimes, 1, 0)),//未接通秒挂量
-                  OverTimeInHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime == null && c.RingTimes > noConnectByeTimes, 1, 0)), //超时未接通量
+                  OverTimeInHanguped = SqlFunc.AggregateSum(SqlFunc.IIF(c.AnsweredTime == null && c.RingTimes > ringTimes, 1, 0)), //超时未接通量
               }).ToListAsync();
         return list;
     }
@@ -354,7 +354,7 @@ public class YiBinCallReportApplication : CallReportApplicationBase, ICallReport
             .WhereIF(dto.QueryType.HasValue && dto.QueryType == 5,x=> x.AnsweredTime != null && x.RingTimes <= ringTimes) //按时接通量
             .WhereIF(dto.QueryType.HasValue && dto.QueryType == 6,x=> x.AnsweredTime == null) //呼入未接通量
             .WhereIF(dto.QueryType.HasValue && dto.QueryType == 7,x=> x.AnsweredTime == null && x.RingTimes <= noConnectByeTimes) //未接通秒挂量
-            .WhereIF(dto.QueryType.HasValue && dto.QueryType == 8,x=> x.AnsweredTime == null && x.RingTimes > noConnectByeTimes) //超时未接通量
+            .WhereIF(dto.QueryType.HasValue && dto.QueryType == 8,x=> x.AnsweredTime == null && x.RingTimes > ringTimes) //超时未接通量
             .Where(x => x.CallDirection == ECallDirection.In)
             .OrderBy(x => x.BeginRingTime)
             .MergeTable()

+ 19 - 1
src/Hotline.Repository.SqlSugar/File/FileRepository.cs

@@ -45,7 +45,25 @@ namespace Hotline.Repository.SqlSugar.File
             return entities.Select(x => new FileJson { Id = x.Id, FileId = x.Additions, Path = x.Path, FileName = x.Name, FileType = x.Type }).ToList();
         }
 
-        public async Task<List<FileJson>> AddFileAsync(List<FileDto> files, string id, string flowId = "", CancellationToken cancellationToken = default) 
+		public async Task<List<FileJson>> AddFileAsync(IList<FileDto> files, string id, CancellationToken requestAborted)
+		{
+			var entities = files.Adapt<List<Hotline.File.File>>();
+			foreach (var file in entities)
+			{
+				var names = file.FileName.Split(".");
+				file.Name = names[0];
+				file.Type = names[1];
+				file.Key = id;
+				file.OrgName = _sessionContext.OrgName;
+				file.OrgId = _sessionContext.OrgId;
+				file.UserId = _sessionContext.UserId;
+				file.UserName = _sessionContext.UserName;
+			}
+			await AddRangeAsync(entities, requestAborted);
+			return entities.Select(x => new FileJson { Id = x.Id, FileId = x.Additions, Path = x.Path, FileName = x.Name, FileType = x.Type }).ToList();
+		}
+
+		public async Task<List<FileJson>> AddFileAsync(List<FileDto> files, string id, string flowId = "", CancellationToken cancellationToken = default) 
 		{
 			List<Hotline.File.File> newFiles =  new List<Hotline.File.File>();
 			var classify = files[0].Classify;

+ 2 - 0
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -982,6 +982,8 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public DateTime? ScreenByEndTime { get; set; }
 
+        public bool? IsShowOperate { get; set; }
+
     }
 
     /// <summary>

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

@@ -862,6 +862,11 @@ namespace Hotline.Share.Dtos.Order
         /// 受理坐席名字或工号(×)
         /// </summary>
         public string? NameOrNo { get; set; }
+
+        /// <summary>
+        /// 0 全部  1 我的(本部门)
+        /// </summary>
+        public int? DataScope { get; set; }
     }
 
     public record UrgeListDto : PagedKeywordRequest

+ 6 - 0
src/Hotline.Share/Enums/FlowEngine/EHandleMode.cs

@@ -13,6 +13,12 @@ public enum EHandleMode
     [Description("正常")]
     Normal = 0,
 
+    /// <summary>
+    /// 跨级派单
+    /// </summary>
+    [Description("跨级派单")]
+    CrossLevel = 1,
+
     /// <summary>
     /// 审核通过(审批流程特有)
     /// </summary>

+ 3 - 0
src/Hotline.Share/Enums/Push/EPushBusiness.cs

@@ -87,4 +87,7 @@ public enum EPushBusiness
 
     [Description("随手拍短信")]
     Snapshot = 13,
+
+    [Description("甄别完成")]
+    ScreenEnd=14,
 }

+ 1 - 1
src/Hotline.Share/Requests/PagedKeywordRequest.cs

@@ -1008,7 +1008,7 @@ public record OrderScreenAuditPagedRequest : PagedKeywordRequest
     public string AuditUserName { get; set; }
 
     /// <summary>
-    ///  1 中心班长   2 中心领导
+    ///  1 中心班长   2 中心领导 3中心初审
     /// </summary>
     public int? AuditType { get; set; }
 

+ 3 - 1
src/Hotline/File/IFileRepository.cs

@@ -18,5 +18,7 @@ namespace Hotline.File
 		Task<List<WorkflowTraceDto>> WorkflowTraceRecursion(List<WorkflowTraceDto> dto, CancellationToken cancellationToken);
 		Task<List<Hotline.File.File>> GetByKeyAsync(string key, CancellationToken cancellationToken);
         Task<List<FileJson>> AddFileAsync(IList<SnapshotFileInDto> files, string id, CancellationToken requestAborted);
-    }
+		Task<List<FileJson>> AddFileAsync(IList<FileDto> files, string id, CancellationToken requestAborted);
+
+	}
 }

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

@@ -38,7 +38,9 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// new
         /// </summary>
-        Task<(Workflow, WorkflowStep, StepDefine, List<WorkflowStep>)> NextAsync(ISessionContext current, NextWorkflowDto dto,
+        Task<(Workflow, WorkflowStep, StepDefine, List<WorkflowStep>)> NextAsync(
+            ISessionContext current, NextWorkflowDto dto,
+            EHandleMode handleMode = EHandleMode.Normal,
             DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false,
             Action<Workflow, WorkflowStep, StepDefine>? currentStepConfig = null,
             Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,

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

@@ -284,7 +284,8 @@ namespace Hotline.FlowEngine.Workflows
         /// workflow, currentStep, nextStepDefine, nextSteps
         /// </summary>
         public async Task<(Workflow, WorkflowStep, StepDefine, List<WorkflowStep>)> NextAsync(
-            ISessionContext current, NextWorkflowDto dto,
+            ISessionContext current, NextWorkflowDto dto, 
+            EHandleMode handleMode = EHandleMode.Normal,
             DateTime? expiredTime = null, bool isAutoFillSummaryOpinion = false,
             Action<Workflow, WorkflowStep, StepDefine>? currentStepConfig = null,
             Action<Workflow, WorkflowStep, StepDefine, WorkflowStep>? newStepConfig = null,
@@ -434,7 +435,7 @@ namespace Hotline.FlowEngine.Workflows
                 }
             }
 
-            await HandleStepAsync(currentStep, workflow, dto, counterSignType, expiredTime, EHandleMode.Normal, cancellationToken);
+            await HandleStepAsync(currentStep, workflow, dto, counterSignType, expiredTime, handleMode, cancellationToken);
 
             currentStep.IsActualHandled = CheckIsActualHandle(workflow, currentStep, nextStepDefine, dto);
 
@@ -608,7 +609,9 @@ namespace Hotline.FlowEngine.Workflows
             nextDto.WorkflowId = workflow.Id;
             nextDto.StepId = startStep.Id;
             var (_, _, _, nextSteps) =
-                await NextAsync(_sessionContextProvider.SessionContext, nextDto, expiredTime, true,
+                await NextAsync(_sessionContextProvider.SessionContext, nextDto, 
+                    expiredTime: expiredTime, 
+                    isAutoFillSummaryOpinion: true,
                     newStepConfig: newStepConfig, cancellationToken: cancellationToken);
             return nextSteps;
         }

+ 53 - 50
src/Hotline/Orders/OrderDomainService.cs

@@ -70,9 +70,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     private readonly IRepository<WorkflowStep> _workflowStepRepository;
     private readonly ISystemLogRepository _systemLogRepository;
     private readonly IOrderSnapshotRepository _orderSnapshotRepository;
-	private readonly ICalcExpireTime _expireTime;
+    private readonly ICalcExpireTime _expireTime;
 
-	public OrderDomainService(
+    public OrderDomainService(
         IOrderRepository orderRepository,
         IRepository<OrderRedo> orderRedoRepository,
         IRepository<OrderPublish> orderPublishRepository,
@@ -98,7 +98,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         ISystemLogRepository systemLogRepository,
         IOptionsSnapshot<AppConfiguration> appOptions,
         IOrderSnapshotRepository orderSnapshotRepository,
-		ICalcExpireTime expireTime)
+        ICalcExpireTime expireTime)
     {
         _orderRepository = orderRepository;
         _orderRedoRepository = orderRedoRepository;
@@ -124,9 +124,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         _systemLogRepository = systemLogRepository;
         _appOptions = appOptions;
         _orderSnapshotRepository = orderSnapshotRepository;
-		_expireTime = expireTime;
+        _expireTime = expireTime;
 
-	}
+    }
 
     /// <summary>
     /// 归档后自动发布
@@ -603,33 +603,33 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
             .Where(x => x.SchedulingTime == time).CountAsync(cancellationToken);
         if (schedulings > 0)
         {
-			var sendNum = steps.Count / schedulings;
-			scheduling.SendOrderNum += sendNum;
-			if (!scheduling.LoginSendOrderNum.HasValue)
-			{
-				scheduling.LoginSendOrderNum = scheduling.LoginSendOrderNum.HasValue && scheduling.LoginSendOrderNum > sendNum ? scheduling.LoginSendOrderNum : sendNum;
-				await _schedulingRepository.Updateable()
-					.SetColumns(s => new Scheduling() { LoginSendOrderNum = scheduling.LoginSendOrderNum })
-					.Where(s => s.SchedulingTime == scheduling.SchedulingTime).ExecuteCommandAsync(cancellationToken);
-			}
-			sendNum = scheduling.LoginSendOrderNum.Value;
-			await _schedulingRepository.Updateable()
-				.SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum, AtWork = scheduling.AtWork })
-				.Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
-
-			if (sendNum <= 0) return;
-			var sendSteps = steps.Take(sendNum).ToList();
-			await _orderRepository.Updateable().SetColumns(o => new Order()
-			{
-				CenterToOrgHandlerId = user.OrgId,
-				CenterToOrgHandlerName = user.Name
-			}).Where(o => sendSteps.Any(s => s.ExternalId == o.Id)).ExecuteCommandAsync(cancellationToken);
-
-			await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)>
-			{
-				new(user.Id, user.Name, user.OrgId, user.Organization.Name,roleId,"派单员", sendSteps)
-			}, cancellationToken);
-		}
+            var sendNum = steps.Count / schedulings;
+            scheduling.SendOrderNum += sendNum;
+            if (!scheduling.LoginSendOrderNum.HasValue)
+            {
+                scheduling.LoginSendOrderNum = scheduling.LoginSendOrderNum.HasValue && scheduling.LoginSendOrderNum > sendNum ? scheduling.LoginSendOrderNum : sendNum;
+                await _schedulingRepository.Updateable()
+                    .SetColumns(s => new Scheduling() { LoginSendOrderNum = scheduling.LoginSendOrderNum })
+                    .Where(s => s.SchedulingTime == scheduling.SchedulingTime).ExecuteCommandAsync(cancellationToken);
+            }
+            sendNum = scheduling.LoginSendOrderNum.Value;
+            await _schedulingRepository.Updateable()
+                .SetColumns(s => new Scheduling() { SendOrderNum = scheduling.SendOrderNum, AtWork = scheduling.AtWork })
+                .Where(s => s.Id == scheduling.Id).ExecuteCommandAsync(cancellationToken);
+
+            if (sendNum <= 0) return;
+            var sendSteps = steps.Take(sendNum).ToList();
+            await _orderRepository.Updateable().SetColumns(o => new Order()
+            {
+                CenterToOrgHandlerId = user.OrgId,
+                CenterToOrgHandlerName = user.Name
+            }).Where(o => sendSteps.Any(s => s.ExternalId == o.Id)).ExecuteCommandAsync(cancellationToken);
+
+            await _workflowDomainService.ChangeHandlerBatchAsync(new List<(string userId, string username, string orgId, string orgName, string? roleId, string? roleName, ICollection<WorkflowStep> steps)>
+            {
+                new(user.Id, user.Name, user.OrgId, user.Organization.Name,roleId,"派单员", sendSteps)
+            }, cancellationToken);
+        }
 
     }
 
@@ -702,7 +702,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     {
         var valid = new OrderValidation { Validation = false, Result = "" };
         var hotspot = await _hotspotRepository.GetAsync(dto.HotspotId, cancellationToken);
-        if (hotspot.TrunkNum.Equals(AppDefaults.TrafficTrunkNum))
+        if (hotspot != null && hotspot.TrunkNum.Equals(AppDefaults.TrafficTrunkNum))
         {
             switch (dto.AcceptTypeCode)
             {
@@ -771,7 +771,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         return valid;
     }
     #endregion
-    
+
     #region 即将超期和超期短信
 
     /// <summary>
@@ -830,35 +830,38 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
 
     #region  计算甄别申请截至日期
 
-    public async Task<DateTime>  GetScreenByEndTime() {
+    public async Task<DateTime> GetScreenByEndTime()
+    {
 
         var endTime = DateTime.Now;
         var beginTime = DateTime.Now;
         var timeValue = 1;
-		if (_appOptions.Value.IsZiGong)
+        if (_appOptions.Value.IsZiGong)
         {
             timeValue = 2;
-		}
+        }
         else if (_appOptions.Value.IsLuZhou)
         {
-			DateTime firstDayOfMonth = new DateTime(beginTime.Year, beginTime.Month, 1);
-			DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
+            DateTime firstDayOfMonth = new DateTime(beginTime.Year, beginTime.Month, 1);
+            DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
             beginTime = new DateTime(lastDayOfMonth.Year, lastDayOfMonth.Month, lastDayOfMonth.Day, 23, 59, 59);
-		}
-        else {
-			var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ScreenApplyEndTime);
-            if (int.Parse(setting?.SettingValue[0]) > 0) {
+        }
+        else
+        {
+            var setting = _systemSettingCacheManager.GetSetting(SettingConstants.ScreenApplyEndTime);
+            if (int.Parse(setting?.SettingValue[0]) > 0)
+            {
                 timeValue = int.Parse(setting?.SettingValue[0]);
-			}
-		}
-		endTime = (await _expireTime.CalcEndTime(beginTime, beginTime, ETimeType.WorkDay, timeValue, 0, 0)).EndTime;
-		return endTime;
+            }
+        }
+        endTime = (await _expireTime.CalcEndTime(beginTime, beginTime, ETimeType.WorkDay, timeValue, 0, 0)).EndTime;
+        return endTime;
     }
-	#endregion
+    #endregion
 
-	#region private
+    #region private
 
-	private async Task<Order> GetOrderByFlowIdAsync(string workflowId, CancellationToken cancellationToken)
+    private async Task<Order> GetOrderByFlowIdAsync(string workflowId, CancellationToken cancellationToken)
     {
         if (string.IsNullOrEmpty(workflowId))
             throw UserFriendlyException.SameMessage("无效流程编号");

+ 16 - 9
src/Hotline/Orders/OrderVisitDetail.cs

@@ -8,10 +8,10 @@ using XF.Utility.EnumExtensions;
 
 namespace Hotline.Orders
 {
-	[SugarIndex("index_visitDetail_creationtime", nameof(OrderVisitDetail.CreationTime), OrderByType.Desc)]
-	[SugarIndex("index_visitDetail_visitId", nameof(OrderVisitDetail.VisitId), OrderByType.Desc)]
-	[SugarIndex("index_visitDetail_visitOrgCode", nameof(OrderVisitDetail.VisitOrgCode), OrderByType.Desc)]
-	public class OrderVisitDetail : CreationEntity
+    [SugarIndex("index_visitDetail_creationtime", nameof(OrderVisitDetail.CreationTime), OrderByType.Desc)]
+    [SugarIndex("index_visitDetail_visitId", nameof(OrderVisitDetail.VisitId), OrderByType.Desc)]
+    [SugarIndex("index_visitDetail_visitOrgCode", nameof(OrderVisitDetail.VisitOrgCode), OrderByType.Desc)]
+    public class OrderVisitDetail : CreationEntity
     {
 
         /// <summary>
@@ -99,9 +99,16 @@ namespace Hotline.Orders
         /// </summary>
         public EVisitTarget VisitTarget { get; set; }
 
-		/// <summary>
-		/// 截至甄别时间
-		/// </summary>
-		public DateTime? ScreenByEndTime { get; set; }
-	}
+        /// <summary>
+        /// 截至甄别时间
+        /// </summary>
+        public DateTime? ScreenByEndTime { get; set; }
+
+        ///// <summary>
+        ///// 查询数据用
+        ///// </summary>
+        //[SugarColumn(IsIgnore = true)]
+        //public bool? IsShowOperate { get; set; }
+
+    }
 }