li.shaoyi 2 ماه پیش
والد
کامیت
11e94a73ed
25فایلهای تغییر یافته به همراه735 افزوده شده و 63 حذف شده
  1. 2 2
      app/package.json
  2. 2 1
      file/android/fxgl.txt
  3. 2 2
      oem/tss-vi/config/appconfig.json
  4. 20 4
      src/packages/digital/router/index.ts
  5. 35 0
      src/packages/digital/views/contract/components/account/index.vue
  6. 38 0
      src/packages/digital/views/contract/components/order/cancel/index.vue
  7. 72 0
      src/packages/digital/views/contract/components/order/index.vue
  8. 35 0
      src/packages/digital/views/contract/components/position/close/index.vue
  9. 98 0
      src/packages/digital/views/contract/components/position/index.vue
  10. 39 0
      src/packages/digital/views/contract/components/position/market-close/index.vue
  11. 20 0
      src/packages/digital/views/contract/goods/chart/index.vue
  12. 9 0
      src/packages/digital/views/contract/goods/detail/index.less
  13. 91 0
      src/packages/digital/views/contract/goods/detail/index.vue
  14. 59 0
      src/packages/digital/views/contract/goods/list/index.less
  15. 113 0
      src/packages/digital/views/contract/goods/list/index.vue
  16. 0 34
      src/packages/digital/views/contract/index.vue
  17. 1 1
      src/packages/digital/views/home/index.vue
  18. 4 0
      src/packages/digital/views/user/login/index.less
  19. 1 1
      src/packages/digital/views/user/login/index.vue
  20. 5 0
      src/packages/digital/views/wallet/index.less
  21. 68 0
      src/packages/digital/views/wallet/index.vue
  22. 1 1
      src/packages/mobile/views/swap/detail/components/listing/Index.vue
  23. 1 1
      src/packages/pc/views/market/trade/swap/detail/listing/index.vue
  24. 1 1
      src/packages/tss/views/home/index.vue
  25. 18 15
      src/stores/modules/futures.ts

+ 2 - 2
app/package.json

