//--------------------------------------------------------------------
// 此代码由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;
using DocumentFormat.OpenXml.Spreadsheet;
using IRaCIS.Core.Domain.Models;
namespace IRaCIS.Core.Application.Service
{
///
/// 项目外部人员 录入流程相关
///
[ApiExplorerSettings(GroupName = "Trial")]
public class TrialExternalUserService(IRepository _trialExternalUseRepository,
IRepository _userRoleRepository,
IRepository _identityUserRepository,
IRepository _trialUserRoleRepository,
IRepository _trialIdentityUserRepository,
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 _identityUserRepository.Where(t => t.EMail == addOrEditTrialExternalUser.Email, true).Include(t => t.UserRoleList).FirstOrDefaultAsync();
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 trialType = await _trialRepository.Where(t => t.Id == addOrEditTrialExternalUser.TrialId).Select(t => t.TrialType).FirstOrDefaultAsync();
if (existSysUser != null)
{
addEntity.IsSystemUser = true;
addEntity.SystemUserId = existSysUser.Id;
if (!existSysUser.UserRoleList.Any(t => t.UserTypeId == addOrEditTrialExternalUser.UserTypeId))
{
var addRole = _mapper.Map(existSysUser);
addRole.UserTypeEnum = _userTypeRepository.Where(t => t.Id == addOrEditTrialExternalUser.UserTypeId).Select(t => t.UserTypeEnum).First();
addRole.UserTypeId = addOrEditTrialExternalUser.UserTypeId;
addRole.IsUserRoleDisabled = true;
existSysUser.UserRoleList.Add(addRole);
}
}
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.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10));
generateUser.Status = UserStateEnum.Disable;
var addRole = _mapper.Map(generateUser);
addRole.UserTypeEnum = _userTypeRepository.Where(t => t.Id == addOrEditTrialExternalUser.UserTypeId).Select(t => t.UserTypeEnum).First();
addRole.UserTypeId = addOrEditTrialExternalUser.UserTypeId;
generateUser.UserRoleList = new List() { addRole };
var newAddUser = await _identityUserRepository.AddAsync(generateUser);
addEntity.IsSystemUser = false;
addEntity.SystemUserId = newAddUser.Id;
existSysUser = newAddUser;
}
#region 验证用户 能否加入
if (trialType == TrialType.OfficialTrial || trialType == TrialType.Training)
{
if (existSysUser.IsTestUser)
{
//---正式类型 、培训类型的项目 不允许加入测试用户
throw new BusinessValidationFailedException(_localizer["TrialExternalUser_TestUserNotAllowed"]);
}
}
if (trialType == TrialType.NoneOfficial)
{
if (existSysUser.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,
UserTypeId=addOrEditTrialExternalUser.UserTypeId
}
}
});
}
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 _trialIdentityUserRepository.AnyAsync(t => t.TrialId == trialExternalUser.TrialId && t.IdentityUserId == 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;
var userTypeId = userInfo.UserTypeId;
var findTrialUser = await _trialIdentityUserRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.IdentityUserId == userId, true);
var findUserRoleId = await _identityUserRepository.Where(t => t.Id == userId, true).SelectMany(t => t.UserRoleList).Where(t => t.UserTypeId == userTypeId).Select(t => t.Id).FirstOrDefaultAsync();
if (findTrialUser == null || findUserRoleId == Guid.Empty)
{
return ResponseOutput.NotOk("database dirty data ");
}
else
{
var findTrialUserRole = await _trialUserRoleRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.UserRole.IdentityUserId == userId && t.UserRole.UserTypeId == userTypeId, true);
if (findTrialUserRole == null)
{
await _trialUserRoleRepository.AddAsync(new TrialUserRole() { TrialId = trialId, TrialUserId = findTrialUser.Id, UserId = findUserRoleId, JoinTime = DateTime.Now });
await _userRoleRepository.BatchUpdateNoTrackingAsync(t => t.IdentityUserId == userId, u => new UserRole() { Status = UserStateEnum.Enable });
await _trialExternalUseRepository.BatchUpdateNoTrackingAsync(t => t.Id == userInfo.Id, u => new TrialExternalUser() { IsJoin = true });
await _userRoleRepository.SaveChangesAsync();
}
}
}
foreach (var item in sendEmail.SendUsers.GroupBy(t => t.SystemUserId))
{
await _mailVerificationService.ExternalUserJoinEmail(trialId, item.Key, sendEmail.BaseUrl, sendEmail.RouteUrl);
}
return ResponseOutput.Ok();
}
}
}