Эх сурвалжийг харах

411 市州通用-新增【附件列表】等功能

田爽 1 сар өмнө
parent
commit
ceba45a7e1

+ 136 - 76
src/Hotline.Api/Controllers/OrderController.cs

@@ -5551,82 +5551,142 @@ public class OrderController : BaseController
         return order.WorkflowTraces.Count(d => d.IsOrigin && d.BusinessType == EBusinessType.Seat);
     }
 
-    #endregion
-
-    #region 工单待办
-
-    ///// <summary>
-    ///// 查询待办工单
-    ///// </summary>
-    //[HttpGet("waited")]
-    //public async Task<PagedDto<OrderDto>> QueryWaited([FromQuery] QueryOrderWaitedDto dto)
-    //{
-    //    var isHandledStep = dto.IsHandled.HasValue && dto.IsHandled.Value;
-    //    if (isHandledStep)
-    //        dto.QueryType = null;
-
-    //    var isAdmin = _orderDomainService.IsCheckAdmin();
-    //    var query = _orderRepository
-    //        .Queryable(hasHandledStep: isHandledStep, isAdmin: isAdmin)
-    //        .Includes(d => d.OrderSpecials);
-    //    if (dto.QueryType is 1 || dto.QueryType is 2)
-    //    {
-    //        query.WhereIF(dto.QueryType is 1, d => d.IsForwarded == false)
-    //            .WhereIF(dto.QueryType is 2, d => d.IsForwarded == true)
-    //            .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact)
-    //                .NotAny())
-    //            ;
-    //    }
-
-    //    var (total, items) = await query
-    //        .Where(d => d.Status != EOrderStatus.WaitForAccept &&
-    //                    d.Status != EOrderStatus.BackToUnAccept &&
-    //                    d.Status != EOrderStatus.SpecialToUnAccept &&
-    //                    d.Status != EOrderStatus.HandOverToUnAccept)
-    //        .WhereIF(dto.QueryType is 3,
-    //            d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact).Any())
-    //        .Where(d => SqlFunc.Subqueryable<OrderDelay>().Where(od => od.OrderId == d.Id && od.IsDeleted == false && od.DelayState == EDelayState.Examining).NotAny())
-    //        .Where(d => SqlFunc.Subqueryable<OrderSendBackAudit>().Where(osba => osba.OrderId == d.Id && osba.IsDeleted == false && osba.State == ESendBackAuditState.Apply)
-    //            .NotAny())
-    //        .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(s => s.OrderId == d.Id && s.State == 0 && s.IsDeleted == false).NotAny())
-    //        .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
-    //        .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
-    //        .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
-    //        .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)
-    //        .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
-    //        .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => d.CounterSignType == null)
-    //        .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) //即将超期 未办
-    //        .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
-    //        .Where(d => d.Status != EOrderStatus.BackToProvince)
-    //        .WhereIF(!isHandledStep || _appOptions.Value.IsYiBin,d=>d.Status < EOrderStatus.Filed)
-    //        //.Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id).NotAny())
-    //        //.Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
-    //        .WhereIF(dto.StartTime.HasValue, d => d.StartTime >= dto.StartTime)
-    //        .WhereIF(dto.EndTime.HasValue, d => d.StartTime <= dto.EndTime)
-    //        .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
-    //        .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
-    //        //.OrderByDescending(d => d.IsUrgent)
-    //        .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.StartTime, OrderByType.Desc)
-    //        .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
-    //        .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //创建时间降序
-    //        .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, d => d.StartTime, OrderByType.Asc) //受理时间升序
-    //        .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, d => d.StartTime, OrderByType.Desc) //受理时间降序
-    //        .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, d => d.ExpiredTime, OrderByType.Asc) //期满时间升序
-    //        .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, d => d.ExpiredTime, OrderByType.Desc) //期满时间降序
-    //        .ToPagedListAsync(dto, HttpContext.RequestAborted);
-
-    //    return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
-    //}
-
-    /// <summary>
-    /// 列表页面基础数据
-    /// </summary>
-    /// <returns></returns>
-    [HttpGet("waited/base-data")]
+	#region 附件列表
+
+	/// <summary>
+	/// 获取工单所有文件
+	/// </summary>
+	/// <param name="id"></param>
+	/// <returns></returns>
+	[HttpGet("all_file/{id}")]
+	public async Task<List<FileDto>> GetOrderAllFile(string id)
+	{
+		var order = await _orderRepository.GetAsync(id);
+		var steps = await _workflowStepRepository.Queryable().Where(x => x.WorkflowId == order.WorkflowId).ToListAsync();
+		var allFiles = new List<FileDto>();
+		if (order != null && _sessionContext.OrgIsCenter)
+		{
+            if (order.FileJson != null )
+            {
+				var ids = order.FileJson.Select(x => x.Id).ToList();
+				allFiles = await _fileRepository.GetFilesAsync(ids, cancellationToken: HttpContext.RequestAborted);
+			}
+            if (order.ListFileJson!= null)
+            {
+				var listIds = order.ListFileJson.Select(x => x.Id).ToList();
+				var listFiles = await _fileRepository.GetFilesAsync(listIds, cancellationToken: HttpContext.RequestAborted);
+				allFiles.AddRange(listFiles);
+			}
+		}
+		foreach (var step in steps)
+		{
+			if (step.FileJson != null && step.FileJson.Any())
+			{
+				var ids = step.FileJson.Select(x => x.Id).ToList();
+				var stepFiles = await _fileRepository.GetPermissionFilesAsync(ids, HttpContext.RequestAborted);
+				allFiles.AddRange(stepFiles);
+			}
+		}
+        allFiles.ForEach(x => x.GetIsDelete(_sessionContext.RequiredUserId));
+		return allFiles;
+	}
+
+	/// <summary>
+	/// 新增附件 Classify ="附件列表上传"
+	/// </summary>
+	/// <param name="dtos"></param>
+	/// <returns></returns>
+	[HttpPost("list/file_upload")]
+	[LogFilter("附件列表新增附件")]
+
+	public async Task Add([FromBody] OrderListUploadFilesDto dto)
+	{
+        var listFileJson = new List<FileJson>();
+		if (dto.Files.Any())
+        {
+             listFileJson = await _fileRepository.AddFileAsync(dto.Files, dto.OrderId, "", HttpContext.RequestAborted);
+		}
+		await _orderRepository.Updateable().SetColumns(x => new Order { ListFileJson = listFileJson }).Where(x => x.Id == dto.OrderId).ExecuteCommandAsync(HttpContext.RequestAborted);
+	}
+
+	#endregion
+
+	#endregion
+
+	#region 工单待办
+
+	///// <summary>
+	///// 查询待办工单
+	///// </summary>
+	//[HttpGet("waited")]
+	//public async Task<PagedDto<OrderDto>> QueryWaited([FromQuery] QueryOrderWaitedDto dto)
+	//{
+	//    var isHandledStep = dto.IsHandled.HasValue && dto.IsHandled.Value;
+	//    if (isHandledStep)
+	//        dto.QueryType = null;
+
+	//    var isAdmin = _orderDomainService.IsCheckAdmin();
+	//    var query = _orderRepository
+	//        .Queryable(hasHandledStep: isHandledStep, isAdmin: isAdmin)
+	//        .Includes(d => d.OrderSpecials);
+	//    if (dto.QueryType is 1 || dto.QueryType is 2)
+	//    {
+	//        query.WhereIF(dto.QueryType is 1, d => d.IsForwarded == false)
+	//            .WhereIF(dto.QueryType is 2, d => d.IsForwarded == true)
+	//            .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact)
+	//                .NotAny())
+	//            ;
+	//    }
+
+	//    var (total, items) = await query
+	//        .Where(d => d.Status != EOrderStatus.WaitForAccept &&
+	//                    d.Status != EOrderStatus.BackToUnAccept &&
+	//                    d.Status != EOrderStatus.SpecialToUnAccept &&
+	//                    d.Status != EOrderStatus.HandOverToUnAccept)
+	//        .WhereIF(dto.QueryType is 3,
+	//            d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id && os.IsDeleted == false && os.SpecialType == ESpecialType.ReTransact).Any())
+	//        .Where(d => SqlFunc.Subqueryable<OrderDelay>().Where(od => od.OrderId == d.Id && od.IsDeleted == false && od.DelayState == EDelayState.Examining).NotAny())
+	//        .Where(d => SqlFunc.Subqueryable<OrderSendBackAudit>().Where(osba => osba.OrderId == d.Id && osba.IsDeleted == false && osba.State == ESendBackAuditState.Apply)
+	//            .NotAny())
+	//        .Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(s => s.OrderId == d.Id && s.State == 0 && s.IsDeleted == false).NotAny())
+	//        .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
+	//        .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
+	//        .WhereIF(!string.IsNullOrEmpty(dto.No), d => d.No == dto.No)
+	//        .WhereIF(!string.IsNullOrEmpty(dto.AreaCode), d => d.AreaCode == dto.AreaCode)
+	//        .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
+	//        .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => d.CounterSignType == null)
+	//        .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) //即将超期 未办
+	//        .Where(d => d.Source < ESource.MLSQ || d.Source > ESource.WZSC)
+	//        .Where(d => d.Status != EOrderStatus.BackToProvince)
+	//        .WhereIF(!isHandledStep || _appOptions.Value.IsYiBin,d=>d.Status < EOrderStatus.Filed)
+	//        //.Where(d => SqlFunc.Subqueryable<OrderSpecial>().Where(os => os.OrderId == d.Id).NotAny())
+	//        //.Where(d => d.OrderSpecials.Any() == false || d.OrderSpecials.Any(s => s.State > 0))
+	//        .WhereIF(dto.StartTime.HasValue, d => d.StartTime >= dto.StartTime)
+	//        .WhereIF(dto.EndTime.HasValue, d => d.StartTime <= dto.EndTime)
+	//        .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
+	//        .WhereIF(dto.Status.HasValue, d => d.Status == dto.Status)
+	//        //.OrderByDescending(d => d.IsUrgent)
+	//        .OrderByIF(string.IsNullOrEmpty(dto.SortField), d => d.StartTime, OrderByType.Desc)
+	//        .OrderByIF(dto is { SortField: "creationTime", SortRule: 0 }, d => d.CreationTime, OrderByType.Asc) //创建时间升序
+	//        .OrderByIF(dto is { SortField: "creationTime", SortRule: 1 }, d => d.CreationTime, OrderByType.Desc) //创建时间降序
+	//        .OrderByIF(dto is { SortField: "startTime", SortRule: 0 }, d => d.StartTime, OrderByType.Asc) //受理时间升序
+	//        .OrderByIF(dto is { SortField: "startTime", SortRule: 1 }, d => d.StartTime, OrderByType.Desc) //受理时间降序
+	//        .OrderByIF(dto is { SortField: "expiredTime", SortRule: 0 }, d => d.ExpiredTime, OrderByType.Asc) //期满时间升序
+	//        .OrderByIF(dto is { SortField: "expiredTime", SortRule: 1 }, d => d.ExpiredTime, OrderByType.Desc) //期满时间降序
+	//        .ToPagedListAsync(dto, HttpContext.RequestAborted);
+
+	//    return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+	//}
+
+	/// <summary>
+	/// 列表页面基础数据
+	/// </summary>
+	/// <returns></returns>
+	[HttpGet("waited/base-data")]
     public async Task<object> WaitedBaseData()
     {
         var wfModule = await _workflowApplication.GetWorkflowModuleAsync(WorkflowModuleConsts.OrderHandle, HttpContext.RequestAborted);

+ 8 - 2
src/Hotline.Repository.SqlSugar/File/FileRepository.cs

@@ -91,9 +91,15 @@ namespace Hotline.Repository.SqlSugar.File
 			return newFiles.Select(x=> new FileJson { Id = x.Id,FileId = x.Additions,Path = x.Path,FileName =x.Name ,FileType =x.Type}).ToList();
 		}
 
