You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3730 lines
116 KiB

3 months ago
// pages/seller/index.js
const API = require('../../utils/api.js')
Page({
data: {
supplies: [],
publishedSupplies: [],
pendingSupplies: [], // 审核中的货源
rejectedSupplies: [], // 审核失败的货源
draftSupplies: [],
showModal: false,
showEditModal: false,
showRejectReasonModal: false, // 控制审核失败原因弹窗显示
currentRejectSupply: null, // 当前显示的审核失败货源
rejectReason: '', // 审核失败原因
showTabBar: true, // 控制底部自定义tab-bar的显示状态
showSpecSelectModal: false, // 控制规格选择弹窗显示
modalSpecSearchKeyword: '', // 规格弹窗中的搜索关键词
filteredModalSpecOptions: [], // 弹窗中过滤后的规格选项
selectedModalSpecIndex: -1, // 弹窗中选中的规格索引
currentSpecMode: 'create', // 当前规格选择模式:create 或 edit
showNameSelectModal: false, // 控制商品名称选择弹窗显示
showYolkSelectModal: false, // 控制蛋黄选择弹窗显示
selectedNameIndex: -1, // 商品名称弹窗中选中的索引
selectedYolkIndex: -1,//蛋黄弹窗中选中的索引,
// 商品名称选项列表
productNameOptions: ['罗曼粉', '伊莎粉', '罗曼灰', '海蓝灰', '海蓝褐', '绿壳', '粉一', '粉二', '粉八', '京粉1号', '京红', '京粉6号', '京粉3号', '农大系列', '黑鸡土蛋', '双黄蛋', '大午金凤', '黑凤'],
// 蛋黄选项
yolkOptions: ['红心', '黄心', '双色'],
// 规格选项
specOptions: ['格子装', '散托', '不限规格','净重47+', '净重46-47', '净重45-46', '净重44-45', '净重43-44', '净重42-43', '净重41-42', '净重40-41', '净重39-40', '净重38-39', '净重37-39','净重37-38' , '净重36-38', '净重36-37', '净重35-36', '净重34-35', '净重33-34', '净重32-33', '净重32-34', '净重31-32', '净重30-35', '净重30-34', '净重30-32', '净重30-31', '净重29-31', '净重29-30', '净重28-29', '净重28以下', '毛重52以上', '毛重50-51', '毛重48-49', '毛重47-48', '毛重46-47', '毛重45-47', '毛重45-46', '毛重44-45', '毛重43-44', '毛重42-43', '毛重41-42', '毛重40-41', '毛重38-39', '毛重36-37', '毛重34-35', '毛重32-33', '毛重30-31', '毛重30以下'],
// 规格搜索相关变量
specSearchKeyword: '', // 创建货源弹窗中的规格搜索关键词
editSpecSearchKeyword: '', // 编辑货源弹窗中的规格搜索关键词
filteredSpecOptions: [], // 过滤后的规格选项数组
filteredEditSpecOptions: [], // 编辑货源过滤后的规格选项数组
newSupply: {
name: '', // 品种
price: '',
minOrder: '',
yolk: '', // 蛋黄字段
yolkIndex: 0, // 蛋黄选项索引
spec: '', // 规格字段
specIndex: 0, // 规格选项索引
region: '', // 【新增】地区字段
grossWeight: '', // 【新增】毛重字段,支持中文
imageUrls: [] // 图片URL数组,支持多张图片
},
newSupplyRegionArray: [], // 新创建货源的省市区数组
editSupplyRegionArray: [], // 编辑货源的省市区数组,
3 months ago
editSupply: {
yolkIndex: 0,
specIndex: 0
},
currentImageIndex: 0, // 用于滑动时记录当前图片索引
searchKeyword: '', // 搜索关键词
// 图片缩放相关数据
scale: 1, // 缩放比例
offsetX: 0, // X轴偏移
offsetY: 0, // Y轴偏移
lastDistance: 0, // 上一次两指距离
lastTouchPoint: null, // 上一次触摸点
imageWidth: 375, // 图片原始宽度
imageHeight: 375, // 图片原始高度
minScale: 1, // 最小缩放比例
maxScale: 4, // 最大缩放比例
doubleTapTimeout: null, // 双击超时计时器
doubleTapCount: 0, // 双击计数
// 分页相关数据
pagination: {
published: {
page: 1,
pageSize: 20,
hasMore: true,
loading: false
},
pending: {
page: 1,
pageSize: 20,
hasMore: true,
loading: false
},
rejected: {
page: 1,
pageSize: 20,
hasMore: true,
loading: false
},
draft: {
page: 1,
pageSize: 20,
hasMore: true,
loading: false
}
},
// 当前正在加载的状态类型
currentLoadingType: null,
// 图片预览相关状态
showImagePreview: false, // 控制图片预览弹窗显示
previewImageUrls: [], // 预览的图片URL列表
previewImageIndex: 0, // 当前预览图片的索引
// 折叠状态控制
isPublishedExpanded: true, // 已上架货源是否展开
isPendingExpanded: true, // 审核中货源是否展开
isRejectedExpanded: true, // 审核失败货源是否展开
isDraftExpanded: true, // 下架状态货源是否展开
// 自动发布控制
autoPublishAfterEdit: false, // 编辑后是否自动发布(上架)
// 页面加载状态控制
_hasLoadedOnShow: false, // 标记onShow是否已经加载过数据
// 页面滚动锁定状态
pageScrollLock: false, // 控制页面是否锁定滚动
touchMoveBlocked: false, // iOS设备触摸事件阻止
// 授权登录相关状态
showAuthModal: false, // 控制未授权提示弹窗显示
showOneKeyLoginModal: false, // 控制一键登录弹窗显示
pendingUserType: 'seller', // 记录用户即将选择的身份类型
avatarUrl: '/images/default-avatar.png', // 默认头像
partnerstatus: '' // 用户入驻状态,用于显示入驻/未入驻
3 months ago
},
onLoad() {
console.log('卖家页面onLoad开始执行');
// 移除强制登录检查,允许用户浏览货源页面
this.loadSupplies();
// 初始化规格搜索相关数据
this.setData({
specSearchKeyword: '',
editSpecSearchKeyword: '',
filteredSpecOptions: this.data.specOptions,
filteredEditSpecOptions: this.data.specOptions
});
// 尝试从本地存储加载草稿数据
const draftData = wx.getStorageSync('newSupplyDraft');
if (draftData) {
this.setData({
newSupply: draftData
});
console.log('从本地存储加载了草稿数据');
}
3 months ago
console.log('卖家页面onLoad执行完毕');
},
// 重新登录方法 - 跳转到登录页面
reLogin() {
console.log('执行reLogin方法,跳转到登录页面');
wx.showToast({
title: '请先登录',
icon: 'none',
duration: 2000,
complete: () => {
setTimeout(() => {
wx.switchTab({
url: '/pages/index/index'
});
}, 2000);
}
});
},
// 轮播图切换事件
swiperChange: function (e) {
const current = e.detail.current;
const id = e.currentTarget.dataset.id;
if (!id) {
console.error('swiperChange: 缺少商品ID');
return;
}
console.log(`商品 ${id} 的轮播图切换到第 ${current}`);
// 更新特定商品的当前图片索引
this.updateProductCurrentIndex(id, current);
},
// 更新商品当前图片索引
updateProductCurrentIndex: function (productId, index) {
// 更新所有货源列表中的对应商品
const updateSupplies = (supplies) => {
return supplies.map(supply => {
if (supply.id === productId) {
return {
...supply,
currentImageIndex: index
};
}
return supply;
});
};
this.setData({
supplies: updateSupplies(this.data.supplies),
publishedSupplies: updateSupplies(this.data.publishedSupplies),
pendingSupplies: updateSupplies(this.data.pendingSupplies),
rejectedSupplies: updateSupplies(this.data.rejectedSupplies),
draftSupplies: updateSupplies(this.data.draftSupplies)
});
},
// 切换已上架货源的折叠状态
togglePublishedExpand() {
this.setData({
isPublishedExpanded: !this.data.isPublishedExpanded
});
},
// 切换审核中货源的折叠状态
togglePendingExpand() {
this.setData({
isPendingExpanded: !this.data.isPendingExpanded
});
},
// 切换审核失败货源的折叠状态
toggleRejectedExpand() {
this.setData({
isRejectedExpanded: !this.data.isRejectedExpanded
});
},
// 切换下架状态货源的折叠状态
toggleDraftExpand() {
this.setData({
isDraftExpanded: !this.data.isDraftExpanded
});
},
// 清除搜索
clearSearch() {
this.setData({
searchKeyword: ''
}, () => {
// 重新加载所有数据
this.loadSupplies();
});
},
3 months ago
// 处理搜索输入
onSearchInput(e) {
this.setData({
searchKeyword: e.detail.value
});
},
// 搜索货源
searchSupplies() {
console.log('搜索货源,关键词:', this.data.searchKeyword);
// 根据搜索关键词过滤所有状态的货源
const keyword = this.data.searchKeyword.toLowerCase().trim();
if (!keyword) {
// 如果关键词为空,重新加载所有数据
this.loadSupplies();
return;
}
// 获取所有货源
const allSupplies = this.data.supplies;
// 过滤符合条件的货源
const filteredSupplies = allSupplies.filter(supply => {
// 搜索名称、品种等字段
const name = (supply.name || '').toLowerCase();
const productName = (supply.productName || '').toLowerCase();
const yolk = (supply.yolk || '').toLowerCase();
const spec = (supply.spec || '').toLowerCase();
return name.includes(keyword) ||
productName.includes(keyword) ||
yolk.includes(keyword) ||
spec.includes(keyword);
});
// 将过滤后的货源按照状态分类
const publishedSupplies = filteredSupplies.filter(s => s.status === 'published');
const pendingSupplies = filteredSupplies.filter(s => s.status === 'pending_review');
const rejectedSupplies = filteredSupplies.filter(s => s.status === 'rejected');
const draftSupplies = filteredSupplies.filter(s => s.status === 'draft');
// 更新UI显示
this.setData({
publishedSupplies,
pendingSupplies,
rejectedSupplies,
draftSupplies
});
// 显示搜索结果提示
wx.showToast({
title: `找到${filteredSupplies.length}个货源`,
icon: 'none',
duration: 1500
});
},
// 下拉刷新处理函数
onPullDownRefresh() {
console.log('====== 触发下拉刷新 ======');
// 重新加载所有货源数据
this.loadSupplies()
.then(() => {
console.log('下拉刷新数据加载成功');
wx.showToast({
title: '刷新成功',
icon: 'success',
duration: 1500
});
})
.catch(err => {
console.error('下拉刷新数据加载失败:', err);
wx.showToast({
title: '刷新失败,请重试',
icon: 'none',
duration: 2000
});
})
.finally(() => {
console.log('====== 下拉刷新动画停止 ======');
wx.stopPullDownRefresh();
});
},
onShow() {
console.log('seller页面onShow开始加载')
// 获取用户入驻状态
this.getUserStatus();
3 months ago
// 检查页面是否是初次加载(onLoad已调用loadSupplies)
// 避免在页面初次加载时重复加载数据
if (!this.data._hasLoadedOnShow) {
this.setData({
_hasLoadedOnShow: true
});
// 为了避免onLoad和onShow的重复加载,这里不立即调用
// 而是在短暂延迟后调用,确保不会与onLoad的加载冲突
setTimeout(() => {
this.loadSupplies();
}, 500);
} else {
// 页面不是初次显示,正常加载数据
this.loadSupplies();
}
// 更新自定义tabBar状态
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
this.getTabBar().setData({
selected: 2
});
}
// 更新全局tab状态
const app = getApp();
app.updateCurrentTab('seller');
},
// 获取用户入驻状态
getUserStatus() {
const openid = wx.getStorageSync('openid');
if (openid) {
API.getUserInfo(openid)
.then(response => {
console.log('获取到的用户信息响应:', response);
// 修复:访问data字段获取用户信息
const userInfo = response.data || {};
console.log('处理后的用户信息:', userInfo);
this.setData({
partnerstatus: userInfo.partnerstatus || ''
});
})
.catch(err => {
console.error('获取用户信息失败:', err);
});
}
},
3 months ago
// 加载货源列表并分类 - 修改为分页加载
loadSupplies() {
console.log('开始加载货源数据 - 分页模式');
// 重置所有分页状态
this.resetAllPagination();
// 并行加载所有类型的货源
return Promise.all([
this.loadSuppliesFromServer('published', 1),
this.loadSuppliesFromServer('pending', 1),
this.loadSuppliesFromServer('rejected', 1),
this.loadSuppliesFromServer('draft', 1)
]).then(results => {
console.log('所有类型货源加载完成');
return results;
}).catch(err => {
console.error('加载货源失败:', err);
throw err;
});
},
// 重置所有分页状态
resetAllPagination() {
this.setData({
'pagination.published.page': 1,
'pagination.published.hasMore': true,
'pagination.published.loading': false,
'pagination.pending.page': 1,
'pagination.pending.hasMore': true,
'pagination.pending.loading': false,
'pagination.rejected.page': 1,
'pagination.rejected.hasMore': true,
'pagination.rejected.loading': false,
'pagination.draft.page': 1,
'pagination.draft.hasMore': true,
'pagination.draft.loading': false,
currentLoadingType: null
});
},
// 搜索货源 - 修改为使用本地数据
searchSupplies() {
console.log('搜索货源,关键词:', this.data.searchKeyword);
const keyword = this.data.searchKeyword.toLowerCase().trim();
if (!keyword) {
// 如果关键词为空,重新加载所有数据
this.loadSupplies();
return;
}
// 从所有货源中搜索
const allSupplies = this.data.supplies;
// 过滤符合条件的货源
const filteredSupplies = allSupplies.filter(supply => {
const name = (supply.name || '').toLowerCase();
const productName = (supply.productName || '').toLowerCase();
const yolk = (supply.yolk || '').toLowerCase();
const spec = (supply.spec || '').toLowerCase();
return name.includes(keyword) ||
productName.includes(keyword) ||
yolk.includes(keyword) ||
spec.includes(keyword);
});
// 将过滤后的货源按照状态分类
const publishedSupplies = filteredSupplies.filter(s => s.status === 'published');
const pendingSupplies = filteredSupplies.filter(s => s.status === 'pending_review' || s.status === 'reviewed');
const rejectedSupplies = filteredSupplies.filter(s => s.status === 'rejected');
const draftSupplies = filteredSupplies.filter(s => s.status === 'draft' || s.status === 'sold_out');
// 更新UI显示
this.setData({
publishedSupplies,
pendingSupplies,
rejectedSupplies,
draftSupplies
});
// 显示搜索结果提示
wx.showToast({
title: `找到${filteredSupplies.length}个货源`,
icon: 'none',
duration: 1500
});
},
// 修改图片URL处理函数
processImageUrls: function (imageUrls) {
if (!imageUrls || !Array.isArray(imageUrls)) {
return [];
}
return imageUrls.map(url => {
if (!url || typeof url !== 'string') return '';
let processedUrl = url.trim();
// 处理占位符URL - 替换为本地默认图片
if (processedUrl.startsWith('placeholder://')) {
console.log('检测到占位符URL,替换为默认图片:', processedUrl);
return '/images/default-product.png'; // 使用本地默认图片
}
// 处理临时文件路径
if (processedUrl.startsWith('http://tmp/') || processedUrl.startsWith('wxfile://')) {
console.log('检测到临时文件路径,保持原样:', processedUrl);
return processedUrl;
}
// 确保HTTP URL格式正确
if (processedUrl.startsWith('//')) {
processedUrl = 'https:' + processedUrl;
} else if (!processedUrl.startsWith('http') && !processedUrl.startsWith('/')) {
// 如果是相对路径但没有斜杠,添加斜杠
processedUrl = '/' + processedUrl;
}
return processedUrl;
}).filter(url => url && url !== '');
},
// 直接从服务器获取货源数据并显示 - 支持分页
loadSuppliesFromServer(type = 'all', page = 1) {
return new Promise((resolve, reject) => {
const openid = wx.getStorageSync('openid');
console.log(`loadSuppliesFromServer - type: ${type}, page: ${page}, openid:`, openid);
if (!openid) {
console.warn('openid不存在,显示空数据状态,允许用户浏览页面');
// 未登录状态下显示空数据,不跳转,允许用户浏览页面
this.setData({
supplies: [],
publishedSupplies: [],
pendingSupplies: [],
rejectedSupplies: [],
draftSupplies: []
});
resolve([]);
return;
}
console.log(`开始从服务器获取${type}类型商品数据,第${page}`);
// 根据类型设置请求参数
let status = [];
let pageSize = 20;
switch (type) {
case 'published':
status = ['published'];
pageSize = this.data.pagination.published.pageSize;
this.setData({
'pagination.published.loading': true,
currentLoadingType: 'published'
});
break;
case 'pending':
status = ['pending_review', 'reviewed'];
pageSize = this.data.pagination.pending.pageSize;
this.setData({
'pagination.pending.loading': true,
currentLoadingType: 'pending'
});
break;
case 'rejected':
status = ['rejected'];
pageSize = this.data.pagination.rejected.pageSize;
this.setData({
'pagination.rejected.loading': true,
currentLoadingType: 'rejected'
});
break;
case 'draft':
status = ['draft', 'sold_out'];
pageSize = this.data.pagination.draft.pageSize;
this.setData({
'pagination.draft.loading': true,
currentLoadingType: 'draft'
});
break;
default:
// 全部加载,不分类型
status = ['all'];
pageSize = 100; // 初始加载时使用较大值
}
const requestData = {
openid: openid,
viewMode: 'seller',
status: status,
page: page,
pageSize: pageSize
};
console.log('请求参数:', requestData);
API.getAllSupplies(requestData)
.then(res => {
console.log(`从服务器获取${type}类型数据响应:`, res);
if (res && res.success && res.products) {
console.log(`从服务器获取到${type}类型商品数据,共`, res.products.length, '条');
// 处理服务器返回的商品数据
const serverSupplies = res.products
.filter(product => product.status !== 'hidden')
.map(serverProduct => {
// 状态映射
const mappedStatus = serverProduct.status;
// 处理图片URL
let imageUrls = this.processImageUrls(serverProduct.imageUrls);
// 处理创建时间
const createdAt = serverProduct.created_at || null;
const formattedCreatedAt = this.formatCreateTime(createdAt);
return {
id: serverProduct.productId,
name: serverProduct.productName,
price: serverProduct.price,
minOrder: serverProduct.quantity,
grossWeight: serverProduct.grossWeight,
yolk: serverProduct.yolk,
spec: serverProduct.specification,
region: serverProduct.region || '未知地区', // 【修复】添加默认地区
serverProductId: serverProduct.productId,
status: mappedStatus,
rejectReason: serverProduct.rejectReason || '',
imageUrls: imageUrls,
created_at: createdAt,
formattedCreatedAt: formattedCreatedAt,
currentImageIndex: 0
};
});
// 根据类型更新数据
this.updateSuppliesByType(type, serverSupplies, res, page);
resolve(serverSupplies);
} else {
console.log(`服务器没有返回${type}类型商品数据或返回格式不正确`);
this.handleNoData(type);
resolve([]);
}
})
.catch(err => {
console.error(`从服务器获取${type}类型数据失败:`, err);
this.handleLoadError(type, err);
reject(err);
})
.finally(() => {
// 重置加载状态
this.resetLoadingState(type);
});
});
},
// 根据类型更新货源数据
updateSuppliesByType(type, newSupplies, response, currentPage) {
const paginationKey = `pagination.${type}`;
// 更新分页信息
const hasMore = currentPage < (response.totalPages || 1);
this.setData({
[`${paginationKey}.hasMore`]: hasMore,
[`${paginationKey}.page`]: currentPage
});
// 更新货源列表
if (currentPage === 1) {
// 第一页,直接替换
this.setData({
[`${type}Supplies`]: newSupplies
});
} else {
// 后续页面,追加数据
const existingSupplies = this.data[`${type}Supplies`] || [];
const updatedSupplies = [...existingSupplies, ...newSupplies];
this.setData({
[`${type}Supplies`]: updatedSupplies
});
}
// 更新总列表(用于搜索等功能)
this.updateAllSupplies();
console.log(`更新${type}类型货源完成,当前数量:`, this.data[`${type}Supplies`].length, '是否有更多:', hasMore);
},
// 更新所有货源列表(用于搜索)
updateAllSupplies() {
const allSupplies = [
...this.data.publishedSupplies,
...this.data.pendingSupplies,
...this.data.rejectedSupplies,
...this.data.draftSupplies
];
this.setData({
supplies: allSupplies
});
},
// 处理无数据情况
handleNoData(type) {
const paginationKey = `pagination.${type}`;
this.setData({
[`${paginationKey}.hasMore`]: false,
[`${type}Supplies`]: []
});
},
// 处理加载错误
handleLoadError(type, err) {
const paginationKey = `pagination.${type}`;
this.setData({
[`${paginationKey}.loading`]: false
});
// 检查是否是用户不存在的错误
if (err.message && (err.message.includes('404') || err.message.includes('用户不存在'))) {
console.log('用户不存在,跳转到登录页面');
wx.showToast({
title: '用户不存在,请重新登录',
icon: 'none',
duration: 2000,
success: () => {
wx.removeStorageSync('openid');
wx.removeStorageSync('userInfo');
setTimeout(() => {
wx.switchTab({
url: '/pages/index/index'
});
}, 2000);
}
});
}
},
// 重置加载状态
resetLoadingState(type) {
if (type !== 'all') {
this.setData({
[`pagination.${type}.loading`]: false,
currentLoadingType: null
});
}
},
// 加载更多货源
loadMoreSupplies(type) {
const pagination = this.data.pagination[type];
if (!pagination.hasMore || pagination.loading) {
console.log(`没有更多${type}类型数据或正在加载中`);
return;
}
console.log(`开始加载更多${type}类型数据,当前页码:`, pagination.page);
const nextPage = pagination.page + 1;
this.loadSuppliesFromServer(type, nextPage)
.then(() => {
console.log(`加载更多${type}类型数据成功`);
})
.catch(err => {
console.error(`加载更多${type}类型数据失败:`, err);
wx.showToast({
title: '加载失败,请重试',
icon: 'none',
duration: 2000
});
});
},
// 已上架货源加载更多
onReachPublishedBottom() {
console.log('已上架货源滚动到底部,加载更多');
this.loadMoreSupplies('published');
},
// 审核中货源加载更多
onReachPendingBottom() {
console.log('审核中货源滚动到底部,加载更多');
this.loadMoreSupplies('pending');
},
// 审核失败货源加载更多
onReachRejectedBottom() {
console.log('审核失败货源滚动到底部,加载更多');
this.loadMoreSupplies('rejected');
},
// 下架状态货源加载更多
onReachDraftBottom() {
console.log('下架状态货源滚动到底部,加载更多');
this.loadMoreSupplies('draft');
},
// 从服务器同步最新的商品数据 (现在直接使用服务器数据,不再保存到本地存储)
syncSuppliesFromServer() {
// 调用新的直接从服务器获取数据的方法
console.log('syncSuppliesFromServer: 直接从服务器获取最新数据');
this.loadSuppliesFromServer();
},
// 从本地存储加载货源数据(已废弃,现在直接从服务器获取)
loadSuppliesFromLocal() {
console.log('loadSuppliesFromLocal: 已废弃,现在直接从服务器获取数据');
this.loadSuppliesFromServer();
},
// 同步货源数据到商品列表 - 移除本地存储操作
syncSuppliesToGoods(supplies) {
try {
console.log('开始同步货源数据到商品列表 - 通过服务器同步')
// 直接通知服务器同步已上架商品,不操作本地存储
// 修复:移除supply.status === 'reviewed',reviewed状态不应被视为已上架
const publishedSupplies = supplies.filter(supply =>
supply.status === 'published'
);
if (publishedSupplies.length > 0) {
// 延迟一小段时间,避免与服务器交互过于频繁
setTimeout(() => {
// 这里应该有一个API调用,通知服务器同步商品
// API.syncPublishedSuppliesToGoods(publishedSupplies)
// .then(res => {
// console.log('服务器同步商品成功:', res)
// })
// .catch(err => {
// console.error('服务器同步商品失败:', err)
// })
console.log('已上架商品:', publishedSupplies)
}, 500);
}
} catch (error) {
console.error('同步货源到商品列表过程中发生错误:', error)
}
},
// 显示一键登录弹窗
showOneKeyLogin() {
this.setData({
showAuthModal: false,
showOneKeyLoginModal: true
})
},
// 关闭未授权提示弹窗
closeAuthModal() {
this.setData({ showAuthModal: false })
},
// 关闭一键登录弹窗
closeOneKeyLoginModal() {
this.setData({ showOneKeyLoginModal: false })
},
// 选择头像
onChooseAvatar(e) {
const { avatarUrl } = e.detail
this.setData({
avatarUrl
})
},
// 处理昵称提交
getUserName(e) {
const { nickname } = e.detail.value
const type = 'seller' // 卖家页面固定为卖家类型
if (!nickname) {
wx.showToast({
title: '请输入昵称',
icon: 'none',
duration: 2000
})
return
}
// 创建用户信息对象
const userInfo = {
nickName: nickname,
avatarUrl: this.data.avatarUrl,
gender: 0,
country: '',
province: '',
city: '',
language: 'zh_CN'
}
// 保存用户信息
this.saveUserInfo(userInfo, type)
// 隐藏表单
this.setData({
showUserInfoForm: false
})
// 完成设置
this.finishSetUserType(type)
},
// 取消用户信息表单
cancelUserInfoForm() {
this.setData({
showUserInfoForm: false
})
wx.hideLoading()
},
// 处理手机号授权
async onGetPhoneNumber(e) {
// 打印详细错误信息,方便调试
console.log('getPhoneNumber响应:', e.detail)
// 关闭手机号授权弹窗
this.setData({ showOneKeyLoginModal: false })
// 用户点击拒绝授权
if (e.detail.errMsg === 'getPhoneNumber:fail user deny') {
wx.showToast({
title: '需要授权手机号才能使用',
icon: 'none',
duration: 2000
})
return
}
// 处理没有权限的情况
if (e.detail.errMsg === 'getPhoneNumber:fail no permission') {
wx.showToast({
title: '当前环境无法获取手机号权限',
icon: 'none',
duration: 3000
})
console.warn('获取手机号权限失败: 请注意,微信小程序获取手机号功能需要满足以下条件:1. 小程序必须完成微信企业认证;2. 需要在小程序后台配置相应权限;3. 必须使用button组件的open-type="getPhoneNumber"触发。')
return
}
// 检查是否已经登录,避免重复授权
const existingOpenid = wx.getStorageSync('openid')
const existingUserId = wx.getStorageSync('userId')
const existingUserInfo = wx.getStorageSync('userInfo')
if (existingOpenid && existingUserId && existingUserInfo && existingUserInfo.phoneNumber) {
3 months ago
console.log('用户已登录且手机号有效,直接完成身份设置')
// 直接完成身份设置,跳过重复授权
const currentUserType = this.data.pendingUserType || 'seller'
this.finishSetUserType(currentUserType)
return
}
wx.showLoading({
title: '登录中...',
mask: true
})
try {
if (e.detail.errMsg === 'getPhoneNumber:ok') {
// 用户同意授权,实际处理授权流程
console.log('用户同意授权获取手机号')
// 1. 先执行微信登录获取code
const loginRes = await new Promise((resolve, reject) => {
wx.login({
success: resolve,
fail: reject
})
})
if (!loginRes.code) {
throw new Error('获取登录code失败')
}
console.log('获取登录code成功:', loginRes.code)
// 2. 使用code换取openid
const openidRes = await API.getOpenid(loginRes.code)
let openid = null;
let userId = null;
console.log('openidRes完整响应:', JSON.stringify(openidRes));
if (openidRes && typeof openidRes === 'object') {
if (openidRes.data && typeof openidRes.data === 'object') {
console.log('识别到标准服务器返回格式,从data字段提取信息');
openid = openidRes.data.openid || openidRes.data.OpenID || null;
userId = openidRes.data.userId || null;
} else {
console.log('尝试从根对象直接提取openid');
openid = openidRes.openid || openidRes.OpenID || null;
userId = openidRes.userId || null;
}
}
if (!openid) {
console.error('无法从服务器响应中提取openid,完整响应:', JSON.stringify(openidRes));
throw new Error(`获取openid失败: 服务器返回数据格式可能不符合预期,请检查服务器配置。响应数据为: ${JSON.stringify(openidRes)}`);
}
console.log('获取openid成功:', openid)
// 3. 存储openid和session_key
wx.setStorageSync('openid', openid)
if (openidRes && openidRes.session_key) {
wx.setStorageSync('sessionKey', openidRes.session_key)
} else if (openidRes && openidRes.data && openidRes.data.session_key) {
wx.setStorageSync('sessionKey', openidRes.data.session_key)
}
if (userId) {
wx.setStorageSync('userId', userId)
console.log('使用从服务器data字段提取的userId:', userId)
} else if (openidRes && openidRes.userId) {
wx.setStorageSync('userId', openidRes.userId)
console.log('使用服务器根对象中的userId:', openidRes.userId)
} else {
const tempUserId = 'user_' + Date.now()
wx.setStorageSync('userId', tempUserId)
console.log('生成临时userId:', tempUserId)
}
// 4. 上传手机号加密数据到服务器解密
const phoneData = {
...e.detail,
openid: openid
}
console.log('准备上传手机号加密数据到服务器')
const phoneRes = await API.uploadPhoneNumberData(phoneData)
if (!phoneRes || (!phoneRes.success && !phoneRes.phoneNumber)) {
if (phoneRes && phoneRes.phoneNumber) {
console.warn('服务器返回格式可能不符合预期,但成功获取手机号');
} else {
throw new Error('获取手机号失败: ' + (phoneRes && phoneRes.message ? phoneRes.message : '未知错误'))
}
}
const hasPhoneConflict = phoneRes.phoneNumberConflict || false
const isNewPhone = phoneRes.isNewPhone || true
const phoneNumber = phoneRes.phoneNumber || null
const finalPhoneNumber = phoneNumber
3 months ago
console.log('手机号解密结果:', {
phoneNumber: finalPhoneNumber,
hasPhoneConflict: hasPhoneConflict,
isNewPhone: isNewPhone
})
// 5. 创建临时用户信息并保存
const tempUserInfo = {
nickName: '微信用户',
avatarUrl: this.data.avatarUrl,
gender: 0,
country: '',
province: '',
city: '',
language: 'zh_CN',
phoneNumber: finalPhoneNumber
}
const storedUserId = wx.getStorageSync('userId')
const currentUserType = this.data.pendingUserType || 'seller'
console.log('用户身份类型:', currentUserType)
if (this.data.pendingUserType) {
this.setData({ pendingUserType: null })
}
// 保存用户信息并等待上传完成
console.log('开始保存用户信息并上传到服务器...')
const uploadResult = await this.saveUserInfo(tempUserInfo, currentUserType)
console.log('用户信息保存并上传完成')
wx.hideLoading()
if (uploadResult && uploadResult.phoneNumberConflict) {
wx.showToast({
title: '登录成功,但手机号已被其他账号绑定',
icon: 'none',
duration: 3000
})
} else {
wx.showToast({
title: '登录成功,手机号已绑定',
icon: 'success',
duration: 2000
})
}
// 完成设置并跳转
this.finishSetUserType(currentUserType)
} else {
console.log('手机号授权失败:', e.detail.errMsg)
wx.hideLoading()
wx.showToast({
title: '需要授权手机号才能使用',
icon: 'none',
duration: 2000
})
return
}
} catch (error) {
wx.hideLoading()
console.error('登录过程中发生错误:', error)
let errorMsg = '登录失败,请重试'
if (error.message.includes('网络')) {
errorMsg = '网络连接失败,请检查网络后重试'
} else if (error.message.includes('服务器')) {
errorMsg = '服务器连接失败,请稍后重试'
}
wx.showToast({
title: errorMsg,
icon: 'none',
duration: 3000
})
try {
wx.removeStorageSync('openid')
wx.removeStorageSync('sessionKey')
wx.removeStorageSync('userId')
} catch (e) {
console.error('清除临时登录信息失败:', e)
}
}
},
// 保存用户信息
async saveUserInfo(userInfo, type) {
try {
// 获取userId
const userId = wx.getStorageSync('userId')
// 保存用户信息到本地存储
wx.setStorageSync('userInfo', userInfo)
// 更新用户类型信息
let users = wx.getStorageSync('users') || {}
users[userId] = {
...users[userId],
type: type,
userInfo: userInfo,
lastLoginTime: Date.now()
}
wx.setStorageSync('users', users)
console.log('用户信息保存成功:', userInfo)
// 上传用户信息到服务器
return await this.uploadUserInfoToServer(userInfo, userId, type)
} catch (error) {
console.error('保存用户信息失败:', error)
throw error
}
},
// 上传用户信息到服务器
async uploadUserInfoToServer(userInfo, userId, type) {
const openid = wx.getStorageSync('openid')
const uploadData = {
userId: userId,
openid: openid,
...userInfo,
type: type,
timestamp: Date.now()
}
try {
const res = await API.uploadUserInfo(uploadData)
console.log('用户信息上传成功:', res)
// 入驻成功后,将用户类型设置为seller
API.updateUserType('seller');
3 months ago
return res
} catch (err) {
console.error('用户信息上传失败:', err)
return {
success: true,
message: '本地登录成功,服务器连接失败'
}
}
},
// 完成用户类型设置并跳转
finishSetUserType(type) {
const userId = wx.getStorageSync('userId')
// 更新用户类型
let users = wx.getStorageSync('users')
if (typeof users !== 'object' || users === null) {
users = {}
}
if (!users[userId]) {
users[userId] = {}
}
users[userId].type = type
wx.setStorageSync('users', users)
// 打标签
let tags = wx.getStorageSync('tags')
if (typeof tags !== 'object' || tags === null) {
tags = {}
}
tags[userId] = tags[userId] || []
tags[userId] = tags[userId].filter(tag => !tag.startsWith('身份:'))
tags[userId].push(`身份:${type}`)
wx.setStorageSync('tags', tags)
console.log('用户类型设置完成,准备跳转到', type === 'buyer' ? '买家页面' : '卖家页面')
setTimeout(() => {
if (type === 'buyer') {
wx.switchTab({ url: '/pages/buyer/index' })
} else {
// 卖家登录成功后,重新显示创建货源弹窗
// 从本地存储加载保存的表单数据
const savedSupply = wx.getStorageSync('newSupplyDraft') || { name: '', price: '', minOrder: '', yolk: '', spec: '', imageUrls: [] };
3 months ago
this.setData({
showImagePreview: false,
showModal: true,
newSupply: savedSupply
3 months ago
});
this.disablePageScroll();
}
}, 500)
},
// 显示添加货源弹窗
showAddSupply(e) {
console.log('点击创建新货源按钮');
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
// 从本地存储加载之前保存的货源数据
const savedSupply = wx.getStorageSync('newSupplyDraft') || { name: '', price: '', minOrder: '', yolk: '', spec: '', imageUrls: [] };
// 直接显示创建货源弹窗,无需登录验证
3 months ago
this.setData({
showImagePreview: false,
showModal: true,
newSupply: savedSupply
3 months ago
});
// 锁定页面滚动
this.disablePageScroll();
},
// 隐藏弹窗
hideModal() {
this.setData({
showModal: false,
showImagePreview: false // 确保图片预览弹窗关闭
})
// 恢复页面滚动
this.enablePageScroll()
},
// 隐藏编辑弹窗
hideEditModal() {
this.setData({
showEditModal: false
})
// 恢复页面滚动
this.enablePageScroll()
},
// 禁用页面滚动
disablePageScroll() {
// 获取页面实例并设置样式来禁用滚动
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
if (currentPage) {
currentPage.setData({
pageScrollLock: true
})
}
// iOS设备特殊处理:阻止触摸事件
if (this.isIOS()) {
this.blockTouchMove()
}
},
// 启用页面滚动
enablePageScroll() {
// 获取页面实例并恢复滚动
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
if (currentPage) {
currentPage.setData({
pageScrollLock: false
})
}
// iOS设备特殊处理:恢复触摸事件
if (this.isIOS()) {
this.unblockTouchMove()
}
},
// 输入内容处理
onInput(e) {
const field = e.currentTarget.dataset.field
const value = e.detail.value
const newSupply = this.data.newSupply
newSupply[field] = value
this.setData({ newSupply })
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
},
// 编辑输入处理
onEditInput(e) {
const field = e.currentTarget.dataset.field
const value = e.detail.value
// 创建一个新的对象,而不是直接修改data中的对象
this.setData({
editSupply: {
...this.data.editSupply,
[field]: value
}
})
},
// 新创建货源地区选择处理
onNewSupplyRegionChange(e) {
const regionArray = e.detail.value
const region = regionArray.join(' ')
this.setData({
newSupplyRegionArray: regionArray,
newSupply: {
...this.data.newSupply,
region: region
}
})
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', this.data.newSupply);
},
// 编辑货源地区选择处理
onEditSupplyRegionChange(e) {
const regionArray = e.detail.value
const region = regionArray.join(' ')
this.setData({
editSupplyRegionArray: regionArray,
editSupply: {
...this.data.editSupply,
region: region
}
})
},
3 months ago
// 处理蛋黄选择变更
onYolkChange(e) {
const index = e.detail.value
const yolk = this.data.yolkOptions[index]
this.setData({
'newSupply.yolkIndex': index,
'newSupply.yolk': yolk
})
},
// 处理规格选择变更 - 现在直接打开自定义弹窗
onSpecChange(e) {
// 由于我们使用自定义弹窗,这个函数现在只需要打开弹窗即可
this.openSpecSelectModal({ currentTarget: { dataset: { mode: 'create' } } });
},
// 处理编辑模式下的蛋黄选择变更
onEditYolkChange(e) {
console.warn('此方法已弃用,请使用openYolkSelectModal替代');
},
// 处理编辑模式下的规格选择变更 - 现在直接打开自定义弹窗
onEditSpecChange(e) {
// 由于我们使用自定义弹窗,这个函数现在只需要打开弹窗即可
this.openSpecSelectModal({ currentTarget: { dataset: { mode: 'edit' } } });
},
// 商品名称选择变化处理
onNameChange(e) {
const index = e.detail.value
const productName = this.data.productNameOptions[index]
const newSupply = this.data.newSupply
newSupply.name = productName
this.setData({ newSupply })
},
// 编辑商品名称选择变化处理
onEditNameChange(e) {
console.warn('此方法已弃用,请使用openNameSelectModal替代');
},
// 添加新货源 - 先创建商品再上传图片(修复版)
addSupply() {
// 检查登录状态
const userId = wx.getStorageSync('userId');
const openid = wx.getStorageSync('openid');
const userInfo = wx.getStorageSync('userInfo');
if (!userId || !openid || !userInfo) {
console.log('用户未登录,显示登录提示');
// 登录前保存当前表单数据到本地存储
wx.setStorageSync('newSupplyDraft', this.data.newSupply);
// 用户未登录,显示未授权提示弹窗
wx.showModal({
title: '登录提示',
content: '请先登录再发布商品',
showCancel: true,
confirmText: '去登录',
success: (res) => {
if (res.confirm) {
// 用户点击确定,跳转到登录页面或显示登录弹窗
this.setData({
showAuthModal: true,
pendingUserType: 'seller'
});
}
}
});
return;
}
3 months ago
const { name, price, minOrder, yolk, spec, region, imageUrls } = this.data.newSupply
if (!name || !price || !minOrder || !yolk) {
wx.showToast({ title: '请填写完整信息', icon: 'none', duration: 2000 })
return
}
// 显示加载中提示
wx.showLoading({ title: '正在验证权限...', mask: true })
// 检查用户的partnerstatus是否为approved
API.getUserInfo(openid)
.then(response => {
const userInfoRes = response.data;
console.log('获取用户信息成功:', userInfoRes)
// 检查partnerstatus字段
const partnerStatus = userInfoRes.partnerstatus || 'pending'
console.log('用户合作状态:', partnerStatus)
if (partnerStatus !== 'approved') {
throw new Error('partnerstatus_not_approved')
}
// 第一步:先创建商品(不带图片)
const productData = {
productName: name,
price: price, // 保留原始字符串,不进行数字转换
quantity: Number(minOrder),
grossWeight: this.data.newSupply.grossWeight && this.data.newSupply.grossWeight !== '' ? this.data.newSupply.grossWeight : "",
yolk: yolk,
specification: spec || '',
region: region || '', // 【新增】添加地区字段
rejectReason: '',
imageUrls: [] // 明确设置为空数组
3 months ago
}
console.log('第一步:准备创建商品,数据:', productData)
// 更新加载提示
wx.showLoading({ title: '正在创建商品...', mask: true })
3 months ago
// 调用API创建商品(不带图片)
return API.publishProduct(productData)
})
3 months ago
.then(res => {
console.log('商品创建成功:', res)
// 第二步:如果有图片,上传图片到已创建的商品
if (imageUrls && imageUrls.length > 0) {
wx.showLoading({ title: '正在上传图片...', mask: true })
console.log('开始上传图片到已创建商品,数量:', imageUrls.length)
// 获取创建的商品ID - 从多个可能的位置获取
const productId = res.productId || res.data?.productId || res.product?.productId
if (productId) {
console.log('找到商品ID:', productId)
// 【关键修复】使用专门的方法上传图片到已存在商品
return this.uploadImagesToExistingProduct(productId, imageUrls, openid)
.then(uploadRes => {
console.log('图片上传成功:', uploadRes)
return { ...res, imageUpload: uploadRes }
})
} else {
console.error('无法获取商品ID,响应数据:', res)
throw new Error('无法获取商品ID,无法上传图片')
}
} else {
// 没有图片,直接返回
return res
}
})
.then(finalRes => {
wx.hideLoading()
wx.showToast({
title: imageUrls && imageUrls.length > 0 ? '创建成功,图片已上传' : '创建成功',
duration: 3000
})
// 重置表单
this.setData({
showModal: false,
newSupply: { name: '', price: '', minOrder: '', yolk: '', spec: '', imageUrls: [] }
})
// 清除本地存储的草稿数据
wx.removeStorageSync('newSupplyDraft');
3 months ago
this.enablePageScroll()
// 重新加载数据
this.loadSupplies()
})
.catch(err => {
console.error('商品创建或图片上传失败:', err)
wx.hideLoading()
// 处理权限不足的情况
if (err.message === 'partnerstatus_not_approved') {
3 months ago
wx.showModal({
title: '权限不足',
content: '您的合作伙伴身份尚未通过审核,请等待审核通过后再发布商品',
showCancel: true,
cancelText: '取消',
confirmText: '立即入驻',
success: (res) => {
if (res.confirm) {
// 跳转到入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
})
}
}
3 months ago
})
return
}
// 其他错误处理:所有错误都显示通用提示,不再跳转登录
let errorMsg = '上传服务器失败'
if (err.message && err.message.includes('商品不存在')) {
errorMsg = '商品创建失败,无法上传图片'
3 months ago
}
wx.showModal({
title: '发布失败',
content: errorMsg + '\n\n错误详情: ' + (err.message || JSON.stringify(err)),
showCancel: false,
success: () => {
this.loadSupplies()
}
})
3 months ago
})
},
// 上传商品图片 - 修复版,专门用于为已存在商品上传图片
uploadProductImages(productId, imageUrls) {
return new Promise((resolve, reject) => {
if (!productId) {
reject(new Error('商品ID不能为空'))
return
}
if (!imageUrls || imageUrls.length === 0) {
resolve({ success: true, message: '没有图片需要上传' })
return
}
console.log('开始为已存在商品上传图片,商品ID:', productId, '图片数量:', imageUrls.length)
// 获取openid
const openid = wx.getStorageSync('openid')
if (!openid) {
reject(new Error('用户未登录'))
return
}
// 【关键修复】使用专门的图片上传方法,而不是创建新商品
this.uploadImagesToExistingProduct(productId, imageUrls, openid)
.then(resolve)
.catch(reject)
})
},
// 【修复】上传商品图片 - 确保顺序执行
uploadImagesToExistingProduct(productId, imageUrls, openid) {
return new Promise((resolve, reject) => {
console.log('【图片上传】开始为已存在商品上传图片,商品ID:', productId);
// 【关键修复】顺序上传图片,避免并发问题
const uploadSequentially = async () => {
const results = [];
for (let i = 0; i < imageUrls.length; i++) {
try {
console.log(`顺序上传第${i + 1}/${imageUrls.length}张图片`);
const result = await new Promise((resolveUpload, rejectUpload) => {
const formData = {
productId: productId,
openid: openid,
action: 'add_images_only',
imageIndex: i,
totalImages: imageUrls.length,
isUpdate: 'true',
timestamp: Date.now()
};
wx.uploadFile({
url: API.BASE_URL + '/api/products/upload',
filePath: imageUrls[i],
name: 'images',
formData: formData,
success: (res) => {
if (res.statusCode === 200) {
try {
const data = JSON.parse(res.data);
if (data.success) {
console.log(`${i + 1}张图片上传成功,当前总数:`, data.totalCount);
resolveUpload(data);
} else {
rejectUpload(new Error(data.message || '图片上传失败'));
}
} catch (parseError) {
rejectUpload(new Error('服务器响应格式错误'));
}
} else {
rejectUpload(new Error(`HTTP ${res.statusCode}`));
}
},
fail: (err) => {
rejectUpload(new Error('网络错误: ' + err.errMsg));
}
});
});
results.push(result);
// 添加延迟,避免服务器处理压力过大
if (i < imageUrls.length - 1) {
await new Promise(resolve => setTimeout(resolve, 500));
}
} catch (error) {
console.error(`${i + 1}张图片上传失败:`, error);
// 继续上传其他图片,不中断流程
results.push({ success: false, error: error.message });
}
}
return results;
};
uploadSequentially()
.then(results => {
// 取最后一个成功的结果作为最终状态
const successfulResults = results.filter(r => r && r.success);
if (successfulResults.length > 0) {
const lastResult = successfulResults[successfulResults.length - 1];
resolve({
success: true,
message: `成功上传${successfulResults.length}张图片`,
imageUrls: lastResult.imageUrls || [],
allImageUrls: lastResult.allImageUrls || [],
uploadedCount: successfulResults.length,
totalCount: lastResult.totalCount || successfulResults.length,
results: results
});
} else {
reject(new Error('所有图片上传失败'));
}
})
.catch(error => {
console.error('图片上传失败:', error);
reject(error);
});
});
},
// 准备上架操作:只显示编辑页面,用户点击提交后才执行上架
preparePublishSupply(e) {
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
// 设置自动上架标志为true
this.setData({
autoPublishAfterEdit: true
});
console.log('设置编辑后自动上架标志为true');
// 调用showEditSupply方法显示编辑页面,但不自动执行上架
this.showEditSupply(e, true); // 传递第二个参数表示这是上架操作
},
// 保存编辑后的货源信息
saveEdit() {
const { editSupply, autoPublishAfterEdit } = this.data;
// 验证必填信息
if (!editSupply.name || !editSupply.price || !editSupply.minOrder || !editSupply.yolk) {
wx.showToast({ title: '请填写完整信息', icon: 'none', duration: 2000 });
return;
}
// 显示加载中提示
wx.showLoading({ title: '正在同步...', mask: true });
// 获取openid
const openid = wx.getStorageSync('openid');
if (!openid) {
wx.hideLoading();
wx.showModal({
title: '登录状态异常',
content: '您的登录状态已失效,请重新登录后再尝试保存',
showCancel: false,
success: () => {
wx.showToast({
title: '保存失败,请先登录',
icon: 'none',
duration: 3000
});
this.setData({ showEditModal: false });
this.enablePageScroll();
}
});
return;
}
// 检查用户合作状态
API.getUserInfo(openid)
.then(response => {
const userInfo = response.data;
if (userInfo.partnerstatus !== 'approved') {
wx.hideLoading();
wx.showModal({
title: '权限不足',
content: '您的合作伙伴身份尚未通过审核,无法保存商品',
showCancel: true,
cancelText: '取消',
confirmText: '立即入驻',
success: (res) => {
if (res.confirm) {
// 跳转到入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
})
}
this.setData({ showEditModal: false });
this.enablePageScroll();
}
});
return Promise.reject('partnerstatus not approved');
}
return Promise.resolve();
})
.catch(err => {
if (err !== 'partnerstatus not approved') {
wx.hideLoading();
wx.showToast({
title: '获取用户信息失败',
icon: 'none',
duration: 3000
});
this.setData({ showEditModal: false });
this.enablePageScroll();
}
return Promise.reject(err);
})
.then(() => {
3 months ago
// 【关键修复】准备商品数据 - 确保包含地区字段
const productData = {
productName: editSupply.name,
price: editSupply.price, // 保留原始字符串,不进行数字转换
quantity: Number(editSupply.minOrder),
grossWeight: editSupply.grossWeight !== undefined && editSupply.grossWeight !== null && editSupply.grossWeight !== '' ? editSupply.grossWeight : "",
yolk: editSupply.yolk,
specification: editSupply.spec || '',
region: editSupply.region || '', // 【重要】确保地区字段传递
imageUrls: editSupply.imageUrls || [],
created_at: new Date().toISOString(),
status: autoPublishAfterEdit ? 'pending_review' : ''
};
console.log('【调试】准备提交的商品数据:', {
productData: productData,
hasRegion: !!productData.region,
regionValue: productData.region
});
// 判断是编辑现有商品还是创建新商品
if (editSupply.serverProductId) {
// 编辑现有商品
productData.productId = editSupply.serverProductId;
console.log('【调试】调用API.editProduct,商品ID:', editSupply.serverProductId);
// 【关键修复】使用正确的API调用格式
const requestData = {
openid: openid,
productId: editSupply.serverProductId,
product: {
productName: productData.productName,
price: productData.price,
quantity: productData.quantity,
grossWeight: productData.grossWeight,
yolk: productData.yolk,
specification: productData.specification,
region: productData.region, // 【重要】确保在product对象中传递地区字段
imageUrls: productData.imageUrls
},
status: productData.status || ''
};
console.log('【调试】最终发送的请求数据:', requestData);
// 直接使用wx.request调用,避免API封装层的问题
wx.request({
url: API.BASE_URL + '/api/product/edit',
method: 'POST',
data: requestData,
success: (res) => {
console.log('【调试】编辑商品成功响应:', res);
wx.hideLoading();
this.setData({ showEditModal: false });
this.enablePageScroll();
wx.showToast({ title: '更新成功', duration: 2000 });
// 重新加载数据
setTimeout(() => {
this.loadSupplies();
}, 100);
},
fail: (err) => {
console.error('【调试】编辑商品失败:', err);
wx.hideLoading();
wx.showToast({ title: '保存失败,请重试', icon: 'none', duration: 2000 });
}
});
} else {
// 创建新商品并提交审核
// 调用添加商品接口
wx.request({
url: API.BASE_URL + '/api/product/add',
method: 'POST',
data: productData,
success: (res) => {
console.log('商品创建成功:', res);
wx.hideLoading();
// 关闭编辑弹窗
this.setData({ showEditModal: false });
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({ title: '更新成功,等待审核', duration: 2000 });
// 重新加载商品列表
setTimeout(() => {
this.loadSupplies();
}, 100);
},
fail: (err) => {
console.error('商品创建失败:', err);
wx.hideLoading();
wx.showToast({ title: '创建失败,请重试', icon: 'none', duration: 2000 });
}
});
}
});
3 months ago
},
// 预览图片
previewImage(e) {
const { urls, index } = e.currentTarget.dataset
console.log('准备预览图片,原始URLs:', urls);
console.log('当前预览图片索引:', index);
console.log('当前预览图片原始URL:', urls[index]);
// 修复图片URL格式化问题
const formattedUrls = urls.map(url => {
if (!url) return '';
// 移除URL中的引号
let formattedUrl = url.toString().replace(/['"`]/g, '');
// 确保URL以http://或https://开头,特殊处理wxfile://格式
// 特殊处理占位符URL(以placeholder://协议开头)
const isHttpProtocol = formattedUrl.startsWith('http');
const isWxfileProtocol = formattedUrl.startsWith('wxfile://');
const isPlaceholderUrl = formattedUrl.startsWith('placeholder://');
console.log('previewImage - 原始URL:', url);
console.log('previewImage - 移除引号后的URL:', formattedUrl);
console.log('previewImage - isHttpProtocol:', isHttpProtocol, 'isWxfileProtocol:', isWxfileProtocol, 'isPlaceholderUrl:', isPlaceholderUrl);
// 对于占位符URL,返回空字符串,这样就不会在预览中显示它们
if (isPlaceholderUrl) {
console.log('previewImage - 占位符URL,不参与预览:', formattedUrl);
return '';
}
if (formattedUrl && !isHttpProtocol && !isWxfileProtocol) {
console.warn('previewImage - 图片URL缺少协议,添加https://前缀:', formattedUrl);
formattedUrl = 'https://' + formattedUrl;
} else {
console.log('previewImage - URL已包含有效协议或为wxfile格式,无需添加前缀:', formattedUrl);
}
// 尝试解码可能被编码的URL路径段
try {
// 先检查是否包含%2F等已编码的斜杠
if (formattedUrl.includes('%2F')) {
// 只解码路径部分,保留查询参数
const parts = formattedUrl.split('?');
if (parts.length > 1) {
formattedUrl = decodeURIComponent(parts[0]) + '?' + parts[1];
} else {
formattedUrl = decodeURIComponent(formattedUrl);
}
}
} catch (e) {
console.error('解码URL失败:', e);
}
// 简单验证URL格式
if (formattedUrl && /^https?:\/\/.+\..+/.test(formattedUrl)) {
return formattedUrl;
}
return '';
});
console.log('格式化后的URLs:', formattedUrls);
console.log('当前预览图片格式化后URL:', formattedUrls[index]);
// 锁定页面滚动
this.disablePageScroll();
this.setData({
showImagePreview: true,
previewImageUrls: formattedUrls.filter(url => url), // 过滤掉无效URL
previewImageIndex: parseInt(index)
})
},
// 关闭图片预览
closeImagePreview() {
this.setData({
showImagePreview: false
})
// 恢复页面滚动
this.enablePageScroll();
},
// 切换预览图片
onPreviewImageChange(e) {
this.setData({
previewImageIndex: e.detail.current,
// 切换图片时重置缩放状态
scale: 1,
offsetX: 0,
offsetY: 0
})
},
// 处理图片点击事件
handleImageTap() {
// 清除之前的双击计时器
if (this.data.doubleTapTimeout) {
clearTimeout(this.data.doubleTapTimeout)
this.setData({ doubleTapTimeout: null })
}
// 增加双击计数
const newDoubleTapCount = this.data.doubleTapCount + 1
this.setData({ doubleTapCount: newDoubleTapCount })
// 如果是第一次点击,设置计时器
if (newDoubleTapCount === 1) {
const timer = setTimeout(() => {
// 单击操作:重置缩放
this.resetZoom()
this.setData({ doubleTapCount: 0, doubleTapTimeout: null })
}, 300)
this.setData({ doubleTapTimeout: timer })
} else if (newDoubleTapCount === 2) {
// 双击操作:切换缩放状态
if (this.data.scale > 1) {
this.resetZoom()
} else {
this.zoomToFit(this.data.imageWidth, this.data.imageHeight)
}
this.setData({ doubleTapCount: 0, doubleTapTimeout: null })
}
},
// 处理触摸开始事件
handleTouchStart(e) {
// 清除双击计时器
if (this.data.doubleTapTimeout) {
clearTimeout(this.data.doubleTapTimeout)
this.setData({ doubleTapTimeout: null, doubleTapCount: 0 })
}
// 双指触摸时计算距离
if (e.touches.length === 2) {
const distance = this.calculateDistance(e.touches[0], e.touches[1])
this.setData({ lastDistance: distance })
} else if (e.touches.length === 1) {
// 单指触摸时记录触摸点 - 使用pageX和pageY而非clientX和clientY
const touch = e.touches[0]
this.setData({
lastTouchPoint: {
pageX: touch.pageX,
pageY: touch.pageY
}
})
}
},
// 处理触摸移动事件
handleTouchMove(e) {
// 小程序中阻止冒泡通过catchtap等方式实现
if (e.touches.length === 2) {
// 双指缩放
const currentDistance = this.calculateDistance(e.touches[0], e.touches[1])
const scaleRatio = currentDistance / this.data.lastDistance
let newScale = this.data.scale * scaleRatio
// 限制缩放范围
newScale = Math.max(this.data.minScale, Math.min(this.data.maxScale, newScale))
this.setData({
scale: newScale,
lastDistance: currentDistance
})
} else if (e.touches.length === 1 && this.data.scale > 1 && this.data.lastTouchPoint) {
// 单指移动(仅在缩放后可移动)
const currentTouch = e.touches[0]
// 使用pageX和pageY而非clientX和clientY
const deltaX = currentTouch.pageX - this.data.lastTouchPoint.pageX
const deltaY = currentTouch.pageY - this.data.lastTouchPoint.pageY
let newOffsetX = this.data.offsetX + deltaX
let newOffsetY = this.data.offsetY + deltaY
// 限制拖动范围
const maxOffsetX = (this.data.imageWidth * this.data.scale - this.data.imageWidth) / 2
const maxOffsetY = (this.data.imageHeight * this.data.scale - this.data.imageHeight) / 2
newOffsetX = Math.max(-maxOffsetX, Math.min(maxOffsetX, newOffsetX))
newOffsetY = Math.max(-maxOffsetY, Math.min(maxOffsetY, newOffsetY))
this.setData({
offsetX: newOffsetX,
offsetY: newOffsetY,
lastTouchPoint: {
pageX: currentTouch.pageX,
pageY: currentTouch.pageY
}
})
}
},
// 处理触摸结束事件
handleTouchEnd() {
// 重置触摸点和距离
this.setData({
lastTouchPoint: null,
lastDistance: 0
})
},
// 重置缩放
resetZoom() {
this.setData({
scale: 1,
offsetX: 0,
offsetY: 0
})
},
// 计算两点之间的距离
calculateDistance(touch1, touch2) {
// 在小程序中使用pageX和pageY而非clientX和clientY
const dx = touch1.pageX - touch2.pageX
const dy = touch1.pageY - touch2.pageY
return Math.sqrt(dx * dx + dy * dy)
},
// 缩放图片以适应屏幕
zoomToFit(imageWidth, imageHeight) {
// 假设屏幕宽度为375px
const screenWidth = 375
let newScale = 2
this.setData({ scale: newScale })
},
// 图片加载完成事件
onPreviewImageLoad(e) {
this.setData({
imageWidth: e.detail.width,
imageHeight: e.detail.height
})
},
// 图片加载失败处理 - 增强版
imageError(e) {
const url = e.currentTarget.dataset.src || '未知URL';
const errMsg = e.detail.errMsg || '未知错误';
console.error(`图片加载失败 [${errMsg}]: ${url}`);
// 尝试使用占位图替代
const target = e.currentTarget;
try {
// 在实际运行中,小程序会自动使用fallback-src
// 这里添加日志记录以便追踪
console.log(`为失败图片设置占位图: ${url}`);
} catch (err) {
console.error('设置占位图时出错:', err);
}
// 记录失败的URL到本地,便于调试
try {
const failedUrls = wx.getStorageSync('imageLoadFailures') || [];
if (!failedUrls.includes(url)) {
failedUrls.push({ url, time: new Date().toISOString(), error: errMsg });
// 只保留最近20条记录
if (failedUrls.length > 20) {
failedUrls.shift();
}
wx.setStorageSync('imageLoadFailures', failedUrls);
}
} catch (storageErr) {
console.error('存储失败URL时出错:', storageErr);
}
},
// 图片加载成功处理 - 增强版
imageLoad(e) {
const url = e.currentTarget.dataset.src;
const width = e.detail.width;
const height = e.detail.height;
console.log(`图片加载成功: ${url} (${width}x${height})`);
// 可以在这里添加图片统计逻辑
try {
const successCount = wx.getStorageSync('imageLoadSuccessCount') || 0;
wx.setStorageSync('imageLoadSuccessCount', successCount + 1);
} catch (storageErr) {
console.error('存储成功计数时出错:', storageErr);
}
},
// 显示编辑弹窗 - 修复版
showEditSupply(e, isPublishOperation = false) {
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
// 确保图片预览弹窗关闭
this.setData({
showImagePreview: false
});
const id = e.currentTarget.dataset.id;
console.log('显示编辑弹窗,货源ID:', id, '是否上架操作:', isPublishOperation);
if (!id) {
console.error('显示编辑弹窗失败:缺少货源ID');
wx.showToast({ title: '操作失败,缺少货源信息', icon: 'none', duration: 2000 });
return;
}
// 在所有货源列表中查找
let supply = null;
const allSupplies = [
...this.data.publishedSupplies,
...this.data.pendingSupplies,
...this.data.rejectedSupplies,
...this.data.draftSupplies
];
supply = allSupplies.find(s => s.id === id);
// 如果没找到,尝试在主列表中查找
if (!supply) {
supply = this.data.supplies.find(s => s.id === id);
}
// 安全检查:确保supply存在
if (!supply) {
console.error('未找到ID为', id, '的货源');
wx.showToast({ title: '未找到该货源', icon: 'none', duration: 2000 });
this.setData({ showEditModal: false });
// 确保页面滚动状态正常
this.enablePageScroll();
this.loadSupplies();
return;
}
// 计算蛋黄和规格的索引值
const yolkIndex = this.data.yolkOptions.indexOf(supply.yolk) >= 0 ? this.data.yolkOptions.indexOf(supply.yolk) : 0;
const specIndex = this.data.specOptions.indexOf(supply.spec) >= 0 ? this.data.specOptions.indexOf(supply.spec) : 0;
// 设置编辑货源数据,显示编辑弹窗
const supplyWithFormattedTime = {
...supply,
formattedCreatedAt: this.formatCreateTime(supply.created_at),
region: supply.region || '', // 【新增】确保地区字段存在
yolkIndex: yolkIndex,
specIndex: specIndex
};
// 解析地区字符串为省市区数组,用于初始化三级下拉框
let editSupplyRegionArray = [];
if (supply.region) {
// 尝试将地区字符串拆分为省市区数组
// 假设地区格式为 "省份 城市 区县"
editSupplyRegionArray = supply.region.split(' ').filter(item => item.trim() !== '');
}
3 months ago
console.log('【调试】编辑弹窗数据设置:', {
supplyRegion: supply.region,
editSupplyRegion: supplyWithFormattedTime.region,
editSupplyRegionArray: editSupplyRegionArray
3 months ago
});
// 如果是上架操作,设置自动上架标志
if (isPublishOperation) {
this.setData({
autoPublishAfterEdit: true
});
console.log('设置编辑后自动上架标志为true');
} else {
this.setData({
autoPublishAfterEdit: false
});
console.log('设置编辑后自动上架标志为false');
}
this.setData({
editSupply: supplyWithFormattedTime,
editSupplyRegionArray: editSupplyRegionArray,
3 months ago
showEditModal: true
});
// 锁定页面滚动
this.disablePageScroll();
// 显示提示信息
wx.showToast({
title: '请编辑信息后点击提交',
icon: 'none',
duration: 2000
});
},
// 上架货源 - 移除本地存储操作
publishSupply(e) {
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
// 确保图片预览弹窗关闭
this.setData({
showImagePreview: false
});
// 登录验证
const userId = wx.getStorageSync('userId');
const openid = wx.getStorageSync('openid');
const userInfo = wx.getStorageSync('userInfo');
if (!userId || !openid || !userInfo) {
wx.showModal({
title: '提示',
content: '请先登录再进行商品上架操作',
showCancel: false,
success: (res) => {
if (res.confirm) {
this.setData({ showAuthModal: true });
}
}
3 months ago
});
return;
}
// 检查用户合作状态
API.getUserInfo(openid)
.then(response => {
const userInfo = response.data;
if (userInfo.partnerstatus !== 'approved') {
wx.hideLoading();
this.enablePageScroll();
wx.showModal({
title: '权限不足',
content: '您的合作状态尚未通过审核,暂时无法进行商品上架操作',
showCancel: true,
cancelText: '取消',
confirmText: '立即入驻',
success: (res) => {
if (res.confirm) {
// 跳转到入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
})
}
}
});
return;
}
const id = e.currentTarget.dataset.id
// 优先使用编辑中的商品数据
let supply = null
// 检查是否存在编辑中的数据
if (this.data.editSupply && this.data.editSupply.id === id) {
supply = { ...this.data.editSupply };
} else {
// 否则从supplies中查找
supply = this.data.supplies.find(s => s.id === id)
}
3 months ago
if (!supply) {
wx.hideLoading();
this.enablePageScroll();
wx.showToast({
title: '货源信息不存在',
icon: 'none',
duration: 2000
});
return;
}
wx.showLoading({ title: '处理中...', mask: true });
// 判断当前货源状态,决定设置什么状态
// 重新提交的商品应该先进入审核中
let newStatus = 'pending_review'; // 默认审核中
if (supply.status === 'reviewed') {
newStatus = 'published'; // 已审核通过的货源可以直接上架
}
3 months ago
// 同步数据到服务器数据库
// 仅当有serverProductId时才同步到服务器
if (supply.serverProductId) {
const openid = wx.getStorageSync('openid');
if (openid) {
// 审核失败、隐藏、审核中或下架的货源重新提交时,调用编辑接口同步商品内容和状态
if (supply.status === 'rejected' || supply.status === 'hidden' || supply.status === 'pending_review' || supply.status === 'sold_out') {
console.log('审核失败、隐藏、审核中或下架货源重新提交,同步商品内容和状态到服务器');
// 准备商品数据,转换为服务器需要的格式
const productData = {
openid: openid,
productId: supply.serverProductId,
product: {
productName: supply.name,
price: supply.price,
quantity: supply.minOrder,
grossWeight: supply.grossWeight || "",
yolk: supply.yolk,
specification: supply.spec,
resubmit: true // 关键参数:告诉服务器这是重新提交审核
},
status: newStatus // 明确传递状态参数,确保变为审核中状态
};
3 months ago
console.log('准备发送商品编辑请求 - URL:', API.BASE_URL + '/api/product/edit');
console.log('准备发送的商品数据:', productData);
// 调用编辑商品接口,该接口会自动设置状态为pending_review
wx.request({
url: API.BASE_URL + '/api/product/edit',
method: 'POST',
data: productData,
success: (res) => {
console.log('商品内容和状态同步成功:', res);
// 重新加载数据以更新UI
this.loadSupplies();
},
fail: (err) => {
console.error('商品内容和状态同步失败:', err);
// 重新加载数据以更新UI
this.loadSupplies();
},
complete: () => {
// 确保在请求完成后隐藏loading并显示提示
try {
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({
title: newStatus === 'published' ? '上架成功' : '重新提交成功,等待审核',
duration: 2000
});
} catch (e) {
console.error('显示提示时出错:', e);
// 确保即使在错误情况下也隐藏loading并恢复滚动
try {
wx.hideLoading();
this.enablePageScroll();
} catch (innerErr) {
console.error('隐藏loading时出错:', innerErr);
}
}
3 months ago
}
});
return; // 异步操作,稍后再继续执行
} else {
// 其他情况只更新状态
wx.request({
url: API.BASE_URL + '/api/product/review',
method: 'POST',
data: {
openid: openid,
productId: supply.serverProductId,
status: newStatus
},
success: () => {
this.loadSupplies();
},
fail: (err) => {
console.error('更新状态失败:', err);
this.loadSupplies();
},
complete: () => {
try {
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({
title: newStatus === 'published' ? '上架成功' : '重新提交成功,等待审核',
duration: 2000
});
} catch (e) {
console.error('显示提示时出错:', e);
// 确保即使在错误情况下也隐藏loading并恢复滚动
try {
wx.hideLoading();
this.enablePageScroll();
} catch (innerErr) {
console.error('隐藏loading时出错:', innerErr);
}
}
3 months ago
}
});
return; // 异步操作,稍后再继续执行
3 months ago
}
} else {
// 没有openid时的处理
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({
title: '登录状态异常,请重新登录',
icon: 'none',
duration: 2000
});
}
} else {
// 如果没有serverProductId,提示用户
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({
title: '无法上架,商品未上传到服务器',
icon: 'none',
duration: 2000
3 months ago
});
}
})
.catch(err => {
console.error('获取用户信息失败:', err);
3 months ago
wx.hideLoading();
this.enablePageScroll();
wx.showToast({
title: '获取用户信息失败',
3 months ago
icon: 'none',
duration: 2000
});
});
},
// 下架货源 - 移除本地存储操作
unpublishSupply(e) {
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
const supplyId = e.currentTarget.dataset.id;
console.log('下架商品 - ID:', supplyId);
console.log('当前商品列表长度:', this.data.supplies.length);
console.log('当前已上架商品列表长度:', this.data.publishedSupplies.length);
// 查找对应商品
let supply = this.data.supplies.find(s => s.id === supplyId);
// 如果在主列表中找不到,尝试在已上架商品列表中查找
if (!supply) {
supply = this.data.publishedSupplies.find(s => s.id === supplyId);
console.log('在已上架列表中查找结果:', supply ? '找到' : '未找到');
}
// 如果仍然找不到商品,尝试直接使用传入的ID下架(容错处理)
if (!supply) {
console.warn('未在本地列表中找到商品,但尝试直接下架:', supplyId);
// 禁用页面滚动
this.disablePageScroll();
wx.showLoading({ title: '下架中...', mask: true });
// 直接使用传入的ID尝试下架
API.hideProduct(supplyId)
.then(res => {
console.log('直接下架成功:', res);
wx.hideLoading();
this.enablePageScroll();
wx.showToast({ title: '已下架', icon: 'success', duration: 2000 });
// 清理购物车并重新加载列表
this.cleanUnpublishedFromAllCarts(supplyId);
setTimeout(() => {
this.loadSupplies();
}, 100);
})
.catch(err => {
console.error('直接下架失败:', err);
wx.hideLoading();
this.enablePageScroll();
wx.showToast({ title: '下架失败,请重试', icon: 'none', duration: 2000 });
});
return;
}
// 检查是否有serverProductId,只有上传到服务器的商品才能下架
if (!supply.serverProductId) {
// 没有serverProductId,提示用户
wx.showToast({ title: '无法下架,商品未上传到服务器', icon: 'none', duration: 2000 });
return;
}
// 禁用页面滚动
this.disablePageScroll();
wx.showLoading({ title: '下架中...', mask: true });
// 调用API下架商品
API.hideProduct(supply.serverProductId)
.then(res => {
console.log('服务器下架成功:', res);
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({ title: '已下架', icon: 'success', duration: 2000 });
// 清理所有用户购物车中已下架的商品
this.cleanUnpublishedFromAllCarts(supply.serverProductId);
// 只需要调用一次loadSupplies
setTimeout(() => {
this.loadSupplies();
}, 100);
})
.catch(err => {
console.error('服务器下架失败:', err);
wx.hideLoading();
// 恢复页面滚动
this.enablePageScroll();
wx.showToast({ title: '服务器同步失败,请重试', icon: 'none', duration: 3000 });
// 只需要调用一次loadSupplies
setTimeout(() => {
this.loadSupplies();
}, 100);
});
},
// 清理所有用户购物车中已下架的商品 - 移除本地存储操作
cleanUnpublishedFromAllCarts(supplyId) {
try {
console.log('开始清理购物车中的已下架商品:', supplyId)
// 直接通知服务器清理购物车
setTimeout(() => {
API.removeFromAllCarts(supplyId)
.then(res => {
console.log('清理所有购物车中的已下架商品完成:', res)
})
.catch(err => {
console.error('清理服务器购物车失败:', err)
})
}, 0);
} catch (error) {
console.error('清理购物车过程中发生错误:', error)
}
},
// 删除货源(软删除:只在服务器标记为隐藏)
deleteSupply(e) {
// 阻止事件冒泡,防止触发父元素的点击事件
if (e && e.stopPropagation) {
e.stopPropagation();
}
// 确保图片预览弹窗关闭
this.setData({
showImagePreview: false
});
const id = e.currentTarget.dataset.id
const supply = this.data.supplies.find(s => s.id === id)
if (!supply) {
wx.showToast({ title: '货源不存在', icon: 'none', duration: 2000 })
return
}
// 显示确认弹窗
wx.showModal({
title: '确认删除',
content: '确定要删除该货源吗?删除后将不再显示,但数据会保留。',
success: (res) => {
if (res.confirm) {
wx.showLoading({ title: '删除中...' })
// 确保使用正确的productId格式
let productIdToHide;
// 将id转换为字符串,避免startsWith调用错误
const idStr = String(id);
if (supply.serverProductId) {
productIdToHide = supply.serverProductId;
console.log('使用服务器返回的productId:', productIdToHide);
} else if (idStr.startsWith('product_')) {
productIdToHide = id;
console.log('使用已有的product_前缀ID:', productIdToHide);
} else {
// 如果本地ID不是以product_开头,尝试直接使用
productIdToHide = id;
console.log('使用本地ID作为productId:', productIdToHide);
}
API.deleteProduct(productIdToHide).then(() => {
console.log('服务器标记商品为隐藏成功:', productIdToHide)
wx.hideLoading()
wx.showToast({
title: '删除成功',
icon: 'success',
duration: 2000
})
// 手动加载数据更新UI
this.loadSupplies()
}).catch(error => {
console.error('服务器标记商品为隐藏失败:', error);
console.error('错误详情:', JSON.stringify(error));
wx.hideLoading()
// 手动加载数据更新UI
this.loadSupplies()
// 提供更详细的错误信息
let errorMsg = '服务器操作失败';
if (error.message && error.message.includes('连接失败')) {
errorMsg = '无法连接服务器,请检查网络连接后重试';
} else if (error.message && error.message.includes('商品不存在')) {
errorMsg = '该商品在服务器上可能已不存在';
}
wx.showToast({
title: errorMsg,
icon: 'none',
duration: 3000
})
})
}
}
})
},
// 格式化创建时间为 年/月/日 时:分 格式
formatCreateTime: function (timeValue) {
// 添加详细日志记录传入的参数
console.log('formatCreateTime - 输入值:', timeValue, '类型:', typeof timeValue);
if (!timeValue) {
console.log('formatCreateTime - 输入为空,返回"无"');
return '无';
}
try {
// 首先尝试直接创建Date对象
let date = new Date(timeValue);
// 如果日期无效,且输入是字符串,尝试将其转换为数字,再创建Date对象
if (isNaN(date.getTime()) && typeof timeValue === 'string') {
console.log('formatCreateTime - 尝试将字符串转换为数字');
const numericTime = Number(timeValue);
// 只有当转换后的数字不是NaN时才使用新的Date对象
if (!isNaN(numericTime)) {
date = new Date(numericTime);
}
}
console.log('formatCreateTime - Date对象:', date, '时间戳:', date.getTime());
// 检查日期是否有效
if (isNaN(date.getTime())) {
console.log('formatCreateTime - 日期无效,返回"无"');
return '无';
}
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
const formattedTime = `${year}/${month}/${day} ${hours}:${minutes}`;
console.log('formatCreateTime - 格式化结果:', formattedTime);
return formattedTime;
} catch (error) {
console.error('时间格式化错误:', error);
return '无';
}
},
// 格式化时间为北京时间(UTC+8)并转换为 年-月-日-时:分 格式
formatTimeToBeijing: function (timeValue) {
if (!timeValue) {
return '无';
}
try {
// 创建Date对象
const date = new Date(timeValue);
// 检查日期是否有效
if (isNaN(date.getTime())) {
return '无';
}
// 使用Date对象的方法直接获取UTC时间,然后加8小时计算北京时间
const utcYear = date.getUTCFullYear();
const utcMonth = date.getUTCMonth();
const utcDate = date.getUTCDate();
const utcHours = date.getUTCHours() + 8; // 直接加8小时
// 创建北京时间Date对象
const beijingTime = new Date(Date.UTC(utcYear, utcMonth, utcDate, utcHours, date.getUTCMinutes()));
// 格式化时间,使用连字符分隔
const year = beijingTime.getFullYear();
const month = (beijingTime.getMonth() + 1).toString().padStart(2, '0');
const day = beijingTime.getDate().toString().padStart(2, '0');
const hours = beijingTime.getHours().toString().padStart(2, '0');
const minutes = beijingTime.getMinutes().toString().padStart(2, '0');
// 返回格式:年-月-日-时:分
return `${year}-${month}-${day}-${hours}:${minutes}`;
} catch (error) {
console.error('北京时间格式化错误:', error);
return '无';
}
},
// 显示审核失败原因弹窗
showRejectReason: function (e) {
// 阻止事件冒泡
if (e && e.stopPropagation) {
e.stopPropagation();
}
const id = e.currentTarget.dataset.id;
console.log('显示审核失败原因,货源ID:', id);
// 显示加载提示
wx.showLoading({
title: '获取最新审核原因...',
mask: true
});
// 重新获取审核失败商品列表,确保获取到最新的审核失败原因
API.getProductList('rejected', {
page: 1,
pageSize: 20,
timestamp: new Date().getTime()
}).then(data => {
if (data && data.products && Array.isArray(data.products)) {
// 从最新获取的列表中查找当前商品
const supply = data.products.find(product => product.id === id);
if (supply) {
console.log('找到最新货源信息:', supply);
// 更新本地审核失败商品列表
this.setData({
rejectedSupplies: data.products
});
// 锁定页面滚动
this.disablePageScroll();
// 设置当前显示的货源和最新的失败原因
this.setData({
currentRejectSupply: supply,
rejectReason: supply.rejectReason || '暂无详细的审核失败原因,请联系客服了解详情。',
showRejectReasonModal: true
});
} else {
// 如果在最新列表中没找到,尝试在本地所有列表中查找
let localSupply = null;
const allSupplies = [
...this.data.publishedSupplies,
...this.data.pendingSupplies,
...this.data.rejectedSupplies,
...this.data.draftSupplies,
...this.data.supplies
];
localSupply = allSupplies.find(s => s.id === id);
if (localSupply) {
console.log('在本地列表中找到货源信息:', localSupply);
// 锁定页面滚动
this.disablePageScroll();
// 设置当前显示的货源和失败原因
this.setData({
currentRejectSupply: localSupply,
rejectReason: localSupply.rejectReason || '暂无详细的审核失败原因,请联系客服了解详情。',
showRejectReasonModal: true
});
} else {
console.error('未找到ID为', id, '的货源');
wx.showToast({ title: '未找到该货源', icon: 'none', duration: 2000 });
}
}
} else {
// 如果获取列表失败,尝试在本地所有列表中查找
let supply = null;
const allSupplies = [
...this.data.publishedSupplies,
...this.data.pendingSupplies,
...this.data.rejectedSupplies,
...this.data.draftSupplies,
...this.data.supplies
];
supply = allSupplies.find(s => s.id === id);
if (supply) {
console.log('在本地列表中找到货源信息:', supply);
// 锁定页面滚动
this.disablePageScroll();
// 设置当前显示的货源和失败原因
this.setData({
currentRejectSupply: supply,
rejectReason: supply.rejectReason || '暂无详细的审核失败原因,请联系客服了解详情。',
showRejectReasonModal: true
});
} else {
console.error('未找到ID为', id, '的货源');
wx.showToast({ title: '未找到该货源', icon: 'none', duration: 2000 });
}
}
}).catch(err => {
console.error('获取审核失败商品列表失败:', err);
// 失败时,尝试在本地所有列表中查找
let supply = null;
const allSupplies = [
...this.data.publishedSupplies,
...this.data.pendingSupplies,
...this.data.rejectedSupplies,
...this.data.draftSupplies,
...this.data.supplies
];
supply = allSupplies.find(s => s.id === id);
if (supply) {
console.log('在本地列表中找到货源信息:', supply);
// 锁定页面滚动
this.disablePageScroll();
// 设置当前显示的货源和失败原因
this.setData({
currentRejectSupply: supply,
rejectReason: supply.rejectReason || '暂无详细的审核失败原因,请联系客服了解详情。',
showRejectReasonModal: true
});
} else {
console.error('未找到ID为', id, '的货源');
wx.showToast({ title: '未找到该货源', icon: 'none', duration: 2000 });
}
}).finally(() => {
// 隐藏加载提示
wx.hideLoading();
3 months ago
});
},
// 关闭审核失败原因弹窗
closeRejectReasonModal: function () {
console.log('关闭审核失败原因弹窗');
this.setData({
showRejectReasonModal: false
// 注意:这里不立即清空 currentRejectSupply,确保后续操作能使用
});
},
// 打开规格选择弹窗
openSpecSelectModal: function (e) {
const mode = e.currentTarget.dataset.mode || 'create';
const currentSpec = mode === 'create' ? this.data.newSupply.spec : this.data.editSupply.spec;
const specOptions = this.data.specOptions;
let selectedIndex = -1;
// 查找当前选中规格的索引
if (currentSpec) {
selectedIndex = specOptions.indexOf(currentSpec);
}
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = false;
}
this.setData({
showSpecSelectModal: true,
currentSpecMode: mode,
modalSpecSearchKeyword: '',
filteredModalSpecOptions: specOptions,
selectedModalSpecIndex: selectedIndex,
showTabBar: false // 隐藏底部tab-bar
});
},
// 关闭规格选择弹窗
closeSpecSelectModal: function () {
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
this.setData({
showSpecSelectModal: false,
modalSpecSearchKeyword: '',
selectedModalSpecIndex: -1,
showTabBar: true // 显示底部tab-bar
});
},
// 弹窗中规格搜索输入
onModalSpecSearchInput: function (e) {
const keyword = e.detail.value;
const specOptions = this.data.specOptions;
let filteredOptions = specOptions;
if (keyword) {
filteredOptions = specOptions.filter(option => {
return option.toLowerCase().includes(keyword.toLowerCase());
});
}
this.setData({
modalSpecSearchKeyword: keyword,
filteredModalSpecOptions: filteredOptions,
selectedModalSpecIndex: -1 // 搜索时重置选择
});
},
// 清除弹窗中的规格搜索关键词
clearModalSpecSearch: function () {
this.setData({
modalSpecSearchKeyword: '',
filteredModalSpecOptions: this.data.specOptions,
selectedModalSpecIndex: -1
});
},
// 双击检测变量
lastTapTime: {},
tapCount: {},
// 通用双击检测函数
handleDoubleTap: function(e, type, callback) {
const currentTime = Date.now();
const tapKey = `${type}-${e.currentTarget.dataset.index}`;
const lastTap = this.lastTapTime[tapKey] || 0;
const tapInterval = currentTime - lastTap;
if (tapInterval < 300 && tapInterval > 0) {
// 双击事件触发,执行确认选择
callback();
} else {
// 单击事件触发,执行选择操作
this.lastTapTime[tapKey] = currentTime;
setTimeout(() => {
delete this.lastTapTime[tapKey];
}, 300);
}
},
3 months ago
// 弹窗中选择规格
onModalSpecSelect: function (e) {
const index = e.currentTarget.dataset.index;
const selectedSpec = this.data.filteredModalSpecOptions[index];
this.setData({
selectedModalSpecIndex: index,
modalSpecSearchKeyword: selectedSpec // 自动填充搜索框为当前选择的规格
});
// 检测双击
this.handleDoubleTap(e, 'spec', () => {
this.confirmSpecSelection();
});
3 months ago
},
// 确认规格选择
confirmSpecSelection: function () {
if (this.data.selectedModalSpecIndex === -1) {
wx.showToast({
title: '请选择规格',
icon: 'none'
});
return;
}
const selectedSpec = this.data.filteredModalSpecOptions[this.data.selectedModalSpecIndex];
const specOptions = this.data.specOptions;
const originalIndex = specOptions.indexOf(selectedSpec);
// 根据当前模式更新对应的规格信息
if (this.data.currentSpecMode === 'create') {
const newSupply = this.data.newSupply;
newSupply.spec = selectedSpec;
newSupply.specIndex = originalIndex;
3 months ago
this.setData({
newSupply: newSupply
3 months ago
});
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
} else if (this.data.currentSpecMode === 'edit') {
this.setData({
'editSupply.spec': selectedSpec,
'editSupply.specIndex': originalIndex
});
}
// 关闭弹窗
this.closeSpecSelectModal();
// 恢复页面滚动
this.enablePageScroll();
// 延迟清空数据,确保操作完成
setTimeout(() => {
this.setData({
currentRejectSupply: null,
rejectReason: ''
});
}, 500);
},
// 编辑审核失败的货源
editRejectedSupply: function () {
// 先保存当前货源数据,再关闭弹窗
const currentRejectSupply = this.data.currentRejectSupply;
if (!currentRejectSupply || !currentRejectSupply.id) {
wx.showToast({ title: '货源信息不存在', icon: 'none', duration: 2000 });
return;
}
// 关闭失败原因弹窗
this.closeRejectReasonModal();
// 延迟一小段时间确保弹窗完全关闭
setTimeout(() => {
// 模拟点击编辑按钮的事件对象
const mockEvent = {
stopPropagation: function () { },
currentTarget: {
dataset: {
id: currentRejectSupply.id
}
}
};
// 调用显示编辑弹窗的方法
this.showEditSupply(mockEvent);
}, 100);
},
// 重新提交审核失败的货源
resubmitRejectedSupply: function () {
// 先保存当前货源数据,再关闭弹窗
const currentRejectSupply = this.data.currentRejectSupply;
if (!currentRejectSupply || !currentRejectSupply.id) {
wx.showToast({ title: '货源信息不存在', icon: 'none', duration: 2000 });
return;
}
// 关闭失败原因弹窗
this.closeRejectReasonModal();
// 延迟一小段时间确保弹窗完全关闭
setTimeout(() => {
// 模拟点击上架按钮的事件对象
const mockEvent = {
stopPropagation: function () { },
currentTarget: {
dataset: {
id: currentRejectSupply.id
}
}
};
// 设置自动上架标志
this.setData({ autoPublishAfterEdit: true });
// 调用上架方法
this.preparePublishSupply(mockEvent);
}, 100);
},
// 选择图片方法 - 修复添加照片功能
chooseImage: function (e) {
const type = e.currentTarget.dataset.type; // 获取操作类型:new或edit
let currentImages = [];
// 根据类型获取当前已选择的图片列表
if (type === 'new') {
currentImages = this.data.newSupply.imageUrls || [];
} else {
currentImages = this.data.editSupply.imageUrls || [];
}
// 计算还能选择的图片数量
const maxCount = 5 - currentImages.length;
if (maxCount <= 0) {
wx.showToast({
title: '最多只能上传5张图片',
icon: 'none',
duration: 2000
});
return;
}
// 调用微信小程序的图片选择API
wx.chooseImage({
count: maxCount,
sizeType: ['compressed'], // 压缩图片以减小尺寸
sourceType: ['album', 'camera'], // 可以从相册选择或拍照
success: (res) => {
// 获取选择的图片临时文件路径
const tempFilePaths = res.tempFilePaths;
// 合并已选择的图片和新选择的图片
const updatedImages = [...currentImages, ...tempFilePaths];
// 根据类型更新数据
if (type === 'new') {
const newSupply = this.data.newSupply;
newSupply.imageUrls = updatedImages;
3 months ago
this.setData({
newSupply: newSupply
3 months ago
});
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
} else {
this.setData({
'editSupply.imageUrls': updatedImages
});
}
console.log(`成功选择了${tempFilePaths.length}张图片,当前共${updatedImages.length}`);
},
fail: (err) => {
console.error('选择图片失败:', err);
if (err.errMsg !== 'chooseImage:fail cancel') { // 排除用户主动取消的情况
wx.showToast({
title: '选择图片失败,请重试',
icon: 'none',
duration: 2000
});
}
}
});
},
// 格式化创建时间
formatCreateTime: function (timeValue) {
console.log('formatCreateTime - 输入值:', timeValue, '类型:', typeof timeValue);
if (!timeValue) {
console.log('formatCreateTime - 输入为空,返回"无"');
return '无';
}
try {
// 处理 ISO 8601 格式的字符串 (如: 2025-10-20T08:21:06.000Z)
let date;
if (typeof timeValue === 'string') {
// 直接使用 ISO 字符串创建 Date 对象
date = new Date(timeValue);
// 如果日期无效,尝试其他解析方式
if (isNaN(date.getTime())) {
// 尝试移除可能的额外字符
const cleanTime = timeValue.replace(/[^\d\-T:.]/g, '');
date = new Date(cleanTime);
}
} else if (typeof timeValue === 'number') {
// 如果是时间戳
date = new Date(timeValue);
} else {
// 其他情况尝试直接创建
date = new Date(timeValue);
}
console.log('formatCreateTime - 解析后的Date对象:', date);
// 检查日期是否有效
if (isNaN(date.getTime())) {
console.log('formatCreateTime - 日期无效,返回"无"');
return '无';
}
// 获取本地时间(考虑时区)
const year = date.getFullYear();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
const formattedTime = `${year}/${month}/${day} ${hours}:${minutes}`;
console.log('formatCreateTime - 格式化结果:', formattedTime);
return formattedTime;
} catch (error) {
console.error('时间格式化错误:', error);
return timeValue; // 出错时返回原始值
}
},
/**
* 删除图片
*/
deleteImage: function (e) {
const index = e.currentTarget.dataset.index;
const type = e.currentTarget.dataset.type || 'new'; // 默认处理new类型
if (type === 'new') {
const newSupply = this.data.newSupply;
const imageUrls = newSupply.imageUrls;
3 months ago
imageUrls.splice(index, 1);
newSupply.imageUrls = imageUrls;
3 months ago
this.setData({
newSupply: newSupply
3 months ago
});
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
} else {
const imageUrls = this.data.editSupply.imageUrls;
imageUrls.splice(index, 1);
this.setData({
'editSupply.imageUrls': imageUrls
});
}
console.log(`成功删除${type}类型第${index}张图片`);
},
/**
* iOS设备检测
*/
isIOS() {
const systemInfo = wx.getSystemInfoSync()
return systemInfo.platform === 'ios'
},
/**
* 阻止触摸移动事件iOS专用
*/
blockTouchMove() {
// 添加全局触摸事件监听器
this.touchMoveHandler = (e) => {
e.preventDefault()
e.stopPropagation()
}
// 在页面根元素上阻止触摸移动
this.setData({
touchMoveBlocked: true
})
},
/**
* 恢复触摸移动事件iOS专用
*/
unblockTouchMove() {
this.touchMoveHandler = null
// 移除触摸事件阻止
this.setData({
touchMoveBlocked: false
})
},
// 处理创建货源弹窗中的规格搜索输入
onSpecSearchInput(e) {
const keyword = e.detail.value.toLowerCase().trim();
this.setData({
specSearchKeyword: keyword
});
// 过滤规格选项
this.filterSpecOptions(keyword, 'create');
},
// 处理编辑货源弹窗中的规格搜索输入
onEditSpecSearchInput(e) {
const keyword = e.detail.value.toLowerCase().trim();
this.setData({
editSpecSearchKeyword: keyword
});
// 过滤规格选项
this.filterSpecOptions(keyword, 'edit');
},
// 过滤规格选项的通用函数
filterSpecOptions(keyword, type) {
const specOptions = this.data.specOptions;
let filteredOptions = specOptions;
if (keyword) {
filteredOptions = specOptions.filter(option => {
return option.toLowerCase().includes(keyword);
});
// 如果有匹配的规格选项,自动填充第一个匹配项
if (filteredOptions.length > 0) {
if (type === 'create') {
const firstMatchIndex = specOptions.indexOf(filteredOptions[0]);
this.setData({
'newSupply.spec': filteredOptions[0],
'newSupply.specIndex': firstMatchIndex
});
} else if (type === 'edit') {
const firstMatchIndex = specOptions.indexOf(filteredOptions[0]);
this.setData({
'editSupply.spec': filteredOptions[0],
'editSupply.specIndex': firstMatchIndex
});
}
}
} else {
// 当关键词为空时,重置规格选择
if (type === 'create') {
this.setData({
'newSupply.spec': '',
'newSupply.specIndex': 0
});
} else if (type === 'edit') {
this.setData({
'editSupply.spec': '',
'editSupply.specIndex': 0
});
}
}
if (type === 'create') {
this.setData({
filteredSpecOptions: filteredOptions
});
} else if (type === 'edit') {
this.setData({
filteredEditSpecOptions: filteredOptions
});
}
},
// 清除规格搜索关键词
clearSpecSearch() {
this.setData({
specSearchKeyword: '',
filteredSpecOptions: this.data.specOptions,
'newSupply.spec': '', // 重置规格选择
'newSupply.specIndex': 0 // 重置规格索引
});
},
// 清除编辑弹窗中的规格搜索关键词
clearEditSpecSearch() {
this.setData({
editSpecSearchKeyword: '',
filteredEditSpecOptions: this.data.specOptions,
'editSupply.spec': '', // 重置规格选择
'editSupply.specIndex': 0 // 重置规格索引
});
},
/**
* 阻止触摸移动事件用于WXML绑定
*/
preventTouchMove(e) {
// iOS设备上阻止触摸事件冒泡和默认行为
if (this.isIOS() && this.data.touchMoveBlocked) {
e.preventDefault()
e.stopPropagation()
return false
}
},
/**
* 输入框触摸事件处理防止iOS抖动
*/
onInputTouchStart(e) {
// 阻止输入框触摸事件冒泡到页面
if (this.isIOS()) {
e.stopPropagation()
}
},
/**
* 输入框触摸移动事件处理防止iOS抖动
*/
onInputTouchMove(e) {
// 完全阻止输入框区域的触摸移动事件
if (this.isIOS()) {
e.preventDefault()
e.stopPropagation()
return false
}
},
/**
* 弹窗触摸开始事件处理增强iOS触摸锁定
*/
onModalTouchStart(e) {
// 在iOS设备上阻止弹窗区域的触摸事件冒泡到页面
if (this.isIOS()) {
e.stopPropagation()
}
},
/**
* 弹窗触摸移动事件处理增强iOS触摸锁定
*/
onModalTouchMove(e) {
// 完全阻止弹窗区域的触摸移动事件传播到页面
if (this.isIOS()) {
e.preventDefault()
e.stopPropagation()
return false
}
},
// 商品名称选择弹窗相关函数
openNameSelectModal() {
// 设置当前选中的索引
let currentName = '';
if (this.data.showEditModal && this.data.editSupply.name) {
currentName = this.data.editSupply.name;
} else {
currentName = this.data.newSupply.name;
}
const index = currentName ? this.data.productNameOptions.indexOf(currentName) : -1;
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = false;
}
this.setData({
showNameSelectModal: true,
selectedNameIndex: index >= 0 ? index : -1,
showTabBar: false // 隐藏底部tab-bar
});
},
closeNameSelectModal() {
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
this.setData({
showNameSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
},
onNameSelect(e) {
const index = e.currentTarget.dataset.index;
this.setData({
selectedNameIndex: index
});
// 检测双击
this.handleDoubleTap(e, 'name', () => {
this.confirmNameSelection();
});
3 months ago
},
confirmNameSelection() {
if (this.data.selectedNameIndex >= 0) {
const selectedName = this.data.productNameOptions[this.data.selectedNameIndex];
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
// 根据当前是编辑还是创建模式,更新对应的对象
if (this.data.showEditModal) {
this.setData({
'editSupply.name': selectedName,
showNameSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
} else {
const newSupply = this.data.newSupply;
newSupply.name = selectedName;
this.setData({
newSupply: newSupply,
showNameSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
}
}
},
// 蛋黄选择弹窗相关函数
openYolkSelectModal() {
// 设置当前选中的索引
let currentYolk = '';
if (this.data.showEditModal && this.data.editSupply.yolk) {
currentYolk = this.data.editSupply.yolk;
} else {
currentYolk = this.data.newSupply.yolk;
}
const index = currentYolk ? this.data.yolkOptions.indexOf(currentYolk) : -1;
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = false;
}
this.setData({
showYolkSelectModal: true,
selectedYolkIndex: index >= 0 ? index : -1,
showTabBar: false // 隐藏底部tab-bar
});
},
closeYolkSelectModal() {
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
this.setData({
showYolkSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
},
onYolkSelect(e) {
const index = e.currentTarget.dataset.index;
this.setData({
selectedYolkIndex: index
});
// 检测双击
this.handleDoubleTap(e, 'yolk', () => {
this.confirmYolkSelection();
});
3 months ago
},
confirmYolkSelection() {
if (this.data.selectedYolkIndex >= 0) {
const selectedYolk = this.data.yolkOptions[this.data.selectedYolkIndex];
// 通过全局数据控制自定义tab-bar的显示状态
const app = getApp();
if (app && app.globalData) {
app.globalData.showTabBar = true;
}
// 根据当前是编辑还是创建模式,更新对应的对象
if (this.data.showEditModal) {
this.setData({
'editSupply.yolk': selectedYolk,
'editSupply.yolkIndex': this.data.selectedYolkIndex,
showYolkSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
} else {
const newSupply = this.data.newSupply;
newSupply.yolk = selectedYolk;
newSupply.yolkIndex = this.data.selectedYolkIndex;
this.setData({
newSupply: newSupply,
showYolkSelectModal: false,
showTabBar: true // 显示底部tab-bar
});
// 实时保存到本地存储
wx.setStorageSync('newSupplyDraft', newSupply);
3 months ago
}
}
},
// 联系客服
contactCustomerService() {
wx.showModal({
title: '客服电话',
content: '18140203880',
3 months ago
showCancel: true,
cancelText: '取消',
confirmText: '拨打',
success: (res) => {
if (res.confirm) {
wx.makePhoneCall({
phoneNumber: '123456',
success: () => {
console.log('拨打电话成功');
},
fail: (err) => {
console.error('拨打电话失败', err);
wx.showToast({
title: '拨打电话失败',
icon: 'none'
});
}
});
}
}
});
},
// 入驻申请
applyForSettlement() {
const openid = wx.getStorageSync('openid');
if (openid) {
API.getUserInfo(openid)
.then(response => {
console.log('获取到的用户信息:', response);
const userInfo = response.data;
const partnerstatus = userInfo.partnerstatus || '';
if (partnerstatus === 'approved') {
// 如果已经审核通过,显示提示
wx.showToast({
title: '您已成功入驻',
icon: 'success',
duration: 2000
});
} else if (partnerstatus === 'reviewfailed') {
// 审核失败状态,进入审核失败页面
wx.navigateTo({
url: '/pages/settlement/index'
});
} else {
// 其他状态进入入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
});
}
})
.catch(err => {
console.error('获取用户信息失败:', err);
// 获取失败时,默认进入入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
});
});
} else {
// 未登录时,直接进入入驻页面
wx.navigateTo({
url: '/pages/settlement/index'
});
}
3 months ago
}
})