增加稽查记录修改
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
48c9721ab4
commit
447e916564
|
@ -1483,12 +1483,33 @@
|
|||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditDocument},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
|
||||
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditDocument},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditRecord},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditRecordPermission},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.AuditRecordIdentityUser},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
|
||||
<summary>
|
||||
稽查文档
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetAuditRecordList(IRaCIS.Core.Application.ViewModel.AuditRecordQuery)">
|
||||
<summary>
|
||||
稽查记录 列表
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.DeleteAuditRecord(System.Guid)">
|
||||
<summary>
|
||||
删除稽查记录
|
||||
</summary>
|
||||
<param name="auditRecordId"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.SetAuditRecordPermission(IRaCIS.Core.Application.ViewModel.SetAuditRecordPermissionCommand)">
|
||||
<summary>
|
||||
设置授权
|
||||
</summary>
|
||||
<param name="inCommand"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.AuditDocumentService.GetAuditDocumentList(IRaCIS.Core.Application.ViewModel.AuditDocumentQuery)">
|
||||
<summary>
|
||||
获取稽查文档
|
||||
|
|
|
@ -19,6 +19,7 @@ using MassTransit;
|
|||
using NPOI.POIFS.Properties;
|
||||
using Org.BouncyCastle.Crypto;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
namespace IRaCIS.Core.Application.Service;
|
||||
|
||||
|
||||
|
@ -27,37 +28,150 @@ namespace IRaCIS.Core.Application.Service;
|
|||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[ApiExplorerSettings(GroupName = "FileRecord")]
|
||||
public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepository,
|
||||
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer): BaseService
|
||||
public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepository, IRepository<AuditRecord> _auditRecordRepository,
|
||||
IRepository<AuditRecordPermission> _auditRecordPermissionRepository, IRepository<AuditRecordIdentityUser> _auditRecordIdentityUserRepository,
|
||||
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 获取稽查文档
|
||||
/// </summary>
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<AuditDocumentView>> GetAuditDocumentList(AuditDocumentQuery inQuery)
|
||||
{
|
||||
var auditDocumentQueryable = _auditDocumentRepository
|
||||
.ProjectTo<AuditDocumentView>(_mapper.ConfigurationProvider);
|
||||
var pageList = await auditDocumentQueryable.ToPagedListAsync(inQuery);
|
||||
|
||||
return pageList;
|
||||
}
|
||||
#region 稽查新增需求
|
||||
|
||||
/// <summary>
|
||||
/// 修改稽查文档
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
/// <summary>
|
||||
/// 稽查记录 列表
|
||||
/// </summary>
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<AuditRecordView>> GetAuditRecordList(AuditRecordQuery inQuery)
|
||||
{
|
||||
|
||||
var auditRecordQueryable = _auditRecordRepository
|
||||
.WhereIf(inQuery.BeginAuditTime != null, t => t.AuditTime >= inQuery.BeginAuditTime)
|
||||
.WhereIf(inQuery.EndAuditTime != null, t => t.AuditTime <= inQuery.EndAuditTime)
|
||||
.WhereIf(inQuery.AuditState != null, t => t.AuditState == inQuery.AuditState)
|
||||
.WhereIf(inQuery.BeginTime != null, t => t.BeginTime >= inQuery.BeginTime)
|
||||
.WhereIf(inQuery.EndTime != null, t => t.EndTime <= inQuery.EndTime)
|
||||
.WhereIf(inQuery.CompanyName.IsNotNullOrEmpty(), t => t.CompanyName.Contains(inQuery.CompanyName))
|
||||
.WhereIf(inQuery.AuditContent.IsNotNullOrEmpty(), t => t.AuditContent.Contains(inQuery.AuditContent))
|
||||
.ProjectTo<AuditRecordView>(_mapper.ConfigurationProvider);
|
||||
|
||||
var pageList = await auditRecordQueryable.ToPagedListAsync(inQuery);
|
||||
|
||||
return pageList;
|
||||
}
|
||||
|
||||
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddOrUpdateAuditRecord(AuditRecordAddOrEdit addOrEditAuditRecord)
|
||||
{
|
||||
|
||||
|
||||
if (addOrEditAuditRecord.Id == null)
|
||||
{
|
||||
var entity = _mapper.Map<AuditRecord>(addOrEditAuditRecord);
|
||||
|
||||
|
||||
if (await _auditRecordRepository.AnyAsync(t => t.CompanyName == addOrEditAuditRecord.CompanyName && t.AuditContent == addOrEditAuditRecord.AuditContent && t.AuditTime == addOrEditAuditRecord.AuditTime, true))
|
||||
{
|
||||
//---重复的稽查记录。
|
||||
return ResponseOutput.NotOk(_localizer["AuditDocument_RepeatAuditRecord"]);
|
||||
}
|
||||
|
||||
await _auditRecordRepository.AddAsync(entity, true);
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (await _auditRecordRepository.AnyAsync(t => t.CompanyName == addOrEditAuditRecord.CompanyName && t.AuditContent == addOrEditAuditRecord.AuditContent && t.AuditTime == addOrEditAuditRecord.AuditTime
|
||||
&& t.Id != addOrEditAuditRecord.Id, true))
|
||||
{
|
||||
//---重复的稽查记录。
|
||||
return ResponseOutput.NotOk(_localizer["AuditDocument_RepeatAuditRecord"]);
|
||||
}
|
||||
|
||||
var find = _auditRecordRepository.Where(t => t.Id == addOrEditAuditRecord.Id, true).FirstOrDefault();
|
||||
|
||||
_mapper.Map(addOrEditAuditRecord, find);
|
||||
find.UpdateTime = DateTime.Now;
|
||||
|
||||
var success = await _auditRecordRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok(find.Id.ToString());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除稽查记录
|
||||
/// </summary>
|
||||
/// <param name="auditRecordId"></param>
|
||||
/// <returns></returns>
|
||||
[HttpDelete("{auditRecordId:guid}")]
|
||||
public async Task<IResponseOutput> DeleteAuditRecord(Guid auditRecordId)
|
||||
{
|
||||
if (await _auditRecordRepository.Where(t => t.Id == auditRecordId).AnyAsync(u => u.AuditState != AuditState.NotStart))
|
||||
{
|
||||
//未开始的才允许删除
|
||||
return ResponseOutput.NotOk(_localizer["AuditDocument_CannotDeleteStartRecod"]);
|
||||
}
|
||||
|
||||
var success = await _auditRecordRepository.DeleteFromQueryAsync(t => t.Id == auditRecordId, true);
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置授权
|
||||
/// </summary>
|
||||
/// <param name="inCommand"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IResponseOutput> SetAuditRecordPermission(SetAuditRecordPermissionCommand inCommand)
|
||||
{
|
||||
if (_auditRecordPermissionRepository.Any(t => t.AuditRecordId == inCommand.AuditRecordId && t.AuditDocumentId == inCommand.AuditDocumentId))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取稽查文档
|
||||
/// </summary>
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<AuditDocumentView>> GetAuditDocumentList(AuditDocumentQuery inQuery)
|
||||
{
|
||||
var auditDocumentQueryable = _auditDocumentRepository
|
||||
.ProjectTo<AuditDocumentView>(_mapper.ConfigurationProvider);
|
||||
var pageList = await auditDocumentQueryable.ToPagedListAsync(inQuery);
|
||||
|
||||
return pageList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 修改稽查文档
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> UpdateAuditDocument(AuditDocumentUpdateDto inDto)
|
||||
{
|
||||
AuditDocumentAddOrEdit addOrEdit = _mapper.Map<AuditDocumentAddOrEdit>(inDto);
|
||||
addOrEdit.IsUpdate = true;
|
||||
AuditDocumentAddOrEdit addOrEdit = _mapper.Map<AuditDocumentAddOrEdit>(inDto);
|
||||
addOrEdit.IsUpdate = true;
|
||||
|
||||
var result= await AddOrUpdateAuditDocument(addOrEdit);
|
||||
var result = await AddOrUpdateAuditDocument(addOrEdit);
|
||||
|
||||
return ResponseOutput.Ok(result.Id);
|
||||
}
|
||||
|
@ -80,7 +194,7 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
List<AuditDocumentAddOrEdit> auditDocumentAddOrEdits = new List<AuditDocumentAddOrEdit>();
|
||||
|
||||
auditDocumentAddOrEdits.Add(inDto);
|
||||
var result= await AddAuditDocument(auditDocumentAddOrEdits);
|
||||
var result = await AddAuditDocument(auditDocumentAddOrEdits);
|
||||
return ResponseOutput.Ok(result);
|
||||
}
|
||||
|
||||
|
@ -91,21 +205,22 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddAuditDocument(List<AuditDocumentAddOrEdit> inDto)
|
||||
{
|
||||
List<Guid> resultData = new List<Guid>();
|
||||
{
|
||||
List<Guid> resultData = new List<Guid>();
|
||||
inDto.ForEach(x => x.IsUpdate = false);
|
||||
await addData(inDto);
|
||||
|
||||
async Task addData(List<AuditDocumentAddOrEdit> data)
|
||||
{
|
||||
foreach(var item in data)
|
||||
{
|
||||
var result= await AddOrUpdateAuditDocument(item);
|
||||
{
|
||||
foreach (var item in data)
|
||||
{
|
||||
var result = await AddOrUpdateAuditDocument(item);
|
||||
|
||||
resultData.Add(result.Id);
|
||||
item.Children.ForEach(x => {
|
||||
x.ParentId = result.Id;
|
||||
x.IsUpdate = false;
|
||||
resultData.Add(result.Id);
|
||||
item.Children.ForEach(x =>
|
||||
{
|
||||
x.ParentId = result.Id;
|
||||
x.IsUpdate = false;
|
||||
|
||||
});
|
||||
|
||||
|
@ -114,9 +229,9 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
await addData(item.Children);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ResponseOutput.Ok(resultData);
|
||||
return ResponseOutput.Ok(resultData);
|
||||
}
|
||||
|
||||
|
||||
|
@ -125,74 +240,74 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
/// 通用方法
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
private async Task<AuditDocument> AddOrUpdateAuditDocument(AuditDocumentAddOrEdit inDto)
|
||||
{
|
||||
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;
|
||||
|
||||
foreach (var item in historicalVersionIds)
|
||||
{
|
||||
await _auditDocumentRepository.UpdatePartialFromQueryAsync(item, x => new AuditDocument()
|
||||
{
|
||||
MainFileId = entityData.Id,
|
||||
ParentId = null,
|
||||
Version = num,
|
||||
AuditDocumentTypeEnum = AuditDocumentType.HistoricalVersion
|
||||
},true);
|
||||
num++;
|
||||
}
|
||||
|
||||
return entityData;
|
||||
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;
|
||||
|
||||
foreach (var item in historicalVersionIds)
|
||||
{
|
||||
await _auditDocumentRepository.UpdatePartialFromQueryAsync(item, x => new AuditDocument()
|
||||
{
|
||||
MainFileId = entityData.Id,
|
||||
ParentId = null,
|
||||
Version = num,
|
||||
AuditDocumentTypeEnum = AuditDocumentType.HistoricalVersion
|
||||
}, true);
|
||||
num++;
|
||||
}
|
||||
|
||||
return entityData;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var entity = await _auditDocumentRepository.InsertOrUpdateAsync(inDto, true);
|
||||
return entity;
|
||||
}
|
||||
var entity = await _auditDocumentRepository.InsertOrUpdateAsync(inDto, true);
|
||||
return entity;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取面包屑导航
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<AuditDocumentUpdateDto>> GetBreadcrumbData(GetBreadcrumbDataInDto inDto)
|
||||
{
|
||||
List<AuditDocumentUpdateDto> result=new List<AuditDocumentUpdateDto>();
|
||||
/// <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);
|
||||
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();
|
||||
{
|
||||
var data = await _auditDocumentRepository.Where(x => x.Id == id).ProjectTo<AuditDocumentUpdateDto>(_mapper.ConfigurationProvider).FirstNotNullAsync();
|
||||
datas.Add(data);
|
||||
if (data.ParentId != null)
|
||||
{
|
||||
if (data.ParentId != null)
|
||||
{
|
||||
await findParent(datas, data.ParentId.Value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
result.Reverse();
|
||||
result.Reverse();
|
||||
|
||||
return result;
|
||||
|
||||
|
@ -204,8 +319,8 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<AuditDocumentData>> GetAuditDocumentData(GetAuditDocumentDataInDto inDto)
|
||||
{
|
||||
public async Task<PageOutput<AuditDocumentData>> GetAuditDocumentData(GetAuditDocumentDataInDto inDto)
|
||||
{
|
||||
|
||||
var defalutSortArray = new string[] { nameof(AuditDocumentData.AuditDocumentTypeEnum), nameof(AuditDocumentData.Name) };
|
||||
if (inDto.SortField.IsNotNullOrEmpty())
|
||||
|
@ -213,41 +328,42 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
defalutSortArray = new string[] { nameof(AuditDocumentData.AuditDocumentTypeEnum), inDto.SortField + (inDto.Asc ? " asc" : " desc") };
|
||||
inDto.SortField = string.Empty;
|
||||
}
|
||||
// 新取出来排序 然后再找子项
|
||||
var data= (await _auditDocumentRepository
|
||||
.Where(x=>x.AuditDocumentTypeEnum!=AuditDocumentType.HistoricalVersion)
|
||||
.WhereIf(inDto.IsAuthorization!=null,x=>x.IsAuthorization==inDto.IsAuthorization)
|
||||
.ProjectTo<AuditDocumentData>(_mapper.ConfigurationProvider).ToPagedListAsync(new PageInput() {
|
||||
PageIndex=1,
|
||||
PageSize=999999,
|
||||
}, defalutSortArray) ).CurrentPageData.ToList();
|
||||
// 新取出来排序 然后再找子项
|
||||
var data = (await _auditDocumentRepository
|
||||
.Where(x => x.AuditDocumentTypeEnum != AuditDocumentType.HistoricalVersion)
|
||||
.WhereIf(inDto.IsAuthorization != null, x => x.IsAuthorization == inDto.IsAuthorization)
|
||||
.ProjectTo<AuditDocumentData>(_mapper.ConfigurationProvider).ToPagedListAsync(new PageInput()
|
||||
{
|
||||
PageIndex = 1,
|
||||
PageSize = 999999,
|
||||
}, defalutSortArray)).CurrentPageData.ToList();
|
||||
|
||||
|
||||
|
||||
if (inDto.Name.IsNotNullOrEmpty())
|
||||
{
|
||||
{
|
||||
List<Guid> findIds = new List<Guid>();
|
||||
var findData = data.Where(x => x.Name.Contains(inDto.Name)).Select(x => x.Id.Value).ToList();
|
||||
GetParentId(findIds, findData, data);
|
||||
findIds.AddRange(findData);
|
||||
|
||||
data = data.Where(x => findIds.Distinct().Contains(x.Id.Value)).ToList();
|
||||
data = data.Where(x => findIds.Distinct().Contains(x.Id.Value)).ToList();
|
||||
|
||||
}
|
||||
|
||||
|
||||
var query = data
|
||||
var query = data
|
||||
.WhereIf(inDto.SelfId != null, x => inDto.SelfId == x.Id)
|
||||
.WhereIf(inDto.Id != null, x => inDto.Id == x.ParentId)
|
||||
.WhereIf(inDto.Id == null&& inDto.SelfId == null, x => x.ParentId == null);
|
||||
.WhereIf(inDto.Id == null && inDto.SelfId == null, x => x.ParentId == null);
|
||||
|
||||
|
||||
|
||||
PageOutput<AuditDocumentData> result = new PageOutput<AuditDocumentData>()
|
||||
{
|
||||
PageIndex = inDto.PageIndex,
|
||||
PageSize = inDto.PageSize,
|
||||
TotalCount = query.Count(),
|
||||
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();
|
||||
|
@ -256,21 +372,21 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
.Where(x => x.AuditDocumentTypeEnum == AuditDocumentType.HistoricalVersion).ProjectTo<AuditDocumentData>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
foreach (var item in root)
|
||||
{
|
||||
{
|
||||
GetChildren(item, data, historicalVersionList);
|
||||
|
||||
}
|
||||
result.CurrentPageData = root;
|
||||
return result;
|
||||
result.CurrentPageData = root;
|
||||
return result;
|
||||
|
||||
}
|
||||
|
||||
private void GetParentId(List<Guid> parentIds, List<Guid> ids, List<AuditDocumentData> dataList)
|
||||
{
|
||||
private void GetParentId(List<Guid> parentIds, List<Guid> ids, List<AuditDocumentData> dataList)
|
||||
{
|
||||
var parentid = dataList.Where(x => ids.Contains(x.Id.Value) && x.ParentId != null).Select(x => x.ParentId.Value).ToList();
|
||||
|
||||
if (parentid.Count() > 0)
|
||||
{
|
||||
if (parentid.Count() > 0)
|
||||
{
|
||||
parentIds.AddRange(parentid);
|
||||
|
||||
GetParentId(parentIds, parentid, dataList);
|
||||
|
@ -278,10 +394,10 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
|
||||
}
|
||||
|
||||
private void GetChildren(AuditDocumentData item, List<AuditDocumentData> dataList, List<AuditDocumentData> historyList)
|
||||
private void GetChildren(AuditDocumentData item, List<AuditDocumentData> dataList, List<AuditDocumentData> historyList)
|
||||
{
|
||||
item.Children = dataList.Where(x => x.ParentId == item.Id).ToList();
|
||||
item.HistoricalVersionsCount= historyList.Where(x => x.MainFileId == item.Id).Count();
|
||||
item.HistoricalVersionsCount = historyList.Where(x => x.MainFileId == item.Id).Count();
|
||||
foreach (var x in item.Children)
|
||||
{
|
||||
GetChildren(x, dataList, historyList);
|
||||
|
@ -295,39 +411,40 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
/// <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();
|
||||
{
|
||||
var data = await _auditDocumentRepository.Select(x => new DeleteAudit()
|
||||
{
|
||||
Id = x.Id,
|
||||
ParentId = x.ParentId,
|
||||
MainFileId = x.MainFileId
|
||||
}).ToListAsync();
|
||||
|
||||
List<Guid> DeleteId= inDto.Ids;
|
||||
List<Guid> DeleteId = inDto.Ids;
|
||||
|
||||
finId(inDto.Ids, data);
|
||||
|
||||
void finId(List<Guid> deletids, List<DeleteAudit> deletes)
|
||||
{
|
||||
DeleteId.AddRange(deletids);
|
||||
{
|
||||
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);
|
||||
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();
|
||||
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();
|
||||
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)
|
||||
{
|
||||
var num = 1;
|
||||
foreach (var historical in historicalVersionList)
|
||||
{
|
||||
await _auditDocumentRepository.UpdatePartialFromQueryAsync(historical.Id, x => new AuditDocument()
|
||||
{
|
||||
Version = num,
|
||||
|
@ -345,12 +462,12 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移动文件或者文件夹 到其他文件夹
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> MovieFileOrFolder(MovieFileOrFolderInDto inDto)
|
||||
/// <summary>
|
||||
/// 移动文件或者文件夹 到其他文件夹
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> MovieFileOrFolder(MovieFileOrFolderInDto inDto)
|
||||
{
|
||||
|
||||
var data = await _auditDocumentRepository.Select(x => new DeleteAudit()
|
||||
|
@ -361,8 +478,8 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
MainFileId = x.MainFileId
|
||||
}).ToListAsync();
|
||||
|
||||
foreach (var id in inDto.Ids)
|
||||
{
|
||||
foreach (var id in inDto.Ids)
|
||||
{
|
||||
var file = data.Where(x => x.Id == id).FirstOrDefault();
|
||||
if (file.AuditDocumentTypeEnum == AuditDocumentType.Folder)
|
||||
{
|
||||
|
@ -394,7 +511,7 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
}
|
||||
|
||||
foreach (var id in inDto.Ids)
|
||||
{
|
||||
{
|
||||
await _auditDocumentRepository.UpdatePartialFromQueryAsync(id, x => new AuditDocument()
|
||||
{
|
||||
ParentId = inDto.ParentId
|
||||
|
@ -412,21 +529,22 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> CopyFileOrFolder(MovieFileOrFolderInDto inDto)
|
||||
public async Task<IResponseOutput> CopyFileOrFolder(MovieFileOrFolderInDto inDto)
|
||||
{
|
||||
|
||||
foreach (var item in inDto.Ids)
|
||||
{
|
||||
var data = (await GetAuditDocumentData(new GetAuditDocumentDataInDto()
|
||||
foreach (var item in inDto.Ids)
|
||||
{
|
||||
var data = (await GetAuditDocumentData(new GetAuditDocumentDataInDto()
|
||||
{
|
||||
SelfId =item,
|
||||
SelfId = item,
|
||||
|
||||
PageIndex=1,
|
||||
PageSize= 1000
|
||||
PageIndex = 1,
|
||||
PageSize = 1000
|
||||
})).CurrentPageData;
|
||||
|
||||
List<AuditDocumentAddOrEdit> auditDocumentAddOrEdits = _mapper.Map<List<AuditDocumentAddOrEdit>>(data);
|
||||
auditDocumentAddOrEdits.ForEach(x => {
|
||||
auditDocumentAddOrEdits.ForEach(x =>
|
||||
{
|
||||
x.IsUpdate = false;
|
||||
x.Id = null;
|
||||
x.ParentId = inDto.ParentId;
|
||||
|
@ -441,7 +559,8 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
item.Id = null;
|
||||
var result = await AddOrUpdateAuditDocument(item);
|
||||
|
||||
item.Children.ForEach(x => {
|
||||
item.Children.ForEach(x =>
|
||||
{
|
||||
x.ParentId = result.Id;
|
||||
x.IsUpdate = false;
|
||||
x.Id = null;
|
||||
|
@ -462,97 +581,99 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<HistoricalVersionDto>> GetHistoricalVersion(GetHistoricalVersionInDto inDto)
|
||||
{
|
||||
public async Task<List<HistoricalVersionDto>> GetHistoricalVersion(GetHistoricalVersionInDto inDto)
|
||||
{
|
||||
|
||||
List< HistoricalVersionDto > result=new List<HistoricalVersionDto>();
|
||||
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 = 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;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 把历史版本设置为当前版本
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> SetCurrentVersion(SetCurrentVersionInDto inDto)
|
||||
{
|
||||
/// <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)
|
||||
{
|
||||
if (file.AuditDocumentTypeEnum != AuditDocumentType.HistoricalVersion)
|
||||
{
|
||||
throw new BusinessValidationFailedException(_localizer["AuditDocument_CanNotSetCurrentVersion"]);
|
||||
}
|
||||
|
||||
var mainFile = await _auditDocumentRepository.Where(x => x.Id == file.MainFileId).FirstNotNullAsync();
|
||||
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();
|
||||
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,
|
||||
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)
|
||||
{
|
||||
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
|
||||
Version = num,
|
||||
AuditDocumentTypeEnum = AuditDocumentType.HistoricalVersion
|
||||
});
|
||||
num++;
|
||||
num++;
|
||||
}
|
||||
|
||||
await _auditDocumentRepository.SaveChangesAsync();
|
||||
await _auditDocumentRepository.SaveChangesAsync();
|
||||
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置是否授权
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> SetIsAuthorization(SetIsAuthorizationInDto inDto)
|
||||
{
|
||||
var data = await _auditDocumentRepository.Select(x => new DeleteAudit()
|
||||
{
|
||||
Id = x.Id,
|
||||
ParentId = x.ParentId,
|
||||
MainFileId = x.MainFileId
|
||||
}).ToListAsync();
|
||||
/// <summary>
|
||||
/// 设置是否授权
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> SetIsAuthorization(SetIsAuthorizationInDto inDto)
|
||||
{
|
||||
var data = await _auditDocumentRepository.Select(x => new DeleteAudit()
|
||||
{
|
||||
Id = x.Id,
|
||||
ParentId = x.ParentId,
|
||||
MainFileId = x.MainFileId
|
||||
}).ToListAsync();
|
||||
|
||||
List<Guid> allid = new List<Guid>();
|
||||
findChild(allid, inDto.Ids, data);
|
||||
List<Guid> allid = new List<Guid>();
|
||||
findChild(allid, inDto.Ids, data);
|
||||
if (inDto.IsAuthorization)
|
||||
{
|
||||
findParent(allid, inDto.Ids, data);
|
||||
}
|
||||
allid= allid.Distinct().ToList();
|
||||
await _auditDocumentRepository.UpdatePartialFromQueryAsync(t => allid.Contains(t.Id), x => new AuditDocument() {
|
||||
allid = allid.Distinct().ToList();
|
||||
await _auditDocumentRepository.UpdatePartialFromQueryAsync(t => allid.Contains(t.Id), x => new AuditDocument()
|
||||
{
|
||||
|
||||
IsAuthorization = inDto.IsAuthorization
|
||||
IsAuthorization = inDto.IsAuthorization
|
||||
});
|
||||
await _auditDocumentRepository.SaveChangesAsync();
|
||||
return ResponseOutput.Ok();
|
||||
await _auditDocumentRepository.SaveChangesAsync();
|
||||
return ResponseOutput.Ok();
|
||||
|
||||
void findParent(List<Guid> allId, List<Guid> current, List<DeleteAudit> data)
|
||||
{
|
||||
allId.AddRange(current);
|
||||
var parent = data.Where(x => current.Contains(x.Id)).Select(x => x.ParentId).Where(x=>x!=null).Select(x=>(Guid)x).ToList();
|
||||
var parent = data.Where(x => current.Contains(x.Id)).Select(x => x.ParentId).Where(x => x != null).Select(x => (Guid)x).ToList();
|
||||
|
||||
if (parent.Count() > 0)
|
||||
{
|
||||
|
@ -563,13 +684,13 @@ public class AuditDocumentService(IRepository<AuditDocument> _auditDocumentRepos
|
|||
}
|
||||
}
|
||||
|
||||
void findChild(List<Guid> allId,List<Guid> current, List<DeleteAudit> data)
|
||||
{
|
||||
allId.AddRange(current);
|
||||
void findChild(List<Guid> allId, List<Guid> current, List<DeleteAudit> data)
|
||||
{
|
||||
allId.AddRange(current);
|
||||
|
||||
var child = data.Where(x =>(x.ParentId!=null&& current.Contains(x.ParentId.Value))||(x.MainFileId!=null&¤t.Contains(x.MainFileId.Value))).Select(x => x.Id).ToList();
|
||||
if (child.Count() > 0)
|
||||
{
|
||||
var child = data.Where(x => (x.ParentId != null && current.Contains(x.ParentId.Value)) || (x.MainFileId != null && current.Contains(x.MainFileId.Value))).Select(x => x.Id).ToList();
|
||||
if (child.Count() > 0)
|
||||
{
|
||||
|
||||
|
||||
findChild(allId, child, data);
|
||||
|
|
|
@ -9,6 +9,76 @@ using IRaCIS.Core.Domain.Share;
|
|||
using System.Collections.Generic;
|
||||
namespace IRaCIS.Core.Application.ViewModel;
|
||||
|
||||
|
||||
public class AuditRecordView : AuditRecordAddOrEdit
|
||||
{
|
||||
public Guid CreateUserId { get; set; }
|
||||
public DateTime CreateTime { get; set; }
|
||||
public Guid UpdateUserId { get; set; }
|
||||
public DateTime UpdateTime { get; set; }
|
||||
|
||||
|
||||
public new List<Guid> IdnetityUserIdList => IdentityUserList.Select(t => t.Id).ToList();
|
||||
public List<AuditIdentiUserInfo> IdentityUserList { get; set; }
|
||||
}
|
||||
|
||||
public class AuditIdentiUserInfo
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
|
||||
public string UserName { get; set; }
|
||||
|
||||
public string FullName { get; set; }
|
||||
}
|
||||
|
||||
public class AuditRecordAddOrEdit
|
||||
{
|
||||
public Guid? Id { get; set; }
|
||||
public string CompanyName { get; set; }
|
||||
|
||||
public string AuditContent { get; set; }
|
||||
|
||||
public DateOnly AuditTime { get; set; }
|
||||
|
||||
|
||||
public DateTime? BeginTime { get; set; }
|
||||
|
||||
public DateTime? EndTime { get; set; }
|
||||
|
||||
public AuditState AuditState { get; set; }
|
||||
|
||||
public AuditType AuditType { get; set; }
|
||||
|
||||
public List<Guid> IdnetityUserIdList { get; set; }
|
||||
}
|
||||
|
||||
public class AuditRecordQuery : PageInput
|
||||
{
|
||||
public string? CompanyName { get; set; }
|
||||
|
||||
public string? AuditContent { get; set; }
|
||||
|
||||
public DateOnly? BeginAuditTime { get; set; }
|
||||
public DateOnly? EndAuditTime { get; set; }
|
||||
|
||||
|
||||
public DateTime? BeginTime { get; set; }
|
||||
|
||||
public DateTime? EndTime { get; set; }
|
||||
|
||||
public AuditState? AuditState { get; set; }
|
||||
}
|
||||
|
||||
public class SetAuditRecordPermissionCommand
|
||||
{
|
||||
public Guid AuditDocumentId { get; set; }
|
||||
|
||||
public Guid AuditRecordId { get; set; }
|
||||
|
||||
public bool IsAuthorization { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class DeleteAudit
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
|
@ -24,9 +94,9 @@ public class DeleteAuditDocumentInDto
|
|||
public List<Guid> Ids { get; set; }
|
||||
}
|
||||
|
||||
public class GetAuditDocumentDataInDto:PageInput
|
||||
public class GetAuditDocumentDataInDto : PageInput
|
||||
{
|
||||
public Guid? Id { get; set; }
|
||||
public Guid? Id { get; set; }
|
||||
|
||||
public Guid? SelfId { get; set; }
|
||||
|
||||
|
@ -53,7 +123,7 @@ public class AuditDocumentData : AuditDocumentUpdateDto
|
|||
public int? Version { get; set; }
|
||||
|
||||
public int HistoricalVersionsCount { get; set; }
|
||||
public List<AuditDocumentData> Children { get; set; }=new List<AuditDocumentData> (){ };
|
||||
public List<AuditDocumentData> Children { get; set; } = new List<AuditDocumentData>() { };
|
||||
|
||||
}
|
||||
|
||||
|
@ -80,7 +150,7 @@ public class SetCurrentVersionInDto
|
|||
|
||||
public class GetHistoricalVersionInDto
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public Guid Id { get; set; }
|
||||
}
|
||||
|
||||
public class GetHistoricalVersionOutDto
|
||||
|
@ -96,7 +166,7 @@ public class MovieFileOrFolderInDto
|
|||
public Guid ParentId { get; set; }
|
||||
}
|
||||
|
||||
public class HistoricalVersionDto: AuditDocumentUpdateDto
|
||||
public class HistoricalVersionDto : AuditDocumentUpdateDto
|
||||
{
|
||||
public bool IsCurrentVersion { get; set; } = false;
|
||||
|
||||
|
@ -133,16 +203,16 @@ public class GetBreadcrumbDataInDto
|
|||
public Guid Id { get; set; }
|
||||
}
|
||||
|
||||
public class AuditDocumentAddOrEdit: AuditDocumentUpdateDto
|
||||
public class AuditDocumentAddOrEdit : AuditDocumentUpdateDto
|
||||
{
|
||||
|
||||
|
||||
public List<AuditDocumentAddOrEdit> Children { get; set; }=new List<AuditDocumentAddOrEdit>() { };
|
||||
public List<AuditDocumentAddOrEdit> Children { get; set; } = new List<AuditDocumentAddOrEdit>() { };
|
||||
|
||||
public bool IsUpdate { get; set; } = true;
|
||||
}
|
||||
|
||||
public class AuditDocumentQuery:PageInput
|
||||
public class AuditDocumentQuery : PageInput
|
||||
{
|
||||
public AuditDocumentType? AuditDocumentTypeEnum { get; set; }
|
||||
|
||||
|
@ -150,17 +220,17 @@ public class AuditDocumentQuery:PageInput
|
|||
|
||||
public string? FilePath { get; set; }
|
||||
|
||||
public decimal? FileSize { get; set; }
|
||||
public decimal? FileSize { get; set; }
|
||||
|
||||
public bool? IsAuthorization { get; set; }
|
||||
|
||||
public Guid? MainFileId { get; set; }
|
||||
public Guid? MainFileId { get; set; }
|
||||
|
||||
public string? Name { get; set; }
|
||||
|
||||
public Guid? ParentId { get; set; }
|
||||
public Guid? ParentId { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
.ForMember(dest => dest.CreateUserRole, opt => opt.Ignore());
|
||||
|
||||
CreateMap<TrialDocument, TrialDocumentView>()
|
||||
.ForMember(d => d.AttachmentCount, u => u.MapFrom(s =>s.TrialDocumentAttachmentList.Count()))
|
||||
.ForMember(d => d.AttachmentCount, u => u.MapFrom(s => s.TrialDocumentAttachmentList.Count()))
|
||||
.ForMember(d => d.FileType, u => u.MapFrom(s => isEn_Us ? s.FileType.Value : s.FileType.ValueCN))
|
||||
.ForMember(d => d.IsSomeUserSigned, u => u.MapFrom(s => s.TrialDocConfirmedUserList.Any(t => t.ConfirmTime != null)))
|
||||
.ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path));
|
||||
|
@ -81,7 +81,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
CreateMap<BatchAddTrialEmailNoticeConfig, TrialEmailNoticeConfig>();
|
||||
|
||||
CreateMap<TrialSelectEmailNoticeConfigView, BatchAddTrialEmailNoticeConfig > ();
|
||||
CreateMap<TrialSelectEmailNoticeConfigView, BatchAddTrialEmailNoticeConfig>();
|
||||
|
||||
|
||||
CreateMap<AddOrEditTrialDocument, TrialDocument>()
|
||||
|
@ -94,7 +94,8 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
|
||||
CreateMap<AddOrEditSystemDocument, SystemDocument>().ForMember(d => d.NeedConfirmedUserTypeList, c => c.MapFrom(t => t.NeedConfirmedUserTypeIdList));
|
||||
CreateMap<Guid, SystemDocNeedConfirmedUserType>().EqualityComparison((odto, o) => odto == o.NeedConfirmUserTypeId)
|
||||
CreateMap<Guid, SystemDocNeedConfirmedUserType>()
|
||||
.EqualityComparison((odto, o) => odto == o.NeedConfirmUserTypeId)
|
||||
.ForMember(d => d.NeedConfirmUserTypeId, c => c.MapFrom(t => t))
|
||||
.ForMember(d => d.SystemDocumentId, c => c.Ignore());
|
||||
|
||||
|
@ -146,6 +147,26 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
CreateMap<TrialHistoryRecordFile, TrialHistoryRecordFileView>();
|
||||
CreateMap<TrialHistoryRecordFile, TrialHistoryRecordFileAddOrEdit>().ReverseMap();
|
||||
|
||||
|
||||
|
||||
CreateMap<AuditRecord, AuditRecordView>()
|
||||
.ForMember(d => d.IdentityUserList, c => c.MapFrom(t => t.AuditRecordIdentityUserList));
|
||||
|
||||
CreateMap<AuditRecordAddOrEdit, AuditRecord>()
|
||||
.ForMember(d => d.AuditRecordIdentityUserList, c => c.MapFrom(t => t.IdnetityUserIdList));
|
||||
|
||||
CreateMap<Guid, AuditRecordIdentityUser>()
|
||||
.EqualityComparison((odto, o) => odto == o.IdentityUserId)
|
||||
.ForMember(d => d.AuditRecordId, c => c.Ignore())
|
||||
.ForMember(d => d.IdentityUserId, c => c.MapFrom(t => t));
|
||||
|
||||
|
||||
CreateMap<AuditRecordIdentityUser, AuditIdentiUserInfo>()
|
||||
.ForMember(d => d.Id, c => c.MapFrom(t => t.IdentityUser.Id))
|
||||
.ForMember(d => d.UserName, c => c.MapFrom(t => t.IdentityUser.UserName))
|
||||
.ForMember(d => d.FullName, c => c.MapFrom(t => t.IdentityUser.FullName));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -80,4 +80,83 @@ namespace IRaCIS.Core.Domain.Models
|
|||
HistoricalVersion = 2,
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class AuditRecord : BaseFullAuditEntity
|
||||
{
|
||||
[JsonIgnore]
|
||||
public List<AuditRecordIdentityUser> AuditRecordIdentityUserList { get; set; }
|
||||
|
||||
public string CompanyName { get; set; }
|
||||
|
||||
public string AuditContent { get; set; }
|
||||
|
||||
[Comment("稽查日期")]
|
||||
public DateOnly AuditTime { get; set; }
|
||||
|
||||
|
||||
public DateTime? BeginTime { get; set; }
|
||||
|
||||
public DateTime? EndTime { get; set; }
|
||||
|
||||
[Comment("稽查状态")]
|
||||
public AuditState AuditState { get; set; }
|
||||
|
||||
[Comment("稽查形式")]
|
||||
public AuditType AuditType { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class AuditRecordIdentityUser : BaseAddAuditEntity
|
||||
{
|
||||
[JsonIgnore]
|
||||
public IdentityUser IdentityUser { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public AuditRecord AuditRecord { get; set; }
|
||||
|
||||
|
||||
|
||||
public Guid IdentityUserId { get; set; }
|
||||
|
||||
public Guid AuditRecordId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class AuditRecordPermission : BaseAddAuditEntity
|
||||
{
|
||||
[JsonIgnore]
|
||||
public AuditRecord AuditRecord { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public AuditDocument AuditDocument { get; set; }
|
||||
|
||||
|
||||
public Guid AuditRecordId { get; set; }
|
||||
|
||||
|
||||
public Guid AuditDocumentId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public enum AuditState
|
||||
{
|
||||
NotStart = 0,
|
||||
|
||||
Ongoing = 1,
|
||||
|
||||
End = 2
|
||||
|
||||
}
|
||||
|
||||
public enum AuditType
|
||||
{
|
||||
None = 0,
|
||||
|
||||
Online = 1,
|
||||
|
||||
OnSite = 2
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,7 +61,7 @@ public class IRaCISDBContext : DbContext
|
|||
configurationBuilder.Conventions.Add(_ => new DefaultStringLengthConvention(400));
|
||||
|
||||
//https://learn.microsoft.com/zh-cn/ef/core/modeling/relationships/conventions?utm_source=chatgpt.com
|
||||
configurationBuilder.Conventions.Remove(typeof(ForeignKeyIndexConvention));
|
||||
//configurationBuilder.Conventions.Remove(typeof(ForeignKeyIndexConvention));
|
||||
}
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
|
@ -674,6 +674,12 @@ public class IRaCISDBContext : DbContext
|
|||
|
||||
public virtual DbSet<SubjectVisitImageBackRecord> SubjectVisitImageBackRecord { get; set; }
|
||||
|
||||
|
||||
public virtual DbSet<AuditRecord> AuditRecord { get; set; }
|
||||
public virtual DbSet<AuditRecordIdentityUser> AuditRecordIdentityUser { get; set; }
|
||||
public virtual DbSet<AuditRecordPermission> AuditRecordPermission { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class TestLength : Entity
|
||||
|
|
20275
IRaCIS.Core.Infra.EFCore/Migrations/20250926101203_auditRecord.Designer.cs
generated
Normal file
20275
IRaCIS.Core.Infra.EFCore/Migrations/20250926101203_auditRecord.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,157 @@
|
|||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace IRaCIS.Core.Infra.EFCore.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class auditRecord : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "AuditRecord",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
CompanyName = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
|
||||
AuditContent = table.Column<string>(type: "nvarchar(400)", maxLength: 400, nullable: false),
|
||||
AuditTime = table.Column<DateOnly>(type: "date", nullable: false, comment: "稽查日期"),
|
||||
BeginTime = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||
EndTime = table.Column<DateTime>(type: "datetime2", nullable: true),
|
||||
AuditState = table.Column<int>(type: "int", nullable: false, comment: "稽查状态"),
|
||||
AuditType = table.Column<int>(type: "int", nullable: false, comment: "稽查形式"),
|
||||
CreateUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
CreateTime = table.Column<DateTime>(type: "datetime2", nullable: false),
|
||||
UpdateUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
UpdateTime = table.Column<DateTime>(type: "datetime2", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_AuditRecord", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_AuditRecord_User_CreateUserId",
|
||||
column: x => x.CreateUserId,
|
||||
principalTable: "User",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "AuditRecordIdentityUser",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
IdentityUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
AuditRecordId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
CreateUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
CreateTime = table.Column<DateTime>(type: "datetime2", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_AuditRecordIdentityUser", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_AuditRecordIdentityUser_AuditRecord_AuditRecordId",
|
||||
column: x => x.AuditRecordId,
|
||||
principalTable: "AuditRecord",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_AuditRecordIdentityUser_IdentityUser_IdentityUserId",
|
||||
column: x => x.IdentityUserId,
|
||||
principalTable: "IdentityUser",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_AuditRecordIdentityUser_User_CreateUserId",
|
||||
column: x => x.CreateUserId,
|
||||
principalTable: "User",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "AuditRecordPermission",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
AuditRecordId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
AuditDocumentId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
CreateUserId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
||||
CreateTime = table.Column<DateTime>(type: "datetime2", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_AuditRecordPermission", x => x.Id);
|
||||
table.ForeignKey(
|
||||
name: "FK_AuditRecordPermission_AuditDocument_AuditDocumentId",
|
||||
column: x => x.AuditDocumentId,
|
||||
principalTable: "AuditDocument",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_AuditRecordPermission_AuditRecord_AuditRecordId",
|
||||
column: x => x.AuditRecordId,
|
||||
principalTable: "AuditRecord",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
table.ForeignKey(
|
||||
name: "FK_AuditRecordPermission_User_CreateUserId",
|
||||
column: x => x.CreateUserId,
|
||||
principalTable: "User",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_AuditRecord_CreateUserId",
|
||||
table: "AuditRecord",
|
||||
column: "CreateUserId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_AuditRecordIdentityUser_AuditRecordId",
|
||||
table: "AuditRecordIdentityUser",
|
||||
column: "AuditRecordId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_AuditRecordIdentityUser_CreateUserId",
|
||||
table: "AuditRecordIdentityUser",
|
||||
column: "CreateUserId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_AuditRecordIdentityUser_IdentityUserId",
|
||||
table: "AuditRecordIdentityUser",
|
||||
column: "IdentityUserId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_AuditRecordPermission_AuditDocumentId",
|
||||
table: "AuditRecordPermission",
|
||||
column: "AuditDocumentId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_AuditRecordPermission_AuditRecordId",
|
||||
table: "AuditRecordPermission",
|
||||
column: "AuditRecordId");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_AuditRecordPermission_CreateUserId",
|
||||
table: "AuditRecordPermission",
|
||||
column: "CreateUserId");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "AuditRecordIdentityUser");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "AuditRecordPermission");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "AuditRecord");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -155,6 +155,114 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
|||
});
|
||||
});
|
||||
|
||||
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecord", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<string>("AuditContent")
|
||||
.IsRequired()
|
||||
.HasMaxLength(400)
|
||||
.HasColumnType("nvarchar(400)");
|
||||
|
||||
b.Property<int>("AuditState")
|
||||
.HasColumnType("int")
|
||||
.HasComment("稽查状态");
|
||||
|
||||
b.Property<DateOnly>("AuditTime")
|
||||
.HasColumnType("date")
|
||||
.HasComment("稽查日期");
|
||||
|
||||
b.Property<int>("AuditType")
|
||||
.HasColumnType("int")
|
||||
.HasComment("稽查形式");
|
||||
|
||||
b.Property<DateTime?>("BeginTime")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<string>("CompanyName")
|
||||
.IsRequired()
|
||||
.HasMaxLength(400)
|
||||
.HasColumnType("nvarchar(400)");
|
||||
|
||||
b.Property<DateTime>("CreateTime")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<Guid>("CreateUserId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<DateTime?>("EndTime")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<DateTime>("UpdateTime")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<Guid>("UpdateUserId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("CreateUserId");
|
||||
|
||||
b.ToTable("AuditRecord");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecordIdentityUser", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid>("AuditRecordId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<DateTime>("CreateTime")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<Guid>("CreateUserId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid>("IdentityUserId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("AuditRecordId");
|
||||
|
||||
b.HasIndex("CreateUserId");
|
||||
|
||||
b.HasIndex("IdentityUserId");
|
||||
|
||||
b.ToTable("AuditRecordIdentityUser");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecordPermission", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid>("AuditDocumentId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<Guid>("AuditRecordId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.Property<DateTime>("CreateTime")
|
||||
.HasColumnType("datetime2");
|
||||
|
||||
b.Property<Guid>("CreateUserId")
|
||||
.HasColumnType("uniqueidentifier");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.HasIndex("AuditDocumentId");
|
||||
|
||||
b.HasIndex("AuditRecordId");
|
||||
|
||||
b.HasIndex("CreateUserId");
|
||||
|
||||
b.ToTable("AuditRecordPermission");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("IRaCIS.Core.Domain.Models.CRO", b =>
|
||||
{
|
||||
b.Property<Guid>("Id")
|
||||
|
@ -15264,6 +15372,71 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
|||
b.Navigation("CreateUserRole");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecord", b =>
|
||||
{
|
||||
b.HasOne("IRaCIS.Core.Domain.Models.UserRole", "CreateUserRole")
|
||||
.WithMany()
|
||||
.HasForeignKey("CreateUserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("CreateUserRole");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecordIdentityUser", b =>
|
||||
{
|
||||
b.HasOne("IRaCIS.Core.Domain.Models.AuditRecord", "AuditRecord")
|
||||
.WithMany("AuditRecordIdentityUserList")
|
||||
.HasForeignKey("AuditRecordId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("IRaCIS.Core.Domain.Models.UserRole", "CreateUserRole")
|
||||
.WithMany()
|
||||
.HasForeignKey("CreateUserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("IRaCIS.Core.Domain.Models.IdentityUser", "IdentityUser")
|
||||
.WithMany()
|
||||
.HasForeignKey("IdentityUserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("AuditRecord");
|
||||
|
||||
b.Navigation("CreateUserRole");
|
||||
|
||||
b.Navigation("IdentityUser");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecordPermission", b =>
|
||||
{
|
||||
b.HasOne("IRaCIS.Core.Domain.Models.AuditDocument", "AuditDocument")
|
||||
.WithMany()
|
||||
.HasForeignKey("AuditDocumentId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("IRaCIS.Core.Domain.Models.AuditRecord", "AuditRecord")
|
||||
.WithMany()
|
||||
.HasForeignKey("AuditRecordId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.HasOne("IRaCIS.Core.Domain.Models.UserRole", "CreateUserRole")
|
||||
.WithMany()
|
||||
.HasForeignKey("CreateUserId")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("AuditDocument");
|
||||
|
||||
b.Navigation("AuditRecord");
|
||||
|
||||
b.Navigation("CreateUserRole");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("IRaCIS.Core.Domain.Models.CRO", b =>
|
||||
{
|
||||
b.HasOne("IRaCIS.Core.Domain.Models.UserRole", "CreateUserRole")
|
||||
|
@ -19629,6 +19802,11 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
|
|||
b.Navigation("CreateUserRole");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("IRaCIS.Core.Domain.Models.AuditRecord", b =>
|
||||
{
|
||||
b.Navigation("AuditRecordIdentityUserList");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("IRaCIS.Core.Domain.Models.ClinicalDataTrialSet", b =>
|
||||
{
|
||||
b.Navigation("ReadingClinicalDataList");
|
||||
|
|
Loading…
Reference in New Issue