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.
 
 

1667 lines
57 KiB

// pages/settlement/settlement.js
const API = require('../../utils/api.js');
Page({
data: {
// 是否显示引导页
showGuidePage: true,
// 当前步骤
currentStep: 0,
// 身份选择
collaborationid: '', // 合作商身份ID (原selectedIdentity)
showIdentityError: false,
// 基本信息
company: '', // 客户公司名称 (原companyName)
showCompanyNameError: false,
companyNameError: '',
province: '',
city: '',
district: '',
detailedaddress: '', // 详细地址 (原detailAddress)
showDetailedAddressError: false,
detailedAddressError: '',
showRegionError: false,
regionError: '',
cooperation: '', // 合作模式 (原selectedCooperation)
showCooperationError: false,
cooperationError: '',
// 上传资料
businesslicenseurl: null, // 营业执照URL (原businessLicenseFile)
showBusinessLicenseError: false,
businessLicenseError: '',
proofurl: null, // 动物检疫证明URL (原animalQuarantineFile)
showProofError: false,
proofError: '',
// idCardFile: null, // 已移除,法人身份证现在使用proofurl字段
brandurl: null, // 品牌授权链URL (原brandAuthFile)
showBrandAuthError: false,
brandAuthError: '',
// 审核状态
partnerstatus: '', // 合作商状态 (原auditStatus),初始为空而不是默认审核中
reasonforfailure: '', // 审核失败原因,初始为空,由服务器数据填充
// 登录弹窗相关
showAuthModal: false,
showOneKeyLoginModal: false,
// 合作模式确认弹窗
showCooperationConfirm: false,
currentCooperationDetail: null,
pendingCooperationValue: '',
selectedCooperationDetail: null,
loginModalTitle: '请先登录',
loginModalContent: '为了您的账户安全,请先完成手机号登录',
showLoginButton: true,
// 合作模式帮助弹窗
showCooperationHelp: false,
// 滚动到的位置
scrollToView: ''
},
onLoad(options) {
console.log('settlement页面加载,options:', options);
// 检查是否是分享链接,需要显示引导页
if (options.showGuide) {
console.log('检测到showGuide参数,显示引导页');
// 清除保存的进度,确保显示引导页
this.clearSettlementProgress();
// 重置页面状态到初始状态
this.setData({
showGuidePage: true,
currentStep: 0,
partnerstatus: ''
});
return; // 直接返回,不执行后续逻辑
}
// 检查是否有status参数,如果有则显示审核状态
if (options.status) {
console.log('检测到status参数:', options.status);
// 检查是否有preSubmitData
const preSubmitData = wx.getStorageSync('preSubmitData');
if (preSubmitData) {
console.log('找到preSubmitData,显示审核状态页面');
this.setData({
showGuidePage: false,
currentStep: 3,
partnerstatus: options.status
});
// 同步服务器状态,确保显示最新状态
this.syncSettlementStatus();
return; // 直接返回,不执行后续逻辑
}
}
// 检查是否有保存的入驻进度
this.loadSettlementProgress();
// 如果有保存的进度,直接跳过引导页
if (this.data.currentStep > 0) {
this.setData({
showGuidePage: false
});
}
// 检查本地保存的settlementStatus
const settlementStatus = wx.getStorageSync('settlementStatus');
if (settlementStatus && (settlementStatus === 'underreview' || settlementStatus === 'approved' || settlementStatus === 'reviewfailed')) {
console.log('检测到本地保存的审核状态:', settlementStatus);
this.setData({
showGuidePage: false,
currentStep: 3,
partnerstatus: settlementStatus
});
// 同步服务器状态,确保显示最新的审核失败原因
this.syncSettlementStatus();
return; // 直接返回,不执行后续逻辑
}
// 检查是否是从首页登录返回的
const pendingReturnPath = wx.getStorageSync('pendingReturnPath');
if (pendingReturnPath === 'settlement') {
console.log('检测到从首页登录返回,清除标记并自动提交申请');
// 清除返回路径标记
wx.removeStorageSync('pendingReturnPath');
// 延迟一下确保页面完全加载
setTimeout(() => {
// 检查是否有保存的表单数据
const savedProgress = wx.getStorageSync('settlement_data');
if (savedProgress) {
console.log('发现保存的表单数据,恢复表单数据并自动提交申请');
// 恢复表单数据
this.loadSettlementProgress();
// 自动提交申请
this.submitApplication();
}
}, 500);
}
// 同步服务器状态,确保显示最新的partnerstatus
this.syncSettlementStatus();
},
onUnload() {
// 页面卸载时保存进度(除了审核通过状态)
if (this.data.partnerstatus !== 'approved') {
this.saveSettlementProgress();
}
},
// 加载入驻进度
loadSettlementProgress() {
const settlementData = wx.getStorageSync('settlement_data');
if (settlementData) {
// 映射旧字段名到新字段名(兼容性处理)
const mappedData = {
currentStep: settlementData.currentStep,
collaborationid: settlementData.collaborationid || settlementData.selectedIdentity,
company: settlementData.company || settlementData.companyName,
province: settlementData.province,
city: settlementData.city,
district: settlementData.district,
detailedaddress: settlementData.detailedaddress || settlementData.detailAddress,
cooperation: settlementData.cooperation || settlementData.selectedCooperation,
businesslicenseurl: settlementData.businesslicenseurl || settlementData.businessLicenseFile,
proofurl: settlementData.proofurl || settlementData.animalQuarantineFile,
// idCardFile: settlementData.idCardFile, // 已移除,法人身份证现在使用proofurl字段
brandurl: settlementData.brandurl || settlementData.brandAuthFile,
agreementChecked: settlementData.agreementChecked,
partnerstatus: settlementData.partnerstatus || settlementData.auditStatus
};
this.setData(mappedData);
console.log('加载入驻进度:', mappedData);
}
},
// 保存入驻进度
saveSettlementProgress() {
const settlementData = {
currentStep: this.data.currentStep,
collaborationid: this.data.collaborationid, // 合作商身份ID (原selectedIdentity)
company: this.data.company, // 客户公司名称 (原companyName)
province: this.data.province,
city: this.data.city,
district: this.data.district,
detailedaddress: this.data.detailedaddress, // 详细地址 (原detailAddress)
cooperation: this.data.cooperation, // 合作模式 (原selectedCooperation)
businesslicenseurl: this.data.businesslicenseurl, // 营业执照URL (原businessLicenseFile)
proofurl: this.data.proofurl, // 动物检疫证明或法人身份证URL (原animalQuarantineFile)
brandurl: this.data.brandurl, // 品牌授权链URL (原brandAuthFile)
agreementChecked: this.data.agreementChecked,
partnerstatus: this.data.partnerstatus // 合作商状态 (原auditStatus)
};
wx.setStorageSync('settlement_data', settlementData);
console.log('保存入驻进度');
},
// 清除入驻进度
clearSettlementProgress() {
wx.removeStorageSync('settlement_data');
console.log('清除入驻进度');
},
// 更新全局入驻状态
updateGlobalSettlementStatus(status) {
// 可以在这里调用全局状态管理
const app = getApp();
if (app && app.updateSettlementStatus) {
app.updateSettlementStatus(status);
}
// 同时保存到本地存储
wx.setStorageSync('settlement_status', status);
},
// 返回上一页
goBack: function() {
wx.navigateBack({
delta: 1,
success: function() {
console.log('成功返回上一页');
},
fail: function() {
console.error('返回上一页失败');
// 如果返回失败,跳转到首页
wx.reLaunch({
url: '/pages/index/index'
});
}
});
},
// 开始入驻流程
startSettlement: async function() {
console.log('开始入驻流程');
try {
// 检查数据库中是否存在入驻信息
console.log('检查入驻信息');
await this.syncSettlementStatus();
// 根据入驻状态处理
if (this.data.partnerstatus === 'approved') {
console.log('用户已入驻成功,直接进入审核状态页面');
this.setData({
showGuidePage: false,
currentStep: 3 // 审核状态页面
});
} else if (this.data.partnerstatus === 'underreview') {
console.log('用户申请正在审核中,直接进入审核状态页面');
this.setData({
showGuidePage: false,
currentStep: 3 // 审核状态页面
});
} else {
console.log('用户未入驻或审核失败,开始入驻流程');
this.setData({
showGuidePage: false,
currentStep: 0 // 进入第一步:选择身份
});
}
} catch (error) {
console.error('检查入驻状态时出错:', error);
// 出错时仍允许用户开始入驻流程
this.setData({
showGuidePage: false,
currentStep: 0 // 进入第一步:选择身份
});
wx.showToast({
title: '获取状态失败,已进入入驻流程',
icon: 'none'
});
}
},
// 下一步
nextStep() {
switch (this.data.currentStep) {
case 0:
// 验证身份选择
if (!this.data.collaborationid) { // 使用数据库字段名
this.setData({ showIdentityError: true });
return;
}
this.setData({
currentStep: 1,
showIdentityError: false
});
break;
case 1:
// 验证基本信息
let valid = true;
if (!this.data.company || !this.data.company.trim()) { // 使用数据库字段名,添加空值检查
this.setData({ showCompanyNameError: true });
valid = false;
} else {
this.setData({ showCompanyNameError: false });
}
if (!this.data.province || !this.data.city || !this.data.district) {
this.setData({ showRegionError: true });
valid = false;
} else {
this.setData({ showRegionError: false });
}
if (!this.data.detailedaddress || !this.data.detailedaddress.trim()) {
this.setData({ showDetailedAddressError: true });
valid = false;
} else {
this.setData({ showDetailedAddressError: false });
}
if (!this.data.cooperation) { // 使用数据库字段名
this.setData({ showCooperationError: true });
valid = false;
} else {
this.setData({ showCooperationError: false });
}
if (valid) {
this.setData({ currentStep: 2 });
}
break;
default:
break;
}
},
// 上一步
prevStep() {
if (this.data.currentStep > 0) {
this.setData({ currentStep: this.data.currentStep - 1 });
}
},
// 选择身份
selectIdentity(e) {
const identity = e.currentTarget.dataset.identity;
this.setData({
collaborationid: identity, // 使用数据库字段名
showIdentityError: false
});
},
// 公司名称输入(带实时验证)
onCompanyNameInput(e) {
const value = e.detail.value.trim();
let showError = false;
let errorMessage = '';
if (value.length > 0) {
if (value.length < 2) {
showError = true;
errorMessage = '公司名称至少需要2个字符';
} else if (value.length > 50) {
showError = true;
errorMessage = '公司名称不能超过50个字符';
}
}
this.setData({
company: value, // 使用数据库字段名
showCompanyNameError: showError,
companyNameError: errorMessage
});
},
// 公司名称获得焦点
onCompanyNameFocus(e) {
// 清除错误状态,让用户重新输入
if (this.data.showCompanyNameError) {
this.setData({
showCompanyNameError: false,
companyNameError: ''
});
}
},
// 公司名称失去焦点验证
onCompanyNameBlur() {
if (!this.data.company || !this.data.company.trim()) { // 使用数据库字段名,添加空值检查
this.setData({
showCompanyNameError: true,
companyNameError: '请输入公司名称'
});
}
},
// 地区选择(带验证)
onRegionChange(e) {
const value = e.detail.value;
const province = value[0] || '';
const city = value[1] || '';
const district = value[2] || '';
let showError = false;
let errorMessage = '';
if (!province || !city || !district) {
showError = true;
errorMessage = '请选择完整的省市区信息';
}
this.setData({
province: province,
city: city,
district: district,
showRegionError: showError,
regionError: errorMessage
});
},
// 详细地址输入(带实时验证)
onDetailAddressInput(e) {
const value = e.detail.value.trim();
let showError = false;
let errorMessage = '';
if (value.length > 0) {
if (value.length > 100) {
showError = true;
errorMessage = '详细地址不能超过100个字符';
}
}
this.setData({
detailedaddress: value, // 使用数据库字段名
showDetailedAddressError: showError,
detailedAddressError: errorMessage
});
},
// 详细地址获得焦点
onDetailAddressFocus(e) {
// 清除错误状态,让用户重新输入
if (this.data.showDetailedAddressError) {
this.setData({
showDetailedAddressError: false,
detailedAddressError: ''
});
}
},
// 处理合作模式选项点击事件
handleCooperationTap(e) {
const value = e.currentTarget.dataset.value;
// 定义合作模式详细说明
const cooperationDetails = {
'代销业务': {
title: '代销业务规则',
content: '\n定价规则:代销商户可自主制定所挂货源的销售价格,价格需符合平台物价管控要求,不得恶意定价。\n\n服务费规则:平台对代销挂货收取固定服务费,标准为1 元 / 件,仅在货源成功卖出后收取,未卖出不产生费用。\n\n保证金规则\n\n参与代销业务的商户需按合作车型缴纳保证金,具体标准如下:\n\n4.2 米车型:300 元 / 车\n\n6.8 米车型:500 元 / 车\n\n9.6 米车型:800 元 / 车\n\n挂车车型:1200 元 / 车\n\n保证金仅作为履约担保,合作结束且无违规违约行为的,平台将按原支付路径全额退回。\n\n协议签署要求:商户参与代销业务前,需与平台签订《委托代销协议书》,明确双方权利、义务及违约责任。\n\n销售风险说明:平台仅提供货源展示、交易撮合服务,不保证代销货源一定能够卖出,货源滞销风险由商户自行承担。\n'
},
'包场合作': {
title: '包销合作规则',
content: '\n(一)包场销售(平台自负盈亏模式)\n\n1. 合作机制:平台与乙方就指定货源协商定价后,由平台全款收购该批货源,按约定时间结算价格,货权归属平台。\n\n2. 乙方义务:乙方需按照合作约定的时间、数量、质量标准提供货源,不得出现拖欠货源、擅自将约定货源自主销售等违约行为。\n\n3. 销售与盈亏:平台自主负责收购货源的销售事宜,独立承担销售过程中的盈利与亏损。\n\n(二)包场销售(乙方自主销售模式)\n\n1. 销售限制:乙方可自主销售约定货源,或委托平台销售,严禁将该批货源委托给平台及乙方之外的第三方销售。\n\n2. 兜底与结算:平台不承担该批货源的销售兜底责任,不设定固定结算周期,实行每日结算。\n\n3. 抽成与利润分配:(委托平台销售)\n\n盈利场景:每日销售盈利部分由甲方与乙方对等分配,平台同步按1元/件标准抽取费用。\n\n亏损场景:若当日销售无盈利或者亏损,平台仍按0.8元/件标准抽取费用(可打折)\n'
},
'采销联盟合作': {
title: '采销联盟合作规则',
content: '\n1. 合作主体:外部采购公司可通过成立独立的盒子公司,与平台开展货源包场或货源收购合作。\n\n2. 风险承担:盒子公司承担合作过程中产生的各类风险(包括但不限于货源质量风险、销售风险、市场风险等)。\n\n3. 利润分配:合作产生的净利润按以下比例分配:平台占20%、甲方占30%、乙方(盒子公司对应的外部采购公司)占50%。\n'
},
'其他': {
title: '其他',
content: '其他合作模式'
}
};
// 显示合作模式详细说明弹窗
this.setData({
showCooperationConfirm: true,
currentCooperationDetail: cooperationDetails[value] || {
title: value,
content: '暂无详细说明'
},
pendingCooperationValue: value
});
},
// 关闭合作模式确认弹窗
closeCooperationConfirm() {
this.setData({
showCooperationConfirm: false,
currentCooperationDetail: null,
pendingCooperationValue: ''
});
},
// 确认选择合作模式
confirmCooperationSelection() {
const value = this.data.pendingCooperationValue;
this.setData({
cooperation: value, // 使用数据库字段名
showCooperationError: false,
cooperationError: '',
showCooperationConfirm: false,
currentCooperationDetail: null,
pendingCooperationValue: ''
});
},
// 选择合作模式(内部调用,带验证)
selectCooperation(e) {
const value = e.currentTarget.dataset.value;
this.setData({
cooperation: value, // 使用数据库字段名
showCooperationError: false,
cooperationError: ''
});
},
// 上传LICENSE
uploadBusinessLicense() {
wx.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
const tempFilePaths = res.tempFilePaths;
this.setData({
businesslicenseurl: { // 使用数据库字段名
path: tempFilePaths[0],
name: `营业执照_${new Date().getTime()}.jpg`
}
});
}
});
},
// 删除LICENSE
deleteBusinessLicense() {
this.setData({ businesslicenseurl: null }); // 使用数据库字段名
},
// 上传动物检疫合格证明
uploadAnimalQuarantine() {
wx.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
const tempFilePaths = res.tempFilePaths;
this.setData({
proofurl: { // 使用数据库字段名
path: tempFilePaths[0],
name: `动物检疫合格证明_${new Date().getTime()}.jpg`
}
});
}
});
},
// 删除动物检疫合格证明
deleteAnimalQuarantine() {
this.setData({ proofurl: null }); // 使用数据库字段名
},
// 上传法人身份证
uploadIdCard() {
wx.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
const tempFilePaths = res.tempFilePaths;
this.setData({
proofurl: { // 使用与动物检疫合格证明相同的字段名
path: tempFilePaths[0],
name: `法人身份证_${new Date().getTime()}.jpg`
}
});
}
});
},
// 删除法人身份证
deleteIdCard() {
this.setData({ proofurl: null }); // 使用与动物检疫合格证明相同的字段名
},
// 上传品牌授权链文件
uploadBrandAuth() {
wx.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
const tempFilePaths = res.tempFilePaths;
this.setData({
brandurl: { // 使用数据库字段名
path: tempFilePaths[0],
name: `品牌授权链_${new Date().getTime()}.jpg`
}
});
}
});
},
// 删除品牌授权链文件
deleteBrandAuth() {
this.setData({ brandurl: null }); // 使用数据库字段名
},
// 获取文件类型显示名称
getFileTypeDisplayName(fileType) {
const typeNames = {
'businessLicense': '营业执照',
'animalQuarantine': '动物检疫合格证明',
'idCard': '法人身份证',
'brandAuth': '品牌授权链文件'
};
return typeNames[fileType] || '文件';
},
// 上传文件到服务器
async uploadFileToServer(filePath, fileType) {
try {
const API = require('../../utils/api.js');
console.log(`开始上传${this.getFileTypeDisplayName(fileType)}文件:`, filePath);
const result = await API.uploadSettlementFile(filePath, fileType);
// 修正返回值处理 - API.uploadSettlementFile直接返回data对象
if (result && result.fileUrl) {
console.log(`${this.getFileTypeDisplayName(fileType)}上传成功:`, result.fileUrl);
return result.fileUrl;
} else {
throw new Error(`${this.getFileTypeDisplayName(fileType)}上传失败`);
}
} catch (error) {
console.error(`${this.getFileTypeDisplayName(fileType)}上传失败:`, error);
wx.showToast({
title: `${this.getFileTypeDisplayName(fileType)}上传失败`,
icon: 'none'
});
throw error;
}
},
// 提交申请
async submitApplication() {
// 检查用户是否已登录
const openid = wx.getStorageSync('openid');
const userId = wx.getStorageSync('userId');
// 如果未登录,显示登录弹窗
if (!openid || !userId) {
console.log('用户未登录,显示授权弹窗');
// 保存当前表单数据
this.saveSettlementProgress();
// 显示一键登录弹窗
this.setData({
showOneKeyLoginModal: true
});
return; // 取消提交申请
}
console.log('使用已登录用户信息提交申请:', openid, userId);
// 先上传所有文件
wx.showLoading({
title: '正在上传文件...',
mask: true
});
const uploadedFiles = {};
try {
// 上传LICENSE
if (this.data.businesslicenseurl) { // 使用数据库字段名
uploadedFiles.businessLicenseFile = await this.uploadFileToServer(
this.data.businesslicenseurl.path,
'businessLicense'
);
}
// 上传动物检疫合格证明或法人身份证(两者共用一个字段)
if (this.data.proofurl) { // 使用数据库字段名
uploadedFiles.animalQuarantineFile = await this.uploadFileToServer(
this.data.proofurl.path,
'animalQuarantine' // 保持原有的文件类型,或者可以根据实际情况调整
);
}
// 上传品牌授权链文件
if (this.data.brandurl) { // 使用数据库字段名
uploadedFiles.brandAuthFile = await this.uploadFileToServer(
this.data.brandurl.path,
'brandAuth'
);
}
console.log('所有文件上传完成:', uploadedFiles);
// 移除return语句,让代码继续执行到提交数据部分
} catch (error) {
console.error('文件上传失败:', error);
wx.showToast({
title: '文件上传失败',
icon: 'none'
});
return; // 修改为return而不是return null
} finally {
// 确保无论成功失败都会隐藏loading
wx.hideLoading();
}
// 准备提交数据(与后端API要求的字段名匹配)
// 尝试多种方式获取手机号,确保contactPhone不为空
// 1. 先尝试直接获取常见的手机号存储键
let contactPhone = wx.getStorageSync('phone') ||
wx.getStorageSync('userPhone') ||
wx.getStorageSync('mobile') ||
'';
// 2. 如果上述方式没获取到,尝试从userInfo对象中获取
if (!contactPhone) {
const userInfo = wx.getStorageSync('userInfo');
if (userInfo && userInfo.phoneNumber && userInfo.phoneNumber !== '未绑定') {
contactPhone = userInfo.phoneNumber;
}
}
console.log('最终获取到的手机号:', contactPhone);
// 根据后端API要求构建submitData对象(使用独立的省市区字段)
const submitData = {
openid: openid,
collaborationid: this.data.collaborationid, // 合作商身份ID
company: this.data.company || '', // 客户公司名称
province: this.data.province, // 省份
city: this.data.city, // 城市
district: this.data.district, // 区县
detailedaddress: this.data.detailedaddress || '', // 详细地址(即使为空也要传递)
cooperation: this.data.cooperation === '货源委托' ? 'wholesale' : this.data.cooperation, // 合作模式映射为后端期望的值
phoneNumber: contactPhone, // 后端期望的字段名是phoneNumber
businesslicenseurl: uploadedFiles.businessLicenseFile || '', // 营业执照URL
proofurl: uploadedFiles.animalQuarantineFile || '', // 动物检疫证明或法人身份证URL(两者共用一个字段)
brandurl: uploadedFiles.brandAuthFile || '', // 品牌授权链URL
userId: userId
};
// 特别记录详细地址字段,确保它被正确提交
console.log('详细地址字段值:', submitData.detailedaddress);
console.log('详细地址字段类型:', typeof submitData.detailedaddress);
console.log('详细地址字段是否存在:', 'detailedaddress' in submitData);
// 记录省市区字段内容
console.log('省市区字段内容(提交数据):', submitData.province, submitData.city, submitData.district);
// 保存提交数据到本地存储,供首页检查使用
wx.setStorageSync('preSubmitData', submitData);
console.log('已保存preSubmitData:', submitData);
// 检查必填字段是否为空
console.log('提交数据检查 - contactPhone:', contactPhone);
console.log('提交数据检查 - identityType:', this.data.collaborationid);
console.log('提交数据检查 - cooperationMode:', this.data.cooperation);
console.log('提交数据检查 - cooperationValue:', submitData.cooperation); // 检查映射后的值
console.log('提交数据检查 - contactName:', this.data.company);
console.log('提交数据检查 - 省市区:', submitData.province, submitData.city, submitData.district);
// 检查所有字段是否完整
console.log('提交数据完整性检查:', {
hasOpenid: !!submitData.openid,
hasCollaborationid: !!submitData.collaborationid,
hasCompany: !!submitData.company,
hasProvince: !!submitData.province,
hasCity: !!submitData.city,
hasDistrict: !!submitData.district,
hasDetailedAddress: !!submitData.detailedaddress,
hasCooperation: !!submitData.cooperation,
hasPhoneNumber: !!submitData.phoneNumber,
hasBusinessLicense: !!submitData.businesslicenseurl,
hasProofUrl: !!submitData.proofurl,
hasBrandUrl: !!submitData.brandurl
});
// 表单验证 - 检查必填字段
if (!openid) {
wx.showToast({
title: '请先登录',
icon: 'none'
});
return;
}
if (!this.data.collaborationid) {
wx.showToast({
title: '请选择合作商身份',
icon: 'none'
});
return;
}
if (!this.data.cooperation) {
wx.showToast({
title: '请选择合作模式',
icon: 'none'
});
return;
}
if (!this.data.company) {
wx.showToast({
title: '请填写公司名称',
icon: 'none'
});
return;
}
if (!this.data.detailedaddress || !this.data.detailedaddress.trim()) {
wx.showToast({
title: '请填写详细地址',
icon: 'none'
});
return;
}
// 手机号为空时使用默认值,不再强制要求
if (!contactPhone) {
contactPhone = 'default_phone';
console.log('使用默认手机号:', contactPhone);
}
// 验证省市区字段是否填写完整(用于构建region字段)
if (!this.data.province || !this.data.city || !this.data.district) {
wx.showToast({
title: '请填写完整地址',
icon: 'none'
});
return;
}
// 验证营业执照
if (!this.data.businesslicenseurl) {
this.setData({
showBusinessLicenseError: true,
businessLicenseError: '请上传营业执照'
});
wx.showToast({
title: '请上传营业执照',
icon: 'none'
});
return;
} else {
this.setData({
showBusinessLicenseError: false,
businessLicenseError: ''
});
}
// 验证动物检疫合格证明或法人身份证
if (!this.data.proofurl) {
this.setData({
showProofError: true,
proofError: this.data.collaborationid === 'chicken' ? '请上传动物检疫合格证明' : '请上传法人身份证正反面'
});
wx.showToast({
title: this.data.collaborationid === 'chicken' ? '请上传动物检疫合格证明' : '请上传法人身份证正反面',
icon: 'none'
});
return;
} else {
this.setData({
showProofError: false,
proofError: ''
});
}
// 记录省市区字段内容
console.log('省市区字段内容:', this.data.province, this.data.city, this.data.district);
// 文件上传现在为选填,不再强制要求
console.log('文件上传状态:', {
businessLicenseFile: !!uploadedFiles.businessLicenseFile,
animalQuarantineFile: !!uploadedFiles.animalQuarantineFile,
brandAuthFile: !!uploadedFiles.brandAuthFile
});
try {
// 调用后端API提交入驻申请
// 使用API.BASE_URL构建正确的请求路径
const API = require('../../utils/api');
console.log('开始提交入驻申请,API地址:', API.BASE_URL + '/api/settlement/submit');
console.log('提交的完整数据:', submitData);
// 详细检查后端必需的关键字段(使用独立的省市区字段)
const requiredFieldsCheck = {
openid: { value: submitData.openid, exists: !!submitData.openid },
collaborationid: { value: submitData.collaborationid, exists: !!submitData.collaborationid },
cooperation: { value: submitData.cooperation, exists: !!submitData.cooperation },
company: { value: submitData.company, exists: !!submitData.company },
phoneNumber: { value: submitData.phoneNumber, exists: !!submitData.phoneNumber },
province: { value: submitData.province, exists: !!submitData.province },
city: { value: submitData.city, exists: !!submitData.city },
district: { value: submitData.district, exists: !!submitData.district }
};
console.log('后端必需字段详细检查:', requiredFieldsCheck);
// 检查是否所有必需字段都已填写
const allRequiredFieldsExist = Object.values(requiredFieldsCheck).every(field => field.exists);
console.log('是否所有后端必需字段都已填写:', allRequiredFieldsExist);
const result = await new Promise((resolve, reject) => {
wx.request({
url: API.BASE_URL + '/api/settlement/submit',
method: 'POST',
data: submitData,
success: (res) => {
console.log('API请求成功,原始响应:', res);
resolve(res.data);
},
fail: (err) => {
console.error('API请求失败:', err);
reject(err);
}
});
});
console.log('入驻申请提交结果:', result);
console.log('请求状态码:', result.code);
console.log('请求消息:', result.message);
if (result && result.success) {
// 更新本地状态
wx.setStorageSync('settlementStatus', 'underreview');
// 保存applicationId到本地存储,供撤回功能使用
const appId = result.data?.id || null;
if (appId) {
wx.setStorageSync('applicationId', appId);
}
wx.showToast({
title: '提交成功,等待审核',
icon: 'none',
duration: 2000
});
// 跳转到审核状态页面 - 立即执行
this.setData({
currentStep: 3, // 设置为第4步(审核状态页面)
partnerstatus: 'underreview', // 使用数据库字段名 (原auditStatus)
applicationId: appId
});
// 更新用户类型为seller
const API = require('../../utils/api.js');
API.updateUserType('seller').then(() => {
console.log('用户类型已更新为seller');
}).catch(err => {
console.error('更新用户类型失败:', err);
});
// 调用API获取用户完整数据 - 异步执行,不影响跳转
API.getUserInfo().then(userRes => {
console.log('用户完整数据:', userRes.data);
}).catch(err => {
console.error('获取用户数据失败:', err);
});
// 清除进度数据,因为已经提交了
this.clearSettlementProgress();
} else {
if (result.code === 400 && result.message.includes('已有待审核的入驻申请')) {
wx.showToast({
title: result.message,
icon: 'none',
duration: 2000
});
setTimeout(() => {
wx.reLaunch({
url: '/pages/index/index'
});
}, 2000);
} else {
wx.showToast({
title: result.message || '提交失败',
icon: 'none'
});
}
}
} catch (error) {
console.error('提交入驻申请失败:', error);
wx.showToast({
title: '提交失败,请重试',
icon: 'none'
});
}
},
// 跳转到首页进行授权登录
async goToAuthLogin() {
// 保存当前表单数据
this.saveSettlementProgress();
console.log('用户未登录,在当前页面调用登录方法');
// 显示登录提示
wx.showToast({
title: '请先登录',
icon: 'none',
duration: 1500,
complete: () => {
// 直接在当前页面调用首页的登录逻辑
setTimeout(() => {
this.performDirectLogin();
}, 1500);
}
});
},
// 在当前页面直接执行登录逻辑
async performDirectLogin() {
console.log('显示登录弹窗,让用户主动授权');
// 显示登录弹窗
this.setData({
showAuthModal: true
});
},
// 关闭登录弹窗
closeAuthModal() {
this.setData({
showAuthModal: false
});
},
// 显示一键登录弹窗
showOneKeyLogin() {
this.setData({
showAuthModal: false,
showOneKeyLoginModal: true
})
},
// 关闭一键登录弹窗
closeOneKeyLoginModal() {
this.setData({ showOneKeyLoginModal: false })
},
// 处理手机号授权
async onGetPhoneNumber(e) {
console.log('用户点击了手机号授权按钮', e.detail);
// 关闭登录弹窗
this.setData({
showOneKeyLoginModal: false
});
// 首先检查用户是否拒绝授权
if (e.detail.errMsg !== 'getPhoneNumber:ok') {
console.log('用户拒绝授权手机号');
wx.showToast({
title: '您已拒绝授权,操作已取消',
icon: 'none'
});
return;
}
// 用户同意授权
wx.showLoading({
title: '登录中...',
mask: true
});
try {
// 引入API服务
const API = require('../../utils/api.js');
// 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;
let sessionKey = null;
// 优先从data字段获取数据
if (openidRes && openidRes.data && typeof openidRes.data === 'object') {
openid = openidRes.data.openid || openidRes.data.OpenID || null;
userId = openidRes.data.userId || openidRes.data.userid || null;
sessionKey = openidRes.data.session_key || openidRes.data.sessionKey || null;
}
// 如果data为空或不存在,尝试从响应对象直接获取
if (!openid && openidRes && typeof openidRes === 'object') {
console.warn('服务器返回格式可能不符合预期,data字段为空或不存在,但尝试从根对象提取信息:', openidRes);
openid = openidRes.openid || openidRes.OpenID || null;
userId = openidRes.userId || openidRes.userid || null;
sessionKey = openidRes.session_key || openidRes.sessionKey || null;
}
// 检查服务器状态信息
const isSuccess = openidRes && (openidRes.success === true || openidRes.code === 200);
if (!openid) {
throw new Error('获取openid失败: ' + (openidRes && openidRes.message ? openidRes.message : '未知错误'));
}
// 存储openid和session_key
wx.setStorageSync('openid', openid);
if (sessionKey) {
wx.setStorageSync('sessionKey', sessionKey);
}
// 确保始终使用从服务器获取的正式用户ID
if (userId) {
wx.setStorageSync('userId', userId);
}
console.log('获取openid成功并存储:', openid);
// 3. 上传手机号加密数据到服务器解密
const phoneData = {
...e.detail,
openid: openid,
sessionKey: sessionKey || ''
};
console.log('准备上传手机号加密数据到服务器');
const phoneRes = await API.uploadPhoneNumberData(phoneData);
// 改进手机号解密结果的处理逻辑
if (!phoneRes || (!phoneRes.success && !phoneRes.phoneNumber)) {
// 如果服务器返回格式不标准但包含手机号,也接受
if (!(phoneRes && phoneRes.phoneNumber)) {
throw new Error('获取手机号失败: ' + (phoneRes && phoneRes.message ? phoneRes.message : '未知错误'));
}
}
const phoneNumber = phoneRes.phoneNumber || '未绑定';
console.log('获取手机号成功:', phoneNumber);
// 4. 获取用户信息
let userInfo = {
name: '微信用户',
avatarUrl: '/images/default-avatar.png',
phoneNumber: phoneNumber,
gender: 0,
country: '',
province: '',
city: '',
language: 'zh_CN'
};
try {
// 尝试获取用户微信头像和昵称
const userProfileRes = await new Promise((resolve, reject) => {
wx.getUserProfile({
desc: '用于完善会员资料',
success: resolve,
fail: reject
});
});
if (userProfileRes && userProfileRes.userInfo) {
userInfo = {
...userInfo,
...userProfileRes.userInfo
};
}
} catch (err) {
console.warn('获取用户头像昵称失败:', err);
// 不影响主流程,使用默认值
}
// 5. 更新用户信息到服务器
try {
await API.updateUserInfo({
openid: openid,
phoneNumber: phoneNumber,
...userInfo
});
console.log('用户信息已更新到服务器');
} catch (err) {
console.warn('更新用户信息到服务器失败:', err);
// 不影响主流程,继续执行
}
// 6. 保存用户信息到全局和本地存储
const app = getApp();
if (app) {
app.globalData.userInfo = userInfo;
}
wx.setStorageSync('userInfo', userInfo);
console.log('用户信息已保存到本地存储:', userInfo);
wx.hideLoading();
wx.showToast({
title: '登录成功',
icon: 'success',
duration: 1500,
complete: () => {
// 登录成功后关闭弹窗,恢复表单数据并让用户继续提交申请
setTimeout(() => {
this.closeOneKeyLoginModal();
// 登录成功后恢复表单数据
this.loadSettlementProgress();
console.log('登录成功后已恢复表单数据');
// 用户登录成功后,可以选择自动提交申请
// 这里保持原逻辑,让用户手动点击提交
}, 1500);
}
});
} catch (error) {
wx.hideLoading();
console.error('手机号授权登录失败:', error);
wx.showToast({
title: '登录失败,请重试',
icon: 'none'
});
}
},
// 备用登录方案
async performBackupLogin() {
wx.showLoading({
title: '登录中...',
mask: true
});
try {
// 模拟登录流程
const mockOpenid = 'settlement_login_' + Date.now();
const mockUserId = 'settlement_user_' + Date.now();
// 存储模拟登录信息
wx.setStorageSync('openid', mockOpenid);
wx.setStorageSync('userId', mockUserId);
// 保存用户信息到全局和本地存储
const userInfo = {
name: '微信用户',
avatarUrl: '/images/default-avatar.png',
phoneNumber: '未绑定',
gender: 0,
country: '',
province: '',
city: '',
language: 'zh_CN'
};
// 保存到全局数据
const app = getApp();
if (app) {
app.globalData.userInfo = userInfo;
}
// 保存到本地存储
wx.setStorageSync('userInfo', userInfo);
console.log('备用登录用户信息已保存:', userInfo);
wx.hideLoading();
wx.showToast({
title: '登录成功',
icon: 'success',
duration: 1500,
complete: () => {
// 登录成功后关闭弹窗,让用户决定是否继续提交
setTimeout(() => {
this.closeOneKeyLoginModal();
this.setData({ showAuthModal: false });
}, 1500);
}
});
} catch (error) {
wx.hideLoading();
console.error('备用登录失败:', error);
wx.showToast({
title: '登录失败,请重试',
icon: 'none'
});
}
},
// 撤回备案
async withdrawApplication() {
// 检查用户是否已登录
const openid = wx.getStorageSync('openid');
if (!openid) {
console.log('用户未登录,显示授权弹窗');
// 显示登录弹窗
this.setData({
showAuthModal: true
});
return; // 取消撤回申请
}
wx.showModal({
title: '确认撤回',
content: '确定要撤回备案申请吗?撤回后可以重新提交。',
success: async (res) => {
if (res.confirm) {
try {
console.log('使用已登录用户openid撤回申请:', openid);
// 调用API撤回申请,不再需要applicationId,只需要用户openid
const API = require('../../utils/api.js');
const result = await API.withdrawSettlementApplication(openid);
if (result && result.success) {
// 清除本地状态
wx.removeStorageSync('preSubmitData');
wx.removeStorageSync('applicationId');
wx.setStorageSync('hasSubmittedSettlement', false);
wx.removeStorageSync('settlementStatus');
// 重置页面状态
this.setData({
currentStep: 0,
partnerstatus: '', // 使用数据库字段名 (原auditStatus)
applicationId: null
});
wx.showToast({
title: '已撤回申请',
icon: 'success'
});
} else {
wx.showToast({
title: result.message || '撤回失败',
icon: 'none'
});
}
} catch (error) {
console.error('撤回申请失败:', error);
wx.showToast({
title: '撤回失败,请重试',
icon: 'none'
});
}
}
}
});
},
// 审核中我知道了
knowAudit() {
// 获取用户openid
const openid = wx.getStorageSync('openid');
console.log('使用openid获取用户数据:', openid);
// 调用API获取用户完整数据
API.getUserInfo(openid).then(res => {
console.log('用户完整数据:', res.data);
// 更新本地状态
if (res.data) {
if (res.data.partnerstatus) {
wx.setStorageSync('settlementStatus', res.data.partnerstatus);
}
// 同步审核失败原因
const auditFailedReason = res.data.reasonforfailure || '';
this.setData({
partnerstatus: res.data.partnerstatus || '',
auditFailedReason: auditFailedReason
});
}
// 跳转到index页面,不显示提示
wx.reLaunch({
url: '/pages/index/index'
});
}).catch(err => {
console.error('获取用户数据失败:', err);
// 即使获取失败也跳转到index页面
wx.reLaunch({
url: '/pages/index/index'
});
});
},
// 重新提交备案
resubmitApplication() {
try {
// 检查用户是否已登录
const openid = wx.getStorageSync('openid');
if (!openid) {
console.log('用户未登录,显示授权弹窗');
// 显示登录弹窗
this.setData({
showAuthModal: true
});
return; // 取消重新提交申请
}
// 更新本地状态
wx.setStorageSync('settlementStatus', '');
wx.removeStorageSync('applicationId');
// 重置表单数据,让用户重新开始入驻流程
this.setData({
// 重置步骤
currentStep: 0,
partnerstatus: null,
showGuidePage: true,
// 重置身份选择
collaborationid: '',
showIdentityError: false,
// 重置基本信息
company: '',
showCompanyNameError: false,
companyNameError: '',
province: '',
city: '',
district: '',
detailedaddress: '',
showDetailedAddressError: false,
detailedAddressError: '',
showRegionError: false,
regionError: '',
cooperation: '',
showCooperationError: false,
cooperationError: '',
// 重置上传资料
businesslicenseurl: null,
showBusinessLicenseError: false,
businessLicenseError: '',
proofurl: null,
showProofError: false,
proofError: '',
brandurl: null,
// 重置审核相关
auditFailedReason: ''
});
wx.showToast({
title: '已进入重新申请流程',
icon: 'success'
});
} catch (error) {
console.error('重新开始申请失败:', error);
wx.showToast({
title: '操作失败,请重试',
icon: 'none'
});
}
},
// 完成申请
completeApplication() {
// 更新入驻状态为审核通过
this.updateGlobalSettlementStatus('approved');
// 返回首页
wx.reLaunch({
url: '/pages/index/index'
});
},
// 重置申请流程
resetApplication() {
this.setData({
currentStep: 0,
collaborationid: '', // 使用数据库字段名 (原selectedIdentity)
showIdentityError: false,
company: '', // 使用数据库字段名 (原companyName)
showCompanyNameError: false,
companyNameError: '',
province: '',
city: '',
district: '',
detailedaddress: '', // 使用数据库字段名 (原detailAddress)
showDetailedAddressError: false,
detailedAddressError: '',
showRegionError: false,
regionError: '',
cooperation: '', // 使用数据库字段名 (原selectedCooperation)
showCooperationError: false,
cooperationError: '',
businesslicenseurl: null, // 使用数据库字段名 (原businessLicenseFile)
showBusinessLicenseError: false,
businessLicenseError: '',
proofurl: null, // 使用数据库字段名 (原animalQuarantineFile)
showProofError: false,
proofError: '',
// idCardFile: null, // 已移除,法人身份证现在使用proofurl字段
brandurl: null, // 使用数据库字段名 (原brandAuthFile)
partnerstatus: 'underreview', // 使用数据库字段名 (原auditStatus)
showAuthModal: false,
applicationId: null,
auditFailedReason: ''
});
// 清除保存的进度
this.clearSettlementProgress();
},
// 从服务器同步入驻状态
async syncSettlementStatus() {
try {
// 获取用户openid
const openid = wx.getStorageSync('openid');
if (!openid) {
console.log('未登录,无法同步入驻状态');
return;
}
console.log('使用openid同步状态:', openid);
const result = await API.getUserInfo(openid);
if (result && result.success && result.data) {
const userData = result.data;
// 更新本地状态
wx.setStorageSync('hasSubmittedSettlement', true);
// 只有在有实际状态值时才设置,避免空值时默认为审核中
wx.setStorageSync('settlementStatus', userData.partnerstatus || '');
// 更新页面状态
this.setData({
partnerstatus: userData.partnerstatus || '', // 使用数据库字段名,不设置默认值
auditFailedReason: userData.reasonforfailure || '暂无详细的审核失败原因,请联系客服了解详情。'
});
console.log('已同步服务器入驻状态:', userData.partnerstatus);
// 根据partnerstatus更新页面步骤
if (userData.partnerstatus === 'approved' || userData.partnerstatus === 'underreview' || userData.partnerstatus === 'reviewfailed') {
this.setData({
showGuidePage: false,
currentStep: 3
});
}
}
} catch (error) {
console.error('同步入驻状态失败:', error);
}
},
/**
* 显示合作模式帮助弹窗
*/
showCooperationHelp() {
this.setData({
showCooperationHelp: true,
selectedCooperationDetail: null
});
},
/**
* 显示合作模式详情
*/
showCooperationDetail(e) {
const type = e.currentTarget.dataset.type;
const cooperationDetails = {
'代销业务': {
title: '代销业务规则',
content: '\n定价规则:代销商户可自主制定所挂货源的销售价格,价格需符合平台物价管控要求,不得恶意定价。\n\n服务费规则:平台对代销挂货收取固定服务费,标准为1 元 / 件,仅在货源成功卖出后收取,未卖出不产生费用。\n\n保证金规则\n\n参与代销业务的商户需按合作车型缴纳保证金,具体标准如下:\n\n4.2 米车型:300 元 / 车\n\n6.8 米车型:500 元 / 车\n\n9.6 米车型:800 元 / 车\n\n挂车车型:1200 元 / 车\n\n保证金仅作为履约担保,合作结束且无违规违约行为的,平台将按原支付路径全额退回。\n\n协议签署要求:商户参与代销业务前,需与平台签订《委托代销协议书》,明确双方权利、义务及违约责任。\n\n销售风险说明:平台仅提供货源展示、交易撮合服务,不保证代销货源一定能够卖出,货源滞销风险由商户自行承担。\n'
},
'包场合作': {
title: '包销合作规则',
content: '\n(一)包场销售(平台自负盈亏模式)\n\n1. 合作机制:平台与乙方就指定货源协商定价后,由平台全款收购该批货源,按约定时间结算价格,货权归属平台。\n\n2. 乙方义务:乙方需按照合作约定的时间、数量、质量标准提供货源,不得出现拖欠货源、擅自将约定货源自主销售等违约行为。\n\n3. 销售与盈亏:平台自主负责收购货源的销售事宜,独立承担销售过程中的盈利与亏损。\n\n(二)包场销售(乙方自主销售模式)\n\n1. 销售限制:乙方可自主销售约定货源,或委托平台销售,严禁将该批货源委托给平台及乙方之外的第三方销售。\n\n2. 兜底与结算:平台不承担该批货源的销售兜底责任,不设定固定结算周期,实行每日结算。\n\n3. 抽成与利润分配:(委托平台销售)\n\n盈利场景:每日销售盈利部分由甲方与乙方对等分配,平台同步按1元/件标准抽取费用。\n\n亏损场景:若当日销售无盈利或者亏损,平台仍按0.8元/件标准抽取费用(可打折)\n'
},
'采销联盟合作': {
title: '采销联盟合作规则',
content: '\n1. 合作主体:外部采购公司可通过成立独立的盒子公司,与平台开展货源包场或货源收购合作。\n\n2. 风险承担:盒子公司承担合作过程中产生的各类风险(包括但不限于货源质量风险、销售风险、市场风险等)。\n\n3. 利润分配:合作产生的净利润按以下比例分配:平台占20%、甲方占30%、乙方(盒子公司对应的外部采购公司)占50%。\n'
},
'其他': {
title: '其他',
content: '其他合作模式'
}
};
// 切换显示/隐藏功能
if (this.data.selectedCooperationDetail && this.data.selectedCooperationDetail.title === cooperationDetails[type].title) {
// 再次点击同一个按钮,收起详情
this.setData({
selectedCooperationDetail: null
});
} else {
// 点击不同按钮,显示详情
this.setData({
selectedCooperationDetail: cooperationDetails[type] || {
title: type,
content: '暂无详细说明'
}
});
// 设置需要滚动到的ID
this.setData({
scrollToView: 'cooperation-detail-content'
});
// 延迟执行一次滚动到底部,确保内容完全可见
setTimeout(() => {
const query = wx.createSelectorQuery().in(this);
query.select('.cooperation-help-container').node().exec(nodes => {
const container = nodes[0].node;
if (container) {
// 确保滚动到最底部
container.scrollTop = container.scrollHeight;
}
});
}, 400);
}
},
/**
* 关闭合作模式帮助弹窗
*/
closeCooperationHelp() {
this.setData({
showCooperationHelp: false,
selectedCooperationDetail: null
});
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
return {
title: '合作入驻 - 又鸟蛋平台',
path: '/pages/settlement/index?showGuide=1',
imageUrl: '/images/立即入驻7.jpg'
};
},
/**
* 用户点击右上角分享到朋友圈
*/
onShareTimeline: function () {
return {
title: '合作入驻 - 又鸟蛋平台',
query: 'showGuide=1',
imageUrl: '/images/立即入驻7.jpg'
};
}
});