2025-11-16 19:16:44 +08:00

223 lines
11 KiB
C#

using CGamesServer.Business.Dto;
using CGamesServer.Business.Services.Interface;
using CGamesServer.DataModel;
using Models;
using System.Linq.Expressions;
namespace CGamesServer.Business.Services
{
public class UserSkillService : IBusinessService
{
private readonly SqlSugarRepository<UserSkill> _repoSkill;
private readonly SqlSugarRepository<User> _repoUser;
public UserSkillService(SqlSugarRepository<UserSkill> repo, SqlSugarRepository<User> repoUser)
{
_repoSkill = repo;
_repoUser = repoUser;
}
/// <summary>
/// 添加或者更新部件信息
/// </summary>
/// <param name="userName">用户的UserName</param>
/// <param name="submitSkills">部件实体类List</param>
/// <returns></returns>
public async Task AddOrUpdateSkill(string userName, List<PostSkill> submitSkills)
{
var existSkills = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id).Where((skill, user) => user.UserName == userName).Select((skill, user) => skill).ToListAsync().ConfigureAwait(false);
var repoUserSplit = _repoUser.AsQueryable().SplitTable();
var existUser = await repoUserSplit.Where(s => s.UserName == userName).FirstAsync().ConfigureAwait(false);
if (existUser == null)
{
return;
}
List<UserSkill> insertSKills = new List<UserSkill>();
List<UserSkill> updateSkills = new List<UserSkill>();
bool isChangeUserScore = false;
for (int i = 0; i < submitSkills.Count; i++)
{
submitSkills[i].Id = long.Parse(submitSkills[i].IdStr);
UserSkill submitSkill = submitSkills[i];
var existSkill = existSkills.Find(f => submitSkill.Id != 0 && f.Id == submitSkill.Id);
if (existSkill == null)
{
submitSkill.UserId = existUser.Id;
submitSkill.CreateTime = DateTime.Now;
if (submitSkills[i].IsAlwaysOwner)
{
submitSkill.ExpireTime = DateTime.Now.AddYears(100);
}
else
{
submitSkill.ExpireTime = DateTime.Now.AddDays(7);
}
existUser.FlightScore -= submitSkills[i].UseScore;
existUser.FlightScore = Math.Max(existUser.FlightScore, 0);
isChangeUserScore = true;
submitSkill.Id = 0;
insertSKills.Add(submitSkill);
}
else
{
if (!submitSkills[i].IsAlwaysOwner)
{
submitSkill.ExpireTime = DateTime.Now.AddDays(7);
}
existSkill.IsDefault = submitSkill.IsDefault;
existSkill.SkillName = submitSkill.SkillName;
existSkill.SkillType = submitSkill.SkillType;
existSkill.IsOwner = submitSkill.IsOwner;
updateSkills.Add(existSkill);
}
}
if (insertSKills.Any())
{
await _repoSkill.AsInsertable(insertSKills).SplitTable().ExecuteReturnSnowflakeIdAsync().ConfigureAwait(false);//.InsertReturnSnowflakeIdAsync(insertDevices).ConfigureAwait(false);
}
if (updateSkills.Any())
{
await _repoSkill.AsUpdateable(updateSkills).SplitTable().ExecuteCommandAsync().ConfigureAwait(false);//.UpdateRangeAsync(updateDevices).ConfigureAwait(false);
}
if (isChangeUserScore)
{
await _repoUser.AsUpdateable(existUser).SplitTable().ExecuteCommandAsync().ConfigureAwait(false);
}
}
public async Task<List<UserSkill>> GetUserSkills(string userName)
{
var existSkills = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id).Where((skill, user) => user.UserName == userName).Select((skill, user) => skill).ToListAsync().ConfigureAwait(false);
return existSkills;
}
public async Task<List<UserSkill>> GetUserDefaultSkills(string userName)
{
var defaultSkills = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id).Where((skill, user) => skill.IsDefault && user.UserName == userName).Select((skill, user) => skill).ToListAsync().ConfigureAwait(false);
return defaultSkills;
}
public async Task SelectSkill(string userName, short skillType, string selectSkillName)
{
var beforeDefaultSkill = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id)
.Where((skill, user) => user.UserName == userName && skill.SkillType == skillType && skill.IsDefault).Select((skill, user) => skill).FirstAsync().ConfigureAwait(false);
List<UserSkill> updateSkills = new List<UserSkill>();
if (beforeDefaultSkill != null)
{
if (selectSkillName != beforeDefaultSkill.SkillName)
{
beforeDefaultSkill.IsDefault = false;
updateSkills.Add(beforeDefaultSkill);
var defaultSkill = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id)
.Where((skill, user) => user.UserName == userName && skill.SkillName == selectSkillName).Select((skill, user) => skill).FirstAsync().ConfigureAwait(false);
if (defaultSkill != null)
{
defaultSkill.IsDefault = true;
updateSkills.Add(defaultSkill);
}
}
else
{
//bug fix
var beforeDefaultSkills = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id)
.Where((skill, user) => user.UserName == userName && skill.SkillType == skillType && skill.IsDefault && skill.SkillName != selectSkillName).Select((skill, user) => skill).ToListAsync().ConfigureAwait(false);
if (beforeDefaultSkills.Any())
{
for (int i = 0; i < beforeDefaultSkills.Count; i++)
{
beforeDefaultSkills[i].IsDefault = false;
updateSkills.Add(beforeDefaultSkills[i]);
}
}
var defaultSkill = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id)
.Where((skill, user) => user.UserName == userName && skill.SkillName == selectSkillName).Select((skill, user) => skill).FirstAsync().ConfigureAwait(false);
if (defaultSkill != null)
{
defaultSkill.IsDefault = true;
updateSkills.Add(defaultSkill);
}
}
}
else
{
var defaultSkill = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id)
.Where((skill, user) => user.UserName == userName && skill.SkillName == selectSkillName).Select((skill, user) => skill).FirstAsync().ConfigureAwait(false);
if (defaultSkill != null)
{
defaultSkill.IsDefault = true;
updateSkills.Add(defaultSkill);
}
}
if (updateSkills.Any())
{
await _repoSkill.AsUpdateable(updateSkills).SplitTable().ExecuteCommandAsync().ConfigureAwait(false);//.UpdateRangeAsync(updateDevices).ConfigureAwait(false);
}
}
public async Task SetSkillOwner(string userName, short skillType, string selectSkillName)
{
var selectSkill = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id)
.Where((skill, user) => user.UserName == userName && skill.SkillType == skillType && skill.SkillName == selectSkillName).Select((skill, user) => skill).FirstAsync().ConfigureAwait(false);
if (selectSkill != null)
{
if (!selectSkill.IsOwner)
{
selectSkill.IsOwner = true;
await _repoSkill.AsUpdateable(selectSkill).SplitTable().ExecuteCommandAsync().ConfigureAwait(false);//.UpdateAsync(selectDevice).ConfigureAwait(false);
}
}
}
public async Task<bool> SelectSkills(string userName, List<string> selecSkillNames)
{
var beforeDefaultSkills = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id && !selecSkillNames.Contains(skill.SkillName))
.Where((skill, user) => user.UserName == userName).Select((skill, user) => skill).ToListAsync().ConfigureAwait(false);
bool isOK = false;
List<UserSkill> updateSkills = new List<UserSkill>();
if (beforeDefaultSkills != null && beforeDefaultSkills.Any())
{
for (int i = 0; i < beforeDefaultSkills.Count; i++)
{
var beforeSkill = beforeDefaultSkills[i];
beforeSkill.IsDefault = false;
updateSkills.Add(beforeSkill);
}
}
var newDefaultSkills = await _repoSkill.AsQueryable().SplitTable().LeftJoin<User>(_repoUser.AsQueryable().SplitTable(), (skill, user) => skill.UserId == user.Id && selecSkillNames.Contains(skill.SkillName))
.Where((skill, user) => user.UserName == userName).Select((skill, user) => skill).ToListAsync().ConfigureAwait(false);
if (newDefaultSkills.Any())
{
for (int i = 0; i < newDefaultSkills.Count; i++)
{
var newSkill = newDefaultSkills[i];
newSkill.IsDefault = true;
updateSkills.Add(newSkill);
}
isOK = true;
if (updateSkills.Any())
{
await _repoSkill.AsUpdateable(updateSkills).SplitTable().ExecuteCommandAsync().ConfigureAwait(false);//.UpdateRangeAsync(updateDevices).ConfigureAwait(false);
}
}
return isOK;
}
}
}