li.shaoyi 2 anos atrás
pai
commit
2a9a59429f

+ 1 - 0
src/business/login/index.ts

@@ -46,6 +46,7 @@ export function useLogin(persist = false) {
         ])
         futuresStore.getGoodsList()
         tradeSocket.connect()
+        quoteSocket.connect()
     }
 
     // 用户登录

+ 0 - 15
src/business/market/index.ts

@@ -1,15 +0,0 @@
-import { computed } from 'vue'
-import { useFuturesStore } from '@/stores'
-import quoteStocket from '@/services/websocket/quote'
-
-// 期货行情列表
-export function useFuturesList() {
-    const futuresStore = useFuturesStore()
-    const dataList = computed(() => futuresStore.quoteList.filter((e) => e.marketid === 99201))
-    const quoteSubscribe = quoteStocket.addSubscribe(dataList.value.map((e) => e.goodscode))
-
-    return {
-        dataList,
-        quoteSubscribe,
-    }
-}

+ 2 - 7
src/packages/mobile/components/modules/quote/index.vue

@@ -8,15 +8,14 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, onMounted, onUnmounted } from 'vue'
+import { shallowRef } from 'vue'
 import { formatDate } from '@/filters'
-import quoteSocket from '@/services/websocket/quote'
 import Price from './price/index.vue'
 import Chart from './chart/index.vue'
 import Forex from './forex/index.vue'
 import Tik from './tik/index.vue'
 
