// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 批量查询goods表中的记录
async function queryGoodsByIds(goodsIds) {
console.log(`批量查询 goods 表中 ${goodsIds.length} 条记录`)
const result = await db.collection('goods')
.where({
_id: db.command.in(goodsIds)
})
.get()
console.log(`批量查询完成,查询到 ${result.data.length} 条结果`)
// 构建一个 map 以便快速查找 goods 数据
const goodsMap = {}
result.data.forEach(item => {
goodsMap[item._id] = item
})
return goodsMap
}
// 云函数入口函数
exports.main = async (event, context) => {
const pageSize = 100 // 每次查询的条数
let pageIndex = 0
let processedCount = 0 // 累加处理的订单数
let failedOrders = [] // 保存更新失败的订单ID
let hasMore = true
console.log("开始处理已完成的订单...")
while (hasMore) {
// 1. 查询goodorders数据库中state为‘已完成’的数据
const ordersResult = await db.collection('goodorders')
.where({ state: '已完成' })
.skip(pageSize * pageIndex)
.limit(pageSize)
.get()
const orders = ordersResult.data
if (orders.length === 0) {
console.log(`分页 ${pageIndex + 1}: 无更多数据,处理结束`)
hasMore = false
break
}
console.log(`分页 ${pageIndex + 1}: 查询到 ${orders.length} 条订单数据`)
// 2. 提取所有订单中的 snapshot._id
const goodsIds = orders.map(order => order.snapshot._id)
// 3. 批量查询 goods 表中的记录
const goodsMap = await queryGoodsByIds(goodsIds)
// 4. 遍历每条订单数据并处理
for (let order of orders) {
const snapshotId = order.snapshot._id
const goodsItem = goodsMap[snapshotId]
if (goodsItem) {
const tokennumber = goodsItem.tokennumber || 0
const totalToken = tokennumber * order.quantity // 计算 totalToken
console.log(`订单 ${order._id}: 查到的 tokennumber = ${tokennumber},quantity = ${order.quantity},totalToken = ${totalToken}`)
// 5. 更新当前订单的 totalToken 字段和 snapshot 字段
try {
await db.collection('goodorders').doc(order._id).update({
data: {
totalToken: totalToken, // 更新 totalToken 为 tokennumber * quantity
snapshot: goodsItem // 更新 snapshot 字段为最新的 goods 数据
}
})
processedCount++ // 成功处理后计数
console.log(`订单 ${order._id}: 成功更新 totalToken 和 snapshot 字段`)
} catch (error) {
console.error(`订单 ${order._id}: 更新 totalToken 和 snapshot 字段失败`, error)
failedOrders.push(order._id) // 记录失败的订单ID
}
} else {
console.warn(`订单 ${order._id}: 未找到对应的 goods 记录,跳过`)
}
}
// 分页处理
pageIndex++
}
console.log(`已完成的订单处理结束,总共成功处理了 ${processedCount} 条订单`)
console.log(`更新 totalToken 和 snapshot 字段失败的订单有 ${failedOrders.length} 条`)
return {
processedCount,
failedOrders // 返回更新失败的订单ID列表
}
}