@@ -1,6 +1,6 @@
 {
-  "name": "trading-beta",
-  "version": "1.0.2",
+  "name": "trading",
+  "version": "1.0.3",
   "main": "main.js",
   "dependencies": {
     "electron-updater": "^6.1.4",

+ 2 - 1
file/android/fxgl.txt

@@ -176,4 +176,5 @@ http://134.175.108.44:8280/cfg?key=sjgj_ddgl
 com.snhl.demo_v1.0.0.apk
 http://47.112.2.251:8280/cfg?key=snhl_mnp
 实盘
-com.snhl.release_v1.0.0.apk
+com.snhl.release_v1.0.0.apk
+http://47.107.135.62:8280/cfg?key=snhl_sp

+ 2 - 2
oem/tss-vi/config/appconfig.json

@@ -1,8 +1,8 @@
 {
   "appId": "com.tce.vi",
   "appName": "Tce-Vietnam",
-  "version": "1.0.78",
-  "versionCode": "100078",
+  "version": "1.0.79",
+  "versionCode": "100079",
   "apiUrl": "http://192.168.31.210:8080/cfg?key=test_210",
   "tradeChannel": "ws",
   "showLoginAlert": true,

+ 20 - 4
src/packages/digital/router/index.ts

@@ -63,12 +63,12 @@ const routes: Array<RouteRecordRaw> = [
           {
             path: 'contract',
             name: 'home-contract',
-            component: () => import('../views/contract/index.vue'),
+            component: () => import('../views/contract/goods/list/index.vue'),
           },
           {
-            path: 'mine',
-            name: 'home-mine',
-            component: () => import('../views/mine/index.vue'),
+            path: 'wallet',
+            name: 'home-wallet',
+            component: () => import('../views/wallet/index.vue'),
           },
           ...homeRoutes
         ]
@@ -76,6 +76,22 @@ const routes: Array<RouteRecordRaw> = [
     ],
   },
   {
+    path: '/contract',
+    component: Page,
+    children: [
+      {
+        path: 'goods/detail',
+        name: 'contract-goods-detail',
+        component: () => import('../views/contract/goods/detail/index.vue'),
+      },
+      {
+        path: 'goods/chart',
+        name: 'contract-goods-chart',
+        component: () => import('../views/contract/goods/chart/index.vue'),
+      },
+    ]
+  },
+  {
     path: '/user',
     component: Page,
     children: [

+ 35 - 0
src/packages/digital/views/contract/components/account/index.vue

@@ -0,0 +1,35 @@
+<template>
+    <div class="contract-account">
+        <table class="card" cellspacing="0" cellpadding="0" border="1">
+            <tbody>
+                <tr>
+                    <td colspan="2">
+                        <span>账户权益(USDT)</span>
+                        <span>1000.00</span>
+                    </td>
+                    <td>
+                        <span>浮动盈亏</span>
+                        <span>+2.87</span>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <span>可用(USDT)</span>
+                        <span>100</span>
+                    </td>
+                    <td>
+                        <span>占用(USDT)</span>
+                        <span>34,808.80</span>
+                    </td>
+                    <td>
+                        <span>冻结(USDT)</span>
+                        <span>97.21</span>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</template>
+
+<script lang="ts" setup>
+</script>

+ 38 - 0
src/packages/digital/views/contract/components/order/cancel/index.vue

@@ -0,0 +1,38 @@
+<template>
+    <Dialog v-model:show="showDialog" title="提示" show-cancel-button :before-close="onBeforeClose" @closed="onClosed">
+        <span>是否撤销?</span>
+    </Dialog>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, onMounted } from 'vue'
+import { Dialog } from 'vant'
+
+defineProps({
+    selectedRow: {
+        type: Object,
+        required: true
+    }
+})
+
+const emit = defineEmits(['closed'])
+
+const showDialog = shallowRef(false)
+const refresh = shallowRef(false) // 是否刷新父组件数据
+
+const onBeforeClose = (action: string) => {
+    if (action === 'confirm') {
+        refresh.value = true
+        showDialog.value = false
+    }
+    return true
+}
+
+const onClosed = () => {
+    emit('closed', refresh.value)
+}
+
+onMounted(() => {
+    showDialog.value = true
+})
+</script>

+ 72 - 0
src/packages/digital/views/contract/components/order/index.vue

@@ -0,0 +1,72 @@
+<template>
+    <div class="contract-order">
+        <table class="card" cellspacing="0" cellpadding="0" border="1">
+            <thead>
+                <tr>
+                    <th>
+                        <span>Gold黄金</span>
+                        <time>2025-09-01 11:11:11</time>
+                    </th>
+                    <th>
+                        <span>开多</span>
+                    </th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr>
+                    <td>
+                        <span>委托单号</span>
+                        <span>1001718728455010011</span>
+                    </td>
+                    <td>
+                        <span>委托状态</span>
+                        <span>委托成功</span>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <span>委托价格(USDT)</span>
+                        <span>3,480.88</span>
+                    </td>
+                    <td>
+                        <span>委托数量(Gold)</span>
+                        <span>100</span>
+                    </td>
+                </tr>
+            </tbody>
+            <tfoot>
+                <tr>
+                    <td colspan="2">
+                        <Button type="danger" @click="cancelOrder()">撤销</Button>
+                    </td>
+                </tr>
+            </tfoot>
+        </table>
+        <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+            @closed="closeComponent" v-if="componentId" />
+    </div>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, defineAsyncComponent } from 'vue'
+import { Button } from 'vant'
+import { useComponent } from '@/hooks/component'
+
+defineProps({
+    goodsId: Number
+})
+
+const componentMap = new Map<string, unknown>([
+    ['Cancel', defineAsyncComponent(() => import('./cancel/index.vue'))], // 撤销
+])
+
+const selectedRow = shallowRef()
+
+const { componentRef, componentId, openComponent, closeComponent } = useComponent()
+
+// 撤销
+const cancelOrder = () => {
+    selectedRow.value = {}
+    openComponent('Cancel')
+}
+</script>

+ 35 - 0
src/packages/digital/views/contract/components/position/close/index.vue

@@ -0,0 +1,35 @@
+<template>
+    <app-modal direction="right-top" height="100%" width="100%" v-model:show="showModal" :refresh="refresh">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar title="平仓" />
+            </template>
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import AppModal from '@/components/base/modal/index.vue'
+
+defineProps({
+    selectedRow: {
+        type: Object,
+        required: true
+    }
+})
+
+const showModal = shallowRef(true)
+const refresh = shallowRef(false) // 是否刷新父组件数据
+
+// 关闭弹窗=
+const closed = (isRefresh = false) => {
+    refresh.value = isRefresh
+    showModal.value = false
+}
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed,
+})
+</script>

