441 lines
18 KiB
JavaScript
441 lines
18 KiB
JavaScript
// pages/withdraw/components/mode1/mode1.js — 收款码手动审核纯提现
|
|
import request from '../../../../utils/request.js';
|
|
import upload from '../../../../utils/upload.js';
|
|
import PopupService from '../../../../services/popupService.js';
|
|
|
|
const app = getApp();
|
|
|
|
const ASSET_TYPES = {
|
|
dashou_yue: { leixing: 1, label: '接单员佣金' },
|
|
dashou_yajin: { leixing: 5, label: '接单员保证金' },
|
|
shangjia_yue: { leixing: 6, label: '商家余额' },
|
|
guanshi_fenyong: { leixing: 2, label: '管事分红' },
|
|
zuzhang_fenyong: { leixing: 3, label: '组长分红' },
|
|
kaoheguan_fenyong: { leixing: 4, label: '考核官分佣' },
|
|
};
|
|
|
|
const FROM_ASSET_MAP = {
|
|
dashou: 'dashou_yue',
|
|
guanshi: 'guanshi_fenyong',
|
|
zuzhang: 'zuzhang_fenyong',
|
|
kaoheguan: 'kaoheguan_fenyong',
|
|
kaohe: 'kaoheguan_fenyong',
|
|
shangjia: 'shangjia_yue',
|
|
yajin: 'dashou_yajin',
|
|
};
|
|
|
|
Component({
|
|
properties: { options: { type: Object, value: {} } },
|
|
data: {
|
|
imgUrls: { iconWechat: '', iconAlipay: '' },
|
|
assetList: [],
|
|
displayAssetList: [],
|
|
totalAmount: '0.00',
|
|
canWithdraw: false,
|
|
isLoadingAssets: false,
|
|
selectedAsset: null,
|
|
tixianAmount: '',
|
|
feeRateText: '--',
|
|
currentRate: '0%',
|
|
shouxufei: '0.00',
|
|
shijidaozhang: '0.00',
|
|
showTixianModal: false,
|
|
submitting: false,
|
|
txfangshi: null,
|
|
txdianhua: '',
|
|
txzh: '',
|
|
txtupian: '',
|
|
showSkfsModal: false,
|
|
tempTxfangshi: null,
|
|
tempTxPhone: '',
|
|
tempTxAccount: '',
|
|
tempTxImage: '',
|
|
choosingImage: false,
|
|
},
|
|
|
|
attached() {
|
|
this.initImageUrls();
|
|
this.loadAllAssets();
|
|
this.loadWithdrawMethod();
|
|
},
|
|
|
|
pageLifetimes: {
|
|
show() {
|
|
this.registerNotification();
|
|
this.loadAllAssets();
|
|
PopupService.checkAndShow(this, 'tixian');
|
|
},
|
|
hide() {
|
|
const popup = this.selectComponent('#popupNotice');
|
|
popup?.cleanup?.();
|
|
},
|
|
},
|
|
|
|
methods: {
|
|
formatRatePercent(rate) {
|
|
const r = parseFloat(rate) || 0;
|
|
if (r <= 1 && r > 0) return `${(r * 100).toFixed(0)}%`;
|
|
return `${r}%`;
|
|
},
|
|
|
|
registerNotification() {
|
|
const comp = this.selectComponent('#global-notification');
|
|
if (comp?.showNotification) {
|
|
app.globalData.globalNotification = {
|
|
show: (data) => comp.showNotification(data),
|
|
hide: () => comp.hideNotification(),
|
|
};
|
|
}
|
|
},
|
|
|
|
initImageUrls() {
|
|
const ossBase = app.globalData.ossImageUrl || '';
|
|
const imgDir = `${ossBase}beijing/tixian/`;
|
|
this.setData({
|
|
imgUrls: {
|
|
iconWechat: `${imgDir}icon_wechat.png`,
|
|
iconAlipay: `${imgDir}icon_alipay.png`,
|
|
},
|
|
});
|
|
},
|
|
|
|
/** 顶部展示:不含保证金的可提现合计 */
|
|
calcDisplayTotal(assets) {
|
|
let total = 0;
|
|
(assets || []).forEach((item) => {
|
|
if (item.type === 'dashou_yajin') return;
|
|
total += parseFloat(item.amount) || 0;
|
|
});
|
|
return total;
|
|
},
|
|
|
|
hasAnyWithdrawable(assets) {
|
|
return (assets || []).some((item) => parseFloat(item.amount) > 0);
|
|
},
|
|
|
|
applyRouteOptions(assets) {
|
|
const opts = this.properties.options || {};
|
|
const fromKey = FROM_ASSET_MAP[opts.from];
|
|
let selected = null;
|
|
if (fromKey) {
|
|
selected = assets.find((a) => a.type === fromKey) || null;
|
|
} else if (assets.length === 1) {
|
|
selected = assets[0];
|
|
}
|
|
const patch = {};
|
|
if (selected) {
|
|
patch.selectedAsset = selected;
|
|
patch.feeRateText = selected.rateText;
|
|
}
|
|
if (opts.amount && parseFloat(opts.amount) > 0) {
|
|
const amt = parseFloat(opts.amount);
|
|
const max = selected ? parseFloat(selected.amount) : amt;
|
|
patch.tixianAmount = Math.min(amt, max).toFixed(2);
|
|
}
|
|
if (Object.keys(patch).length) {
|
|
this.setData(patch, () => {
|
|
this.recalcFee(this.data.tixianAmount, this.data.selectedAsset);
|
|
});
|
|
}
|
|
},
|
|
|
|
onSelectAsset(e) {
|
|
const index = e.currentTarget.dataset.index;
|
|
const asset = this.data.displayAssetList[index];
|
|
if (!asset || parseFloat(asset.amount) <= 0) {
|
|
wx.showToast({ title: '该账户无可提余额', icon: 'none' });
|
|
return;
|
|
}
|
|
let amount = this.data.tixianAmount;
|
|
const max = parseFloat(asset.amount);
|
|
if (amount && parseFloat(amount) > max) {
|
|
amount = asset.amount;
|
|
}
|
|
this.setData({ selectedAsset: asset, tixianAmount: amount });
|
|
this.recalcFee(amount, asset);
|
|
},
|
|
|
|
async loadAllAssets() {
|
|
this.setData({ isLoadingAssets: true, totalAmount: '0.00', canWithdraw: false, assetList: [] });
|
|
try {
|
|
const res = await request({ url: '/yonghu/tixianzichan', method: 'POST' });
|
|
if (res?.data?.code === 200 || res?.data?.code === 0) {
|
|
const data = res.data.data || {};
|
|
const assets = [];
|
|
const push = (type, amount, rate) => {
|
|
const cfg = ASSET_TYPES[type];
|
|
if (!cfg || !amount || parseFloat(amount) <= 0) return;
|
|
assets.push({
|
|
type,
|
|
leixing: cfg.leixing,
|
|
label: cfg.label,
|
|
amount: parseFloat(amount).toFixed(2),
|
|
rate: rate || 0,
|
|
rateText: this.formatRatePercent(rate || 0),
|
|
});
|
|
};
|
|
push('dashou_yue', data.dashou_yue, data.dashou_rate);
|
|
push('dashou_yajin', data.dashou_yajin, data.dashou_yajin_rate);
|
|
push('shangjia_yue', data.shangjia_yue, data.shangjia_rate);
|
|
push('guanshi_fenyong', data.guanshi_fenyong, data.guanshi_rate);
|
|
push('zuzhang_fenyong', data.zuzhang_fenyong, data.zuzhang_rate);
|
|
push('kaoheguan_fenyong', data.kaoheguan_fenyong, data.kaoheguan_rate);
|
|
|
|
const displayTotal = this.calcDisplayTotal(assets);
|
|
const firstRate = assets.find((a) => a.type !== 'dashou_yajin')?.rate || 0;
|
|
this.setData({
|
|
assetList: assets,
|
|
displayAssetList: assets,
|
|
totalAmount: displayTotal.toFixed(2),
|
|
canWithdraw: this.hasAnyWithdrawable(assets),
|
|
isLoadingAssets: false,
|
|
feeRateText: displayTotal > 0 ? this.formatRatePercent(firstRate) : '--',
|
|
}, () => this.applyRouteOptions(assets));
|
|
if (!this.data.selectedAsset) {
|
|
this.recalcFee(this.data.tixianAmount, null);
|
|
}
|
|
} else {
|
|
throw new Error(res?.data?.msg || '获取资产失败');
|
|
}
|
|
} catch (err) {
|
|
console.error('loadAllAssets', err);
|
|
this.setData({ isLoadingAssets: false, totalAmount: '0.00', canWithdraw: false, assetList: [] });
|
|
}
|
|
},
|
|
|
|
async loadWithdrawMethod() {
|
|
const txzh = wx.getStorageSync('txzh') || '';
|
|
const txtupian = wx.getStorageSync('txtupian') || '';
|
|
const txfangshi = wx.getStorageSync('txfangshi') || null;
|
|
const txdianhua = wx.getStorageSync('txdianhua') || '';
|
|
if (txzh || txtupian || txfangshi) {
|
|
this.setData({ txzh, txtupian, txfangshi, txdianhua });
|
|
return;
|
|
}
|
|
try {
|
|
const res = await request({ url: '/yonghu/tixianhq', method: 'POST' });
|
|
if (res?.data?.code === 0) {
|
|
const data = res.data.data;
|
|
this.setData({
|
|
txzh: data.txzh || '',
|
|
txtupian: data.txtupian || '',
|
|
txfangshi: data.txfangshi || null,
|
|
txdianhua: data.txdianhua || '',
|
|
});
|
|
wx.setStorageSync('txzh', data.txzh || '');
|
|
wx.setStorageSync('txtupian', data.txtupian || '');
|
|
wx.setStorageSync('txfangshi', data.txfangshi || null);
|
|
wx.setStorageSync('txdianhua', data.txdianhua || '');
|
|
}
|
|
} catch (err) { /* ignore */ }
|
|
},
|
|
|
|
recalcFee(amountStr, asset) {
|
|
const amount = parseFloat(amountStr);
|
|
if (!amountStr || isNaN(amount) || amount <= 0 || !asset) {
|
|
this.setData({
|
|
shouxufei: '0.00',
|
|
shijidaozhang: '0.00',
|
|
feeRateText: asset ? asset.rateText : this.data.feeRateText,
|
|
});
|
|
return;
|
|
}
|
|
const rate = parseFloat(asset.rate) || 0;
|
|
const fee = amount * rate;
|
|
this.setData({
|
|
shouxufei: fee.toFixed(2),
|
|
shijidaozhang: (amount - fee).toFixed(2),
|
|
feeRateText: asset.rateText,
|
|
currentRate: asset.rateText,
|
|
});
|
|
},
|
|
|
|
onAmountInput(e) {
|
|
let val = e.detail.value;
|
|
if (val && !/^\d*\.?\d{0,2}$/.test(val)) return;
|
|
this.setData({ tixianAmount: val });
|
|
this.recalcFee(val, this.data.selectedAsset);
|
|
},
|
|
|
|
onWithdrawAll() {
|
|
const { selectedAsset } = this.data;
|
|
if (!selectedAsset) {
|
|
wx.showToast({ title: '请先选择提现账户', icon: 'none' });
|
|
return;
|
|
}
|
|
const max = selectedAsset.amount;
|
|
this.setData({ tixianAmount: max });
|
|
this.recalcFee(max, selectedAsset);
|
|
},
|
|
|
|
onTapWithdraw() {
|
|
if (this.data.submitting) return;
|
|
if (!this.hasAnyWithdrawable(this.data.assetList)) {
|
|
wx.showToast({ title: '暂无可提现余额', icon: 'none' });
|
|
return;
|
|
}
|
|
const { selectedAsset, tixianAmount } = this.data;
|
|
if (!selectedAsset) {
|
|
wx.showToast({ title: '请先选择要提现的账户', icon: 'none' });
|
|
return;
|
|
}
|
|
const amount = parseFloat(tixianAmount);
|
|
if (isNaN(amount) || amount <= 0) {
|
|
wx.showToast({ title: '请输入有效金额', icon: 'none' });
|
|
return;
|
|
}
|
|
if (amount > parseFloat(selectedAsset.amount)) {
|
|
wx.showToast({ title: `超过${selectedAsset.label}可提余额`, icon: 'none' });
|
|
return;
|
|
}
|
|
const { txfangshi, txzh, txtupian } = this.data;
|
|
if (!txfangshi || (!txzh && !txtupian)) {
|
|
wx.showToast({ title: '请先设置收款方式', icon: 'none' });
|
|
this.onSetSkfs();
|
|
return;
|
|
}
|
|
this.applyIdentityAndConfirm(selectedAsset);
|
|
},
|
|
|
|
applyIdentityAndConfirm(asset) {
|
|
this.recalcFee(this.data.tixianAmount, asset);
|
|
this.setData({ selectedAsset: asset, showTixianModal: true });
|
|
},
|
|
|
|
async onConfirmWithdraw() {
|
|
const { selectedAsset, tixianAmount, txfangshi, txzh, txtupian } = this.data;
|
|
if (!selectedAsset) {
|
|
wx.showToast({ title: '请选择提现身份', icon: 'none' });
|
|
return;
|
|
}
|
|
const amount = parseFloat(tixianAmount);
|
|
if (isNaN(amount) || amount <= 0) {
|
|
wx.showToast({ title: '请输入有效金额', icon: 'none' });
|
|
return;
|
|
}
|
|
if (amount > parseFloat(selectedAsset.amount)) {
|
|
wx.showToast({ title: '超过可提余额', icon: 'none' });
|
|
return;
|
|
}
|
|
const leixing = selectedAsset.leixing;
|
|
let txskfs = 0;
|
|
if (txzh && txtupian) txskfs = 3;
|
|
else if (txzh) txskfs = 1;
|
|
else if (txtupian) txskfs = 2;
|
|
|
|
this.setData({ submitting: true });
|
|
try {
|
|
const res = await request({
|
|
url: '/yonghu/tixian',
|
|
method: 'POST',
|
|
data: { leixing, jine: amount.toFixed(2), fangshi: txfangshi, txskfs },
|
|
});
|
|
if (res?.data?.code === 0) {
|
|
this.setData({
|
|
showTixianModal: false,
|
|
selectedAsset: null,
|
|
tixianAmount: '',
|
|
submitting: false,
|
|
});
|
|
await this.loadAllAssets();
|
|
wx.showModal({
|
|
title: '申请成功',
|
|
content: '提现申请已提交,请前往「提现记录」查看审核进度。',
|
|
confirmText: '查看提现记录',
|
|
cancelText: '知道了',
|
|
success: (res) => {
|
|
if (res.confirm) {
|
|
wx.navigateTo({ url: '/pages/withdraw/withdraw-records' });
|
|
}
|
|
},
|
|
});
|
|
} else {
|
|
wx.showToast({ title: res?.data?.msg || '提现失败', icon: 'none' });
|
|
this.setData({ submitting: false });
|
|
}
|
|
} catch (err) {
|
|
wx.showToast({ title: '网络错误', icon: 'none' });
|
|
this.setData({ submitting: false });
|
|
}
|
|
},
|
|
|
|
onCloseTixianModal() {
|
|
if (this.data.submitting) return;
|
|
this.setData({ showTixianModal: false, selectedAsset: null });
|
|
},
|
|
|
|
onSetSkfs() {
|
|
this.setData({
|
|
showSkfsModal: true,
|
|
tempTxfangshi: this.data.txfangshi,
|
|
tempTxPhone: this.data.txdianhua,
|
|
tempTxAccount: this.data.txzh,
|
|
tempTxImage: '',
|
|
});
|
|
},
|
|
|
|
onSelectFangshi(e) { this.setData({ tempTxfangshi: e.currentTarget.dataset.fangshi }); },
|
|
onPhoneInput(e) { this.setData({ tempTxPhone: e.detail.value }); },
|
|
onAccountInput(e) { this.setData({ tempTxAccount: e.detail.value }); },
|
|
|
|
onChooseImage() {
|
|
if (this.data.choosingImage) return;
|
|
this.setData({ choosingImage: true });
|
|
wx.chooseMedia({
|
|
count: 1,
|
|
mediaType: ['image'],
|
|
success: (res) => { this.setData({ tempTxImage: res.tempFiles[0].tempFilePath }); },
|
|
complete: () => { this.setData({ choosingImage: false }); },
|
|
});
|
|
},
|
|
|
|
onPreviewImage() {
|
|
if (this.data.tempTxImage) wx.previewImage({ urls: [this.data.tempTxImage] });
|
|
},
|
|
|
|
onDeleteImage() { this.setData({ tempTxImage: '' }); },
|
|
|
|
async onConfirmSkfs() {
|
|
const { tempTxfangshi, tempTxPhone, tempTxAccount, tempTxImage } = this.data;
|
|
if (!tempTxfangshi) { wx.showToast({ title: '请选择提现方式', icon: 'none' }); return; }
|
|
if (!tempTxPhone) { wx.showToast({ title: '请输入收款人电话', icon: 'none' }); return; }
|
|
if (tempTxfangshi == 1 && !tempTxImage && !this.data.txtupian) {
|
|
wx.showToast({ title: '请上传微信收款码', icon: 'none' }); return;
|
|
}
|
|
if (tempTxfangshi == 2 && !tempTxAccount && !tempTxImage && !this.data.txzh) {
|
|
wx.showToast({ title: '请填写支付宝账号或上传收款码', icon: 'none' }); return;
|
|
}
|
|
try {
|
|
const res = await upload({
|
|
url: '/yonghu/sksc',
|
|
formData: { txdianhua: tempTxPhone, txzh: tempTxAccount || '' },
|
|
filePath: tempTxImage || null,
|
|
fileName: 'file',
|
|
});
|
|
if (res?.data?.code === 0) {
|
|
const data = res.data.data;
|
|
this.setData({
|
|
txfangshi: tempTxfangshi,
|
|
txdianhua: tempTxPhone,
|
|
txzh: data.txzh || '',
|
|
txtupian: data.txtupian || this.data.txtupian,
|
|
showSkfsModal: false,
|
|
});
|
|
wx.setStorageSync('txfangshi', tempTxfangshi);
|
|
wx.setStorageSync('txdianhua', tempTxPhone);
|
|
wx.setStorageSync('txzh', data.txzh || '');
|
|
wx.setStorageSync('txtupian', data.txtupian || this.data.txtupian);
|
|
wx.showToast({ title: '设置成功', icon: 'success' });
|
|
} else {
|
|
wx.showToast({ title: res?.data?.msg || '保存失败', icon: 'none' });
|
|
}
|
|
} catch (err) {
|
|
wx.showToast({ title: '网络错误', icon: 'none' });
|
|
}
|
|
},
|
|
|
|
onCloseSkfsModal() { this.setData({ showSkfsModal: false }); },
|
|
stopPropagation() {},
|
|
},
|
|
});
|