Parcourir la source

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

Dun.Jason il y a 10 mois
Parent
commit
3e57e7a90b

+ 18 - 13
src/Hotline.Api/Controllers/KnowledgeCommonController.cs

@@ -3,6 +3,7 @@ using Hotline.Permissions;
 using Hotline.Share.Dtos.Knowledge;
 using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
+using XF.Domain.Authentications;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 
@@ -19,23 +20,26 @@ namespace Hotline.Api.Controllers
         private readonly IKnowledgeTypeDomainService _knowledgeTypeDomainService;
         private readonly IRepository<KnowledgeStandard> _knowledgeStandardRepository;
         private readonly IMapper _mapper;
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="knowledgeTypeRepository"></param>
-        /// <param name="knowledgeTypeDomainService"></param>
-        /// <param name="knowledgeStandardRepository"></param>
-        /// <param name="mapper"></param>
-        public KnowledgeCommonController(IRepository<KnowledgeType> knowledgeTypeRepository, IKnowledgeTypeDomainService knowledgeTypeDomainService,
-            IRepository<KnowledgeStandard> knowledgeStandardRepository,
-            IMapper mapper)
+        private readonly ISessionContext _sessionContext;
+
+		/// <summary>
+		/// 
+		/// </summary>
+		/// <param name="knowledgeTypeRepository"></param>
+		/// <param name="knowledgeTypeDomainService"></param>
+		/// <param name="knowledgeStandardRepository"></param>
+		/// <param name="mapper"></param>
+		public KnowledgeCommonController(IRepository<KnowledgeType> knowledgeTypeRepository, IKnowledgeTypeDomainService knowledgeTypeDomainService,
+            IRepository<KnowledgeStandard> knowledgeStandardRepository, ISessionContext sessionContext,
+			IMapper mapper)
         {
             _knowledgeTypeRepository = knowledgeTypeRepository;
             _knowledgeTypeDomainService = knowledgeTypeDomainService;
             _knowledgeStandardRepository = knowledgeStandardRepository;
             _mapper = mapper;
-        }
+            _sessionContext = sessionContext;
+
+		}
         #endregion
 
         #region 知识分类
@@ -135,7 +139,8 @@ namespace Hotline.Api.Controllers
         [HttpGet("treelist")]
         public async Task<List<KnowledgeType>> GetTreeList(bool? IsEnable)
         {
-            return await _knowledgeTypeRepository.Queryable().WhereIF(IsEnable.HasValue, p => p.IsEnable == IsEnable).OrderBy(p => p.Sort).ToTreeAsync(it => it.children, it => it.ParentId, null,it=> it.Id);
+            return await _knowledgeTypeRepository.Queryable().WhereIF(IsEnable.HasValue, p => p.IsEnable == IsEnable)
+				 .Where(x => x.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId)).OrderBy(p => p.Sort).ToTreeAsync(it => it.children, it => it.ParentId, null,it=> it.Id);
         }
 
         /// <summary>

+ 3 - 2
src/Hotline.Api/Controllers/KnowledgeController.cs

@@ -505,7 +505,7 @@ namespace Hotline.Api.Controllers
                 var hotspot = await _hotspotTypeRepository.GetAsync(x => x.Id == pagedDto.HotspotId);
                 hotspotHotSpotFullName = hotspot?.HotSpotFullName;
             }
-            var aa = _knowledgeRepository.Queryable().OrderByDescending(d => d.CreationTime).ToSql();
+            //var aa = _knowledgeRepository.Queryable().OrderByDescending(d => d.CreationTime).ToSql();
             var (total, temp) = await _knowledgeRepository.Queryable(false, false, false)
                 .Includes(x => x.User)
                 .Includes(x => x.SystemOrganize)
@@ -562,7 +562,8 @@ namespace Hotline.Api.Controllers
                 .Includes(x => x.HotspotType)
                 .Where(x => x.IsDeleted == false)
                 .Where(x => x.Status == EKnowledgeStatus.OnShelf)
