Browse Source

[MODIFY]增加用户手机号校验

dev-zzj
zhaozhenjing 2 months ago
parent
commit
a48ae2e79a
  1. 47
      src/2.services/ATS.NonCustodial.Application/Impl/Admins/SMSService.cs
  2. 82
      src/2.services/ATS.NonCustodial.Application/Impl/Admins/UserService.cs
  3. 9
      src/3.contracts/ATS.NonCustodial.Application.Contracts/Interfaces/Admins/SMS/ISMSService.cs
  4. 5
      src/3.contracts/ATS.NonCustodial.Application.Contracts/Interfaces/Admins/User/Input/UserAddInput.cs
  5. 5
      src/3.contracts/ATS.NonCustodial.Application.Contracts/Interfaces/Admins/User/Input/UserUpdateInput.cs

47
src/2.services/ATS.NonCustodial.Application/Impl/Admins/SMSService.cs

@ -130,9 +130,8 @@ namespace ATS.NonCustodial.Application.Impl.Admins
.WhereIf(pageInput.SendTimeTo.HasValue, w => w.sendTime <= pageInput.SendTimeTo);
return query;
}
/// <summary>
/// 发送验证码
/// 被监管人登录发送验证码
/// </summary>
/// <param name="phone"></param>
/// <param name="ipAddress"></param>
@ -160,16 +159,56 @@ namespace ATS.NonCustodial.Application.Impl.Admins
select new { b.SupervisedPersonId }).ToListAsync();
if (datalist.Count == 0) return ResultOutput.NotOk("该手机号不存在运行中的案件");
// 生成随机验证码(6位数字)
var random = new Random();
var code = random.Next(100000, 999999).ToString();
var name = personList.Where(w => datalist.Select(s => s.SupervisedPersonId).Contains(w.Id))?.FirstOrDefault().UserName ?? "";
var sendMessage = $"您的验证码为:{code},请于五分钟内填写,若非本人操作,请勿泄露。";
// 创建验证码记录
var addSMS = new AppSMS
{
phone = phone,
code = code,
sendTime = DateTime.Now,
expiresTime = DateTime.Now.AddMinutes(5), // 5分钟有效期
ipAddress = ipAddress,
type = type,
receiver = name,
content = sendMessage
};
var sendResult = SendSmsAsync(sendMessage, phone);
// 发送短信
// var sendResult = SendSMS(phone, new string[] { code, "5" }, "2524683");
addSMS.result = sendResult.Result;
var sms = await _appSMSRepository.InsertAsync(addSMS);
return ResultOutput.Ok(true);
}
/// <summary>
/// 监管人创建新用户或更改手机号发送验证码
/// </summary>
/// <param name="phone"></param>
/// <param name="ipAddress"></param>
/// <param name="type"></param>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public async Task<IResultOutput> SendCheckCode(string phone, string ipAddress = "", string type = "CheckCode")
{
// 检查是否可以发送(一分钟内只能发送一次)
if (!await CanSendCodeAsync(phone))
{
return ResultOutput.NotOk("请求过于频繁,请稍后再试");
}
// 生成随机验证码(6位数字)
var random = new Random();
var code = random.Next(100000, 999999).ToString();
var name = personList.Where(w => datalist.Select(s => s.SupervisedPersonId).Contains(w.Id))?.FirstOrDefault().UserName ?? "";
var name = "新用户注册";
var sendMessage = $"您的验证码为:{code},请于五分钟内填写,若非本人操作,请勿泄露。";
// 创建验证码记录
@ -225,7 +264,7 @@ namespace ATS.NonCustodial.Application.Impl.Admins
if (alert == MessageAlertTypeEnum.Alert)
{
//[预警处理提醒] {1}您好,您于{2}年{3}月{4}日触发的{5}预警需及时处理,请尽快核查并修正相关事项。
sendMessage = $"[预警处理提醒] {supervisedPerson}您好,您于{date}触发的{msg}预警需及时处理,请尽快核查并修正相关事项。";
sendMessage = $"[预警处理提醒] {supervisedPerson}您好,您于{date}触发的{msg}预警需及时处理,请尽快核查并遵守规定。";
addSMS.type = "Alert";
addSMS.receiver = supervisedPerson;
}

82
src/2.services/ATS.NonCustodial.Application/Impl/Admins/UserService.cs

@ -4,11 +4,17 @@ using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.AppDictionaries.O
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Auth.Output;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Menu.Output;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.Role.Output;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.SMS;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.User;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.User.Input;
using ATS.NonCustodial.Application.Contracts.Interfaces.Admins.User.Output;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.AppCaseManagements.AppCaseManagement;
using ATS.NonCustodial.Application.Contracts.Interfaces.Business.PunchRecordServices.Output;
using ATS.NonCustodial.Application.Impl.Business.CaseManagements;
using ATS.NonCustodial.Domain.Entities.Admins;
using ATS.NonCustodial.Domain.Entities.Business.CaseManagements;
using ATS.NonCustodial.Domain.Shared.AggRootEntities.Dtos;
using ATS.NonCustodial.Domain.Shared.Enums;
using ATS.NonCustodial.Domain.Shared.OrmRepositories.Basic.EfCore;
using ATS.NonCustodial.DynamicApi;
using ATS.NonCustodial.DynamicApi.Attributes;
@ -28,6 +34,7 @@ using Castle.Components.DictionaryAdapter;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using StackExchange.Profiling.Internal;
using Yitter.IdGenerator;
namespace ATS.NonCustodial.Application.Impl.Admins
@ -50,16 +57,21 @@ namespace ATS.NonCustodial.Application.Impl.Admins
private readonly IEfRepository<AppRolePermission?, long> _rolePermissionRepository;
private readonly IEfRepository<App_Menu?, long> _MenuRepository;
private readonly IAppDictionaryService _appDictionaryService;
private readonly ISMSService _smsService;
private readonly IEfRepository<AppCaseManagement, long> _appCaseManagementRepository;
private readonly IEfRepository<AppCaseSupervisedPerson, long> _appSupervisedPersonRepository;
public UserService(
IEfRepository<AppUser?, long> userRepository,
IEfRepository<AppUser?, long> userRepository, IEfRepository<AppCaseManagement, long> appCaseManagementRepository,
IEfRepository<AppCaseSupervisedPerson, long> appSupervisedPersonRepository,
IEfRepository<AppUserRole?, long> userRoleRepository,
IEfRepository<AppApi?, long> apiRepository,
IEfRepository<AppRole?, long> roleRepository,
IEfRepository<AppPermissionApi?, long> permissionApiRepository,
IEfRepository<AppRolePermission?, long> rolePermissionRepository,
IEfRepository<App_Menu?, long> MenuRepository,
IAppDictionaryService appDictionaryService
IAppDictionaryService appDictionaryService,
ISMSService smsService
)
{
_userRepository = userRepository;
@ -70,6 +82,10 @@ namespace ATS.NonCustodial.Application.Impl.Admins
_rolePermissionRepository = rolePermissionRepository;
_appDictionaryService = appDictionaryService;
_MenuRepository = MenuRepository;
_smsService = smsService;
_appCaseManagementRepository = appCaseManagementRepository;
_appSupervisedPersonRepository = appSupervisedPersonRepository;
}
#endregion Identity
@ -381,7 +397,14 @@ namespace ATS.NonCustodial.Application.Impl.Admins
{
//if (await _userRepository.AnyAsync(x => x.ReceiveName == input.ReceiveName)) return ResultOutput.NotOk("账号已经存在");
if (await _userRepository.AnyAsync(w => w.UserName == input.UserName)) return ResultOutput.NotOk("姓名已经存在");
if (!input.Phone.HasValue()) return ResultOutput.NotOk("请输入手机号");
var result = await CheckPhone(input.Phone);
if (!result) { return ResultOutput.NotOk("手机号已在系统中已存在"); }
if (!input.Code.HasValue()) return ResultOutput.NotOk("请输入验证码");
result = await _smsService.CheckCodeAsync(input.Phone, input.Code, "CheckCode");
if (!result) { return ResultOutput.NotOk("验证码错误"); }
var entity = Mapper.Map<AppUser>(input);
entity.Id = YitIdHelper.NextId();
entity.PasswordSalt = InfraHelper.Security.GenerateRandomCode(5);
@ -524,7 +547,16 @@ namespace ATS.NonCustodial.Application.Impl.Admins
if (!(user?.Id > 0)) return ResultOutput.NotOk("用户不存在!");
//监管人和管理员手机号不能重复
if (await _userRepository.AnyAsync(w => w.Id != input.Id && w.UserName == input.UserName && w.ChatPersonType != ChatPersonTypeEnum.SupervisedPerson)) return ResultOutput.NotOk("姓名不能重复");
if (!input.Phone.HasValue()) return ResultOutput.NotOk("请输入手机号");
if (user.Phone != input.Phone)
{
var result = await CheckPhone(input.Phone);
if (!result) { return ResultOutput.NotOk("手机号已在系统中已存在"); }
if (!input.Code.HasValue()) return ResultOutput.NotOk("请输入验证码");
result = await _smsService.CheckCodeAsync(input.Phone, input.Code, "CheckCode");
if (!result) { return ResultOutput.NotOk("验证码错误"); }
}
Mapper.Map(input, user);
await _userRepository.UpdateAsync(user, UpdatingProps<AppUser>(
@ -538,9 +570,9 @@ namespace ATS.NonCustodial.Application.Impl.Admins
w => w.DataStatus)!);
if (input.RoleIds != null && input.RoleIds.Count() > 0)
{
var roleList = await _roleRepository.AsQueryable(false, true)
.Where(w=> w.Code == "admin" || w.Code == "supervisor")
.Select(s=>s.Id).ToListAsync();
var roleList = await _roleRepository.AsQueryable(false, true)
.Where(w => w.Code == "admin" || w.Code == "supervisor")
.Select(s => s.Id).ToListAsync();
await _userRoleRepository.DeleteAsync(a => a.UserId == user.Id && roleList.Contains(a.RoleId));
@ -558,6 +590,44 @@ namespace ATS.NonCustodial.Application.Impl.Admins
return ResultOutput.Ok();
}
/// <summary>
/// 校验手机号是否有运行中的按键
/// </summary>
/// <param name="phone"></param>
/// <returns></returns>
private async Task<bool> CheckPhone(string phone)
{
var allUsers = await _userRepository.Where(w => w.Phone == phone && !string.IsNullOrEmpty(w.RoleName)).ToListAsync();
if (allUsers.Any())
{
foreach (var item in allUsers)
{
var caseList = await (from c in _appCaseManagementRepository.AsQueryable(false, true)
join cspr in _appSupervisedPersonRepository.AsQueryable(false, true) on c.Id equals cspr.CaseId
where c.CaseProgress != CaseProgressEnum.Closed
&& item.Id == cspr.SupervisedPersonId
select new CheckPunchRecordForJobOutput()
{
CaseId = c.Id,
CaseName = c.Name,
CaseBeginTime = c.CaseBeginTime,
CheckInFrequency = c.CheckInFrequency,
RestBeginTime = c.RestBeginTime,
RestEndTime = c.RestEndTime,
SupervisedPersonId = cspr.SupervisedPersonId,
SupervisedPersonName = cspr.SupervisedPersonName,
TimedClock = c.TimedClock
}).ToListAsync();
if(caseList.Any())
{
return false;
}
}
}
return true;
}
/// <summary>
/// 更新用户基本信息
/// </summary>
@ -863,7 +933,7 @@ namespace ATS.NonCustodial.Application.Impl.Admins
var rtn = await _userRepository.AsQueryable(false, true)
.Where(w => w.ChatPersonType != ChatPersonTypeEnum.SupervisedPerson && w.DataStatus != DataStatusEnum.Disable && !w.UserName.Contains("_aks"))
.WhereIf(codeList.Count>0,w=> w.PositionId == codeList.FirstOrDefault().Id)
.WhereIf(codeList.Count > 0, w => w.PositionId == codeList.FirstOrDefault().Id)
// .WhereIf(!userRoles.IsAdmin, w => w.Id == User.Id) 2025 -10-20 段肖确认修改
.Select(w => new KeyValueDto()
{

9
src/3.contracts/ATS.NonCustodial.Application.Contracts/Interfaces/Admins/SMS/ISMSService.cs

@ -14,7 +14,14 @@ namespace ATS.NonCustodial.Application.Contracts.Interfaces.Admins.SMS
/// <param name="phone"></param>
/// <returns></returns>
Task<IResultOutput> SendCheckCodeSMS(string phone, string ipAddress = "", string type = "CheckCode");
/// <summary>
/// 监管人创建新用户或更改手机号发送验证码
/// </summary>
/// <param name="phone"></param>
/// <param name="ipAddress"></param>
/// <param name="type"></param>
/// <returns></returns>
Task<IResultOutput> SendCheckCode(string phone, string ipAddress = "", string type = "CheckCode");
/// <summary>
/// 校验验证码
/// </summary>

5
src/3.contracts/ATS.NonCustodial.Application.Contracts/Interfaces/Admins/User/Input/UserAddInput.cs

@ -49,7 +49,10 @@ namespace ATS.NonCustodial.Application.Contracts.Interfaces.Admins.User.Input
/// 部门名称
/// </summary>
public string? Deptcodename { get; set; }
/// <summary>
/// 验证码
/// </summary>
public string? Code { get; set; }
/// <summary>
/// 角色
/// </summary>

5
src/3.contracts/ATS.NonCustodial.Application.Contracts/Interfaces/Admins/User/Input/UserUpdateInput.cs

@ -34,6 +34,11 @@ namespace ATS.NonCustodial.Application.Contracts.Interfaces.Admins.User.Input
/// </summary>
public string? Unitname { get; set; }
/// <summary>
/// 验证码
/// </summary>
public string? Code { get; set; }
/// <summary>
/// 部门id
/// </summary>

Loading…
Cancel
Save