flyzto 6 luni în urmă
părinte
comite
2ad812d95a

+ 55 - 4
server/models/GamesPs.js

@@ -281,6 +281,36 @@ const updateGamesEvents = ({ platform, mk, games, outrights }) => {
   });
 }
 
+/**
+ * 获取比赛盘口
+ */
+const getGamesEvents = ({ platform, relIds = [] } = {}) => {
+  const idSet = new Set(relIds);
+  const relations = { ...GAMES.Relations };
+  Object.keys(relations).forEach(id => {
+    if (idSet.size && !idSet.has(+id)) {
+      delete relations[id];
+    }
+  });
+
+  if (platform) {
+    return Object.values(relations).map(rel => rel[platform] ?? {});
+  }
+
+  const gamesEvents = {};
+  Object.values(relations).forEach(({ rel }) => {
+    Object.keys(rel).forEach(platform => {
+      const game = rel[platform] ?? {};
+      const { eventId, events, special } = game;
+      if (!gamesEvents[platform]) {
+        gamesEvents[platform] = {};
+      }
+      gamesEvents[platform][eventId] = { ...events, ...special };
+    });
+  });
+  return gamesEvents;
+}
+
 /**
  * 获取关联比赛
  */
@@ -334,7 +364,7 @@ const fetchGamesRelation = async (mk='') => {
             timestamp
           } : null
         };
-        return { id, mk, rel };
+        return { id: event_id, mk, rel };
       }) ?? [];
       return gamesRelation;
     }
@@ -342,7 +372,7 @@ const fetchGamesRelation = async (mk='') => {
   });
 }
 
