'use strict'; var quick = require('quick-pomelo'); var P = quick.Promise; var _ = require('lodash'); var url = require('url'); var md5 = require('md5'); var http = require('http'); var uuid = require('node-uuid'); var qs = require('querystring'); var conf = require('./conf.json'); var C = require('../share/constant'); var logger = quick.logger.getLogger('agent', __filename); // 构造方法 var Controller = function (app) { this.app = app; this.uptime = Date.now(); this.port = app.getCurServer().httpPort; this.server = http.createServer((req, res) => this.handleAsync(req, res)); this.server.listen(this.port); }; // 导出方法 module.exports = function (app) { return new Controller(app); }; // 原型对象 var proto = Controller.prototype; // 路由函数 proto.route = function (pathname) { switch (pathname) { case '/setagent.nd': return (query, method, res) => this.setAgentAsync(query, method, res);//设置代理 case '/freebind.nd': return (query, method, res) => this.freeBindAsync(query, method, res);//清除绑定 case '/outverify.nd': return (query, method, res) => this.outVerifyAsync(query, method, res);//每日结算 case '/outrebate.nd': return (query, method, res) => this.outRebateAsync(query, method, res);//提现申请 //case '/setagenturl.nd': return (query, method, res) => this.setAgentUrlAsync(query, method, res);//设置 url case '/operateAgree.nd': return (query, method, res) => this.operateAgreeAsync(query, method, res);//操作白名单 case '/inviteChird.nd': return (query, method, res) => this.inviteChirdAsync(query, method, res);//邀请小组成员 } }; // 写出数据 proto.writeOut = function (query, res) { if (typeof query != 'object') { return res.end(String(query)); } return res.end(JSON.stringify(query)); }; // 跨域选项 const ACCESS = { "Content-Type": "text/plain;charset=utf-8", "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "X-Requested-With", "Access-Control-Allow-Methods": "PUT,POST,GET,DELETE,OPTIONS" }; // 入口函数 proto.handleAsync = P.coroutine(function* (req, res) { var pathname = url.parse(req.url).pathname; var phandler = this.route(pathname); if (!phandler) { res.writeHead(404, ACCESS); return res.end('WARNING: Not Found!'); } else { res.writeHead(200, ACCESS); if (req.method.toLowerCase() == 'get') { let query = url.parse(req.url, true).query; return phandler(query, req.method, res); } else if (req.method.toLowerCase() == 'post') { let data = ''; req.on('data', (d) => { data += d; }); req.on('end', () => { let query = { __post__: data }; let regexp = /^\s*{(\s*?".*?":.*\s*)*}\s*$/; if (regexp.test(data)) try { query = JSON.parse(data); } catch (e) { } else if (data.indexOf('=') != -1) query = qs.parse(data); return phandler(query, req.method, res); }); } } }); //ts++ 设置代理 proto.setAgentAsync = P.coroutine(function* (query, method, res) { // console.warn("设置代理-------------------"); var agentId = query['agentid']; //console.warn("设置代理-------------------agenterId:",agentId); if (!agentId) { return this.writeOut('fail: agentId error!', res); } var rewardRate = query['rate']; var agentName = query['agentname']; if (!agentName) { return this.writeOut('fail: agentName error!', res); } var myUrl = query['myurl']; // console.warn("设置代理-------------------myUrl:",myUrl); var sign = query['sign']; if (!sign) { return this.writeOut('fail: sign error!', res); } //console.warn("设置代理-------------------sign:",sign); if (!checkSign(sign)) { return this.writeOut('fail: sign error!', res); } var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { var agenter = yield app.models.Agenter.findByIdAsync(agentId, 'agentName myUrl rewardRate');//agentNo playerId myGrade if (agenter) { var upd=false; if(rewardRate) { upd=true; agenter.rewardRate = parseInt(rewardRate); } if(agentName!='' && agenter.agentName!=agentName) { upd=true; agenter.agentName = agentName; } if(myUrl!='' && agenter.myUrl!=myUrl) { upd=true; agenter.myUrl = myUrl; } if(upd) { yield agenter.saveAsync(); // console.warn("设置代理-------------------成功"); } else { // console.warn("设置代理-------------------无修改"); } } return self.writeOut('999999', res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //ts++ 推广操作白名单 proto.operateAgreeAsync = P.coroutine(function* (query, method, res) { var agentId = query['agentid']; if (!agentId) { return this.writeOut('fail: agentId error!', res); } var operate = Number(query['operate']); if (!operate || (operate != 3 && operate != 4 && operate != 5)) { return this.writeOut('fail: operate error!', res); } var userId = query['userId']; if (!userId && (operate || 4 && operate || 5)) { return this.writeOut('fail: userId error!', res); } var sign = query['sign']; if (!sign) { return this.writeOut('fail: sign error!', res); } if (!checkSign(sign)) { return this.writeOut('fail: sign error!', res); } var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { var agreeInfo = yield app.models.AgenterAgree.findByIdAsync(agentId, '_id isOpenAgree infoList'); if (agreeInfo) { if (operate == 3){//设置白名单功能是否开启 //推广有白名单记录则修改白名单开关 let _isOpenAgree = "0"; if (agreeInfo.isOpenAgree == "0") { _isOpenAgree = "1"; } agreeInfo.isOpenAgree = _isOpenAgree; yield agreeInfo.saveAsync(); } else if (operate == 4 || operate == 5){//设置玩家为同意或拒绝 var isExit = false; for (let i = 0; i < agreeInfo.infoList.length; i++){ if(agreeInfo.infoList[i].userId == userId){ var state = "0"; if (operate == 4) state = "1"; else if (operate == 5) state = "2"; agreeInfo.infoList[i].agreeState = state; isExit = true; break; } } if(isExit){ yield agreeInfo.saveAsync(); } else { //console.warn("推广操作白名单-------------------不存在用户"); } } } else{ // console.warn("推广操作白名单-------------------没有白名单 创建默认白名单"); var agenteragree = new app.models.AgenterAgree({ _id: agentId,//记录 isOpenAgree: "0", infoList: [] }); yield agenteragree.saveAsync(); } return self.writeOut('999999', res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //金牌推广员给自己添加下级(组员) proto.inviteChirdAsync = P.coroutine(function* (query, method, res) { var agentId = query['agentid']; if (!agentId) { return this.writeOut(-3, res); } var userId = query['userId']; if (!userId) { return this.writeOut(-4, res); } var contact = query['contact']; if (!contact) { return this.writeOut(-5, res); } var tel = query['tel']; if (!tel) { return this.writeOut(-6, res); } var sign = query['sign']; if (!sign) { return this.writeOut(-7, res); } if (!checkSign(sign)) { return this.writeOut(-8, res); } var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { let outstate = -2; var yPlayers = yield app.models.Player.findMongoAsync({ userId: userId },'_id userId'); if (yPlayers.length == 1){ let uid = yPlayers[0]._id; let tgState = 2;////未申请=1;正在审核=2;审核成功=3,审核失败=4 var apply = yield app.models.tgApply.findByIdReadOnlyAsync(uid); if (!apply) { var tgapply = new app.models.tgApply({ _id: uid, applyType: 2, parenteId:agentId, tgName: contact, tgPhone: tel, tgWXNumber: "", tgState: tgState }); yield tgapply.saveAsync(); outstate = 999999; } else{ outstate = -1; } } else{ outstate = 0; } return self.writeOut(outstate, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //ts++ 清除代理绑定 proto.freeBindAsync = P.coroutine(function* (query, method, res) { // console.warn("清除代理-------------------"); var agentId = query['agentid']; if (!agentId) { return this.writeOut('fail: agentid error!', res); } //console.warn("清除代理-------------------playerId:",agentId); var sign = query['sign']; if (!sign) { return this.writeOut('fail: sign error!', res); } //console.warn("清除代理-------------------sign:",sign); if (!checkSign(sign)) { return this.writeOut('fail: sign error!', res); } var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { var agenter = yield app.models.Agenter.findByIdAsync(agentId, 'playerId'); if (agenter) { agenter.playerId = ''; yield agenter.saveAsync(); // console.warn("清除代理-------------------成功"); } return self.writeOut('999999', res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //ts++ 解除锁定返利 proto.outVerifyAsync = P.coroutine(function* (query, method, res) { // console.warn("结算前日返利-------------------",query['agentid']); var agentId = query['agentid']; if (!agentId) { return this.writeOut('fail: agentId error!', res); } // console.warn("解除锁定返利-------------------agenterId:",agentId); var sign = query['sign']; if (!sign) { return this.writeOut('fail: sign error!', res); } if (!checkSign(sign)) { return this.writeOut('fail: sign error!', res); } var today = new Date(); today.setHours(0); today.setMinutes(0); today.setSeconds(0); today.setMilliseconds(0); let nowverifyDate=today.getTime(); var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { let outstate=-1; // var agenter = yield app.models.Agenter.findByIdAsync(agentId, 'rebateOther rebateCount rebateAll rebateNow rebateOut verifyDate verifyRebate dateGameTimes02 dateGameTimes03 dateGameTimes0 dateGameTimes42 dateGameTimes43 dateGameTimes4 dateGameTimes82 dateGameTimes83 dateGameTimes8 dateGameTimes162 dateGameTimes163 dateGameTimes16 dateGameCost0 dateGameCost4 dateGameCost8 dateGameCost16 agentRate'); var agenter = yield app.models.Agenter.findByIdAsync(agentId, 'levelFlag rewardRate rebateAll2 rebateNow2 rebateOut2 verifyDate2 verifyRebate2 rebateOther rebateCount rebateAll rebateNow rebateOut verifyDate verifyRebate agentRate'); if (agenter) { if(agenter.verifyDate==nowverifyDate) { return self.writeOut('fail: verifyDate error!', res); } let rewardRate = agenter.rewardRate; let parentId = agenter.parentAgenterId; let parentRate = agenter.parentRate; let verifyDate=0; let verifyRebate=0; //日奖励 let dateAgentRate=0; let dateRebate=0;//额外奖励数值(=额外比例*本局消耗),目前没有额外返利所以这个数值没有计算 let levelFlag = agenter.levelFlag; let verifyDate2=0; let verifyRebate2=0; let dateAgentRate2=0; let dateRebate2=0; if(agenter.verifyRebate>0 || agenter.verifyRebate2>0) { verifyDate=agenter.verifyDate; verifyRebate=agenter.verifyRebate; dateAgentRate=agenter.agentRate; agenter.rebateNow += verifyRebate; agenter.rebateNow += dateRebate; agenter.rebateOther += dateRebate; agenter.verifyRebate=0; //上面是对自己的进行日结,下面是对小组的日结 verifyDate2=agenter.verifyDate2; verifyRebate2=agenter.verifyRebate2; agenter.rebateNow2 += verifyRebate2; agenter.verifyRebate2=0; //审核的返利转到可提现 if(agenter.levelFlag == 0){ if(agenter.rebateNow > 500) { agenter.levelFlag = 1;//从实习变为转正 } } } agenter.verifyDate=nowverifyDate; agenter.verifyDate2=nowverifyDate; let rCount=agenter.rebateCount; let rOther=agenter.rebateOther; let rAll=agenter.rebateAll; let rNow=agenter.rebateNow; let rOut=agenter.rebateOut; let rAll2=agenter.rebateAll2; let rNow2=agenter.rebateNow2; let rOut2=agenter.rebateOut2; yield agenter.saveAsync(); // console.warn("结算前日返利-------------------成功"); if(verifyRebate>0) { // 退费 钻石记录 var rebateRecord = new app.models.RebateRecord({ _id: uuid.v1(), agentId:agentId, tableId: '', rType: 3, rCount: rCount, rOther: rOther, rAll: rAll, rNow: rNow, rOut: rOut, rSwap: verifyRebate, rDateSwap: dateRebate, rVerifyDate: verifyDate, rVerifyRebate: 0 }); yield rebateRecord.saveAsync(); // console.warn("结算前日返利-------------------rebateRecord.saveAsync()"); // let parentRebate = 0; // 该日期 该推广上级的返利金额 // let allGameCost = 0; // 该日期该推广产生的总游戏消耗 // let allGiftCost = 0; // 该日期该推广产生的总礼物消耗 // let allGameTimes1 = 0; // 该日期该推广产生的总游戏次数 // let allGameTimes2 = 0; // 该日期该推广产生的总游戏次数 // let allGameTimes3 = 0; // 该日期该推广产生的总游戏次数 // let allGameTimes4 = 0; // 该日期该推广产生的总游戏次数 // let allPlayerCount = 0;// 该日期该推广活跃玩家个数 // let opts1 = { // agentId: agentId, // time: { $gte: verifyDate, $lt: verifyDate+86400000} // }; // var jrList1 = yield this.app.models.FHMJTables.findMongoAsync(opts1, 'gameId gameCost giftCost'); // for (let i = 0; i < jrList1.length; i++){ // allGameCost += jrList1[i].gameCost; // 该日期该推广产生的总游戏消耗 // allGiftCost += jrList1[i].giftCost; // 该日期该推广产生的总礼物消耗 // if(jrList1[i].gameId == 10006) allGameTimes1+=1;// 湖南长沙 // else if(jrList1[i].gameId == 10007) allGameTimes2+=1;// 湖南红中 // else if(jrList1[i].gameId == 10008) allGameTimes3+=1; // 湖南跑得快 // else if(jrList1[i].gameId == 10009) allGameTimes4+=1; // 湖南跑胡子 // } // let opts = {agentId: agentId,date: verifyDate}; // allPlayerCount = yield this.app.models.PlayerCount.countMongoAsync(opts) // let opts2 = { // agentId: parentId, // rType: 4, // tableId: agentId, // rVerifyDate: { $gte: verifyDate, $lt: verifyDate+86400000} // }; // var jrList2 = yield this.app.models.RebateRecord.findMongoAsync(opts2, 'gameId gameCost giftCost'); // for (let i = 0; i < jrList2.length; i++){ // parentRebate += jrList2[i].rSwap; // 该日期该推广给上级产生的贡献 // } // var daterebateRecord = new app.models.DateRebateRecord({ // _id: uuid.v1(), // agentId:agentId, // verifyDate: verifyDate, // verifyRebate: verifyRebate, // dateAgentRate: dateAgentRate, // dateRebate: dateRebate, // dateRewardRate: rewardRate, // 进行日结当日该推广自己的返利的比例 // parentaId: parentId, // 代理上级的标识 // dateParentRate: parentRate, // 进行日结当日该推广上级的返利的比例 // parentRebate: parentRebate, // 该日期 该推广上级的返利金额 // allGameCost: allGameCost, // 该日期该推广产生的总游戏消耗 // allGiftCost: allGiftCost, // 该日期该推广产生的总礼物消耗 // allGameTimes1: allGameTimes1, // 该日期该推广产生的总游戏1次数 // allGameTimes2: allGameTimes2, // 该日期该推广产生的总游戏2次数 // allGameTimes3: allGameTimes3, // 该日期该推广产生的总游戏3次数 // allGameTimes4: allGameTimes4, // 该日期该推广产生的总游戏4次数 // allPlayerCount: allPlayerCount, // 该日期该推广活跃玩家个数 // }); // yield daterebateRecord.saveAsync(); // // console.warn("结算前日返利-------------------daterebateRecord.saveAsync()"); } if(verifyRebate2>0) { //对上级的奖励进行日结 var rebateRecord = new app.models.RebateRecord({ _id: uuid.v1(), agentId:parentId, tableId: '', rType: 5, rCount: rCount, rOther: rOther, rAll: rAll2, rNow: rNow2, rOut: rOut2, rSwap: verifyRebate2, rDateSwap: dateRebate, rVerifyDate: verifyDate2, rVerifyRebate: 0 }); yield rebateRecord.saveAsync(); } outstate=999999; // console.warn("结算前日返利 成功了-------------------",query['agentid']); } return self.writeOut(outstate, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //ts++ 提现申请 proto.outRebateAsync = P.coroutine(function* (query, method, res) { //console.warn("提现申请-------------------",query['agentid'] + " query['out'] " + query['out'] ); var agentId = query['agentid']; if (!agentId) { return this.writeOut('fail: agentId error!', res); } var out_rebate = Number(query['out']);//金额 if (!query['out']) { return this.writeOut('fail: out error!', res); } var outType = Number(query['outType']) || 0;//提现类型:1为提取自己的,2为提取自己下级的 if (!outType) { return this.writeOut('fail: outType error!', res); } var sign = query['sign']; if (!sign) { return this.writeOut('fail: sign error!', res); } if (!checkSign(sign)) { return this.writeOut('fail: sign error!', res); } var self = this; var app = this.app; return app.memdb.goose.transactionAsync(P.coroutine(function* () { let outstate=-1; var agenter = yield app.models.Agenter.findByIdAsync(agentId, 'rewardRate rebateOther rebateCount rebateAll rebateAll2 rebateNow rebateNow2 rebateOut rebateOut2 verifyDate verifyDate2 verifyRebate verifyRebate2'); if (agenter) { outstate=0; // console.warn("111提现申请-------------------成功",agenter.rebateNow,out_rebate); if((outType == 1 && agenter.rebateNow>=out_rebate && out_rebate > 0) || (outType == 2 && agenter.rebateNow2>=out_rebate && out_rebate > 0)) { let rType = 2; if(outType == 1) {//提取自己的 agenter.rebateOut += out_rebate; agenter.rebateNow -= out_rebate; } else if(outType == 2) {//提取小组(下级)的 rType = 6; agenter.rebateOut2 += out_rebate; agenter.rebateNow2 -= out_rebate; } let rCount=agenter.rebateCount; let rOther=agenter.rebateOther; let rAll=agenter.rebateAll; let rNow=agenter.rebateNow; let rOut=agenter.rebateOut; let rVerifyDate=agenter.verifyDate; let rVerifyRebate=agenter.verifyRebate; if(outType == 2) {//提取小组(下级)的 rAll=agenter.rebateAll2; rNow=agenter.rebateNow2; rOut=agenter.rebateOut2; rVerifyDate=agenter.verifyDate2; rVerifyRebate=agenter.verifyRebate2; } yield agenter.saveAsync(); // console.warn("提现申请-------------------成功"); let vid=uuid.v1(); // 奖励记录 var rebateRecord = new app.models.RebateRecord({ _id: vid, agentId:agentId, tableId: '', rType: rType, rCount: rCount, rOther: rOther, rAll: rAll, rNow: rNow, rOut: rOut, rSwap: -1*out_rebate, rKouZuan: -1*out_rebate, rDateSwap: 0, rVerifyDate: rVerifyDate, rVerifyRebate: rVerifyRebate }); yield rebateRecord.saveAsync(); // 提现申请 var outRebate = new app.models.OutRebate({ _id: vid, agentId:agentId, outType:outType, outSwap: -1*out_rebate, kouZuan: -1*out_rebate }); yield outRebate.saveAsync(); outstate=999999; } } return self.writeOut(outstate, res); }), app.getServerId()) .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail')); }); //ts++签名验证 function checkSign(sign) { var signKey = 'defe6d21422c8b770767f74fcea95'; if (sign!=signKey) return false; return true; };