table.js 130 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751
  1. 'use strict';
  2. var https = require('https');
  3. var http = require('http');
  4. var md5 = require('md5');
  5. var util = require('util');
  6. var quick = require('quick-pomelo');
  7. var P = quick.Promise;
  8. var cor = P.coroutine;
  9. var _ = require('lodash');/////是一个一致性、模块化、高性能的 JavaScript 实用工具库。
  10. //// 为什么选择 Lodash ?
  11. //// Lodash 通过降低 array、number、objects、string 等等的使用难度从而让 JavaScript 变得更简单。
  12. //// Lodash 的模块化方法 非常适用于:
  13. //// 遍历 array、object 和 string
  14. //// 对值进行操作和检测
  15. //// 创建符合功能的函数
  16. var uuid = require('node-uuid');
  17. var Logic = require('./logic');
  18. var User = require('./user');
  19. var Score = require('./score');
  20. var conf = require('../config/games').paodekuai || {};
  21. var M = require('../../share/message');
  22. var C = require('../../share/constant');
  23. var paiJuHuiFang = require('../../share/paiJuHuiFang');//////TL++ 牌局回放
  24. var configCommon = require('../../share/configCommon');//////TL++配置相关的公共方法
  25. var setReabte = require('../../share/setReabte');//////TL++记录返利相关的公共方法
  26. var logger = quick.logger.getLogger('fhmj', __filename);
  27. // 桌子状态
  28. var STATE = { FREE: 1, PLAYING: 2, FREE2: 3 , END: 4};//ts++REFREE 二次空闲 END结束
  29. // 结算模式
  30. var MODE = { NORMAL: 1, NOCARD: 2, OFFLINE: 3 };
  31. //ts++结束模式 空闲0,游戏中1, 正常结束3,房主解散3,断线解散4,断线解散5,系统解散6
  32. var ENDMODE = { FREE: 0,PLAYING: 1, OWNEREND: 2,NORMALEND: 3,REGEND: 4, OFFLINEEND: 5, SYSTEMEND: 6 };
  33. // 金币消耗
  34. const COSTS = conf.sit_costs || {};
  35. /////TL++,下面这几行为了记录用户行为
  36. // var log4js2 = require("log4js");////cssj
  37. // var log4js_config2 = require("./logConf.json");
  38. // log4js2.configure(log4js_config2);
  39. // var LogFile2 = log4js2.getLogger('log_file');////cssj
  40. var checkVersion = function () {
  41. // let confCodeVer = require('../config/VersionConfig').codeVer || {};
  42. // // console.warn("pdk的table中检查logic版本111 "+JSON.stringify(confCodeVer));
  43. // if(confCodeVer.sgjLogic){
  44. // delete require.cache[require.resolve('../config/VersionConfig')];
  45. // let confCodeVer2 = require('../config/VersionConfig').codeVer || {};
  46. // // console.warn("pdk的table中检查logic版本222 "+confCodeVer.sgjLogic +" "+ confCodeVer2.sgjLogic);
  47. // if(confCodeVer.sgjLogic && confCodeVer2.sgjLogic && confCodeVer.sgjLogic != confCodeVer2.sgjLogic){
  48. // delete require.cache[require.resolve('./logic')];
  49. // Logic = require('./logic');
  50. // console.warn("sgj的table中的logic更新了 ")
  51. // }
  52. // }
  53. }
  54. // 构造方法
  55. var Table = function (cPlayerId,cUserId,cName,cHead,game, id, cell, round, type,gameKindTL,playerAllCount,upId,other,agentId,yxndlbTime,yxndlbTip) {
  56. let str3 = "table构造方法.......id: "+id + " type " + type+" game "+game.id;
  57. logger.warn(str3);////cssj
  58. checkVersion();
  59. this.app = game.app;
  60. this.gameId = 10005;
  61. this.game = game;
  62. this.id = id;
  63. this.recordid = uuid.v1()+'_'+id;//ts++唯一记录
  64. this.upId = upId;//ts++上局的ID
  65. this.type = type;
  66. this.agentId=agentId;
  67. this.yxndlbTime = yxndlbTime;
  68. this.yxndlbTip = yxndlbTip;
  69. var num_cost = 0;
  70. this.other = other;//////TL++2人3人的游戏规则
  71. // console.warn("222创建房间的other",other,this.other," gameKindTL ",gameKindTL," type " ,type);
  72. this.cost = num_cost;
  73. this.over = 0;
  74. this.round = round;
  75. this.stime = 0;
  76. this.ctime = Date.now();
  77. this.etime = 0;
  78. // 人数
  79. this.ccount = playerAllCount;//Logic.CHAIR_COUNT;
  80. // 房主
  81. this.ownerChairId = -1;//房主的chairid
  82. this.ownerId = cPlayerId;//房主Id
  83. this.ownerUid = cUserId;//房主的userID
  84. this.ownerName = cName;
  85. this.ownerHeadUrl = cHead;
  86. // 数据
  87. var logic = new Logic(type,gameKindTL,playerAllCount,other);
  88. this.logic = logic;
  89. // this.logic.testFloat();
  90. // this.logic.testSendCards();
  91. this.score = new Score(this);
  92. this.users = [];
  93. this.fpRes = {};//本局的发牌
  94. this.ydxfpRes = {
  95. cs:0,//本局押大小的次数,用于实现只能在首次押大小之前点击加分
  96. type: -1,//本局玩家上次押大小的类型,-1表示还未押过大小,1表示押小2表示押大
  97. number: -1,//本局玩家上次押大小的发牌,-1表示还未押过大小
  98. };//本局的押大小发牌
  99. this.nowDiamond = 0;//玩家目前游戏内的钻石(带入的)
  100. this.nowDiamond2 = 0;//玩家目前游戏外的钻石(所有的减去带入的)
  101. this.wjcsDiamond = -1;//玩家进入房间初始的钻石数,用于判断离开的时候是否需要记录钻石变更
  102. this.yazhus = [];//玩家本次押注情况
  103. this.win = 0;//本局结果赢得分数(不包含下注的即winsList元素总和)用于判断用户是否可以押分
  104. this.yxjlid = "";//ts++游戏记录id
  105. // console.warn("构造方法 "+this.users.length+" "+JSON.stringify(this.users));
  106. this.wjrwxylb = [];//玩家已领未完成任务需要的任务要求列表
  107. //下面是统计每日数据用
  108. this.zqqCost = 0; //所有玩家游戏转圈总下注
  109. this.zqqwin = 0; //所有玩家游戏转圈总赢得
  110. this.zqqxh = 0; //所有玩家游戏转圈总消耗(总下注-总赢得)
  111. this.ydxCost = 0; //所有玩家押大小总下注
  112. this.ydxwin = 0; //所有玩家押大小总赢得
  113. this.ydxxh = 0; //所有玩家押大小总消耗(总下注-总赢得)
  114. this.ydxzcs = 0; //该日押大小总次数
  115. this.allrwq = 0; //所有奖券产生总量
  116. this.rwxhjq1 = 0; //钻石任务消耗奖券总量(领任务时记录)
  117. this.rwxhjq2 = 0; //RMB任务消耗奖券总量(领任务时记录)
  118. this.rwdcze1 = 0; //钻石任务兑出总额(领奖时记录)
  119. this.rwdcze2 = 0; //RMB(分)任务兑出总额(领奖时记录)
  120. //下面是统计总数据用
  121. this.allCost = 0; //所有玩家总下注
  122. this.allwin = 0; //所有玩家总赢得
  123. this.allxh = 0; //所有玩家总消耗(总下注-总赢得)
  124. // 下面这两个数据是长度为8的数组,分别代表[苹果,橙子,芒果,铃铛,西瓜,星星,七七,王王]
  125. this.allyzze = []; //总押注总额列表
  126. this.allydze = []; //总赢得总额列表(不包含特殊项)
  127. for (var i = 0; i < 8; i++) {
  128. this.allyzze[i] = 0; //总押注总额列表
  129. this.allydze[i] = 0; //总赢得总额列表(不包含特殊项)
  130. }
  131. // 下面这两个数据是长度为16的数组,分别代表[大苹果,大橙子,大芒果,大铃铛,大西瓜,大星星,大七七,大王王,
  132. //小苹果,小橙子,小芒果,小铃铛,小西瓜,小星星,小七七,小王王]
  133. this.gxzydze = []; //各项总赢得总额列表(不包含特殊项)
  134. this.gxcxzcs = []; //各项出现总次数列表(不包含特殊项)
  135. for (var i = 0; i < this.logic.cardKindCount; i++) {
  136. this.gxzydze[i] = 0; //各项总赢得总额列表(不包含特殊项)
  137. this.gxcxzcs[i] = 0; //各项出现总次数列表(不包含特殊项)
  138. }
  139. // 下面这两个数据是长度为3的数组,分别代表[小三元,小三元,大四喜]
  140. this.tsxzydze = [0,0,0]; //特殊项总赢得总额列表
  141. this.tsxcxzcs = [0,0,0]; //特殊项出现总次数列表
  142. this.mrrstjsj = 0;//每日人数统计时间,用于判断在游戏和押大小时是否需要统计记录昨天的人数信息实现减少数据库访问
  143. //统计数据至此完
  144. // 标记
  145. this.handCards = [];//本局发牌
  146. this.currentId = -1;
  147. this.autoReadyTimer = null;//托管中自动准备定时器
  148. // 底分
  149. this.cell = cell;
  150. // 围观者
  151. this.lookers = [];
  152. this.phbyfjlrq = 0; //排行榜已发奖励的日期(0点时间戳)
  153. this.phbfjTimer = null;//排行榜发奖定时器
  154. // 状态
  155. this.state = STATE.FREE;
  156. //断线 结束定时器
  157. this.endTimer = null;
  158. this.calculateTimer = null
  159. //结束时的继线用户 为了在销毁房间的时候让这些用户退出房间
  160. this.leaveUsers = [];
  161. //////以下全为TL++
  162. /////TL++,补花定时器,防止连续补花太快
  163. this.PJHF = new paiJuHuiFang();
  164. this.PaijuHuiFang = [];////TL++,牌局回放
  165. this.pjhffileName = [];//用于记录玩家牌局回放的json文件名
  166. this.gameKindTL = gameKindTL || 1;//平搓还是冲刺 = 1代表平搓 = 2代表冲刺
  167. this.playerAllCount = playerAllCount || 1;//游戏人数 = 2表示2人局 = 3表示3人局 = 4表示4人局
  168. this.isNeverStart = true;//游戏是否从未开始
  169. // this.sszjDataList = [];//设置实时战绩的数据
  170. this.isGameOk=false;//ts++牌局正常结束
  171. this.agentRebate=0;//ts++本局的返利
  172. // delete require.cache[require.resolve('../../share/setReabte')];
  173. // setReabte = require('../../share/setReabte');
  174. this.lsetReabte = new setReabte(this.app);
  175. // if(this.lsetReabte.getIsBS(this.agentId,this.ownerName,this.ownerUid)) this.cost = 0;//比赛免费
  176. this.lconfigCommon = new configCommon(this.app);
  177. };
  178. // 导出状态
  179. Table.STATE = STATE;
  180. //ts++ 结束模式
  181. Table.ENDMODE = ENDMODE;
  182. // 导出类
  183. module.exports = Table;
  184. // 原型对象
  185. var proto = Table.prototype;
  186. // 是否站满
  187. proto.isFull = function (playerId) {
  188. // return (this.lookers.length >= 1);
  189. // console.warn("是否站满 "+this.users.length);
  190. // console.warn("是否站满 "+JSON.stringify(this.users));
  191. return false;
  192. if(this.users.length > 0){
  193. // console.warn("是否站满222 ",this.users[0].id , playerId);
  194. if(this.users[0] && this.users[0].id == playerId) return false;
  195. return true;
  196. }
  197. };
  198. // 是否准备
  199. proto.isReady = function () {
  200. for (let user of this.users) {
  201. if (!user || !user.isReady()) return false;
  202. }
  203. return true;
  204. };
  205. // ts++是否二次准备
  206. proto.isReady2 = function () {
  207. // console.warn("sgjtable 是否二次准备");
  208. for (let user of this.users) {
  209. if (!user || !user.isReady2()) return false;
  210. }
  211. return true;
  212. };
  213. // 是否全在线
  214. proto.isOnline = function () {
  215. for (let user of this.users) {
  216. if (user && user.isOffline()) return false;
  217. }
  218. return true;
  219. };
  220. // 重置本局
  221. proto.resetRound = function () {
  222. };
  223. // 发送消息
  224. proto.pushMsgAsync = cor(function* (cidOrIds, route, msg) {
  225. // console.warn("444WWWWWWWTTTTTT",cidOrIds, route, msg);
  226. var playerIds = [];
  227. if (Array.isArray(cidOrIds)) playerIds = cidOrIds;
  228. else {
  229. if (cidOrIds < 0 || cidOrIds >= this.users.length) {
  230. for (let user of this.users) {
  231. if (user) playerIds.push(user.id);
  232. }
  233. for (let lker of this.lookers) {
  234. playerIds.push(lker.id);
  235. }
  236. } else {
  237. let user = this.users[cidOrIds];
  238. if (user) playerIds.push(user.id);
  239. // console.warn("555WWWWWWWTTTTTT",cidOrIds, route, user.name);
  240. }
  241. }
  242. if (playerIds.length > 0) {
  243. let channelId = 'xct:' + this.id;
  244. // console.warn("666WWWWWWWTTTTTT",cidOrIds, route, playerIds,msg);
  245. return this.app.controllers.push._pushAsync(channelId, playerIds, route, msg);
  246. }
  247. });
  248. // 围观消息
  249. proto.lookMsgAsync = cor(function* (route, msg) {
  250. var playerIds = [];
  251. for (let lker of this.lookers) {
  252. playerIds.push(lker.id);
  253. }
  254. if (playerIds.length > 0) {
  255. let channelId = 'xct:' + this.id;
  256. return this.app.controllers.push._pushAsync(channelId, playerIds, route, msg);
  257. }
  258. });
  259. // 获得桌子信息
  260. proto.getTableInfo = function () {
  261. // console.warn(" table 获得桌子信息.... this.state "+this.state);
  262. // 桌子信息
  263. var tableInfo = {
  264. id: this.id,
  265. gameId: this.gameId,
  266. cost: this.cost,
  267. over: this.over,
  268. users: [],
  269. lookers: [],
  270. agentId: this.agentId,
  271. ownerUserId: this.ownerUid,////TL++,房主的userID
  272. ownerName: this.ownerName,//////TL++,房主的昵称
  273. ownerHeadUrl: this.ownerHeadUrl,//////TL++,房主的头像地址
  274. fpRes: this.fpRes,
  275. ydxfpRes: this.ydxfpRes,
  276. win: this.win,
  277. creatTime : this.ctime,
  278. nowTime : Date.now(),
  279. state: this.state,
  280. cardsPool : this.logic.cardsPool,
  281. cellList : this.logic.cellList,
  282. nowCell : this.logic.nowCell,
  283. yazhus: this.yazhus,
  284. prizePool: this.logic.prizePool,
  285. recordid:this.recordid,
  286. currentId: this.currentId,
  287. yxndlbTime:this.yxndlbTime,
  288. yxndlbTip:this.yxndlbTip,
  289. };
  290. // 桌上玩家
  291. for (let i = 0; i < this.users.length; ++i) {
  292. let user = this.users[i];
  293. if (user) {
  294. // console.warn("获得桌子信息里面的 user.taskQuan "+user.taskQuan);
  295. // let score = this.score.getScore(user.id);
  296. let score = 0;
  297. let uinfo = {
  298. account: user.account, name: user.name, sex: user.sex, headurl: user.headurl,
  299. diamond:user.diamond, state: user.state2, taskQuan: user.taskQuan,
  300. drCount: user.drCount,chairId: user.chairId
  301. };
  302. console.warn("uinfo:",uinfo)
  303. tableInfo.users.push(uinfo);
  304. }
  305. }
  306. // 围观玩家
  307. for (let i = 0; i < this.lookers.length; ++i) {
  308. let user = this.lookers[i];
  309. if (user) {
  310. tableInfo.lookers.push({ account: user.account, name: user.name, sex: user.sex, headurl: user.headurl });
  311. }
  312. }
  313. return tableInfo;
  314. };
  315. // 回到桌子
  316. proto.backAsync = cor(function* (user) {
  317. let str3 = "table回到桌子.......id: "+ this.id + " user.chairId: " + user.chairId + " user.name: " + user.name ;
  318. logger.warn(str3);////cssj
  319. user.offlinetime=0;//ts++
  320. var data = { chairId: String(user.chairId) };
  321. var chairId = user.chairId;
  322. this.mrrstjsj = 0;//每日人数统计时间,用于判断在游戏和押大小时是否需要统计记录昨天的人数信息实现减少数据库访问
  323. yield this.tjbjlmryxrs();
  324. if (chairId != -1) {
  325. // 加入频道
  326. var connectorId = user.connectorId || '';
  327. if (connectorId) {
  328. let channelId = 'xct:' + this.id;
  329. yield this.app.controllers.push._joinAsync(channelId, user.id, connectorId);
  330. }
  331. // 恢复状态
  332. // if (this.state == STATE.FREE2) {//ts++二次准备
  333. // //user.state = User.STATE.PLAYING;//ts--
  334. // user.state2 = User.STATE.READY;
  335. // yield this.pushMsgAsync(-1, 'shuiguo_event', { type: M.STATE_CHANGE, data: { chairId: String(user.chairId), state: String(user.state2), state2: String(user.state2) } });
  336. // }
  337. // user.state = User.STATE.READY;
  338. user.state2 = User.STATE.READY;
  339. if(this.state == STATE.PLAYING) user.state2 = User.STATE.PLAYING;
  340. // yield this.readyGameAsync(user);
  341. // 取消计时
  342. if (this.isOnline() && this.endTimer) {
  343. clearTimeout(this.endTimer);
  344. this.endTimer = null;
  345. }
  346. }
  347. // this.nowDiamond2 = user.diamond;//玩家目前游戏外的钻石(所有的减去带入的)
  348. // console.warn(" table 回到桌子.... this.state ",this.state,this.nowDiamond2,user.diamond);
  349. // 数据处理
  350. // data.fee = this.score.isFeed(user.id) ? '0' : '1';
  351. data.fee = '0';
  352. data.table = this.getTableInfo();
  353. return { code: C.OK, data: data };
  354. });
  355. // 创建玩家的排行信息
  356. proto.creatPHBItem = cor(function* (user) {
  357. var paihang = yield this.app.models.SGJPaiHang.findByIdAsync(this.ownerId, 'name headurl');
  358. if (paihang) {
  359. if(paihang.name != user.name || paihang.headurl != user.headurl){
  360. paihang.name = user.name;
  361. paihang.headurl = user.headurl;
  362. yield paihang.saveAsync();
  363. }
  364. }
  365. else{
  366. var newpaihang = new this.app.models.SGJPaiHang({
  367. _id: this.ownerId, // 标识
  368. name: user.name, // 昵称
  369. headurl: user.headurl, // 头像
  370. userId: user.userId, // 号码
  371. cost1: 0, // 最近一天总下注
  372. quan1: 0, // 最近一天总得奖券
  373. time1: 0, // 最近游戏那天的0点时间戳
  374. cost2: 0, // 次近一天总下注
  375. quan2: 0, // 次近一天总得奖券
  376. time2: 0 // 次近游戏那天的0点时间戳
  377. });
  378. // console.warn("创建玩家的排行信息 ");
  379. yield newpaihang.saveAsync();
  380. }
  381. });
  382. //重置数据,仅供开发测试时使用
  383. // proto.czsjtest = cor(function* (user) {
  384. // let fields = 'cost1 quan1 time1 cost2 quan2 time2';
  385. // var paihang = yield this.app.models.SGJPaiHang.findByIdAsync(this.ownerId, fields);
  386. // if (paihang) {
  387. // paihang.cost2 = 0;
  388. // paihang.quan2 = 0;
  389. // paihang.time2 = 0;
  390. // paihang.cost1 = 10;
  391. // paihang.quan1 = 1;
  392. // paihang.time1 = 1712073600000;
  393. // console.warn("重置排行榜数据 ");
  394. // // yield paihang.saveAsync();
  395. // }
  396. // let sgjconfig = yield this.app.models.SGJConfig.findByIdAsync('sgconfigs');
  397. // if (sgjconfig) {
  398. // sgjconfig.phbyfjlrq = 0; //排行榜已发奖励的日期(0点时间戳)
  399. // yield sgjconfig.saveAsync();
  400. // }
  401. // })
  402. proto.getYesterdaySJC = function (){
  403. var today = new Date();
  404. today.setHours(0);
  405. today.setMinutes(0);
  406. today.setSeconds(0);
  407. today.setMilliseconds(0);
  408. let jrsjc = today.getTime()- 24 * 60 * 60 * 1000;
  409. console.warn("getYesterdaySJC:",jrsjc)
  410. // console.warn("111得到今日0点的时间戳 ",jrsjc, typeof jrsjc);
  411. return jrsjc;
  412. };
  413. proto.getUSDTSum = cor(function* () {
  414. var today = new Date();
  415. today.setHours(0);
  416. today.setMinutes(0);
  417. today.setSeconds(0);
  418. today.setMilliseconds(0);
  419. let jrsjc = today.getTime()- 24 * 60 * 60 * 1000;
  420. jrsjc = today.getTime()
  421. console.warn("jrsjc:",jrsjc)
  422. var SGJUserTongjis = yield this.app.models.SGJUserTongji.findMongoAsync({todaytime:jrsjc})
  423. var limit = 1000
  424. var page = 0
  425. var skip = 0
  426. var all = 0
  427. if (SGJUserTongjis.length >= 1) {
  428. for(;;) {
  429. skip = page * limit
  430. let players = yield this.app.models.Player.findMongoAsync({}, {}, {
  431. skip: skip,
  432. limit: Number(limit)
  433. });
  434. console.warn("players:",players.length)
  435. if (players.length > 0) {
  436. for (let player of players) {
  437. console.warn("player.diamond:",player.diamond)
  438. all += player.diamond
  439. console.warn("all:",all)
  440. }
  441. }else {
  442. break
  443. }
  444. page += 1
  445. }
  446. SGJUserTongjis[0].usdt = all.toFixed(2)
  447. yield SGJUserTongjis[0].saveAsync()
  448. }
  449. });
  450. // 加入桌子
  451. proto.joinAsync = cor(function* (user) {
  452. // 加入桌子之前
  453. // yield this.czsjtest();//正式服记得删除
  454. yield this.tjbjlmryxrs();
  455. yield this.beforeJoinAsync(user);
  456. yield this.creatPHBItem(user);
  457. let taskQuan = 0;//用户的任务券
  458. let drCount = 0;
  459. var sgjUser = yield this.app.models.SGJUser.findByIdAsync(user.id, 'taskQuan yazhuList jrkbcdrs drCount drTime lastJoinTime');
  460. if (!this.calculateTimer) {
  461. this.calculateTimer = this.app.timer.setTimeout(() => this.getUSDTSum(), 100000);
  462. }
  463. if (sgjUser) {
  464. sgjUser.drCount = sgjUser.drCount.toFixed(2)
  465. sgjUser.taskQuan = sgjUser.taskQuan.toFixed(2)
  466. taskQuan = sgjUser.taskQuan;
  467. // console.warn("加入桌子 taskQuan "+taskQuan+" sgjUser.taskQuan "+sgjUser.taskQuan+" "+ typeof(taskQuan)+" "+ typeof(sgjUser.taskQuan) );
  468. this.yazhus = sgjUser.yazhuList//玩家本场押注情况
  469. let jrStart = this.logic.getTodaySJC();////今日0时的时间戳
  470. if(sgjUser.drTime == jrStart) {
  471. drCount = sgjUser.drCount.toFixed(2);
  472. console.warn("drCount:",drCount)
  473. let ssbkdrdd = user.diamond - drCount;//身上比可带入多的钻石
  474. // console.warn("加入桌子非今天首次000=== drCount "+drCount+" ssbkdrdd "+ssbkdrdd+" sgjUser.jrkbcdrs "+sgjUser.jrkbcdrs+ " user.diamond "+user.diamond);
  475. if(ssbkdrdd > this.logic.dairuMax - sgjUser.drCount && this.logic.dairuMax - sgjUser.drCount > 0){
  476. ssbkdrdd = this.logic.dairuMax - sgjUser.drCount
  477. }
  478. if(ssbkdrdd < 0){
  479. //适合比如身上有14w钻石,带入10w之后,被系统扣钻了8w,那这时候数据表的drCount字段就要改了
  480. console.warn("457:",sgjUser.drCount)
  481. drCount = user.diamond.toFixed(2);//1分=10钻石,每日上限1w分)
  482. console.warn("457:",sgjUser.drCount)
  483. // console.warn("加入桌子非今天首次1=== drCount "+drCount+" ssbkdrdd "+ssbkdrdd+" sgjUser.jrkbcdrs "+sgjUser.jrkbcdrs);
  484. }
  485. // console.warn("加入桌子非今天首次111=== drCount "+drCount+" ssbkdrdd "+ssbkdrdd+" sgjUser.jrkbcdrs "+sgjUser.jrkbcdrs);
  486. if(ssbkdrdd >= this.logic.nowCell && sgjUser.jrkbcdrs > 0){
  487. let bckddrd = ssbkdrdd.toFixed(2);//本次可多带入的
  488. drCount = Number(drCount)+ Number(bckddrd);
  489. // sgjUser.jrkbcdrs -= bckddrd;
  490. // yield sgjUser.saveAsync();
  491. // console.warn("加入桌子非今天首次222=== drCount "+drCount+" ssbkdrdd "+ssbkdrdd+" sgjUser.jrkbcdrs "+sgjUser.jrkbcdrs);
  492. }
  493. }
  494. else {
  495. if(user.diamond >= this.logic.dairuMax){
  496. drCount = this.logic.dairuMax.toFixed(2);//(钻石)
  497. }
  498. else{
  499. drCount = user.diamond.toFixed(2);//1分=10钻石,每日上限1w分)
  500. let ssbkdrdd = user.diamond - drCount;//身上比可带入多的钻石
  501. console.warn("ssbkdrdd:",ssbkdrdd)
  502. if(ssbkdrdd > this.logic.dairuMax - sgjUser.drCount){
  503. ssbkdrdd = this.logic.dairuMax - sgjUser.drCount
  504. }
  505. // console.warn("加入桌子首次111=== drCount "+drCount+" ssbkdrdd "+ssbkdrdd+" sgjUser.jrkbcdrs "+sgjUser.jrkbcdrs);
  506. if(ssbkdrdd >= this.logic.nowCell && sgjUser.jrkbcdrs > 0){
  507. //let bckddrd = Math.floor(Math.floor(ssbkdrdd / this.logic.nowCell)*this.logic.nowCell);//本次可多带入的
  508. let bckddrd = ssbkdrdd.toFixed(2)
  509. console.warn("bckddrd:",bckddrd)
  510. drCount += bckddrd;
  511. // sgjUser.jrkbcdrs -= bckddrd;
  512. // yield sgjUser.saveAsync();
  513. // console.warn("加入桌子首次222=== drCount "+drCount+" ssbkdrdd "+ssbkdrdd+" sgjUser.jrkbcdrs "+sgjUser.jrkbcdrs);
  514. }
  515. }
  516. }
  517. }
  518. else{
  519. console.warn("500")
  520. if(user.diamond >= this.logic.dairuMax){
  521. drCount = this.logic.dairuMax.toFixed(2);//(钻石)
  522. }
  523. else{
  524. console.warn("user.diamond;",user.diamond)
  525. drCount = user.diamond.toFixed(2);//1分=10钻石,每日上限1w分)
  526. console.warn("drCount",drCount)
  527. }
  528. }
  529. user.diamond = user.diamond.toFixed(2)
  530. let str3 = "加入水果 "+ this.nowDiamond2 +" ud "+user.diamond + " drCount " + drCount;
  531. if(this.users.length == 0) {
  532. this.users[0] = user;
  533. // this.score.addUser(user.id,0,user.userId, user.name, user.sex, user.headurl,user.diamond,this.gameKindTL);
  534. user.chairId = 0;
  535. user.state = User.STATE.READY;
  536. user.state2 = User.STATE.READY;
  537. user.taskQuan = taskQuan.toFixed(2);
  538. user.drCount = drCount;
  539. // console.warn("加入桌子 user.taskQuan222 ",user.taskQuan,user.diamond);
  540. this.nowDiamond = user.diamond;//玩家目前游戏内的钻石(带入的)
  541. this.nowDiamond2 = user.diamond;//玩家目前游戏外的钻石(所有的减去带入的)
  542. str3 += "这里赋值 "+ this.nowDiamond2 +" ud2 "+user.diamond;
  543. }
  544. logger.warn(str3);////cssj
  545. // 加入桌子之后
  546. yield this.afterJoinAsync(user);
  547. // 数据返回处理
  548. var data = { chairId: String(user.chairId) };
  549. // data.fee = this.score.isFeed(user.id) ? '0' : '1';
  550. data.fee = '0';
  551. data.table = this.getTableInfo();
  552. return { code: C.OK, data: data };
  553. });
  554. // 加入桌子之前
  555. proto.beforeJoinAsync = cor(function* (user) {
  556. var connectorId = user.connectorId || '';
  557. if (connectorId) {
  558. let channelId = 'xct:' + this.id;
  559. return this.app.controllers.push._joinAsync(channelId, user.id, connectorId);
  560. }
  561. });
  562. // 加入桌子之后
  563. proto.afterJoinAsync = cor(function* (user) {
  564. // 加入通知
  565. return this.pushMsgAsync(-1, 'shuiguo_event', {
  566. type: M.JOIN, data: { account: user.account, userId: user.userId, name: user.name, sex: user.sex, headurl: user.headurl,playerPosList: this.playerPosList }
  567. });
  568. });
  569. // 玩家断线
  570. proto.offlineAsync = cor(function* (user) {
  571. let str3 = "table 玩家断线.......id: "+ this.id + " user.chairId: " + user.chairId + " user.name: " + user.name ;
  572. logger.warn(str3);////cssj
  573. if (user.chairId != -1) {
  574. //user.state = User.STATE.OFFLINE;//ts--
  575. user.state2 = User.STATE.OFFLINE;//ts++
  576. // this.leaveUsers.push(user.id);
  577. user.offlinetime = Date.now();//ts++断线
  578. var channelId = 'xct:' + this.id;
  579. // console.warn(" table 玩家断线.... this.state "+this.state);
  580. yield this.app.controllers.push._quitAsync(channelId, user.id);
  581. // yield this.pushMsgAsync(-1, 'shuiguo_event', { type: M.STATE_CHANGE, data: { chairId: String(user.chairId), state: String(user.state2), state2: String(user.state2) } });
  582. // 无人在线
  583. // console.warn("提前结算666");
  584. //if (this.isOffline()) return this.overTimeAsync(MODE.OFFLINE);
  585. // console.warn("玩家断线-------定时器启动");
  586. // 计时结算
  587. let lxjssj = 600000;//断线解散时间
  588. if (!this.endTimer) this.endTimer = this.app.timer.setTimeout(() => this.overTimeAsync(ENDMODE.OFFLINEEND),lxjssj);/////断线3分钟自动结算
  589. // let str4 = "table 玩家断线---id:"+this.id + ",uid"+user.userId+" "+ this.state;
  590. // logger.info(str4);////cssj
  591. }
  592. });
  593. //ts++断线结束定时器
  594. proto.overTimeAsync = cor(function* (endmode) {
  595. // console.warn("sgtable 断线结束定时器",endmode);
  596. yield this.endResultAsync(endmode);//ts++ 房主解散 写分
  597. });
  598. // 记录钻石记录
  599. proto.zsbgjlAsync = cor(function* (user, chairId) {
  600. // console.warn("记录钻石记录---- ",this.wjcsDiamond)
  601. let str3 = "table 记录钻石记录.......id: "+ this.id + " wjcsz " + this.wjcsDiamond + " user.chairId: " + user.chairId + " user.name: " + user.name ;
  602. logger.warn(str3);////cssj
  603. // 站起通知
  604. if(this.wjcsDiamond >= 0){
  605. let wjxzzs = Number(this.nowDiamond) + Number(this.nowDiamond2);
  606. let gbsz = wjxzzs - this.wjcsDiamond;
  607. // let str1 = "table 记录钻石记录111.......id: "+ this.id + " nd " + this.nowDiamond + " nd2: " + this.nowDiamond2;
  608. // logger.warn(str1);////cssj
  609. // console.warn("记录钻石记录 ",this.wjcsDiamond,wjxzzs,user.diamond,gbsz);
  610. // let str2 = "table 记录钻石记录222.......id: "+ this.id + " wjcsz " + this.wjcsDiamond + " wjxzzs: " + wjxzzs + " ud: " + user.diamond + " gbsz "+ gbsz;
  611. // logger.warn(str2);////cssj
  612. if(gbsz != 0){
  613. var diamondrecord = new this.app.models.DiamondRecord({
  614. _id: uuid.v1(),
  615. playerId: user.id,
  616. dType: 20,//水果游戏
  617. dSource: this.wjcsDiamond,
  618. dSwap: gbsz.toFixed(2),
  619. dNow: wjxzzs.toFixed(2),
  620. tableId: this.recordid
  621. });
  622. console.warn("597:",diamondrecord)
  623. yield diamondrecord.saveAsync();
  624. this.wjcsDiamond = -1;
  625. // console.warn("站起桌子之后 保存钻石记录完成 ",this.wjcsDiamond,wjxzzs,user.diamond,gbsz);
  626. }
  627. }
  628. //下面是记录每日统计
  629. let sjbdlx = 0;//数据变动类型
  630. if(this.zqqCost > 0) sjbdlx = 1;
  631. if(this.ydxCost > 0) sjbdlx = 2;
  632. if(this.rwxhjq1 > 0) sjbdlx = 3;
  633. if(this.rwxhjq2 > 0) sjbdlx = 4;
  634. if(this.rwdcze1 > 0) sjbdlx = 5;
  635. if(this.rwdcze2 > 0) sjbdlx = 6;
  636. // console.warn(">下面是记录统计数据 ",sjbdlx,this.zqqCost);
  637. if(sjbdlx > 0){
  638. let jrStart = ""+this.logic.getTodaySJC();////更新今日0时的时间戳
  639. var sgmrtj = yield this.app.models.SGJMRTJ.findByIdAsync(jrStart);
  640. if (sgmrtj) {
  641. sgmrtj.zqqCost = (Number(sgmrtj.zqqCost)+Number(this.zqqCost)).toFixed(2); //所有玩家游戏转圈总下注
  642. sgmrtj.zqqwin = (Number(sgmrtj.zqqwin)+Number(this.zqqwin)).toFixed(2); //所有玩家游戏转圈总赢得
  643. sgmrtj.zqqxh = (Number(sgmrtj.zqqxh)+Number(this.zqqxh)).toFixed(2); //所有玩家游戏转圈总消耗(总赢得 - 总下注)
  644. sgmrtj.ydxCost = (Number(sgmrtj.ydxCost)+Number(this.ydxCost)).toFixed(2); //所有玩家押大小总下注
  645. sgmrtj.ydxwin = (Number(sgmrtj.ydxwin)+Number(this.ydxwin)).toFixed(2); //所有玩家押大小总赢得
  646. sgmrtj.ydxxh = (Number(sgmrtj.ydxxh)+Number(this.ydxxh)).toFixed(2); //所有玩家押大小总消耗(总赢得 - 总下注)
  647. sgmrtj.ydxzcs = (Number(sgmrtj.ydxzcs)+Number(this.ydxzcs)).toFixed(2); //该日押大小总次数
  648. sgmrtj.allrwq = (Number(sgmrtj.allrwq )+ Number(this.allrwq)).toFixed(2); //所有奖券产生总量
  649. sgmrtj.rwxhjq1 = (Number(sgmrtj.rwxhjq1)+Number(this.rwxhjq1)).toFixed(2); //钻石任务消耗奖券总量(领任务时记录)
  650. sgmrtj.rwxhjq2 = (Number(sgmrtj.rwxhjq2)+Number(this.rwxhjq2)).toFixed(2); //RMB任务消耗奖券总量(领任务时记录)
  651. sgmrtj.rwdcze1 = (Number(sgmrtj.rwdcze1)+Number(this.rwdcze1)).toFixed(2); //钻石任务兑出总额(领奖时记录)
  652. sgmrtj.rwdcze2 = (Number(sgmrtj.rwdcze2)+Number(this.rwdcze2)).toFixed(2); //RMB(分)任务兑出总额(领奖时记录)
  653. yield sgmrtj.saveAsync();
  654. // console.warn("更改每日 ",sgmrtj);
  655. }
  656. else{
  657. var sGJMRTJ = new this.app.models.SGJMRTJ({
  658. _id: jrStart, // 标识
  659. zqqCost: this.zqqCost, //所有玩家游戏转圈总下注
  660. zqqwin: this.zqqwin, //所有玩家游戏转圈总赢得
  661. zqqxh: this.zqqxh, //所有玩家游戏转圈总消耗(总赢得 - 总下注)
  662. ydxCost: this.ydxCost, //所有玩家押大小总下注
  663. ydxwin: this.ydxwin, //所有玩家押大小总赢得
  664. ydxxh: this.ydxxh, //所有玩家押大小总消耗(总赢得 - 总下注)
  665. ydxzcs: this.ydxzcs, //该日押大小总次数
  666. allrwq: this.allrwq, //所有奖券产生总量
  667. rwxhjq1: this.rwxhjq1, //钻石任务消耗奖券总量(领任务时记录)
  668. rwxhjq2: this.rwxhjq2, //RMB任务消耗奖券总量(领任务时记录)
  669. rwdcze1: this.rwdcze1, //钻石任务兑出总额(领奖时记录)
  670. rwdcze2: this.rwdcze2, //RMB(分)任务兑出总额(领奖时记录)
  671. registerTime: jrStart,// 记录时间(该日0点时间戳)
  672. });
  673. yield sGJMRTJ.saveAsync();
  674. // console.warn("创建每日 ",sGJMRTJ);
  675. }
  676. //下面是记录总记录数据
  677. let sgjztj = yield this.app.models.SGJTongji.findByIdAsync('sgztj');
  678. if (sgjztj) {
  679. sgjztj.allCost += this.allCost; //所有玩家总下注
  680. sgjztj.allwin += this.allwin; //所有玩家总赢得
  681. sgjztj.allxh += this.allxh; //所有玩家总消耗(总下注-总赢得)
  682. sgjztj.zqqCost += this.zqqCost; //所有玩家游戏转圈总下注
  683. sgjztj.zqqwin += this.zqqwin; //所有玩家游戏转圈总赢得
  684. sgjztj.zqqxh += this.zqqxh; //所有玩家游戏转圈总消耗(总赢得 - 总下注)
  685. sgjztj.ydxCost += this.ydxCost; //所有玩家押大小总下注
  686. sgjztj.ydxwin += this.ydxwin; //所有玩家押大小总赢得
  687. sgjztj.ydxxh += this.ydxxh; //所有玩家押大小总消耗(总赢得 - 总下注)
  688. sgjztj.allrwq += Number(this.allrwq); //所有奖券产生总量
  689. sgjztj.rwxhjq1 += this.rwxhjq1; //钻石任务消耗奖券总量(领任务时记录)
  690. sgjztj.rwxhjq2 += this.rwxhjq2; //RMB任务消耗奖券总量(领任务时记录)
  691. sgjztj.rwxhjq3 = 0; //备用任务1消耗奖券总量(领任务时记录)
  692. sgjztj.rwxhjq4 = 0; //备用任务2消耗奖券总量(领任务时记录)
  693. sgjztj.rwdcze1 += this.rwdcze1; //钻石任务兑出总额(领奖时记录)
  694. sgjztj.rwdcze2 += this.rwdcze2; //RMB(分)任务兑出总额(领奖时记录)
  695. sgjztj.rwdcze3 = 0; //备用任务兑出总额(领奖时记录)
  696. sgjztj.rwdcze4 = 0; //备用任务兑出总额(领奖时记录)
  697. let cwindx = 0;
  698. if(sgjztj.allyzze.length != this.allyzze.length) cwindx = 1;
  699. if(sgjztj.allydze.length != this.allydze.length) cwindx = 2;
  700. if(sgjztj.gxzydze.length != this.gxzydze.length) cwindx = 3;
  701. if(sgjztj.gxcxzcs.length != this.gxcxzcs.length) cwindx = 4;
  702. if(sgjztj.tsxzydze.length != this.tsxzydze.length) cwindx = 5;
  703. if(sgjztj.tsxcxzcs.length != this.tsxcxzcs.length) cwindx = 6;
  704. if(cwindx == 0){
  705. let allyzze = [];
  706. let allydze = [];
  707. let gxzydze = [];
  708. let gxcxzcs = [];
  709. let tsxzydze = [];
  710. let tsxcxzcs = [];
  711. // 下面这两个数据是长度为8的数组,分别代表[苹果,橙子,芒果,铃铛,西瓜,星星,七七,王王]
  712. for (var i = 0; i < sgjztj.allyzze.length; i++) {
  713. allyzze[i] = sgjztj.allyzze[i] + this.allyzze[i];
  714. }
  715. for (var i = 0; i < sgjztj.allydze.length; i++) {
  716. allydze[i] = sgjztj.allydze[i] + this.allydze[i];
  717. }
  718. // 下面这两个数据是长度为16的数组,分别代表[大苹果,大橙子,大芒果,大铃铛,大西瓜,大星星,大七七,大王王,
  719. //小苹果,小橙子,小芒果,小铃铛,小西瓜,小星星,小七七,小王王]
  720. for (var i = 0; i < sgjztj.gxzydze.length; i++) {
  721. gxzydze[i] = sgjztj.gxzydze[i] + this.gxzydze[i];
  722. }
  723. for (var i = 0; i < sgjztj.gxcxzcs.length; i++) {
  724. gxcxzcs[i] = sgjztj.gxcxzcs[i] + this.gxcxzcs[i];
  725. }
  726. // 下面这两个数据是长度为3的数组,分别代表[小三元,小三元,大四喜]
  727. for (var i = 0; i < this.tsxzydze.length; i++) {
  728. tsxzydze[i] = sgjztj.tsxzydze[i] + this.tsxzydze[i];
  729. }
  730. for (var i = 0; i < this.tsxcxzcs.length; i++) {
  731. tsxcxzcs[i] = sgjztj.tsxcxzcs[i] + this.tsxcxzcs[i];
  732. }
  733. sgjztj.allyzze = _.cloneDeep(allyzze);
  734. sgjztj.allydze = _.cloneDeep(allydze);
  735. sgjztj.gxzydze = _.cloneDeep(gxzydze);
  736. sgjztj.gxcxzcs = _.cloneDeep(gxcxzcs);
  737. sgjztj.tsxzydze = _.cloneDeep(tsxzydze);
  738. sgjztj.tsxcxzcs = _.cloneDeep(tsxcxzcs);
  739. }
  740. else{
  741. let nowTime = Date.now();
  742. let errstr = "cdbyz:"+cwindx+",sj:"+nowTime+",fh:"+this.id;
  743. sgjztj.errstr += errstr;
  744. }
  745. yield sgjztj.saveAsync();
  746. // console.warn("更改总的 ",cwindx,sgjztj);
  747. }
  748. else{
  749. var sgjtj = new this.app.models.SGJTongji({
  750. allCost: this.allCost, //所有玩家总下注
  751. allwin: this.allwin, //所有玩家总赢得
  752. allxh: this.allxh, //所有玩家总消耗(总下注-总赢得)
  753. zqqCost: this.zqqCost, //所有玩家游戏转圈总下注
  754. zqqwin: this.zqqwin, //所有玩家游戏转圈总赢得
  755. zqqxh: this.zqqxh, //所有玩家游戏转圈总消耗(总赢得 - 总下注)
  756. ydxCost: this.ydxCost, //所有玩家押大小总下注
  757. ydxwin: this.ydxwin, //所有玩家押大小总赢得
  758. ydxxh: this.ydxxh, //所有玩家押大小总消耗(总赢得 - 总下注)
  759. allrwq: this.allrwq, //所有奖券产生总量
  760. rwxhjq1: this.rwxhjq1, //钻石任务消耗奖券总量(领任务时记录)
  761. rwxhjq2: this.rwxhjq2, //RMB任务消耗奖券总量(领任务时记录)
  762. rwxhjq3: 0, //备用任务1消耗奖券总量(领任务时记录)
  763. rwxhjq4: 0, //备用任务2消耗奖券总量(领任务时记录)
  764. rwdcze1: this.rwdcze1, //钻石任务兑出总额(领奖时记录)
  765. rwdcze2: this.rwdcze2, //RMB(分)任务兑出总额(领奖时记录)
  766. rwdcze3: 0, //备用任务兑出总额(领奖时记录)
  767. rwdcze4: 0, //备用任务兑出总额(领奖时记录)
  768. // 下面这两个数据是长度为8的数组,分别代表[苹果,橙子,芒果,铃铛,西瓜,星星,七七,王王]
  769. allyzze: _.cloneDeep(this.allyzze), //总押注总额列表
  770. allydze: _.cloneDeep(this.allydze), //总赢得总额列表(不包含特殊项)
  771. // 下面这两个数据是长度为16的数组,分别代表[大苹果,大橙子,大芒果,大铃铛,大西瓜,大星星,大七七,大王王,
  772. //小苹果,小橙子,小芒果,小铃铛,小西瓜,小星星,小七七,小王王]
  773. gxzydze: _.cloneDeep(this.gxzydze), //各项总赢得总额列表(不包含特殊项)
  774. gxcxzcs: _.cloneDeep(this.gxcxzcs), //各项出现总次数列表(不包含特殊项)
  775. // 下面这两个数据是长度为3的数组,分别代表[小三元,小三元,大四喜]
  776. tsxzydze: _.cloneDeep(this.tsxzydze), //特殊项总赢得总额列表
  777. tsxcxzcs: _.cloneDeep(this.tsxcxzcs), //特殊项出现总次数列表
  778. });
  779. yield sgjtj.saveAsync();
  780. // console.warn("创建总的 ",sgjtj);
  781. }
  782. }
  783. // yield this.app.models.SGJMRTJ.removeAsync({_id : "1713715200000"});
  784. // yield this.app.models.SGJTongji.removeAsync({_id : "sgztj"});
  785. // yield this.app.models.SGJPaiHang.removeAsync({_id : "dfcb8e16-a05a-c26e-a9af-29a0a1fd0d86"});
  786. // let str0 = "table 记录钻石记录结束.......id: "+ this.id + " sjbdlx " + sjbdlx;
  787. // logger.warn(str0);////cssj
  788. });
  789. // 站起桌子之后
  790. proto.afterStandAsync = cor(function* (user, chairId) {
  791. // 站起通知
  792. // yield this.pushMsgAsync(-1, 'csjiang_event', { type: M.STAND, data: { chairId: String(chairId) } });
  793. if(user.cost==0 && user.spreadId)//ts++推荐人奖励
  794. {
  795. ////20200928因为现在的spreadId存的是userId,所以上面那段用不了了
  796. if(!this.lconfigCommon) {
  797. // console.warn("邀请新人送钻石活动 this.lconfigCommon 不存在 "+this.etime);
  798. this.lconfigCommon = new configCommon(this.app);
  799. }
  800. let yxhdxx = this.lconfigCommon.getActiveOpenTime(1);//邀请新人送钻石活动是否开启和开始结束时间的信息
  801. let isKQ = false;//邀请新人送钻石活动是否开启
  802. if(yxhdxx && yxhdxx.open && yxhdxx.startTime && yxhdxx.endTime) isKQ = true;
  803. // console.warn("获取配置信息 yxhdxx "+JSON.stringify(yxhdxx));
  804. if(isKQ && this.etime >= yxhdxx.startTime && this.etime < yxhdxx.endTime){
  805. var cpopts = {};
  806. cpopts['userId'] = parseInt(user.spreadId);
  807. let spreadList = yield this.app.models.Player.findMongoAsync(cpopts, 'spreadCount spreadRebate', { sort: { stime: 1 } });//
  808. if(spreadList.length == 1){
  809. spreadList[0].spreadCount += 1;
  810. spreadList[0].spreadRebate += 100;
  811. yield spreadList[0].saveAsync();
  812. }
  813. }
  814. }
  815. yield this.lsetReabte.updateDaterebateRecord(this.agentId,this.etime);
  816. });
  817. // 离开桌子
  818. proto.leaveAsync = cor(function* (user) {
  819. let str3 = "table 离开桌子.......id: "+ this.id + " user.chairId: " + user.chairId + " user.name: " + user.name ;
  820. logger.warn(str3);////cssj
  821. // this.leavePlayerID = user.id;//////TL++,旁观为房主的话离开之后由于从观战者列表里面删除了,导致发消息的时候他收不到离开桌子的消息
  822. // console.warn("离开桌子、、、、、、、");
  823. yield this.beforeLeaveAsync(user);
  824. var chairId = user.chairId;
  825. // yield this.pushMsgAsync(-1, 'shuiguo_event', { type: M.LEAVE, data: { account: user.account } });/////TL++zs,原来在下面
  826. if (chairId != -1) {
  827. delete this.users[chairId];
  828. yield this.afterStandAsync(user, chairId);
  829. } else {
  830. let pos = _.findIndex(this.lookers, (u) => (u.id == user.id));
  831. if (pos != -1) this.lookers.splice(pos, 1);
  832. }
  833. return this.afterLeaveAsync(user);
  834. });
  835. // 离开桌子之前
  836. proto.beforeLeaveAsync = cor(function* (user) {
  837. var channelId = 'xct:' + this.id;
  838. return this.app.controllers.push._quitAsync(channelId, user.id);
  839. });
  840. // 离开桌子之后
  841. proto.afterLeaveAsync = cor(function* (user) {
  842. // 离开通知
  843. /////TL++zsyl 在此之前离开玩家已经从玩家列表或者旁观者列表中删除了所以把下面这句提到前面去了
  844. return this.pushMsgAsync(-1, 'shuiguo_event', { type: M.LEAVE, data: { account: user.account } });
  845. });
  846. // 玩家准备(结束本小局)
  847. proto.readyGameAsync = cor(function* (user) {
  848. let str1 = "table 玩家准备.......id: "+ this.id + " user.chairId: " + user.chairId + " this.over: " + this.over + " user.name: " + user.name ;
  849. logger.warn(str1);////cssj
  850. let endmode=ENDMODE.PLAYING;
  851. yield this.endResultAsync(endmode);
  852. let data = {
  853. state: this.state,
  854. win:this.win
  855. }
  856. let str3 = "table 玩家准备222.......id: "+ this.id + " state: " + data.state ;
  857. logger.warn(str3);////cssj
  858. yield this.pushMsgAsync(-1, 'shuiguo_event', { type: M.STATE_CHANGE, data: data });
  859. this.win = 0;//本局结果赢得分数(不包含下注的即winsList元素总和)用于判断用户是否可以押分
  860. // yield this.pushMsgAsync(-1, 'shuiguo_event', { type: M.STATE_CHANGE, data: { chairId: String(user.chairId), state: String(user.state2), state2: String(user.state2) } });
  861. return { code: C.OK, data:data };
  862. });
  863. // 请求结束(前端点击返回大厅)
  864. proto.overTableAsync = cor(function* (user) {
  865. // console.warn("ts+++++请求结束",user.chairId);
  866. let str3 = "cstable 请求结束.......id: "+ this.id + " user.chairId: " + user.chairId + " user.name: " + user.name ;
  867. logger.warn(str3);////cssj
  868. user.state = User.STATE.FREE;
  869. user.state2 = User.STATE.FREE;
  870. this.state = STATE.END;
  871. let diamond = 0;
  872. if(user) diamond = user.diamond || 0;
  873. // this.leaveAsync(user);
  874. return { code: C.OK, data:{diamond:diamond}};//离开房间
  875. });
  876. // 得到战绩
  877. proto.getRecordAsync = P.coroutine(function* (user) {
  878. // console.warn("得到战绩 "+user.id);
  879. var opts = {
  880. ownerId:user.id//time: { $gte: startTime, $lt: endTime },
  881. };
  882. var list = yield this.app.models.SGJTables.findMongoAsync(opts, 'ownerId time gameCost yazhuList resultList winsList win bsIndex scoreBefore scoreEnd', { sort: { time: -1 } ,limit:25});
  883. // console.warn("战绩-------------------length",list.length);
  884. let records = [];
  885. let nowTime = Date.now();//当前时间戳
  886. for (let i = 0; i < list.length; ++i) {
  887. // console.warn("战绩条目 "+i+" "+JSON.stringify(list[i]));
  888. if(list[i].time + 8000 > nowTime) continue;
  889. let item = {
  890. time:list[i].time,
  891. gameCost:list[i].gameCost,
  892. yazhuList:list[i].yazhuList,
  893. resultList:list[i].resultList,
  894. win:list[i].scoreEnd - list[i].scoreBefore,
  895. bsIndex:list[i].bsIndex
  896. }
  897. records[records.length] = item;
  898. if(records.length == 24) break;
  899. }
  900. return { code: C.OK,data: {records:records } };
  901. });
  902. //得到玩家截至今日零点总充值数量(分)
  903. proto.getjzjrldzcz = cor(function* () {
  904. let jrStart = this.logic.getTodaySJC();////今日0时的时间戳
  905. let totalMoney = 0;//该玩家目前总充值
  906. let jzjrldzcz = 0;// 玩家截至今日零点总充值数量(分),用于判断任务
  907. let player = yield this.app.models.Player.findByIdAsync(this.ownerId, 'totalMoney');
  908. if (player) totalMoney = player.totalMoney;
  909. if(totalMoney > 0){
  910. let jrgwjzcz = 0;//今日该玩家总充值
  911. let opts3 = {
  912. playerId: this.ownerId,
  913. paystate: 1,
  914. time: { $gte: jrStart, $lt: jrStart+86400000}
  915. };
  916. let jrpayList = yield this.app.models.PayRecord.findMongoAsync(opts3,"total_fee")
  917. if(jrpayList.length > 0){
  918. for (var i = 0; i < jrpayList.length; i++) {
  919. jrgwjzcz += jrpayList[i].total_fee;
  920. }
  921. }
  922. // console.warn("得到玩家截至今日零点总充值数量(分) ",jzjrldzcz , totalMoney , jrgwjzcz);
  923. if(totalMoney - jrgwjzcz >= 0) jzjrldzcz = totalMoney - jrgwjzcz;
  924. else{
  925. let str3 = "得到历史充值错误 "+ jrgwjzcz + " this.ownerId: " + this.ownerId + " totalMoney: " + totalMoney ;
  926. logger.warn(str3);////cssj
  927. }
  928. }
  929. // console.warn("得到玩家截至今日零点总充值数量(分)222 ",jzjrldzcz , totalMoney );
  930. return jzjrldzcz;
  931. });
  932. // 处理前端带入函数
  933. proto.dairuAsync = cor(function* (playerId,chairId) {
  934. // console.warn("带入 this.nowDiamond2 ",this.nowDiamond2);
  935. let str1 = "table 带入1---id:"+this.id +" 当前局 "+ (this.over+1)+" nd2 "+this.nowDiamond2;
  936. logger.warn(str1);////cssj
  937. var user = this.users[chairId];
  938. if (!user) {
  939. return { code: C.FAILD, msg: C.CHAIR_NOT_FOUND };
  940. }
  941. let str2 = "table 带入2---id:"+this.id +" 当前局 "+ this.over+" ud "+user.diamond;;
  942. logger.warn(str2);////cssj
  943. //下面是统计数据赋初始值
  944. this.zqqCost = 0; //所有玩家游戏转圈总下注
  945. this.zqqwin = 0; //所有玩家游戏转圈总赢得
  946. this.zqqxh = 0; //所有玩家游戏转圈总消耗(总下注-总赢得)
  947. this.ydxCost = 0; //所有玩家押大小总下注
  948. this.ydxwin = 0; //所有玩家押大小总赢得
  949. this.ydxxh = 0; //所有玩家押大小总消耗(总下注-总赢得)
  950. this.ydxzcs = 0; //该日押大小总次数
  951. this.allrwq = 0; //所有奖券产生总量
  952. this.rwxhjq1 = 0; //钻石任务消耗奖券总量(领任务时记录)
  953. this.rwxhjq2 = 0; //RMB任务消耗奖券总量(领任务时记录)
  954. this.rwdcze1 = 0; //钻石任务兑出总额(领奖时记录)
  955. this.rwdcze2 = 0; //RMB(分)任务兑出总额(领奖时记录)
  956. this.allCost = 0; //所有玩家总下注
  957. this.allwin = 0; //所有玩家总赢得
  958. this.allxh = 0; //所有玩家总消耗(总下注-总赢得)
  959. // 下面这两个数据是长度为8的数组,分别代表[苹果,橙子,芒果,铃铛,西瓜,星星,七七,王王]
  960. this.allyzze = []; //总押注总额列表
  961. this.allydze = []; //总赢得总额列表(不包含特殊项)
  962. for (var i = 0; i < 8; i++) {
  963. this.allyzze[i] = 0; //总押注总额列表
  964. this.allydze[i] = 0; //总赢得总额列表(不包含特殊项)
  965. }
  966. // 下面这数据是长度为17的数组,分别代表[大苹果,大橙子,大芒果,大铃铛,大西瓜,大星星,大七七,大王王,
  967. //幸运运,小苹果,小橙子,小芒果,小铃铛,小西瓜,小星星,小七七,小王王]
  968. this.gxzydze = []; //总赢得总额列表(不包含特殊项)
  969. this.gxcxzcs = []; //出现总次数列表(不包含特殊项)
  970. for (var i = 0; i < this.logic.cardKindCount; i++) {
  971. this.gxzydze[i] = 0; //各项总赢得总额列表(不包含特殊项)
  972. this.gxcxzcs[i] = 0; //各项出现总次数列表(不包含特殊项)
  973. }
  974. // 下面这两个数据是长度为3的数组,分别代表[小三元,小三元,大四喜]
  975. this.tsxzydze = [0,0,0]; //特殊项总赢得总额列表
  976. this.tsxcxzcs = [0,0,0]; //特殊项出现总次数列表
  977. let sgjconfig = yield this.app.models.SGJConfig.findByIdAsync('sgconfigs');
  978. if (sgjconfig) {
  979. this.phbyfjlrq = sgjconfig.phbyfjlrq; //排行榜已发奖励的日期(0点时间戳)
  980. // console.warn("获取水果机排行榜已发奖励的日期 ",this.phbyfjlrq);
  981. }
  982. else{
  983. this.phbyfjlrq = this.logic.getTodaySJC() - 86400000; //排行榜已发奖励的日期(0点时间戳)
  984. var newconfig = new this.app.models.SGJConfig({
  985. _id: 'sgconfigs',
  986. phbyfjlrq: this.phbyfjlrq
  987. });
  988. yield newconfig.saveAsync();
  989. // console.warn("创建水果机排行榜已发奖励的日期 ");
  990. }
  991. this.wjrwxylb = _.fill(Array(this.logic.cardKindCount), 0);//玩家已领未完成任务需要的任务要求列表
  992. let opts0 = {
  993. playerId: playerId,
  994. state:0,//已领未完成
  995. };
  996. var ylwwcrwList = yield this.app.models.SGJTask.findMongoAsync(opts0, 'reachs reachC state');
  997. if(ylwwcrwList.length > 0){
  998. for (var i = 0; i < ylwwcrwList.length; i++) {
  999. let rwyq = ylwwcrwList[i].reachs;//任务要求类型列表
  1000. for (var j = 0; j < rwyq.length; j++) {
  1001. let rwyqlx = rwyq[j];//任务要求类型
  1002. let rwyqsl = ylwwcrwList[i].reachC[j];//任务要求类型
  1003. this.wjrwxylb[rwyqlx] += rwyqsl;
  1004. }
  1005. }
  1006. }
  1007. // console.warn("玩家已领未完成任务需要的任务要求列表 ",ylwwcrwList.length,this.wjrwxylb);
  1008. //统计数据赋初始值结束
  1009. if(this.over > 0){
  1010. var data = {
  1011. diamond: this.nowDiamond2,
  1012. drCount: user.drCount - this.win,
  1013. }
  1014. this.wjcsDiamond = user.diamond;//玩家进入房间初始的钻石数,用于判断离开的时候是否需要记录钻石变更
  1015. return { code: C.OK, data: data };
  1016. }
  1017. let drCount = Number(0);
  1018. let nowTime = Date.now();//当前时间戳
  1019. let jrStart = this.logic.getTodaySJC();////今日0时的时间戳
  1020. var sgjUser = yield this.app.models.SGJUser.findByIdAsync(this.ownerId, 'jrkbcdrs drCount drTime jzjrldzcz jzjrldzczjlsj lastJoinTime');
  1021. if (sgjUser) {
  1022. // console.warn("带入 ",sgjUser.jzjrldzczjlsj,sgjUser.drTime);
  1023. if(sgjUser.jzjrldzczjlsj != jrStart){
  1024. let jzjrldzcz = yield this.getjzjrldzcz();
  1025. sgjUser.jzjrldzcz = jzjrldzcz;
  1026. sgjUser.jzjrldzczjlsj = jrStart;
  1027. }
  1028. sgjUser.drCount = sgjUser.drCount.toFixed(2)
  1029. if(sgjUser.drTime == jrStart){
  1030. if(this.nowDiamond2 >= sgjUser.drCount){
  1031. drCount = sgjUser.drCount.toFixed(1);
  1032. let ssbkdrdd = this.nowDiamond2 - drCount;//身上比可带入多的钻石
  1033. if(ssbkdrdd > this.logic.dairuMax - sgjUser.drCount && this.logic.dairuMax - sgjUser.drCount > 0){
  1034. ssbkdrdd = this.logic.dairuMax - sgjUser.drCount
  1035. }
  1036. if(ssbkdrdd < 0){
  1037. //适合比如身上有14w钻石,带入10w之后,被系统扣钻了8w,那这时候数据表的drCount字段就要改了
  1038. drCount = Math.floor(user.diamond / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
  1039. sgjUser.drCount = drCount;
  1040. sgjUser.lastJoinTime = nowTime; // 玩家上次进入果游戏时间(留存人数)
  1041. yield sgjUser.saveAsync();
  1042. }
  1043. // console.warn("带入函数111=== drCount "+drCount+" ssbkdrdd "+ssbkdrdd+" sgjUser.jrkbcdrs "+sgjUser.jrkbcdrs);
  1044. // console.warn("带入 ??? ",sgjUser.jzjrldzcz,sgjUser.jzjrldzczjlsj);
  1045. if(ssbkdrdd >= this.logic.nowCell && sgjUser.jrkbcdrs > 0){
  1046. let bckddrd = Math.floor(ssbkdrdd / this.logic.nowCell)*this.logic.nowCell;//本次可多带入的
  1047. console.warn("bckddrd:",bckddrd," drCount:",drCount)
  1048. drCount = Number(drCount)+ Number(bckddrd);
  1049. console.warn("bckddrd:",bckddrd," drCount:",drCount)
  1050. sgjUser.drCount = drCount;
  1051. sgjUser.jrkbcdrs -= bckddrd;
  1052. sgjUser.lastJoinTime = nowTime; // 玩家上次进入果游戏时间(留存人数)
  1053. yield sgjUser.saveAsync();
  1054. // console.warn("带入函数222=== drCount "+drCount+" ssbkdrdd "+ssbkdrdd+" sgjUser.jrkbcdrs "+sgjUser.jrkbcdrs);
  1055. }
  1056. }
  1057. else{
  1058. drCount = Math.floor(user.diamond / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
  1059. sgjUser.drCount = drCount;
  1060. sgjUser.lastJoinTime = nowTime; // 玩家上次进入果游戏时间(留存人数)
  1061. yield sgjUser.saveAsync();
  1062. let str3 = "带入出错了 this.nowDiamond2 "+ this.nowDiamond2 +" ud "+user.diamond + " sgjUser.drCount " + sgjUser.drCount;
  1063. logger.error(str3);////cssj
  1064. //return { code: C.FAILD, msg: C.GAME_PARAM_ERROR };
  1065. }
  1066. }
  1067. else {
  1068. if(this.nowDiamond2 >= this.logic.dairuMax){
  1069. drCount = this.logic.dairuMax;//(钻石)
  1070. }
  1071. else{
  1072. drCount = Math.floor(this.nowDiamond2 / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
  1073. }
  1074. // console.warn("带入 到乐乐 ",sgjUser.jzjrldzczjlsj,sgjUser.drTime);
  1075. let jrkbcdrs = this.logic.dairuMax - drCount;
  1076. sgjUser.jrkbcdrs = jrkbcdrs;
  1077. sgjUser.drCount = drCount;
  1078. sgjUser.drTime = jrStart;
  1079. sgjUser.lastJoinTime = nowTime; // 玩家上次进入果游戏时间(留存人数)
  1080. yield sgjUser.saveAsync();
  1081. }
  1082. }
  1083. else{
  1084. let jrkbcdrs = 0;
  1085. if(this.nowDiamond2 >= this.logic.dairuMax){
  1086. drCount = this.logic.dairuMax;//(钻石)
  1087. }
  1088. else{
  1089. drCount = Math.floor(this.nowDiamond2 / this.logic.nowCell)*this.logic.nowCell;//1分=10钻石,每日上限1w分)
  1090. jrkbcdrs = this.logic.dairuMax - drCount;
  1091. }
  1092. let jzjrldzcz = yield this.getjzjrldzcz();
  1093. var newsgjUser = new this.app.models.SGJUser({
  1094. _id: this.ownerId, // 标识
  1095. userId: Number(user.userId), // 号码
  1096. cost: 0, // 消费
  1097. win: 0, // 总赢得分
  1098. zfbAcc: "", // 支付宝账号
  1099. zfbName: "", // 支付宝姓名
  1100. zfbBindTime: 0, // 玩家支付宝信息正确性验证成功时间(0时表示验证未通过)
  1101. gameCount: 0, // 总小局次数
  1102. wingames: 0, // 总赢的小局次数
  1103. taskReward: 0, // 已获得的任务奖励
  1104. taskQuan: 0, // 任务券(用于领任务)
  1105. yazhuList: [], // 上局押注列表
  1106. getList: [], // 获得的列表(用于计算任务是否完成)
  1107. getTime: 0, // 获得列表更新的时间
  1108. jrkbcdrs:jrkbcdrs, // 今日可补充带入数量
  1109. drCount: drCount, // 带入数量(钻石)(1分=10钻石,每日上限1w分)
  1110. drTime: jrStart, // 带入时间
  1111. jzjrldzcz: jzjrldzcz,
  1112. jzjrldzczjlsj: jrStart,
  1113. registerTime: nowTime, // 玩家首次进入水果游戏时间
  1114. lastJoinTime: nowTime, // 玩家上次进入果游戏时间(留存人数)
  1115. lastPlayTime: 0, // 玩家上次玩水果游戏时间(用于统计有效人数)
  1116. lastYDXTime: 0 // 玩家上次水果押大小时间(用于统计有效人数)
  1117. });
  1118. yield newsgjUser.saveAsync();
  1119. }
  1120. this.wjcsDiamond = this.nowDiamond2;//user.diamond;//玩家进入房间初始的钻石数,用于判断离开的时候是否需要记录钻石变更
  1121. // console.warn("玩家进入之后记录初始钻石数 ",this.wjcsDiamond,this.nowDiamond,this.nowDiamond2);
  1122. this.nowDiamond = Number(drCount);
  1123. console.warn(" this.nowDiamond2:", this.nowDiamond2, " drCount:",drCount)
  1124. this.nowDiamond2 -= Number(drCount);
  1125. console.warn(" this.nowDiamond2:", this.nowDiamond2)
  1126. if(this.nowDiamond2 < 0){
  1127. let str4 = "table 带入出错了---id:"+this.id +" 当前局 "+ (this.over+1)+" nd2 "+this.nowDiamond2;
  1128. logger.warn(str4);////cssj
  1129. return { code: C.FAILD, msg: C.GAME_PARAM_ERROR };
  1130. }
  1131. console.warn("this.nowDiamond2:",this.nowDiamond2)
  1132. console.warn("drCount:",drCount)
  1133. var data = {
  1134. diamond: this.nowDiamond2.toFixed(2),
  1135. drCount: drCount,
  1136. }
  1137. console.warn("data:",data)
  1138. return { code: C.OK, data: data };
  1139. });
  1140. // 开始游戏
  1141. proto.startGameAsync = cor(function* (yazhus) {
  1142. let str4 = "table 开始游戏---id:"+this.id +" 当前局 "+ (this.over+1)+" nowDiamond "+this.nowDiamond+" yazhus "+JSON.stringify(yazhus);
  1143. logger.warn(str4);////cssj
  1144. // 状态设置
  1145. //现在钻石数量 玩家初始钻石数量不得小于0
  1146. let wh = yield this.app.models.WHstate.findByIdReadOnlyAsync('wh', 'stateWH whTip');
  1147. // console.warn("22检查是否维护状态",whdata);
  1148. if (wh) {
  1149. // console.warn("--33检查是否维护状态",whdata.stateWH,whdata.whTip);
  1150. if(wh.stateWH){
  1151. /////维护状态中
  1152. return { code: C.SERVER_WEIHU, tip: wh.whTip };
  1153. }
  1154. }
  1155. if(this.nowDiamond2 < 0 || this.wjcsDiamond < 0){
  1156. let str1 = "table nowDiamond2出错了---id:"+this.id +" 当前局 "+ (this.over+1)+" nd2 "+this.nowDiamond2+" csd "+this.wjcsDiamond;
  1157. logger.warn(str1);////cssj
  1158. return { code: C.FAILD, msg: C.GAME_PARAM_ERROR };
  1159. }
  1160. //押注长度必须为8
  1161. if(yazhus.length != 8){
  1162. let str = "table 押注长度出错了---id:"+this.id +" 当前局 "+ (this.over+1)+" this.ownerUid "+this.ownerUid+" yazhus "+JSON.stringify(yazhus);
  1163. logger.warn(str);////cssj
  1164. return { code: C.FAILD, msg: "押注长度出错了 前端的问题 "+JSON.stringify(yazhus) };
  1165. }
  1166. //押注值必须为10的倍数
  1167. for (var i = 0; i < yazhus.length; i++) {
  1168. yazhus[i] = parseFloat(yazhus[i].toFixed(2));
  1169. if(((yazhus[i]*1000)%(this.logic.nowCell*1000)) != 0){
  1170. let str = "table 押注数值出错了---id:"+this.id +" 当前局 "+ (this.over+1)+" this.ownerUid "+this.ownerUid+" yazhus "+JSON.stringify(yazhus);
  1171. logger.warn(str);////cssj
  1172. return { code: C.FAILD, msg: "押注数值出错了 前端的问题 "+JSON.stringify(yazhus) };
  1173. }
  1174. }
  1175. //本次总押注 身上的钱是否够
  1176. if(this.nowDiamond < _.sum(yazhus)){ //本次总下注
  1177. return { code: C.FAILD, msg: C.GAME_DIAMOND_LOW };//玩家钻石不足
  1178. }
  1179. //时间戳 != 每日人数统计时间
  1180. if(this.logic.getTodaySJC() != this.mrrstjsj){
  1181. // console.warn("昨日数据还未统计111");
  1182. yield this.tjbjlmryxrs();
  1183. }
  1184. this.state = STATE.PLAYING;
  1185. this.win = 0;//本局结果赢得分数(不包含下注的即winsList元素总和)用于判断用户是否可以押分
  1186. this.yxjlid = uuid.v1()+'_'+this.id;//ts++游戏记录id
  1187. //ts++设置为游戏状态
  1188. for (let user of this.users)
  1189. {
  1190. if (user) {
  1191. user.state = User.STATE.PLAYING
  1192. user.state2 = User.STATE.PLAYING
  1193. user.offlinetime = 0;
  1194. }
  1195. }
  1196. //ts++end
  1197. let whdata = yield this.app.models.WHstate.findByIdReadOnlyAsync('wh', 'rebaterate yxndlbTime yxndlbTip');
  1198. // console.warn("22检查是否维护状态",whdata);
  1199. if (whdata) {
  1200. if(whdata.yxndlbTime) this.yxndlbTime = whdata.yxndlbTime;
  1201. if(whdata.yxndlbTip) this.yxndlbTip = whdata.yxndlbTip;
  1202. }
  1203. if(this.yxndlbTime <= 20) this.yxndlbTime = 120;
  1204. this.PaijuHuiFang = [];////TL++,牌局回放 重置数据
  1205. // 初始信息
  1206. // if (this.over <= 0) {///////本房间开始的第一局游戏
  1207. // this.pjhffileName[this.pjhffileName.length] = this.PJHF.getjsonFileName(0,this.recordid,this.ctime);/////TL++,用于记录玩家牌局回放的json文件名
  1208. // // console.error("000HHHHHHHHHHHHHHHHHHHHHH",this.pjhffileName.length,this.pjhffileName);
  1209. // this.PJHF.writePJHFJson(this.getTableInfo(),0,this.id);////在开始第一局的时候将桌子信息写入本地的json文件
  1210. // }
  1211. let nowTime = Date.now();//当前时间戳
  1212. let jrStart = this.logic.getTodaySJC();////今日0时的时间戳
  1213. this.stime = nowTime;
  1214. let scoreBefore = Number(this.nowDiamond) + Number(this.nowDiamond2);//下注之前玩家的钻石
  1215. this.over++;
  1216. this.yazhus = this.logic.deepCloneTL(yazhus)//玩家本场押注情况
  1217. let bczxz = _.sum(this.yazhus);//本次总下注
  1218. console.warn("bczxz:",bczxz)
  1219. let jcPools = yield this.app.models.SGJJC.findByIdAsync('sgjjcs');
  1220. console.warn("jcpools:",jcPools)
  1221. let mqdw = -1;//目前挡位
  1222. let cjjcsjk = 1;//是否创建奖池数据库
  1223. if (jcPools) {
  1224. cjjcsjk = 2;
  1225. if(jcPools.levels && jcPools.levels.length > 0){
  1226. cjjcsjk = 3;
  1227. mqdw = this.logic.getMQDW(bczxz,jcPools.levels);//得到目前挡位
  1228. }
  1229. }
  1230. if(cjjcsjk < 3){
  1231. // console.warn("创建数据库",cjjcsjk);
  1232. if(cjjcsjk == 2) yield jcPools.removeAsync();
  1233. var sgjjc = new this.app.models.SGJJC({
  1234. _id: 'sgjjcs',
  1235. pools: [10000000,50000000,100000000],
  1236. cspools: [10000000,50000000,100000000],
  1237. levels: [0,1000,5000],
  1238. kouchus: [0,0,0], // 扣除列表(单位:1/100钻石)(奖池分为几个等级,数组就有几个元素)
  1239. topLimits1: [13000000,65000000,130000000], // 各个挡位对应的上限1调控数值(奖池分为几个等级,数组就有几个元素)
  1240. topLimits2: [15000000,75000000,150000000], // 各个挡位对应的上限2调控数值(奖池分为几个等级,数组就有几个元素)
  1241. topLimits3: [19000000,95000000,190000000], // 各个挡位对应的上限3调控数值(奖池分为几个等级,数组就有几个元素)
  1242. lowLimits1: [7000000,35000000,70000000], // 各个挡位对应的下限1调控数值(奖池分为几个等级,数组就有几个元素)
  1243. lowLimits2: [5000000,25000000,50000000], // 各个挡位对应的下限2调控数值(奖池分为几个等级,数组就有几个元素)
  1244. lowLimits3: [1000000, 5000000,10000000], // 各个挡位对应的下限3调控数值(奖池分为几个等级,数组就有几个元素)
  1245. paiTopRate1: [20,20,20], // 各个挡位对应的牌上限1调控比例(奖池分为几个等级,数组就有几个元素)
  1246. paiTopRate2: [50,50,50], // 各个挡位对应的牌上限2调控比例(奖池分为几个等级,数组就有几个元素)
  1247. paiTopRate3: [80,80,80], // 各个挡位对应的牌上限3调控比例(奖池分为几个等级,数组就有几个元素)
  1248. paiLowRate1: [20,20,20], // 各个挡位对应的牌下限1调控比例(奖池分为几个等级,数组就有几个元素)
  1249. paiLowRate2: [50,50,50], // 各个挡位对应的牌下限2调控比例(奖池分为几个等级,数组就有几个元素)
  1250. paiLowRate3: [80,80,80], // 各个挡位对应的牌下限3调控比例(奖池分为几个等级,数组就有几个元素)
  1251. bsTopRate1: [20,20,20], // 各个挡位对应的倍数上限1调控比例(奖池分为几个等级,数组就有几个元素)
  1252. bsTopRate2: [30,30,30], // 各个挡位对应的倍数上限2调控比例(奖池分为几个等级,数组就有几个元素)
  1253. bsTopRate3: [20,20,20], // 各个挡位对应的倍数上限3调控比例(奖池分为几个等级,数组就有几个元素)
  1254. bsLowRate1: [20,20,20], // 各个挡位对应的倍数下限1调控比例(奖池分为几个等级,数组就有几个元素)
  1255. bsLowRate2: [30,30,30], // 各个挡位对应的倍数下限2调控比例(奖池分为几个等级,数组就有几个元素)
  1256. bsLowRate3: [20,20,20], // 各个挡位对应的倍数下限3调控比例(奖池分为几个等级,数组就有几个元素)
  1257. ydxpools: [10000000,50000000,100000000], // 押大小奖池列表(单位:1/100钻石)(奖池分为几个等级,数组就有几个元素)
  1258. ydxcspools: [10000000,50000000,100000000], // 押大小初始奖池列表(单位:1/100钻石)(奖池分为几个等级,数组就有几个元素)
  1259. ydxlevels: [0,1000,10000], // 押大小挡位数组(单位:钻石)(奖池分为几个等级,数组就有几个元素)
  1260. ydxkouchus: [0,0,0], // 押大小扣除列表(单位:1/100钻石)(奖池分为几个等级,数组就有几个元素)
  1261. ydxtopLimits1: [13000000,65000000,130000000], // 押大小各个挡位对应的上限1调控数值(奖池分为几个等级,数组就有几个元素)
  1262. ydxtopLimits2: [15000000,75000000,150000000], // 押大小各个挡位对应的上限2调控数值(奖池分为几个等级,数组就有几个元素)
  1263. ydxtopLimits3: [19000000,95000000,190000000], // 押大小各个挡位对应的上限3调控数值(奖池分为几个等级,数组就有几个元素)
  1264. ydxlowLimits1: [7000000,35000000,70000000], // 押大小各个挡位对应的下限1调控数值(奖池分为几个等级,数组就有几个元素)
  1265. ydxlowLimits2: [5000000,25000000,50000000], // 押大小各个挡位对应的下限2调控数值(奖池分为几个等级,数组就有几个元素)
  1266. ydxlowLimits3: [1000000, 5000000,10000000], // 押大小各个挡位对应的下限3调控数值(奖池分为几个等级,数组就有几个元素)
  1267. ydxTopRate1: [20,20,20], // 押大小各个挡位对应的牌上限1调控比例(奖池分为几个等级,数组就有几个元素)
  1268. ydxTopRate2: [50,50,50], // 押大小各个挡位对应的牌上限2调控比例(奖池分为几个等级,数组就有几个元素)
  1269. ydxTopRate3: [80,80,80], // 押大小各个挡位对应的牌上限3调控比例(奖池分为几个等级,数组就有几个元素)
  1270. ydxLowRate1: [20,20,20], // 押大小各个挡位对应的牌下限1调控比例(奖池分为几个等级,数组就有几个元素)
  1271. ydxLowRate2: [50,50,50], // 押大小各个挡位对应的牌下限2调控比例(奖池分为几个等级,数组就有几个元素)
  1272. ydxLowRate3: [80,80,80] // 押大小各个挡位对应的牌下限3调控比例(奖池分为几个等级,数组就有几个元素)
  1273. });
  1274. mqdw = this.logic.getMQDW(bczxz,sgjjc.levels);//得到目前挡位
  1275. yield sgjjc.saveAsync();
  1276. // console.warn("检查是否维护状态");
  1277. }
  1278. this.nowDiamond -= bczxz;
  1279. // 发牌
  1280. this.fpRes = this.logic.handCards(this.yazhus,this.over,mqdw,jcPools,this.ownerUid);
  1281. var handCards = this.fpRes.cards;
  1282. let tspx = this.fpRes.tspx;//特殊牌型,0:没有,1:小三元,2:大三元,3:大四喜
  1283. let bcfpdydyzxbs = this.fpRes.bcfpdydyzxbs;//本次发牌对应的押注下注下标
  1284. let zjdypxbs = this.fpRes.zjdypxbs;//这局结果对应的牌值列表,用于计算获得列表判断任务
  1285. let xxydList = this.fpRes.xxydList;//详细赢得的列表
  1286. let winList = this.fpRes.winList;
  1287. let win = this.fpRes.win;
  1288. let bsIndex = this.fpRes.bsIndex;//本次发牌对应的倍数下标
  1289. let wingames = 0;//赢的小局次数
  1290. if(win >= bczxz) wingames = 1;
  1291. this.win = win;//本局结果赢得分数(不包含下注的即winsList元素总和)用于判断用户是否可以押分
  1292. this.nowDiamond += win;//玩家目前的钻石
  1293. let str5 = "table sgj数据---id:"+this.id +" 当前局 "+ (this.over)+" yzs "+JSON.stringify(this.yazhus);
  1294. str5+=(" nd "+this.nowDiamond+" win "+win+" pP "+this.logic.prizePool+" hc "+JSON.stringify(handCards))
  1295. logger.warn(str5);
  1296. let uId = 0;
  1297. let player = yield this.app.models.Player.findByIdAsync(this.ownerId, '_id userId name diamond cost');
  1298. if (player) {
  1299. player.diamond = this.nowDiamond + this.nowDiamond2;
  1300. uId = player.userId;
  1301. if(player.diamond < 0){
  1302. player.diamond = 0;
  1303. let stre = "table 这里出错了---id:"+this.id +" 当前局 "+ (this.over+1)+" uId "+uId+" nowDiamond "+this.nowDiamond + " nowDiamond2 " + this.nowDiamond2;
  1304. logger.warn(stre);////cssj
  1305. }
  1306. // player.cost -= this.cost;
  1307. yield player.saveAsync();
  1308. let str7 = "sgjtable 游戏开始计算结果之后保存钻石成功id: "+ this.id + " userId: " + player.userId + " name: " + player.name+" nowDiamond "+this.nowDiamond ;
  1309. logger.warn(str7);////cssj
  1310. }
  1311. this.users[0].diamond = (this.nowDiamond + this.nowDiamond2).toFixed(2);;
  1312. this.users[0].drCount = this.nowDiamond.toFixed(2);
  1313. // 水果机战绩
  1314. var sgjtable = new this.app.models.SGJTables({
  1315. _id: this.yxjlid,//ts++游戏记录id,
  1316. tableNo: this.id, // ts++房间号
  1317. ownerId: this.ownerId, // 玩家标识
  1318. agentId: this.agentId, // 代理ID
  1319. over: this.over, // 游戏局数
  1320. time: nowTime, // 结束时间
  1321. gameCost: bczxz, // 游戏消耗(本局下注总额)
  1322. giftCost: 0, // 礼物消耗
  1323. agentRebate: 0, // 代理返利
  1324. yazhuList: this.logic.deepCloneTL(this.yazhus), // 本局押注列表
  1325. resultList: this.logic.deepCloneTL(handCards), // 本局结果列表
  1326. winsList: this.logic.deepCloneTL(winList), // 本局结果赢的列表
  1327. win: win, // 本局结果赢得分数(不包含下注的即winsList元素总和)
  1328. bsIndex:bsIndex,//本次发牌对应的倍数下标,
  1329. huafenList:[], // 本局划分数据列表
  1330. scoreBefore: scoreBefore.toFixed(2), // 本局开始前的分数(钻石)
  1331. scoreEnd: (Number(this.nowDiamond) + (this.nowDiamond2)).toFixed(2), // 本局结束后的分数(=scoreBefore-押注总额+win)
  1332. });
  1333. //let addTaskQuan = bczxz*this.logic.toTaskQuanReate;
  1334. let addTaskQuan = bczxz/this.logic.nowCell*this.logic.toTaskQuanReate;
  1335. console.warn("bczxz:",bczxz," nowCell:",this.logic.nowCell, " toTaskQuanReate:",this.logic.toTaskQuanReate," addTaskQuan:",addTaskQuan)
  1336. let nowTaskQuan = 0;
  1337. yield sgjtable.saveAsync();
  1338. let getList = [];
  1339. let zfbAcc = "";
  1340. let zfbName = "";
  1341. var sgjUser = yield this.app.models.SGJUser.findByIdAsync(this.ownerId, 'userId cost win zfbAcc zfbName gameCount wingames taskQuan yazhuList getList getTime drCount drTime lastPlayTime');
  1342. if (sgjUser) {
  1343. var resTaskQuan = this.logic.jisuanFloat(sgjUser.taskQuan,addTaskQuan,1);
  1344. // 钻石记录
  1345. var taskquanrecord = new this.app.models.TaskQuanRecord({
  1346. _id: uuid.v1(),
  1347. playerId: player._id,
  1348. dType: 1,//下注
  1349. dSource: sgjUser.taskQuan,
  1350. dSwap: addTaskQuan.toFixed(2),
  1351. dNow: resTaskQuan
  1352. });
  1353. yield taskquanrecord.saveAsync()
  1354. // sgjUser.zfbAcc = "";
  1355. // sgjUser.zfbName = "";
  1356. zfbAcc = sgjUser.zfbAcc;
  1357. zfbName = sgjUser.zfbName;
  1358. if(sgjUser.userId == 0 && uId > 0){
  1359. sgjUser.userId = uId // 号码
  1360. }
  1361. sgjUser.cost+= bczxz;
  1362. sgjUser.win+= win;
  1363. sgjUser.gameCount += 1;
  1364. sgjUser.wingames += wingames;
  1365. sgjUser.taskQuan = this.logic.jisuanFloat(sgjUser.taskQuan,addTaskQuan,1);
  1366. this.users[0].taskQuan = sgjUser.taskQuan;
  1367. // sgjUser.taskQuan = 0;//测试时使用
  1368. nowTaskQuan = sgjUser.taskQuan;
  1369. if(!this.logic.getListIsSame(sgjUser.yazhuList,this.yazhus)){
  1370. // console.warn("下注列表和之前不一样======== ",sgjUser.yazhuList,this.yazhus);
  1371. sgjUser.yazhuList = this.logic.deepCloneTL(this.yazhus)
  1372. }
  1373. getList = this.logic.updateGetList(nowTime,sgjUser.getTime,sgjUser.getList,zjdypxbs,this.wjrwxylb);//更新获得列表
  1374. sgjUser.getList = this.logic.deepCloneTL(getList);
  1375. // console.warn("开始游戏uid ",uId);
  1376. // if(uId == 100046 || uId == 100055 || uId == 100002){
  1377. // for (var i = 0; i < getList.length; i++) {
  1378. // sgjUser.getList[i] = 100;
  1379. // }
  1380. // sgjUser.zfbAcc = "18511090980";
  1381. // sgjUser.zfbName = "张明";
  1382. // sgjUser.zfbBindTime = 1698422400000;
  1383. // sgjUser.taskQuan = 100000;
  1384. // }
  1385. sgjUser.getTime = nowTime; // 获得列表更新的时间
  1386. sgjUser.drCount = this.nowDiamond;
  1387. sgjUser.lastPlayTime = nowTime; // 玩家上次进入果游戏时间(留存人数)
  1388. yield sgjUser.saveAsync();
  1389. }
  1390. // else{
  1391. // nowTaskQuan = addTaskQuan;
  1392. // let wingames2 = 0 + wingames
  1393. // getList = this.logic.updateGetList(nowTime,0,[],zjdypxbs);//更新获得列表
  1394. // var newsgjUser = new this.app.models.SGJUser({
  1395. // _id: player._id, // 标识
  1396. // userId: player.userId, // 号码
  1397. // cost: bczxz, // 消费
  1398. // win: win, // 总赢得分
  1399. // zfbAcc: "", // 支付宝账号
  1400. // zfbName: "", // 支付宝姓名
  1401. // gameCount: 1, // 总小局次数
  1402. // wingames: wingames2, // 总赢的小局次数
  1403. // taskQuan: addTaskQuan, // 任务券(用于领任务)
  1404. // yazhuList: this.logic.deepCloneTL(this.yazhus), // 上局押注列表
  1405. // getList: this.logic.deepCloneTL(getList), // 获得的列表(用于计算任务是否完成)
  1406. // getTime: nowTime, // 获得列表更新的时间
  1407. // registerTime: nowTime // 玩家首次进入水果游戏时间
  1408. // // taskList: [], // 玩家已领任务的列表[任务下标,领取时间,完成次数]
  1409. // });
  1410. // yield newsgjUser.saveAsync();
  1411. // }
  1412. // console.warn("本次总下注 "+bczxz+" addTaskQuan "+addTaskQuan+" nowTaskQuan "+nowTaskQuan);
  1413. // 掷骰子
  1414. var SGJUserTongjis = yield this.app.models.SGJUserTongji.findMongoAsync({todaytime:this.logic.getTodaySJC()})
  1415. if (SGJUserTongjis.length == 0) {
  1416. var SGJUserTongji = this.app.models.SGJUserTongji({
  1417. _id: uuid.v1(),
  1418. //userId: player.userId,
  1419. //usdt: this.users[0].diamond,
  1420. sgjwinlose: (Number(win)-Number(_.sum(yazhus))).toFixed(2),//下注
  1421. taskquanget: addTaskQuan,
  1422. nowtaskquan: sgjUser.taskQuan,
  1423. todaytime: this.logic.getTodaySJC()
  1424. });
  1425. console.warn("empty win:",win)
  1426. console.warn("_.sum(yazhus):",_.sum(yazhus))
  1427. yield SGJUserTongji.saveAsync()
  1428. }else {
  1429. var SGJUserTongji = SGJUserTongjis[0]
  1430. console.warn("SGJUserTongji:",SGJUserTongji)
  1431. SGJUserTongji.sgjwinlose = (Number(SGJUserTongji.sgjwinlose) - Number(_.sum(yazhus))+Number(win)).toFixed(2)//下注
  1432. SGJUserTongji.nowtaskquan = sgjUser.taskQuan
  1433. SGJUserTongji.taskquanget = (Number(SGJUserTongji.taskquanget)+Number(addTaskQuan)).toFixed(2)
  1434. console.warn("have data win:",win)
  1435. console.warn("_.sum(yazhus):",_.sum(yazhus))
  1436. console.warn("SGJUserTongji:sgjwinlose",SGJUserTongji.sgjwinlose)
  1437. yield SGJUserTongji.saveAsync()
  1438. }
  1439. var sttGame = {
  1440. over: this.over,
  1441. state: this.state,
  1442. yazhus:this.logic.deepCloneTL(this.yazhus),
  1443. nowDiamond:this.nowDiamond.toFixed(2),
  1444. win:win.toFixed(2),
  1445. handCards:handCards,
  1446. bsIndex:bsIndex,//本次发牌对应的倍数下标,
  1447. tspx:tspx,//特殊牌型,0:没有,1:小三元,2:大三元,3:大四喜
  1448. prizePool: this.logic.prizePool,
  1449. nowTaskQuan:nowTaskQuan.toFixed(2),
  1450. yxndlbTime:this.yxndlbTime,
  1451. yxndlbTip:this.yxndlbTip,
  1452. };
  1453. let jjcsl = 0//进奖池数量
  1454. let bcsy = win - bczxz;//本次输赢
  1455. let xkcbl = this.logic.jisuanFloat(this.logic.yzjjckcReate,this.logic.fqjjckcReate,1);//进出奖池需扣掉的比例
  1456. let xkcsl = this.logic.jisuanFloat(bczxz,xkcbl,3);//进出奖池需扣掉的数量
  1457. if(bcsy >= 0){//押中赢了,奖池要亏
  1458. let jczs = this.logic.jisuanFloat(bcsy,xkcsl,1)*-1;//进出钻石
  1459. jjcsl = this.logic.jisuanFloat(jczs,this.logic.jcdwzhwzs,3);
  1460. console.warn("bcsy:",bcsy," xkcsl:",xkcsl, " jczs:",jczs, " jjcsl:",jjcsl)
  1461. }
  1462. else{//未押中输了,奖池要盈
  1463. let bcsd = bczxz-win;//本次输的
  1464. let jczs = this.logic.jisuanFloat(bcsd,xkcsl,2);//进出钻石
  1465. jjcsl = this.logic.jisuanFloat(jczs,this.logic.jcdwzhwzs,3);//下的太多赢得太少情况下这里出现负数很正常
  1466. console.warn("bcsd:",bcsd," bczxz:",bczxz," win:",win," xkcsl:",xkcsl, " jczs:",jczs, " jjcsl:",jjcsl)
  1467. }
  1468. if (jcPools) {
  1469. console.warn(1433)
  1470. if(mqdw >= 0 && mqdw < jcPools.pools.length){
  1471. let xzpool = _.cloneDeep(jcPools.pools);
  1472. xzpool[mqdw] += jjcsl;
  1473. // console.warn("奖池保存结果111 ",mqdw,jcPools.pools, xzpool,jjcsl);
  1474. let xzkouchu = _.cloneDeep(jcPools.kouchus);
  1475. xzkouchu[mqdw] += this.logic.jisuanFloat(xkcsl,this.logic.jcdwzhwzs,3);
  1476. // console.warn("奖池保存结果222 ",mqdw,jcPools.kouchus, xzkouchu,xkcsl);
  1477. jcPools.pools = _.cloneDeep(xzpool);
  1478. jcPools.kouchus = _.cloneDeep(xzkouchu);
  1479. console.warn("xzpool:",xzpool)
  1480. console.warn("pools:",jcPools.pools)
  1481. yield jcPools.saveAsync();
  1482. }
  1483. }
  1484. else{
  1485. console.warn("1454")
  1486. var sgjjc = yield this.app.models.SGJJC.findByIdAsync('sgjjcs', 'pools cspools levels kouchus');
  1487. if(sgjjc){
  1488. if(mqdw >= 0 && mqdw < sgjjc.pools.length){
  1489. let xzpool = _.cloneDeep(sgjjc.pools);
  1490. xzpool[mqdw] += jjcsl;
  1491. // console.warn("奖池保存结果333 ",mqdw,sgjjc.pools, xzpool,jjcsl);
  1492. let xzkouchu = _.cloneDeep(sgjjc.kouchus);
  1493. xzkouchu[mqdw] += this.logic.jisuanFloat(xkcsl,this.logic.jcdwzhwzs,3);
  1494. // console.warn("奖池保存结果444 ",mqdw,sgjjc.kouchus, xzkouchu,xkcsl);
  1495. sgjjc.pools = _.cloneDeep(xzpool);
  1496. sgjjc.kouchus = _.cloneDeep(xzkouchu);
  1497. console.warn("xzpool:",xzpool)
  1498. console.warn("pools:",sgjjc.pools)
  1499. yield sgjjc.saveAsync();
  1500. }
  1501. }
  1502. }
  1503. this.ydxfpRes = {
  1504. cs:0,//本局押大小的次数,用于实现只能在首次押大小之前点击加分
  1505. type: -1,//本局玩家上次押大小的类型,-1表示还未押过大小,1表示押小2表示押大
  1506. number: -1,//本局玩家上次押大小的发牌,-1表示还未押过大小
  1507. };//本局的押大小发牌
  1508. //下面是计算统计数据
  1509. this.zqqCost += bczxz; //所有玩家游戏转圈总下注
  1510. this.zqqwin += win; //所有玩家游戏转圈总赢得
  1511. this.zqqxh += bcsy*-1; //所有玩家游戏转圈总消耗(总下注-总赢得)
  1512. this.allrwq = this.logic.jisuanFloat(this.allrwq,addTaskQuan,1); //所有奖券产生总量
  1513. this.allCost += bczxz; //所有玩家总下注
  1514. this.allwin += win; //所有玩家总赢得
  1515. this.allxh += bcsy*-1; //所有玩家总消耗(总下注-总赢得)
  1516. for (var i = 0; i < this.yazhus.length; i++) {
  1517. if(!this.allyzze [i]) this.allyzze [i] = 0;
  1518. this.allyzze [i] += this.yazhus[i]
  1519. }
  1520. for (var i = 0; i < winList.length; i++) {
  1521. if(!this.allydze [i]) this.allydze [i] = 0;
  1522. this.allydze [i] += winList[i]
  1523. }
  1524. if(tspx == 0){//特殊牌型,0:没有,1:小三元,2:大三元,3:大四喜
  1525. this.logic.getGXXXYDZEList(this.gxzydze,xxydList);//总赢得总额列表(不包含特殊项)
  1526. if(handCards[0] == 9 || handCards[0] == 21) {
  1527. if(!this.gxzydze[8]) this.gxzydze[8] = 0
  1528. this.gxzydze[8]+=win;
  1529. }
  1530. this.logic.getAllGetList(this.gxcxzcs,zjdypxbs);//出现总次数列表(不包含特殊项)
  1531. }
  1532. else if(tspx >= 1 && tspx <= 3){
  1533. for (var i = 0; i < tspx; i++) {
  1534. if(!this.tsxzydze[i]) this.tsxzydze[i] = 0;
  1535. if(!this.tsxcxzcs[i]) this.tsxcxzcs[i] = 0;
  1536. }
  1537. console.warn("记录特殊==== ",tspx,this.tsxzydze,this.tsxcxzcs);
  1538. if(!this.tsxzydze[tspx-1]) this.tsxzydze[tspx-1] = 0;
  1539. this.tsxzydze[tspx-1] += win;
  1540. if(!this.tsxcxzcs[tspx-1]) this.tsxcxzcs[tspx-1] = 0;
  1541. this.tsxcxzcs[tspx-1]++;
  1542. }
  1543. let phdata = {
  1544. bczxz: bczxz,//本次总下注
  1545. addTaskQuan: addTaskQuan,//本次增加的任务券
  1546. jrStart: jrStart,//本次游戏时间对应的0点时间戳
  1547. nowTime: nowTime//本次游戏的时间
  1548. }
  1549. yield this.setPaiHangData(phdata);
  1550. // console.warn("游侠开始*******************this.chBanker",this.chBanker);
  1551. this.setPaijuHuiFangData(M.START_GAME,sttGame);/////TL++ 牌局回放 push游戏开始
  1552. // 开始通知
  1553. console.warn("sttGame:",sttGame)
  1554. yield this.pushMsgAsync(-1, 'shuiguo_event', { type: M.START_GAME, data: sttGame });
  1555. // let endmode=ENDMODE.NORMALEND//局数完成--正常结束
  1556. // let endmode=ENDMODE.PLAYING;
  1557. // yield this.endResultAsync(endmode);
  1558. // console.warn("游戏开始执行完毕 this.state "+this.state);
  1559. yield this.taskReward(this.ownerId,zfbAcc,zfbName,getList);
  1560. let str3 = "table 222开始游戏执行完毕 下面是是返回---id:"+this.id +","+ this.state;
  1561. logger.warn(str3);////cssj
  1562. // console.warn("游戏开始执行完毕 下面是是返回 "+this.state);
  1563. return { code: C.OK };
  1564. });
  1565. //
  1566. proto.taskReward = cor(function* (playerId,zfbAcc,zfbName,_getList) {
  1567. // if(!zfbAcc || !zfbName) return { code: C.OK };//该玩家没有支付宝信息
  1568. let opts0 = {
  1569. playerId: playerId,
  1570. state:0,
  1571. wcTime:0
  1572. };
  1573. var ylrwList = yield this.app.models.SGJTask.findMongoAsync(opts0, '_id des cost reachs reachC rewards state');
  1574. if(ylrwList.length == 0) return { code: C.OK };//该玩家没有已领取的任务
  1575. let overTaskRes = this.logic.getOverTask(_getList,ylrwList);
  1576. let ywcrwzjlist = [];//已完成任务主键列表
  1577. if(overTaskRes.overList.length > 0){
  1578. for (var i = 0; i < overTaskRes.overList.length; i++) {
  1579. let xb = overTaskRes.overList[i];
  1580. let zj = ylrwList[i]._id;
  1581. var ywcList = yield this.app.models.SGJTask.findByIdAsync(zj,'reachs reachC state wcTime');
  1582. if(ywcList){
  1583. ywcList.state = 1; //任务状态0:未完成,1:已完成,2:发奖中,3:已发奖,
  1584. ywcList.wcTime = Date.now(); //完成时间
  1585. // console.warn("发奖成功之qian更新任务状态 ",zj)
  1586. yield ywcList.saveAsync();
  1587. ywcrwzjlist[ywcrwzjlist.length] = zj;
  1588. if(this.wjrwxylb.length > 0){
  1589. for (var j = 0; j < ywcList.reachs.length; j++) {
  1590. let rwyqlx = ywcList.reachs[j];//任务要求类型
  1591. let rwyqsl = ywcList.reachC[j];//任务要求类型
  1592. if(this.wjrwxylb[rwyqlx] >= rwyqsl){
  1593. this.wjrwxylb[rwyqlx] -= rwyqsl;
  1594. // console.warn("任务完成 玩家已领未完成任务需要的任务要求列表 ",this.wjrwxylb,rwyqlx,rwyqsl);
  1595. }
  1596. else{
  1597. let str3 = "table 任务要求个数出错---id:"+this.id +" 当前局 "+ this.over+" wjrwxylb "+this.wjrwxylb+" rwyqlx "+rwyqlx+" rwyqsl "+rwyqsl;
  1598. logger.error(str3);////cssj
  1599. }
  1600. }
  1601. }
  1602. else{
  1603. let str4 = "table 任务要求出错---id:"+this.id +" 当前局 "+ this.over+" cd "+this.wjrwxylb.length+" playerId "+playerId;
  1604. logger.error(str4);////cssj
  1605. }
  1606. }
  1607. else{
  1608. logger.error("任务主键出错了没有找到记录: "+zj);
  1609. }
  1610. }
  1611. var sgjUser = yield this.app.models.SGJUser.findByIdAsync(this.ownerId, 'getList');
  1612. if (sgjUser) {
  1613. // console.warn("发奖成功之后保存getlist ",sgjUser.getList,overTaskRes.getList)
  1614. sgjUser.getList = _.cloneDeep(overTaskRes.getList);
  1615. yield sgjUser.saveAsync();
  1616. }
  1617. //至此已经有任务完成了
  1618. // let fjres = yield this.sendTaskRecord(2,ywcrwzjlist);
  1619. // ////// return { code: C.OK, data: result};{"message":"操作成功","errorCode":0,"success":true,"data":null}
  1620. // console.warn("发奖成功信息 ",JSON.stringify(fjres));
  1621. // if(fjres.code == C.OK && fjres.data.success == true){
  1622. // //发奖成功
  1623. // for (var i = 0; i < overTaskRes.overList.length; i++) {
  1624. // let xb = overTaskRes.overList[i];
  1625. // let zj = ylrwList[i]._id;
  1626. // var ywcList = yield this.app.models.SGJTask.findByIdAsync(zj,'state fjTime');
  1627. // if(ywcList){
  1628. // ywcList.state = 3; //任务状态0:未完成,1:已完成,2:发奖中,3:已发奖,
  1629. // ywcList.fjTime = Date.now(); //发奖时间
  1630. // console.warn("发奖成功之后更新任务状态 ",zj);
  1631. // yield ywcList.saveAsync();
  1632. // }
  1633. // }
  1634. // }
  1635. }
  1636. return { code: C.OK };
  1637. });
  1638. // 划分
  1639. proto.huafenAsync = cor(function* (type,value) {
  1640. if(this.win <= 0){//本局结果赢得分数(不包含下注的即winsList元素总和)用于判断用户是否可以押分
  1641. console.warn("remove 1616")
  1642. return { code: C.FAILD, msg: C.TABLE_MASK_ERROR };
  1643. }
  1644. value = parseFloat(value.toFixed(2));
  1645. if(this.nowDiamond < value){
  1646. return { code: C.FAILD, msg: "不能超出身上已有钻石" };
  1647. }
  1648. if((value*1000)%((this.logic.nowCell*1000)) != 0){
  1649. let str = "table 押大小数值出错了---id:"+this.id +" 当前局 "+ (this.over+1)+" this.ownerUid "+this.ownerUid+" value "+value;
  1650. logger.warn(str);////cssj
  1651. return { code: C.FAILD, msg: "押大小数值出错了 前端的问题 "+value };
  1652. }
  1653. // let fjres = yield this.sendTaskRecord();
  1654. // console.warn("划分2222 ",JSON.stringify(fjres));
  1655. if(this.logic.getTodaySJC() != this.mrrstjsj){
  1656. // console.warn("昨日数据还未统计222");
  1657. yield this.tjbjlmryxrs();
  1658. }
  1659. this.win = value;
  1660. // let cz = this.win - value;//前端加减分之后修改的差值
  1661. let scoreBefore = this.nowDiamond;//划分之前玩家的钻石
  1662. let mqdw = -1;//目前挡位
  1663. let jcPools = yield this.app.models.SGJJC.findByIdAsync('sgjjcs');
  1664. if (jcPools) {
  1665. if(jcPools.ydxpools && jcPools.ydxpools.length > 0){
  1666. mqdw = this.logic.getMQDW(value,jcPools.ydxlevels);//得到目前挡位
  1667. }
  1668. }
  1669. let res = this.logic.getHuafenRes(type,value,mqdw,jcPools);
  1670. this.ydxfpRes.cs++;// 本局押大小次数
  1671. let ydxcs = this.ydxfpRes.cs;// 本局押大小次数
  1672. // console.warn("本局押大小次数 ",ydxcs, this.ydxfpRes.cs);
  1673. this.ydxfpRes = {
  1674. cs:ydxcs,//本局押大小的次数,用于实现只能在首次押大小之前点击加分
  1675. type: type,//本局玩家上次押大小的类型,-1表示还未押过大小,1表示押小2表示押大
  1676. number: res.number,//本局玩家上次押大小的发牌,-1表示还未押过大小
  1677. };//本局的押大小发牌
  1678. this.win += res.win;//本局结果赢得分数(不包含下注的即winsList元素总和)用于判断用户是否可以押分
  1679. this.nowDiamond = this.nowDiamond - value + this.win;//玩家目前的钻石
  1680. let addTaskQuan = 0//res.addTaskQuan.toFixed(2);;
  1681. let str5 = "table sgj划分 数据---id:"+this.id +" 当前局 "+ this.over+" type "+type+" value "+value;
  1682. str5+=(" nd "+this.nowDiamond+" win "+this.win+" pP "+this.logic.prizePool+" hc "+JSON.stringify(res))
  1683. logger.warn(str5);
  1684. let player = yield this.app.models.Player.findByIdAsync(this.ownerId, '_id diamond cost name userId');
  1685. if (player) {
  1686. player.diamond = this.nowDiamond + this.nowDiamond2;
  1687. // player.cost -= this.cost;
  1688. if(player.diamond < 0){
  1689. player.diamond = 0;
  1690. let stre = "table 这里出错了---222id:"+this.id +" 当前局 "+ (this.over+1)+" ownerUid "+this.ownerUid+" nowDiamond "+this.nowDiamond + " nowDiamond2 " + this.nowDiamond2;
  1691. logger.warn(stre);////cssj
  1692. }
  1693. yield player.saveAsync();
  1694. let str7 = "sgjtable 划分计算结果之后保存钻石成功id: "+ this.id + " userId: " + player.userId + " name: " + player.name+" nowDiamond "+this.nowDiamond ;
  1695. logger.warn(str7);////cssj
  1696. }
  1697. let nowTime = Date.now();
  1698. let jrStart = this.logic.getTodaySJC();////今日0时的时间戳
  1699. this.users[0].diamond = this.nowDiamond + this.nowDiamond2;
  1700. this.users[0].drCount = this.nowDiamond;
  1701. // 水果机战绩里面划分列表增加数据
  1702. let sgjtable = yield this.app.models.SGJTables.findByIdAsync(this.yxjlid, '_id huafenList');
  1703. if (sgjtable) {
  1704. let huafenItem = {
  1705. yddx: type, // 本次划分玩家押的大小
  1706. hfxz: value, // 本次划分的下注
  1707. hfjg: res.number, // 本次划分的发牌结果
  1708. bcyd: res.win, // 本次划分赢的
  1709. ksfs: scoreBefore, // 本次划分开始时的钻石(下注之前的)
  1710. jsfs: this.nowDiamond + this.nowDiamond2, // 本次划分结束时的钻石(jsfs = ksfs-hfxz+bcyd)
  1711. time: nowTime // 本条划分记录时间
  1712. }
  1713. let newlb = _.cloneDeep(sgjtable.huafenList);
  1714. newlb[newlb.length] = huafenItem;
  1715. sgjtable.huafenList = _.cloneDeep(newlb);
  1716. yield sgjtable.saveAsync();
  1717. }
  1718. let nowTaskQuan = 0;
  1719. var sgjUser = yield this.app.models.SGJUser.findByIdAsync(this.ownerId, 'userId cost win taskQuan drCount drTime lastYDXTime');
  1720. if (sgjUser) {
  1721. sgjUser.cost+= value;
  1722. sgjUser.win+= this.win;
  1723. //sgjUser.taskQuan = this.logic.jisuanFloat(sgjUser.taskQuan,addTaskQuan,1);
  1724. nowTaskQuan = sgjUser.taskQuan;
  1725. sgjUser.drCount = this.nowDiamond;
  1726. sgjUser.lastYDXTime = nowTime;
  1727. this.users[0].taskQuan = sgjUser.taskQuan;
  1728. yield sgjUser.saveAsync();
  1729. }
  1730. if (jcPools) {
  1731. if(mqdw >= 0 && mqdw <jcPools.ydxpools.length){
  1732. let jjcsl = 0//进奖池数量
  1733. let xkcsl = this.logic.jisuanFloat(value,this.logic.fqjjckcReate,3);//进出奖池需扣掉的数量
  1734. if(res.win >= 0){//押中赢了,奖池要亏
  1735. let jczs = this.logic.jisuanFloat(res.win,xkcsl,1)*-1;//进出钻石
  1736. jjcsl = this.logic.jisuanFloat(jczs,this.logic.jcdwzhwzs,3);
  1737. }
  1738. else{//未押中输了,奖池要盈
  1739. let jczs = this.logic.jisuanFloat(res.win*-1,xkcsl,2);//进出钻石
  1740. jjcsl = this.logic.jisuanFloat(jczs,this.logic.jcdwzhwzs,3);
  1741. }
  1742. let xzpool = _.cloneDeep(jcPools.ydxpools);
  1743. xzpool[mqdw] += jjcsl;
  1744. // console.warn("ydx奖池保存结果111 ",mqdw,jcPools.ydxpools, xzpool,jjcsl);
  1745. let xzkouchu = _.cloneDeep(jcPools.ydxkouchus);
  1746. xzkouchu[mqdw] += this.logic.jisuanFloat(xkcsl,this.logic.jcdwzhwzs,3);
  1747. // console.warn("ydx奖池保存结果222 ",mqdw,jcPools.ydxkouchus, xzkouchu,xkcsl);
  1748. jcPools.ydxkouchus = _.cloneDeep(xzkouchu);
  1749. jcPools.ydxpools = _.cloneDeep(xzpool);
  1750. yield jcPools.saveAsync();
  1751. }
  1752. }
  1753. //下面是计算统计数据
  1754. this.ydxCost += value; //所有玩家押大小总下注
  1755. if(res.win >= 0) this.ydxwin += res.win*2; //所有玩家押大小总赢得
  1756. this.ydxxh += res.win*-1; //所有玩家押大小总消耗(总下注-总赢得)
  1757. this.ydxzcs += 1; //该日押大小总次数
  1758. this.allrwq = this.logic.jisuanFloat(this.allrwq,addTaskQuan,1).toFixed(2); //所有奖券产生总量
  1759. this.allCost += value; //所有玩家总下注
  1760. if(res.win >= 0) this.allwin += res.win*2; //所有玩家总赢得
  1761. this.allxh += res.win*-1; //所有玩家总消耗(总下注-总赢得)
  1762. let phdata = {
  1763. bczxz: value.toFixed(2),//本次总下注
  1764. addTaskQuan: addTaskQuan,//本次增加的任务券
  1765. jrStart: jrStart,//本次游戏时间对应的0点时间戳
  1766. nowTime: nowTime//本次游戏的时间
  1767. }
  1768. yield this.setPaiHangData(phdata);
  1769. // console.warn("划分返回111");
  1770. let data = this.logic.deepCloneTL(res);
  1771. data.ydxcs = ydxcs; // 本局押大小次数
  1772. data.nowDiamond = this.nowDiamond;
  1773. data.value = value;
  1774. data.nowTaskQuan = nowTaskQuan.toFixed(2);
  1775. yield this.pushMsgAsync(-1, 'shuiguo_event', { type: M.COMPARE_RESULT, data: data });
  1776. //console.warn("data:",data)
  1777. var SGJUserTongjis = yield this.app.models.SGJUserTongji.findMongoAsync({todaytime:this.logic.getTodaySJC()})
  1778. var SGJUserTongji = null
  1779. if (SGJUserTongjis.length == 0) {
  1780. SGJUserTongji = this.app.models.SGJUserTongji({
  1781. _id: uuid.v1(),
  1782. userId: user.userId,
  1783. usdt: user.diamond,
  1784. taskquanlose: cost,//下注
  1785. todaytime: this.logic.getTodaySJC()
  1786. });
  1787. yield SGJUserTongji.saveAsync()
  1788. }else {
  1789. SGJUserTongji = SGJUserTongjis[0]
  1790. SGJUserTongji.usdt = data.nowDiamond
  1791. SGJUserTongji.sgjwinlose = (Number(SGJUserTongji.sgjwinlose) +Number(data.win)).toFixed(2)//下注
  1792. yield SGJUserTongji.saveAsync()
  1793. }
  1794. // console.warn("划分返回222 "+JSON.stringify(data));
  1795. return { code: C.OK, data: data };
  1796. });
  1797. // 统计并记录每日游戏人数数据(今天首局记录昨天的数据)
  1798. proto.tjbjlmryxrs = cor(function* () {
  1799. let jrStart = this.logic.getTodaySJC();////今日0时的时间戳
  1800. let zrStart = jrStart - 86400000;////昨日0时的时间戳
  1801. // console.warn("统计并记录每日游戏人数数据 jrStart "+jrStart+" zrStart "+zrStart);
  1802. var sgjmrsj = yield this.app.models.SGJMRRS.findByIdAsync(""+zrStart);
  1803. if (sgjmrsj) {
  1804. this.mrrstjsj = jrStart;//每日人数统计时间,用于判断在游戏和押大小时是否需要统计记录昨天的人数信息实现减少数据库访问
  1805. // return { code: C.OK, msg: "昨日已经统计过了" };
  1806. }
  1807. else{
  1808. //创建昨日人数数据
  1809. let opts1 = { registerTime: { $gte: zrStart, $lt: jrStart}};
  1810. let grzcrs = yield this.app.models.SGJUser.countMongoAsync(opts1);
  1811. let opts2 = { registerTime: { $gte: zrStart, $lt: jrStart},
  1812. lastPlayTime: { $gte: zrStart, $lt: jrStart}};
  1813. let xzyxrs = yield this.app.models.SGJUser.countMongoAsync(opts2);
  1814. let opts3 = { lastPlayTime: { $gte: zrStart, $lt: jrStart}};
  1815. let grzqrs = yield this.app.models.SGJUser.countMongoAsync(opts3);
  1816. let opts4 = { lastYDXTime: { $gte: zrStart, $lt: jrStart}};
  1817. let ydxzrs = yield this.app.models.SGJUser.countMongoAsync(opts4);
  1818. let opts5 = { time: { $gte: zrStart, $lt: jrStart}};
  1819. let grzqcs = yield this.app.models.SGJTables.countMongoAsync(opts5);
  1820. let ydxzcs = 0;
  1821. var sgjmrtj = yield this.app.models.SGJMRTJ.findByIdAsync(""+zrStart, 'ydxzcs');
  1822. if (sgjmrtj) {
  1823. ydxzcs = sgjmrtj.ydxzcs;
  1824. }
  1825. var newsgjmrsj = new this.app.models.SGJMRRS({
  1826. _id: ""+zrStart, // 标识(日期)
  1827. grzcrs: grzcrs, //该日注册人数(按照进入时间算)
  1828. xzyxrs: xzyxrs, //该日新增有效人数(玩过游戏的算为有效)
  1829. grzqrs: grzqrs, //该日转圈人数
  1830. ydxzrs: ydxzrs, //该日押大小总人数
  1831. grzqcs: grzqcs, //该日转圈次数
  1832. ydxzcs: ydxzcs, //该日押大小次数
  1833. lcrs1: 0, //该日的次日留存人数(按照进入算)
  1834. lcrs7: 0, //该日的7日留存人数
  1835. time: Date.now(), // 精确时间
  1836. registerTime: zrStart// 记录时间(该日0点时间戳)
  1837. });
  1838. yield newsgjmrsj.saveAsync();
  1839. // console.warn("保存每日人数111 ",newsgjmrsj);
  1840. //更新前日的次日留存人数
  1841. let kssj1 = zrStart - 86400000;////2日前0时的时间戳,用于更新2日前那条记录的次日留存人数
  1842. var sgjmrsj1 = yield this.app.models.SGJMRRS.findByIdAsync(""+kssj1, 'lcrs1');
  1843. if (sgjmrsj1) {
  1844. let opts7 = { lastJoinTime: { $gte: zrStart-86400000, $lt: zrStart}};
  1845. let lcrs1 = yield this.app.models.SGJUser.countMongoAsync(opts7);
  1846. sgjmrsj1.lcrs1 = lcrs1;
  1847. yield sgjmrsj1.saveAsync();
  1848. // console.warn("保存每日人数222 ",lcrs1);
  1849. }
  1850. //更新7日前的次日留存人数
  1851. let kssj7 = zrStart - 7*86400000;////2日前0时的时间戳,用于更新2日前那条记录的次日留存人数
  1852. var sgjmrsj7 = yield this.app.models.SGJMRRS.findByIdAsync(""+kssj7, 'lcrs7');
  1853. if (sgjmrsj7) {
  1854. let opts8 = { lastJoinTime: { $gte: zrStart-86400000, $lt: zrStart}};
  1855. let lcrs7 = yield this.app.models.SGJUser.countMongoAsync(opts8);
  1856. sgjmrsj7.lcrs7 = lcrs7;
  1857. yield sgjmrsj7.saveAsync();
  1858. // console.warn("保存每日人数333 ",lcrs7);
  1859. }
  1860. this.mrrstjsj = jrStart;//每日人数统计时间,用于判断在游戏和押大小时是否需要统计记录昨天的人数信息实现减少数据库访问
  1861. }
  1862. // return { code: C.OK, msg: "昨日统计完成" };
  1863. });
  1864. ////任务发奖
  1865. proto.sendTaskRecord = cor(function* (type,ywcrwzjlist) {
  1866. // console.warn("任务发奖 ywcrwzjlist "+ywcrwzjlist);
  1867. // 判断的是否是JSON字符串
  1868. let getIsAJsonStr22 = function (str) {
  1869. // console.warn("判断的是否是JSON字符串 "+str);
  1870. if (typeof str == 'string') {
  1871. try {
  1872. var obj = JSON.parse(str);
  1873. if (typeof obj == 'object' && obj) {
  1874. return true;
  1875. } else {
  1876. //不是就返回false
  1877. return false;
  1878. }
  1879. }
  1880. catch (e) {
  1881. return false;
  1882. }
  1883. }
  1884. return false;
  1885. }
  1886. // var player = yield this.app.models.sgjUser.findByIdAsync(this.ownerId, 'zfbAcc zfbName');
  1887. // if (player) {
  1888. let p = this.ownerId; //用户id
  1889. // let idsList = _.cloneDeep(ywcrwzjlist);//任务主键列表数组
  1890. let idsStr = "";//JSON.stringify(ywcrwzjlist);//任务主键列表字符串
  1891. for (var i = 0; i < ywcrwzjlist.length; i++) {
  1892. let sss = ""+ywcrwzjlist[i];
  1893. if(i < ywcrwzjlist.length - 1) sss+=",";
  1894. idsStr+=sss;
  1895. }
  1896. let t = type; // 类型 1:绑定支付宝,2:水果游戏任务奖励
  1897. let r=""; // 说明
  1898. let tsT = Date.now();
  1899. let key = "xxxxxxx"
  1900. let str1 = ""+p+idsStr+key+t+r+tsT;
  1901. let md51 = md5(str1).toUpperCase();
  1902. let str2 = ""+md51+tsT;
  1903. let md52 = md5(str2).toUpperCase();
  1904. let sign = md52;
  1905. let post_data={
  1906. p: p,
  1907. idsStr:idsStr,
  1908. t: t,
  1909. r: r,
  1910. tsT: tsT,
  1911. s: sign
  1912. };//请求数据
  1913. // console.warn("任务发奖 post_data "+post_data);
  1914. let reqdata = JSON.stringify(post_data);
  1915. let options = {
  1916. hostname: 'aa.bb.cc.com',
  1917. port: '',
  1918. path: '/sfM/giveOut',
  1919. method: 'POST',
  1920. rejectUnauthorized: false,
  1921. requestCert: true,
  1922. headers: {
  1923. 'Content-Type': 'Application/json',
  1924. "Content-Length":reqdata.length
  1925. }
  1926. };
  1927. var req = https.request(options, function (res) {
  1928. });
  1929. req.write(reqdata);
  1930. req.on('response', function (response2) {
  1931. // console.warn("请求到这里了???222 response2.headers "+JSON.stringify(response2.headers) );
  1932. req.end();
  1933. let body2 = "";
  1934. response2.on('data', function (chunk) {
  1935. body2 = chunk.toString();
  1936. // console.warn("请求到这里了???555 chunk "+body2);
  1937. if(!getIsAJsonStr22(body2)){
  1938. console.error("接口返回值非json字符串 "+body2);
  1939. return {code: C.ERROR, msg: 114 };//"验证码发送失败"
  1940. }
  1941. let result = JSON.parse(body2);
  1942. // console.warn("请求到这里了???56 chunk "+result.success);
  1943. if(result.success){
  1944. // console.warn("任务发奖成功 "+this.ownerId+" "+JSON.stringify(result) );
  1945. return { code: C.OK, data: result};
  1946. }
  1947. else{
  1948. console.error("任务发奖出错了 "+body2);
  1949. return {code: C.ERROR, msg: 115 };//"验证码发送失败"
  1950. }
  1951. // console.warn("这里都到返回值了222 ")
  1952. });
  1953. // console.warn("请求到这里了???666 body2 "+body2)
  1954. });
  1955. req.on('error', function (e) {
  1956. req.end();
  1957. console.error(new Error('request FJ error: ' + e.message));
  1958. return { code: C.ERROR, msg: 116 };//"请求验证码失败"
  1959. });
  1960. // }
  1961. // console.warn("请求支付宝完成了 ")
  1962. var data = {
  1963. // renwuPool: allRenWuInfo,
  1964. }
  1965. return { code: C.OK, data: data };
  1966. });
  1967. // //ts++写分 endtype = { 正常: 0,局数完成: 1, 房主解散: 2, 申请解散: 3 ,超时解散: 4 };
  1968. // proto.writeResultAsync = cor(function* (endmode) {
  1969. // if(this.yjxrzj){
  1970. // logger.warn("出错了已经写入过战绩了-------------- " + this.yjxrzj );
  1971. // return;
  1972. // }
  1973. // this.yjxrzj = true;
  1974. // yield this.writeResultAsync2(endmode);
  1975. // });
  1976. // //ts++写分 endtype = { 正常: 0,局数完成: 1, 房主解散: 2, 申请解散: 3 ,超时解散: 4 };
  1977. // proto.writeResultAsync2 = cor(function* (endmode) {
  1978. // logger.warn("牌局写入-------------- " + this.id );
  1979. // // console.warn("ts++---------牌局写入writeResultAsync",this.id);
  1980. // let gameCost=0;//游戏消耗
  1981. // let giftCost = 0;////道具消耗
  1982. // this.etime = Date.now();
  1983. // let users = [];
  1984. // let localUsers = [];
  1985. // // var scorers = this.score.getUsers();
  1986. // var scorers = this.users[0];
  1987. // if (scorers.length > 0)
  1988. // {
  1989. // var scorersSort = _.sortBy(scorers, (i) => i.chairId);
  1990. // for (let scorer of scorersSort) {
  1991. // gameCost+=this.cost;
  1992. // giftCost+=scorer.giftCost;
  1993. // let userscore=scorer.score;
  1994. // // if(this.gameKindTL == 2) userscore -= 200;
  1995. // users.push({_id: scorer.playerId,chairId:scorer.chairId,userId: scorer.userId, name: scorer.name, sex: scorer.sex, headurl: scorer.headurl,over: scorer.over, score: userscore});
  1996. // //, gameCost: scorer.gameCost,giftCost: scorer.giftCost,diamond: scorer.diamond
  1997. // localUsers.push({_id: scorer.playerId,userId: scorer.userId, name: scorer.name, gameCost: scorer.gameCost,giftCost: scorer.giftCost,});
  1998. // }
  1999. // }
  2000. // // if(this.isGameOk)////以前是解散的不算返利
  2001. // if(this.over > 0)////改成只要玩家扣钻了就有返利
  2002. // {
  2003. // // this.agentRebate=gameCost;//parseInt(gameCost*0.5);
  2004. // this.agentRebate=gameCost+giftCost;////礼物也算消耗进行返利
  2005. // // console.warn("代理返利+++++",this.agentRebate);
  2006. // }
  2007. // else
  2008. // {
  2009. // this.agentRebate=0;
  2010. // }
  2011. // //下面是记录返利相关的
  2012. // if(this.agentId && this.agentRebate>0){
  2013. // yield this.lsetReabte.writeReabteInfo(this.agentId,this.etime,this.agentRebate,gameCost,giftCost,this.recordid,localUsers,this.gameId);
  2014. // // yield this.lsetReabte.writePlayerCountInfo(this.agentId,this.etime,users,this.cost,this.isGameOk,this.gameId);
  2015. // }
  2016. // //下面是记录邀请新人按比例送钻这个活动的数据
  2017. // if(!this.lconfigCommon) {
  2018. // // console.warn("邀请新人送钻石活动 this.lconfigCommon 不存在 "+this.etime);
  2019. // this.lconfigCommon = new configCommon(this.app);
  2020. // }
  2021. // yield this.lconfigCommon.yxActivityAsync(scorers,this.etime);
  2022. // logger.warn("战绩写入结束--",this.id);
  2023. // // return { code: C.OK };
  2024. // });
  2025. // // 结束信息 var endtype = { 局数完成: 1, 主动解散: 2, 断线解散: 3 ,超时解散: 4 };
  2026. proto.endResultAsync = cor(function* (endmode) {
  2027. // console.warn("ts++---------记录信息",this.id);
  2028. let str6 = "table 结束信息--id: "+this.id +" ,结算模式 "+endmode;
  2029. logger.warn(str6);////cssj
  2030. if(endmode>ENDMODE.PLAYING)//ts++关闭
  2031. {
  2032. let nowTime = Date.now();
  2033. if(this.state<STATE.END)//ts++防止重复写入
  2034. {
  2035. this.state = STATE.END;
  2036. if (this.endTimer) {
  2037. clearTimeout(this.endTimer);
  2038. this.endTimer = null;
  2039. }
  2040. for (let user of this.users) {
  2041. if (user) {
  2042. if (user.isOffline())
  2043. {
  2044. user.state = User.STATE.FREE;
  2045. user.state2 = User.STATE.FREE;
  2046. this.leaveUsers.push(user.id);
  2047. }
  2048. else
  2049. {
  2050. user.state = User.STATE.FREE;
  2051. user.state2 = User.STATE.FREE;
  2052. }
  2053. }
  2054. }
  2055. }
  2056. if(endmode==ENDMODE.SYSTEMEND)
  2057. {
  2058. yield this.pushMsgAsync(-1, 'shuiguo_event', { type: M.TABLE_JIESAN });
  2059. }
  2060. if(this.leaveUsers.length>0)
  2061. {
  2062. this.app.timer.setTimeout(() => this.leaveUserTimeAsync(), 100);
  2063. }
  2064. var gametable = yield this.app.models.GameTable.findByIdAsync(this.recordid, '_id tableNo agentId endMode');
  2065. if(gametable){
  2066. gametable.endMode = 1;
  2067. yield gametable.saveAsync();
  2068. }
  2069. this.game.deleteTable(this.id);//ts++删除房间
  2070. // let str5 = "table 结束信息22 关闭-id:"+this.id +"结算模式"+endmode;
  2071. // logger.info(str5);////cssj
  2072. }
  2073. else//普通结束
  2074. {
  2075. this.fpRes = {};//本局的发牌
  2076. this.ydxfpRes = {
  2077. cs:0,//本局押大小的次数,用于实现只能在首次押大小之前点击加分
  2078. type: -1,//本局玩家上次押大小的类型,-1表示还未押过大小,1表示押小2表示押大
  2079. number: -1,//本局玩家上次押大小的发牌,-1表示还未押过大小
  2080. };//本局的押大小发牌
  2081. this.state = STATE.FREE2;
  2082. for (let user of this.users) {
  2083. if (user) {
  2084. // user.state = User.STATE.FREE;//这个本来是游戏未开始或着游戏已达成才会设置这个的
  2085. // user.state2 = User.STATE.FREE;
  2086. //下面这两句本来是点击准备按钮之后才会设置这个的
  2087. // user.state = User.STATE.READY;
  2088. user.state2 = User.STATE.READY;
  2089. }
  2090. }
  2091. }
  2092. let str7 = "table end 结束信息---id:%s "+this.id +" 结算模式 "+endmode;
  2093. logger.warn(str7);////cssj
  2094. });
  2095. //ts++离开用户退出定时器
  2096. proto.leaveUserTimeAsync = cor(function* () {
  2097. // console.warn("离开用户退出定时器,离开用户数==%d",this.leaveUsers.length);////cssj
  2098. if(this.leaveUsers.length>0)
  2099. {
  2100. let userid = this.leaveUsers[0];
  2101. this.leaveUsers.splice(0, 1);
  2102. let str7 = "table end 离开用户退出定时器---id:%s "+this.id +" userid "+userid;
  2103. logger.warn(str7);////cssj
  2104. yield this.game.leaveTableAsync(userid);
  2105. }
  2106. if(this.leaveUsers.length>0)
  2107. {
  2108. this.app.timer.setTimeout(() => this.leaveUserTimeAsync(), 100);
  2109. }
  2110. });
  2111. // 玩家信息,里面包含任务信息
  2112. proto.roleInfoAsync = cor(function* (playerId,chairId) {
  2113. // console.log("玩家信息玩家信息玩家信息");
  2114. var user = this.users[chairId];
  2115. if (!user) {
  2116. return { code: C.FAILD, msg: C.GAME_PARAM_ERROR };
  2117. }
  2118. var data = {
  2119. cost:0,
  2120. win:0,
  2121. zfbAcc:"",
  2122. zfbName:"",
  2123. gameCount:0,
  2124. wingames:0,
  2125. taskReward:0,
  2126. taskQuan:0,
  2127. getList:[]
  2128. }
  2129. var sgjUser = yield this.app.models.SGJUser.findByIdAsync(user.id, 'cost win zfbAcc zfbName gameCount wingames taskReward taskQuan getList');
  2130. if (sgjUser) {
  2131. data.cost= sgjUser.cost;
  2132. data.win= sgjUser.win;
  2133. data.zfbAcc= sgjUser.zfbAcc;
  2134. data.zfbName= sgjUser.zfbName;
  2135. data.gameCount= sgjUser.gameCount;
  2136. data.wingames= sgjUser.wingames;
  2137. data.taskReward= sgjUser.taskReward;
  2138. data.taskQuan= sgjUser.taskQuan;
  2139. data.getList= sgjUser.getList;
  2140. }
  2141. return { code: C.OK, data: data };
  2142. });
  2143. ////设置排行榜数据
  2144. proto.setPaiHangData = cor(function* (data) {
  2145. // data.jrStart -= 86400000*1;
  2146. // data.nowTime -= 86400000*1;
  2147. // bczxz: bczxz,//本次总下注
  2148. // addTaskQuan: addTaskQuan,//本次增加的任务券
  2149. // jrStart: jrStart,//本次游戏时间对应的0点时间戳
  2150. // nowTime: nowTime//本次游戏的时间
  2151. let isNeedFaJiang = false;//是否需要给排行榜玩家发奖
  2152. let gwjd = {};//该玩家的,因为会修改,所以先记录下
  2153. let fields = '_id userId cost1 quan1 time1 cost2 quan2 time2 registerTime';
  2154. var paihang = yield this.app.models.SGJPaiHang.findByIdAsync(this.ownerId, fields);
  2155. if (paihang) {
  2156. if(data.jrStart == paihang.time1){
  2157. let newcost1 = Number(paihang.cost1) + Number(data.bczxz);
  2158. let newQuan = this.logic.jisuanFloat(paihang.quan1,data.addTaskQuan,1);
  2159. paihang.cost1 = newcost1;
  2160. paihang.quan1 = newQuan;
  2161. }
  2162. else{
  2163. //下面这个if是为了处理有多个玩家玩到第二天了,防止这几个玩家游戏的时候造成每个玩家都发一遍奖励
  2164. if(this.phbyfjlrq != data.jrStart - 86400000){
  2165. let sgjconfig = yield this.app.models.SGJConfig.findByIdAsync('sgconfigs');
  2166. if (sgjconfig) {
  2167. this.phbyfjlrq = sgjconfig.phbyfjlrq; //排行榜已发奖励的日期(0点时间戳)
  2168. }
  2169. }
  2170. let szqphbjlsfyf = true;//上周期排行榜奖励是否已发
  2171. if(this.phbyfjlrq != data.jrStart - 86400000) szqphbjlsfyf = false;
  2172. // console.warn("上周期排行榜奖励是否已发 ",szqphbjlsfyf,this.phbyfjlrq,data.jrStart);
  2173. if(!szqphbjlsfyf) {
  2174. isNeedFaJiang = true;
  2175. gwjd = {
  2176. _id: paihang._id,
  2177. userId: paihang.userId,
  2178. cost1: paihang.cost1,
  2179. quan1: paihang.quan1,
  2180. time1: paihang.time1
  2181. }
  2182. }
  2183. paihang.cost2 = paihang.cost1;
  2184. paihang.quan2 = paihang.quan1;
  2185. paihang.time2 = paihang.time1;
  2186. paihang.cost1 = data.bczxz;
  2187. paihang.quan1 = data.addTaskQuan;
  2188. paihang.time1 = data.jrStart;
  2189. }
  2190. paihang.registerTime = data.nowTime;
  2191. // console.warn("设置排行榜数据 ",isNeedFaJiang,paihang);
  2192. // yield paihang.saveAsync();
  2193. }
  2194. if(isNeedFaJiang){
  2195. this.phbyfjlrq = data.jrStart - 86400000; //排行榜已发奖励的日期(0点时间戳)
  2196. //下面是给昨天排行榜在榜玩家发放奖励
  2197. let sgjconfig = yield this.app.models.SGJConfig.findByIdAsync('sgconfigs');
  2198. if (sgjconfig) {
  2199. sgjconfig.phbyfjlrq = this.phbyfjlrq;
  2200. yield sgjconfig.saveAsync();
  2201. }
  2202. let limit = 10;//前10名上榜
  2203. let zrStart = data.jrStart - 86400000;////更新今日0时的时间戳
  2204. var opts = {
  2205. time1: zrStart,
  2206. quan1: { $gt: 0}
  2207. };
  2208. let fields = '_id userId cost1 quan1 time1';
  2209. //上面刚刚修改下面就查询,查询到的结果是上面修改之前的
  2210. var list = yield this.app.models.SGJPaiHang.findMongoAsync(opts, fields, { sort: { quan1: -1 } ,limit:limit});
  2211. // console.warn("得到排行榜昨日在榜 ",list.length,list);
  2212. if(list.length > 0){
  2213. if (this.phbfjTimer) {
  2214. clearTimeout(this.phbfjTimer);
  2215. this.phbfjTimer = null;
  2216. }
  2217. let zphblb = [];//在排行榜列表
  2218. for (var i = 0; i < list.length; i++) {
  2219. // if(gwjd.quan1 >= list[i].quan1) zphblb[zphblb.length] = gwjd;
  2220. // else zphblb[zphblb.length] = list[i];
  2221. // if(zphblb.length == limit) break;
  2222. zphblb[zphblb.length] = list[i];
  2223. }
  2224. //this.phbfjTimer = this.app.timer.setTimeout(() => this.sendPHBJL(zphblb,0),100);
  2225. }
  2226. }
  2227. if(paihang){
  2228. yield paihang.saveAsync();
  2229. // console.warn("设置排行榜数据结束 ");
  2230. }
  2231. });
  2232. //发放排行榜奖励
  2233. proto.sendPHBJL = cor(function* (list,_index) {
  2234. return
  2235. /*let index = _index;
  2236. if(index >= list.length) return;
  2237. if (this.phbfjTimer) {
  2238. clearTimeout(this.phbfjTimer);
  2239. this.phbfjTimer = null;
  2240. }
  2241. let playerId = list[index]._id;
  2242. let userid = list[index].userId;
  2243. let diamond = this.logic.getpmjl(index);
  2244. // console.warn("发放排行榜奖励 ",index,userid,diamond,list[index]);
  2245. yield this.lconfigCommon.senMailToPlayer(playerId,userid,16,16,1,1,diamond,"sgjSys");
  2246. index++;
  2247. if(index < list.length){
  2248. //间隔0.1秒给玩家发送排行榜奖励
  2249. this.phbfjTimer = this.app.timer.setTimeout(() => this.sendPHBJL(list,index),100);
  2250. }*/
  2251. });
  2252. ////得到排行榜
  2253. proto.getPaiHangAsync = cor(function* (playerId) {
  2254. let limit = 10;//前10名上榜
  2255. let jrStart = this.logic.getTodaySJC();////更新今日0时的时间戳
  2256. var opts = {
  2257. time1: jrStart,
  2258. quan1: { $gt: 0}
  2259. };
  2260. let fields = 'name headurl userId cost1 quan1 time1';
  2261. var list = yield this.app.models.SGJPaiHang.findMongoAsync(opts, fields, { sort: { quan1: -1 } ,limit:limit});
  2262. let pmInfos = [];
  2263. for (let i = 0; i < list.length; ++i) {
  2264. // console.warn("排序之后 ",i,list[i]);
  2265. let item = {
  2266. name: list[i].name,
  2267. headurl: list[i].headurl,
  2268. userId: list[i].userId,
  2269. cost1: list[i].cost1,
  2270. quan1: list[i].quan1,
  2271. pmjl: this.logic.getpmjl(i)
  2272. }
  2273. pmInfos[i] = item;
  2274. }
  2275. let player = yield this.app.models.Player.findByIdAsync(playerId);
  2276. opts.userId = player.userId
  2277. var zjph = yield this.app.models.SGJPaiHang.findMongoAsync(opts);
  2278. var d = null
  2279. if (zjph.length > 0) {
  2280. d = zjph[0]
  2281. console.warn("getpaihang self:",d)
  2282. }
  2283. let data = {
  2284. pmInfos: pmInfos,
  2285. zjph: d
  2286. }
  2287. return { code: C.OK, data: data };
  2288. });
  2289. // 上传真实姓名支付宝账号
  2290. proto.upZFBInfoAsync = cor(function* (playerId,realName,zfbAcc) {
  2291. // console.log("上传真实姓名支付宝账号");
  2292. let opts = { zfbAcc: zfbAcc,zfbName: realName};
  2293. let fields = 'zfbAcc zfbName';
  2294. var sgjUserList = yield this.app.models.SGJUser.findMongoAsync(opts, fields, { limit: 1 });
  2295. if(sgjUserList.length > 0) return { code: C.FAILD, msg: "该支付宝已经被绑定过,不可重复绑定" };
  2296. var sgjUser = yield this.app.models.SGJUser.findByIdAsync(playerId, 'zfbAcc zfbName zfbBindTime');
  2297. if (sgjUser) {
  2298. if(Date.now() - sgjUser.zfbBindTime < 86400000 ) return { code: C.FAILD, msg: "一天只能绑定一次" };
  2299. sgjUser.zfbAcc = zfbAcc;
  2300. sgjUser.zfbName = realName;
  2301. yield sgjUser.saveAsync();
  2302. }
  2303. yield this.sendTaskRecord(1,[]);
  2304. var data = {
  2305. zfbAcc:zfbAcc,
  2306. zfbName:realName
  2307. }
  2308. return { code: C.OK, data: data };
  2309. });
  2310. // 得到任务列表
  2311. proto.getTaskInfoAsync = cor(function* (playerId,chairId) {
  2312. console.log("玩家信息玩家信息玩家信息");
  2313. var user = this.users[chairId];
  2314. if (!user) {
  2315. return { code: C.FAILD, msg: C.GAME_PARAM_ERROR };
  2316. }
  2317. // var xxxrw = yield this.app.models.SGJTask.findByIdAsync("7abfd0a0-fe1a-11ee-996a-93780804e29f", 'fjTime state');
  2318. // if(xxxrw){
  2319. // xxxrw.state = 1;
  2320. // xxxrw.fjTime = 0;
  2321. // yield xxxrw.saveAsync();
  2322. // console.warn("dakmaijfnaisfnainijn");
  2323. // // yield this.app.models.SGJTask.removeAsync({_id : "abce01f0-31f8-11ef-abd5-954f4bbeb2b1"});
  2324. // }
  2325. let opts0 = {
  2326. playerId: playerId,
  2327. // state:0,//已领未完成
  2328. // wcTime:0,
  2329. state:{ $lte: 2}//已领未发奖完成
  2330. };
  2331. var ylwwcrwList = yield this.app.models.SGJTask.findMongoAsync(opts0, 'des cost reachs reachC rewardt rewards state');
  2332. // console.warn("该wanjia已领取未完成或未发奖的列表 length "+ylwwcrwList.length+" ylrwList "+JSON.stringify(ylwwcrwList))
  2333. let jrStart = this.logic.getTodaySJC();////更新今日0时的时间戳
  2334. let opts1 = {
  2335. playerId: playerId,
  2336. state:3,
  2337. wcTime:{ $gte: jrStart, $lt: jrStart+86400000}
  2338. };
  2339. var jrywcrwList = yield this.app.models.SGJTask.findMongoAsync(opts1, 'des cost reachs reachC rewardt rewards state');
  2340. // console.warn("该wanjia今日已完成的列表 length "+jrywcrwList.length+" jrywcrwList "+JSON.stringify(jrywcrwList))
  2341. var ylrwList = ylwwcrwList.concat(jrywcrwList);
  2342. // console.warn("该wanjia已经领取的列表 length "+ylrwList.length+" ylrwList "+JSON.stringify(ylrwList))
  2343. let klqhbjl = 0;//该玩家还可以领取的红包奖励
  2344. var sgjUser = yield this.app.models.SGJUser.findByIdAsync(playerId, 'taskReward jxzReward jzjrldzcz');
  2345. if (sgjUser) {
  2346. klqhbjl = sgjUser.jzjrldzcz - sgjUser.taskReward - sgjUser.jxzReward;
  2347. if(klqhbjl < 0){
  2348. let str7 = " 该玩家还可以领取的红包奖励 出错了 "+klqhbjl +" playerId "+playerId;
  2349. logger.warn(str7);////cssj
  2350. klqhbjl = 0;
  2351. }
  2352. }
  2353. let rwcList = [];
  2354. var sgjwjjrrwc = yield this.app.models.SGJWJJRRWC.findByIdAsync(playerId, '_id time rwcList');
  2355. if (sgjwjjrrwc) {
  2356. if(sgjwjjrrwc.time == jrStart) {
  2357. rwcList = this.logic.deepCloneTL2(sgjwjjrrwc.rwcList);
  2358. }
  2359. else{
  2360. rwcList = this.logic.getWJJRRWC(ylrwList,klqhbjl);
  2361. sgjwjjrrwc.rwcList = [];
  2362. sgjwjjrrwc.rwcList = this.logic.deepCloneTL2(rwcList);
  2363. sgjwjjrrwc.time = jrStart;
  2364. yield sgjwjjrrwc.saveAsync();
  2365. }
  2366. }
  2367. else{
  2368. rwcList = this.logic.getWJJRRWC(ylrwList,klqhbjl);
  2369. var newsgjwjjrrwc = new this.app.models.SGJWJJRRWC({
  2370. _id: this.ownerId, // 标识,玩家的_id
  2371. time: jrStart, // 任务池对应的时间
  2372. rwcList: this.logic.deepCloneTL2(rwcList) // 该玩家对应时间的任务池列表
  2373. });
  2374. yield newsgjwjjrrwc.saveAsync();
  2375. }
  2376. let allRenWuInfo = this.logic.getTasksInfo(ylrwList,rwcList)//该任务最多领取次数
  2377. var data = {
  2378. renwuPool: allRenWuInfo,
  2379. }
  2380. return { code: C.OK, data: data };
  2381. });
  2382. // 处理任务领取
  2383. proto.dealRenWuAsync = cor(function* (playerId,chairId,item) {
  2384. // console.warn("table 处理任务 ",playerId,chairId);
  2385. var user = this.users[chairId];
  2386. if (!user) {
  2387. return { code: C.FAILD, msg: C.GAME_PARAM_ERROR };
  2388. }
  2389. let alltasks = null;
  2390. if(item.index == -1){
  2391. //是之前的任务,现在已经不在任务池中了
  2392. var sgjwjjrrwc = yield this.app.models.SGJWJJRRWC.findByIdAsync(playerId, '_id time rwcList');
  2393. if (sgjwjjrrwc) {
  2394. if(sgjwjjrrwc.rwcList.length > 0) {
  2395. alltasks = this.logic.deepCloneTL2(sgjwjjrrwc.rwcList);
  2396. }
  2397. }
  2398. }
  2399. let allCountInfo = this.logic.getATaskAllCount(item,alltasks)//该任务最多领取次数
  2400. let allCount = allCountInfo.count;//该任务最多领取次数
  2401. if(allCount <= 0) return { code: C.FAILD, msg: allCountInfo.msg };
  2402. let cost = allCountInfo.cost;
  2403. let zfbAcc = "";
  2404. let zfbName = "";
  2405. let zfbBindTime = 0;
  2406. let taskQuan = 0;
  2407. var sgjUser = yield this.app.models.SGJUser.findByIdAsync(playerId, 'zfbAcc zfbName zfbBindTime taskQuan jxzReward');
  2408. if (sgjUser) {
  2409. zfbAcc = sgjUser.zfbAcc;
  2410. zfbName = sgjUser.zfbName;
  2411. zfbBindTime = sgjUser.zfbBindTime;
  2412. taskQuan = sgjUser.taskQuan;
  2413. }
  2414. if(taskQuan < cost)return { code: C.FAILD, msg: "任务券不足。" };
  2415. // if(!zfbAcc || !zfbName || !zfbBindTime){
  2416. // return { code: C.FAILD, msg: "未绑定支付宝信息" };//领任务的时候绑定支付宝信息
  2417. // }
  2418. let opts0 = {
  2419. playerId: playerId,
  2420. cost: item.cost,
  2421. // reachs: item.reachs,
  2422. reachs: { $all: item.reachs},
  2423. reachC: { $all: item.reachC},
  2424. rewardt: item.rewardt,
  2425. rewards: item.rewards,
  2426. state:0,
  2427. wcTime:0
  2428. };
  2429. var ylwwcrwList = yield this.app.models.SGJTask.findMongoAsync(opts0, 'playerId cost reachs reachC rewards state ');
  2430. if(ylwwcrwList.length > 0) return { code: C.FAILD, msg: "请完成该任务之后再领取" };
  2431. let jrStart = this.logic.getTodaySJC();////今日0时的时间戳
  2432. let opts1 = {
  2433. playerId: playerId,
  2434. cost: item.cost,
  2435. // reachs: item.reachs,
  2436. reachs: { $all: item.reachs},
  2437. reachC: { $all: item.reachC},
  2438. rewardt: item.rewardt,
  2439. rewards: item.rewards,
  2440. state:{ $gte: 1},
  2441. wcTime:{ $gte: jrStart, $lt: jrStart+86400000}
  2442. };
  2443. var jrywcrwList = yield this.app.models.SGJTask.findMongoAsync(opts1, 'playerId cost reachs reachC rewards state ');
  2444. var ylrwList = ylwwcrwList.concat(jrywcrwList);
  2445. // console.warn("该任务已经领取的列表 length "+ylrwList.length+" ylrwList "+JSON.stringify(ylrwList))
  2446. let ylcs = ylrwList.length;//该任务已领取的次数
  2447. // console.warn("该条任务领取次数已达上限??????? ",ylcs , allCount);
  2448. if (ylcs >= allCount) {
  2449. return { code: C.FAILD, msg: "该条任务领取次数已达上限" };
  2450. }
  2451. var newsgjTask = new this.app.models.SGJTask({
  2452. _id: uuid.v1(), // 标识
  2453. playerId: playerId, // 玩家标识
  2454. userId: user.userId, // 号码
  2455. des: allCountInfo.des, // 玩家标识
  2456. cost: item.cost, // 消费
  2457. reachs: this.logic.deepCloneTL(item.reachs),//达成该条任务所需的条件列表[1(1号牌),2(2号牌)]
  2458. reachC: this.logic.deepCloneTL(item.reachC),//达成该条任务所需的个数列表[reachs[0]出现次数,reachs[1]出现次数]
  2459. rewardt: item.rewardt,//该条任务达成之后的奖品类型 0:未定义 1:钻石,2:RMB(分)
  2460. rewards: item.rewards,//该条任务达成之后的奖品数量
  2461. state: 0, //任务状态0:未完成,1:已完成,2:已发奖,
  2462. lqTime: Date.now(), //领取时间
  2463. wcTime: 0, //完成时间
  2464. fjTime: 0, //发奖时间
  2465. });
  2466. // console.warn("领取之后存储任务 ",JSON.stringify(newsgjTask),JSON.stringify(item));
  2467. yield newsgjTask.saveAsync();
  2468. let jxzrmbjl = 0;//进行中的rmb奖励
  2469. if(item.rewardt == 1) {
  2470. this.rwxhjq1 = this.logic.jisuanFloat(this.rwxhjq1,cost,1); //钻石任务消耗奖券总量(领任务时记录)
  2471. }
  2472. else if(item.rewardt == 2){
  2473. this.rwxhjq2 = this.logic.jisuanFloat(this.rwxhjq2,cost,1); //RMB任务消耗奖券总量(领任务时记录)
  2474. jxzrmbjl = item.rewards;
  2475. }
  2476. let nowTaskQuan = 0;
  2477. // var sgjUser = yield this.app.models.SGJUser.findByIdAsync(playerId, 'taskQuan');
  2478. if (sgjUser) {
  2479. nowTaskQuan = this.logic.jisuanFloat(sgjUser.taskQuan,cost,2);
  2480. var resTaskQuan = new this.app.models.TaskQuanRecord({
  2481. _id: uuid.v1(),
  2482. playerId: playerId,
  2483. dType: 2,//领任务
  2484. dSource: sgjUser.taskQuan,
  2485. dSwap: 0-cost.toFixed(2),
  2486. dNow: nowTaskQuan
  2487. });
  2488. yield resTaskQuan.saveAsync()
  2489. // console.warn("领取之后修改任务券数 ",sgjUser.taskQuan,cost,nowTaskQuan);
  2490. sgjUser.taskQuan = nowTaskQuan;
  2491. sgjUser.jxzReward += jxzrmbjl;
  2492. this.users[0].taskQuan = sgjUser.taskQuan;
  2493. yield sgjUser.saveAsync();
  2494. }
  2495. var SGJUserTongjis = yield this.app.models.SGJUserTongji.findMongoAsync({todaytime:this.getTodaySJC()})
  2496. var SGJUserTongji = null
  2497. if (SGJUserTongjis.length == 0) {
  2498. SGJUserTongji = this.app.models.SGJUserTongji({
  2499. _id: uuid.v1(),
  2500. //userId: user.userId,
  2501. usdt: user.diamond,
  2502. taskquanlose: cost,//下注
  2503. todaytime: this.logic.getTodaySJC()
  2504. });
  2505. yield SGJUserTongji.saveAsync()
  2506. }else {
  2507. SGJUserTongji = SGJUserTongjis[0]
  2508. console.warn("SGJUserTongji:",SGJUserTongji)
  2509. //SGJUserTongji.usdt = user.diamond,
  2510. SGJUserTongji.taskquanlose = (Number(SGJUserTongji.taskquanlose) +Number(cost)).toFixed(2)//下注
  2511. SGJUserTongji.nowtaskquan = nowTaskQuan
  2512. yield SGJUserTongji.saveAsync()
  2513. }
  2514. if(this.wjrwxylb.length != this.logic.cardKindCount){
  2515. this.wjrwxylb = _.fill(Array(this.logic.cardKindCount), 0);
  2516. }
  2517. for (var j = 0; j < newsgjTask.reachs.length; j++) {
  2518. let rwyqlx = newsgjTask.reachs[j];//任务要求类型
  2519. let rwyqsl = newsgjTask.reachC[j];//任务要求类型
  2520. this.wjrwxylb[rwyqlx] += rwyqsl;
  2521. }
  2522. // console.warn("领取任务 玩家已领未完成任务需要的任务要求列表 ",this.wjrwxylb);
  2523. ylcs++;
  2524. var data = {
  2525. nowTaskQuan:nowTaskQuan.toFixed(2),
  2526. ylcs : ylcs,//该任务已领取的次数
  2527. renwuInfo: item
  2528. }
  2529. return { code: C.OK, data: data };
  2530. });
  2531. // 任务领奖
  2532. proto.renWuLingjiangAsync = cor(function* (playerId,chairId,item) {
  2533. // console.warn("table 任务领奖 ",playerId,chairId);
  2534. var user = this.users[chairId];
  2535. if (!user) {
  2536. return { code: C.FAILD, msg: C.GAME_PARAM_ERROR };
  2537. }
  2538. let userid = 0;
  2539. let zfbAcc = "";
  2540. let zfbName = "";
  2541. let zfbBindTime = 0;
  2542. var sgjUser = yield this.app.models.SGJUser.findByIdAsync(playerId, 'playerId userId zfbAcc zfbName zfbBindTime taskQuan ylzsReward');
  2543. if (sgjUser) {
  2544. userid = sgjUser.userId;
  2545. zfbAcc = sgjUser.zfbAcc;
  2546. zfbName = sgjUser.zfbName;
  2547. zfbBindTime = sgjUser.zfbBindTime;
  2548. }
  2549. let opts0 = {
  2550. playerId: playerId,
  2551. cost: item.cost,
  2552. reachs: { $all: item.reachs},
  2553. reachC: { $all: item.reachC},
  2554. rewardt: item.rewardt,
  2555. rewards: item.rewards,
  2556. state:{$gte: 1, $lte: 2},
  2557. lqTime:{$gt: 0},
  2558. wcTime:{$gt: 0},
  2559. fjTime:0
  2560. };
  2561. var ywcrwList = yield this.app.models.SGJTask.findMongoAsync(opts0, '_id playerId rewardt rewards state fjTime');
  2562. if(ywcrwList.length < 1) return { code: C.FAILD, msg: "领奖任务未找到" };
  2563. let rewardt = ywcrwList[0].rewardt;
  2564. if(rewardt == 2){
  2565. if(!zfbAcc || !zfbName || !zfbBindTime){
  2566. return { code: C.FAILD, msg: "未绑定支付宝信息" };//领任务的时候绑定支付宝信息
  2567. }
  2568. }
  2569. if(rewardt == 1){
  2570. //钻石
  2571. let diamond = ywcrwList[0].rewards;
  2572. ywcrwList[0].state = 3;
  2573. ywcrwList[0].fjTime = Date.now();
  2574. yield ywcrwList[0].saveAsync();
  2575. yield this.lconfigCommon.senMailToPlayer(playerId,userid,15,15,1,1,diamond,"sgjSys");
  2576. if (sgjUser) {
  2577. sgjUser.ylzsReward += diamond;
  2578. yield sgjUser.saveAsync();
  2579. }
  2580. this.rwdcze1 += diamond; //钻石任务兑出总额(领奖时记录)
  2581. }
  2582. else if(rewardt == 2){
  2583. //RMB
  2584. if(ywcrwList[0].state == 1){
  2585. ywcrwList[0].state = 2;
  2586. yield ywcrwList[0].saveAsync();
  2587. this.rwdcze2 += ywcrwList[0].rewards; //RMB(分)任务兑出总额(领奖时记录)
  2588. }
  2589. let fjres = yield this.sendTaskRecord(2,[ywcrwList[0]._id]);
  2590. }
  2591. var data = {
  2592. rewardt:rewardt,
  2593. renwuInfo: item
  2594. }
  2595. return { code: C.OK, data: data };
  2596. });
  2597. // 得到玩家已完成的任务列表
  2598. proto.getOverTasksAsync = cor(function* (playerId,chairId) {
  2599. // console.log("玩家信息玩家信息玩家信息");
  2600. var user = this.users[chairId];
  2601. if (!user) {
  2602. return { code: C.FAILD, msg: C.GAME_PARAM_ERROR };
  2603. }
  2604. // if(1 == 1){
  2605. // var sgjUser = yield this.app.models.SGJUser.findByIdAsync(playerId, 'playerId userId jzjrldzcz jzjrldzczjlsj');
  2606. // //这里面全是测试代码
  2607. // if(sgjUser){
  2608. // sgjUser.jzjrldzcz = 10000;
  2609. // sgjUser.jzjrldzczjlsj = 0;
  2610. // yield sgjUser.saveAsync();
  2611. // }
  2612. // var sgjwjjrrwc = yield this.app.models.SGJWJJRRWC.findByIdAsync(playerId, '_id time rwcList');
  2613. // if (sgjwjjrrwc) {
  2614. // sgjwjjrrwc.rwcList = [];
  2615. // sgjwjjrrwc.time = 0;
  2616. // yield sgjwjjrrwc.saveAsync();
  2617. // }
  2618. // }
  2619. let opts0 = {
  2620. playerId: playerId,
  2621. state: { $gt: 2 },
  2622. wcTime:{ $gt: 2 }
  2623. };
  2624. var ywcrwList = yield this.app.models.SGJTask.findMongoAsync(opts0, 'cost reachs reachC rewardt rewards state lqTime wcTime fjTime',{sort: { lqTime: -1 },limit:30});
  2625. // console.warn("该wanjia已经完成的列表 length "+ywcrwList.length+" ywcrwList "+JSON.stringify(ywcrwList))
  2626. var data = {
  2627. ywcrwList: ywcrwList,
  2628. }
  2629. return { code: C.OK, data: data };
  2630. });
  2631. //////TL++,设置记录游戏过程中的记录数据
  2632. proto.setPaijuHuiFangData = function (_operateKind,_data){
  2633. let data = this.logic.deepCloneTL(_data);
  2634. data.operateKind = _operateKind;
  2635. this.PaijuHuiFang[this.PaijuHuiFang.length] = data;
  2636. };