manage.js 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928
  1. 'use strict';
  2. var quick = require('quick-pomelo');
  3. var P = quick.Promise;
  4. var _ = require('lodash');
  5. var url = require('url');
  6. var md5 = require('md5');
  7. var http = require('http');
  8. var uuid = require('node-uuid');
  9. var qs = require('querystring');
  10. var conf = require('./conf.json');
  11. var C = require('../share/constant');
  12. var configCommon = require('../share/configCommon');//////TL++配置相关的公共方法
  13. var logger = quick.logger.getLogger('fhmj', __filename);
  14. // 构造方法
  15. var Controller = function (app) {
  16. this.app = app;
  17. this.uptime = Date.now();
  18. this.port = app.getCurServer().httpPort;
  19. this.server = http.createServer((req, res) => this.handleAsync(req, res));
  20. this.server.listen(this.port);
  21. this.lconfigCommon = new configCommon(this.app);
  22. };
  23. // 导出方法
  24. module.exports = function (app) {
  25. return new Controller(app);
  26. };
  27. // 原型对象
  28. var proto = Controller.prototype;
  29. // 路由函数
  30. proto.route = function (pathname) {
  31. switch (pathname) {
  32. case '/setmyurl.nd': return (query, method, res) => this.setMyUrlAsync(query, method, res);//设置Grade url
  33. case '/setAllAgenterMyurl.nd': return (query, method, res) => this.setAllAgenterMyurlAsync(query, method, res);//设置所有推广的地址
  34. case '/setAgenterMyurl.nd': return (query, method, res) => this.setAgenterMyurlAsync(query, method, res);//设置单个推广的地址
  35. case '/setAgentOther.nd': return (query, method, res) => this.setAgentOtherAsync(query, method, res);//设置单个推广的其他信息
  36. case '/adddiamond.nd': return (query, method, res) => this.addDiamondAsync(query, method, res);//后台加钻石
  37. case '/clearUser.nd': return (query, method, res) => this.clearUserAsync(query, method, res);//删除用户
  38. case '/freetable.nd': return (query, method, res) => this.freeTableAsync(query, method, res);//清空房间
  39. case '/setPlayerPayTop.nd': return (query, method, res) => this.setPlayerPayTopAsync(query, method, res);//设置玩家充值上限
  40. case '/setWeiHu.nd': return (query, method, res) => this.setWeiHuAsync(query, method, res);//设置维护
  41. case '/setPlayerEnable.nd': return (query, method, res) => this.setPlayerEnableAsync(query, method, res);//设置用户是否冻结
  42. case '/setAgentInfo.nd': return (query, method, res) => this.setAgentInfoAsync(query, method, res);//设置推广信息(java后台用)
  43. case '/addMail.nd': return (query, method, res) => this.addMailAsync(query, method, res);//后台给玩家发邮件
  44. case '/sidAridChange.nd': return (query, method, res) => this.sidAridChangeAsync(query, method, res);//显示uid和实际uid互相转换
  45. case '/addRaceTime.nd': return (query, method, res) => this.addRaceTimeAsync(query, method, res);//后台增加比赛的开始和结束时间
  46. case '/setRaceTimeOut.nd': return (query, method, res) => this.setRaceTimeOutAsync(query, method, res);//后台设置比赛是否过期
  47. case '/setNotGameTogther.nd': return (query, method, res) => this.setNotGameTogtherAsync(query, method, res);//后台增设置不能在同一桌游戏的玩家
  48. case '/setJinSai.nd': return (query, method, res) => this.setJinSaiAsync(query, method, res);//设置禁赛玩家
  49. case '/setSGJiangChi.nd': return (query, method, res) => this.setSGJiangChiAsync(query, method, res);//设置水果机奖池信息
  50. case '/setSGJiangChiGJ.nd': return (query, method, res) => this.setSGJiangChiGJAsync(query, method, res);//设置水果机奖池信息
  51. case '/getSGATypeAll.nd': return (query, method, res) => this.getSGATypeAllAsync(query, method, res);//得到水果机某个字段的总和
  52. case '/sgjRWFJOver.nd': return (query, method, res) => this.sgjRWFJOverAsync(query, method, res);//水果机任务发奖完成
  53. }
  54. };
  55. // 写出数据
  56. proto.writeOut = function (query, res) {
  57. if (typeof query != 'object') {
  58. return res.end(String(query));
  59. }
  60. return res.end(JSON.stringify(query));
  61. };
  62. // 跨域选项
  63. const ACCESS = {
  64. "Content-Type": "text/plain;charset=utf-8",
  65. "Access-Control-Allow-Origin": "*",
  66. "Access-Control-Allow-Headers": "X-Requested-With",
  67. "Access-Control-Allow-Methods": "PUT,POST,GET,DELETE,OPTIONS"
  68. };
  69. // 入口函数
  70. proto.handleAsync = P.coroutine(function* (req, res) {
  71. var pathname = url.parse(req.url).pathname;
  72. var phandler = this.route(pathname);
  73. if (!phandler) {
  74. res.writeHead(404, ACCESS);
  75. return res.end('WARNING: Not Found!');
  76. }
  77. else {
  78. res.writeHead(200, ACCESS);
  79. if (req.method.toLowerCase() == 'get') {
  80. let query = url.parse(req.url, true).query;
  81. return phandler(query, req.method, res);
  82. }
  83. else if (req.method.toLowerCase() == 'post') {
  84. let data = '';
  85. req.on('data', (d) => { data += d; });
  86. req.on('end', () => {
  87. let query = { __post__: data };
  88. let regexp = /^\s*{(\s*?".*?":.*\s*)*}\s*$/;
  89. if (regexp.test(data)) try { query = JSON.parse(data); } catch (e) { }
  90. else if (data.indexOf('=') != -1) query = qs.parse(data);
  91. return phandler(query, req.method, res);
  92. });
  93. }
  94. }
  95. });
  96. //ts++ 设置 grade myurl
  97. proto.setMyUrlAsync = P.coroutine(function* (query, method, res) {
  98. var playerId = query['playerid'];
  99. if (!playerId) {
  100. return this.writeOut('fail: userid error!', res);
  101. }
  102. var grade = Number(query['grade']);
  103. if (!grade) {
  104. return this.writeOut('fail: grade error!', res);
  105. }
  106. var myurl = query['myurl'];
  107. if (!myurl) {
  108. return this.writeOut('fail: myurl error!', res);
  109. }
  110. var sign = query['sign'];
  111. if (!sign) {
  112. return this.writeOut('fail: sign error!', res);
  113. }
  114. if (!checkSign(sign)) {
  115. return this.writeOut('fail: sign error!', res);
  116. }
  117. var self = this;
  118. var app = this.app;
  119. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  120. var player = yield app.models.Player.findByIdAsync(playerId, 'grade myurl');
  121. if (player) {
  122. player.grade = grade;
  123. player.myurl = myurl;
  124. yield player.saveAsync();
  125. console.warn("设置设置 grade -------------------修改");
  126. }
  127. return self.writeOut('vvvvvv', res);
  128. }), app.getServerId())
  129. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  130. });
  131. //设置所有推广的地址
  132. proto.setAllAgenterMyurlAsync = P.coroutine(function* (query, method, res) {
  133. console.warn("设置所有推广的地址 ");
  134. var playerId = query['mid'];
  135. if (!playerId) {
  136. return this.writeOut('fail: userid error!', res);
  137. }
  138. var myurl = query['myurl'];
  139. if (!myurl) {
  140. return this.writeOut('fail: myurl error!', res);
  141. }
  142. var sign = query['sign'];
  143. if (!sign) {
  144. return this.writeOut('fail: sign error!', res);
  145. }
  146. if (!checkSign(sign)) {
  147. return this.writeOut('fail: sign error!', res);
  148. }
  149. console.warn("设置所有推广的地址222 "+" playerId "+playerId+" myurl "+myurl);
  150. var self = this;
  151. var app = this.app;
  152. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  153. let msg = '999999'
  154. console.warn("设置所有推广的地址222 ")
  155. // //yield app.models.Agenter.updateMany({update: {$set: {myGrade:2}}, upsert:true})
  156. // let agentArr = yield app.models.Agenter.findMongoAsync({"myGrade" :{$ne :1}});
  157. // console.warn("设置所有推广的地址3 "+JSON.stringify(agentArr));
  158. // console.warn("设置所有推广的地址333 "+agentArr.length);
  159. let agentArr = yield app.models.Agenter.findMongoAsync({"myUrl" :{$ne :myurl}});
  160. // console.warn("设置所有推广的地址31 "+JSON.stringify(agentArr));
  161. // console.warn("设置所有推广的地址3331 "+agentArr.length);
  162. for (var i = 0; i < agentArr.length; i++) {
  163. let agenter = agentArr[i];
  164. if (agenter) {
  165. // agenter.grade = grade;
  166. let isChange = (agenter.myUrl != myurl)
  167. if(isChange){
  168. agenter.myUrl = myurl;
  169. yield agenter.saveAsync();
  170. }
  171. console.warn("设置所有推广的地址444 isChange "+isChange+" agenter.myUrl "+agenter.myUrl);
  172. }
  173. }
  174. if(agentArr.length == 0) msg = 'no need change';
  175. console.warn("设置所有推广的地址555 ");
  176. return self.writeOut(msg, res);
  177. }), app.getServerId())
  178. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  179. });
  180. //设置单个推广的地址
  181. proto.setAgenterMyurlAsync = P.coroutine(function* (query, method, res) {
  182. // console.warn("设置单个推广的地址 ");
  183. var playerId = query['aid'];
  184. if (!playerId) {
  185. return this.writeOut('fail: userid error!', res);
  186. }
  187. var type = Number(query['type']);
  188. if (!type) {
  189. return this.writeOut('fail: type error!', res);
  190. }
  191. var myurl = query['myurl'];
  192. if (type == 1 && !myurl) {
  193. return this.writeOut('fail: myurl error!', res);
  194. }
  195. var level = query['level'];
  196. if (type == 2 && !level) {
  197. return this.writeOut('fail: level error!', res);
  198. }
  199. var sign = query['sign'];
  200. if (!sign) {
  201. return this.writeOut('fail: sign error!', res);
  202. }
  203. if (!checkSign(sign)) {
  204. return this.writeOut('fail: sign error!', res);
  205. }
  206. // console.warn("设置单个推广的地址222 "+" playerId "+playerId+" type "+type+" myurl "+myurl+" level "+level);
  207. var self = this;
  208. var app = this.app;
  209. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  210. let msg = ''
  211. // console.warn("设置单个推广的地址333 ");//Agenter
  212. var player = yield app.models.Agenter.findByIdAsync(playerId, 'myUrl');
  213. if (player) {
  214. // player.grade = grade;
  215. let isChange = false;
  216. if(type == 1) {
  217. isChange = (player.myUrl != myurl)
  218. player.myUrl = myurl;
  219. }
  220. if(isChange) yield player.saveAsync();
  221. msg = '999999'
  222. // console.warn("设置单个推广的地址444 isChange "+isChange+" player.myUrl "+player.myUrl);
  223. }
  224. else msg = 'agent not find'
  225. // console.warn("设置单个推广的地址555 ");
  226. return self.writeOut(msg, res);
  227. }), app.getServerId())
  228. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  229. });
  230. //设置单个推广的其他信息
  231. proto.setAgentOtherAsync = P.coroutine(function* (query, method, res) {
  232. // console.warn("设置单个推广的信息 ",query);
  233. var playerId = query['aid'];
  234. if (!playerId) {
  235. return this.writeOut('fail: userid error!', res);
  236. }
  237. var change = query['change'];
  238. if (!change) {
  239. return this.writeOut('fail: change error!', res);
  240. }
  241. var value = query['value'];
  242. if(change != "parentAgenterId" && change != "playerId"){
  243. value = Number(value);
  244. }
  245. var sign = query['sign'];
  246. if (!sign) {
  247. return this.writeOut('fail: sign error!', res);
  248. }
  249. if (!checkSign(sign)) {
  250. return this.writeOut('fail: sign error!', res);
  251. }
  252. // console.warn("设置单个推广的地址222 "+" playerId "+playerId+" change "+change+" value "+value);
  253. var self = this;
  254. var app = this.app;
  255. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  256. let msg = ''
  257. // console.warn("设置单个推广的地址333 ");//Agenter
  258. var player = yield app.models.Agenter.findByIdAsync(playerId, 'levelFlag');
  259. if (player) {
  260. let isChange = false;
  261. if(change == "levelFlag" && player.levelFlag != value)
  262. {
  263. isChange=true;
  264. player.levelFlag = value;
  265. }
  266. if(change == "enabled" && (value == 0 || value == 1 ) && player.enabled!=value)
  267. {
  268. isChange=true;
  269. player.enabled = value;
  270. }
  271. if(change == "parentAgenterId")
  272. {
  273. if(!value){
  274. if(player.parentAgenterId != ""){
  275. player.parentAgenterId = "";
  276. yield player.saveAsync();
  277. return self.writeOut('999999', res);
  278. }
  279. else{
  280. return self.writeOut('no need change.', res);
  281. }
  282. }
  283. let agenterList = yield app.models.Agenter.findMongoAsync({agentNo:value}, '_id agenterNo levelFlag enabled parentAgenterId');
  284. if (agenterList.length == 1) {
  285. if(agenterList[0].levelFlag != 2 || agenterList[0].enabled == 0){
  286. return self.writeOut('cant add the agent because unenable or level error!', res);
  287. }
  288. if(player.parentAgenterId != agenterList[0]._id){
  289. isChange=true;
  290. player.parentAgenterId = agenterList[0]._id;
  291. }
  292. else{
  293. return self.writeOut('parent no change !', res);
  294. }
  295. }
  296. else{
  297. return self.writeOut('agentNo Error!', res);
  298. }
  299. }
  300. if(isChange) yield player.saveAsync();
  301. msg = '999999'
  302. // console.warn("设置单个推广的地址444 isChange "+isChange+" player.myUrl "+player.myUrl);
  303. }
  304. else msg = 'agent not find'
  305. // console.warn("设置单个推广的地址555 ");
  306. return self.writeOut(msg, res);
  307. }), app.getServerId())
  308. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  309. });
  310. //ts++ 删除玩家
  311. proto.clearUserAsync = P.coroutine(function* (query, method, res) {
  312. console.warn("删除玩家-------------------");
  313. var playerId = query['playerid'];
  314. if (!playerId) {
  315. return this.writeOut('', res);//fail: userid error!
  316. }
  317. //console.warn("删除玩家-------------------playerId:",playerId);
  318. var sign = query['sign'];
  319. if (!sign) {
  320. return this.writeOut('fail: sign error!', res);
  321. }
  322. if (!checkSign(sign)) {
  323. return this.writeOut('', res);
  324. }
  325. var self = this;
  326. var app = this.app;
  327. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  328. var player = yield app.models.Player.findByIdAsync(playerId);
  329. if (player) {
  330. yield player.removeAsync();
  331. console.warn("删除玩家-------------------成功");
  332. return self.writeOut('999999', res);
  333. }
  334. return self.writeOut('fail: no object !', res);
  335. }), app.getServerId())
  336. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  337. });
  338. //ts++ 清空房间
  339. proto.freeTableAsync = P.coroutine(function* (query, method, res) {
  340. // console.warn("清空房间-------------------");
  341. var playerId = query['playerId'];
  342. if (!playerId) {
  343. return this.writeOut('fail: playerId error!', res);//fail: userid error!
  344. }
  345. var change = query['change'];
  346. if (!change) {
  347. return this.writeOut('fail: change error!', res);
  348. }
  349. console.warn("清空房间-------------------playerId:",playerId,change);
  350. var sign = query['sign'];
  351. if (!sign) {
  352. return this.writeOut('fail: sign error!', res);
  353. }
  354. //console.warn("清空房间-------------------sign:",sign);
  355. if (!checkSign(sign)) {
  356. return this.writeOut('', res);
  357. }
  358. var self = this;
  359. var app = this.app;
  360. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  361. var player = yield app.models.Player.findByIdAsync(playerId, 'tableId rTableId gameId gameServerId tel pwd');
  362. if (player) {
  363. if(change == "freeTable"){
  364. player.rTableId = 0;
  365. player.tableId = "";
  366. player.gameId = 0;
  367. player.gameServerId = "";
  368. }
  369. else if(change == "unbindTel"){
  370. player.tel = '';
  371. player.pwd = '';
  372. }
  373. yield player.saveAsync();
  374. console.warn("清空房间-------------------修改成功");
  375. }
  376. return self.writeOut('999999', res);
  377. }), app.getServerId())
  378. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  379. });
  380. //////TL++,设置玩家充值上限
  381. proto.setPlayerPayTopAsync = P.coroutine(function* (query, method, res) {
  382. console.warn("设置玩家充值上限-------------------",query);
  383. var uppid = query['uppid'];
  384. if (!uppid) {
  385. return this.writeOut('fail: uppid error!', res);
  386. }
  387. var value = Number(query['value']) || -10;
  388. if(query['value'] == "0") value = 0;
  389. if (value < -1) {
  390. return this.writeOut('fail: value error!', res);
  391. }
  392. var sign = query['sign'];
  393. if (!sign) {
  394. return this.writeOut('fail: sign error!', res);
  395. }
  396. if (!checkSign(sign)) {
  397. return this.writeOut('fail: sign error!!!', res);
  398. }
  399. var self = this;
  400. var app = this.app;
  401. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  402. let wjsx = yield app.models.PayLimit.findByIdAsync(uppid, 'paytop registerTime');
  403. if (wjsx) {
  404. wjsx.paytop = value;
  405. wjsx.registerTime = Date.now();
  406. yield wjsx.saveAsync();
  407. console.warn("设置玩家充值上限成功-------------------uppid:",uppid,value);
  408. }
  409. else
  410. {
  411. var player = yield app.models.Player.findByIdAsync(uppid, 'userId name');
  412. if (!player) {
  413. return this.writeOut('fail: no object !', res);
  414. }
  415. let startTime = self.getzdLDSJC(Date.now());
  416. let jrzcz = 0;
  417. var endTime = startTime + 86400000;
  418. var opts = { time: { $gte: startTime, $lt: endTime },playerId: uppid, paystate: { $gte: 1 }};
  419. var list = yield app.models.PayRecord.findMongoAsync(opts, 'total_fee');
  420. for (let i = 0; i < list.length; ++i) {
  421. jrzcz += list[i].total_fee;
  422. }
  423. var newwjsx = new app.models.PayLimit({
  424. _id: uppid,
  425. userId: player.userId,
  426. name: player.name,
  427. paytop: value,
  428. paytotal: jrzcz,
  429. dataTime: startTime,
  430. });
  431. yield newwjsx.saveAsync();
  432. }
  433. return self.writeOut('999999', res);
  434. }), app.getServerId())
  435. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  436. });
  437. //////TL++,设置维护
  438. proto.setWeiHuAsync = P.coroutine(function* (query, method, res) {
  439. console.warn("设置维护-------------------",query);
  440. // var playerId = query['playerid'];
  441. // if (!playerId) {
  442. // return this.writeOut('fail: userid error!', res);
  443. // }
  444. var updid = Number(query['updid']);
  445. var value = query['value'];
  446. if (!value) {
  447. return this.writeOut('fail: value error!', res);
  448. }
  449. if(updid==1)
  450. {
  451. let stateWH = Number(value)||0;
  452. if (stateWH!=0 && stateWH!=1 && stateWH!=2) {
  453. return this.writeOut('fail: stateWH error!!!', res);
  454. }
  455. }
  456. else if(updid==2)
  457. {
  458. }
  459. else if(updid==3)
  460. {
  461. let rebaterate = Number(value)||0
  462. if (rebaterate < 0 || rebaterate > 100) {
  463. return this.writeOut('fail: rebaterate error!', res);
  464. }
  465. }
  466. else if(updid==4){
  467. }
  468. else if(updid==5){
  469. let yxndlbTime = Number(value)||0
  470. if (yxndlbTime <= 0) {
  471. return this.writeOut('fail: yxndlbTime error!', res);
  472. }
  473. }
  474. else if(updid==6){
  475. }
  476. else
  477. {
  478. return this.writeOut('fail: updid error!!!', res);
  479. }
  480. var sign = query['sign'];
  481. if (!sign) {
  482. return this.writeOut('fail: sign error!', res);
  483. }
  484. //console.warn("清空房间-------------------sign:",sign);
  485. if (!checkSign(sign)) {
  486. return this.writeOut('fail: sign error!!!', res);
  487. }
  488. var self = this;
  489. var app = this.app;
  490. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  491. var dataSystemConfig = yield app.models.WHstate.findByIdAsync('wh', 'stateWH whTip rebaterate shareGive yxndlbTime yxndlbTip');
  492. //console.warn("系统配置",dataSystemConfig);
  493. if (dataSystemConfig) {
  494. if(updid==1)
  495. {
  496. let stateWH = Number(value)||0;
  497. dataSystemConfig.stateWH = stateWH;
  498. }
  499. else if(updid==2)
  500. {
  501. dataSystemConfig.whTip = value;
  502. }
  503. else if(updid==3)
  504. {
  505. let rebaterate = Number(value)||0
  506. dataSystemConfig.rebaterate = rebaterate;
  507. }
  508. else if(updid==4)
  509. {
  510. let shareGive = Number(value)||0
  511. dataSystemConfig.shareGive = shareGive;
  512. }
  513. else if(updid==5)
  514. {
  515. let yxndlbTime = Number(value)||0
  516. dataSystemConfig.yxndlbTime = yxndlbTime;
  517. }
  518. else if(updid==6)
  519. {
  520. dataSystemConfig.yxndlbTip = value;
  521. }
  522. // else if(updid==7)
  523. // {
  524. // dataSystemConfig.linkhall = value;
  525. // }
  526. // else if(updid==8)
  527. // {
  528. // var regDiamond = Number(value) ||100;
  529. // if (regDiamond<0) {
  530. // data.msg='注册赠送值为错误';
  531. // return self.writeOut(data, res);
  532. // }
  533. // dataSystemConfig.regDiamond = regDiamond;
  534. // }
  535. //console.warn("修改系统配置",updid,value);
  536. yield dataSystemConfig.saveAsync();
  537. }
  538. else
  539. {
  540. return this.writeOut('fail: no object !', res);
  541. }
  542. return self.writeOut('999999', res);
  543. }), app.getServerId())
  544. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  545. });
  546. // 后台增加钻石
  547. proto.addDiamondAsync = P.coroutine(function* (query, method, res) {
  548. console.warn("590 query:",query)
  549. var playerId = query['playerid'];
  550. if (!playerId) {
  551. return this.writeOut('fail: userid error!', res);
  552. }
  553. // console.warn("后台增加钻石-------------------playerId:",playerId);
  554. var managerId = query['managerid'];
  555. var diamond = Number(query['diamond']);
  556. var sign = query['sign'];
  557. if (!sign) {
  558. return this.writeOut('fail: sign error!', res);
  559. }
  560. if (!checkSign(sign)) {
  561. return this.writeOut('fail: sign error!', res);
  562. }
  563. console.warn("query:",query)
  564. // console.warn("后台增加钻石-------------------diamond:",diamond);
  565. var self = this;
  566. var app = this.app;
  567. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  568. //后台增加钻石的话给用户发邮件通知,用户在邮件里领取之后修改玩家钻石,后台扣钻则不发邮件
  569. if(diamond < 0){
  570. var player = yield app.models.Player.findByIdAsync(playerId, 'diamond');
  571. if (player) {
  572. let dSource=player.diamond;
  573. let dNow=player.diamond+diamond;
  574. player.diamond += diamond;
  575. yield player.saveAsync();
  576. // 钻石记录
  577. var diamondrecord = new app.models.DiamondRecord({
  578. _id: uuid.v1(),
  579. playerId: playerId,
  580. dType: 7,//后台
  581. dSource: dSource,
  582. dSwap: diamond,
  583. dNow: dNow,
  584. tableId: managerId
  585. });
  586. yield diamondrecord.saveAsync();
  587. }
  588. var SGJUserTongjis = yield app.models.SGJUserTongji.findMongoAsync({todaytime:self.getTodaySJC()})
  589. var SGJUserTongji = null
  590. if (SGJUserTongjis.length == 0) {
  591. SGJUserTongji = app.models.SGJUserTongji({
  592. _id: uuid.v1(),
  593. //userId: player.userId,
  594. houtaiU: diamond,
  595. todaytime: self.getTodaySJC()
  596. });
  597. yield SGJUserTongji.saveAsync()
  598. }else {
  599. SGJUserTongji = SGJUserTongjis[0]
  600. console.warn("SGJUserTongji:",SGJUserTongji)
  601. //SGJUserTongji.usdt = afterusdt
  602. SGJUserTongji.houtaiU = (Number(SGJUserTongji.houtaiU) +Number(diamond)).toFixed(2)//下注
  603. yield SGJUserTongji.saveAsync()
  604. }
  605. }
  606. else if(diamond > 0){
  607. console.warn("playerId:",playerId)
  608. var player = yield app.models.Player.findByIdAsync(playerId, 'userId');
  609. if (player) {
  610. var mail = yield app.models.Mails.findByIdAsync(playerId, 'mailInfos');
  611. if (mail) {
  612. console.warn("638")
  613. let item = {
  614. _id: "",
  615. index: mail.mailInfos.length, // 邮件下标
  616. tittleT: 3, // 邮件标题类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  617. descT: 3, // 邮件内容类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  618. reward: 1, // 有无奖励 0:无奖励 1:有奖励
  619. rewardT: 1, // 奖励类型 0:未定义 1:钻石,
  620. rewardC: diamond, // 奖励数量
  621. receive: 0, // 是否领取 0:未领取 1:已领取
  622. read: 0, // 是否已读 0:未读 1:已读
  623. form:managerId, //邮件来源
  624. sendTime: Date.now() // 发送日期
  625. }
  626. let newItem = _.clone(mail.mailInfos);
  627. let newItem2 = [0].concat(newItem);
  628. newItem2[0] = item;
  629. if(newItem2.length > 60){
  630. newItem2 = newItem2.slice(0,60)
  631. }
  632. mail.mailInfos = [];
  633. mail.mailInfos = _.clone(newItem2);
  634. yield mail.saveAsync();
  635. }
  636. else{
  637. let item = {
  638. _id: "",
  639. index: 0, // 邮件下标
  640. tittleT: 3, // 邮件标题类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  641. descT: 3, // 邮件内容类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  642. reward: 1, // 有无奖励 0:无奖励 1:有奖励
  643. rewardT: 1, // 奖励类型 0:未定义 1:钻石,
  644. rewardC: diamond, // 奖励数量
  645. receive: 0, // 是否领取 0:未领取 1:已领取
  646. read: 0, // 是否已读 0:未读 1:已读
  647. form:managerId, //邮件来源
  648. sendTime: Date.now() // 发送日期
  649. }
  650. let newItem = [];
  651. newItem[0] = item;
  652. var newMail = new app.models.Mails({
  653. _id: playerId, // 用户id(player表的主键)
  654. userId: player.userId, // 用户的userId
  655. mailInfos: newItem // 该活动的达成条件和奖励信息列表
  656. });
  657. yield newMail.saveAsync();
  658. }
  659. }
  660. }
  661. return self.writeOut('999999', res);
  662. }), app.getServerId())
  663. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  664. });
  665. // 设置用户是否禁用
  666. proto.setPlayerEnableAsync = P.coroutine(function* (query, method, res) {
  667. var playerId = query['playerId'];
  668. if (!playerId) {
  669. return this.writeOut('fail: userid error!', res);
  670. }
  671. var enable = parseInt(query.enable);
  672. if (enable != 0 && enable != 1) return this.writeOut('enable value error', res);
  673. var sign = query['sign'];
  674. if (!sign) {
  675. return this.writeOut('fail: sign error!', res);
  676. }
  677. if (!checkSign(sign)) {
  678. return this.writeOut('fail: sign error!', res);
  679. }
  680. console.warn("设置用户是否禁用------- playerId: "+playerId +" enable: "+enable);
  681. var self = this;
  682. var app = this.app;
  683. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  684. var player = yield app.models.Player.findByIdAsync(playerId, 'enable');
  685. if (player) {
  686. player.enable = enable;
  687. yield player.saveAsync();
  688. }
  689. else {
  690. let msg = 'player not find';
  691. return self.writeOut(msg, res);
  692. }
  693. return self.writeOut('999999', res);
  694. }), app.getServerId())
  695. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  696. });
  697. //ts++ 设置代理
  698. proto.setAgentInfoAsync = P.coroutine(function* (query, method, res) {
  699. // console.warn("设置代理-------------------");
  700. logger.warn("setAgentInfoAsync000");////cssj
  701. var agentId = query['agentId'];
  702. if (!agentId) {
  703. return this.writeOut('fail: agentId error!', res);
  704. }
  705. var agentName = query['agentName'];
  706. var contact = query['contact'];
  707. if (!contact) {
  708. return this.writeOut('fail: contact error!', res);
  709. }
  710. var tel = query['tel'];
  711. if (!tel) {
  712. return this.writeOut('fail: tel error!', res);
  713. }
  714. var rewardRate = query['rewardRate'];
  715. var parentRate = query['parentRate'];
  716. var levelFlag = query['levelFlag'];
  717. var enabled = Number(query['enabled']) || 1;
  718. var pwd = query['pwd'];
  719. var sign = query['sign'];
  720. if (!sign) {
  721. return this.writeOut('fail: sign error!', res);
  722. }
  723. //console.warn("设置代理-------------------sign:",sign);
  724. if (!checkSign(sign)) {
  725. return this.writeOut('fail: sign error!', res);
  726. }
  727. // console.warn("设置代理-------------------222 agentId "+agentId);
  728. var self = this;
  729. var app = this.app;
  730. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  731. var agenter = yield app.models.Agenter.findByIdAsync(agentId, 'agentName myUrl rewardRate contact tel parentAgenterId parentRate levelFlag enabled pwd');
  732. if (agenter) {
  733. let str0s = "setAgentInfoAsync old "+ JSON.stringify(agenter)
  734. logger.warn(str0s);////cssj
  735. var upd=false;
  736. if(agentName!='' && agenter.agentName!=agentName)
  737. {
  738. upd=true;
  739. agenter.agentName = agentName;
  740. }
  741. if(contact!='' && agenter.contact!=contact)
  742. {
  743. upd=true;
  744. agenter.contact = contact;
  745. }
  746. if(tel!='' && agenter.tel!=tel)
  747. {
  748. upd=true;
  749. agenter.tel = tel;
  750. }
  751. if(rewardRate || rewardRate == 0)
  752. {
  753. upd=true;
  754. agenter.rewardRate = parseInt(rewardRate);
  755. }
  756. if(parentRate || parentRate == 0)
  757. {
  758. upd=true;
  759. agenter.parentRate = parseInt(parentRate);
  760. }
  761. if((levelFlag || levelFlag == 0) && agenter.levelFlag != levelFlag){
  762. if(levelFlag == 2){
  763. if(agenter.parentAgenterId.length == 0 ){
  764. upd=true;
  765. agenter.levelFlag = levelFlag;
  766. }
  767. }
  768. else{
  769. upd=true;
  770. agenter.levelFlag = levelFlag;
  771. }
  772. }
  773. if((enabled == 0 || enabled == 1 ) && agenter.enabled!=enabled)
  774. {
  775. upd=true;
  776. agenter.enabled = enabled;
  777. }
  778. if(pwd!='' && agenter.pwd!=pwd)
  779. {
  780. upd=true;
  781. agenter.pwd = pwd;
  782. }
  783. // console.warn("设置代理-------------------333 upd "+upd+" agenter "+JSON.stringify(agenter));
  784. if(upd)
  785. {
  786. let str1s = "setAgentInfoAsync new "+ JSON.stringify(agenter)
  787. logger.warn(str1s);////cssj
  788. yield agenter.saveAsync();
  789. // console.warn("设置代理-------------------成功");
  790. }
  791. else
  792. {
  793. // console.warn("设置代理-------------------无修改");
  794. }
  795. }
  796. // console.warn("设置代理-------------------444 ");
  797. return self.writeOut('999999', res);
  798. }), app.getServerId())
  799. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  800. });
  801. //ts++ 设置水果机奖池信息,设置水果机配置
  802. proto.setSGJiangChiAsync = P.coroutine(function* (query, method, res) {
  803. console.warn("manage设置水果机奖池信息-------------------",query);
  804. var type = Number(query['type']) || 0;
  805. if (!type) {
  806. return this.writeOut('fail: type error!', res);
  807. }
  808. var index = Number(query['index']) || 0;
  809. if (!index || index <= 0 || index > 3) {
  810. return this.writeOut('fail: index error!', res);
  811. }
  812. var dw = Number(query['dw']) || 0;
  813. if (!dw || dw <= 0 || dw > 3) {
  814. return this.writeOut('fail: dw error!', res);
  815. }
  816. var key = Number(query['key']) || 0;
  817. if (!key) {
  818. return this.writeOut('fail: key error!', res);
  819. }
  820. var value = Number(query['value']) || 0;
  821. if (value < 0) {
  822. return this.writeOut('fail: value error!'+value, res);
  823. }
  824. var sign = query['sign'];
  825. if (!sign) {
  826. return this.writeOut('fail: sign error!', res);
  827. }
  828. if (!checkSign(sign)) {
  829. return this.writeOut('fail: sign error!', res);
  830. }
  831. console.warn("manage设置水果机奖池信息-------------------",type,index,dw,key,value);
  832. var self = this;
  833. var app = this.app;
  834. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  835. let jcPools = yield app.models.SGJJC.findByIdAsync('sgjjcs');
  836. if (jcPools) {
  837. console.warn("修改之前",jcPools);
  838. let isUp = false;
  839. if(type == 1){//游戏奖池
  840. if(key >= 1 && key <= 3){
  841. let list = [jcPools.pools,jcPools.levels,jcPools.cspools]
  842. console.warn("list:",list)
  843. console.warn(" index:",index," key:",key)
  844. if(index > 0 && index <= list[key-1].length && list[key-1][index-1] != value){
  845. list[key-1][index-1] = value;
  846. // ✅ 关键:告诉模型数组变了
  847. console.warn("list:",list)
  848. console.warn("value:",value)
  849. console.warn("jcPools.pools:",jcPools.pools)
  850. isUp = true;
  851. }
  852. }
  853. else if((key >= 4 && key <= 9) && dw > 0 && dw <= 3){
  854. let list = [jcPools.topLimits1,jcPools.topLimits2,jcPools.topLimits3];
  855. if(key == 5) list = [jcPools.lowLimits1,jcPools.lowLimits2,jcPools.lowLimits3];
  856. else if(key == 6) list = [jcPools.paiTopRate1,jcPools.paiTopRate2,jcPools.paiTopRate3];
  857. else if(key == 7) list = [jcPools.paiLowRate1,jcPools.paiLowRate2,jcPools.paiLowRate3];
  858. else if(key == 8) list = [jcPools.bsTopRate1,jcPools.bsTopRate2,jcPools.bsTopRate3];
  859. else if(key == 9) list = [jcPools.bsLowRate1,jcPools.bsLowRate2,jcPools.bsLowRate3];
  860. if(index > 0 && index <= list[dw-1].length && list[dw-1][index-1] != value){
  861. list[dw-1][index-1] = value;
  862. isUp = true;
  863. }
  864. }
  865. }
  866. else if(type == 2){//押大小奖池
  867. if(key >= 1 && key <= 3){
  868. let list = [jcPools.ydxpools,jcPools.ydxlevels,jcPools.ydxcspools]
  869. if(index > 0 && index <= list[key-1].length && list[key-1][index-1] != value){
  870. list[key-1][index-1] = value;
  871. isUp = true;
  872. }
  873. }
  874. else if((key >= 4 && key <= 11) && dw > 0 && dw <= 3){
  875. if(key >= 6 && key <= 9) return self.writeOut('can not set '+key, res);
  876. let list = [jcPools.ydxtopLimits1,jcPools.ydxtopLimits2,jcPools.ydxtopLimits3];
  877. if(key == 5) list = [jcPools.ydxlowLimits1,jcPools.ydxlowLimits2,jcPools.ydxlowLimits3];
  878. else if(key == 10) list = [jcPools.ydxTopRate1,jcPools.ydxTopRate2,jcPools.ydxTopRate3];
  879. else if(key == 11) list = [jcPools.ydxLowRate1,jcPools.ydxLowRate2,jcPools.ydxLowRate3];
  880. if(index > 0 && index <= list[dw-1].length && list[dw-1][index-1] != value){
  881. list[dw-1][index-1] = value;
  882. isUp = true;
  883. }
  884. }
  885. }
  886. if(isUp){
  887. // jcPools.levels = _.cloneDeep(jcPools.levels)//这样写也不行
  888. // yield jcPools.saveAsync();
  889. let jcPools2 = yield app.models.SGJJC.findByIdAsync('sgjjcs');
  890. if(type == 1){//游戏奖池
  891. if(key >= 1 && key <= 3){
  892. console.warn("935 jcpools.pools:",jcPools.pools)
  893. jcPools2.pools = _.cloneDeep(jcPools.pools);
  894. console.warn("jcPools:",jcPools)
  895. jcPools2.levels = _.cloneDeep(jcPools.levels);
  896. jcPools2.cspools = _.cloneDeep(jcPools.cspools);
  897. }
  898. else if(key >= 4 && key <= 9){
  899. jcPools2.topLimits1 = _.cloneDeep(jcPools.topLimits1);
  900. jcPools2.topLimits2 = _.cloneDeep(jcPools.topLimits2);
  901. jcPools2.topLimits3 = _.cloneDeep(jcPools.topLimits3);
  902. jcPools2.lowLimits1 = _.cloneDeep(jcPools.lowLimits1);
  903. jcPools2.lowLimits2 = _.cloneDeep(jcPools.lowLimits2);
  904. jcPools2.lowLimits3 = _.cloneDeep(jcPools.lowLimits3);
  905. jcPools2.paiTopRate1 = _.cloneDeep(jcPools.paiTopRate1);
  906. jcPools2.paiTopRate2 = _.cloneDeep(jcPools.paiTopRate2);
  907. jcPools2.paiTopRate3 = _.cloneDeep(jcPools.paiTopRate3);
  908. jcPools2.paiLowRate1 = _.cloneDeep(jcPools.paiLowRate1);
  909. jcPools2.paiLowRate2 = _.cloneDeep(jcPools.paiLowRate2);
  910. jcPools2.paiLowRate3 = _.cloneDeep(jcPools.paiLowRate3);
  911. jcPools2.bsTopRate1 = _.cloneDeep(jcPools.bsTopRate1);
  912. jcPools2.bsTopRate2 = _.cloneDeep(jcPools.bsTopRate2);
  913. jcPools2.bsTopRate3 = _.cloneDeep(jcPools.bsTopRate3);
  914. jcPools2.bsLowRate1 = _.cloneDeep(jcPools.bsLowRate1);
  915. jcPools2.bsLowRate2 = _.cloneDeep(jcPools.bsLowRate2);
  916. jcPools2.bsLowRate3 = _.cloneDeep(jcPools.bsLowRate3);
  917. }
  918. }
  919. else if(type == 2){//押大小奖池
  920. if(key >= 1 && key <= 3){
  921. jcPools2.ydxpools = _.cloneDeep(jcPools.ydxpools);
  922. jcPools2.ydxlevels = _.cloneDeep(jcPools.ydxlevels);
  923. jcPools2.ydxcspools = _.cloneDeep(jcPools.ydxcspools);
  924. }
  925. else if(key >= 4 && key <= 11){
  926. jcPools2.ydxtopLimits1 = _.cloneDeep(jcPools.ydxtopLimits1);
  927. jcPools2.ydxtopLimits2 = _.cloneDeep(jcPools.ydxtopLimits2);
  928. jcPools2.ydxtopLimits3 = _.cloneDeep(jcPools.ydxtopLimits3);
  929. jcPools2.ydxlowLimits1 = _.cloneDeep(jcPools.ydxlowLimits1);
  930. jcPools2.ydxlowLimits2 = _.cloneDeep(jcPools.ydxlowLimits2);
  931. jcPools2.ydxlowLimits3 = _.cloneDeep(jcPools.ydxlowLimits3);
  932. jcPools2.ydxTopRate1 = _.cloneDeep(jcPools.ydxTopRate1);
  933. jcPools2.ydxTopRate2 = _.cloneDeep(jcPools.ydxTopRate2);
  934. jcPools2.ydxTopRate3 = _.cloneDeep(jcPools.ydxTopRate3);
  935. jcPools2.ydxLowRate1 = _.cloneDeep(jcPools.ydxLowRate1);
  936. jcPools2.ydxLowRate2 = _.cloneDeep(jcPools.ydxLowRate2);
  937. jcPools2.ydxLowRate3 = _.cloneDeep(jcPools.ydxLowRate3);
  938. }
  939. }
  940. console.warn("修改之后 jcPools2:",jcPools2)
  941. yield jcPools2.saveAsync();
  942. // console.warn("奖池更新了",jcPools);
  943. // console.warn("奖池更新了222 ",jcPools2);
  944. jcPools = null;
  945. }
  946. else{
  947. return self.writeOut('value no change ', res);
  948. }
  949. }
  950. else{
  951. return self.writeOut('no jcPools! ', res);
  952. }
  953. return self.writeOut('999999', res);
  954. }), app.getServerId())
  955. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  956. });
  957. proto.setSGJiangChiGJAsync = P.coroutine(function* (query, method, res) {
  958. console.warn("manage设置水果机奖池信息-------------------",query);
  959. var type = Number(query['type']) || 0;
  960. if (!type) {
  961. return this.writeOut('fail: type error!', res);
  962. }
  963. var index = Number(query['index']) || 0;
  964. if (!index || index <= 0 || index > 3) {
  965. return this.writeOut('fail: index error!', res);
  966. }
  967. var dw = Number(query['dw']) || 0;
  968. if (!dw || dw <= 0 || dw > 3) {
  969. return this.writeOut('fail: dw error!', res);
  970. }
  971. var key = Number(query['key']) || 0;
  972. if (!key) {
  973. return this.writeOut('fail: key error!', res);
  974. }
  975. var value = Number(query['value']) || 0;
  976. if (value < 0) {
  977. return this.writeOut('fail: value error!'+value, res);
  978. }
  979. var sign = query['sign'];
  980. if (!sign) {
  981. return this.writeOut('fail: sign error!', res);
  982. }
  983. if (!checkSign(sign)) {
  984. return this.writeOut('fail: sign error!', res);
  985. }
  986. console.warn("manage设置水果机奖池信息-------------------",type,index,dw,key,value);
  987. var self = this;
  988. var app = this.app;
  989. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  990. let jcPools = yield app.models.SGJJC.findByIdAsync('sgjjcs_gj');
  991. if (jcPools) {
  992. console.warn("修改之前",jcPools);
  993. let isUp = false;
  994. if(type == 1){//游戏奖池
  995. if(key >= 1 && key <= 3){
  996. let list = [jcPools.pools,jcPools.levels,jcPools.cspools]
  997. console.warn("list:",list)
  998. console.warn(" index:",index," key:",key)
  999. if(index > 0 && index <= list[key-1].length && list[key-1][index-1] != value){
  1000. list[key-1][index-1] = value;
  1001. // ✅ 关键:告诉模型数组变了
  1002. console.warn("list:",list)
  1003. console.warn("value:",value)
  1004. console.warn("jcPools.pools:",jcPools.pools)
  1005. isUp = true;
  1006. }
  1007. }
  1008. else if((key >= 4 && key <= 9) && dw > 0 && dw <= 3){
  1009. let list = [jcPools.topLimits1,jcPools.topLimits2,jcPools.topLimits3];
  1010. if(key == 5) list = [jcPools.lowLimits1,jcPools.lowLimits2,jcPools.lowLimits3];
  1011. else if(key == 6) list = [jcPools.paiTopRate1,jcPools.paiTopRate2,jcPools.paiTopRate3];
  1012. else if(key == 7) list = [jcPools.paiLowRate1,jcPools.paiLowRate2,jcPools.paiLowRate3];
  1013. else if(key == 8) list = [jcPools.bsTopRate1,jcPools.bsTopRate2,jcPools.bsTopRate3];
  1014. else if(key == 9) list = [jcPools.bsLowRate1,jcPools.bsLowRate2,jcPools.bsLowRate3];
  1015. if(index > 0 && index <= list[dw-1].length && list[dw-1][index-1] != value){
  1016. list[dw-1][index-1] = value;
  1017. isUp = true;
  1018. }
  1019. }
  1020. }
  1021. else if(type == 2){//押大小奖池
  1022. if(key >= 1 && key <= 3){
  1023. let list = [jcPools.ydxpools,jcPools.ydxlevels,jcPools.ydxcspools]
  1024. if(index > 0 && index <= list[key-1].length && list[key-1][index-1] != value){
  1025. list[key-1][index-1] = value;
  1026. isUp = true;
  1027. }
  1028. }
  1029. else if((key >= 4 && key <= 11) && dw > 0 && dw <= 3){
  1030. if(key >= 6 && key <= 9) return self.writeOut('can not set '+key, res);
  1031. let list = [jcPools.ydxtopLimits1,jcPools.ydxtopLimits2,jcPools.ydxtopLimits3];
  1032. if(key == 5) list = [jcPools.ydxlowLimits1,jcPools.ydxlowLimits2,jcPools.ydxlowLimits3];
  1033. else if(key == 10) list = [jcPools.ydxTopRate1,jcPools.ydxTopRate2,jcPools.ydxTopRate3];
  1034. else if(key == 11) list = [jcPools.ydxLowRate1,jcPools.ydxLowRate2,jcPools.ydxLowRate3];
  1035. if(index > 0 && index <= list[dw-1].length && list[dw-1][index-1] != value){
  1036. list[dw-1][index-1] = value;
  1037. isUp = true;
  1038. }
  1039. }
  1040. }
  1041. if(isUp){
  1042. // jcPools.levels = _.cloneDeep(jcPools.levels)//这样写也不行
  1043. // yield jcPools.saveAsync();
  1044. let jcPools2 = yield app.models.SGJJC.findByIdAsync('sgjjcs_gj');
  1045. if(type == 1){//游戏奖池
  1046. if(key >= 1 && key <= 3){
  1047. console.warn("935 jcpools.pools:",jcPools.pools)
  1048. jcPools2.pools = _.cloneDeep(jcPools.pools);
  1049. console.warn("jcPools:",jcPools)
  1050. jcPools2.levels = _.cloneDeep(jcPools.levels);
  1051. jcPools2.cspools = _.cloneDeep(jcPools.cspools);
  1052. }
  1053. else if(key >= 4 && key <= 9){
  1054. jcPools2.topLimits1 = _.cloneDeep(jcPools.topLimits1);
  1055. jcPools2.topLimits2 = _.cloneDeep(jcPools.topLimits2);
  1056. jcPools2.topLimits3 = _.cloneDeep(jcPools.topLimits3);
  1057. jcPools2.lowLimits1 = _.cloneDeep(jcPools.lowLimits1);
  1058. jcPools2.lowLimits2 = _.cloneDeep(jcPools.lowLimits2);
  1059. jcPools2.lowLimits3 = _.cloneDeep(jcPools.lowLimits3);
  1060. jcPools2.paiTopRate1 = _.cloneDeep(jcPools.paiTopRate1);
  1061. jcPools2.paiTopRate2 = _.cloneDeep(jcPools.paiTopRate2);
  1062. jcPools2.paiTopRate3 = _.cloneDeep(jcPools.paiTopRate3);
  1063. jcPools2.paiLowRate1 = _.cloneDeep(jcPools.paiLowRate1);
  1064. jcPools2.paiLowRate2 = _.cloneDeep(jcPools.paiLowRate2);
  1065. jcPools2.paiLowRate3 = _.cloneDeep(jcPools.paiLowRate3);
  1066. jcPools2.bsTopRate1 = _.cloneDeep(jcPools.bsTopRate1);
  1067. jcPools2.bsTopRate2 = _.cloneDeep(jcPools.bsTopRate2);
  1068. jcPools2.bsTopRate3 = _.cloneDeep(jcPools.bsTopRate3);
  1069. jcPools2.bsLowRate1 = _.cloneDeep(jcPools.bsLowRate1);
  1070. jcPools2.bsLowRate2 = _.cloneDeep(jcPools.bsLowRate2);
  1071. jcPools2.bsLowRate3 = _.cloneDeep(jcPools.bsLowRate3);
  1072. }
  1073. }
  1074. else if(type == 2){//押大小奖池
  1075. if(key >= 1 && key <= 3){
  1076. jcPools2.ydxpools = _.cloneDeep(jcPools.ydxpools);
  1077. jcPools2.ydxlevels = _.cloneDeep(jcPools.ydxlevels);
  1078. jcPools2.ydxcspools = _.cloneDeep(jcPools.ydxcspools);
  1079. }
  1080. else if(key >= 4 && key <= 11){
  1081. jcPools2.ydxtopLimits1 = _.cloneDeep(jcPools.ydxtopLimits1);
  1082. jcPools2.ydxtopLimits2 = _.cloneDeep(jcPools.ydxtopLimits2);
  1083. jcPools2.ydxtopLimits3 = _.cloneDeep(jcPools.ydxtopLimits3);
  1084. jcPools2.ydxlowLimits1 = _.cloneDeep(jcPools.ydxlowLimits1);
  1085. jcPools2.ydxlowLimits2 = _.cloneDeep(jcPools.ydxlowLimits2);
  1086. jcPools2.ydxlowLimits3 = _.cloneDeep(jcPools.ydxlowLimits3);
  1087. jcPools2.ydxTopRate1 = _.cloneDeep(jcPools.ydxTopRate1);
  1088. jcPools2.ydxTopRate2 = _.cloneDeep(jcPools.ydxTopRate2);
  1089. jcPools2.ydxTopRate3 = _.cloneDeep(jcPools.ydxTopRate3);
  1090. jcPools2.ydxLowRate1 = _.cloneDeep(jcPools.ydxLowRate1);
  1091. jcPools2.ydxLowRate2 = _.cloneDeep(jcPools.ydxLowRate2);
  1092. jcPools2.ydxLowRate3 = _.cloneDeep(jcPools.ydxLowRate3);
  1093. }
  1094. }
  1095. console.warn("修改之后 jcPools2:",jcPools2)
  1096. yield jcPools2.saveAsync();
  1097. // console.warn("奖池更新了",jcPools);
  1098. // console.warn("奖池更新了222 ",jcPools2);
  1099. jcPools = null;
  1100. }
  1101. else{
  1102. return self.writeOut('value no change ', res);
  1103. }
  1104. }
  1105. else{
  1106. return self.writeOut('no jcPools! ', res);
  1107. }
  1108. return self.writeOut('999999', res);
  1109. }), app.getServerId())
  1110. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  1111. });
  1112. //ts++ //得到水果机某个字段的总和
  1113. proto.getSGATypeAllAsync = P.coroutine(function* (query, method, res) {
  1114. console.warn("manage得到水果机某个字段的总和-------------------");
  1115. var type = query['type'];
  1116. if (!type) {
  1117. return this.writeOut('fail: type error!', res);
  1118. }
  1119. var sign = query['sign'];
  1120. if (!sign) {
  1121. return this.writeOut('fail: sign error!', res);
  1122. }
  1123. if (!checkSign(sign)) {
  1124. return this.writeOut('fail: sign error!', res);
  1125. }
  1126. // let sjk = "SGJUser";
  1127. // var sgjUsers = yield this.app.models[sjk].aggregateAsync([
  1128. //像上面这样动态查询数据库也是可以的
  1129. var sgjUsers = yield this.app.models.SGJUser.aggregateAsync([
  1130. { $group: { _id: type, count: { $sum: '$'+type } } }
  1131. ]);
  1132. console.warn("聚合之后 ",type,JSON.stringify(sgjUsers));
  1133. let result = "error: nofind";
  1134. if(sgjUsers.length > 0) result = sgjUsers[0].count;
  1135. return this.writeOut(result, res);
  1136. // var startTime = 1710866910000;
  1137. // var endTime = 1711007310000;
  1138. // var opts = { registerTime: { $gte: startTime, $lt: endTime } };
  1139. // opts.playerId = "0ab@my2019";//new RegExp('.+@' + '0ab' + '$');
  1140. // var list = yield this.app.models.DiamondRecord.aggregateAsync([
  1141. // { $match: opts },
  1142. // { $group: { _id: opts.playerId, count: { $sum: '$dSwap' } } },
  1143. // { $sort: { registerTime: 1 } }
  1144. // ]);
  1145. // console.warn("聚合之后111 ",list.length,JSON.stringify(list));
  1146. // var startTime = 1710866910000;
  1147. // var endTime = 1711007310000;
  1148. // var opts = { registerTime: { $gte: startTime, $lt: endTime } };
  1149. // // opts.playerId = "0ab@my2019";//new RegExp('.+@' + '0ab' + '$');
  1150. // var list = yield this.app.models.SGJUser.aggregateAsync([
  1151. // { $match: opts },
  1152. // { $group: { _id: "xxxxx", count: { $sum: '$cost' } } },
  1153. // { $sort: { registerTime: 1 } }
  1154. // ]);
  1155. // console.warn("聚合之后111 ",list.length,JSON.stringify(list));
  1156. });
  1157. //ts++ 水果机任务发奖完成
  1158. proto.sgjRWFJOverAsync = P.coroutine(function* (query, method, res) {
  1159. console.warn("manage水果机任务发奖完成-------------------");
  1160. // var fjinfo = query['fjinfo'] || "";
  1161. // console.warn("manage水果机任务发奖完成------------------- ",fjinfo);
  1162. var pid = query['pid'];
  1163. if (!pid) {
  1164. return this.writeOut('fail: pid error!', res);
  1165. }
  1166. var type = Number(query['type']) || 0;
  1167. if (!type) {
  1168. return this.writeOut('fail: type error!', res);
  1169. }
  1170. var rwid = query['rwid'];
  1171. if (type == 2 && !rwid) {
  1172. return this.writeOut('fail: rwid error!', res);
  1173. }
  1174. var fqs = Number(query['fqs']) || 0;
  1175. if (type == 2 && !fqs) {
  1176. return this.writeOut('fail: fqs error!', res);
  1177. }
  1178. var fqtime = Number(query['fqtime']) || 0;
  1179. if (!fqtime) {
  1180. return this.writeOut('fail: fqtime error!', res);
  1181. }
  1182. var sign = query['sign'];
  1183. if (!sign) {
  1184. return this.writeOut('fail: sign error!', res);
  1185. }
  1186. if (!checkSign(sign)) {
  1187. return this.writeOut('fail: sign error!', res);
  1188. }
  1189. console.warn("manage水果机任务发奖完成-------------------",pid,type,rwid,fqs,fqtime);
  1190. var self = this;
  1191. var app = this.app;
  1192. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  1193. if(type == 1){
  1194. var sgjUser = yield app.models.SGJUser.findByIdAsync(pid, 'zfbAcc zfbName zfbBindTime');
  1195. if (sgjUser) {
  1196. if(Date.now() - sgjUser.zfbBindTime < 86400000 ) return self.writeOut('one day no more once! ', res);
  1197. console.warn("?????找到用户了 ",fqs,fqtime);
  1198. if(fqs){
  1199. sgjUser.zfbBindTime = fqtime;
  1200. }
  1201. else{
  1202. sgjUser.zfbAcc = "";
  1203. sgjUser.zfbName = "";
  1204. }
  1205. yield sgjUser.saveAsync();
  1206. }
  1207. else{
  1208. return self.writeOut('pid value error! ', res);
  1209. }
  1210. }
  1211. else if(type == 2){
  1212. var taskInfo = yield app.models.SGJTask.findByIdAsync(rwid, 'playerId rewards state fjTime');
  1213. if (taskInfo) {
  1214. if(fqs != taskInfo.rewards){
  1215. return self.writeOut('fail: fqs value error!', res);
  1216. }
  1217. if(pid != taskInfo.playerId){
  1218. return self.writeOut('fail: pid value error!', res);
  1219. }
  1220. if(taskInfo.state != 2 || taskInfo.fjTime != 0){
  1221. return self.writeOut('fail: Cannot be claimed repeatedly!', res);
  1222. }
  1223. taskInfo.state = 3; //任务状态0:未完成,1:已完成,2:发奖中,3:已发奖
  1224. taskInfo.fjTime = fqtime; //发奖时间
  1225. console.warn("发奖成功之后更新任务状态 ");
  1226. yield taskInfo.saveAsync();
  1227. var sgjUser = yield app.models.SGJUser.findByIdAsync(pid, 'taskReward jxzReward');
  1228. if (sgjUser) {
  1229. sgjUser.jxzReward -= fqs;
  1230. sgjUser.taskReward += fqs;
  1231. yield sgjUser.saveAsync();
  1232. }
  1233. }
  1234. else{
  1235. logger.warn("rwjlzj(rwid) error");////cssj
  1236. return self.writeOut('rwjlzj(rwid) error! :', res);
  1237. }
  1238. }
  1239. return self.writeOut('999999', res);
  1240. }), app.getServerId())
  1241. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  1242. });
  1243. //ts++ 后台给玩家发邮件
  1244. proto.addMailAsync = P.coroutine(function* (query, method, res) {
  1245. // console.warn("后台给玩家发邮件-------------------");
  1246. var playerId = query['playerid'];
  1247. if (!playerId) {
  1248. return this.writeOut('fail: playerid error!', res);
  1249. }
  1250. var userId = query['userid'];
  1251. if (!userId) {
  1252. return this.writeOut('fail: userid error!', res);
  1253. }
  1254. var tittleT = Number(query['tittleT']) || 0;;
  1255. if (!tittleT) {
  1256. return this.writeOut('fail: tittleT error!', res);
  1257. }
  1258. var descT = Number(query['descT']) || 0;;
  1259. if (!descT) {
  1260. return this.writeOut('fail: descT error!', res);
  1261. }
  1262. var reward = Number(query['reward']) || 0;;
  1263. var rewardT = Number(query['rewardT']) || 0;
  1264. var rewardC = Number(query['rewardC']) || 0;
  1265. if (reward) {
  1266. if(!rewardT || !rewardC){
  1267. return this.writeOut('fail: rewardT or rewardC error!', res);
  1268. }
  1269. }
  1270. else{
  1271. if(rewardT){
  1272. return this.writeOut('fail: rewardT error!', res);
  1273. }
  1274. if(rewardC){
  1275. return this.writeOut('fail: rewardC error!', res);
  1276. }
  1277. }
  1278. var form = query['form'];
  1279. if (!form) {
  1280. return this.writeOut('fail: form error!', res);
  1281. }
  1282. var sign = query['sign'];
  1283. if (!sign) {
  1284. return this.writeOut('fail: sign error!', res);
  1285. }
  1286. if (!checkSign(sign)) {
  1287. return this.writeOut('fail: sign error!', res);
  1288. }
  1289. var self = this;
  1290. var app = this.app;
  1291. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  1292. let receive = 1;
  1293. if(reward) receive = 0;
  1294. var mail = yield app.models.Mails.findByIdAsync(playerId, 'mailInfos');
  1295. if (mail) {
  1296. let item = {
  1297. _id: "",
  1298. index: mail.mailInfos.length, // 邮件下标
  1299. tittleT: tittleT, // 邮件标题类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  1300. descT: descT, // 邮件内容类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  1301. reward: reward, // 有无奖励 0:无奖励 1:有奖励
  1302. rewardT: rewardT, // 奖励类型 0:未定义 1:钻石,
  1303. rewardC: rewardC, // 奖励数量
  1304. receive: receive, // 是否领取 0:未领取 1:已领取
  1305. read: 0, // 是否已读 0:未读 1:已读
  1306. form:form, //邮件来源
  1307. sendTime: Date.now() // 发送日期
  1308. }
  1309. let newItem = _.clone(mail.mailInfos);
  1310. let newItem2 = [0].concat(newItem);
  1311. newItem2[0] = item;
  1312. if(newItem2.length > 60){
  1313. newItem2 = newItem2.slice(0,60)
  1314. }
  1315. mail.mailInfos = [];
  1316. mail.mailInfos = _.clone(newItem2);
  1317. yield mail.saveAsync();
  1318. }
  1319. else{
  1320. let item = {
  1321. _id: "",
  1322. index: 0, // 邮件下标
  1323. tittleT: tittleT, // 邮件标题类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  1324. descT: descT, // 邮件内容类型 0:未定义 1:普通通知 2:有奖励通知 3:补偿通知 4:版本更新通知
  1325. reward: reward, // 有无奖励 0:无奖励 1:有奖励
  1326. rewardT: rewardT, // 奖励类型 0:未定义 1:钻石,
  1327. rewardC: rewardC, // 奖励数量
  1328. receive: receive, // 是否领取 0:未领取 1:已领取
  1329. read: 0, // 是否已读 0:未读 1:已读
  1330. form:form, //邮件来源
  1331. sendTime: Date.now() // 发送日期
  1332. }
  1333. let newItem = [];
  1334. newItem[0] = item;
  1335. var newMail = new app.models.Mails({
  1336. _id: playerId, // 用户id(player表的主键)
  1337. userId: userId, // 用户的userId
  1338. mailInfos: newItem // 该活动的达成条件和奖励信息列表
  1339. });
  1340. yield newMail.saveAsync();
  1341. }
  1342. return self.writeOut('999999', res);
  1343. }), app.getServerId())
  1344. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  1345. });
  1346. ////// ts++ 显示uid和实际uid互相转换
  1347. proto.sidAridChangeAsync = P.coroutine(function* (query, method, res) {
  1348. // console.warn("显示uid和实际uid互相转换-------------------");
  1349. var type = Number(query['type']) || 0;;
  1350. if (type != 1 && type != 2) {
  1351. return this.writeOut('fail: type error!', res);
  1352. }
  1353. var id = Number(query['id']) || 0;;
  1354. if (id < 100000 && id > 999999) {
  1355. return this.writeOut('fail: id error!', res);
  1356. }
  1357. // console.warn("显示uid和实际uid互相转换 type "+type+" id "+id);
  1358. var sign = query['sign'];
  1359. if (!sign) {
  1360. return this.writeOut('fail: sign error!', res);
  1361. }
  1362. if (!checkSign(sign)) {
  1363. return this.writeOut('fail: sign error!', res);
  1364. }
  1365. let result = "";
  1366. if(type == 1) result = this.jiami(id);
  1367. else if(type == 2) result = ""+this.jiemi(id);
  1368. var self = this;
  1369. var app = this.app;
  1370. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  1371. let data = {
  1372. code:201,
  1373. newId:0
  1374. }
  1375. if(result.length == 6){
  1376. data.code = 200;
  1377. data.newId = result;
  1378. }
  1379. let dataStr = JSON.stringify(data)
  1380. return self.writeOut(dataStr, res);
  1381. }), app.getServerId())
  1382. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  1383. });
  1384. proto.jiami = function (_oldid) {
  1385. let oldid = String(_oldid);
  1386. // console.warn("111 加密参数 oldid "+oldid);
  1387. let numList = [];
  1388. for (var i = 0; i < oldid.length; i++) {
  1389. // numList[i] = (parseInt(oldid[i])+i+1)%10;
  1390. numList[i] = (parseInt(oldid[i])+i)%10;
  1391. // console.warn("222 numList[i] "+numList[i]);
  1392. }
  1393. // console.warn("333 "+JSON.stringify(numList));
  1394. //这种交换方式会使加密后结果转换成数字之后是个小于6位数的数字,其中987654这个加密之后是0
  1395. // let jh1 = numList[0];
  1396. // numList[0] = numList[4];
  1397. // numList[4] = jh1;
  1398. let jh1 = numList[1];
  1399. numList[1] = numList[3];
  1400. numList[3] = jh1;
  1401. // console.warn("444 [0]和[4]交换 "+JSON.stringify(numList));
  1402. let jh2 = numList[2];
  1403. numList[2] = numList[5];
  1404. numList[5] = jh2;
  1405. let newid = "";
  1406. // console.warn("555 [2]和[5]交换 "+JSON.stringify(numList));
  1407. for (var i = 0; i < numList.length; i++) {
  1408. newid+=numList[i];
  1409. }
  1410. // console.warn("666 加密最终的 "+newid);
  1411. return newid;
  1412. // return parseInt(newid);
  1413. };
  1414. proto.jiemi = function (_oldid) {
  1415. let oldid = String(_oldid);
  1416. // console.warn("111 解密参数 oldid "+oldid);
  1417. let numList = [];
  1418. for (var i = 0; i < oldid.length; i++) {
  1419. numList[i] = parseInt(oldid[i]);
  1420. // console.warn("222 numList[i] "+numList[i]);
  1421. }
  1422. // console.warn("333 "+JSON.stringify(numList));
  1423. // let jh1 = numList[0];
  1424. // numList[0] = numList[4];
  1425. // numList[4] = jh1;
  1426. let jh1 = numList[1];
  1427. numList[1] = numList[3];
  1428. numList[3] = jh1;
  1429. // console.warn("444 [0]和[4]交换 "+JSON.stringify(numList));
  1430. let jh2 = numList[2];
  1431. numList[2] = numList[5];
  1432. numList[5] = jh2;
  1433. let numList2 = []
  1434. for (var i = 0; i < oldid.length; i++) {
  1435. // numList2[i] = (numList[i]+9-i)%10;
  1436. numList2[i] = (numList[i]+10-i)%10;
  1437. // console.warn("2 numList[i] "+numList[i]);
  1438. }
  1439. // console.warn("555 [2]和[5]交换 "+JSON.stringify(numList));
  1440. let newid = "";
  1441. for (var i = 0; i < numList2.length; i++) {
  1442. newid+=numList2[i];
  1443. }
  1444. // console.warn("666 解密最终的 "+newid);
  1445. return parseInt(newid);
  1446. };
  1447. //后台增加比赛的开始和结束时间
  1448. proto.addRaceTimeAsync = P.coroutine(function* (query, method, res) {
  1449. console.warn("addRaceTimeAsync 后台增加比赛的开始和结束时间");
  1450. var aid = query['aid'];
  1451. if (!aid) {
  1452. return this.writeOut('fail: aid error!', res);
  1453. }
  1454. var anumber = parseInt(query['anumber']) || 0;
  1455. if (!anumber) {
  1456. return this.writeOut('fail: anumber error!', res);
  1457. }
  1458. var stime = Number(query['stime']) || 0;;
  1459. if (!stime) {
  1460. return this.writeOut('fail: stime error!', res);
  1461. }
  1462. var etime = Number(query['etime']) || 0;;
  1463. if (!etime) {
  1464. return this.writeOut('fail: etime error!', res);
  1465. }
  1466. if(stime >= etime) return this.writeOut('fail: stime or etime error!', res);
  1467. var outTime = Number(query['outTime']) || (etime+90*60000);//默认90分钟之后过期
  1468. if (!outTime) {
  1469. return this.writeOut('fail: outTime error!', res);
  1470. }
  1471. if (outTime < etime+40*60000) {
  1472. return this.writeOut('过期时间必须为结束时间40分钟之后', res);
  1473. }
  1474. var bigRound = Number(query['bigRound']) || 3;
  1475. if (!bigRound) {
  1476. return this.writeOut('fail: bigRound error!', res);
  1477. }
  1478. var gameid = Number(query['gameid']) || 10008;
  1479. if (!gameid) {
  1480. return this.writeOut('fail: gameid error!', res);
  1481. }
  1482. var round = Number(query['round']) || 10;
  1483. if (!round) {
  1484. return this.writeOut('fail: round error!', res);
  1485. }
  1486. var player = Number(query['player']) || 3;
  1487. if (!player) {
  1488. return this.writeOut('fail: player error!', res);
  1489. }
  1490. var other = Number(query['other']) || 74;
  1491. if (!other) {
  1492. return this.writeOut('fail: other error!', res);
  1493. }
  1494. var sign = query['sign'];
  1495. if (!sign) {
  1496. return this.writeOut('fail: sign error!', res);
  1497. }
  1498. if (!checkSign(sign)) {
  1499. return this.writeOut('fail: sign error!', res);
  1500. }
  1501. var self = this;
  1502. var app = this.app;
  1503. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  1504. let stimeSJC = self.getzdLDSJC(stime);
  1505. var opts = {
  1506. stime: { $gte: stimeSJC, $lt: stimeSJC+86400000},
  1507. };
  1508. opts['aid'] = aid;
  1509. let timelist = yield app.models.RaceTimeInfos.findMongoAsync(opts, 'aid agentNo stime etime bigRound gameId round playerCount other outTime', { sort: { stime: 1 } });
  1510. for (var i = 0; i < timelist.length; i++) {
  1511. if(timelist[i].outTime >= stime){
  1512. return self.writeOut('新开比赛场次开始时间不能小于现有场次的过期时间', res);//一个群推广目前一天只能开一场比赛
  1513. }
  1514. }
  1515. var newRaceTime = new app.models.RaceTimeInfos({
  1516. _id: uuid.v1(), // UUID 标识
  1517. aid: aid, // 比赛代理的标识
  1518. agentNo: anumber,// 比赛代理编号
  1519. stime: stime, // 该次比赛的开始时间
  1520. etime: etime, // 该次比赛的结束时间
  1521. bigRound: bigRound,// 该次比赛的大局数量,统计战绩时使用
  1522. gameId: gameid, // 该次比赛的游戏id 10006为长沙麻将,10007为红中麻将,10008为跑得快
  1523. round: round, // 该次比赛的游戏局数
  1524. playerCount: player, // 该次比赛的游戏人数
  1525. other: other, // 该次比赛的游戏规则
  1526. outTime: outTime, //1:未过期,2已过期
  1527. yljList: [] // 该次比赛已领奖人员id数组
  1528. });
  1529. yield newRaceTime.saveAsync();
  1530. return self.writeOut('999999', res);
  1531. }), app.getServerId())
  1532. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  1533. });
  1534. ////后台设置比赛是否过期
  1535. proto.setRaceTimeOutAsync = P.coroutine(function* (query, method, res) {
  1536. // console.warn("setRaceTimeOutAsync 后台设置比赛是否过期");
  1537. var id = query['id'] || "";//需要修改的比赛场次的id(主键)
  1538. if (!id) {
  1539. return this.writeOut('fail: id error!', res);
  1540. }
  1541. var sign = query['sign'];
  1542. if (!sign) {
  1543. return this.writeOut('fail: sign error!', res);
  1544. }
  1545. if (!checkSign(sign)) {
  1546. return this.writeOut('fail: sign error!', res);
  1547. }
  1548. var self = this;
  1549. var app = this.app;
  1550. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  1551. var raceTime = yield app.models.RaceTimeInfos.findByIdAsync(id, '_id aid outTime stime etime yljList');
  1552. if (raceTime) {
  1553. let outTime = Number(query['outTime']) || (raceTime.etime + 6000000);//默认60分钟之后过期
  1554. // console.warn("后台设置比赛是否过期 id "+id+" etime "+raceTime.etime+" outTime "+raceTime.outTime+" type "+type);
  1555. if(raceTime.etime + 2400000 >= outTime){//结束40分钟之后才能设置为过期
  1556. return self.writeOut('过期时间必须为结束时间40分钟之后', res);
  1557. }
  1558. if(self.getzdLDSJC(raceTime.stime) != self.getzdLDSJC(outTime)){//结束40分钟之后才能设置为过期
  1559. return self.writeOut('过期时间和开始时间必须是同一天', res);
  1560. }
  1561. let stimeSJC = self.getzdLDSJC(raceTime.stime);
  1562. var opts = {
  1563. stime: { $gte: stimeSJC, $lt: stimeSJC+86400000},
  1564. };
  1565. opts['aid'] = raceTime.aid;
  1566. let timelist = yield app.models.RaceTimeInfos.findMongoAsync(opts, '_id aid stime etime outTime', { sort: { stime: 1 } });
  1567. // console.warn(">>>>>>>>>>>>>>>.. "+timelist.length);
  1568. for (var i = 0; i < timelist.length; i++) {
  1569. if(raceTime.stime > timelist[i].stime) continue;
  1570. if(raceTime._id == timelist[i]._id) continue;
  1571. if(timelist[i].stime <= outTime){
  1572. return self.writeOut('本场过期时间不能和现有比赛场次的时间重合', res);//一个群推广目前一天只能开一场比赛
  1573. }
  1574. }
  1575. if(raceTime.outTime != outTime){
  1576. raceTime.outTime = outTime;
  1577. yield raceTime.saveAsync();
  1578. // console.warn("设置设置 grade -------------------修改");
  1579. }
  1580. return self.writeOut('999999', res);
  1581. }
  1582. else{
  1583. return self.writeOut('not fid raceTime by id : '+id, res);
  1584. }
  1585. }), app.getServerId())
  1586. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  1587. });
  1588. //////后台增设置不能在同一桌游戏的玩家
  1589. proto.setNotGameTogtherAsync = P.coroutine(function* (query, method, res) {
  1590. // console.warn("setNotGameTogtherAsync 后台增设置不能在同一桌游戏的玩家");
  1591. var type = Number(query['type']) || 0;//操作类型
  1592. var id = query['id'] || "";
  1593. var uid1 = Number(query['uid1']) || 0;
  1594. var uid2 = Number(query['uid2']) || 0;//删除整条的时候此值可不传
  1595. // console.warn("后台增设置不能在同一桌游戏的玩家 type "+type+" id "+id+" uid1 "+uid1+" uid2 "+uid2);
  1596. if (type == 1) {//1:增加,2:删除整条,3:删除某条中某一个
  1597. if (!uid1) return this.writeOut('fail: no uid1 !', res);
  1598. if (!uid2) return this.writeOut('fail: no uid2 !', res);
  1599. if (uid1 == uid2) return this.writeOut('fail: uid1 和 uid2 不能相同', res);
  1600. }
  1601. else if (type == 2) {//1:增加,2:删除整条,3:删除某条中某一个
  1602. if (!id) return this.writeOut('fail: no id !', res);
  1603. }
  1604. else if (type == 3) {//1:增加,2:删除整条,3:删除某条中某一个
  1605. if (!id) return this.writeOut('fail: no id。', res);
  1606. if (!uid1) return this.writeOut('fail: no uid1。', res);
  1607. }
  1608. else return this.writeOut('fail: no type !', res);
  1609. var sign = query['sign']||"";
  1610. if (!sign) {
  1611. return this.writeOut('fail: sign error!', res);
  1612. }
  1613. if (!checkSign(sign)) {
  1614. return this.writeOut('fail: sign error!', res);
  1615. }
  1616. var self = this;
  1617. var app = this.app;
  1618. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  1619. if(type == 1){
  1620. let pid1 = "";
  1621. var players1 = yield app.models.Player.findMongoAsync({ userId: uid1 },'_id userId name');
  1622. if (players1.length == 1) {
  1623. pid1 = players1[0]._id;
  1624. }
  1625. else {
  1626. return self.writeOut('fail: uid1 error!', res);
  1627. }
  1628. let pid2 = "";
  1629. var players2 = yield app.models.Player.findMongoAsync({ userId: uid2 },'_id userId name');
  1630. if (players2.length == 1) {
  1631. pid2 = players2[0]._id;
  1632. }
  1633. else{
  1634. return self.writeOut('fail: uid2 error!', res);
  1635. }
  1636. let newList = [];
  1637. let newPList = [];
  1638. var notTogthers1 = yield app.models.NotGameTogther.findMongoAsync({ uidList: uid1 },'_id uidList pidList');
  1639. if(notTogthers1.length == 0) {
  1640. newList[newList.length] = uid1;
  1641. newPList[newPList.length] = pid1;
  1642. }
  1643. for (var i = 0; i < notTogthers1.length; i++) {
  1644. // console.warn("包含uid1的数组 111 "+i+" "+JSON.stringify(notTogthers1[i].uidList));
  1645. for (var j = 0; j < notTogthers1[i].uidList.length; j++) {
  1646. let item = notTogthers1[i].uidList[j];
  1647. let itemP = notTogthers1[i].pidList[j];
  1648. if(newList.indexOf(item) == -1){
  1649. newList[newList.length] = item;
  1650. newPList[newPList.length] = itemP;
  1651. }
  1652. }
  1653. yield notTogthers1[i].removeAsync();
  1654. }
  1655. // console.warn("处理完uid1之后的newlist 111 "+JSON.stringify(newList));
  1656. var notTogthers2 = yield app.models.NotGameTogther.findMongoAsync({ uidList: uid2 },'_id uidList pidList');
  1657. if(notTogthers2.length == 0) {
  1658. newList[newList.length] = uid2;
  1659. newPList[newPList.length] = pid2;
  1660. }
  1661. for (var i = 0; i < notTogthers2.length; i++) {
  1662. // console.warn("包含uid1的数组 111 "+i+" "+JSON.stringify(notTogthers2[i].uidList));
  1663. for (var j = 0; j < notTogthers2[i].uidList.length; j++) {
  1664. let item = notTogthers2[i].uidList[j];
  1665. let itemP = notTogthers2[i].pidList[j];
  1666. if(newList.indexOf(item) == -1){
  1667. newList[newList.length] = item;
  1668. newPList[newPList.length] = itemP;
  1669. }
  1670. }
  1671. yield notTogthers2[i].removeAsync();
  1672. }
  1673. // console.warn("处理完uid2之后的newlist 111 "+JSON.stringify(newList));
  1674. if(newList.length == 0) {
  1675. newList = [uid1,uid2];
  1676. newPList = [pid1,pid2];
  1677. }
  1678. var newNotTogther = new app.models.NotGameTogther({
  1679. _id: uuid.v1(), // UUID 标识
  1680. uidList: _.cloneDeep(newList), // 不能在同一桌游戏的玩家userid
  1681. pidList: _.cloneDeep(newPList) // 不能在同一桌游戏的玩家_id
  1682. });
  1683. yield newNotTogther.saveAsync();
  1684. // console.warn("?????????555 ");
  1685. }
  1686. else if(type == 2){
  1687. var notTogther = yield app.models.NotGameTogther.findByIdAsync(id, '_id uidList');
  1688. if (notTogther) {
  1689. // console.warn("找到了");
  1690. yield notTogther.removeAsync();
  1691. }
  1692. else{
  1693. return self.writeOut('fail: id error!', res);
  1694. }
  1695. }
  1696. else if(type == 3){
  1697. var notTogther = yield app.models.NotGameTogther.findByIdAsync(id, '_id uidList pidList');
  1698. if (notTogther) {
  1699. let newuidList = [];
  1700. let newpidList = [];
  1701. for (var i = 0; i < notTogther.uidList.length; i++) {
  1702. if(notTogther.uidList[i] != uid1){
  1703. newuidList[newuidList.length] = notTogther.uidList[i];
  1704. newpidList[newpidList.length] = notTogther.pidList[i];
  1705. }
  1706. }
  1707. if(newuidList.length == notTogther.uidList.length){
  1708. return self.writeOut('fail: uid1 not find!', res);
  1709. }
  1710. else{
  1711. if(newuidList.length > 1){
  1712. notTogther.uidList = _.cloneDeep(newuidList);
  1713. notTogther.pidList = _.cloneDeep(newpidList);
  1714. yield notTogther.saveAsync();
  1715. }
  1716. else{
  1717. yield notTogther.removeAsync();
  1718. }
  1719. }
  1720. }
  1721. else{
  1722. return self.writeOut('fail: id error!', res);
  1723. }
  1724. }
  1725. return self.writeOut('999999', res);
  1726. }), app.getServerId())
  1727. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  1728. });
  1729. //后台设置玩家禁赛
  1730. proto.setJinSaiAsync = P.coroutine(function* (query, method, res) {
  1731. console.warn("setJinSaiAsync 后台设置玩家禁赛");
  1732. var pid = query['id'];
  1733. if (!pid) {
  1734. return this.writeOut('fail: pid error!', res);
  1735. }
  1736. var uid = parseInt(query['uid']) || 0;
  1737. if (!uid) {
  1738. return this.writeOut('fail: uid error!', res);
  1739. }
  1740. // var stime = Number(query['stime']) || 0;;
  1741. // if (!stime) {
  1742. // return this.writeOut('fail: stime error!', res);
  1743. // }
  1744. var sign = query['sign'];
  1745. if (!sign) {
  1746. return this.writeOut('fail: sign error!', res);
  1747. }
  1748. if (!checkSign(sign)) {
  1749. return this.writeOut('fail: sign error!', res);
  1750. }
  1751. var self = this;
  1752. var app = this.app;
  1753. return app.memdb.goose.transactionAsync(P.coroutine(function* () {
  1754. var jinsai = yield app.models.JinSaiInfo.findByIdAsync(pid, '_id userId');
  1755. if (jinsai) {
  1756. yield jinsai.removeAsync();
  1757. }
  1758. else{
  1759. var jinsaiinfo = new app.models.JinSaiInfo({
  1760. _id: pid, // UUID 标识
  1761. userId: uid // 比赛代理的标识
  1762. });
  1763. yield jinsaiinfo.saveAsync();
  1764. }
  1765. return self.writeOut('999999', res);
  1766. }), app.getServerId())
  1767. .then(() => app.event.emit('transactionSuccess'), () => app.event.emit('transactionFail'));
  1768. });
  1769. //TL++,得到指定时间戳(_time)当日0点的时间戳
  1770. proto.getzdLDSJC = function (_time){
  1771. var today = new Date(_time);
  1772. today.setHours(0);
  1773. today.setMinutes(0);
  1774. today.setSeconds(0);
  1775. today.setMilliseconds(0);
  1776. let jrsjc = today.getTime();
  1777. // console.warn("111得到今日0点的时间戳 ",jrsjc, typeof jrsjc);
  1778. return jrsjc;
  1779. };
  1780. //ts++签名验证
  1781. function checkSign(sign) {
  1782. var signKey = 'defe6d21422c8b770767f74fcea95';
  1783. if (sign!=signKey) return false;
  1784. return true;
  1785. };
  1786. proto.getTodaySJC = function (){
  1787. var today = new Date();
  1788. today.setHours(0);
  1789. today.setMinutes(0);
  1790. today.setSeconds(0);
  1791. today.setMilliseconds(0);
  1792. let jrsjc = today.getTime();
  1793. // console.warn("111得到今日0点的时间戳 ",jrsjc, typeof jrsjc);
  1794. return jrsjc;
  1795. };