Explorar o código

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

qinchaoyue hai 5 meses
pai
achega
c9385971c0

+ 8 - 2
src/Hotline.Api/Controllers/ExportWordController.cs

@@ -1,6 +1,8 @@
 using Hotline.Application.ExportWord;
+using Hotline.Caching.Interfaces;
 using Hotline.Configurations;
 using Hotline.Orders;
+using Hotline.Settings;
 using Hotline.Share.Dtos.OrderExportWord;
 using Hotline.Share.Enums.Order;
 using MapsterMapper;
@@ -19,6 +21,7 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<OrderVisitDetail> _orderVisitedDetailRepository;
         private readonly ILogger<ExportWordController> _logger;
         private readonly IOptionsSnapshot<AppConfiguration> _appOptions;
+        private readonly ISystemSettingCacheManager _systemSettingCacheManager;
 
         public ExportWordController(IOrderRepository orderRepository,
             IWordHelperService wordHelperService,
@@ -26,7 +29,8 @@ namespace Hotline.Api.Controllers
            IRepository<OrderVisit> orderVisitRepository,
            IRepository<OrderVisitDetail> orderVisitedDetailRepository,
            ILogger<ExportWordController> logger,
-            IOptionsSnapshot<AppConfiguration> appOptions)
+            IOptionsSnapshot<AppConfiguration> appOptions,
+            ISystemSettingCacheManager systemSettingCacheManager)
         {
             _orderRepository = orderRepository;
             _wordHelperService = wordHelperService;
@@ -35,6 +39,7 @@ namespace Hotline.Api.Controllers
             _orderVisitedDetailRepository = orderVisitedDetailRepository;
             _logger = logger;
             _appOptions = appOptions;
+            _systemSettingCacheManager = systemSettingCacheManager;
         }
 
         /// <summary>
@@ -47,6 +52,7 @@ namespace Hotline.Api.Controllers
             var streams = new Dictionary<string, Stream>();
             var path = $"{Directory.GetCurrentDirectory()}/Template/AssignmentForm.doc";
             int num = 1;
+            var isTheAssignmentFormConfidential = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsTheAssignmentFormConfidential).SettingValue[0]);
             foreach (var item in Ids)
             {
                 var order = await _orderRepository.GetAsync(item, HttpContext.RequestAborted);
@@ -54,7 +60,7 @@ namespace Hotline.Api.Controllers
                     continue;
 
                 //处理保密数据
-                if (_appOptions.Value.IsZiGong && order.IsSecret)
+                if (isTheAssignmentFormConfidential && order.IsSecret)
                 {
                     var maskString = "***";
                     order.Contact = maskString;

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

@@ -62,7 +62,7 @@ namespace Hotline.Application.FlowEngine
         /// <summary>
         /// 办理至结束节点(无视流程模板配置,操作人需是当前节点办理对象)
         /// </summary>
-        Task HandleToEndAsync(string workflowId, string opinion, List<FileDto> files,
+        Task HandleToEndAsync(string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime = null,
             EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default);
 
         ////////

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

@@ -410,7 +410,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <summary>
     /// 无视流程模板配置直接将当前节点办理至结束节点
     /// </summary>
-    public async Task HandleToEndAsync(string workflowId, string opinion, List<FileDto> files,
+    public async Task HandleToEndAsync(string workflowId, string opinion, List<FileDto> files, DateTime? expiredTime = null,
         EReviewResult reviewResult = EReviewResult.Unknown, CancellationToken cancellationToken = default)
     {
         var workflow = await _workflowDomainService.GetWorkflowAsync(workflowId, withDefine: true, withSteps: true,
@@ -434,7 +434,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             StepId = unHandleStep.Id
         };
         //await NextAsync(dto, cancellationToken: cancellationToken);
-        await _workflowDomainService.NextAsync(_sessionContextProvider.SessionContext, dto, cancellationToken: cancellationToken);
+        await _workflowDomainService.NextAsync(_sessionContextProvider.SessionContext, dto, expiredTime: expiredTime, cancellationToken: cancellationToken);
     }
 
     /// <summary>
@@ -975,7 +975,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     var lowLevels = levels.Where(d => d > _sessionContextProvider.SessionContext.OrgLevel).ToList();
                     orgs1 = await query
                         .Where(d => (upLevels.Contains(d.Level) && d.Id.StartsWith(levelOneOrgId)) ||
-                                    (lowLevels.Contains(d.Level) && d.Id.Contains(orgId)))
+                                    (lowLevels.Contains(d.Level) && d.Id.StartsWith(orgId)))
                         .ToListAsync(cancellationToken);
                 }
 

+ 5 - 1
src/Hotline.Application/Orders/OrderApplication.cs

@@ -240,7 +240,11 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         await _workflowDomainService.UpdateUnhandleExpiredTimeAsync(order.WorkflowId, expiredTimeConfig.ExpiredTime, cancellationToken);
 
         await _orderRepository.UpdateAsync(order, cancellationToken);
-    }
+
+        var orderDto = _mapper.Map<OrderDto>(order);
+        await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
+	        cancellationToken: cancellationToken);
+	}
 
     // /// <summary>
     // /// 新增工单办理流程记录

