diff --git a/Build_God_Api/Build_God_Api/Controllers/BagController.cs b/Build_God_Api/Build_God_Api/Controllers/BagController.cs index 5b6754e..e21f492 100644 --- a/Build_God_Api/Build_God_Api/Controllers/BagController.cs +++ b/Build_God_Api/Build_God_Api/Controllers/BagController.cs @@ -8,9 +8,13 @@ namespace Build_God_Api.Controllers { [ApiController] [Route("api/god/[controller]")] - public class BagController(IBagService service) : ControllerBase + public class BagController( + IBagService service, + IMissionProgressService missionProgressService + ) : ControllerBase { private readonly IBagService service = service; + private readonly IMissionProgressService missionProgressService = missionProgressService; // ============ Bag配置管理 ============ @@ -82,6 +86,13 @@ namespace Build_God_Api.Controllers return await service.AddItemToBag(characterBagId, dto.ItemType, dto.ItemId, dto.Quantity); } + [HttpPost("{characterBagId}/items/with-mission")] + [Authorize] + public async Task> AddItemToBagWithMission(int characterBagId, [FromBody] AddBagItemDto dto) + { + return await service.AddItemToBagWithMissionProgress(characterBagId, dto.ItemType, dto.ItemId, dto.Quantity, missionProgressService); + } + [HttpDelete("{characterBagId}/items/{itemId}")] [Authorize(Roles = "admin")] public async Task> RemoveItemFromBag(int characterBagId, int itemId) diff --git a/Build_God_Api/Build_God_Api/Services/BagService.cs b/Build_God_Api/Build_God_Api/Services/BagService.cs index c7f83cb..da42629 100644 --- a/Build_God_Api/Build_God_Api/Services/BagService.cs +++ b/Build_God_Api/Build_God_Api/Services/BagService.cs @@ -1,4 +1,5 @@ using Build_God_Api.DB; +using Build_God_Api.Dto; using SqlSugar; namespace Build_God_Api.Services @@ -19,6 +20,7 @@ namespace Build_God_Api.Services // 背包物品管理 Task> GetBagItems(int characterBagId); Task AddItemToBag(int characterBagId, int itemType, int itemId, int quantity); + Task AddItemToBagWithMissionProgress(int characterBagId, int itemType, int itemId, int quantity, IMissionProgressService? missionProgressService = null); Task RemoveItemFromBag(int characterBagId, int bagItemId); // 物品数量管理 @@ -266,6 +268,39 @@ namespace Build_God_Api.Services return true; } + public async Task AddItemToBagWithMissionProgress(int characterBagId, int itemType, int itemId, int quantity, IMissionProgressService? missionProgressService = null) + { + var result = await AddItemToBag(characterBagId, itemType, itemId, quantity); + + if (result && missionProgressService != null) + { + var characterBag = await db.Queryable() + .FirstAsync(x => x.Id == characterBagId); + + if (characterBag != null) + { + var pill = await db.Queryable().FirstAsync(x => x.Id == itemId); + var itemName = pill?.Name ?? string.Empty; + + try + { + await missionProgressService.UpdateProgressByTargetType( + characterBag.CharacterId, + ProgressTargetType.CollectItem, + itemId, + itemName, + quantity); + } + catch + { + // 忽略任务进度更新错误,不影响物品添加 + } + } + } + + return result; + } + public async Task RemoveItemFromBag(int characterBagId, int bagItemId) { var item = await db.Queryable() diff --git a/Build_God_Game/src/api/bag.ts b/Build_God_Game/src/api/bag.ts index 71fdb5d..d2a3e28 100644 --- a/Build_God_Game/src/api/bag.ts +++ b/Build_God_Game/src/api/bag.ts @@ -39,4 +39,11 @@ export const getCharacterBag = (characterId: number): Promise => { return http.get(`bag/${characterBagId}/items`) +} + +export const addItemToBag = (characterBagId: number, itemType: number, itemId: number, quantity: number, withMissionProgress: boolean = false): Promise => { + if (withMissionProgress) { + return http.post(`bag/${characterBagId}/items/with-mission`, { itemType, itemId, quantity }) + } + return http.post(`bag/${characterBagId}/items`, { itemType, itemId, quantity }) } \ No newline at end of file diff --git a/Build_God_Game/src/composables/useMissionProgress.ts b/Build_God_Game/src/composables/useMissionProgress.ts new file mode 100644 index 0000000..26316f6 --- /dev/null +++ b/Build_God_Game/src/composables/useMissionProgress.ts @@ -0,0 +1,42 @@ +import { dailyMissionApi, ProgressTargetType } from '@/api/dailyMission' + +export const useMissionProgress = () => { + const updateProgress = async ( + progressType: ProgressTargetType, + itemId: number | null = null, + itemName: string | null = null, + count: number = 1 + ) => { + try { + const result = await dailyMissionApi.updateProgress(progressType, itemId, itemName, count) + return result + } catch (error) { + console.error('更新任务进度失败:', error) + return null + } + } + + const onCollectItem = async (itemId: number, itemName: string, count: number = 1) => { + return updateProgress(ProgressTargetType.CollectItem, itemId, itemName, count) + } + + const onKillMonster = async (monsterId: number, monsterName: string, count: number = 1) => { + return updateProgress(ProgressTargetType.KillMonster, monsterId, monsterName, count) + } + + const onFish = async (count: number = 1) => { + return updateProgress(ProgressTargetType.Fish, null, '钓鱼', count) + } + + const onConsumeItem = async (itemId: number, itemName: string, count: number = 1) => { + return updateProgress(ProgressTargetType.ConsumeItem, itemId, itemName, count) + } + + return { + updateProgress, + onCollectItem, + onKillMonster, + onFish, + onConsumeItem + } +}