-                .WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.All && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Title.Contains(pagedDto.Keyword!) || d.Content.Contains(pagedDto.Keyword!))// || d.Additions.Contains(pagedDto.Keyword)
+                .Where(x => x.KnowledgeType.Any(t => t.KnowledgeType.KnowledgeTypeOrgs.Any(to => to.OrgId == _sessionContext.RequiredOrgId)))
+				.WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.All && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Title.Contains(pagedDto.Keyword!) || d.Content.Contains(pagedDto.Keyword!))// || d.Additions.Contains(pagedDto.Keyword)
                 .WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Title && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Title.Contains(pagedDto.Keyword!))
                 .WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Content && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Content.Contains(pagedDto.Keyword!))
                 .WhereIF(pagedDto.RetrievalType == EKnowledgeRetrievalType.Summary && !string.IsNullOrEmpty(pagedDto.Keyword), d => d.Summary != null && d.Summary.Contains(pagedDto.Keyword!))

+ 153 - 70
src/Hotline.Api/Controllers/OrderController.cs

@@ -599,24 +599,23 @@ public class OrderController : BaseController
     /// <summary>
     /// 查询发布平移待办理人
     /// </summary>
-    /// <param name="id"></param>
-    /// <returns></returns>
-    /// <exception cref="UserFriendlyException"></exception>
     [HttpGet("published/migration")]
-    public async Task<IReadOnlyList<FlowStepHandler>> PublishMigration()
+    public async Task<IReadOnlyList<OrderMigrationHandler>> PublishMigration()
     {
         var setting = _systemSettingCacheManager.GetSetting(SettingConstants.RolePaiDan);
         var roles = setting?.SettingValue.ToList();
         var users = await _userRepository.Queryable()
             .Includes(d => d.Organization)
+            .Includes(d => d.Roles)
             .Where(d => d.Roles.Any(x => roles.Contains(x.Name)))
             .ToListAsync(HttpContext.RequestAborted);
-        return users.Select(d => new FlowStepHandler
+        return users.Select(d => new OrderMigrationHandler
         {
             UserId = d.Id,
             Username = d.Name,
             OrgId = d.OrgId,
-            OrgName = d.Organization.Name
+            OrgName = d.Organization.Name,
+            RoleNames = string.Join(',', d.Roles.Select(x => x.DisplayName).ToList())
         }).ToList();
     }
 
@@ -3040,23 +3039,47 @@ public class OrderController : BaseController
         if (dto.EndTime.HasValue)
             dto.EndTime = dto.EndTime.Value.AddDays(1).AddSeconds(-1);
 
-        var (total, items) = await _orderRepository.Queryable(canView: false)
-            .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
-            .WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status))
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.No.Contains(dto.Keyword!) || d.Title.Contains(dto.Keyword!))
-            .Where(d => string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)
-            .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 && d.Status < EOrderStatus.Filed) || (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
-            .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false, d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now)//即将超期 未办
-            .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
-            .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
-            .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
-            .Where(x => x.Status != EOrderStatus.BackToProvince && x.Status < EOrderStatus.Filed)
-            .OrderBy(d => d.Status)
-            .OrderByIF(dto.IsHandled == true, d => d.StartTime, OrderByType.Desc)
-            .OrderByIF(dto.IsHandled == false, d => d.CreationTime, OrderByType.Desc)
-            .ToPagedListAsync(dto, HttpContext.RequestAborted);
+        //var (total, items) = await _orderRepository.Queryable(canView: false)
+        //    .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+        //    .WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status))
+        //    .WhereIF(!string.IsNullOrEmpty(dto.Keyword), 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 && d.Status < EOrderStatus.Filed) || (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
+        //    .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false, d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now)//即将超期 未办
+        //    .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
+        //    .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
+        //    .Where(d=>(string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)))
+        //    //.Where(d => string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)
+        //    .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
+        //    .Where(x => x.Status != EOrderStatus.BackToProvince && x.Status < EOrderStatus.Filed)
+        //    .OrderBy(d => d.Status)
+        //    .OrderByIF(dto.IsHandled == true, d => d.StartTime, OrderByType.Desc)
+        //    .OrderByIF(dto.IsHandled == false, d => d.CreationTime, OrderByType.Desc)
+        //    .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+        var a = _orderRepository.Queryable(hasHandled: dto.IsHandled);
+        var b = _orderRepository.Queryable()
+            .Where(d => (string.IsNullOrEmpty(d.WorkflowId) &&
+                         (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)));
+        var (total, items) = await _orderRepository.UnionAll(a, b)
+        .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+        .WhereIF(dto.IsHandled.HasValue, d => handleStatuses.Contains(d.Status))
+        .WhereIF(!string.IsNullOrEmpty(dto.Keyword), 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 && d.Status < EOrderStatus.Filed) || (d.ExpiredTime < d.ActualHandleTime && d.Status >= EOrderStatus.Filed)) //超期 未办
+        .WhereIF(dto.ExpiredOrAlmostOverdue.HasValue && dto.ExpiredOrAlmostOverdue == false, d => d.NearlyExpiredTime < DateTime.Now && d.ExpiredTime > DateTime.Now)//即将超期 未办
+        .WhereIF(dto.StartTime.HasValue, d => d.CreationTime >= dto.StartTime)
+        .WhereIF(dto.EndTime.HasValue, d => d.CreationTime <= dto.EndTime)
+        //.Where(d => (string.IsNullOrEmpty(d.WorkflowId) && (string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)))
+        //.Where(d => string.IsNullOrEmpty(d.SignerId) || d.SignerId == _sessionContext.RequiredUserId)
+        .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
+        .Where(x => x.Status != EOrderStatus.BackToProvince && x.Status < EOrderStatus.Filed)
+        .OrderBy(d => d.Status)
+        .OrderByIF(dto.IsHandled == true, d => d.StartTime, OrderByType.Desc)
+        .OrderByIF(dto.IsHandled == false, d => d.CreationTime, OrderByType.Desc)
+        .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
         return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
     }