+ 98 - 0
src/packages/digital/views/contract/components/position/index.vue

@@ -0,0 +1,98 @@
+<template>
+    <div class="contract-position">
+        <table class="card" cellspacing="0" cellpadding="0" border="1">
+            <thead>
+                <tr>
+                    <th colspan="2">
+                        <span>Gold黄金</span>
+                        <time>2025-09-01 11:11:11</time>
+                    </th>
+                    <th>
+                        <span>开多</span>
+                    </th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr>
+                    <td colspan="2">
+                        <span>浮动盈亏(USDT)</span>
+                        <span>+1000.00</span>
+                    </td>
+                    <td>
+                        <span>回报率(%)</span>
+                        <span>+2.87%</span>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <span>持仓量(Gold)</span>
+                        <span>100</span>
+                    </td>
+                    <td>
+                        <span>保证金(USDT)</span>
+                        <span>34,808.80</span>
+                    </td>
+                    <td>
+                        <span>风险率(%)</span>
+                        <span>97.21%</span>
+                    </td>
+                </tr>
+                <tr>
+                    <td>
+                        <span>冻结量(Gold)</span>
+                        <span>100</span>
+                    </td>
+                    <td>
+                        <span>持仓价格(USDT)</span>
+                        <span>34,808.80</span>
+                    </td>
+                    <td>
+                        <span>持金额(USDT)</span>
+                        <span>97.21%</span>
+                    </td>
+                </tr>
+            </tbody>
+            <tfoot>
+                <tr>
+                    <td colspan="3">
+                        <Button type="danger" @click="closePosition()">平仓</Button>
+                        <Button type="danger" @click="closePositionAtMarket()">市价平仓</Button>
+                    </td>
+                </tr>
+            </tfoot>
+        </table>
+        <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+            @closed="closeComponent" v-if="componentId" />
+    </div>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, defineAsyncComponent } from 'vue'
+import { Button } from 'vant'
+import { useComponent } from '@/hooks/component'
+
+defineProps({
+    goodsId: Number
+})
+
+const componentMap = new Map<string, unknown>([
+    ['Close', defineAsyncComponent(() => import('./close/index.vue'))], // 平仓
+    ['MarketClose', defineAsyncComponent(() => import('./market-close/index.vue'))], // 市价平仓
+])
+
+const selectedRow = shallowRef()
+
+const { componentRef, componentId, openComponent, closeComponent } = useComponent()
+
+// 平仓
+const closePosition = () => {
+    selectedRow.value = {}
+    openComponent('Close')
+}
+
+// 市价平仓
+const closePositionAtMarket = () => {
+    selectedRow.value = {}
+    openComponent('MarketClose')
+}
+</script>

+ 39 - 0
src/packages/digital/views/contract/components/position/market-close/index.vue

@@ -0,0 +1,39 @@
+<template>
+    <Dialog v-model:show="showDialog" title="您确定要按市价平仓吗?" show-cancel-button :before-close="onBeforeClose"
+        @closed="onClosed">
+        <span>市价平仓会以市价委托方式平掉此仓位。</span>
+    </Dialog>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, onMounted } from 'vue'
+import { Dialog } from 'vant'
+
+defineProps({
+    selectedRow: {
+        type: Object,
+        required: true
+    }
+})
+
+const emit = defineEmits(['closed'])
+
+const showDialog = shallowRef(false)
+const refresh = shallowRef(false) // 是否刷新父组件数据
+
+const onBeforeClose = (action: string) => {
+    if (action === 'confirm') {
+        refresh.value = true
+        showDialog.value = false
+    }
+    return true
+}
+
+const onClosed = () => {
+    emit('closed', refresh.value)
+}
+
+onMounted(() => {
+    showDialog.value = true
+})
+</script>