-const props = defineProps({
+defineProps({
     goodsCode: {
         type: String,
         required: true
@@ -24,7 +23,6 @@ const props = defineProps({
     showForex: Boolean,
 })
 
-const subscribe = quoteSocket.addSubscribe([props.goodsCode])
 const startTime = shallowRef<string>()
 const endTime = shallowRef<string>()
 
@@ -32,7 +30,4 @@ const onReady = (start: string, end: string) => {
     startTime.value = formatDate(start)
     endTime.value = formatDate(end)
 }
-
-onMounted(() => subscribe.start())
-onUnmounted(() => subscribe.stop())
 </script>

+ 6 - 1
src/packages/mobile/components/modules/quote/price/index.vue

@@ -74,10 +74,11 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
+import { shallowRef, onMounted, onUnmounted } from 'vue'
 import { Icon, Divider } from 'vant'
 import { parsePercent, handleNumberValue } from '@/filters'
 import { useFuturesStore } from '@/stores'
+import quoteSocket from '@/services/websocket/quote'
 
 const props = defineProps({
     goodsCode: {
@@ -87,8 +88,12 @@ const props = defineProps({
 })
 
 const futuresStore = useFuturesStore()
+const subscribe = quoteSocket.createSubscribe()
 const quote = futuresStore.getQuoteInfo(props.goodsCode)
 const showMore = shallowRef(false)
+
+onMounted(() => subscribe.start(props.goodsCode))
+onUnmounted(() => subscribe.stop())
 </script>
 
 <style lang="less">

+ 7 - 5
src/packages/mobile/views/goods/list/Index.vue

@@ -62,8 +62,7 @@
 </template>
 
 <script lang="ts" setup>
-import { computed } from 'vue'
-import { v4 } from 'uuid'
+import { computed, onUnmounted } from 'vue'
 import { parsePercent, handleNumberValue } from '@/filters'
 import { useRequest } from '@/hooks/request'
 import { useNavigation } from '@/hooks/navigation'
@@ -75,7 +74,7 @@ import AppList from '@mobile/components/base/list/index.vue'
 const { router } = useNavigation()
 const futuresStore = useFuturesStore()
 const userStore = useUserStore()
-const subscribeId = v4()
+const subscribe = quoteSocket.createSubscribe()
 
 const { dataList } = useRequest(queryQuoteGoodsList, {
     params: {
@@ -84,8 +83,9 @@ const { dataList } = useRequest(queryQuoteGoodsList, {
     },
     onSuccess: (res) => {
         const goodsCodes = res.data.map((e) => e.goodscode)
-        const subscribe = quoteSocket.addSubscribe(goodsCodes, subscribeId)
-        subscribe.start()
+        if (goodsCodes.length) {
+            subscribe.start(...goodsCodes)
+        }
     }
 })
 
@@ -146,4 +146,6 @@ const rowClick = (row: Model.QuoteGoodsListRsp) => {
         }
     })
 }
+
+onUnmounted(() => subscribe.stop())
 </script>

+ 3 - 103
src/packages/mobile/views/home/main/Index.vue

@@ -52,67 +52,6 @@
           </li>
         </ul>
       </app-block>
-      <app-block class="home-main__market" v-if="spotQuoteList.length">
-        <Cell class="home-main__titlebar" value="更多" :to="{ name: 'MarketSpot' }" is-link>
-          <template #title>
-            <img src="@mobile/assets/icons/spot.png" />
-            <span>现货行情</span>
-            <span>({{ currentSpotQuote.spotmonth }})</span>
-          </template>
-        </Cell>
-        <section class="scrollbar">
-          <Swipe :autoplay="8000" :show-indicators="false" :touchable="false" vertical @change="onSpotChange">
-            <SwipeItem v-for="(item, i) in spotQuoteList" :key="i">
-              <ul @click="openNewsDetails(item.relatedid)">
-                <li>
-                  <span>{{ item.spotsrc }}</span>
-                </li>
-                <li>
-                  <span>{{ item.spotname }}招标价 </span>
-                  <span class="g-color--up">{{ item.spotprice }} 元/吨</span>
-                </li>
-                <li>
-                  <span>采购量 </span>
-                  <span class="g-color--up">{{ item.spotqty }} 吨</span>
-                </li>
-              </ul>
-            </SwipeItem>
-          </Swipe>
-        </section>
-      </app-block>
-      <app-block v-if="false">
-        <section class="scrollbar">
-          <h4 class="scrollbar-title">
-            <img src="@mobile/assets/icons/futures.png" />
-            <span>期货行情</span>
-          </h4>
-          <Swipe :autoplay="8000" :show-indicators="false" :touchable="false" vertical>
-            <SwipeItem
-              v-for="({ goodsname, last, lasttime, presettle, change, amplitude, holdvolume, lastvolume, decimalplace }, i) in dataList"
-              :key="i">
-              <ul>
-                <li>{{ goodsname }}</li>
-                <li style="color:#999">{{ formatDate(lasttime, 'HH:mm') }}</li>
-                <li :class="handlePriceColor(last, presettle)">{{ handleNumberValue(formatDecimal(last, decimalplace))
-                }}
-                </li>
-                <li :class="handlePriceColor(last, presettle)">{{ handleNumberValue(formatDecimal(change, decimalplace))
-                }}</li>
-                <li :class="handlePriceColor(last, presettle)">{{ parsePercent(amplitude) }}</li>
-                <li :class="handlePriceColor(last, presettle)">{{ changeUnit(lastvolume) }}</li>
-                <li :class="handlePriceColor(last, presettle)">{{ changeUnit(holdvolume) }}</li>
-              </ul>
-            </SwipeItem>
-          </Swipe>
-        </section>
-      </app-block>
-      <app-block class="home-main__banner home-main__banner--body" v-if="false">
-        <Swipe :autoplay="5000" indicator-color="white" lazy-render>
-          <SwipeItem v-for="(item, index) in bodyBanners" :key="index">
-            <img :src="getFileUrl(item.imagepath)" />
-          </SwipeItem>
-        </Swipe>
-      </app-block>
       <app-block class="home-main__news">
         <CellGroup class="article">
           <Cell class="home-main__titlebar" value="更多" :to="{ name: 'news-list' }" is-link>
@@ -132,30 +71,19 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, computed } from "vue";
+import { shallowRef } from "vue";
 import { Cell, CellGroup, Swipe, SwipeItem, PullRefresh } from "vant";
-import { formatDecimal, getFileUrl, formatDate, handlePriceColor, parsePercent, handleNumberValue, changeUnit } from "@/filters";
+import { getFileUrl, formatDate } from "@/filters";
 import { useNavigation } from "@/hooks/navigation";
 import { queryImageConfigs } from "@/services/api/common";
 import { queryNewTitles } from "@/services/api/news";
-import { useFuturesList } from "@/business/market";
-import { queryMarketRun } from "@/services/api/goods";
-import { queryThjSpotQuoteConfig } from "@/services/api/market";
 import { useLoginStore } from '@/stores'
 
 const loginStore = useLoginStore();
-const { router, routerTo, setGlobalUrlParams } = useNavigation();
-const { dataList } = useFuturesList();
+const { routerTo, setGlobalUrlParams } = useNavigation();
 const refreshing = shallowRef(false); // 是否处于加载中状态
 const topBanners = shallowRef<Model.ImageConfigsRsp[]>([]); // 轮播图列表
-const bodyBanners = shallowRef<Model.ImageConfigsRsp[]>([]); // 轮播图列表
 const newsList = shallowRef<Model.NewTitlesRsp[]>([]); // 资讯列表
-const spotQuoteList = shallowRef<Model.ThjSpotQuoteConfigRsp[]>([]); // 现货行情
-const spotQuoteIndex = shallowRef(0) // 当前现货行情索引
-const marketRun = shallowRef<Partial<Model.MarketRunRsp>>({}); // 市场
-
-// 当前现货行情
-const currentSpotQuote = computed(() => spotQuoteList.value[spotQuoteIndex.value])
 
 // 跳转导航页面
 const switchTab = (tabIndex: number) => {
@@ -177,18 +105,6 @@ const switchTab = (tabIndex: number) => {
   }
 }
 
-// 打开新闻详情
-const openNewsDetails = (id: number) => {
-  if (id) {
-    router.push({ name: 'news-detail', query: { id } })
-  }
-}
-
-// 现货行情轮播变化
-const onSpotChange = (index: number) => {
-  spotQuoteIndex.value = index
-}
-
 // 下拉刷新
 const onRefresh = () => {
   if (!topBanners.value.length) {
@@ -200,17 +116,6 @@ const onRefresh = () => {
       topBanners.value = res.data
     })
   }
-  // if (!bodyBanners.value.length) {
-  //   queryImageConfigs({
-  //     imageType: 10,
-  //   }).then((res) => {
-  //     bodyBanners.value = res.data
-  //   })
-  // }
-  // 现货行情
-  queryThjSpotQuoteConfig().then((res) => {
-    spotQuoteList.value = res.data
-  })
   // 市场资讯
   queryNewTitles({
     data: {
@@ -224,11 +129,6 @@ const onRefresh = () => {
   })
 }
 
-// 市场信息
-queryMarketRun().then((res) => {
-  marketRun.value = res.data[0]
-})
-
 onRefresh()
 </script>
 

+ 1 - 6
src/packages/mobile/views/market/detail/Index.vue

@@ -10,11 +10,10 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, onMounted, onUnmounted, defineAsyncComponent } from 'vue'
+import { shallowRef, defineAsyncComponent } from 'vue'
 import { formatDate } from '@/filters'
 import { useNavigation } from '@/hooks/navigation'
 import { useFuturesStore } from '@/stores'
-import quoteSocket from '@/services/websocket/quote'
 
 const Price = defineAsyncComponent(() => import('@mobile/components/modules/quote/price/index.vue'))
 const Chart = defineAsyncComponent(() => import('@mobile/components/modules/quote/chart/index.vue'))
@@ -23,7 +22,6 @@ const Tik = defineAsyncComponent(() => import('@mobile/components/modules/quote/
 const { getQueryString } = useNavigation()
 const goodsCode = getQueryString('goodscode')
 const futuresStore = useFuturesStore()
-const subscribe = quoteSocket.addSubscribe([goodsCode])
 
 const startTime = shallowRef<string>()
 const endTime = shallowRef<string>()
@@ -32,7 +30,4 @@ const onReady = (start: string, end: string) => {
     startTime.value = formatDate(start)
     endTime.value = formatDate(end)
 }
-
-onMounted(() => subscribe.start())
-onUnmounted(() => subscribe.stop())
 </script>

+ 2 - 2
src/packages/mobile/views/market/list/Index.vue

@@ -75,7 +75,7 @@ const dataList = computed(() => {
 })
 
 const goodsCodes = dataList.value.map((e) => e.goodscode.toUpperCase())
-const subscribe = quoteSocket.addSubscribe(goodsCodes)
+const subscribe = quoteSocket.createSubscribe()
 
 const columns: Model.TableColumn[] = [
     { prop: 'goodscode', label: '合约' },
@@ -100,6 +100,6 @@ const rowClick = (row: Model.Futures) => {
     })
 }
 
-onMounted(() => subscribe.start())
+onMounted(() => subscribe.start(...goodsCodes))
 onUnmounted(() => subscribe.stop())
 </script>

+ 8 - 8
src/packages/mobile/views/order/list/components/presale/history/index.vue

@@ -40,14 +40,6 @@
                                     <span>{{ item.startprice }}</span>
                                 </li>
                                 <li>
-                                    <span>开始日期</span>
-                                    <span>{{ formatDate(item.starttime, 'YYYY-MM-DD') }}</span>
-                                </li>
-                                <li>
-                                    <span>结束日期</span>
-                                    <span>{{ formatDate(item.endtime, 'YYYY-MM-DD') }}</span>
-                                </li>
-                                <li>
                                     <span>预售价</span>
                                     <span>{{ handleNumberValue(item.tradeprice) }}</span>
                                 </li>
@@ -56,6 +48,14 @@
                                     <span>{{ handleNumberValue(item.tradeqty) }}</span>
                                 </li>
                                 <li>
+                                    <span>开始日期</span>
+                                    <span>{{ formatDate(item.starttime, 'YYYY-MM-DD') }}</span>
+                                </li>
+                                <li>
+                                    <span>结束日期</span>
+                                    <span>{{ formatDate(item.endtime, 'YYYY-MM-DD') }}</span>
+                                </li>
+                                <li>
                                     <span>委托日期</span>
                                     <span>{{ formatDate(item.ordertime, 'YYYY-MM-DD') }}</span>
                                 </li>

+ 8 - 8
src/packages/mobile/views/order/list/components/presale/list/Index.vue

@@ -31,14 +31,6 @@
                             <span>{{ item.startprice }}</span>
                         </li>
                         <li>
-                            <span>开始日期</span>
-                            <span>{{ formatDate(item.starttime, 'YYYY-MM-DD') }}</span>
-                        </li>
-                        <li>
-                            <span>结束日期</span>
-                            <span>{{ formatDate(item.endtime, 'YYYY-MM-DD') }}</span>
-                        </li>
-                        <li>
                             <span>预售价</span>
                             <span>{{ handleNumberValue(item.tradeprice) }}</span>
                         </li>
@@ -47,6 +39,14 @@
                             <span>{{ handleNumberValue(item.tradeqty) }}</span>
                         </li>
                         <li>
+                            <span>开始日期</span>
+                            <span>{{ formatDate(item.starttime, 'YYYY-MM-DD') }}</span>
+                        </li>
+                        <li>
+                            <span>结束日期</span>
+                            <span>{{ formatDate(item.endtime, 'YYYY-MM-DD') }}</span>
+                        </li>
+                        <li>
                             <span>委托日期</span>
                             <span>{{ formatDate(item.ordertime, 'YYYY-MM-DD') }}</span>
                         </li>

+ 10 - 15
src/packages/mobile/views/order/position/components/swap/close/Index.vue

@@ -9,8 +9,8 @@
                 <span>商品:{{ selectedRow.goodsname }}/{{ selectedRow.goodscode }}</span>
                 <span>{{ lastPrice }}</span>
             </div>
-            <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error" v-model:pageIndex="pageIndex"
-        :page-count="pageCount" @refresh="run">
+            <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
                 <div class="g-order-list">
                     <div class="g-order-list__box" v-for="(item, index) in dataList" :key="index">
                         <div class="g-order-list__titlebar">
@@ -33,7 +33,7 @@
                                 </li>
                                 <li>
                                     <span>可用数量:</span>
-                                    <span>{{ formatDecimal(item.holderqty-item.freezeqty) }}</span>
+                                    <span>{{ formatDecimal(item.holderqty - item.freezeqty) }}</span>
                                 </li>
                                 <li>
                                     <span>持仓金额:</span>
@@ -60,7 +60,7 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, PropType, computed } from 'vue'
+import { shallowRef, PropType, computed, onMounted } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryTradeHolderDetail } from '@/services/api/order';
 import { ETradeMode } from '@/constants/client';
@@ -69,7 +69,6 @@ import { getBuyOrSellName } from '@/constants/order'
 import { formatDate, formatDecimal } from '@/filters'
 import { useHolderClose } from '@/business/trade'
 import { dialog, fullloading } from '@/utils/vant'
-import { v4 } from 'uuid'
 import { useFuturesStore } from '@/stores'
 
 import quoteSocket from '@/services/websocket/quote'
@@ -80,9 +79,9 @@ const futuresStore = useFuturesStore()
 const dataList = shallowRef<Model.TradeHolderDetailRsp[]>([])
 const showModal = shallowRef(true)
 /// 是否刷新父组件数据
-const refresh = shallowRef(false) 
+const refresh = shallowRef(false)
 const error = shallowRef(false)
-const subscribeId = v4()
+const subscribe = quoteSocket.createSubscribe()
 
 const { holderCloseSubmit, formData } = useHolderClose()
 
@@ -93,12 +92,6 @@ const props = defineProps({
     }
 })
 
-const subscribe = () => {
-    const { refgoodscode } = props.selectedRow
-    const subscribe = quoteSocket.addSubscribe([refgoodscode], subscribeId)
-    subscribe.start()
-}
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryTradeHolderDetail, {
     params: {
         pagesize: 20,
@@ -106,7 +99,7 @@ const { loading, pageIndex, pageCount, run } = useRequest(queryTradeHolderDetail
         trademodes: ETradeMode.TRADEMODE_TJMD.toString(),
         /// marketid
         marketids: props.selectedRow.marketid.toString(),
-         /// 商品id
+        /// 商品id
         goodsid: props.selectedRow.goodsid,
         /// 买卖方向 0-买 1-卖
         buyorsell: props.selectedRow.buyorsell
@@ -117,7 +110,7 @@ const { loading, pageIndex, pageCount, run } = useRequest(queryTradeHolderDetail
         }
         dataList.value.push(...res.data)
         /// 订阅行情
-        subscribe()
+        subscribe.start(props.selectedRow.refgoodscode)
     },
     onError: () => {
         error.value = true
@@ -159,6 +152,8 @@ const closed = (isRefresh = false) => {
     showModal.value = false
 }
 
+onMounted(() => subscribe.stop())
+
 // 暴露组件属性给父组件调用
 defineExpose({
     closed,

+ 24 - 19
src/packages/mobile/views/pricing/detail/Index.vue

@@ -63,7 +63,8 @@
                 </table>
             </div>
             <!-- 下单 -->
-            <Form class="pricing-detail__form" ref="formRef" style="padding: 0.2rem; background-color: white;" @submit="onSubmit">
+            <Form class="pricing-detail__form" ref="formRef" style="padding: 0.2rem; background-color: white;"
+                @submit="onSubmit">
                 <Field label="方向">
                     <template #input>
                         <RadioGroup v-model="formData.BuyOrSell" direction="horizontal" @click="onBuyOrSellChanged">
@@ -91,7 +92,8 @@
                 </Field>
                 <Field name="OrderQty" label="数量">
                     <template #input>
-                        <Stepper v-model="formData.OrderQty" :rules="formRules.OrderQty"  theme="round" button-size="22" :auto-fixed="false" integer />
+                        <Stepper v-model="formData.OrderQty" :rules="formRules.OrderQty" theme="round" button-size="22"
+                            :auto-fixed="false" integer />
                     </template>
                 </Field>
                 <!-- 市价 -->
@@ -102,29 +104,35 @@
                 </Field>
                 <Field name="MarketMaxSub" label="允许成交范围" v-if="formData.PriceMode === PriceMode.Market">
                     <template #input>
-                        <Stepper v-model="formData.MarketMaxSub" theme="round" button-size="22" :auto-fixed="false" integer />
+                        <Stepper v-model="formData.MarketMaxSub" theme="round" button-size="22" :auto-fixed="false"
+                            integer />
                     </template>
                 </Field>
                 <!-- 限价 -->
-                <Field name="OrderPrice" :rules="formRules.OrderPrice" label="价格" v-if="formData.PriceMode === PriceMode.Limit">
+                <Field name="OrderPrice" :rules="formRules.OrderPrice" label="价格"
+                    v-if="formData.PriceMode === PriceMode.Limit">
                     <template #input>
                         <Stepper v-model="formData.OrderPrice" theme="round" button-size="22" :auto-fixed="false" />
                     </template>
                 </Field>
-                <Field name="SlPrice" :rules="formRules.SlPrice" v-if="formData.PriceMode === PriceMode.Limit && formData.BuildType === BuildType.Open">
+                <Field name="SlPrice" :rules="formRules.SlPrice"
+                    v-if="formData.PriceMode === PriceMode.Limit && formData.BuildType === BuildType.Open">
                     <template #label>
                         <Checkbox v-model="sl" shape="square">止损</Checkbox>
                     </template>
                     <template #input>
-                        <Stepper v-model="formData.SlPrice" :disabled="!sl" theme="round" button-size="22" allow-empty :default-value="0" :min="0" integer />
+                        <Stepper v-model="formData.SlPrice" :disabled="!sl" theme="round" button-size="22" allow-empty
+                            :default-value="0" :min="0" integer />
                     </template>
                 </Field>
-                <Field name="SpPrice" :rules="formRules.SpPrice" v-if="formData.PriceMode === PriceMode.Limit && formData.BuildType === BuildType.Open">
+                <Field name="SpPrice" :rules="formRules.SpPrice"
+                    v-if="formData.PriceMode === PriceMode.Limit && formData.BuildType === BuildType.Open">
                     <template #label>
                         <Checkbox v-model="sp" shape="square">止盈</Checkbox>
                     </template>
                     <template #input>
-                        <Stepper v-model="formData.SpPrice" :disabled="!sp" theme="round" button-size="22" allow-empty :default-value="0" :min="0" integer />
+                        <Stepper v-model="formData.SpPrice" :disabled="!sp" theme="round" button-size="22" allow-empty
+                            :default-value="0" :min="0" integer />
                     </template>
                 </Field>
             </Form>
@@ -162,7 +170,7 @@ const goodscode = getQueryString('goodscode')
 const buyOrSell = getQueryStringToNumber('buyOrSell')
 const buildType = getQueryStringToNumber('buildType')
 const quote = futuresStore.getQuoteInfo(goodscode)
-const subscribe = quoteSocket.addSubscribe([goodscode])
+const subscribe = quoteSocket.createSubscribe()
 const sl = shallowRef(false) // 止损
 const sp = shallowRef(false) // 止盈
 const position = shallowRef<Model.TradePositionRsp[]>([]) // 持仓汇总
@@ -185,7 +193,7 @@ const formRules: { [key in keyof Proto.OrderReq]?: FieldRule[] } = {
             return true
         }
     }],
-    SlPrice :[{
+    SlPrice: [{
         message: '请输入止损价',
         validator: () => {
             if (sl.value) {
@@ -194,7 +202,7 @@ const formRules: { [key in keyof Proto.OrderReq]?: FieldRule[] } = {
             return true
         }
     }],
-    SpPrice :[{
+    SpPrice: [{
         message: '请输入止盈价',
         validator: () => {
             if (sp.value) {
@@ -206,17 +214,14 @@ const formRules: { [key in keyof Proto.OrderReq]?: FieldRule[] } = {
 }
 
 onMounted(() => {
-    subscribe.start()
-
+    subscribe.start(goodscode)
     formData.BuyOrSell = buyOrSell
     formData.BuildType = buildType
     formData.PriceMode = PriceMode.Market
     formData.MarketMaxSub = 100.0
 })
 
-onUnmounted(() => {
-    subscribe.stop()
-})
+onUnmounted(() => subscribe.stop())
 
 // 获取当前商品持仓汇总
 useRequest(queryTradePosition, {
@@ -225,7 +230,7 @@ useRequest(queryTradePosition, {
     },
     onSuccess: (res) => {
         position.value = res.data.filter(item => item.goodscode === goodscode)
-        const datas = position.value.filter( item => formData.BuyOrSell === BuyOrSell.Buy ? item.buyorsell === BuyOrSell.Sell : item.buyorsell === BuyOrSell.Buy ) // 反方向持仓
+        const datas = position.value.filter(item => formData.BuyOrSell === BuyOrSell.Buy ? item.buyorsell === BuyOrSell.Sell : item.buyorsell === BuyOrSell.Buy) // 反方向持仓
         if (datas.length > 0) {
             formData.OrderQty = datas[0].enableqty
         }
@@ -249,8 +254,8 @@ const onBuildTypeChanged = () => {
     if (formData.BuildType === BuildType.Close) {
         const { ask = 0, bid = 0 } = quote.value ?? {}
         formData.OrderPrice = formData.BuyOrSell === BuyOrSell.Buy ? ask : bid
-        
-        const datas = position.value.filter( item => formData.BuyOrSell === BuyOrSell.Buy ? item.buyorsell === BuyOrSell.Sell : item.buyorsell === BuyOrSell.Buy ) // 反方向持仓
+
+        const datas = position.value.filter(item => formData.BuyOrSell === BuyOrSell.Buy ? item.buyorsell === BuyOrSell.Sell : item.buyorsell === BuyOrSell.Buy) // 反方向持仓
         if (datas.length > 0) {
             formData.OrderQty = datas[0].enableqty
         }

+ 5 - 5
src/packages/mobile/views/pricing/list/Index.vue

@@ -42,8 +42,7 @@
 
 <script lang="ts" setup>
 
-import { computed } from 'vue'
-import { v4 } from 'uuid'
+import { computed, onUnmounted } from 'vue'
 import { parsePercent, handleNumberValue } from '@/filters'
 import { useNavigation } from '@/hooks/navigation'
 import { useRequest } from '@/hooks/request'
@@ -56,7 +55,7 @@ import { BuyOrSell, BuildType } from '@/constants/order'
 const { router } = useNavigation()
 const futuresStore = useFuturesStore()
 const userStore = useUserStore()
-const subscribeId = v4()
+const subscribe = quoteSocket.createSubscribe()
 
 const { dataList } = useRequest(queryQuoteGoodsList, {
     params: {
@@ -65,8 +64,7 @@ const { dataList } = useRequest(queryQuoteGoodsList, {
     },
     onSuccess: (res) => {
         const goodsCodes = res.data.map((e) => e.goodscode)
-        const subscribe = quoteSocket.addSubscribe(goodsCodes, subscribeId)
-        subscribe.start()
+        subscribe.start(...goodsCodes)
     }
 })
 
@@ -120,4 +118,6 @@ const rowClick = (row: Model.Futures) => {
         }
     })
 }
+
+onUnmounted(() => subscribe.stop())
 </script>

+ 5 - 5
src/packages/mobile/views/swap/list/Index.vue

@@ -38,8 +38,7 @@
 </template>
 
 <script lang="ts" setup>
-import { computed } from 'vue'
-import { v4 } from 'uuid'
+import { computed, onUnmounted } from 'vue'
 import { parsePercent, handleNumberValue } from '@/filters'
 import { useRequest } from '@/hooks/request'
 import { useNavigation } from '@/hooks/navigation'
@@ -51,7 +50,7 @@ import AppList from '@mobile/components/base/list/index.vue'
 const { router } = useNavigation()
 const futuresStore = useFuturesStore()
 const userStore = useUserStore()
-const subscribeId = v4()
+const subscribe = quoteSocket.createSubscribe()
 
 const { dataList } = useRequest(queryQuoteGoodsList, {
     params: {
@@ -60,8 +59,7 @@ const { dataList } = useRequest(queryQuoteGoodsList, {
     },
     onSuccess: (res) => {
         const goodsCodes = res.data.map((e) => e.refgoodscode)
-        const subscribe = quoteSocket.addSubscribe(goodsCodes, subscribeId)
-        subscribe.start()
+        subscribe.start(...goodsCodes)
     }
 })
 
@@ -108,4 +106,6 @@ const rowClick = (row: Model.QuoteGoodsListRsp) => {
         }
     })
 }
+
+onUnmounted(() => subscribe.stop())
 </script>

+ 2 - 2
src/packages/mobile/views/transfer/list/Index.vue

@@ -37,7 +37,7 @@ const dataList = computed(() => {
 })
 
 const goodsCodes = dataList.value.map((e) => e.goodscode.toUpperCase())
-const subscribe = quoteSocket.addSubscribe(goodsCodes)
+const subscribe = quoteSocket.createSubscribe()
 
 const columns: Model.TableColumn[] = [
     { prop: 'goodscode', label: '商品名称/代码' },
@@ -55,5 +55,5 @@ const rowClick = ({ goodsid }: Model.Futures) => {
     })
 }
 
-onMounted(() => subscribe.start())
+onMounted(() => subscribe.start(...goodsCodes))
 </script>

+ 44 - 4
src/services/websocket/quote.ts

@@ -17,6 +17,10 @@ export default new (class {
     private subscribeMap = new Map<string, string[]>()
 
     constructor() {
+        this.socket.onOpen = () => {
+            this.subscribe()
+        }
+
         this.socket.onReconnect = () => {
             // 重新订阅商品
             this.subscribe()
@@ -32,7 +36,7 @@ export default new (class {
         }
     }
 
-    private async connect() {
+    async connect() {
         const res = await service.onReady()
         await this.socket.connect(res.quoteWS, this.loginStore.token)
     }
@@ -67,9 +71,45 @@ export default new (class {
                     console.error('行情订阅失败', err)
                 })
             })
-        } else {
-            // 没有订阅的时候,断开连接
-            this.close()
+        }
+    }
+
+    /**
+     * 创建行情订阅
+     * @param goodsCodes 
+     * @param key 
+     * @returns 
+     */
+    createSubscribe = (key?: string) => {
+        const loginStore = useLoginStore()
+        const uuid = key ?? v4()
+        const values = this.subscribeMap.get(uuid) ?? []
+
+        const start = (...goodsCodes: string[]) => {
+            if (loginStore.token) {
+                goodsCodes.forEach((code) => {
+                    if (code && !values.includes(code)) {
+                        values.push(code)
+                    }
+                })
+                this.subscribeMap.set(uuid, values)
+                this.subscribe()
+            }
+        }
+
+        return {
+            uuid,
+            start,
+            stop: () => {
+                const flag = this.subscribeMap.delete(uuid)
+                if (flag) {
+                    console.log('删除订阅', uuid)
+                }
+                if (loginStore.token) {
+                    this.subscribe()
+                }
+                return flag
+            },
         }
     }
 

+ 1 - 0
src/services/websocket/trade.ts

@@ -22,6 +22,7 @@ export default new (class {
                     timerInterceptor.debounce(() => {
                         // 通知上层 资金变动
                         eventBus.$emit('MoneyChangedNotify')
+                        console.log('接收到资金变动通知')
                     }, delay, funCode.toString())
                     break
                 }

+ 1 - 0
src/stores/modules/futures.ts

@@ -148,6 +148,7 @@ export const useFuturesStore = defineStore(() => {
 
     // 获取商品列表
     const getGoodsList = async () => {
+        timerTask.clearTimeout('quoteDay')
         state.loading = true
         try {
             const res = await queryErmcpGoods()