@@ -4745,50 +4768,108 @@ public class OrderController : BaseController
     [HttpGet("order/about_expire/list")]
     public async Task<PagedDto<OrderDto>> AboutList([FromQuery] AboutToExpireListDto dto)
     {
-        return await _orderApplication.GetAboutToExpireAsync(dto, HttpContext.RequestAborted);
-    }
-
-    ///// <summary>
-    ///// 工单即将超期节点列表
-    ///// </summary>
-    ///// <param name="dto"></param>
-    ///// <returns></returns>
-    //[HttpGet("order/about_expire_node/list")]
-    //public async Task<PagedDto<WorkflowOrderDto>> AboutNodeList([FromQuery] AboutToExpireListDto dto)
-    //{
-    //    return await _orderApplication.GetAboutToExpireNodeAsync(dto, HttpContext.RequestAborted);
-    //}
-
-    /// <summary>
-    /// 工单超期列表
-    /// </summary>
-    /// <param name="dto"></param>
-    /// <returns></returns>
-    [HttpGet("order/expire/list")]
-    public async Task<PagedDto<OrderDto>> List([FromQuery] AboutToExpireListDto dto)
-    {
-        return await _orderApplication.GetToExpireAsync(dto, HttpContext.RequestAborted);
-    }
-
-    ///// <summary>
-    ///// 工单超期节点列表
-    ///// </summary>
-    ///// <param name="dto"></param>
-    ///// <returns></returns>
-    //[HttpGet("order/expire_node/list")]
-    //public async Task<PagedDto<WorkflowOrderDto>> NodeList([FromQuery] AboutToExpireListDto dto)
-    //{
-    //    return await _orderApplication.GetToExpireNodeAsync(dto, HttpContext.RequestAborted);
-    //}
-
-    #endregion
-
-    #region 工单签收
-
-    /// <summary>
-    /// 工单签收
-    /// </summary>
-    [HttpPost("sign/{orderId}")]
+        var (total, items) = await _orderApplication.GetAboutToExpireAsync(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
+        return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+	}
+
+	/// <summary>
+	/// 工单即将超期列表导出
+	/// </summary>
+	/// <returns></returns>
+	[HttpPost("order/about_expire/_export")]
+    public async Task<FileStreamResult> AboutListExport([FromBody] ExportExcelDto<AboutToExpireListDto> dto)
+    {
+	    var query = _orderApplication.GetAboutToExpireAsync(dto.QueryDto);
+	    List<Hotline.Orders.Order> orders;
+	    if (dto.IsExportAll)
+	    {
+		    orders = await query.ToListAsync(HttpContext.RequestAborted);
+	    }
+	    else
+	    {
+		    var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+		    orders = items;
+	    }
+	    var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
+	    dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+	    var dtos = ordersDtos
+		    .Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+		    .Cast<object>()
+		    .ToList();
+	    var stream = ExcelHelper.CreateStream(dtos);
+	    return ExcelStreamResult(stream, "工单即将超期列表数据");
+    }
+
+	///// <summary>
+	///// 工单即将超期节点列表
+	///// </summary>
+	///// <param name="dto"></param>
+	///// <returns></returns>
+	//[HttpGet("order/about_expire_node/list")]
+	//public async Task<PagedDto<WorkflowOrderDto>> AboutNodeList([FromQuery] AboutToExpireListDto dto)
+	//{
+	//    return await _orderApplication.GetAboutToExpireNodeAsync(dto, HttpContext.RequestAborted);
+	//}
+
+	/// <summary>
+	/// 工单超期列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[HttpGet("order/expire/list")]
+    public async Task<PagedDto<OrderDto>> ExpireList([FromQuery] AboutToExpireListDto dto)
+    {
+        var (total, items) = await _orderApplication.GetToExpireAsync(dto).ToPagedListAsync(dto, HttpContext.RequestAborted);
+        return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+	}
+
+	/// <summary>
+	/// 工单超期列表导出
+	/// </summary>
+	/// <returns></returns>
+	[HttpPost("order/expire/_export")]
+	public async Task<FileStreamResult> ExpireListExport([FromBody] ExportExcelDto<AboutToExpireListDto> dto)
+	{
+		var query = _orderApplication.GetToExpireAsync(dto.QueryDto);
+		List<Hotline.Orders.Order> orders;
+		if (dto.IsExportAll)
+		{
+			orders = await query.ToListAsync(HttpContext.RequestAborted);
+		}
+		else
+		{
+			var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
+			orders = items;
+		}
+		var ordersDtos = _mapper.Map<ICollection<OrderDto>>(orders);
+		dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass(dto.ColumnInfos);
+		var dtos = ordersDtos
+			.Select(stu => _mapper.Map(stu, typeof(OrderDto), dynamicClass))
+			.Cast<object>()
+			.ToList();
+		var stream = ExcelHelper.CreateStream(dtos);
+		return ExcelStreamResult(stream, "工单超期列表数据");
+	}
+
+	///// <summary>
+	///// 工单超期节点列表
+	///// </summary>
+	///// <param name="dto"></param>
+	///// <returns></returns>
+	//[HttpGet("order/expire_node/list")]
+	//public async Task<PagedDto<WorkflowOrderDto>> NodeList([FromQuery] AboutToExpireListDto dto)
+	//{
+	//    return await _orderApplication.GetToExpireNodeAsync(dto, HttpContext.RequestAborted);
+	//}
+
+	#endregion
+
+	#region 工单签收
+
+	/// <summary>
+	/// 工单签收
+	/// </summary>
+	[HttpPost("sign/{orderId}")]
     [LogFilter("工单签收")]
     public async Task Sign(string orderId)
     {
@@ -5437,7 +5518,7 @@ public class OrderController : BaseController
         if (steps.Count > 1)
             throw new UserFriendlyException("多个待办理节点暂不支持平移");
         var step = steps.First();
-        if (step.BusinessType is not EBusinessType.Center and EBusinessType.Send)
+        if (step.BusinessType is not EBusinessType.Center and not EBusinessType.Send)
             throw UserFriendlyException.SameMessage("当前办理节点非中心暂不支持平移");
 
         var setting = step.BusinessType is EBusinessType.Center
@@ -5446,17 +5527,19 @@ public class OrderController : BaseController
         var roles = setting?.SettingValue.ToList();
         var users = await _userRepository.Queryable()
             .Includes(d => d.Organization)
+            .Includes(d => d.Roles)
             .Where(d => d.Roles.Any(x => roles.Contains(x.Name)))
             .ToListAsync(HttpContext.RequestAborted);
         return new GetOrderMigrationDto
         {
             StepId = step.Id,
-            Handlers = users.Select(d => new FlowStepHandler
+            Handlers = users.Select(d => new OrderMigrationHandler
             {
                 UserId = d.Id,
                 Username = d.Name,
                 OrgId = d.OrgId,
-                OrgName = d.Organization.Name
+                OrgName = d.Organization.Name,
+                RoleNames = string.Join(',', d.Roles.Select(x => x.DisplayName).ToList())
             }).ToList()
         };
     }

+ 1 - 1
src/Hotline.Api/config/appsettings.Development.json

@@ -25,7 +25,7 @@
     "Host": "110.188.24.182",
     "Port": 50179,
     //"Password": "fengwo22@@",
-    "Database": 5
+    "Database": 5 //release:3, dev:5
   },
   "Swagger": true,
   "Cors": {

+ 1 - 1
src/Hotline.Application/Handlers/FlowEngine/WorkflowPreviousHandler.cs

@@ -78,7 +78,7 @@ namespace Hotline.Application.Handlers.FlowEngine
                     if (notification.TargetStep.StepType is EStepType.Start)
                     {
                         order.Status = EOrderStatus.BackToUnAccept;
-                        order.BackToUnsign();
+                        //order.BackToUnsign();
                     }
 
                     await _orderRepository.UpdateAsync(order, cancellationToken);

+ 20 - 17
src/Hotline.Application/Handlers/FlowEngine/WorkflowRecallHandler.cs

@@ -63,25 +63,28 @@ public class WorkflowRecallHandler : INotificationHandler<RecallNotify>
                 _mapper.Map(workflow, order);
                 if (notification.TargetStep.StepType is EStepType.Start)
                 {
-                    if (!bool.TryParse(
-                            _systemSettingCacheManager.GetSetting(SettingConstants.IsRecallToSeatDesignated)?.SettingValue[0],
-                            out var isRecallToSeatDesignated))
-                        isRecallToSeatDesignated = false;
+                    //if (!bool.TryParse(
+                    //        _systemSettingCacheManager.GetSetting(SettingConstants.IsRecallToSeatDesignated)?.SettingValue[0],
+                    //        out var isRecallToSeatDesignated))
+                    //    isRecallToSeatDesignated = false;
                     //var isRecallToSeatDesignated = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsRecallToSeatDesignated).SettingValue[0]);
                     order.Status = EOrderStatus.SpecialToUnAccept;
-                    if (isRecallToSeatDesignated)
-                    {
-                        if (data.HandlerType is EHandlerType.Role or EHandlerType.AssignedUser)
-                        {
-                            var handler = data.NextHandlers.First();
-                            order.SignerId = handler.Key;
-                            order.SignerName = handler.Value;
-                        }
-                    }
-                    else
-                    {
-                        order.BackToUnsign();
-                    }
+                    //if (isRecallToSeatDesignated)
+                    //{
+                    //    if (data.HandlerType is EHandlerType.Role or EHandlerType.AssignedUser)
+                    //    {
+                    //        var handler = data.NextHandlers.FirstOrDefault();
+                    //        if (handler != null)
+                    //        {
+                    //            order.SignerId = handler.Key;
+                    //            order.SignerName = handler.Value;
+                    //        }
+                    //    }
+                    //}
+                    //else
+                    //{
+                    //    //order.BackToUnsign();
+                    //}
                 }
                 await _orderRepository.UpdateAsync(order, false, cancellationToken);
                 break;

+ 3 - 3
src/Hotline.Application/Orders/IOrderApplication.cs

@@ -39,9 +39,9 @@ namespace Hotline.Application.Orders
         /// </summary>
         Task CancelOrderAsync(string orderId, string opinion, CancellationToken cancellationToken);
 
-        Task<PagedDto<OrderDto>> GetToExpireAsync(AboutToExpireListDto dto, CancellationToken cancellationToken);
-        //Task<PagedDto<WorkflowOrderDto>> GetToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken);
-        Task<PagedDto<OrderDto>> GetAboutToExpireAsync(AboutToExpireListDto dto, CancellationToken cancellationToken);
+        ISugarQueryable<Order> GetToExpireAsync(AboutToExpireListDto dto);
+		//Task<PagedDto<WorkflowOrderDto>> GetToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken);
+		ISugarQueryable<Order> GetAboutToExpireAsync(AboutToExpireListDto dto);
         //Task<PagedDto<WorkflowOrderDto>> GetAboutToExpireNodeAsync(AboutToExpireListDto dto, CancellationToken cancellationToken);
         Task OrderParticiple(string inputStr, string orderId, CancellationToken cancellationToken);
         Task OrderSensitiveParticiple(string inputStr, string orderId, CancellationToken cancellationToken);

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

@@ -170,7 +170,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     /// <param name="dto"></param>
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    public async Task<PagedDto<OrderDto>> GetAboutToExpireAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
+    public ISugarQueryable<Order> GetAboutToExpireAsync(AboutToExpireListDto dto)
     {
         var setting = _systemSettingCacheManager.GetSetting(SettingConstants.OrderAboutToExpire);
         var value = setting?.SettingValue[0];
@@ -178,14 +178,15 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         DateTime stTime = DateTime.Now.AddDays(int.Parse(value));
         stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
         DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
-        var (total, items) = await _orderRepository.Queryable(canView: true)
+        return  _orderRepository.Queryable(canView: true)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
-            .Where(d => d.ExpiredTime != null &&
+            .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No.Contains(dto.No!))
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), d => d.Title.Contains(dto.Title!))
+            .WhereIF(dto.Delay.HasValue && dto.Delay == true,d=>d.OrderDelays.Any() == true)
+            .WhereIF(dto.Delay.HasValue && dto.Delay == false, d => d.OrderDelays.Any() == false)
+			.Where(d => d.ExpiredTime != null &&
             d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited && stTime >= d.ExpiredTime.Value && stTime2 <= d.ExpiredTime.Value)