+ 20 - 0
src/packages/digital/views/contract/goods/chart/index.vue

@@ -0,0 +1,20 @@
+<template>
+    <app-view class="contract-detail g-form">
+        <template #header>
+            <app-navbar :title="quote?.goodscode" />
+            图表
+        </template>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { computed } from 'vue'
+import { useNavigation } from '@mobile/router/navigation'
+import { useFuturesStore } from '@/stores'
+
+const { getQueryStringToNumber } = useNavigation()
+const goodsid = getQueryStringToNumber('id')
+const futuresStore = useFuturesStore()
+
+const quote = computed(() => futuresStore.getQuoteInfo({ goodsid }))
+</script>

+ 9 - 0
src/packages/digital/views/contract/goods/detail/index.less

@@ -0,0 +1,9 @@
+.contract-detail {
+    .card {
+        width: 100%;
+
+        span {
+            display: block;
+        }
+    }
+}

+ 91 - 0
src/packages/digital/views/contract/goods/detail/index.vue

@@ -0,0 +1,91 @@
+<template>
+    <app-view class="contract-detail g-form">
+        <template #header>
+            <app-navbar>
+                <template #left>
+                    <span style="margin-left: 48px;">{{ quote?.goodscode }}</span>
+                </template>
+                <div>
+                    <span>{{ quote?.presettle }}</span>
+                    <span>{{ parsePercent(quote?.change) }}</span>
+                </div>
+                <template #right>
+                    <span @click="routerToChart">图表</span>
+                </template>
+            </app-navbar>
+            <Button type="danger">开多</Button>
+            <Button type="primary">开空</Button>
+            <Form ref="formRef" class="g-form__container">
+                <CellGroup inset>
+                    <Field label="限单价">
+                        <template #input>
+                            <app-select :options="[]" />
+                        </template>
+                    </Field>
+                    <Field label="价格">
+                        <template #input>
+                            <app-stepper theme="round" />
+                        </template>
+                    </Field>
+                    <Field label="数量">
+                        <template #input>
+                            <app-stepper theme="round" />
+                        </template>
+                    </Field>
+                    <Field label="开仓价值">
+                    </Field>
+                </CellGroup>
+                <CellGroup inset style="margin-top: 20px;">
+                    <Cell title="可用余额" value="0" />
+                    <Cell title="可开数量" value="0" />
+                    <Cell title="预估手续费" value="0" />
+                </CellGroup>
+            </Form>
+            <Button type="danger">开多</Button>
+            <Tabs v-model:active="tabIndex">
+                <Tab title="持仓">
+                    <contract-position v-bind="{ goodsId }" />
+                </Tab>
+                <Tab title="委托">
+                    <contract-order v-bind="{ goodsId }" />
+                </Tab>
+                <Tab title="资金">
+                    <contract-account />
+                </Tab>
+            </Tabs>
+        </template>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, computed } from 'vue'
+import { Form, Button, CellGroup, Field, Cell, Tab, Tabs, } from 'vant'
+import { parsePercent } from '@/filters'
+import { useNavigation } from '@mobile/router/navigation'
+import { useFuturesStore } from '@/stores'
+import AppSelect from '@mobile/components/base/select/index.vue'
+import AppStepper from '@mobile/components/base/stepper/index.vue'
+import ContractPosition from '../../components/position/index.vue'
+import ContractOrder from '../../components/order/index.vue'
+import ContractAccount from '../../components/account/index.vue'
+
+const { router, getQueryStringToNumber } = useNavigation()
+const goodsId = getQueryStringToNumber('id')
+const futuresStore = useFuturesStore()
+const tabIndex = shallowRef(0)
+
+const quote = computed(() => futuresStore.getQuoteInfo({ goodsid: goodsId }))
+
+const routerToChart = () => {
+    router.push({
+        name: 'contract-goods-chart',
+        query: {
+            id: goodsId
+        }
+    })
+}
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 59 - 0
src/packages/digital/views/contract/goods/list/index.less

