{"version":3,"file":"static/chunks/vendor-common-995fbe74d0b54290.js","mappings":"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,EAAAA,iBAAAA,IACjC,MAAO,CAACU,SAAU,EAAGC,WAAYX,EAAAA,EAAAA,iBAAAA,IACjC,OAAQ,CAACU,SAAU,EAAGC,WAAYX,EAAAA,EAAAA,iBAAAA,IAClC,MAAO,CAACU,SAAU,EAAGC,WAAYX,EAAAA,EAAAA,iBAAAA,IACjC,MAAO,CAACU,SAAU,EAAGC,WAAYX,EAAAA,EAAAA,iBAAAA,IACjC,MAAO,CAACU,SAAU,EAAGC,WAAYX,EAAAA,EAAAA,iBAAAA,IACjC,OAAQ,CAACU,SAAU,EAAGC,WAAYX,EAAAA,EAAAA,iBAAAA,KAIvBY,EAAmBZ,EAAAA,EAAAA,IAAAA,iBAGnBa,EAA4B,CACvC,EAAE,CACA,MACA,MACA,MACA,OACA,OACA,OACA,OACA,KACA,KACA,KACA,KACA,KACA,QACA,MACA,MACA,QACA,QACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,QACA,QACA,QACA,MACA,MACA,MACA,MACA,MACA,MACA,OACA,OACA,MACA,MACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,IACA,MACA,MACA,MACA,MACA,OAEF,EAAE,CACA,MACA,MACA,QACA,QACA,QACA,SACA,SACA,SACA,IACA,MACA,OAEF,EAAE,CACA,MACA,OACA,QACA,QACA,QACA,KAEF,EAAE,CACA,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SACA,SACA,SACA,KAEF,EAAE,CACA,MACA,SACA,OACA,OACA,IACA,OACA,OACA,OACA,OACA,UAEF,EAAE,CACA,MACA,IACA,MACA,OACA,SACA,SACA,SACA,UAEF,GAAG,CACD,MACA,QACA,IACA,MACA,MACA,OAEF,GAAG,CACD,MACA,SACA,SACA,SACA,SACA,SACA,SACA,IACA,OAEF,GAAG,CACD,MACA,IACA,MACA,OAEF,GAAG,CACD,MACA,SACA,KAEF,GAAG,CACD,MACA,KAEF,GAAG,CACD,MACA,IACA,MACA,MACA,QACA,SACA,SACA,SACA,UAEF,GAAG,CACD,OAEF,GAAG,CACD,OAEF,GAAG,CACD,OAEF,GAAG,CACD,OAEF,GAAG,CACD,OAEF,GAAG,CACD,OAEF,GAAG,CACD,OAEF,GAAG,CACD,OAEF,GAAG,CACD,OAEF,GAAG,CACD,MACA,MACA,MACA,OACA,QAEF,GAAG,CACD,MACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,SAEF,GAAG,CACD,OAEF,GAAG,CACD,MACA,SACA,SACA,UAEF,GAAG,CACD,MACA,IACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UAEF,GAAG,CACD,IACA,OAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,IACA,OAEF,GAAG,CACD,IACA,OAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,MACA,KAEF,GAAG,CACD,IACA,OAEF,GAAG,CACD,IACA,OAEF,GAAG,CACD,IACA,OAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,MACA,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,KAEF,GAAG,CACD,O,sDCvfW,eAAMC,EAQPC,EACAC,EACAC,EACAC,IAXd,c,uFAcI7J,OAAOC,OAAOP,KAAM,CAClBgK,eAAAA,EACAC,iBAAAA,EACAC,YAAAA,EACAC,UAAAA,M,gHClBN,gB,oPAMe,MAPb,W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","sources":["webpack://_N_E/./lib/vendor/MockLogin.js","webpack://_N_E/./lib/vendor/bti/BTIConsts.js","webpack://_N_E/./lib/vendor/data/AnnouncementData.js","webpack://_N_E/./lib/vendor/data/BetInfoData.js","webpack://_N_E/./lib/vendor/data/BetResultData.js","webpack://_N_E/./lib/vendor/data/BetSelectionResultData.js","webpack://_N_E/./lib/vendor/data/BetSettingData.js","webpack://_N_E/./lib/vendor/data/BetStatusData.js","webpack://_N_E/./lib/vendor/data/CashOutResultData.js","webpack://_N_E/./lib/vendor/data/EventChangeData.js","webpack://_N_E/./lib/vendor/data/LineGroupData.js","webpack://_N_E/./lib/vendor/data/EventData.js","webpack://_N_E/./lib/vendor/data/EventInfo.js","webpack://_N_E/./lib/vendor/data/LeagueData.js","webpack://_N_E/./lib/vendor/data/LineData.js","webpack://_N_E/./lib/vendor/data/MarketData.js","webpack://_N_E/./lib/vendor/data/OddsData.js","webpack://_N_E/./lib/vendor/data/PollingResult.js","webpack://_N_E/./lib/vendor/data/RNEventSource.ios.js","webpack://_N_E/./lib/vendor/data/SearchEventData.js","webpack://_N_E/./lib/vendor/data/SearchLeagueData.js","webpack://_N_E/./lib/vendor/data/SearchSportData.js","webpack://_N_E/./lib/vendor/data/SelectionChangeData.js","webpack://_N_E/./lib/vendor/data/SelectionData.js","webpack://_N_E/./lib/vendor/data/SpecialUpdateData.js","webpack://_N_E/./lib/vendor/data/SportData.js","webpack://_N_E/./lib/vendor/vendorEventSource.js","webpack://_N_E/./lib/vendor/data/ReconnectingEventSource.js","webpack://_N_E/./lib/vendor/data/SseSubscription.js","webpack://_N_E/./lib/vendor/data/TokenManager.js","webpack://_N_E/./lib/vendor/data/VendorBase.js","webpack://_N_E/./lib/vendor/data/VendorConsts.js","webpack://_N_E/./lib/vendor/data/VendorError.js","webpack://_N_E/./lib/vendor/data/WagerData.js","webpack://_N_E/./lib/vendor/data/WagerItemData.js","webpack://_N_E/./lib/vendor/im/IMConsts.js","webpack://_N_E/./lib/vendor/saba/SABAConsts.js","webpack://_N_E/./lib/vendor/vendorSetting.js","webpack://_N_E/./lib/vendor/vendorSettingBTI.js","webpack://_N_E/./lib/vendor/vendorSettingIM.js","webpack://_N_E/./lib/vendor/vendorSettingSABA.js","webpack://_N_E/./lib/vendor/vendorStorage.js","webpack://_N_E/./lib/vendor/i18n/cn.js","webpack://_N_E/./lib/vendor/vendori18n.js"],"sourcesContent":["class MockLogin{\n //Singleton\n constructor () {\n if (!MockLogin._instance) {\n console.log('MockLogin new instance');\n MockLogin._instance = this;\n }\n\n return MockLogin._instance;\n }\n\n //brand = 'jbo';\n brand = 'fun88';\n //brand = 'BETWAY';\n\n loginParams = {\n jbo: {\n common_url: 'https://gateway.jb88app.com', //JBO線上\n username: 'kohvip1',\n password: 'qwer1234',\n\n // username: 'fedevtest4',\n // password: 'asdf1234',\n\n // username: 'claude002', //沒錢\n // password: 'abcd1234',\n\n\n // common_url: 'https://gatewaystaging.jbo88.biz', //JBO測試\n // username: 'brcnst3',\n // password: '123qwe',\n },\n fun88: {\n common_url: 'https://gateway.fun88.biz', //fun測試\n username: 'benji0088',\n password: '123qwe',\n\n // username: 'claude003',\n // password: 'abcd1234',\n\n // username: 'claude004', //沒錢\n // password: 'abcd1234',\n },\n BETWAY: {\n // common_url: 'https://kongstagingbetway178-dev.gamealiyun.com', //BW測試\n common_url: 'http://localhost:9789', //node proxy\n // username: 'prodtestcny001',\n // password: 'asdf1234',\n\n username: 'benji007',\n password: '123qwe',\n }\n }\n\n isLogin = {\n jbo:false,\n fun88:false,\n BETWAY:false,\n }\n token = {\n jbo:null,\n fun88:null,\n BETWAY:null,\n }\n\n IM_Token = null;\n IM_MemberCode = '';\n\n BTI_Token = null;\n BTI_MemberCode = '';\n\n doMockLogin(){\n if (this.brand === 'jbo') {\n return this.doMockLoginJBO();\n }\n\n if (this.brand === 'fun88') {\n return this.doMockLoginFUN88()\n }\n\n if (this.brand === 'BETWAY') {\n return this.doMockLoginBW()\n }\n }\n\n doMockLoginJBO(){\n console.log('doMockLoginJBO');\n\n const apiUrl = '/api/Login?';\n\n const loginParams = this.loginParams.jbo;\n\n let data = {\n \"hostName\": loginParams.common_url,\n \"username\": loginParams.username,\n \"password\": loginParams.password,\n \"e2\": '',\n \"grantType\": \"password\",\n \"clientId\": \"JBO.gb2bc\",\n \"clientSecret\": \"JBOmuitten\",\n \"scope\": \"Mobile.Service offline_access\",\n \"appId\": \"net.gb2bc.jbo\",\n \"siteId\": 8,\n }\n\n data = Object.assign(data,this.logindata);\n\n let that = this;\n return new Promise(function(resolve, reject) {\n if (that.isLogin.jbo === true) {\n resolve(true);\n return;\n }\n\n that.fetchRequest('jbo', apiUrl, 'POST', data)\n .then(data => {\n if (data.accessToken) {\n console.log('doMockLoginJBO success');\n\n //jbo\n that.token.jbo = data.accessToken.token_type + ' ' + data.accessToken.access_token // 寫入用戶token token要帶Bearer\n\n that.isLogin.jbo = true;\n resolve(data);\n } else {\n that.isLogin.jbo = false;\n const errors = JSON.parse(data.content)\n reject(errors);\n }\n }).catch((error) => {\n reject(error);\n })\n });\n }\n\n doMockLoginFUN88(){\n console.log('doMockLoginFUN88');\n const apiUrl = '/api/Login?';\n\n const loginParams = this.loginParams.fun88;\n\n let data = {\n \"hostName\": loginParams.common_url,\n \"username\": loginParams.username,\n \"password\": loginParams.password,\n \"e2\": '',\n grantType: \"password\",\n clientId: \"Fun88.CN.App\",\n clientSecret: \"FUNmuittenCN\",\n scope: \"Mobile.Service offline_access\",\n appId: \"net.funpodium.FUN88\",\n siteId: 31,\n }\n\n data = Object.assign(data,this.logindata);\n\n let that = this;\n return new Promise(function(resolve, reject) {\n if (that.isLogin.fun88 === true) {\n console.log('is logined no need to login again')\n resolve(true);\n return;\n }\n\n that.fetchRequest('fun88',apiUrl, 'POST', data)\n .then(data => {\n if (data.accessToken) {\n console.log('doMockLoginFUN88 success');\n\n //fun\n that.token.fun88 = data.accessToken.token_type + ' ' + data.accessToken.access_token // 寫入用戶token token要帶Bearer\n\n that.isLogin.fun88 = true;\n resolve(data);\n } else {\n that.isLogin.fun88 = false;\n const errors = JSON.parse(data.content)\n reject(errors);\n }\n }).catch((error) => {\n reject(error);\n })\n });\n }\n\n doMockLoginBW(){\n console.log('doMockLoginBW');\n const apiUrl = '/get/token';\n\n const loginParams = this.loginParams.BETWAY;\n\n let data = {\n \"username\": loginParams.username,\n \"password\": loginParams.password,\n grant_type: \"password\",\n client_id: \"Betway.CN.App\",\n client_secret: \"BWmuittenCN\",\n scope: \"Mobile.Service offline_access\",\n appId: \"nettium.tlc.native\",\n siteId: 2,\n }\n\n data = Object.assign(data,this.logindata);\n\n let that = this;\n return new Promise(function(resolve, reject) {\n if (that.isLogin.BETWAY === true) {\n resolve(true);\n return;\n }\n\n that.fetchRequest('BETWAY',apiUrl, 'POST', data, false, true)\n .then(data => {\n if (data.access_token) {\n console.log('doMockLoginBW success');\n\n //fun\n that.token.BETWAY = data.token_type + ' ' + data.access_token // 寫入用戶token token要帶Bearer\n\n that.isLogin.BETWAY = true;\n resolve(data);\n } else {\n that.isLogin.BETWAY = false;\n const errors = JSON.parse(data.content)\n reject(errors);\n }\n }).catch((error) => {\n reject(error);\n })\n });\n }\n\n //获取im体育token数据\n getIMToken(brandname = 'jbo') {\n let that = this;\n return new Promise(function(resolve, reject) {\n let hostname = '';\n if (brandname === 'jbo') {\n hostname = 'imnative';\n }\n\n if (brandname === 'fun88') {\n hostname = 'imnative';\n }\n\n if (brandname === 'BETWAY') {\n hostname = 'www.betway88.com';\n }\n\n that.fetchRequest(brandname, '/api/Vendor/IPSB/Token?hostname='+hostname+'&', 'GET')\n .then((data) => {\n\n console.log('IM token',data);\n\n if (data.isGameLocked) {\n that.isGameLock = true;\n reject('gameIsLoecked');\n return;\n } else {\n that.isGameLock = false;\n }\n if (data.token) {\n that.IM_Token = data.token;\n\n if (brandname === 'jbo') {\n that.IM_MemberCode = data.playerId;\n }\n\n if (brandname === 'fun88') {\n that.IM_MemberCode = data.memberCode;\n }\n\n if (brandname === 'BETWAY') {\n that.IM_MemberCode = data.memberCode;\n }\n\n localStorage.setItem(\n \"IM_Token\",\n JSON.stringify(that.IM_Token)\n );\n\n localStorage.setItem(\n \"IM_MemberCode\",\n JSON.stringify(that.IM_MemberCode)\n );\n\n resolve(data);\n } else {\n reject('no token?');\n }\n })\n .catch((error) => {\n reject(error);\n })\n });\n }\n\n getBTIToken(sbt = false,brandname = 'fun88') {\n let that = this;\n return new Promise(function(resolve, reject) {\n let hostname = '';\n if (brandname === 'jbo') {\n hostname = 'imnative';\n }\n\n if (brandname === 'fun88') {\n hostname = 'imnative';\n }\n\n if (brandname === 'BETWAY') {\n hostname = 'www.betway88.com';\n }\n\n that.fetchRequest(brandname, '/api/Vendor/' + (sbt ? 'SBT' : 'BTI') + '/Token?hostname='+hostname+'&', 'GET')\n .then((data) => {\n\n console.log('BTI token',data);\n\n if (data.isGameLocked) {\n that.isGameLock = true;\n reject('gameIsLoecked');\n return;\n } else {\n that.isGameLock = false;\n }\n if (data.token) {\n that.BTI_Token = data.token;\n\n if (brandname === 'jbo') {\n that.BTI_MemberCode = data.playerId;\n }\n\n if (brandname === 'fun88') {\n that.BTI_MemberCode = data.memberCode;\n }\n\n if (brandname === 'BETWAY') {\n that.BTI_MemberCode = data.memberCode;\n }\n\n localStorage.setItem(\n \"BTI_Token\",\n JSON.stringify(that.BTI_Token)\n );\n\n localStorage.setItem(\n \"BTI_MemberCode\",\n JSON.stringify(that.BTI_MemberCode)\n );\n\n resolve(data);\n } else {\n reject('no token?');\n }\n })\n .catch((error) => {\n reject(error);\n })\n });\n }\n\n fetchRequest(brandname, url, method, params = '', withAPIVersion = true, useFormData = false){\n let apiversion = 'api-version=1.0&brand=' + brandname + '&Platform=Mobile';\n if (!withAPIVersion) {\n apiversion = '';\n }\n\n let header;\n if (this.isLogin[brandname] === true) {\n header = {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"Culture\": \"zh-cn\",\n 'Authorization': this.token[brandname],\n };\n } else {\n header = {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"Culture\": \"zh-cn\"\n };\n }\n\n let that = this;\n\n return new Promise(function (resolve, reject) {\n let init = {\n method: method,\n headers: header,\n }\n\n if (params !== '') {\n if (useFormData) {\n let formData = new FormData();\n for(const propName in params) {\n formData.append(propName, params[propName]);\n }\n header[\"Content-Type\"] = 'application/x-www-form-urlencoded';\n init.body = new URLSearchParams(formData);\n } else {\n init.body = JSON.stringify(params) //body参数,通常需要转换成字符串后服务器才能解析\n }\n }\n\n that.timeout_fetch(fetch(that.loginParams[brandname].common_url + url + apiversion, init))\n .then((response) => response.json())\n .then((responseData) => {\n if (responseData.error_details) {\n reject(responseData.error_details)\n } else {\n resolve(responseData);\n }\n })\n .catch((err) => {\n reject(err);\n });\n });\n }\n\n /**\n * 让fetch也可以timeout\n * timeout不是请求连接超时的含义,它表示请求的response时间,包括请求的连接、服务器处理及服务器响应回来的时间\n * fetch的timeout即使超时发生了,本次请求也不会被abort丢弃掉,它在后台仍然会发送到服务器端,只是本次请求的响应内容被丢弃而已\n * @param {Promise} fetch_promise fetch请求返回的Promise\n * @param {number} [timeout=40000] 单位:毫秒,这里设置默认超时时间为10秒\n * @return 返回Promise\n */\n timeout_fetch(fetch_promise, timeout = 40000) {\n let timeout_fn = null;\n\n //这是一个可以被reject的promise\n let timeout_promise = new Promise(function(resolve, reject) {\n timeout_fn = function() {\n resolve('请求超时!!!');\n };\n });\n //这里使用Promise.race,以最快 resolve 或 reject 的结果来传入后续绑定的回调\n let abortable_promise = Promise.race([\n fetch_promise,\n timeout_promise\n ]);\n\n setTimeout(function() {\n timeout_fn();\n }, timeout);\n\n return abortable_promise;\n }\n}\n\nconst MockLoginSingleton = new MockLogin();\nif (typeof window !== \"undefined\") {\n window.MockLoginInstance = MockLoginSingleton;\n}\n\nexport default MockLoginSingleton;","import i18n from '../vendori18n';\n\n//BTI數據名\nexport const BTIDataTypes = {\n SPORTS: 'sports',\n LEAGUES: 'leagues',\n EVNETS: 'events',\n MARKETS: 'markets',\n CALCULATEBETS : 'calculateBets',\n PLACEBETS: 'placeBets',\n GETPURCHASES: 'getPurchases',\n WAGERUNSETTLE: 'unsettled',\n WAGERSETTLED: 'settled',\n CASHOUT_GETINFO: 'getInfo',\n CASHOUT_PLACE: 'place',\n CASHOUT_GETUPDATES: 'getUpdates',\n CASHOUT_PLACENEWOFFER: 'placeNewOffer',\n}\n\n//體育項目\nexport const BTISports = {\n SOCCER: 1, //足球\n BASKETBALL: 2, //篮球\n FOOTBALL: 3, //美式足球\n TENNIS: 6, //网球\n BASEBALL: 7, //棒球\n ICEHOCKEY: 8, //冰上曲棍球\n HANDBALL: 10, //手球\n RUGBYLEAGUE: 11, //橄榄球(聯盟式)\n GOLF: 12, //高尔夫球\n SNOOKER: 13, //斯诺克 / 英式台球, 包括亚洲 9 球和台球\n MOTOR: 14, //赛车运动\n DARTS: 15, //飞镖\n CYCLING: 16, //不清楚\n VOLLEYBALL: 19, //排球\n BOXING: 20, //拳击\n FUTSAL: 25, //5人制足球\n TABLETENNIS: 26, //乒乓球\n BOWLS: 27, //保齡球\n WINTERSPORTS: 28, //冬季運動\n HURLING: 29, //板棍球,又称爱尔兰式曲棍球\n WATERPOLO: 31, //水球\n BEACHVOLLEYBALL: 32, //沙滩排球\n BEACHSOCCER: 33, //沙灘足球\n BADMINTON: 34, //羽毛球\n RUGBYUNION: 35, //橄榄球(聯合式)\n CURLING: 37, //冰壺\n BANDY: 39, //班迪球\n AUSSIERULES: 41, //澳式足球\n MMA: 43, //綜合格鬥\n CRICKET: 59, //板球\n NETBALL: 63, //籃網球,英式籃球\n ATHLETICS: 21, //田径\n SWIMMING: 45, //游泳\n WINTEROLYMPIC: 42, //冬奧\n ESPORTS: 64, //電競?\n}\n\n//盤口(查詢用)\nexport const BTIOddsType = {\n MY: 'malay', //马来盘\n HK: 'hk', //香港盘\n EU: 'decimal', //欧洲盘\n ID: 'indo', //印尼盘\n}\n\n//轉為數字型態(和IM統一數據結構)\nexport const BTIOddsTypeToNumber = {\n malay : 1, //马来盘\n hk: 2, //香港盘\n decimal: 3, //欧洲盘\n indo: 4, //印尼盘\n}\n\n//把上面的盤口 轉成 bet用的type字段\nexport const BTIOddsTypeForBet = {\n malay: 'malaysian', //马来盘\n hk: 'hongkong', //香港盘\n decimal: 'decimal', //欧洲盘\n indo: 'indonesian', //印尼盘\n}\n\n//注單返回的 oddsType 轉為數字型態(和IM統一數據結構)\nexport const BTIWagerOddsTypeToNumber = {\n notset: 0, //未知\n Malaysian : 1, //马来盘\n HongKong: 2, //香港盘\n Decimal: 3, //欧洲盘\n Indonesian: 4, //印尼盘\n}\n\n//注單返回的 oddsType 轉中文\nexport const BTIWagerOddsTypeName = i18n.BTI.BTIWagerOddsTypeName;\n\n//注單狀態中文,對應 bti的 settlementStatus 字段\nexport const BTIWagerStatusName = i18n.BTI.BTIWagerStatusName;\n\n//玩法分組 英翻中\nexport const BTIMarketGroupTypeNames = i18n.BTI.BTIMarketGroupTypeNames;\n\n//投注變化接受程度\nexport const BTIAcceptMode = {\n NONE: 'None', //不接受\n HIGHER: 'AcceptHigher', //只接受更高\n ANY: 'AcceptAny', //全接受\n}\n\n//串關中文名\nexport const BTIComboTypeNames = i18n.BTI.BTIComboTypeNames;\n\n//2表示讓球盤 3表示大小盤 後面的012表示全 上半 下半 場 39為滾球投注,視為全場\n//轉換BTI的主要玩法線名稱,和IM一致\nexport const BTIBetTypeNames = i18n.BTI.BTIBetTypeNames;\n\n//1全場 2上半場 3下半場\nexport const BTIPeriodMapping = {\n '2_0': {PeriodId: 1, PeriodName: i18n.VendorPeriodName[\"1\"]},\n '2_1': {PeriodId: 2, PeriodName: i18n.VendorPeriodName[\"2\"]},\n '2_2': {PeriodId: 3, PeriodName: i18n.VendorPeriodName[\"3\"]},\n '2_39': {PeriodId: 1, PeriodName: i18n.VendorPeriodName[\"1\"]},\n '3_0': {PeriodId: 1, PeriodName: i18n.VendorPeriodName[\"1\"]},\n '3_1': {PeriodId: 2, PeriodName: i18n.VendorPeriodName[\"2\"]},\n '3_2': {PeriodId: 3, PeriodName: i18n.VendorPeriodName[\"3\"]},\n '3_39': {PeriodId: 1, PeriodName: i18n.VendorPeriodName[\"1\"]},\n}\n\n//滾球時段中文名\nexport const BTIRBPeriodNames = i18n.BTI.BTIRBPeriodNames;\n\n//強制歐洲盤的玩法 體育項目(SportId)->玩法(BetTypeId)數組\nexport const BTIForceDecimalBetTypeIds = {\n 1:[//Soccer\n \"1_0\",\n \"1_1\",\n \"1_2\",\n \"1_10\",\n \"1_20\",\n \"1_22\",\n \"1_41\",\n \"60\",\n \"62\",\n \"76\",\n \"89\",\n \"93\",\n \"1_117\",\n \"119\",\n \"120\",\n \"1_121\",\n \"1_141\",\n \"144\",\n \"154\",\n \"155\",\n \"158\",\n \"235\",\n \"262\",\n \"267\",\n \"270\",\n \"271\",\n \"272\",\n \"273\",\n \"274\",\n \"275\",\n \"276\",\n \"277\",\n \"278\",\n \"279\",\n \"280\",\n \"281\",\n \"282\",\n \"284\",\n \"285\",\n \"286\",\n \"287\",\n \"2938\",\n \"288\",\n \"289\",\n \"291\",\n \"292\",\n \"293\",\n \"294\",\n \"295\",\n \"296\",\n \"297\",\n \"298\",\n \"616\",\n \"1_617\",\n \"1_618\",\n \"1_619\",\n \"621\",\n \"696\",\n \"697\",\n \"698\",\n \"699\",\n \"700\",\n \"3880\",\n \"3881\",\n \"701\",\n \"702\",\n \"1333\",\n \"2935\",\n \"2936\",\n \"1334\",\n \"1447\",\n \"1449\",\n \"1451\",\n \"1453\",\n \"1455\",\n \"1457\",\n \"1459\",\n \"1461\",\n \"1463\",\n \"1465\",\n \"1467\",\n \"1468\",\n \"1473\",\n \"1474\",\n \"1475\",\n \"1476\",\n \"1572\",\n \"1610\",\n \"1619\",\n \"1620\",\n \"1621\",\n \"1668\",\n \"1669\",\n \"1670\",\n \"1871\",\n \"8\",\n \"193\",\n \"126\",\n \"184\",\n \"111\",\n \"136\",\n ],\n 2:[ //BasketBall\n \"1_0\",\n \"1_3\",\n \"1_623\",\n \"1_624\",\n \"1_625\",\n \"1_2061\",\n \"1_2062\",\n \"1_2063\",\n \"8\",\n \"111\",\n \"136\",\n ],\n 6:[//Tennis\n \"1_0\",\n \"1_45\",\n \"1_740\",\n \"1_741\",\n \"1_742\",\n \"8\",\n ],\n 3:[ //Football\n \"1_0\",\n \"1_471\",\n \"1_473\",\n \"1_482\",\n \"1_483\",\n \"1_484\",\n \"1_485\",\n \"1_486\",\n \"1_487\",\n \"1_488\",\n \"1_489\",\n \"1_2337\",\n \"1_2339\",\n \"1_2340\",\n \"8\",\n ],\n 7:[ //Baseball\n \"1_0\",\n \"1_3264\",\n \"1_19\",\n \"1_20\",\n \"8\",\n \"1364\",\n \"1365\",\n \"1366\",\n \"1367\",\n \"1_3302\",\n ],\n 8:[ //Ice Hockey\n \"1_0\",\n \"8\",\n \"193\",\n \"1_94\",\n \"1_1249\",\n \"1_1250\",\n \"1_1251\",\n \"1_1254\",\n ],\n 10:[ //Handball\n \"1_0\",\n \"1_409\",\n \"8\",\n \"111\",\n \"193\",\n \"184\",\n ],\n 11:[ //Rugby League\n \"1_0\",\n \"1_1020\",\n \"1_1021\",\n \"1_1027\",\n \"1_1028\",\n \"1_1141\",\n \"1_1142\",\n \"8\",\n \"193\",\n ],\n 12:[ //Golf\n \"1_0\",\n \"8\",\n \"111\",\n \"193\",\n ],\n 13:[ //Snooker & Pool\n \"1_0\",\n \"1_1723\",\n \"8\",\n ],\n 15:[ //Darts\n \"1_0\",\n \"8\",\n ],\n 19:[ //Volleyball\n \"1_0\",\n \"8\",\n \"136\",\n \"111\",\n \"1_462\",\n \"1_1662\",\n \"1_1663\",\n \"1_1664\",\n \"1_1665\",\n ],\n 20:[ //Boxing\n \"1_0\",\n ],\n 24:[ //Floorball\n \"1_0\",\n ],\n 25:[ //Futsal\n \"1_0\",\n ],\n 26:[ //Table Tennis\n \"1_0\",\n ],\n 27:[ //Bowls\n \"1_0\",\n ],\n 31:[ //Water Polo\n \"1_0\",\n ],\n 32:[ //Beach Volleyball\n \"1_0\",\n ],\n 33:[ //Beach Soccer\n \"1_0\",\n ],\n 34:[ //Badminton\n \"1_0\",\n ],\n 35:[ //Rugby Union\n \"1_0\",\n \"1_1\",\n \"1_2\",\n \"1_19\",\n \"1_20\",\n ],\n 41:[ //Aussie Rules\n \"1_0\",\n \"1_772\",\n \"1_775\",\n \"1_776\",\n \"1_777\",\n \"1_779\",\n \"1_781\",\n \"1_789\",\n \"1_790\",\n \"1_795\",\n \"1_796\",\n \"1_848\",\n \"1_859\",\n \"1_860\",\n \"1_861\",\n \"1_862\",\n \"1_863\",\n \"1_864\",\n \"1_865\",\n \"1_866\",\n ],\n 43:[ //MMA\n \"1_0\",\n ],\n 22:[ //Cricket\n \"1_0\",\n \"1_1616\",\n \"1_1617\",\n \"1_1629\",\n ],\n 64:[ //E-Sports\n \"1_0\",\n \"8\",\n \"1_1375\",\n \"1_1376\",\n \"1_1377\",\n \"1_1431\",\n \"1_1432\",\n \"1_1433\",\n \"1_1434\",\n \"1_1520\",\n \"1_1521\",\n ],\n 28:[ //Winter Sports\n \"8\",\n \"193\",\n ],\n 29:[ //Hurling\n \"8\",\n ],\n 30:[ //Sailing\n \"8\",\n ],\n 14:[ //Motor Racing\n \"8\",\n \"193\",\n ],\n 16:[ //Cycling\n \"8\",\n \"193\",\n ],\n 18:[ //Speedway\n \"8\",\n ],\n 36:[ //Trotting\n \"8\",\n ],\n 37:[ //Curling\n \"1_0\",\n \"8\",\n ],\n 39:[ //Bandy\n \"8\",\n \"1_0\",\n ],\n 63:[ //Netball\n \"8\",\n \"1_0\",\n ],\n 67:[ //Gaelic Football\n \"8\",\n \"1_0\",\n ],\n 60:[ //Surfing\n \"8\",\n ],\n 17:[ //Poker\n \"8\",\n ],\n 65:[ //Chess\n \"8\",\n ],\n 71:[ //Racketlon\n \"8\",\n ],\n 68:[ //Gaelic Hurling\n \"1_0\",\n \"8\",\n ],\n 51:[ //Wrestling\n \"8\",\n ],\n 50:[ //Judo\n \"8\",\n ],\n 48:[ //Triathlon\n \"8\",\n ],\n 49:[ //Canoeing\n \"8\",\n ],\n 52:[ //Archery\n \"8\",\n ],\n 53:[ //Diving\n \"8\",\n ],\n 54:[ //Equestrian\n \"8\",\n ],\n 55:[ //Fencing\n \"8\",\n ],\n 56:[ //Modern Pentathlon\n \"8\",\n ],\n 57:[ //Taekwondo\n \"8\",\n ],\n 58:[ //Weightlifting\n \"8\",\n ],\n\n}\n","//公告信息\nexport default class AnnouncementData {\n /**\n * @param AnnouncementId 公告Id\n * @param AnnouncementText 公告文字\n * @param PostingDate 發布日期\n * @param ExtraInfo 其他補充數據\n */\n constructor(\n AnnouncementId,\n AnnouncementText,\n PostingDate,\n ExtraInfo,\n )\n {\n Object.assign(this, {\n AnnouncementId,\n AnnouncementText,\n PostingDate,\n ExtraInfo,\n });\n }\n}","//投注檢查 數據\nimport BetSettingData from \"./BetSettingData\";\nimport {Decimal} from \"decimal.js\";\nimport i18n from '../vendori18n';\nimport {OddsType, SelectionStatusType} from \"./VendorConsts\";\nimport SelectionData from \"./SelectionData\";\n\nexport default class BetInfoData {\n /**\n * @param BetSettings 可能投注方式 BetSettingData 單注時只會有一個,串關返回數組(混合過關)\n * @param SystemParlayBetSettings 可能投注方式 BetSettingData 單注返回null,串關返回數組(系統混合過關)\n * @param Selections 投注選項 SelectionData 單注時只會有一個,串關返回數組\n */\n constructor(\n BetSettings = [],\n SystemParlayBetSettings = [],\n Selections = [],\n )\n {\n Object.assign(this, {\n BetSettings,\n SystemParlayBetSettings,\n Selections,\n });\n }\n\n //返回符合串關投注條件的Selection數組 ( IsOpenParlay=true && SelectionStatus正常)\n getSelectionsForCombo() {\n return this.Selections && Array.isArray(this.Selections) && this.Selections.length >0\n ? this.Selections.filter(s => s.IsOpenParlay && (s.SelectionStatus === SelectionStatusType.OK))\n : [];\n }\n\n //需要分 混合過關 和 系統混合過關\n // IM 只有 A串B ,需要自己找 N串1 多注、複製成system X/Y\n static createFromIMSource(betSettings,Selections) {\n if(betSettings && betSettings.length > 1 && Selections && Selections.length >= 3) {\n //只有 串1 系列的 才會留在 一般混合過關\n const normalParlayComboTypes = [\n 9,// '2串1',\n 10,// '3串1',\n 11,// '4串1',\n 12,// '5串1',\n 13,// '6串1',\n 14,// '7串1',\n 15,// '8串1',\n 16,// '9串1',\n 17,// '10串1',\n ]\n\n //一般串關\n const normalParlaySettings = betSettings.filter(bs => {\n return normalParlayComboTypes.indexOf(bs.ComboType) !== -1\n })\n\n //系統混合過關\n const systemParlaySettings = betSettings.filter(bs => {\n return normalParlayComboTypes.indexOf(bs.ComboType) === -1 //不是串1\n || ((normalParlayComboTypes.indexOf(bs.ComboType) !== -1) && bs.ComboCount > 1) //或者是串1但是 注數要大於1\n })\n\n //處理系統混合過關,要把串1系列改為 系统混合过关 X/Y\n let newSystemParlaySettings = [];\n systemParlaySettings.map(sp => {\n let cloneSetting = BetSettingData.clone(sp); //複製一個,和上面 一般串關 的實例(instance)分開\n if ((normalParlayComboTypes.indexOf(cloneSetting.ComboType) !== -1) && cloneSetting.ComboCount > 1) //是串1但是 注數要大於1\n {\n const xNumber = cloneSetting.ComboType -7; //combotype數字,減七就得到實際是 X 串1\n const yNUmber = Selections.length; // y 就是選擇的投注選項數量\n cloneSetting.ComboTypeName = i18n.IM.SYSTEM_PARLAY + ' ' + xNumber + '/' + yNUmber;\n }\n newSystemParlaySettings.push(cloneSetting);\n })\n return new BetInfoData(\n normalParlaySettings,\n newSystemParlaySettings,\n Selections,\n );\n }else {\n //im不處理 負數盤,因為官方自己支持了,也不需要特別展示\n\n return new BetInfoData(\n betSettings,\n [], //不支持系統混合過關,返回空數組\n Selections,\n );\n }\n }\n\n //需要分 混合過關 和 系統混合過關\n // BTI剛好跟IM相反 只給 system X/Y 要自己複製成 N串1\n // 也順便處理 負數盤問題\n static createFromBTISource(betSettings,Selections) {\n if(betSettings && betSettings.length > 1 && Selections && Selections.length >= 3) {\n //一般串關\n\n //單注的那個N串1\n const comboParlaySettings = betSettings.filter(bs => {\n return (bs.ComboType === 'Combo')\n });\n\n //系統過關\n let systemSingleParlaySettings = [];\n betSettings.map(bs => {\n if (bs.ComboType.lastIndexOf('System', 0) === 0) {\n const fromIndex = bs.ComboType.indexOf('from');\n const xNumber = bs.ComboType.substr(6,fromIndex-6);\n const yNumber = bs.ComboType.substr(fromIndex+4);\n //y剛好等於投注選項數 比如選4個 system2/4 就等於 2串1 x 多注\n if (parseInt(yNumber) === Selections.length) {\n let cloneSetting = BetSettingData.clone(bs); //複製,不要修改原本的實例(instance);\n cloneSetting.ComboTypeName = xNumber + i18n.BTI.PARLAY + '1';\n systemSingleParlaySettings.push(cloneSetting);\n }\n }\n })\n\n const normalParlaySettings = comboParlaySettings.concat(systemSingleParlaySettings);\n\n //系統混合過關,不是單注的都是\n const systemParlaySettings = betSettings.filter(bs => {\n return (bs.ComboType !== 'Single')\n && (bs.ComboType !== 'Combo')\n && bs.ComboCount > 1;\n })\n\n return new BetInfoData(\n normalParlaySettings,\n systemParlaySettings,\n Selections,\n );\n }else {\n //負數盤問題,只有單投需要處理\n if(betSettings && betSettings.length === 1) {\n let targetBetSetting = betSettings[0];\n if (targetBetSetting) {\n const thisBet = targetBetSetting.ExtraInfo.bet;\n const thisOdds = new Decimal(thisBet.displayOdds);\n if (thisOdds.isNegative()) { //負數盤\n targetBetSetting.IsMinusOdds = true;\n targetBetSetting.RealBetAmountRate = thisOdds.abs().toNumber(); //賠率取絕對值 就是實際投注金額比例\n\n //bti需要額外調整EstimatedPayoutRate\n targetBetSetting.EstimatedPayoutRate = thisOdds.abs().add(1).toNumber(); //實際投注金額比例 + 預計贏一個本金\n }\n }\n }\n\n return new BetInfoData(\n betSettings,\n [], //不支持系統混合過關,返回空數組\n Selections,\n );\n }\n }\n\n //SABA和IM一樣 只有 A串B ,需要自己找 N串1 多注、複製成system X/Y\n static createFromSABASource(betSettings,Selections) {\n if(betSettings && betSettings.length > 1 && Selections && Selections.length >= 3) {\n //只有 串1 系列的 才會留在 一般混合過關\n let normalParlayComboTypes = [\n 'Doubles',// '2串1',\n 'Trebles',// '3串1',\n ]\n\n //是否串1系列\n const isFold = (comboType) => {\n return normalParlayComboTypes.indexOf(comboType) !== -1\n //4串1到100串1 = Fold{N}\n || (comboType.lastIndexOf('Fold', 0) === 0)\n }\n\n //一般串關\n const normalParlaySettings = betSettings.filter(bs => {\n return isFold(bs.ComboType);\n })\n\n //系統混合過關\n const systemParlaySettings = betSettings.filter(bs => {\n return !isFold(bs.ComboType) //不是串1\n || (isFold(bs.ComboType) && bs.ComboCount > 1) //或者是串1但是 注數要大於1\n })\n\n //處理系統混合過關,要把串1系列改為 系统混合过关 X/Y\n let newSystemParlaySettings = [];\n systemParlaySettings.map(sp => {\n let cloneSetting = BetSettingData.clone(sp); //複製一個,和上面 一般串關 的實例(instance)分開\n if (isFold(cloneSetting.ComboType) && cloneSetting.ComboCount > 1) //是串1但是 注數要大於1\n {\n let xNumber = 0;\n if (cloneSetting.ComboType === 'Doubles') { //特殊名稱 寫死\n xNumber = 2;\n } else if(cloneSetting.ComboType === 'Trebles') { //特殊名稱 寫死\n xNumber = 3;\n } else { //Fold{N}\n xNumber = cloneSetting.ComboType.replace('Fold','');\n }\n const yNUmber = Selections.length; // y 就是選擇的投注選項數量\n cloneSetting.ComboTypeName = i18n.IM.SYSTEM_PARLAY + ' ' + xNumber + '/' + yNUmber;\n }\n newSystemParlaySettings.push(cloneSetting);\n })\n return new BetInfoData(\n normalParlaySettings,\n newSystemParlaySettings,\n Selections,\n );\n }else {\n //SABA要自己計算 贏取金額\n //只有單投需要處理 因為串投是歐洲盤,只要乘賠率就可以\n if(betSettings && betSettings.length === 1 && Selections && Selections.length === 1) {\n let thisBetSetting = betSettings[0];\n let thisSelection = Selections[0];\n if (thisBetSetting && thisSelection\n && !thisSelection.IsOutRightEvent //猜冠軍固定歐洲盤,不用計算\n && thisSelection.OddsType !== OddsType.EU //本身就是歐洲盤 也不用算\n ) {\n //香港盤不含本金 歐洲盤含本金\n //当香港盘赔率<=1时,马来盘赔率=香港盘赔率\n //当香港盘赔率>1时,马来盘赔率=-1/香港盘赔率\n //当香港盘赔率<1时,印尼盘赔率=-1/香港盘赔率\n //当香港盘赔率>=1时,印尼盘赔率=香港盘赔率\n\n const thisOdds = new Decimal(thisSelection.Odds);\n\n if (thisOdds.isNegative()) { //負數盤\n thisBetSetting.IsMinusOdds = true;\n thisBetSetting.RealBetAmountRate = thisOdds.abs().toNumber(); //賠率取絕對值 就是實際投注金額比例\n thisBetSetting.EstimatedPayoutRate = thisOdds.abs().add(1).toNumber(); //實際投注金額比例 + 預計贏一個本金\n } else {\n //当香港盘赔率<=1时,马来盘赔率=香港盘赔率\n //当香港盘赔率>=1时,印尼盘赔率=香港盘赔率\n //=> 意思只要不是負數盤,就是按香港盤計算 (令人驚訝的簡單...還以為要算很多)\n\n //SABA官方計算 贏取金額 固定會包含本金(即 贏取金額 要用歐洲盤計算)\n //=> 香港盤直接賠率+1=包含本金;\n thisBetSetting.EstimatedPayoutRate = thisOdds.abs().add(1).toNumber();\n }\n }\n }\n\n return new BetInfoData(\n betSettings,\n [], //不支持系統混合過關,返回空數組\n Selections,\n );\n }\n }\n\n static clone(srcData, isComboBet = false) {\n if (isComboBet) {\n //串關\n return new BetInfoData(\n srcData.BetSettings && srcData.BetSettings.length > 0\n ? srcData.BetSettings.map(bs => BetSettingData.clone(bs))\n : [],\n srcData.SystemParlayBetSettings && srcData.SystemParlayBetSettings.length > 0\n ? srcData.SystemParlayBetSettings.map(bs => BetSettingData.clone(bs))\n : [],\n srcData.Selections && srcData.Selections.length > 0\n ? srcData.Selections.map(s => SelectionData.clone(s))\n : []\n )\n } else {\n //單注 特別處理數組型態(理論上應該不會有...)\n let bs = srcData.BetSettings;\n if (Array.isArray(bs)) {\n if (bs.length > 0) {\n bs = BetSettingData.clone(srcData.BetSettings[0]);\n } else {\n bs = null;\n }\n } else {\n if (bs) {\n bs = BetSettingData.clone(srcData.BetSettings);\n } else {\n bs = null;\n }\n }\n let sel = srcData.Selections;\n if (Array.isArray(sel)) {\n if (sel.length > 0) {\n sel = SelectionData.clone(srcData.Selections[0]);\n } else {\n sel = null;\n }\n } else {\n if (sel) {\n sel = SelectionData.clone(srcData.Selections);\n } else {\n sel = null;\n }\n }\n return new BetInfoData(bs,null, sel); //單注SystemParlayBetSettings返回null\n }\n }\n}","//投注結果\nexport default class BetResultData {\n /**\n * @param Balance 投注後當前餘額\n * @param WagerId 注單ID\n * @param WagerStatus 注單狀態\n * @param BetStatus 投注狀態\n * @param IsPending 是否尚未投注成功\n * @parms PendingQueryId 查詢投注狀態Id\n * @param ComboType 串關類型 0單注\n * @param EstimatedPayoutFullAmount 預期派彩總金額 包含本金\n * @param BetSelectionResults 投注結果 BetSelectionResultData格式,如果單筆投注是一個實例,串關會是數組\n * @param BetLogJSON 日志數據\n */\n constructor(\n Balance,\n WagerId,\n WagerStatus,\n BetStatus,\n IsPending = false,\n PendingQueryId = null,\n ComboType,\n EstimatedPayoutFullAmount,\n BetSelectionResults = [],\n BetLogJSON,\n )\n {\n Object.assign(this, {\n Balance,\n WagerId,\n WagerStatus,\n BetStatus,\n IsPending,\n PendingQueryId,\n ComboType,\n EstimatedPayoutFullAmount,\n BetSelectionResults,\n BetLogJSON,\n });\n }\n}\n","//單個投注結果數據\nexport default class BetSelectionResultData {\n /**\n * @param EventId 比賽ID\n * @param Odds 投注賠率\n * @param SelectionType 投注選項類型\n */\n constructor(\n EventId,\n Odds,\n SelectionType,\n )\n {\n Object.assign(this, {\n EventId,\n Odds,\n SelectionType,\n });\n }\n}","//投注配置\nimport {IMComboTypeNames} from \"../im/IMConsts\";\nimport {Decimal} from \"decimal.js\";\nimport VendorError from \"./VendorError\";\nimport {BTIComboTypeNames} from \"../bti/BTIConsts\";\nimport {SABAComboTypeNames} from \"../saba/SABAConsts\";\n\nexport default class BetSettingData {\n /**\n * @param MinAmount 最低投注\n * @param MaxAmount 最高投注\n * @param EstimatedPayoutRate 预测派彩金额比例 根据 $1投注金额\n * @param ComboType 串關類型 0單注\n * 額外提供 ComboTypeName 串關類型中文名\n * @param ComboCount 串關注數\n * @param vendor im 或 bti 或 saba 用來mapping 串關類型名稱\n * @param HasComboBonus 有串關額外獎勵\n * @param ComboBonusPercentage 串關獎勵百分比(數字) 已經是百分率 不是小數,加個%一起顯示即可\n * @param OriginEstimatedPayoutRate 未加上串關獎勵的 原始 预测派彩金额根据 $1投注金额\n * @param FreeBets 免費投注 FreeBetData數組\n * @param IsMinusOdds 是負數盤\n * @param RealBetAmountRate 真實投注金額比例 根据 $1投注金额(目前只有負數盤使用)\n * @param ExtraInfo 額外配置,投注時使用(動態字段)\n */\n constructor(\n MinAmount,\n MaxAmount,\n EstimatedPayoutRate,\n ComboType = 0,\n ComboCount = 0,\n vendor = 'im',\n HasComboBonus = false,\n ComboBonusPercentage = 0,\n OriginEstimatedPayoutRate = 0,\n FreeBets = [],\n IsMinusOdds = false,\n RealBetAmountRate = 1,\n ExtraInfo = {},\n )\n {\n let ComboTypeName = '';\n if (vendor === 'im') {\n ComboTypeName = IMComboTypeNames[ComboType];\n }\n\n if (vendor === 'bti') {\n if (ComboType === 'Combo') {\n const selectionCount = ExtraInfo.bet.selectionsMapped.length;\n ComboTypeName = (BTIComboTypeNames[ComboType]).replace('N',selectionCount);\n } else if(ComboType.lastIndexOf('System', 0) === 0) {\n const fromIndex = ComboType.indexOf('from');\n const x = ComboType.substr(6,fromIndex-6);\n const y = ComboType.substr(fromIndex+4);\n ComboTypeName = (BTIComboTypeNames['SystemXfromY']).replace('X',x).replace('Y',y);\n } else {\n ComboTypeName = BTIComboTypeNames[ComboType];\n }\n\n //需要處理ew投注,暫時不使用這個,收到的時候把注數變成一半\n if (ExtraInfo.isEW) {\n ComboCount = new Decimal(item.numberOfBets).dividedToIntegerBy(2).toNumber();\n }\n }\n\n if (vendor === 'saba') {\n if (ComboType) {\n ComboTypeName = SABAComboTypeNames[ComboType];\n //處理N串1 (N>8)\n if (!ComboTypeName && (ComboType.lastIndexOf('Fold', 0) === 0)) {\n let xNumber = ComboType.replace('Fold', '');\n let nName = SABAComboTypeNames['FoldN'];\n ComboTypeName = nName.replace('N', xNumber);\n }\n }\n }\n\n Object.assign(this, {\n MinAmount,\n MaxAmount,\n EstimatedPayoutRate,\n ComboType,\n ComboTypeName, //額外提供:串關類型中文名\n ComboCount,\n vendor,\n HasComboBonus,\n ComboBonusPercentage,\n OriginEstimatedPayoutRate,\n FreeBets,\n IsMinusOdds,\n RealBetAmountRate,\n ExtraInfo,\n });\n }\n\n toBTIBets(betAmount, pickedfreeBetToken = null) {\n const thisBet = this.ExtraInfo.bet;\n\n //處理負賠率,需要修改投注金額\n if(this.IsMinusOdds && thisBet.type === 'Single') {\n const thisOdds = new Decimal(thisBet.displayOdds);\n if (thisOdds.isNegative()) { //負數盤\n const realBetRate = thisOdds.abs(); //賠率取絕對值 就是實際投注金額比例\n betAmount = new Decimal(betAmount).mul(realBetRate).toNumber();\n }\n } else {\n betAmount = new Decimal(betAmount).toNumber();\n }\n\n //處理freebet\n let selectedFreebet = null\n let usedFreeBetAmount = 0;\n if (pickedfreeBetToken && thisBet.freeBets) {\n const selectedFreebets = (thisBet.freeBets &&thisBet.freeBets.length > 0)\n ? thisBet.freeBets.filter(fb => fb.freeBetToken === pickedfreeBetToken) : [];\n if (selectedFreebets && selectedFreebets.length > 0) {\n selectedFreebet = selectedFreebets[0];\n //默認盡量用光\n if (new Decimal(betAmount).greaterThanOrEqualTo(selectedFreebet.freeBetAmount)) {\n usedFreeBetAmount = new Decimal(selectedFreebet.freeBetAmount).toNumber();\n } else {\n usedFreeBetAmount = betAmount;\n }\n }\n }\n\n const deciamlRoundingMapping = {\n \"Floor\": 3, //ROUND_FLOOR\n \"Round\": 4, //ROUND_HALF_UP = 四捨五入\n \"Ceiling\": 2, //ROUND_CEIL\n }\n\n const hasComboBonus = !!thisBet.comboBonusPercentage && !!thisBet.trueOddsComboBonusIncluded;\n const realOdds = hasComboBonus ? thisBet.trueOddsComboBonusIncluded : thisBet.trueOdds;\n\n const deciamlRounding = deciamlRoundingMapping[this.ExtraInfo.returnRoundingMode];\n const realBet = new Decimal(betAmount).sub(usedFreeBetAmount).toNumber();\n const realFreeBet = new Decimal(usedFreeBetAmount).toNumber();\n const realOddsForFreeBet = new Decimal(realOdds).sub(1).toNumber();\n //可能返回 = 實際投注金額*(歐洲盤)賠率 + 免費投注金額*((歐洲盤)賠率-1) 因為免費投注,如果贏了,不會返本金,\n const realPotentialReturns = new Decimal(realBet).mul(realOdds).add(new Decimal(realFreeBet).mul(realOddsForFreeBet)).toNumber();\n const potentialReturns = new Decimal(realPotentialReturns).toDecimalPlaces(2,deciamlRounding).toNumber(); //小數兩位,最後需要轉成數字格式\n\n //需要處理ew投注,暫時不使用這個,收到的時候把注數變成一半\n if (thisBet.isEW) {\n thisBet.numberOfBets = new Decimal(thisBet.numberOfBets).dividedToIntegerBy(2).toNumber();\n }\n\n let returnObj = {\n type: thisBet.type,\n selectionsMapped: thisBet.selectionsMapped,\n displayOdds: thisBet.displayOdds,\n trueOdds: thisBet.trueOdds,\n numberOfBets: thisBet.numberOfBets,\n stake: betAmount,\n potentialReturns: potentialReturns\n }\n\n if (hasComboBonus) {\n returnObj.comboBonusPercentage = thisBet.comboBonusPercentage;\n returnObj.trueOddsComboBonusIncluded = thisBet.trueOddsComboBonusIncluded;\n }\n\n if (selectedFreebet) {\n returnObj.freeBet = {\n freeBetToken: pickedfreeBetToken,\n freeBetAmount: usedFreeBetAmount,\n }\n }\n\n return [\n returnObj\n ];\n }\n\n static clone(srcData) {\n return new BetSettingData(\n srcData.MinAmount,\n srcData.MaxAmount,\n srcData.EstimatedPayoutRate,\n srcData.ComboType,\n srcData.ComboCount,\n srcData.vendor,\n srcData.HasComboBonus,\n srcData.ComboBonusPercentage,\n srcData.OriginEstimatedPayoutRate,\n srcData.FreeBets,\n srcData.IsMinusOdds,\n srcData.RealBetAmountRate,\n srcData.ExtraInfo,\n )\n }\n}","//投注結果狀態\nexport default class BetStatusData {\n /**\n * @param IsSuccess 是否投注成功\n * @param WagerId 注單ID\n * @param FinalWagerStatus 注單最終狀態,數據形態和BetResultData的WagerStatus一樣\n */\n constructor(\n IsSuccess,\n WagerId,\n FinalWagerStatus,\n )\n {\n Object.assign(this, {\n IsSuccess,\n WagerId,\n FinalWagerStatus,\n });\n }\n}","//提前兌現 結果\nexport default class CashOutResultData {\n /**\n * @param WagerData 提交的注單數據\n * @param IsPending 是否尚未兌現成功 保留欄位,實際無用\n * @param PendingQueryId 查詢兌現狀態Id 保留欄位,實際無用\n * @param LogJSON 日志數據\n */\n constructor(\n WagerData,\n IsPending = false,\n PendingQueryId = null,\n LogJSON,\n )\n {\n Object.assign(this, {\n WagerData,\n IsPending,\n PendingQueryId,\n LogJSON,\n });\n }\n}\n","import {EventChangeType, SpecialUpdateType} from \"./VendorConsts\";\nimport {Decimal} from 'decimal.js';\nimport SpecialUpdateData from \"./SpecialUpdateData\";\nimport EventData from \"./EventData\";\n\n//比賽數據變化\nexport default class EventChangeData {\n /**\n * @param EventId 比賽ID\n * @param ChangeType 變化類型 1新增 2修改 3刪除\n * @param OldValue 舊數據\n * @param NewValue 新數據\n * @param ExtraInfo 額外數據(原始變更依據)\n * @param SpecialUpdates 特定數據變化 SpecialUpdateData 數組,只有在變化類型是 2修改 才會提供\n */\n constructor(\n EventId,\n ChangeType,\n OldValue = null,\n NewValue = null,\n ExtraInfo = null,\n SpecialUpdates = null,\n )\n {\n if (OldValue && typeof OldValue === 'object') {\n OldValue = EventData.clone(OldValue); //深拷貝,不使用ref 也不使用JSON方式,因為會遺失class定義\n }\n if (NewValue && typeof NewValue === 'object') {\n NewValue = EventData.clone(NewValue); //深拷貝,不使用ref 也不使用JSON方式,因為會遺失class定義\n }\n\n if (ExtraInfo && typeof ExtraInfo === 'object') {\n ExtraInfo = JSON.parse(JSON.stringify(ExtraInfo)); //深拷貝,不使用ref\n }\n\n Object.assign(this, {\n EventId,\n ChangeType,\n OldValue,\n NewValue,\n SpecialUpdates,\n ExtraInfo,\n });\n\n //判斷特定數據變化\n if (this.ChangeType === EventChangeType.Update) {\n let specialUpdates = [];\n\n if(!OldValue) {\n console.log('EventChangeData for UPDATE Has Empty OldValue??',EventId);\n return;\n }\n if(!NewValue) {\n console.log('EventChangeData for UPDATE Has Empty NewValue??',EventId);\n return;\n }\n\n //EventStart: 1, //比賽開始\n if ((OldValue.RBTime == null) && (NewValue.RBTime)) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.EventStart,\n OldValue.RBTime,\n NewValue.RBTime\n ))\n }\n\n //HomeGoal: 2, //主場進球\n if (OldValue.HomeScore !== NewValue.HomeScore) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.HomeGoal,\n OldValue.HomeScore,\n NewValue.HomeScore\n ))\n }\n\n //AwayGoal: 3, //客場進球\n if (OldValue.AwayScore !== NewValue.AwayScore) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.AwayGoal,\n OldValue.AwayScore,\n NewValue.AwayScore\n ))\n }\n\n //HomeCorner: 4, //主場角球\n if (OldValue.HomeCorner !== NewValue.HomeCorner) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.HomeCorner,\n OldValue.HomeCorner,\n NewValue.HomeCorner\n ))\n }\n // AwayCorner: 5, //客場角球\n if (OldValue.AwayCorner !== NewValue.AwayCorner) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.AwayCorner,\n OldValue.AwayCorner,\n NewValue.AwayCorner\n ))\n }\n\n //HomeRedCard: 6, //主場紅牌\n if (OldValue.HomeRedCard !== NewValue.HomeRedCard) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.HomeRedCard,\n OldValue.HomeRedCard,\n NewValue.HomeRedCard\n ))\n }\n\n //AwayRedCard: 7, //客場紅牌\n if (OldValue.AwayRedCard !== NewValue.AwayRedCard) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.AwayRedCard,\n OldValue.AwayRedCard,\n NewValue.AwayRedCard\n ))\n }\n\n //LineNew: 8, //增加玩法\n //LineDelete: 9, //移除玩法\n //OddsUp: 10, //賠率上升\n //OddsDown: 11, //賠率下降\n let newLines = [];\n let deleteLines = [];\n NewValue.Lines.map(lineInNew => {\n const newLineExistInOldLines = OldValue.Lines.filter(lineInOld => {\n return lineInNew.LineId === lineInOld.LineId;\n })\n //新玩法\n if (!newLineExistInOldLines || newLineExistInOldLines.length <=0) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.LineNew,\n null,\n lineInNew,\n lineInNew.LineId,\n ))\n } else {\n //檢查賠率變化\n newLineExistInOldLines.map(lineInOld => {\n lineInOld.Selections.map(selectionInOld => {\n lineInNew.Selections.map(selectionInNew => {\n if (selectionInOld.SelectionId === selectionInNew.SelectionId) {\n const OddsOld = new Decimal(selectionInOld.Odds ?? 0);\n const OddsNew = new Decimal(selectionInNew.Odds ?? 0);\n\n //賠率上升\n if (OddsNew.greaterThan(OddsOld)) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.OddsUp,\n selectionInOld.Odds,\n selectionInNew.Odds,\n lineInNew.LineId,\n selectionInNew.SelectionId,\n ))\n\n //賠率下降\n } else if (OddsNew.lessThan(OddsOld)) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.OddsDown,\n selectionInOld.Odds,\n selectionInNew.Odds,\n lineInNew.LineId,\n selectionInNew.SelectionId,\n ))\n }\n }\n })\n })\n })\n }\n });\n\n OldValue.Lines.map(lineInOld => {\n const oldLineExistInNewLines = NewValue.Lines.filter(lineInNew => {\n return lineInNew.LineId === lineInOld.LineId;\n })\n //已移除的玩法\n if (!oldLineExistInNewLines || oldLineExistInNewLines.length <=0) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.LineDelete,\n lineInOld,\n null,\n lineInOld.LineId,\n ))\n }\n });\n\n this.SpecialUpdates = specialUpdates;\n }\n\n }\n}","//投注線(玩法) 分組 數據\nexport default class LineGroupData {\n /**\n * @param LineGroupId 玩法分組id\n * @param LineGroupName 玩法分組名\n * @param LineCount 玩法數量\n * @param SortNumber 排序\n */\n constructor(\n LineGroupId,\n LineGroupName,\n LineCount,\n SortNumber,\n )\n {\n Object.assign(this, {\n LineGroupId,\n LineGroupName,\n LineCount,\n SortNumber,\n });\n }\n}","//比賽數據\nimport moment from \"moment\";\nimport {\n SelectionStatusType,\n SortWays,\n VendorConfigs,\n VendorMarketNames,\n VendorMarkets,\n VendorPeriodName\n} from \"./VendorConsts\";\nimport LineData from \"./LineData\";\nimport SelectionData from \"./SelectionData\";\nimport OddsData from \"./OddsData\";\nimport {\n BTIBetTypeNames,\n BTIComboTypeNames, BTIForceDecimalBetTypeIds,\n BTIMarketGroupTypeNames,\n BTIOddsType,\n BTIOddsTypeToNumber, BTIPeriodMapping, BTIRBPeriodNames\n} from \"../bti/BTIConsts\";\nimport {\n SABAOddsType,\n SABAOddsTypeToNumber,\n SABARBPeriodNames,\n SABALineGroupNames,\n SABABetTypeNames,\n SABAPeriodMapping,\n} from \"../saba/SABAConsts\";\nimport LineGroupData from \"./LineGroupData\";\nimport {IMEventGroupTypeNames, IMLineGroupNames, IMRBPeriodNames} from \"../im/IMConsts\";\nimport natureCompare from 'natural-compare';\nimport {Decimal} from \"decimal.js\";\nimport i18n from '../vendori18n';\n\nexport default class EventData {\n /**\n * @param EventId 比賽id\n * @param EventDate 比赛時間\n * @param EventStatusId 開盤狀態 1開2關\n * @param EventGroupId 比賽分組,用途不明\n * @param EventGroupTypeId 比賽分組類型,用途不明\n * @param HomeTeamId 主場球隊id\n * @param HomeTeamName 主場球隊名\n * @param HomeScore 主場得分\n * @param HomeRedCard 主場紅牌數\n * @param HomeCorner 主場角球數\n * @param HomeIconUrl 主隊ICON鏈接,SABA專用\n * @param AwayTeamId 客場球隊id\n * @param AwayTeamName 客場球隊名\n * @param AwayScore 客場得分\n * @param AwayRedCard 客場紅牌數\n * @param AwayCorner 客場角球數\n * @param AwayIconUrl 客隊ICON鏈接,SABA專用\n * @param HasCornerData 是否提供角球數據(im:false, bti:true)\n * @param SortOrder 排序\n * @param RBTime 滾球時間,平台原始的滾球數據\n * @param RBMinute 滾球分鐘(開始到現在比賽進行了幾分鐘)\n * @param RBPeriodName 滾球時間段(中文)\n * @param RelatedScores 相關比分清單,用途不明\n * @param GroundTypeId 主場狀態 0在中立場比賽 1在主場比賽,用途不明\n * @param IsOpenParlay 是否支持串關\n * @param HasStatistic 是否有分析數據(BR)\n * @param HasVisualization 是否有可視化(動畫)(BR)\n * @param BREventId (BR)比賽Id\n * @param IsRB 是否比賽進行(滾球)中\n * @param HasLiveStreaming 是否有直播數據\n * @param LiveStreamingUrl 直播源列表 按照im格式 是數組 目前UI是會播放第一個數據\n * @param Season 賽日指標,用於虛擬體育\n * @param MatchDay 賽事指標,用於虛擬體育\n * @param ExtraInfo 額外信息\n * @param SportId 體育ID\n * @param MarketId 市場ID\n * @param LeagueId 聯賽id\n * @param LeagueName 聯賽名\n * @param TotalLineCount 玩法總數(查詢時可以過濾,這裡列出來的是過濾前的總數)\n * @param IsFavourite 是否收藏遊戲\n * @param IsOutRightEvent 是否為優勝冠軍賽事\n * @param OutRightEventName 優勝冠軍賽事名\n * @param LineGroups 玩法分組列表,LineGroupData數組\n * @param Lines 玩法列表,LineData數組\n * @param MarketIdForListing 市場ID for 首屏額外展示關注比賽 默認和MarketId相同,只對UI展示有用\n */\n constructor(\n EventId,\n EventDate,\n EventStatusId,\n EventGroupId,\n EventGroupTypeId,\n HomeTeamId,\n HomeTeamName,\n HomeScore,\n HomeRedCard,\n HomeCorner,\n HomeIconUrl,\n AwayTeamId,\n AwayTeamName,\n AwayScore,\n AwayRedCard,\n AwayCorner,\n AwayIconUrl,\n HasCornerData,\n SortOrder,\n RBTime,\n RBMinute,\n RBPeriodName,\n RelatedScores,\n GroundTypeId,\n IsOpenParlay,\n HasStatistic,\n HasVisualization,\n BREventId,\n IsRB,\n HasLiveStreaming,\n LiveStreamingUrl,\n MatchDay,\n Season,\n ExtraInfo,\n SportId,\n MarketId,\n LeagueId,\n LeagueName,\n TotalLineCount,\n IsFavourite,\n IsOutRightEvent,\n OutRightEventName,\n LineGroups,\n Lines = [],\n MarketIdForListing = null,\n )\n {\n Object.assign(this, {\n EventId,\n EventDate,\n EventStatusId,\n EventGroupId,\n EventGroupTypeId,\n HomeTeamId,\n HomeTeamName,\n HomeScore,\n HomeRedCard,\n HomeCorner,\n HomeIconUrl,\n AwayTeamId,\n AwayTeamName,\n AwayScore,\n AwayRedCard,\n AwayCorner,\n AwayIconUrl,\n HasCornerData,\n SortOrder,\n RBTime,\n RBMinute,\n RBPeriodName,\n RelatedScores,\n GroundTypeId,\n IsOpenParlay,\n HasStatistic,\n HasVisualization,\n BREventId,\n IsRB,\n HasLiveStreaming,\n LiveStreamingUrl,\n MatchDay,\n Season,\n ExtraInfo,\n SportId,\n MarketId,\n LeagueId,\n LeagueName,\n TotalLineCount,\n IsFavourite,\n IsOutRightEvent,\n OutRightEventName,\n LineGroups,\n Lines,\n MarketIdForListing,\n });\n\n //處理日期\n this.EventDateLocal = this.getEventDateMoment().format('YYYY-MM-DD'); //日期過濾用 for 早盤\n if (MarketIdForListing === null) {\n this.MarketIdForListing = MarketId; //默認和MarketId相同\n }\n }\n\n //獲取時區調整後的Moment類\n getEventDateMoment() {\n return moment(this.EventDate).utcOffset(VendorConfigs.TIMEZONE);\n }\n\n //由selectionId, lineId找內含的Selection數據\n getChildSelection(selectionId, lineId, eventId = null){\n if (eventId === this.EventId || eventId === null) {\n const thisLines = this.Lines.filter(l => l.LineId === lineId);\n if (thisLines.length > 0) {\n const thisLine = thisLines[0];\n const thisSelections = thisLine.Selections.filter(s => s.SelectionId === selectionId);\n if (thisSelections.length > 0) {\n return thisSelections[0];\n }\n }\n }\n return null\n }\n\n //更新投注分組計數(只有bti用到,因為bti會單獨修改Lines)\n updateLineGroupCount(){\n this.LineGroups.map(lg => {\n const linesInGroup = this.Lines.filter(l => {\n return (l.LineGroupIds && l.LineGroupIds.length > 0 && l.LineGroupIds.indexOf(lg.LineGroupId) !== -1)\n })\n lg.LineCount = linesInGroup.length;\n })\n }\n\n //排序投注線 按 讓球->大小 全場-上半場-下半場的順序(列表使用)\n sortLines() {\n const compareFunc = (left,right) => {\n const a = left.PeriodId + '_' + left.BetTypeId;\n const b = right.PeriodId + '_' + right.BetTypeId;\n return natureCompare(a,b); //自然排序\n }\n if (this.Lines && this.Lines.length > 1) {\n this.Lines = this.Lines.sort(compareFunc);\n }\n }\n\n //IM專用 排序投注線 EventGroupTypeId優先, 然後betType,再排全場上半下半,然後按linelevel順序小到大(詳情頁使用)\n IMSortLinesAndSelections() {\n const lineCompareFunc = (left, right) => {\n const a = left.EventGroupTypeId + '_' + left.BetTypeId + '_' + left.PeriodId + '_' + left.LineLevel;\n const b = right.EventGroupTypeId + '_' + right.BetTypeId + '_' + right.PeriodId + '_' + right.LineLevel;\n return natureCompare(a, b); //自然排序\n }\n\n //投注選項特別排序\n const selectionSpecialCompareFunc = (specialWords) => {\n return (left, right) => {\n let a1 = specialWords.indexOf(left.SelectionName);\n let b1 = specialWords.indexOf(right.SelectionName);\n\n if (a1 !== -1 && b1 !== -1) {\n if (a1 < b1) {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n\n if (a1 > b1) {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n }\n return 0; //沒找到不動\n }\n }\n\n const selectionCompareFunc = (left,right) => {\n //其他沒特別註明的直接用SelectionId排序\n const ax = left.SelectionId;\n const bx = right.SelectionId ;\n return natureCompare(ax,bx); //自然排序\n }\n\n if (this.Lines && this.Lines.length > 1) {\n this.Lines = this.Lines.sort(lineCompareFunc);\n this.Lines.map(l => {\n if (l.Selections && l.Selections.length > 1) {\n //按照name去分類\n const selectionNames = l.Selections.map(s => s.SelectionName);\n //去重複\n const uniqueSelectionNames = selectionNames.filter((item, index) => selectionNames.indexOf(item) === index);\n\n let specialSorted = false;\n //特殊排序的配置\n const specialSortConditions = [\n {\n uniqueSelectionCount: 2,\n sortWords: [\n [i18n.HOME,i18n.AWAY],\n [i18n.BIG,i18n.SMALL],\n [i18n.ODD,i18n.EVEN],\n [i18n.YES,i18n.NO],\n [i18n.HOME_YES,i18n.HOME_NO],\n [i18n.HOME_YES2,i18n.HOME_NO2],\n [i18n.AWAY_YES,i18n.AWAY_NO],\n [i18n.AWAY_YES2,i18n.AWAY_NO2],\n [i18n.HOME_ODD,i18n.HOME_EVEN],\n [i18n.AWAY_ODD,i18n.AWAY_EVEN],\n [i18n.HOME_WIN_YES,i18n.HOME_WIN_NO],\n [i18n.AWAY_WIN_YES,i18n.AWAY_WIN_NO],\n [i18n.TIE,i18n.HOME_WIN],\n [i18n.TIE,i18n.AWAY_WIN],\n [i18n.ANY_WIN_YES,i18n.ANY_WIN_NO],\n [i18n.HOME_PERFECT_WIN_YES,i18n.HOME_PERFECT_WIN_NO],\n [i18n.AWAY_PERFECT_WIN_YES,i18n.AWAY_PERFECT_WIN_NO],\n ]\n },\n {\n uniqueSelectionCount: 3,\n sortWords: [\n [i18n.HOME,i18n.TIE,i18n.AWAY],\n [i18n.HOME,i18n.NOT_HAVE,i18n.AWAY],\n ]\n }\n ]\n\n //wholeloop: //不能用label break在rn裡面會有問題\n for(let condition of specialSortConditions) {\n if (specialSorted) { //不能用label break的替代方案\n break;\n }\n //判斷不重複的seleciton數量\n if (uniqueSelectionNames.length === condition.uniqueSelectionCount) {\n for(let words of condition.sortWords) {\n //檢查selectionName要完全符合要求的字\n if (words.filter(w => uniqueSelectionNames.indexOf(w) !== -1).length === condition.uniqueSelectionCount) {\n //使用特別排序\n const specialSortFunc = selectionSpecialCompareFunc(words);\n l.Selections = l.Selections.sort(specialSortFunc);\n specialSorted = true; //標記已經特別排序過\n //break wholeloop; //不能用label break在rn裡面會有問題\n break;\n }\n }\n }\n }\n\n //感覺不需要 先不排\n // if (!specialSorted) { //沒特別排序就用默認的\n // l.Selections = l.Selections.sort(selectionCompareFunc);\n // }\n }\n })\n }\n }\n\n //IM專用,處理IM特殊結構 eventGroup,把特殊投注合併到 主Event 數據內\n IMMergeSideEvents(jsonEvents, FavoriteEvents, memberOddsType, memberType) {\n //處理sideEvents\n const sideEvents = jsonEvents.filter(ev => ev.EventGroupTypeId !== 1 && ev.EventGroupId === this.EventGroupId);\n let sideEventDatas = (sideEvents && sideEvents.length > 0) ?\n sideEvents.map(se => EventData.createFromIMSource(se, this.SportId, FavoriteEvents, memberOddsType, memberType))\n : []\n\n if (sideEventDatas && sideEventDatas.length > 0) {\n //先按 EventGroupTypeId 順序排序\n const natureCompFunc = (left,right) => {\n const a = left.EventGroupTypeId;\n const b = right.EventGroupTypeId;\n return natureCompare(a,b); //自然排序\n }\n sideEventDatas = sideEventDatas.sort(natureCompFunc);\n\n //把sideEvents合併到主比賽\n sideEventDatas.map(se => {\n if (se.Lines && se.Lines.length > 0) {\n if (!this.LineGroups && !Array.isArray(this.LineGroups)) {\n this.LineGroups = [];\n }\n\n const thisLineGroupId = 'SPECIAL_' + se.EventGroupTypeId;\n\n //有可能同一個EventGroupTypeId開了好幾個side event,需要判斷\n const existLineGroups = this.LineGroups.filter(lg => lg.LineGroupId === thisLineGroupId);\n\n if (!existLineGroups || existLineGroups.length <=0) {\n //新增一個分類\n this.LineGroups.push(\n new LineGroupData(\n thisLineGroupId, //群組id自己組一個\n IMEventGroupTypeNames[se.EventGroupTypeId], //名字用IM給的固定名稱\n se.Lines.length,\n 99, //先放最後,後面再看怎麼調比較好\n )\n )\n } else {\n //分類已存在,把投注線 數量加上去\n existLineGroups[0].LineCount = existLineGroups[0].LineCount + se.Lines.length;\n }\n\n //合併投注線\n se.Lines.map(sel => {\n sel.LineGroupIds = [thisLineGroupId]; //修改投注線分組\n //修改玩法名\n const newBetTypeName = IMEventGroupTypeNames[se.EventGroupTypeId] + ' ' + sel.BetTypeName;\n sel.BetTypeName = newBetTypeName\n if (sel.Selections && sel.Selections.length > 0) {\n sel.Selections.map(sels => {\n sels.BetTypeName = newBetTypeName //selection裡面的玩法名也要一起改\n })\n }\n this.Lines.push(sel);\n });\n }\n })\n }\n }\n\n //BTI專用,把多線Selection過濾,剩下主線Selection\n BTIFilterMainLineOnly() {\n if (this.Lines && this.Lines.length > 0) {\n if (this.IsOutRightEvent) {\n //猜冠軍 只留下前4個\n this.Lines.map(l => {\n if (l.Selections && l.Selections.length > 4) {\n l.Selections = l.Selections.filter((s,index) => index < 4);\n }\n });\n } else {\n //一般比賽\n this.Lines.map(l => {\n if (l.Selections && l.Selections.length > 2) { //2個以上才要篩選\n const newSelections = l.Selections.filter(s => {\n return s.Specifiers && s.Specifiers.length > 0 && s.Specifiers[0] && s.Specifiers[0] === 'MainPointLine';\n });\n //確認有MainPointLine才替換,找不到就不換了\n if (newSelections && newSelections.length > 0) {\n l.Selections = newSelections;\n l.updateSelectionAnalysis();\n } else {\n //如果沒有MainPointLine,嘗試找成對的 SelectionId 尾數為MM的\n const MMSelections = l.Selections.filter(s => {\n const str = s.SelectionId;\n const suffix = 'MM';\n return str.indexOf(suffix, str.length - suffix.length) !== -1; //尾數為MM\n })\n if (MMSelections && MMSelections.length >= 2) {\n l.Selections = MMSelections;\n l.updateSelectionAnalysis();\n } else {\n if (MMSelections.length === 1) {\n console.log('====SingleMM????',JSON.stringify(MMSelections[0]))\n }\n }\n }\n }\n\n //排序主->客 大->小\n const compareFunc = (left, right) => {\n //特別處理主客大小,因為SelectionId排出來有時候不對\n const aType = left.SelectionType;\n const bType = right.SelectionType;\n\n //排主>客 , 大>小\n if (aType === 'Home' || aType === 'Over') {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n\n if (bType === 'Home' || bType === 'Over') {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n\n //可能出現奇怪的null 先不管\n if (left.RealHandicap === null || right.RealHandicap === null) {\n return 0;\n }\n\n //數值排序\n const aValue = new Decimal(left.RealHandicap);\n const bValue = new Decimal(right.RealHandicap);\n\n //只有客場讓球是數值大->小(要和主場正負相對)\n if (aType === 'Away') {\n if (aValue.greaterThan(bValue)) {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n\n if (aValue.lessThan(bValue)) {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n } else { //其他都是按 小->大\n if (aValue.lessThan(bValue)) {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n\n if (aValue.greaterThan(bValue)) {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n }\n\n return 0;\n }\n\n if (l.Selections && l.Selections.length > 1) {\n l.Selections = l.Selections.sort(compareFunc);\n }\n })\n }\n }\n }\n\n //BTI專用, line利用betTypeId排序, selection用group去排序,詳情頁專用\n BTISortLinesAndSelections() {\n const lineCompareFunc = (left,right) => {\n //有下滑線的優先\n const a = left.BetTypeId.indexOf('_') !== -1;\n const b = right.BetTypeId.indexOf('_') !== -1;\n\n if (a === true && b === false) {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n\n if (b === true && a === false) {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n\n //2表示讓球盤 3表示大小盤 後面的012表示全 上半 下半 場 39為滾球投注\n\n //把 1_0 轉為 0_1 這樣把全/上半/下半場優先排序\n const reverse = (s) => {\n return s.split(\"_\").reverse().join(\"\");\n }\n\n const a2 = reverse(left.BetTypeId);\n const b2 = reverse(right.BetTypeId);\n return natureCompare(a2,b2); //自然排序\n }\n\n const selectionCompareFuncWrap = (lineData) => {\n //額外添加參數lineData用來判斷是什麼投注線\n\n //是否為讓球盤\n const isHandicap = (lineData.BetTypeId.indexOf('2_') !== -1);\n\n // if (isHandicap) {\n // console.log('===',lineData.BetTypeName,' is handicap!!!');\n // }\n\n return (left, right) => {\n //2021/7/28維護後新版 已經沒有提供group\n // const a = left.SelectionGroup;\n // const b = right.SelectionGroup;\n // if (a < b) {\n // return -1; //小于 0 ,那么 a 会被排列到 b 之前\n // }\n //\n // if (a > b) {\n // return 1; //大于 0 , b 会被排列到 a 之前。\n // }\n\n //一般排序順序\n let aSortIndex = -1;\n let bSortIndex = -1;\n const commonMap = [['Home','Tie','Away'],['Over','Under']]; //主和客, 大小\n const aType = left.SelectionType;\n const bType = right.SelectionType;\n for(let thisMap of commonMap) {\n aSortIndex = thisMap.indexOf(aType);\n bSortIndex = thisMap.indexOf(bType);\n if (aSortIndex !== -1 && bSortIndex !== -1) {\n break;\n }\n }\n\n //不是處理範圍內,直接用SelectionId排序\n if (aSortIndex === -1 || bSortIndex === -1) {\n // if (aType || bType) {\n // console.log('=====BTI unknown selection???', lineData.BetTypeName, aType, aSortIndex, bType, bSortIndex, JSON.stringify(left), JSON.stringify(right));\n // } else {\n // console.log('=====BTI unknown selection???', lineData.BetTypeName);\n // }\n\n //直接用SelectionId排序\n const a2 = left.SelectionId;\n const b2 = right.SelectionId ;\n return natureCompare(a2,b2); //自然排序\n }\n\n //Handicap 可能出現null,直接按 一般排序規則進行\n if (left.RealHandicap === null || right.RealHandicap === null) {\n if (aSortIndex < bSortIndex) {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n\n if (aSortIndex > bSortIndex) {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n return 0;\n }\n\n //一般盤口 handicap乘1000 再把排序數加到個位數 就可以小->大 並且交錯排序\n\n let aValue = new Decimal(left.RealHandicap).mul(1000).add(aSortIndex) ;\n let bValue = new Decimal(right.RealHandicap).mul(1000).add(bSortIndex) ;\n\n //如果是讓球盤,需要特別處理排序數\n if (isHandicap\n && ['Home','Away'].indexOf(aType) !== -1 && ['Home','Away'].indexOf(bType) !== -1\n ) {\n /*\n * 讓球要排成\n *\n * 主 -1 客 1\n * 主 0 客 0\n * 主 1 客 -1\n *\n * 需要主客交錯擺放,且handicap值要從小->大\n * 客 因為要和 主 正負對應,所以直接乘-1 變號,就可以兩個排在一起,\n * handicap乘1000 再把主客加到個位數 就可以小->大並且交錯排序\n *\n * 主 -1 => -1 *1000 -2 = -1002 (主為負 => -2)\n * 客 1 => 1 *(-1)*1000 -1 = -1001 (客乘-1後為負 => -1)\n * 主 0 => 0 *1000 +1 = 1 (主為正 => +1)\n * 客 0 => 0 *(-1)*1000 +2 = 2 (客乘-1後為正 => +2)\n * 主 1 => 1 *1000 +1 = 1001 (主為正 => +1)\n * 客 -1 => -1 *(-1)*1000 +2 = 1002 (客乘-1後為正 => +2)\n */\n const getSortNumber = (handicap,sortIndex) => {\n let specialSortIndex = 0;\n let thisNumber = new Decimal(handicap).mul(1000); //先乘1000\n if (sortIndex === 0) { //主\n if (thisNumber.isNegative() && !thisNumber.isZero()) { //主為負(注意負零 算是負 要排除)\n specialSortIndex = -2;\n } else { //主為正\n specialSortIndex = 1;\n }\n }else if (sortIndex === 2) { //客\n thisNumber = thisNumber.mul(-1); //客 要乘-1\n if (thisNumber.isNegative() && !thisNumber.isZero()) { //客乘-1後為負(注意負零 算是負 要排除)\n specialSortIndex = -1;\n } else { //客乘-1後為正\n specialSortIndex = +2;\n }\n }\n return thisNumber.add(specialSortIndex);\n }\n aValue = getSortNumber(left.RealHandicap,aSortIndex);\n bValue = getSortNumber(right.RealHandicap,bSortIndex);\n }\n\n left._SORTVALUE = aValue.toNumber();\n right._SORTVALUE = bValue.toNumber();\n\n if (aValue.lessThan(bValue)) {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n\n if (aValue.greaterThan(bValue)) {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n return 0;\n }\n }\n if (this.Lines && this.Lines.length > 1) {\n\n //bti需要排除以下這四個投注線\n //Cash Out Soccer FT Asians 亚洲让分盘\n //Cash Out Soccer FT Asians 大小盘\n //Cash Out Basketball FT 让分盘\n //Cash Out Basketball FT 比赛进球\n\n const needFilterBetTypeNames = [\n 'Cash Out Soccer FT Asians 亚洲让分盘',\n 'Cash Out Soccer FT Asians 大小盘',\n 'Cash Out Basketball FT 让分盘',\n 'Cash Out Basketball FT 比赛进球',\n ]\n\n this.Lines = this.Lines.filter(l => needFilterBetTypeNames.indexOf(l.BetTypeName) === -1).sort(lineCompareFunc);\n this.Lines.map(l => {\n if (l.Selections && l.Selections.length > 1) {\n l.Selections = l.Selections.sort(selectionCompareFuncWrap(l));\n }\n })\n }\n }\n\n //SABA 排序投注線 詳情頁使用\n SABASortLines() {\n if (this.Lines && this.Lines.length > 0) {\n const lineCompareFunc = (left, right) => {\n //前面加上EventId 用來區隔sideEvent的投注線\n const a = left.EventId + '_' + left.BetTypeId + '_' + left.PeriodId + '_' + left.LineLevel;\n const b = right.EventId + '_' + right.BetTypeId + '_' + right.PeriodId + '_' + right.LineLevel;\n return natureCompare(a, b); //自然排序\n }\n this.Lines = this.Lines.sort(lineCompareFunc);\n }\n }\n\n SABAMergeSideEvents(sideEvents) {\n //處理sideEvents\n if (sideEvents && sideEvents.length > 0) {\n //把sideEvents合併到主比賽\n for(let se of sideEvents) {\n //因為sideEvent的玩法名似乎沒包含角球,可能會和現有的玩法混淆,所以先取出玩法 前綴名\n //*意大利甲组联赛 - 总角球数和总进球数\n //要取到 \" - \" 後面的字\n let sideEventName = '';\n if (se.LeagueName.indexOf(' - ') === -1) {\n console.log('====not useable? sideEvent???', JSON.parse(JSON.stringify(se)));\n continue; //跳過這一個sideEvent\n } else {\n sideEventName = se.LeagueName.substr(se.LeagueName.indexOf(' - ') +3);\n }\n\n if (se.Lines && se.Lines.length > 0) {\n if (!this.LineGroups && !Array.isArray(this.LineGroups)) {\n this.LineGroups = [];\n }\n\n se.LineGroups.map(selg => {\n const existLineGroups = this.LineGroups.filter(lg => lg.LineGroupId === selg.LineGroupId);\n if (!existLineGroups || existLineGroups.length <=0) {\n //不存在分類,就新增\n this.LineGroups.push(\n new LineGroupData(\n selg.LineGroupId,\n selg.LineGroupName,\n selg.LineCount,\n 0,\n )\n )\n } else {\n //分類已存在,把投注線 數量加上去\n existLineGroups[0].LineCount = existLineGroups[0].LineCount + selg.LineCount;\n }\n })\n\n //合併投注線\n se.Lines.map(sel => {\n //修改玩法名\n const newBetTypeName = sideEventName + ' - ' + sel.BetTypeName;\n sel.BetTypeName = newBetTypeName\n if (sel.Selections && sel.Selections.length > 0) {\n sel.Selections.map(sels => {\n sels.BetTypeName = newBetTypeName //selection裡面的玩法名也要一起改\n })\n }\n this.Lines.push(sel);\n });\n }\n }\n }\n }\n\n\n //從IM數據生成EventData數據\n static createFromIMSource(item, SportId, FavoriteEvents, memberOddsType, memberType) {\n item.EventId = parseInt(item.EventId); //IM固定轉為int\n\n const isFavourite = FavoriteEvents.filter(favItem=>item.EventId === favItem.EventId).length > 0;\n\n //處理玩法分組\n let lineGroupDatas = [];\n for (let typeid in IMLineGroupNames) {\n\n const intTypeId = parseInt(typeid);\n //計算組內數量\n const linesInGroup = item.MarketLines.filter(l => {\n const groupid = (l.BetTypeId == 2 ? 1 : l.BetTypeId) //只有 2大/小 會併入 1讓分 ,需要特別處理\n return parseInt(groupid) === intTypeId;\n })\n\n lineGroupDatas.push(new LineGroupData(\n intTypeId,\n IMLineGroupNames[typeid],\n linesInGroup.length,\n intTypeId,\n ));\n }\n\n //市場名\n const MarketName = VendorMarketNames[item.Market];\n\n //是否滾球中\n const isRB = (item.Market === VendorMarkets.RUNNING) || (item.RBTime !== null);\n\n //處理滾球時間\n let rbMinute = '';\n let rbPeriod = '';\n if (isRB && item.RBTime) {\n //有空白 表示為 1H 12:34 這種格式\n const blankIndex = item.RBTime.indexOf(' ');\n if (blankIndex !== -1) {\n const toIndex = item.RBTime.indexOf(':');\n if (toIndex !== -1) {\n const minuteLength = toIndex - blankIndex - 1;\n if (blankIndex >= 0 && minuteLength > 0) {\n rbMinute = item.RBTime.substr(blankIndex + 1, minuteLength);\n }\n } else { //沒有帶秒數的,直接切分鐘\n if (blankIndex >= 0) {\n rbMinute = item.RBTime.substr(blankIndex + 1);\n }\n }\n if (blankIndex >= 0) {\n rbPeriod = item.RBTime.substr(0, blankIndex);\n }\n } else if(item.RBTime.length === 2) {\n rbPeriod = item.RBTime;\n }\n\n if (rbPeriod && rbPeriod.length > 0) {\n const rbname = IMRBPeriodNames[rbPeriod]; //中文名\n if (rbname) {\n rbPeriod = rbname; //有對到才用中文名,沒對到 就直接用原本的字\n }\n }\n }\n\n //處理中立場\n if (item.GroundTypeId === 0 && item.HomeTeam) {\n item.HomeTeam = item.HomeTeam + '(' + i18n.NEUTRAL_GROUND + ')'\n }\n\n //處理角球\n let homeCorner = null;\n let awayCorner = null;\n if (isRB && item.RelatedScores && item.RelatedScores.length > 0) {\n const cornerData = item.RelatedScores.find(s => parseInt(s.EventGroupTypeId) === 2);\n if (cornerData) {\n homeCorner = cornerData.HomeScore ? cornerData.HomeScore : 0;\n awayCorner = cornerData.AwayScore ? cornerData.AwayScore : 0;\n }\n }\n\n return new EventData(\n item.EventId,\n item.EventDate,\n item.EventStatusId,\n item.EventGroupId,\n item.EventGroupTypeId,\n item.HomeTeamId,\n item.HomeTeam,\n item.HomeScore,\n item.HomeRedCard,\n homeCorner,\n null,//SABA專用\n item.AwayTeamId,\n item.AwayTeam,\n item.AwayScore,\n item.AwayRedCard,\n awayCorner,\n null,//SABA專用\n true,\n (isRB ? item.Competition.RBOrderNumber : item.Competition.PMOrderNumber) + '_' + item.OrderNumber,\n item.RBTime,\n rbMinute,\n rbPeriod,\n item.RelatedScores,\n item.GroundTypeId,\n item.OpenParlay,\n item.HasStatistic,\n item.HasVisualization,\n item.BREventId,\n isRB, //注意IM原始數據的isLive代表是否支持滾球投注,不是比賽進行中。不過BTI的isLive就是比賽進行中,所以乾脆統一改成isRB字段 比較不會混淆\n item.LiveStreaming === 1,\n item.LiveStreamingUrl,\n item.MatchDay,\n item.Season,\n item.ExtraInfo,\n SportId,\n item.Market,\n item.Competition.CompetitionId,\n item.Competition.CompetitionName,\n item.TotalMarketLineCount,\n isFavourite,\n false, //優勝冠軍有專用的create函數\n '', //優勝冠軍有專用的create函數\n lineGroupDatas,\n item.MarketLines.map(lineItem => {\n\n //IM的大/小 改成 大小 和mockup一致\n if (lineItem.BetTypeName === i18n.BIG_OR_SMALL) {\n lineItem.BetTypeName = i18n.BIG_SMALL\n }\n\n //處理IM的特殊玩法線名 - 第{goalnr}粒入球球队\n let thisBetTypeName = lineItem.BetTypeName;\n if (thisBetTypeName.indexOf('{') !== -1 && thisBetTypeName.indexOf('}') !== -1 ) {\n //從下面的selection找能用的替代文字(這到底是什麼神奇結構。。。)\n let childSelectionSpecifiers = []\n lineItem.WagerSelections.map(s => {\n if (s.Specifiers && (s.Specifiers.indexOf('=') !== -1)) {\n if (childSelectionSpecifiers.indexOf(s.Specifiers) === -1) {\n childSelectionSpecifiers.push(s.Specifiers);\n }\n }\n });\n if (childSelectionSpecifiers && childSelectionSpecifiers.length >0) {\n for (let chiildSpecifier of childSelectionSpecifiers) {\n const spec_arr = chiildSpecifier.split('='); //用=切開\n if (spec_arr && spec_arr.length === 2) {\n const replaceTarget = '{' + spec_arr[0] + '}';\n if (thisBetTypeName.indexOf(replaceTarget) !== -1) {\n thisBetTypeName = thisBetTypeName.replace(replaceTarget,spec_arr[1]);\n //console.log('===== LineBetTypeName replace!',lineItem.BetTypeName,thisBetTypeName,chiildSpecifier,lineItem.MarketlineId, item.EventId);\n break;\n }\n }\n }\n }\n }\n\n return new LineData(\n //IM的BetTypeId就是玩法分組,只有 2大/小 會併入 1讓分 ,需要特別處理\n //BTI的1個玩法 可能同時屬於多個分類,所以這裡也一起改成數組格式\n lineItem.BetTypeId == 2 ? [1] : [lineItem.BetTypeId],\n lineItem.BetTypeId,\n thisBetTypeName,\n lineItem.IsLocked,\n lineItem.MarketlineId,\n lineItem.MarketLineLevel,\n lineItem.MarketlineStatusId,\n lineItem.PeriodId,\n lineItem.PeriodName,\n item.EventId,\n item.EventGroupTypeId,\n item.HomeTeam,\n item.AwayTeam,\n lineItem.WagerSelections.map(selectionItem => {\n\n let thisSelectionName = selectionItem.SelectionName;\n\n //處理IM的特殊投注選項名\n if (selectionItem.Specifiers && (selectionItem.Specifiers.indexOf('=') !== -1)) {\n const spec_arr = selectionItem.Specifiers.split('='); //用=切開\n if (spec_arr && spec_arr.length === 2) {\n if (spec_arr[0] === 'hcp') { //三項讓球,特別處理\n //hcp=0:2\n if (spec_arr[1].indexOf(':') !== -1) {\n const xy_arr = spec_arr[1].split(':'); //後面的數字用:切開\n if (xy_arr && xy_arr.length === 2) {\n const thisx = parseInt(xy_arr[0]);\n const thisy = parseInt(xy_arr[1]);\n //分別取代 x-y 或者 y-x 讓分盤\n if (thisSelectionName.indexOf('{x-y}') !== -1) {\n thisSelectionName = thisSelectionName.replace('{x-y}', thisx - thisy);\n //console.log('===== selectionName replace(x-y)!',selectionItem.SelectionName,thisSelectionName,selectionItem.Specifiers);\n } else if (thisSelectionName.indexOf('{y-x}') !== -1) {\n thisSelectionName = thisSelectionName.replace('{y-x}', thisy - thisx);\n //console.log('===== selectionName replace!(y-x)',selectionItem.SelectionName,thisSelectionName,selectionItem.Specifiers);\n } else {\n //console.log('===== selectionName NOT replace??????',selectionItem.SelectionName,thisSelectionName,selectionItem.Specifiers);\n }\n }\n }\n } else {\n //total=1.5 這種,直接取代\n const replaceTarget ='{' + spec_arr[0] + '}';\n if (thisSelectionName.indexOf(replaceTarget) !== -1) {\n thisSelectionName = thisSelectionName.replace(replaceTarget, spec_arr[1]);\n //console.log('===== selectionName replace!', selectionItem.SelectionName, thisSelectionName, selectionItem.Specifiers);\n } else {\n //console.log('===== selectionName NOT replace??????',selectionItem.SelectionName,thisSelectionName,selectionItem.Specifiers);\n }\n }\n }\n }\n\n //處理讓球和大小的特殊展示方式\n\n let thisHandiCap = selectionItem.Handicap;\n\n //處理讓球\n if (lineItem.BetTypeId === 1 && thisHandiCap !== null) {\n let thisHandicapDecimal = new Decimal(thisHandiCap);\n if (selectionItem.SelectionId === 1) { //主場\n thisHandicapDecimal = thisHandicapDecimal.mul(-1); //主場先乘-1\n }\n //如果是0.25或0.75,\n if (thisHandicapDecimal.abs().mod(1).eq(0.25) || thisHandicapDecimal.abs().mod(1).eq(0.75)) {\n // 0.75 改成 +0.5/1\n if (thisHandicapDecimal.greaterThan(0)) {\n thisHandiCap = '+' + thisHandicapDecimal.sub(0.25).toNumber() + '/' + thisHandicapDecimal.add(0.25).toNumber();\n }\n // -0.75 改成 -0.5/1 前面統一加負號 記得負數最後用abs消掉負號\n if (thisHandicapDecimal.lessThan(0)) {\n thisHandiCap = '-' + thisHandicapDecimal.add(0.25).abs().toNumber() + '/' + thisHandicapDecimal.sub(0.25).abs().toNumber();\n }\n } else {\n //直接加正負號\n if (thisHandicapDecimal.greaterThan(0)) {\n thisHandiCap = '+' + thisHandicapDecimal.toNumber();\n }\n if (thisHandicapDecimal.lessThan(0)) {\n thisHandiCap = '-' + thisHandicapDecimal.abs().toNumber();\n }\n }\n }\n\n //處理大小\n if (lineItem.BetTypeId === 2 && thisHandiCap !== null) {\n let thisHandicapDecimal = new Decimal(thisHandiCap);\n //如果是0.25或0.75,\n if (thisHandicapDecimal.abs().mod(1).eq(0.25) || thisHandicapDecimal.abs().mod(1).eq(0.75)) {\n // 0.75 改成 0.5/1\n if (thisHandicapDecimal.greaterThan(0)) {\n thisHandiCap = thisHandicapDecimal.sub(0.25).toNumber() + '/' + thisHandicapDecimal.add(0.25).toNumber();\n }\n }\n }\n\n const oddsDeciaml = Decimal.clone({ rounding: 3 }) //無條件捨去\n\n //判斷投注目標球隊,IM利用selectionName判斷\n let targetTeamId = null;\n let targetTeamName = '';\n if ((item.HomeTeam && thisSelectionName.indexOf(item.HomeTeam) !== -1) //玩法名包含隊名\n || thisSelectionName === i18n.HOME) //或者玩法名就是一個「主」字\n {\n targetTeamId = item.HomeTeamId;\n targetTeamName = item.HomeTeam;\n } else if ((item.AwayTeam && thisSelectionName.indexOf(item.AwayTeam) !== -1) //玩法名包含隊名\n || thisSelectionName === i18n.AWAY)//或者玩法名就是一個「客」字\n {\n targetTeamId = item.AwayTeamId;\n targetTeamName = item.AwayTeam;\n }\n\n //從OddsList獲取賠率\n let thisOddsType = null;\n let thisOddsValue = null;\n if (selectionItem.OddsList && selectionItem.OddsList.length > 0) {\n let targetOddsInfo = selectionItem.OddsList[0]; //默認選第一個賠率\n const matchOddsInfos = selectionItem.OddsList.filter(oInfo => parseInt(oInfo.OddsType) === memberOddsType);\n if (matchOddsInfos && matchOddsInfos.length > 0) { //如果有找到跟會員設置的盤口一樣的,就使用這個\n targetOddsInfo = matchOddsInfos[0];\n }\n thisOddsType = targetOddsInfo.OddsType;\n thisOddsValue = targetOddsInfo.OddsValues[memberType]; //根據水位選擇賠率\n }\n //如果沒獲取到就用默認值\n thisOddsValue = thisOddsValue ?? selectionItem.Odds;\n thisOddsType = thisOddsType ?? selectionItem.OddsType;\n\n return new SelectionData(\n selectionItem.WagerSelectionId,\n selectionItem.SelectionId,\n thisSelectionName,\n 0, //IM沒有selection group\n thisHandiCap,\n selectionItem.Handicap,\n selectionItem.Specifiers,\n SportId,\n item.Market,\n MarketName,\n item.Competition.CompetitionId,\n item.Competition.CompetitionName,\n item.HomeTeamId,\n item.HomeTeam,\n item.HomeScore,\n item.AwayTeamId,\n item.AwayTeam,\n item.AwayScore,\n item.EventId,\n item.OpenParlay,\n lineItem.MarketlineId,\n lineItem.BetTypeId,\n thisBetTypeName,\n lineItem.PeriodId,\n lineItem.PeriodName,\n targetTeamId,\n targetTeamName,\n false,\n '',\n thisOddsValue,\n thisOddsType,\n selectionItem.OddsList ? selectionItem.OddsList.map(oddsItem => {\n return new OddsData(\n oddsItem.OddsType,\n oddsItem.OddsValues,\n )\n }) : [],\n new oddsDeciaml(thisOddsValue).toFixed(2),\n )\n })\n )\n })\n )\n }\n\n //從IM優勝冠軍數據 生成EventData數據\n static createFromIMOutRightSource(item, SportId, FavoriteEvents, memberOddsType , memberType ) {\n item.EventId = parseInt(item.EventId); //IM固定轉為int\n\n const isFavourite = FavoriteEvents.filter(favItem=>item.EventId === favItem.EventId).length > 0;\n\n //市場名\n const MarketName = VendorMarketNames[VendorMarkets.OUTRIGHT];\n\n const oddsDeciaml = Decimal.clone({ rounding: 3 }) //無條件捨去\n\n return new EventData(\n item.EventId,\n item.EventDate,\n item.EventStatusId,\n null, //比賽分組 優勝冠軍沒有\n null, //比賽分組類型 優勝冠軍沒有\n null, //主隊數據 優勝冠軍沒有\n null,\n null,\n null,\n null,\n null,//SABA專用\n null, //客隊數據 優勝冠軍沒有\n null,\n null,\n null,\n null,\n null,//SABA專用\n false,\n item.Competition.PMOrderNumber + '_' + item.OrderNumber,\n null, //滾球時間,平台原始的滾球數據 優勝冠軍沒有\n '',\n '',\n null, //相關比分清單 優勝冠軍沒有\n null, //主場狀態 優勝冠軍沒有\n false, //只能單注,不能串\n false, //是否有分析數據(BR) 優勝冠軍沒有\n false, //是否有可視化 優勝冠軍沒有\n null, //BREventId 可視化(BR)比賽Id 優勝冠軍沒有\n false, //是否滾球中 優勝冠軍沒有\n false, //是否有直播數據 優勝冠軍沒有\n null, //直播源列表\n null, //賽日指標,用於虛擬體育\n null, //賽事指標,用於虛擬體育\n null, //額外信息\n SportId,\n VendorMarkets.OUTRIGHT,\n item.Competition.CompetitionId,\n item.Competition.CompetitionName,\n 1, //玩法總數 都只有一種 就是 優勝冠軍\n isFavourite,\n true, //是 優勝冠軍賽事\n item.OutrightEventName,\n [], //玩法分組列表 優勝冠軍沒有\n item.MarketLines.map(lineItem => {\n return new LineData(\n [], //玩法分組 優勝冠軍沒有\n lineItem.BetTypeId,\n lineItem.BetTypeName,\n lineItem.IsLocked,\n lineItem.MarketlineId,\n lineItem.MarketLineLevel,\n lineItem.MarketlineStatusId,\n lineItem.PeriodId,\n lineItem.PeriodName,\n item.EventId,\n null,\n null,\n null,\n lineItem.WagerSelections.map(selectionItem => {\n\n //從OddsList獲取賠率\n let thisOddsType = null;\n let thisOddsValue = null;\n if (selectionItem.OddsList && selectionItem.OddsList.length > 0) {\n let targetOddsInfo = selectionItem.OddsList[0]; //默認選第一個賠率\n const matchOddsInfos = selectionItem.OddsList.filter(oInfo => parseInt(oInfo.OddsType) === memberOddsType);\n if (matchOddsInfos && matchOddsInfos.length > 0) { //如果有找到跟會員設置的盤口一樣的,就使用這個\n targetOddsInfo = matchOddsInfos[0];\n }\n thisOddsType = targetOddsInfo.OddsType;\n thisOddsValue = targetOddsInfo.OddsValues[memberType]; //根據水位選擇賠率\n }\n\n //如果沒獲取到就用默認值\n thisOddsValue = thisOddsValue ?? selectionItem.Odds;\n thisOddsType = thisOddsType ?? selectionItem.OddsType;\n\n return new SelectionData(\n selectionItem.WagerSelectionId,\n selectionItem.SelectionId,\n selectionItem.SelectionName,\n 0, //IM沒有selection group\n selectionItem.Handicap,\n selectionItem.Handicap,\n selectionItem.Specifiers,\n SportId,\n VendorMarkets.OUTRIGHT,\n MarketName,\n item.Competition.CompetitionId,\n item.Competition.CompetitionName,\n null,\n null,\n null,\n null,\n null,\n null,\n item.EventId,\n false,\n lineItem.MarketlineId,\n lineItem.BetTypeId,\n lineItem.BetTypeName,\n lineItem.PeriodId,\n lineItem.PeriodName,\n selectionItem.SelectionId, //優勝冠軍的目標隊就是selectionItem\n selectionItem.SelectionName,\n true,\n item.OutrightEventName,\n thisOddsValue,\n thisOddsType,\n selectionItem.OddsList ? selectionItem.OddsList.map(oddsItem => {\n return new OddsData(\n oddsItem.OddsType,\n oddsItem.OddsValues,\n )\n }) : [],\n new oddsDeciaml(thisOddsValue).toFixed(2),\n )\n })\n )\n })\n )\n }\n\n //從BTI數據生成EventData數據\n static createFromBTISource(item, lines, marketId = null, FavoriteEvents, memberOddsType) {\n item.id = item.id + ''; //BTI固定轉為string\n\n //判斷市場\n if (marketId === null || marketId === VendorMarkets.FAVOURITE) { //關注(收藏) 實際不算一種Market 只是下拉選項 另外有一個MarketIdForListing字段 負責處理UI問題\n if (item.type === 'Outright') {\n //優勝冠軍\n marketId = VendorMarkets.OUTRIGHT;\n } else if(item.isLive == true) {\n //滾球\n marketId = VendorMarkets.RUNNING;\n } else {\n //今日早盤 由日期判斷\n const oneDayAfter = moment().add(1,'day').utcOffset(VendorConfigs.TIMEZONE);\n const eventDate = moment(item.startEventDate).utcOffset(VendorConfigs.TIMEZONE);\n if (eventDate > oneDayAfter) {\n marketId = VendorMarkets.EARLY;\n } else {\n marketId = VendorMarkets.TODAY;\n }\n }\n }\n\n const marketName = VendorMarketNames[marketId];\n\n const isFavourite = FavoriteEvents.filter(favItem=>item.id === favItem.EventId).length > 0;\n\n const homeTeams = item.participants.filter(item => item.venueRole === 'Home');\n let homeTeam = {\n id: 0,\n name: 'not set',\n score: (item.score ? item.score.homeScore : null),\n redCard : ((item.score && item.score.additionalScores) ? item.score.additionalScores.redCardsTeam1 : null),\n corner : ((item.score && item.score.additionalScores) ? item.score.additionalScores.cornersTeam1 : null),\n };\n if (homeTeams && homeTeams.length > 0) {\n const homeTeamData = homeTeams[0];\n homeTeam.id = homeTeamData.id;\n homeTeam.name = homeTeamData.name;\n }\n\n const awayTeams = item.participants.filter(item => item.venueRole === 'Away');\n let awayTeam = {\n id: 0,\n name: 'not set',\n score: (item.score ? item.score.awayScore : null),\n redCard : ((item.score && item.score.additionalScores) ? item.score.additionalScores.redCardsTeam2 : null),\n corner : ((item.score && item.score.additionalScores) ? item.score.additionalScores.cornersTeam2 : null),\n };\n if (awayTeams && awayTeams.length > 0) {\n const awayTeamData = awayTeams[0];\n awayTeam.id = awayTeamData.id;\n awayTeam.name = awayTeamData.name;\n }\n\n const thisLines = lines.filter(line => {\n return line.eventId == item.id;\n });\n\n let oddsTypePropList = [];\n for (let oddsPropName in BTIOddsTypeToNumber) {\n oddsTypePropList.push({name: oddsPropName, number: BTIOddsTypeToNumber[oddsPropName]});\n }\n\n //排序玩法分組\n let compareLineGroupFunc = (left,right) => {\n const a = left.SortNumber;\n const b = right.SortNumber;\n if (a < b ) {// 按某种排序标准进行比较, a 小于 b\n return -1;\n }\n if (a > b ) {\n return 1;\n }\n // a must be equal to b\n return 0;\n }\n\n //處理滾球時間\n let rbMinute = '';\n let rbPeriod = '';\n if (item.isLive && item.liveGameState) {\n rbPeriod = item.liveGameState.gamePart;\n if (rbPeriod && rbPeriod.length > 0) {\n const rbname = BTIRBPeriodNames[rbPeriod]; //中文名\n if (rbname) {\n rbPeriod = rbname; //有對到才用中文名,沒對到 就直接用原本的字\n }\n }\n if (item.liveGameState.gameTime) {\n rbMinute = new Decimal(item.liveGameState.gameTime).dividedToIntegerBy(60).toString();\n }\n if(rbPeriod === undefined || rbPeriod === null) {\n rbPeriod = '';//空字符串 避免報錯\n }\n }\n\n //處理優勝冠軍\n let isOutRightEvent = false;\n let outRightEventName = '';\n if (item.type === 'Outright') {\n isOutRightEvent = true;\n outRightEventName = item.eventName;\n }\n\n //判斷強制歐洲盤的玩法\n const forceDecimalBetTypeIds = BTIForceDecimalBetTypeIds[parseInt(item.sportId)];\n\n //處理排序\n let thisSortOrder = item.leagueOrder;\n if (thisSortOrder === 0 || !thisSortOrder) {\n thisSortOrder = 9999999; //排到最後面\n }\n\n return new EventData(\n item.id,\n item.startEventDate,\n 1, //開盤狀態? BTI沒有\n 0, //分組? BTI沒有\n 0, //分組類型? BTI沒有\n homeTeam.id,\n homeTeam.name,\n homeTeam.score,\n homeTeam.redCard,\n homeTeam.corner,\n null,//SABA專用\n awayTeam.id,\n awayTeam.name,\n awayTeam.score,\n awayTeam.redCard,\n awayTeam.corner,\n null,//SABA專用\n true,\n thisSortOrder,\n item.liveGameState, //原始滾球數據\n rbMinute,\n rbPeriod,\n item.score ? item.score.additionalScores: null,\n 1, //主場狀態 BTI沒有\n true, //是否支持串關 BTI沒有\n false, //是否有分析數據(BR) BTI沒有\n false, //是否有可視化 BTI沒有\n null, //可視化(BR)比賽Id BTI沒有\n item.isLive,\n false, //是否有直播數據 //TODO:待確認\n null, //直播源列表 //TODO:待確認\n null, //賽日指標,用於虛擬體育 BTI沒有? //TODO:待確認\n null, //賽事指標,用於虛擬體育 BTI沒有? //TODO:待確認\n { tags: item.tags, metadata: item.metadata },\n parseInt(item.sportId),\n marketId,\n item.leagueId,\n item.leagueName,\n item.totalActiveMarketsCount,\n isFavourite,\n isOutRightEvent,\n outRightEventName,\n item.marketGroups.map(mgitem => {\n //計算組內數量\n const linesInGroup = thisLines.filter(l => {\n return l.groups.indexOf(mgitem.id) !== -1;\n })\n\n //注意這個marketGroup.id不是固定,要獲取中文名,只能用英文名去對照中文\n let thisMarketGroupTypeName = BTIMarketGroupTypeNames[mgitem.name];\n if (!thisMarketGroupTypeName) { //對應不到就先放英文名\n thisMarketGroupTypeName = mgitem.name;\n }\n\n return new LineGroupData(\n mgitem.id,\n thisMarketGroupTypeName,\n linesInGroup.length,\n mgitem.order,\n )\n }).sort(compareLineGroupFunc),\n thisLines.map(lineItem => {\n\n //處理特殊玩法 名稱統一(讓分 大小)\n let thisBetTypeName = lineItem.name; //直接用name比用marketType.name完整\n let periodData = {PeriodId: 0, PeriodName : ''}\n const specialBetTypeName = BTIBetTypeNames[lineItem.marketType.id];\n if (specialBetTypeName) {\n thisBetTypeName = specialBetTypeName;\n periodData = BTIPeriodMapping[lineItem.marketType.id];\n }\n\n return new LineData(\n lineItem.groups ? lineItem.groups : [], //玩法分組\n lineItem.marketType.id,\n thisBetTypeName,\n lineItem.isSuspended, //盘口是否封盘\n lineItem.id,\n 1, //盘口级别 BTI沒有\n 1, //盘口狀態 1開 2關 BTI沒有\n periodData.PeriodId, //比赛时段 ID 1全場 2上半 3下半 BTI沒有\n periodData.PeriodName, //比赛时段名 BTI沒有\n item.id,\n 0, //分組類型? BTI沒有\n homeTeam.name,\n awayTeam.name,\n lineItem.selections.map(selectionItem => {\n\n //特別處理讓分大小的selectionName\n if (specialBetTypeName) {\n if (selectionItem.outcomeType == 'Home') {\n selectionItem.name = i18n.HOME\n }\n if (selectionItem.outcomeType == 'Away') {\n selectionItem.name = i18n.AWAY\n }\n if (selectionItem.outcomeType == 'Over') {\n selectionItem.name = i18n.BIG\n }\n if (selectionItem.outcomeType == 'Under') {\n selectionItem.name = i18n.SMALL\n }\n }\n\n //判斷投注目標球隊,BTI利用participantMapping判斷\n let targetTeamId = null;\n let targetTeamName = '';\n if (selectionItem.participantMapping) {\n const filtedTeams = item.participants.filter(item => item.id === selectionItem.participantMapping);\n if (filtedTeams.length > 0) {\n targetTeamId = filtedTeams[0].id;\n targetTeamName = filtedTeams[0].name;\n }\n }\n\n //如果用participantMapping沒有對到,改用selectionName判斷\n if (targetTeamId === null) {\n if ((homeTeam.name && selectionItem.name.indexOf(homeTeam.name) !== -1) //玩法名包含隊名\n || selectionItem.name === i18n.HOME) //或者玩法名就是一個「主」字\n {\n targetTeamId = homeTeam.id;\n targetTeamName = homeTeam.name;\n } else if ((awayTeam.name && selectionItem.name.indexOf(awayTeam.name) !== -1) //玩法名包含隊名\n || selectionItem.name === i18n.AWAY)//或者玩法名就是一個「客」字\n {\n targetTeamId = awayTeam.id;\n targetTeamName = awayTeam.name;\n }\n }\n\n let thisOddsType = memberOddsType;\n if(forceDecimalBetTypeIds && forceDecimalBetTypeIds.indexOf(lineItem.marketType.id) !== -1) {\n //console.log('===force decimal',lineItem.marketType.id,JSON.parse(JSON.stringify(selectionItem)))\n thisOddsType = 'decimal';\n }\n\n return new SelectionData(\n selectionItem.id,\n selectionItem.outcomeType,\n selectionItem.name,\n selectionItem.group,\n selectionItem.points,\n selectionItem.points,\n selectionItem.tags,\n item.sportId,\n marketId,\n marketName,\n item.leagueId,\n item.leagueName,\n homeTeam.id,\n homeTeam.name,\n homeTeam.score,\n awayTeam.id,\n awayTeam.name,\n awayTeam.score,\n item.id,\n true, //是否支持串關 BTI沒有\n lineItem.id,\n lineItem.marketType.id,\n thisBetTypeName,\n periodData.PeriodId, //比赛时段 ID 1全場 2上半 3下半 BTI沒有 只有特殊玩法(讓分,大小)有提供,其他帶0\n periodData.PeriodName,\n targetTeamId,\n targetTeamName,\n isOutRightEvent,\n outRightEventName,\n selectionItem.displayOdds[thisOddsType],\n BTIOddsTypeToNumber[thisOddsType],\n oddsTypePropList.map(oddsTypeData => {\n return new OddsData(\n oddsTypeData.number,\n selectionItem.displayOdds[oddsTypeData.name],\n )\n }),\n selectionItem.displayOdds[thisOddsType],\n )\n })\n )\n })\n )\n }\n\n static createFromBTIChange(item, oldData, FavoriteEvents) {\n item.id = item.id + ''; //BTI固定轉為string\n\n const isFavourite = FavoriteEvents.filter(favItem=>item.id === favItem.EventId).length > 0;\n\n let homeScore = oldData.HomeScore;\n let homeRedCard = oldData.HomeRedCard;\n let homeCorner = oldData.HomeCorner;\n let awayScore = oldData.AwayScore;\n let awayRedCard = oldData.AwayRedCard;\n let awayCorner = oldData.AwayCorner;\n if (item.score) {\n if (item.score.homeScore) {\n homeScore = item.score.homeScore;\n }\n if(item.score.additionalScores && item.score.additionalScores.redCardsTeam1) {\n homeRedCard = item.score.additionalScores.redCardsTeam1;\n }\n if(item.score.additionalScores && item.score.additionalScores.cornersTeam1) {\n homeCorner = item.score.additionalScores.cornersTeam1;\n }\n\n if (item.score.awayScore) {\n awayScore = item.score.awayScore;\n }\n if(item.score.additionalScores && item.score.additionalScores.redCardsTeam2) {\n awayRedCard = item.score.additionalScores.redCardsTeam2;\n }\n if(item.score.additionalScores && item.score.additionalScores.cornersTeam2) {\n awayCorner = item.score.additionalScores.cornersTeam2;\n }\n }\n\n //處理滾球時間\n let rbMinute = oldData.RBMinute;\n let rbPeriod = oldData.RBPeriodName;\n if(!item.liveGameState) {\n item.liveGameState = oldData.RBTime;\n }\n if (item.isLive && item.liveGameState) {\n rbPeriod = item.liveGameState.gamePart;\n if (rbPeriod && rbPeriod.length > 0) {\n const rbname = BTIRBPeriodNames[rbPeriod]; //中文名\n if (rbname) {\n rbPeriod = rbname; //有對到才用中文名,沒對到 就直接用原本的字\n }\n }\n if (item.liveGameState.gameTime) {\n rbMinute = new Decimal(item.liveGameState.gameTime).dividedToIntegerBy(60).toString();\n }\n if(rbPeriod === undefined || rbPeriod === null) {\n rbPeriod = '';//空字符串 避免報錯\n }\n }\n\n //注意這個BTI的change只有更新Event本身,下屬的數組(投注線Lines,投注分組LineGroups等) 是另外處理,這裡只要拿舊數據複製就可以\n return new EventData(\n oldData.EventId,\n item.startEventDate ?? oldData.EventDate,\n 1, //開盤狀態? BTI沒有\n 0, //分組? BTI沒有\n 0, //分組類型? BTI沒有\n oldData.HomeTeamId,\n oldData.HomeTeamName,\n homeScore,\n homeRedCard,\n homeCorner,\n null,//SABA專用\n oldData.AwayTeamId,\n oldData.AwayTeamName,\n awayScore,\n awayRedCard,\n awayCorner,\n null,//SABA專用\n true,\n oldData.SortOrder,\n item.liveGameState, //滾球時間\n rbMinute,\n rbPeriod,\n item.score ? item.score.additionalScores : oldData.RelatedScores,\n 1, //主場狀態 BTI沒有\n true, //是否支持串關 BTI沒有\n false, //是否有分析數據(BR) BTI沒有\n false, //是否有可視化 BTI沒有\n null, //可視化(BR)比賽Id BTI沒有\n item.isLive,\n false, //是否有直播數據 //TODO:待確認\n null, //直播源列表 //TODO:待確認\n null, //賽日指標,用於虛擬體育 BTI沒有? //TODO:待確認\n null, //賽事指標,用於虛擬體育 BTI沒有? //TODO:待確認\n { tags: item.tags ?? oldData.ExtraInfo.tags, metadata: item.metadata ?? oldData.ExtraInfo.metadata },\n oldData.SportId,\n oldData.MarketId,\n oldData.LeagueId,\n oldData.LeagueName,\n item.totalActiveMarketsCount ?? oldData.TotalLineCount,\n isFavourite,\n oldData.IsOutRightEvent,\n oldData.OutRightEventName,\n oldData.LineGroups.map(lgItem => {\n return new LineGroupData(\n lgItem.LineGroupId,\n lgItem.LineGroupName,\n lgItem.LineCount,\n lgItem.SortNumber,\n )\n }),\n oldData.Lines.map(lineItem => {\n return LineData.clone(lineItem)\n })\n )\n }\n\n //從沙巴數據生成EventData數據\n static createFromSABASource(item, lines, marketId = null, FavoriteEvents, memberOddsType, itemIndex= null) {\n item.EventId = parseInt(item.EventId); //saba固定轉為int\n\n //判斷市場\n if (marketId === null || marketId === VendorMarkets.FAVOURITE) { //關注(收藏) 實際不算一種Market 只是下拉選項 另外有一個MarketIdForListing字段 負責處理UI問題\n if(item.isLive == true) {\n //滾球\n marketId = VendorMarkets.RUNNING;\n } else {\n //今日早盤 由日期判斷\n const oneDayAfter = moment().add(1,'day').utcOffset(VendorConfigs.TIMEZONE);\n const eventDate = moment(item.startEventDate).utcOffset(VendorConfigs.TIMEZONE);\n if (eventDate > oneDayAfter) {\n marketId = VendorMarkets.EARLY;\n } else {\n marketId = VendorMarkets.TODAY;\n }\n }\n }\n\n const marketName = VendorMarketNames[marketId];\n\n const isFavourite = FavoriteEvents.filter(favItem=>item.eventId === favItem.EventId).length > 0;\n\n const thisLines = lines.filter(line => {\n return line.eventId == item.eventId;\n });\n\n let oddsTypePropList = [];\n for (let oddsPropName in SABAOddsTypeToNumber) {\n oddsTypePropList.push({name: oddsPropName, number: SABAOddsTypeToNumber[oddsPropName]});\n }\n\n //判斷隊名\n let homeTeamId = 0;\n let awayTeamId = 0;\n let homeTeamName = 'not set';\n let awayTeamName = 'not set';\n const homeTeamScore = item.gameInfo ? item.gameInfo.liveHomeScore : null;\n const awayTeamScore = item.gameInfo ? item.gameInfo.liveAwayScore : null;\n if (item.teamInfo) {\n homeTeamId = item.teamInfo.homeId;\n awayTeamId = item.teamInfo.awayId\n homeTeamName = item.teamInfo.homeName;\n awayTeamName = item.teamInfo.awayName;\n }\n\n\n //處理滾球時間\n let rbMinute = '';\n let rbPeriod = ''; //原始數據\n let rbPeroidName = ''; //中文\n if (item.isLive && item.gameInfo) {\n rbPeriod = item.gameInfo.inPlayTime;\n if(rbPeriod === undefined || rbPeriod === null) {\n rbPeriod = '';//空字符串 避免報錯\n }\n\n //按照saba提供的表去處理比賽時段名\n let rbPeriodKey = null;\n if (item.sportType == 1) { //足球\n if (item.gameInfo.livePeriod == 0 && item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = 'Delayed'; //延遲開賽\n } else if (item.gameInfo.livePeriod == 1 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '1H'; //上半场\n } else if (item.gameInfo.livePeriod == 2 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '2H'; //下半场\n } else if (item.gameInfo.livePeriod == 0 && !item.gameInfo.delayLive && item.gameInfo.isHt) {\n rbPeriodKey = 'HT'; //中场休息\n }\n } else if (item.sportType == 2) { //篮球\n if (item.gameInfo.livePeriod == 0 && item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = 'Delayed'; //延遲開賽\n } else if (item.gameInfo.livePeriod == 1 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '1Q'; //第 1 节\n } else if (item.gameInfo.livePeriod == 2 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '2Q'; //第 2 节\n } else if (item.gameInfo.livePeriod == 2 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '3Q'; //第 3 节\n } else if (item.gameInfo.livePeriod == 2 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '4Q'; //第 4 节\n } else if (item.gameInfo.livePeriod == 99 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = 'QT'; //延长赛\n } else if (item.gameInfo.livePeriod == 0 && !item.gameInfo.delayLive && item.gameInfo.isHt) {\n rbPeriodKey = 'HT'; //中场休息\n }\n } else if (item.sportType == 5) { //网球\n if (item.gameSession == 5 && item.tennisInfo && item.tennisInfo.currentSet) {\n rbPeriodKey = item.tennisInfo.currentSet + 'S'; //第 N 盘\n }\n } else if (item.sportType == 9) { //羽毛球\n if (item.gameSession == 3 && item.gameInfo.livePeriod) {\n rbPeriodKey = item.gameInfo.livePeriod + 'G'; //第 N 局\n }\n } else if (item.sportType == 43) { //电子竞技\n if (item.eSportInfo && item.eSportInfo.bestOfMap == 3) {\n rbPeriodKey = item.gameInfo.livePeriod + 'M' + (item.eSportInfo.isStartingSoon ? 'S' : 'G');\n }\n }\n\n if (rbPeriodKey === null && rbPeriod && rbPeriod.length > 0) { //前面沒對上 且有原始數據 嘗試切字串\n //有空白 表示為 1H 12 這種格式\n const blankIndex = rbPeriod.indexOf(' ');\n if (blankIndex !== -1) { //有空白,切到空白處\n if (blankIndex >= 0) {\n rbPeriodKey = rbPeriod.substr(0,blankIndex);\n }\n } else {\n rbPeriodKey = rbPeriod;\n }\n }\n\n if (rbPeriodKey && rbPeriodKey.length > 0) {\n const rbname = SABARBPeriodNames[rbPeriodKey]; //中文名\n if (rbname) {\n rbPeroidName = rbname; //有對到才用中文名,沒對到 就直接用原本的字\n }\n }\n\n //處理分鐘數\n if (item.gameInfo.seconds) {\n rbMinute = new Decimal(item.gameInfo.seconds).dividedToIntegerBy(60).toString();\n }\n\n }\n\n let extraInfo = {};\n //保存直播源查詢參數\n extraInfo = Object.assign(extraInfo,item.channelCode != '' ? {streamingOption: item.streamingOption, channelCode: item.channelCode} : {});\n //保存gameSession\n extraInfo = Object.assign(extraInfo, {gameSession: item.gameSession})\n //保存bestOfMap\n extraInfo = Object.assign(extraInfo, item.eSportInfo ? {bestOfMap: item.eSportInfo.bestOfMap} : {})\n\n //參考\n //https://github.com/Saba-sports/OddsDirectAPI/wiki/BetType-Selection-Information\n //找出有指定隊伍的玩法(betType)\n const teamBetTypes = [\n 1,5,7,15,17,20,21,22,25,27,28,\n 122,124,125,153,154,155,160,164,167,168,170,176,177,180,185,191,\n 206,207,208,209,383,385,396,\n 411,422,423,425,430,432,448,453,458,459,460,477,478,486,487,488,489,490,491,492,\n 501,603,604,605,606,607,609,612,613,617,630,635,636,637,\n 701,704,707,708,712,713,1301,1303,1305,1308,1311,1316,1324,\n 9001,9002,9004,9006,9007,9008,9010,9011,9012,9014,9015,9016,9017,9018,9020,9021,9022,9023,9024,9026,9027,9028,9030,\n 9031,9032,9033,9034,9036,9037,9038,9039,9040,9042,9043,9044,9045,9046,9048,9049,9050,9051,9052,9054,9055,9056,9057,9059,\n 9062,9063,9064,9065,9066,9067,9068,9069,9072,9076,9077,\n 9400,9401,\n ];\n\n return new EventData(\n item.eventId,\n item.globalShowTime,\n (['running','postponed'].indexOf(item.eventStatus) !== -1) ? 1 : 2, //開盤狀態 1開2關\n 0, //分組? saba沒有\n 0, //分組類型? saba沒有\n homeTeamId,\n homeTeamName,\n homeTeamScore,\n item.soccerInfo ? item.soccerInfo.homeRedCard : null,\n null, //SABA沒角球\n item.teamInfo ? item.teamInfo.homeIconUrl : null,\n awayTeamId,\n awayTeamName,\n awayTeamScore,\n item.soccerInfo ? item.soccerInfo.awayRedCard : null,\n null, //SABA沒角球\n item.teamInfo ? item.teamInfo.awayIconUrl : null,\n false,\n itemIndex ? itemIndex : 0, //TODO: SABA 問排序\n rbPeriod, //原始滾球數據\n rbMinute, //分鐘\n rbPeroidName, //滾球時間段(中文)\n null,\n item.gameInfo && item.gameInfo.isNeutral ? 0 : 1, //主場狀態 0在中立場比賽 1在主場比賽\n item.isParlay, //是否支持串關\n false, //是否有分析數據(BR) saba沒有\n false, //是否有分析數據(BR) saba沒有\n null, //可視化(BR)比賽Id saba沒有\n item.isLive, //是否比賽進行(滾球)中\n item.channelCode != '', //是否有直播數據\n null, //直播源列表 這個先傳null,saba要另外call api查\n null, //賽日指標,用於虛擬體育 saba沒有\n null, //賽事指標,用於虛擬體育 saba沒有\n extraInfo,\n parseInt(item.sportType),\n marketId,\n item.leagueId,\n item.leagueName,\n item.marketCount,\n isFavourite,\n false,\n null,\n item.marketCategories.map(cateId => {\n //計算組內數量\n const linesInGroup = thisLines.filter(l => {\n return l.category == cateId;\n })\n\n //注意這個marketGroup.id不是固定,要獲取中文名,只能用英文名去對照中文\n let thisMarketGroupTypeName = SABALineGroupNames[cateId];\n if (!thisMarketGroupTypeName) { //對應不到就先放id\n thisMarketGroupTypeName = cateId ;\n }\n\n return new LineGroupData(\n cateId,\n thisMarketGroupTypeName,\n linesInGroup.length,\n 0,\n )\n }),\n thisLines.map(lineItem => {\n\n //處理特殊玩法 名稱統一(讓分 大小)\n let thisBetTypeName = lineItem.betTypeName;\n let periodData = {PeriodId: 0, PeriodName : ''}\n const specialBetTypeName = SABABetTypeNames[lineItem.betType];\n if (specialBetTypeName) {\n thisBetTypeName = specialBetTypeName;\n periodData = SABAPeriodMapping[lineItem.betType];\n }\n\n return new LineData(\n [lineItem.category], //玩法分組 數組格式\n lineItem.betType,\n thisBetTypeName,\n lineItem.marketStatus !== 'running', //盘口是否封盘\n lineItem.marketId,\n lineItem.sort, //盘口级别 類似IM的linelevel\n lineItem.marketStatus === 'running' ? 1 : 2, //盘口狀態 1開 2關\n periodData.PeriodId, //比赛时段 ID 1全場 2上半 3下半\n periodData.PeriodName, //比赛时段名\n item.eventId,\n 0, //分組類型? SABA沒有?\n homeTeamName,\n awayTeamName,\n lineItem.selections.map(selectionItem => {\n\n //特別處理讓分大小的selectionName\n if (specialBetTypeName) {\n if ([1,7,17].indexOf(lineItem.betType) !== -1) {\n if (selectionItem.key == 'h') {\n selectionItem.keyName = i18n.HOME\n }\n if (selectionItem.key == 'a') {\n selectionItem.keyName = i18n.AWAY\n }\n }\n if ([2,8,18].indexOf(lineItem.betType) !== -1) {\n if (selectionItem.key == 'h') {\n selectionItem.keyName = i18n.BIG\n }\n if (selectionItem.key == 'a') {\n selectionItem.keyName = i18n.SMALL\n }\n }\n }\n\n const oddsDeciaml = Decimal.clone({ rounding: 3 }) //無條件捨去\n\n const isTeamBet = (teamBetTypes.indexOf(lineItem.betType) !== -1)\n\n //判斷投注目標球隊,SABA利用selectionName判斷\n let targetTeamId = null;\n let targetTeamName = '';\n if ((homeTeamName && selectionItem.keyName.indexOf(homeTeamName) !== -1) //玩法名包含隊名\n || selectionItem.keyName === i18n.HOME //或者玩法名就是一個「主」字\n || (isTeamBet && (selectionItem.key == 'h' || selectionItem.key == '1')) //或者 玩法是隊伍bet 且玩法Key = h 或 1\n ) {\n targetTeamId = homeTeamId;\n targetTeamName = homeTeamName;\n } else if ((awayTeamName && selectionItem.keyName.indexOf(awayTeamName) !== -1) //玩法名包含隊名\n || selectionItem.keyName === i18n.AWAY //或者玩法名就是一個「客」字\n || (isTeamBet && (selectionItem.key == 'a' || selectionItem.key == '2')) //或者 玩法是隊伍bet 且玩法Key = a 或 2\n ) {\n targetTeamId = awayTeamId;\n targetTeamName = awayTeamName;\n }\n\n //從OddsList獲取賠率\n let thisOddsType = null;\n let thisOddsValue = null;\n if (selectionItem.oddsPrice && Object.keys(selectionItem.oddsPrice)) {\n let targetOddsValue = selectionItem.oddsPrice[memberOddsType];\n if (targetOddsValue !== undefined) {\n thisOddsType = memberOddsType;\n thisOddsValue = targetOddsValue;\n }\n }\n //如果沒獲取到就默認用歐洲盤\n thisOddsValue = thisOddsValue ?? selectionItem.oddsPrice[SABAOddsType.EU];\n thisOddsType = thisOddsType ?? SABAOddsType.EU;\n\n return new SelectionData(\n item.eventId + '_' + lineItem.marketId + '_' + selectionItem.key, //key太簡單,加上eventId和marketid作為唯一值 這個id不用於投注\n selectionItem.key, //實際只拿這個SelectionType去投注\n selectionItem.keyName,\n 0,\n selectionItem.point,\n selectionItem.point,\n null,\n parseInt(item.sportType),\n marketId,\n marketName,\n item.leagueId,\n item.leagueName,\n homeTeamId,\n homeTeamName,\n homeTeamScore,\n awayTeamId,\n awayTeamName,\n awayTeamScore,\n item.eventId,\n item.isParlay, //是否支持串關\n lineItem.marketId,\n lineItem.betType,\n thisBetTypeName,\n periodData.PeriodId, //比赛时段 ID 1全場 2上半 3下半 BTI沒有 只有特殊玩法(讓分,大小)有提供,其他帶0\n periodData.PeriodName,\n targetTeamId,\n targetTeamName,\n false,\n null,\n thisOddsValue,\n SABAOddsTypeToNumber[thisOddsType],\n oddsTypePropList.map(oddsTypeData => {\n return new OddsData(\n oddsTypeData.number,\n selectionItem.oddsPrice[oddsTypeData.name],\n )\n }),\n thisOddsValue,\n 1, //投注用 給默認值 LineStatusId = 1,\n SelectionStatusType.NOTSET, //投注用 給默認值 SelectionStatus = SelectionStatusType.NOTSET,\n { combo: lineItem.combo } //赛事串关数量限制 0: 该盘口不支持串关 2: 下注时最少需要选2种组合 3: 下注时最少需要选3种组合\n )\n })\n )\n })\n )\n }\n\n static createFromSABAChange(item, oldData, FavoriteEvents) {\n item.EventId = parseInt(item.EventId); //saba固定轉為int\n\n const isFavourite = FavoriteEvents.filter(favItem=>item.eventId === favItem.EventId).length > 0;\n\n const homeTeamScore = item.gameInfo ? item.gameInfo.liveHomeScore : null;\n const awayTeamScore = item.gameInfo ? item.gameInfo.liveAwayScore : null;\n\n //處理滾球時間\n let rbMinute = '';\n let rbPeriod = ''; //原始數據\n let rbPeroidName = ''; //中文\n if (item.gameInfo) {\n rbPeriod = item.gameInfo.inPlayTime;\n if(rbPeriod === undefined || rbPeriod === null) {\n rbPeriod = '';//空字符串 避免報錯\n }\n\n //按照saba提供的表去處理比賽時段名\n let rbPeriodKey = null;\n if (oldData.SportId == 1) { //足球\n if (item.gameInfo.livePeriod == 0 && item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = 'Delayed'; //延遲開賽\n } else if (item.gameInfo.livePeriod == 1 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '1H'; //上半场\n } else if (item.gameInfo.livePeriod == 2 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '2H'; //下半场\n } else if (item.gameInfo.livePeriod == 0 && !item.gameInfo.delayLive && item.gameInfo.isHt) {\n rbPeriodKey = 'HT'; //中场休息\n }\n } else if (oldData.SportId == 2) { //篮球\n if (item.gameInfo.livePeriod == 0 && item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = 'Delayed'; //延遲開賽\n } else if (item.gameInfo.livePeriod == 1 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '1Q'; //第 1 节\n } else if (item.gameInfo.livePeriod == 2 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '2Q'; //第 2 节\n } else if (item.gameInfo.livePeriod == 2 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '3Q'; //第 3 节\n } else if (item.gameInfo.livePeriod == 2 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = '4Q'; //第 4 节\n } else if (item.gameInfo.livePeriod == 99 && !item.gameInfo.delayLive && !item.gameInfo.isHt) {\n rbPeriodKey = 'QT'; //延长赛\n } else if (item.gameInfo.livePeriod == 0 && !item.gameInfo.delayLive && item.gameInfo.isHt) {\n rbPeriodKey = 'HT'; //中场休息\n }\n } else if (oldData.SportId == 5) { //网球\n if (oldData.ExtraInfo.gameSession == 5 && item.tennisInfo && item.tennisInfo.currentSet) {\n rbPeriodKey = item.tennisInfo.currentSet + 'S'; //第 N 盘\n }\n } else if (oldData.SportId == 9) { //羽毛球\n if (oldData.ExtraInfo.gameSession == 3 && item.gameInfo.livePeriod) {\n rbPeriodKey = item.gameInfo.livePeriod + 'G'; //第 N 局\n }\n } else if (oldData.SportId == 43) { //电子竞技\n if (item.eSportInfo && oldData.ExtraInfo.bestOfMap == 3) {\n rbPeriodKey = item.gameInfo.livePeriod + 'M' + (item.eSportInfo.isStartingSoon ? 'S' : 'G');\n }\n }\n\n if (rbPeriodKey === null && rbPeriod && rbPeriod.length > 0) { //前面沒對上 且有原始數據 嘗試切字串\n //有空白 表示為 1H 12 這種格式\n const blankIndex = rbPeriod.indexOf(' ');\n if (blankIndex !== -1) { //有空白,切到空白處\n if (blankIndex >= 0) {\n rbPeriodKey = rbPeriod.substr(0,blankIndex);\n }\n } else {\n rbPeriodKey = rbPeriod;\n }\n }\n\n if (rbPeriodKey && rbPeriodKey.length > 0) {\n const rbname = SABARBPeriodNames[rbPeriodKey]; //中文名\n if (rbname) {\n rbPeroidName = rbname; //有對到才用中文名,沒對到 就直接用原本的字\n }\n }\n\n //處理分鐘數\n if (item.gameInfo.seconds) {\n rbMinute = new Decimal(item.gameInfo.seconds).dividedToIntegerBy(60).toString();\n }\n\n }\n\n //注意SABA的change只有更新Event本身,下屬的數組(投注線Lines,投注分組LineGroups等) 是另外處理,這裡只要拿舊數據複製就可以\n return new EventData(\n item.eventId,\n item.globalShowTime ?? oldData.EventDate,\n (['running','postponed'].indexOf(item.eventStatus) !== -1) ? 1 : 2, //開盤狀態 1開2關\n 0, //分組? saba沒有\n 0, //分組類型? saba沒有\n oldData.HomeTeamId,\n oldData.HomeTeamName,\n homeTeamScore,\n item.soccerInfo ? item.soccerInfo.homeRedCard : null,\n null, //SABA沒角球\n oldData.HomeIconUrl,\n oldData.AwayTeamId,\n oldData.AwayTeamName,\n awayTeamScore,\n item.soccerInfo ? item.soccerInfo.awayRedCard : null,\n null, //SABA沒角球\n oldData.AwayIconUrl,\n false,\n oldData.SortOrder,\n rbPeriod, //原始滾球數據\n rbMinute, //分鐘\n rbPeroidName, //滾球時間段(中文)\n null,\n oldData.GroundTypeId, //主場狀態\n oldData.IsOpenParlay, //是否支持串關\n false, //是否有分析數據(BR) saba沒有\n false, //是否有分析數據(BR) saba沒有\n null, //可視化(BR)比賽Id saba沒有\n oldData.IsRB,\n oldData.HasLiveStreaming, //是否有直播數據\n oldData.LiveStreamingUrl, //直播源列表\n null, //賽日指標,用於虛擬體育 saba沒有\n null, //賽事指標,用於虛擬體育 saba沒有\n oldData.ExtraInfo,\n oldData.SportId,\n oldData.MarketId,\n oldData.LeagueId,\n oldData.LeagueName,\n item.marketCount ?? oldData.TotalLineCount,\n isFavourite,\n false, //SABA猜冠軍不做推送\n null,\n oldData.LineGroups.map(lgItem => {\n return new LineGroupData(\n lgItem.LineGroupId,\n lgItem.LineGroupName,\n lgItem.LineCount,\n lgItem.SortNumber,\n )\n }),\n oldData.Lines.map(lineItem => {\n return LineData.clone(lineItem)\n })\n )\n }\n\n //從沙巴優勝冠軍數據 生成EventData數據\n static createFromSABAOutRightSource(item, FavoriteEvents) {\n const isFavourite = FavoriteEvents.filter(favItem=>item.EventId === favItem.EventId).length > 0;\n\n //市場名\n const MarketName = VendorMarketNames[VendorMarkets.OUTRIGHT];\n\n const oddsDeciaml = Decimal.clone({ rounding: 3 }) //無條件捨去\n\n const thisEventId = item.leagueId; //沙巴猜冠軍用 leagueId 作為唯一key\n\n //2022/07 沙巴修改字段名\n const thisEventStatus = item.outrightStatus ? item.outrightStatus : item.eventStatus;\n\n return new EventData(\n thisEventId,\n item.eventDate,\n thisEventStatus == 'running' ? 1 : 2, //開盤狀態 1開2關\n null, //比賽分組 優勝冠軍沒有\n null, //比賽分組類型 優勝冠軍沒有\n null, //主隊數據 優勝冠軍沒有\n null,\n null,\n null,\n null,\n null,\n null, //客隊數據 優勝冠軍沒有\n null,\n null,\n null,\n null,\n null,\n false,\n 0, //TODO: saba 問排序?\n null, //滾球時間,平台原始的滾球數據 優勝冠軍沒有\n '',\n '',\n null, //相關比分清單 優勝冠軍沒有\n null, //主場狀態 優勝冠軍沒有\n false, //只能單注,不能串\n false, //是否有分析數據(BR) 優勝冠軍沒有\n false, //是否有可視化 優勝冠軍沒有\n null, //BREventId 可視化(BR)比賽Id 優勝冠軍沒有\n false, //是否滾球中 優勝冠軍沒有\n false, //是否有直播數據 優勝冠軍沒有\n null, //直播源列表\n null, //賽日指標,用於虛擬體育\n null, //賽事指標,用於虛擬體育\n null, //額外信息\n parseInt(item.sportType),\n VendorMarkets.OUTRIGHT,\n item.leagueId,\n item.leagueName,\n 1, //玩法總數 都只有一種 就是 優勝冠軍\n isFavourite,\n true, //是 優勝冠軍賽事\n item.leagueName,\n [], //玩法分組列表 優勝冠軍沒有\n [\n new LineData(\n [], //玩法分組 優勝冠軍沒有\n 'OUTRIGHT',\n '', //留空白即可\n thisEventStatus != 'running',\n thisEventId,\n 0,\n thisEventStatus == 'running'? 1 : 2, //盘口狀態 1開 2關\n 1,\n VendorPeriodName[\"1\"],\n thisEventId,\n null,\n null,\n null,\n item.teams.map(selectionItem => {\n return new SelectionData(\n selectionItem.orid,\n selectionItem.teamId,\n selectionItem.teamName,\n 0, //沒有selection group\n '',\n '',\n null,\n parseInt(item.sportType),\n VendorMarkets.OUTRIGHT,\n MarketName,\n item.leagueId,\n item.leagueName,\n null,\n null,\n null,\n null,\n null,\n null,\n thisEventId,\n false,\n thisEventId,\n 'OUTRIGHT',\n '', //留空白即可\n 1,\n VendorPeriodName[\"1\"],\n selectionItem.teamId,\n selectionItem.teamName,\n true,\n item.leagueName,\n selectionItem.price,\n SABAOddsTypeToNumber[SABAOddsType.EU],\n [\n new OddsData(\n SABAOddsTypeToNumber[SABAOddsType.EU],\n selectionItem.price,\n )\n ],\n selectionItem.price,\n )\n })\n )\n ]\n )\n }\n\n static sortEvents(events = [], sortWay = SortWays.LeagueName) {\n //注意不可用兩次排序,要用一個排序函數寫完,因為js不保證第二次排序 能保持第一次排序給出的順序\n //使用自然排序 直接按 列出的先後順序排\n\n //滾球=>今天=>早盤 for 關注比賽展示順序\n const marketSortMapping = {\n 1:3,//EARLY:1, //早盘\n 2:2,//TODAY:2, //今天\n 3:1,//RUNNING:3, //滚球\n 4:0,//FAVOURITE: 4, //关注\n 5:5,//OUTRIGHT: 5, //冠军\n }\n\n //聯賽排序\n //市場id(滾球在前) => 排序id => 聯賽id => 時間 => eventid(用於前面排序參數都相同時,保持順序)\n const leagueCompareFunc = (left,right) => {\n const a = marketSortMapping[left.MarketId] + '_' + left.SortOrder + '_' + left.LeagueId + '_' + left.EventDate + '_' + left.EventId;\n const b = marketSortMapping[right.MarketId] + '_' + right.SortOrder + '_' + right.LeagueId + '_' + right.EventDate + '_' + right.EventId;\n return natureCompare(a,b); //自然排序\n }\n\n //時間排序\n //市場id(滾球在前) => 時間 => 排序id => 聯賽id => eventid(用於前面排序參數都相同時,保持順序)\n const timeCompareFunc = (left,right) => {\n const a = marketSortMapping[left.MarketId] + '_' + left.EventDate + '_' + left.SortOrder + '_' + left.LeagueId + '_' + left.EventId;\n const b = marketSortMapping[right.MarketId] + '_' + right.EventDate + '_' + right.SortOrder + '_' + right.LeagueId + '_' + right.EventId;\n return natureCompare(a,b); //自然排序\n }\n\n let result = events;\n\n //聯賽排序\n if (sortWay === SortWays.LeagueName) {\n result = (result !== null && result.length > 0) ? result.sort(leagueCompareFunc):[];\n }\n\n //時間排序\n if (sortWay === SortWays.EventTime) {\n result = (result !== null && result.length > 0) ? result.sort(timeCompareFunc):[];\n }\n\n return result;\n }\n\n static clone(srcEventData, memberOddsType = null, memberType = null) {\n return new EventData(\n srcEventData.EventId,\n srcEventData.EventDate,\n srcEventData.EventStatusId,\n srcEventData.EventGroupId,\n srcEventData.EventGroupTypeId,\n srcEventData.HomeTeamId,\n srcEventData.HomeTeamName,\n srcEventData.HomeScore,\n srcEventData.HomeRedCard,\n srcEventData.HomeCorner,\n srcEventData.HomeIconUrl,\n srcEventData.AwayTeamId,\n srcEventData.AwayTeamName,\n srcEventData.AwayScore,\n srcEventData.AwayRedCard,\n srcEventData.AwayCorner,\n srcEventData.AwayIconUrl,\n srcEventData.HasCornerData,\n srcEventData.SortOrder,\n srcEventData.RBTime,\n srcEventData.RBMinute,\n srcEventData.RBPeriodName,\n srcEventData.RelatedScores,\n srcEventData.GroundTypeId,\n srcEventData.IsOpenParlay,\n srcEventData.HasStatistic,\n srcEventData.HasVisualization,\n srcEventData.BREventId,\n srcEventData.IsRB,\n srcEventData.HasLiveStreaming,\n srcEventData.LiveStreamingUrl,\n srcEventData.MatchDay,\n srcEventData.Season,\n srcEventData.ExtraInfo,\n srcEventData.SportId,\n srcEventData.MarketId,\n srcEventData.LeagueId,\n srcEventData.LeagueName,\n srcEventData.TotalLineCount,\n srcEventData.IsFavourite,\n srcEventData.IsOutRightEvent,\n srcEventData.OutRightEventName,\n srcEventData.LineGroups ? srcEventData.LineGroups.map(lgItem => {\n return new LineGroupData(\n lgItem.LineGroupId,\n lgItem.LineGroupName,\n lgItem.LineCount,\n lgItem.SortNumber,\n )\n }) : [],\n srcEventData.Lines ? srcEventData.Lines.map(lineItem => LineData.clone(lineItem, memberOddsType, memberType)) : [],\n srcEventData.MarketIdForListing,\n )\n }\n}\n","//賽事數據 用於 getEventsDetail 獲取多個賽事數據 時 使用\nexport default class EventInfo {\n /**\n * @param EventId 比賽id\n * @param SportId 體育ID\n * @param IsOutRightEvent 是否為優勝冠軍賽事\n */\n constructor(\n EventId,\n SportId,\n IsOutRightEvent = false,\n )\n {\n Object.assign(this, {\n EventId,\n SportId,\n IsOutRightEvent,\n });\n }\n}","//聯賽 計數\nexport default class LeagueData {\n /**\n * @param LeagueId 聯賽id\n * @param LeagueName 聯賽名\n * @param Count 比赛数\n * @param SportId 體育ID\n * @param MarketId 市場ID\n */\n constructor(\n LeagueId,\n LeagueName,\n Count,\n SportId,\n MarketId,\n )\n {\n Object.assign(this, {LeagueId, LeagueName, Count, SportId, MarketId});\n }\n}","//投注線(玩法) 數據\nimport {\n BTIBetTypeNames,\n BTIForceDecimalBetTypeIds,\n BTIOddsType,\n BTIOddsTypeToNumber,\n BTIPeriodMapping\n} from \"../bti/BTIConsts\";\nimport SelectionData from \"./SelectionData\";\nimport OddsData from \"./OddsData\";\nimport {SelectionStatusType, VendorMarketNames} from \"./VendorConsts\";\nimport {Decimal} from \"decimal.js\";\nimport i18n from '../vendori18n';\nimport {SABABetTypeNames, SABAOddsType, SABAOddsTypeToNumber, SABAPeriodMapping} from \"../saba/SABAConsts\";\n\nexport default class LineData {\n /**\n * @param LineGroupIds 玩法分組ID 數組型態\n * @param BetTypeId 投注類型ID\n * @param BetTypeName 投注類型名\n * @param IsLocked 盘口是否封盘\n * @param LineId 玩法ID\n * @param LineLevel 盘口级别\n * @param LineStatusId 盘口狀態 1開 2關\n * @param PeriodId 比赛时段 ID 1全場 2上半 3下半\n * @param PeriodName 比赛时段\n * @param EventId 比賽Id\n * @param EventGroupTypeId 特別投注分類, im專用\n * @param HomeTeamName 主場球隊名,特別投注用, im專用\n * @param AwayTeamName 客場球隊名,特別投注用, im專用\n * 額外提供 SelectionCountInLine 建議一行放幾個Selection, 1/2/3個\n * 額外提供 IsDisplayByTeam 是否按主客隊 分列展示 true/false\n * 額外提供 LineDesc 組合 PeriodName + BetTypeName\n * @param Selections 投注選項 列表,SelectionData數組\n */\n constructor(\n LineGroupIds,\n BetTypeId,\n BetTypeName,\n IsLocked,\n LineId,\n LineLevel,\n LineStatusId,\n PeriodId,\n PeriodName,\n EventId,\n EventGroupTypeId,\n HomeTeamName,\n AwayTeamName,\n Selections = [],\n )\n {\n Object.assign(this, {\n LineGroupIds,\n BetTypeId,\n BetTypeName,\n IsLocked,\n LineId,\n LineLevel,\n LineStatusId,\n PeriodId,\n PeriodName,\n EventId,\n EventGroupTypeId,\n HomeTeamName,\n AwayTeamName,\n Selections,\n });\n\n this.updateSelectionAnalysis();\n\n let periodDesc = this.PeriodName;\n //如果 BetTypeName 原本開頭就帶有 PeriodName 就不用PeriodName (for im重複PeriodName)\n //例子: BetTypeName = '下半場 讓球' PeriodName = '下半場'\n if (periodDesc && periodDesc.length > 0\n && this.BetTypeName.indexOf(periodDesc) === 0) {\n periodDesc = '';\n }\n\n this.LineDesc = (periodDesc.length > 0 ? periodDesc : '') + this.BetTypeName; //不用空白 直接接起來\n }\n\n //比對投注線是不是同一種投注(im專用,im同一種投注會出多個,用EventGroupTypeId去分開)\n getKeyForCompare() {\n return [this.BetTypeId,this.BetTypeName,this.EventGroupTypeId,this.PeriodId].join('|');\n }\n\n isSimilarTo(otherLine) {\n return this.getKeyForCompare() === otherLine.getKeyForCompare()\n }\n\n updateSelectionAnalysis() {\n\n //是否按主客隊 分列展示\n this.IsDisplayByTeam = false;\n\n //按照name去分類\n const selectionNames = this.Selections.map(s => s.SelectionName);\n //去重複\n const uniqueSelectionNames = selectionNames.filter((item, index) => selectionNames.indexOf(item) === index);\n\n //先支持 主客 和 主客和 這兩種\n if (uniqueSelectionNames.length === 2\n && uniqueSelectionNames.indexOf(i18n.HOME) !== -1\n && uniqueSelectionNames.indexOf(i18n.AWAY) !== -1\n ) {\n this.IsDisplayByTeam = true;\n } else if (uniqueSelectionNames.length === 3\n && uniqueSelectionNames.indexOf(i18n.HOME) !== -1\n && uniqueSelectionNames.indexOf(i18n.AWAY) !== -1\n && uniqueSelectionNames.indexOf(i18n.TIE) !== -1\n ){\n this.IsDisplayByTeam = true;\n }\n\n //按照targetTeam去分類\n if(this.IsDisplayByTeam !== true) {\n const targetTeamNames = this.Selections.map(s => s.TargetTeamName);\n //去重複\n const uniqueTargetTeamNames = targetTeamNames.filter((item, index) => targetTeamNames.indexOf(item) === index);\n\n //剛好targetTeam就是兩隊\n if (uniqueTargetTeamNames && uniqueTargetTeamNames.length === 2) {\n const selectionNameHasTeamNames = uniqueSelectionNames.filter(n => n.indexOf(uniqueTargetTeamNames[0]) !== -1 || n.indexOf(uniqueTargetTeamNames[1]) !== -1);\n //且玩法名都沒有包含隊名\n if (!selectionNameHasTeamNames || selectionNameHasTeamNames.length <=0) {\n this.IsDisplayByTeam = true;\n }\n }\n }\n\n //計算一行要放幾個Selection\n this.SelectionCountInLine = this._getSelectionCountInLine();\n }\n\n _getSelectionCountInLine() {\n if (this.Selections) {\n if (this.Selections.length === 1) {\n return 1;\n }\n\n if (this.Selections.length > 1) {\n //按照name去分類\n const selectionNames = this.Selections.map(s => s.SelectionName);\n const haveHandicap = this.Selections.filter(s => s.Handicap !== null).length > 0\n //去重複\n const uniqueSelectionNames = selectionNames.filter((item, index) => selectionNames.indexOf(item) === index);\n //console.log('=====uniqueSelectionNames',this.BetTypeName,uniqueSelectionNames.length,uniqueSelectionNames,selectionNames);\n //有幾種Selection\n const selectionCategoryCount = uniqueSelectionNames.length;\n //平均的selectionName長度\n let cc = 0;\n uniqueSelectionNames.map(usn => cc = cc + usn.length);\n let maxWordLength = 14;\n if (i18n.WORDWIDTH > 1) {\n maxWordLength = maxWordLength/i18n.WORDWIDTH; //中文算2個字寬\n }\n if (haveHandicap) {\n maxWordLength = maxWordLength - 2; //有多展示handicap多算兩個字\n }\n if (new Decimal(cc).dividedToIntegerBy(selectionCategoryCount).greaterThanOrEqualTo(maxWordLength)) {\n return 1; //平均名稱超過,就直接展示一行一行的,要不放不下\n }\n\n if (selectionCategoryCount === 3) {\n return 3;\n }\n }\n }\n return 2; //默認2\n }\n\n static createFromBTIChange(lineItem,oldEventData,memberOddsType = BTIOddsType.HK, cachedLineGroupIds = null) {\n\n let oddsTypePropList = [];\n for (let oddsPropName in BTIOddsTypeToNumber) {\n oddsTypePropList.push({name: oddsPropName, number: BTIOddsTypeToNumber[oddsPropName]});\n }\n\n const marketName = VendorMarketNames[oldEventData.MarketId];\n\n //處理特殊玩法 名稱統一(讓分 大小)\n let thisBetTypeName = lineItem.name; //直接用name比用marketType.name完整\n let periodData = {PeriodId: 0, PeriodName : ''}\n const specialBetTypeName = BTIBetTypeNames[lineItem.marketType.id];\n if (specialBetTypeName) {\n thisBetTypeName = specialBetTypeName;\n periodData = BTIPeriodMapping[lineItem.marketType.id];\n }\n\n let oldLine = null;\n if (oldEventData.Lines && oldEventData.Lines.length > 0) {\n const oldLines = oldEventData.Lines.filter(l => l.LineId === lineItem.id);\n if (oldLines && oldLines.length >0) {\n oldLine = oldLines[0];\n }\n }\n\n //判斷強制歐洲盤的玩法\n const forceDecimalBetTypeIds = BTIForceDecimalBetTypeIds[parseInt(oldEventData.SportId)];\n\n // add / changes 可能會收到空的group配置,如果為空就用舊數據/緩存數據\n let thisLineGroupIds = [];\n if (lineItem.groups && lineItem.groups.length > 0) {\n thisLineGroupIds = lineItem.groups;\n } else if (oldLine && oldLine.LineGroupIds && oldLine.LineGroupIds.length > 0) {\n thisLineGroupIds = oldLine.LineGroupIds;\n } else if (cachedLineGroupIds && cachedLineGroupIds.length > 0) {\n thisLineGroupIds = cachedLineGroupIds;\n }\n\n return new LineData(\n thisLineGroupIds,\n lineItem.marketType.id,\n thisBetTypeName,\n lineItem.isSuspended, //盘口是否封盘\n lineItem.id,\n 1, //盘口级别 BTI沒有\n 1, //盘口狀態 1開 2關 BTI沒有\n periodData.PeriodId, //比赛时段 ID 1全場 2上半 3下半 BTI沒有\n periodData.PeriodName, //比赛时段名 BTI沒有\n oldEventData.EventId,\n 0, //分組類型? BTI沒有\n oldEventData.HomeTeamName,\n oldEventData.AwayTeamName,\n lineItem.selections.map(selectionItem => {\n\n //特別處理讓分大小的selectionName\n if (specialBetTypeName) {\n if (selectionItem.outcomeType == 'Home') {\n selectionItem.name = i18n.HOME\n }\n if (selectionItem.outcomeType == 'Away') {\n selectionItem.name = i18n.AWAY\n }\n if (selectionItem.outcomeType == 'Over') {\n selectionItem.name = i18n.BIG\n }\n if (selectionItem.outcomeType == 'Under') {\n selectionItem.name = i18n.SMALL\n }\n }\n\n //判斷投注目標球隊,BTI利用participantMapping判斷\n let targetTeamId = null;\n let targetTeamName = '';\n if (selectionItem.participantMapping) {\n if (oldEventData.HomeTeamId === selectionItem.participantMapping) {\n targetTeamId = oldEventData.HomeTeamId;\n targetTeamName = oldEventData.HomeTeamName;\n } else if (oldEventData.AwayTeamId === selectionItem.participantMapping) {\n targetTeamId = oldEventData.AwayTeamId;\n targetTeamName = oldEventData.AwayTeamName;\n }\n }\n\n //如果用participantMapping沒有對到,改用selectionName判斷\n if (targetTeamId === null) {\n if ((oldEventData.HomeTeamName && selectionItem.name.indexOf(oldEventData.HomeTeamName) !== -1) //玩法名包含隊名\n || selectionItem.name === i18n.HOME) //或者玩法名就是一個「主」字\n {\n targetTeamId = oldEventData.HomeTeamId;\n targetTeamName = oldEventData.HomeTeamName;\n } else if ((oldEventData.AwayTeamName && selectionItem.name.indexOf(oldEventData.AwayTeamName) !== -1) //玩法名包含隊名\n || selectionItem.name === i18n.AWAY)//或者玩法名就是一個「客」字\n {\n targetTeamId = oldEventData.AwayTeamId;\n targetTeamName = oldEventData.AwayTeamName;\n }\n }\n\n let thisOddsType = memberOddsType;\n if(forceDecimalBetTypeIds && forceDecimalBetTypeIds.indexOf(lineItem.marketType.id) !== -1) {\n //console.log('===force decimal',lineItem.marketType.id,JSON.parse(JSON.stringify(selectionItem)))\n thisOddsType = 'decimal';\n }\n\n return new SelectionData(\n selectionItem.id,\n selectionItem.outcomeType,\n selectionItem.name,\n selectionItem.group,\n selectionItem.points,\n selectionItem.points,\n selectionItem.tags,\n oldEventData.SportId,\n oldEventData.MarketId,\n marketName,\n oldEventData.LeagueId,\n oldEventData.LeagueName,\n oldEventData.HomeTeamId,\n oldEventData.HomeTeamName,\n oldEventData.HomeScore,\n oldEventData.AwayTeamId,\n oldEventData.AwayTeamName,\n oldEventData.AwayScore,\n oldEventData.EventId,\n oldEventData.IsOpenParlay,\n lineItem.id,\n lineItem.marketType.id,\n thisBetTypeName,\n periodData.PeriodId, //比赛时段 ID 1全場 2上半 3下半 BTI沒有 只有特殊玩法(讓分,大小)有提供,其他帶0\n periodData.PeriodName,\n targetTeamId,\n targetTeamName,\n oldEventData.IsOutRightEvent,\n oldEventData.OutRightEventName,\n selectionItem.displayOdds[thisOddsType],\n BTIOddsTypeToNumber[thisOddsType],\n oddsTypePropList.map(oddsTypeData => {\n return new OddsData(\n oddsTypeData.number,\n selectionItem.displayOdds[oddsTypeData.name],\n )\n }),\n selectionItem.displayOdds[thisOddsType],\n )\n })\n )\n }\n\n static createFromSABAAdd(lineItem,oldEventData,memberOddsType = SABAOddsType.HK) {\n\n let oddsTypePropList = [];\n for (let oddsPropName in SABAOddsTypeToNumber) {\n oddsTypePropList.push({name: oddsPropName, number: SABAOddsTypeToNumber[oddsPropName]});\n }\n\n const marketName = VendorMarketNames[oldEventData.MarketId];\n\n //處理特殊玩法 名稱統一(讓分 大小)\n let thisBetTypeName = lineItem.betTypeName;\n let periodData = {PeriodId: 0, PeriodName : ''}\n const specialBetTypeName = SABABetTypeNames[lineItem.betType];\n if (specialBetTypeName) {\n thisBetTypeName = specialBetTypeName;\n periodData = SABAPeriodMapping[lineItem.betType];\n }\n\n let oldLine = null;\n if (oldEventData.Lines && oldEventData.Lines.length > 0) {\n const oldLines = oldEventData.Lines.filter(l => l.LineId === lineItem.marketId);\n if (oldLines && oldLines.length >0) {\n oldLine = oldLines[0];\n }\n }\n\n //參考\n //https://github.com/Saba-sports/OddsDirectAPI/wiki/BetType-Selection-Information\n //找出有指定隊伍的玩法(betType)\n const teamBetTypes = [\n 1,5,7,15,17,20,21,22,25,27,28,\n 122,124,125,153,154,155,160,164,167,168,170,176,177,180,185,191,\n 206,207,208,209,383,385,396,\n 411,422,423,425,430,432,448,453,458,459,460,477,478,486,487,488,489,490,491,492,\n 501,603,604,605,606,607,609,612,613,617,630,635,636,637,\n 701,704,707,708,712,713,1301,1303,1305,1308,1311,1316,1324,\n 9001,9002,9004,9006,9007,9008,9010,9011,9012,9014,9015,9016,9017,9018,9020,9021,9022,9023,9024,9026,9027,9028,9030,\n 9031,9032,9033,9034,9036,9037,9038,9039,9040,9042,9043,9044,9045,9046,9048,9049,9050,9051,9052,9054,9055,9056,9057,9059,\n 9062,9063,9064,9065,9066,9067,9068,9069,9072,9076,9077,\n 9400,9401,\n ];\n\n return new LineData(\n [lineItem.category], //玩法分組 數組格式\n lineItem.betType,\n thisBetTypeName,\n lineItem.marketStatus !== 'running', //盘口是否封盘\n lineItem.marketId,\n lineItem.sort, //盘口级别 類似IM的linelevel\n lineItem.marketStatus === 'running' ? 1 : 2, //盘口狀態 1開 2關\n periodData.PeriodId, //比赛时段 ID 1全場 2上半 3下半\n periodData.PeriodName, //比赛时段名\n oldEventData.EventId,\n 0, //分組類型? SABA沒有?\n oldEventData.HomeTeamName,\n oldEventData.AwayTeamName,\n lineItem.selections.map(selectionItem => {\n\n //特別處理讓分大小的selectionName\n if (specialBetTypeName) {\n if ([1,7,17].indexOf(lineItem.betType) !== -1) {\n if (selectionItem.key == 'h') {\n selectionItem.keyName = i18n.HOME\n }\n if (selectionItem.key == 'a') {\n selectionItem.keyName = i18n.AWAY\n }\n }\n if ([2,8,18].indexOf(lineItem.betType) !== -1) {\n if (selectionItem.key == 'h') {\n selectionItem.keyName = i18n.BIG\n }\n if (selectionItem.key == 'a') {\n selectionItem.keyName = i18n.SMALL\n }\n }\n }\n\n const oddsDeciaml = Decimal.clone({ rounding: 3 }) //無條件捨去\n\n const isTeamBet = (teamBetTypes.indexOf(lineItem.betType) !== -1)\n\n //判斷投注目標球隊,SABA利用selectionName判斷\n let targetTeamId = null;\n let targetTeamName = '';\n if ((oldEventData.HomeTeamName && selectionItem.keyName.indexOf(oldEventData.HomeTeamName) !== -1) //玩法名包含隊名\n || selectionItem.keyName === i18n.HOME //或者玩法名就是一個「主」字\n || (isTeamBet && (selectionItem.key == 'h' || selectionItem.key == '1')) //或者 玩法是隊伍bet 且玩法Key = h 或 1\n ) {\n targetTeamId = oldEventData.HomeTeamId;\n targetTeamName = oldEventData.HomeTeamName;\n } else if ((oldEventData.AwayTeamName && selectionItem.keyName.indexOf(oldEventData.AwayTeamName) !== -1) //玩法名包含隊名\n || selectionItem.keyName === i18n.AWAY //或者玩法名就是一個「客」字\n || (isTeamBet && (selectionItem.key == 'a' || selectionItem.key == '2')) //或者 玩法是隊伍bet 且玩法Key = a 或 2\n ) {\n targetTeamId = oldEventData.AwayTeamId;\n targetTeamName = oldEventData.AwayTeamName;\n }\n\n //從OddsList獲取賠率\n let thisOddsType = null;\n let thisOddsValue = null;\n if (selectionItem.oddsPrice && Object.keys(selectionItem.oddsPrice)) {\n let targetOddsValue = selectionItem.oddsPrice[memberOddsType];\n if (targetOddsValue !== undefined) {\n thisOddsType = memberOddsType;\n thisOddsValue = targetOddsValue;\n }\n }\n //如果沒獲取到就默認用歐洲盤\n thisOddsValue = thisOddsValue ?? selectionItem.oddsPrice[SABAOddsType.EU];\n thisOddsType = thisOddsType ?? SABAOddsType.EU;\n\n return new SelectionData(\n oldEventData.EventId + '_' + lineItem.marketId + '_' + selectionItem.key, //key太簡單,加上eventId和marketid作為唯一值 這個id不用於投注\n selectionItem.key, //實際只拿這個SelectionType去投注\n selectionItem.keyName,\n 0,\n selectionItem.point,\n selectionItem.point,\n null,\n oldEventData.SportId,\n oldEventData.MarketId,\n marketName,\n oldEventData.LeagueId,\n oldEventData.LeagueName,\n oldEventData.HomeTeamId,\n oldEventData.HomeTeamName,\n oldEventData.HomeScore,\n oldEventData.AwayTeamId,\n oldEventData.AwayTeamName,\n oldEventData.AwayScore,\n oldEventData.EventId,\n oldEventData.IsOpenParlay,\n lineItem.marketId,\n lineItem.betType,\n thisBetTypeName,\n periodData.PeriodId, //比赛时段 ID 1全場 2上半 3下半 BTI沒有 只有特殊玩法(讓分,大小)有提供,其他帶0\n periodData.PeriodName,\n targetTeamId,\n targetTeamName,\n oldEventData.IsOutRightEvent,\n oldEventData.OutRightEventName,\n thisOddsValue,\n SABAOddsTypeToNumber[thisOddsType],\n oddsTypePropList.map(oddsTypeData => {\n return new OddsData(\n oddsTypeData.number,\n selectionItem.oddsPrice[oddsTypeData.name],\n )\n }),\n thisOddsValue,\n 1, //投注用 給默認值 LineStatusId = 1,\n SelectionStatusType.NOTSET, //投注用 給默認值 SelectionStatus = SelectionStatusType.NOTSET,\n { combo: lineItem.combo } //赛事串关数量限制 0: 该盘口不支持串关 2: 下注时最少需要选2种组合 3: 下注时最少需要选3种组合\n )\n })\n )\n }\n\n static createFromSABAChange(lineItem,oldEventData,memberOddsType = SABAOddsType.HK) {\n\n let oddsTypePropList = [];\n for (let oddsPropName in SABAOddsTypeToNumber) {\n oddsTypePropList.push({name: oddsPropName, number: SABAOddsTypeToNumber[oddsPropName]});\n }\n\n const marketName = VendorMarketNames[oldEventData.MarketId];\n\n let oldLine = null;\n if (oldEventData.Lines && oldEventData.Lines.length > 0) {\n const oldLines = oldEventData.Lines.filter(l => l.LineId === lineItem.marketId);\n if (oldLines && oldLines.length >0) {\n oldLine = oldLines[0];\n }\n }\n\n if (oldLine === null) {\n console.log('====createFromSABAChange no old line??? for lineid:',lineItem.marketId);\n return null;\n }\n\n return new LineData(\n oldLine.LineGroupIds, //玩法分組 數組格式\n oldLine.BetTypeId,\n oldLine.BetTypeName,\n lineItem.marketStatus !== 'running', //盘口是否封盘\n lineItem.marketId,\n oldLine.LineLevel, //盘口级别 類似IM的linelevel\n lineItem.marketStatus === 'running' ? 1 : 2, //盘口狀態 1開 2關\n oldLine.PeriodId, //比赛时段 ID 1全場 2上半 3下半\n oldLine.PeriodName, //比赛时段名\n oldEventData.EventId,\n 0, //分組類型? SABA沒有?\n oldEventData.HomeTeamName,\n oldEventData.AwayTeamName,\n oldLine.Selections.map(oldSelection => {\n const newSelections = lineItem.selections.filter(sitem => sitem.key === oldSelection.SelectionType);\n if (newSelections && newSelections.length > 0) {\n let selectionItem = newSelections[0];\n const oddsDeciaml = Decimal.clone({ rounding: 3 }) //無條件捨去\n\n //從OddsList獲取賠率\n let thisOddsType = null;\n let thisOddsValue = null;\n if (selectionItem.oddsPrice && Object.keys(selectionItem.oddsPrice)) {\n let targetOddsValue = selectionItem.oddsPrice[memberOddsType];\n if (targetOddsValue !== undefined) {\n thisOddsType = memberOddsType;\n thisOddsValue = targetOddsValue;\n }\n }\n //如果沒獲取到就默認用歐洲盤\n thisOddsValue = thisOddsValue ?? selectionItem.oddsPrice[SABAOddsType.EU];\n thisOddsType = thisOddsType ?? SABAOddsType.EU;\n\n return new SelectionData(\n oldEventData.EventId + '_' + lineItem.marketId + '_' + selectionItem.key, //key太簡單,加上eventId和marketid作為唯一值 這個id不用於投注\n selectionItem.key, //實際只拿這個SelectionType去投注\n oldSelection.SelectionName,\n 0,\n selectionItem.point,\n selectionItem.point,\n null,\n oldEventData.SportId,\n oldEventData.MarketId,\n marketName,\n oldEventData.LeagueId,\n oldEventData.LeagueName,\n oldEventData.HomeTeamId,\n oldEventData.HomeTeamName,\n oldEventData.HomeScore,\n oldEventData.AwayTeamId,\n oldEventData.AwayTeamName,\n oldEventData.AwayScore,\n oldEventData.EventId,\n oldEventData.IsOpenParlay,\n lineItem.marketId,\n oldLine.BetTypeId,\n oldLine.BetTypeName,\n oldLine.PeriodId, //比赛时段 ID 1全場 2上半 3下半\n oldLine.PeriodName, //比赛时段名\n oldSelection.TargetTeamId,\n oldSelection.TargetTeamName,\n oldEventData.IsOutRightEvent,\n oldEventData.OutRightEventName,\n thisOddsValue,\n SABAOddsTypeToNumber[thisOddsType],\n oddsTypePropList.map(oddsTypeData => {\n return new OddsData(\n oddsTypeData.number,\n selectionItem.oddsPrice[oddsTypeData.name],\n )\n }),\n thisOddsValue,\n 1, //投注用 給默認值 LineStatusId = 1,\n SelectionStatusType.NOTSET, //投注用 給默認值 SelectionStatus = SelectionStatusType.NOTSET,\n oldSelection.ExtraInfo //赛事串关数量限制 0: 该盘口不支持串关 2: 下注时最少需要选2种组合 3: 下注时最少需要选3种组合\n )\n } else {\n return SelectionData.clone(oldSelection); //沒更新就保持原本數據\n }\n })\n )\n }\n\n static clone(srcLineData, memberOddsType = null, memberType = null) {\n return new LineData(\n srcLineData.LineGroupIds,\n srcLineData.BetTypeId,\n srcLineData.BetTypeName,\n srcLineData.IsLocked,\n srcLineData.LineId,\n srcLineData.LineLevel,\n srcLineData.LineStatusId,\n srcLineData.PeriodId,\n srcLineData.PeriodName,\n srcLineData.EventId,\n srcLineData.EventGroupTypeId,\n srcLineData.HomeTeamName,\n srcLineData.AwayTeamName,\n srcLineData.Selections.map(selectionItem => SelectionData.clone(selectionItem, memberOddsType, memberType))\n )\n }\n}\n","//市場項目 計數\nexport default class MarketData {\n /**\n * @param MarketId 市場id\n * @param MarketName 市場名\n * @param Count 比赛数\n */\n constructor(\n MarketId,\n MarketName,\n Count,\n )\n {\n Object.assign(this, {MarketId, MarketName, Count});\n }\n}","//賠率數據\nimport {Decimal} from \"decimal.js\";\nimport {IMOddsType} from \"../im/IMConsts\";\n\nexport default class OddsData {\n /**\n * @param OddsType 賠率類型\n * @param OddsValues 在IM是賠率水位,object, A->G 代表不同水位的賠率,會員會固定一組水位,可以用GetMemberByToken这支API来索取会员目前的水位组是哪个;在BTI這個是單純的一個賠率值(DisplayOdds)\n */\n constructor(\n OddsType,\n OddsValues,\n )\n {\n Object.assign(this, {\n OddsType,\n OddsValues,\n });\n }\n\n //先不用這個,轉換馬來和印尼盤口會有除法耗損問題\n static transformOddsIM(from = IMOddsType.HK, to = IMOddsType.EU, oddsVal) {\n let newOddsVal = oddsVal;\n if (from === to) {\n return newOddsVal;\n }\n\n const thisDeciaml = Decimal.clone({ rounding: 3 }) //無條件捨去\n\n let decimalVal = new thisDeciaml(newOddsVal);\n let minusOne = new thisDeciaml(-1);\n\n //香港盤不含本金 歐洲盤含本金\n //当香港盘赔率<=1时,马来盘赔率=香港盘赔率\n //当香港盘赔率>1是,马来盘赔率=-1/香港盘赔率\n //当香港盘赔率<1时,印尼盘赔率=-1/香港盘赔率\n //当香港盘赔率>=1是,印尼盘赔率=香港盘赔率\n\n //統一轉為香港盤\n if (from === IMOddsType.EU) {\n decimalVal = decimalVal.sub(1);\n } else if (from === IMOddsType.MY) {\n if (decimalVal.isNegative()) {\n decimalVal = minusOne.div(decimalVal);\n }\n } else if (from === IMOddsType.ID) {\n if (decimalVal.isNegative()) {\n decimalVal = minusOne.div(decimalVal);\n }\n }\n\n if (to === IMOddsType.HK) {\n decimalVal = new Decimal(decimalVal.toFixed(2));\n } else if (to === IMOddsType.EU) {\n decimalVal = new Decimal(decimalVal.add(1).toFixed(2));\n } else if (to === IMOddsType.MY) {\n if (decimalVal.greaterThan(1)) {\n decimalVal = new Decimal(minusOne.div(decimalVal).toFixed(2));\n } else {\n decimalVal = new Decimal(decimalVal.toFixed(2));\n }\n } else if (to === IMOddsType.ID) {\n if (decimalVal.lessThan(1)) {\n decimalVal = new Decimal(minusOne.div(decimalVal).toFixed(2));\n } else {\n decimalVal = new Decimal(decimalVal.toFixed(2));\n }\n }\n\n newOddsVal = decimalVal.toNumber();\n\n return newOddsVal;\n }\n}","//輪詢結果\nexport default class PollingResult {\n /**\n * @param NewData (更新後的)新數據\n * @param Changes 本次變更\n */\n constructor(\n NewData,\n Changes = [],\n )\n {\n Object.assign(this, {NewData, Changes});\n }\n}","// RN(app)專用 web/mobile可忽略\n// EventSource.js\n// Original implementation from\n// https://github.com/remy/polyfills/blob/master/EventSource.js\n//\n// Copyright (c) 2010 Remy Sharp, http://remysharp.com\n\nvar reTrim = /^(\\s|\\u00A0)+|(\\s|\\u00A0)+$/g;\n\nvar EventSource = function(url, options) {\n //console.log('===eventsource init',url,JSON.stringify(options));\n\n var eventsource = this,\n interval = 500, // polling interval\n lastEventId = null,\n lastIndexProcessed = 0,\n eventType;\n\n if (!url || typeof url != 'string') {\n throw new SyntaxError('Not enough arguments');\n }\n\n this.URL = url;\n this.OPTIONS = options || {};\n this.readyState = this.CONNECTING;\n this._pollTimer = null;\n this._xhr = null;\n\n function pollAgain(interval) {\n eventsource._pollTimer = setTimeout(function() {\n poll.call(eventsource);\n }, interval);\n }\n\n function poll() {\n try {\n // force hiding of the error message... insane?\n if (eventsource.readyState == eventsource.CLOSED) return;\n\n // NOTE: IE7 and upwards support\n var xhr = new XMLHttpRequest();\n xhr.open(eventsource.OPTIONS.method || 'GET', eventsource.URL, true);\n if (eventsource.OPTIONS && eventsource.OPTIONS.headers) {\n Object.keys(eventsource.OPTIONS.headers).forEach(key => {\n xhr.setRequestHeader(key, eventsource.OPTIONS.headers[key]);\n });\n }\n xhr.setRequestHeader('Accept', 'text/event-stream');\n xhr.setRequestHeader('Cache-Control', 'no-cache');\n // we must make use of this on the server side if we're working with Android - because they don't trigger\n // readychange until the server connection is closed\n xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\n if (lastEventId != null)\n xhr.setRequestHeader('Last-Event-ID', lastEventId);\n lastIndexProcessed = 0;\n\n xhr.timeout =\n this.OPTIONS && this.OPTIONS.timeout !== undefined\n ? this.OPTIONS.timeout\n : 50000;\n\n xhr.onreadystatechange = function() {\n if (\n this.readyState == 3 ||\n (this.readyState == 4 && this.status == 200)\n ) {\n // on success\n if (eventsource.readyState == eventsource.CONNECTING) {\n eventsource.readyState = eventsource.OPEN;\n eventsource.dispatchEvent('open', { type: 'open' });\n }\n\n var responseText = '';\n try {\n responseText = this.responseText || '';\n } catch (e) {}\n\n // process this.responseText\n var parts = responseText.substr(lastIndexProcessed).split('\\n'),\n data = [],\n i = 0,\n retry = 0,\n line = '';\n lastIndexProcessed = responseText.lastIndexOf('\\n\\n') + 2;\n\n // TODO handle 'event' (for buffer name), retry\n for (; i < parts.length; i++) {\n line = parts[i].replace(reTrim, '');\n if (line.indexOf('event') == 0) {\n eventType = line.replace(/event:?\\s*/, '');\n } else if (line.indexOf('retry') == 0) {\n retry = parseInt(line.replace(/retry:?\\s*/, ''));\n if (!isNaN(retry)) {\n interval = retry;\n }\n } else if (line.indexOf('data') == 0) {\n data.push(line.replace(/data:?\\s*/, ''));\n } else if (line.indexOf('id:') == 0) {\n lastEventId = line.replace(/id:?\\s*/, '');\n } else if (line.indexOf('id') == 0) {\n // this resets the id\n lastEventId = null;\n } else if (line == '') {\n if (data.length) {\n let thisEventType = eventType || 'message';\n var event = new MessageEvent(\n data.join('\\n'),\n eventsource.url,\n lastEventId,\n thisEventType,\n );\n event.type = thisEventType;\n eventsource.dispatchEvent(thisEventType, event);\n data = [];\n eventType = undefined;\n }\n }\n }\n\n if (this.readyState == 4) pollAgain(interval);\n\n // don't need to poll again, because we're long-loading\n } else if (eventsource.readyState !== eventsource.CLOSED) {\n if (this.readyState == 4) {\n // and some other status\n pollAgain(interval);\n } else if (this.readyState == 0) {\n // likely aborted\n pollAgain(interval);\n }\n }\n };\n\n xhr.onerror = function(e) {\n console.log('===eventsource xhr onerror',e);\n\n // dispatch error\n eventsource.readyState = eventsource.CONNECTING;\n\n eventsource.dispatchEvent('error', {\n type: 'error',\n message: this.responseText,\n });\n };\n\n if (eventsource.OPTIONS.body) {\n xhr.send(eventsource.OPTIONS.body);\n } else {\n xhr.send();\n }\n\n if (xhr.timeout > 0) {\n setTimeout(function() {\n if (true || xhr.readyState == 3) xhr.abort();\n }, xhr.timeout);\n }\n\n eventsource._xhr = xhr;\n } catch (e) {\n console.log('===eventsource xhr exception',e);\n // in an attempt to silence the errors\n eventsource.dispatchEvent('error', { type: 'error', data: e.message }); // ???\n }\n }\n\n poll(); // init now\n};\n\nEventSource.prototype = {\n close: function() {\n // closes the connection - disabling the polling\n this.readyState = this.CLOSED;\n clearInterval(this._pollTimer);\n this._xhr && this._xhr.abort();\n },\n CONNECTING: 0,\n OPEN: 1,\n CLOSED: 2,\n dispatchEvent: function(type, event) {\n //console.log('===eventsource xhr dispatchEvent',type,event);\n var handlers = this['_' + type + 'Handlers'];\n if (handlers) {\n for (var i = 0; i < handlers.length; i++) {\n //console.log('===eventsource xhr dispatchEvent call handler',type,event);\n handlers[i].call(this, event);\n }\n }\n\n if (this['on' + type]) {\n //console.log('===eventsource xhr dispatchEvent call onType',type,event);\n this['on' + type].call(this, event);\n }\n },\n addEventListener: function(type, handler) {\n if (!this['_' + type + 'Handlers']) {\n this['_' + type + 'Handlers'] = [];\n }\n\n this['_' + type + 'Handlers'].push(handler);\n },\n removeEventListener: function(type, handler) {\n var handlers = this['_' + type + 'Handlers'];\n if (!handlers) {\n return;\n }\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n break;\n }\n }\n },\n onerror: null,\n onmessage: null,\n onopen: null,\n readyState: 0,\n URL: '',\n};\n\nvar MessageEvent = function(data, origin, lastEventId, eventType) {\n this.data = data;\n this.origin = origin;\n this.lastEventId = lastEventId || '';\n this.type = eventType;\n};\n\nMessageEvent.prototype = {\n data: null,\n type: 'message',\n lastEventId: '',\n origin: '',\n};\n\nexport default EventSource;\n","//搜尋-比賽數據\nimport moment from \"moment\";\nimport {VendorConfigs} from \"./VendorConsts\";\n\nexport default class SearchEventData {\n /**\n * @param EventId 比赛id\n * @param EventDate 比赛時間\n * @param HomeTeamId 主場球隊id\n * @param HomeTeamName 主場球隊名\n * @param AwayTeamId 客場球隊id\n * @param AwayTeamName 客場球隊名\n * @param SportId 體育ID\n * @param LeagueId 聯賽id\n */\n constructor(\n EventId,\n EventDate,\n HomeTeamId,\n HomeTeamName,\n AwayTeamId,\n AwayTeamName,\n SportId,\n LeagueId,\n )\n {\n Object.assign(this, {\n EventId,\n EventDate,\n HomeTeamId,\n HomeTeamName,\n AwayTeamId,\n AwayTeamName,\n SportId,\n LeagueId,\n });\n }\n\n //獲取時區調整後的Moment類\n getEventDateMoment() {\n return moment(this.EventDate).utcOffset(VendorConfigs.TIMEZONE);\n }\n\n //獲取自帶高亮的主隊名\n getHighlightHomeTeamName(keyword,prefix = '', postfix ='') {\n return this._getHighlightString(this.HomeTeamName,keyword,prefix,postfix);\n }\n //獲取自帶高亮的客隊名\n getHighlightAwayTeamName(keyword,prefix = '', postfix ='') {\n return this._getHighlightString(this.AwayTeamName,keyword,prefix,postfix);\n }\n\n _getHighlightString(source, keyword, prefix , postfix ) {\n if (source && source.length > 0 && keyword && keyword.length > 0) {\n\n const findAndReplace = (keyword) => {\n const prefixIndex = source.indexOf(keyword);\n if (prefixIndex >= 0) {\n const posfixIndex = prefixIndex + keyword.length;\n return source.substr(0, prefixIndex) + prefix + keyword + postfix + source.substr(posfixIndex)\n }\n return source;\n }\n\n const result1 = findAndReplace(keyword);\n if (result1 !== source) { //有變化直接返回\n return result1;\n }\n\n //處理大小寫不敏感的狀況\n const keywordUpper = keyword.toUpperCase();\n const result2 = findAndReplace(keywordUpper);\n if (result2 !== source) {\n return result2;\n }\n const keywordLower = keyword.toLowerCase();\n const result3 = findAndReplace(keywordLower);\n if (result3 !== source) {\n return result3;\n }\n }\n return source;\n }\n}","//搜尋-聯賽數據\nexport default class SearchLeagueData {\n /**\n * @param LeagueId 聯賽id\n * @param LeagueName 聯賽名\n * @param DisplayOrder 聯賽排序\n * @param SportId 體育ID\n * @param Events 相關比賽 SearchEventData 數組\n */\n constructor(\n LeagueId,\n LeagueName,\n DisplayOrder,\n SportId,\n Events,\n )\n {\n Object.assign(this, {\n LeagueId,\n LeagueName,\n DisplayOrder,\n SportId,\n Events,\n });\n }\n\n //獲取自帶高亮的聯賽名\n getHighlightLeagueName(keyword,prefix = '', postfix ='') {\n return this._getHighlightString(this.LeagueName,keyword,prefix,postfix);\n }\n\n _getHighlightString(source, keyword, prefix , postfix ) {\n if (source && source.length > 0 && keyword && keyword.length > 0) {\n\n const findAndReplace = (keyword) => {\n const prefixIndex = source.indexOf(keyword);\n if (prefixIndex >= 0) {\n const posfixIndex = prefixIndex + keyword.length;\n return source.substr(0, prefixIndex) + prefix + keyword + postfix + source.substr(posfixIndex)\n }\n return source;\n }\n\n const result1 = findAndReplace(keyword);\n if (result1 !== source) { //有變化直接返回\n return result1;\n }\n\n //處理大小寫不敏感的狀況\n const keywordUpper = keyword.toUpperCase();\n const result2 = findAndReplace(keywordUpper);\n if (result2 !== source) {\n return result2;\n }\n const keywordLower = keyword.toLowerCase();\n const result3 = findAndReplace(keywordLower);\n if (result3 !== source) {\n return result3;\n }\n }\n return source;\n }\n}","//搜尋-體育數據\nexport default class SearchSportData {\n /**\n * @param SportId 體育ID\n * @param SportName 体育名\n * @param DisplayOrder 展示順序\n * @param Leagues 相關聯賽 SearchLeagueData 數組\n */\n constructor(\n SportId,\n SportName,\n DisplayOrder,\n Leagues,\n )\n {\n Object.assign(this, {\n SportId,\n SportName,\n DisplayOrder,\n Leagues,\n });\n }\n}","import {SelectionChangeType, SelectionStatusType, SpecialUpdateType} from \"./VendorConsts\";\nimport {Decimal} from 'decimal.js';\nimport SpecialUpdateData from \"./SpecialUpdateData\";\nimport EventData from \"./EventData\";\nimport SelectionData from \"./SelectionData\";\n\n//投注選項變化\nexport default class SelectionChangeData {\n /**\n * @param SelectionId 投注選項ID\n * @param OldValue 舊數據\n * @param NewValue 新數據\n * @param ExtraInfo 額外數據(原始變更依據)\n * @param SpecialUpdates 特定數據變化 SpecialUpdateData 數組,只有在變化類型是 2修改 才會提供\n */\n constructor(\n SelectionId,\n OldValue = null,\n NewValue = null,\n ExtraInfo = null,\n SpecialUpdates = null,\n )\n {\n if (OldValue && typeof OldValue === 'object') {\n OldValue = SelectionData.clone(OldValue); //深拷貝,不使用ref 也不使用JSON方式,因為會遺失class定義\n }\n if (NewValue && typeof NewValue === 'object') {\n NewValue = SelectionData.clone(NewValue); //深拷貝,不使用ref 也不使用JSON方式,因為會遺失class定義\n }\n\n if (ExtraInfo && typeof ExtraInfo === 'object') {\n ExtraInfo = JSON.parse(JSON.stringify(ExtraInfo)); //深拷貝,不使用ref\n }\n\n let ChangeType = SelectionChangeType.Update;\n if(!NewValue || typeof NewValue !== 'object' || (NewValue.SelectionStatus !== SelectionStatusType.OK)) {\n ChangeType = SelectionChangeType.UnAvailable;\n }\n\n Object.assign(this, {\n SelectionId,\n ChangeType,\n OldValue,\n NewValue,\n SpecialUpdates,\n ExtraInfo,\n });\n\n //判斷特定數據變化\n if (this.ChangeType === SelectionChangeType.Update) {\n let specialUpdates = [];\n\n if(!OldValue) {\n console.log('SelectionChangeData for UPDATE Has Empty OldValue??',SelectionId);\n return;\n }\n if(!NewValue) {\n console.log('SelectionChangeData for UPDATE Has Empty NewValue??',SelectionId);\n return;\n }\n\n //HomeGoal: 2, //主場進球\n if (OldValue.HomeScore !== NewValue.HomeScore) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.HomeGoal,\n OldValue.HomeScore,\n NewValue.HomeScore\n ))\n }\n\n //AwayGoal: 3, //客場進球\n if (OldValue.AwayScore !== NewValue.AwayScore) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.AwayGoal,\n OldValue.AwayScore,\n NewValue.AwayScore\n ))\n }\n\n //OddsUp: 10, //賠率上升\n //OddsDown: 11, //賠率下降\n const OddsOld = new Decimal(OldValue.Odds);\n const OddsNew = new Decimal(NewValue.Odds);\n\n //賠率上升\n if (OddsNew.greaterThan(OddsOld)) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.OddsUp,\n OldValue.Odds,\n NewValue.Odds,\n NewValue.LineId,\n NewValue.SelectionId,\n ))\n\n //賠率下降\n } else if (OddsNew.lessThan(OddsOld)) {\n specialUpdates.push(new SpecialUpdateData(\n SpecialUpdateType.OddsDown,\n OldValue.Odds,\n NewValue.Odds,\n NewValue.LineId,\n NewValue.SelectionId,\n ))\n }\n\n this.SpecialUpdates = specialUpdates;\n }\n\n }\n}","//投注選項 數據\nimport {Decimal} from 'decimal.js';\nimport {SelectionStatusNames, SelectionStatusType} from \"./VendorConsts\";\nimport OddsData from \"./OddsData\";\n\nexport default class SelectionData {\n /**\n * @param SelectionId 投注選項ID\n * @param SelectionType 投注選項類型\n * @param SelectionName 投注選項類型名\n * @param SelectionGroup 投注選項分類 bti專用,用於同類selection分組排序(在IM是直接分成不同投注線 並有linelevel)\n * @param Handicap 讓球和大小盤數據(展示用)\n * @param RealHandicap 讓球和大小盤數據(投注用)\n * @param Specifiers 其他下注資料 IM 用於特殊投注, BTI用於辨識是否 主投注線(MainPointLine,等同IM的LineLevel=1)\n * @param SportId 體育ID\n * @param MarketId 市場ID\n * @param MarketName 市場名\n * @param LeagueId 聯賽id\n * @param LeagueName 聯賽名\n * @param HomeTeamId 主場球隊id\n * @param HomeTeamName 主場球隊名\n * @param HomeScore 主場得分,投注時使用\n * @param AwayTeamId 客場球隊id\n * @param AwayTeamName 客場球隊名\n * @param AwayScore 客場得分,投注時使用\n * @param EventId 比賽id\n * @param IsOpenParlay 是否支持串關 從EventData複製過來\n * @param LineId 玩法ID\n * @param BetTypeId 投注類型ID\n * @param BetTypeName 投注類型名\n * @param PeriodId 比赛时段 ID 1全場 2上半 3下半\n * @param PeriodName 比赛时段\n * @param TargetTeamId 投注目標球隊id, 用於判斷展示格式\n * @param TargetTeamName 投注目標球隊名, 用於判斷展示格式\n * 額外提供 LineDesc 投注線描述,用於投注購物車展示\n * 額外提供 SelectionDesc 投注選項描述,用於投注購物車展示\n * @param IsOutRightEvent 是否為優勝冠軍賽事\n * @param OutRightEventName 優勝冠軍賽事名\n * @param Odds 賠率(一般是計算用,im是數字 bti因為盤口問題,跟DisplayOdds是一樣的)\n * @param OddsType 賠率類型\n * @param OddsList 賠率清單,OddsData數組\n * @param DisplayOdds 用來展示的賠率,字符串格式\n * @param LineStatusId 盘口狀態 1開2關,投注時使用\n * @param SelectionStatus 投注選項(檢查)狀態,投注時使用\n * @param ExtraInfo 額外配置,投注時使用(動態字段)\n */\n constructor(\n SelectionId,\n SelectionType,\n SelectionName,\n SelectionGroup,\n Handicap,\n RealHandicap,\n Specifiers,\n SportId,\n MarketId,\n MarketName,\n LeagueId,\n LeagueName,\n HomeTeamId,\n HomeTeamName,\n HomeScore,\n AwayTeamId,\n AwayTeamName,\n AwayScore,\n EventId,\n IsOpenParlay,\n LineId,\n BetTypeId,\n BetTypeName,\n PeriodId,\n PeriodName,\n TargetTeamId,\n TargetTeamName,\n IsOutRightEvent,\n OutRightEventName,\n Odds,\n OddsType,\n OddsList = [],\n DisplayOdds = '',\n LineStatusId = 1,\n SelectionStatus = SelectionStatusType.NOTSET,\n ExtraInfo = {},\n )\n {\n\n const SelectionStatusName = SelectionStatusNames[SelectionStatus];\n\n Object.assign(this, {\n SelectionId,\n SelectionType,\n SelectionName,\n SelectionGroup,\n Handicap,\n RealHandicap,\n Specifiers,\n SportId,\n MarketId,\n MarketName,\n LeagueId,\n LeagueName,\n HomeTeamId,\n HomeTeamName,\n HomeScore,\n AwayTeamId,\n AwayTeamName,\n AwayScore,\n EventId,\n IsOpenParlay,\n LineId,\n BetTypeId,\n BetTypeName,\n PeriodId,\n PeriodName,\n TargetTeamId,\n TargetTeamName,\n IsOutRightEvent,\n OutRightEventName,\n Odds,\n OddsType,\n OddsList,\n DisplayOdds,\n LineStatusId,\n SelectionStatus,\n SelectionStatusName, //額外提供:投注選項 狀態 中文名\n ExtraInfo,\n });\n\n //投注購物車展示 投注線\n let periodDesc = !this.IsOutRightEvent ? this.PeriodName : '';\n //如果 BetTypeName 原本開頭就帶有 PeriodName 就不用PeriodName (for im重複PeriodName)\n //例子: BetTypeName = '下半場 讓球' PeriodName = '下半場'\n if (periodDesc && periodDesc.length > 0\n && this.BetTypeName.indexOf(periodDesc) === 0) {\n periodDesc = '';\n }\n\n this.LineDesc = (this.MarketName ?? '') + ((!this.IsOutRightEvent && periodDesc.length) > 0 ? (' ' + periodDesc) : '') + ' ' + this.BetTypeName;\n\n //投注購物車展示 投注選項 默認 玩法名 + 目標數字\n let handicapTail = (this.Handicap !== null && this.Handicap !== undefined && !this.IsOutRightEvent) ? (' ' + this.Handicap) : '';\n\n //如果SelectionName原本就帶有 hadicapTail 就不用加上去(for bti重複handicap)\n if (handicapTail && handicapTail.length > 0\n && this.SelectionName.indexOf(handicapTail, this.SelectionName.length - handicapTail.length) !== -1) {\n handicapTail = '';\n }\n\n let selectionDesc = this.SelectionName + handicapTail;\n if (this.TargetTeamName !== '' //有目標隊伍數據\n && this.SelectionName.indexOf(this.TargetTeamName) === -1) { //且玩法名沒有包含 目標隊伍\n selectionDesc = this.TargetTeamName + ' ' + this.SelectionName + handicapTail;\n }\n this.SelectionDesc = selectionDesc;\n }\n\n //IM投注前檢查 - WagerSelectionInfos\n toIMBetInfo() {\n let data = {\n WagerSelectionId: this.SelectionId,\n MarketlineId: this.LineId,\n BetTypeId: this.BetTypeId,\n BetTypeSelectionId: this.SelectionType,\n OutrightTeamId: 0, //一般賽事這個是0\n OddsType: this.OddsType,\n Handicap: this.RealHandicap,\n Odds: this.Odds,\n EventId: this.EventId,\n SportId: this.SportId,\n Specifiers: this.Specifiers,\n PeriodId: this.PeriodId,\n }\n\n //特別處理 優勝冠軍\n if (this.IsOutRightEvent) {\n data.BetTypeSelectionId= 0; //優勝冠軍這個是0\n data.OutrightTeamId= this.SelectionType;\n }\n\n return data;\n }\n\n //IM投注 - WagerSelectionInfos\n toIMWager() {\n let data = {\n WagerSelectionId: this.SelectionId,\n MarketlineId: this.LineId,\n BetTypeId: this.BetTypeId,\n BetTypeSelectionId: this.SelectionType,\n OutrightTeamId: 0, //一般賽事這個是0\n OddsType: this.OddsType,\n Handicap: this.RealHandicap,\n Odds: this.Odds,\n HomeScore: this.HomeScore,\n AwayScore: this.AwayScore,\n EventId: this.EventId,\n SportId: this.SportId,\n Market: this.MarketId,\n Specifiers: this.Specifiers,\n }\n\n //特別處理 優勝冠軍\n if (this.IsOutRightEvent) {\n data.BetTypeSelectionId= 0; //優勝冠軍這個是0\n data.OutrightTeamId= this.SelectionType;\n }\n\n return data;\n }\n\n //BTI投注\n toBTIWager() {\n return this.ExtraInfo.selection;\n }\n\n //SABA投注前檢查-單注\n toSABASingleBetInfo() {\n return {\n sportType: this.SportId,\n marketId: this.LineId,\n key: this.SelectionType,\n oddsType: this.OddsType,\n }\n }\n\n //SABA投注前檢查-單注(猜冠軍)\n toSABAOutRightBetInfo() {\n return {\n sportType: this.SportId,\n orid: this.SelectionId,\n }\n }\n\n //SABA投注前檢查-串關\n toSABAParlayBetInfo() {\n return {\n sportType: this.SportId,\n marketId: this.LineId,\n point: this.RealHandicap,\n key: this.SelectionType,\n }\n }\n\n //SABA單注投注參數\n toSABAPlaceSingleBetParams(BetAmount, isAcceptAnyOdds) {\n return {\n sportType: this.SportId,\n marketId: this.LineId,\n price: this.Odds,\n point: this.RealHandicap,\n key: this.SelectionType,\n stake: new Decimal(BetAmount).toNumber(),\n oddsType: this.OddsType,\n }\n }\n\n //SABA單注 猜冠軍 (單注)投注參數\n toSABAPlaceOutRightBetParams(BetAmount) {\n return {\n sportType: this.SportId,\n price: this.Odds,\n orid: this.SelectionId,\n stake: new Decimal(BetAmount).toNumber(),\n }\n }\n\n //SABA串關 投注參數\n toSABAPlaceParlayBetParams() {\n return {\n sportType: this.SportId,\n marketId: this.LineId,\n point: this.RealHandicap,\n key: this.SelectionType,\n price: this.Odds,\n }\n }\n\n\n static clone(srcSelectionData, memberOddsType = null, memberType = null) {\n\n //從OddsList獲取賠率\n let thisOddsType = null;\n let thisOddsValue = null;\n let thisDisplayOdds = null;\n if (memberOddsType !== null) { //有指定 才做轉換\n if (srcSelectionData.OddsList && srcSelectionData.OddsList.length > 0) {\n let targetOddsInfo = srcSelectionData.OddsList[0]; //默認選第一個賠率\n const matchOddsInfos = srcSelectionData.OddsList.filter(oInfo => parseInt(oInfo.OddsType) === memberOddsType);\n if (matchOddsInfos && matchOddsInfos.length > 0) { //如果有找到跟會員設置的盤口一樣的,就使用這個\n targetOddsInfo = matchOddsInfos[0];\n }\n thisOddsType = targetOddsInfo.OddsType;\n if (memberType !== null) {\n thisOddsValue = targetOddsInfo.OddsValues[memberType]; //IM根據水位選擇賠率\n const oddsDeciaml = Decimal.clone({ rounding: 3 }) //無條件捨去\n thisDisplayOdds = new oddsDeciaml(thisOddsValue).toFixed(2);\n } else {\n thisOddsValue = targetOddsInfo.OddsValues; //bti/saba直接使用賠率\n thisDisplayOdds = targetOddsInfo.OddsValues; //bti/saba直接使用賠率\n }\n }\n }\n\n //如果沒獲取到就用默認值\n thisOddsValue = thisOddsValue ?? srcSelectionData.Odds;\n thisOddsType = thisOddsType ?? srcSelectionData.OddsType;\n thisDisplayOdds = thisDisplayOdds ?? srcSelectionData.DisplayOdds;\n\n return new SelectionData(\n srcSelectionData.SelectionId,\n srcSelectionData.SelectionType,\n srcSelectionData.SelectionName,\n srcSelectionData.SelectionGroup,\n srcSelectionData.Handicap,\n srcSelectionData.RealHandicap,\n srcSelectionData.Specifiers,\n srcSelectionData.SportId,\n srcSelectionData.MarketId,\n srcSelectionData.MarketName,\n srcSelectionData.LeagueId,\n srcSelectionData.LeagueName,\n srcSelectionData.HomeTeamId,\n srcSelectionData.HomeTeamName,\n srcSelectionData.HomeScore,\n srcSelectionData.AwayTeamId,\n srcSelectionData.AwayTeamName,\n srcSelectionData.AwayScore,\n srcSelectionData.EventId,\n srcSelectionData.IsOpenParlay,\n srcSelectionData.LineId,\n srcSelectionData.BetTypeId,\n srcSelectionData.BetTypeName,\n srcSelectionData.PeriodId,\n srcSelectionData.PeriodName,\n srcSelectionData.TargetTeamId,\n srcSelectionData.TargetTeamName,\n srcSelectionData.IsOutRightEvent,\n srcSelectionData.OutRightEventName,\n thisOddsValue,\n thisOddsType,\n srcSelectionData.OddsList ? srcSelectionData.OddsList.map(oddsItem => {\n return new OddsData(\n oddsItem.OddsType,\n oddsItem.OddsValues,\n )\n }): [],\n thisDisplayOdds,\n srcSelectionData.LineStatusId,\n srcSelectionData.SelectionStatus,\n srcSelectionData.ExtraInfo,\n )\n }\n}\n","//特定數據變化\nexport default class SpecialUpdateData {\n /**\n * @param UpdateType 特定數據變化類型\n * @param OldValue 舊數據\n * @param NewValue 新數據\n * @param LineId 投注線ID 只有 玩法 或 賠率變化 時 才會提供\n * @param SelectionId 投注選項ID 只有賠率變化時 才會提供\n */\n constructor(\n UpdateType,\n OldValue,\n NewValue,\n LineId,\n SelectionId,\n )\n {\n Object.assign(this, {\n UpdateType,\n OldValue,\n NewValue,\n LineId,\n SelectionId,\n });\n }\n}","//體育項目 計數\n\nexport default class SportData {\n /**\n * @param SportId 体育id\n * @param SportName 体育名\n * @param Count 比赛数\n * @param Markets 按市場計算數量 MarketData數組\n */\n constructor(\n SportId,\n SportName,\n Count,\n Markets = [],\n )\n {\n Object.assign(this, {SportId, SportName, Count, Markets});\n }\n}","/*\n* 指定SSE使用的EventSource Lib,主要針對RN(app)環境\n*\n* 在各端,視實際狀況引用\n*/\n\n/*\n* web/mobile用\n* web/mobile使用瀏覽器默認的就可以\n*/\nvar EventSource = require('./data/RNEventSource.ios');\nif (typeof window === 'object' && window.EventSource) {\n EventSource = window.EventSource\n}\nexport default EventSource;\n\n/*\n* app用\n*/\n// import RNEventSource from './data/RNEventSource';\n// export default RNEventSource;\n","import TargetEventSource from '../vendorEventSource'; //從配置文件獲取要使用的EventSource\nexport default class ReconnectingEventSource{\n constructor(url, configuration) {\n let _this = this;\n this.CONNECTING = 0;\n this.OPEN = 1;\n this.CLOSED = 2;\n this._eventSource = null;\n this._lastEventId = null;\n this._timer = null;\n this._listeners = {};\n this.url = url;\n this.readyState = 0;\n this.retryTime = 5000;\n this.maxRetryAttempt = 30;\n this.retryCount = 0;\n this._configuration = configuration != null ? Object.assign({}, configuration) : null;\n if (this._configuration != null && this._configuration.lastEventId) {\n this._lastEventId = this._configuration.lastEventId;\n delete this._configuration['lastEventId'];\n }\n this._onevent_wrapped = function (event) { _this._onevent(event); };\n this._start();\n }\n _start = () => {\n let _this = this;\n let url = this.url;\n if (this._lastEventId) {\n if (url.indexOf('?') === -1) {\n url += '?';\n }\n else {\n url += '&';\n }\n url += 'lastEventId=' + encodeURIComponent(this._lastEventId);\n }\n this._eventSource = new TargetEventSource(url, this._configuration);\n this._eventSource.onopen = function (event) { _this._onopen(event); };\n this._eventSource.onerror = function (event) { _this._onerror(event); };\n for (var _i = 0, _a = Object.keys(this._listeners); _i < _a.length; _i++) {\n let type = _a[_i];\n this._eventSource.addEventListener(type, this._onevent_wrapped);\n }\n };\n _onopen = (event) => {\n if (this.readyState === this.CONNECTING) {\n this.readyState = this.OPEN;\n this.retryCount = 0;\n this.onopen(event);\n }\n };\n _onerror = (event) => {\n let _this = this;\n let prevState = this.readyState;\n if (this.readyState === this.OPEN) {\n this.readyState = this.CONNECTING;\n }\n if (this.retryCount == 1) { //throw an error on second reconnect\n this.onerror(event);\n }\n if (this.retryCount >= this.maxRetryAttempt) {\n this.close();\n console.debug(\"Stop attempts to reconnect. Attempts: \" + this.retryCount);\n }\n if (this._eventSource) {\n if (this._eventSource.readyState === this.CLOSED || this._eventSource.readyState === this.CONNECTING) {\n this._eventSource.close();\n this._eventSource = null;\n this.retryCount++;\n this.onreconnect();\n if (prevState == this.OPEN) { //first reconnect is fast\n this._start();\n }\n else {\n this._timer = setTimeout(function () { _this._start(); }, this.retryTime);\n }\n }\n }\n };\n _onevent = (event) => {\n if (event.lastEventId) {\n this._lastEventId = event.lastEventId;\n }\n let listenersForType = this._listeners[event.type];\n if (listenersForType != null) {\n for (var _i = 0, _a = listenersForType.slice(); _i < _a.length; _i++) {\n let listener = _a[_i];\n listener(event);\n }\n }\n if (event.type === 'message') {\n this.onmessage(event);\n }\n };\n onopen = (event) => {\n // may be overridden\n };\n onerror = (event) => {\n // may be overridden\n };\n onmessage = (event) => {\n // may be overridden\n };\n onreconnect = () => {\n // may be overridden\n };\n close = () => {\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = null;\n }\n if (this._eventSource) {\n this._eventSource.close();\n this._eventSource = null;\n }\n this.readyState = this.CLOSED;\n };\n addEventListener = (type, listener, options) => {\n if (!(type in this._listeners)) {\n this._listeners[type] = [];\n if (this._eventSource) {\n this._eventSource.addEventListener(type, this._onevent_wrapped, options);\n }\n }\n let listenersForType = this._listeners[type];\n if (listenersForType.indexOf(listener) === -1) {\n this._listeners[type] = listenersForType.concat([listener]);\n }\n };\n removeEventListener = (type, listener, options) => {\n if (type in this._listeners) {\n let listenersForType = this._listeners[type];\n let updatedListenersForType = listenersForType.filter(function (l) { return l !== listener; });\n if (updatedListenersForType.length > 0) {\n this._listeners[type] = updatedListenersForType;\n }\n else {\n delete this._listeners[type];\n if (this._eventSource) {\n this._eventSource.removeEventListener(type, this._onevent_wrapped, options);\n }\n }\n }\n };\n}\n","import ReconnectingEventSource from \"./ReconnectingEventSource\";\n\nexport default class SseSubscription {\n constructor(url, getToken, onNext, onError) {\n this.url = url;\n this.getToken = getToken;\n this.onNext = onNext;\n this.onError = onError;\n }\n run = () => {\n let _this = this;\n if (!this.onNext) {\n throw Error(\"onNext can't be nullable.\");\n }\n this.eventSource = new ReconnectingEventSource(this.getUrl());\n this.eventSource.addEventListener(\"push\", function (e) {\n _this.onNext(e.data);\n }, false);\n this.eventSource.addEventListener(\"update\", function (e) {\n _this.onNext(e.data);\n }, false);\n this.eventSource.addEventListener(\"snapshot\", function (e) {\n _this.onNext(e.data);\n }, false);\n this.eventSource.addEventListener(\"message\", function (e) {\n _this.onNext(e.data);\n }, false);\n this.eventSource.onerror = function (e) {\n if (_this.onError) {\n _this.onError(Error(\"EventSource failed.\"));\n }\n };\n this.eventSource.onreconnect = function () {\n _this.eventSource.url = _this.getUrl();\n };\n };\n unsubscribe = () => {\n this.eventSource && this.eventSource.close();\n };\n getUrl = () => {\n return this.url.replace('[TOKEN]', this.getToken());\n };\n}\n","export default class TokenManager {\n isInitialized = false;\n _config = {\n tokenRenewInterval: 10 * 60 * 1000, //10分renew一次\n tokenRenewProvider: null,\n isAnonymous: false,\n }\n apiAccessToken = null;\n _autoRenewTimer = null;\n\n init = (config, initToken = null) => {\n //console.log('=====TOKEN MANAGER====','init start',JSON.stringify(config))\n if (config) {\n this._config = Object.assign(this._config,config);\n this.isInitialized = true;\n }\n if (initToken) {\n //console.log('=====TOKEN MANAGER====','init with exists token',initToken)\n this.apiAccessToken = initToken;\n return new Promise(resolve => resolve(initToken));\n } else {\n return this.renew();\n }\n }\n\n renew = () => {\n //console.log('=====TOKEN MANAGER====','renew start')\n if (!(this.isInitialized && this._config.tokenRenewProvider)) {\n this.stopAutoRenew();\n console.error('=====TOKEN MANAGER====',\"Renew Error: provider must be specified\");\n throw Error(\"Token renew provider must be specified\");\n }\n let that = this;\n return this._config.tokenRenewProvider()\n .then(function (response) {\n //console.log('=====TOKEN MANAGER====','get renew response',response)\n that.apiAccessToken = response.access_token;\n return that.apiAccessToken;\n })\n .catch(function (err) {\n console.error('=====TOKEN MANAGER====',\"Renew Error:\",err && (err.message || err));\n return null;\n });\n }\n\n startAutoRenew = () => {\n //console.log('=====TOKEN MANAGER====','startAutoRenew')\n if (this.isInitialized && this._config.tokenRenewInterval && !this._autoRenewTimer) {\n let that = this;\n //console.log('=====TOKEN MANAGER====','startAutoRenew setup done',this._config.tokenRenewInterval)\n this._autoRenewTimer = setInterval(function () { return that.renew(); }, this._config.tokenRenewInterval);\n }\n }\n stopAutoRenew = () => {\n clearInterval(this._autoRenewTimer);\n this._autoRenewTimer = null;\n //console.log('=====TOKEN MANAGER====','stopAutoRenew setup done')\n }\n\n isAnonymous = () => {\n return this._config.isAnonymous;\n }\n}\n","import HostConfig from '$LIB/Host.config';\nimport {SortWays, VendorMarkets} from \"./VendorConsts\";\nimport moment from 'moment';\nimport { v4 as uuidv4 } from 'uuid';\nimport md5 from \"crypto-js/md5\";\nimport {vendorStorage} from \"../vendorStorage\";\nimport {timeout_fetch} from \"../../SportRequest\";\nimport { defaultMemberSetting } from \"../vendorSetting\";\nimport EventData from \"./EventData\";\nimport PollingResult from \"./PollingResult\";\n/**\n * Vendor共用父類\n */\nexport default class VendorBase {\n constructor (configs) {\n this.configs = Object.assign(this.configs,configs);\n }\n\n configs = {\n MaxParlay: 10, //串關最多選幾個\n VendorName: 'NOTSET', //供應商名稱\n VendorPage: 'NOTSET', //主頁鏈接\n EventIdType: 'NOTSET', //EventId數據形態: int/string\n HasLeagueIcon: false, //是否有聯賽Icon\n HasTeamIcon: false, //是否有隊伍Icon\n HasCashOut: false, //是否支持提前兌現\n }\n\n isGameLocked = false; //保留字段,遊戲鎖定\n loginPromise = null; //登入的Promise\n\n _getLoginInfo(){\n throw '_getLoginInfo needs implement!!!';\n }\n\n //子查詢,一起清除(for bti 關注輪詢+一般賽事推送 的情況)\n _childPollingMap = {}\n\n /**\n * 刪除輪詢,在componentWillUnmount時調用,避免堆積太多無用輪詢\n *\n * @param key\n */\n deletePolling(key) {\n //console.log('===deletePolling',key);\n if (key && typeof key === 'object' && Object.keys(key).length === 2) {\n return this._unsubscribeGlobalPolling(key);\n }\n\n const childPolling = this._childPollingMap[key];\n if (childPolling) {\n this.deletePolling(childPolling); //刪除輪詢\n delete this._childPollingMap[key]; //移除關聯\n }\n\n //處理輪詢\n const pollingCacheInfo = this._PollingCache[key];\n //停止輪詢\n if (pollingCacheInfo && pollingCacheInfo.handle) {\n clearTimeout(pollingCacheInfo.handle);\n }\n //刪除數據\n if (pollingCacheInfo) {\n delete this._PollingCache[key];\n }\n }\n\n //輪詢數據緩存\n _PollingCache = {}\n //輪詢共用函數\n _registerPolling(dataName, queryParams, queryFunction, onUpdateCallback, intervalSeconds = 10, uniqueName = '', useResultCache = false, resultCacheExpireSeconds=9*60, preCacheFunction = null) {\n //console.log(this.configs.VendorName,'===registerPolling===',dataName,JSON.stringify(queryParams))\n //加速:從緩存中優先獲取數據\n let cachedResultKey;\n let usedCachedResult = false; //是否使用緩存數據加速\n if (useResultCache) {\n cachedResultKey = dataName + '_' + uniqueName + '_' + md5(JSON.stringify(queryParams));\n const cachedResult = this._cacheGet(cachedResultKey, null);\n if (cachedResult) {\n //console.log('===use Cached data for ',cachedResultKey);\n //回調通知數據更新\n if (onUpdateCallback) {\n try {\n onUpdateCallback(cachedResult);\n } catch (e) {\n console.log('Polling onUpdateCallback error', e);\n }\n }\n usedCachedResult = true;\n }\n }\n\n const cacheKey = dataName + '_' + uniqueName;\n\n let cacheInfo = this._PollingCache[cacheKey];\n if (cacheInfo) {\n //有舊的\n\n //先停止輪詢\n if (cacheInfo && cacheInfo.handle) {\n clearTimeout(cacheInfo.handle);\n }\n\n //清理緩存數據\n delete this._PollingCache[cacheKey];\n }\n\n //重新初始化配置\n //配置一個唯一key,用於輪詢取代後,判斷是新的還是舊的輪詢\n const uniqueid = moment().format('YYYYMMDDHHmmssSSS') + uuidv4();\n //console.log('===Polling uniqueid',uniqueid)\n this._PollingCache[cacheKey] = { handle: null, params: null, uniqueid};\n cacheInfo = this._PollingCache[cacheKey];\n\n //檢查interval數值\n intervalSeconds = parseInt(intervalSeconds);\n if (!intervalSeconds || isNaN(intervalSeconds) || intervalSeconds<=0) {\n intervalSeconds = 15;\n }\n\n //用async包裹,因為需要使用到await 按順序執行\n (async () => {\n //沒有緩存數據,才利用preCacheFunction去獲取初始數據\n if (!usedCachedResult && preCacheFunction) {\n const data = await timeout_fetch(preCacheFunction(),2000).catch(e => {}); //初始數據兩秒必須返回 超過放棄\n //檢查輪詢是否還存在,可能剛好在異步查詢完成之後就被刪除了\n if (this._PollingCache[cacheKey] && this._PollingCache[cacheKey].uniqueid === uniqueid) { //輪詢存在 才繼續回調\n if (data && onUpdateCallback) {\n if (useResultCache) {\n //console.log('===set Cached data for ',cachedResultKey);\n this._cacheSet(cachedResultKey, data, resultCacheExpireSeconds); //加速:緩存\n }\n\n try {\n onUpdateCallback(data);\n } catch (e) {\n console.log('Polling onUpdateCallback from precache error',this.configs.VendorName, e);\n }\n await new Promise(r => setTimeout(r, 1000)); //停一下,讓前端優先render\n }\n } else {\n console.log('abort polling onUpdateCallback from precache due to the polling has been deleted',this.configs.VendorName,cacheKey);\n }\n }\n\n //配置輪詢函數\n const queryAndCallback = (thisUniqueId) => {\n //console.log(this.configs.VendorName,'===queryFunction===',dataName,thisUniqueId,JSON.stringify(queryParams))\n queryFunction().then(data => {\n //檢查輪詢是否還存在,可能剛好在異步查詢完成之後就被刪除了\n if (this._PollingCache[cacheKey] && this._PollingCache[cacheKey].uniqueid === thisUniqueId) { //輪詢存在 才繼續回調\n if (useResultCache) {\n //console.log('===set Cached data for ',cachedResultKey);\n this._cacheSet(cachedResultKey, data, resultCacheExpireSeconds); //加速:緩存\n }\n\n if (onUpdateCallback) {\n try {\n onUpdateCallback(data);\n } catch (e) {\n console.log('Polling onUpdateCallback error',this.configs.VendorName, e);\n }\n }\n } else {\n console.log('abort polling onUpdateCallback due to the polling has been deleted',this.configs.VendorName,cacheKey);\n }\n }).catch(e => {console.log('polling has error',cacheKey, e )})\n .finally(() => {\n if (this._PollingCache[cacheKey] && this._PollingCache[cacheKey].uniqueid === thisUniqueId) { //輪詢存在 才繼續回調\n //console.log('register next polling setTimeout',this.configs.VendorName,cacheKey);\n //使用setTimeout而不是interval,這樣可以避免- 查詢返回很慢,造成輪詢堆積的問題\n this._PollingCache[cacheKey].handle = setTimeout(() => {\n queryAndCallback(thisUniqueId)\n }, intervalSeconds * 1000);\n } else {\n console.log('abort polling setTimeout due to the polling has been deleted',this.configs.VendorName,cacheKey);\n }\n });\n };\n\n //紀錄查詢參數\n cacheInfo.params = queryParams;\n\n //先調用一次獲取數據,並開始輪詢\n queryAndCallback(uniqueid);\n })();\n\n return cacheKey; //返回key\n }\n\n _getFavouriteStorageKey(type = 'EVENTS') {\n const loginInfo = this._getLoginInfo();\n let memberCode = '';\n if (loginInfo) {\n memberCode = loginInfo.memberCode;\n }\n return 'FAV-' + memberCode + '-' + this.configs.VendorName + '-' + type;\n }\n\n _cleanFavouriteEventTimeoutHandler = null;\n\n /**\n * 添加收藏賽事\n *\n * @param EventId\n */\n async addFavouriteEvent(EventId,SportId,IsOutRightEvent) {\n const key = this._getFavouriteStorageKey();\n const savedFavEvents = await this.getFavouriteEvents(key);\n SportId = parseInt(SportId);//固定轉為int\n if (this.configs.EventIdType === 'string') {\n EventId = EventId + '';//固定轉為string\n }\n if (this.configs.EventIdType === 'int') {\n EventId = parseInt(EventId);//固定轉為int\n }\n //去除已經有的數據\n let favEvents = savedFavEvents.filter(item => item.EventId !== EventId)\n //添加\n favEvents.push({EventId,SportId,IsOutRightEvent});\n await vendorStorage.setItemAsync(key, JSON.stringify(favEvents));\n\n //配置過期清理\n if (!this._cleanFavouriteEventTimeoutHandler) {\n const doClean = async () => {\n const key = this._getFavouriteStorageKey();\n const currentFavEvents = await this.getFavouriteEvents(key);\n\n let pr = await this.getEventsDetail(currentFavEvents);\n const thisEvents = pr.NewData;\n let existEventIds = [];\n if (thisEvents && thisEvents.length >0) {\n existEventIds = thisEvents.map(e => e.EventId);\n }\n const notExistEventIds = currentFavEvents.filter(e => existEventIds.indexOf(e.EventId) === -1).map(e => e.EventId);\n //console.log('===need clean fav events',notExistEventIds);\n\n let hasDeletedFavourite = false; //關注比賽 是否有被刪除\n if (notExistEventIds && notExistEventIds.length >0) {\n hasDeletedFavourite = await this.removeFavouriteEvent(notExistEventIds);\n }\n if (hasDeletedFavourite){ //關注比賽 有被刪除\n //強制刷新 體育計數\n if (typeof window !== \"undefined\" && window.eventListing_updateSportsCount) {\n window.eventListing_updateSportsCount(this.configs.VendorName);\n }\n }\n\n const currentFavEvents3 = await this.getFavouriteEvents(key);\n\n if (currentFavEvents3.length > 0) {\n this._cleanFavouriteEventTimeoutHandler = setTimeout(doClean,10*60*1000); //10分檢查一次\n } else {\n clearTimeout(this._cleanFavouriteEventTimeoutHandler);\n this._cleanFavouriteEventTimeoutHandler = null;\n }\n }\n\n this._cleanFavouriteEventTimeoutHandler = setTimeout(doClean,10*60*1000); //10分檢查一次\n }\n }\n\n /**\n * 刪除收藏賽事\n *\n * @param EventId 支持數組型態\n */\n async removeFavouriteEvent(EventId) {\n const key = this._getFavouriteStorageKey();\n const savedFavEvents = await this.getFavouriteEvents(key);\n\n //強制轉array\n let EventIdArr = EventId;\n if (!Array.isArray(EventId)) {\n EventIdArr = [EventId];\n }\n\n let removeEventIdArr = EventIdArr.map(eid => {\n let convertedEventId = eid;\n if (this.configs.EventIdType === 'string') {\n convertedEventId = eid + '';//固定轉為string\n }\n if (this.configs.EventIdType === 'int') {\n convertedEventId = parseInt(eid);//固定轉為int\n }\n return convertedEventId;\n })\n\n let favEvents = savedFavEvents.filter(item => removeEventIdArr.indexOf(item.EventId) === -1);\n const isChanged = (savedFavEvents.length !== favEvents.length);\n\n //console.log('===remove fav event',removeEventIdArr,isChanged);\n\n if (isChanged) {\n await vendorStorage.setItemAsync(key, JSON.stringify(favEvents));\n }\n return isChanged;\n }\n\n /**\n * 獲取收藏賽事\n *\n * @param key\n * @returns {*[]|any}\n */\n async getFavouriteEvents(key = null) {\n if (key === null) {\n key = this._getFavouriteStorageKey();\n }\n if (typeof window !== 'undefined') {\n const jsonString = await vendorStorage.getItemAsync(key);\n if (jsonString) {\n const jsonData = JSON.parse(jsonString);\n if (jsonData) {\n return jsonData;\n }\n }\n }\n return [];\n }\n\n //獲取用戶配置\n getMemberSetting() {\n const loginInfo = this._getLoginInfo();\n let memberCode = '';\n if (loginInfo) {\n memberCode = loginInfo.memberCode;\n }\n\n const defaultSetting = defaultMemberSetting;\n let result = Object.assign({},defaultSetting); //要做新的Object 後面轉換成通用OddsType會改到\n\n //從緩存獲取\n if (typeof window !== 'undefined') {\n const jsonString = vendorStorage.getItem('NotificationSetting-' + memberCode)\n if (jsonString) {\n const jsonData = JSON.parse(jsonString);\n if (jsonData) {\n result = Object.assign({},defaultSetting,jsonData);\n }\n }\n }\n\n return result;\n }\n\n /**\n * 根據體育項目獲取,最多8個,返回為 EventData數組\n *\n * @param sportId 體育id\n * @param NEventCount 要返回前幾個比賽 默認8\n * @returns {Promise<*[]|*>}\n */\n async getBannerData(sportId, NEventCount = 8 ) {\n //足球 直接從api緩存服務 獲取數據\n if (!this.isAPIServer() //只有在客戶端 才從API服務器獲取\n && parseInt(sportId) === 1 //足球才支持調用api服務器\n ) {\n const vendorNameLower = this.configs.VendorName.toLowerCase();\n const eventDatas = await fetch(HostConfig.Config.CacheApi + '/appbanners/' + vendorNameLower +'/')\n .then(response => response.json())\n .then(jsonData => {\n let events = [];\n if (jsonData && jsonData.data && jsonData.data.length > 0) {\n events = jsonData.data.map(ev => EventData.clone(ev)); //需要轉換一下\n }\n return events;\n }).catch(e => {\n console.log('===getBannerDataFromCacheAPI has error',e);\n return [];\n })\n\n return eventDatas;\n }\n\n sportId = parseInt(sportId);\n if(sportId === 1) {\n // 足球按以下三個優先序排,如果同等級 就用vendor的默認排序\n // 滾球\n // a. 第一級: 高進球可能性的賽事 優先 (賽事進行到第75分鐘前 OR 縂進球 > 1 OR 紅卡 > 0)\n // b. 第二級: 縂進球 降序排序\n // c. 第三級: 根據賽事開始時間 升序排序\n //\n // 按此順序找到前8\n const runningEventsPR = await this.getEvents(sportId,VendorMarkets.RUNNING,SortWays.LeagueName); //先用默認聯賽排序,拿到Vendor定義的順序\n let runningEvents = runningEventsPR.NewData;\n\n //a. 第一級: 高進球可能性的賽事 優先 (賽事進行到第75分鐘前 OR 縂進球 > 1 OR 紅卡 > 0)\n const rule1 = (event) => {\n return (event.RBMinute !== null && event.RBMinute !== '' && parseInt(event.RBMinute) <= 75)\n || event.HomeScore !== null && event.HomeScore !== ''&& parseInt(event.HomeScore) > 0\n || event.AwayScore !== null && event.AwayScore !== ''&& parseInt(event.AwayScore) > 0\n || event.HomeRedCard !== null && event.HomeRedCard !== ''&& parseInt(event.HomeRedCard) > 0\n || event.AwayRedCard !== null && event.AwayRedCard !== ''&& parseInt(event.AwayRedCard) > 0\n }\n\n //b. 第二級: 縂進球 降序排序\n const rule2 = (event) => {\n const HomeScore = (event.HomeScore !== null && event.HomeScore !== '') ? parseInt(event.HomeScore) : 0;\n const AwayScore = (event.AwayScore !== null && event.AwayScore !== '') ? parseInt(event.AwayScore) : 0;\n return HomeScore+AwayScore;\n }\n\n const compareFunc = (left,right) => {\n //a. 第一級: 高進球可能性的賽事 優先 (賽事進行到第75分鐘前 OR 縂進球 > 1 OR 紅卡 > 0)\n const a1 = rule1(left);\n const b1 = rule1(right);\n\n if (a1 === true && b1 === false) {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n\n if (b1 === true && a1 === false) {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n\n //b. 第二級: 縂進球 降序排序\n const a2 = rule2(left);\n const b2 = rule2(right);\n\n if (a2 > b2 ) {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n if (a2 < b2 ) {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n\n //c. 第三級: 根據賽事開始時間 升序排序\n const a3 = left.EventDate;\n const b3 = right.EventDate;\n if (a3 < b3 ) {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n if (a3 > b3 ) {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n // a must be equal to b\n return 0;\n }\n\n runningEvents = runningEvents.sort(compareFunc);\n\n if (runningEvents.length >= NEventCount) {\n return runningEvents.slice(0,NEventCount);\n } else {\n const leftCount = NEventCount - runningEvents.length;\n const leftEvents = await this._getFirstNEvents(sportId,leftCount,SortWays.EventTime, [],[VendorMarkets.TODAY,VendorMarkets.EARLY]);\n return runningEvents.concat(leftEvents).slice(0,NEventCount); //返回切好的N個比賽\n }\n } else {\n //其他體育項目\n //根據開賽時間排序 近->遠\n return this._getFirstNEvents(sportId,NEventCount,SortWays.EventTime);\n }\n }\n\n /**\n * 全局 輪詢獲取 banner數據 20秒一次\n *\n * @param subscriberName 訂閱者名稱,用來處理重複訂閱的狀況\n * @param onUpdateCallback 輪詢後數據更新回調 (result) => {} result 為 EventData數組\n * @param sportId 體育id\n * @param NEventCount 要返回前幾個比賽 默認8\n * @param uniqueName 用來判斷是否使用同一個輪詢,配置不同名字,可以同時開多個輪詢\n */\n getBannerDataPollingGlobal(subscriberName, onUpdateCallback, sportId , NEventCount = 8, uniqueName = '') {\n return this._subscribeGlobalPolling('getBannerDataPolling', subscriberName, onUpdateCallback,{sportId, NEventCount}, uniqueName, true);\n }\n\n /**\n * 輪詢獲取 banner數據 20秒一次\n *\n * @param onUpdateCallback 輪詢後數據更新回調 (result) => {} result 為 EventData數組\n * @param sportId 體育id\n * @param NEventCount 要返回前幾個比賽 默認8\n * @param uniqueName 用來判斷是否使用同一個輪詢,配置不同名字,可以同時開多個輪詢\n */\n getBannerDataPolling(onUpdateCallback, sportId , NEventCount = 8, uniqueName = '') {\n const dataQuery = () => this.getBannerData(sportId, NEventCount);\n return this._registerPolling('getBannerDataPolling', {sportId, NEventCount}, dataQuery, onUpdateCallback, 20, uniqueName, true);\n }\n\n //按體育項目+排序 返回前幾個比賽\n async _getFirstNEvents(sportId = 1, NEventCount = 8, sortWay = SortWays.EventTime, excludeEventIds= [],\n markets= [VendorMarkets.RUNNING,VendorMarkets.TODAY,VendorMarkets.EARLY] //滾球->今日->早盤 的順序\n ) {\n let resultEvents = [];\n for(let market of markets) {\n const thisEventPR = await this.getEvents(sportId,market,sortWay,null,null,{MaxCount:NEventCount}); //bti加上最大數量限制 加速查詢\n let thisEvents = thisEventPR.NewData;\n\n if (excludeEventIds && excludeEventIds.length >0) {\n //排除不要的比賽\n thisEvents = thisEvents.filter(ev => excludeEventIds.indexOf(ev.EventId) === -1);\n }\n\n //去除已經在清單裡面的比賽\n if (resultEvents.length > 0) {\n thisEvents = thisEvents.filter(ev => resultEvents.indexOf(ev.EventId) === -1);\n }\n\n //接起來\n resultEvents = resultEvents.concat(thisEvents);\n\n if (resultEvents.length >= NEventCount) {\n break; //超過數量就可以退出\n }\n }\n\n return resultEvents.slice(0,NEventCount); //返回切好的N個比賽\n }\n\n /**\n * 獲取聯賽下的滾球賽事,額外傳入EventId,會把該Event放在數組的第一個,返回為 EventData數組\n *\n * @param sportId 體育id\n * @param leagueId 聯賽id\n * @param eventId 本賽事id\n * @returns {Promise<*[]|*>}\n */\n async getLiveEventsInSameLeague(sportId, leagueId, eventId = null) {\n sportId = parseInt(sportId);\n leagueId = parseInt(leagueId);\n\n if (this.configs.EventIdType === 'string') {\n eventId = eventId + '';//固定轉為string\n }\n if (this.configs.EventIdType === 'int') {\n eventId = parseInt(eventId);//固定轉為int\n }\n\n const runningEventsPR = await this.getEvents(sportId, VendorMarkets.RUNNING, SortWays.EventTime);\n let runningEvents = runningEventsPR.NewData;\n\n runningEvents = runningEvents.filter(re => parseInt(re.LeagueId) === parseInt(leagueId)); //獲取同聯賽\n\n\n //把目標賽事移到第一個\n if (eventId !== null) {\n const compareFunc = (left, right) => {\n const a = left.EventId === eventId;\n const b = right.EventId === eventId;\n\n if (a === true && b === false) {\n return -1; //小于 0 ,那么 a 会被排列到 b 之前\n }\n\n if (b === true && a === false) {\n return 1; //大于 0 , b 会被排列到 a 之前。\n }\n\n return 0;\n }\n runningEvents = runningEvents.sort(compareFunc);\n }\n\n return runningEvents;\n }\n\n /**\n * 獲取熱門比賽-足球 今日+早盤,按開賽時間排序 選3個\n *\n * @param NEventCount 要返回前幾個比賽 默認3\n * @returns {Promise<*[]|*>}\n */\n async getHotEvents(NEventCount =3){\n return this._getFirstNEvents(1,3,SortWays.EventTime,[],[VendorMarkets.TODAY,VendorMarkets.EARLY]);\n }\n\n /**\n * 全局 輪詢獲取 熱門比賽 數據 20秒一次\n *\n * @param subscriberName 訂閱者名稱,用來處理重複訂閱的狀況\n * @param onUpdateCallback 輪詢後數據更新回調 (result) => {} result 為 EventData數組\n * @param uniqueName 用來判斷是否使用同一個輪詢,配置不同名字,可以同時開多個輪詢\n */\n getHotEventsPollingGlobal(subscriberName, onUpdateCallback, uniqueName = '') {\n return this._subscribeGlobalPolling('getBannerDataPolling', subscriberName, onUpdateCallback,{}, uniqueName);\n }\n\n /**\n * 輪詢獲取 熱門比賽 數據 20秒一次\n *\n * @param onUpdateCallback 輪詢後數據更新回調 (result) => {} result 為 EventData數組\n * @param uniqueName 用來判斷是否使用同一個輪詢,配置不同名字,可以同時開多個輪詢\n */\n getHotEventsPolling(onUpdateCallback, uniqueName = '') {\n const dataQuery = () => this.getHotEvents();\n return this._registerPolling('getHotEventsPolling', {}, dataQuery, onUpdateCallback, 20, uniqueName);\n }\n\n\n //數據緩存 有保質期\n _cacheWithExpiration = {}\n //數據緩存清理\n _cacheCleanTimeoutHandler = null\n\n /**\n * 設置緩存數據,保存秒數\n *\n * @param key 唯一key\n * @param data 數據\n * @param expireSeconds 緩存秒數 默認9分(因為10分清理一次)\n */\n _cacheSet(key, data, expireSeconds =9*60) {\n this._cacheWithExpiration[key] = { data, expTime: ((new Date()).getTime() + expireSeconds * 1000), expSec:expireSeconds}\n\n //配置過期清理\n if (!this._cacheCleanTimeoutHandler) {\n const doClean = () => {\n const nowTime = new Date().getTime();\n for(let propName in this._cacheWithExpiration) {\n const info = this._cacheWithExpiration[propName];\n if (nowTime > info.expTime) {\n console.log('=== remove expired cache by timeoutHandler',propName);\n delete this._cacheWithExpiration[propName]\n } else {\n //console.log('=== checked cache but not expire yet by timeoutHandler',propName);\n }\n }\n if (Object.keys(this._cacheWithExpiration).length > 0) {\n this._cacheCleanTimeoutHandler = setTimeout(doClean,10*60*1000); //10分檢查一次\n } else {\n clearTimeout(this._cacheCleanTimeoutHandler);\n this._cacheCleanTimeoutHandler = null;\n }\n }\n\n this._cacheCleanTimeoutHandler = setTimeout(doClean,10*60*1000); //10分檢查一次\n }\n }\n\n /**\n * 獲取緩存數據\n * 注意此操作單純獲取數據,不會延長緩存時間\n *\n * @param key 唯一key\n * @param defaultValue 沒有數據或數據已過期,返回的默認值\n */\n _cacheGet(key, defaultValue= null) {\n //檢查是否存在\n const info = this._cacheWithExpiration[key];\n if (info === undefined) {\n return defaultValue;\n }\n\n //檢查是否過期\n const nowTime = new Date().getTime();\n if (nowTime > info.expTime) {\n delete this._cacheWithExpiration[key]\n console.log('=== remove expired cache by cacheGet',key);\n return defaultValue\n }\n\n return info.data;\n }\n\n //API緩存也加入polling數據緩存機制\n storeInitialCacheToPollingCache(cacheData, type) {\n const uniqueName = '';\n\n if (type === 'count') {\n //處理count\n const cachedResultKeyForCount = 'getSportsPolling' + '_' + uniqueName + '_' + md5(JSON.stringify({}));\n console.log('===set InitialCache data for ', cachedResultKeyForCount);\n this._cacheSet(cachedResultKeyForCount, new PollingResult(cacheData.count), 30); //加速:緩存\n }\n\n if (type === 'event') {\n //處理Events\n const theDayAfterTenDays = moment().add(10, 'days').format('YYYY-MM-DD');\n const theDaytoday = moment().format('YYYY-MM-DD');\n const defaultQuery = {\n SportId: 1 /* 体育类型 不分Vendor 1 都是默認足球 */,\n MarketId: VendorMarkets.TODAY /* 市场类型 */, //默認選 今日(包含滾球)\n SortWay: SortWays.LeagueName /* 排序 */, //默認聯賽排序\n StartDate: theDaytoday /* 开始时间 */,\n EndDate: theDayAfterTenDays /* 结束时间 */\n };\n\n const cachedResultKeyForEvents = 'getEventsPolling' + '_' + uniqueName + '_' + md5(JSON.stringify(defaultQuery));\n console.log('===set InitialCache data for ', cachedResultKeyForEvents);\n this._cacheSet(cachedResultKeyForEvents, new PollingResult(cacheData.list), 9 * 60); //加速:緩存\n }\n }\n\n //全局輪詢數據\n _globalPollingCache = {}\n\n //訂閱全局輪詢\n _subscribeGlobalPolling(funcName, subscriberName, onUpdateCallback, params, uniqueName, keepAlive=false) {\n const pollingKey = funcName + '_' + uniqueName;\n\n let newPolling = false;\n let oldCallbacks = {};\n if (!this._globalPollingCache[pollingKey]) {\n newPolling = true;\n } else {\n //檢查參數是否變化了\n const thisPollingInfo = this._globalPollingCache[pollingKey];\n const thisParaJSON = JSON.stringify(params);\n const currentParaJSON = JSON.stringify(thisPollingInfo.params);\n if (thisParaJSON !== currentParaJSON) {\n //參數變化,需要重起輪詢\n newPolling = true;\n //刪除現有的輪詢\n this.deletePolling(thisPollingInfo.pollingKey);\n //保留原有的回調\n oldCallbacks = {...thisPollingInfo.updateCallBacks}\n }\n }\n\n //不分新舊polling,緩存有數據就用\n const cachedResultKey = funcName + '_' + uniqueName + '_' + md5(JSON.stringify(params));\n const cachedResult = this._cacheGet(cachedResultKey, null);\n if (cachedResult) {\n console.log('===use Cached data for Global:',cachedResultKey);\n //回調通知數據更新\n if (onUpdateCallback) {\n try {\n onUpdateCallback(cachedResult);\n } catch (e) {\n console.log('Global Polling onUpdateCallback error', e);\n }\n }\n }\n\n if (newPolling) {\n console.log('=== new polling of',pollingKey);\n\n this._globalPollingCache[pollingKey] = { pollingKey:null, updateCallBacks:{...oldCallbacks}, params, keepAlive }\n\n const updateCallBackAdapter = (result) => {\n for(let uniqueKey in this._globalPollingCache[pollingKey].updateCallBacks) {\n const thisCallBack = this._globalPollingCache[pollingKey].updateCallBacks[uniqueKey];\n if (thisCallBack) {\n try {\n thisCallBack(result);\n } catch (e) {\n console.log('callback error', e);\n }\n }\n }\n }\n\n this._globalPollingCache[pollingKey].updateCallBacks[subscriberName] = onUpdateCallback; //在開始輪詢前就配置好,這樣首次輪詢才會調用到\n\n const arrayParams = Object.values(params);\n this._globalPollingCache[pollingKey].pollingKey = this[funcName](updateCallBackAdapter,...arrayParams,uniqueName);\n } else {\n console.log('=== old polling of',pollingKey);\n if (keepAlive === true) {\n this._globalPollingCache[pollingKey].keepAlive = true;\n }\n\n this._globalPollingCache[pollingKey].updateCallBacks[subscriberName] = onUpdateCallback;\n }\n\n return {\n pollingKey,\n subscriberName\n }\n }\n //解除訂閱全局輪詢\n _unsubscribeGlobalPolling(globalPollingKey) {\n const {pollingKey,subscriberName} = globalPollingKey;\n if (pollingKey && this._globalPollingCache[pollingKey]) {\n if (subscriberName && this._globalPollingCache[pollingKey].updateCallBacks && this._globalPollingCache[pollingKey].updateCallBacks[subscriberName]) {\n console.log('===_unsubscribeGlobalPolling',pollingKey,subscriberName);\n delete this._globalPollingCache[pollingKey].updateCallBacks[subscriberName];\n }\n\n //沒有訂閱者就把輪詢刪掉\n if (Object.keys(this._globalPollingCache[pollingKey]).length <=0) {\n if (!this._globalPollingCache[pollingKey].keepAlive) { //如果配置keepAlive=true 不會刪除輪詢\n //刪除現有的輪詢\n this.deletePolling(pollingKey);\n delete this._globalPollingCache[pollingKey];\n }\n }\n }\n }\n\n /**\n * API專用 調用輪詢函數,每10分自動清理(重置)\n * 服務端專用,不會返回pollingkey\n *\n * @param pollingFunc 輪詢函數,返回pollingkey\n */\n APIPollingWithAutoClean(pollingFunc) {\n const callWithAutoClean = (pollingKey = null) => {\n if (pollingKey) {\n //console.log('delete polling...');\n this.deletePolling(pollingKey);\n }\n //console.log('start polling...');\n const thisPollingKey = pollingFunc();\n //暫定10分刷新一次\n setTimeout(() => callWithAutoClean(thisPollingKey), 10*60*1000);\n }\n callWithAutoClean();\n }\n\n isAPIServer() {\n return (HostConfig.Config.nodePort || HostConfig.Config.nodeCenterPort) ? true : false;\n }\n}\n","import i18n from '../vendori18n';\n\ni18n.VendorConfigs.TIMEZONE = parseInt(i18n.VendorConfigs.TIMEZONE); //轉為數字型態,修復在緩存API的node環境下會無法正確轉換時區時間的問題\n\nexport const VendorConfigs = i18n.VendorConfigs;\n\n//市場\nexport const VendorMarkets = {\n EARLY:1, //早盘\n TODAY:2, //今天\n RUNNING:3, //滚球\n FAVOURITE: 4, //关注\n OUTRIGHT: 5, //冠军\n}\n\n//市場名稱\nexport const VendorMarketNames = i18n.VendorMarketNames;\n\n//时段\nexport const VendorPeriodName = i18n.VendorPeriodName;\n\n//比賽排序方式\nexport const SortWays = {\n None: 0, //不指定排序\n LeagueName : 1, //聯賽名\n EventTime: 2, //開賽時間 DESC排序\n}\n\n//滾球時間狀態\nexport const RBTimeStatus = {\n NONE: 0, //不适用\n STARTED: 1, //開始\n ONGOING: 2, //进行中\n PAUSED: 3, //暂停\n}\n\n//數據變化類型\nexport const EventChangeType = {\n New: 1, //新增\n Update: 2, //修改\n Delete: 3, //刪除\n Sort: 4, //排序\n}\n\nexport const SelectionChangeType = {\n //New: 1, //新增\n Update: 2, //修改\n //Delete: 3, //刪除\n UnAvailable: 3, //不可用\n}\n\n//特定數據變化類型\nexport const SpecialUpdateType = {\n EventStart: 1, //比賽開始\n HomeGoal: 2, //主場進球\n AwayGoal: 3, //客場進球\n HomeCorner: 4, //主場角球\n AwayCorner: 5, //客場角球\n HomeRedCard: 6, //主場紅牌\n AwayRedCard: 7, //客場紅牌\n LineNew: 8, //增加玩法\n LineDelete: 9, //移除玩法\n OddsUp: 10, //賠率上升\n OddsDown: 11, //賠率下降\n}\n\n//注單類型\nexport const WagerType = {\n SINGLE: 1, //單注\n COMBO: 2, //串關\n}\n\n//盤口\nexport const OddsType = {\n MY: 1, //马来盘\n HK: 2, //香港盘\n EU: 3, //欧洲盘\n ID: 4, //印尼盘\n}\n\n//錯誤處理\nexport const VendorErrorType = {\n Unknown_Error: 99999, //未知錯誤\n VENDOR_Auth_Error: 10010, //認證錯誤 刷新或重新登錄\n VENDOR_Error: 11010, //Vendor系統錯誤\n VENDOR_Maintenance: 11020, //Vendor維護\n VENDOR_Area_Limit: 11030, //Vendor地區限制\n DATA_Error: 12010, //數據錯誤\n BET_Selection_Parlay_Limit: 13010, //Selection(串關)數量超過上限\n BET_Selection_Parlay_Error: 13011, //同一比賽的投注選項不可以同時選\n BET_Info_Error: 13020, //投注內容無效\n BET_Event_Error: 13030, //赛事/盘口已失效,或无法使用\n BET_Selection_Error: 13040, //投注選項無效 //需要查看BetInfoData.Selections.SelectionStatus狀態碼\n BET_Place_Error: 13050, //下注失敗\n BET_Place_Expire: 13051, //等待投注成功-超時\n BET_Place_Updating: 13060, //赔率更新中\n BET_Place_Balance: 13070, //余额不足\n BET_Place_LimitMax: 13080, //投注金额超于限额\n BET_Place_LimitMin: 13090, //投注金额低于最小投注额\n BET_Place_LimitTotal: 13100, //这赛事总投注金额超于限额\n BET_Place_OddChanged: 13110, //赔率已变更\n BET_Place_UpdateInfoRequired: 13111, //請刷新賠率\n BET_Place_NOPARLAY: 13120, //所选赛事不支持连串过关,请选其他赛事\n BET_Place_NO_COMBO_FREE: 13121, //串關獎勵不可和免費投注同時使用\n BET_Place_MONEY: 13130, // 無效投注金額\n BET_Virtual_Disabled: 13140, //虛擬體育未啟用\n CASHOUT_NEWPRICE: 14010, //提前兌現,有新價格\n}\n\nexport const VendorErrorMsg = i18n.VendorErrorMsg;\n\n//投注選項狀態\nexport const SelectionStatusType ={\n NOTSET: 99999, //未定\n EUODDSONLY: 99998, //請使用歐洲盤投注\n NEED3COMBO: 99997, //下注时最少需要选3种组合 (SABA獨有)\n OK: 100, //成功\n ERROR: 350, //獲取投注信息錯誤\n NOTAVIILABLE: 380, //盤口已不可用\n UPDATING: 1001, //賠率更新中(未返回可用投注)\n}\n\nexport const SelectionStatusNames = i18n.SelectionStatusNames;\n\n//提前兌現 狀態\nexport const CashOutStatusType = {\n NOTYET: 0, //未兌現或不可兌現\n DONE: 1, //已兌現\n PROCESS: 2, //進行中\n CANCEL: 3, //取消\n NEWPRICE: 4, //新價格\n FAIL: 5, //失敗\n DECLINE: 6, //拒絕(by用戶)\n}\n","//錯誤處理\nimport {VendorErrorMsg, VendorErrorType} from \"./VendorConsts\";\n\nexport default class VendorError {\n /**\n * @param ErrorType 錯誤類型\n * @param ErrorMsg 錯誤信息\n * @param ErrorInfo 額外提供的錯誤數據\n */\n constructor(\n ErrorType = VendorErrorType.Unknown_Error,\n ErrorMsg = null,\n ErrorInfo = null,\n )\n {\n if (ErrorMsg === null) { //獲取默認的錯誤信息\n ErrorMsg = VendorErrorMsg[ErrorType]\n }\n Object.assign(this, {ErrorType, ErrorMsg, ErrorInfo});\n }\n\n toString() {\n return '[' + this.ErrorType + ']' + this.ErrorMsg;\n }\n\n //原本用error.constructor.name === 'VendorError'\n //在export之後,這個判斷會失效,所以改成加屬性\n isVendorError = true;\n\n static fromIMError(statusCode, statusDesc='') {\n let errorType = VendorErrorType.Unknown_Error;\n switch(statusCode) {\n case 101: //无效时间戳\n case 102: //无效令牌\n case 103: //无效用户名\n case 202: //无效用户名 商户令牌验证 API 没返回任何 用户名\n case 210: //无效商户\n errorType = VendorErrorType.VENDOR_Auth_Error;\n break;\n case 107: //无效开始时间\n case 108: //无效结束时间\n case 305: //无效语言编码\n case 313: //无效体育 ID\n errorType = VendorErrorType.DATA_Error;\n break;\n case 330: //无效赛事类型 ID\n case 331: //无效比赛 ID\n case 332: //无效盘口\n case 333: //无效操作会话\n case 334: //无效赛事 ID\n case 380: //无可选盘口\n errorType = VendorErrorType.BET_Event_Error;\n break;\n case 335: //无效投注类型\n case 336: //无效投注类型 ID\n case 337: //无效投注类型 ID\n case 338: //无效 Marketline ID\n case 339: //无效定位类型\n case 340: //无效连串过关选项\n case 341: //无效投注金额\n case 342: //无效投注类型选项 ID\n case 343: //无效优胜冠军队伍 ID\n case 344: //无效赔率类型\n case 345: //无效让球盘\n case 346: //无效赔率\n case 347: //无效主队得分\n case 348: //无效客队得分\n case 349: //无效投注状态\n case 351: //无效伺服器 IP 地址\n case 352: //无效客户 MAC 地址\n case 353: //无效用户代理\n errorType = VendorErrorType.BET_Info_Error;\n break;\n case 350: //检索投注信息错误(一个或以上的投注350 选项状态是 350 或 380)\n errorType = VendorErrorType.BET_Selection_Error;\n break;\n case 355: //Selection(串關)數量超過上限\n errorType = VendorErrorType.BET_Selection_Parlay_Limit;\n break;\n case 367: //价格ID过期(提前兌現)\n errorType = VendorErrorType.CASHOUT_NEWPRICE;\n break;\n case 364: //无效价格(提前兌現) => 視為系统错误 要求刷新\n case 365: //无效投注单号(提前兌現) => 視為系统错误 要求刷新\n case 366: //无效回购价格(提前兌現) => 視為系统错误 要求刷新\n case 368: //投注不可出售,前一个请求正在处理中(提前兌現) => 視為系统错误 要求刷新\n case 369: //投注单号已售给提前兑现(提前兌現) => 視為系统错误 要求刷新\n case 400: //系统错误\n errorType = VendorErrorType.VENDOR_Error;\n break;\n case 700: //维护\n errorType = VendorErrorType.VENDOR_Maintenance;\n break;\n case 710: //访问地区限制\n case 395: //在地区限制投注??\n errorType = VendorErrorType.VENDOR_Area_Limit;\n break;\n case 1000: //投注错误(没有成功投注)\n case 1135: //比赛日期验证失效\n case 1136: //赛季 ID 验证失效\n case 1141: //此项体育不存在\n case 1554: //無效注單\n case 1102: //会员用户不活跃???\n case 1200: //投注被拒\n errorType = VendorErrorType.BET_Place_Error;\n break;\n case 1001: //赔率更新中\n errorType = VendorErrorType.BET_Place_Updating;\n break;\n case 1103: //余额不足\n errorType = VendorErrorType.BET_Place_Balance;\n break;\n case 1105: //投注金額超過上限\n errorType = VendorErrorType.BET_Place_LimitMax;\n break;\n case 1106: //投注金額低於下限\n errorType = VendorErrorType.BET_Place_LimitMin;\n break;\n case 1107: //賠率已變更\n errorType = VendorErrorType.BET_Place_OddChanged;\n break;\n case 1108: //已達賽事總投注金額上限\n errorType = VendorErrorType.BET_Place_LimitTotal;\n break;\n case 1126: //賽事不支持串關\n errorType = VendorErrorType.BET_Place_NOPARLAY;\n break;\n case 1132: //投注金額無效\n errorType = VendorErrorType.BET_Place_MONEY;\n break;\n case 1556: //虚拟足球未启用\n case 1557: //虚拟篮球未启用\n errorType = VendorErrorType.BET_Virtual_Disabled;\n break;\n }\n\n return new VendorError(errorType,null, {statusCode,statusDesc});\n }\n\n static fromBTIError(statusCode, statusDesc='', errorJSON = {}) {\n let errorType = VendorErrorType.Unknown_Error;\n switch(statusCode) {\n case 401: //Unauthorized\n errorType = VendorErrorType.VENDOR_Auth_Error;\n break;\n case 'undefine1':\n errorType = VendorErrorType.DATA_Error;\n break;\n case 'ValidationError':\n errorType = VendorErrorType.BET_Event_Error;\n break;\n case 'OddsNotMatch':\n case 'PointsNotMatch':\n case 'InvalidComboBonus':\n case 'InvalidComboBonusPercentage':\n case 'BetSelectionMappingIsNotValid':\n case 'RepeatedSelections':\n case 'InvalidBetType':\n case 'IncorrectLinesforBetType':\n case 'IncorectBetType':\n case 'InvalidPotentialReturns':\n case 'SelectionNotFound':\n case 'ComboNotAllowed':\n case 'NotSupportedSelectionType':\n errorType = VendorErrorType.BET_Info_Error;\n break;\n case 'SelectionClosed':\n case 'SelectionSuspended':\n errorType = VendorErrorType.BET_Selection_Error;\n break;\n case 'MaxSelectionsExceeded': //Selection(串關)數量超過上限\n errorType = VendorErrorType.BET_Selection_Parlay_Limit;\n break;\n case 'ServiceNotAvailableException': //系统错误\n errorType = VendorErrorType.VENDOR_Error;\n break;\n case 700: //维护\n errorType = VendorErrorType.VENDOR_Maintenance;\n break;\n case 710: //访问地区限制\n case 395: //在地区限制投注??\n errorType = VendorErrorType.VENDOR_Area_Limit;\n break;\n case 'PurchaseNotAccepted':\n errorType = VendorErrorType.BET_Place_Error;\n break;\n case 'WaitLive': //赔率更新中\n errorType = VendorErrorType.BET_Place_Updating;\n break;\n case 'NotEnoughMoney': //余额不足\n errorType = VendorErrorType.BET_Place_Balance;\n break;\n case 1105: //投注金額超過上限\n errorType = VendorErrorType.BET_Place_LimitMax;\n break;\n case 1106: //投注金額低於下限\n errorType = VendorErrorType.BET_Place_LimitMin;\n break;\n case 1107: //賠率已變更\n errorType = VendorErrorType.BET_Place_OddChanged;\n break;\n case 1108: //已達賽事總投注金額上限\n errorType = VendorErrorType.BET_Place_LimitTotal;\n break;\n case 1126: //賽事不支持串關\n errorType = VendorErrorType.BET_Place_NOPARLAY;\n break;\n case 1132: //投注金額無效\n errorType = VendorErrorType.BET_Place_MONEY;\n break;\n case 1556: //虚拟足球未启用\n case 1557: //虚拟篮球未启用\n errorType = VendorErrorType.BET_Virtual_Disabled;\n break;\n }\n return new VendorError(errorType,null, {statusCode,statusDesc,errorJSON});\n }\n\n static fromSABAError(statusCode, statusDesc='', errorJSON = {}) {\n let errorType = VendorErrorType.Unknown_Error;\n switch(statusCode) {\n case 401: //Unauthorized\n errorType = VendorErrorType.VENDOR_Auth_Error;\n break;\n case 'E001': //Internal Server Error\t服务器发生非预期错误\n case 'E002': //Invalid parameter input\t参数输入无效或不支援\n case 'E003': //ClientIP Is Invalid\t客户ip无效或不支援\n case 'E004': //ClientIP Is Invalid\t客户ip无效或不支援\n case 'E005': //Invalid Accept-Encoding\t无效的編碼压缩格式\n case 'B001': //Failed Execution\t系统执行失败\n case 'B018': //Disabled Bet\t账号无法投注\n case 'B028': //Customer Closed\t会员账号已关闭\n case 'B029': //Parlay MaxBet Less Than MinBet\t串关最大投注额小于最小投注额\n errorType = VendorErrorType.VENDOR_Error;\n break;\n case 'B002': //Customer Not Deposited\t客戶未存款\n case 'B017': //Insufficient balance\t客户余额不足\n errorType = VendorErrorType.BET_Place_Balance;\n break;\n case 'B003': //Duplicated Transaction Id\t厂商交易编号重复\n case 'B004': //Invalidate Vendor Id\t无效的厂商编号\n case 'B023': //Cashout Price Not Found\t未找到实时兑现的价格\n case 'B025': //Cannot Cashout\t票不能进行实时兑现\n case 'B026': //Selling Ticket Not Found\t未找到实时兑现的票\n case 'B027': //Cashout Account Not Found\t客户不能进行实时兑现\n errorType = VendorErrorType.BET_Place_Error;\n break;\n case 'B005': //Event closed or Invalid market ID\t赛事已关闭或无效的market ID\n case 'B024': //Event Closed\t赛事已关闭\n errorType = VendorErrorType.BET_Event_Error;\n break;\n case 'B019': //Transaction Id Not Found\t找不到对应注单编号\n case 'B020': //SportType is Invalid\t无效的运动类型\n errorType = VendorErrorType.BET_Info_Error;\n break;\n case 'B006': //E-Sport Status Changed\t[E-Sport 专用] 赛事状态改变 ( In-Play 和 Starting Soon)\n case 'B007': //Score Changed\t分数已更新\n case 'B008': //Point Changed\t球头已更新\n case 'B009': //Point Expired\t球头已过期\n case 'B012': //Odds Error\t赔率错误\n case 'B015': //Price Closed\t价格关闭且market暂时关闭\n case 'B016': //Market Closed\tmarket已关闭\n errorType = VendorErrorType.BET_Selection_Error;\n break;\n case 'B010': //Odds Changed\t赔率已更新\n errorType = VendorErrorType.BET_Place_OddChanged;\n break;\n case 'B011': //Odds Suspend\t赔率正在调整\n errorType = VendorErrorType.BET_Place_Updating;\n break;\n case 'B013': //Stake Problem\t投注数量超过最大值或低于最小值\n errorType = VendorErrorType.BET_Place_MONEY;\n break;\n case 'B014': //Over Max Bet\t单场赛事的投注数量超过了最大值\n errorType = VendorErrorType.BET_Place_LimitTotal;\n break;\n case 'B021': //Under Parlay Count\t低于最低串关赛事数量\n case 'B022': //Lucky Parlay Error\t串关错误\n case 'B030': //Parlay No Combo Available\t超过最大 payout 请减少串关数量\n case 'B031': //Parlay Exceeds MaxMarkets\t超过最多可串关数量(最多仅支持串 20 场)\n errorType = VendorErrorType.BET_Selection_Parlay_Limit;\n break;\n case 'UM99': //System is under maintenance\t系统正在维护中\n errorType = VendorErrorType.VENDOR_Maintenance;\n break;\n // case 'undefine1':\n // errorType = VendorErrorType.DATA_Error;\n // break;\n // case 710: //访问地区限制\n // case 395: //在地区限制投注??\n // errorType = VendorErrorType.VENDOR_Area_Limit;\n // break;\n // case 1105: //投注金額超過上限\n // errorType = VendorErrorType.BET_Place_LimitMax;\n // break;\n // case 1106: //投注金額低於下限\n // errorType = VendorErrorType.BET_Place_LimitMin;\n // break;\n // case 1126: //賽事不支持串關\n // errorType = VendorErrorType.BET_Place_NOPARLAY;\n // break;\n // case 1556: //虚拟足球未启用\n // case 1557: //虚拟篮球未启用\n // errorType = VendorErrorType.BET_Virtual_Disabled;\n // break;\n }\n return new VendorError(errorType,null, {statusCode,statusDesc,errorJSON});\n }\n}\n","//注單數據\nimport WagerItemData from \"./WagerItemData\";\nimport {\n IMComboTypeNames,\n IMOddsTypeName, IMWagerCancelReasonName, IMWagerCancelStatusName,\n IMWagerConfirmStatusName,\n IMWagerStatusName\n} from \"../im/IMConsts\";\nimport {\n BTIBetTypeNames,\n BTIComboTypeNames,\n BTIPeriodMapping,\n BTIWagerOddsTypeName,\n BTIWagerOddsTypeToNumber,\n BTIWagerStatusName\n} from \"../bti/BTIConsts\";\nimport {VendorConfigs, VendorMarketNames, VendorMarkets, VendorPeriodName, OddsType, CashOutStatusType} from \"./VendorConsts\";\nimport {Decimal} from \"decimal.js\";\nimport moment from \"moment\";\nimport i18n from '../vendori18n';\nimport {\n SABABetTypeNames,\n SABAComboTypeNames,\n SABAOddsTypeName,\n SABAPeriodMapping,\n SABAWagerStatusName\n} from \"../saba/SABAConsts\";\n\nexport default class WagerData {\n /**\n * @param WagerId 注單ID\n * @param CreateTime 投注创建的日期和时间\n * @param SettleDateTime 結算日期時間\n * @param MemberCode 用户名\n * @param BetAmount 会员提交的投注金额\n * @param WinLossAmount 輸贏金額\n * @param ComboBonusWinningsAmount 串關獎勵額外盈利金額\n * @param OddsType 賠率類型\n * @param OddsTypeName 賠率類型中文\n * @param WagerType 注單類型 1單注 2串關\n * @param Platform 投注平台\n * @param WagerStatus 注單狀態 IM 1待定 2確認 3拒絕 4取消 bti是英文\n * @param WagerStatusName 注單狀態中文\n * @param SettleStatus 是否已結算 0未結算 1已結算\n * @param ResettleStatus 是否重新結算 0未重新結算 1有重新結算\n * @param ComboCount 串關 注數\n * @param ComboType 串關類型 各平台返回不同\n * @param ComboTypeName 串關類型中文\n * @param Odds 整單賠率,IM只有單注提供,串關不提供整單賠率\n * @param PotentialPayoutAmount 預估可能派彩金額\n * @param CanCashOut 是否可提前兌現 false/true\n * @param CashOutStatus 提前兌現狀態 0未兌現或不可兌現 1已兌現 2進行中 3取消 4新價格\n * @param CashOutPriceId 提前兌現的價格id\n * @param CashOutPrice 提前兌現價格(可能以此價格兌現)\n * @param CashOutAmount 實際提前兌現金額(提前兌現成功後 才有數據)\n * @param HasComboBonus 有串關額外獎勵\n * @param ComboBonusPercentage 串關獎勵百分比(數字) 已經是百分率 不是小數,加個%一起顯示即可\n * @param OriginPotentialPayoutAmount 未加上串關獎勵的 原始 預估可能派彩金額\n * @param FreeBetAmount 免費投注金額\n * @param WagerItems 投注數據,WagerItemData數組,單筆投注只會有一個,串關會有多個\n */\n constructor(\n WagerId,\n CreateTime,\n SettleDateTime,\n MemberCode,\n BetAmount,\n WinLossAmount,\n ComboBonusWinningsAmount,\n OddsType,\n OddsTypeName,\n WagerType,\n Platform,\n WagerStatus,\n WagerStatusName,\n SettleStatus,\n ResettleStatus,\n ComboCount,\n ComboType,\n ComboTypeName,\n Odds,\n PotentialPayoutAmount,\n CanCashOut,\n CashOutStatus,\n CashOutPriceId,\n CashOutPrice,\n CashOutAmount,\n HasComboBonus = false,\n ComboBonusPercentage = 0,\n OriginPotentialPayoutAmount = 0,\n FreeBetAmount = 0,\n WagerItems = [],\n )\n {\n Object.assign(this, {\n WagerId,\n CreateTime,\n SettleDateTime,\n MemberCode,\n BetAmount,\n WinLossAmount,\n ComboBonusWinningsAmount,\n OddsType,\n OddsTypeName,\n WagerType,\n Platform,\n WagerStatus,\n WagerStatusName,\n SettleStatus,\n ResettleStatus,\n ComboCount,\n ComboType,\n ComboTypeName,\n Odds,\n PotentialPayoutAmount,\n CanCashOut,\n CashOutStatus,\n CashOutPriceId,\n CashOutPrice,\n CashOutAmount,\n HasComboBonus,\n ComboBonusPercentage,\n OriginPotentialPayoutAmount,\n FreeBetAmount,\n WagerItems,\n });\n }\n\n getCreateTimeMoment() {\n return moment(this.CreateTime).utcOffset(VendorConfigs.TIMEZONE);\n }\n\n //從IM數據生成WagerData數據\n static createFromIMSource(item) {\n\n const oddsDeciaml = Decimal.clone({ rounding: 3 }) //無條件捨去, im強迫症 需要兩位小數\n\n let winLossAmount = new oddsDeciaml(item.MemberWinLossAmount).toFixed(2);\n //提前兌現的輸贏要另外算\n if (item.BetTradeStatus == CashOutStatusType.DONE && item.BetTradeBuyBackAmount >0) {\n winLossAmount = new oddsDeciaml(new Decimal(item.BetTradeBuyBackAmount).sub(item.InputtedStakeAmount).toNumber()).toFixed(2);\n }\n\n return new WagerData(\n item.WagerId,\n item.WagerCreationDateTime,\n item.SettlementDateTime,\n item.MemberCode,\n item.InputtedStakeAmount,\n winLossAmount,\n 0, //im沒有串關獎勵\n item.OddsType,\n IMOddsTypeName[item.OddsType],\n item.WagerType,\n item.BettingPlatform,\n item.BetConfirmationStatus,\n IMWagerStatusName[item.BetConfirmationStatus],\n item.BetSettlementStatus,\n item.BetResettled,\n item.NoOfCombination,\n item.ComboSelection,\n IMComboTypeNames[item.ComboSelection],\n item.WagerType === 1 ? (item.WagerItemList && item.WagerItemList[0] ? new oddsDeciaml(item.WagerItemList[0].Odds).toFixed(2) : null) : null, //IM只有單注有賠率,串關沒有\n new oddsDeciaml(item.PotentialPayout).toFixed(2),\n item.CanSell,\n item.BetTradeStatus,\n item.PricingId,\n item.BuyBackPricing,\n item.BetTradeBuyBackAmount,\n false,\n 0,\n 0,\n 0,\n item.WagerItemList.map(witem => {\n\n //獲取賽果 1全場 2上半 3下半\n //默認全部空\n let gameResults = {0: {home:null,away:null,result:''}, 1: {home:null,away:null,result:''},2: {home:null,away:null,result:''},3: {home:null,away:null,result:''}};\n //確認有數據才計算\n if (witem.HomeTeamHTScore !== null && witem.HomeTeamFTScore !== null\n && witem.AwayTeamHTScore !== null && witem.AwayTeamFTScore !== null)\n {\n //全場\n gameResults[1].home = witem.HomeTeamFTScore;\n gameResults[1].away = witem.AwayTeamFTScore;\n gameResults[1].result = gameResults[1].home + ' : ' + gameResults[1].away;\n //上半\n gameResults[2].home = witem.HomeTeamHTScore;\n gameResults[2].away = witem.AwayTeamHTScore;\n gameResults[2].result = gameResults[2].home + ' : ' + gameResults[2].away;\n //下半 = 全場-上半\n gameResults[3].home = witem.HomeTeamFTScore - witem.HomeTeamHTScore;\n gameResults[3].away = witem.AwayTeamFTScore - witem.AwayTeamHTScore;\n gameResults[3].result = gameResults[3].home + ' : ' + gameResults[3].away;\n }\n\n //從EventDatas那邊複製IM處理代碼(數據結構有點不同,做函數比較麻煩,只好複製)\n\n //IM的大/小 改成 大小 和mockup一致\n if (witem.BetTypeName === i18n.BIG_OR_SMALL) {\n witem.BetTypeName = i18n.BIG_SMALL\n }\n\n //處理IM的特殊玩法線名 - 第{goalnr}粒入球球队\n let thisBetTypeName = witem.BetTypeName;\n if (thisBetTypeName.indexOf('{') !== -1 && thisBetTypeName.indexOf('}') !== -1 ) {\n //從下面的selection找能用的替代文字(這到底是什麼神奇結構。。。)\n let childSelectionSpecifiers = []\n //lineItem.WagerSelections.map(s => {\n if (witem.Specifiers && (witem.Specifiers.indexOf('=') !== -1)) {\n if (childSelectionSpecifiers.indexOf(witem.Specifiers) === -1) {\n childSelectionSpecifiers.push(witem.Specifiers);\n }\n }\n //});\n if (childSelectionSpecifiers && childSelectionSpecifiers.length >0) {\n for (let chiildSpecifier of childSelectionSpecifiers) {\n const spec_arr = chiildSpecifier.split('='); //用=切開\n if (spec_arr && spec_arr.length === 2) {\n const replaceTarget = '{' + spec_arr[0] + '}';\n if (thisBetTypeName.indexOf(replaceTarget) !== -1) {\n thisBetTypeName = thisBetTypeName.replace(replaceTarget,spec_arr[1]);\n //console.log('===== LineBetTypeName replace!',lineItem.BetTypeName,thisBetTypeName,chiildSpecifier,lineItem.MarketlineId, item.EventId);\n break;\n }\n }\n }\n }\n }\n\n let thisSelectionName = witem.SelectionName;\n\n //處理IM的特殊投注選項名\n if (witem.Specifiers && (witem.Specifiers.indexOf('=') !== -1)) {\n const spec_arr = witem.Specifiers.split('='); //用=切開\n if (spec_arr && spec_arr.length === 2) {\n if (spec_arr[0] === 'hcp') { //三項讓球,特別處理\n //hcp=0:2\n if (spec_arr[1].indexOf(':') !== -1) {\n const xy_arr = spec_arr[1].split(':'); //後面的數字用:切開\n if (xy_arr && xy_arr.length === 2) {\n const thisx = parseInt(xy_arr[0]);\n const thisy = parseInt(xy_arr[1]);\n //分別取代 x-y 或者 y-x 讓分盤\n if (thisSelectionName.indexOf('{x-y}') !== -1) {\n thisSelectionName = thisSelectionName.replace('{x-y}', thisx - thisy);\n //console.log('===== selectionName replace(x-y)!',selectionItem.SelectionName,thisSelectionName,selectionItem.Specifiers);\n } else if (thisSelectionName.indexOf('{y-x}') !== -1) {\n thisSelectionName = thisSelectionName.replace('{y-x}', thisy - thisx);\n //console.log('===== selectionName replace!(y-x)',selectionItem.SelectionName,thisSelectionName,selectionItem.Specifiers);\n } else {\n //console.log('===== selectionName NOT replace??????',selectionItem.SelectionName,thisSelectionName,selectionItem.Specifiers);\n }\n }\n }\n } else {\n //total=1.5 這種,直接取代\n const replaceTarget ='{' + spec_arr[0] + '}';\n if (thisSelectionName.indexOf(replaceTarget) !== -1) {\n thisSelectionName = thisSelectionName.replace(replaceTarget, spec_arr[1]);\n //console.log('===== selectionName replace!', selectionItem.SelectionName, thisSelectionName, selectionItem.Specifiers);\n } else {\n //console.log('===== selectionName NOT replace??????',selectionItem.SelectionName,thisSelectionName,selectionItem.Specifiers);\n }\n }\n }\n }\n\n //處理讓球和大小的特殊展示方式\n\n let thisHandiCap = witem.Handicap;\n\n //處理讓球\n if (witem.BetTypeId === 1 && thisHandiCap !== null) {\n let thisHandicapDecimal = new Decimal(thisHandiCap);\n if (witem.SelectionId === 1) { //主場\n thisHandicapDecimal = thisHandicapDecimal.mul(-1); //主場先乘-1\n }\n //如果是0.25或0.75,\n if (thisHandicapDecimal.abs().mod(1).eq(0.25) || thisHandicapDecimal.abs().mod(1).eq(0.75)) {\n // 0.75 改成 +0.5/1\n if (thisHandicapDecimal.greaterThan(0)) {\n thisHandiCap = '+' + thisHandicapDecimal.sub(0.25).toNumber() + '/' + thisHandicapDecimal.add(0.25).toNumber();\n }\n // -0.75 改成 -0.5/1 前面統一加負號 記得負數最後用abs消掉負號\n if (thisHandicapDecimal.lessThan(0)) {\n thisHandiCap = '-' + thisHandicapDecimal.add(0.25).abs().toNumber() + '/' + thisHandicapDecimal.sub(0.25).abs().toNumber();\n }\n } else {\n //直接加正負號\n if (thisHandicapDecimal.greaterThan(0)) {\n thisHandiCap = '+' + thisHandicapDecimal.toNumber();\n }\n if (thisHandicapDecimal.lessThan(0)) {\n thisHandiCap = '-' + thisHandicapDecimal.abs().toNumber();\n }\n }\n }\n\n //處理大小\n if (witem.BetTypeId === 2 && thisHandiCap !== null) {\n let thisHandicapDecimal = new Decimal(thisHandiCap);\n //如果是0.25或0.75,\n if (thisHandicapDecimal.abs().mod(1).eq(0.25) || thisHandicapDecimal.abs().mod(1).eq(0.75)) {\n // 0.75 改成 0.5/1\n if (thisHandicapDecimal.greaterThan(0)) {\n thisHandiCap = thisHandicapDecimal.sub(0.25).toNumber() + '/' + thisHandicapDecimal.add(0.25).toNumber();\n }\n }\n }\n\n //判斷投注目標球隊,IM利用selectionName判斷\n let targetTeamId = null;\n let targetTeamName = '';\n if ((witem.HomeTeamName && thisSelectionName.indexOf(witem.HomeTeamName) !== -1) //玩法名包含隊名\n || thisSelectionName === i18n.HOME) //或者玩法名就是一個「主」字\n {\n targetTeamId = witem.HomeTeamId;\n targetTeamName = witem.HomeTeamName;\n } else if ((witem.AwayTeamName && thisSelectionName.indexOf(witem.AwayTeamName) !== -1) //玩法名包含隊名\n || thisSelectionName === i18n.AWAY)//或者玩法名就是一個「客」字\n {\n targetTeamId = witem.HomeTeamId;\n targetTeamName = witem.AwayTeamName;\n }\n\n //注單才有,投注目標改成用OutrightTeamName處理\n if (witem.EventTypeId === 2) {\n targetTeamId = witem.OutrightTeamId;\n targetTeamName = witem.OutrightTeamName;\n }\n\n return new WagerItemData(\n witem.WagerItemConfirmationStatus,\n IMWagerStatusName[witem.WagerItemConfirmationStatus],\n witem.WagerItemConfirmationType,\n IMWagerConfirmStatusName[witem.WagerItemConfirmationType],\n witem.WagerItemCancelType,\n IMWagerCancelStatusName[witem.WagerItemCancelType],\n witem.WagerItemCancelReason,\n IMWagerCancelReasonName[witem.WagerItemCancelReason],\n witem.Market,\n VendorMarketNames[witem.Market],\n witem.EventId,\n witem.EventDateTime,\n witem.SportId,\n witem.CompetitionId,\n witem.CompetitionName,\n witem.SourceId,\n witem.Season,\n witem.MatchDay,\n witem.EventGroupTypeId,\n witem.HomeTeamId,\n witem.HomeTeamName,\n witem.AwayTeamId,\n witem.AwayTeamName,\n witem.BetTypeId,\n thisBetTypeName,\n witem.PeriodId,\n VendorPeriodName[witem.PeriodId],\n witem.BetTypeSelectionId,\n thisSelectionName,\n witem.EventTypeId === 2,\n witem.EventOutrightName,\n witem.OutrightTeamId,\n witem.OutrightTeamName,\n new oddsDeciaml(witem.Odds).toFixed(2),\n thisHandiCap,\n witem.HomeTeamHTScore,\n witem.AwayTeamHTScore,\n witem.HomeTeamFTScore,\n witem.AwayTeamFTScore,\n witem.WagerHomeTeamScore,\n witem.WagerAwayTeamScore,\n gameResults[witem.PeriodId].home,\n gameResults[witem.PeriodId].away,\n gameResults[witem.PeriodId].result,\n witem.GroundTypeId,\n targetTeamId,\n targetTeamName,\n false, //需要另外查\n '',\n '',\n '',\n '',\n )\n })\n )\n }\n\n //從BTI數據生成WagerData數據\n static createFromBTISource(item) {\n\n //串關類型轉中文\n let ComboTypeName = '';\n let ComboType = item.type;\n if (ComboType === 'Combo') {\n const selectionCount = item.numberOfSelections;\n ComboTypeName = (BTIComboTypeNames[ComboType]).replace('N',selectionCount);\n } else if(ComboType.lastIndexOf('System', 0) === 0) {\n const fromIndex = ComboType.indexOf('from');\n const x = ComboType.substr(6,fromIndex-6);\n const y = ComboType.substr(fromIndex+4);\n ComboTypeName = (BTIComboTypeNames['SystemXfromY']).replace('X',x).replace('Y',y);\n } else {\n ComboTypeName = BTIComboTypeNames[ComboType];\n }\n\n //BTI展示盤口類型檢查 (文件有這個字段,但是實際沒返回)\n if (!item.displayOddsStyle) {\n item.displayOddsStyle = 'notset'; //沒有返回配置為空\n\n //嘗試用賠率和金額去判斷盤口\n if (item.displayOdds && (ComboType === 'Single')) { //bti串關不會有displayOdds,下面的selection也不拿來推算盤口\n const thisOdds = new Decimal(item.displayOdds);\n if (thisOdds.isNegative()) {\n if (thisOdds.greaterThanOrEqualTo(-1)) {\n item.displayOddsStyle = 'Malaysian'; //馬來盤,介於0和-1之間 包含-1\n } else if (thisOdds.lessThan(-1)) {\n item.displayOddsStyle = 'Indonesian'; //印尼盤,小於-1\n }\n } else {\n //投注金額*賠率\n const stakeMultifyOdds = new Deciaml(thisOdds.mul(item.totalStake).toDecimalPlaces(2,3).toFixed(2)); //rounding:3 無條件捨去\n if (stakeMultifyOdds.equals(item.amountToWin)) { //香港盤 = 盈利\n item.displayOddsStyle = 'HongKong';\n } else if (stakeMultifyOdds.equals(item.potentialReturns)) {// 歐洲盤 = 本金+盈利\n item.displayOddsStyle = 'Decimal';\n }\n }\n }\n }\n\n //注單數據只有一個 comboBonusPercentage 要自己去反推其他字段(文件有其他字段,但是實際沒返回)\n const hasComboBonus = !!item.comboBonusPercentage;\n //console.log('hasComboBonus',item.comboBonusPercentage,Deciaml.isDecimal(item.comboBonusPercentage));\n const comboBonusMultiplier = hasComboBonus ? new Deciaml(item.comboBonusPercentage).dividedBy(100).add(1) : 1;\n const realDisplayOdds = hasComboBonus ? new Decimal(item.displayOdds).mul(comboBonusMultiplier).toDecimalPlaces(2,3).toFixed(2) : item.displayOdds; //rounding:3 無條件捨去\n const realPotentialReturns = hasComboBonus\n //賠率x串關獎勵(1.xx)x投注金額 = 預期返獎\n ? (\n (item.displayOddsStyle === 'HongKong') //香港盤賠率要加1 本金\n ? new Deciaml(new Decimal(item.displayOdds).add(1).mul(comboBonusMultiplier).mul(item.totalStake).toDecimalPlaces(2,3).toFixed(2)).toNumber() //rounding:3 無條件捨去\n : new Deciaml(new Decimal(item.displayOdds).mul(comboBonusMultiplier).mul(item.totalStake).toDecimalPlaces(2,3).toFixed(2)).toNumber() //rounding:3 無條件捨去\n )\n : item.potentialReturns;\n const comboBonusWinningsAmount = hasComboBonus\n ? (\n (item.status === 'Settled')\n ? item.comboBonusWinningsAmount\n : new Decimal(realPotentialReturns).sub(item.potentialReturns).toDecimalPlaces(2,3).toFixed(2) //未結算使用 含串關獎勵的預計獎金-不含串關獎勵的預計獎金 //rounding:3 無條件捨去\n )\n : 0;\n\n //處理win/lose amount\n let thisWinLoseAmount = 0;\n if (item.returns !== undefined && item.returns !== null) {\n //console.log('======item.returns',item.returns);\n thisWinLoseAmount = new Decimal(new Decimal(item.returns).sub(item.totalStake).toDecimalPlaces(2,3).toFixed(2)).toNumber(); //輸贏= 返還-本金 //rounding:3 無條件捨去\n }\n\n //未結算:BTI提前兌現要另外的api去處理\n let canCashOut = false;\n let cashOutStatus = CashOutStatusType.NOTYET;\n let cashOutPriceId = null;\n let cashOutPrice = null;\n let cashOutAmount = null;\n if (item.status === 'Settled' && item.settlementStatus == 'CashOut') {\n cashOutStatus = CashOutStatusType.DONE;\n cashOutAmount = new Decimal(new Decimal(item.returns).toFixed(2)).toNumber();\n }\n\n return new WagerData(\n item.purchaseId, //BTI注單號改為使用purchaseId\n item.placementDate,\n item.settlementDate,\n null,\n item.totalStake,\n thisWinLoseAmount,\n comboBonusWinningsAmount,\n BTIWagerOddsTypeToNumber[item.displayOddsStyle],\n BTIWagerOddsTypeName[item.displayOddsStyle],\n item.type === 'Single' ? 1 : 2, //注單類型 1單注 2串關\n item.sourceDeviceType,\n item.settlementStatus,\n BTIWagerStatusName[item.settlementStatus],\n item.status === 'Settled' ? 1 : 0, //bti剛好反過來,status實際上是 是否已結算,settlementStatus才是真正的狀態\n 0,\n item.numberOfBets,\n item.type,\n ComboTypeName,\n realDisplayOdds,\n realPotentialReturns,\n canCashOut,\n cashOutStatus,\n cashOutPriceId,\n cashOutPrice,\n cashOutAmount,\n hasComboBonus,\n hasComboBonus ? item.comboBonusPercentage : 0,\n hasComboBonus ? item.potentialReturns : 0,\n item.freeBetAmount ? item.freeBetAmount : 0,\n item.selections.map(witem => {\n\n const isOutRightEvent = (witem.eventType === 'Outright');\n\n //處理市場\n let marketId = VendorMarkets.EARLY;\n if (witem.isLive) {\n marketId = VendorMarkets.RUNNING;\n }\n if (isOutRightEvent) {\n marketId = VendorMarkets.OUTRIGHT;\n }\n\n //處理時間段\n let periodData = {PeriodId: 0, PeriodName : ''}\n const specialBetTypeName = BTIBetTypeNames[witem.marketId];\n if (specialBetTypeName) {\n periodData = BTIPeriodMapping[witem.marketId];\n }\n\n //判斷投注目標球隊\n let targetTeamId = null;\n let targetTeamName = '';\n //bti注單沒有participantMapping,只能用selectionName判斷\n if ((witem.homeTeamName && witem.selectionDisplayName.indexOf(witem.homeTeamName) !== -1) //玩法名包含隊名\n || witem.selectionDisplayName === i18n.HOME) //或者玩法名就是一個「主」字\n {\n targetTeamId = null;\n targetTeamName = witem.homeTeamName;\n } else if ((witem.awayTeamName && witem.selectionDisplayName.indexOf(witem.awayTeamName) !== -1) //玩法名包含隊名\n || witem.selectionDisplayName === i18n.AWAY)//或者玩法名就是一個「客」字\n {\n targetTeamId = null;\n targetTeamName = witem.awayTeamName;\n }\n\n return new WagerItemData(\n witem.settlementStatus,\n BTIWagerStatusName[item.settlementStatus],\n null,\n null,\n item.settlementStatus === 'Cancelled' ? 2 : 1,\n item.settlementStatus === 'Cancelled' ? i18n.BTI.CANCELLED : i18n.BTI.NOT_CANCELLED,\n null,\n null,\n marketId,\n VendorMarketNames[marketId],\n witem.eventId,\n witem.startEventDate,\n parseInt(witem.sportId),\n witem.leagueId,\n witem.leagueName,\n null,\n null,\n null,\n null,\n null,\n witem.homeTeamName,\n null,\n witem.awayTeamName,\n witem.marketId,\n witem.marketDisplayName,\n periodData.PeriodId,\n periodData.PeriodName,\n witem.selectionId,\n witem.selectionDisplayName,\n isOutRightEvent,\n isOutRightEvent ? witem.eventDisplayName : null,\n null,\n null,\n witem.displayOdds,\n witem.points,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n witem.gameScore,\n null,\n targetTeamId,\n targetTeamName,\n false, //需要另外查\n '',\n '',\n '',\n '',\n )\n }),\n )\n }\n\n //從SABA數據生成WagerData數據\n static createFromSABASource(item) {\n\n const isComboBet = !!item.comboType;\n\n //串關類型轉中文\n //9-Folds (10 Bets)\n //Trebles (4 Bets)\n //Yankee (11 Bets)\n\n //後面串關類型改成返回中文了\n //二串一 (3 个注单)\n\n let thisComboTypeName = '';\n let thisComboCount = 0;\n if (isComboBet) {\n //找出第一個(\n const firstParentheses = item.comboType.indexOf('(');\n if (firstParentheses !== -1) {\n let comboInfoArr = item.comboType.split('('); //切開\n let thisComboType = comboInfoArr[0].trim();\n\n // //處理寫死\n // if (thisComboType === 'Double') {\n // thisComboType = 'Doubles';\n // } else if (thisComboType === 'Treble') {\n // thisComboType = 'Trebles';\n // }\n //\n // //處理 N-Folds 轉成 Fold{N}\n // if (thisComboType.indexOf('-') !== -1) {\n // let foldNumber = thisComboType.split('-')[0];\n // thisComboType = 'Fold' + foldNumber;\n // thisComboTypeName = SABAComboTypeNames[thisComboType];\n // //處理N > 8\n // if (!thisComboTypeName) {\n // let nName = SABAComboTypeNames['FoldN'];\n // thisComboTypeName = nName.replace('N', foldNumber);\n // }\n // } else {\n // thisComboTypeName = SABAComboTypeNames[thisComboType];\n // }\n // if (!thisComboTypeName) {\n // thisComboTypeName = 'unknown';\n // }\n\n thisComboTypeName = thisComboType;\n thisComboCount = comboInfoArr[1].split(' ')[0] //空白後切開 就是注數\n }\n }\n\n if (isComboBet && item.isLucky) {\n thisComboTypeName = thisComboTypeName + ' (' + i18n.SABA.ISLUCKY + ')'\n }\n\n let wagerItems = [];\n if (isComboBet && item.parlayInfo) {\n wagerItems = item.parlayInfo;\n } else {\n wagerItems = [\n item\n ]\n }\n\n //SABA要自己計算 預計贏取金額\n //只有單投需要處理 因為串投是歐洲盤,只要乘賠率就可以\n let EstimatedPayoutRate = item.price; //默認用賠率直接乘\n if(!isComboBet) {\n const isOutRightEvent = (wagerItems[0].betType == 10);\n if (!isOutRightEvent //猜冠軍固定歐洲盤,不用計算\n && item.oddsType != OddsType.EU //本身就是歐洲盤 也不用算\n ) {\n //香港盤不含本金 歐洲盤含本金\n //当香港盘赔率<=1时,马来盘赔率=香港盘赔率\n //当香港盘赔率>1时,马来盘赔率=-1/香港盘赔率\n //当香港盘赔率<1时,印尼盘赔率=-1/香港盘赔率\n //当香港盘赔率>=1时,印尼盘赔率=香港盘赔率\n\n const thisOdds = new Decimal(item.price);\n EstimatedPayoutRate = thisOdds.abs().add(1).toNumber(); //不管是不是負數盤,都這是這樣算,加一個本金\n //(負數盤是要多算一個 實際投注金額 但是saba官方投注記錄也沒有列上,所以不處理,賭狗應該都會懂)\n }\n }\n\n return new WagerData(\n item.transId,\n item.transTime + 'Z', //有T無Z 補上 成為UTC時間\n item.transTime + 'Z', //有T無Z 補上 成為UTC時間\n item.memberId,\n item.stake,\n new Decimal(item.settlementPrice).toFixed(2),\n 0,\n item.oddsType,\n SABAOddsTypeName[item.oddsType],\n (item.comboType !== undefined && item.comboType !== null) ? 2 : 1, //注單類型 1單注 2串關\n null,\n item.status, //注单状态 half won / half lose / won / lose / void / running / draw / reject / refund / waiting\n SABAWagerStatusName[item.status],\n ['running','waiting'].indexOf(item.status) === -1 ? 1 : 0,\n item.resettlesInfo ? 1 : 0,\n thisComboCount,\n item.comboType,\n thisComboTypeName,\n item.price,\n new Decimal(EstimatedPayoutRate).mul(item.stake).toFixed(2),\n item.cashoutEnabled,\n item.alreadyCashout ? CashOutStatusType.DONE : CashOutStatusType.NOTYET,\n null,\n item.alreadyCashout ? item.cashoutPrice : null,\n item.alreadyCashout ? item.cashoutPrice : null,\n false,\n 0,\n 0,\n 0,\n wagerItems.map(witem => {\n\n const isOutRightEvent = (witem.betType == 10);\n\n //市場無法判斷 不處理\n\n //處理特殊玩法 名稱統一(讓分 大小)\n let thisBetTypeName = witem.betTypeName;\n let periodData = {PeriodId: 0, PeriodName : ''}\n const specialBetTypeName = SABABetTypeNames[witem.betType];\n if (specialBetTypeName) {\n thisBetTypeName = specialBetTypeName;\n periodData = SABAPeriodMapping[witem.betType];\n }\n\n //判斷投注目標球隊,SABA利用selectionName判斷\n let targetTeamId = null;\n let targetTeamName = '';\n if ((witem.homeTeamName && witem.keyName.indexOf(witem.homeTeamName) !== -1) //玩法名包含隊名\n || witem.keyName === i18n.HOME //或者玩法名就是一個「主」字\n || witem.key == 'h' //或者玩法Key = home\n ) {\n targetTeamId = witem.homeTeamId;\n targetTeamName = witem.homeTeamName;\n } else if ((witem.awayTeamName && witem.keyName.indexOf(witem.awayTeamName) !== -1) //玩法名包含隊名\n || witem.keyName === i18n.AWAY //或者玩法名就是一個「客」字\n || witem.key == 'a' //或者玩法Key = away\n ) {\n targetTeamId = witem.awayTeamId;\n targetTeamName = witem.awayTeamName;\n }\n\n\n return new WagerItemData(\n witem.status,\n SABAWagerStatusName[witem.status],\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n witem.eventId,\n witem.kickOffTime,\n parseInt(witem.sportType),\n witem.leagueId,\n witem.leagueName,\n null,\n null,\n null,\n null,\n witem.homeTeamId,\n witem.homeTeamName,\n witem.awayTeamId,\n witem.awayTeamName,\n witem.betType,\n thisBetTypeName,\n periodData.PeriodId,\n periodData.PeriodName,\n witem.key,\n witem.keyName,\n isOutRightEvent,\n isOutRightEvent ? witem.leagueName : null,\n null,\n null,\n witem.price,\n witem.point,\n null,\n null,\n null,\n null,\n witem.homeScore,\n witem.awayScore,\n null,\n null,\n null,\n null,\n targetTeamId,\n targetTeamName,\n false, //和bti一樣,另外查\n '',\n '',\n '',\n '',\n isComboBet ? false : witem.isLucky, //只有 幸運串關 生成的單注(實際注單也看起來像單注) 才要展示IsLucky\n )\n }),\n )\n }\n\n static clone(srcData) {\n return new WagerData(\n srcData.WagerId,\n srcData.CreateTime,\n srcData.SettleDateTime,\n srcData.MemberCode,\n srcData.BetAmount,\n srcData.WinLossAmount,\n srcData.ComboBonusWinningsAmount,\n srcData.OddsType,\n srcData.OddsTypeName,\n srcData.WagerType,\n srcData.Platform,\n srcData.WagerStatus,\n srcData.WagerStatusName,\n srcData.SettleStatus,\n srcData.ResettleStatus,\n srcData.ComboCount,\n srcData.ComboType,\n srcData.ComboTypeName,\n srcData.Odds,\n srcData.PotentialPayoutAmount,\n srcData.CanCashOut,\n srcData.CashOutStatus,\n srcData.CashOutPriceId,\n srcData.CashOutPrice,\n srcData.CashOutAmount,\n srcData.HasComboBonus,\n srcData.ComboBonusPercentage,\n srcData.OriginPotentialPayoutAmount,\n srcData.FreeBetAmount,\n srcData.WagerItems ? srcData.WagerItems.map(item => WagerItemData.clone(item)) : [],\n )\n }\n}\n","//單個投注數據\nimport moment from \"moment\";\nimport {VendorConfigs} from \"./VendorConsts\";\nimport i18n from '../vendori18n';\n\nexport default class WagerItemData {\n /**\n * @param WagerStatus 注單狀態 IM 1待定 2確認 3拒絕 4取消 bti是英文\n * @param WagerStatusName 注單狀態中文\n * @param ConfirmStatus 確認狀態 IM 0未確認 1普通確認 2危險球確認 bti無\n * @param ConfirmStatusName 確認狀態中文\n * @param CancelStatus 取消狀態 IM 1未取消 2注單取消 3比賽取消 bti 1未取消 2已取消\n * @param CancelStatusName 取消狀態中文\n * @param CancelReason 取消原因 IM 0無原因 1危險紅牌 2危險進球 101賽事終止 bti無\n * @param CancelReasonName 取消原因中文\n * @param MarketId 市場ID\n * @param MarketName 市場中文\n * @param EventId 比賽id\n * @param EventDate 比赛時間\n * @param SportId 體育ID\n * @param LeagueId 聯賽id\n * @param LeagueName 聯賽名\n * @param SourceId 比赛外部參考ID?\n * @param Season 賽日指標,用於虛擬體育\n * @param MatchDay 賽事指標,用於虛擬體育\n * @param EventGroupTypeId 比賽分組類型,用途不明\n * @param HomeTeamId 主場球隊id\n * @param HomeTeamName 主場球隊名\n * @param AwayTeamId 客場球隊id\n * @param AwayTeamName 客場球隊名\n * @param BetTypeId 投注類型ID\n * @param BetTypeName 投注類型名\n * @param PeriodId 比赛时段 ID 1全場 2上半 3下半\n * @param PeriodName 比赛时段中文\n * @param SelectionType 投注選項類型\n * @param SelectionName 投注選項類型名\n * @param IsOutRightEvent 是否為優勝冠軍賽事\n * @param OutRightEventName 優勝冠軍賽事名\n * @param OutrightTeamId 优胜冠军类型 ID. (只适用于优胜冠军,如果定时赛事会是0)\n * @param OutrightTeamName 优胜冠军名称 (只适用于优胜冠军赛事,如果定时赛事会 是0)\n * @param Odds 賠率\n * @param Handicap 讓球和大小盤數據\n * @param HomeTeamHTScore 主隊上半場得分, bti無\n * @param AwayTeamHTScore 客隊上半場得分, bti無\n * @param HomeTeamFTScore 主隊全場得分, bti無\n * @param AwayTeamFTScore 客隊全場得分, bti無\n * @param HomeTeamScoreWhenBet 投注時主隊得分, bti無\n * @param AwayTeamScoreWhenBet 投注時客隊得分, bti無\n * @param HomeTeamResult 主隊賽果 IM 由PeriodId 比赛时段決定, bti無\n * @param AwayTeamResult 客隊賽果 IM 由PeriodId 比赛时段決定, bti無\n * @param GameResult 賽果 字符串型態 IM 由PeriodId 比赛时段決定, bti返回內容不定\n * @param GroundTypeId 主場狀態 0在中立場比賽 1在主場比賽\n * @param TargetTeamId 投注目標球隊id, 用於判斷展示格式\n * @param TargetTeamName 投注目標球隊名, 用於判斷展示格式\n * @param IsRB 是否比賽進行(滾球)中\n * @param RBMinute 滾球分鐘(開始到現在比賽進行了幾分鐘)\n * @param RBPeriodName 滾球時間段(中文)\n * @param RBHomeScore 滾球主場得分\n * @param RBAwayScore 滾球客場得分\n * @param IsLucky 是否幸運選擇 SABA串關專用\n * 額外提供 LineDesc 投注線描述,用於投注購物車展示\n * 額外提供 SelectionDesc 投注選項描述,用於投注購物車展示\n */\n constructor(\n WagerStatus,\n WagerStatusName,\n ConfirmStatus,\n ConfirmStatusName,\n CancelStatus,\n CancelStatusName,\n CancelReason,\n CancelReasonName,\n MarketId,\n MarketName,\n EventId,\n EventDate,\n SportId,\n LeagueId,\n LeagueName,\n SourceId,\n Season,\n MatchDay,\n EventGroupTypeId,\n HomeTeamId,\n HomeTeamName,\n AwayTeamId,\n AwayTeamName,\n BetTypeId,\n BetTypeName,\n PeriodId,\n PeriodName,\n SelectionType,\n SelectionName,\n IsOutRightEvent,\n OutRightEventName,\n OutrightTeamId,\n OutrightTeamName,\n Odds,\n Handicap,\n HomeTeamHTScore,\n AwayTeamHTScore,\n HomeTeamFTScore,\n AwayTeamFTScore,\n HomeTeamScoreWhenBet,\n AwayTeamScoreWhenBet,\n HomeTeamResult,\n AwayTeamResult,\n GameResult,\n GroundTypeId,\n TargetTeamId,\n TargetTeamName,\n IsRB,\n RBMinute,\n RBPeriodName,\n RBHomeScore,\n RBAwayScore,\n IsLucky = false,\n )\n {\n Object.assign(this, {\n WagerStatus,\n WagerStatusName,\n ConfirmStatus,\n ConfirmStatusName,\n CancelStatus,\n CancelStatusName,\n CancelReason,\n CancelReasonName,\n MarketId,\n MarketName,\n EventId,\n EventDate,\n SportId,\n LeagueId,\n LeagueName,\n SourceId,\n Season,\n MatchDay,\n EventGroupTypeId,\n HomeTeamId,\n HomeTeamName,\n AwayTeamId,\n AwayTeamName,\n BetTypeId,\n BetTypeName,\n PeriodId,\n PeriodName,\n SelectionType,\n SelectionName,\n IsOutRightEvent,\n OutRightEventName,\n OutrightTeamId,\n OutrightTeamName,\n Odds,\n Handicap,\n HomeTeamHTScore,\n AwayTeamHTScore,\n HomeTeamFTScore,\n AwayTeamFTScore,\n HomeTeamScoreWhenBet,\n AwayTeamScoreWhenBet,\n HomeTeamResult,\n AwayTeamResult,\n GameResult,\n GroundTypeId,\n TargetTeamId,\n TargetTeamName,\n IsRB,\n RBMinute,\n RBPeriodName,\n RBHomeScore,\n RBAwayScore,\n IsLucky,\n });\n\n //投注購物車展示 投注線\n let periodDesc = !this.IsOutRightEvent ? this.PeriodName : '';\n //如果 BetTypeName 原本開頭就帶有 PeriodName 就不用PeriodName (for im重複PeriodName)\n //例子: BetTypeName = '下半場 讓球' PeriodName = '下半場'\n if (periodDesc && periodDesc.length > 0\n && this.BetTypeName.indexOf(periodDesc) === 0) {\n periodDesc = '';\n }\n\n this.LineDesc = (this.MarketName ? (this.MarketName + ' ') : '') + ((!this.IsOutRightEvent && periodDesc.length > 0) ? (' ' + periodDesc) : '') + ' ' + this.BetTypeName;\n\n if (this.IsLucky) {\n this.LineDesc = this.LineDesc + ' (' + i18n.SABA.ISLUCKY + ')';\n }\n\n //投注購物車展示 投注選項 默認 玩法名 + 目標數字\n let handicapTail = (this.Handicap !== null && this.Handicap !== undefined && !this.IsOutRightEvent) ? (' ' + this.Handicap) : '';\n\n //處理bti正數額外有+號的情況\n let handicapTailWithPostive = (this.Handicap !== null && this.Handicap !== undefined && !this.IsOutRightEvent) ? (' +' + this.Handicap) : '';\n //如果SelectionName原本就帶有 hadicapTail 就不用加上去(for bti重複handicap)\n if (handicapTail && handicapTail.length > 0\n && (\n this.SelectionName.indexOf(handicapTail, this.SelectionName.length - handicapTail.length) !== -1\n || this.SelectionName.indexOf(handicapTailWithPostive, this.SelectionName.length - handicapTailWithPostive.length) !== -1\n )\n ){\n handicapTail = '';\n }\n\n let selectionDesc = this.SelectionName + handicapTail;\n if (this.TargetTeamName !== '' //有目標隊伍數據\n && this.SelectionName.indexOf(this.TargetTeamName) === -1) { //且玩法名沒有包含 目標隊伍\n selectionDesc = this.TargetTeamName + ' ' + this.SelectionName + handicapTail;\n }\n this.SelectionDesc = selectionDesc;\n }\n\n getEventDateMoment() {\n return moment(this.EventDate).utcOffset(VendorConfigs.TIMEZONE);\n }\n\n static clone(srcData) {\n return new WagerItemData(\n srcData.WagerStatus,\n srcData.WagerStatusName,\n srcData.ConfirmStatus,\n srcData.ConfirmStatusName,\n srcData.CancelStatus,\n srcData.CancelStatusName,\n srcData.CancelReason,\n srcData.CancelReasonName,\n srcData.MarketId,\n srcData.MarketName,\n srcData.EventId,\n srcData.EventDate,\n srcData.SportId,\n srcData.LeagueId,\n srcData.LeagueName,\n srcData.SourceId,\n srcData.Season,\n srcData.MatchDay,\n srcData.EventGroupTypeId,\n srcData.HomeTeamId,\n srcData.HomeTeamName,\n srcData.AwayTeamId,\n srcData.AwayTeamName,\n srcData.BetTypeId,\n srcData.BetTypeName,\n srcData.PeriodId,\n srcData.PeriodName,\n srcData.SelectionType,\n srcData.SelectionName,\n srcData.IsOutRightEvent,\n srcData.OutRightEventName,\n srcData.OutrightTeamId,\n srcData.OutrightTeamName,\n srcData.Odds,\n srcData.Handicap,\n srcData.HomeTeamHTScore,\n srcData.AwayTeamHTScore,\n srcData.HomeTeamFTScore,\n srcData.AwayTeamFTScore,\n srcData.HomeTeamScoreWhenBet,\n srcData.AwayTeamScoreWhenBet,\n srcData.HomeTeamResult,\n srcData.AwayTeamResult,\n srcData.GameResult,\n srcData.GroundTypeId,\n srcData.TargetTeamId,\n srcData.TargetTeamName,\n srcData.IsRB,\n srcData.RBMinute,\n srcData.RBPeriodName,\n srcData.RBHomeScore,\n srcData.RBAwayScore,\n srcData.IsLucky\n )\n }\n}\n","import i18n from '../vendori18n';\n\n//接口状态码 只需要判斷這兩個,剩下的轉移到 VendorError去處理\nexport const IMAPIStatus = {\n OK: 100, //成功\n DeltaExpire: 600, //delta過期\n}\n\n//體育項目\nexport const IMSports = {\n SOCCER: 1, //足球\n BASKETBALL: 2, //篮球\n TENNIS: 3, //网球\n ATHLETICS: 6, //田径\n BADMINTON: 7, //羽毛球\n BASEBALL: 8, //棒球\n BOXING: 11, //拳击\n DARTS: 15, //飞镖\n LAWNHOCKEY: 18, //草地曲棍球\n FOOTBALL: 19, //美式足球\n GOLF: 21, //高尔夫球\n HANDBALL: 23, //手球\n ICEHOCKEY: 25, //冰上曲棍球\n MOTOR: 29, //赛车运动\n RUGBY: 31, //橄榄球\n SAILING: 32, //帆船\n SNOOKER: 34, //斯诺克 / 英式台球, 包括亚洲 9 球和台球\n TABLETENNIS: 36, //乒乓球\n VIRTUALSOCCER: 39, //虚拟足球\n VOLLEYBALL: 40, //排球, 包括沙滩排球\n WATERPOLO: 41, //水球\n VIRTUALBASKETBALL: 43, //虚拟篮球\n VIRTUALWORLDCUP: 44, //虚拟世界杯\n ENTERTAINMENTBETTING: 45, //娱乐投注\n VIRTUALNATIONALCUP: 46, //虚拟国家杯\n ALLEXCEPTSOCCER: -1, //所有非足球体育 (只应用于索取赛事信息)\n ALL: 98, //所有体育项目(只应用于Search,GetMArketEventCount)\n}\n\n//時段\nexport const IMPeriodType = {\n FH: 1, //全场\n H1: 2, //上半场\n H2: 3, //下半场\n}\n\n//玩法\nexport const IMBetType = {\n HANDICAP: 1, //让球\n OVERUNDER: 2, //大/小\n ONEXTWO: 3, //1 x 2獨贏\n ODDEVEN: 5, //单 / 双\n SCORE: 6, //波胆\n TOTALGOAL: 7, //总进球\n DCHANCE: 8, //双重机会\n}\n\nexport const IMLineGroupNames = i18n.IM.IMLineGroupNames;\n\n//盤口\nexport const IMOddsType = {\n MY: 1, //马来盘\n HK: 2, //香港盘\n EU: 3, //欧洲盘\n ID: 4, //印尼盘\n}\n\nexport const IMOddsTypeName = i18n.IM.IMOddsTypeName;\n\n//翻譯類型\nexport const IMLocalizationType = {\n ALL: 50, //所有\n COMPETITION: 51, //竞赛名称\n OUTRIGHT: 52, //优胜冠军名称\n TEAM: 53, //队名包含优胜冠军队名\n BETTYPE: 54, //投注类型名称\n BETSELECTION: 55, //投注选项类型名称\n CANCELREASON: 56, //取消提前兑现原因\n PROGRAM: 57, //程序\n}\n\n//賽事類型\nexport const IMEventType = {\n FIXTURE: 1, //定时赛事\n OUTRIGHT: 2, //优胜冠军\n}\n//賽事狀態\nexport const IMEventStatus = {\n OPEN: 1, //開盤\n CLOSE: 2, //關盤\n}\n\n//主場狀態\nexport const IMGroundType = {\n NEUTRAL: 0, //中立場\n HOME: 1, //主場\n}\n\n//是否有直播\nexport const IMHasLive = {\n NO: 0, //沒直播\n YES: 1, //有直播\n}\n\n//數據變更狀態\nexport const IMDeltaAction = {\n INSERTUPDATE: 0, //新增或修改\n DELETE: 1, //刪除\n}\n\n//注單狀態\nexport const IMWagerStatus = {\n PENDING: 1, //待处理\n CONFIRMED: 2, //已确认\n REJECTED: 3, //已拒绝 (危险球取消)\n CANCELLED: 4, //已取消\n}\n\nexport const IMWagerStatusName = i18n.IM.IMWagerStatusName;\n\n//注單確認狀態\nexport const IMWagerConfirmStatus = {\n NOT: 0, //未确认\n NORMAL: 1, //普通确认\n DANGER: 2, //危险确认\n}\n\nexport const IMWagerConfirmStatusName = i18n.IM.IMWagerConfirmStatusName;\n\n//注單取消狀態\nexport const IMWagerCancelStatus = {\n NOT: 1, //未取消\n WAGER: 2, //注单取消\n EVENT: 3, //赛事取消\n}\n\nexport const IMWagerCancelStatusName = i18n.IM.IMWagerCancelStatusName;\n\n//注單取消原因\nexport const IMWagerCancelReason = {\n NO: 0, //无原因\n REDCARD: 1, //危险红牌\n GOAL: 2, //危险进球\n ABANDONED: 101 //赛事终止\n}\n\nexport const IMWagerCancelReasonName = i18n.IM.IMWagerCancelReasonName;\n\n//已結算注單排序方式\nexport const IMWagerSortWay = {\n EVENTDATE: 1, //賽事時間\n BETDATE: 2, //下注時間\n}\n\n//串關中文名\nexport const IMComboTypeNames = i18n.IM.IMComboTypeNames;\n\n//滚球时段中文名\nexport const IMRBPeriodNames = i18n.IM.IMRBPeriodNames;\n\n//特殊投注比賽分組名\nexport const IMEventGroupTypeNames = i18n.IM.IMEventGroupTypeNames;","import i18n from '../vendori18n';\n\n//數據名\nexport const SABADataTypes = {\n SPORTS: 'GetSports',\n LEAGUES: 'GetLeagues',\n EVNETS: 'GetEvents',\n MARKETS: 'GetMarkets',\n OUTRIGHTS: 'GetOutrights',\n PROMOS: 'GetPromotions',\n STREAMING: 'GetStreaming',\n SINGLETICKET : 'GetSingleTicket',\n PARLAYTICKETS :'GetParlayTickets',\n OUTRIGHTTICKET :'GetOutrightTicket',\n PLACEBET: 'PlaceBet',\n PLACEPARLAYBETS: 'PlaceParlayBet',\n PLACEOUTRIGHTBETS: 'PlaceOutrightBet',\n CHECKPLACEBET: 'CheckPlaceBet',\n CHECKWAITINGTICKETSTATUS: 'CheckWaitingTicketStatus',\n BETDETAILS: 'GetBetDetails',\n CASHOUTPRICE: 'GetCashoutPrice',\n SELLBACK: 'SellBack',\n CHECKSELLINGSTATUS: 'CheckSellingStatus',\n CONFIRMSELLINGRESULT: 'ConfirmSellingResult',\n}\n\n//體育項目\nexport const SABASports = {\n SOCCER: 1, //足球\n BASKETBALL: 2, //篮球\n FOOTBALL: 3, //美式足球\n ICEHOCKEY: 4, //冰上曲棍球\n TENNIS: 5, //网球\n VOLLEYBALL: 6, //排球\n BILLIARDS: 7, //台球\n BASEBALL: 8, //棒球\n BADMINTON: 9, //羽毛球\n GOLF: 10, //高尔夫球\n MOTORSPORTS: 11, //赛车运动\n SWIMMING: 12, //游泳\n POLITICS: 13, //政治\n WATERPOLO: 14, //水球\n DIVING: 15, //潛水\n BOXING: 16, //拳击\n ARCHERY: 17, //射箭\n TABLETENNIS: 18, //乒乓球\n WEIGHTLIFTING: 19, //舉重\n CANOEING: 20, //皮划艇\n GYMNASTICS: 21, //體操\n ATHLETICS: 22, //田径\n EQUESTRIAN: 23, //馬術\n HANDBALL: 24, //手球\n DARTS: 25, //飞镖\n RUGBY: 26, //英式橄榄球\n FIELDHOCKEY: 28, //曲棍球\n WINTERSPORT: 29, //冬季比賽\n SQUASH: 30, //壁球\n ENTERTAINMENT: 31, //娛樂\n NETBALL: 32, //籃網球,英式籃球\n CYCLING: 33, //自行車\n FENCING: 34, //击剑\n JUDO: 35, //柔道\n MPENTATHLON: 36, //现代五项比赛\n ROWING: 37, //赛艇\n SAILING: 38, //帆船\n SHOOTING: 39, //射擊\n TAEKWONDO: 40, //跆拳道\n TRIATHLON: 41, //铁人三项\n WRESTLING: 42, //摔跤\n ESPORTS: 43, //電競?\n MUAYTHAI: 44, //泰拳\n BEACHVOLLEYBALL: 45, //沙滩排球\n CRICKET: 50, //板球\n FINANCE: 55, //商業\n OTHERS: 99, //其他\n}\n\n//滚球时段中文名\nexport const SABARBPeriodNames = i18n.SABA.SABARBPeriodNames;\n\nexport const SABALineGroupNames = i18n.SABA.SABALineGroupNames;\n\n//轉換主要玩法線名稱,和IM一致\nexport const SABABetTypeNames = i18n.SABA.SABABetTypeNames;\n\n//1 7 17 讓球_全上下 3 8 18大小_全上下\n//1全場 2上半場 3下半場\nexport const SABAPeriodMapping = {\n '1': {PeriodId: 1, PeriodName: i18n.VendorPeriodName[\"1\"]},\n '7': {PeriodId: 2, PeriodName: i18n.VendorPeriodName[\"2\"]},\n '17': {PeriodId: 3, PeriodName: i18n.VendorPeriodName[\"3\"]},\n '3': {PeriodId: 1, PeriodName: i18n.VendorPeriodName[\"1\"]},\n '8': {PeriodId: 2, PeriodName: i18n.VendorPeriodName[\"2\"]},\n '18': {PeriodId: 3, PeriodName: i18n.VendorPeriodName[\"3\"]},\n}\n\n//轉為數字型態(和IM統一數據結構)\nexport const SABAOddsTypeToNumber = {\n malayPrice : 1, //马来盘\n hongKongPrice: 2, //香港盘\n decimalPrice: 3, //欧洲盘\n indoPrice: 4, //印尼盘\n //americanPrice //美國盤 不使用\n //parlayPrice //串關賠率 不使用\n}\n\n//盤口(查詢用)\nexport const SABAOddsType = {\n MY: 'malayPrice', //马来盘\n HK: 'hongKongPrice', //香港盘\n EU: 'decimalPrice', //欧洲盘\n ID: 'indoPrice', //印尼盘\n}\n\n//串關中文名\nexport const SABAComboTypeNames = i18n.SABA.SABAComboTypeNames;\n\n//投注變化接受程度\nexport const SABAAcceptMode = {\n NONE: 0, //不接受\n HIGHER: 1, //只接受更高\n ANY: 2, //全接受\n}\n\n//注單返回的 oddsType 轉中文\nexport const SABAOddsTypeName = i18n.SABA.SABAOddsTypeName;\n\n//注單狀態中文,對應 bti的 settlementStatus 字段\nexport const SABAWagerStatusName = i18n.SABA.SABAWagerStatusName;\n\n","/*\n* vendor設置,單獨分離 token,語言等 環境配置\n*\n* 在各產品/語言端,視實際狀況修改\n*/\n\n//默認用戶配置,用於VendorBase\nexport const defaultMemberSetting = {\n amount1: 99999,\n amount2: 1000,\n amount3: 100,\n oddsType: 'HK',\n alwaysAcceptBetterOdds: true,\n betSlipVibration: false,\n betSlipSound: false,\n goalNotification: true,\n goalMyFavorite: true,\n goalIBet: true,\n goalAllRB: false,\n goalSound: true,\n goalSoundType: 1,\n goalVibration: true,\n listDisplayType: 1,\n};\n\n//環境設定,用於判斷當前環境\nexport const envSettings = {\n isApp: false, //是否app\n}\n","/*\n* vendor設置,單獨分離 token,語言等 環境配置\n*\n* 在各產品/語言端,視實際狀況修改\n*/\n\nimport {fetchRequest} from \"../SportRequest\";\nimport {ApiPort} from \"../SPORTAPI\";\nimport {vendorStorage} from \"./vendorStorage\";\n\n//語言配置\nexport const vendorSettings = {\n LanguageCode: 'zh', //中文\n //LanguageCode: 'en', //英文\n //LanguageCode: 'vi', //越南\n //LanguageCode: 'th', //泰文\n //LanguageCode: 'in', //印尼\n}\n\n//從gateway獲取登入token\nexport const getTokenFromGatewayImpl = (vendorInstance, sbt = true,brandname = 'fun88') => {\n vendorInstance.loginPromise = new Promise(function (resolve, reject) {\n let hostname = '';\n if (brandname === 'jbo') {\n hostname = 'imnative';\n }\n\n if (brandname === 'fun88') {\n hostname = 'imnative';\n }\n\n const requestUrl = sbt ? ApiPort.GETSBTToken : ApiPort.GETBTIToken;\n\n fetchRequest(requestUrl + 'hostname=' + hostname + '&', 'GET')\n .then((data) => {\n\n //console.log('BTI token', data);\n\n if (data.isGameLocked) {\n vendorInstance.isGameLock = true;\n vendorInstance.loginPromise = null; //結束前清理掉\n reject('gameIsLoecked');\n return;\n } else {\n vendorInstance.isGameLock = false;\n }\n if (data.token) {\n vendorStorage.setItem(\n \"BTI_Token\",\n JSON.stringify(data.token)\n );\n\n let memberCode = ''\n if (brandname === 'jbo') {\n memberCode = data.playerId;\n }\n\n if (brandname === 'fun88') {\n memberCode = data.memberCode;\n }\n\n vendorStorage.setItem(\n \"BTI_MemberCode\",\n JSON.stringify(memberCode)\n );\n\n //調用BTI接口獲取jwt\n vendorInstance.BTILogin(data.token)\n .then(r => {\n vendorInstance.loginPromise = null; //結束前清理掉\n resolve( { token: data.token, jwt: r});\n })\n .catch(e =>{\n vendorInstance.loginPromise = null; //結束前清理掉\n reject('bti login error');\n });\n } else {\n vendorInstance.loginPromise = null; //結束前清理掉\n reject('no token?');\n }\n })\n .catch((error) => {\n vendorInstance.loginPromise = null; //結束前清理掉\n reject(error);\n })\n });\n\n return vendorInstance.loginPromise;\n}\n\n","/*\n* vendor設置,單獨分離 token,語言等 環境配置\n*\n* 在各產品/語言端,視實際狀況修改\n*/\n\nimport {fetchRequest} from \"../SportRequest\";\nimport {ApiPort} from \"../SPORTAPI\";\nimport {vendorStorage} from \"./vendorStorage\";\n\n//語言配置\nexport const vendorSettings = {\n LanguageCode: 'CHS', //中文\n //LanguageCode: 'ENG', //英文\n //LanguageCode: 'VN', //越南\n //LanguageCode: 'TH', //泰文\n //LanguageCode: 'ID', //印尼\n}\n\n//從gateway獲取登入token\nexport const getTokenFromGatewayImpl = (vendorInstance, brandname = 'fun88') => {\n vendorInstance.loginPromise = new Promise(function(resolve, reject) {\n let hostname = '';\n if (brandname === 'jbo') {\n hostname = 'imnative';\n }\n\n if (brandname === 'fun88') {\n hostname = 'imnative';\n }\n\n fetchRequest( ApiPort.GetIMToken + 'hostname='+hostname+'&', 'GET')\n .then((data) => {\n\n //console.log('IM token',data);\n\n if (data.isGameLocked) {\n vendorInstance.isGameLocked = true;\n vendorInstance.loginPromise = null; //結束前清理掉\n reject('game Is Locked');\n return;\n } else {\n vendorInstance.isGameLocked = false;\n }\n if (data.token) {\n vendorStorage.setItem(\n \"IM_Token\",\n JSON.stringify(data.token)\n );\n\n let memberCode = ''\n if (brandname === 'jbo') {\n memberCode = data.playerId;\n }\n\n if (brandname === 'fun88') {\n memberCode = data.memberCode;\n }\n\n vendorStorage.setItem(\n \"IM_MemberCode\",\n JSON.stringify(memberCode)\n );\n\n vendorInstance.loginPromise = null; //結束前清理掉\n\n vendorInstance._queryIMmemberType(); //獲取用戶水位\n\n resolve(data.token);\n } else {\n vendorInstance.loginPromise = null; //結束前清理掉\n reject('no token?');\n }\n })\n .catch((error) => {\n vendorInstance.loginPromise = null; //結束前清理掉\n reject(error);\n })\n });\n\n return vendorInstance.loginPromise;\n}\n\n","/*\n* vendor設置,單獨分離 token,語言等 環境配置\n*\n* 在各產品/語言端,視實際狀況修改\n*/\n\nimport {fetchRequest} from \"../SportRequest\";\nimport {ApiPort} from \"../SPORTAPI\";\nimport {vendorStorage} from \"./vendorStorage\";\n\n//語言配置\nexport const vendorSettings = {\n LanguageCode: 'cs', //中文\n //LanguageCode: 'en', //英文\n //LanguageCode: 'vn', //越南\n //LanguageCode: 'th', //泰文\n //SABA 無印尼\n}\n\n//從gateway獲取登入token\nexport const getTokenFromGatewayImpl = (vendorInstance, brandname = 'fun88') => {\n vendorInstance.loginPromise = new Promise(function(resolve, reject) {\n let hostname = '';\n if (brandname === 'jbo') {\n hostname = 'imnative';\n }\n\n if (brandname === 'fun88') {\n hostname = 'imnative';\n }\n\n fetchRequest( ApiPort.GetSABAToken + 'hostname='+hostname+'&', 'GET')\n .then((data) => {\n\n console.log('=====SABA token',data);\n\n // debug用 模擬 token獲取失敗\n // if (VendorSABAInstance && VendorSABAInstance.tokenerr) {\n // console.log('=====SABA token 500');\n // reject(500);\n // VendorSABAInstance.tokenerr = false;\n // }\n\n // let data = {\n // isGameLocked:false,\n // memberCode: JSON.parse(localStorage.getItem('memberCode')),\n // token: 'not implement la',\n // }\n\n if (data.isGameLocked) {\n vendorInstance.isGameLocked = true;\n vendorInstance.loginPromise = null; //結束前清理掉\n reject('game Is Locked');\n return;\n } else {\n vendorInstance.isGameLocked = false;\n }\n if (data.token) {\n vendorStorage.setItem(\n \"SABA_Token\",\n JSON.stringify(data.token)\n );\n\n let memberCode = ''\n if (brandname === 'jbo') {\n memberCode = data.playerId;\n }\n\n if (brandname === 'fun88') {\n memberCode = data.memberCode;\n }\n\n vendorStorage.setItem(\n \"SABA_MemberCode\",\n JSON.stringify(memberCode)\n );\n\n vendorInstance.loginPromise = null; //結束前清理掉\n\n resolve( { token: data.token });\n } else {\n vendorInstance.loginPromise = null; //結束前清理掉\n reject('no token?');\n }\n })\n .catch((error) => {\n vendorInstance.loginPromise = null; //結束前清理掉\n reject(error);\n })\n });\n\n return vendorInstance.loginPromise;\n}\n\n","import {checkIsLogin} from \"../js/util\";\n/*\n* vendor模塊專用Storage,用來適配各端不同的本地存儲\n*\n* 在各端重寫實現,分 sync同步 和 async異步 兩種函數\n* - token和登入態直接使用 sync同步函數\n* - 關注比賽的存儲 使用 async異步 相關函數,用於適配 RN 的存儲,並相容之後可能改為調用API 存服務器 的狀況\n*/\n\n//在mobile 只需要轉一下 給localSotage就行\nexport const vendorStorage = {\n //同步函數\n getItem: (key) => {\n if (key == 'loginStatus') { //特別處理登入態for不同mainsite架構\n return checkIsLogin() ? 1 : null; //vendor只需要返回1就表示已登入\n }\n return localStorage.getItem(key)\n },\n setItem: (key, value) => {\n return localStorage.setItem(key,value);\n },\n removeItem: (key) => {\n return localStorage.removeItem(key);\n },\n\n //異步函數\n getItemAsync: (key) => {\n return new Promise(resolve => resolve(localStorage.getItem(key)));\n },\n setItemAsync: (key, value) => {\n return new Promise(resolve => resolve(localStorage.setItem(key,value)));\n },\n removeItemAsync: (key) => {\n return new Promise(resolve => resolve(localStorage.removeItem(key)));\n },\n}\n","const languageMapping = {'HOME':'主','AWAY':'客','TIE':'和','BIG':'大','SMALL':'小','ODD':'单','EVEN':'双','YES':'是','NO':'不是','NOT_HAVE':'没有','HOME_YES':'主队 是','HOME_YES2':'主队 是','HOME_NO':'主队 不是','HOME_NO2':'主队 不是','AWAY_YES':'客队 是','AWAY_YES2':'客队 是','AWAY_NO':'客队 不是','AWAY_NO2':'客队 不是','HOME_ODD':'主队 单','HOME_EVEN':'主队 双','AWAY_ODD':'客队 单','AWAY_EVEN':'客队 双','HOME_WIN_YES':'主赢 是','HOME_WIN_NO':'主赢 否','AWAY_WIN_YES':'客赢 是','AWAY_WIN_NO':'客赢 否','HOME_WIN':'主赢','AWAY_WIN':'客赢','ANY_WIN_YES':'任一队伍赢 是','ANY_WIN_NO':'任一队伍赢 否','HOME_PERFECT_WIN_YES':'主队零失球并获胜 是','HOME_PERFECT_WIN_NO':'主队零失球并获胜 否','AWAY_PERFECT_WIN_YES':'客队零失球并获胜 是','AWAY_PERFECT_WIN_NO':'客队零失球并获胜 否','NEUTRAL_GROUND':'中','BIG_OR_SMALL':'大/小','BIG_SMALL':'大小','WORDWIDTH':'2','HANDICAP':'让球','BIGSMALL':'大小','VendorConfigs':{'TIMEZONE':'8','TIMEZONEFULL':'+08:00'},'VendorMarketNames':{'1':'早盘','2':'今天','3':'滚球','4':'关注','5':'冠军'},'VendorPeriodName':{'1':'全场','2':'上半场','3':'下半场'},'VendorErrorMsg':{'10010':'请刷新或重新登录','11010':'供应商系统错误,请刷新后重试','11020':'供应商维护中,请稍后再试','11030':'供应商地区限制,请检查您的所在地和网络','12010':'数据有误,请刷新后重试','13010':'投注选项数量超过上限','13011':'同一赛事只可以选择一个投注选项加入串关','13020':'投注内容无效,请刷新后重试','13030':'赛事/盘口已失效,或暂时无法使用','13040':'投注选项已失效,或暂时无法使用','13050':'投注不成功,请稍后重试','13051':'您的注单仍在处理中,请查看投注记录确认注单状态','13060':'赔率更新中,请稍后重试','13070':'余额不足','13080':'投注金额超过上限','13090':'投注金额低于下限','13100':'已达赛事总投注金额上限','13110':'赔率已变更','13111':'赔率变化过于频繁,请稍后重试投注','13120':'赛事不支持串关','13121':'串关奖励不可和免费投注同时使用','13130':'投注金额无效','13140':'虚拟体育未启用','14010':'新的兑现价格','99999':'网络错误'},'SelectionStatusNames':{'100':'成功','350':'获取投注信息错误','380':'盘口已不可用','1001':'赔率更新中','99997':'下注时最少需要选3种组合','99998':'请使用欧洲盘投注','99999':'尚未定义'},'IM':{'SYSTEM_PARLAY':'系统混合过关','BetRadar':{'LANG':'zh','TIMZONE':'Asia:Hong_Kong'},'IMLineGroupNames':{'1':'让球 & 大/小','3':'1 x 2','5':'单 / 双','6':'波胆','7':'总进球','8':'双重机会'},'IMOddsTypeName':{'1':'马来盘','2':'香港盘','3':'欧洲盘','4':'印尼盘'},'IMWagerStatusName':{'1':'待定','2':'确认','3':'拒绝','4':'拒绝'},'IMWagerConfirmStatusName':{'0':'未确认','1':'普通确认','2':'危险球确认'},'IMWagerCancelStatusName':{'1':'未取消','2':'注单取消','3':'赛事取消'},'IMWagerCancelReasonName':{'0':'无原因','1':'危险红牌','2':'危险进球','101':'赛事终止'},'IMComboTypeNames':{'0':'单注','1':'3串4','2':'4串11','3':'5串26','4':'6串57','5':'7串120','6':'8串247','7':'9串502','8':'10串1013','9':'2串1','10':'3串1','11':'4串1','12':'5串1','13':'6串1','14':'7串1','15':'8串1','16':'9串1','17':'10串1','18':'所有连串过关'},'IMRBPeriodNames':{'!LIVE':'滚球中','HT':'中场休息','1H':'上半场','2H':'下半场','Q1':'第一节','Q2':'第二节','Q3':'第三节','Q4':'第四节','OT':'加时','S1':'第一盘','S2':'第二盘','S3':'第三盘','S4':'第四盘','S5':'第五盘','G1':'第1局','G2':'第2局','G3':'第3局','G4':'第4局','G5':'第5局','G6':'第6局','G7':'第7局'},'IMEventGroupTypeNames':{'1':'主要','2':'角球','3':'特別投注','4':'第一节','5':'第二节','6':'第三节','7':'第四节','8':'让分局','9':'第一盘','10':'第二盘','11':'第三盘','12':'第四盘','13':'第五盘','14':'让分盘','15':'第1局','16':'第2局','17':'第3局','18':'第4局','19':'第5局','20':'第6局','21':'第7局'}},'BTI':{'SEARCH_NOTICE':'请输入不少于3个字','PARLAY':'串','CANCELLED':'已取消','NOT_CANCELLED':'未取消','BTIWagerOddsTypeName':{'notset':'','Malaysian':'马来盘','HongKong':'香港盘','Decimal':'欧洲盘','Indonesian':'印尼盘'},'BTIWagerStatusName':{'Open':'待处理','Lost':'输','Won':'赢','Placed':'已下注','WonDeadHeat':'死热赢','PlacedDeadHeat':'死热已下注','Draw':'和','Cancelled':'已取消','NonRunner':'投注无效','HalfLost':'输半','HalfWon':'嬴半','CashOut':'提前结算','PartialCashOut':'部分提前结算'},'BTIMarketGroupTypeNames':{'Main':'主要盘口','Goals':'进球','Halves':'半场','Corners':'角球','Period':'时间阶段','Specials':'特别盘口','Players':'球员','Cards':'罚牌','Fast markets':'快速投注','Pulse Bet':'脉冲投注','Fulltime':'全场','Full Time':'全场','Quarters':'节','Set':'节','Match':'盘口','Match Specials':'特别盘口','General':'盘口','Regular Time':'正规时间','Full Time [Incl. OT]':'全场 [包括加时]','Totals':'总进球','1st Period':'第1节','Frames':'局'},'BTIComboTypeNames':{'Single':'单注','Combo':'N串1','SystemXfromY':'系统混合过关 X/Y','Lucky15':'4串15(幸运15)','Lucky31':'5串31(幸运31)','Lucky63':'6串63(幸运63)','Trixie':'3串4','Patent':'3串7','Yankee':'4串11(洋基)','SuperYankee':'5串26(超级洋基)','Heinz':'6串57(亨氏)','SuperHeinz':'7串120(超级亨氏)','Goliath':'8串247(大亨)'},'BTIBetTypeNames':{'2_0':'让球','2_1':'让球','2_2':'让球','2_39':'让球','3_0':'大小','3_1':'大小','3_2':'大小','3_39':'大小'},'BTIRBPeriodNames':{'FirstHalf':'上半场','BreakAfterFirstHalf':'中场休息','SecondHalf':'下半场','Finished':'终场','FirstOvertime':'第一次加时','BreakAfterFirstOvertime':'第一次加时节间休息','SecondOvertime':'第二次加时','BreakAfterSecondOvertime':'第二次加时节间休息','PenaltyShootout':'点球大战','FirstQuarter':'第一节','BreakAfterFirstQuarter':'第一节间休息','SecondQuarter':'第二节','BreakAfterSecondQuarter':'第二节间休息','ThirdQuarter':'第三节','BreakAfterThirdQuarter':'第三节间休息','FourthQuarter':'第四节','BreakAfterFourthQuarter':'第四节间休息','FirstSet':'第一盘','SecondSet':'第二盘','ThirdSet':'第三盘','FourthSet':'第四盘','FifthSet':'第五盘','FirstInning':'第一局','SecondInning':'第二局','ThirdInning':'第三局','FourthInning':'第四局','FifthInning':'第五局','SixthInning':'第六局','SeventhInning':'第七局','EighthInning':'第八局','NinthInning':'第九局','TenthInning':'第十局','EleventhInning':'第十一局','TwelfthInning':'第十二局','ThirteenthInning':'第十三局','FourteenthInning':'第十四局','FifteenthInning':'第十五局','BreakAfterFirstInning':'第一局间休息','BreakAfterSecondInning':'第二局间休息','BreakAfterThirdInning':'第三局间休息','BreakAfterFourthInning':'第四局间休息','BreakAfterFifthInning':'第五局间休息','BreakAfterSixthInning':'第六局间休息','BreakAfterSeventhInning':'第七局间休息','BreakAfterEighthInning':'第八局间休息','BreakAfterNinthInning':'第九局间休息','BreakAfterTenthInning':'第十局间休息','BreakAfterEleventhInning':'第十一局间休息','BreakAfterTwelfthInning':'第十二局间休息','BreakAfterThirteenthInning':'第十三局间休息','BreakAfterFourteenthInning':'第十四局间休息','FirstPeriod':'第一局','BreakAfterFirstPeriod':'第一局间休息','SecondPeriod':'第二局','BreakAfterSecondPeriod':'第二局间休息','ThirdPeriod':'第三局','BreakAfterThirdPeriod':'第三局间休息','Overtime':'加时赛'}},'SABA':{'ISLUCKY':'来自幸运选择','SABARBPeriodNames':{'Delayed':'延迟开赛','1H':'上半场','2H':'下半场','HT':'中场休息','1Q':'第 1 节','2Q':'第 2 节','3Q':'第 3 节','4Q':'第 4 节','QT':'延长赛','1S':'第 1 盘','2S':'第 2 盘','3S':'第 3 盘','4S':'第 4 盘','5S':'第 5 盘','1G':'第 1 局','2G':'第 2 局','3G':'第 3 局','1MS':'地图1准备中','1MG':'地图1进行中','2MS':'地图2准备中','2MG':'地图2进行中','3MS':'地图3准备中','3MG':'地图3进行中'},'SABALineGroupNames':{'0':'主要','1':'全场','2':'半场','3':'角球','4':'罚牌','5':'区间','6':'特别产品','7':'选手','8':'加时','9':'快速盘口','10':'节','11':'Map 1','12':'Map 2','13':'Map 3','14':'Map 4','15':'Map 5','16':'Map 6','17':'Map 7','18':'Map 8','19':'Map 9'},'SABABetTypeNames':{'1':'让球','3':'大小','7':'让球','8':'大小','17':'让球','18':'大小'},'SABAComboTypeNames':{'Doubles':'二串一','Trebles':'三串一','Trixie':'三串四','Lucky7':'幸运 7','Fold4':'四串一','Yankee':'洋基','Lucky15':'幸运 15','Fold5':'五串一','Canadian':'超级美国佬','Lucky31':'幸运 31','Fold6':'六串一','Heinz':'亨氏','Lucky63':'幸运 63','Fold7':'七串一','SuperHeinz':'超级亨氏','Lucky127':'幸运 127','Fold8':'八串一','Goliath':'大亨','Lucky255':'幸运 255','FoldN':'N串一'},'SABAOddsTypeName':{'1':'马来盘','2':'香港盘','3':'欧洲盘','4':'印尼盘'},'SABAWagerStatusName':{'half won':'赢半','half lose':'输半','won':'赢','lose':'输','void':'无效','running':'投注成功','draw':'平手','reject':'拒绝','refund':'退款','waiting':'待确认'}}};export default languageMapping;","/*\n* 指定要選擇哪個語言(翻譯)文件\n*\n* 在各語言端,視實際狀況引用\n*/\n\nimport cn from './i18n/cn';\nexport default cn;"],"names":["MockLogin","brand","loginParams","jbo","common_url","username","password","fun88","BETWAY","isLogin","token","IM_Token","IM_MemberCode","BTI_Token","BTI_MemberCode","_instance","this","doMockLogin","doMockLoginJBO","doMockLoginFUN88","doMockLoginBW","data","Object","assign","logindata","that","Promise","resolve","reject","fetchRequest","then","accessToken","token_type","access_token","errors","JSON","parse","content","catch","error","grantType","clientId","clientSecret","scope","appId","siteId","grant_type","client_id","client_secret","getIMToken","brandname","hostname","isGameLocked","isGameLock","playerId","memberCode","localStorage","setItem","stringify","getBTIToken","sbt","url","method","header","params","withAPIVersion","useFormData","apiversion","init","headers","formData","FormData","propName","append","body","URLSearchParams","timeout_fetch","fetch","response","json","responseData","error_details","err","fetch_promise","timeout","timeout_fn","timeout_promise","abortable_promise","race","setTimeout","MockLoginSingleton","window","MockLoginInstance","BTIDataTypes","SPORTS","LEAGUES","EVNETS","MARKETS","CALCULATEBETS","PLACEBETS","GETPURCHASES","WAGERUNSETTLE","WAGERSETTLED","CASHOUT_GETINFO","CASHOUT_PLACE","CASHOUT_GETUPDATES","CASHOUT_PLACENEWOFFER","BTISports","SOCCER","BASKETBALL","FOOTBALL","TENNIS","BASEBALL","ICEHOCKEY","HANDBALL","RUGBYLEAGUE","GOLF","SNOOKER","MOTOR","DARTS","CYCLING","VOLLEYBALL","BOXING","FUTSAL","TABLETENNIS","BOWLS","WINTERSPORTS","HURLING","WATERPOLO","BEACHVOLLEYBALL","BEACHSOCCER","BADMINTON","RUGBYUNION","CURLING","BANDY","AUSSIERULES","MMA","CRICKET","NETBALL","ATHLETICS","SWIMMING","WINTEROLYMPIC","ESPORTS","BTIOddsType","MY","HK","EU","ID","BTIOddsTypeToNumber","malay","hk","decimal","indo","BTIOddsTypeForBet","BTIWagerOddsTypeToNumber","notset","Malaysian","HongKong","Decimal","Indonesian","BTIWagerOddsTypeName","i18n","BTIWagerStatusName","BTIMarketGroupTypeNames","BTIAcceptMode","NONE","HIGHER","ANY","BTIComboTypeNames","BTIBetTypeNames","BTIPeriodMapping","PeriodId","PeriodName","BTIRBPeriodNames","BTIForceDecimalBetTypeIds","AnnouncementData","AnnouncementId","AnnouncementText","PostingDate","ExtraInfo","BetInfoData","BetSettings","SystemParlayBetSettings","Selections","createFromIMSource","betSettings","length","normalParlayComboTypes","normalParlaySettings","filter","bs","indexOf","ComboType","systemParlaySettings","ComboCount","newSystemParlaySettings","map","sp","cloneSetting","BetSettingData","xNumber","yNUmber","ComboTypeName","push","createFromBTISource","comboParlaySettings","systemSingleParlaySettings","lastIndexOf","fromIndex","substr","yNumber","parseInt","concat","targetBetSetting","thisBet","bet","thisOdds","displayOdds","isNegative","IsMinusOdds","RealBetAmountRate","abs","toNumber","EstimatedPayoutRate","add","createFromSABASource","isFold","comboType","replace","thisBetSetting","thisSelection","IsOutRightEvent","OddsType","Odds","clone","srcData","isComboBet","s","SelectionData","Array","isArray","sel","getSelectionsForCombo","IsOpenParlay","SelectionStatus","SelectionStatusType","BetResultData","Balance","WagerId","WagerStatus","BetStatus","IsPending","PendingQueryId","EstimatedPayoutFullAmount","BetSelectionResults","BetLogJSON","BetSelectionResultData","EventId","SelectionType","MinAmount","MaxAmount","vendor","HasComboBonus","ComboBonusPercentage","OriginEstimatedPayoutRate","FreeBets","IMComboTypeNames","selectionCount","selectionsMapped","x","y","isEW","item","numberOfBets","dividedToIntegerBy","SABAComboTypeNames","nName","toBTIBets","betAmount","pickedfreeBetToken","type","realBetRate","mul","selectedFreebet","usedFreeBetAmount","freeBets","selectedFreebets","fb","freeBetToken","greaterThanOrEqualTo","freeBetAmount","deciamlRoundingMapping","hasComboBonus","comboBonusPercentage","trueOddsComboBonusIncluded","realOdds","trueOdds","deciamlRounding","returnRoundingMode","realBet","sub","realFreeBet","realOddsForFreeBet","realPotentialReturns","potentialReturns","toDecimalPlaces","returnObj","stake","freeBet","BetStatusData","IsSuccess","FinalWagerStatus","CashOutResultData","WagerData","LogJSON","EventChangeData","ChangeType","OldValue","NewValue","SpecialUpdates","EventData","EventChangeType","specialUpdates","RBTime","SpecialUpdateData","SpecialUpdateType","HomeScore","AwayScore","HomeCorner","AwayCorner","HomeRedCard","AwayRedCard","Lines","lineInNew","newLineExistInOldLines","lineInOld","LineId","selectionInOld","selectionInNew","SelectionId","OddsOld","OddsNew","greaterThan","lessThan","oldLineExistInNewLines","LineGroupData","LineGroupId","LineGroupName","LineCount","SortNumber","EventDate","EventStatusId","EventGroupId","EventGroupTypeId","HomeTeamId","HomeTeamName","HomeIconUrl","AwayTeamId","AwayTeamName","AwayIconUrl","HasCornerData","SortOrder","RBMinute","RBPeriodName","RelatedScores","GroundTypeId","HasStatistic","HasVisualization","BREventId","IsRB","HasLiveStreaming","LiveStreamingUrl","MatchDay","Season","SportId","MarketId","LeagueId","LeagueName","TotalLineCount","IsFavourite","OutRightEventName","LineGroups","MarketIdForListing","EventDateLocal","getEventDateMoment","format","moment","utcOffset","VendorConfigs","getChildSelection","selectionId","lineId","eventId","thisLines","l","thisLine","thisSelections","updateLineGroupCount","lg","linesInGroup","LineGroupIds","sortLines","sort","left","right","a","BetTypeId","b","natureCompare","IMSortLinesAndSelections","selectionSpecialCompareFunc","specialWords","a1","SelectionName","b1","LineLevel","selectionNames","uniqueSelectionNames","index","specialSorted","specialSortConditions","uniqueSelectionCount","sortWords","condition","words","w","specialSortFunc","IMMergeSideEvents","jsonEvents","FavoriteEvents","memberOddsType","memberType","sideEvents","ev","sideEventDatas","se","thisLineGroupId","existLineGroups","IMEventGroupTypeNames","newBetTypeName","BetTypeName","sels","BTIFilterMainLineOnly","newSelections","Specifiers","updateSelectionAnalysis","MMSelections","str","aType","bType","RealHandicap","aValue","bValue","BTISortLinesAndSelections","needFilterBetTypeNames","reverse","split","join","a2","b2","lineData","isHandicap","aSortIndex","bSortIndex","thisMap","getSortNumber","handicap","sortIndex","specialSortIndex","thisNumber","isZero","_SORTVALUE","selectionCompareFuncWrap","SABASortLines","SABAMergeSideEvents","sideEventName","selg","intTypeId","typeid","MarketLines","groupid","lineGroupDatas","IMLineGroupNames","isFavourite","favItem","MarketName","VendorMarketNames","Market","isRB","VendorMarkets","rbMinute","rbPeriod","blankIndex","toIndex","minuteLength","rbname","IMRBPeriodNames","HomeTeam","homeCorner","awayCorner","cornerData","find","AwayTeam","Competition","RBOrderNumber","PMOrderNumber","OrderNumber","OpenParlay","LiveStreaming","CompetitionId","CompetitionName","TotalMarketLineCount","lineItem","thisBetTypeName","childSelectionSpecifiers","WagerSelections","spec_arr","replaceTarget","LineData","IsLocked","MarketlineId","MarketLineLevel","MarketlineStatusId","selectionItem","thisSelectionName","xy_arr","thisx","thisy","thisHandiCap","Handicap","thisHandicapDecimal","mod","eq","oddsDeciaml","rounding","targetTeamId","targetTeamName","thisOddsType","thisOddsValue","OddsList","targetOddsInfo","matchOddsInfos","oInfo","OddsValues","WagerSelectionId","oddsItem","OddsData","toFixed","createFromIMOutRightSource","OutrightEventName","lines","marketId","id","isLive","oneDayAfter","eventDate","startEventDate","marketName","homeTeams","participants","venueRole","homeTeam","name","score","homeScore","redCard","additionalScores","redCardsTeam1","corner","cornersTeam1","homeTeamData","awayTeams","awayTeam","awayScore","redCardsTeam2","cornersTeam2","awayTeamData","line","oddsTypePropList","oddsPropName","number","compareLineGroupFunc","liveGameState","gamePart","gameTime","toString","undefined","isOutRightEvent","outRightEventName","eventName","forceDecimalBetTypeIds","sportId","thisSortOrder","leagueOrder","tags","metadata","leagueId","leagueName","totalActiveMarketsCount","marketGroups","mgitem","groups","thisMarketGroupTypeName","order","periodData","specialBetTypeName","marketType","isSuspended","selections","outcomeType","participantMapping","filtedTeams","group","points","oddsTypeData","createFromBTIChange","oldData","homeRedCard","awayRedCard","lgItem","itemIndex","SABAOddsTypeToNumber","homeTeamId","awayTeamId","homeTeamName","awayTeamName","homeTeamScore","gameInfo","liveHomeScore","awayTeamScore","liveAwayScore","teamInfo","homeId","awayId","homeName","awayName","rbPeroidName","inPlayTime","rbPeriodKey","sportType","livePeriod","delayLive","isHt","gameSession","tennisInfo","currentSet","eSportInfo","bestOfMap","isStartingSoon","SABARBPeriodNames","seconds","extraInfo","channelCode","streamingOption","teamBetTypes","globalShowTime","eventStatus","soccerInfo","homeIconUrl","awayIconUrl","isNeutral","isParlay","marketCount","marketCategories","cateId","category","SABALineGroupNames","betTypeName","SABABetTypeNames","betType","SABAPeriodMapping","marketStatus","key","keyName","isTeamBet","oddsPrice","keys","targetOddsValue","SABAOddsType","point","combo","createFromSABAChange","createFromSABAOutRightSource","thisEventId","thisEventStatus","outrightStatus","VendorPeriodName","teams","orid","teamId","teamName","price","sortEvents","events","sortWay","SortWays","marketSortMapping","leagueCompareFunc","timeCompareFunc","result","srcEventData","EventInfo","LeagueData","Count","LineStatusId","periodDesc","LineDesc","oldEventData","cachedLineGroupIds","oldLine","oldLines","thisLineGroupIds","createFromSABAAdd","oldSelection","sitem","TargetTeamId","TargetTeamName","srcLineData","getKeyForCompare","isSimilarTo","otherLine","IsDisplayByTeam","targetTeamNames","uniqueTargetTeamNames","selectionNameHasTeamNames","n","SelectionCountInLine","_getSelectionCountInLine","haveHandicap","selectionCategoryCount","cc","usn","maxWordLength","MarketData","transformOddsIM","from","IMOddsType","to","oddsVal","newOddsVal","thisDeciaml","decimalVal","minusOne","div","PollingResult","NewData","Changes","reTrim","EventSource","options","eventType","pollAgain","interval","eventsource","_pollTimer","poll","call","readyState","CLOSED","xhr","XMLHttpRequest","open","OPTIONS","URL","forEach","setRequestHeader","lastEventId","lastIndexProcessed","onreadystatechange","status","CONNECTING","OPEN","dispatchEvent","responseText","e","parts","i","retry","isNaN","thisEventType","event","MessageEvent","onerror","message","send","abort","_xhr","SyntaxError","prototype","close","clearInterval","handlers","addEventListener","handler","removeEventListener","splice","onmessage","onopen","origin","SearchEventData","getHighlightHomeTeamName","keyword","prefix","postfix","_getHighlightString","getHighlightAwayTeamName","source","findAndReplace","prefixIndex","posfixIndex","result1","result2","toUpperCase","result3","toLowerCase","SearchLeagueData","DisplayOrder","Events","getHighlightLeagueName","SearchSportData","SportName","Leagues","SelectionChangeData","SelectionChangeType","SelectionGroup","DisplayOdds","SelectionStatusName","SelectionStatusNames","handicapTail","selectionDesc","SelectionDesc","srcSelectionData","thisDisplayOdds","toIMBetInfo","BetTypeSelectionId","OutrightTeamId","toIMWager","toBTIWager","selection","toSABASingleBetInfo","oddsType","toSABAOutRightBetInfo","toSABAParlayBetInfo","toSABAPlaceSingleBetParams","BetAmount","isAcceptAnyOdds","toSABAPlaceOutRightBetParams","toSABAPlaceParlayBetParams","UpdateType","SportData","Markets","require","ReconnectingEventSource","configuration","_start","_this","_lastEventId","encodeURIComponent","_eventSource","TargetEventSource","_configuration","_onopen","_onerror","_i","_a","_listeners","_onevent_wrapped","retryCount","prevState","maxRetryAttempt","onreconnect","_timer","retryTime","_onevent","listenersForType","slice","listener","clearTimeout","updatedListenersForType","SseSubscription","getToken","onNext","onError","run","Error","eventSource","getUrl","unsubscribe","TokenManager","isInitialized","_config","tokenRenewInterval","tokenRenewProvider","isAnonymous","apiAccessToken","_autoRenewTimer","config","initToken","renew","stopAutoRenew","startAutoRenew","setInterval","VendorBase","configs","MaxParlay","VendorName","VendorPage","EventIdType","HasLeagueIcon","HasTeamIcon","HasCashOut","loginPromise","_childPollingMap","_PollingCache","_cleanFavouriteEventTimeoutHandler","_cacheWithExpiration","_cacheCleanTimeoutHandler","_globalPollingCache","_getLoginInfo","deletePolling","_unsubscribeGlobalPolling","childPolling","pollingCacheInfo","handle","_registerPolling","dataName","queryParams","queryFunction","onUpdateCallback","cachedResultKey","intervalSeconds","uniqueName","useResultCache","resultCacheExpireSeconds","preCacheFunction","usedCachedResult","md5","cachedResult","_cacheGet","cacheKey","cacheInfo","uniqueid","uuidv4","queryAndCallback","_cacheSet","r","thisUniqueId","finally","_getFavouriteStorageKey","loginInfo","addFavouriteEvent","savedFavEvents","favEvents","doClean","getFavouriteEvents","vendorStorage","currentFavEvents","pr","thisEvents","existEventIds","notExistEventIds","hasDeletedFavourite","getEventsDetail","removeFavouriteEvent","eventListing_updateSportsCount","EventIdArr","removeEventIdArr","isChanged","eid","convertedEventId","jsonString","jsonData","getMemberSetting","defaultSetting","defaultMemberSetting","getBannerData","NEventCount","vendorNameLower","eventDatas","runningEventsPR","runningEvents","rule1","rule2","compareFunc","leftCount","leftEvents","isAPIServer","HostConfig","getEvents","a3","b3","_getFirstNEvents","getBannerDataPollingGlobal","subscriberName","_subscribeGlobalPolling","getBannerDataPolling","dataQuery","excludeEventIds","markets","resultEvents","market","thisEventPR","MaxCount","getLiveEventsInSameLeague","re","getHotEvents","getHotEventsPollingGlobal","getHotEventsPolling","expireSeconds","expTime","Date","getTime","expSec","nowTime","defaultValue","info","storeInitialCacheToPollingCache","cacheData","cachedResultKeyForCount","count","theDayAfterTenDays","theDaytoday","defaultQuery","SortWay","StartDate","EndDate","cachedResultKeyForEvents","list","funcName","keepAlive","pollingKey","newPolling","oldCallbacks","thisPollingInfo","thisParaJSON","currentParaJSON","updateCallBacks","updateCallBackAdapter","uniqueKey","thisCallBack","arrayParams","values","globalPollingKey","APIPollingWithAutoClean","pollingFunc","callWithAutoClean","thisPollingKey","EARLY","TODAY","RUNNING","FAVOURITE","OUTRIGHT","None","EventTime","New","Update","Delete","Sort","UnAvailable","EventStart","HomeGoal","AwayGoal","LineNew","LineDelete","OddsUp","OddsDown","WagerType","SINGLE","COMBO","VendorErrorType","Unknown_Error","VENDOR_Auth_Error","VENDOR_Error","VENDOR_Maintenance","VENDOR_Area_Limit","DATA_Error","BET_Selection_Parlay_Limit","BET_Selection_Parlay_Error","BET_Info_Error","BET_Event_Error","BET_Selection_Error","BET_Place_Error","BET_Place_Expire","BET_Place_Updating","BET_Place_Balance","BET_Place_LimitMax","BET_Place_LimitMin","BET_Place_LimitTotal","BET_Place_OddChanged","BET_Place_UpdateInfoRequired","BET_Place_NOPARLAY","BET_Place_NO_COMBO_FREE","BET_Place_MONEY","BET_Virtual_Disabled","CASHOUT_NEWPRICE","VendorErrorMsg","NOTSET","EUODDSONLY","NEED3COMBO","OK","ERROR","NOTAVIILABLE","UPDATING","CashOutStatusType","NOTYET","DONE","PROCESS","CANCEL","NEWPRICE","FAIL","DECLINE","VendorError","ErrorType","ErrorMsg","ErrorInfo","isVendorError","fromIMError","statusCode","statusDesc","errorType","fromBTIError","errorJSON","fromSABAError","CreateTime","SettleDateTime","MemberCode","WinLossAmount","ComboBonusWinningsAmount","OddsTypeName","Platform","WagerStatusName","SettleStatus","ResettleStatus","PotentialPayoutAmount","CanCashOut","CashOutStatus","CashOutPriceId","CashOutPrice","CashOutAmount","OriginPotentialPayoutAmount","FreeBetAmount","WagerItems","winLossAmount","MemberWinLossAmount","BetTradeStatus","BetTradeBuyBackAmount","InputtedStakeAmount","WagerCreationDateTime","SettlementDateTime","IMOddsTypeName","BettingPlatform","BetConfirmationStatus","IMWagerStatusName","BetSettlementStatus","BetResettled","NoOfCombination","ComboSelection","WagerItemList","PotentialPayout","CanSell","PricingId","BuyBackPricing","witem","gameResults","home","away","HomeTeamHTScore","HomeTeamFTScore","AwayTeamHTScore","AwayTeamFTScore","EventTypeId","OutrightTeamName","WagerItemData","WagerItemConfirmationStatus","WagerItemConfirmationType","IMWagerConfirmStatusName","WagerItemCancelType","IMWagerCancelStatusName","WagerItemCancelReason","IMWagerCancelReasonName","EventDateTime","SourceId","EventOutrightName","WagerHomeTeamScore","WagerAwayTeamScore","numberOfSelections","displayOddsStyle","stakeMultifyOdds","Deciaml","totalStake","equals","amountToWin","comboBonusMultiplier","dividedBy","realDisplayOdds","comboBonusWinningsAmount","thisWinLoseAmount","returns","cashOutStatus","cashOutAmount","settlementStatus","purchaseId","placementDate","settlementDate","sourceDeviceType","selectionDisplayName","marketDisplayName","eventDisplayName","gameScore","thisComboTypeName","thisComboCount","comboInfoArr","trim","isLucky","wagerItems","parlayInfo","transId","transTime","memberId","settlementPrice","SABAOddsTypeName","SABAWagerStatusName","resettlesInfo","cashoutEnabled","alreadyCashout","cashoutPrice","kickOffTime","getCreateTimeMoment","ConfirmStatus","ConfirmStatusName","CancelStatus","CancelStatusName","CancelReason","CancelReasonName","HomeTeamScoreWhenBet","AwayTeamScoreWhenBet","HomeTeamResult","AwayTeamResult","GameResult","RBHomeScore","RBAwayScore","IsLucky","handicapTailWithPostive","IMAPIStatus","DeltaExpire","IMSports","LAWNHOCKEY","RUGBY","SAILING","VIRTUALSOCCER","VIRTUALBASKETBALL","VIRTUALWORLDCUP","ENTERTAINMENTBETTING","VIRTUALNATIONALCUP","ALLEXCEPTSOCCER","ALL","IMBetType","HANDICAP","OVERUNDER","ONEXTWO","ODDEVEN","SCORE","TOTALGOAL","DCHANCE","IMEventType","FIXTURE","IMDeltaAction","INSERTUPDATE","DELETE","IMWagerStatus","PENDING","CONFIRMED","REJECTED","CANCELLED","IMWagerSortWay","EVENTDATE","BETDATE","SABADataTypes","OUTRIGHTS","PROMOS","STREAMING","SINGLETICKET","PARLAYTICKETS","OUTRIGHTTICKET","PLACEBET","PLACEPARLAYBETS","PLACEOUTRIGHTBETS","CHECKPLACEBET","CHECKWAITINGTICKETSTATUS","BETDETAILS","CASHOUTPRICE","SELLBACK","CHECKSELLINGSTATUS","CONFIRMSELLINGRESULT","SABASports","BILLIARDS","MOTORSPORTS","POLITICS","DIVING","ARCHERY","WEIGHTLIFTING","CANOEING","GYMNASTICS","EQUESTRIAN","FIELDHOCKEY","WINTERSPORT","SQUASH","ENTERTAINMENT","FENCING","JUDO","MPENTATHLON","ROWING","SHOOTING","TAEKWONDO","TRIATHLON","WRESTLING","MUAYTHAI","FINANCE","OTHERS","malayPrice","hongKongPrice","decimalPrice","indoPrice","SABAAcceptMode","amount1","amount2","amount3","alwaysAcceptBetterOdds","betSlipVibration","betSlipSound","goalNotification","goalMyFavorite","goalIBet","goalAllRB","goalSound","goalSoundType","goalVibration","listDisplayType","envSettings","isApp","vendorSettings","LanguageCode","getTokenFromGatewayImpl","vendorInstance","requestUrl","ApiPort","BTILogin","jwt","_queryIMmemberType","getItem","checkIsLogin","value","removeItem","getItemAsync","setItemAsync","removeItemAsync"],"sourceRoot":""}