|
|
// pages/orders/orders.js
|
|
|
Page({
|
|
|
/**
|
|
|
* 页面的初始数据
|
|
|
*/
|
|
|
data: {
|
|
|
// 当前选中的标签
|
|
|
activeTab: 'all',
|
|
|
// 视角:buyer(买家)/ seller(卖家)
|
|
|
viewRole: 'buyer',
|
|
|
|
|
|
// 订单数据
|
|
|
orders: [],
|
|
|
|
|
|
// 加载状态
|
|
|
isLoading: true
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 生命周期函数--监听页面加载
|
|
|
*/
|
|
|
async onLoad(options) {
|
|
|
// 可以从选项中获取初始标签
|
|
|
if (options.tab) {
|
|
|
this.setData({
|
|
|
activeTab: options.tab
|
|
|
});
|
|
|
}
|
|
|
// 支持通过参数设置初始视角(buyer/seller)
|
|
|
if (options.role && (options.role === 'buyer' || options.role === 'seller')) {
|
|
|
this.setData({ viewRole: options.role });
|
|
|
}
|
|
|
// 清除可能缓存的旧openid,确保使用登录的用户ID获取正确的openid
|
|
|
const userInfo = wx.getStorageSync('userInfo') || {};
|
|
|
if (userInfo._id) {
|
|
|
// 如果有登录的用户ID,清除旧的openid缓存,强制重新获取
|
|
|
wx.removeStorageSync('openid');
|
|
|
}
|
|
|
await this.loadOrders();
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 生命周期函数--监听页面显示
|
|
|
*/
|
|
|
async onShow() {
|
|
|
// 页面显示时强制重新加载订单数据
|
|
|
// 清除可能缓存的旧openid,确保使用登录的用户ID获取正确的openid
|
|
|
const userInfo = wx.getStorageSync('userInfo') || {};
|
|
|
if (userInfo._id) {
|
|
|
// 如果有登录的用户ID,清除旧的openid缓存,强制重新获取
|
|
|
wx.removeStorageSync('openid');
|
|
|
}
|
|
|
await this.loadOrders();
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 页面相关事件处理函数--监听用户下拉动作
|
|
|
*/
|
|
|
async onPullDownRefresh() {
|
|
|
await this.loadOrders();
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 切换订单标签
|
|
|
*/
|
|
|
switchTab(e) {
|
|
|
const tab = e.currentTarget.dataset.tab;
|
|
|
this.setData({
|
|
|
activeTab: tab,
|
|
|
isLoading: true
|
|
|
});
|
|
|
this.loadOrders();
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 切换视角(买家/卖家)
|
|
|
*/
|
|
|
switchRole(e) {
|
|
|
const role = e.currentTarget.dataset.role;
|
|
|
if (!role || (role !== 'buyer' && role !== 'seller')) return;
|
|
|
this.setData({
|
|
|
viewRole: role,
|
|
|
isLoading: true
|
|
|
});
|
|
|
this.loadOrders();
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 确保有openid
|
|
|
*/
|
|
|
async ensureOpenId() {
|
|
|
let openid = wx.getStorageSync('openid');
|
|
|
if (!openid) {
|
|
|
try {
|
|
|
const result = await wx.cloud.callFunction({
|
|
|
name: 'quickstartFunctions',
|
|
|
data: {
|
|
|
type: 'getOpenId'
|
|
|
}
|
|
|
});
|
|
|
if (result.result && result.result.openid) {
|
|
|
openid = result.result.openid;
|
|
|
wx.setStorageSync('openid', openid);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
console.error('获取openid失败:', err);
|
|
|
}
|
|
|
}
|
|
|
return openid;
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 加载订单数据
|
|
|
*/
|
|
|
async loadOrders() {
|
|
|
this.setData({ isLoading: true });
|
|
|
|
|
|
try {
|
|
|
const db = wx.cloud.database();
|
|
|
let openid = null;
|
|
|
|
|
|
// 优先使用登录时保存的用户ID来获取openid
|
|
|
const userInfo = wx.getStorageSync('userInfo') || {};
|
|
|
const loggedInUserId = userInfo._id;
|
|
|
|
|
|
if (loggedInUserId) {
|
|
|
try {
|
|
|
// 使用登录的用户ID查询用户信息,获取其_openid
|
|
|
const userResult = await db.collection('T_user')
|
|
|
.doc(loggedInUserId)
|
|
|
.get();
|
|
|
|
|
|
if (userResult.data && userResult.data._openid) {
|
|
|
openid = userResult.data._openid;
|
|
|
}
|
|
|
} catch (err) {
|
|
|
console.error('通过用户ID获取openid失败:', err);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 如果无法通过用户ID获取openid,尝试从缓存获取
|
|
|
if (!openid) {
|
|
|
openid = await this.ensureOpenId();
|
|
|
}
|
|
|
|
|
|
if (!openid) {
|
|
|
wx.showToast({
|
|
|
title: '请先登录',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
this.setData({
|
|
|
orders: [],
|
|
|
isLoading: false
|
|
|
});
|
|
|
wx.stopPullDownRefresh();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 查询订单:根据视角(买家/卖家)选择查询条件
|
|
|
const _ = db.command;
|
|
|
let query;
|
|
|
if (this.data.viewRole === 'seller') {
|
|
|
if (loggedInUserId) {
|
|
|
query = db.collection('T_order').where({
|
|
|
sellerUserId: loggedInUserId
|
|
|
});
|
|
|
console.log('卖家视角,使用sellerUserId查询订单:', loggedInUserId);
|
|
|
} else {
|
|
|
query = db.collection('T_order').where(
|
|
|
_.or([
|
|
|
{ sellerOpenId: openid },
|
|
|
{ _openid: openid }
|
|
|
])
|
|
|
);
|
|
|
console.log('卖家视角,使用sellerOpenId和_openid查询订单');
|
|
|
}
|
|
|
} else {
|
|
|
// 买家视角
|
|
|
if (loggedInUserId) {
|
|
|
query = db.collection('T_order').where({
|
|
|
buyerUserId: loggedInUserId
|
|
|
});
|
|
|
console.log('买家视角,使用buyerUserId查询订单:', loggedInUserId);
|
|
|
} else {
|
|
|
query = db.collection('T_order').where(
|
|
|
_.or([
|
|
|
{ buyerOpenId: openid },
|
|
|
{ _openid: openid }
|
|
|
])
|
|
|
);
|
|
|
console.log('买家视角,使用buyerOpenId和_openid查询订单');
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 根据标签筛选订单状态
|
|
|
if (this.data.activeTab !== 'all') {
|
|
|
const tab = this.data.activeTab;
|
|
|
if (tab === 'paid') {
|
|
|
// “待发货”页签同时包含“待确认付款”和“待发货”两种状态
|
|
|
query = query.where({
|
|
|
status: _.in(['待确认付款', '待发货'])
|
|
|
});
|
|
|
} else {
|
|
|
const statusMap = {
|
|
|
'pending': '待付款',
|
|
|
'shipped': '待收货',
|
|
|
'completed': '已完成',
|
|
|
'cancelled': '已取消'
|
|
|
};
|
|
|
const status = statusMap[tab];
|
|
|
if (status) {
|
|
|
query = query.where({ status });
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const result = await query
|
|
|
.orderBy('createTime', 'desc')
|
|
|
.get();
|
|
|
|
|
|
console.log('订单查询结果:', result);
|
|
|
|
|
|
if (result.data && result.data.length > 0) {
|
|
|
// 格式化订单数据
|
|
|
const orders = result.data.map(item => {
|
|
|
// 状态映射
|
|
|
const statusMap = {
|
|
|
'待付款': { status: 'pending', statusText: '待付款' },
|
|
|
'待确认付款': { status: 'paid', statusText: '待卖家确认' },
|
|
|
'待发货': { status: 'paid', statusText: '待发货' },
|
|
|
'待收货': { status: 'shipped', statusText: '待收货' },
|
|
|
'已完成': { status: 'completed', statusText: '已完成' },
|
|
|
'已取消': { status: 'cancelled', statusText: '已取消' }
|
|
|
};
|
|
|
|
|
|
const statusInfo = statusMap[item.status] || { status: 'pending', statusText: '待付款' };
|
|
|
|
|
|
// 格式化时间
|
|
|
const orderTime = item.createTime ? this.formatTime(item.createTime) : '';
|
|
|
|
|
|
// 处理商品列表
|
|
|
let products = [];
|
|
|
let totalPrice = 0;
|
|
|
let totalCount = 0;
|
|
|
|
|
|
if (item.products && Array.isArray(item.products)) {
|
|
|
products = item.products;
|
|
|
totalCount = products.length;
|
|
|
totalPrice = products.reduce((sum, p) => sum + (parseFloat(p.price) || 0) * (p.count || 1), 0);
|
|
|
} else if (item.productId) {
|
|
|
// 兼容单个商品的情况
|
|
|
products = [{
|
|
|
productId: item.productId,
|
|
|
name: item.productName || '商品',
|
|
|
price: item.price || 0,
|
|
|
count: 1,
|
|
|
image: item.productImage || 'https://via.placeholder.com/600x400/cccccc/666666?text=商品图'
|
|
|
}];
|
|
|
totalCount = 1;
|
|
|
totalPrice = parseFloat(item.price) || 0;
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
id: item._id,
|
|
|
orderNumber: item.orderNumber || item._id,
|
|
|
orderTime: orderTime,
|
|
|
status: statusInfo.status,
|
|
|
statusText: statusInfo.statusText,
|
|
|
totalCount: totalCount,
|
|
|
totalPrice: totalPrice,
|
|
|
products: products
|
|
|
};
|
|
|
});
|
|
|
|
|
|
this.setData({
|
|
|
orders: orders,
|
|
|
isLoading: false
|
|
|
});
|
|
|
} else {
|
|
|
this.setData({
|
|
|
orders: [],
|
|
|
isLoading: false
|
|
|
});
|
|
|
}
|
|
|
|
|
|
wx.stopPullDownRefresh();
|
|
|
} catch (err) {
|
|
|
console.error('加载订单失败:', err);
|
|
|
this.setData({
|
|
|
orders: [],
|
|
|
isLoading: false
|
|
|
});
|
|
|
wx.stopPullDownRefresh();
|
|
|
wx.showToast({
|
|
|
title: '加载失败',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 格式化时间
|
|
|
*/
|
|
|
formatTime(date) {
|
|
|
if (!date) return '';
|
|
|
const d = new Date(date);
|
|
|
const year = d.getFullYear();
|
|
|
const month = String(d.getMonth() + 1).padStart(2, '0');
|
|
|
const day = String(d.getDate()).padStart(2, '0');
|
|
|
const hours = String(d.getHours()).padStart(2, '0');
|
|
|
const minutes = String(d.getMinutes()).padStart(2, '0');
|
|
|
const seconds = String(d.getSeconds()).padStart(2, '0');
|
|
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 取消订单
|
|
|
*/
|
|
|
async cancelOrder(e) {
|
|
|
const orderId = e.currentTarget.dataset.id;
|
|
|
wx.showModal({
|
|
|
title: '取消订单',
|
|
|
content: '确定要取消该订单吗?',
|
|
|
success: async (res) => {
|
|
|
if (res.confirm) {
|
|
|
try {
|
|
|
const userInfo = wx.getStorageSync('userInfo') || {};
|
|
|
const result = await wx.cloud.callFunction({
|
|
|
name: 'quickstartFunctions',
|
|
|
data: {
|
|
|
type: 'updateOrderStatus',
|
|
|
orderId,
|
|
|
action: 'buyerCancel',
|
|
|
callerUserId: userInfo._id || ''
|
|
|
}
|
|
|
});
|
|
|
if (!result?.result?.success) {
|
|
|
throw new Error(result?.result?.error || '取消失败');
|
|
|
}
|
|
|
|
|
|
wx.showToast({
|
|
|
title: '订单已取消',
|
|
|
icon: 'success'
|
|
|
});
|
|
|
// 标记订单信息已变更,驱动个人中心红点提醒
|
|
|
wx.setStorageSync('orderChanged', true);
|
|
|
|
|
|
// 重新加载订单数据
|
|
|
await this.loadOrders();
|
|
|
} catch (err) {
|
|
|
console.error('取消订单失败:', err);
|
|
|
wx.showToast({
|
|
|
title: '操作失败',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 去付款
|
|
|
*/
|
|
|
payOrder(e) {
|
|
|
const orderId = e.currentTarget.dataset.id;
|
|
|
console.log('开始支付流程,订单ID:', orderId);
|
|
|
|
|
|
// 显示加载中状态
|
|
|
wx.showLoading({
|
|
|
title: '处理中...',
|
|
|
});
|
|
|
|
|
|
// 1. 查找当前订单信息
|
|
|
const order = this.data.orders.find(item => item.id === orderId);
|
|
|
if (!order) {
|
|
|
wx.hideLoading();
|
|
|
wx.showToast({
|
|
|
title: '订单信息不存在',
|
|
|
icon: 'error'
|
|
|
});
|
|
|
console.error('未找到订单信息:', orderId);
|
|
|
return;
|
|
|
}
|
|
|
console.log('找到订单信息:', order);
|
|
|
|
|
|
// 2. 纯逻辑模拟支付,无需真实微信支付
|
|
|
setTimeout(async () => {
|
|
|
try {
|
|
|
const userInfo = wx.getStorageSync('userInfo') || {};
|
|
|
const result = await wx.cloud.callFunction({
|
|
|
name: 'quickstartFunctions',
|
|
|
data: {
|
|
|
type: 'updateOrderStatus',
|
|
|
orderId,
|
|
|
action: 'buyerPay',
|
|
|
callerUserId: userInfo._id || ''
|
|
|
}
|
|
|
});
|
|
|
if (!result?.result?.success) {
|
|
|
throw new Error(result?.result?.error || '支付更新失败');
|
|
|
}
|
|
|
wx.hideLoading();
|
|
|
wx.showToast({
|
|
|
title: '支付成功(模拟)',
|
|
|
icon: 'success'
|
|
|
});
|
|
|
// 标记订单信息已变更,驱动个人中心红点提醒
|
|
|
wx.setStorageSync('orderChanged', true);
|
|
|
// 刷新订单列表
|
|
|
await this.loadOrders();
|
|
|
// 可选:跳转详情页
|
|
|
this.viewOrderDetail(e);
|
|
|
} catch (err) {
|
|
|
console.error('模拟支付更新订单失败:', err);
|
|
|
wx.hideLoading();
|
|
|
wx.showToast({
|
|
|
title: '支付失败(网络)',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
}
|
|
|
}, 600);
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 卖家确认付款
|
|
|
*/
|
|
|
async confirmPayment(e) {
|
|
|
const orderId = e.currentTarget.dataset.id;
|
|
|
console.log('卖家确认收款,订单ID:', orderId);
|
|
|
wx.showModal({
|
|
|
title: '确认收款',
|
|
|
content: '确认已收到买家付款吗?',
|
|
|
success: async (res) => {
|
|
|
if (res.confirm) {
|
|
|
try {
|
|
|
wx.showLoading({ title: '更新中...' });
|
|
|
const userInfo = wx.getStorageSync('userInfo') || {};
|
|
|
const result = await wx.cloud.callFunction({
|
|
|
name: 'quickstartFunctions',
|
|
|
data: {
|
|
|
type: 'updateOrderStatus',
|
|
|
orderId,
|
|
|
action: 'sellerConfirmPayment',
|
|
|
callerUserId: userInfo._id || ''
|
|
|
}
|
|
|
});
|
|
|
if (!result?.result?.success) {
|
|
|
throw new Error(result?.result?.error || '确认收款失败');
|
|
|
}
|
|
|
wx.hideLoading();
|
|
|
wx.showToast({ title: '已确认收款', icon: 'success' });
|
|
|
// 标记订单信息已变更,驱动个人中心红点提醒
|
|
|
wx.setStorageSync('orderChanged', true);
|
|
|
await this.loadOrders();
|
|
|
} catch (err) {
|
|
|
console.error('确认付款失败:', err);
|
|
|
wx.hideLoading();
|
|
|
wx.showToast({
|
|
|
title: '操作失败',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 卖家发货
|
|
|
*/
|
|
|
async shipOrder(e) {
|
|
|
const orderId = e.currentTarget.dataset.id;
|
|
|
wx.showModal({
|
|
|
title: '发货',
|
|
|
content: '确认发货吗?',
|
|
|
success: async (res) => {
|
|
|
if (res.confirm) {
|
|
|
try {
|
|
|
const userInfo = wx.getStorageSync('userInfo') || {};
|
|
|
const result = await wx.cloud.callFunction({
|
|
|
name: 'quickstartFunctions',
|
|
|
data: {
|
|
|
type: 'updateOrderStatus',
|
|
|
orderId,
|
|
|
action: 'sellerShip',
|
|
|
callerUserId: userInfo._id || ''
|
|
|
}
|
|
|
});
|
|
|
if (!result?.result?.success) {
|
|
|
throw new Error(result?.result?.error || '发货失败');
|
|
|
}
|
|
|
wx.showToast({
|
|
|
title: '已发货',
|
|
|
icon: 'success'
|
|
|
});
|
|
|
// 标记订单信息已变更,驱动个人中心红点提醒
|
|
|
wx.setStorageSync('orderChanged', true);
|
|
|
await this.loadOrders();
|
|
|
} catch (err) {
|
|
|
console.error('发货失败:', err);
|
|
|
wx.showToast({
|
|
|
title: '操作失败',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 确认收货
|
|
|
*/
|
|
|
async confirmReceipt(e) {
|
|
|
const orderId = e.currentTarget.dataset.id;
|
|
|
wx.showModal({
|
|
|
title: '确认收货',
|
|
|
content: '确认已收到商品吗?',
|
|
|
success: async (res) => {
|
|
|
if (res.confirm) {
|
|
|
try {
|
|
|
const userInfo = wx.getStorageSync('userInfo') || {};
|
|
|
const result = await wx.cloud.callFunction({
|
|
|
name: 'quickstartFunctions',
|
|
|
data: {
|
|
|
type: 'updateOrderStatus',
|
|
|
orderId,
|
|
|
action: 'buyerConfirmReceipt',
|
|
|
callerUserId: userInfo._id || ''
|
|
|
}
|
|
|
});
|
|
|
if (!result?.result?.success) {
|
|
|
throw new Error(result?.result?.error || '确认收货失败');
|
|
|
}
|
|
|
|
|
|
wx.showToast({
|
|
|
title: '已确认收货',
|
|
|
icon: 'success'
|
|
|
});
|
|
|
// 标记订单信息已变更,驱动个人中心红点提醒
|
|
|
wx.setStorageSync('orderChanged', true);
|
|
|
// 重新加载订单数据
|
|
|
await this.loadOrders();
|
|
|
} catch (err) {
|
|
|
console.error('确认收货失败:', err);
|
|
|
wx.showToast({
|
|
|
title: '操作失败',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 查看订单详情
|
|
|
*/
|
|
|
viewOrderDetail(e) {
|
|
|
const orderId = e.currentTarget.dataset.id;
|
|
|
wx.navigateTo({
|
|
|
url: `/pages/order-detail/order-detail?id=${orderId}`
|
|
|
});
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 再次购买
|
|
|
*/
|
|
|
buyAgain(e) {
|
|
|
const orderId = e.currentTarget.dataset.id;
|
|
|
wx.showToast({
|
|
|
title: '将商品加入购物车',
|
|
|
icon: 'none'
|
|
|
});
|
|
|
// 这里可以实现再次购买的逻辑
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
* 去购物
|
|
|
*/
|
|
|
goShopping() {
|
|
|
wx.switchTab({
|
|
|
url: '/pages/main/main'
|
|
|
});
|
|
|
}
|
|
|
}); |