@@ -0,0 +1,59 @@
+.contract {
+    .table {
+        width: 100%;
+        text-align: right;
+
+        &-row {
+            position: relative;
+
+            &::after {
+                content: '';
+                position: absolute;
+                bottom: 0;
+                right: 0;
+                left: 0;
+                pointer-events: none;
+                border-bottom: 1px solid #292929;
+                transform: scaleY(.5);
+            }
+
+            th,
+            td {
+                &:first-child {
+                    text-align: left;
+                }
+            }
+
+            th {
+                font-size: 12px;
+                font-weight: normal;
+                color: #999;
+            }
+        }
+
+        &-cell {
+            display: flex;
+            flex-direction: column;
+            padding: 10px;
+
+            &--media {
+                flex-direction: row;
+                align-items: center;
+            }
+
+            &__image {
+                margin-right: 10px;
+            }
+
+            &__info {
+                display: flex;
+                flex-direction: column;
+            }
+
+            .text-small {
+                font-size: 12px;
+                color: #999;
+            }
+        }
+    }
+}

+ 113 - 0
src/packages/digital/views/contract/goods/list/index.vue

@@ -0,0 +1,113 @@
+<template>
+    <app-view class="contract">
+        <Search />
+        <Tabs v-model:active="currentGroupId">
+            <template v-for="(item, index) in goodsGroups" :key="index">
+                <Tab :title="item.goodsgroupname" :name="item.goodsgroupid">
+                    <table class="table" cellspacing="0" cellpadding="0">
+                        <thead class="table-thead">
+                            <tr class="table-row">
+                                <th>
+                                    <div class="table-cell">代码/名称</div>
+                                </th>
+                                <th>
+                                    <div class="table-cell">买价/卖价</div>
+                                </th>
+                                <th>
+                                    <div class="table-cell">最高/最低</div>
+                                </th>
+                                <th>
+                                    <div class="table-cell">涨跌</div>
+                                </th>
+                            </tr>
+                        </thead>
+                        <tbody class="table-body">
+                            <template v-for="(item, index) in goodsList" :key="index">
+                                <tr class="table-row" @click="rowClick(item)">
+                                    <td>
+                                        <div class="table-cell table-cell--media">
+                                            <div class="table-cell__image">
+                                                <Image fit="contain" :src="getFirstImage(item.thumurls)" width="28"
+                                                    height="28" round />
+                                            </div>
+                                            <div class="table-cell__info">
+                                                <span>
+                                                    <b>{{ item.goodscode }}</b>
+                                                </span>
+                                                <span class="text-small">
+                                                    {{ item.goodsname }}
+                                                </span>
+                                            </div>
+                                        </div>
+                                    </td>
+                                    <td>
+                                        <div class="table-cell">
+                                            <span :class="item.bidColor">
+                                                {{ handleNumberValue(item.bid) }}
+                                            </span>
+                                            <span :class="item.askColor">
+                                                {{ handleNumberValue(item.ask) }}
+                                            </span>
+                                        </div>
+                                    </td>
+                                    <td>
+                                        <div class="table-cell">
+                                            <span :class="item.highestColor">
+                                                {{ handleNumberValue(item.highest) }}
+                                            </span>
+                                            <span :class="item.lowestColor">
+                                                {{ handleNumberValue(item.lowest) }}
+                                            </span>
+                                        </div>
+                                    </td>
+                                    <td>
+                                        <div class="table-cell">
+                                            <span>
+                                                {{ parsePercent(item.change) }}
+                                            </span>
+                                        </div>
+                                    </td>
+                                </tr>
+                            </template>
+                        </tbody>
+                    </table>
+                </Tab>
+            </template>
+        </Tabs>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, onMounted, computed } from 'vue'
+import { Search, Tab, Tabs, Image } from 'vant'
+import { useNavigation } from '@mobile/router/navigation'
+import { parsePercent, handleNumberValue, getFirstImage } from '@/filters'
+import { useFuturesStore, useUserStore } from '@/stores'
+
+const { router } = useNavigation()
+const userStore = useUserStore()
+const futuresStore = useFuturesStore()
+const currentGroupId = shallowRef(0)
+
+const goodsGroups = userStore.userData.goodsgroups.filter((e) => e.marketid === 10101)
+
+const goodsList = computed(() => futuresStore.quotationList.filter((e) => e.goodsgroupid === currentGroupId.value))
+
+const rowClick = (row: Model.GoodsQuote) => {
+    router.push({
+        name: 'contract-goods-detail',
+        query: {
+            id: row.goodsid
+        }
+    })
+}
+
+onMounted(() => {
+    const [firstGroup] = goodsGroups
+    currentGroupId.value = firstGroup ? firstGroup.goodsgroupid : 0
+})
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 0 - 34
src/packages/digital/views/contract/index.vue