-            .OrderByDescending(d => d.CreationTime)
-            .ToPagedListAsync(dto.PageIndex, dto.PageSize, cancellationToken);
-        return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+            .OrderByDescending(d => d.CreationTime);
     }
 
     // /// <summary>
@@ -221,20 +222,20 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     /// <param name="dto"></param>
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    public async Task<PagedDto<OrderDto>> GetToExpireAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
+    public ISugarQueryable<Order> GetToExpireAsync(AboutToExpireListDto dto)
     {
         DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
-        var (total, items) = await _orderRepository.Queryable(canView: true)
+        return _orderRepository.Queryable(canView: true)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
-            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
-            //.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No == dto.No)
-            //.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
-            .Where(d => d.ExpiredTime != null &&
+              //.WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword!) || d.No.Contains(dto.Keyword!))
+            .WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No.Contains(dto.No))
+            .WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Title.Contains(dto.Title!))
+            .WhereIF(dto.Delay.HasValue && dto.Delay == true, d => d.OrderDelays.Any() == true)
+            .WhereIF(dto.Delay.HasValue && dto.Delay == false, d => d.OrderDelays.Any() == false)
+			.Where(d => d.ExpiredTime != null &&
             (((d.Status == EOrderStatus.Filed || d.Status == EOrderStatus.Published || d.Status == EOrderStatus.Visited) && d.FiledTime >= d.ExpiredTime) ||
             ((d.Status != EOrderStatus.Filed && d.Status != EOrderStatus.Published && d.Status != EOrderStatus.Visited) && stTime >= d.ExpiredTime.Value)))
