Jelajahi Sumber

新增IM平台支持

flyzto 2 minggu lalu
induk
melakukan
e989a601cd

+ 3 - 0
server/init.js

@@ -11,6 +11,9 @@ const Logs = require('./libs/logs');
     obRebateRatio: 0,
     obRebateType: 0,
     obMaxDiff: 0,
+    imRebateRatio: 0,
+    imRebateType: 0,
+    imMaxDiff: 0,
     hgRebateRatio: 0,
     hgRebateType: 0,
     hgRebateLower: 0,

+ 39 - 16
server/models/GamesPs.js

@@ -638,10 +638,12 @@ const fetchGamesRelation = async (mk='') => {
       const nowTime = Date.now();
       const gamesRelation = resData.data?.filter?.((item) => {
         const timestamp = new Date(item.timestamp).getTime();
+        const updated = new Date(item.updated_at).getTime();
         if (nowTime > timestamp) {
           item.mk = 2;
         }
         item.timestamp = timestamp;
+        item.updated = updated;
         const expireTime = timestamp + 1000*60*60*3;
         return expireTime > nowTime;
       }).map(item => {
@@ -657,6 +659,10 @@ const fetchGamesRelation = async (mk='') => {
           hg_event_id, hg_league_id,
           hg_team_home_name,
           hg_team_away_name,
+          im_event_id, im_league_id,
+          im_team_home_name,
+          im_team_away_name,
+          updated,
           timestamp,
         } = item;
         const rel = {
@@ -683,9 +689,17 @@ const fetchGamesRelation = async (mk='') => {
             teamHomeName: hg_team_home_name,
             teamAwayName: hg_team_away_name,
             timestamp
+          } : null,
+          im: im_event_id ? {
+            eventId: +im_event_id,
+            leagueId: +im_league_id,
+            leagueName: league_name,
+            teamHomeName: im_team_home_name,
+            teamAwayName: im_team_away_name,
+            timestamp
           } : null
         };
-        return { id: ps_event_id, mk, rel, timestamp };
+        return { id: ps_event_id, mk, rel, timestamp, updated };
       }) ?? [];
       return gamesRelation;
     }
