flyzto před 5 měsíci
rodič
revize
6d09d813e4

+ 24 - 18
server/models/GamesPs.js

@@ -225,10 +225,12 @@ const syncBaseEvents = ({ mk, games, outrights }) => {
           match
         };
       }).filter(item => item.match.every(entry => entry.value !== 0));
-      return { ...gameInfo, matches, uptime: Math.min(evtime, sptime) };
+      return { ...gameInfo, matches, uptime: Math.min(evtime ?? 0, sptime ?? 0) };
     });
 
-    submitOdds({ platform: 'ps', mk, games: gamesList });
+    if (gamesList.filter(item => item.uptime > 0).length) {
+      submitOdds({ platform: 'ps', mk, games: gamesList });
+    }
 
     const relatedGames = Object.values(GAMES.Relations).map(item => item.rel?.['ps'] ?? {});
 
@@ -611,28 +613,32 @@ setInterval(() => {
 /**
  * 获取综合利润
  */
-const getTotalProfit = (sid1, sid2, gold_side_inner) => {
+const getTotalProfit = async (sid1, sid2, gold_side_inner) => {
   const preSolution = GAMES.Solutions[sid1];
   const subSolution = GAMES.Solutions[sid2];
-  const relId1 = preSolution?.info?.id;
-  const relId2 = subSolution?.info?.id;
-  const relIds = [relId1, relId2];
-  const gamesEvents = getGamesEvents({ relIds });
-
-  const gamesRelations = getGamesRelation();
-  const relationsMap = new Map(gamesRelations.map(item => [item.id, item.rel]));
-  const preRelation = relationsMap.get(relId1);
-  const subRelation = relationsMap.get(relId2);
-  preSolution.info = { id: relId1, ...preRelation };
-  subSolution.info = { id: relId2, ...subRelation };
+  // const relId1 = preSolution?.info?.id;
+  // const relId2 = subSolution?.info?.id;
+  // const relIds = [relId1, relId2];
+  // const gamesEvents = getGamesEvents({ relIds });
+
+  // const gamesRelations = getGamesRelation();
+  // const relationsMap = new Map(gamesRelations.map(item => [item.id, item.rel]));
+  // const preRelation = relationsMap.get(relId1);
+  // const subRelation = relationsMap.get(relId2);
+  // preSolution.info = { id: relId1, ...preRelation };
+  // subSolution.info = { id: relId2, ...subRelation };
 
   const sol1 = preSolution?.sol;
   const sol2 = subSolution?.sol;
-  if (!sol1 || !sol2 || !gold_side_inner) {
-    return {};
+  if (!sol1 || !sol2) {
+    return Promise.reject(new Error('SOLUTION_ID_INVALID'));
+  }
+  if (!gold_side_inner) {
+    return Promise.reject(new Error('GOLD_SIDE_INNER_INVALID'));
   }
-  const profit = calcTotalProfit(sol1, sol2, gold_side_inner);
-  return { profit, preSolution, subSolution, gamesEvents };
+  const { innerRebateRatio: rebate_side_inner } = await getSetting();
+  const profit = calcTotalProfit(sol1, sol2, gold_side_inner, rebate_side_inner);
+  return { profit, solutions: [preSolution, subSolution] };
 }
 
 /**

+ 7 - 2
server/routes/pstery.js

@@ -79,8 +79,13 @@ router.get('/get_solutions', (req, res) => {
 // 获取综合利润方案
 router.post('/calc_total_profit', (req, res) => {
   const [sid1, sid2, gold_side_inner] = req.body;
-  const totalProfit = Games.getTotalProfit(sid1, sid2, gold_side_inner);
-  res.sendSuccess(totalProfit);
+  Games.getTotalProfit(sid1, sid2, gold_side_inner)
+  .then(totalProfit => {
+    res.sendSuccess(totalProfit);
+  })
+  .catch(err => {
+    res.badRequest(err.message);
+  });
 });
 
 module.exports = router;

+ 33 - 18
server/triangle/totalProfitCalc.js

@@ -250,31 +250,45 @@ const calcGoldsWithWinTarget = (data) => {
 
   const win_inner = fixFloat(win_inner_2 - loss_out_2);
 
+  const goldsInfo = { goldA1, goldB1, goldC1, goldA2, goldB2, goldC2 }
+
+  if (goldsInfo[inner_base_key]) {
+    goldsInfo[inner_base_key] = win_inner_1;
+  }
+
   const result = {
-    goldA1,
-    goldB1,
-    goldC1,
-    goldA2,
-    goldB2,
-    goldC2,
+    bet_info: [
+      {
+        gold_side_a: goldsInfo.goldA1,
+        gold_side_b: goldsInfo.goldB1,
+        gold_side_c: goldsInfo.goldC1,
+        odds_side_a: oddsA1,
+        odds_side_b: oddsB1,
+        odds_side_c: oddsC1,
+        inner_index: inner_index_1,
+      },
+      {
+        gold_side_a: goldsInfo.goldA2,
+        gold_side_b: goldsInfo.goldB2,
+        gold_side_c: goldsInfo.goldC2,
+        odds_side_a: oddsA2,
+        odds_side_b: oddsB2,
+        odds_side_c: oddsC2,
+        inner_index: inner_index_2,
+      }
+    ],
     win_inner,
-    inner_index_1,
-    inner_index_2,
     inner_base: gold_side_inner,
   }
 
-  if (result[inner_base_key]) {
-    result[inner_base_key] = win_inner_1;
-  }
-
   return result;
 }
 
-const calcTotalProfit = (sol1, sol2, gold_side_inner) => {
-
-  const winTarget1 = sol1.win_average;
-  const winTarget2 = sol2.win_average;
-  const winTarget = fixFloat(Math.min(winTarget1, winTarget2), 2);
+const calcTotalProfit = (sol1, sol2, gold_side_inner, rebate_side_inner) => {
+  const rebateInner = gold_side_inner * rebate_side_inner / 100;
+  const winTarget1 = fixFloat(sol1.win_average - rebateInner);
+  const winTarget2 = fixFloat(sol2.win_average - rebateInner);
+  const winTarget = fixFloat(Math.min(winTarget1, winTarget2));
 
   const win1 = calcGoldsWithWinTarget({ gold_side_inner, win_target: winTarget1, sol1, sol2 })?.win_inner;
   const win2 = calcGoldsWithWinTarget({ gold_side_inner, win_target: winTarget2, sol1, sol2 })?.win_inner;
@@ -287,10 +301,11 @@ const calcTotalProfit = (sol1, sol2, gold_side_inner) => {
   for (let i = start; i > end; i--) {
     const win_target = i;
     const goldsInfo = calcGoldsWithWinTarget({ gold_side_inner, win_target, sol1, sol2 });
+    const { win_inner, ...goldsRest } = goldsInfo;
     const win_diff = Math.abs(fixFloat(win_target - goldsInfo.win_inner));
     const lastResult = result.at(-1);
     if (!lastResult?.win_diff || win_diff < lastResult.win_diff) {
-      result.push({ win_target: fixFloat(win_target), win_diff, ...goldsInfo });
+      result.push({ win_target: fixFloat(win_target + rebateInner), win_diff, win_inner: fixFloat(win_inner + rebateInner), ...goldsRest });
     }
     else {
       break;

+ 49 - 29
server/triangle/trangleCalc.js

@@ -126,37 +126,44 @@ const triangleProfitCalc = (goldsInfo, oddsOption) => {
 
   let inner_rebate = 0;
   if (innerIndex == 0) {
-    inner_rebate = x * innerRebateRatio;
+    inner_rebate = x * innerRebateRatio / 100;
   }
   else if (innerIndex == 1) {
-    inner_rebate = y * innerRebateRatio;
+    inner_rebate = y * innerRebateRatio / 100;
   }
   else if (innerIndex == 2) {
-    inner_rebate = z * innerRebateRatio;
+    inner_rebate = z * innerRebateRatio / 100;
   }
 
+  const k1 = a * (1 + A);
+  const k2 = 1 - A;
+  const k3 = b * (1 + B);
+  const k4 = 1 - B;
+  const k5 = c * (1 + C);
+  const k6 = 1 - C;
+
   let win_side_a = 0, win_side_b = 0, win_side_c = 0;
-  win_side_a = a*x - y - z + a*A*x + B*y + C*z;
-  win_side_b = b*y - x - z + b*B*y + A*x + C*z;
+  win_side_a = k1*x - k4*y - k6*z;
+  win_side_b = k3*y - k2*x - k6*z;
 
   switch (crossType) {
     case 'la_wh_wa': // 全输 半赢 全赢
-      win_side_c = c*z - x + b*y/2 + c*C*z + A*x + b*B*y/2;
+      win_side_c = k5*z - k2*x + k3*y/2;
       break;
     case 'la_dr_wa': // 全输 和局 全赢
-      win_side_c = c*z - x + c*C*z + A*x;
+      win_side_c = k5*z - k2*x;
       break;
     case 'la_lh_wa': // 全输 半输 全赢
-      win_side_c = c*z - x - y/2 + c*C*z + A*x + B*y/2;
+      win_side_c = k5*z - k2*x - k4*y/2;
       break;
     case 'lh_dr_wa': // 半输 和局 全赢
-      win_side_c = c*z - x/2 + c*C*z + A*x/2;
+      win_side_c = k5*z - k2*x/2;
       break;
     case 'lh_lh_wa': // 半输 半输 全赢
-      win_side_c = c*z - x/2 - y/2 + c*C*z + A*x/2 + B*y/2;
+      win_side_c = k5*z - k2*x/2 - k4*y/2;
       break;
     case 'la_la_wa': // 全输 全输 全赢
-      win_side_c = c*z - x - y + c*C*z + A*x + B*y;
+      win_side_c = k5*z - k2*x - k4*y;
       break;
   }
 
@@ -221,37 +228,50 @@ const triangleGoldCalc = (oddsInfo, oddsOption) => {
   }
 
   return {
-    gold_side_a: x,
+    gold_side_a: fixFloat(x),
     gold_side_b: fixFloat(y),
     gold_side_c: fixFloat(z),
-    odds_side_a: a,
-    odds_side_b: b,
-    odds_side_c: c,
+    odds_side_a: fixFloat(a),
+    odds_side_b: fixFloat(b),
+    odds_side_c: fixFloat(c),
   };
 
 }
 
 const eventSolutions = (oddsInfo, oddsOption) => {
-  const { innerDefaultAmount } = SETTING;
+  const { innerDefaultAmount, innerRebateRatio } = SETTING;
   const goldsInfo = triangleGoldCalc(oddsInfo, oddsOption);
   if (!goldsInfo) {
     return;
   }
   const profitInfo = triangleProfitCalc(goldsInfo, oddsOption);
 
-  const { odds_side_a, odds_side_b, odds_side_c } = goldsInfo;
+  const { odds_side_a, odds_side_b, odds_side_c, gold_side_a, gold_side_b, gold_side_c } = goldsInfo;
   const { win_side_a, win_side_b, win_side_c, win_average } = profitInfo;
+
+  let { crossType, innerIndex, rebateA, rebateB, rebateC } = oddsOption;
+  if (innerIndex == 0) {
+    rebateA = fixFloat(innerRebateRatio / 100, 3);
+  }
+  else if (innerIndex == 1) {
+    rebateB = fixFloat(innerRebateRatio / 100, 3);
+  }
+  else if (innerIndex == 2) {
+    rebateC = fixFloat(innerRebateRatio / 100, 3);
+  }
+
+  const win_profit = fixFloat(win_average / (gold_side_a + gold_side_b + gold_side_c) * 100);
+
   return {
-    odds_side_a,
-    odds_side_b,
-    odds_side_c,
-    win_side_a, win_side_b, win_side_c,
-    win_average,
-    rebate_side_a: oddsOption.rebateA,
-    rebate_side_b: oddsOption.rebateB,
-    rebate_side_c: oddsOption.rebateC,
-    cross_type: oddsOption.crossType,
-    inner_index: oddsOption.innerIndex,
+    odds_side_a, odds_side_b, odds_side_c,
+    // gold_side_a, gold_side_b, gold_side_c,
+    // win_side_a, win_side_b, win_side_c,
+    win_average, win_profit,
+    rebate_side_a: rebateA,
+    rebate_side_b: rebateB,
+    rebate_side_c: rebateC,
+    cross_type: crossType,
+    inner_index: innerIndex,
     inner_base: innerDefaultAmount,
   }
 }
@@ -270,11 +290,11 @@ const sortCpr = (cpr) => {
  * 添加返佣
  */
 const attachRebate = (ior) => {
-  const { innerRebateRatio, obRebateRatio, hgRebateRatio } = SETTING;
+  const { obRebateRatio, hgRebateRatio } = SETTING;
   const { p } = ior;
   let rebate = 0;
   if (p == 'ps') {
-    rebate = innerRebateRatio;
+    rebate = 0;
   }
   else if (p == 'ob') {
     rebate = obRebateRatio;

+ 6 - 2
web/apps/web-antd/src/views/match/solutions/index.vue

@@ -246,6 +246,10 @@ const formatEvents = (events, cprKeys) => {
       }
     }
 
+    if (!ratioKey) {
+      return;
+    }
+
     if (!eventsMap[ratioKey]) {
       eventsMap[ratioKey] = new Array(3).fill(undefined);
     }
@@ -347,9 +351,9 @@ onUnmounted(() => {
           <Form.Item label="PS 投注">
             <InputNumber size="small" placeholder="PS投注" min="1000" v-model:value="psOptions.bet" />
           </Form.Item>
-          <Form.Item label="PS 返点">
+          <!-- <Form.Item label="PS 返点">
             <InputNumber size="small" placeholder="PS返点" min="0" v-model:value="psOptions.rebate" />
-          </Form.Item>
+          </Form.Item> -->
         </Form>
       </div>
       <div class="solution-header">