-            .OrderByDescending(x => x.CreationTime)
-            .ToPagedListAsync(dto.PageIndex, dto.PageSize, cancellationToken);
-        return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+            .OrderByDescending(x => x.CreationTime);
     }
 
     //     /// <summary>

+ 1 - 0
src/Hotline.Repository.SqlSugar/BaseRepository.cs

@@ -215,6 +215,7 @@ namespace Hotline.Repository.SqlSugar
         public DeleteNavTaskInit<TEntity, TEntity> RemoveNav(List<TEntity> entities) => Db.DeleteNav(entities);
 
         public DeleteNavTaskInit<TEntity, TEntity> RemoveNav(Expression<Func<TEntity, bool>> predicate) => Db.DeleteNav(predicate);
+        public ISugarQueryable<TEntity> UnionAll(params ISugarQueryable<TEntity>[] queryables) => Db.UnionAll(queryables);
 
         /// <summary>
         /// 基础分页

+ 6 - 1
src/Hotline.Share/Dtos/Order/Migration/GetOrderMigrationDto.cs

@@ -10,6 +10,11 @@ namespace Hotline.Share.Dtos.Order.Migration
     public class GetOrderMigrationDto
     {
         public string StepId { get; set; }
-        public IReadOnlyList<FlowStepHandler> Handlers { get; set; }
+        public IReadOnlyList<OrderMigrationHandler> Handlers { get; set; }
+    }
+
+    public class OrderMigrationHandler : FlowStepHandler
+    {
+        public string RoleNames { get; set; }
     }
 }

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

