Commit e4a5d77f authored by ml's avatar ml

新管理后台-部分接口逻辑调整、项目方交易量统计定时任务

parent b66ba41a
......@@ -121,10 +121,10 @@ export const changeUserSpotFee = async function (user_id, symbol, fee_model, mak
let product_type = symbol == 'all' ? 'spot' : 'single';
let opt_market = product_type;
//生效的费率 与要设置的费率 比对做校验 现在分不开 现货 合约 先不校验 之后分开了 再校验
let feeExist = await cancelIfFeeExist(user_id, product_type, symbol, maker_fee, taker_fee);
if (feeExist) {
return is_success;
}
let feeExist = await cancelIfFeeExist(user_id, product_type, symbol, maker_fee, taker_fee);
if (feeExist) {
return is_success;
}
let asset = await mainUserAsset.prototype.findOne({
where: {
user_id
......@@ -148,9 +148,10 @@ export const changeUserSpotFee = async function (user_id, symbol, fee_model, mak
await checkUser(user_id);
await sleep(1000);
//请求撮合 修改费率
let res = await changeTradingFee(pair, user_id, maker_fee, taker_fee, "spot",opt_market);
//请求撮合 修改费率 maker_fee 和 taker_fee 同时为1 代表初始化费率
let tmp_maker_fee = Number(maker_fee) == 0.001 ? 1 : maker_fee;
let tmp_taker_fee = Number(taker_fee) == 0.002 ? 1 : taker_fee;
let res = await changeTradingFee(pair, user_id, tmp_maker_fee, tmp_taker_fee, "spot", opt_market);
return res.is_success;
};
......@@ -194,8 +195,10 @@ export const changeUserContractFee = async function (user_id, symbol, fee_model,
await checkUser(user_id);
await sleep(1000);
//请求撮合 修改费率
let res = await changeTradingFee(pair, user_id, maker_fee, taker_fee, "lpc",opt_market);
//请求撮合 修改费率 maker_fee 和 taker_fee 同时为1 代表初始化费率
let tmp_maker_fee = Number(maker_fee) == 0.0004 ? 1 : maker_fee;
let tmp_taker_fee = Number(taker_fee) == 0.0006 ? 1 : taker_fee;
let res = await changeTradingFee(pair, user_id, tmp_maker_fee, tmp_taker_fee, "lpc", opt_market);
return res.is_success;
};
......
// 每日定时统计项目方 指定交易对做市信息, 并根据成交量信息进行费率分档优惠;
import { ormDB, commonUserFeeSetting, feeRateSpotLog, userInfoSon, spotPairs, contractPairs, userInfo } from "@madex/ex-ts-dao";
import {
ormDB, commonUserFeeSetting, feeRateSpotLog, userInfoSon, spotPairs, contractPairs, userInfo,
dwdExFill, dwdMadOrmDB
} from "@madex/ex-ts-dao";
import { FEE_RATE_LOG_STATUS } from "../../src/constant/feeRateLogConst";
import * as RobotUtil from "../../src/utils/robotUtils";
let Op = ormDB.Op;
let { tickerUtils, redisUtilsCommon } = require('@madex/ex-js-common');
......@@ -11,8 +15,6 @@ const SonStatus = userInfoSon.STATUS;
const logger = require('@madex/ex-js-public').logger;
let feeRateCheckStatus = FEE_RATE_LOG_STATUS;
//对btc价格,缓存 {coinSymbol: priceInfo}
var price2BTC = {};
//价格缓存时间 2分钟
const CACHE_TIMEOUT = 2 * 60 * 1000;
......@@ -34,35 +36,43 @@ const BTC_AMOUNT = {
"Free": 0,
},
Market_Maker_FEE = {
init_taker: 0.0002,
init_maker: 0,
init_taker: 0.002,
init_maker: 0.001,
}
async function delayPromise(time) {
async function delayPromise(time: any) {
return new Promise((resolve) => setTimeout(resolve, time));
}
export const statisProjectMakerDeals = async function (now = Date.now()) {
export const statisticsProjectMakerDeals = async function (now = Date.now()) {
try {
//TODO:按之前代码来看,只有现货相关的,这里怎么做
let ticker_map: any = {};
let users = await projectMaker();
let startTime = now - now % DAY - DAY;// 当前统计昨天的成交数据
let btc2usdt = await getDealOneDayInUSDT(startTime, startTime + DAY);
let fatherFeeObj = {}; // { fatherid_pair: {maker, taker}}
// 当前统计昨天的成交数据
let startTime = now - now % DAY - DAY;
// { father_id_pair: {maker, taker}}
let fatherFeeObj = {};
for (let i = 0; i < users.length; i++) {
let { user_id, pair, status, statis_period, amount_require_usdt, type } = users[i]; //status 2 生效时才统计
let pairs = pair == 'all' ? await getPairsByType(type) : [pair];
for (let onePair of pairs) {
if (user_id && onePair) {
let redisKey = user_id + "_" + onePair + "_projectMaker_FeeRate";
await delayPromise(100);
let [statis, statisUsdt] = await statisUserPairSpot(user_id, onePair, startTime, btc2usdt);
let feeObjBtc = getUserFeeRateFromStatis(statis); // old
let feeObjUsdt = getUserFeeRateFromUsdtStatis(statisUsdt, statis_period, amount_require_usdt)
await adjustMakerFeeRate(now, user_id, onePair, status, feeObjBtc, feeObjUsdt, fatherFeeObj);
redisUtilsCommon.write(redisKey, JSON.stringify(Object.assign({}, feeObjUsdt, feeObjBtc)), 0, () => {
});
}
let { user_id, pair, status, statis_period, amount_require_usdt, maker_fee, taker_fee } = users[i];
if (pair == 'all') {
let msg = `统计项目方交易量发生错误:user_id:${user_id},pair:${pair}`;
logger.error(msg);
RobotUtil.sendRobotMessage(RobotUtil.ROBOT_KEYS.COMMON_KEY, msg);
continue;
}
if (user_id && pair) {
//取汇率
let coin_symbol = pair.split('_')[0];
let coin_symbol_usdt_rate = ticker_map[coin_symbol] ? ticker_map[coin_symbol] : await tickerUtils.rateCoin2USDT(coin_symbol);
ticker_map[coin_symbol] = coin_symbol_usdt_rate;
let redisKey = user_id + "_" + pair + "_projectMaker_FeeRate";
await delayPromise(100);
let statisUsdt = await statisUserPairSpot(user_id, pair, startTime, coin_symbol_usdt_rate);
let feeObjUsdt = getUserFeeRateFromUsdtStatis(statisUsdt, statis_period, amount_require_usdt, taker_fee, maker_fee);
await adjustMakerFeeRate(now, user_id, pair, status, feeObjUsdt, fatherFeeObj);
redisUtilsCommon.write(redisKey, JSON.stringify(Object.assign({}, feeObjUsdt)), 0, () => {
});
}
}
......@@ -70,11 +80,11 @@ export const statisProjectMakerDeals = async function (now = Date.now()) {
let expired = now + DAY - 30000;
for (let key in fatherFeeObj) {
let [user_id, pair] = key.split('@');
let faterFee = fatherFeeObj[key];
if (faterFee) {
let { maker_fee, taker_fee } = faterFee;
let fatherFee = fatherFeeObj[key];
if (fatherFee) {
let { maker_fee, taker_fee } = fatherFee;
await setExpiredFeeSettingActiveOver(user_id, pair);
await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, maker_fee, taker_fee, now, expired, Market_Maker_FEE.init_maker, Market_Maker_FEE.init_taker, "项目方做市商策略根据子账户交易量设置父账户费率");
await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, maker_fee, taker_fee, now, expired, "项目方做市商策略根据子账户交易量设置父账户费率");
}
}
}
......@@ -83,7 +93,9 @@ export const statisProjectMakerDeals = async function (now = Date.now()) {
}
}
// 统计 项目方 7日, 15日 指定币种对 做市
/**
* 查询项目方 (只有现货的)
*/
async function projectMaker() {
let res: any = [];
try {
......@@ -104,144 +116,57 @@ async function projectMaker() {
return res;
}
// 获取交易对USDT交易量
async function getDealOneDayInUSDT(startTime, endTime) {
let price = await tickerUtils.rateCoin2USDT('BTC');
//TODO:查询交易数据
/*let priceRes = await ex_kline.find({
attributes: [[ormDBSpot.literal('AVG(close)'), 'closePrice']],
where: {
pair: "BTC_USDT",
period: '1hour',
createdAt: {
[Op.gte]: new Date(startTime),
[Op.lt]: new Date(endTime),
}
},
raw: true,
});
if(priceRes && Number(priceRes.closePrice) > 0) {
price = Number(priceRes.closePrice).toFixed(4);
}*/
return Number(price);
}
// 统计币币成交量信息
async function statisUserPairSpot(user_id, pair, timestamp, btc2usdt) {
let redisKey = user_id + "_" + pair + '_projectMaker_spot';
async function statisUserPairSpot(user_id: number, pair: string, timestamp: any, coin_symbol_usdt_rate: any) {
let redisKeyUsdt = user_id + "_" + pair + '_projectMaker_spot_usdt';
let resultCache = {}, resultCacheInUsdt = {};
let resultCacheInUsdt = {};
try {
[resultCache, resultCacheInUsdt] = await Promise.all([redisUtilsCommon.getSync(redisKey), redisUtilsCommon.getSync(redisKeyUsdt)]);
let userDeals = await getDealOneDay(pair, new Date(timestamp), timestamp + DAY);
resultCache = updateCache(resultCache, timestamp, userDeals);
let usdtAmount = Number(userDeals) * btc2usdt
let resultCacheInUsdt = await redisUtilsCommon.getSync(redisKeyUsdt);
let usdtAmount = await getDealOneDay(pair, new Date(timestamp), timestamp + DAY, coin_symbol_usdt_rate);
resultCacheInUsdt = updateCache(resultCacheInUsdt, timestamp, usdtAmount);
redisUtilsCommon.write(redisKey, JSON.stringify(resultCache), 0, () => {
});
redisUtilsCommon.write(redisKeyUsdt, JSON.stringify(resultCacheInUsdt), 0, () => {
});
}
catch (error) {
logger.warn(' 统计项目做市上成交总和 error ', error);
}
return [resultCache, resultCacheInUsdt];
return resultCacheInUsdt;
}
// 获取昨天一天的的统计交易量
// 该交易对对所有交易量都归该做市帐号
async function getDealOneDay(pair, startTime, endTime) {
let resCountInBTC = 0;
async function getDealOneDay(pair: string, startTime: any, endTime: any, coin_symbol_usdt_rate: any) {
let resCountInUsdt = 0;
try {
//查哪里
/*let tradeDetail = await ex_trade_detail_spot.find({
attributes: ['currency_symbol', [ormDBSpot.literal('SUM(deal_money)'), 'deal_money']],
let dbOne = await dwdExFill.prototype.findOne({
attributes: ['product', dwdMadOrmDB.literal('SUM(ABS(quantity)) as quantity')],
where: {
pair: pair,
createdAt: {
[Op.gte]: startTime,
[Op.lt]: endTime,
product: pair,
time: {
[dwdMadOrmDB.Op.gte]: startTime,
[dwdMadOrmDB.Op.lt]: endTime,
}
},
group: ['currency_symbol'],
raw: true,
group: ['product'],
raw: true
});
if (tradeDetail && tradeDetail.deal_money > 0.00000001) {
let currencySymbol = tradeDetail.currency_symbol;
let currencyAmount = tradeDetail.deal_money;
let price = await coinPriceInBTC(currencySymbol, startTime, endTime);
let equalBTC = currencyAmount * price;
// let equalBTC = currencyAmount * 0.001;
if (equalBTC >= 0.00000001) {
resCountInBTC = equalBTC;
if (dbOne && dbOne.quantity > 0.00000001) {
let equalUsdt = dbOne.quantity * coin_symbol_usdt_rate;
if (equalUsdt >= 0.00000001) {
resCountInUsdt = equalUsdt;
}
}*/
}
}
catch (error) {
logger.error(" 查询用户每天做市量出错 ", error);
}
return resCountInBTC;
}
async function coinPriceInBTC(coinSymbol, startTime, endTime) {
let time = Date.now();
if (!coinSymbol) {
logger.error(' coinSymbol illegal, coinSymbol is: ', coinSymbol);
}
let priceInfo = price2BTC[coinSymbol];
if (coinSymbol === 'BTC') {
//BTC无转换
return 1;
}
else if (priceInfo && (time - priceInfo.updatedTime) <= CACHE_TIMEOUT) {
return priceInfo.price;
}
else {
//拉取24小时平均价格
let tickerPair, lastPrice = 0;
if (coinSymbol === 'USDT' || coinSymbol === 'DAI' || coinSymbol === 'GUSD') {
tickerPair = 'BTC_' + coinSymbol;
}
else {
tickerPair = coinSymbol + '_BTC';
}
try {
//TODO:查哪里
/*let priceRes = await ex_kline.find({
attributes: [[ormDBSpot.literal('AVG(close)'), 'closePrice']],
where: {
pair: tickerPair,
period: '1hour',
createdAt: {
[Op.gte]: startTime,
[Op.lt]: endTime,
}
},
raw: true,
});
if (priceRes && priceRes.closePrice > 0) {
if (coinSymbol === 'USDT' || coinSymbol === 'DAI' || coinSymbol === 'GUSD') {
lastPrice = 1 / priceRes.closePrice;
} else {
lastPrice = priceRes.closePrice;
}
price2BTC[coinSymbol] = { updatedTime: Date.now(), price: lastPrice };
} else {
logger.warn(` 未查询到交易对${tickerPair} 24hour均值`, priceRes);
}*/
return lastPrice;
}
catch (error) {
logger.warn(` 查询到交易对${tickerPair} 24hour均值出错 `, error);
price2BTC[coinSymbol] = { updatedTime: Date.now(), price: 0 };
return 0;
}
}
return resCountInUsdt;
}
function updateCache(resultCache, timestamp, userDeals) {
function updateCache(resultCache: any, timestamp: any, userDeals: any) {
if (resultCache) {
let timesArr = Object.keys(resultCache);
if (!timesArr.includes(String(timestamp)) && userDeals > 0) {//是否存在今天的数据
......@@ -266,70 +191,11 @@ function updateCache(resultCache, timestamp, userDeals) {
}
// 从统计结果中获取用户费率, 旧btc交易量统计会逐渐改为usdt统计
function getUserFeeRateFromStatis(dealAmountCache) {
let feeRate = FEE_RATE.Default, avg7 = 0, avg15 = 0, canAjustFeeRateBTC = false;
try {
const day7 = 7, day15 = 15;
let timeArr = Object.keys(dealAmountCache), len = timeArr.length, sum;
let feeRate7 = FEE_RATE.Default, feeRate15 = FEE_RATE.Default;
if (len > 0 && len < day7) {// 低于 7 天
sum = 0;
for (let i = 0; i < len; i++) {
let ts = timeArr[i];
sum += Number(dealAmountCache[ts]) || 0;
}
avg7 = sum / len;
}
if (len >= day7) {
canAjustFeeRateBTC = true;
sum = 0;
for (let i = len - 1, stopIndex = len - day7; i >= stopIndex; i--) {
let ts = timeArr[i];
sum += Number(dealAmountCache[ts]) || 0;
}
avg7 = sum / day7;
if (avg7 >= BTC_AMOUNT.BTC30) {
feeRate7 = FEE_RATE.Wan1;
}
else if (avg7 >= BTC_AMOUNT.BTC5) {
feeRate7 = FEE_RATE.Wan2;
}
else if (avg7 > BTC_AMOUNT.BTC0) {
feeRate7 = FEE_RATE.Default;
}
}
if (len >= day15) {
sum = 0;
for (let i = len - 1, stopIndex = len - day15; i >= stopIndex; i--) {
let ts = timeArr[i];
sum += Number(dealAmountCache[ts]) || 0;
}
avg15 = sum / day15;
if (avg15 >= BTC_AMOUNT.BTC30) {
feeRate15 = FEE_RATE.Free;
}
else if (avg15 >= BTC_AMOUNT.BTC5) {
feeRate15 = FEE_RATE.Wan2;
}
else if (avg15 > BTC_AMOUNT.BTC0) {
feeRate15 = FEE_RATE.Default;
}
}
feeRate = Math.min(feeRate7, feeRate15);
}
catch (error) {
logger.warn(' getUserFeeRateFromStatis error', error);
}
return { feeRate, avg7, avg15, canAjustFeeRateBTC };
}
// 增加usdt统计需求,
function getUserFeeRateFromUsdtStatis(dealAmount, statis_period, requireAmount = 100000) {
//从统计结果中获取用户费率, usdt统计
function getUserFeeRateFromUsdtStatis(dealAmount: any, statis_period: any, requireAmount: any, taker_fee: any, maker_fee: any) {
let timeArr = Object.keys(dealAmount), len = timeArr.length, canAjustFeeRateUsdt = false, sum = 0, avg = 0;
let taker_rate = 0.0002, maker_rate = 0; // 新项目做市商需求,如果<100K, taker 0.02%, maker = 0;
let taker_rate = taker_fee, maker_rate = maker_fee;
//未到统计周期 按原来设置的费率走
if (len > 0 && len < statis_period) {
for (let i = 0; i < len; i++) {
let ts = timeArr[i];
......@@ -338,15 +204,18 @@ function getUserFeeRateFromUsdtStatis(dealAmount, statis_period, requireAmount =
avg = sum / len;
}
else if (len >= statis_period) {
canAjustFeeRateUsdt = true;
sum = 0;
for (let i = len - 1, stopIndex = len - statis_period; i >= stopIndex; i--) {
let ts = timeArr[i];
sum += Number(dealAmount[ts]) || 0;
}
avg = sum / statis_period;
if (avg >= requireAmount) {
taker_rate = 0;
//到达统计周期 但是不满足 承诺交易量
if (avg < requireAmount) {
//需要调整为普通费率
canAjustFeeRateUsdt = true;
taker_rate = Market_Maker_FEE.init_taker;
maker_rate = Market_Maker_FEE.init_maker;
}
}
return { taker_rate, maker_rate, avg_usdt: avg, canAjustFeeRateUsdt };
......@@ -354,85 +223,29 @@ function getUserFeeRateFromUsdtStatis(dealAmount, statis_period, requireAmount =
// 调整做市商费率最佳
async function adjustMakerFeeRate(now, user_id, pair, enableAjustFee, feeObjBtc: any = {}, feeObjUsdt: any = {}, fatherFeeObj: any = {}) {
async function adjustMakerFeeRate(now: any, user_id: any, pair: any, status: any, feeObjUsdt: any = {}, fatherFeeObj: any = {}) {
// let now = Date.now();
let expired = new Date(now).getTime() + DAY - 30000; // 有效期提前30s,早于新费率开始时间
console.error(' 执行项目做市商 uid %s , %s 费率调整 ', user_id, pair);
let maker_fee = Market_Maker_FEE.init_maker, taker_fee = Market_Maker_FEE.init_taker;
let { maker, taker } = await getProjectSpotFeeRate(user_id, pair, now - 3600000);// 查询费率变更前的费率 0 则继续免费
if (enableAjustFee) {
if (feeObjUsdt && feeObjUsdt.canAjustFeeRateUsdt) { // 新版usdt计量策略优先
//status 2 生效时才统计
if (Number(status) == 2) {
if (feeObjUsdt && feeObjUsdt.canAjustFeeRateUsdt) {
console.error(' 新做市策略 ', JSON.stringify(feeObjUsdt));
if (taker_fee > feeObjUsdt.taker_rate) { // taker_rate, maker_rate,
taker_fee = feeObjUsdt.taker_rate;
}
if (maker_fee > feeObjUsdt.maker_rate) {
maker_fee = feeObjUsdt.maker_rate;
}
let taker_fee = feeObjUsdt.taker_rate;
let maker_fee = feeObjUsdt.maker_rate;
await storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeObj);
await setExpiredFeeSettingActiveOver(user_id, pair);
return await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, maker_fee, taker_fee, now, expired, Market_Maker_FEE.init_maker, Market_Maker_FEE.init_taker, "项目方做市商根据usdt成交量自动调整");
}
else if (feeObjBtc && feeObjBtc.canAjustFeeRateBTC) { // 执行老版 btc 计量策略
console.error(' 早期做市策略 ', JSON.stringify(feeObjBtc));
if (maker == FEE_RATE.Free && taker == FEE_RATE.Free && feeObjBtc.feeRate == FEE_RATE.Wan1) {//手动设置,默认免手续费;若项目单个交易对连续7天日均交易量达到30BTC以上,该交易对手续费保持免费;(运营加需求)
await storeFatherFeeSet(user_id, pair, FEE_RATE.Free, FEE_RATE.Free, fatherFeeObj);
await setExpiredFeeSettingActiveOver(user_id, pair);
return await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, FEE_RATE.Free, FEE_RATE.Free, now, expired, Market_Maker_FEE.init_maker, Market_Maker_FEE.init_taker, "项目方做市商根据btc成交量自动调整");
}
else {
console.error(' 早期做市策略 ', JSON.stringify(feeObjBtc));
// maker_fee = feeObjBtc.feeRate, taker_fee = feeObjBtc.feeRate;
maker_fee = Math.min(maker_fee, feeObjBtc.feeRate), taker_fee = Math.min(taker_fee, feeObjBtc.feeRate);
await storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeObj);
await setExpiredFeeSettingActiveOver(user_id, pair);
return await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, maker_fee, taker_fee, now, expired, Market_Maker_FEE.init_maker, Market_Maker_FEE.init_taker, "项目方做市商策略根据btc成交量自动调整");
}
return await addFeeRate(user_id, pair, FEE_MODEL.fixedingain, maker_fee, taker_fee, now, expired, "项目方做市商根据usdt成交量自动调整");
}
}
}
/**
* 如果用户设置前7日>30BTC并且享受免费, 则一直为免费
* @param {*} user_id
* @param {*} pair
* @param {*} time
*/
async function getProjectSpotFeeRate(user_id, pair, time) {
let maker = FEE_RATE.maker_default, taker = FEE_RATE.Default;
try {
let res = await feeRateSpotLog.prototype.findOne({
attributes: ['maker_fee', 'taker_fee'],
where: {
user_id: user_id,
pair: pair,
is_check: 1,
beginAt: { [Op.lt]: new Date(time), },
expireAt: { [Op.gte]: new Date(time), }
},
raw: true,
});
if (res && Number(res.maker_fee) >= 0 && Number(res.taker_fee) >= 0) {
maker = Number(res.maker_fee);
taker = Number(res.taker_fee);
}
}
catch (error) {
logger.warn(' marketMarkerMgr.service ', error);
}
return {
taker,
maker,
}
}
async function storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeObj = {}) {
let faterObj = await getFaterUID(user_id);
if (faterObj && faterObj.father_id) {
let key = faterObj.father_id + "@" + pair;
async function storeFatherFeeSet(user_id: any, pair: any, maker_fee: any, taker_fee: any, fatherFeeObj = {}) {
let fatherObj = await getFatherUID(user_id);
if (fatherObj && fatherObj.father_id) {
let key = fatherObj.father_id + "@" + pair;
if (!fatherFeeObj[key]) {
fatherFeeObj[key] = {
pair,
......@@ -453,7 +266,7 @@ async function storeFatherFeeSet(user_id, pair, maker_fee, taker_fee, fatherFeeO
// 获取某个子账户的父账户
async function getFaterUID(user_id) {
async function getFatherUID(user_id: any) {
return user_info_son.findOne({
attributes: ['father_id'],
where: {
......@@ -466,7 +279,7 @@ async function getFaterUID(user_id) {
// 将即过期默认为生效的置为生效完成, 防止覆盖新的费率
async function setExpiredFeeSettingActiveOver(user_id, pair) {
async function setExpiredFeeSettingActiveOver(user_id: any, pair: any) {
try {
let now = new Date();
// console.log(' 更新做市商即将到期生效的费率', user_id, pair);
......@@ -490,25 +303,8 @@ async function setExpiredFeeSettingActiveOver(user_id, pair) {
}
}
async function getPairsByType(type: number) {
let dbList: any;
//现货
if (type == 1) {
dbList = await spotPairs.prototype.findAll({
where: { status: 2 },
raw: true
});
}
else {
dbList = await contractPairs.prototype.findAll({
where: { status: 2 },
raw: true
});
}
return dbList.map(item => item.symbol);
}
async function addFeeRate(user_id, pair, fee_model, maker_fee, taker_fee, beginAt, expireAt, maker_fee_late, taker_fee_late, comment = '') {
async function addFeeRate(user_id: any, pair: any, fee_model: any, maker_fee: any, taker_fee: any, beginAt: any, expireAt: any, comment = '') {
if (comment && String(comment).length > 512) {
throw '3000';
}
......
......@@ -208,7 +208,7 @@ async function setExpiredDefault() {
},
raw: true,
});
let init_maker_rate = 1, init_taker_rate = 1; // maker_fee 和 taker_fee 同时为1 代表初始化用户费率
let init_maker_rate = 0.0004, init_taker_rate = 0.0006; // 初始用户费率
let newFeeArr: any = [];
let beginAt = new Date();
......
......@@ -206,7 +206,7 @@ async function setExpiredDefault() {
unCheckCountObj[user_id] = amount;
}
let init_maker_rate = 1, init_taker_rate = 1; // maker_fee 和 taker_fee 同时为1 代表初始化用户费率
let init_maker_rate = 0.0004, init_taker_rate = 0.0006; // 初始用户费率
let newFeeArr: any = [];
let beginAt = new Date();
......
......@@ -231,7 +231,7 @@ async function setExpiredDefault() {
},
raw: true,
});
let init_maker_rate = 1, init_taker_rate = 1; // maker_fee 和 taker_fee 同时为1 代表初始化用户费率
let init_maker_rate = 0.001, init_taker_rate = 0.002; // 初始用户费率
let activePairs: any = ['all'];
for (let i = 0; i < defaultPairFee.length; i++) {
let { symbol} = defaultPairFee[i];
......
import { statisProjectMakerDeals } from "../service/task.market.maker.statis.service";
import { statisticsProjectMakerDeals } from "../service/task.market.maker.statis.service";
const schedule = require('node-schedule');
const logger = require('@madex/ex-js-public').logger;
......@@ -14,7 +14,7 @@ let setFeeRateJob = schedule.scheduleJob('0 10 0 * * *', async function () {
}
inJob = true;
try {
await statisProjectMakerDeals();
await statisticsProjectMakerDeals();
inJob = false;
} catch (error) {
inJob = false;
......
......@@ -65,7 +65,7 @@ export const update = async (req: any, commonUserFeeVO: CommonUserFeeVO) => {
try {
let ip = isIp(req.ip) ? req.ip : '*.*.*.*';
let currentUserId = await getCurrentUserId(req.cookies.session_id);
if (!commonUserFeeVO.id){
if (!commonUserFeeVO.id) {
throw ErrorCode.PARAM_MISS;
}
await addParamValid(commonUserFeeVO);
......@@ -103,7 +103,6 @@ export const del = async (req: any, commonUserFeeVO: CommonUserFeeVO) => {
};
/**
* 用户等级费率列表
* @param req
......@@ -141,12 +140,13 @@ async function addParamValid(commonUserFeeVO: CommonUserFeeVO) {
throw ErrorCode.PAIR_NOT_SUPPORT;
}*/
//校验费率范围
if (type == FEE_TYPE.FEE_TYPE_SPOT){
if (Number(makerFee) < 0.0002 || Number(takerFee) < 0.0005){
if (type == FEE_TYPE.FEE_TYPE_SPOT) {
if (Number(makerFee) < 0.0002 || Number(takerFee) < 0.0005) {
throw ErrorCode.FEE_TOO_LOW_OR_HIGH;
}
}else {
if (Number(makerFee) < -0.00015 || Number(takerFee) < 0.00035){
}
else {
if (Number(makerFee) < -0.00015 || Number(takerFee) < 0.00035) {
throw ErrorCode.FEE_TOO_LOW_OR_HIGH;
}
}
......@@ -232,6 +232,10 @@ async function checkMaker(commonUserFeeVO: CommonUserFeeVO) {
}
//项目方
if (userChannel == 2) {
//项目方只允许现货并且单个交易对
if (Number(commonUserFeeVO.type) != 1 || commonUserFeeVO.pair == 'all') {
throw ErrorCode.PARAM_MISS;
}
let statisPeriod = commonUserFeeVO.statis_period;
let amount_require_usdt = commonUserFeeVO.amount_require_usdt;
if (!statisPeriod || Number(statisPeriod) < 0 || Number(statisPeriod) > 30) {
......
......@@ -98,6 +98,15 @@ export async function list(pageVO: CommonUserFeePageVO) {
where['status'] = pageVO.status;
}
}
if (pageVO.user_id) {
where['user_id'] = pageVO.user_id;
}
if (pageVO.type) {
where['type'] = pageVO.type;
}
if (pageVO.user_channel) {
where['user_channel'] = pageVO.user_channel;
}
if (pageVO.export) {
let resList = await commonUserFeeSetting.prototype.findAll({
......@@ -107,12 +116,7 @@ export async function list(pageVO: CommonUserFeePageVO) {
});
return resList;
}
if (pageVO.user_id) {
where['user_id'] = pageVO.user_id;
}
if (pageVO.type) {
where['type'] = pageVO.type;
}
let resList = await commonUserFeeSetting.prototype.findAndCount({
......@@ -131,8 +135,6 @@ export async function list(pageVO: CommonUserFeePageVO) {
if (userChannel == 2) {
cacheData = await getProjectMakerTradeStat(userId, pair);
}
item.avg7 = cacheData ? cacheData.avg7 : 0;
item.avg15 = cacheData ? cacheData.avg15 : 0;
item.avgUsdt = cacheData ? cacheData.avgUsdt : 0;
}
}
......@@ -524,16 +526,12 @@ async function checkContractPair(pair: string) {
async function getProjectMakerTradeStat(user_id: number, pair: string) {
let res = {
avg7: 0,
avg15: 0,
avgUsdt: 0,
};
let key = user_id + "_" + pair + "_projectMaker_FeeRate";
let redisData = await RedisClient.getSync(key);
if (redisData) {
let obj = JSON.parse(redisData);
res.avg7 = obj.avg7;
res.avg15 = obj.avg15;
res.avgUsdt = obj.avgUsdt;
}
return res;
......
......@@ -143,7 +143,7 @@ export async function kycList(queryVO: QueryVO) {
}
let resList = await userRealName.prototype.findAndCount({
attributes: ['id', 'user_id', 'status', 'createdAt'],
attributes: ['id', 'user_id', 'status', 'createdAt','auditor'],
where: where,
limit: queryVO.size,
offset: (Number(queryVO.page) - 1) * Number(queryVO.size),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment