Files
ai_dianshang/miniprogram/pages/user/address/list/index.js

464 lines
14 KiB
JavaScript
Raw Normal View History

2025-11-17 13:32:54 +08:00
/* 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', '用户取消地址编辑');
}
});
},
});