UNPKG

rapid-ztx

Version:

Rapid ZTX module

122 lines (112 loc) 4.4 kB
/** * Copyright (c) 2017 Lucky Byte, Inc. */ const debug = require('debug')('ztx'); const moment = require('moment'); const rapid_db = require('rapid-db'); /** * 检查商户的交易控制 * * 参数: * merch_uuid: 商户 uuid * amount: 交易金额,以分为单位 * * 失败抛出异常 */ const check_for_merch = async (merch_uuid, amount) => { const merch = await unique_db.one(` select shortname as name, trctrl from rapid_merchs where uuid = $1 `, [ merch_uuid ]); if (!merch.trctrl) { await rapid_db.notify.error(`平台商户[${merch.name}]尚未配置交易控制`); throw new Error('商户尚未配置交易控制,不能进行交易'); } const trctrl = merch.trctrl; // 单笔最低/最高金额 if (trctrl.amt_per_min && trctrl.amt_per_min > 0) { if (amount < trctrl.amt_per_min * 100) { await rapid_db.notify.warn( `交易受限:交易额[${amount / 100}]低于平台商户[${merch.name}]` + `配置的单笔最低限额[${trctrl.amt_per_min}]` ); throw new Error('交易额低于最低限额,不允许交易'); } } if (trctrl.amt_per_max && trctrl.amt_per_max > 0) { if (amount > trctrl.amt_per_max * 100) { await rapid_db.notify.warn( `交易受限:交易额[${amount / 100}]高于平台商户[${merch.name}]` + `配置的单笔最高限额[${trctrl.amt_per_max}]` ); throw new Error('交易额高于最高限额,不允许交易'); } } // 交易时间段检查 if (trctrl.time_begin) { if (moment().isBefore(moment(trctrl.time_begin, 'HH:mm:ss'))) { await rapid_db.notify.warn( `交易受限:当前时间[${moment().format('HH:mm:ss')}]` + `不在商户[${merch.name}]正常交易时间范围内` ); throw new Error('当前时间非交易时间'); } } if (trctrl.time_end) { if (moment().isAfter(moment(trctrl.time_end, 'HH:mm:ss'))) { await rapid_db.notify.warn( `交易受限:当前时间[${moment().format('HH:mm:ss')}]` + `不在商户[${merch.name}]正常交易时间范围内` ); throw new Error('当前时间非交易时间'); } } // 当日交易金额上限 if (trctrl.amt_day_max && trctrl.amt_day_max > 0) { try { const result = await unique_db.oneOrNone(` select amount from rapid_merch_limit where date = CURRENT_DATE and merch = $1 `, [ merch_uuid ]); if (result) { const amt_day_max = parseInt(trctrl.amt_day_max) * 100; if (parseInt(result.amt) + parseInt(amount) > amt_day_max) { await rapid_db.notify.warn( `交易受限:商户[${merch.name}]当日累计交易额` + `[${result.amt / 100}]加上当前交易额[${amount / 100}]` + `超出限额[${amt_day_max / 100}]` ); throw new Error('当日交易金额已达上限'); } } } catch (err) { throw new Error(`查询商户当日交易总额错: ${err.message}`); } } // 当日交易笔数上限 if (trctrl.cnt_day_max && trctrl.cnt_day_max > 0) { try { const result = await unique_db.oneOrNone(` select count from rapid_merch_limit where date = CURRENT_DATE and merch = $1 `, [ merch_uuid ]); if (result) { if (parseInt(result.count) >= trctrl.cnt_day_max) { await rapid_db.notify.warn( `交易受限:商户[${merch.name}]当日累计交易笔数` + `[${result.count}]超出笔数限制[${trctrl.cnt_day_max}]` ); throw new Error('当日交易笔数已达上限'); } } } catch (err) { throw new Error(`查询商户当日交易总笔数错: ${err.message}`); } } } module.exports = check_for_merch;