@@ -20,6 +20,8 @@ using NPOI.POIFS.Properties;
using Org.BouncyCastle.Crypto ;
using Microsoft.AspNetCore.Http ;
using IRaCIS.Core.Application.Contracts ;
using Microsoft.EntityFrameworkCore ;
using static Microsoft . Extensions . Logging . EventSource . LoggingEventSource ;
namespace IRaCIS.Core.Application.Service ;
@@ -29,7 +31,7 @@ namespace IRaCIS.Core.Application.Service;
/// <returns></returns>
[ApiExplorerSettings(GroupName = "FileRecord")]
public class AuditDocumentService ( IRepository < AuditDocument > _auditDocumentRepository , IRepository < AuditRecord > _auditRecordRepository ,
IRepository < AuditRecordPermission > _auditRecordPermissionRepository , IRepository < AuditRecordIdentityUser > _auditRecordIdentityUserRepository ,
IRepository < AuditRecordPermission > _auditRecordPermissionRepository , IRepository < AuditRecordIdentityUser > _auditRecordIdentityUserRepository , IRepository < AuditDocumentClosure > _auditDocumentClosureRepository ,
IMapper _mapper , IUserInfo _userInfo , IStringLocalizer _localizer ) : BaseService
{
@@ -131,9 +133,15 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
/// <returns></returns>
public async Task < IResponseOutput > SetAuditRecordPermission ( SetAuditRecordPermissionCommand inCommand )
{
if ( _auditRecordPermissionRepository . Any ( t = > t . AuditRecordId = = inCommand . AuditRecordId & & t . AuditDocumentId = = inCommand . AuditDocumentId ) )
{
var find = _auditRecordPermissionRepository . FirstOrDefaultAsync ( t = > t . AuditRecordId = = inCommand . AuditRecordId & & t . AuditDocumentId = = inCommand . AuditDocumentId ) ;
if ( find = = null & & inCommand . IsAuthorization )
{
await _auditRecordPermissionRepository . AddAsync ( new AuditRecordPermission ( ) { AuditRecordId = inCommand . AuditRecordId , AuditDocumentId = inCommand . AuditDocumentId } , true ) ;
}
else
{
await _auditRecordPermissionRepository . DeleteFromQueryAsync ( t = > t . AuditRecordId = = inCommand . AuditRecordId & & t . AuditDocumentId = = inCommand . AuditDocumentId , true ) ;
}
return ResponseOutput . Ok ( ) ;
@@ -142,14 +150,331 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
#endregion
#region 闭 包 修 改
/// <summary>
/// 插入闭包表关系
/// </summary>
private async Task AddClosureRelationsAsync ( Guid nodeId , Guid ? parentId )
{
var closures = new List < AuditDocumentClosure > ( ) ;
// 自身关系
closures . Add ( new AuditDocumentClosure
{
AncestorId = nodeId ,
DescendantId = nodeId ,
Depth = 0
} ) ;
if ( parentId . HasValue )
{
// 查出所有父级的祖先
var parentClosures = await _auditDocumentClosureRepository
. Where ( c = > c . DescendantId = = parentId . Value ) . Select ( t = > new { t . AncestorId , t . Depth } )
. ToListAsync ( ) ;
// 生成父级的所有祖先到新节点的关系
foreach ( var pc in parentClosures )
{
closures . Add ( new AuditDocumentClosure
{
AncestorId = pc . AncestorId ,
DescendantId = nodeId ,
Depth = pc . Depth + 1
} ) ;
}
}
await _auditDocumentClosureRepository . AddRangeAsync ( closures ) ;
await _auditDocumentClosureRepository . SaveChangesAsync ( ) ;
}
/// <summary>
/// 获取文件树形结构 (传Id 根节点就是自己)
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task < PageOutput < AuditDocumentData > > GetAuditDocumentData_New ( GetAuditDocumentDataInDto inDto )
{
var defalutSortArray = new string [ ] { nameof ( AuditDocumentData . AuditDocumentTypeEnum ) , nameof ( AuditDocumentData . Name ) } ;
if ( inDto . SortField . IsNotNullOrEmpty ( ) )
{
defalutSortArray = new string [ ] { nameof ( AuditDocumentData . AuditDocumentTypeEnum ) , inDto . SortField + ( inDto . Asc ? " asc" : " desc" ) } ;
inDto . SortField = string . Empty ;
}
//匹配节点子查询
var matchedList = await _auditDocumentRepository . Where ( x = > x . AuditDocumentTypeEnum ! = AuditDocumentType . HistoricalVersion )
. WhereIf ( inDto . IsAuthorization ! = null , x = > x . IsAuthorization = = inDto . IsAuthorization )
. WhereIf ( inDto . AuditRecordId ! = null , x = > x . IsAuthorization = = inDto . IsAuthorization )
. WhereIf ( inDto . Name . IsNotNullOrEmpty ( ) , n = > n . Name . Contains ( inDto . Name ) )
. SelectMany ( t = > t . AncestorList ) . Select ( t = > t . Ancestor ) //祖先包含自己
. Distinct ( ) //可能包含相同的祖先
. ProjectTo < AuditDocumentData > ( _mapper . ConfigurationProvider )
. SortToListAsync ( defalutSortArray ) ;
#region 针 对 某 次 稽 查 授 权 展 示
//某个稽查记录
if ( inDto . AuditRecordId ! = null )
{
//找到该稽查记录 授权文件的所有父节点Id
var matchDocIdQuery = _auditRecordPermissionRepository . Where ( t = > t . AuditRecordId = = inDto . AuditRecordId ) . Select ( t = > t . AuditDocumentId ) ;
var parentIdList = _auditDocumentClosureRepository . Where ( t = > matchDocIdQuery . Contains ( t . DescendantId ) ) . Select ( t = > t . AncestorId ) . Distinct ( ) . ToList ( ) ;
if ( inDto . IsAuthorization = = true )
{
//只查看授权的
matchedList = matchedList . Where ( t = > parentIdList . Contains ( ( Guid ) t . Id ) ) . ToList ( ) ;
}
foreach ( var ancestorId in parentIdList )
{
var find = matchedList . FirstOrDefault ( t = > t . Id = = ancestorId ) ;
if ( find ! = null )
{
//如果前端不想用新字段,那么就覆盖之前的授权字段
find . IsCurrentAuditRecordAuthorization = true ;
}
}
}
#endregion
// 构建字典并拼装树
var dict = matchedList . ToDictionary ( n = > n . Id , t = > t ) ;
foreach ( var node in dict . Values )
{
if ( node . ParentId . HasValue & & dict . TryGetValue ( node . ParentId . Value , out var parent ) )
parent . Children . Add ( node ) ;
}
var query = dict . Values . Where ( n = > n . ParentId = = null ) ;
PageOutput < AuditDocumentData > result = new PageOutput < AuditDocumentData > ( )
{
PageIndex = inDto . PageIndex ,
PageSize = inDto . PageSize ,
TotalCount = query . Count ( ) ,
} ;
var root = query . Skip ( inDto . PageSize * ( inDto . PageIndex - 1 ) ) . Take ( inDto . PageSize ) . ToList ( ) ;
result . CurrentPageData = root ;
return result ;
}
/// <summary>
/// 设置是否授权
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task < IResponseOutput > SetIsAuthorization_New ( SetIsAuthorizationInDto inDto )
{
//闭包表中找到 设置Id为祖先的所有 后代 包括自己
var matchIdQuery = _auditDocumentClosureRepository . Where ( t = > inDto . Ids . Contains ( t . AncestorId ) ) . Select ( t = > t . DescendantId ) ;
await _auditDocumentRepository . BatchUpdateNoTrackingAsync ( t = > matchIdQuery . Contains ( t . Id ) , u = > new AuditDocument ( ) { IsAuthorization = inDto . IsAuthorization } ) ;
return ResponseOutput . Ok ( ) ;
}
/// <summary>
/// 复制文件或者文件夹
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task < IResponseOutput > CopyFileOrFolder_New ( MovieFileOrFolderInDto inDto )
{
foreach ( var id in inDto . Ids )
{
//当前节点的后代(包括自己) 拷贝的节点以及子节点
var nodeList = await _auditDocumentClosureRepository . Where ( t = > t . AncestorId = = id ) . Select ( t = > t . Descendant ) . ToListAsync ( ) ;
foreach ( var node in nodeList )
{
//设置新节点Id
node . Id = NewId . NextSequentialGuid ( ) ;
//建立新的闭包关系
await AddClosureRelationsAsync ( node . Id , inDto . ParentId ) ;
}
}
return ResponseOutput . Ok ( ) ;
}
/// <summary>
/// 移动文件或者文件夹 到其他文件夹
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task < IResponseOutput > MovieFileOrFolder_New ( MovieFileOrFolderInDto inDto )
{
//闭包表中找到 设置Id为祖先的所有 后代 包括自己
var matchIdQuery = _auditDocumentClosureRepository . Where ( t = > inDto . Ids . Contains ( t . AncestorId ) ) . Select ( t = > t . DescendantId ) ;
//无法将当前文件夹移动到当前目录以及子文件夹
if ( matchIdQuery . Any ( t = > t = = inDto . ParentId ) )
{
throw new BusinessValidationFailedException ( _localizer [ "AuditDocument_CanNotMove" ] ) ;
}
foreach ( var id in inDto . Ids )
{
//移动ParentId
var node = await _auditDocumentRepository . FirstOrDefaultAsync ( t = > t . Id = = id ) ;
node . ParentId = inDto . ParentId ;
await _auditDocumentRepository . SaveChangesAsync ( ) ;
// 删除原有闭包关系
await _auditDocumentClosureRepository . BatchDeleteNoTrackingAsync ( t = > t . DescendantId = = id | | t . AncestorId = = id ) ;
//建立新的闭包关系
await AddClosureRelationsAsync ( node . Id , inDto . ParentId ) ;
}
return ResponseOutput . Ok ( ) ;
}
/// <summary>
/// 删除稽查文档
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task < IResponseOutput > DeleteAuditDocument_New ( DeleteAuditDocumentInDto inDto )
{
//闭包表中找到 设置Id为祖先的所有 后代 包括自己
var matchList = _auditDocumentClosureRepository . Where ( t = > inDto . Ids . Contains ( t . AncestorId ) ) . Select ( t = > new { t . DescendantId , t . Descendant . MainFileId } ) ;
//删除自己以及后代
var success = await _auditDocumentRepository . DeleteFromQueryAsync ( t = > matchList . Select ( t = > t . DescendantId ) . Distinct ( ) . Contains ( t . Id ) , true ) ;
//找到有版本的
var mainFileIdList = matchList . Where ( t = > t . MainFileId ! = null ) . ToList ( ) ;
foreach ( var item in mainFileIdList )
{
var historicalVersionList = await _auditDocumentRepository . Where ( x = > x . MainFileId = = item . MainFileId ) . OrderBy ( x = > x . Version ) . ToListAsync ( ) ;
var num = 1 ;
foreach ( var historical in historicalVersionList )
{
await _auditDocumentRepository . UpdatePartialFromQueryAsync ( historical . Id , x = > new AuditDocument ( )
{
Version = num ,
} ) ;
num + + ;
}
}
await _auditDocumentRepository . SaveChangesAsync ( ) ;
return ResponseOutput . Ok ( ) ;
}
/// <summary>
/// 把历史版本设置为当前版本--修改 维护闭包表,之间的闭包关系指向新版本文件
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task < IResponseOutput > SetCurrentVersion ( SetCurrentVersionInDto inDto )
{
var file = await _auditDocumentRepository . Where ( x = > x . Id = = inDto . Id ) . FirstNotNullAsync ( ) ;
if ( file . AuditDocumentTypeEnum ! = AuditDocumentType . HistoricalVersion )
{
throw new BusinessValidationFailedException ( _localizer [ "AuditDocument_CanNotSetCurrentVersion" ] ) ;
}
var mainFile = await _auditDocumentRepository . Where ( x = > x . Id = = file . MainFileId ) . FirstNotNullAsync ( ) ;
var historicalVersionIds = await _auditDocumentRepository . Where ( x = > x . MainFileId = = mainFile . Id & & x . Id ! = inDto . Id ) . OrderBy ( x = > x . Version ) . Select ( x = > x . Id ) . ToListAsync ( ) ;
historicalVersionIds . Add ( mainFile . Id ) ;
await _auditDocumentRepository . UpdatePartialFromQueryAsync ( inDto . Id , x = > new AuditDocument ( )
{
MainFileId = null ,
ParentId = mainFile . ParentId ,
AuditDocumentTypeEnum = AuditDocumentType . File ,
} ) ;
int num = 1 ;
foreach ( var item in historicalVersionIds )
{
await _auditDocumentRepository . UpdatePartialFromQueryAsync ( item , x = > new AuditDocument ( )
{
MainFileId = inDto . Id ,
ParentId = null ,
Version = num ,
AuditDocumentTypeEnum = AuditDocumentType . HistoricalVersion
} ) ;
num + + ;
}
await _auditDocumentRepository . SaveChangesAsync ( ) ;
#region 闭 包 修 改
//版本设计这里,当前版本才有parentId 不是当前版本就没有parentId->移动的时候还要维护历史版本的parentid
//增加闭包,所以这里要维护闭包表
await _auditDocumentClosureRepository . BatchUpdateNoTrackingAsync ( t = > t . AncestorId = = mainFile . Id , t = > new AuditDocumentClosure ( ) { AncestorId = inDto . Id } ) ;
await _auditDocumentClosureRepository . BatchUpdateNoTrackingAsync ( t = > t . DescendantId = = mainFile . Id , t = > new AuditDocumentClosure ( ) { DescendantId = inDto . Id } ) ;
#endregion
return ResponseOutput . Ok ( ) ;
}
#endregion
#region 增 加 闭 包 设 计 不 用 修 改 地 方
/// <summary>
/// 获取稽查文档
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
///
[HttpPost]
public async Task < PageOutput < AuditDocumentView > > GetAuditDocumentList ( AuditDocumentQuery inQuery )
{
@@ -160,6 +485,65 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
return pageList ;
}
/// <summary>
/// 获取历史版本
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task < List < HistoricalVersionDto > > GetHistoricalVersion ( GetHistoricalVersionInDto inDto )
{
List < HistoricalVersionDto > result = new List < HistoricalVersionDto > ( ) ;
result = await _auditDocumentRepository . Where ( x = > x . MainFileId = = inDto . Id ) . ProjectTo < HistoricalVersionDto > ( _mapper . ConfigurationProvider ) . OrderByDescending ( x = > x . Version ) . ToListAsync ( ) ;
var currentData = await _auditDocumentRepository . Where ( x = > x . Id = = inDto . Id ) . ProjectTo < HistoricalVersionDto > ( _mapper . ConfigurationProvider ) . FirstNotNullAsync ( ) ;
currentData . IsCurrentVersion = true ;
result . Insert ( 0 , currentData ) ;
return result ;
}
/// <summary>
/// 获取面包屑导航
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task < List < AuditDocumentUpdateDto > > GetBreadcrumbData ( GetBreadcrumbDataInDto inDto )
{
List < AuditDocumentUpdateDto > result = new List < AuditDocumentUpdateDto > ( ) ;
await findParent ( result , inDto . Id ) ;
async Task findParent ( List < AuditDocumentUpdateDto > datas , Guid id )
{
var data = await _auditDocumentRepository . Where ( x = > x . Id = = id ) . ProjectTo < AuditDocumentUpdateDto > ( _mapper . ConfigurationProvider ) . FirstNotNullAsync ( ) ;
datas . Add ( data ) ;
if ( data . ParentId ! = null )
{
await findParent ( datas , data . ParentId . Value ) ;
}
}
result . Reverse ( ) ;
return result ;
}
#endregion
#region 闭 包 维 护 关 系 , 只 处 理 最 底 层 调 用 AddOrUpdateAuditDocument
/// <summary>
/// 修改稽查文档
/// </summary>
@@ -198,8 +582,13 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
return ResponseOutput . Ok ( result ) ;
}
/// <summary>
/// 新增稽查文档
/// 新增稽查文档 (批量上传文件时才是数组,文件夹时单个对象)
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
@@ -210,6 +599,8 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
inDto . ForEach ( x = > x . IsUpdate = false ) ;
await addData ( inDto ) ;
//构建父子关系,然后返回Id
async Task addData ( List < AuditDocumentAddOrEdit > data )
{
foreach ( var item in data )
@@ -234,33 +625,41 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
return ResponseOutput . Ok ( resultData ) ;
}
/// <summary>
/// 通用方法
/// </summary>
/// <param name="inDto"></param>
private async Task < AuditDocument > AddOrUpdateAuditDocument ( AuditDocumentAddOrEdit inDto )
{
//同一层级不能加同名的文件
var alikeData = await _auditDocumentRepository . Where ( x = > x . Id ! = inDto . Id & & x . ParentId = = inDto . ParentId & & x . Name = = inDto . Name & & x . AuditDocumentTypeEnum = = inDto . AuditDocumentTypeEnum ) . FirstOrDefaultAsync ( ) ;
//同层级找到了同名的
if ( alikeData ! = null )
{
if ( inDto . AuditDocumentTypeEnum = = AuditDocumentType . Folder )
{
//更新
if ( inDto . IsUpdate )
{
throw new BusinessValidationFailedException ( _localizer [ "AuditDocument_CanNotAddFolder" ] ) ;
}
else
{
//添加相同目录,已存在,那么就不处理
return alikeData ;
}
}
else
{
//同名文件,那么作为版本处理(首先插入)
var entityData = await _auditDocumentRepository . InsertOrUpdateAsync ( inDto , true ) ;
//找到该同名文件的历史版本
var historicalVersionIds = await _auditDocumentRepository . Where ( x = > x . MainFileId = = alikeData . Id ) . OrderBy ( x = > x . Version ) . Select ( x = > x . Id ) . ToListAsync ( ) ;
//加上当前的同名文件 一起重新设置版本号
historicalVersionIds . Add ( alikeData . Id ) ;
int num = 1 ;
@@ -272,44 +671,96 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
ParentId = null ,
Version = num ,
AuditDocumentTypeEnum = AuditDocumentType . HistoricalVersion
} , true ) ;
} ) ;
num + + ;
await _auditDocumentRepository . SaveChangesAsync ( ) ;
}
if ( inDto . Id = = null )
{
//维护新增闭包关系
await AddClosureRelationsAsync ( entityData . Id , entityData . ParentId ) ;
}
return entityData ;
}
}
//同层级没找到同名的文件,那么走正常的新增 和更新
var entity = await _auditDocumentRepository . InsertOrUpdateAsync ( inDto , true ) ;
if ( inDto . Id = = null )
{
//维护新增闭包关系
await AddClosureRelationsAsync ( entity . Id , entity . ParentId ) ;
}
return entity ;
}
#endregion
#region 闭 包 后 续 废 弃 方 法
/// <summary>
/// 获取面包屑导航
/// 删除稽查文档
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task < List < AuditDocumentUpdateDto > > GetBreadcrumbData ( GetBreadcrumbDataInDto inDto )
public async Task < IResponseOutput > DeleteAuditDocument ( DeleteAuditDocumentInDto inDto )
{
List < AuditDocumentUpdateDto > result = new List < AuditDocumentUpdateDto > ( ) ;
await findParent ( result , inDto . Id ) ;
async Task findParent ( List < AuditDocumentUpdateDto > datas , Guid id )
var data = await _auditDocumentRepository . Select ( x = > new DeleteAudit ( )
{
var data = await _auditDocumentRepository . Where ( x = > x . Id = = id ) . ProjectTo < AuditDocumentUpdateDto > ( _mapper . ConfigurationProvider ) . FirstNotNullAsync ( ) ;
datas . Add ( data ) ;
if ( data . ParentId ! = null )
Id = x . Id ,
ParentId = x . ParentId ,
MainFileId = x . MainFileId
} ) . ToListAsync ( ) ;
List < Guid > DeleteId = inDto . Ids ;
finId ( inDto . Ids , data ) ;
void finId ( List < Guid > deletids , List < DeleteAudit > deletes )
{
DeleteId . AddRange ( deletids ) ;
var temp = deletes . Where ( x = > ( x . ParentId ! = null & & deletids . Contains ( x . ParentId . Value ) ) | | ( x . MainFileId ! = null & & deletids . Contains ( x . MainFileId . Value ) ) ) . Select ( x = > x . Id ) . ToList ( ) ;
if ( temp . Count ( ) > 0 )
{
await findParent ( datas , data . ParentId . Value ) ;
finId ( temp , deletes ) ;
}
}
DeleteId = DeleteId . Distinct ( ) . ToList ( ) ;
var mainFileId = await _auditDocumentRepository . Where ( x = > DeleteId . Contains ( x . Id ) & & x . MainFileId ! = null ) . Select ( x = > x . MainFileId ) . Distinct ( ) . ToListAsync ( ) ;
var success = await _auditDocumentRepository . DeleteFromQueryAsync ( t = > DeleteId . Distinct ( ) . Contains ( t . Id ) , true ) ;
foreach ( var item in mainFileId )
{
var historicalVersionList = await _auditDocumentRepository . Where ( x = > x . MainFileId = = item ) . OrderBy ( x = > x . Version ) . ToListAsync ( ) ;
var num = 1 ;
foreach ( var historical in historicalVersionList )
{
await _auditDocumentRepository . UpdatePartialFromQueryAsync ( historical . Id , x = > new AuditDocument ( )
{
Version = num ,
} , true ) ;
num + + ;
}
}
result . Reverse ( ) ;
return result ;
return ResponseOutput . Ok ( ) ;
}
@@ -403,65 +854,6 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
GetChildren ( x , dataList , historyList ) ;
}
}
/// <summary>
/// 删除稽查文档
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task < IResponseOutput > DeleteAuditDocument ( DeleteAuditDocumentInDto inDto )
{
var data = await _auditDocumentRepository . Select ( x = > new DeleteAudit ( )
{
Id = x . Id ,
ParentId = x . ParentId ,
MainFileId = x . MainFileId
} ) . ToListAsync ( ) ;
List < Guid > DeleteId = inDto . Ids ;
finId ( inDto . Ids , data ) ;
void finId ( List < Guid > deletids , List < DeleteAudit > deletes )
{
DeleteId . AddRange ( deletids ) ;
var temp = deletes . Where ( x = > ( x . ParentId ! = null & & deletids . Contains ( x . ParentId . Value ) ) | | ( x . MainFileId ! = null & & deletids . Contains ( x . MainFileId . Value ) ) ) . Select ( x = > x . Id ) . ToList ( ) ;
if ( temp . Count ( ) > 0 )
{
finId ( temp , deletes ) ;
}
}
DeleteId = DeleteId . Distinct ( ) . ToList ( ) ;
var mainFileId = await _auditDocumentRepository . Where ( x = > DeleteId . Contains ( x . Id ) & & x . MainFileId ! = null ) . Select ( x = > x . MainFileId ) . Distinct ( ) . ToListAsync ( ) ;
var success = await _auditDocumentRepository . DeleteFromQueryAsync ( t = > DeleteId . Distinct ( ) . Contains ( t . Id ) , true ) ;
foreach ( var item in mainFileId )
{
var historicalVersionList = await _auditDocumentRepository . Where ( x = > x . MainFileId = = item ) . OrderBy ( x = > x . Version ) . ToListAsync ( ) ;
var num = 1 ;
foreach ( var historical in historicalVersionList )
{
await _auditDocumentRepository . UpdatePartialFromQueryAsync ( historical . Id , x = > new AuditDocument ( )
{
Version = num ,
} , true ) ;
num + + ;
}
}
return ResponseOutput . Ok ( ) ;
}
/// <summary>
/// 移动文件或者文件夹 到其他文件夹
/// </summary>
@@ -575,70 +967,6 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
return ResponseOutput . Ok ( ) ;
}
/// <summary>
/// 获取历史版本
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task < List < HistoricalVersionDto > > GetHistoricalVersion ( GetHistoricalVersionInDto inDto )
{
List < HistoricalVersionDto > result = new List < HistoricalVersionDto > ( ) ;
result = await _auditDocumentRepository . Where ( x = > x . MainFileId = = inDto . Id ) . ProjectTo < HistoricalVersionDto > ( _mapper . ConfigurationProvider ) . OrderByDescending ( x = > x . Version ) . ToListAsync ( ) ;
var currentData = await _auditDocumentRepository . Where ( x = > x . Id = = inDto . Id ) . ProjectTo < HistoricalVersionDto > ( _mapper . ConfigurationProvider ) . FirstNotNullAsync ( ) ;
currentData . IsCurrentVersion = true ;
result . Insert ( 0 , currentData ) ;
return result ;
}
/// <summary>
/// 把历史版本设置为当前版本
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task < IResponseOutput > SetCurrentVersion ( SetCurrentVersionInDto inDto )
{
var file = await _auditDocumentRepository . Where ( x = > x . Id = = inDto . Id ) . FirstNotNullAsync ( ) ;
if ( file . AuditDocumentTypeEnum ! = AuditDocumentType . HistoricalVersion )
{
throw new BusinessValidationFailedException ( _localizer [ "AuditDocument_CanNotSetCurrentVersion" ] ) ;
}
var mainFile = await _auditDocumentRepository . Where ( x = > x . Id = = file . MainFileId ) . FirstNotNullAsync ( ) ;
var historicalVersionIds = await _auditDocumentRepository . Where ( x = > x . MainFileId = = mainFile . Id & & x . Id ! = inDto . Id ) . OrderBy ( x = > x . Version ) . Select ( x = > x . Id ) . ToListAsync ( ) ;
historicalVersionIds . Add ( mainFile . Id ) ;
await _auditDocumentRepository . UpdatePartialFromQueryAsync ( inDto . Id , x = > new AuditDocument ( )
{
MainFileId = null ,
ParentId = mainFile . ParentId ,
AuditDocumentTypeEnum = AuditDocumentType . File ,
} ) ;
int num = 1 ;
foreach ( var item in historicalVersionIds )
{
await _auditDocumentRepository . UpdatePartialFromQueryAsync ( item , x = > new AuditDocument ( )
{
MainFileId = inDto . Id ,
ParentId = null ,
Version = num ,
AuditDocumentTypeEnum = AuditDocumentType . HistoricalVersion
} ) ;
num + + ;
}
await _auditDocumentRepository . SaveChangesAsync ( ) ;
return ResponseOutput . Ok ( ) ;
}
/// <summary>
/// 设置是否授权
@@ -700,6 +1028,9 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
}
}
#endregion
}