@@ -773,7 +787,7 @@ const getGamesRelation = ({ mk=-1, ids, listEvents=false, listPC=false } = {}) =
 const updateGamesRelation = () => {
   fetchGamesRelation()
   .then(gamesRelation => {
-
+    // Logs.out('updateGamesRelation', gamesRelation);
     const baseList = {};
     gamesRelation.map(item => {
       const baseGame = item.rel?.['ps'] ?? {};
@@ -797,7 +811,7 @@ const updateGamesRelation = () => {
     };
 
     gamesRelation.forEach(item => {
-      const { id, mk } = item;
+      const { id, mk, updated } = item;
       const oldItem = GAMES.Relations[id];
       if (!oldItem) {
         GAMES.Relations[id] = item;
@@ -807,6 +821,10 @@ const updateGamesRelation = () => {
         GAMES.Relations[id] = item;
         updateCount.update ++;
       }
+      else if ((oldItem.updated ?? -1) < updated) {
+        GAMES.Relations[id] = item;
+        updateCount.update ++;
+      }
     });
 
     const relations = new Set(gamesRelation.map(item => +item.id));
@@ -1336,26 +1354,31 @@ const syncQbossConfig = () => {
     const {
       qboss_return_ratio,
       ob_return_ratio, ob_return_type, ob_odds_more_than,
+      im_return_ratio, im_return_type, im_odds_more_than,
       hg_return_ratio, hg_return_type, hg_odds_more_than,
       pc_return_ratio, pc_return_type,
       qboss_jq_add_odds, qboss_jq_add_hours,
       qboss_gq_add_dy_odds, qboss_gq_add_jq_odds,
      } = data.data;
     const qbossSetting = {
-      innerRebateRatio: +qboss_return_ratio,
-      obRebateRatio: +ob_return_ratio,
-      obRebateType: +ob_return_type,
-      obMaxDiff: +ob_odds_more_than,
-      hgRebateRatio: +hg_return_ratio,
-      hgRebateType: +hg_return_type,
-      hgMaxDiff: +hg_odds_more_than,
-      pcRebateRatio: +pc_return_ratio,
-      pcRebateType: +pc_return_type,
-      subsidyTime: +qboss_jq_add_hours,
-      subsidyAmount: +qboss_jq_add_odds,
-      subsidyRbWmAmount: +qboss_gq_add_dy_odds,
-      subsidyRbOtAmount: +qboss_gq_add_jq_odds,
+      innerRebateRatio: qboss_return_ratio ? +qboss_return_ratio : 0,
+      obRebateRatio: ob_return_ratio ? +ob_return_ratio : 0,
+      obRebateType: ob_return_type ? +ob_return_type : 0,
+      obMaxDiff: ob_odds_more_than ? +ob_odds_more_than : 0,
+      imRebateRatio: im_return_ratio ? +im_return_ratio : 0,
+      imRebateType: im_return_type ? +im_return_type : 0,
+      imMaxDiff: im_odds_more_than ? +im_odds_more_than : 0,
+      hgRebateRatio: hg_return_ratio ? +hg_return_ratio : 0,
+      hgRebateType: hg_return_type ? +hg_return_type : 0,
+      hgMaxDiff: hg_odds_more_than ? +hg_odds_more_than : 0,
+      pcRebateRatio: pc_return_ratio ? +pc_return_ratio : 0,
+      pcRebateType: pc_return_type ? +pc_return_type : 0,
+      subsidyTime: qboss_jq_add_hours ? +qboss_jq_add_hours : 0,
+      subsidyAmount: qboss_jq_add_odds ? +qboss_jq_add_odds : 0,
+      subsidyRbWmAmount: qboss_gq_add_dy_odds ? +qboss_gq_add_dy_odds : 0,
+      subsidyRbOtAmount: qboss_gq_add_jq_odds ? +qboss_gq_add_jq_odds : 0,
     };
+    Logs.outDev('syncQbossConfig', qbossSetting);
     const settingFields = {};
     let needUpdate = false;
     Object.keys(qbossSetting).forEach(key => {

+ 15 - 0
server/models/Setting.js

@@ -41,6 +41,21 @@ const systemSettingSchema = new Schema({
     required: true,
     default: 0
   },
+  imRebateRatio: {
+    type: Number,
+    required: true,
+    default: 0
+  },
+  imRebateType: {
+    type: Number,
+    required: true,
+    default: 0
+  },
+  imMaxDiff: {
+    type: Number,
+    required: true,
+    default: 0
+  },
   hgRebateRatio: {
     type: Number,
     required: true,

+ 3 - 0
server/triangle/settings.js

@@ -8,6 +8,9 @@ const SETTING = {
   obRebateRatio: 0,
   obRebateType: 0,
   obMaxDiff: 0,
+  imRebateRatio: 0,
+  imRebateType: 0,
+  imMaxDiff: 0,
   hgRebateRatio: 0,
   hgRebateType: 0,
   hgRebateLower: 0,

+ 13 - 5
web/apps/web-antd/src/views/match/components/solution_item.vue

@@ -222,12 +222,16 @@ const ps = computed(() => {
   return currentRelation.value.rel.ps;
 });
 
+const hg = computed(() => {
+  return currentRelation.value.rel.hg;
+});
+
 const ob = computed(() => {
   return currentRelation.value.rel.ob;
 });
 
-const hg = computed(() => {
-  return currentRelation.value.rel.hg;
+const im = computed(() => {
+  return currentRelation.value.rel.im;
 });
 
 </script>
@@ -249,13 +253,17 @@ const hg = computed(() => {
     :teamAwayName="ps.teamAwayName" :dateTime="ps.dateTime" :events="ps.events ?? []"
     :selected="ps.selected ?? []" />
 
+    <MatchCard platform="hg" :eventId="hg.eventId" :teamHomeName="hg.teamHomeName"
+      :teamAwayName="hg.teamAwayName" :dateTime="hg.dateTime" :events="hg.events ?? []"
+      :selected="hg.selected ?? []" />
+
     <MatchCard platform="ob" :eventId="ob.eventId" :teamHomeName="ob.teamHomeName"
       :teamAwayName="ob.teamAwayName" :dateTime="ob.dateTime" :events="ob.events ?? []"
       :selected="ob.selected ?? []" />
 
-    <MatchCard platform="hg" :eventId="hg.eventId" :teamHomeName="hg.teamHomeName"
-      :teamAwayName="hg.teamAwayName" :dateTime="hg.dateTime" :events="hg.events ?? []"
-      :selected="hg.selected ?? []" />
+    <MatchCard platform="im" :eventId="im.eventId" :teamHomeName="im.teamHomeName"
+      :teamAwayName="im.teamAwayName" :dateTime="im.dateTime" :events="im.events ?? []"
+      :selected="im.selected ?? []" />
 
     <div class="solution-profit" @click="toggleSolution()">
       <p>{{ currentSolution.sol.win_average_rate }}%</p>

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

@@ -241,8 +241,9 @@ onUnmounted(() => {
       </div>
       <div class="solution-header">
         <span>PS</span>
-        <span>OB</span>
         <span>HG</span>
+        <span>OB</span>
+        <span>IM</span>
         <em>利润</em>
       </div>
     </div>

+ 21 - 0
web/apps/web-antd/src/views/system/parameter/index.vue

@@ -12,6 +12,9 @@ const initialFormState = {
   obRebateRatio: 0,
   obRebateType: 0,
   obMaxDiff: 0,
+  imRebateRatio: 0,
+  imRebateType: 0,
+  imMaxDiff: 0,
   hgRebateRatio: 0,
   hgRebateType: 0,
   hgRebateLower: 0,
@@ -167,6 +170,24 @@ onUnmounted(() => {
         <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.obMaxDiff" :step="0.01" style="width: 200px" />
       </Form.Item>
 
+      <Form.Item
+        label="IM返点比例(%)"
+        name="imRebateRatio"
+      >
+        <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.imRebateRatio" :min="0" :step="0.1" style="width: 200px" />
+        <RadioGroup :disabled="formState.syncSettingEnabled" style="margin-left: 10px; vertical-align: middle;" v-model:value="formState.imRebateType">
+          <Radio :value="0">结算</Radio>
+          <Radio :value="1">本金</Radio>
+        </RadioGroup>
+      </Form.Item>
+
+      <Form.Item
+        label="IM赔率差值阈值"
+        name="imMaxDiff"
+      >
+        <InputNumber :disabled="formState.syncSettingEnabled" v-model:value="formState.imMaxDiff" :step="0.01" style="width: 200px" />
+      </Form.Item>
+
       <Form.Item
         label="HG返点比例(%)"
         name="hgRebateRatio"