223 lines
11 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|