li.shaoyi 2 년 전
부모
커밋
daad8e8c52

+ 5 - 5
src/packages/mobile/postcss.config.js

@@ -1,9 +1,9 @@
 module.exports = {
     plugins: {
-        'postcss-px-to-viewport': {
-            viewportWidth: 375,
-            landscape: true,
-            landscapeWidth: 980,
-        },
+        // 'postcss-px-to-viewport': {
+        //     viewportWidth: 375,
+        //     landscape: true,
+        //     landscapeWidth: 980,
+        // },
     },
 }

+ 16 - 0
src/packages/mobile/router/index.ts

@@ -144,6 +144,22 @@ const routes: Array<RouteRecordRaw> = [
     ],
   },
   {
+    path: '/market',
+    component: Page,
+    children: [
+      {
+        path: 'list',
+        name: 'market-list',
+        component: () => import('../views/market/list/Index.vue'),
+      },
+      {
+        path: 'detail',
+        name: 'market-detail',
+        component: () => import('../views/market/detail/Index.vue'),
+      },
+    ],
+  },
+  {
     path: '/presale',
     component: Page,
     children: [

+ 22 - 6
src/packages/mobile/views/home/main/Index.vue

@@ -15,21 +15,21 @@
     <PullRefresh class="home-main__container" v-model="refreshing" @refresh="onRefresh">
       <app-block class="home-main__iconbar bg">
         <ul>
-          <li @click="routerTo('home-presale')">
+          <li @click="switchTab(1)">
             <img src="@mobile/assets/icons/cpjs.svg" />
             <span>预售竞拍</span>
           </li>
-          <li @click="routerTo('home-transfer')">
+          <li @click="switchTab(2)">
             <img src="@mobile/assets/icons/cpjg.svg" />
             <span>订单转让</span>
           </li>
-          <li @click="routerTo('home-swap')">
+          <li @click="switchTab(3)">
             <img src="@mobile/assets/icons/ptgz.svg" />
             <span>掉期贸易</span>
           </li>
         </ul>
         <ul>
-          <li @click="routerTo('credit-signin')">
+          <li>
             <img src="@mobile/assets/icons/wdrw.svg" />
             <span>订单挂牌</span>
           </li>
@@ -37,7 +37,7 @@
             <img src="@mobile/assets/icons/htzr.svg" />
             <span>现货贸易</span>
           </li>
-          <li @click="routerTo('rules-ccwl')">
+          <li @click="routerTo('market-list')">
             <img src="@mobile/assets/icons/ccwl.svg" />
             <span>参考行情</span>
           </li>
@@ -133,7 +133,7 @@ import { useFuturesList } from "@/business/market";
 import { queryMarketRun } from "@/services/api/goods";
 import { queryThjSpotQuoteConfig } from "@/services/api/market";
 
-const { router, routerTo } = useNavigation();
+const { router, routerTo, setGlobalUrlParams } = useNavigation();
 const { dataList } = useFuturesList();
 const refreshing = shallowRef(false); // 是否处于加载中状态
 const topBanners = shallowRef<Model.ImageConfigsRsp[]>([]); // 轮播图列表
@@ -146,6 +146,22 @@ const marketRun = shallowRef<Partial<Model.MarketRunRsp>>({}); // 市场
 // 当前现货行情
 const currentSpotQuote = computed(() => spotQuoteList.value[spotQuoteIndex.value])
 
+// 跳转导航页面
+const switchTab = (tabIndex: number) => {
+  setGlobalUrlParams({ tabIndex })
+  switch (tabIndex) {
+    case 1:
+      routerTo('home-presale', true)
+      break
+    case 2:
+      routerTo('home-transfer', true)
+      break
+    case 3:
+      routerTo('home-swap', true)
+      break
+  }
+}
+
 // 打开新闻详情
 const openNewsDetails = (id: number) => {
   if (id) {

+ 8 - 0
src/packages/mobile/views/market/detail/Index.vue

@@ -0,0 +1,8 @@
+<template>
+    <app-view>
+
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+</script>

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

@@ -0,0 +1,34 @@
+<template>
+    <app-view>
+        <template #header>
+            <app-navbar title="参考行情" />
+        </template>
+        <app-list :columns="columns" :data-list="dataList">
+            <template #goodscode="{ value }">
+                <span @click="$router.push({ name: 'market-detail' })">{{ value }}</span>
+            </template>
+        </app-list>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { onMounted, onUnmounted, computed } from 'vue'
+import { useFuturesStore } from '@/stores'
+import quoteSocket from '@/services/websocket/quote'
+import AppList from '@mobile/components/base/list/index.vue'
+
+const futuresStore = useFuturesStore()
+const dataList = computed(() => futuresStore.quoteList.filter((e) => e.marketid === 99201))
+const goodsCodes = dataList.value.map((e) => e.goodscode.toUpperCase())
+const subscribe = quoteSocket.addSubscribe(goodsCodes)
+
+const columns: Model.TableColumn[] = [
+    { prop: 'goodscode', label: '合约' },
+    { prop: 'ask', label: '卖价' },
+    { prop: 'bid', label: '买价' },
+    { prop: 'last', label: '最新价' },
+]
+
+onMounted(() => subscribe.start())
+onUnmounted(() => subscribe.stop())
+</script>

+ 34 - 3
src/packages/mobile/views/presale/list/Index.vue

@@ -1,5 +1,5 @@
 <template>
-    <app-view>
+    <app-view class="presale-list">
         <template #header>
             <app-navbar title="预售竞拍" :show-back-button="false" />
         </template>
@@ -8,9 +8,40 @@
                 <img src="http://192.168.31.201:5015/mtp2-onlineopen/uploadFile/20230420/202304201649184005.jpg" />
             </SwipeItem>
         </Swipe>
+        <div>正在抢购</div>
+        <div class="waterfall">
+            <div class="waterfall-item" v-for="(item, index) in dataList" :key="index">
+                <div class="goods" @click="$router.push({ name: 'presale-detail' })">
+                    <div class="goods-image">
+                        <img :src="getFileUrl(item.attachmenturl)" />
+                    </div>
+                    <div class="goods-info">
+                        <div class="goods-info__title">{{ item.goodsname }}</div>
+                        <div class="goods-info__price">
+                            <Tag type="danger">起拍价</Tag>
+                            <span class="unit">{{ item.startprice }}</span>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div>发售历史</div>
     </app-view>
 </template>
 
 <script lang="ts" setup>
-import { Swipe, SwipeItem } from "vant"
-</script>
+import { Swipe, SwipeItem, Tag } from 'vant'
+import { getFileUrl } from '@/filters'
+import { useRequest } from '@/hooks/request'
+import { queryPresaleGoods } from '@/services/api/presale'
+
+const { dataList } = useRequest(queryPresaleGoods, {
+    params: {
+        pagesize: 20,
+    },
+})
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 0 - 0
src/packages/mobile/views/presale/list/index.less


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

@@ -3,24 +3,52 @@
         <template #header>
             <app-navbar title="掉期贸易" :show-back-button="false" />
         </template>
-        <app-list :columns="columns" :data-list="dataList" />
+        <app-list :columns="columns" :data-list="tableList">
+            <template #goodsname="{ value }">
+                <span @click="$router.push({ name: 'swap-detail' })">{{ value }}</span>
+            </template>
+        </app-list>
     </app-view>
 </template>
 
 <script lang="ts" setup>
+import { computed } from 'vue'
+import { v4 } from 'uuid'
 import { useRequest } from '@/hooks/request'
 import { queryQuoteGoodsList } from '@/services/api/swap'
+import { useFuturesStore } from '@/stores'
+import quoteSocket from '@/services/websocket/quote'
 import AppList from '@mobile/components/base/list/index.vue'
 
+const futuresStore = useFuturesStore()
+const subscribeId = v4()
+
 const { dataList } = useRequest(queryQuoteGoodsList, {
     params: {
         usertype: 0,
+    },
+    onSuccess: (res) => {
+        const goodsCodes = res.data.map((e) => e.refgoodscode)
+        const subscribe = quoteSocket.addSubscribe(goodsCodes, subscribeId)
+        subscribe.start()
     }
 })
 
+const tableList = computed(() => {
+    return dataList.value.map(({ goodsid, goodsname, refgoodscode }) => {
+        const quote = futuresStore.getQuoteDayInfoByCode(refgoodscode)
+        const { last = 0 } = quote.value ?? {}
+        return {
+            goodsid,
+            goodsname,
+            last,
+        }
+    })
+})
+
 const columns: Model.TableColumn[] = [
     { prop: 'goodsname', label: '商品/标的' },
-    { prop: 'goodsid', label: '当前价' },
+    { prop: 'last', label: '当前价' },
     { prop: 'goodsid', label: '涨跌' },
     { prop: 'goodsid', label: '幅度' },
     { prop: 'goodsid', label: '今开' },

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

@@ -3,7 +3,7 @@
         <template #header>
             <app-navbar title="订单转让" :show-back-button="false" />
         </template>
-        <app-list :columns="columns" :data-list="futuresStore.quoteList">
+        <app-list :columns="columns" :data-list="dataList">
             <template #goodscode="{ value }">
                 <span @click="$router.push({ name: 'transfer-detail' })">{{ value }}</span>
             </template>
@@ -12,13 +12,14 @@
 </template>
 
 <script lang="ts" setup>
-import { onActivated, onDeactivated } from 'vue'
+import { onMounted, computed } from 'vue'
 import { useFuturesStore } from '@/stores'
 import quoteSocket from '@/services/websocket/quote'
 import AppList from '@mobile/components/base/list/index.vue'
 
 const futuresStore = useFuturesStore()
-const goodsCodes = futuresStore.goodsList.map((e) => e.goodscode.toUpperCase())
+const dataList = computed(() => futuresStore.quoteList.filter((e) => e.marketid === 49201))
+const goodsCodes = dataList.value.map((e) => e.goodscode.toUpperCase())
 const subscribe = quoteSocket.addSubscribe(goodsCodes)
 
 const columns: Model.TableColumn[] = [
@@ -28,6 +29,5 @@ const columns: Model.TableColumn[] = [
     { prop: 'askvolume', label: '卖量' },
 ]
 
-onActivated(() => subscribe.start())
-onDeactivated(() => subscribe.stop())
+onMounted(() => subscribe.start())
 </script>

+ 13 - 0
src/services/api/presale/index.ts

@@ -0,0 +1,13 @@
+import http from '@/services/http'
+import { RequestConfig } from '@/services/http/types'
+
+
+/**
+ * 查询掉期报价列表
+ */
+export function queryPresaleGoods(config: RequestConfig<Model.PresaleGoodsReq> = {}) {
+    return http.commonRequest<Model.PresaleGoodsRsp[]>({
+        url: '/Hnsh/QueryPresaleGoods',
+        params: config.data,
+    })
+}

+ 3 - 3
src/services/websocket/build/index.ts

@@ -146,7 +146,7 @@ export class MTP2WebSocket<T extends Package40 | Package50>{
     private startHeartBeat() {
         this.beatTimer = window.setTimeout(() => {
             this.beatTimerId = moment(new Date()).format('HH:mm:ss');
-            console.log(this.host, '发送心跳', this.beatTimerId);
+            //console.log(this.host, '发送心跳', this.beatTimerId);
             // 发送心跳
             switch (this.Package) {
                 case Package40: {
@@ -326,7 +326,7 @@ export class MTP2WebSocket<T extends Package40 | Package50>{
             switch (p.mainClassNumber) {
                 case 0x12: {
                     // 接收到心跳回复
-                    console.log(this.host, '收到心跳回复', this.beatTimerId);
+                    //console.log(this.host, '收到心跳回复', this.beatTimerId);
                     this.stopHeartBeat();
                     this.startHeartBeat();
                     break;
@@ -348,7 +348,7 @@ export class MTP2WebSocket<T extends Package40 | Package50>{
         if (p instanceof Package50) {
             if (p.funCode === 0) {
                 // 接收到心跳回复
-                console.log(this.host, '收到心跳回复', this.beatTimerId);
+                //console.log(this.host, '收到心跳回复', this.beatTimerId);
                 this.stopHeartBeat();
                 this.startHeartBeat();
             } else if (p.serialNumber === 0) {

+ 14 - 7
src/services/websocket/quote.ts

@@ -44,11 +44,14 @@ export default new (class {
         const quoteGoodses: Model.QuoteSubscribeReq['quoteGoodses'] = []
 
         this.subscribeMap.forEach((list) => {
-            const data = list.map((code) => ({
-                exchangeId: 250,
-                goodsCode: code,
-            }))
-            quoteGoodses.push(...data)
+            list.forEach((code) => {
+                if (!quoteGoodses.some((e) => e.goodsCode === code)) {
+                    quoteGoodses.push({
+                        exchangeId: 250,
+                        goodsCode: code,
+                    })
+                }
+            })
         })
 
         if (quoteGoodses.length) {
@@ -83,8 +86,12 @@ export default new (class {
 
         const start = () => {
             if (loginStore.token) {
-                // 对相同 key 订阅的商品进行合并处理
-                this.subscribeMap.set(uuid, [...value, ...goodsCodes])
+                goodsCodes.forEach((code) => {
+                    if (code && !value.includes(code)) {
+                        value.push(code)
+                    }
+                })
+                this.subscribeMap.set(uuid, value)
                 this.subscribe()
             }
         }

+ 46 - 0
src/types/model/presale.d.ts

@@ -0,0 +1,46 @@
+declare namespace Model {
+    /** 查询定金预售商品 请求 */
+    interface PresaleGoodsReq {
+        page?: number; // 页码
+        pagesize?: number; // 每页条数
+    }
+
+    /** 查询定金预售商品 请求 */
+    interface PresaleGoodsRsp {
+        accountid: number; // 卖方账户ID
+        applyid: number; // 关联申请ID
+        attachmenturl: string; // 缩略图片(1:1)
+        bannerpicurl: string; // Banner图(逗号分隔)(2:1)
+        buymaxqty: number; // 购买上限 [71] - 0为不限
+        createtime: string; // 创建时间
+        endtime: string; // 预售结束时间
+        floorprice: number; // 底价[大宗式竞拍]
+        goodscode: string; // 期货合约代码(内部)
+        goodsdetail: string; // 详情[大宗]
+        goodsid: number; // 商品ID
+        goodsname: string; // 期货合约名称
+        marketid: number; // 预售市场ID - 根据预售模式选择市场
+        pictureurls: string; // 详情图片(逗号分隔)(宽:1125)
+        presaledamount: number; // 已预售总金额(预售结束时更新)71-委托时更新
+        presaledepositalgorithm: number; // 预售定金方式(48) - 1:比率 2:固定
+        presaledepositvalue: number; // 预售定金设置值(48)
+        presaledqty: number; // 已预售量(预售结束时更新) 71-委托时更新
+        presalemode: number; // 预售模式 - 1:一口价 2:大宗式竞拍 3:挂牌预售(HSBY)
+        presalemodestr: string; // 预售模式
+        presaleprice: number; // 发售价(49)
+        presaleqty: number; // 预售数量
+        presalestatus: number; // 预售状态 - 1:未开始 2:预售中 3:已结束
+        provideruserid: number; // 发售方用户ID(49)
+        refprice: number; // 参考价格[一口价]
+        relatedgoodsid: number; // 关联交易合约ID
+        relatedmarketid: number; // 关联交易合约市场ID
+        sellname: string; // 发售方
+        sellstatus: number; // 卖方处理状态 - 1:卖方头寸未处理 2:卖方头寸已处理
+        startprice: number; // 起拍价[大宗式竞拍]
+        starttime: string; // 预售开始时间
+        tradedate: string; // 交易日(yyyyMMdd)
+        tradeprice: number; // 成交价[大宗]
+        transferdepositratio: number; // 转让定金比例(49)
+        userid: number; // 卖方用户ID
+    }
+}