420 lines
18 KiB
C#
420 lines
18 KiB
C#
//--------------------------------------------------------------------
|
||
// 此代码由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;
|
||
using IRaCIS.Application.Contracts;
|
||
using MassTransit;
|
||
using System.Globalization;
|
||
|
||
namespace IRaCIS.Core.Application.Service
|
||
{
|
||
/// <summary>
|
||
/// 项目外部人员 录入流程相关
|
||
/// </summary>
|
||
[ApiExplorerSettings(GroupName = "Trial")]
|
||
public class TrialExternalUserService(IRepository<TrialExternalUser> _trialExternalUseRepository,
|
||
IRepository<UserRole> _userRoleRepository,
|
||
IRepository<IdentityUser> _identityUserRepository,
|
||
IRepository<TrialUserRole> _trialUserRoleRepository,
|
||
IRepository<TrialIdentityUser> _trialIdentityUserRepository,
|
||
IRepository<Trial> _trialRepository,
|
||
IRepository<UserType> _userTypeRepository,
|
||
IRepository<UserLog> _userLogRepository,
|
||
IMailVerificationService _mailVerificationService,
|
||
IDistributedLockProvider _distributedLockProvider, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ITrialExternalUserService
|
||
{
|
||
|
||
|
||
|
||
|
||
[HttpPost]
|
||
public async Task<List<TrialExternalUserView>> 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<TrialExternalUserView>(_mapper.ConfigurationProvider);
|
||
|
||
return await trialExternalUserQueryable.ToListAsync();
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 添加和更新接口 已验证邮箱和账户类型不允许添加重复项
|
||
/// </summary>
|
||
/// <param name="addOrEditTrialExternalUser"></param>
|
||
/// <returns></returns>
|
||
//[Authorize(Policy = IRaCISPolicy.PM_APM)]
|
||
[UnitOfWork]
|
||
[TrialGlobalLimit("AfterStopCannNotOpt")]
|
||
public async Task<IResponseOutput> 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.OrganizationName, 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<TrialExternalUser>(addOrEditTrialExternalUser);
|
||
|
||
await _trialExternalUseRepository.AddAsync(addEntity);
|
||
|
||
if (existSysUser != null)
|
||
{
|
||
addEntity.IsSystemUser = true;
|
||
addEntity.SystemUserId = existSysUser.Id;
|
||
}
|
||
|
||
var trialType = await _trialRepository.Where(t => t.Id == addOrEditTrialExternalUser.TrialId).Select(t => t.TrialType).FirstOrDefaultAsync();
|
||
|
||
#region 验证用户 能否加入
|
||
|
||
if (trialType == TrialType.OfficialTrial || trialType == TrialType.Training)
|
||
{
|
||
|
||
if (existSysUser != null && existSysUser.IsTestUser)
|
||
{
|
||
//---正式类型 、培训类型的项目 不允许加入测试用户
|
||
throw new BusinessValidationFailedException(_localizer["TrialExternalUser_TestUserNotAllowed"]);
|
||
|
||
}
|
||
}
|
||
|
||
if (trialType == TrialType.NoneOfficial)
|
||
{
|
||
|
||
if (existSysUser != null && 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<UserEmail>()
|
||
{
|
||
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<IResponseOutput> 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);
|
||
|
||
|
||
return ResponseOutput.Result(success);
|
||
}
|
||
|
||
|
||
//New 省掉邀请流程
|
||
[HttpPost]
|
||
//[Authorize(Policy = IRaCISPolicy.PM_APM)]
|
||
[TrialGlobalLimit("AfterStopCannNotOpt")]
|
||
[UnitOfWork]
|
||
public async Task<IResponseOutput> SendExternalUserJoinEmail(TrialExternalUserSendEmail sendEmail)
|
||
{
|
||
var trialId = sendEmail.TrialId;
|
||
|
||
var trialType = await _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefaultAsync();
|
||
|
||
foreach (var item in sendEmail.SendUsers.GroupBy(t => t.Email))
|
||
{
|
||
|
||
var userEmail = item.Key;
|
||
|
||
var userTypeIdList = item.Select(t => t.UserTypeId).ToList();
|
||
|
||
var itemFirst = item.FirstOrDefault();
|
||
|
||
var externalIdList = item.Select(t => t.Id).ToList();
|
||
|
||
|
||
//var identityUserId = item.Key;
|
||
|
||
|
||
|
||
var existSysUser = await _identityUserRepository.Where(t => t.EMail == userEmail, true).Include(t => t.UserRoleList).FirstOrDefaultAsync();
|
||
|
||
//需要创建新的账户
|
||
var isNeedCreateNewUser = existSysUser == null;
|
||
|
||
if (existSysUser != null)
|
||
{
|
||
|
||
//账号状态设置为启用
|
||
existSysUser.Status = UserStateEnum.Enable;
|
||
|
||
foreach (var userTypeId in userTypeIdList)
|
||
{
|
||
var findRole = existSysUser.UserRoleList.FirstOrDefault(t => t.UserTypeId == userTypeId);
|
||
|
||
if (findRole != null)
|
||
{
|
||
//存在该角色,设置为启用
|
||
findRole.IsUserRoleDisabled = false;
|
||
}
|
||
else
|
||
{
|
||
//不存在该角色,那么就添加
|
||
var addRole = _mapper.Map<UserRole>(existSysUser);
|
||
addRole.UserTypeEnum = _userTypeRepository.Where(t => t.Id == userTypeId).Select(t => t.UserTypeEnum).First();
|
||
addRole.UserTypeId = userTypeId;
|
||
addRole.IsUserRoleDisabled = false;
|
||
existSysUser.UserRoleList.Add(addRole);
|
||
}
|
||
}
|
||
|
||
//防止已经生成账号的信息与外部人员信息不一致 在此默认批量更一下
|
||
|
||
await _trialExternalUseRepository.BatchUpdateNoTrackingAsync(t => externalIdList.Contains(t.Id), u => new TrialExternalUser()
|
||
{
|
||
FirstName = existSysUser.FirstName,
|
||
LastName = existSysUser.LastName,
|
||
Phone = existSysUser.Phone,
|
||
OrganizationName = existSysUser.OrganizationName
|
||
});
|
||
}
|
||
else
|
||
{
|
||
|
||
//生成账户 并插入
|
||
var externalUser = await _trialExternalUseRepository.FirstOrDefaultAsync(t => t.Id == itemFirst.Id);
|
||
var generateUser = _mapper.Map<IdentityUser>(externalUser);
|
||
|
||
if (trialType == TrialType.NoneOfficial)
|
||
{
|
||
generateUser.IsTestUser = true;
|
||
}
|
||
|
||
//外部人员语言类型,根据PM创建时界面语言决定
|
||
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
|
||
generateUser.UserWorkLanguage = isEn_US ? UserWorkLanguage.US : UserWorkLanguage.CN;
|
||
|
||
|
||
// 外部人员生成账号 都是外部的
|
||
generateUser.IsZhiZhun = false;
|
||
|
||
generateUser.Code = _identityUserRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1;
|
||
|
||
generateUser.UserCode = AppSettings.GetCodeStr(generateUser.Code, nameof(IdentityUser));
|
||
|
||
//generateUser.UserName = generateUser.UserCode;
|
||
|
||
generateUser.UserCeateSource = UserCeateSource.External;
|
||
generateUser.TrialId = trialId;
|
||
generateUser.Password = MD5Helper.Md5(IRCEmailPasswordHelper.GenerateRandomPassword(10));
|
||
|
||
generateUser.Status = UserStateEnum.Enable;
|
||
|
||
generateUser.UserRoleList = new List<UserRole>() { };
|
||
|
||
foreach (var userTypeId in userTypeIdList)
|
||
{
|
||
var addRole = _mapper.Map<UserRole>(generateUser);
|
||
|
||
addRole.Id = NewId.NextSequentialGuid();
|
||
addRole.UserTypeEnum = _userTypeRepository.Where(t => t.Id == userTypeId).Select(t => t.UserTypeEnum).First();
|
||
addRole.UserTypeId = userTypeId;
|
||
|
||
generateUser.UserRoleList.Add(addRole);
|
||
}
|
||
|
||
var newAddUser = await _identityUserRepository.AddAsync(generateUser);
|
||
|
||
|
||
|
||
existSysUser = newAddUser;
|
||
|
||
await _trialExternalUseRepository.BatchUpdateNoTrackingAsync(t => externalIdList.Contains(t.Id), u => new TrialExternalUser()
|
||
{
|
||
IsSystemUser = false,
|
||
SystemUserId = newAddUser.Id,
|
||
FirstName = existSysUser.FirstName,
|
||
LastName = existSysUser.LastName,
|
||
OrganizationName = existSysUser.OrganizationName,
|
||
Phone = existSysUser.Phone,
|
||
});
|
||
|
||
}
|
||
|
||
await _identityUserRepository.SaveChangesAsync();
|
||
|
||
|
||
var identityUserId = existSysUser.Id;
|
||
|
||
|
||
var userTypeList = await _identityUserRepository.Where(t => t.Id == identityUserId).SelectMany(t => t.UserRoleList).Select(t => new { t.UserTypeId, t.UserTypeRole.UserTypeName, t.UserTypeRole.UserTypeShortName }).ToListAsync();
|
||
|
||
var userHaveUserTypeIdList = userTypeList.Select(t => t.UserTypeId).ToList();
|
||
|
||
if (userTypeIdList.Except(userHaveUserTypeIdList).Any())
|
||
{
|
||
return ResponseOutput.NotOk("database dirty data ");
|
||
}
|
||
|
||
var findTrialUser = await _trialIdentityUserRepository.Where(t => t.TrialId == trialId && t.IdentityUserId == identityUserId, true, true).Include(t => t.TrialUserRoleList).ThenInclude(t => t.UserRole).FirstOrDefaultAsync();
|
||
|
||
if (findTrialUser == null)
|
||
{
|
||
//没有项目参与人员
|
||
findTrialUser = await _trialIdentityUserRepository.AddAsync(new TrialIdentityUser()
|
||
{
|
||
IdentityUserId = identityUserId,
|
||
TrialId = trialId,
|
||
JoinTime = DateTime.Now,
|
||
|
||
TrialUserRoleList = userTypeIdList.Select(u => new TrialUserRole()
|
||
{
|
||
TrialId = trialId,
|
||
UserId = existSysUser.UserRoleList.FirstOrDefault(t => t.UserTypeId == u).Id,
|
||
|
||
}).ToList()
|
||
});
|
||
}
|
||
else
|
||
{
|
||
//有该人员
|
||
|
||
if (findTrialUser.IsDeleted == true)
|
||
{
|
||
findTrialUser.IsDeleted = false;
|
||
findTrialUser.DeletedTime = null;
|
||
findTrialUser.RemoveTime = null;
|
||
findTrialUser.JoinTime = DateTime.Now;
|
||
}
|
||
|
||
//是否有该角色
|
||
|
||
foreach (var userTypeId in userTypeIdList)
|
||
{
|
||
var findTrialUserRole = findTrialUser.TrialUserRoleList.Where(t => t.UserRole?.UserTypeId == userTypeId).FirstOrDefault();
|
||
|
||
if (findTrialUserRole == null)
|
||
{
|
||
//添加该角色
|
||
findTrialUser.TrialUserRoleList.Add(new TrialUserRole() { TrialUserId = findTrialUser.Id, TrialId = trialId, UserId = existSysUser.UserRoleList.FirstOrDefault(t => t.UserTypeId == userTypeId).Id });
|
||
}
|
||
else
|
||
{
|
||
//如果禁用,那么启用
|
||
if (findTrialUserRole.IsDeleted == true)
|
||
{
|
||
findTrialUserRole.IsDeleted = false;
|
||
findTrialUserRole.DeletedTime = null;
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
await _trialIdentityUserRepository.SaveChangesAsync();
|
||
|
||
|
||
var usertyps = string.Join(',', userTypeList.Where(t => userTypeIdList.Contains(t.UserTypeId)).Select(t => t.UserTypeName));
|
||
|
||
await _mailVerificationService.ExternalUserJoinEmail(trialId, identityUserId, usertyps, sendEmail.BaseUrl, sendEmail.RouteUrl);
|
||
|
||
await _trialExternalUseRepository.BatchUpdateNoTrackingAsync(t => externalIdList.Contains(t.Id), u => new TrialExternalUser() { IsJoin = true });
|
||
|
||
//创建账号 和创建角色 一条,更新的时候才记录更新角色
|
||
if (isNeedCreateNewUser == false)
|
||
{
|
||
await _userLogRepository.AddAsync(new UserLog() { IP = _userInfo.IP, ActionIdentityUserId = _userInfo.IdentityUserId, ActionUserName = _userInfo.UserName, TargetIdentityUserId = identityUserId, OptType = UserOptType.UpdateUserRole }, true);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
return ResponseOutput.Ok();
|
||
|
||
}
|
||
}
|
||
}
|