-		public async Task<List<FileDto>> GetFilesAsync(List<string> ids, CancellationToken cancellationToken) 
+		public async Task<List<FileDto>> GetFilesAsync(List<string> ids, CancellationToken cancellationToken = default) 
 		{
-			var files = await Queryable().In(x=>x.Id,ids).ToListAsync(cancellationToken);
+			var files = await Queryable().In(x => x.Id, ids).ToListAsync(cancellationToken);
+			return files.Any() ? _mapper.Map<List<FileDto>>(files) : new List<FileDto>();
+		}
+
+		public async Task<List<FileDto>> GetPermissionFilesAsync(List<string> ids, CancellationToken cancellationToken = default)
+		{
+			var files  = await Queryable().In(x => x.Id, ids).Where(x => x.CreatorOrgId.StartsWith(_sessionContext.RequiredOrgId)).ToListAsync(cancellationToken);
 			return files.Any() ? _mapper.Map<List<FileDto>>(files) : new List<FileDto>();
 		}
 

+ 19 - 4
src/Hotline.Share/Dtos/File/FileDto.cs

@@ -83,8 +83,21 @@ namespace Hotline.Share.Dtos.File
 		/// </summary>
 		public string? AllPath { get; set; }
 
+		/// <summary>
+		/// 仅限制附件列表使用字段
+		/// </summary>
+		public bool IsDelete { get; set; }
+
+		public string? CreatorId { get; set; }
+
+
+		public bool GetIsDelete(string userId)
+		{
+			return Classify == "附件列表上传" && userId == CreatorId;
+		}
+
 	}
