// 物品库存操作模块 (items) const { getOrCreaterUser } = require('./auth'); const user_db_name = "cocos_users"; const DATA_TYPE = 'items'; /** * 获取物品库存数据 * @param {Object} db 数据库实例 * @param {string} openid 用户openid * @returns {Object} 操作结果 */ async function getItems(db, openid) { try { let user = await getOrCreaterUser(db, openid); if (!user) { return { code: -4, msg: "未找到用户" }; } return { code: 200, data: user[DATA_TYPE], msg: `${DATA_TYPE}获取成功` }; } catch (error) { console.error(`获取${DATA_TYPE}错误:`, error); return { code: -5, msg: `获取${DATA_TYPE}错误: ${error.message}` }; } } /** * 获取单个物品数据 * @param {Object} db 数据库实例 * @param {string} openid 用户openid * @param {number} itemId 物品ID * @returns {Object} 操作结果 */ async function getItem(db, openid, itemId) { try { let user = await getOrCreaterUser(db, openid); if (!user) { return { code: -4, msg: "未找到用户" }; } const itemCount = user[DATA_TYPE][itemId]; if (itemCount === undefined) { return { code: -6, msg: `${DATA_TYPE.slice(0, -1)} ${itemId} 未找到` }; } return { code: 200, data: { item_id: itemId, count: itemCount }, msg: `${DATA_TYPE.slice(0, -1)} ${itemId} 获取成功` }; } catch (error) { console.error(`获取${DATA_TYPE}物品错误:`, error); return { code: -5, msg: `获取${DATA_TYPE}物品错误: ${error.message}` }; } } /** * 添加物品 * @param {Object} db 数据库实例 * @param {string} openid 用户openid * @param {number} itemId 物品ID * @param {number} count 添加数量 * @returns {Object} 操作结果 */ async function addItem(db, openid, itemId, count) { try { const _ = db.command; let user = await getOrCreaterUser(db, openid); if (!user) { return { code: -4, msg: "未找到用户" }; } if (typeof count !== 'number' || count < 0) { return { code: -3, msg: "数量必须是非负数" }; } const currentCount = user[DATA_TYPE][itemId] || 0; const newCount = currentCount + count; let updateRes = await db.collection(user_db_name).doc(user._id).update({ data: { [`${DATA_TYPE}.${itemId}`]: _.set(newCount), last_save_time: _.set(Date.now()) } }); if (updateRes?.stats?.updated >= 1) { return { code: 200, data: { item_id: itemId, old_count: currentCount, new_count: newCount, added: count }, msg: `${DATA_TYPE.slice(0, -1)} ${itemId} 添加成功` }; } else { return { code: -1, msg: `添加 ${DATA_TYPE.slice(0, -1)} 失败` }; } } catch (error) { console.error(`添加${DATA_TYPE}物品错误:`, error); return { code: -5, msg: `添加${DATA_TYPE}物品错误: ${error.message}` }; } } /** * 消耗物品 * @param {Object} db 数据库实例 * @param {string} openid 用户openid * @param {number} itemId 物品ID * @param {number} count 消耗数量 * @returns {Object} 操作结果 */ async function consumeItem(db, openid, itemId, count) { try { let user = await getOrCreaterUser(db, openid); if (!user) { return { code: -4, msg: "未找到用户" }; } if (typeof count !== 'number' || count < 0) { return { code: -3, msg: "数量必须是非负数" }; } const currentCount = user[DATA_TYPE][itemId] || 0; if (currentCount < count) { return { code: -6, msg: `${DATA_TYPE.slice(0, -1)} ${itemId}不足, 当前: ${currentCount}, 需要: ${count}` }; } return await addItem(db, openid, itemId, -count); } catch (error) { console.error(`消耗${DATA_TYPE}物品错误:`, error); return { code: -5, msg: `消耗${DATA_TYPE}物品错误: ${error.message}` }; } } /** * 设置物品数量 * @param {Object} db 数据库实例 * @param {string} openid 用户openid * @param {number} itemId 物品ID * @param {number} count 新的数量 * @returns {Object} 操作结果 */ async function setItem(db, openid, itemId, count) { try { const _ = db.command; let user = await getOrCreaterUser(db, openid); if (!user) { return { code: -4, msg: "未找到用户" }; } if (typeof count !== 'number' || count < 0) { return { code: -3, msg: "数量必须是非负数" }; } const oldCount = user[DATA_TYPE][itemId] || 0; let updateRes = await db.collection(user_db_name).doc(user._id).update({ data: { [`${DATA_TYPE}.${itemId}`]: _.set(count), last_save_time: _.set(Date.now()) } }); if (updateRes?.stats?.updated >= 1) { return { code: 200, data: { item_id: itemId, old_count: oldCount, new_count: count }, msg: `${DATA_TYPE.slice(0, -1)} ${itemId} 设置成功` }; } else { return { code: -1, msg: `设置 ${DATA_TYPE.slice(0, -1)} 失败` }; } } catch (error) { console.error(`设置${DATA_TYPE}物品错误:`, error); return { code: -5, msg: `设置${DATA_TYPE}物品错误: ${error.message}` }; } } /** * 批量更新物品库存 * @param {Object} db 数据库实例 * @param {string} openid 用户openid * @param {Object} updateData 更新数据对象 * @param {boolean} merge 是否合并更新(默认true) * @returns {Object} 操作结果 */ async function updateItems(db, openid, updateData, merge = true) { try { const _ = db.command; let user = await getOrCreaterUser(db, openid); if (!user) { return { code: -4, msg: "未找到用户" }; } // 验证更新数据 if (!updateData || typeof updateData !== 'object') { return { code: -3, msg: "无效的更新数据格式" }; } // 验证所有值都是非负数 for (const itemId in updateData) { const count = updateData[itemId]; if (typeof count !== 'number' || count < 0) { return { code: -3, msg: `物品 ${itemId} 的数量无效: ${count}` }; } } let newData; if (merge) { // 合并更新 newData = { ...user[DATA_TYPE], ...updateData }; } else { // 完全替换 newData = updateData; } let updateRes = await db.collection(user_db_name).doc(user._id).update({ data: { [DATA_TYPE]: _.set(newData), last_save_time: _.set(Date.now()) } }); if (updateRes?.stats?.updated >= 1) { return { code: 200, data: newData, msg: `${DATA_TYPE} 更新成功` }; } else { return { code: -1, msg: `更新 ${DATA_TYPE} 失败` }; } } catch (error) { console.error(`更新${DATA_TYPE}错误:`, error); return { code: -5, msg: `更新${DATA_TYPE}错误: ${error.message}` }; } } /** * 重置物品库存数据 * @param {Object} db 数据库实例 * @param {string} openid 用户openid * @returns {Object} 操作结果 */ async function resetItems(db, openid) { try { const _ = db.command; const { getNewUserInitData } = require('../user_init_data'); let user = await getOrCreaterUser(db, openid); if (!user) { return { code: -4, msg: "未找到用户" }; } const defaultData = getNewUserInitData(); let resetRes = await db.collection(user_db_name).doc(user._id).update({ data: { [DATA_TYPE]: _.set(defaultData[DATA_TYPE]), last_save_time: _.set(Date.now()), reset_time: _.set(Date.now()) } }); if (resetRes?.stats?.updated >= 1) { return { code: 200, data: defaultData[DATA_TYPE], msg: `${DATA_TYPE} 重置成功` }; } else { return { code: -1, msg: `重置 ${DATA_TYPE} 失败` }; } } catch (error) { console.error(`重置${DATA_TYPE}错误:`, error); return { code: -5, msg: `重置${DATA_TYPE}错误: ${error.message}` }; } } /** * 获取拥有的物品列表(数量大于0的) * @param {Object} db 数据库实例 * @param {string} openid 用户openid * @returns {Object} 操作结果 */ async function getOwnedItems(db, openid) { try { let user = await getOrCreaterUser(db, openid); if (!user) { return { code: -4, msg: "未找到用户" }; } const ownedItems = []; for (const itemId in user[DATA_TYPE]) { const count = user[DATA_TYPE][itemId]; if (count > 0) { ownedItems.push({ item_id: parseInt(itemId), count: count }); } } return { code: 200, data: { owned_items: ownedItems, total_types: ownedItems.length }, msg: `拥有的${DATA_TYPE}获取成功` }; } catch (error) { console.error(`获取拥有的${DATA_TYPE}错误:`, error); return { code: -5, msg: `获取拥有的${DATA_TYPE}错误: ${error.message}` }; } } module.exports = { getItems, getItem, addItem, consumeItem, setItem, updateItems, resetItems, getOwnedItems };