+ 4 - 2
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -227,7 +227,8 @@ namespace Hotline.Application.Orders
                 .Includes(x => x.SecondaryHandling)
                 .Where(x => x.OrderVisit.Order.IsProvince == false)
                 .LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false)
-                .Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
+                //.Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
+                .Where(x=> SqlFunc.Subqueryable<OrderSecondaryHandling>().Where(osh => osh.VisitDetailId == x.Id &&  osh.State == ESecondaryHandlingState.NotApply).NotAny())
                 //.Where(x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
                 .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
                 .WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
@@ -245,7 +246,8 @@ namespace Hotline.Application.Orders
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude), x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
                 .WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason), x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
-                .Where((x, s) => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
+                .Where(x => SqlFunc.Subqueryable<OrderVisit>().Where(ov => ov.Id == x.VisitId && ov.VisitState == EVisitState.Visited && ov.IsCanHandle).Any())
+                //.Where((x, s) => x.OrderVisit.VisitState == EVisitState.Visited && x.OrderVisit.IsCanHandle)
                 .WhereIF(!isAdmin, (x, s) => (x.OrderVisit.Order.CounterSignType ==  ECounterSignType.Department || x.OrderVisit.Order.CounterSignType == null) && x.VisitOrgCode.StartsWith(_sessionContext.OrgId))
                 ;
             if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)

+ 5 - 5
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -327,7 +327,7 @@ namespace Hotline.Application.Subscribers
                 }
 
                 order.CurrentStepName = workflow.CurrentStepName;
-                order.CurrentStepCode=workflow.CurrentStepCode;
+                order.CurrentStepCode = workflow.CurrentStepCode;
                 order.CurrentStepId = workflow.CurrentStepId;
                 order.CurrentStepCreateTime = workflow.CurrentStepCreateTime;
                 order.CurrentHandleTime = workflow.CurrentHandleTime;
@@ -506,9 +506,9 @@ namespace Hotline.Application.Subscribers
             //CityBaseConfiguration cityBase = JsonConvert.DeserializeObject<CityBaseConfiguration>(setting);
             SessionContextCreator.CreateSessionContext(_sessionContextProvider, dto.Source);
             await _workflowApplication.HandleToEndAsync(orderScreen.WorkflowId, "省上推送甄别结果", null,
-                dto.ProvinceScreenResult.AuditResult
+                 reviewResult: dto.ProvinceScreenResult.AuditResult
                     ? Share.Enums.FlowEngine.EReviewResult.Approval
-                    : Share.Enums.FlowEngine.EReviewResult.Failed, cancellationToken);
+                    : Share.Enums.FlowEngine.EReviewResult.Failed, cancellationToken: cancellationToken);
             orderScreen.Status = dto.ProvinceScreenResult.AuditResult ? Share.Enums.Order.EScreenStatus.End : Share.Enums.Order.EScreenStatus.Refuse;
             //if (orderScreen.Status == Share.Enums.Order.EScreenStatus.End)
             //{
@@ -783,7 +783,7 @@ namespace Hotline.Application.Subscribers
 
                     SessionContextCreator.CreateSessionContext(_sessionContextProvider, dto.Source);
                     await _workflowApplication.HandleToEndAsync(orderDelay.WorkflowId, dto.Opinion, dto.Files,
-                        dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed, cancellationToken);
+                      reviewResult: dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed, cancellationToken: cancellationToken);
                 }
             }
         }