-	public class UpdateFileDto: FileDto
+	public class UpdateFileDto : FileDto
 	{
 		public string Id { get; set; }
 	}
@@ -139,9 +152,10 @@ namespace Hotline.Share.Dtos.File
 		/// </summary>
 		public string? Path { get; set; }
 	}
-	
-	public class FileJson {
-	
+
+	public class FileJson
+	{
+
 		public string Id { get; set; }
 
 		public string FileName { get; set; }
@@ -158,3 +172,4 @@ namespace Hotline.Share.Dtos.File
 		public string Path { get; set; }
 	}
 }
+

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

@@ -1836,4 +1836,10 @@ namespace Hotline.Share.Dtos.Order
 
         public string? SensitiveText => (Sensitive != null && Sensitive.Any()) ? string.Join(',', Sensitive) : "";
     }
+
+    public class OrderListUploadFilesDto
+	{
+		public string OrderId { get; set; }
+		public List<FileDto> Files { get; set; } = new();
+	}
 }

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

@@ -14,7 +14,8 @@ namespace Hotline.File
 	public interface IFileRepository : IRepository<File>
 	{
 		Task<List<FileJson>> AddFileAsync(List<FileDto> files ,string id, string flowId = "",CancellationToken cancellationToken = default);
-		Task<List<FileDto>> GetFilesAsync(List<string> ids, CancellationToken cancellationToken);
+		Task<List<FileDto>> GetFilesAsync(List<string> ids, CancellationToken cancellationToken = default);
+		Task<List<FileDto>> GetPermissionFilesAsync(List<string> ids, CancellationToken cancellationToken = default);
 		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);

+ 9 - 6
src/Hotline/Orders/Order.cs

@@ -910,14 +910,17 @@ namespace Hotline.Orders
         [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true, ColumnDescription = "附件JSON")]
         public List<FileJson>? FileJson { get; set; }
 
-        #endregion
+		[SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true, ColumnDescription = "附件列表附件JSON")]
+		public List<FileJson>? ListFileJson { get; set; }
 
-        #region 市州工单互转
+		#endregion
 
-        /// <summary>
-        /// 是否转发
-        /// </summary>
-        [SugarColumn(ColumnDescription = "是否转发")]
+		#region 市州工单互转
+
+		/// <summary>
+		/// 是否转发
+		/// </summary>
+		[SugarColumn(ColumnDescription = "是否转发")]
         public bool? Transpond { get; set; }
 
         /// <summary>