using YD_Event.Application.AppUser.Dtos; using YD_Event.Application.Auth; using YD_Event.Core.Entities; using AppUserEntity = YD_Event.Core.Entities.AppUser; using YD_Event.Core.Infrastructure.Aliyun.Ocr; using YD_Event.Core.Enum; using Mapster; namespace YD_Event.Application.AppUser; /// /// 普通用户服务 /// public class AppUserService : BaseService, ITransient { private readonly ISqlSugarRepository _appUserRep; private readonly ISqlSugarClient _db; private readonly AuthManager _authManager; private readonly OcrService _ocrService; public AppUserService(ISqlSugarRepository appUserRep, ISqlSugarClient db, AuthManager authManager, OcrService ocrService) : base(appUserRep) { _appUserRep = appUserRep; _db = db; _authManager = authManager; _ocrService = ocrService; } /// /// 分页查询普通用户 /// /// /// [DisplayName("分页查询普通用户")] [HttpGet("page")] public async Task> Page([FromQuery] AppUserPageInput input) { var query = _appUserRep.AsQueryable() .Where(u => u.PersonType == 0) // 仅查询普通用户 .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) .WhereIF(input.Gender.HasValue, u => u.Gender == input.Gender) .WhereIF(!string.IsNullOrWhiteSpace(input.Mobile), u => u.Mobile.Contains(input.Mobile)) .WhereIF(input.AuditStatus.HasValue, u => u.AuditStatus == input.AuditStatus) .WhereIF(input.StartTime.HasValue, u => u.CreatedTime >= input.StartTime) .WhereIF(input.EndTime.HasValue, u => u.CreatedTime <= input.EndTime) .OrderByDescending(u => u.CreatedTime); return await query.Select().ToPagedListAsync(input); } /// /// 获取普通用户详情 /// /// /// [DisplayName("获取普通用户详情")] [HttpGet("{id}")] public async Task Detail([FromRoute] long id) { return await _appUserRep.AsQueryable() .Where(u => u.Id == id) .Select() .FirstAsync(); } /// /// 审核普通用户 /// /// /// [DisplayName("审核普通用户")] [HttpPost("audit")] [UnitOfWork] public async Task Audit([FromBody] AuditInput input) { if (input.Ids == null || !input.Ids.Any()) return; // 更新状态 await _appUserRep.UpdateAsync(u => new AppUserEntity { AuditStatus = input.Status, AuditRemark = input.Remark, UpdatedTime = DateTime.Now, UpdatedUserId = _authManager.UserId }, u => input.Ids.Contains(u.Id)); } #region 领队/教练管理 /// /// 领队/教练列表查询 /// /// /// 1-领队,2-教练 /// [NonAction] private async Task> GetMemberPage(TeamMemberQueryInput input, int personType) { var (userId, merchantId) = await GetCurrentUserAndMerchantId(); var query = _appUserRep.AsQueryable() .Where(x => x.PersonType == personType && !x.DeleteMark) .WhereIF(!string.IsNullOrWhiteSpace(input.Name), x => x.Name.Contains(input.Name)) .WhereIF(input.Gender.HasValue, x => x.Gender == input.Gender) .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), x => x.Mobile.Contains(input.Phone)) .WhereIF(personType == 2 && !string.IsNullOrWhiteSpace(input.SkillLevel), x => x.SkillLevel == input.SkillLevel) .WhereIF(personType == 2 && input.CertificationStatus.HasValue, x => x.CertificationStatus == input.CertificationStatus) .OrderByDescending(x => x.CreatedTime); // 权限过滤 if (merchantId.HasValue) { query = query.Where(x => x.MerchantId == merchantId.Value); } else { query = query.Where(x => x.CreatedUserId == userId && x.MerchantId == null); } return await query.ToPagedListAsync(input); } /// /// 领队列表查询 /// /// /// [DisplayName("领队列表查询")] [HttpGet("leader/page")] public async Task> LeaderPage([FromQuery] TeamMemberQueryInput input) { return await GetMemberPage(input, 1); } /// /// 教练列表查询 /// /// /// [DisplayName("教练列表查询")] [HttpGet("coach/page")] public async Task> CoachPage([FromQuery] TeamMemberQueryInput input) { return await GetMemberPage(input, 2); } /// /// 新增/更新成员 /// /// /// 1-领队,2-教练 /// [NonAction] private async Task SaveMember(CreateOrUpdateMemberInput input, int personType) { var (userId, merchantId) = await GetCurrentUserAndMerchantId(); // 校验手机号 var query = _appUserRep.AsQueryable() .Where(x => x.Mobile == input.Phone && x.PersonType == personType && !x.DeleteMark); if (input.Id.HasValue) { query = query.Where(x => x.Id != input.Id.Value); } if (merchantId.HasValue) { query = query.Where(x => x.MerchantId == merchantId.Value); } else { query = query.Where(x => x.CreatedUserId == userId && x.MerchantId == null); } if (await query.AnyAsync()) throw Oops.Bah($"该手机号的{(personType == 1 ? "领队" : "教练")}已存在"); AppUserEntity entity; if (input.Id.HasValue) { entity = await _appUserRep.GetByIdAsync(input.Id.Value); if (entity == null || entity.DeleteMark) throw Oops.Bah("成员不存在"); await CheckPermission(entity); entity.UpdatedUserId = _authManager.UserId; entity.UpdatedTime = DateTime.Now; } else { entity = new AppUserEntity { Id = YitIdHelper.NextId(), PersonType = personType, MerchantId = merchantId, CreatedUserId = userId, CreatedTime = DateTime.Now, Status = AvailabilityStatus.Enable, AuditStatus = AuditStatus.Pass }; } entity.Name = input.Name; entity.Gender = input.Gender; entity.Age = input.Age; entity.IdCardNumber = input.IdCard; entity.IdCardImageUrl = input.IdCardUrl; entity.Mobile = input.Phone; entity.Remark = input.Remark; entity.AuditRemark = ""; // 或者不赋值 if (personType == 2) { entity.SkillLevel = input.SkillLevel; entity.CertificationStatus = input.CertificationStatus; } await _appUserRep.InsertOrUpdateAsync(entity); } /// /// 新增/编辑领队 /// /// /// [DisplayName("新增/编辑领队")] [HttpPost("leader/save")] public async Task SaveLeader(CreateOrUpdateMemberInput input) { await SaveMember(input, 1); } /// /// 新增/编辑教练 /// /// /// [DisplayName("新增/编辑教练")] [HttpPost("coach/save")] public async Task SaveCoach(CreateOrUpdateMemberInput input) { await SaveMember(input, 2); } /// /// 删除成员 /// /// /// [DisplayName("删除成员")] [HttpPost("member/delete")] public async Task DeleteMember([FromBody] long id) { var entity = await _appUserRep.GetByIdAsync(id); if (entity == null || entity.DeleteMark) throw Oops.Bah("成员不存在"); await CheckPermission(entity); entity.DeleteMark = true; entity.UpdatedUserId = _authManager.UserId; entity.UpdatedTime = DateTime.Now; await _appUserRep.UpdateAsync(entity); } /// /// 变更成员状态 /// /// /// [DisplayName("变更成员状态")] [HttpPost("member/status")] public async Task ChangeMemberStatus(ChangeMemberStatusInput input) { var entity = await _appUserRep.GetByIdAsync(input.Id); if (entity == null || entity.DeleteMark) throw Oops.Bah("成员不存在"); await CheckPermission(entity); entity.Status = input.Status; entity.UpdatedUserId = _authManager.UserId; entity.UpdatedTime = DateTime.Now; await _appUserRep.UpdateAsync(entity); } private async Task<(long userId, long? merchantId)> GetCurrentUserAndMerchantId() { var userId = _authManager.UserId; var merchant = await _db.Queryable() .FirstAsync(m => m.CreatedUserId == userId && !m.DeleteMark); return (userId, merchant?.Id); } private async Task CheckPermission(AppUserEntity entity) { var (userId, merchantId) = await GetCurrentUserAndMerchantId(); if (merchantId.HasValue) { if (entity.MerchantId != merchantId.Value) throw Oops.Bah("无权操作该成员"); } else { if (entity.CreatedUserId != userId || entity.MerchantId != null) throw Oops.Bah("无权操作该成员"); } } #endregion #region 运动员管理 /// /// 分页查询运动员 /// /// /// [HttpGet("athlete/page")] [DisplayName("分页查询运动员")] public async Task> Page([FromQuery] AthleteQueryInput input) { var query = _appUserRep.AsQueryable() // 过滤运动员类型 (PersonType = 3) .Where(u => u.PersonType == 3) .WhereIF(!string.IsNullOrWhiteSpace(input.Name), u => u.Name.Contains(input.Name)) .WhereIF(!string.IsNullOrWhiteSpace(input.IdCardNumber), u => u.IdCardNumber.Contains(input.IdCardNumber)) .WhereIF(input.StartTime.HasValue, u => u.CreatedTime >= input.StartTime) .WhereIF(input.EndTime.HasValue, u => u.CreatedTime <= input.EndTime) .OrderByDescending(u => u.CreatedTime); var list = await query.ToPagedListAsync(input); return list.Adapt>(); } /// /// 新增运动员 /// /// /// [HttpPost("athlete/add")] [DisplayName("新增运动员")] public async Task Add([FromBody] AddAthleteInput input) { var isExist = await _appUserRep.IsAnyAsync(u => u.IdCardNumber == input.IdCardNumber && !u.DeleteMark); if (isExist) throw Oops.Bah("身份证号已存在"); var user = input.Adapt(); user.PersonType = 3; // 运动员 user.Status = AvailabilityStatus.Enable; // 计算年龄 if (input.BirthDate.HasValue) { var today = DateTime.Today; var age = today.Year - input.BirthDate.Value.Year; if (input.BirthDate.Value.Date > today.AddYears(-age)) age--; user.Age = age; } await _appUserRep.InsertAsync(user); } /// /// 修改运动员 /// /// /// [HttpPut("athlete/update")] [DisplayName("修改运动员")] public async Task Update([FromBody] UpdateAthleteInput input) { var user = await _appUserRep.GetFirstAsync(u => u.Id == input.Id); if (user == null) throw Oops.Bah("运动员不存在"); var isExist = await _appUserRep.IsAnyAsync(u => u.IdCardNumber == input.IdCardNumber && u.Id != input.Id && !u.DeleteMark); if (isExist) throw Oops.Bah("身份证号已存在"); input.Adapt(user); // 重新计算年龄 if (input.BirthDate.HasValue) { var today = DateTime.Today; var age = today.Year - input.BirthDate.Value.Year; if (input.BirthDate.Value.Date > today.AddYears(-age)) age--; user.Age = age; } await _appUserRep.UpdateAsync(user); } /// /// 识别身份证信息 /// /// /// [HttpPost("athlete/ocr")] [DisplayName("OCR识别身份证")] public async Task RecognizeIdCard([FromBody] AthleteOcrInput input) { return await _ocrService.RecognizeIdCardAsync(input.ImageUrl); } /// /// 批量删除运动员 /// /// /// [HttpPost("athlete/batchDelete")] [DisplayName("批量删除运动员")] public async Task BatchDelete([FromBody] List ids) { if (ids == null || !ids.Any()) throw Oops.Bah("请选择要删除的记录"); // 逻辑删除 await _appUserRep.UpdateAsync(x => new AppUserEntity { DeleteMark = true }, x => ids.Contains(x.Id)); } #endregion }