@@ -1,34 +0,0 @@
-<template>
-    <app-view>
-        <Search />
-        <Tabs v-model:active="currentGroupId">
-            <template v-for="(item, index) in goodsGroups" :key="index">
-                <Tab :title="item.goodsgroupname" :name="item.goodsgroupid">
-                    <table cellspacing="0" cellpadding="0">
-                        <thead></thead>
-                        <tbody></tbody>
-                    </table>
-                </Tab>
-            </template>
-        </Tabs>
-    </app-view>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, onMounted, computed } from 'vue'
-import { Search, Tab, Tabs } from 'vant'
-import { useFuturesStore, useUserStore } from '@/stores'
-
-const userStore = useUserStore()
-const futuresStore = useFuturesStore()
-const currentGroupId = shallowRef(0)
-
-const goodsGroups = userStore.userData.goodsgroups.filter((e) => e.marketid === 10101)
-
-const goodsList = computed(() => futuresStore.quotationList.filter((e) => e.goodsgroupid === currentGroupId.value))
-
-onMounted(() => {
-    const [firstGroup] = goodsGroups
-    currentGroupId.value = firstGroup ? firstGroup.goodsgroupid : 0
-})
-</script>

+ 1 - 1
src/packages/digital/views/home/index.vue

@@ -55,7 +55,7 @@ const tabbarItems = [
     icon: 'records',
   },
   {
-    name: 'home-mine',
+    name: 'home-wallet',
     label: '钱包',
     icon: 'cash-back-record',
   }

+ 4 - 0
src/packages/digital/views/user/login/index.less

@@ -4,4 +4,8 @@
             height: 48px;
         }
     }
+
+    .van-field__control {
+        background-color: #333 !important;
+    }
 }

+ 1 - 1
src/packages/digital/views/user/login/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <app-login :logo-url="'./logo/logo.svg'" />
+  <app-login />
 </template>
 
 <script lang="ts" setup>

+ 5 - 0
src/packages/digital/views/wallet/index.less

@@ -0,0 +1,5 @@
+.wallet {
+    &-fun{
+        display: flex;
+    }
+}

+ 68 - 0
src/packages/digital/views/wallet/index.vue

@@ -0,0 +1,68 @@
+<template>
+    <app-view class="wallet">
+        <div class="wallet-fun">
+            <ul>
+                <li>
+                    <span>充值</span>
+                </li>
+                <li>
+                    <span>提现</span>
+                </li>
+                <li>
+                    <span>划转</span>
+                </li>
+                <li>
+                    <span>设置</span>
+                </li>
+            </ul>
+        </div>
+        <Tabs v-model:active="currentTabIndex">
+            <Tab title="现货">
+                <Search />
+                <div class="card">
+                    <div class="card-section">
+                        <div class="card-section__image">
+                            <Image fit="contain" src="" width="28" height="28" round />
+                        </div>
+                        <div class="card-section__info">
+                            <span>
+                                <b>BTC</b>
+                            </span>
+                            <span>
+                                比特币
+                            </span>
+                        </div>
+                    </div>
+                    <div class="card-section">
+                        <div class="card-section__balance">
+                            <span>
+                                余额(USDT)
+                            </span>
+                            <span>
+                                12.65432100
+                            </span>
+                        </div>
+                        <div class="card-section__icon">
+                            <Icon name="arrow" />
+                        </div>
+                    </div>
+                </div>
+            </Tab>
+            <Tab title="合约">
+                <contract-account />
+            </Tab>
+        </Tabs>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { Search, Tab, Tabs, Image, Icon } from 'vant'
+import ContractAccount from '../../views/contract/components/account/index.vue'
+
+const currentTabIndex = shallowRef(0)
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 1 - 1
src/packages/mobile/views/swap/detail/components/listing/Index.vue