@@ -355,7 +355,13 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public int DelayingCount => OrderDelays?.Count ?? 0;
 
-        private string CalculateExpiredText()
+
+        /// <summary>
+        /// 是否延期 
+        /// </summary>
+        public string? DelayText => DelayingCount > 0 ? "是" : "否"; 
+
+		private string CalculateExpiredText()
         {
             //todo 完整处理方案:1.创建待过期表,Id,过期时间,即将过期时间等字段。2.延迟消息通知处理过期,删除子表数据,处理order过期状态字段。3.此处即可采用expiredStatus进行判断
             //todo 目前暂时采用过期时间计算

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

@@ -502,4 +502,6 @@ public record AboutToExpireListDto : PagedKeywordRequest
     /// 工单标题
     /// </summary>
     public string? Title { get; set; }
+
+    public bool? Delay { get; set; }
 }

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

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

+ 2 - 2
src/Hotline/KnowledgeBase/KnowledgeTypeDomainService.cs

@@ -50,7 +50,7 @@ namespace Hotline.KnowledgeBase
             //处理全称,如果为第一级直接用全称,否则获取全称后拼接名称
             type.SpliceName = string.IsNullOrEmpty(FullName) ? dto.Name : FullName + "-" + dto.Name;
             var id = await _knowledgeTypeRepository.AddAsync(type, cancellationToken);
