// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()
// 批量查询goods表中的tokennumber
async function queryTokenNumbers(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 以便快速查找 tokennumber
const tokenMap = {}
result.data.forEach(item => {
tokenMap[item._id] = item.tokennumber
})
return tokenMap
}
// 云函数入口函数
exports.main = async (event, context) => {
const pageSize = 100 // 每次查询的条数
let pageIndex = 0
let processedCount = 0 // 累加处理的订单数
let failedOrders = [] // 保存调用云函数 'token' 失败的订单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 表中的 tokennumber
const tokenMap = await queryTokenNumbers(goodsIds)
// 4. 遍历每条订单数据并处理
for (let order of orders) {
const snapshotId = order.snapshot._id
const tokennumber = tokenMap[snapshotId] || 0
console.log(`订单 ${order._id}: tokennumber = ${tokennumber}`)
// 判断 tokennumber 是否大于 0,如果大于 0 则调用云函数‘token’
if (tokennumber > 0) {
console.log(`订单 ${order._id}: tokennumber 大于 0,调用云函数 'token'`)
let data = {
openid: order._openid,
time: order.createTime,
number: tokennumber * order.quantity,
mark: '购物赠送',
module: 'shop',
moduleId: order._id
}
console.log(`准备调用云函数 'token',传递的数据:`, data)
try {
await cloud.callFunction({
name: 'token',
data: data
})
processedCount++ // 成功处理后计数
console.log(`订单 ${order._id}: 成功调用云函数 'token'`)
} catch (error) {
console.error(`订单 ${order._id}: 调用云函数 'token' 失败`, error)
failedOrders.push(order._id) // 记录失败的订单ID
}
} else {
console.log(`订单 ${order._id}: tokennumber 小于或等于 0,跳过`)
}
}
// 分页处理
pageIndex++
}
console.log(`已完成的订单处理结束,总共成功处理了 ${processedCount} 条订单`)
console.log(`调用云函数 'token' 失败的订单有 ${failedOrders.length} 条`)
return {
processedCount,
failedOrders // 返回调用失败的订单ID列表
}
}