// pages/withdraw/components/record-mode2/record-mode2.js // UI 与 mode1 完全一致,业务逻辑为自动打款审核收款 import request from '../../../../utils/request.js'; import PopupService from '../../../../services/popupService.js'; const app = getApp(); const yemianshuju = 5; let lastPullDownTime = 0; const PULL_DOWN_INTERVAL = 2000; const TX_STATUS = { SHENHEZHONG: 1, TIXIAN_CHENGGONG: 2, TIXIAN_SHIBAI: 3, SHENHE_CHENGGONG: 4, SHENHE_SHIBAI: 5, DAI_SHOUKUAN: 6, }; 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: '商家余额' }, }; const LEIXING_LABEL = { 1: '接单员佣金', 2: '管事分红', 3: '组长分红', 4: '考核官分佣', 5: '接单员保证金', 6: '商家余额', }; Component({ properties: { options: { type: Object, value: {} } }, data: { imgUrls: { pageBg: '', cardBg: '', assetTileBg: '', }, assetList: [], totalAmount: '0.00', selectedAsset: null, isLoadingAssets: false, tixianleixing: null, tixianjine: '', currentRate: '0.00', showTixian: false, recordList: [], page: 1, loading: false, nomore: false, canloadmore: true, isRefreshing: false, shouxufei: '0.00', shijidaozhang: '0.00', currentTixianId: null, submitting: false, mchId: '', currentStatusFilter: 0, statusTabs: [ { value: 0, label: '全部' }, { value: 1, label: '审核中' }, { value: 6, label: '待收款' }, { value: 4, label: '审核成功' }, { value: 5, label: '审核失败' }, { value: 2, label: '提现成功' }, { value: 3, label: '提现失败' }, ], hasPendingCollect: false, showCollectConfirm: false, collectConfirmRecord: null, showDetailModal: false, detailTitle: '', detailContent: '', }, lifetimes: { attached() { this.initImageUrls(); this.huoquJilu(true); } }, pageLifetimes: { show() { this.registerNotificationComponent(); 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() }; } }, initImageUrls() { const ossBase = app.globalData.ossImageUrl || ''; const imgDir = `${ossBase}beijing/tixian/`; this.setData({ imgUrls: { pageBg: `${imgDir}page_bg.png`, cardBg: `${imgDir}card_bg.png`, assetTileBg: `${imgDir}asset_tile_bg.png`, } }); }, parseZhuangtai(item) { const raw = item.zhuangtai ?? item.status ?? item.state; const n = parseInt(raw, 10); return Number.isNaN(n) ? -1 : n; }, /** 规范化列表字段(兼容后端多种命名 / 嵌套 audit) */ normalizeRecordFields(item) { const audit = item.audit || item.shenhe || item.shenhe_info || {}; const shenheJiluId = item.shenhe_jilu_id ?? item.shenheJiluId ?? item.audit_id ?? item.shenheid ?? audit.id ?? audit.shenhe_jilu_id ?? null; const shenheDanhao = String( item.shenhe_danhao || item.shenheDanhao || item.audit_shenhe_danhao || audit.shenhe_danhao || audit.danhao || '' ).trim(); const tixianjiluId = item.tixianjilu_id ?? item.tixianjiluId ?? item.id ?? null; const zhuangtai = this.parseZhuangtai(item); return { ...item, zhuangtai: zhuangtai >= 0 ? zhuangtai : item.zhuangtai, shenhe_jilu_id: shenheJiluId, shenhe_danhao: shenheDanhao, tixianjilu_id: tixianjiluId, }; }, hasAuditJiluId(item) { const id = item.shenhe_jilu_id; return id !== null && id !== undefined && id !== '' && id !== 0 && id !== '0'; }, hasShenheDanhao(item) { return !!(item.shenhe_danhao && String(item.shenhe_danhao).trim()); }, isNewAuditRecord(item) { return this.hasAuditJiluId(item) && this.hasShenheDanhao(item); }, /** 待收款是否可点击:状态6 + 审核记录ID + 审核单号 缺一不可 */ canCollectRecord(item) { return this.parseZhuangtai(item) === TX_STATUS.DAI_SHOUKUAN && this.hasAuditJiluId(item) && this.hasShenheDanhao(item); }, getLeixingLabel(leixing) { return LEIXING_LABEL[parseInt(leixing)] || '提现'; }, getStatusBadgeClass(status) { switch (parseInt(status)) { case TX_STATUS.SHENHEZHONG: return 'status-wait'; case TX_STATUS.TIXIAN_CHENGGONG: case TX_STATUS.SHENHE_CHENGGONG: return 'status-done'; case TX_STATUS.DAI_SHOUKUAN: return 'status-pending'; case TX_STATUS.TIXIAN_SHIBAI: case TX_STATUS.SHENHE_SHIBAI: return 'status-fail'; default: return 'status-wait'; } }, processRecordItem(item) { item = this.normalizeRecordFields(item); const isNew = this.isNewAuditRecord(item); const status = this.parseZhuangtai(item); let statusText = '未知'; let canCollect = false; let canShowDetail = false; let detailReason = ''; switch (status) { case TX_STATUS.SHENHEZHONG: statusText = '审核中'; break; case TX_STATUS.TIXIAN_CHENGGONG: statusText = '提现成功'; break; case TX_STATUS.TIXIAN_SHIBAI: statusText = '提现失败'; if (item.fail_reason || item.bhliyou) { canShowDetail = true; detailReason = item.fail_reason || item.bhliyou; } break; case TX_STATUS.SHENHE_CHENGGONG: statusText = '审核成功'; break; case TX_STATUS.SHENHE_SHIBAI: statusText = '审核失败'; if (item.bhliyou) { canShowDetail = true; detailReason = item.bhliyou; } break; case TX_STATUS.DAI_SHOUKUAN: statusText = '待收款'; canCollect = this.canCollectRecord(item); break; } return { ...item, isNewAudit: isNew, leixingLabel: this.getLeixingLabel(item.leixing), statusText, statusBadgeClass: this.getStatusBadgeClass(status), canCollect, canShowDetail, detailReason, }; }, 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); } }, updatePendingCollectFlag(list) { const hasPending = (list || []).some(item => item.canCollect); if (hasPending !== this.data.hasPendingCollect) { this.setData({ hasPendingCollect: hasPending }); } }, /** 微信确认收款成功后,本地先把对应记录标为「提现成功」 */ markLocalRecordWithdrawSuccess(record) { if (!record) return; const matchId = String(record.tixianjilu_id || record.id || ''); const matchDanhao = String(record.shenhe_danhao || '').trim(); if (!matchId && !matchDanhao) return; const newList = (this.data.recordList || []).map((item) => { const itemId = String(item.tixianjilu_id || item.id || ''); const itemDanhao = String(item.shenhe_danhao || '').trim(); const isMatch = (matchId && itemId === matchId) || (matchDanhao && itemDanhao === matchDanhao); if (!isMatch) return item; return this.processRecordItem({ ...item, zhuangtai: TX_STATUS.TIXIAN_CHENGGONG, }); }); this.setData({ recordList: newList }); this.updatePendingCollectFlag(newList); }, async finishWxCollectSuccess(record) { this.markLocalRecordWithdrawSuccess(record); await this.huoquJilu(true, true); this.markLocalRecordWithdrawSuccess(record); PopupService.checkAndShow(this, 'tixianchenggong'); wx.showToast({ title: '提现成功', icon: 'success', duration: 3000, }); }, onPullDownRefresh() { return this.huoquJilu(true, true); }, onStatusFilterTap(e) { const value = parseInt(e.currentTarget.dataset.value, 10); if (value === this.data.currentStatusFilter) return; this.setData({ currentStatusFilter: value }); this.huoquJilu(true); }, onCollectTap(e) { const index = e.currentTarget.dataset.index; const record = this.data.recordList[index]; if (!record) return; if (this.parseZhuangtai(record) !== TX_STATUS.DAI_SHOUKUAN) { wx.showToast({ title: '当前状态不可收款', icon: 'none' }); return; } if (!this.hasShenheDanhao(record) || !this.hasAuditJiluId(record)) { wx.showToast({ title: '审核信息不完整,请刷新后重试', icon: 'none' }); return; } if (this.data.submitting) { wx.showToast({ title: '正在处理中,请稍后', icon: 'none' }); return; } this.setData({ showCollectConfirm: true, collectConfirmRecord: record }); }, onCloseCollectConfirm() { if (this.data.submitting) return; this.setData({ showCollectConfirm: false, collectConfirmRecord: null }); }, async onConfirmCollect() { if (this.data.submitting) return; let record = this.data.collectConfirmRecord; if (!record) return; if (!this.canCollectRecord(record)) { await this.huoquJilu(true, true); const refreshed = (this.data.recordList || []).find( r => String(r.id) === String(record.id) || String(r.tixianjilu_id) === String(record.tixianjilu_id) ); if (refreshed) record = refreshed; } if (!this.canCollectRecord(record)) { wx.showModal({ title: '暂时无法收款', content: '缺少审核单号或审核记录ID,请下拉刷新后重试。仍不行请联系客服。', showCancel: false, }); return; } this.setData({ showCollectConfirm: false, submitting: true, collectConfirmRecord: record }); try { const res = await request({ url: '/yonghu/tixiansq', method: 'POST', data: { shenhe_danhao: record.shenhe_danhao, shenhe_jilu_id: record.shenhe_jilu_id || '', tixianjilu_id: record.tixianjilu_id || record.id || '', leixing: record.leixing, } }); if (res.statusCode === 200 && res.data && res.data.code === 0) { const data = res.data.data; this.setData({ currentTixianId: data.tixian_id, mchId: data.mch_id || '', collectConfirmRecord: record, }); this.tiaoqiWeixinQueRen(data.package_info); } else { wx.showModal({ title: '收款失败', content: res.data?.msg || '无法发起收款,请稍后重试', showCancel: false }); this.setData({ submitting: false, collectConfirmRecord: null }); } } catch (err) { wx.showModal({ title: '网络错误', content: '网络连接失败,请稍后重试', showCancel: false }); this.setData({ submitting: false, collectConfirmRecord: null }); } }, tiaoqiWeixinQueRen(packageInfo) { const appId = app.globalData.appId; const mchId = this.data.mchId; if (!appId || !mchId) { wx.showModal({ title: '配置错误', content: '无法调起收款,请联系客服', showCancel: false }); this.setData({ submitting: false, collectConfirmRecord: null }); return; } wx.requestMerchantTransfer({ appId, mchId, package: packageInfo, success: () => { this.tongzhiHouduanQueRen(1); }, fail: () => { this.tongzhiHouduanQueRen(0); wx.showModal({ title: '确认收款失败', content: '微信收款确认失败,您可在记录中再次点击「收款」重试。', showCancel: false, }); } }); }, async tongzhiHouduanQueRen(result) { if (!this.data.currentTixianId) { this.setData({ submitting: false, collectConfirmRecord: null }); return; } const record = this.data.collectConfirmRecord; const wxConfirmed = result === 1; try { const res = await request({ url: '/yonghu/tixianqr', method: 'POST', data: { tixian_id: this.data.currentTixianId, result: result, shenhe_danhao: record ? record.shenhe_danhao : '', shenhe_jilu_id: record ? (record.shenhe_jilu_id || '') : '', tixianjilu_id: record ? (record.tixianjilu_id || record.id || '') : '', leixing: record ? record.leixing : '', } }); if (res.statusCode === 200 && res.data && res.data.code === 0) { const data = res.data.data || {}; this.gengxinYue(data, record ? record.leixing : null); } // 微信已确认收款:不论 tixianqr 返回什么,都刷新列表,不弹系统异常 if (wxConfirmed) { await this.finishWxCollectSuccess(record); } else if (res.statusCode === 200 && res.data && res.data.code === 0) { this.huoquJilu(true); wx.showToast({ title: '收款已取消', icon: 'none', duration: 3000, }); } else { wx.showModal({ title: '确认状态失败', content: res.data?.msg || '操作失败', showCancel: false, }); } } catch (err) { if (wxConfirmed) { await this.finishWxCollectSuccess(record); } else { wx.showModal({ title: '网络错误', content: '网络连接失败', showCancel: false, }); } } finally { this.setData({ submitting: false, currentTixianId: null, collectConfirmRecord: null }); } }, onViewDetail(e) { const index = e.currentTarget.dataset.index; const record = this.data.recordList[index]; if (!record || !record.canShowDetail) return; const status = parseInt(record.zhuangtai); let detailTitle = '失败原因'; if (status === TX_STATUS.SHENHE_SHIBAI) detailTitle = '审核失败原因'; else if (status === TX_STATUS.TIXIAN_SHIBAI) detailTitle = '提现失败原因'; this.setData({ showDetailModal: true, detailTitle, detailContent: record.detailReason || '暂无详细信息', }); }, onCloseDetailModal() { this.setData({ showDetailModal: false, detailTitle: '', detailContent: '' }); }, async huoquJilu(fresh = false, force = false) { const now = Date.now(); if (!force && now - lastPullDownTime < 2000 && !fresh) return; if (!force && (this.data.loading || this.data.isRefreshing)) return; const page = fresh ? 1 : this.data.page; if (fresh) this.setData({ nomore: false, canloadmore: true, isRefreshing: true }); if (this.data.nomore && !fresh) return; this.setData({ loading: true }); lastPullDownTime = now; try { const res = await request({ url: '/yonghu/tixianjiluhq', method: 'POST', data: { page, limit: yemianshuju, mode: 2, zhuangtai: this.data.currentStatusFilter } }); if (res.statusCode === 200 && res.data && res.data.code === 0) { const data = res.data.data; const processedList = (data.list || []).map(item => this.processRecordItem(item)); const newList = fresh ? processedList : [...this.data.recordList, ...processedList]; this.setData({ recordList: newList, page: page + 1, nomore: !(data.has_more === true), canloadmore: data.has_more === true, loading: false, isRefreshing: false, }); this.updatePendingCollectFlag(newList); } else { this.setData({ loading: false, isRefreshing: false }); } } catch (err) { this.setData({ loading: false, isRefreshing: false }); } }, onReachBottom() { if (this.data.canloadmore && !this.data.nomore && !this.data.loading && !this.data.isRefreshing) { const now = Date.now(); if (now - lastPullDownTime >= PULL_DOWN_INTERVAL) this.huoquJilu(); } }, stopPropagation() {} } });