添加项目文件。

This commit is contained in:
2026-10-12 16:22:04 +08:00
parent 7c68a0ca0a
commit aad11be43d
1000 changed files with 120807 additions and 0 deletions
@@ -0,0 +1,665 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AdminService.GameConfigs;
using AdminService.User;
using AdminService.User.Param;
using AdminService.User.Response;
using Common;
using Common.Utils;
using CommonDomain;
using CommonDomain.BaseModel;
using CommonDomain.Enum;
using CommonInfrastructure;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using RedisService;
using UserDomain.Entity;
namespace AdminApi.AdminUser
{
[ApiController, Route("adminapi/[controller]")]
[Authorize]
public class AdminUserController : BaseController
{
private readonly IAdminUserService _userService;
private readonly IRedisService _redisService;
public AdminUserController(IAdminUserService userService, IRedisService redisService)
{
_userService = userService;
_redisService = redisService;
}
[HttpPost("GetUserList")]
public async Task<PageResponse<UserListItemDto>> GetUserList(AdminUserListParam param)
{
var result = await _userService.GetAdminUserList(param);
var onlineUserIds = _redisService.GetAllLoginUserIds().ToHashSet(StringComparer.Ordinal);
var dtos = (result.list ?? new List<UserEntity>()).Select(u =>
{
var dto = MapToUserListItemDto(u);
dto.IsOnline = onlineUserIds.Contains(u.Id);
if (dto.CurrentGameType != 3)
{
var session = _redisService.GetRedisUserCId(u.Id);
if (session == null || string.IsNullOrWhiteSpace(session.RoomId))
{
dto.CurrentGameType = 0;
dto.RoomNumber = "";
}
}
return dto;
}).ToList();
return this.ToPageResult(dtos, result.count);
}
[HttpGet("GetUserDetail")]
public async Task<BaseResponse<UserEntity>> GetUserDetail(string userId)
{
var result = await _userService.GetUser(userId);
if (result == null)
return this.ToFailResult<UserEntity>("用户不存在");
return this.ToResult(result);
}
[HttpPost("UpdateUserAssets")]
public async Task<BaseResponse<string>> UpdateUserAssets(UpdateUserAssetsParam param)
{
var result = await _userService.UpdateUserAssets(param);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpGet("GetUserStatistics")]
public async Task<BaseResponse<UserStatisticsDto>> GetUserStatistics()
{
var result = await _userService.GetUserStatistics();
return this.ToResult(MapToUserStatisticsDto(result));
}
[HttpGet("GetEmailStatistics")]
public async Task<BaseResponse<EmailStatisticsDto>> GetEmailStatistics()
{
var result = await _userService.GetEmailStatistics();
return this.ToResult(MapToEmailStatisticsDto(result));
}
[HttpPost("BatchBanUser")]
public async Task<BaseResponse<string>> BatchBanUser(BatchBanUserParam param)
{
var result = await _userService.BatchBanUser(param);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpGet("UnbanUser")]
public async Task<BaseResponse<string>> UnbanUser(string userId)
{
var result = await _userService.UnbanUser(userId);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("BatchSendEmail")]
public async Task<BaseResponse<string>> BatchSendEmail(BatchSendEmailParam param)
{
var result = await _userService.BatchSendEmail(param);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpGet("CancelUser")]
[Authorize]
public async Task<BaseResponse<string>> CancelUser()
{
var result = await _userService.CancelUser(loginUser);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpGet("DeleteUser")]
[Authorize]
public async Task<BaseResponse<string>> DeleteUser(string id)
{
var result = await _userService.DeleteUser(id);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("BatchDeleteUser")]
[Authorize]
public async Task<BaseResponse<string>> BatchDeleteUser([FromBody] BatchDeleteUserParam param)
{
var result = await _userService.BatchDeleteUser(param.UserIds);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("BanUser")]
[Authorize]
public async Task<BaseResponse<string>> BanUser([FromBody] BanUserParam param)
{
var result = await _userService.BanUser(param.UserId, param.Reason, param.Days);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("UpdateUser")]
[Authorize]
public async Task<BaseResponse<string>> UpdateUser(UpdateUserDataParam param)
{
var result = await _userService.UpdateUser(param);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("SendEmail")]
[Authorize]
public async Task<BaseResponse<string>> SendEmail(SendEmailParam param)
{
var result = await _userService.SendEmail(param, loginUser);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("GetEmailList")]
[Authorize]
public async Task<PageResponse<EmailListItemDto>> GetEmailList([FromBody] EmailListQueryParam param)
{
var (list, count) = await _userService.GetEmailList(param);
var userIds = list.Where(e => !string.IsNullOrWhiteSpace(e.UserId))
.Select(e => e.UserId).Distinct().ToList();
var userNames = await _userService.GetEmailUserNamesAsync(userIds);
var dtos = list.Select(e =>
{
userNames.TryGetValue(e.UserId ?? "", out var info);
return new EmailListItemDto
{
Id = e.Id,
UserId = e.UserId ?? "",
UserName = info.UserName,
UserNumber = info.UserNumber,
Title = e.Title ?? "",
IsRead = e.IsRead,
IsReward = e.IsReward,
RewardGold = e.RewardGold,
RewardDiamond = e.RewardDiamond,
SendTime = e.SendTime,
ReadTime = e.ReadTime,
ExpireTime = e.ExpireTime,
RewardText = BuildRewardText(e)
};
}).ToList();
return this.ToPageResult(dtos, (int)count);
}
[HttpGet("DeleteEmail")]
[Authorize]
public async Task<BaseResponse<string>> DeleteEmail(string id)
{
var result = await _userService.DeleteEmail(id);
if (result.ok)
return this.ToResult("删除成功");
else
return this.ToFailResult<string>(result.message ?? "删除失败");
}
[HttpPost("BatchDeleteEmail")]
[Authorize]
public async Task<BaseResponse<string>> BatchDeleteEmail([FromBody] List<string> ids)
{
var (success, fail) = await _userService.BatchDeleteEmail(ids);
if (fail == 0)
return this.ToResult($"成功删除 {success} 条");
return this.ToResult($"删除完成:成功 {success} 条,失败 {fail} 条");
}
[HttpPost("SetUserType")]
public async Task<BaseResponse<string>> SetUserType(string userId, int userType)
{
var result = await _userService.SetUserType(userId, userType);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("BatchSetUserType")]
public async Task<BaseResponse<string>> BatchSetUserType([FromBody] BatchSetUserTypeParam param)
{
var result = await _userService.BatchSetUserType(param.UserIds, param.UserType);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("SetBlackUser")]
public async Task<BaseResponse<string>> SetBlackUser(string userId, bool isBlack)
{
var result = await _userService.SetBlackUser(userId, isBlack);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("BatchSetBlackUser")]
public async Task<BaseResponse<string>> BatchSetBlackUser([FromBody] BatchSetBlackUserParam param)
{
var result = await _userService.BatchSetBlackUser(param.UserIds, param.IsBlack);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("UpdateUserFactor")]
public async Task<BaseResponse<string>> UpdateUserFactor([FromBody] UpdateUserFactorFlatParam param)
{
var factor = new PlayerFactor
{
ViolateValue = param.ViolateValue,
MissRate = param.MissRate,
CompensateQuota = param.CompensateQuota,
PenaltyQuota = param.PenaltyQuota,
CompensateRate = param.CompensateRate,
PenaltyRate = param.PenaltyRate,
AdditionalFactor = param.AdditionalFactor
};
var result = await _userService.UpdateUserFactor(param.UserId, factor);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpGet("GetBlackFactorConfig")]
public async Task<BaseResponse<PlayerFactorDto>> GetBlackFactorConfig()
{
var result = await _userService.GetBlackFactorConfig();
return this.ToResult(MapToPlayerFactorDto(result));
}
[HttpPost("ResetUserFactor")]
public async Task<BaseResponse<string>> ResetUserFactor(string userId)
{
var result = await _userService.ResetUserFactor(userId);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpGet("InitUserPassword")]
public async Task<BaseResponse<string>> InitUserPassword([FromQuery] string userId)
{
var result = await _userService.InitUserPassword(userId);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpGet("InitSafeBoxPassword")]
public async Task<BaseResponse<string>> InitSafeBoxPassword([FromQuery] string userId)
{
var result = await _userService.InitSafeBoxPassword(userId);
if (result.isok)
return this.ToResult(result.msg);
else
return this.ToFailResult<string>(result.msg);
}
[HttpPost("GetUserFactorList")]
public async Task<PageResponse<UserFactorListItemDto>> GetUserFactorList([FromBody] UserFactorListParam param)
{
var result = await _userService.GetUserFactorList(param);
var pageIps = (result.list ?? new List<UserEntity>())
.Where(u => !string.IsNullOrEmpty(u.RegisterIp))
.Select(u => u.RegisterIp!)
.Distinct()
.ToList();
Dictionary<string, int> ipCounts = new Dictionary<string, int>();
if (pageIps.Count > 0)
{
var allUsersWithSameIp = await _userService.GetUsersByRegisterIps(pageIps);
ipCounts = allUsersWithSameIp
.GroupBy(u => u.RegisterIp)
.ToDictionary(g => g.Key, g => g.Count());
}
var dtos = (result.list ?? new List<UserEntity>()).Select(u => new UserFactorListItemDto
{
Id = u.Id,
Number = u.BaseInfo?.Number ?? "",
UserName = u.BaseInfo?.UserName ?? "",
Mobile = u.BaseInfo?.Mobile ?? "",
UserType = u.UserType,
RegisterIp = u.RegisterIp ?? "",
LoginIp = u.Static?.LastLoginIp ?? "",
IpCount = !string.IsNullOrEmpty(u.RegisterIp) && ipCounts.ContainsKey(u.RegisterIp) ? ipCounts[u.RegisterIp] : 1,
IsBlack = u.PlayerFactor?.IsBlack ?? false,
ViolateValue = u.PlayerFactor?.ViolateValue ?? 0.2,
MissRate = u.PlayerFactor?.MissRate ?? 0,
CompensateQuota = u.PlayerFactor?.CompensateQuota ?? 0,
PenaltyQuota = u.PlayerFactor?.PenaltyQuota ?? 0,
CompensateRate = u.PlayerFactor?.CompensateRate != null ? new CompensateRateDto
{
BossRate = u.PlayerFactor.CompensateRate.BossRate,
GoldRate = u.PlayerFactor.CompensateRate.GoldRate,
SpecialRate = u.PlayerFactor.CompensateRate.SpecialRate,
Ordinary = u.PlayerFactor.CompensateRate.Ordinary
} : new CompensateRateDto(),
PenaltyRate = u.PlayerFactor?.PenaltyRate != null ? new PenaltyRateDto
{
BossRate = u.PlayerFactor.PenaltyRate.BossRate,
GoldRate = u.PlayerFactor.PenaltyRate.GoldRate,
SpecialRate = u.PlayerFactor.PenaltyRate.SpecialRate,
Ordinary = u.PlayerFactor.PenaltyRate.Ordinary
} : new PenaltyRateDto(),
CreateTime = u.CreateTime,
TotalRecharge = u.Static?.TotalRecharge ?? 0,
TotalRechargeGold = u.Static?.TotalRechargeGold ?? 0,
TotalConsumeGold = u.Static?.TotalConsumeGold ?? 0,
CurrentGold = u.Assets?.Gold ?? 0,
Profit = (u.Assets?.Gold ?? 0) - ((u.Static?.TotalRechargeGold ?? 0) + (u.PlayerFactor?.StartingBonus ?? 0)),
AdditionalFactor = u.PlayerFactor?.AdditionalFactor ?? 0,
StartingBonus = u.PlayerFactor?.StartingBonus ?? 0
});
return this.ToPageResult(dtos, result.count);
}
private static UserListItemDto MapToUserListItemDto(UserEntity entity)
{
return new UserListItemDto
{
Id = entity.Id,
Number = entity.BaseInfo?.Number ?? "",
NickName = entity.BaseInfo?.UserName ?? "",
Avatar = entity.BaseInfo?.AvatarUrl ?? "",
Mobile = entity.BaseInfo?.Mobile ?? "",
Diamond = entity.Assets?.Diamond ?? 0,
Gold = entity.Assets?.Gold ?? 0,
SafeBoxGold = entity.SafeBox?.Amount ?? 0,
VipLevel = entity.Assets?.VipLevel ?? 0,
UserType = entity.UserType,
IsBan = entity.BanInfo?.IsBan ?? false,
BanReason = entity.BanInfo?.BanReason,
BanEndTime = entity.BanInfo?.BanEndTime ?? 0,
IsBlack = entity.PlayerFactor?.IsBlack ?? false,
RegisterTime = entity.CreateTime,
RegisterIp = entity.RegisterIp ?? "",
LastLoginIp = entity.Static?.LastLoginIp ?? "",
LastLoginTime = entity.Static?.LastLoginTime ?? 0,
RoomNumber = entity.Static?.RoomNumber ?? "",
CurrentGameType = entity.Static?.CurrentGameType ?? 0,
Channel = entity.BaseInfo?.Channel ?? "",
TotalRecharge = (long)(entity.Static?.TotalRecharge ?? 0)
};
}
private static UserStatisticsDto MapToUserStatisticsDto(UserStatistics stat)
{
return new UserStatisticsDto
{
TotalUsers = stat.TotalUsers,
TodayRegisteredUsers = stat.TodayRegisteredUsers,
MonthRegisteredUsers = stat.MonthRegisteredUsers,
OnlineUsers = stat.OnlineUsers,
BannedUsers = stat.BannedUsers,
VipUsers = stat.VipUsers,
VipLevelCount = stat.VipLevelCount ?? new Dictionary<int, long>(),
TotalGold = stat.TotalGold,
TotalDiamond = stat.TotalDiamond
};
}
private static EmailStatisticsDto MapToEmailStatisticsDto(EmailStatistics stat)
{
return new EmailStatisticsDto
{
TotalEmails = stat.TotalEmails,
RewardEmails = stat.RewardEmails,
UnclaimedEmails = stat.UnclaimedEmails,
TodayEmails = stat.TodayEmails,
MonthEmails = stat.MonthEmails
};
}
private static PlayerFactorDto MapToPlayerFactorDto(PlayerFactor factor)
{
if (factor == null)
return new PlayerFactorDto();
return new PlayerFactorDto
{
IsBlack = factor.IsBlack,
IsIgnore = factor.IsIgnore,
ViolateValue = factor.ViolateValue,
CompensateRate = factor.CompensateRate?.BossRate ?? 1,
PenaltyRate = factor.PenaltyRate?.BossRate ?? 0,
CompensateQuota = factor.CompensateQuota,
PenaltyQuota = factor.PenaltyQuota,
StartingBonus = factor.StartingBonus
};
}
private static string BuildRewardText(UserEmail email)
{
var parts = new List<string>();
if (email.RewardGold > 0)
parts.Add($"金币{email.RewardGold:N0}");
if (email.RewardDiamond > 0)
parts.Add($"钻石{email.RewardDiamond}");
if (email.RewardItems != null)
{
foreach (var item in email.RewardItems)
{
if (item != null && !string.IsNullOrWhiteSpace(item.Name))
parts.Add($"{item.Name}*{item.Count}");
}
}
return parts.Count > 0 ? string.Join(" ", parts) : "无";
}
[HttpGet("GetUserProps")]
public async Task<BaseResponse<List<BaseProductCount>>> GetUserProps(string userId)
{
var result = await _userService.GetUserProps(userId);
return this.ToResult(result);
}
[HttpPost("AddUserProp")]
public async Task<BaseResponse<string>> AddUserProp(string userId, string propNumber, int count)
{
var res = await _userService.AddUserProp(userId, propNumber, count);
if (res.isok) return this.ToResult(res.msg);
return this.ToFailResult<string>(res.msg);
}
[HttpPost("UpdateUserPropCount")]
public async Task<BaseResponse<string>> UpdateUserPropCount(string userId, string propNumber, int count)
{
var res = await _userService.UpdateUserPropCount(userId, propNumber, count);
if (res.isok) return this.ToResult(res.msg);
return this.ToFailResult<string>(res.msg);
}
[HttpPost("DeleteUserProp")]
public async Task<BaseResponse<string>> DeleteUserProp(string userId, string propNumber)
{
var res = await _userService.DeleteUserProp(userId, propNumber);
if (res.isok) return this.ToResult(res.msg);
return this.ToFailResult<string>(res.msg);
}
[HttpGet("SyncAllUserLevel")]
public async Task<BaseResponse<string>> SyncAllUserLevel()
{
var (total, updated, msg) = await _userService.SyncAllUserLevel();
return this.ToResult(msg);
}
}
public class UserListItemDto
{
public string Id { get; set; }
public string Number { get; set; }
public string NickName { get; set; }
public string Avatar { get; set; }
public string Mobile { get; set; }
public int Diamond { get; set; }
public long Gold { get; set; }
public long SafeBoxGold { get; set; }
public int VipLevel { get; set; }
public int UserType { get; set; }
public bool IsBan { get; set; }
public string BanReason { get; set; }
public long BanEndTime { get; set; }
public bool IsBlack { get; set; }
public long RegisterTime { get; set; }
public string RegisterIp { get; set; }
public string LastLoginIp { get; set; }
public long LastLoginTime { get; set; }
public string RoomNumber { get; set; }
public int CurrentGameType { get; set; }
public bool IsOnline { get; set; }
public string Channel { get; set; }
public long TotalRecharge { get; set; }
}
public class UserStatisticsDto
{
public long TotalUsers { get; set; }
public long TodayRegisteredUsers { get; set; }
public long MonthRegisteredUsers { get; set; }
public long OnlineUsers { get; set; }
public long BannedUsers { get; set; }
public long VipUsers { get; set; }
public Dictionary<int, long> VipLevelCount { get; set; }
public long TotalGold { get; set; }
public long TotalDiamond { get; set; }
}
public class EmailStatisticsDto
{
public long TotalEmails { get; set; }
public long RewardEmails { get; set; }
public long UnclaimedEmails { get; set; }
public long TodayEmails { get; set; }
public long MonthEmails { get; set; }
}
public class PlayerFactorDto
{
public bool IsBlack { get; set; }
public bool IsIgnore { get; set; }
public double ViolateValue { get; set; }
public double CompensateRate { get; set; }
public double PenaltyRate { get; set; }
public int CompensateQuota { get; set; }
public int PenaltyQuota { get; set; }
public long StartingBonus { get; set; }
}
public class UserFactorListItemDto
{
public string Id { get; set; }
public string Number { get; set; }
public string UserName { get; set; }
public string Mobile { get; set; }
public int UserType { get; set; }
public string RegisterIp { get; set; }
public string LoginIp { get; set; }
public int IpCount { get; set; }
public bool IsBlack { get; set; }
public double ViolateValue { get; set; }
public double MissRate { get; set; }
public int CompensateQuota { get; set; }
public int PenaltyQuota { get; set; }
public CompensateRateDto CompensateRate { get; set; }
public PenaltyRateDto PenaltyRate { get; set; }
public long CreateTime { get; set; }
public double TotalRecharge { get; set; }
public long TotalRechargeGold { get; set; }
public long TotalConsumeGold { get; set; }
public long CurrentGold { get; set; }
public long Profit { get; set; }
public double AdditionalFactor { get; set; }
public long StartingBonus { get; set; }
}
public class CompensateRateDto
{
public double BossRate { get; set; } = 1;
public double GoldRate { get; set; } = 1;
public double SpecialRate { get; set; } = 1;
public double Ordinary { get; set; } = 1;
}
public class PenaltyRateDto
{
public double BossRate { get; set; } = 1;
public double GoldRate { get; set; } = 1;
public double SpecialRate { get; set; } = 1;
public double Ordinary { get; set; } = 1;
}
public class BanUserParam
{
public string UserId { get; set; } = "";
public string Reason { get; set; } = "";
public int Days { get; set; } = 0;
}
public class EmailListItemDto
{
public string Id { get; set; } = "";
public string UserId { get; set; } = "";
public string UserName { get; set; } = "";
public string UserNumber { get; set; } = "";
public string Title { get; set; } = "";
public bool IsRead { get; set; }
public bool IsReward { get; set; }
public long RewardGold { get; set; }
public int RewardDiamond { get; set; }
public long SendTime { get; set; }
public long ReadTime { get; set; }
public long ExpireTime { get; set; }
public string RewardText { get; set; } = "";
}
}