合并
continuous-integration/drone/push Build is running Details

Uat_IRC_Net8
he 2025-02-24 13:44:57 +08:00
commit 8bbc8c449f
8 changed files with 156 additions and 44 deletions

View File

@ -25,6 +25,7 @@ using RestSharp;
using RestSharp.Authenticators; using RestSharp.Authenticators;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.Http; using System.Net.Http;
@ -200,10 +201,20 @@ namespace IRaCIS.Api.Controllers
var errorUrl = domainStrList[0] + "//" + domainStrList[2] + "/error"; var errorUrl = domainStrList[0] + "//" + domainStrList[2] + "/error";
if (lang == "zh")
{
CultureInfo.CurrentCulture = new CultureInfo(StaticData.CultureInfo.zh_CN);
CultureInfo.CurrentUICulture = new CultureInfo(StaticData.CultureInfo.zh_CN);
}
else
{
CultureInfo.CurrentCulture = new CultureInfo(StaticData.CultureInfo.en_US);
CultureInfo.CurrentUICulture = new CultureInfo(StaticData.CultureInfo.en_US);
}
if (!await _useRepository.AnyAsync(t => t.Id == Guid.Parse(userId) && t.EmailToken == token && t.IsFirstAdd)) if (!await _useRepository.AnyAsync(t => t.Id == Guid.Parse(userId) && t.EmailToken == token && t.IsFirstAdd))
{ {
decodeUrl = errorUrl + $"?lang={lang}&ErrorMessage={System.Web.HttpUtility.UrlEncode(lang == "zh" ? "" : "ErrorThe initialization link has expired.")} "; decodeUrl = errorUrl + $"?lang={lang}&ErrorMessage={System.Web.HttpUtility.UrlEncode(I18n.T("UserRedirect_InitializationLinkExpire"))} ";
} }
return Redirect(decodeUrl); return Redirect(decodeUrl);

View File

@ -1343,7 +1343,7 @@
<param name="_userInfo"></param> <param name="_userInfo"></param>
<param name="_localizer"></param> <param name="_localizer"></param>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.SysFileTypeService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SysFileType},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)"> <member name="M:IRaCIS.Core.Application.Service.SysFileTypeService.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.SysFileType},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.TrialFileType},AutoMapper.IMapper,IRaCIS.Core.Domain.Share.IUserInfo,Microsoft.Extensions.Localization.IStringLocalizer)">
<summary> <summary>
系统文件类型 系统文件类型
</summary> </summary>
@ -1459,11 +1459,11 @@
<param name="_userInfo"></param> <param name="_userInfo"></param>
<param name="_localizer"></param> <param name="_localizer"></param>
</member> </member>
<member name="M:IRaCIS.Core.Application.Service.TrialFileTypeService.CopySystemFileTypeToTrial(IRaCIS.Core.Application.ViewModel.CopySystemFileTypeToTrialInDto)"> <member name="M:IRaCIS.Core.Application.Service.TrialFileTypeService.GetTrialFileTypeSelectList(IRaCIS.Core.Application.ViewModel.TrialFileTypeSelectQuery)">
<summary> <summary>
复制系统数据到项目 获取项目文件类型下拉框
</summary> </summary>
<param name="inDto"></param> <param name="inQuery"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:IRaCIS.Core.Application.Service.TrialFinalRecordService"> <member name="T:IRaCIS.Core.Application.Service.TrialFinalRecordService">

View File