-            if (dto.TypeOrgDtos!.Any())
+            if (dto.TypeOrgDtos != null && dto.TypeOrgDtos.Any())
             {
 				List<KnowledgeTypeOrg> orgs = _mapper.Map<List<KnowledgeTypeOrg>>(dto.TypeOrgDtos);
                 orgs.ForEach(x => x.TypeId = type.Id);
@@ -86,7 +86,7 @@ namespace Hotline.KnowledgeBase
 	        //如果修改了名称,对应修改子分类全称
 	        if (result)
 		        await UpdateChildNode(type.Id);
-	        if (dto.TypeOrgDtos!.Any())
+	        if (dto.TypeOrgDtos != null && dto.TypeOrgDtos.Any())
 	        {
                 await _knowledgeTypeOrgRepository.RemoveAsync(x => x.TypeId == type.Id,false,cancellationToken);
 		        List<KnowledgeTypeOrg> orgs = _mapper.Map<List<KnowledgeTypeOrg>>(dto.TypeOrgDtos);

+ 2 - 0
src/Hotline/Orders/IOrderRepository.cs

@@ -24,6 +24,8 @@ namespace Hotline.Orders
 
         ISugarQueryable<SelectOrderId> OrderListUnionAll(ISugarQueryable<SelectOrderId> t1, ISugarQueryable<SelectOrderId> t2);
 
+
+
     }
 
     public interface IOrderScreenRepository : IRepositoryWorkflow<OrderScreen>

+ 16 - 13
src/Hotline/Orders/Order.cs

@@ -24,7 +24,7 @@ namespace Hotline.Orders
     [SugarIndex("unique_order_no", nameof(Order.No), OrderByType.Desc, true)]
     [SugarIndex("index_order_creationtime", nameof(Order.CreationTime), OrderByType.Asc)]
     [SugarIndex("index_order_startTime", nameof(Order.StartTime), OrderByType.Asc)]
-	public partial class Order : PositionWorkflowEntity
+    public partial class Order : PositionWorkflowEntity
     {
         public Order()
         {
@@ -983,26 +983,29 @@ namespace Hotline.Orders
         /// </summary>
         public void Sign(string userId, string userName)
         {
-            SignerId = userId;
-            SignerName = userName;
+            if (string.IsNullOrEmpty(SignerId))
+            {
+                SignerId = userId;
+                SignerName = userName;
+            }
         }
 
-        /// <summary>
-        /// 返回未签收状态
-        /// </summary>
-        public void BackToUnsign()
-        {
-            SignerId = string.Empty;
-            SignerName = string.Empty;
-        }
+        ///// <summary>
+        ///// 返回未签收状态
+        ///// </summary>
+        //public void BackToUnsign()
+        //{
+        //    SignerId = string.Empty;
+        //    SignerName = string.Empty;
+        //}
 
         #endregion
     }
 
     public class UnsignedOrder
     {
-	    public Order Order { get; set; }
+        public Order Order { get; set; }
 
-	    public WorkflowStep WorkflowStep { get; set; }
+        public WorkflowStep WorkflowStep { get; set; }
     }
 }

+ 2 - 0
src/XF.Domain.Repository/IRepositorySqlSugar.cs

@@ -83,6 +83,8 @@ namespace XF.Domain.Repository
         DeleteNavTaskInit<TEntity, TEntity> RemoveNav(TEntity entity);
         DeleteNavTaskInit<TEntity, TEntity> RemoveNav(List<TEntity> entities);
         DeleteNavTaskInit<TEntity, TEntity> RemoveNav(Expression<Func<TEntity, bool>> predicate);
+
+        ISugarQueryable<TEntity> UnionAll(params ISugarQueryable<TEntity>[] queryables);
     }
 
     public interface IRepositorySqlSugar<TEntity> : IRepositorySqlSugar<TEntity, string>