Files
heros/build-templates/wechatgame/cloud_functions/cocos_cloud/modules/items.js
2025-08-19 22:30:59 +08:00

421 lines
9.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 物品库存操作模块 (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
};