flyzto 3 هفته پیش
والد
کامیت
032067b38a
3فایلهای تغییر یافته به همراه58 افزوده شده و 60 حذف شده
  1. 15 24
      server/models/GamesPs.js
  2. 3 2
      server/routes/pstery.js
  3. 40 34
      server/triangle/totalProfitCalc.js

+ 15 - 24
server/models/GamesPs.js

@@ -4,7 +4,7 @@ const Cache = require('../libs/cache');
 const Setting = require('./Setting');
 const Setting = require('./Setting');
 const { eventSolutions } = require('../triangle/eventSolutions');
 const { eventSolutions } = require('../triangle/eventSolutions');
 const { getPassableEvents, eventsCombination } = require('../triangle/trangleCalc');
 const { getPassableEvents, eventsCombination } = require('../triangle/trangleCalc');
-const { calcTotalProfit, calcTotalProfitWithFixedFirst } = require('../triangle/totalProfitCalc');
+const { calcTotalProfit, calcTotalProfitWithFixedFirst, getFirstInfo } = require('../triangle/totalProfitCalc');
 const { getSetting, updateSetting } = require('../triangle/settings');
 const { getSetting, updateSetting } = require('../triangle/settings');
 
 
 const fs = require('fs');
 const fs = require('fs');
@@ -729,10 +729,6 @@ const getPCData = (id) => {
  * @returns {object[]}
  * @returns {object[]}
  */
  */
 const getGamesRelation = ({ mk=-1, ids, listEvents=false, listPC=false } = {}) => {
 const getGamesRelation = ({ mk=-1, ids, listEvents=false, listPC=false } = {}) => {
-  let idsSet = null;
-  if (ids?.length) {
-    idsSet = new Set(ids);
-  }
 
 
   let relations;
   let relations;
   if (ids?.length) {
   if (ids?.length) {
@@ -742,12 +738,7 @@ const getGamesRelation = ({ mk=-1, ids, listEvents=false, listPC=false } = {}) =
     relations = Object.values(GAMES.Relations);
     relations = Object.values(GAMES.Relations);
   }
   }
 
 
-  relations = relations.filter(item => {
-    if (idsSet && !idsSet.has(item.id)) {
-      return false;
-    }
-    return mk == -1 || item.mk == mk;
-  }).sort((a, b) => a.timestamp - b.timestamp);
+  relations = relations.filter(item => mk == -1 || item.mk == mk).sort((a, b) => a.timestamp - b.timestamp);
 
 
   if (listEvents && !listPC) {
   if (listEvents && !listPC) {
     return relations;
     return relations;
@@ -1255,28 +1246,28 @@ const getTotalProfitWithBetInfo = async (betInfo1, betInfo2, fixed=false, inner_
 /**
 /**
  * 计算补单综合利润
  * 计算补单综合利润
  */
  */
-const getTotalReplacement = async (event_id, inner_base, inner_rebate, inner_ior, inner_odds, outer_golds) => {
+const getTotalReplacement = async (event_id, inner_rebate, inner_ior, inner_odds, pre_bet_info) => {
   // return Promise.resolve();
   // return Promise.resolve();
+  Logs.out('getTotalReplacement', event_id, inner_ior, inner_odds, pre_bet_info);
   if (!event_id) {
   if (!event_id) {
     return Promise.reject(new Error('event_id 无效'));
     return Promise.reject(new Error('event_id 无效'));
   }
   }
   if (!inner_ior) {
   if (!inner_ior) {
     return Promise.reject(new Error('inner_ior 无效'));
     return Promise.reject(new Error('inner_ior 无效'));
   }
   }
-  if (inner_odds?.length != 2 || inner_odds.some(item => typeof(item) !== 'number')) {
+  if (typeof(inner_odds) !== 'number') {
     return Promise.reject(new Error('inner_odds 无效'));
     return Promise.reject(new Error('inner_odds 无效'));
   }
   }
-  if (!outer_golds?.length || outer_golds.some(item => typeof(item?.gold) !== 'number' || typeof(item?.rebate) !== 'number')) {
-    return Promise.reject(new Error('outer_golds 无效'));
+  if (!pre_bet_info || typeof(pre_bet_info) !== 'object') {
+    return Promise.reject(new Error('pre_bet_info 无效'));
   }
   }
 
 
-  const { innerDefaultAmount, innerRebateRatio } = getSetting();
-  inner_base = typeof(inner_base) != 'undefined' ? +inner_base : innerDefaultAmount;
+  const { loss_out, inner_ref_value: inner_base, inner_odds: inner_odds_first } = getFirstInfo(pre_bet_info);
+
+  const { innerRebateRatio } = getSetting();
   inner_rebate = typeof(inner_rebate) != 'undefined' ? +inner_rebate : fixFloat(innerRebateRatio / 100, 3);
   inner_rebate = typeof(inner_rebate) != 'undefined' ? +inner_rebate : fixFloat(innerRebateRatio / 100, 3);
 
 
-  const inner_odds_value = fixFloat(inner_odds[0] * inner_odds[1], 3);
-  const outer_golds_rebate = outer_golds.map(item => item.gold * item.rebate).reduce((sum, rebate) => sum + rebate, 0);
-  const outer_golds_loss = outer_golds.map(item => item.gold).reduce((sum, gold) => sum + gold, 0) - outer_golds_rebate;
+  const inner_odds_value = fixFloat(inner_odds * (inner_odds_first+1), 3);
 
 
   const relation = getGamesRelation({ ids: [event_id], listEvents: true, listPC: true }).map(item => {
   const relation = getGamesRelation({ ids: [event_id], listEvents: true, listPC: true }).map(item => {
     const { rel, ...relationInfo } = item;
     const { rel, ...relationInfo } = item;
@@ -1298,10 +1289,10 @@ const getTotalReplacement = async (event_id, inner_base, inner_rebate, inner_ior
     const { sid, info, sol, ...solutionInfo } = solution;
     const { sid, info, sol, ...solutionInfo } = solution;
     const { win_profit_rate, win_average_rate, ...solInfo } = sol;
     const { win_profit_rate, win_average_rate, ...solInfo } = sol;
     const { cross_type } = solInfo;
     const { cross_type } = solInfo;
-    solInfo.win_side_a = typeof(solInfo.win_side_a) !== 'number' ? undefined : fixFloat(solInfo.win_side_a - outer_golds_loss);
-    solInfo.win_side_b = typeof(solInfo.win_side_b) !== 'number' ? undefined : fixFloat(solInfo.win_side_b - outer_golds_loss);
-    solInfo.win_side_c = cross_type == 'la_wa_rv' ? 0 : (typeof(solInfo.win_side_c) !== 'number' ? undefined : fixFloat(solInfo.win_side_c - outer_golds_loss));
-    solInfo.win_average = fixFloat(solInfo.win_average - outer_golds_loss);
+    solInfo.win_side_a = typeof(solInfo.win_side_a) !== 'number' ? undefined : fixFloat(solInfo.win_side_a - loss_out);
+    solInfo.win_side_b = typeof(solInfo.win_side_b) !== 'number' ? undefined : fixFloat(solInfo.win_side_b - loss_out);
+    solInfo.win_side_c = cross_type == 'la_wa_rv' ? 0 : (typeof(solInfo.win_side_c) !== 'number' ? undefined : fixFloat(solInfo.win_side_c - loss_out));
+    solInfo.win_average = fixFloat(solInfo.win_average - loss_out);
 
 
     return { ...solutionInfo, sol: solInfo };
     return { ...solutionInfo, sol: solInfo };
   });
   });

+ 3 - 2
server/routes/pstery.js

@@ -204,8 +204,9 @@ router.post('/calc_custom_total_profit', (req, res) => {
 
 
 // 补单计算
 // 补单计算
 router.post('/calc_total_replacement', (req, res) => {
 router.post('/calc_total_replacement', (req, res) => {
-  const { event_id, inner_base, inner_rebate, inner_ior, inner_odds, outer_golds } = req.body;
-  Games.getTotalReplacement(event_id, inner_base, inner_rebate, inner_ior, inner_odds, outer_golds)
+  console.log('calc_total_replacement', req.body);
+  const { event_id, inner_rebate, inner_ior, inner_odds, pre_bet_info } = req.body;
+  Games.getTotalReplacement(event_id, inner_rebate, inner_ior, inner_odds, pre_bet_info)
   .then(totalProfit => {
   .then(totalProfit => {
     res.sendSuccess(totalProfit);
     res.sendSuccess(totalProfit);
   })
   })

+ 40 - 34
server/triangle/totalProfitCalc.js

@@ -453,58 +453,63 @@ const calcSecondProfit = (betInfo) => {
 }
 }
 
 
 /**
 /**
- * 结合第一关亏损计算第二关新利润
+ * 获取第一关内盘信息及外盘损失
  */
  */
-const calcTotalProfitWithFixedFirst = (betInfo1, betInfo2, inner_base, inner_rebate) => {
+const getFirstInfo = (betInfo) => {
   const {
   const {
-    cross_type: crossType1,
-    inner_index: inner_index_1,
-    gold_side_a: goldA1,
-    gold_side_b: goldB1,
-    gold_side_c: goldC1,
-    odds_side_a: oddsA1,
-    odds_side_b: oddsB1,
-    odds_side_c: oddsC1,
-    rebate_side_a: rebateA1,
-    rebate_side_b: rebateB1,
-    rebate_side_c: rebateC1,
-    rebate_type_side_a: rebateTypeA1,
-    rebate_type_side_b: rebateTypeB1,
-    rebate_type_side_c: rebateTypeC1,
-  } = betInfo1;
+    inner_index,
+    gold_side_a,
+    gold_side_b,
+    gold_side_c,
+    odds_side_a,
+    odds_side_b,
+    odds_side_c,
+    rebate_side_a,
+    rebate_side_b,
+    rebate_side_c,
+  } = betInfo;
 
 
-  let loss_out_1 = 0, inner_ref_value = 0, inner_odds_1 = 0;
-  switch (inner_index_1) {
+  let loss_out = 0, inner_ref_value = 0, inner_odds = 0;
+  switch (inner_index) {
     case 0:
     case 0:
-      loss_out_1 = goldB1 * (1 - rebateB1) + goldC1 * (1 - rebateC1);
-      inner_ref_value = goldA1;
-      inner_odds_1 = oddsA1;
+      loss_out = gold_side_b * (1 - rebate_side_b) + gold_side_c * (1 - rebate_side_c);
+      inner_ref_value = gold_side_a;
+      inner_odds = odds_side_a;
       break;
       break;
     case 1:
     case 1:
-      loss_out_1 = goldA1 * (1 - rebateA1) + goldC1 * (1 - rebateC1);
-      inner_ref_value = goldB1;
-      inner_odds_1 = oddsB1;
+      loss_out = gold_side_a * (1 - rebate_side_a) + gold_side_c * (1 - rebate_side_c);
+      inner_ref_value = gold_side_b;
+      inner_odds = odds_side_b;
       break;
       break;
     case 2:
     case 2:
-      const { loss_proportion_a: lpA1, loss_proportion_b: lpB1 } = lossProportion(betInfo1);
-      loss_out_1 = goldA1 * lpA1 + goldB1 * lpB1;
-      inner_ref_value = goldC1;
-      inner_odds_1 = oddsC1;
+      const { loss_proportion_a, loss_proportion_b } = lossProportion(betInfo);
+      loss_out = gold_side_a * loss_proportion_a + gold_side_b * loss_proportion_b;
+      inner_ref_value = gold_side_c;
+      inner_odds = odds_side_c;
       break;
       break;
   }
   }
+  return { loss_out, inner_ref_value, inner_odds };
+}
+
+/**
+ * 结合第一关亏损计算第二关新利润
+ */
+const calcTotalProfitWithFixedFirst = (betInfo1, betInfo2, inner_base, inner_rebate) => {
+
+  const { loss_out, inner_ref_value, inner_odds } = getFirstInfo(betInfo1);
 
 
   if (inner_base && inner_base != inner_ref_value) {
   if (inner_base && inner_base != inner_ref_value) {
     Logs.out('inner_base is not equal to inner_ref_value', inner_base, inner_ref_value);
     Logs.out('inner_base is not equal to inner_ref_value', inner_base, inner_ref_value);
     throw new Error('内盘基准额度和内盘索引额度不一致');
     throw new Error('内盘基准额度和内盘索引额度不一致');
   }
   }
 
 
-  const profitInfo = calcSecondProfit({ ...betInfo2, inner_base, inner_odds_first: inner_odds_1, inner_rebate });
+  const profitInfo = calcSecondProfit({ ...betInfo2, inner_base, inner_odds_first: inner_odds, inner_rebate });
   const { cross_type } = profitInfo;
   const { cross_type } = profitInfo;
 
 
-  profitInfo.win_side_a = typeof(profitInfo.win_side_a) !== 'number' ? undefined : fixFloat(profitInfo.win_side_a - loss_out_1);
-  profitInfo.win_side_b = typeof(profitInfo.win_side_b) !== 'number' ? undefined : fixFloat(profitInfo.win_side_b - loss_out_1);
-  profitInfo.win_side_c = cross_type == 'la_wa_rv' ? 0 : (typeof(profitInfo.win_side_c) !== 'number' ? undefined : fixFloat(profitInfo.win_side_c - loss_out_1));
-  profitInfo.win_average = fixFloat(profitInfo.win_average - loss_out_1);
+  profitInfo.win_side_a = typeof(profitInfo.win_side_a) !== 'number' ? undefined : fixFloat(profitInfo.win_side_a - loss_out);
+  profitInfo.win_side_b = typeof(profitInfo.win_side_b) !== 'number' ? undefined : fixFloat(profitInfo.win_side_b - loss_out);
+  profitInfo.win_side_c = cross_type == 'la_wa_rv' ? 0 : (typeof(profitInfo.win_side_c) !== 'number' ? undefined : fixFloat(profitInfo.win_side_c - loss_out));
+  profitInfo.win_average = fixFloat(profitInfo.win_average - loss_out);
 
 
   const { win_average_rate, win_profit_rate, ...profitInfoRest } = profitInfo;
   const { win_average_rate, win_profit_rate, ...profitInfoRest } = profitInfo;
 
 
@@ -515,4 +520,5 @@ const calcTotalProfitWithFixedFirst = (betInfo1, betInfo2, inner_base, inner_reb
 module.exports = {
 module.exports = {
   calcTotalProfit,
   calcTotalProfit,
   calcTotalProfitWithFixedFirst,
   calcTotalProfitWithFixedFirst,
+  getFirstInfo,
 };
 };