@@ -178,7 +178,7 @@ const calculateListingAmount = () => {
             const last = futuresStore.getQuotePrice(props.item.refgoodscode)
             const basic = formData.MarketMaxSub ?? 0.0
             /// 浮动估算价价
-            estimateprice.value = basic + last.value
+            estimateprice.value = basic + last
             const { MarginAlgorithm, MarketMarginValue } = margin.value?.infoc
             const { OrderQty = 0 } = formData
             const { agreeunit = 0 } = goods.value ?? {}

+ 1 - 1
src/packages/pc/views/market/trade/swap/detail/listing/index.vue

@@ -177,7 +177,7 @@ const calculateListingAmount = () => {
             const last = futuresStore.getQuotePrice(props.quoteGoods.refgoodscode)
             const basic = formData.MarketMaxSub ?? 0.0
             /// 浮动估算价价
-            estimateprice.value = basic + last.value
+            estimateprice.value = basic + last
             const { MarginAlgorithm, MarketMarginValue } = margin.value?.infoc
             const { OrderQty = 0 } = formData
             const { agreeunit = 0 } = goods.value ?? {}

+ 1 - 1
src/packages/tss/views/home/index.vue

@@ -135,7 +135,7 @@ onMounted(() => {
   const el = homeRef.value
   if (el) {
     offset.value = {
-      x: -1,
+      x: el.clientWidth - 70,
       y: el.clientHeight - 120
     }
   }

+ 18 - 15
src/stores/modules/futures.ts

@@ -1,5 +1,6 @@
 import { shallowRef, reactive, computed, toRefs, onUnmounted } from 'vue'
 import { v4 } from 'uuid'
+import { isMatch } from 'lodash'
 import { timerTask } from '@/utils/timer'
 import { handlePriceColor } from '@/filters'
 import { queryMemberGoodsLimitConfig } from '@/services/api/common'
@@ -192,21 +193,22 @@ export const useFuturesStore = defineStore(() => {
         return computed(() => state.quotationList.find((e) => e.goodscode === code || e.goodsid === code))
     }
 
+    const getQuoteInfo = (prop: Partial<Model.GoodsQuote>) => {
+        return state.quotationList.find(item => isMatch(item, prop))
+    }
+
     // 通过 goodscode 获取实时行情报价
-    const getQuotePrice = (goodsCode: string) => {
-        return computed(() => {
-            const quote = getGoodsQuote(goodsCode)
-            const { last = 0, presettle = 0, preclose = 0 } = quote.value ?? {}
-            if (last != 0.0) {
-                return last
-            } else if (presettle != 0.0) {
-                return presettle
-            } else if (preclose != 0.0) {
-                return preclose
-            } else {
-                return 0.0
-            }
-        })
+    const getQuotePrice = (goodscode: string) => {
+        const { last = 0, presettle = 0, preclose = 0 } = getQuoteInfo({ goodscode }) ?? {}
+        if (last != 0.0) {
+            return last
+        } else if (presettle != 0.0) {
+            return presettle
+        } else if (preclose != 0.0) {
+            return preclose
+        } else {
+            return 0.0
+        }
     }
 
     // 获取商品名称
@@ -563,6 +565,7 @@ export const useFuturesStore = defineStore(() => {
         quoteWatch,
         quotePushNotify,
         getGoods,
-        goodsdisplay
+        goodsdisplay,
+        getQuoteInfo
     }
 })