using Store.Users.Contracts.Enums; using MAX.Framework.Validation; using MAX.Framework.Commons; using Store.Users.Contracts.Dtos; using Store.Users.Entities; namespace Store.Users.Services; public sealed partial class UserManagementService { /// 为本人或授权账户提交充值备注,昵称从目标账户读取。 public async Task AddTopUpMessage(UserTopUpMessageRequest request, CancellationToken ct) { RequestValidator.Validate(request); var actor = await Actor(orm, ct); var name = string.IsNullOrWhiteSpace(request.UserName) ? actor.UserName : request.UserName.Trim(); var target = await orm.Select().Where(u => u.UserName == name).FirstAsync(ct) ?? throw new AppException("用户不存在"); if (!UserAccessPolicy.CanUseSelfService(actor, target)) throw new AppException("无权为该账户提交充值备注", 403); return await orm.Insert(new UserTopUpMessageEntity { UserName = target.UserName, NickName = target.NickName, Message = request.Message.Trim() }).ExecuteIdentityAsync(ct); } /// 管理范围内记录人工处理结果。备注处理不会自动增加积分或余额。 public async Task UpdateTopUpMessage(UserTopUpResultRequest request, CancellationToken ct) { RequestValidator.Validate(request); var actor = await Actor(orm, ct); var message = await orm.Select().Where(m => m.Id == request.Id).FirstAsync(ct) ?? throw new AppException("充值备注不存在"); if (!UserAccessPolicy.IsAdmin(actor)) { var target = await orm.Select().Where(u => u.UserName == message.UserName).FirstAsync(ct); if (target == null || !UserAccessPolicy.CanManage(actor, target)) throw new AppException("无权处理该账户的充值备注", 403); } await orm.Update().Set(m => m.Result, request.Result.Trim()) .Where(m => m.Id == request.Id).ExecuteAffrowsAsync(ct); } /// 管理员查看全部,主账号查看本人和直属子账号,子账号仅查看本人备注。 public async Task> TopUpMessages(UserSearchRequest request, CancellationToken ct) { RequestValidator.Validate(request); var actor = await Actor(orm, ct); var select = orm.Select(); if (!UserAccessPolicy.IsAdmin(actor)) { if (actor.IsMainUser) select = select.Where(m => m.UserName == actor.UserName || orm.Select() .Where(u => u.UserName == m.UserName && u.ParentUserName == actor.UserName && (u.SaLevel == null || u.SaLevel != UserAdminLevel.SuperAdmin)).Any()); else select = select.Where(m => m.UserName == actor.UserName); } var total = await select.CountAsync(ct); var rows = await select.OrderByDescending(m => m.Id).Page(request.Page, request.PageSize).ToListAsync(ct); return new(total, rows); } /// 管理员维护代理充值二维码,使用旧表唯一代理编码原子更新或插入。 public async Task UpdateTopUpQrcode(UserTopUpQrcodeRequest request, CancellationToken ct) { RequestValidator.Validate(request); var actor = await Actor(orm, ct); if (!UserAccessPolicy.IsAdmin(actor)) throw new AppException("仅管理员可以维护充值二维码", 403); await orm.InsertOrUpdate().SetSource(new UserTopUpQrcodeEntity { AgentCode = request.AgentCode.Trim(), QrcodeBase64 = request.QrcodeBase64 }).ExecuteAffrowsAsync(ct); } /// 已认证用户按代理编码读取收款二维码。 public async Task GetTopUpQrcode(string agentCode, CancellationToken ct) { RequestValidator.Validate(new UserTopUpQrcodeQuery { AgentCode = agentCode?.Trim()! }); await Actor(orm, ct); var code = agentCode.Trim(); var item = await orm.Select().Where(q => q.AgentCode == code).FirstAsync(ct); return item?.QrcodeBase64; } }