//-------------------------------------------------------------------- // 此代码由T4模板自动生成 byzhouhang 20210918 // 生成时间 2022-03-04 13:33:56 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 //-------------------------------------------------------------------- using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Interfaces; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using Medallion.Threading; using Microsoft.AspNetCore.Mvc; namespace IRaCIS.Core.Application.Service { /// /// 项目外部人员 录入流程相关 /// [ApiExplorerSettings(GroupName = "Trial")] public class TrialExternalUserService(IRepository _trialExternalUseRepository, IRepository _userRoleRepository, IRepository _trialUserRepository, IRepository _trialRepository, IRepository _userTypeRepository, IMailVerificationService _mailVerificationService, IDistributedLockProvider _distributedLockProvider, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ITrialExternalUserService { [HttpPost] public async Task> GetTrialExternalUserList(TrialExternalUserQuery queryTrialExternalUser) { var trialExternalUserQueryable = _trialExternalUseRepository.Where(t => t.TrialId == queryTrialExternalUser.TrialId) .WhereIf(!string.IsNullOrEmpty(queryTrialExternalUser.Phone), t => t.Phone.Contains(queryTrialExternalUser.Phone)) .WhereIf(!string.IsNullOrEmpty(queryTrialExternalUser.Email), t => t.Email.Contains(queryTrialExternalUser.Email)) .WhereIf(!string.IsNullOrEmpty(queryTrialExternalUser.Name), t => (t.LastName + " / " + t.FirstName).Contains(queryTrialExternalUser.Name)) .ProjectTo(_mapper.ConfigurationProvider); return await trialExternalUserQueryable.ToListAsync(); } /// /// 添加和更新接口 已验证邮箱和账户类型不允许添加重复项 /// /// /// //[Authorize(Policy = IRaCISPolicy.PM_APM)] [UnitOfWork] [TrialGlobalLimit( "AfterStopCannNotOpt" )] public async Task AddOrUpdateTrialExternalUser(TrialExternalUserAddAndSendEmail addOrEditTrialExternalUser) { if (addOrEditTrialExternalUser.Id == null) { var @lock = _distributedLockProvider.CreateLock($"UserCode"); using (await @lock.AcquireAsync()) { var existSysUser = await _userRoleRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId); if (existSysUser != null) { if (existSysUser.LastName != addOrEditTrialExternalUser.LastName || existSysUser.FirstName != addOrEditTrialExternalUser.FirstName) { //$"该用户在系统中的用户名为:{existSysUser.LastName + " / " + existSysUser.FirstName} 电话:{existSysUser.Phone},与填写信息存在不一致项, 请将界面信息修改为与系统一致,再进行保存", return ResponseOutput.NotOk(_localizer["TrialExternalUser_Inconsistency", existSysUser.LastName + " / " + existSysUser.FirstName, existSysUser.Phone], new { existSysUser.LastName, existSysUser.FirstName, existSysUser.Phone, existSysUser.IsZhiZhun, existSysUser.IsTestUser }, ApiResponseCodeEnum.NeedTips); } } //处理 生成账户 if (await _trialExternalUseRepository.AnyAsync(t => t.Email == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId && t.TrialId == addOrEditTrialExternalUser.TrialId)) { //---系统已经存在与列表中填写的邮箱和用户类型相同的账户,请确认。 return ResponseOutput.NotOk(_localizer["TrialExternalUser_EmailTypeDuplicate"]); } var addEntity = _mapper.Map(addOrEditTrialExternalUser); await _trialExternalUseRepository.AddAsync(addEntity); var existUser = await _userRoleRepository.FirstOrDefaultAsync(t => t.EMail == addOrEditTrialExternalUser.Email && t.UserTypeId == addOrEditTrialExternalUser.UserTypeId); var trialType = await _trialRepository.Where(t => t.Id == addOrEditTrialExternalUser.TrialId).Select(t => t.TrialType).FirstOrDefaultAsync(); if (existUser != null) { addEntity.IsSystemUser = true; addEntity.SystemUserId = existUser.Id; } else { //生成账户 并插入 var generateUser = _mapper.Map(addOrEditTrialExternalUser); if (trialType == TrialType.NoneOfficial) { generateUser.IsTestUser = true; } // 外部人员生成账号 都是外部的 generateUser.IsZhiZhun = false; generateUser.Code = _userRoleRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1; generateUser.UserCode = AppSettings.GetCodeStr(generateUser.Code, nameof(UserRole)); generateUser.UserName = generateUser.UserCode; generateUser.UserTypeEnum = _userTypeRepository.Where(t => t.Id == generateUser.UserTypeId).Select(t => t.UserTypeEnum).First(); generateUser.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10)); generateUser.Status = UserStateEnum.Disable; var newAddUser = await _userRoleRepository.AddAsync(generateUser); addEntity.IsSystemUser = false; addEntity.SystemUserId = newAddUser.Id; existUser = newAddUser; } #region 验证用户 能否加入 if (trialType == TrialType.OfficialTrial || trialType == TrialType.Training) { if (existUser.IsTestUser) { //---正式类型 、培训类型的项目 不允许加入测试用户 throw new BusinessValidationFailedException(_localizer["TrialExternalUser_TestUserNotAllowed"]); } } if (trialType == TrialType.NoneOfficial) { if (existUser.IsTestUser == false) { //---测试项目 不允许加入正式用户 throw new BusinessValidationFailedException(_localizer["TrialExternalUser_FormalUserNotAllowed"]); } } #endregion await _trialExternalUseRepository.SaveChangesAsync(); //添加的时候就发邮件 现在省略 if (addOrEditTrialExternalUser.IsSendEmail) { await SendExternalUserJoinEmail(new TrialExternalUserSendEmail() { BaseUrl = addOrEditTrialExternalUser.BaseUrl, RouteUrl = addOrEditTrialExternalUser.RouteUrl, TrialId = addOrEditTrialExternalUser.TrialId, SendUsers = new List() { new UserEmail() { Id = addEntity.Id, Email=addEntity.Email, IsSystemUser=addEntity.IsSystemUser, SystemUserId=addEntity.SystemUserId } } }); } return ResponseOutput.Ok(addEntity.Id.ToString()); } } else { //---人员信息不支持编辑,请删除后重新添加。 return ResponseOutput.NotOk(_localizer["TrialExternalUser_NotEditable"]); } } [HttpDelete("{trialExternalUserId:guid}/{isSystemUser:bool}/{systemUserId}")] //[Authorize(Policy = IRaCISPolicy.PM_APM)] public async Task DeleteTrialExternalUser(Guid trialExternalUserId, bool isSystemUser, Guid systemUserId) { var trialExternalUser = await _trialExternalUseRepository.FirstOrDefaultAsync(t => t.Id == trialExternalUserId); if (await _trialUserRepository.AnyAsync(t => t.TrialId == trialExternalUser.TrialId && t.UserId == trialExternalUser.SystemUserId)) { //---当前用户已参与到项目,不允许删除 return ResponseOutput.NotOk(_localizer["TrialExternalUser_CannotDelete"]); } var success = await _trialExternalUseRepository.BatchDeleteNoTrackingAsync(t => t.Id == trialExternalUserId); if (isSystemUser == false) { await _userRoleRepository.BatchDeleteNoTrackingAsync(t => t.Id == systemUserId); } return ResponseOutput.Result(success); } //New 省掉邀请流程 [HttpPost] //[Authorize(Policy = IRaCISPolicy.PM_APM)] [TrialGlobalLimit( "AfterStopCannNotOpt" )] [UnitOfWork] public async Task SendExternalUserJoinEmail(TrialExternalUserSendEmail sendEmail) { var trialId = sendEmail.TrialId; foreach (var userInfo in sendEmail.SendUsers) { var userId = userInfo.SystemUserId; //判断TrialUser中是否存在 不存在就插入 注意退出了,也不能再加进来 if (!await _trialUserRepository.AnyAsync(t => t.TrialId == trialId && t.UserId == userId, true)) { await _trialUserRepository.AddAsync(new TrialUser() { TrialId = trialId, UserId = userId, JoinTime = DateTime.Now }); await _userRoleRepository.BatchUpdateNoTrackingAsync(t => t.Id == userId, u => new UserRole() { Status = UserStateEnum.Enable }); await _trialExternalUseRepository.BatchUpdateNoTrackingAsync(t => t.Id == userInfo.Id, u => new TrialExternalUser() { IsJoin = true }); await _userRoleRepository.SaveChangesAsync(); } await _mailVerificationService.ExternalUserJoinEmail(trialId, userId, sendEmail.BaseUrl, sendEmail.RouteUrl); } return ResponseOutput.Ok(); } } }