@ -7,15 +7,17 @@
using System; using System;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Reflection.Metadata;
namespace IRaCIS.Core.Application.ViewModel; namespace IRaCIS.Core.Application.ViewModel;
public class TrialFileTypeView : TrialFileTypeAddOrEdit public class TrialFileTypeView : TrialFileTypeAddOrEdit
{ {
public DateTime CreateTime { get; set; } public DateTime CreateTime { get; set; }
public DateTime UpdateTime { get; set; } public DateTime UpdateTime { get; set; }
} }
public class CopySystemFileTypeToTrialInDto public class CopySystemFileTypeToTrialInDto
@ -23,54 +25,79 @@ public class CopySystemFileTypeToTrialInDto
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
} }
public class TrialFileTypeSelectView
{
public Guid Id { get; set; }
public string Name { get; set; }
public bool IsEnable { get; set; }
public bool IsSelfDefine { get; set; }
public ArchiveType ArchiveTypeEnum { get; set; }
}
public class TrialFileTypeAddOrEdit public class TrialFileTypeAddOrEdit
{ {
public Guid? Id { get; set; } public Guid? Id { get; set; }
public ArchiveType ArchiveTypeEnum { get; set; } public ArchiveType ArchiveTypeEnum { get; set; }
public DateOnly FirstFinalDate { get; set; } public DateOnly FirstFinalDate { get; set; }
public bool IsConfirmRecord { get; set; } public bool IsConfirmRecord { get; set; }
public bool IsEnable { get; set; } public bool IsEnable { get; set; }
public bool IsSelfDefine { get; set; } public bool IsSelfDefine { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string NameCN { get; set; } public string NameCN { get; set; }
public SubIdentification SubIdentificationEnum { get; set; } public SubIdentification SubIdentificationEnum { get; set; }
public Guid? SysFileTypeId { get; set; } public Guid? SysFileTypeId { get; set; }
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
} }
public class TrialFileTypeQuery : PageInput public class TrialFileTypeQuery : PageInput
{ {
public ArchiveType? ArchiveTypeEnum { get; set; } public ArchiveType? ArchiveTypeEnum { get; set; }
public DateOnly? FirstFinalDate { get; set; } public DateOnly? FirstFinalDate { get; set; }
public bool? IsConfirmRecord { get; set; } public bool? IsConfirmRecord { get; set; }
public bool? IsEnable { get; set; } public bool? IsEnable { get; set; }
public bool? IsSelfDefine { get; set; } public bool? IsSelfDefine { get; set; }
public string? Name { get; set; } public string? Name { get; set; }
public string? NameCN { get; set; } public string? NameCN { get; set; }
public SubIdentification? SubIdentificationEnum { get; set; } public SubIdentification? SubIdentificationEnum { get; set; }
public Guid? SysFileTypeId { get; set; } [NotDefault]
public Guid TrialId { get; set; }
public Guid? TrialId { get; set; } }
}
public class TrialFileTypeSelectQuery
{
[NotDefault]
public Guid TrialId { get; set; }
public bool? IsEnable { get; set; }
public bool? IsSelfDefine { get; set; }
public ArchiveType? ArchiveTypeEnum { get; set; }
}

View File

@ -22,7 +22,7 @@ namespace IRaCIS.Core.Application.Service;
/// <param name="_localizer"></param> /// <param name="_localizer"></param>
[ApiExplorerSettings(GroupName = "FileRecord")] [ApiExplorerSettings(GroupName = "FileRecord")]
public class SysFileTypeService(IRepository<SysFileType> _sysFileTypeRepository, public class SysFileTypeService(IRepository<SysFileType> _sysFileTypeRepository, IRepository<TrialFileType> _trialFileTypeRepository,
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ISysFileTypeService IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ISysFileTypeService
{ {
@ -32,7 +32,13 @@ public class SysFileTypeService(IRepository<SysFileType> _sysFileTypeRepository,
{ {
var sysFileTypeQueryable = _sysFileTypeRepository var sysFileTypeQueryable = _sysFileTypeRepository
.ProjectTo<SysFileTypeView>(_mapper.ConfigurationProvider); .WhereIf(inQuery.ArchiveTypeEnum != null, t => t.ArchiveTypeEnum == inQuery.ArchiveTypeEnum)
.WhereIf(inQuery.IsConfirmRecord != null, t => t.IsConfirmRecord == inQuery.IsConfirmRecord)
.WhereIf(inQuery.SubIdentification != null, t => t.SubIdentification == inQuery.SubIdentification)
.WhereIf(inQuery.IsEnable != null, t => t.IsEnable == inQuery.IsEnable)
.WhereIf(inQuery.Name.IsNotNullOrEmpty(), t => t.Name.Contains(inQuery.Name))
.WhereIf(inQuery.NameCN.IsNotNullOrEmpty(), t => t.NameCN.Contains(inQuery.NameCN))
.ProjectTo<SysFileTypeView>(_mapper.ConfigurationProvider);
var pageList = await sysFileTypeQueryable.ToPagedListAsync(inQuery); var pageList = await sysFileTypeQueryable.ToPagedListAsync(inQuery);
@ -43,8 +49,23 @@ public class SysFileTypeService(IRepository<SysFileType> _sysFileTypeRepository,
public async Task<IResponseOutput> AddOrUpdateSysFileType(SysFileTypeAddOrEdit addOrEditSysFileType) public async Task<IResponseOutput> AddOrUpdateSysFileType(SysFileTypeAddOrEdit addOrEditSysFileType)
{ {
var verifyExp = new EntityVerifyExp<SysFileType>()
{
VerifyExp = u => u.IsEnable == addOrEditSysFileType.IsEnable && (u.Name == addOrEditSysFileType.Name || u.NameCN == addOrEditSysFileType.NameCN),
var entity = await _sysFileTypeRepository.InsertOrUpdateAsync(addOrEditSysFileType, true); // "当前类型启用的文件类型名称重复"
VerifyMsg = _localizer["SysFileType_NameRepeat"],
IsVerify = addOrEditSysFileType.IsEnable == false
};
var entity = await _sysFileTypeRepository.InsertOrUpdateAsync(addOrEditSysFileType, true, verifyExp);
//启用的才进行更新
if (addOrEditSysFileType.Id != null && addOrEditSysFileType.IsEnable)
{
await _trialFileTypeRepository.BatchUpdateNoTrackingAsync(t => t.SysFileTypeId == addOrEditSysFileType.Id, u => new TrialFileType() { Name = addOrEditSysFileType.Name, NameCN = addOrEditSysFileType.NameCN, });
}
return ResponseOutput.Ok(entity.Id.ToString()); return ResponseOutput.Ok(entity.Id.ToString());

View File

@ -32,22 +32,65 @@ public class TrialFileTypeService(IRepository<TrialFileType> _trialFileTypeRepos
{ {
var trialFileTypeQueryable = _trialFileTypeRepository var trialFileTypeQueryable = _trialFileTypeRepository
.ProjectTo<TrialFileTypeView>(_mapper.ConfigurationProvider); .Where(t => t.TrialId == inQuery.TrialId)
.WhereIf(inQuery.ArchiveTypeEnum != null, t => t.ArchiveTypeEnum == inQuery.ArchiveTypeEnum)
.WhereIf(inQuery.IsConfirmRecord != null, t => t.IsConfirmRecord == inQuery.IsConfirmRecord)
.WhereIf(inQuery.SubIdentification != null, t => t.SubIdentification == inQuery.SubIdentification)
.WhereIf(inQuery.IsEnable != null, t => t.IsEnable == inQuery.IsEnable)
.WhereIf(inQuery.Name.IsNotNullOrEmpty(), t => t.Name.Contains(inQuery.Name))
.WhereIf(inQuery.NameCN.IsNotNullOrEmpty(), t => t.NameCN.Contains(inQuery.NameCN))
.WhereIf(inQuery.IsSelfDefine != null, t => t.IsSelfDefine == inQuery.IsSelfDefine)
.ProjectTo<TrialFileTypeView>(_mapper.ConfigurationProvider);
var pageList = await trialFileTypeQueryable.ToPagedListAsync(inQuery); var pageList = await trialFileTypeQueryable.ToPagedListAsync(inQuery);
return pageList; return pageList;
} }
/// <summary>
/// 获取项目文件类型下拉框
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
public async Task<List<TrialFileTypeSelectView>> GetTrialFileTypeSelectList(TrialFileTypeSelectQuery inQuery)
{
var list = _trialFileTypeRepository
.Where(t => t.TrialId == inQuery.TrialId)
.WhereIf(inQuery.ArchiveTypeEnum != null, t => t.ArchiveTypeEnum == inQuery.ArchiveTypeEnum)
.WhereIf(inQuery.IsSelfDefine != null, t => t.IsSelfDefine == inQuery.IsSelfDefine)
.WhereIf(inQuery.IsEnable != null, t => t.IsEnable == inQuery.IsEnable)
.Select(t => new TrialFileTypeSelectView()
{
Id = t.Id,
IsEnable = t.IsEnable,
Name = _userInfo.IsEn_Us ? t.Name : t.NameCN,
IsSelfDefine = t.IsSelfDefine,
ArchiveTypeEnum = t.ArchiveTypeEnum,
}).ToList();
return list;
}
public async Task<IResponseOutput> AddOrUpdateTrialFileType(TrialFileTypeAddOrEdit addOrEditTrialFileType) public async Task<IResponseOutput> AddOrUpdateTrialFileType(TrialFileTypeAddOrEdit addOrEditTrialFileType)
{ {
// 在此处拷贝automapper 映射
var verifyExp = new EntityVerifyExp<TrialFileType>()
{
VerifyExp = u => u.IsEnable == addOrEditTrialFileType.IsEnable && (u.Name == addOrEditTrialFileType.Name || u.NameCN == addOrEditTrialFileType.NameCN),
// "当前类型启用的文件类型名称重复"
VerifyMsg = _localizer["TrialFileType_NameRepeat"],
IsVerify = addOrEditTrialFileType.IsEnable == false
};
var entity = await _trialFileTypeRepository.InsertOrUpdateAsync(addOrEditTrialFileType, true, verifyExp);
var entity = await _trialFileTypeRepository.InsertOrUpdateAsync(addOrEditTrialFileType, true);
return ResponseOutput.Ok(entity.Id.ToString()); return ResponseOutput.Ok(entity.Id.ToString());

View File

@ -53,7 +53,7 @@ namespace IRaCIS.Core.Application.Contracts
public string PermissionStr { get; set; } = string.Empty; public string PermissionStr { get; set; } = string.Empty;
public int Order { get; set; } public int Order { get; set; }
public bool IsEnable { get; set; }
public List<Guid> UserTypeGroupIdList { get; set; } = new List<Guid>(); public List<Guid> UserTypeGroupIdList { get; set; } = new List<Guid>();

View File

@ -334,14 +334,21 @@ namespace IRaCIS.Core.Application.Service
} }
////查找改邮箱或者手机的用户 ////查找改邮箱或者手机的用户
var exist = await _identityUserRepository.AnyAsync(t => t.EMail == email && t.Status == UserStateEnum.Enable); var existUser = await _identityUserRepository.Where(t => t.EMail == email && t.Status == UserStateEnum.Enable).FirstOrDefaultAsync();
if (!exist) if (existUser==null)
{ {
//---邮箱错误。 //---邮箱错误。
return ResponseOutput.NotOk(_localizer["User_EmailError"]); return ResponseOutput.NotOk(_localizer["User_EmailError"]);
} }
else
{
if (existUser.IsFirstAdd && existUser.UserName.IsNullOrEmpty())
{
return ResponseOutput.NotOk(_localizer["User_Notinitialized"]);
}
}
//验证码 6位 //验证码 6位
@ -937,9 +944,9 @@ namespace IRaCIS.Core.Application.Service
var userLoginReturnModel = new IRCLoginReturnDTO(); var userLoginReturnModel = new IRCLoginReturnDTO();
var loginUser = await _identityUserRepository.Where(u => u.UserName.Equals(userName) && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync(); var loginUser = await _identityUserRepository.Where(u => (u.UserName.Equals(userName) || u.EMail.Equals(userName)) && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
var existUserLoginInfo = await _identityUserRepository.Where(u => u.UserName == userName).Select(t => new { t.LastLoginIP, t.LastChangePassWordTime, t.Id }).FirstOrDefaultAsync(); var existUserLoginInfo = await _identityUserRepository.Where(u => u.UserName == userName ||u.EMail==userName).Select(t => new { t.LastLoginIP, t.LastChangePassWordTime, t.Id }).FirstOrDefaultAsync();
var isExistAccount = existUserLoginInfo != null; var isExistAccount = existUserLoginInfo != null;
@ -1013,13 +1020,13 @@ namespace IRaCIS.Core.Application.Service
await _identityUserRepository.BatchUpdateNoTrackingAsync(x => x.Id == loginUser.IdentityUserId, x => new IdentityUser() await _identityUserRepository.BatchUpdateNoTrackingAsync(x => x.Id == loginUser.IdentityUserId, x => new IdentityUser()
{ {
LastLoginTime = DateTime.Now, LastLoginTime = DateTime.Now,
LastLoginIP=_userInfo.IP, LastLoginIP = _userInfo.IP,
}); });
if (loginUser.Status == 0) if (loginUser.Status == 0)
{ {
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = loginUser.IdentityUserId, ActionUserName = userName, OptType = UserOptType.LoginLockedAccount, IsLoginUncommonly = isLoginUncommonly }, true); await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = loginUser.IdentityUserId, ActionUserName = loginUser.UserName, OptType = UserOptType.LoginLockedAccount, IsLoginUncommonly = isLoginUncommonly }, true);
//---该用户已经被禁用。 //---该用户已经被禁用。
return ResponseOutput.NotOk(_localizer["User_Disabled"], new IRCLoginReturnDTO()); return ResponseOutput.NotOk(_localizer["User_Disabled"], new IRCLoginReturnDTO());
@ -1029,7 +1036,7 @@ namespace IRaCIS.Core.Application.Service
await _fusionCache.SetAsync(cacheKey, 0, TimeSpan.FromMinutes(lockoutMinutes)); await _fusionCache.SetAsync(cacheKey, 0, TimeSpan.FromMinutes(lockoutMinutes));
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = loginUser.IdentityUserId, OptType = UserOptType.Login, IsLoginUncommonly = isLoginUncommonly }, true); await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = loginUser.IdentityUserId, ActionUserName=loginUser.UserName, OptType = UserOptType.Login, IsLoginUncommonly = isLoginUncommonly }, true);
userLoginReturnModel.BasicInfo = loginUser; userLoginReturnModel.BasicInfo = loginUser;

View File

@ -20,6 +20,7 @@ namespace IRaCIS.Core.Application.Contracts
{ {
var userTypeRoleQueryable = _userTypeRepository var userTypeRoleQueryable = _userTypeRepository
.WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin, t => t.IsEnable == true)
.WhereIf(!string.IsNullOrWhiteSpace(userTypeQuery.SearchFilter), t => t.Description.Contains(userTypeQuery.SearchFilter!) || t.UserTypeName.Contains(userTypeQuery.SearchFilter!) || t.UserTypeShortName.Contains(userTypeQuery.SearchFilter!)) .WhereIf(!string.IsNullOrWhiteSpace(userTypeQuery.SearchFilter), t => t.Description.Contains(userTypeQuery.SearchFilter!) || t.UserTypeName.Contains(userTypeQuery.SearchFilter!) || t.UserTypeShortName.Contains(userTypeQuery.SearchFilter!))
.WhereIf(userTypeQuery.GroupId != null, t => t.UserTypeGroupList.Any(t => t.DictionaryId == userTypeQuery.GroupId)) .WhereIf(userTypeQuery.GroupId != null, t => t.UserTypeGroupList.Any(t => t.DictionaryId == userTypeQuery.GroupId))
@ -158,7 +159,9 @@ namespace IRaCIS.Core.Application.Contracts
public async Task<List<TrialUserType>> GetTrialUserTypeList() public async Task<List<TrialUserType>> GetTrialUserTypeList()
{ {
//排除其他组的用户 //排除其他组的用户
var query = _userTypeRepository.Where(x => x.UserTypeEnum != UserTypeEnum.SuperAdmin) var query = _userTypeRepository
.WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin, t => t.IsEnable == true)
.Where(x => x.UserTypeEnum != UserTypeEnum.SuperAdmin)
.Where(t => !t.UserTypeGroupList.Any(t => t.Group.Code == "3")) .Where(t => !t.UserTypeGroupList.Any(t => t.Group.Code == "3"))
.OrderBy(t => t.UserTypeShortName).ProjectTo<TrialUserType>(_mapper.ConfigurationProvider); .OrderBy(t => t.UserTypeShortName).ProjectTo<TrialUserType>(_mapper.ConfigurationProvider);