-const getGamesRelation = ({ mk, listEvents }) => {
+const getGamesRelation = ({ mk, listEvents } = {}) => {
   const relations = Object.values(GAMES.Relations).filter(item => {
     if (typeof(mk) == 'undefined') {
       return true;
@@ -352,7 +382,7 @@ const getGamesRelation = ({ mk, listEvents }) => {
   if (listEvents) {
     return relations;
   }
-  return relations.map(item => {
+  const gamesRelation = relations.map(item => {
     const { rel, ...relationInfo } = item;
     const tempRel = { ...rel };
     Object.keys(tempRel).forEach(platform => {
@@ -361,6 +391,7 @@ const getGamesRelation = ({ mk, listEvents }) => {
     });
     return { ...relationInfo, rel: tempRel };
   });
+  return gamesRelation;
 }
 
 /**
@@ -495,6 +526,26 @@ const updateSolutions = (solutions) => {
   }
 }
 
+/**
+ * 获取中单方案
+ */
+const getSolutions = async () => {
+  const solutionsList = Object.values(GAMES.Solutions);
+  const relIds = solutionsList.map(item => item.info.id);
+  const gamesEvents = getGamesEvents({ relIds });
+  const gamesRelation = getGamesRelation();
+  const relationsMap = new Map(gamesRelation.map(item => [item.id, item.rel]));
+  const solutions = solutionsList.sort((a, b) => b.sol.win_average - a.sol.win_average).map(item => {
+    const { info: { id } } = item;
+    const relation = relationsMap.get(id);
+    return {
+      ...item,
+      info: { id, ...relation }
+    }
+  });
+  return { solutions, gamesEvents };
+}
+
 /**
  * 清理中单方案
  */
@@ -519,7 +570,6 @@ const solutionsCleanup = () => {
 
   if (updateIds.remove.length) {
     syncSolutions(updateIds);
-    // Logs.outDev('solutions history cleanup', updateIds);
   }
 }
 
@@ -581,4 +631,5 @@ module.exports = {
   updateGamesList, updateGamesEvents,
   getGamesRelation,
   updateGamesResult,
+  getSolutions,
 }

+ 11 - 0
server/routes/pstery.js

@@ -65,4 +65,15 @@ router.get('/get_games_relation', (req, res) => {
   res.sendSuccess(gamesRelation);
 });
 
+// 获取中单方案
+router.get('/get_solutions', (req, res) => {
+  Games.getSolutions()
+  .then(({ solutions, gamesEvents }) => {
+    res.sendSuccess({ solutions, gamesEvents });
+  })
+  .catch(err => {
+    res.badRequest(err.message);
+  });
+});
+
 module.exports = router;

+ 39 - 38
server/triangle/totalProfitCalc.js

@@ -31,8 +31,8 @@ const HandicapCalc = function (data) {
       return calcTemplate([
         () => {
           const x = g;
-          const m = t + x - A * x;
-          const z = m / k5 * 2 + k6;
+          const m = t + k2 * x;
+          const z = m / (2 * k5 + k6);
           const y = (k5 + k6) * m / (k3 * k5 + k3 * k6 / 2);
           return { x, y, z };
         },
@@ -48,14 +48,15 @@ const HandicapCalc = function (data) {
       return calcTemplate([
         () => {
           const x = g;
-          const z = (t + x) / c;
-          const y = (t + x + z) / b;
+          const m = t + k2 * x;
+          const z = m / k5;
+          const y = (k5 + k6) * m / (k3 * k5);
           return { x, y, z };
         },
         () => {
           const y = g;
-          const z = ((a + 1) * t + y) / (a * c - 1);
-          const x = ((c + 1) * t + c * y) / (a * c - 1);
+          const z = ((k1 + k2) * t + k2 * k4 * y) / (k1 * k5 - k2 * k6);
+          const x = ((k5 + k6) * t + k4 * k5 * y) / (k1 * k5 - k2 * k6);
           return { x, y, z };
         }
       ]);
@@ -64,14 +65,15 @@ const HandicapCalc = function (data) {
       return calcTemplate([
         () => {
           const x = g;
-          const z = (2 * b + 1) * (t + x) / (2 * b * c - 1);
-          const y = (c + 1) * (t + x) / (b * c - 0.5);
+          const m = t + k2 * x;
+          const z = (2 * k3 + k4) * m / (2 * k3 * k5 - k4 * k6);
+          const y = (k5 + k6) * m / (k3 * k5 - k4 * k6 / 2);
           return { x, y, z };
         },
         () => {
           const y = g;
-          const z = ((a + 1) * t + (a / 2 + 1) * y) / (a * c - 1);
-          const x = ((c + 1) * t + (c + 0.5) * y) / (a * c - 1);
+          const z = ((k1 + k2) * t + (k2 * k4 + k1 * k4 / 2) * y) / (k1 * k5 - k2 * k6);
+          const x = ((k5 + k6) * t + (k4 * k5 + k4 * k6 / 2) * y) / (k1 * k5 - k2 * k6);
           return { x, y, z };
         }
       ]);
@@ -80,14 +82,14 @@ const HandicapCalc = function (data) {
       return calcTemplate([
         () => {
           const x = g;
-          const z = (t + x / 2) / c;
-          const y = (t + x + z) / b;
+          const z = (t + k2 * x / 2) / k5;
+          const y = ((k5 + k6) * t + (k2 * k5 + k2 * k4 / 2) * x) / (k3 * k5);
           return { x, y, z };
         },
         () => {
           const y = g;
-          const z = ((2 * a + 1) * t + y) / (2 * a * c - 1);
-          const x = ((c + 1) * t + c * y) / (a * c - 0.5);
+          const z = ((2 * k1 + k2) * t + k2 * k4 * y) / (2 * k1 * k5 - k2 * k6);
+          const x = ((k5 + k6) * t + k4 * k5 * y) / (k1 * k5 - k2 * k6 / 2);
           return { x, y, z };
         }
       ]);
@@ -96,13 +98,14 @@ const HandicapCalc = function (data) {
       return calcTemplate([
         () => {
           const x = g;
-          const z = ((2 * b + 1) * t + (b + 1) * x) / (2 * b * c - 1);
-          const y = ((c + 1) * t + (c + 0.5) * x) / (b * c - 0.5);
+          const z = ((2 * k3 + k4) * t + (k3 + k4) * k2 * x) / (2 * k3 * k5 - k4 * k6);
+          const y = ((k5 + k6) * t + (k5 + k6 / 2) * k2 * x) / (k3 * k5 - k4 * k6 / 2);
+          return { x, y, z };
         },
         () => {
           const y = g;
-          const z = ((2 * a + 1) * t + (a + 1) * y) / (2 * a * c - 1);
-          const x = ((c + 1) * t + (c + 0.5) * y) / (a * c - 0.5);
+          const z = ((2 * k1 + k2) * t + (k1 + k2) * k4 * y) / (2 * k1 * k5 - k2 * k6);
+          const x = ((k5 + k6) * t + (k5 + k6 / 2) * k4 * y) / (k1 * k5 - k2 * k6 / 2);
           return { x, y, z };
         }
       ]);
@@ -111,14 +114,16 @@ const HandicapCalc = function (data) {
       return calcTemplate([
         () => {
           const x = g;
-          const z = (b + 1) * (t + x) / (b * c - 1);
-          const y = (c + 1) * (t + x) / (b * c - 1);
+          const m = t + k2 * x;
+          const z = (k3 + k4) * m / (k3 * k5 - k4 * k6);
+          const y = (k5 + k6) * m / (k3 * k5 - k4 * k6);
           return { x, y, z };
         },
         () => {
           const y = g;
-          const z = (a + 1) * (t + y) / (a * c - 1);
-          const x = (c + 1) * (t + y) / (a * c - 1);
+          const m = t + k2 * y;
+          const z = (k1 + k2) * m / (k1 * k5 - k2 * k6);
+          const x = (k5 + k6) * m / (k1 * k5 - k2 * k6);
           return { x, y, z };
         }
       ]);
@@ -169,32 +174,29 @@ const calcExternalHandicap = (data) => {
     inner_index: i,
     cross_type: t,
     win_target: w,
-    loss_out_1,
+    loss_out: l = 0,
   } = data;
-  const l = loss_out_1 ?? 0;
   const calc = new HandicapCalc({ i, g, a, b, c, A, B, C, w, l });
   const { x, y, z } = calc?.[t]() ?? {};
   return {
     gold_side_a: fixFloat(x),
     gold_side_b: fixFloat(y),
     gold_side_c: fixFloat(z),
-    inner_index: i,
   }
 }
 
 const calcGoldsWithWinTarget = (data) => {
   const { gold_side_inner, win_target, sol1, sol2 } = data;
   const {
-    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,
     inner_index: inner_index_1,
+  } = sol1;
+  const {
+    gold_side_a: goldA1,
+    gold_side_b: goldB1,
+    gold_side_c: goldC1,
   } = calcExternalHandicap({ ...sol1, gold_side_inner, win_target });
 
   let loss_out_1 = 0, win_inner_1 = 0;
@@ -215,17 +217,16 @@ const calcGoldsWithWinTarget = (data) => {
   }
 
   const {
-    gold_side_a: goldA2,
-    gold_side_b: goldB2,
-    gold_side_c: goldC2,
     odds_side_a: oddsA2,
     odds_side_b: oddsB2,
     odds_side_c: oddsC2,
-    rebate_side_a: rebateA2,
-    rebate_side_b: rebateB2,
-    rebate_side_c: rebateC2,
     inner_index: inner_index_2,
-  } = calcExternalHandicap({ ...sol2, gold_side_inner, win_target, loss_out_1 });
+  } = sol2;
+  const {
+    gold_side_a: goldA2,
+    gold_side_b: goldB2,
+    gold_side_c: goldC2,
+  } = calcExternalHandicap({ ...sol2, gold_side_inner, win_target, loss_out: loss_out_1 });
 
   let loss_out_2 = 0, win_inner_2 = 0, inner_base_key;
   switch (inner_index_2) {

+ 1 - 1
web/apps/web-antd/src/views/match/components/match_card.vue

@@ -60,7 +60,7 @@ defineProps({
       <em>VS</em>
       <span class="away-name">{{ teamAwayName }}</span>
     </div>
-    <div class="events-list" :class="{'list-row2': platform == 'jc'}">
+    <div class="events-list" :class="{'list-row2': events.length <= 2}">
       <table>
         <tr v-for="item in events">
           <th>{{ parseEventKey(item[0]) }}</th>

+ 66 - 55
web/apps/web-antd/src/views/match/solutions/index.vue

@@ -13,7 +13,7 @@ const solutions = ref([]);
 const selectedSolutions = reactive([]);
 const totalProfit = ref({});
 
-const jcOptions = reactive({
+const psOptions = reactive({
   bet: 10000,
   rebate: 12,
 });
@@ -39,34 +39,34 @@ const totalProfitValue = computed(() => {
   const sol1 = formatSolution(preSolution, gamesEvents);
   const sol2 = formatSolution(subSolution, gamesEvents);
 
-  const jcScale = jcOptions.bet / profit.jc_base ?? 10000;
-  const jcRebate = jcOptions.bet * jcOptions.rebate / 100;
+  const psScale = psOptions.bet / profit.ps_base ?? 10000;
+  const psRebate = psOptions.bet * psOptions.rebate / 100;
   const profitInfo = {};
   Object.keys(profit).forEach(key => {
     if (key == 'win_diff') {
       return;
     }
     if (key.startsWith('gold')) {
-      profitInfo[key] = fixFloat(profit[key] * jcScale);
+      profitInfo[key] = fixFloat(profit[key] * psScale);
     }
     else if (key.startsWith('win_')) {
-      profitInfo[key] = fixFloat(profit[key] * jcScale + jcRebate);
+      profitInfo[key] = fixFloat(profit[key] * psScale + psRebate);
     }
   });
 
-  const jcInfo = [];
+  const psInfo = [];
   const outPreSol = [];
   const outSubSol = [];
 
   const solutions = [sol1, sol2].filter(item => item);
   solutions.forEach((item, index) => {
-    const { sol: { jc_index }, cpr } = item;
+    const { sol: { ps_index }, cpr } = item;
     const newCpr = [...cpr];
-    const jc_info = newCpr.splice(jc_index, 1);
-    jcInfo.push({ ...jc_info[0] });
+    const ps_info = newCpr.splice(ps_index, 1);
+    psInfo.push({ ...ps_info[0] });
     newCpr.forEach((c, i) => {
       let side = '';
-      if (jc_index == 0) {
+      if (ps_index == 0) {
         if (i == 0) {
           side = "B"
         }
@@ -74,7 +74,7 @@ const totalProfitValue = computed(() => {
           side = "M";
         }
       }
-      else if (jc_index == 1) {
+      else if (ps_index == 1) {
         if (i == 0) {
           side = "A";
         }
@@ -99,36 +99,34 @@ const totalProfitValue = computed(() => {
     })
   });
 
-  return { solutions, profit: profitInfo, jcInfo, outPreSol, outSubSol };
+  return { solutions, profit: profitInfo, psInfo, outPreSol, outSubSol };
 });
 
 const solutionsList = computed(() => {
   const startTimestamp = selectedSolutions[0]?.timestamp ?? 0;
   return solutions.value.map(item => {
     const selected = selectedSolutions.findIndex(sol => sol.sid === item.sid) >= 0;
-    const disabled = !selected && (item.info.jc.timestamp < startTimestamp + 1000 * 60 * 60 * 2);
+    const disabled = !selected && (item.info.ps.timestamp < startTimestamp + 1000 * 60 * 60 * 2);
     const currentSol = { ...item.sol };
 
-    const jcScale = jcOptions.bet / currentSol.jc_base;
-    const jcRebate = jcOptions.bet * jcOptions.rebate / 100;
+    const psScale = psOptions.bet / currentSol.inner_base;
+    const psRebate = psOptions.bet * psOptions.rebate / 100;
 
     Object.keys(currentSol).forEach(key => {
       if (key.startsWith('gold_')) {
-        currentSol[key] = fixFloat(currentSol[key] * jcScale);
+        currentSol[key] = fixFloat(currentSol[key] * psScale);
       }
       else if (key.startsWith('win_')) {
-        currentSol[key] = fixFloat(currentSol[key] * jcScale + jcRebate);
+        currentSol[key] = fixFloat(currentSol[key] * psScale + psRebate);
       }
     });
-    // console.log(new Date(item.info.jc.timestamp), new Date(startTimestamp), disabled);
     return { ...item, sol: currentSol, selected, disabled };
-  })
-  // .filter(item => !item.disabled);
+  });
 });
 
 const getSolutions = async () => {
   try {
-    const data = await requestClient.get('/triangle/get_solutions');
+    const data = await requestClient.get('/pstery/get_solutions');
     return data;
   }
   catch (error) {
@@ -141,7 +139,7 @@ const getSolutions = async () => {
 const calcTotalProfit = async () => {
   const [sid1, sid2] = selectedSolutions.map(item => item.sid);
   try {
-    const totalProfit = await requestClient.post('/triangle/calc_total_profit', { sid1, sid2, gold_side_jc: 10000 });
+    const totalProfit = await requestClient.post('/pstery/calc_total_profit', { sid1, sid2, gold_side_ps: 10000 });
     return totalProfit;
   }
   catch (error) {
@@ -160,6 +158,9 @@ const parseIorKey = (iorKey) => {
 const formatJcEvents = (events) => {
   const eventsMap = {};
   Object.keys(events).forEach(key => {
+    if (key == 'ior_rh_05' || key == 'ior_rc_05') {
+      return;
+    }
     const { type, side, ratio } = parseIorKey(key);
     let ratioKey, index;
     if (type === 'r') {
@@ -174,7 +175,15 @@ const formatJcEvents = (events) => {
     }
     else if (type === 'm') {
       ratioKey = 0;
-      index = 1;
+      if (side == 'h') {
+        index = 0;
+      }
+      else if (side == 'c') {
+        index = 2;
+      }
+      else {
+        index = 1;
+      }
     }
     else if (type === 'wm') {
       if (side === 'h') {
@@ -207,7 +216,7 @@ const formatJcEvents = (events) => {
   });
   return Object.keys(eventsMap).sort((a, b) => b.localeCompare(a)).map(key => {
     return [key, ...eventsMap[key]];
-  });
+  }).filter(item => item.length == 4 && !item.some(v => !v));
 }
 
 const rivalIor = (ior) => {
@@ -247,9 +256,11 @@ const formatEvents = (events, cprKeys) => {
     }
     else if (type === 'm') {
       ratioKey = 'm';
-      values[0] = { key: '', value: 0 };
-      values[1] = { key, value: events[key] ?? 0 };
-      values[2] = { key: '', value: 0 };
+      if (side == 'n') {
+        values[0] = { key: 'ior_mh', value: events['ior_mh'] ?? 0 };
+        values[1] = { key: 'ior_mn', value: events['ior_mn'] ?? 0 };
+        values[2] = { key: 'ior_mc', value: events['ior_mc'] ?? 0 };
+      }
     }
     else if (type === 'wm') {
       ratioKey = `wm_${Math.abs(ratio)}`;
@@ -289,17 +300,17 @@ const formatSolution = (solution, eventsList) => {
 
   const cprKeys = cpr.map(item => item.k);
 
-  const jcEvents = eventsList.jc?.[info.jc.eventId] ?? {};
   const psEvents = eventsList.ps?.[info.ps.eventId] ?? {};
   const obEvents = eventsList.ob?.[info.ob.eventId] ?? {};
+  const hgEvents = eventsList.hg?.[info.hg.eventId] ?? {};
 
-  info.jc.events = formatJcEvents(jcEvents);
-  info.ps.events = formatEvents(psEvents, cprKeys);
+  info.ps.events = formatJcEvents(psEvents);
   info.ob.events = formatEvents(obEvents, cprKeys);
+  info.hg.events = formatEvents(hgEvents, cprKeys);
 
-  info.jc.dateTime = dayjs(info.jc.timestamp).format('YYYY-MM-DD HH:mm:ss');
   info.ps.dateTime = dayjs(info.ps.timestamp).format('YYYY-MM-DD HH:mm:ss');
   info.ob.dateTime = dayjs(info.ob.timestamp).format('YYYY-MM-DD HH:mm:ss');
+  info.hg.dateTime = dayjs(info.hg.timestamp).format('YYYY-MM-DD HH:mm:ss');
 
   cpr.forEach(item => {
     const { k, p } = item;
@@ -366,39 +377,39 @@ onUnmounted(() => {
     <div class="contents-header transition-all duration-200" :style="headerStyle">
       <div class="solution-options">
         <Form layout="inline">
-          <Form.Item label="JC 投注">
-            <InputNumber size="small" placeholder="JC投注" min="1000" v-model:value="jcOptions.bet" />
+          <Form.Item label="PS 投注">
+            <InputNumber size="small" placeholder="PS投注" min="1000" v-model:value="psOptions.bet" />
           </Form.Item>
-          <Form.Item label="JC 返点">
-            <InputNumber size="small" placeholder="JC返点" min="0" v-model:value="jcOptions.rebate" />
+          <Form.Item label="PS 返点">
+            <InputNumber size="small" placeholder="PS返点" min="0" v-model:value="psOptions.rebate" />
           </Form.Item>
         </Form>
       </div>
       <div class="solution-header">
-        <span>JC</span>
         <span>PS</span>
         <span>OB</span>
+        <span>HG</span>
         <em>利润</em>
       </div>
     </div>
 
     <div class="solution-list">
       <div class="solution-item"
-        v-for="{ sid, sol: { win_average }, info: { jc, ps, ob }, selected, disabled } in solutionsList" :key="sid"
+        v-for="{ sid, sol: { win_average }, info: { ps, ob, hg }, selected, disabled } in solutionsList" :key="sid"
         :class="{ 'selected': selected, 'disabled': disabled }">
-        <MatchCard platform="jc" :eventId="jc.eventId" :leagueName="jc.leagueName" :teamHomeName="jc.teamHomeName"
-          :teamAwayName="jc.teamAwayName" :dateTime="jc.dateTime" :eventInfo="jc.eventInfo" :events="jc.events ?? []"
-          :matchNumStr="jc.matchNumStr" :selected="jc.selected ?? []" />
-
         <MatchCard platform="ps" :eventId="ps.eventId" :leagueName="ps.leagueName" :teamHomeName="ps.teamHomeName"
-          :teamAwayName="ps.teamAwayName" :dateTime="ps.dateTime" :events="ps.events ?? []"
-          :selected="ps.selected ?? []" />
+          :teamAwayName="ps.teamAwayName" :dateTime="ps.dateTime" :eventInfo="ps.eventInfo" :events="ps.events ?? []"
+          :matchNumStr="ps.matchNumStr" :selected="ps.selected ?? []" />
 
         <MatchCard platform="ob" :eventId="ob.eventId" :leagueName="ob.leagueName" :teamHomeName="ob.teamHomeName"
           :teamAwayName="ob.teamAwayName" :dateTime="ob.dateTime" :events="ob.events ?? []"
           :selected="ob.selected ?? []" />
 
-        <div class="solution-profit" @click="!disabled && toggleSolution(sid, jc.timestamp)">{{ win_average }}</div>
+        <MatchCard platform="hg" :eventId="hg.eventId" :leagueName="hg.leagueName" :teamHomeName="hg.teamHomeName"
+          :teamAwayName="hg.teamAwayName" :dateTime="hg.dateTime" :events="hg.events ?? []"
+          :selected="hg.selected ?? []" />
+
+        <div class="solution-profit" @click="!disabled && toggleSolution(sid, ps.timestamp)">{{ win_average }}</div>
       </div>
     </div>
     <div class="list-empty" v-if="!solutionsList.length">暂无数据</div>
@@ -412,31 +423,31 @@ onUnmounted(() => {
     >
       <div class="solution-total-profit" v-if="totalProfitValue.solutions.length">
         <div class="solution-item"
-          v-for="{ sid, info: { jc, ps, ob } } in totalProfitValue.solutions" :key="sid">
-          <MatchCard platform="jc" :eventId="jc.eventId" :leagueName="jc.leagueName" :teamHomeName="jc.teamHomeName"
-            :teamAwayName="jc.teamAwayName" :dateTime="jc.dateTime" :eventInfo="jc.eventInfo" :events="jc.events ?? []"
-            :matchNumStr="jc.matchNumStr" :selected="jc.selected ?? []" />
-
+          v-for="{ sid, info: { ps, ob, hg } } in totalProfitValue.solutions" :key="sid">
           <MatchCard platform="ps" :eventId="ps.eventId" :leagueName="ps.leagueName" :teamHomeName="ps.teamHomeName"
-            :teamAwayName="ps.teamAwayName" :dateTime="ps.dateTime" :events="ps.events ?? []"
-            :selected="ps.selected ?? []" />
+            :teamAwayName="ps.teamAwayName" :dateTime="ps.dateTime" :eventInfo="ps.eventInfo" :events="ps.events ?? []"
+            :matchNumStr="ps.matchNumStr" :selected="ps.selected ?? []" />
 
           <MatchCard platform="ob" :eventId="ob.eventId" :leagueName="ob.leagueName" :teamHomeName="ob.teamHomeName"
             :teamAwayName="ob.teamAwayName" :dateTime="ob.dateTime" :events="ob.events ?? []"
             :selected="ob.selected ?? []" />
+
+          <MatchCard platform="hg" :eventId="hg.eventId" :leagueName="hg.leagueName" :teamHomeName="hg.teamHomeName"
+            :teamAwayName="hg.teamAwayName" :dateTime="hg.dateTime" :events="hg.events ?? []"
+            :selected="hg.selected ?? []" />
         </div>
       </div>
       <div class="profit-info">
         <table>
           <tr>
             <th></th>
-            <td>JC</td>
+            <td>PS</td>
             <td colspan="2">第一场</td>
             <td colspan="2">第二场</td>
           </tr>
           <tr>
             <th>赔率</th>
-            <td>{{ totalProfitValue.jcInfo[0]?.v }}: {{ totalProfitValue.jcInfo[1]?.v }}</td>
+            <td>{{ totalProfitValue.psInfo[0]?.v }}: {{ totalProfitValue.psInfo[1]?.v }}</td>
             <td>{{ totalProfitValue.outPreSol[0]?.p }}: {{ totalProfitValue.outPreSol[0]?.v }}</td>
             <td>{{ totalProfitValue.outPreSol[1]?.p }}: {{ totalProfitValue.outPreSol[1]?.v }}</td>
             <td>{{ totalProfitValue.outSubSol[0]?.p }}: {{ totalProfitValue.outSubSol[0]?.v }}</td>
@@ -444,7 +455,7 @@ onUnmounted(() => {
           </tr>
           <tr>
             <th>下注</th>
-            <td>{{ jcOptions.bet }}</td>
+            <td>{{ psOptions.bet }}</td>
             <td>{{ totalProfitValue.outPreSol[0]?.g }}</td>
             <td>{{ totalProfitValue.outPreSol[1]?.g }}</td>
             <td>{{ totalProfitValue.outSubSol[0]?.g }}</td>
@@ -452,7 +463,7 @@ onUnmounted(() => {
           </tr>
           <tr>
             <th>利润</th>
-            <td>{{ totalProfitValue.profit.win_jc }}</td>
+            <td>{{ totalProfitValue.profit.win_ps }}</td>
             <td colspan="2">{{ totalProfitValue.profit.win_target }}</td>
             <td colspan="2">{{ totalProfitValue.profit.win_target }}</td>
           </tr>