//-------------------------------------------------------------------- // 此代码由T4模板自动生成 byzhouhang 20210918 // 生成时间 2022-01-05 09:17:03 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 //-------------------------------------------------------------------- using System.Runtime.InteropServices.ComTypes; using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Infra.EFCore; using Microsoft.AspNetCore.Hosting; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Domain.Share; using Panda.DynamicWebApi.Attributes; namespace IRaCIS.Core.Application.Services { /// /// TrialDocumentService /// [ApiExplorerSettings(GroupName = "Trial")] public class TrialDocumentService : BaseService, ITrialDocumentService { private readonly IRepository _trialDocumentRepository; private readonly IRepository _systemDocumentRepository; public TrialDocumentService(IRepository trialDocumentRepository , IRepository systemDocumentRepository) { _trialDocumentRepository = trialDocumentRepository; _systemDocumentRepository = systemDocumentRepository; } /// /// Setting 界面的 项目所有文档列表 /// /// /// [HttpPost] public async Task> GetTrialDocumentList(TrialDocumentQuery queryTrialDocument) { var trialDocumentQueryable = _trialDocumentRepository.AsQueryable(true).Where(t => t.TrialId == queryTrialDocument.TrialId) .WhereIf(!string.IsNullOrEmpty(queryTrialDocument.Name), t => t.Name.Contains(queryTrialDocument.Name)) .WhereIf(queryTrialDocument.FileTypeId != null, t => t.FileTypeId == queryTrialDocument.FileTypeId) .ProjectTo(_mapper.ConfigurationProvider, new { token = _userInfo.UserToken }); return await trialDocumentQueryable.ToPagedListAsync(queryTrialDocument.PageIndex, queryTrialDocument.PageSize, queryTrialDocument.SortField, queryTrialDocument.Asc); } /// /// 具体用户看到的 系统文件列表 + 项目类型文档 /// /// /// [HttpPost] public async Task> GetUserDocumentList(TrialUserDocUnionQuery querySystemDocument) { #region https://github.com/dotnet/efcore/issues/16243 操作不行 ////系统文档查询 //var systemDocumentQueryable = _systemDocumentRepository // .WhereIf(!_userInfo.IsAdmin, t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)) // .WhereIf(!_userInfo.IsAdmin, t => t.IsAbandon == false || (t.IsAbandon == true && t.SystemDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id))) //.ProjectTo(_mapper.ConfigurationProvider, new { userId = _userInfo.Id, token = _userInfo.UserToken }); ////项目文档查询 //var trialDocQueryable = _trialDocumentRepository.Where(t => t.TrialId == querySystemDocument.TrialId) // .WhereIf(!_userInfo.IsAdmin, t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)) // .WhereIf(!_userInfo.IsAdmin, t => t.IsAbandon == false || (t.IsAbandon == true && t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id))) // .ProjectTo(_mapper.ConfigurationProvider, new { userId = _userInfo.Id, token = _userInfo.UserToken }); //var unionQuery = systemDocumentQueryable.Union(trialDocQueryable); // .WhereIf(!string.IsNullOrEmpty(querySystemDocument.Name), t => t.Name.Contains(querySystemDocument.Name)) // .WhereIf(!string.IsNullOrEmpty(querySystemDocument.Type), t => t.Type.Contains(querySystemDocument.Type)); #endregion #region 仅仅文档信息 ////系统文档查询 //var systemDocumentQueryable = _systemDocumentRepository // .WhereIf(!_userInfo.IsAdmin, t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)) // .WhereIf(!_userInfo.IsAdmin, t => t.IsAbandon == false || (t.IsAbandon == true && t.SystemDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id))) // .Select(t => new UnionDocumentView() // { // Id = t.Id, // IsSystemDoc = true, // CreateTime = t.CreateTime, // FullFilePath = t.Path + "?access_token=" + _userInfo.UserToken, // IsAbandon = t.IsAbandon, // Name = t.Name, // Path = t.Path, // Type = t.Type, // UpdateTime = t.UpdateTime, // SignViewMinimumMinutes = t.SignViewMinimumMinutes, // }); ////项目文档查询 //var trialDocQueryable = _trialDocumentRepository.Where(t => t.TrialId == querySystemDocument.TrialId) // .WhereIf(!_userInfo.IsAdmin, t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)) // .WhereIf(!_userInfo.IsAdmin, t => t.IsAbandon == false || (t.IsAbandon == true && t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id))) // .Select(t => new UnionDocumentView() // { // Id = t.Id, // IsSystemDoc = false, // CreateTime = t.CreateTime, // FullFilePath = t.Path + "?access_token=" + _userInfo.UserToken, // IsAbandon = t.IsAbandon, // Name = t.Name, // Path = t.Path, // Type = t.Type, // UpdateTime = t.UpdateTime, // SignViewMinimumMinutes = t.SignViewMinimumMinutes, // }); #endregion var trialFininshedTime = await _repository.Where(t => t.Id == querySystemDocument.TrialId).Select(t => t.TrialFinishedTime).FirstOrDefaultAsync(); //系统文档查询 var systemDocumentQueryable = from needConfirmedUserType in _repository.Where(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId) //.Where(u => u.UserTypeRole.UserList.SelectMany(cc => cc.UserTrials.Where(t => t.TrialId == querySystemDocument.TrialId)).Any(e => e.Trial.TrialFinishedTime < u.SystemDocument.CreateTime)) .WhereIf(trialFininshedTime != null, u => u.SystemDocument.CreateTime < trialFininshedTime) .WhereIf(!_userInfo.IsAdmin, t => t.SystemDocument.IsDeleted == false || (t.SystemDocument.IsDeleted == true && t.SystemDocument.SystemDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id))) join trialUser in _repository.Where(t => t.TrialId == querySystemDocument.TrialId && t.UserId == _userInfo.Id) on needConfirmedUserType.NeedConfirmUserTypeId equals trialUser.User.UserTypeId join confirm in _repository.GetQueryable() on new { ConfirmUserId = trialUser.UserId, SystemDocumentId = needConfirmedUserType.SystemDocumentId } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new UnionDocumentWithConfirmInfoView() { IsSystemDoc = true, Id = needConfirmedUserType.SystemDocument.Id, CreateTime = needConfirmedUserType.SystemDocument.CreateTime, IsDeleted = needConfirmedUserType.SystemDocument.IsDeleted, SignViewMinimumMinutes = needConfirmedUserType.SystemDocument.SignViewMinimumMinutes, Name = needConfirmedUserType.SystemDocument.Name, Path = needConfirmedUserType.SystemDocument.Path, FileTypeId = needConfirmedUserType.SystemDocument.FileTypeId, FileType = needConfirmedUserType.SystemDocument.FileType.Value, UpdateTime = needConfirmedUserType.SystemDocument.UpdateTime, FullFilePath = needConfirmedUserType.SystemDocument.Path + "?access_token=" + _userInfo.UserToken, ConfirmUserId = confirm.ConfirmUserId, ConfirmTime = confirm.ConfirmTime, RealName = trialUser.User.LastName + " / " + trialUser.User.FirstName, UserName = trialUser.User.UserName, UserTypeShortName = trialUser.User.UserTypeRole.UserTypeShortName }; //项目文档查询 var trialDocQueryable = from trialDoc in _trialDocumentRepository.AsQueryable(true).Where(t => t.TrialId == querySystemDocument.TrialId) .WhereIf(!_userInfo.IsAdmin, t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)) .WhereIf(!_userInfo.IsAdmin, t => t.IsDeleted == false || (t.IsDeleted == true && t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id))) join trialUser in _repository.Where(t => t.TrialId == querySystemDocument.TrialId && t.UserId == _userInfo.Id) on trialDoc.TrialId equals trialUser.TrialId join confirm in _repository.Where(t => t.TrialDocument.TrialId == querySystemDocument.TrialId) on new { trialUser.UserId, TrialDocumentId = trialDoc.Id } equals new { UserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new UnionDocumentWithConfirmInfoView() { Id = trialDoc.Id, IsSystemDoc = false, CreateTime = trialDoc.CreateTime, FullFilePath = trialDoc.Path + "?access_token=" + _userInfo.UserToken, IsDeleted = trialDoc.IsDeleted, Name = trialDoc.Name, Path = trialDoc.Path, FileTypeId = trialDoc.FileTypeId, FileType = trialDoc.FileType.Value, UpdateTime = trialDoc.UpdateTime, SignViewMinimumMinutes = trialDoc.SignViewMinimumMinutes, ConfirmUserId = confirm.ConfirmUserId, ConfirmTime = confirm.ConfirmTime, RealName = trialUser.User.LastName + " / " + trialUser.User.FirstName, UserName = trialUser.User.UserName, UserTypeShortName = trialUser.User.UserTypeRole.UserTypeShortName }; var unionQuery = systemDocumentQueryable.Union(trialDocQueryable) .WhereIf(!string.IsNullOrEmpty(querySystemDocument.Name), t => t.Name.Contains(querySystemDocument.Name)) .WhereIf(querySystemDocument.FileTypeId != null, t => t.FileTypeId == querySystemDocument.FileTypeId) .WhereIf(querySystemDocument.IsSign == true, t => t.ConfirmUserId != null) .WhereIf(querySystemDocument.IsSign == false, t => t.ConfirmUserId == null); return await unionQuery.ToPagedListAsync(querySystemDocument.PageIndex, querySystemDocument.PageSize, querySystemDocument.SortField, querySystemDocument.Asc); } /// /// 获取用户是否有文档未签署 /// /// /// [HttpGet("{trialId:guid}")] public async Task GetUserIsHaveDocumentNeedSign(Guid trialId) { var trialFininshedTime = await _repository.Where(t => t.Id == trialId).Select(t => t.TrialFinishedTime).FirstOrDefaultAsync(); //系统文档查询 var systemDocumentQueryable = from needConfirmedUserType in _repository.Where(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId) //.Where(u => u.UserTypeRole.UserList.SelectMany(cc => cc.UserTrials.Where(t => t.TrialId == querySystemDocument.TrialId)).Any(e => e.Trial.TrialFinishedTime < u.SystemDocument.CreateTime)) .WhereIf(trialFininshedTime != null, u => u.SystemDocument.CreateTime < trialFininshedTime) .WhereIf(!_userInfo.IsAdmin, t => t.SystemDocument.IsDeleted == false || (t.SystemDocument.IsDeleted == true && t.SystemDocument.SystemDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id))) join trialUser in _repository.Where(t => t.TrialId == trialId && t.UserId == _userInfo.Id) on needConfirmedUserType.NeedConfirmUserTypeId equals trialUser.User.UserTypeId join confirm in _repository.GetQueryable() on new { ConfirmUserId = trialUser.UserId, SystemDocumentId = needConfirmedUserType.SystemDocumentId } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new { //ConfirmUserId = confirm.ConfirmUserId, ConfirmTime = confirm.ConfirmTime, }; //项目文档查询 var trialDocQueryable = from trialDoc in _trialDocumentRepository.Where(t => t.TrialId == trialId) .WhereIf(!_userInfo.IsAdmin, t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)) .WhereIf(!_userInfo.IsAdmin, t => t.IsDeleted == false || (t.IsDeleted == true && t.TrialDocConfirmedUserList.Any(t => t.ConfirmUserId == _userInfo.Id))) join trialUser in _repository.Where(t => t.TrialId == trialId && t.UserId == _userInfo.Id) on trialDoc.TrialId equals trialUser.TrialId join confirm in _repository.Where(t => t.TrialDocument.TrialId == trialId) on new { trialUser.UserId, TrialDocumentId = trialDoc.Id } equals new { UserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new { //ConfirmUserId = confirm.ConfirmUserId, ConfirmTime = confirm.ConfirmTime, }; var unionQuery = systemDocumentQueryable.Union(trialDocQueryable); return await unionQuery.AnyAsync(t => t.ConfirmTime == null); } /// /// 获取确认列表情况 项目文档+系统文档+具体的人 /// /// /// [HttpPost] public async Task> GetDocumentConfirmList(DocumentTrialUnionQuery querySystemDocument) { #region linq join 方式 //var trialDocQuery = from trialDocumentNeedConfirmedUserType in _trialDocumentNeedConfirmedUserTypeRepository.Where(t => t.TrialDocument.TrialId == querySystemDocument.TrialId) // join trialUser in _trialUserRepository.Where(t => t.TrialId == querySystemDocument.TrialId) // .WhereIf(querySystemDocument.UserId != null, t => t.UserId == querySystemDocument.UserId) // on trialDocumentNeedConfirmedUserType.NeedConfirmUserTypeId equals trialUser.User.UserTypeId // join confirm in _trialDocuserConfrimedRepository.AsQueryable() on trialUser.UserId equals confirm.ConfirmUserId into cc // from confirm in cc.DefaultIfEmpty() // select new UnionDocumentConfirmListView() // { // Id = trialDocumentNeedConfirmedUserType.TrialDocument.Id, // CreateTime = trialDocumentNeedConfirmedUserType.TrialDocument.CreateTime, // IsAbandon = trialDocumentNeedConfirmedUserType.TrialDocument.IsAbandon, // SignViewMinimumMinutes = trialDocumentNeedConfirmedUserType.TrialDocument.SignViewMinimumMinutes, // Name = trialDocumentNeedConfirmedUserType.TrialDocument.Name, // Path = trialDocumentNeedConfirmedUserType.TrialDocument.Path, // Type = trialDocumentNeedConfirmedUserType.TrialDocument.Type, // UpdateTime = trialDocumentNeedConfirmedUserType.TrialDocument.UpdateTime, // UserConfirmInfo = /*confirm == null ? null : */new UnionDocumentUserConfirmView() // { // ConfirmUserId = confirm.ConfirmUserId, // ConfirmTime = confirm.ConfirmTime, // RealName = trialUser.User.LastName + " / " + trialUser.User.LastName, // UserName = trialUser.User.UserName, // }, // FullFilePath = trialDocumentNeedConfirmedUserType.TrialDocument.Path + "?access_token=" + _userInfo.UserToken // }; #endregion var trialFininshedTime = await _repository.Where(t => t.Id == querySystemDocument.TrialId).Select(t => t.TrialFinishedTime).FirstOrDefaultAsync(); var trialDocQuery = from trialDocumentNeedConfirmedUserType in _repository.Where(t => t.TrialDocument.TrialId == querySystemDocument.TrialId) join trialUser in _repository.Where(t => t.TrialId == querySystemDocument.TrialId) .WhereIf(querySystemDocument.UserId != null, t => t.UserId == querySystemDocument.UserId) .WhereIf(querySystemDocument.UserTypeId != null, t => t.User.UserTypeId == querySystemDocument.UserTypeId) on trialDocumentNeedConfirmedUserType.NeedConfirmUserTypeId equals trialUser.User.UserTypeId join confirm in _repository.Where(t => t.TrialDocument.TrialId == querySystemDocument.TrialId) on new { trialUser.UserId, TrialDocumentId = trialDocumentNeedConfirmedUserType.TrialDocumentId } equals new { UserId = confirm.ConfirmUserId, confirm.TrialDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new UnionDocumentWithConfirmInfoView() { IsSystemDoc = false, Id = trialDocumentNeedConfirmedUserType.TrialDocument.Id, CreateTime = trialDocumentNeedConfirmedUserType.TrialDocument.CreateTime, IsDeleted = trialDocumentNeedConfirmedUserType.TrialDocument.IsDeleted, SignViewMinimumMinutes = trialDocumentNeedConfirmedUserType.TrialDocument.SignViewMinimumMinutes, Name = trialDocumentNeedConfirmedUserType.TrialDocument.Name, Path = trialDocumentNeedConfirmedUserType.TrialDocument.Path, FileTypeId = trialDocumentNeedConfirmedUserType.TrialDocument.FileTypeId, FileType = trialDocumentNeedConfirmedUserType.TrialDocument.FileType.Value, UpdateTime = trialDocumentNeedConfirmedUserType.TrialDocument.UpdateTime, ConfirmUserId = confirm.ConfirmUserId, ConfirmTime = confirm.ConfirmTime, RealName = trialUser.User.LastName + " / " + trialUser.User.FirstName, UserName = trialUser.User.UserName, UserTypeShortName = trialUser.User.UserTypeRole.UserTypeShortName, FullFilePath = trialDocumentNeedConfirmedUserType.TrialDocument.Path + "?access_token=" + _userInfo.UserToken }; var systemDocQuery = from needConfirmEdUserType in _repository.WhereIf(trialFininshedTime != null, u => u.SystemDocument.CreateTime < trialFininshedTime) join trialUser in _repository.Where(t => t.TrialId == querySystemDocument.TrialId) .WhereIf(querySystemDocument.UserId != null, t => t.UserId == querySystemDocument.UserId) on needConfirmEdUserType.NeedConfirmUserTypeId equals trialUser.User.UserTypeId join confirm in _repository.GetQueryable() on new { ConfirmUserId = trialUser.UserId, SystemDocumentId = needConfirmEdUserType.SystemDocumentId } equals new { confirm.ConfirmUserId, confirm.SystemDocumentId } into cc from confirm in cc.DefaultIfEmpty() select new UnionDocumentWithConfirmInfoView() { IsSystemDoc = true, Id = needConfirmEdUserType.SystemDocument.Id, CreateTime = needConfirmEdUserType.SystemDocument.CreateTime, IsDeleted = needConfirmEdUserType.SystemDocument.IsDeleted, SignViewMinimumMinutes = needConfirmEdUserType.SystemDocument.SignViewMinimumMinutes, Name = needConfirmEdUserType.SystemDocument.Name, Path = needConfirmEdUserType.SystemDocument.Path, FileType = needConfirmEdUserType.SystemDocument.FileType.Value, FileTypeId = needConfirmEdUserType.SystemDocument.FileTypeId, UpdateTime = needConfirmEdUserType.SystemDocument.UpdateTime, ConfirmUserId = confirm.ConfirmUserId, ConfirmTime = confirm.ConfirmTime, RealName = trialUser.User.LastName + " / " + trialUser.User.FirstName, UserName = trialUser.User.UserName, UserTypeShortName = trialUser.User.UserTypeRole.UserTypeShortName, FullFilePath = needConfirmEdUserType.SystemDocument.Path + "?access_token=" + _userInfo.UserToken }; var unionQuery = trialDocQuery.Union(systemDocQuery) .WhereIf(!string.IsNullOrEmpty(querySystemDocument.Name), t => t.Name.Contains(querySystemDocument.Name)) .WhereIf(querySystemDocument.FileTypeId != null, t => t.FileTypeId == querySystemDocument.FileTypeId); return await unionQuery.ToPagedListAsync(querySystemDocument.PageIndex, querySystemDocument.PageSize, querySystemDocument.SortField, querySystemDocument.Asc); } /// /// 项目下面的参与用户下拉 /// /// /// [HttpGet("{trialId:guid}")] public async Task> GetTrialUserSelect(Guid trialId) { return await _repository.Where(t => t.TrialId == trialId) .Select(t => new TrialUserDto() { UserId = t.UserId, RealName = t.User.LastName + " / " + t.User.FirstName, UserName = t.User.UserName }) .ToListAsync(); } /// /// 项目+系统的文档类型 下拉 /// /// /// [HttpGet("{trialId:guid}")] public async Task GetTrialDocAndSystemDocType(Guid trialId) { var result = await _trialDocumentRepository.Where(t => t.TrialId == trialId).Select(t => new { FileType = t.FileType.Value, t.FileTypeId }) .Union(_systemDocumentRepository.Select(t => new { FileType = t.FileType.Value, t.FileTypeId })) .ToListAsync(); return ResponseOutput.Ok(result); } public async Task AddOrUpdateTrialDocument(AddOrEditTrialDocument addOrEditTrialDocument) { if (addOrEditTrialDocument.Id == null) { var entity = _mapper.Map(addOrEditTrialDocument); if (await _trialDocumentRepository.AnyAsync(t => t.FileTypeId == addOrEditTrialDocument.FileTypeId && t.Name == addOrEditTrialDocument.Name && t.TrialId == addOrEditTrialDocument.TrialId, true)) { return ResponseOutput.NotOk("同类型已存在该文件名"); } await _repository.AddAsync(entity, true); return ResponseOutput.Ok(entity.Id.ToString()); } else { if (await _trialDocumentRepository.AnyAsync(t => t.FileTypeId == addOrEditTrialDocument.FileTypeId && t.Name == addOrEditTrialDocument.Name && t.Id != addOrEditTrialDocument.Id && t.TrialId == addOrEditTrialDocument.TrialId, true)) { return ResponseOutput.NotOk("同类型已存在该文件名"); } var document = _trialDocumentRepository.Where(t => t.Id == addOrEditTrialDocument.Id, true).Include(t => t.NeedConfirmedUserTypeList).FirstOrDefault(); if (document == null) return Null404NotFound(document); //var dbDocumentType = document.Type; _mapper.Map(addOrEditTrialDocument, document); if (document.FileTypeId != addOrEditTrialDocument.FileTypeId) { var rootPath = Directory.GetParent(_hostEnvironment.ContentRootPath.TrimEnd('\\')).IfNullThrowException().FullName; var beforeFilePath = Path.Combine(rootPath, document.Path); document.Path = document.Path.Replace(document.FileTypeId.ToString(), addOrEditTrialDocument.FileTypeId.ToString()); var nowPath = Path.Combine(rootPath, document.Path); if (File.Exists(beforeFilePath)) { File.Move(beforeFilePath, nowPath, true); File.Delete(beforeFilePath); } } var success = await _repository.SaveChangesAsync(); return ResponseOutput.Ok(document.Id.ToString()); } } /// /// 已签名的文档 不允许删除 /// /// /// /// [HttpDelete("{trialId:guid}/{trialDocumentId:guid}")] public async Task DeleteTrialDocument(Guid trialDocumentId, Guid trialId) { if (await _trialDocumentRepository.AsQueryable(true).Where(t => t.Id == trialDocumentId).AnyAsync(t => t.TrialDocConfirmedUserList.Any())) { return ResponseOutput.NotOk("该文档,已有用户签名 不允许删除"); } var success = await _trialDocumentRepository.BatchDeleteAsync(t => t.Id == trialDocumentId); return ResponseOutput.Result(success); } /// /// 浏览文档说明时调用,记录第一次看的时间 /// /// /// /// [HttpPut("{trialId:guid}/{documentId:guid}/{isSystemDoc:bool}")] [UnitOfWork] public async Task SetFirstViewDocumentTime(Guid documentId, bool isSystemDoc) { var success = false; if (isSystemDoc) { await _repository.AddAsync(new SystemDocConfirmedUser() { SystemDocumentId = documentId, SignFirstViewTime = DateTime.Now }); } else { await _repository.AddAsync(new TrialDocUserTypeConfirmedUser() { TrialDocumentId = documentId, SignFirstViewTime = DateTime.Now }); } success = await _repository.SaveChangesAsync(); return ResponseOutput.Result(success); } [HttpPut("{documentId:guid}")] public async Task SetSystemDocFirstViewTime(Guid documentId) { await _repository.AddAsync(new SystemDocConfirmedUser() { SystemDocumentId = documentId, SignFirstViewTime = DateTime.Now }); var success = await _repository.SaveChangesAsync(); return ResponseOutput.Result(success); } [HttpPut("{trialId:guid}/{documentId:guid}")] public async Task SetTrialDocFirstViewTime(Guid documentId) { await _repository.AddAsync(new TrialDocUserTypeConfirmedUser() { TrialDocumentId = documentId, SignFirstViewTime = DateTime.Now }); var success = await _repository.SaveChangesAsync(); return ResponseOutput.Result(success); } /// /// 用户 签名某个文档 /// /// public async Task UserConfirm(UserConfirmCommand userConfirmCommand) { var user = await _repository.FirstOrDefaultAsync(u => u.UserName == userConfirmCommand.UserName && u.Password == userConfirmCommand.PassWord); if (user == null) { return ResponseOutput.NotOk("password error"); } else if (user.Status == UserStateEnum.Disable) { return ResponseOutput.NotOk("The user has been disabled!"); } if (userConfirmCommand.isSystemDoc) { if (await _repository.AnyAsync(t => t.SystemDocumentId == userConfirmCommand.DocumentId && t.ConfirmUserId == _userInfo.Id)) { return ResponseOutput.NotOk("该文档已经签名"); } if (!await _systemDocumentRepository.AnyAsync(t => t.Id == userConfirmCommand.DocumentId) || await _trialDocumentRepository.AnyAsync(t => t.Id == userConfirmCommand.DocumentId && t.IsDeleted, true)) { return ResponseOutput.NotOk("文件已删除或者废除,签署失败!"); } await _repository.AddAsync(new SystemDocConfirmedUser() { ConfirmTime = DateTime.Now, ConfirmUserId = _userInfo.Id, SystemDocumentId = userConfirmCommand.DocumentId }); } else { if (await _repository.AnyAsync(t => t.TrialDocumentId == userConfirmCommand.DocumentId && t.ConfirmUserId == _userInfo.Id)) { return ResponseOutput.NotOk("该文档已经签名"); } if (!await _trialDocumentRepository.AnyAsync(t => t.Id == userConfirmCommand.DocumentId) || await _repository.AnyAsync(t => t.Id == userConfirmCommand.DocumentId && t.IsDeleted, true)) { return ResponseOutput.NotOk("文件已删除或者废除,签署失败!"); } await _repository.AddAsync(new TrialDocUserTypeConfirmedUser() { ConfirmTime = DateTime.Now, ConfirmUserId = _userInfo.Id, TrialDocumentId = userConfirmCommand.DocumentId }); } await _repository.SaveChangesAsync(); return ResponseOutput.Ok(); } /// /// 用户 废除某个文档 /// /// /// /// [HttpPut("{documentId:guid}/{isSystemDoc:bool}")] public async Task UserAbandonDoc(Guid documentId, bool isSystemDoc) { if (isSystemDoc) { await _repository.BatchUpdateAsync(t => t.Id == documentId, u => new SystemDocument() { IsDeleted = true }); } else { await _trialDocumentRepository.BatchUpdateAsync(t => t.Id == documentId, u => new TrialDocument() { IsDeleted = true }); } return ResponseOutput.Ok(); } /// /// 从项目下参与者的维度 先看人员列表(展示统计数字) 点击数字 再看人员具体签署的 系统文档+项目文档(共用上面与人相关的具体文档列表) /// /// /// [HttpGet("{trialId:guid}")] [Obsolete] public List GetTrialUserDocumentList(Guid trialId) { var query = _repository.Where(t => t.TrialId == trialId) .Select(t => new TrialUserUnionDocumentView() { UserId = t.UserId, UserName = t.User.UserName, RealName = t.User.LastName + " / " + t.User.FirstName, UserTypeShortName = t.User.UserTypeRole.UserTypeShortName, TrialDocumentCount = t.Trial.TrialDocumentList.Count(u => u.NeedConfirmedUserTypeList.Any(k => k.NeedConfirmUserTypeId == t.User.UserTypeId)), TrialDocumentConfirmedCount = t.Trial.TrialDocumentList.SelectMany(u => u.TrialDocConfirmedUserList).Count(k => k.ConfirmUserId == t.UserId), SystemDocumentConfirmedCount = t.User.SystemDocConfirmedList.Count(), //这样写不行 //SystemDocumentCount = _systemDocumentRepository.Where(s => s.NeedConfirmedUserTypeList.Any(kk => kk.NeedConfirmUserTypeId == t.User.UserTypeId)) // .WhereIf(!_userInfo.IsAdmin, s => s.IsAbandon == false || (s.IsAbandon == true && s.SystemDocConfirmedUserList.Any(uu => uu.ConfirmUserId == t.UserId))).Count() SystemDocumentCount = t.User.UserTypeRole.SystemDocNeedConfirmedUserTypeList.Where(cc => cc.NeedConfirmUserTypeId == t.User.UserTypeId).Select(y => y.SystemDocument).Count() }); return query.ToList(); } /// /// 从 文档的维度 先看到文档列表(系统文档+项目文档 以及需要确认的人数 和已经确认人数) 点击数字查看某文档下面人确认情况 /// /// /// [HttpPost] [Obsolete] public PageOutput GetTrialSystemDocumentList(DocumentTrialUnionQuery querySystemDocument) { var systemDocumentQueryable = _repository .WhereIf(!_userInfo.IsAdmin, t => t.IsDeleted == false) .Select(t => new DocumentUnionWithUserStatView() { Id = t.Id, IsSystemDoc = true, CreateTime = t.CreateTime, FullFilePath = t.Path + "?access_token=" + _userInfo.UserToken, IsDeleted = t.IsDeleted, Name = t.Name, Path = t.Path, FileType = t.FileType.Value, UpdateTime = t.UpdateTime, SignViewMinimumMinutes = t.SignViewMinimumMinutes, DocumentConfirmedUserCount = t.SystemDocConfirmedUserList.Count(), //DocumentUserCount= _trialUserRepository.Where(tu=>tu.TrialId== querySystemDocument.TrialId).Count(u=>t.NeedConfirmedUserTypeList.Any(cc=>cc.NeedConfirmUserTypeId== u.User.UserTypeId )) DocumentUserCount = t.NeedConfirmedUserTypeList.SelectMany(u => u.UserTypeRole.UserList.SelectMany(b => b.UserTrials.Where(r => r.TrialId == querySystemDocument.TrialId))).Count() }); var trialDocQueryable = _trialDocumentRepository.Where(t => t.TrialId == querySystemDocument.TrialId).Select(t => new DocumentUnionWithUserStatView() { Id = t.Id, IsSystemDoc = false, CreateTime = t.CreateTime, FullFilePath = t.Path + "?access_token=" + _userInfo.UserToken, IsDeleted = t.IsDeleted, Name = t.Name, Path = t.Path, FileType = t.FileType.Value, UpdateTime = t.UpdateTime, SignViewMinimumMinutes = t.SignViewMinimumMinutes, DocumentConfirmedUserCount = t.TrialDocConfirmedUserList.Count(), DocumentUserCount = t.Trial.TrialUserList.Count(cc => t.NeedConfirmedUserTypeList.Any(k => k.NeedConfirmUserTypeId == cc.User.UserTypeId)) }); var unionQuery = systemDocumentQueryable.Union(trialDocQueryable) .WhereIf(!string.IsNullOrEmpty(querySystemDocument.Name), t => t.Name.Contains(querySystemDocument.Name)) .WhereIf(querySystemDocument.FileTypeId != null, t => t.FileTypeId == querySystemDocument.FileTypeId); return unionQuery.ToPagedList(querySystemDocument.PageIndex, querySystemDocument.PageSize, querySystemDocument.SortField, querySystemDocument.Asc); } } }