237 lines
6.7 KiB
JavaScript
237 lines
6.7 KiB
JavaScript
// pages/promo/withdrawals.js - 提现记录列表页
|
||
const { request } = require('../../utils/request')
|
||
|
||
Page({
|
||
data: {
|
||
list: [],
|
||
page: 1,
|
||
pageSize: 10,
|
||
total: 0,
|
||
loading: false,
|
||
finished: false,
|
||
// 确认收款按钮 loading 状态(按单条)
|
||
confirmingId: null
|
||
},
|
||
|
||
onLoad() {
|
||
this.loadData(true)
|
||
},
|
||
|
||
// 加载提现记录列表(reset 为 true 时重置分页)
|
||
loadData(reset = false) {
|
||
if (this.data.loading) return
|
||
if (!reset && this.data.finished) return
|
||
|
||
const page = reset ? 1 : this.data.page
|
||
this.setData({ loading: true })
|
||
|
||
request({
|
||
url: `/api/distribution/withdrawals?page=${page}&pageSize=${this.data.pageSize}`,
|
||
method: 'GET',
|
||
success: (res) => {
|
||
const payload = res && res.data
|
||
if (payload && payload.code === 200 && payload.data) {
|
||
const { list = [], total = 0 } = payload.data
|
||
const mapped = list.map(item => {
|
||
const statusCode = this._normalizeStatusCode(item.status)
|
||
const amountYuan = item.amountYuan != null
|
||
? item.amountYuan
|
||
: (item.amountFen != null ? (item.amountFen / 100).toFixed(2) : '')
|
||
|
||
const balanceAfterYuan = item.balanceAfterYuan != null
|
||
? item.balanceAfterYuan
|
||
: (item.balanceAfterFen != null ? (item.balanceAfterFen / 100).toFixed(2) : '')
|
||
|
||
const feeYuan = item.feeYuan != null
|
||
? item.feeYuan
|
||
: (item.feeFen != null ? (item.feeFen / 100).toFixed(2) : '0.00')
|
||
|
||
return {
|
||
...item,
|
||
statusCode,
|
||
amountYuan,
|
||
balanceAfterYuan,
|
||
feeYuan,
|
||
// 申请时间:用 createdAt
|
||
applyAtStr: this._fmtTime(item.createdAt),
|
||
// 处理时间:用 transferAt(如有)
|
||
handleAtStr: this._fmtTime(item.transferAt),
|
||
statusTagText: this._statusTagText(statusCode),
|
||
statusTagClass: this._statusTagClass(statusCode)
|
||
}
|
||
})
|
||
const newList = reset ? mapped : [...this.data.list, ...mapped]
|
||
this.setData({
|
||
list: newList,
|
||
total,
|
||
page: page + 1,
|
||
finished: newList.length >= total
|
||
})
|
||
}
|
||
},
|
||
complete: () => {
|
||
this.setData({ loading: false })
|
||
}
|
||
})
|
||
},
|
||
|
||
// 时间戳格式化
|
||
_fmtTime(ts) {
|
||
if (!ts) return ''
|
||
const d = new Date(ts * 1000)
|
||
if (isNaN(d.getTime())) return ''
|
||
const y = d.getFullYear()
|
||
const m = String(d.getMonth() + 1).padStart(2, '0')
|
||
const day = String(d.getDate()).padStart(2, '0')
|
||
const hh = String(d.getHours()).padStart(2, '0')
|
||
const mm = String(d.getMinutes()).padStart(2, '0')
|
||
return `${y}-${m}-${day} ${hh}:${mm}`
|
||
},
|
||
|
||
// 将后端 status(数字 / 中文 / 英文)统一转成数字枚举:
|
||
// 0=审核中,1=已驳回,2=待收款,3=已收款,4=已过期
|
||
_normalizeStatusCode(status) {
|
||
if (typeof status === 'number') return status
|
||
if (typeof status === 'string') {
|
||
const s = status.trim()
|
||
if (/^\d+$/.test(s)) return parseInt(s, 10)
|
||
switch (s) {
|
||
case 'pending':
|
||
case '审核中':
|
||
return 0
|
||
case 'rejected':
|
||
case '已驳回':
|
||
return 1
|
||
case '待收款':
|
||
return 2
|
||
case 'transferred':
|
||
case '已收款':
|
||
return 3
|
||
case '已过期':
|
||
return 4
|
||
default:
|
||
return 0
|
||
}
|
||
}
|
||
return 0
|
||
},
|
||
|
||
// 状态中文文案
|
||
_statusTagText(code) {
|
||
switch (code) {
|
||
case 0:
|
||
return '待审核'
|
||
case 1:
|
||
return '已驳回'
|
||
case 2:
|
||
return '待收款'
|
||
case 3:
|
||
return '已收款'
|
||
case 4:
|
||
return '已过期'
|
||
default:
|
||
return ''
|
||
}
|
||
},
|
||
|
||
// 顶部右侧小标签样式
|
||
_statusTagClass(code) {
|
||
switch (code) {
|
||
case 0:
|
||
return 'tag-pending'
|
||
case 1:
|
||
return 'tag-rejected'
|
||
case 2:
|
||
return 'tag-wait'
|
||
case 3:
|
||
return 'tag-transferred'
|
||
case 4:
|
||
return 'tag-expired'
|
||
default:
|
||
return ''
|
||
}
|
||
},
|
||
|
||
// 用户点击单条「确认收款」
|
||
handleConfirmReceipt(e) {
|
||
const id = e.currentTarget.dataset.id
|
||
if (!id || this.data.confirmingId === id) return
|
||
|
||
const item = (this.data.list || []).find(x => String(x.id) === String(id))
|
||
if (!item) {
|
||
wx.showToast({ title: '记录不存在', icon: 'none' })
|
||
return
|
||
}
|
||
|
||
// 兼容驼峰 / 下划线字段
|
||
const packageInfo = item.packageInfo || item.package_info
|
||
if (!packageInfo) {
|
||
wx.showToast({ title: '该提现单无法确认收款,请联系客服', icon: 'none' })
|
||
return
|
||
}
|
||
|
||
if (!wx.canIUse || !wx.canIUse('requestMerchantTransfer')) {
|
||
wx.showModal({
|
||
content: '当前微信版本过低,无法使用确认收款功能,请升级微信后重试',
|
||
showCancel: false
|
||
})
|
||
return
|
||
}
|
||
|
||
this.setData({ confirmingId: id })
|
||
|
||
wx.showLoading({ title: '正在调起确认收款...' })
|
||
|
||
// 获取 AppID:优先记录里的,其次运行时获取
|
||
let appId = item.appId || item.app_id
|
||
try {
|
||
if (!appId && wx.getAccountInfoSync) {
|
||
const info = wx.getAccountInfoSync()
|
||
appId = info && info.miniProgram && info.miniProgram.appId
|
||
}
|
||
} catch (err) {}
|
||
|
||
// 商户号:从记录中取(后端已写入 mch_id)
|
||
const mchId = item.mchId || item.mch_id
|
||
|
||
wx.requestMerchantTransfer({
|
||
mchId,
|
||
appId,
|
||
// 文档里字段名是 package,对应后台返回的 package_info
|
||
package: packageInfo,
|
||
success: (res) => {
|
||
console.log('requestMerchantTransfer success', res)
|
||
wx.showToast({ title: '已调起收款确认', icon: 'none', duration: 2000 })
|
||
// 主动查询转账状态并更新订单,实现及时刷新(参考商户单号查询:https://pay.weixin.qq.com/doc/v3/merchant/4012716437)
|
||
request({
|
||
url: '/api/distribution/withdrawals/query-transfer',
|
||
method: 'POST',
|
||
data: { id: item.id },
|
||
success: (r) => {
|
||
const p = r && r.data
|
||
if (p && p.code === 200 && p.data && p.data.status === 3) {
|
||
wx.showToast({ title: '已收款', icon: 'success' })
|
||
}
|
||
},
|
||
complete: () => {
|
||
this.loadData(true)
|
||
}
|
||
})
|
||
},
|
||
fail: (err) => {
|
||
console.error('requestMerchantTransfer fail', err)
|
||
wx.showToast({ title: '调起失败,请稍后重试', icon: 'none' })
|
||
},
|
||
complete: () => {
|
||
wx.hideLoading()
|
||
this.setData({ confirmingId: null })
|
||
}
|
||
})
|
||
},
|
||
|
||
onReachBottom() {
|
||
this.loadData(false)
|
||
}
|
||
})
|
||
|