checkpoint: 冻结资金开工前龙先生小程序本地备份(不推远程)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,369 +1,369 @@
|
||||
// pages/withdraw/components/mode2/mode2.js — 自动打款纯提现
|
||||
import request from '../../../../utils/request.js';
|
||||
import PopupService from '../../../../services/popupService.js';
|
||||
|
||||
const app = getApp();
|
||||
|
||||
const ASSET_CONFIG = {
|
||||
dashou_yue: { leixing: 1, label: '接单员佣金' },
|
||||
guanshi_fenyong: { leixing: 2, label: '管事分红' },
|
||||
zuzhang_fenyong: { leixing: 3, label: '组长分红' },
|
||||
kaoheguan_fenyong: { leixing: 4, label: '考核官分佣' },
|
||||
dashou_yajin: { leixing: 5, label: '接单员保证金' },
|
||||
shangjia_yue: { leixing: 6, label: '商家余额' },
|
||||
};
|
||||
|
||||
/** 页面入参 from 与资产 type 映射 */
|
||||
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: '' },
|
||||
assetList: [],
|
||||
displayAssetList: [],
|
||||
totalAmount: '0.00',
|
||||
canWithdraw: false,
|
||||
selectedAsset: null,
|
||||
isLoadingAssets: false,
|
||||
tixianleixing: null,
|
||||
tixianjine: '',
|
||||
currentRate: '0.00',
|
||||
feeRateText: '--',
|
||||
showTixian: false,
|
||||
shouxufei: '0.00',
|
||||
shijidaozhang: '0.00',
|
||||
submitting: false,
|
||||
},
|
||||
lifetimes: {
|
||||
attached() {
|
||||
this.initImageUrls();
|
||||
this.loadAllAssets();
|
||||
},
|
||||
},
|
||||
pageLifetimes: {
|
||||
show() {
|
||||
this.registerNotificationComponent();
|
||||
this.loadAllAssets();
|
||||
PopupService.checkAndShow(this, 'tixian');
|
||||
},
|
||||
hide() {
|
||||
const popupComp = this.selectComponent('#popupNotice');
|
||||
if (popupComp && popupComp.cleanup) popupComp.cleanup();
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
registerNotificationComponent() {
|
||||
const notificationComp = this.selectComponent('#global-notification');
|
||||
if (notificationComp && notificationComp.showNotification) {
|
||||
app.globalData.globalNotification = {
|
||||
show: (data) => notificationComp.showNotification(data),
|
||||
hide: () => notificationComp.hideNotification(),
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
gengxinYue(data, leixing) {
|
||||
if (!data) return;
|
||||
if (data.new_yongjin !== undefined && data.new_yongjin !== null) {
|
||||
app.globalData.yongjin = data.new_yongjin;
|
||||
}
|
||||
if (data.new_fenyong !== undefined && data.new_fenyong !== null) {
|
||||
app.globalData.guanshi.fenyongtixian = data.new_fenyong;
|
||||
}
|
||||
if (data.new_yajin !== undefined && data.new_yajin !== null) {
|
||||
app.globalData.yajin = data.new_yajin;
|
||||
}
|
||||
if (data.new_shangjia_yue !== undefined && data.new_shangjia_yue !== null) {
|
||||
if (app.globalData.shangjia) app.globalData.shangjia.sjyue = data.new_shangjia_yue;
|
||||
}
|
||||
if (data.current_rate !== undefined && leixing) {
|
||||
const rate = parseFloat(data.current_rate);
|
||||
const rateKeyMap = { 1: 'dashouRate', 5: 'dashou_yajin_rate', 6: 'shangjia_rate', 2: 'guanshi_rate', 3: 'zuzhang_rate', 4: 'kaoheguan_rate' };
|
||||
const key = rateKeyMap[leixing];
|
||||
if (key) wx.setStorageSync(key, rate);
|
||||
}
|
||||
},
|
||||
|
||||
initImageUrls() {
|
||||
const ossBase = app.globalData.ossImageUrl || '';
|
||||
const imgDir = `${ossBase}beijing/tixian/`;
|
||||
this.setData({
|
||||
imgUrls: {
|
||||
iconWechat: `${imgDir}icon_wechat.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.tixianleixing = selected.leixing;
|
||||
patch.feeRateText = selected.rateText;
|
||||
}
|
||||
if (opts.amount && parseFloat(opts.amount) > 0) {
|
||||
const amt = parseFloat(opts.amount);
|
||||
const max = selected ? parseFloat(selected.amount) : amt;
|
||||
patch.tixianjine = Math.min(amt, max).toFixed(2);
|
||||
}
|
||||
if (Object.keys(patch).length) {
|
||||
this.setData(patch, () => {
|
||||
this.recalcFee(this.data.tixianjine, 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 jine = this.data.tixianjine;
|
||||
const max = parseFloat(asset.amount);
|
||||
if (jine && parseFloat(jine) > max) {
|
||||
jine = asset.amount;
|
||||
}
|
||||
this.setData({
|
||||
selectedAsset: asset,
|
||||
tixianleixing: asset.leixing,
|
||||
tixianjine: jine,
|
||||
});
|
||||
this.recalcFee(jine, 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 pushAsset = (type, amount, rate) => {
|
||||
const cfg = ASSET_CONFIG[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),
|
||||
});
|
||||
};
|
||||
pushAsset('dashou_yue', data.dashou_yue, data.dashou_rate);
|
||||
pushAsset('dashou_yajin', data.dashou_yajin, data.dashou_yajin_rate);
|
||||
pushAsset('shangjia_yue', data.shangjia_yue, data.shangjia_rate);
|
||||
pushAsset('guanshi_fenyong', data.guanshi_fenyong, data.guanshi_rate);
|
||||
pushAsset('zuzhang_fenyong', data.zuzhang_fenyong, data.zuzhang_rate);
|
||||
pushAsset('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.tixianjine, null);
|
||||
}
|
||||
} else {
|
||||
throw new Error(res?.data?.msg || '获取资产失败');
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('loadAllAssets', err);
|
||||
this.setData({ isLoadingAssets: false, totalAmount: '0.00', canWithdraw: false, assetList: [] });
|
||||
}
|
||||
},
|
||||
|
||||
formatRatePercent(rate) {
|
||||
const r = parseFloat(rate) || 0;
|
||||
if (r <= 1 && r > 0) return `${(r * 100).toFixed(0)}%`;
|
||||
return `${r}%`;
|
||||
},
|
||||
|
||||
recalcFee(amountStr, asset) {
|
||||
const amount = parseFloat(amountStr);
|
||||
if (!amountStr || isNaN(amount) || amount <= 0 || !asset) {
|
||||
this.setData({
|
||||
shouxufei: '0.00',
|
||||
shijidaozhang: '0.00',
|
||||
feeRateText: asset ? this.formatRatePercent(asset.rate) : this.data.feeRateText,
|
||||
});
|
||||
return;
|
||||
}
|
||||
const rate = parseFloat(asset.rate) || 0;
|
||||
const fee = amount * rate;
|
||||
const actual = amount - fee;
|
||||
this.setData({
|
||||
shouxufei: fee.toFixed(2),
|
||||
shijidaozhang: actual.toFixed(2),
|
||||
feeRateText: this.formatRatePercent(rate),
|
||||
currentRate: this.formatRatePercent(rate),
|
||||
});
|
||||
},
|
||||
|
||||
onJineInput(e) {
|
||||
const val = e.detail.value;
|
||||
this.setData({ tixianjine: 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({ tixianjine: 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, tixianjine } = this.data;
|
||||
if (!selectedAsset) {
|
||||
wx.showToast({ title: '请先选择要提现的账户', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
const jineValue = parseFloat(tixianjine);
|
||||
if (!tixianjine || isNaN(jineValue) || jineValue <= 0) {
|
||||
wx.showToast({ title: '请输入有效金额', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
if (jineValue <= 0.1) {
|
||||
wx.showToast({ title: '提现金额须大于0.1元', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
if (jineValue > parseFloat(selectedAsset.amount)) {
|
||||
wx.showToast({ title: `超过${selectedAsset.label}可提余额`, icon: 'none' });
|
||||
return;
|
||||
}
|
||||
this.applyIdentityAndConfirm(selectedAsset);
|
||||
},
|
||||
|
||||
applyIdentityAndConfirm(asset) {
|
||||
this.recalcFee(this.data.tixianjine, asset);
|
||||
this.setData({
|
||||
selectedAsset: asset,
|
||||
tixianleixing: asset.leixing,
|
||||
currentRate: this.formatRatePercent(asset.rate),
|
||||
showTixian: true,
|
||||
});
|
||||
},
|
||||
|
||||
async onConfirmTixian() {
|
||||
if (this.data.submitting) return;
|
||||
const { tixianleixing, tixianjine, selectedAsset } = this.data;
|
||||
if (!tixianleixing || !selectedAsset) {
|
||||
wx.showToast({ title: '请选择提现身份', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
const jineValue = parseFloat(tixianjine);
|
||||
if (!tixianjine || isNaN(jineValue) || jineValue <= 0) {
|
||||
wx.showToast({ title: '请输入有效金额', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
if (jineValue > parseFloat(selectedAsset.amount)) {
|
||||
wx.showToast({ title: `超过${selectedAsset.label}可提余额`, icon: 'none' });
|
||||
return;
|
||||
}
|
||||
|
||||
this.setData({ submitting: true });
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/yonghu/zddksh',
|
||||
method: 'POST',
|
||||
data: { leixing: tixianleixing, jine: jineValue.toFixed(2) },
|
||||
});
|
||||
if (res.statusCode === 200 && res.data && res.data.code === 0) {
|
||||
const data = res.data.data || {};
|
||||
this.gengxinYue(data, tixianleixing);
|
||||
this.setData({
|
||||
showTixian: false,
|
||||
submitting: false,
|
||||
selectedAsset: null,
|
||||
tixianjine: '',
|
||||
shouxufei: '0.00',
|
||||
shijidaozhang: '0.00',
|
||||
});
|
||||
await this.loadAllAssets();
|
||||
wx.showModal({
|
||||
title: '申请成功',
|
||||
content: '提现申请已提交,请前往「提现记录」查看进度;审核通过后可在该页点击「收款」确认到账。',
|
||||
confirmText: '查看提现记录',
|
||||
cancelText: '知道了',
|
||||
success: (res) => {
|
||||
if (res.confirm) {
|
||||
wx.navigateTo({ url: '/pages/withdraw/withdraw-records' });
|
||||
}
|
||||
},
|
||||
});
|
||||
} else {
|
||||
wx.showModal({ title: '提现申请失败', content: res.data?.msg || '未知错误', showCancel: false });
|
||||
this.setData({ submitting: false });
|
||||
}
|
||||
} catch (err) {
|
||||
wx.showModal({ title: '网络错误', content: '网络连接失败,请稍后重试', showCancel: false });
|
||||
this.setData({ submitting: false });
|
||||
}
|
||||
},
|
||||
|
||||
onCloseTixian() {
|
||||
if (this.data.submitting) {
|
||||
wx.showToast({ title: '正在处理中,请稍后', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
this.setData({
|
||||
showTixian: false,
|
||||
selectedAsset: null,
|
||||
tixianleixing: null,
|
||||
shouxufei: '0.00',
|
||||
shijidaozhang: '0.00',
|
||||
});
|
||||
},
|
||||
|
||||
stopPropagation() {},
|
||||
},
|
||||
});
|
||||
// pages/withdraw/components/mode2/mode2.js — 自动打款纯提现
|
||||
import request from '../../../../utils/request.js';
|
||||
import PopupService from '../../../../services/popupService.js';
|
||||
|
||||
const app = getApp();
|
||||
|
||||
const ASSET_CONFIG = {
|
||||
dashou_yue: { leixing: 1, label: '接单员佣金' },
|
||||
guanshi_fenyong: { leixing: 2, label: '管事分红' },
|
||||
zuzhang_fenyong: { leixing: 3, label: '组长分红' },
|
||||
kaoheguan_fenyong: { leixing: 4, label: '考核官分佣' },
|
||||
dashou_yajin: { leixing: 5, label: '接单员保证金' },
|
||||
shangjia_yue: { leixing: 6, label: '商家余额' },
|
||||
};
|
||||
|
||||
/** 页面入参 from 与资产 type 映射 */
|
||||
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: '' },
|
||||
assetList: [],
|
||||
displayAssetList: [],
|
||||
totalAmount: '0.00',
|
||||
canWithdraw: false,
|
||||
selectedAsset: null,
|
||||
isLoadingAssets: false,
|
||||
tixianleixing: null,
|
||||
tixianjine: '',
|
||||
currentRate: '0.00',
|
||||
feeRateText: '--',
|
||||
showTixian: false,
|
||||
shouxufei: '0.00',
|
||||
shijidaozhang: '0.00',
|
||||
submitting: false,
|
||||
},
|
||||
lifetimes: {
|
||||
attached() {
|
||||
this.initImageUrls();
|
||||
this.loadAllAssets();
|
||||
},
|
||||
},
|
||||
pageLifetimes: {
|
||||
show() {
|
||||
this.registerNotificationComponent();
|
||||
this.loadAllAssets();
|
||||
PopupService.checkAndShow(this, 'tixian');
|
||||
},
|
||||
hide() {
|
||||
const popupComp = this.selectComponent('#popupNotice');
|
||||
if (popupComp && popupComp.cleanup) popupComp.cleanup();
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
registerNotificationComponent() {
|
||||
const notificationComp = this.selectComponent('#global-notification');
|
||||
if (notificationComp && notificationComp.showNotification) {
|
||||
app.globalData.globalNotification = {
|
||||
show: (data) => notificationComp.showNotification(data),
|
||||
hide: () => notificationComp.hideNotification(),
|
||||
};
|
||||
}
|
||||
},
|
||||
|
||||
gengxinYue(data, leixing) {
|
||||
if (!data) return;
|
||||
if (data.new_yongjin !== undefined && data.new_yongjin !== null) {
|
||||
app.globalData.yongjin = data.new_yongjin;
|
||||
}
|
||||
if (data.new_fenyong !== undefined && data.new_fenyong !== null) {
|
||||
app.globalData.guanshi.fenyongtixian = data.new_fenyong;
|
||||
}
|
||||
if (data.new_yajin !== undefined && data.new_yajin !== null) {
|
||||
app.globalData.yajin = data.new_yajin;
|
||||
}
|
||||
if (data.new_shangjia_yue !== undefined && data.new_shangjia_yue !== null) {
|
||||
if (app.globalData.shangjia) app.globalData.shangjia.sjyue = data.new_shangjia_yue;
|
||||
}
|
||||
if (data.current_rate !== undefined && leixing) {
|
||||
const rate = parseFloat(data.current_rate);
|
||||
const rateKeyMap = { 1: 'dashouRate', 5: 'dashou_yajin_rate', 6: 'shangjia_rate', 2: 'guanshi_rate', 3: 'zuzhang_rate', 4: 'kaoheguan_rate' };
|
||||
const key = rateKeyMap[leixing];
|
||||
if (key) wx.setStorageSync(key, rate);
|
||||
}
|
||||
},
|
||||
|
||||
initImageUrls() {
|
||||
const ossBase = app.globalData.ossImageUrl || '';
|
||||
const imgDir = `${ossBase}beijing/tixian/`;
|
||||
this.setData({
|
||||
imgUrls: {
|
||||
iconWechat: `${imgDir}icon_wechat.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.tixianleixing = selected.leixing;
|
||||
patch.feeRateText = selected.rateText;
|
||||
}
|
||||
if (opts.amount && parseFloat(opts.amount) > 0) {
|
||||
const amt = parseFloat(opts.amount);
|
||||
const max = selected ? parseFloat(selected.amount) : amt;
|
||||
patch.tixianjine = Math.min(amt, max).toFixed(2);
|
||||
}
|
||||
if (Object.keys(patch).length) {
|
||||
this.setData(patch, () => {
|
||||
this.recalcFee(this.data.tixianjine, 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 jine = this.data.tixianjine;
|
||||
const max = parseFloat(asset.amount);
|
||||
if (jine && parseFloat(jine) > max) {
|
||||
jine = asset.amount;
|
||||
}
|
||||
this.setData({
|
||||
selectedAsset: asset,
|
||||
tixianleixing: asset.leixing,
|
||||
tixianjine: jine,
|
||||
});
|
||||
this.recalcFee(jine, 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 pushAsset = (type, amount, rate) => {
|
||||
const cfg = ASSET_CONFIG[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),
|
||||
});
|
||||
};
|
||||
pushAsset('dashou_yue', data.dashou_yue, data.dashou_rate);
|
||||
pushAsset('dashou_yajin', data.dashou_yajin, data.dashou_yajin_rate);
|
||||
pushAsset('shangjia_yue', data.shangjia_yue, data.shangjia_rate);
|
||||
pushAsset('guanshi_fenyong', data.guanshi_fenyong, data.guanshi_rate);
|
||||
pushAsset('zuzhang_fenyong', data.zuzhang_fenyong, data.zuzhang_rate);
|
||||
pushAsset('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.tixianjine, null);
|
||||
}
|
||||
} else {
|
||||
throw new Error(res?.data?.msg || '获取资产失败');
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('loadAllAssets', err);
|
||||
this.setData({ isLoadingAssets: false, totalAmount: '0.00', canWithdraw: false, assetList: [] });
|
||||
}
|
||||
},
|
||||
|
||||
formatRatePercent(rate) {
|
||||
const r = parseFloat(rate) || 0;
|
||||
if (r <= 1 && r > 0) return `${(r * 100).toFixed(0)}%`;
|
||||
return `${r}%`;
|
||||
},
|
||||
|
||||
recalcFee(amountStr, asset) {
|
||||
const amount = parseFloat(amountStr);
|
||||
if (!amountStr || isNaN(amount) || amount <= 0 || !asset) {
|
||||
this.setData({
|
||||
shouxufei: '0.00',
|
||||
shijidaozhang: '0.00',
|
||||
feeRateText: asset ? this.formatRatePercent(asset.rate) : this.data.feeRateText,
|
||||
});
|
||||
return;
|
||||
}
|
||||
const rate = parseFloat(asset.rate) || 0;
|
||||
const fee = amount * rate;
|
||||
const actual = amount - fee;
|
||||
this.setData({
|
||||
shouxufei: fee.toFixed(2),
|
||||
shijidaozhang: actual.toFixed(2),
|
||||
feeRateText: this.formatRatePercent(rate),
|
||||
currentRate: this.formatRatePercent(rate),
|
||||
});
|
||||
},
|
||||
|
||||
onJineInput(e) {
|
||||
const val = e.detail.value;
|
||||
this.setData({ tixianjine: 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({ tixianjine: 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, tixianjine } = this.data;
|
||||
if (!selectedAsset) {
|
||||
wx.showToast({ title: '请先选择要提现的账户', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
const jineValue = parseFloat(tixianjine);
|
||||
if (!tixianjine || isNaN(jineValue) || jineValue <= 0) {
|
||||
wx.showToast({ title: '请输入有效金额', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
if (jineValue <= 0.1) {
|
||||
wx.showToast({ title: '提现金额须大于0.1元', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
if (jineValue > parseFloat(selectedAsset.amount)) {
|
||||
wx.showToast({ title: `超过${selectedAsset.label}可提余额`, icon: 'none' });
|
||||
return;
|
||||
}
|
||||
this.applyIdentityAndConfirm(selectedAsset);
|
||||
},
|
||||
|
||||
applyIdentityAndConfirm(asset) {
|
||||
this.recalcFee(this.data.tixianjine, asset);
|
||||
this.setData({
|
||||
selectedAsset: asset,
|
||||
tixianleixing: asset.leixing,
|
||||
currentRate: this.formatRatePercent(asset.rate),
|
||||
showTixian: true,
|
||||
});
|
||||
},
|
||||
|
||||
async onConfirmTixian() {
|
||||
if (this.data.submitting) return;
|
||||
const { tixianleixing, tixianjine, selectedAsset } = this.data;
|
||||
if (!tixianleixing || !selectedAsset) {
|
||||
wx.showToast({ title: '请选择提现身份', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
const jineValue = parseFloat(tixianjine);
|
||||
if (!tixianjine || isNaN(jineValue) || jineValue <= 0) {
|
||||
wx.showToast({ title: '请输入有效金额', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
if (jineValue > parseFloat(selectedAsset.amount)) {
|
||||
wx.showToast({ title: `超过${selectedAsset.label}可提余额`, icon: 'none' });
|
||||
return;
|
||||
}
|
||||
|
||||
this.setData({ submitting: true });
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/yonghu/zddksh',
|
||||
method: 'POST',
|
||||
data: { leixing: tixianleixing, jine: jineValue.toFixed(2) },
|
||||
});
|
||||
if (res.statusCode === 200 && res.data && res.data.code === 0) {
|
||||
const data = res.data.data || {};
|
||||
this.gengxinYue(data, tixianleixing);
|
||||
this.setData({
|
||||
showTixian: false,
|
||||
submitting: false,
|
||||
selectedAsset: null,
|
||||
tixianjine: '',
|
||||
shouxufei: '0.00',
|
||||
shijidaozhang: '0.00',
|
||||
});
|
||||
await this.loadAllAssets();
|
||||
wx.showModal({
|
||||
title: '申请成功',
|
||||
content: '提现申请已提交,请前往「提现记录」查看进度;审核通过后可在该页点击「收款」确认到账。',
|
||||
confirmText: '查看提现记录',
|
||||
cancelText: '知道了',
|
||||
success: (res) => {
|
||||
if (res.confirm) {
|
||||
wx.navigateTo({ url: '/pages/withdraw/withdraw-records' });
|
||||
}
|
||||
},
|
||||
});
|
||||
} else {
|
||||
wx.showModal({ title: '提现申请失败', content: res.data?.msg || '未知错误', showCancel: false });
|
||||
this.setData({ submitting: false });
|
||||
}
|
||||
} catch (err) {
|
||||
wx.showModal({ title: '网络错误', content: '网络连接失败,请稍后重试', showCancel: false });
|
||||
this.setData({ submitting: false });
|
||||
}
|
||||
},
|
||||
|
||||
onCloseTixian() {
|
||||
if (this.data.submitting) {
|
||||
wx.showToast({ title: '正在处理中,请稍后', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
this.setData({
|
||||
showTixian: false,
|
||||
selectedAsset: null,
|
||||
tixianleixing: null,
|
||||
shouxufei: '0.00',
|
||||
shijidaozhang: '0.00',
|
||||
});
|
||||
},
|
||||
|
||||
stopPropagation() {},
|
||||
},
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user