@@ -844,7 +844,7 @@ namespace Hotline.Application.Subscribers
                     }
                     else
                     {
-                        await _workflowApplication.HandleToEndAsync(order.WorkflowId, dto.Opinion, dto.Files, cancellationToken: cancellationToken);
+                        await _workflowApplication.HandleToEndAsync(order.WorkflowId, dto.Opinion, dto.Files, expiredTime: order.ExpiredTime, cancellationToken: cancellationToken);
                     }
 
                     break;

+ 8 - 1
src/Hotline.Application/Subscribers/InternalCapSubscriber.cs

@@ -15,6 +15,7 @@ using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Push;
 using Hotline.Share.Mq;
 using Hotline.Users;
+using MapsterMapper;
 using MediatR;
 using Microsoft.AspNetCore.Http;
 using NPOI.SS.Formula.Functions;
@@ -37,6 +38,7 @@ namespace Hotline.Application.Subscribers
         private readonly IRepository<OrderDelay> _orderDelayRepository;
         private readonly IWorkflowDomainService _workflowDomainService;
         private readonly ICalcExpireTime _expireTime;
+        private readonly IMapper _mapper;
 
 		public InternalCapSubscriber(
             IOrderRepository orderRepository,
@@ -48,7 +50,8 @@ namespace Hotline.Application.Subscribers
             IOrderApplication orderApplication,
             IRepository<OrderDelay> orderDelayRepository,
             IWorkflowDomainService workflowDomainService,
-            ICalcExpireTime expireTime
+            ICalcExpireTime expireTime,
+            IMapper mapper
 			)
         {
             _orderRepository = orderRepository;
@@ -61,6 +64,7 @@ namespace Hotline.Application.Subscribers
             _orderDelayRepository = orderDelayRepository;
             _workflowDomainService = workflowDomainService;
             _expireTime = expireTime;
+            _mapper = mapper;
 		}
 
         /// <summary>
@@ -330,6 +334,9 @@ namespace Hotline.Application.Subscribers
 					}
 					order = await _orderRepository.GetAsync(dto.OrderId, cancellationToken);
 					_capPublisher.PublishDelay(order.ExpiredTime.Value - DateTime.Now.AddHours(1), EventNames.HotlineOrderAutomaticDelay, new PublishAutomaticDelayDto() { OrderId = order.Id });
+					var orderDto = _mapper.Map<OrderDto>(order);
+					await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderExpiredTimeUpdate, orderDto,
+						cancellationToken: cancellationToken);
 				}
 			}
 		

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

@@ -1272,7 +1272,11 @@ namespace Hotline.FlowEngine.Workflows
             CancellationToken cancellation)
         {
             return await _workflowStepRepository.Queryable()
-                .Where(d => d.WorkflowId == workflowId && d.HandlerOrgId == orgId && d.StepType != EStepType.End && d.StepType != EStepType.Summary)
+                .Where(d => d.WorkflowId == workflowId 
+                            && d.HandlerOrgId == orgId 
+                            && d.StepType != EStepType.End 
+                            && d.StepType != EStepType.Summary
+                            && !d.IsCountersignEndStep)
                 //.Where(d => d.StepHandlers.Any(sh => sh.OrgId == orgId) && d.WorkflowId == workflowId)
                 .OrderByDescending(d => d.HandleTime)
                 .FirstAsync(cancellation);

+ 2 - 1
src/Hotline/Orders/OrderVisitDetail.cs

@@ -8,7 +8,8 @@ using XF.Utility.EnumExtensions;
 
 namespace Hotline.Orders
 {
-    public class OrderVisitDetail : CreationEntity
+	[SugarIndex("index_visitDetail_creationtime", nameof(OrderVisitDetail.CreationTime), OrderByType.Desc)]
+	public class OrderVisitDetail : CreationEntity
     {
 
         /// <summary>

+ 4 - 0
src/Hotline/Settings/SettingConstants.cs

@@ -638,5 +638,9 @@ namespace Hotline.Settings
 		/// </summary>
 		public const string OrgVisitDetailHiddenOrderNo = "OrgVisitDetailHiddenOrderNo";
 
+        /// <summary>
+        /// 交办单是否保密
+        /// </summary>
+        public const string IsTheAssignmentFormConfidential = "IsTheAssignmentFormConfidential";
     }
 }