Files
2025-11-17 13:32:54 +08:00

1155 lines
39 KiB
JavaScript
Raw Permalink 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.

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);
// 可以在这里设置默认图片或其他错误处理逻辑
},
});