Browse Source

feat: 添加任务进度自动更新逻辑

- BagService 添加 AddItemToBagWithMissionProgress 方法
- 添加物品到背包时自动更新收集任务进度
- 新增 useMissionProgress composable 供手动更新进度
- 前端 API 支持 withMissionProgress 参数
master
hanqin 4 weeks ago
parent
commit
adc73e10e0
  1. 13
      Build_God_Api/Build_God_Api/Controllers/BagController.cs
  2. 35
      Build_God_Api/Build_God_Api/Services/BagService.cs
  3. 7
      Build_God_Game/src/api/bag.ts
  4. 42
      Build_God_Game/src/composables/useMissionProgress.ts

13
Build_God_Api/Build_God_Api/Controllers/BagController.cs

@ -8,9 +8,13 @@ namespace Build_God_Api.Controllers
{ {
[ApiController] [ApiController]
[Route("api/god/[controller]")] [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 IBagService service = service;
private readonly IMissionProgressService missionProgressService = missionProgressService;
// ============ Bag配置管理 ============ // ============ Bag配置管理 ============
@ -82,6 +86,13 @@ namespace Build_God_Api.Controllers
return await service.AddItemToBag(characterBagId, dto.ItemType, dto.ItemId, dto.Quantity); return await service.AddItemToBag(characterBagId, dto.ItemType, dto.ItemId, dto.Quantity);
} }
[HttpPost("{characterBagId}/items/with-mission")]
[Authorize]
public async Task<ActionResult<bool>> AddItemToBagWithMission(int characterBagId, [FromBody] AddBagItemDto dto)
{
return await service.AddItemToBagWithMissionProgress(characterBagId, dto.ItemType, dto.ItemId, dto.Quantity, missionProgressService);
}
[HttpDelete("{characterBagId}/items/{itemId}")] [HttpDelete("{characterBagId}/items/{itemId}")]
[Authorize(Roles = "admin")] [Authorize(Roles = "admin")]
public async Task<ActionResult<bool>> RemoveItemFromBag(int characterBagId, int itemId) public async Task<ActionResult<bool>> RemoveItemFromBag(int characterBagId, int itemId)

35
Build_God_Api/Build_God_Api/Services/BagService.cs

@ -1,4 +1,5 @@
using Build_God_Api.DB; using Build_God_Api.DB;
using Build_God_Api.Dto;
using SqlSugar; using SqlSugar;
namespace Build_God_Api.Services namespace Build_God_Api.Services
@ -19,6 +20,7 @@ namespace Build_God_Api.Services
// 背包物品管理 // 背包物品管理
Task<List<BagItemDto>> GetBagItems(int characterBagId); Task<List<BagItemDto>> GetBagItems(int characterBagId);
Task<bool> AddItemToBag(int characterBagId, int itemType, int itemId, int quantity); Task<bool> AddItemToBag(int characterBagId, int itemType, int itemId, int quantity);
Task<bool> AddItemToBagWithMissionProgress(int characterBagId, int itemType, int itemId, int quantity, IMissionProgressService? missionProgressService = null);
Task<bool> RemoveItemFromBag(int characterBagId, int bagItemId); Task<bool> RemoveItemFromBag(int characterBagId, int bagItemId);
// 物品数量管理 // 物品数量管理
@ -266,6 +268,39 @@ namespace Build_God_Api.Services
return true; return true;
} }
public async Task<bool> 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<CharacterBag>()
.FirstAsync(x => x.Id == characterBagId);
if (characterBag != null)
{
var pill = await db.Queryable<Pill>().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<bool> RemoveItemFromBag(int characterBagId, int bagItemId) public async Task<bool> RemoveItemFromBag(int characterBagId, int bagItemId)
{ {
var item = await db.Queryable<BagItem>() var item = await db.Queryable<BagItem>()

7
Build_God_Game/src/api/bag.ts

@ -40,3 +40,10 @@ export const getCharacterBag = (characterId: number): Promise<CharacterBag | nul
export const getBagItems = (characterBagId: number): Promise<BagItem[]> => { export const getBagItems = (characterBagId: number): Promise<BagItem[]> => {
return http.get(`bag/${characterBagId}/items`) return http.get(`bag/${characterBagId}/items`)
} }
export const addItemToBag = (characterBagId: number, itemType: number, itemId: number, quantity: number, withMissionProgress: boolean = false): Promise<boolean> => {
if (withMissionProgress) {
return http.post(`bag/${characterBagId}/items/with-mission`, { itemType, itemId, quantity })
}
return http.post(`bag/${characterBagId}/items`, { itemType, itemId, quantity })
}

42
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
}
}
Loading…
Cancel
Save