'use strict'; const dayjs = require('dayjs'); const balanceUtil = require('./util.js'); const merchantMap = balanceUtil.MERCHANT_MAP; module.exports = { /** * 提现 * @url admin/finance/balance/sys/withdraw 前端调用的url参数地址 */ main: async (event) => { let { data = {}, userInfo, util } = event; let { vk } = util; const transaction = await vk.baseDao.startTransaction(); try { const merchantId = String(data.merchantId || '').trim(); if (!merchantMap[merchantId]) { throw new Error('提现商户不正确'); } const amount = balanceUtil.normalizeAmount(data.amount); if (amount <= 0) { throw new Error('提现金额必须大于0'); } const balanceRecord = await balanceUtil.ensureBalanceRecord({ transaction, vk }); const balanceInfoMap = balanceUtil.buildBalanceInfoMap(balanceRecord.balanceInfo || {}); const merchantBalanceInfo = balanceInfoMap[merchantId] || { accNo: merchantId, merchantName: merchantMap[merchantId], balance: 0, updateTime: '' }; const merchantBalance = balanceUtil.normalizeAmount(merchantBalanceInfo.balance || 0); if (merchantBalance <= 0) { throw new Error('当前企业余额小于等于0,无法提现'); } if (amount > merchantBalance) { throw new Error('提现金额不能大于当前企业余额'); } const description = String(data.description || '').trim() || `余额提现-${merchantMap[merchantId]}`; const requestRes = await vk.request({ method: "POST", url: 'http://jjx-union-pay.gxwebsoft.com/api/union-pay-jjx/transByAmount', header: { "content-type": "application/json; charset=utf-8", }, data: { accNo: merchantId, amount }, timeout: 60000 }); console.log('requestRes', requestRes) const code = Number(requestRes && requestRes.code); const success = requestRes && ( code === 0 || code === 200 || requestRes.success === true || (typeof requestRes.code === 'undefined' && !requestRes.msg && !requestRes.message) ); if (!success) { throw new Error( (requestRes && (requestRes.msg || requestRes.message)) || (requestRes && requestRes.content && (requestRes.content.msg || requestRes.content.message)) || '提现失败' ); } const logData = { description, amount, type: 'expense', logTime: Date.now(), operatorId: userInfo && userInfo.uid ? userInfo.uid : '', source: 'withdraw', merchantId, merchantName: merchantMap[merchantId], srcReqId: requestRes.srcReqId, status: 1 }; const changeAmount = balanceUtil.buildBalanceChange(logData); await balanceUtil.checkBalanceAvailable({ transaction, vk, changeAmount }); const addRes = await vk.baseDao.add({ db: transaction, dbName: 'jjx-balance-log', dataJson: logData }); const updateTime = dayjs().format('YYYY-MM-DD HH:mm:ss'); const nextMerchantBalance = Number((merchantBalance + changeAmount).toFixed(2)); const nextBalance = Number((Number(balanceRecord.balance || 0) + changeAmount).toFixed(2)); await vk.baseDao.updateById({ db: transaction, dbName: 'jjx-balance', id: balanceRecord._id, dataJson: { balance: nextBalance, lastLogId: addRes.id, updateTime, balanceInfo: { ...balanceInfoMap, [merchantId]: { accNo: merchantId, merchantName: merchantMap[merchantId], balance: nextMerchantBalance, updateTime } } } }); await transaction.commit(); return { code: 0, msg: '', data: { balance: nextBalance, merchantBalance: nextMerchantBalance } }; } catch (err) { return await balanceUtil.rollbackTransaction({ transaction, err }); } } };