rapid-ztx
Version:
Rapid ZTX module
122 lines (112 loc) • 4.4 kB
JavaScript
/**
* 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;