Files
ai_dianshang/miniprogram/pages/user/address/list/index.js
2025-11-17 13:32:54 +08:00

464 lines
14 KiB
JavaScript
Raw 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.

/* eslint-disable no-param-reassign */
import { fetchDeliveryAddressList, deleteAddress, setDefaultAddress } from '../../../../services/address/fetchAddress';
import Toast from 'tdesign-miniprogram/toast/index';
import { resolveAddress, rejectAddress } from '../../../../services/address/list';
import { getAddressPromise } from '../../../../services/address/edit';
// 添加日志工具
const logger = {
info: (module, message, data = {}) => {
console.log(`[${new Date().toISOString()}] [INFO] [${module}] ${message}`, data);
},
debug: (module, message, data = {}) => {
console.log(`[${new Date().toISOString()}] [DEBUG] [${module}] ${message}`, data);
},
error: (module, message, data = {}) => {
console.error(`[${new Date().toISOString()}] [ERROR] [${module}] ${message}`, data);
},
warn: (module, message, data = {}) => {
console.warn(`[${new Date().toISOString()}] [WARN] [${module}] ${message}`, data);
}
};
Page({
data: {
addressList: [],
deleteID: '',
showDeleteConfirm: false,
isOrderSure: false,
},
/** 选择模式 */
selectMode: false,
/** 是否已经选择地址不置为true的话页面离开时会触发取消选择行为 */
hasSelect: false,
addressUpdated: false, // 标记地址是否被更新
onLoad(query) {
logger.info('ADDRESS_LIST_PAGE', '地址列表页面加载', { query });
const { selectMode = '', isOrderSure = '', id = '' } = query;
this.setData({
isOrderSure: !!isOrderSure,
id,
});
this.selectMode = !!selectMode;
this.addressUpdated = false; // 重置地址更新标记
logger.debug('ADDRESS_LIST_PAGE', '页面参数设置完成', {
selectMode: this.selectMode,
isOrderSure: !!isOrderSure,
id
});
this.init();
this.waitForNewAddress();
},
init() {
logger.info('ADDRESS_LIST_PAGE', '初始化地址列表页面');
this.getAddressList();
},
onShow() {
logger.info('ADDRESS_LIST_PAGE', '页面显示,刷新地址列表');
// 每次页面显示时都重新获取地址列表,确保数据是最新的
this.getAddressList();
},
onUnload() {
if (this.selectMode && !this.hasSelect) {
logger.info('ADDRESS_LIST_PAGE', '页面卸载,检查是否需要传递更新后的地址');
// 检查是否有默认地址,如果有则传递给订单确认页面
const defaultAddress = this.data.addressList.find(addr => addr.isDefault === 1);
if (defaultAddress && this.addressUpdated) {
logger.info('ADDRESS_LIST_PAGE', '传递更新后的默认地址给订单确认页面', {
addressId: defaultAddress.addressId,
name: defaultAddress.name
});
// 将默认地址存储到本地存储供订单确认页面的onShow方法使用
wx.setStorageSync('selectedAddress', defaultAddress);
return; // 不调用rejectAddress让订单确认页面通过onShow处理
}
rejectAddress();
}
},
getAddressList() {
logger.info('ADDRESS_LIST_PAGE', '开始获取地址列表');
const { id } = this.data;
fetchDeliveryAddressList().then((addressList) => {
logger.info('ADDRESS_LIST_PAGE', '获取地址列表成功', {
count: addressList.length,
addressIds: addressList.map(addr => addr.id)
});
// 转换API数据格式为前端期望的格式
const formattedList = addressList.map((address) => {
const formatted = {
id: address.id,
addressId: address.id,
name: address.name,
phoneNumber: address.phone,
address: `${address.province_name || ''}${address.city_name || ''}${address.district_name || ''}${address.detail_address || ''}`,
provinceName: address.province_name,
cityName: address.city_name,
districtName: address.district_name,
detailAddress: address.detail_address,
isDefault: address.is_default ? 1 : 0,
tag: address.address_tag || '',
};
logger.debug('ADDRESS_LIST_PAGE', '格式化地址数据', {
originalId: address.id,
formattedId: formatted.id,
name: formatted.name,
isDefault: formatted.isDefault
});
return formatted;
});
this.setData({
addressList: formattedList,
});
logger.info('ADDRESS_LIST_PAGE', '地址列表数据设置完成', {
totalCount: formattedList.length,
defaultCount: formattedList.filter(addr => addr.isDefault === 1).length
});
}).catch((err) => {
logger.error('ADDRESS_LIST_PAGE', '获取地址列表失败', { error: err.message || err });
Toast({
context: this,
selector: '#t-toast',
message: '获取地址列表失败',
icon: '',
duration: 1000,
});
});
},
getWXAddressHandle() {
console.log('[地址列表-微信导入] 开始获取微信地址');
wx.chooseAddress({
success: (res) => {
console.log('[地址列表-微信导入] wx.chooseAddress成功回调');
console.log('[地址列表-微信导入] 微信返回的原始数据:', res);
console.log('[地址列表-微信导入] errMsg:', res.errMsg);
if (res.errMsg.indexOf('ok') === -1) {
console.log('[地址列表-微信导入] errMsg检查失败显示错误信息');
Toast({
context: this,
selector: '#t-toast',
message: res.errMsg,
icon: '',
duration: 1000,
});
return;
}
console.log('[地址列表-微信导入] errMsg检查通过开始处理地址数据');
const { length: len } = this.data.addressList;
console.log('[地址列表-微信导入] 当前地址列表长度:', len);
const newAddress = {
name: res.userName,
phoneNumber: res.telNumber,
address: `${res.provinceName}${res.cityName}${res.countryName}${res.detailInfo}`,
isDefault: 0,
tag: '微信地址',
id: len,
};
console.log('[地址列表-微信导入] 构建的新地址对象:', newAddress);
this.setData({
[`addressList[${len}]`]: newAddress,
});
console.log('[地址列表-微信导入] 地址已添加到列表,新列表长度:', len + 1);
Toast({
context: this,
selector: '#t-toast',
message: '添加成功',
icon: '',
duration: 1000,
});
console.log('[地址列表-微信导入] 微信地址导入完成');
},
fail: (err) => {
console.error('[地址列表-微信导入] wx.chooseAddress失败:', err);
console.log('[地址列表-微信导入] 失败原因:', err.errMsg);
},
complete: () => {
console.log('[地址列表-微信导入] wx.chooseAddress调用完成');
}
});
},
confirmDeleteHandle({ detail }) {
const { id } = detail || {};
if (id !== undefined) {
this.setData({ deleteID: id, showDeleteConfirm: true });
Toast({
context: this,
selector: '#t-toast',
message: '地址删除成功',
theme: 'success',
duration: 1000,
});
} else {
Toast({
context: this,
selector: '#t-toast',
message: '需要组件库发新版才能拿到地址ID',
icon: '',
duration: 1000,
});
}
},
deleteAddressHandle(e) {
const { id } = e.currentTarget.dataset;
logger.info('ADDRESS_LIST_PAGE', '开始删除地址', { addressId: id });
// 调用API删除地址
deleteAddress(id).then(() => {
logger.info('ADDRESS_LIST_PAGE', '删除地址成功', { addressId: id });
// 删除成功后从列表中移除
this.setData({
addressList: this.data.addressList.filter((address) => address.id !== id),
deleteID: '',
showDeleteConfirm: false,
});
Toast({
context: this,
selector: '#t-toast',
message: '地址删除成功',
theme: 'success',
duration: 1000,
});
}).catch((err) => {
logger.error('ADDRESS_LIST_PAGE', '删除地址失败', {
addressId: id,
error: err.message || err
});
console.error('删除地址失败:', err);
Toast({
context: this,
selector: '#t-toast',
message: '删除地址失败',
icon: '',
duration: 1000,
});
// 关闭确认对话框
this.setData({
deleteID: '',
showDeleteConfirm: false,
});
});
},
editAddressHandle({ detail }) {
logger.info('ADDRESS_LIST_PAGE', '编辑地址', { addressDetail: detail });
this.waitForNewAddress();
const { id } = detail || {};
wx.navigateTo({ url: `/pages/user/address/edit/index?id=${id}` });
},
selectHandle({ detail }) {
logger.info('ADDRESS_LIST_PAGE', '选择地址', {
selectMode: this.selectMode,
addressDetail: detail
});
if (this.selectMode) {
this.hasSelect = true;
// 将选择的地址存储到本地存储中,供订单确认页面使用
wx.setStorageSync('selectedAddress', detail);
logger.info('ADDRESS_LIST_PAGE', '地址已存储到本地存储', { selectedAddress: detail });
resolveAddress(detail);
wx.navigateBack({ delta: 1 });
} else {
this.editAddressHandle({ detail });
}
},
createHandle() {
logger.info('ADDRESS_LIST_PAGE', '创建新地址');
this.waitForNewAddress();
wx.navigateTo({ url: '/pages/user/address/edit/index' });
},
setDefaultAddressHandle({ detail }) {
logger.info('ADDRESS_LIST_PAGE', '设置默认地址', { addressDetail: detail });
const addressId = parseInt(detail.id || detail.addressId);
if (!addressId) {
logger.error('ADDRESS_LIST_PAGE', '地址ID无效', { detail });
Toast({
context: this,
selector: '#t-toast',
message: '地址ID无效',
icon: '',
duration: 1000,
});
return;
}
// 调用设置默认地址API
setDefaultAddress(addressId)
.then(() => {
logger.info('ADDRESS_LIST_PAGE', '设置默认地址成功', { addressId });
Toast({
context: this,
selector: '#t-toast',
message: '设置默认地址成功',
icon: '',
duration: 1000,
});
// 更新本地地址列表
const addressList = this.data.addressList.map(address => ({
...address,
isDefault: (parseInt(address.id) === addressId || parseInt(address.addressId) === addressId) ? 1 : 0
}));
// 重新排序,默认地址排在前面
addressList.sort((prevAddress, nextAddress) => {
if (prevAddress.isDefault && !nextAddress.isDefault) {
return -1;
}
if (!prevAddress.isDefault && nextAddress.isDefault) {
return 1;
}
return 0;
});
this.setData({
addressList: addressList,
});
logger.info('ADDRESS_LIST_PAGE', '地址列表已更新', {
totalCount: addressList.length,
defaultAddressId: addressId
});
})
.catch((err) => {
logger.error('ADDRESS_LIST_PAGE', '设置默认地址失败', {
addressId,
error: err.message || err
});
Toast({
context: this,
selector: '#t-toast',
message: '设置默认地址失败',
icon: '',
duration: 1000,
});
});
},
waitForNewAddress() {
logger.debug('ADDRESS_LIST_PAGE', '等待新地址返回');
getAddressPromise()
.then((newAddress) => {
logger.info('ADDRESS_LIST_PAGE', '收到新地址数据', {
addressId: newAddress.addressId,
name: newAddress.name,
isEdit: newAddress.isEdit
});
let addressList = [...this.data.addressList];
newAddress.phoneNumber = newAddress.phone;
newAddress.address = `${newAddress.provinceName}${newAddress.cityName}${newAddress.districtName}${newAddress.detailAddress}`;
newAddress.tag = newAddress.addressTag;
if (!newAddress.addressId) {
logger.debug('ADDRESS_LIST_PAGE', '添加新地址到列表');
newAddress.id = `${addressList.length}`;
newAddress.addressId = `${addressList.length}`;
if (newAddress.isDefault === 1) {
logger.debug('ADDRESS_LIST_PAGE', '新地址设为默认,清除其他默认地址');
addressList = addressList.map((address) => {
address.isDefault = 0;
return address;
});
} else {
newAddress.isDefault = 0;
}
addressList.push(newAddress);
} else {
logger.debug('ADDRESS_LIST_PAGE', '更新现有地址');
addressList = addressList.map((address) => {
if (address.addressId === newAddress.addressId) {
return newAddress;
}
return address;
});
}
addressList.sort((prevAddress, nextAddress) => {
if (prevAddress.isDefault && !nextAddress.isDefault) {
return -1;
}
if (!prevAddress.isDefault && nextAddress.isDefault) {
return 1;
}
return 0;
});
this.setData({
addressList: addressList,
});
// 标记地址已被更新
this.addressUpdated = true;
logger.info('ADDRESS_LIST_PAGE', '地址列表更新完成', {
totalCount: addressList.length,
defaultCount: addressList.filter(addr => addr.isDefault === 1).length,
addressUpdated: true
});
})
.catch((e) => {
if (e.message !== 'cancel') {
logger.error('ADDRESS_LIST_PAGE', '地址编辑发生错误', { error: e.message || e });
Toast({
context: this,
selector: '#t-toast',
message: '地址编辑发生错误',
icon: '',
duration: 1000,
});
} else {
logger.info('ADDRESS_LIST_PAGE', '用户取消地址编辑');
}
});
},
});