diff --git a/Service/Application.Domain/Enum/EquEnum.cs b/Service/Application.Domain/Enum/EquEnum.cs index b460deb..0469997 100644 --- a/Service/Application.Domain/Enum/EquEnum.cs +++ b/Service/Application.Domain/Enum/EquEnum.cs @@ -2,5 +2,24 @@ public static class EquEnum { - + public enum Sex + { + Default, + Boy, + Girl + } + + public enum EquPlace + { + Mouth = 1, //嘴饰 + Hold = 1, //手持 + Vice = 1, //副手 + Head = 1, //头戴 + Wear = 1, //身穿 + Waist = 1, //腰带 + Foot = 1, //脚穿 + Ornaments = 3, //佩戴 + Fashion = 1, //时装 + Wing = 1, //羽翼 + } } \ No newline at end of file diff --git a/Service/Application.Domain/Enum/GameEnum.cs b/Service/Application.Domain/Enum/GameEnum.cs index 454aec9..56434e5 100644 --- a/Service/Application.Domain/Enum/GameEnum.cs +++ b/Service/Application.Domain/Enum/GameEnum.cs @@ -44,7 +44,12 @@ public static class GameEnum 减少, 增加 } - + public enum Sex + { + 男, + 女, + 未知 + } public enum NpcBusCode { RetBlood, diff --git a/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs b/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs index 7c93181..3b7d4c4 100644 --- a/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs +++ b/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs @@ -25,8 +25,9 @@ public interface IGameEquService Task AddEquLog(unit_user_equ ueData, string code, string remark, bool isAddAttr = false); - + Task> GetUserOnEqu(string userId); + Task EquOnOrDown(unit_user_equ data, int state); #endregion #region 辅助 diff --git a/Service/Application.Domain/Services/Service/Equ/GameEquService.cs b/Service/Application.Domain/Services/Service/Equ/GameEquService.cs index 0efffce..c0d54d8 100644 --- a/Service/Application.Domain/Services/Service/Equ/GameEquService.cs +++ b/Service/Application.Domain/Services/Service/Equ/GameEquService.cs @@ -1,4 +1,6 @@ -namespace Application.Domain; +using Azure.Core.Pipeline; + +namespace Application.Domain; public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGameEquService, ITransient { @@ -306,12 +308,48 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame await db.Insertable(logs).SplitTable().ExecuteCommandAsync(); } - - - - - - + public async Task> GetUserOnEqu(string userId) + { + var key = string.Format(UserCache.BaseCacheKeys, "EquData", "UserOnEqu"); + if (await redis.HExistsHashAsync(key, userId)) + { + return await redis.GetHashAsync>(key, userId); + } + else + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + var data = await db.Queryable().Where(it => it.userId == userId && it.isOn == 1) + .ToListAsync(); + await redis.AddHashAsync(key, userId, data); + return data; + } + } + + public async Task EquOnOrDown(unit_user_equ data, int state) + { + data.isOn = state; + if (data.opTime == 0) + { + data.opTime = 1; + var equInfo = await GetEquInfo((int)data.equId); + if (equInfo.useTime > 0) + { + data.useEndTime = TimeExtend.GetTimeStampBySeconds(DateTime.Now.AddDays((int)equInfo.useTime)) ; + } + } + var db = DbClient.AsTenant().GetConnectionWithAttr(); + bool result = await db.Updateable(data).ExecuteCommandAsync() > 0; + if (result) + { + } + + return result; + } + + + + + #endregion #region 辅助方法 diff --git a/Service/Application.Domain/Tool/Base/GameTool.cs b/Service/Application.Domain/Tool/Base/GameTool.cs index 7d0b368..3def85b 100644 --- a/Service/Application.Domain/Tool/Base/GameTool.cs +++ b/Service/Application.Domain/Tool/Base/GameTool.cs @@ -89,6 +89,56 @@ public class GameTool return weight; } + + public static int GetEquPlaceCount(string code) + { + int result = 0; + switch (code) + { + case "Mouth": + result = (int)EquEnum.EquPlace.Mouth; + break; + + case "Hold": + result = (int)EquEnum.EquPlace.Hold; + break; + + case "Vice": + result = (int)EquEnum.EquPlace.Vice; + break; + + case "Head": + result = (int)EquEnum.EquPlace.Head; + break; + + case "Wear": + result = (int)EquEnum.EquPlace.Wear; + break; + + case "Waist": + result = (int)EquEnum.EquPlace.Waist; + break; + + case "Foot": + result = (int)EquEnum.EquPlace.Foot; + break; + + case "Ornaments": + result = (int)EquEnum.EquPlace.Ornaments; + break; + + case "Fashion": + result = (int)EquEnum.EquPlace.Fashion; + break; + + case "Wing": + result = (int)EquEnum.EquPlace.Wing; + break; + } + + return result; + } + #region 距离计算 /// diff --git a/Service/Application.Web/Controllers/Pub/EquController.cs b/Service/Application.Web/Controllers/Pub/EquController.cs index 58ce304..ef56848 100644 --- a/Service/Application.Web/Controllers/Pub/EquController.cs +++ b/Service/Application.Web/Controllers/Pub/EquController.cs @@ -11,10 +11,14 @@ namespace Application.Web.Controllers.Pub; public class EquController : ControllerBase { private readonly IGameEquService _equService; + private readonly IUnitUserAttrService _attrService; + private readonly IUnitUserService _userService; - public EquController(IGameEquService equService) + public EquController(IGameEquService equService, IUnitUserAttrService attrService, IUnitUserService userService) { _equService = equService; + _attrService = attrService; + _userService = userService; } /// @@ -65,7 +69,7 @@ public class EquController : ControllerBase user = await UserModelTool.GetUserView(ueInfo.owerId); } - return PoAction.Ok(new { equ = equInfo, suit, equData = ueInfo,user }); + return PoAction.Ok(new { equ = equInfo, suit, equData = ueInfo, user }); } /// @@ -99,10 +103,12 @@ public class EquController : ControllerBase { return PoAction.Message("装备不存在!"); } + if (equInfo.userId != userId) { return PoAction.Message("装备不存在!"); } + if (equInfo.isAppr == 0) { return PoAction.Message("装备未鉴定!"); @@ -129,8 +135,117 @@ public class EquController : ControllerBase /// /// [HttpGet] - public async Task DownOrUpEqu(string ueId) + public async Task DownOrUpEqu(string ueId, string? de) { - return PoAction.Ok(true); + string userId = StateHelper.userId; + var equInfo = await _equService.GetUserEquInfo(ueId); + if (equInfo == null) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.userId != userId) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.isOn == 0) //穿装 + { + if (equInfo.isAppr == 0) + { + return PoAction.Message("装备未鉴定!"); + } + + if (equInfo.useEndTime < TimeExtend.GetTimeStampSeconds) + { + return PoAction.Message("装备已过期!"); + } + + int myLev = await _attrService.GetUserLev(userId); + if (equInfo.lev > myLev) + { + return PoAction.Message($"等级达到{equInfo.lev}级可穿戴!"); + } + + if (equInfo.sex != nameof(EquEnum.Sex.Default)) + { + var userInfo = await _userService.GetUserInfoByUserId(userId); + string needSex = equInfo.sex == nameof(EquEnum.Sex.Girl) + ? nameof(GameEnum.Sex.女) + : nameof(GameEnum.Sex.男); + if (userInfo.sex != needSex) + { + return PoAction.Message($"该装备只允许{needSex}性角色穿戴!"); + } + } + + var userOnEqu = await _equService.GetUserOnEqu(userId); + if (equInfo.canEqualUp > 0) + { + int onCount = userOnEqu.Count(it => it.equId == equInfo.equId); + if (onCount >= equInfo.canEqualUp) + { + return PoAction.Message($"该装备最多穿戴{equInfo.canEqualUp}件!"); + } + } + bool isOk = true; + if (string.IsNullOrEmpty(de)) + { + int MaxCount = GameTool.GetEquPlaceCount(equInfo.code); + int OnCount = userOnEqu.Count(it => it.code == equInfo.code) + 1; + if (OnCount > MaxCount) + { + return PoAction.Message($"该部位装备最多穿戴{MaxCount}件!", 100); + } + } + else + { + var DownOnEqu = await _equService.GetUserEquInfo(de); + if (DownOnEqu == null) + { + return PoAction.Message("装备不存在!"); + } + + if (userOnEqu.Any(it => it.ueId == de) == false) + { + return PoAction.Message("装备未穿戴!"); + } + if (DownOnEqu.code != equInfo.code) + { + return PoAction.Message("装备部位不一致!"); + } + + isOk = await _equService.EquOnOrDown(DownOnEqu, 0); + } + + if (isOk) + { + bool result = await _equService.EquOnOrDown(equInfo, 1); + if (result) + { + return PoAction.Ok(true, "穿装成功!"); + } + else + { + return PoAction.Message("穿装失败,请稍后尝试"); + } + } + else + { + return PoAction.Message("穿装失败,请稍后尝试"); + } + } + else //卸装 + { + bool result = await _equService.EquOnOrDown(equInfo, 0); + if (result) + { + return PoAction.Ok(true, "卸装成功!"); + } + else + { + return PoAction.Message("卸装失败,请稍后尝试"); + } + } } } \ No newline at end of file diff --git a/Web/src/pages/prop/equ.vue b/Web/src/pages/prop/equ.vue index ace73b8..d939664 100644 --- a/Web/src/pages/prop/equ.vue +++ b/Web/src/pages/prop/equ.vue @@ -117,7 +117,7 @@
- ◈穿戴装备
+ ◈{{equData.isOn==1?"卸下装备":"穿戴装备"}}
洗练
@@ -188,7 +188,16 @@ const BindData = async (): Promise => { /**穿/卸装备 */ const UpOrDownEqu = async () => { - alert(ueId); + MessageExtend.LoadingToast("操作中..."); + let result = await EquService.DownOrUpEqu(ueId,""); + MessageExtend.LoadingClose(); + if (result.code == 0) { + await BindData(); + MessageExtend.Notify(result.msg, "success"); + } + else { + MessageExtend.ShowDialog("穿/卸装备", result.msg); + } } /**绑定装备 */ diff --git a/Web/src/pages/user/equ/index.vue b/Web/src/pages/user/equ/index.vue index 41a40c8..7a2617b 100644 --- a/Web/src/pages/user/equ/index.vue +++ b/Web/src/pages/user/equ/index.vue @@ -1 +1,37 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Web/src/services/Index/EquService.ts b/Web/src/services/Index/EquService.ts index 311c3b7..0ef56e9 100644 --- a/Web/src/services/Index/EquService.ts +++ b/Web/src/services/Index/EquService.ts @@ -27,7 +27,7 @@ export class EquService { * 穿/卸装备 * GET /Equ/DownOrUpEqu */ - static async DownOrUpEqu(ueId: string) { - return await ApiService.Request("get", "/Equ/DownOrUpEqu", { ueId }); + static async DownOrUpEqu(ueId: string, de: string) { + return await ApiService.Request("get", "/Equ/DownOrUpEqu", { ueId, de }); } } \ No newline at end of file