Files
ai_dianshang/miniprogram/pages/order/order-confirm/index.js

1155 lines
39 KiB
JavaScript
Raw Normal View History

2025-11-17 14:11:46 +08:00
import Toast from 'tdesign-miniprogram/toast/index';
import { fetchSettleDetail } from '../../../services/order/orderConfirm';
import { commitPay, wechatPayOrder } from './pay';
import { getAddressPromise } from '../../../services/address/list';
import { fetchDeliveryAddress, parseAddressRegion } from '../../../services/address/fetchAddress';
// 保留错误日志工具
const logger = {
error: (module, message, data = {}) => {
console.error(`[ERROR][${module}] ${message}`, data);
}
};
const stripeImg = `https://tdesign.gtimg.com/miniprogram/template/retail/order/stripe.png`;
Page({
data: {
placeholder: '备注信息',
stripeImg,
loading: false,
payLock: false,
settleDetailData: {
storeGoodsList: [], //正常下单商品列表
outOfStockGoodsList: [], //库存不足商品
abnormalDeliveryGoodsList: [], // 不能正常配送商品
inValidGoodsList: [], // 失效或者库存不足
limitGoodsList: [], //限购商品
couponList: [], //门店优惠券信息
}, // 获取结算页详情 data
orderCardList: [], // 仅用于商品卡片展示
couponsShow: false, // 显示优惠券的弹框
invoiceData: {
email: '', // 发票发送邮箱
buyerTaxNo: '', // 税号
invoiceType: null, // 开票类型 1增值税专用发票 2增值税普通发票 3增值税电子发票4增值税卷式发票5区块链电子发票。
buyerPhone: '', //手机号
buyerName: '', //个人或公司名称
titleType: '', // 发票抬头 1-公司 2-个人
contentType: '', //发票内容 1-明细 2-类别
},
goodsRequestList: [],
userAddressReq: null,
popupShow: false, // 不在配送范围 失效 库存不足 商品展示弹框
notesPosition: 'center',
storeInfoList: [],
storeNoteIndex: 0, //当前填写备注门店index
promotionGoodsList: [], //当前门店商品列表(优惠券)
couponList: [], //当前门店所选优惠券
submitCouponList: [], //所有门店所选优惠券
currentStoreId: '', //当前优惠券storeId
userAddress: null,
},
payLock: false,
noteInfo: [],
tempNoteInfo: [],
onLoad(options) {
this.setData({
loading: true,
});
// 确保有有效的token
this.ensureValidToken().then(() => {
// 如果没有传入地址信息,则自动获取默认地址
if (!options.userAddressReq) {
this.loadDefaultAddress(options);
} else {
this.handleOptionsParams(options);
}
}).catch((error) => {
logger.error('ORDER_CONFIRM_PAGE', '设置token失败', { error });
// 即使token设置失败也继续初始化页面
if (!options.userAddressReq) {
this.loadDefaultAddress(options);
} else {
this.handleOptionsParams(options);
}
});
},
// 确保有有效的token
ensureValidToken() {
return new Promise((resolve, reject) => {
try {
const existingToken = wx.getStorageSync('token');
if (existingToken) {
resolve();
return;
}
// 如果没有token设置一个测试用的有效token
const testToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX3R5cGUiOiJ1c2VyIiwiaXNzIjoiZGlhbnNoYW5nIiwiZXhwIjoxNzYwMDcyNDk2LCJuYmYiOjE3NjAwNjUyOTYsImlhdCI6MTc2MDA2NTI5Nn0.mnpIlCY-wUMgaEwNMOqGPKFFWWQKuobQhPk0AQGUKd0';
wx.setStorageSync('token', testToken);
resolve();
} catch (error) {
logger.error('ORDER_CONFIRM_PAGE', '设置token时出错', { error });
reject(error);
}
});
},
onShow() {
const invoiceData = wx.getStorageSync('invoiceData');
if (invoiceData) {
//处理发票
this.invoiceData = invoiceData;
this.setData({
invoiceData,
});
wx.removeStorageSync('invoiceData');
}
// 检查是否有地址选择返回的数据
const selectedAddress = wx.getStorageSync('selectedAddress');
if (selectedAddress) {
// 使用解析函数处理地址数据,确保包含完整的区域信息
const parsedAddress = parseAddressRegion(selectedAddress);
// 清除存储的地址数据
wx.removeStorageSync('selectedAddress');
// 设置地址数据到页面状态 - 修复同时设置userAddress和userAddressReq
this.setData({
userAddress: parsedAddress,
userAddressReq: { ...parsedAddress, checked: true }
});
// 使用新选择的地址重新获取结算数据
this.handleOptionsParams({
userAddressReq: { ...parsedAddress, checked: true },
});
}
// 检查是否从优惠券中心返回,如果是则刷新优惠券数据
const shouldRefreshCoupons = wx.getStorageSync('shouldRefreshCoupons');
if (shouldRefreshCoupons) {
// 清除标识
wx.removeStorageSync('shouldRefreshCoupons');
// 重新获取结算数据以刷新优惠券列表
if (this.goodsRequestList && this.goodsRequestList.length > 0) {
this.handleOptionsParams({
goodsRequestList: this.goodsRequestList,
userAddressReq: this.userAddressReq
});
}
}
},
init() {
this.setData({
loading: true,
});
const { goodsRequestList } = this;
this.handleOptionsParams({ goodsRequestList });
},
// 加载默认地址
loadDefaultAddress(options) {
fetchDeliveryAddress()
.then((defaultAddress) => {
if (defaultAddress) {
// 使用解析函数处理地址数据,确保包含完整的区域信息
const parsedAddress = parseAddressRegion(defaultAddress);
// 将解析后的地址转换为订单确认页面需要的格式
const userAddressReq = {
...parsedAddress,
checked: true
};
// 设置地址数据到页面状态
this.setData({
userAddressReq: userAddressReq,
userAddress: parsedAddress
});
// 使用默认地址初始化页面
const optionsWithAddress = {
...options,
userAddressReq
};
this.handleOptionsParams(optionsWithAddress);
} else {
this.handleOptionsParams(options);
}
})
.catch((error) => {
logger.error('ORDER_CONFIRM_PAGE', '获取默认地址失败', { error });
// 获取默认地址失败时,继续正常初始化
this.handleOptionsParams(options);
});
},
// 处理不同情况下跳转到结算页时需要的参数
handleOptionsParams(options, couponList) {
let { goodsRequestList } = this; // 商品列表
let { userAddressReq } = this; // 收货地址
const storeInfoList = []; // 门店列表
// 处理地址信息
if (options.userAddressReq) {
userAddressReq = options.userAddressReq;
// 设置地址数据到页面状态
this.setData({
userAddress: options.userAddressReq
});
}
if (options.type === 'cart') {
// 从购物车获取商品列表
const goodsRequestListJson = wx.getStorageSync('order.goodsRequestList');
goodsRequestList = JSON.parse(goodsRequestListJson);
} else if (typeof options.goodsRequestList === 'string') {
const raw = options.goodsRequestList;
try {
goodsRequestList = JSON.parse(raw);
} catch (e) {
try {
goodsRequestList = JSON.parse(decodeURIComponent(raw));
} catch (err) {
logger.error('ORDER_CONFIRM_PAGE', '解析商品列表失败', { error: err, raw });
goodsRequestList = [];
}
}
}
//获取结算页请求数据列表
const storeMap = {};
goodsRequestList.forEach((goods) => {
if (!storeMap[goods.storeId]) {
storeInfoList.push({
storeId: goods.storeId,
storeName: goods.storeName,
});
storeMap[goods.storeId] = true;
}
});
this.goodsRequestList = goodsRequestList;
this.storeInfoList = storeInfoList;
// 添加调试日志,查看接收到的商品数据
console.log('=== 订单确认页面接收到的商品数据 ===');
console.log('goodsRequestList:', JSON.stringify(goodsRequestList, null, 2));
goodsRequestList.forEach((item, index) => {
console.log(`商品 ${index + 1}:`, {
spuId: item.spuId,
skuId: item.skuId,
title: item.title,
specInfo: item.specInfo,
price: item.price,
quantity: item.quantity
});
});
const params = {
goodsRequestList,
storeInfoList,
userAddressReq,
couponList,
};
fetchSettleDetail(params).then(
(res) => {
this.setData({
loading: false,
});
this.initData(res.data);
},
(error) => {
logger.error('ORDER_CONFIRM_PAGE', '结算接口调用失败', {
error: error.message || error,
params,
stack: error.stack
});
//接口异常处理
this.handleError();
},
);
},
initData(resData) {
logger.error('order-confirm', 'initData called with:', resData);
logger.error('order-confirm', 'settleType:', resData.settleType);
// 为可能缺失的字段提供默认值
const data = {
...resData,
storeGoodsList: resData.storeGoodsList || [],
limitGoodsList: resData.limitGoodsList || [],
abnormalDeliveryGoodsList: resData.abnormalDeliveryGoodsList || [],
inValidGoodsList: resData.inValidGoodsList || [],
outOfStockGoodsList: resData.outOfStockGoodsList || [],
couponList: resData.couponList || [],
deliveryFeeList: resData.deliveryFeeList || [],
invoiceRequest: resData.invoiceRequest || null,
invoiceSupport: resData.invoiceSupport || 0
};
logger.error('order-confirm', 'storeGoodsList length:', data.storeGoodsList.length);
logger.error('order-confirm', 'limitGoodsList length:', data.limitGoodsList.length);
logger.error('order-confirm', 'abnormalDeliveryGoodsList length:', data.abnormalDeliveryGoodsList.length);
logger.error('order-confirm', 'inValidGoodsList length:', data.inValidGoodsList.length);
const isInvalid = this.isInvalidOrder(data);
logger.error('order-confirm', 'isInvalidOrder result:', isInvalid);
if (isInvalid) {
logger.error('order-confirm', 'Order is invalid, calling handleError');
this.handleError();
return;
}
// 处理用户地址信息
if (data.userAddress) {
const userAddress = data.userAddress;
// 解析地址区域信息
const addressRegion = parseAddressRegion(userAddress);
// 设置用户地址到页面data
this.setData({
userAddress: {
...userAddress,
...addressRegion
}
});
logger.error('order-confirm', 'User address set:', {
...userAddress,
...addressRegion
});
} else {
logger.error('order-confirm', 'No user address in response');
}
// 处理商品数据,生成商品卡片列表
this.handleResToGoodsCard(data);
// 设置结算详情数据
this.setData({
settleDetailData: data,
});
logger.error('order-confirm', 'initData completed successfully');
},
isInvalidOrder(data) {
console.log('[isInvalidOrder] 开始检查订单有效性', data);
// 失效 不在配送范围 限购的商品 提示弹窗
console.log('[isInvalidOrder] 检查商品状态:');
console.log('[isInvalidOrder] - limitGoodsList:', data.limitGoodsList);
console.log('[isInvalidOrder] - abnormalDeliveryGoodsList:', data.abnormalDeliveryGoodsList);
console.log('[isInvalidOrder] - inValidGoodsList:', data.inValidGoodsList);
// 修复正确处理undefined和null值只有当数组存在且长度大于0时才认为有问题商品
const hasLimitGoods = Array.isArray(data.limitGoodsList) && data.limitGoodsList.length > 0;
const hasAbnormalDeliveryGoods = Array.isArray(data.abnormalDeliveryGoodsList) && data.abnormalDeliveryGoodsList.length > 0;
const hasInValidGoods = Array.isArray(data.inValidGoodsList) && data.inValidGoodsList.length > 0;
console.log('[isInvalidOrder] 问题商品检查结果:');
console.log('- hasLimitGoods:', hasLimitGoods);
console.log('- hasAbnormalDeliveryGoods:', hasAbnormalDeliveryGoods);
console.log('- hasInValidGoods:', hasInValidGoods);
if (hasLimitGoods || hasAbnormalDeliveryGoods || hasInValidGoods) {
console.log('[isInvalidOrder] 发现问题商品,显示弹窗');
this.setData({ popupShow: true });
return true;
}
console.log('[isInvalidOrder] 商品状态检查通过');
this.setData({ popupShow: false });
// 检查是否有有效的商品列表
console.log('[isInvalidOrder] 检查商品列表:', data.storeGoodsList);
if (!Array.isArray(data.storeGoodsList) || data.storeGoodsList.length === 0) {
console.log('[isInvalidOrder] 商品列表为空或不存在,订单无效');
return true;
}
console.log('[isInvalidOrder] 商品列表检查通过,商品数量:', data.storeGoodsList.length);
// settleType为0只是表示没有地址不应该视为无效订单
// 用户可以在订单确认页面选择地址
console.log('[isInvalidOrder] 订单有效性检查完成,订单有效');
return false;
},
handleError() {
this.setData({
loading: false,
});
Toast({
context: this,
selector: '#t-toast',
message: '获取订单信息失败,请重试',
theme: 'error',
direction: 'column',
});
// 延迟返回上一页,给用户时间看到错误提示
setTimeout(() => {
wx.navigateBack({
delta: 1,
});
}, 2000);
},
getRequestGoodsList(storeGoodsList) {
const filterStoreGoodsList = [];
storeGoodsList &&
storeGoodsList.forEach((store) => {
const { storeName } = store;
store.skuDetailVos &&
store.skuDetailVos.forEach((goods) => {
const data = goods;
data.storeName = storeName;
filterStoreGoodsList.push(data);
});
});
return filterStoreGoodsList;
},
handleGoodsRequest(goods, isOutStock = false) {
const { reminderStock, quantity, storeId, uid, saasId, spuId, goodsName, skuId, storeName, roomId } = goods;
const resQuantity = isOutStock ? reminderStock : quantity;
return {
quantity: resQuantity,
storeId,
uid,
saasId,
spuId,
goodsName,
skuId,
storeName,
roomId,
};
},
handleResToGoodsCard(data) {
// 数据校验
if (!data) {
console.error('结算数据为空:', data);
wx.showToast({
title: '获取订单信息失败',
icon: 'none'
});
return data;
}
// 转换数据 符合 goods-card展示
const orderCardList = []; // 订单卡片列表
const storeInfoList = [];
const submitCouponList = []; //使用优惠券列表;
// 检查 storeGoodsList 是否存在且为数组
if (!data.storeGoodsList || !Array.isArray(data.storeGoodsList)) {
console.error('storeGoodsList 数据异常:', data.storeGoodsList);
wx.showToast({
title: '商品信息异常',
icon: 'none'
});
this.setData({ orderCardList, storeInfoList, submitCouponList });
return data;
}
data.storeGoodsList.forEach((ele) => {
// 检查店铺数据
if (!ele || !ele.skuDetailVos || !Array.isArray(ele.skuDetailVos)) {
console.error('店铺商品数据异常:', ele);
return;
}
const orderCard = {
id: ele.storeId || '1000',
storeName: ele.storeName || '默认店铺',
status: 0,
statusDesc: '',
amount: ele.storeTotalPayAmount || 0,
goodsList: [],
}; // 订单卡片
ele.skuDetailVos.forEach((item, index) => {
// 检查商品数据
if (!item || !item.spuId) {
console.error('商品数据异常:', item);
return;
}
orderCard.goodsList.push({
id: index,
thumb: item.image || '',
title: item.goodsName || '商品名称',
specs: (item.skuSpecLst || []).map((s) => s.specValue || ''), // 规格列表 string[]
price: item.tagPrice || item.settlePrice || '0', // 优先取限时活动价
settlePrice: item.settlePrice || 0,
titlePrefixTags: item.tagText ? [{ text: item.tagText }] : [],
num: item.quantity || 1,
skuId: item.skuId || item.spuId,
spuId: item.spuId,
storeId: item.storeId || ele.storeId || '1000',
});
});
if (orderCard.goodsList.length > 0) {
storeInfoList.push({
storeId: ele.storeId || '1000',
storeName: ele.storeName || '默认店铺',
remark: '',
});
submitCouponList.push({
storeId: ele.storeId || '1000',
couponList: ele.couponList || [],
});
this.noteInfo.push('');
this.tempNoteInfo.push('');
orderCardList.push(orderCard);
}
});
this.setData({ orderCardList, storeInfoList, submitCouponList });
return data;
},
onGotoAddress() {
getAddressPromise()
.then((address) => {
// 地址选择成功处理
})
.catch((error) => {
// 地址选择失败处理
});
const { userAddressReq } = this; // 收货地址
let id = '';
if (userAddressReq?.id) {
id = `&id=${userAddressReq.id}`;
}
const addressUrl = `/pages/user/address/list/index?selectMode=1&isOrderSure=1${id}`;
wx.navigateTo({
url: addressUrl,
});
},
onNotes(e) {
const { storenoteindex: storeNoteIndex } = e.currentTarget.dataset;
// 添加备注信息
this.setData({
dialogShow: true,
storeNoteIndex,
});
},
onInput(e) {
const { storeNoteIndex } = this.data;
this.noteInfo[storeNoteIndex] = e.detail.value;
},
onBlur() {
this.setData({
notesPosition: 'center',
});
},
onFocus() {
this.setData({
notesPosition: 'self',
});
},
onTap() {
this.setData({
placeholder: '',
});
},
onNoteConfirm() {
// 备注信息 确认按钮
const { storeInfoList, storeNoteIndex } = this.data;
if (storeInfoList && storeInfoList[storeNoteIndex]) {
this.tempNoteInfo[storeNoteIndex] = this.noteInfo[storeNoteIndex];
storeInfoList[storeNoteIndex].remark = this.noteInfo[storeNoteIndex];
}
this.setData({
dialogShow: false,
storeInfoList,
});
},
onNoteCancel() {
// 备注信息 取消按钮
const { storeNoteIndex } = this.data;
this.noteInfo[storeNoteIndex] = this.tempNoteInfo[storeNoteIndex];
this.setData({
dialogShow: false,
});
},
onSureCommit() {
// 商品库存不足继续结算
const { settleDetailData } = this.data;
const { outOfStockGoodsList, storeGoodsList, inValidGoodsList } = settleDetailData;
if ((outOfStockGoodsList && outOfStockGoodsList.length > 0) || (inValidGoodsList && storeGoodsList)) {
// 合并正常商品 和 库存 不足商品继续支付
// 过滤不必要的参数
const filterOutGoodsList = [];
outOfStockGoodsList &&
outOfStockGoodsList.forEach((outOfStockGoods) => {
const { storeName } = outOfStockGoods;
outOfStockGoods.unSettlementGoods.forEach((ele) => {
const data = ele;
data.quantity = ele.reminderStock;
data.storeName = storeName;
filterOutGoodsList.push(data);
});
});
const filterStoreGoodsList = this.getRequestGoodsList(storeGoodsList);
const goodsRequestList = filterOutGoodsList.concat(filterStoreGoodsList);
this.handleOptionsParams({ goodsRequestList });
}
},
// 提交订单
submitOrder() {
console.log('=== 订单提交开始 ===');
console.log('submitOrder函数被调用时间:', new Date().toLocaleString());
const { settleDetailData, userAddressReq, invoiceData, storeInfoList, submitCouponList } = this.data;
const { goodsRequestList } = this;
// 详细日志:检查关键数据
console.log('订单提交数据检查:');
console.log('- settleDetailData:', settleDetailData);
console.log('- userAddressReq:', userAddressReq);
console.log('- goodsRequestList:', goodsRequestList);
console.log('- storeInfoList:', storeInfoList);
console.log('- submitCouponList:', submitCouponList);
console.log('- invoiceData:', invoiceData);
// 检查收货地址
if (!userAddressReq && !settleDetailData.userAddress) {
console.log('❌ 订单提交失败:缺少收货地址');
console.log('- userAddressReq:', userAddressReq);
console.log('- settleDetailData.userAddress:', settleDetailData.userAddress);
Toast({
context: this,
selector: '#t-toast',
message: '请添加收货地址',
duration: 2000,
icon: 'help-circle',
});
return;
}
console.log('✅ 收货地址检查通过');
// 检查支付锁和必要参数
console.log('支付锁和参数检查:');
console.log('- payLock:', this.data.payLock);
console.log('- totalAmount:', settleDetailData.totalAmount);
if (this.data.payLock || !settleDetailData.totalAmount) {
if (this.data.payLock) {
console.log('❌ 订单提交失败:支付锁已激活,防止重复提交');
Toast({
context: this,
selector: '#t-toast',
message: '订单正在提交中,请勿重复点击',
duration: 1500,
icon: 'loading',
});
} else if (!settleDetailData.totalAmount) {
console.log('❌ 订单提交失败缺少totalAmount');
Toast({
context: this,
selector: '#t-toast',
message: '订单金额异常,请重试',
duration: 2000,
icon: 'error',
});
}
return;
}
console.log('✅ 支付锁和参数检查通过');
console.log('🔒 开始提交订单,设置提交锁');
this.setData({ payLock: true });
this.payLock = true;
console.log('📦 构建订单提交参数...');
console.log('🎫 优惠券数据调试:');
console.log('- 原始submitCouponList:', submitCouponList);
console.log('- 原始submitCouponList类型:', typeof submitCouponList);
console.log('- 原始submitCouponList是否为数组:', Array.isArray(submitCouponList));
const resSubmitCouponList = this.handleCouponList(submitCouponList);
console.log('=== resSubmitCouponList 详细打印 ===');
console.log('- resSubmitCouponList:', resSubmitCouponList);
console.log('- resSubmitCouponList类型:', typeof resSubmitCouponList);
console.log('- resSubmitCouponList是否为数组:', Array.isArray(resSubmitCouponList));
console.log('- resSubmitCouponList长度:', resSubmitCouponList ? resSubmitCouponList.length : 'null/undefined');
console.log('- resSubmitCouponList JSON字符串:', JSON.stringify(resSubmitCouponList, null, 2));
if (resSubmitCouponList && resSubmitCouponList.length > 0) {
console.log('=== 优惠券列表详情 ===');
resSubmitCouponList.forEach((coupon, index) => {
console.log(`- 优惠券[${index}]:`, coupon);
console.log(`- 优惠券[${index}] ID字段:`, {
id: coupon.id,
couponId: coupon.couponId,
userCouponId: coupon.userCouponId,
storeId: coupon.storeId,
name: coupon.name,
type: coupon.type
});
});
console.log('- 第一张优惠券的userCouponId:', resSubmitCouponList[0].userCouponId);
console.log('- 第一张优惠券的userCouponId类型:', typeof resSubmitCouponList[0].userCouponId);
} else {
console.log('=== 无优惠券选择 ===');
console.log('- resSubmitCouponList为空或长度为0');
}
// 调试用户地址信息
console.log('🏠 用户地址信息检查:');
console.log('- settleDetailData.userAddress:', settleDetailData.userAddress);
console.log('- userAddressReq:', userAddressReq);
const finalUserAddress = settleDetailData.userAddress || userAddressReq;
const finalUserName = (settleDetailData.userAddress && settleDetailData.userAddress.name) || (userAddressReq && userAddressReq.name);
console.log('- 最终使用的地址:', finalUserAddress);
console.log('- 最终使用的用户名:', finalUserName);
const params = {
userAddressReq: finalUserAddress,
goodsRequestList: goodsRequestList,
userName: finalUserName,
totalAmount: settleDetailData.totalPayAmount, //取优惠后的结算金额
invoiceRequest: null,
storeInfoList,
couponList: resSubmitCouponList,
};
if (invoiceData && invoiceData.email) {
console.log('📄 添加发票信息:', invoiceData);
params.invoiceRequest = invoiceData;
}
console.log('📋 最终提交参数:', params);
console.log('🚀 开始调用commitPay API...');
commitPay(params).then(
(res) => {
console.log('✅ commitPay API调用成功');
console.log('📥 API响应数据:', res);
console.log('- 响应码:', res.code);
console.log('- 响应消息:', res.msg);
console.log('- 响应数据:', res.data);
const { data } = res;
// 注意commitPay API响应的data结构与fetchSettleDetail不同
// 此时订单已经提交成功,不需要再次验证订单有效性
console.log('✅ 订单已提交成功,跳过有效性检查');
if (res.code === 'Success') {
console.log('🎉 订单提交成功,开始处理支付');
console.log('- 支付数据:', data);
console.log('- 结算数据:', settleDetailData);
// 注意:这里不释放锁,在支付完成后才释放
this.handlePay(data, settleDetailData);
} else {
console.log('❌ 订单提交失败响应码不是Success');
console.log('- 实际响应码:', res.code);
console.log('- 错误消息:', res.msg);
console.log('🔓 释放提交锁');
this.setData({ payLock: false });
this.payLock = false;
Toast({
context: this,
selector: '#t-toast',
message: res.msg || '提交订单超时,请稍后重试',
duration: 2000,
icon: 'error-circle',
});
setTimeout(() => {
console.log('⬅️ 返回购物车');
// 提交支付失败 返回购物车
wx.navigateBack();
}, 2000);
}
},
(err) => {
console.log('💥 commitPay API调用失败');
console.error('❌ 订单提交异常,释放提交锁', err);
console.log('- 错误类型:', typeof err);
console.log('- 错误码:', err.code);
console.log('- 错误消息:', err.msg);
console.log('- 完整错误对象:', err);
console.log('🔓 释放提交锁');
this.setData({ payLock: false });
this.payLock = false;
if (err.code === 'CONTAINS_INSUFFICIENT_GOODS' || err.code === 'TOTAL_AMOUNT_DIFFERENT') {
console.log('🛒 处理库存不足或金额不匹配错误');
Toast({
context: this,
selector: '#t-toast',
message: err.msg || '支付异常',
duration: 2000,
icon: 'error-circle',
});
console.log('🔄 重新初始化页面数据');
this.init();
} else if (err.code === 'ORDER_PAY_FAIL') {
console.log('💳 处理支付失败错误');
Toast({
context: this,
selector: '#t-toast',
message: '支付失败',
duration: 2000,
icon: 'close-circle',
});
setTimeout(() => {
console.log('📱 跳转到订单列表页面');
wx.redirectTo({ url: '/pages/order/order-list/index' });
});
} else if (err.code === 'ILLEGAL_CONFIG_PARAM') {
console.log('⚙️ 处理微信支付配置错误');
Toast({
context: this,
selector: '#t-toast',
message: '支付失败,微信支付商户号设置有误,请商家重新检查支付设置。',
duration: 2000,
icon: 'close-circle',
});
setTimeout(() => {
console.log('📱 跳转到订单列表页面');
wx.redirectTo({ url: '/pages/order/order-list/index' });
});
} else {
console.log('🔄 处理其他类型错误');
Toast({
context: this,
selector: '#t-toast',
message: err.msg || '提交支付超时,请稍后重试',
duration: 2000,
icon: 'error-circle',
});
setTimeout(() => {
console.log('⬅️ 返回购物车');
// 提交支付失败 返回购物车
wx.navigateBack();
}, 2000);
}
},
);
},
// 处理支付
handlePay(data, settleDetailData) {
console.log('💳 [handlePay] 开始处理支付流程');
console.log('[handlePay] 支付数据:', data);
console.log('[handlePay] 结算数据:', settleDetailData);
const { channel, payInfo, tradeNo, interactId, transactionId } = data;
const { totalAmount, totalPayAmount } = settleDetailData;
console.log('[handlePay] 解析支付参数:');
console.log('- channel:', channel);
console.log('- payInfo:', payInfo);
console.log('- tradeNo:', tradeNo);
console.log('- interactId:', interactId);
console.log('- transactionId:', transactionId);
console.log('- totalAmount:', totalAmount);
console.log('- totalPayAmount:', totalPayAmount);
const payOrderInfo = {
payInfo: payInfo,
orderId: tradeNo,
orderAmt: totalAmount,
payAmt: totalPayAmount,
interactId: interactId,
tradeNo: tradeNo,
transactionId: transactionId,
};
console.log('[handlePay] 构建支付订单信息:', payOrderInfo);
if (channel === 'wechat') {
console.log('🎯 [handlePay] 使用微信支付渠道');
console.log('[handlePay] 调用wechatPayOrder函数...');
// 传递页面上下文给支付函数
wechatPayOrder(payOrderInfo, this).then(() => {
console.log('✅ [handlePay] 微信支付流程完成');
console.log('🔓 [handlePay] 支付成功,释放支付锁');
// 支付成功后释放锁
this.setData({ payLock: false });
this.payLock = false;
}).catch((error) => {
console.error('❌ [handlePay] 微信支付流程失败:', error);
console.log('- 错误类型:', typeof error);
console.log('- 错误消息:', error.message || error);
console.log('- 完整错误对象:', error);
console.log('🔓 [handlePay] 支付失败,释放支付锁');
// 支付失败时释放锁
this.setData({ payLock: false });
this.payLock = false;
console.log('📱 [handlePay] 显示支付失败提示');
Toast({
context: this,
selector: '#t-toast',
message: '支付失败,请重试',
duration: 2000,
icon: 'close-circle',
});
});
} else {
console.warn('⚠️ [handlePay] 不支持的支付渠道:', channel);
console.log('🔓 [handlePay] 不支持的支付方式,释放支付锁');
// 不支持的支付方式时释放锁
this.setData({ payLock: false });
this.payLock = false;
console.log('📱 [handlePay] 显示不支持支付方式提示');
Toast({
context: this,
selector: '#t-toast',
message: '不支持的支付方式',
duration: 2000,
icon: 'close-circle',
});
}
},
hide() {
// 隐藏 popup
this.setData({
'settleDetailData.abnormalDeliveryGoodsList': [],
});
},
onReceipt() {
// 跳转 开发票
const invoiceData = this.invoiceData || {};
wx.navigateTo({
url: `/pages/order/receipt/index?invoiceData=${JSON.stringify(invoiceData)}`,
});
},
onCoupons(e) {
const { submitCouponList, currentStoreId } = this.data;
const { goodsRequestList } = this;
const { selectedList } = e.detail;
console.log('=== 优惠券选择事件详细调试 ===');
console.log('selectedList:', selectedList);
console.log('selectedList JSON:', JSON.stringify(selectedList, null, 2));
console.log('selectedList 数据结构:', selectedList.map(item => ({
id: item.id,
userCouponId: item.userCouponId,
couponId: item.couponId,
key: item.key,
storeId: item.storeId,
allFields: Object.keys(item),
fullItem: item
})));
console.log('currentStoreId:', currentStoreId);
console.log('submitCouponList:', submitCouponList);
// 检查selectedList中每个优惠券的关键字段
selectedList.forEach((item, index) => {
console.log(`=== 优惠券 ${index + 1} 详细字段检查 ===`);
console.log(`- id: ${item.id} (类型: ${typeof item.id})`);
console.log(`- userCouponId: ${item.userCouponId} (类型: ${typeof item.userCouponId})`);
console.log(`- couponId: ${item.couponId} (类型: ${typeof item.couponId})`);
console.log(`- key: ${item.key} (类型: ${typeof item.key})`);
console.log(`- storeId: ${item.storeId} (类型: ${typeof item.storeId})`);
console.log(`- 是否有userCouponId字段: ${item.hasOwnProperty('userCouponId')}`);
console.log(`- userCouponId是否为null/undefined: ${item.userCouponId == null}`);
});
// 更新选中的优惠券列表
console.log('=== 构建tempSubmitCouponList ===');
const tempSubmitCouponList = submitCouponList.map((storeCoupon) => {
const isCurrentStore = storeCoupon.storeId === currentStoreId;
const couponList = isCurrentStore ? selectedList : storeCoupon.couponList;
console.log(`店铺 ${storeCoupon.storeId}:`, {
isCurrentStore,
originalCouponList: storeCoupon.couponList,
newCouponList: couponList,
couponListLength: couponList ? couponList.length : 0
});
if (isCurrentStore && couponList) {
console.log('当前店铺的优惠券详情:', couponList.map(item => ({
id: item.id,
userCouponId: item.userCouponId,
couponId: item.couponId,
hasUserCouponId: item.hasOwnProperty('userCouponId'),
userCouponIdValue: item.userCouponId
})));
}
return {
storeId: storeCoupon.storeId,
couponList: couponList,
};
});
console.log('=== tempSubmitCouponList 构建完成 ===');
console.log('tempSubmitCouponList:', JSON.stringify(tempSubmitCouponList, null, 2));
const resSubmitCouponList = this.handleCouponList(tempSubmitCouponList);
console.log('=== 处理后的优惠券列表详细调试 ===');
console.log('resSubmitCouponList:', resSubmitCouponList);
console.log('resSubmitCouponList 数据结构:', resSubmitCouponList.map(item => ({
id: item.id,
userCouponId: item.userCouponId,
couponId: item.couponId,
allFields: Object.keys(item)
})));
//确定选择优惠券
this.handleOptionsParams({ goodsRequestList }, resSubmitCouponList);
this.setData({
couponsShow: false,
submitCouponList: tempSubmitCouponList
});
},
onOpenCoupons(e) {
const { storeid } = e.currentTarget.dataset;
const { storeInfoList = [], submitCouponList = [] } = this.data;
console.log('onOpenCoupons 调用:', {
storeid,
storeInfoListLength: storeInfoList.length,
submitCouponListLength: submitCouponList.length
});
// 查找当前店铺的商品列表
const currentStore = storeInfoList.find(store => store.storeId === storeid);
const promotionGoodsList = (currentStore && currentStore.goodsList) ? currentStore.goodsList : [];
// 查找当前店铺的已选优惠券
const currentStoreCoupons = submitCouponList.find(store => store.storeId === storeid);
const couponList = (currentStoreCoupons && currentStoreCoupons.couponList) ? currentStoreCoupons.couponList : [];
console.log('打开优惠券选择:', {
storeid,
currentStore: !!currentStore,
currentStoreCoupons: !!currentStoreCoupons,
promotionGoodsListLength: promotionGoodsList.length,
couponListLength: couponList.length
});
this.setData({
couponsShow: true,
currentStoreId: String(storeid || ''),
promotionGoodsList,
couponList
});
console.log('setData后的状态:', {
couponsShow: this.data.couponsShow,
currentStoreId: this.data.currentStoreId,
promotionGoodsListLength: this.data.promotionGoodsList.length,
couponListLength: this.data.couponList.length
});
},
onCouponsClose() {
console.log('优惠券弹窗关闭');
this.setData({
couponsShow: false
});
},
handleCouponList(storeCouponList) {
//处理门店优惠券 转换成接口需要
console.log('=== handleCouponList 开始处理 ===');
console.log('输入 storeCouponList:', JSON.stringify(storeCouponList, null, 2));
if (!storeCouponList) {
console.log('storeCouponList 为空,返回空数组');
return [];
}
const resSubmitCouponList = [];
storeCouponList.forEach((ele, index) => {
console.log(`=== 处理店铺 ${index + 1} (ID: ${ele.storeId}) ===`);
console.log('店铺优惠券列表:', ele.couponList);
console.log('优惠券数量:', ele.couponList ? ele.couponList.length : 0);
if (ele.couponList && ele.couponList.length > 0) {
ele.couponList.forEach((coupon, couponIndex) => {
console.log(`店铺 ${ele.storeId} 优惠券 ${couponIndex + 1}:`, {
id: coupon.id,
userCouponId: coupon.userCouponId,
couponId: coupon.couponId,
key: coupon.key,
storeId: coupon.storeId,
hasUserCouponId: coupon.hasOwnProperty('userCouponId'),
userCouponIdType: typeof coupon.userCouponId,
allFields: Object.keys(coupon)
});
});
resSubmitCouponList.push(...ele.couponList);
} else {
console.log(`店铺 ${ele.storeId} 没有优惠券`);
}
});
console.log('=== handleCouponList 处理完成 ===');
console.log('最终 resSubmitCouponList:', JSON.stringify(resSubmitCouponList, null, 2));
console.log('最终优惠券数量:', resSubmitCouponList.length);
return resSubmitCouponList;
},
onGoodsNumChange(e) {
const {
detail: { value },
currentTarget: {
dataset: { goods },
},
} = e;
const index = this.goodsRequestList.findIndex(
({ storeId, spuId, skuId }) => goods.storeId === storeId && goods.spuId === spuId && goods.skuId === skuId,
);
if (index >= 0) {
// eslint-disable-next-line no-confusing-arrow
const goodsRequestList = this.goodsRequestList.map((item, i) =>
i === index ? { ...item, quantity: value } : item,
);
this.handleOptionsParams({ goodsRequestList });
}
},
onPopupChange() {
this.setData({
popupShow: !this.data.popupShow,
});
},
handleImageError(e) {
console.warn('Image load error:', e.detail);
// 可以在这里设置默认图片或其他错误处理逻辑
},
});