li.shaoyi 2 maanden geleden
bovenliggende
commit
7697a35e37

+ 1 - 1
app/package.json

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

+ 43 - 0
src/constants/order.ts

@@ -631,6 +631,15 @@ export function getDigitalCurrencyList() {
 }
 
 /**
+ * 获取数字币种名称
+ * @returns 
+ */
+export function getDigitalCurrencyName(value: number) {
+    const enums = getDigitalCurrencyList()
+    return getEnumTypeName(enums, value)
+}
+
+/**
  * 获取申请状列表
  * @returns 
  */
@@ -671,4 +680,38 @@ export function getInoutTypeList() {
 export function getInoutTypeName(value: number) {
     const enums = getInoutTypeList()
     return getEnumTypeName(enums, value)
+}
+
+/**
+ * 获取业务类型列表
+ * @returns 
+ */
+export function getDigitalBusinessCodeList() {
+    return getEnumTypeList('digitalbusinesscode')
+}
+
+/**
+ * 获取业务类型名称
+ * @returns 
+ */
+export function getDigitalBusinessCodeName(value: number) {
+    const enums = getDigitalBusinessCodeList()
+    return getEnumTypeName(enums, value)
+}
+
+/**
+ * 获取操作类型列表
+ * @returns 
+ */
+export function getDigitalOperateTypeList() {
+    return getEnumTypeList('digitaloperatetype')
+}
+
+/**
+ * 获取操作类型名称
+ * @returns 
+ */
+export function getDigitalOperateTypeName(value: number) {
+    const enums = getDigitalOperateTypeList()
+    return getEnumTypeName(enums, value)
 }

+ 21 - 0
src/packages/digital/assets/themes/global/global.less

@@ -107,4 +107,25 @@
             border-radius: 8px;
         }
     }
+}
+
+.g-detail-list {
+    line-height: 1.6;
+
+    dl {
+        font-size: 13px;
+        border-bottom: 1px solid #171f2d;
+        padding: 10px;
+
+        dd {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+        }
+    }
+
+    .text-small {
+        font-weight: normal;
+        color: #666;
+    }
 }

+ 3 - 0
src/packages/digital/main.ts

@@ -1,6 +1,7 @@
 import 'core-js'
 import 'regenerator-runtime/runtime'
 import { createApp } from 'vue'
+import { createPinia } from 'pinia'
 import App from './App.vue'
 import router from './router'
 //import 'default-passive-events'
@@ -14,7 +15,9 @@ import { i18n } from '@/stores'
 // import Vconsole from 'vconsole'
 // new Vconsole()
 
+const pinia = createPinia()
 const app = createApp(App)
+app.use(pinia)
 app.use(i18n)
 app.use(router)
 app.use(layouts)

+ 5 - 1
src/packages/digital/views/contract/goods/list/index.vue

@@ -1,6 +1,10 @@
 <template>
     <app-view class="contract">
-        <Search shape="round" placeholder="搜索" />
+        <template #header>
+            <app-statusbar>
+                <Search shape="round" placeholder="搜索" />
+            </app-statusbar>
+        </template>
         <Tabs v-model:active="currentGroupId">
             <template v-for="(item, index) in goodsGroups" :key="index">
                 <Tab :title="item.goodsgroupname" :name="item.goodsgroupid">

+ 23 - 13
src/packages/digital/views/spot/components/account/index.vue

@@ -1,35 +1,34 @@
 <!-- 现货-账户 -->
 <template>
     <div class="g-detail-table">
-        <table cellspacing="0" cellpadding="0">
+        <table cellspacing="0" cellpadding="0" v-for="(item, index) in accountList" :key="index">
             <tbody>
                 <tr>
                     <th>
-                        <span>BTC</span>
-                        <span class="text-small">比特币</span>
+                        <span>{{ item.currencycode }}</span>
+                        <span class="text-small">{{ getDigitalCurrencyName(item.currencyid) }}</span>
                     </th>
                     <td>
-                        <span class="text-small">可用(BTC)</span>
-                        <span>1.23455789</span>
+                        <span class="text-small">可用({{ item.currencycode }})</span>
+                        <span>{{ item.currentbalance - item.freezemargin }}</span>
                     </td>
                 </tr>
                 <tr>
                     <td>
-                        <span class="text-small">余额(BTC)</span>
-                        <span>1.23456789</span>
+                        <span class="text-small">余额({{ item.currencycode }})</span>
+                        <span>{{ item.currentbalance }}</span>
                     </td>
-
                     <td>
-                        <span class="text-small">冻结(BTC)</span>
-                        <span>0.00001000</span>
+                        <span class="text-small">冻结({{ item.currencycode }})</span>
+                        <span>{{ item.freezemargin }}</span>
                     </td>
                 </tr>
             </tbody>
             <tfoot>
                 <tr>
                     <td colspan="2">
-                        <Button size="small" @click="navigateTo('wallet-deposit', 0)">充值</Button>
-                        <Button size="small" @click="navigateTo('wallet-withdraw', 0)">提现</Button>
+                        <Button size="small" @click="navigateTo('wallet-deposit', item.digitalaccountid)">充值</Button>
+                        <Button size="small" @click="navigateTo('wallet-withdraw', item.digitalaccountid)">提现</Button>
                     </td>
                 </tr>
             </tfoot>
@@ -38,18 +37,29 @@
 </template>
 
 <script lang="ts" setup>
+import { computed } from 'vue'
 import { Button } from 'vant'
 import { useNavigation } from '@mobile/router/navigation'
+import { getDigitalCurrencyName } from '@/constants/order'
+import { useFuturesStore } from '@/stores'
+import { useSpotAccountStore } from '../../../wallet/components/spot/composables'
 
 const props = defineProps({
     goodsId: {
         type: Number,
+        required: true
     }
 })
 
 const { router } = useNavigation()
+const futuresStore = useFuturesStore()
+const spotAccountStore = useSpotAccountStore()
+
+const { currencyid = 0, goodscurrencyid = 0 } = futuresStore.getQuoteInfo({ goodsid: props.goodsId }) ?? {}
+
+const accountList = computed(() => spotAccountStore.filterAccountsByCurrencyId(currencyid, goodscurrencyid))
 
-const navigateTo = (name: string, accountId: number) => {
+const navigateTo = (name: string, accountId: string) => {
     router.push({
         name,
         query: {

+ 2 - 2
src/packages/digital/views/spot/components/order/cancel/index.vue

@@ -5,12 +5,12 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, onMounted } from 'vue'
+import { shallowRef, onMounted, PropType } from 'vue'
 import { Dialog } from 'vant'
 
 defineProps({
     selectedRow: {
-        type: Object,
+        type: Object as PropType<Model.DigitalTradeOrderDetailsRsp>,
         required: true
     }
 })

+ 42 - 19
src/packages/digital/views/spot/components/order/index.vue

@@ -9,15 +9,15 @@
                 </tr>
             </tbody>
         </table>
-        <table cellspacing="0" cellpadding="0">
+        <table cellspacing="0" cellpadding="0" v-for="(item, index) in tableList" :key="index">
             <thead>
                 <tr>
                     <th>
-                        <span>Gold黄金</span>
-                        <time class="text-small">2025-09-01 11:11:11</time>
+                        <span>{{ item.goodsname }}</span>
+                        <time class="text-small">{{ item.ordertime }}</time>
                     </th>
                     <th>
-                        <span class="g-price-down">买入</span>
+                        <span class="g-price-down">{{ getBuyOrSellName(item.buyorsell) }}</span>
                     </th>
                 </tr>
             </thead>
@@ -25,34 +25,34 @@
                 <tr>
                     <td>
                         <span class="text-small">委托单号</span>
-                        <span>1001718728455010011</span>
+                        <span>{{ item.orderid }}</span>
                     </td>
                     <td>
                         <span class="text-small">委托状态</span>
-                        <span>委托成功</span>
+                        <span>{{ getOrderStatusName(item.orderstatus) }}</span>
                     </td>
                 </tr>
                 <tr>
                     <td>
-                        <span class="text-small">委托价格(USDT)</span>
-                        <span>3,480.88</span>
+                        <span class="text-small">委托价格({{ item.quotecurrencycode }})</span>
+                        <span>{{ item.orderprice }}</span>
                     </td>
                     <td>
-                        <span class="text-small">委托数量(Gold)</span>
-                        <span>100</span>
+                        <span class="text-small">委托数量({{ item.basecurrencycode }})</span>
+                        <span>{{ item.ordervolume }}</span>
                     </td>
                 </tr>
                 <tr>
                     <td colspan="2">
-                        <span class="text-small">委托金额(USDT)</span>
-                        <span>374.379644</span>
+                        <span class="text-small">委托金额({{ item.quotecurrencycode }})</span>
+                        <span>{{ item.ordervalue }}</span>
                     </td>
                 </tr>
             </tbody>
             <tfoot>
                 <tr>
                     <td colspan="2">
-                        <Button size="small" @click="cancelOrder()">撤销</Button>
+                        <Button size="small" @click="cancelOrder(item)">撤销</Button>
                     </td>
                 </tr>
             </tfoot>
@@ -63,13 +63,20 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, defineAsyncComponent } from 'vue'
+import { shallowRef, defineAsyncComponent, PropType, computed } from 'vue'
 import { Button } from 'vant'
 import { useComponent } from '@/hooks/component'
+import { useRequest } from '@/hooks/request'
+import { getBuyOrSellName, getOrderStatusName } from '@/constants/order'
+import { queryDigitalTradeOrderDetails } from '@/services/api/digital'
+import { useFuturesStore } from '@/stores'
 import AppDatePicker from '@mobile/components/base/datepicker/index.vue'
 
-defineProps({
-    goodsId: Number,
+const props = defineProps({
+    params: {
+        type: Object as PropType<Partial<Model.DigitalTradeOrderDetailsReq>>,
+        default: () => ({})
+    },
     showDatePicker: {
         type: Boolean,
         default: false
@@ -80,14 +87,30 @@ const componentMap = new Map<string, unknown>([
     ['Cancel', defineAsyncComponent(() => import('./cancel/index.vue'))], // 撤销
 ])
 
+const futuresStore = useFuturesStore()
 const date = shallowRef('')
-const selectedRow = shallowRef()
+const selectedRow = shallowRef<Model.DigitalTradeOrderDetailsRsp>()
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent()
 
+const { dataList } = useRequest(queryDigitalTradeOrderDetails, {
+    defaultParams: props.params
+})
+
+const tableList = computed(() => dataList.value.map((e) => {
+    const quoteItem = futuresStore.getQuoteInfo({ goodsid: e.goodsid })
+
+    return {
+        ...e,
+        goodsname: quoteItem?.goodsname || e.goodsid,
+        basecurrencycode: quoteItem?.basecurrencycode,
+        quotecurrencycode: quoteItem?.quotecurrencycode
+    }
+}))
+
 // 撤销
-const cancelOrder = () => {
-    selectedRow.value = {}
+const cancelOrder = (item: Model.DigitalTradeOrderDetailsRsp) => {
+    selectedRow.value = item
     openComponent('Cancel')
 }
 </script>

+ 36 - 2
src/packages/digital/views/spot/components/statement/index.vue

@@ -1,8 +1,42 @@
 <template>
-    <div>
-        流水
+    <div class="g-detail-list">
+        <dl v-for="(item, index) in dataList" :key="index">
+            <dt>
+                <span>{{ item.tradedate }}</span>
+            </dt>
+            <dd>
+                <span class="text-small">业务类型</span>
+                <span>{{ getDigitalBusinessCodeName(item.digitalbusinesscode) }}</span>
+            </dd>
+            <dd>
+                <span class="text-small">操作类型</span>
+                <span>{{ getDigitalOperateTypeName(item.digitaloperatetype) }}</span>
+            </dd>
+            <dd>
+                <span class="text-small">金额</span>
+                <span>
+                    {{ (item.changevalue > 0 ? '+' : '') + item.changevalue }} {{
+                        getDigitalCurrencyName(item.currencyid)}}
+                </span>
+            </dd>
+        </dl>
     </div>
 </template>
 
 <script lang="ts" setup>
+import { PropType } from 'vue'
+import { useRequest } from '@/hooks/request'
+import { getDigitalBusinessCodeName, getDigitalOperateTypeName, getDigitalCurrencyName } from '@/constants/order'
+import { queryTaaccountDigitalLogs } from '@/services/api/digital'
+
+const props = defineProps({
+    params: {
+        type: Object as PropType<Model.TaaccountDigitalLogsReq>,
+        required: true
+    }
+})
+
+const { dataList } = useRequest(queryTaaccountDigitalLogs, {
+    defaultParams: props.params
+})
 </script>

+ 45 - 14
src/packages/digital/views/spot/components/trade/index.vue

@@ -9,15 +9,15 @@
                 </tr>
             </tbody>
         </table>
-        <table cellspacing="0" cellpadding="0">
+        <table cellspacing="0" cellpadding="0" v-for="(item, index) in tableList" :key="index">
             <thead>
                 <tr>
                     <th>
-                        <span>Gold黄金</span>
-                        <time class="text-small">2025-09-01 11:11:11</time>
+                        <span>{{ item.goodsname }}</span>
+                        <time class="text-small">{{ item.tradetime }}</time>
                     </th>
                     <th>
-                        <span class="g-price-down">买入</span>
+                        <span class="g-price-down">{{ getBuyOrSellName(item.buyorsell) }}</span>
                     </th>
                 </tr>
             </thead>
@@ -25,27 +25,27 @@
                 <tr>
                     <td>
                         <span class="text-small">成交单号</span>
-                        <span>1001718728455010011</span>
+                        <span>{{ item.tradeid }}</span>
                     </td>
                     <td>
-                        <span class="text-small">手续费(BTC)</span>
-                        <span>10.021332</span>
+                        <span class="text-small">手续费({{ item.basecurrencycode }})</span>
+                        <span>{{ item.tradecharge }}</span>
                     </td>
                 </tr>
                 <tr>
                     <td>
-                        <span class="text-small">成交价格(USDT)</span>
-                        <span>3,480.88</span>
+                        <span class="text-small">成交价格({{ item.quotecurrencycode }})</span>
+                        <span>{{ item.tradeprice }}</span>
                     </td>
                     <td>
-                        <span class="text-small">成交数量(BTC)</span>
-                        <span>100</span>
+                        <span class="text-small">成交数量({{ item.quotecurrencycode }})</span>
+                        <span>{{ item.tradevolume }}</span>
                     </td>
                 </tr>
                 <tr>
                     <td colspan="2">
-                        <span class="text-small">成交金额(USDT)</span>
-                        <span>374.379644</span>
+                        <span class="text-small">成交金额({{ item.quotecurrencycode }})</span>
+                        <span>{{ item.tradevalue }}</span>
                     </td>
                 </tr>
             </tbody>
@@ -54,8 +54,39 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
+import { shallowRef,PropType,computed } from 'vue'
+import { useRequest } from '@/hooks/request'
+import { getBuyOrSellName } from '@/constants/order'
+import { queryDigitalTradeTradeDetails } from '@/services/api/digital'
+import { useFuturesStore } from '@/stores'
 import AppDatePicker from '@mobile/components/base/datepicker/index.vue'
 
+const props = defineProps({
+    params: {
+        type: Object as PropType<Partial<Model.DigitalTradeTradeDetailsReq>>,
+        default: () => ({})
+    },
+    showDatePicker: {
+        type: Boolean,
+        default: false
+    }
+})
+
+const futuresStore = useFuturesStore()
 const date = shallowRef('')
+
+const { dataList } = useRequest(queryDigitalTradeTradeDetails, {
+    defaultParams: props.params
+})
+
+const tableList = computed(() => dataList.value.map((e) => {
+    const quoteItem = futuresStore.getQuoteInfo({ goodsid: e.goodsid })
+
+    return {
+        ...e,
+        goodsname: quoteItem?.goodsname || e.goodsid,
+        basecurrencycode: quoteItem?.basecurrencycode,
+        quotecurrencycode: quoteItem?.quotecurrencycode
+    }
+}))
 </script>

+ 19 - 13
src/packages/digital/views/spot/detail/index.vue

@@ -8,23 +8,23 @@
             <GridItem icon="paid" text="提现" :to="{ name: 'wallet-withdraw', query: { id: accountId } }" />
             <GridItem icon="chart-trending-o" text="交易" @click="navigateToSpotDetail" />
         </Grid>
-        <div class="g-detail-table">
+        <div class="g-detail-table" v-if="accountItem">
             <table cellspacing="0" cellpadding="0">
                 <tbody>
                     <tr>
                         <td colspan="2">
-                            <span class="text-small">余额(BTC)</span>
-                            <span>1.23456789</span>
+                            <span class="text-small">余额({{ accountItem.currencycode }})</span>
+                            <span>{{ accountItem.currentbalance }}</span>
                         </td>
                     </tr>
                     <tr>
                         <td>
-                            <span class="text-small">可用(BTC)</span>
-                            <span>1.23455789</span>
+                            <span class="text-small">可用({{ accountItem.currencycode }})</span>
+                            <span>{{ accountItem.currentbalance - accountItem.freezemargin }}</span>
                         </td>
                         <td>
-                            <span class="text-small">冻结(BTC)</span>
-                            <span>0.00001000</span>
+                            <span class="text-small">冻结({{ accountItem.currencycode }})</span>
+                            <span>{{ accountItem.freezemargin }}</span>
                         </td>
                     </tr>
                 </tbody>
@@ -44,32 +44,38 @@
                 <wallet-record />
             </Tab>
             <Tab title="委托">
-                <spot-order showDatePicker />
+                <spot-order :params="{ digitalaccountid: accountId }" showDatePicker />
             </Tab>
             <Tab title="成交">
-                <spot-trade />
+                <spot-trade :params="{ digitalaccountid: accountId }" />
             </Tab>
             <Tab title="资金明细">
-                <spot-statement />
+                <spot-statement :params="{ digitalaccountid: accountId }" />
             </Tab>
         </Tabs>
     </app-view>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
+import { shallowRef, computed } from 'vue'
 import { Tab, Tabs, Grid, GridItem } from 'vant'
 import { useNavigation } from '@mobile/router/navigation'
+import { useSpotAccountStore } from '../../wallet/components/spot/composables'
 import WalletRecord from '../../wallet/components/record/index.vue'
 import SpotOrder from '../components/order/index.vue'
 import SpotTrade from '../components/trade/index.vue'
 import SpotStatement from '../components/statement/index.vue'
 
-const { router, getQueryStringToNumber } = useNavigation()
+const { router, getQueryString } = useNavigation()
 
-const accountId = getQueryStringToNumber('id')
+const spotAccountStore = useSpotAccountStore()
+const accountId = getQueryString('id') || '0'
 const tabIndex = shallowRef(0)
 
+const accountItem = computed(() => spotAccountStore.getAccountItem({
+    digitalaccountid: accountId
+}))
+
 const navigateToSpotDetail = () => {
     const goodsId = accountId
     // 多个商品弹出列表选择,单个商品直接跳转

+ 47 - 11
src/packages/digital/views/spot/goods/detail/index.vue

@@ -35,18 +35,19 @@
                         <app-select v-model="formData.PriceMode" :options="getPricemode2List()" />
                     </template>
                 </Field>
-                <Field label="价格">
+                <Field label="价格" v-if="formData.PriceMode === PriceMode.Limit">
                     <template #input>
-                        <app-stepper v-model="formData.OrderPrice"
-                            :disabled="formData.PriceMode === PriceMode.Market" />
+                        <app-stepper v-model="formData.OrderPrice" />
                     </template>
                 </Field>
+                <Cell title="最优市价" :value="handleNumberValue(quote?.last)"
+                    v-if="formData.PriceMode === PriceMode.Market" />
                 <Field label="数量">
                     <template #input>
                         <app-stepper v-model="formData.OrderQty" />
                     </template>
                 </Field>
-                <Cell title="预估支付" :value="calculations.estimate" />
+                <Cell :title="formData.BuyOrSell === BuyOrSell.Buy ? '预估支付' : '预估获取'" :value="calculations.estimate" />
             </CellGroup>
             <CellGroup inset v-if="formData.BuyOrSell === BuyOrSell.Buy">
                 <Cell title="可用余额" :value="calculations.available" />
@@ -69,7 +70,7 @@
         </Row>
         <Tabs v-model:active="tabIndex" sticky>
             <Tab title="委托">
-                <spot-order v-bind="{ goodsId }" />
+                <spot-order :params="{ goodsid: goodsId, orderstatuses: '3,7' }" />
             </Tab>
             <Tab title="资金">
                 <spot-account v-bind="{ goodsId }" />
@@ -79,15 +80,17 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, reactive, computed } from 'vue'
+import { shallowRef, reactive, computed, onMounted } from 'vue'
 import { Form, Button, CellGroup, Field, Cell, Tab, Tabs, Col, Row, FormInstance } from 'vant'
 import { fullloading } from '@/utils/vant'
-import { ClientType } from '@/constants/client'
-import { parsePercent } from '@/filters'
+import { ClientType, EBuildType, EDelistingType, EListingSelectType, EOrderOperateType, EValidType, OrderSrc } from '@/constants/client'
+import { parsePercent, handleNumberValue } from '@/filters'
 import { BuyOrSell, PriceMode, getPricemode2List } from '@/constants/order'
 import { useNavigation } from '@mobile/router/navigation'
-import { digitalOrder } from '@/services/api/trade'
-import { useFuturesStore } from '@/stores'
+import { digitalOrder } from '@/services/api/digital'
+import { useFuturesStore, useUserStore } from '@/stores'
+import { useSpotAccountStore } from '../../../wallet/components/spot/composables'
+import Long from 'long'
 import AppSelect from '@mobile/components/base/select/index.vue'
 import AppStepper from '@mobile/components/base/stepper/index.vue'
 import SpotOrder from '../../components/order/index.vue'
@@ -95,17 +98,29 @@ import SpotAccount from '../../components/account/index.vue'
 
 const { router, getQueryStringToNumber } = useNavigation()
 const goodsId = getQueryStringToNumber('id')
+const userStore = useUserStore()
 const futuresStore = useFuturesStore()
+const spotAccountStore = useSpotAccountStore()
 const tabIndex = shallowRef(0)
 const formRef = shallowRef<FormInstance>()
 
 const formData = reactive<Partial<Proto.DigitalOrderReq>>({
     ClientType: ClientType.Web,
     BuyOrSell: BuyOrSell.Buy,
-    PriceMode: PriceMode.Limit
+    PriceMode: PriceMode.Limit,
+    OperateType: EOrderOperateType.ORDEROPERATETYPE_NORMAL,
+    OrderSrc: OrderSrc.ORDERSRC_CLIENT,
+    ListingSelectType: EListingSelectType.LISTINGSELECTTYPE_DELISTING,
+    DelistingType: EDelistingType.DELISTINGTYPE_SELECTED,
+    BuildType: EBuildType.BUILDTYPE_OPEN,
+    TimevalidType: EValidType.VALIDTYPE_DR,
+    OrderFlag: 1,
+    OrderQty: 1,
 })
 
 const quote = computed(() => futuresStore.getQuoteInfo({ goodsid: goodsId }))
+const baseAccount = computed(() => spotAccountStore.getAccountItem({ currencyid: quote.value?.goodscurrencyid })) // 基础货币账户
+const quoteAccount = computed(() => spotAccountStore.getAccountItem({ currencyid: quote.value?.currencyid })) // 计价货币账户
 
 const calculations = computed(() => {
     const { agreeunit = 0 } = quote.value ?? {}
@@ -129,6 +144,23 @@ const navigateToGoodsChart = () => {
 }
 
 const onSubmit = () => {
+    if (quote.value) {
+        formData.GoodsID = quote.value.goodsid
+        formData.MarketID = quote.value.marketid
+    }
+
+    // 市价
+    if (formData.PriceMode === PriceMode.Market) {
+        const param112 = userStore.getSystemParamValue('112')
+        formData.OrderPrice = 0
+        formData.MarketMaxSub = Number(param112) || 100
+    }
+
+    if (baseAccount.value && quoteAccount.value) {
+        formData.BaseAccountID = Long.fromString(baseAccount.value.digitalaccountid)
+        formData.QuoteAccountID = Long.fromString(quoteAccount.value.digitalaccountid)
+    }
+
     fullloading((hideLoading) => {
         digitalOrder({
             data: formData
@@ -139,6 +171,10 @@ const onSubmit = () => {
         })
     })
 }
+
+onMounted(() => {
+    formData.OrderPrice = quote.value?.last
+})
 </script>
 
 <style lang="less">

+ 5 - 1
src/packages/digital/views/spot/goods/list/index.vue

@@ -1,6 +1,10 @@
 <template>
     <app-view class="spot">
-        <Search shape="round" placeholder="搜索" />
+        <template #header>
+            <app-statusbar>
+                <Search shape="round" placeholder="搜索" />
+            </app-statusbar>
+        </template>
         <Tabs v-model:active="currentGroupId">
             <template v-for="(item, index) in goodsGroups" :key="index">
                 <Tab :title="item.goodsgroupname" :name="item.goodsgroupid">

+ 24 - 0
src/packages/digital/views/wallet/components/spot/composables.ts

@@ -0,0 +1,24 @@
+import { defineStore } from 'pinia'
+import { isMatch } from 'lodash'
+import { useRequest } from '@/hooks/request'
+import { queryTaaccountDigitals } from '@/services/api/digital'
+
+export const useSpotAccountStore = defineStore('spotAaccount', () => {
+    const { dataList, loading, run: fetchTaaccountDigitals } = useRequest(queryTaaccountDigitals)
+
+    const filterAccountsByCurrencyId = (...currencyIds: number[]) => {
+        return dataList.value.filter((e) => currencyIds.includes(e.currencyid))
+    }
+
+    const getAccountItem = (prop: Partial<Model.TaaccountDigitalsRsp>) => {
+        return dataList.value.find(item => isMatch(item, prop))
+    }
+
+    return {
+        loading,
+        dataList,
+        filterAccountsByCurrencyId,
+        fetchTaaccountDigitals,
+        getAccountItem
+    }
+})

+ 14 - 9
src/packages/digital/views/wallet/components/spot/index.vue

@@ -2,27 +2,28 @@
 <template>
     <div class="spot-account">
         <Search shape="round" placeholder="搜索" />
-        <div class="card" @click="onClick(0)">
+        <div class="card" @click="onClick(item.digitalaccountid)" v-for="(item, index) in spotAccountStore.dataList"
+            :key="index">
             <div class="card-section">
-                <div class="card-section__image">
+                <!-- <div class="card-section__image">
                     <Image fit="contain" src="" width="32" height="32" round />
-                </div>
+                </div> -->
                 <div class="card-section__info">
                     <span>
-                        <b>BTC</b>
+                        <b>{{ item.currencycode }}</b>
                     </span>
                     <span class="text-small">
-                        比特币
+                        {{ getDigitalCurrencyName(item.currencyid) }}
                     </span>
                 </div>
             </div>
             <div class="card-section">
                 <div class="card-section__balance">
                     <span>
-                        余额(USDT)
+                        余额({{ item.currencycode }})
                     </span>
                     <span class="text-small">
-                        12.65432100
+                        {{ item.currentbalance }}
                     </span>
                 </div>
                 <div class="card-section__icon">
@@ -34,13 +35,17 @@
 </template>
 
 <script lang="ts" setup>
-import { Search, Image, Icon } from 'vant'
+import { Search, Icon } from 'vant'
+import { getDigitalCurrencyName } from '@/constants/order'
+import { useSpotAccountStore } from './composables'
 
 const emit = defineEmits(['click'])
 
-const onClick = (accountId: number) => {
+const onClick = (accountId: string) => {
     emit('click', accountId)
 }
+
+const spotAccountStore = useSpotAccountStore()
 </script>
 
 <style lang="less">

+ 4 - 1
src/packages/digital/views/wallet/index.vue

@@ -1,6 +1,9 @@
 <!-- 钱包 -->
 <template>
     <app-view class="wallet">
+        <template #header>
+            <app-statusbar />
+        </template>
         <Grid :border="false">
             <GridItem icon="pending-payment" text="充值" :to="{ name: 'wallet-deposit' }" />
             <GridItem icon="paid" text="提现" :to="{ name: 'wallet-withdraw' }" />
@@ -38,7 +41,7 @@ const navigateToSpotDetail = (accountId: number) => {
     })
 }
 
-const navigateToContractDetail = (accountId: number) => {
+const navigateToContractDetail = (accountId: string) => {
     router.push({
         name: 'contract-detail',
         query: {

+ 3 - 3
src/packages/pc/views/account/sign/components/sign/index.vue

@@ -104,7 +104,7 @@ const extendRef = ref<FormInstance>()
 const seconds = ref(60) //倒计时剩余时间
 const isCountdown = ref(false) // 是否正在倒计时
 
-const { legalpersonname, mobile2, bankaccount, userinfotype } = userStore.userInfo
+const { legalpersonname, mobile2, userinfotype } = userStore.userInfo
 
 // 表单数据对象
 const extendModel = computed(() => {
@@ -283,8 +283,8 @@ const formSubmit = () => {
                         onSubmit().then(() => {
                             ElMessage.success(bankInfo.value?.signstatus != undefined ? t('common.tips13') : t('common.tips14'))
                             onCancel(true)
-                        }).catch((err) => {
-                            ElMessage.error(t('common.submitfailure') + err)
+                        }).catch(() => {
+                            ElMessage.success(t('banksign.tips13'))
                         })
                     } else {
                         ElMessage.error(t('common.tips12'))

+ 77 - 0
src/services/api/digital/index.ts

@@ -0,0 +1,77 @@
+import { v4 } from 'uuid'
+import { formatDate } from '@/filters'
+import { RequestConfig } from '@/services/http/types'
+import { useLoginStore } from '@/stores'
+import http from '@/services/http'
+
+const loginStore = useLoginStore()
+
+/**
+ * 获取用户现货账户列表
+ */
+export function queryTaaccountDigitals() {
+    return http.commonRequest<Model.TaaccountDigitalsRsp[]>({
+        url: '/Digital/QueryTaaccountDigitals',
+        method: 'post',
+        params: {
+            userid: loginStore.userId
+        },
+    })
+}
+
+/**
+ * 获取数字现货交易委托表
+ */
+export function queryDigitalTradeOrderDetails(config: RequestConfig<Model.DigitalTradeOrderDetailsReq>) {
+    return http.commonRequest<Model.DigitalTradeOrderDetailsRsp[]>({
+        url: '/Digital/QueryDigitalTradeOrderDetails',
+        method: 'post',
+        params: {
+            userid: loginStore.userId,
+            ...config.data
+        },
+    })
+}
+
+/**
+ * 获取数字现货交易成交表
+ */
+export function queryDigitalTradeTradeDetails(config: RequestConfig<Model.DigitalTradeTradeDetailsReq>) {
+    return http.commonRequest<Model.DigitalTradeTradeDetailsRsp[]>({
+        url: '/Digital/QueryDigitalTradeTradeDetails',
+        method: 'post',
+        params: {
+            userid: loginStore.userId,
+            ...config.data
+        },
+    })
+}
+
+/**
+ * 获取用户现货账户流水表
+ */
+export function queryTaaccountDigitalLogs(config: RequestConfig<Model.TaaccountDigitalLogsReq>) {
+    return http.commonRequest<Model.TaaccountDigitalLogsRsp[]>({
+        url: '/Digital/QueryTaaccountDigitalLogs',
+        method: 'post',
+        params: config.data,
+    })
+}
+
+/**
+ * 数字交易委托请求
+ */
+export function digitalOrder(config: RequestConfig<Partial<Proto.DigitalOrderReq>>) {
+    return http.mqRequest<Proto.DigitalOrderRsp>({
+        data: {
+            ClientSerialNo: v4(),
+            LoginID: loginStore.loginId,
+            OperatorID: loginStore.loginId,
+            ClientOrderTime: formatDate(new Date().toISOString()),
+            ...config.data
+        },
+        requestCode: 'DigitalOrderReq',
+        responseCode: 'DigitalOrderRsp',
+        marketId: config.data?.MarketID
+    })
+}

+ 1 - 16
src/services/api/trade/index.ts

@@ -1,8 +1,8 @@
 import { v4 } from 'uuid'
-import http from '@/services/http'
 import { RequestConfig } from '@/services/http/types'
 import { ClientType } from '@/constants/client'
 import { useLoginStore, useAccountStore } from '@/stores'
+import http from '@/services/http'
 
 const loginStore = useLoginStore()
 const accountStore = useAccountStore()
@@ -428,19 +428,4 @@ export function goodsInventoryApply(config: RequestConfig<Partial<Proto.GoodsInv
         requestCode: 'GoodsInventoryApplyReq',
         responseCode: 'GoodsInventoryApplyRsp',
     })
-}
-
-/**
- * 数字交易委托请求
- */
-export function digitalOrder(config: RequestConfig<Partial<Proto.DigitalOrderReq>>) {
-    return http.mqRequest<Proto.DigitalOrderRsp>({
-        data: {
-            ClientSerialNo: v4(),
-            LoginID: loginStore.loginId,
-            ...config.data
-        },
-        requestCode: 'DigitalOrderReq',
-        responseCode: 'DigitalOrderRsp',
-    })
 }

+ 12 - 14
src/stores/modules/enum.ts

@@ -14,14 +14,7 @@ export interface EnumType {
     bankmappedvalue?: string
 }
 
-const enumKeys = ['confirmStatus', 'countrycode', 'ValidType', 'inoutapplystatus', 'inouttype', 'executetype', 'currency', 'deliveryOrderStatus', 'operatetypesearch', 'deliveryPayMode', 'applystatus', 'deliveryStatus', 'operateType', 'WRPresaleStatus', 'clientType', 'stepStatus', 'scoreConfigType', 'GZBSCPayStatus', 'gt_kksjdw', 'performanceStatus', 'handlestatus', 'performanceType', 'accountBusinessCode', 'certificatetype', 'signstatus', 'thjOrderStatus', 'THJDeliveryMode', 'goodsunit', 'WROutInApplyStatus2', 'THJTransferStatus', 'WRTradeOrderStatus', 'THJMarket', 'THJProfitRoleType', 'appointmentModelOut', 'orderstatus', 'Pricemode2', 'buildtype', 'listingselecttype', 'certypeperson', 'runstatus', 'traderstatus', 'transferapplystatus', 'ePayFlag', 'goodscurrency', 'paymodel', 'digitalcurrency'] as const
-
-const enumMap = new Map<typeof enumKeys[number], ShallowRef<Model.EnumRsp[]>>()
-
-// 初始化枚举列表
-for (const key of enumKeys) {
-    enumMap.set(key, shallowRef<Model.EnumRsp[]>([]))
-}
+const enumMap = new Map<string, ShallowRef<Model.EnumRsp[]>>()
 
 /**
  * 枚举存储对象
@@ -47,22 +40,27 @@ export const useEnumStore = defineStore(() => {
         }
 
         allEnums.value.forEach((e) => {
-            const mapKey = enumKeys.find((key) => key === e.enumdiccode)
-            if (mapKey && e.enumitemstatus === 1) {
-                const enumRef = enumMap.get(mapKey)
-                enumRef?.value.push(e)
+            if (e.enumitemstatus === 1) {
+                const enumRef = enumMap.get(e.enumdiccode)
+
+                if (enumRef) {
+                    enumRef.value.push(e)
+                } else {
+                    const enumItem = shallowRef([e])
+                    enumMap.set(e.enumdiccode, enumItem)
+                }
             }
         })
     }
 
     // 获取枚举信息
-    const getEnumTypeInfo = (enumKey: typeof enumKeys[number], value: number) => {
+    const getEnumTypeInfo = (enumKey: string, value: number) => {
         const enums = enumMap.get(enumKey)
         return enums?.value.find((e) => e.enumitemname === value)
     }
 
     // 获取枚举列表
-    const getEnumTypeList = (enumKey: typeof enumKeys[number], propertys?: (keyof Model.EnumRsp)[]) => {
+    const getEnumTypeList = (enumKey: string, propertys?: (keyof Model.EnumRsp)[]) => {
         const enums = enumMap.get(enumKey)
         if (enums) {
             return enums.value.map((e) => {

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

@@ -310,7 +310,8 @@ export const useFuturesStore = defineStore(() => {
             totalturnover: quote.totalturnover ?? 0,
             holdvolume: quote.holdvolume ?? 0,
             provideraccountid: 0,
-            currencyid: 1,
+            goodscurrencyid: 0,
+            currencyid: 0,
             provideruserid: 0,
             marketmarginalgorithm: 0,
             marketmarginvalue: 0,
@@ -349,6 +350,8 @@ export const useFuturesStore = defineStore(() => {
             tpratiodefault: 0,
             tpratiodown: 0,
             tpratioup: 1,
+            basecurrencycode: '',
+            quotecurrencycode: '',
             traderules: [],
             tradefees: []
         }
@@ -387,6 +390,7 @@ export const useFuturesStore = defineStore(() => {
                     provideraccountid: item.provideraccountid,
                     provideruserid: item.provideruserid,
                     goodstradetype: item.goodstradetype,
+                    goodscurrencyid: item.goodscurrencyid,
                     currencyid: item.currencyid,
                     pictureurl: item.pictureurl,
                     traderules: item.traderules,
@@ -400,6 +404,8 @@ export const useFuturesStore = defineStore(() => {
                     tpratiodefault: item.tpratiodefault,
                     tpratiodown: item.tpratiodown,
                     tpratioup: item.tpratioup,
+                    basecurrencycode: item.basecurrencycode,
+                    quotecurrencycode: item.quotecurrencycode,
                 } = goods)
 
                 item.iscannotbuy = goods.iscannotbuy ?? 0

+ 150 - 0
src/types/model/digital.d.ts

@@ -0,0 +1,150 @@
+declare namespace Model {
+    /** 获取用户现货账户列表 请求 */
+    interface TaaccountDigitalsReq {
+        userid: number; // 用户ID
+    }
+
+    /** 获取用户现货账户列表 响应 */
+    interface TaaccountDigitalsRsp {
+        currencycode: string; // 币种代码
+        currencydecimalplace: number;// 币种小数位(param1)
+        currencydisplayunit: string; // 币种显示单位(param2)
+        currencyid: number; // 货币ID - 枚举"digitalcurrency"
+        currentbalance: number; // 期末余额
+        digitalaccountid: string; // 资金账户ID(userid + currencyid[3位,前面补0])
+        freezeinout: number; // 充值提现冻结 - 正
+        freezemargin: number; // 冻结保证金(交易) - 正
+        freezetradecharge: number; // 交易手续费冻结 - 正
+        freezetransfer: number; // 转入转出冻结 - 正
+        totalin: number; // 累计充值(现货账户与外部钱包) - 正
+        totalinincharge: number; // 累计充值手续费 - 负
+        totalinoutcharge: number; // 累计提现手续费 - 负
+        totalout: number; // 累计提现(现货账户与外部钱包) - 负
+        totaltradeadd: number; // 累计交易增加 - 正
+        totaltradecharge: number; // 累计交易手续费 - 负
+        totaltradereduce: number; // 累计交易减少 - 负
+        totaltransferin: number; // 累计转入(合约与现货账户) - 正
+        totaltransferincharge: number; // 累计转入手续费 - 负 - 预留
+        totaltransferout: number; // 累计转出(合约与现货账户) - 负
+        totaltransferoutcharge: number; // 累计转出手续费 - 负 - 预留
+        usedmargin: number; // 占用保证金(交易) - 正 - 预留
+        userid: number; // 用户ID
+    }
+
+    /** 获取数字现货交易委托表 请求 */
+    interface DigitalTradeOrderDetailsReq {
+        userid?: number; // 用户ID
+        digitalaccountid?: string; // 数字账户ID
+        goodsid?: number; // 商品ID
+        tradedate?: string; // 交易日(yyyyMMdd)
+        orderstatuses?: string; // 委托状态(多个逗号分隔) 参考枚举orderstatus
+    }
+
+    /** 获取数字现货交易委托表 响应 */
+    interface DigitalTradeOrderDetailsRsp {
+        baseaccountid: string; // 基础货币账户ID
+        basecurrencyid: number; // 基础货币ID - digitalcurrency枚举
+        buildtype: number; // 委托单据类型 - 1:建仓 2:平仓 3:先平后建
+        buyorsell: number; // 方向 - 0:买 1:卖
+        cancelorderid: string; // 撤单单号(撤单时填写)
+        cancelvolume: number; // 撤单数量 - 按基础货币小数位
+        clientordertime: string; // 客户端委托时间
+        clientticket: string; // 客户端流水号
+        clienttype: number; // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端安卓 4:网页客户端 5:微信客户端 6:手机客户端苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江)
+        freezecharge: number; // 冻结手续费
+        freezevalue: number; // 冻结金额 - 按计价货币小数位(买)
+        freezevolume: number; // 冻结数量 - 按基础货币小数位(卖)
+        goodsid: number; // 商品ID
+        marketid: number; // 市场ID
+        memberuserid: number; // 所属会员UserID
+        operatetype: number; // 操作类型 -枚举“orderoperatetype" - 1:正常下单 2:斩仓 3:转单 4:结算撤单 5:系统卖出(适用于先平后建的卖出) 6:行情源报价 7:(结算)到期强平 8:(结算)协议转让 9:系统对冲单 10:(结算)到期无效 11:交割协议转让 12:交割协议平仓 13:交割成交(所有权) 14:管理端强行平仓 15:管理端协议转让 ... 23:融资买入
+        operatorid: number; // 登录账号(LoginID)
+        orderid: string; // 委托单号(600+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
+        ordermode: number; // 委托方式 - 1:按数量 2:按成交额(市价时-先不实现)
+        orderprice: number; // 委托价格 - 按商品行情小数位
+        ordersrc: number; // 委托来源 - 1:客户端 2:管理端 3:风控服务 4:交割服务 5:交易服务 6:交易日结 7:商品强平 8:管理端商品退市强平 9:交易接口 10:交割服务商被动(受托竞价) 11:预埋触发
+        orderstatus: number; // 委托状态 - 参考枚举''orderstatus'' - 1:委托请求 2:待冻结 3:委托成功 4:委托失败 5:配对成功 6:已撤 7:部成 8:已成 9:部成部撤 10:成交失败 11:委托拒绝 12:经过摘牌(先摘后挂专用) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用) 17:冻结PD成功 18:冻结PD失败 19:冻结能量成功 20:冻结能量失败 21:预约已报价 22:过期未付 23:优惠券处理中 24:仓单生成失败 25:首付扣款失败 26:履约失败 27:撤单解冻贷款失败
+        ordertime: string; // 委托时间
+        ordervalue: number; // 委托金额 - 按计价货币小数位
+        ordervolume: number; // 委托数量 - 按基础货币小数位
+        preorderid: string; // 关联预埋单号(止盈止损单时填写)
+        pricemode: number; // 取价方式- 枚举"Pricemode2" - 1:市价 2: 限价
+        quoteaccountid: string; // 计价货币账户ID
+        quotecurrencyid: number; // 计价货币ID - digitalcurrency枚举
+        retcode: number; // 错误代码
+        tradedate: string; // 交易日(yyyyMMdd)
+        tradeproperty: number; // 交易属性
+        tradevolume: number; // 成交数量 - 按基础货币小数位
+        unfreezecharge: number; // 解冻手续费
+        unfreezevalue: number; // 解冻金额 - 按计价货币小数位(买)
+        unfreezevolume: number; // 解冻数量 - 按基础货币小数位(卖)
+        updatetime: string; // 更新时间
+        userid: number; // 用户ID
+        uuid: string; // 发起端唯一id
+        validtime: string; // 有效期限
+        validtype: number; // 有效类型 - 枚举"ValidType" - 4一直有效
+    }
+
+    /** 获取数字现货交易成交表 请求 */
+    interface DigitalTradeTradeDetailsReq {
+        userid?: number; // 用户ID
+        digitalaccountid?: string; // 数字账户ID
+        goodsid?: number; // 商品ID
+        tradedate?: string; // 交易日(yyyyMMdd)
+    }
+
+    /** 获取数字现货交易成交表 响应 */
+    interface DigitalTradeTradeDetailsRsp {
+        baseaccountid: string; // 基础货币账户ID
+        basecurrencyid: number; // 基础货币ID - digitalcurrency枚举
+        buildtype: number; // 委托单据类型 1:建仓
+        buyorsell: number; // 方向 - 0:买 1:卖
+        goodsid: number; // 商品ID
+        marketid: number; // 市场ID
+        matchbaseaccountid: string; // 对手基础货币账户ID
+        matchquoteaccountid: string; // 对手计价货币账户ID
+        matchuserid: number; // 对手用户ID
+        memberuserid: number; // 所属会员UserID
+        nfeealgorithm: number; // 手续费收取方式 1:比率 2:固定
+        openexchagechargevalue: number; // 手续费设置值(平台部分)
+        openmemberchargevalue: number; // 手续费设置值(会员部分)
+        orderid: string; // 委托单号
+        quoteaccountid: string; // 计价货币账户ID
+        quotecurrencyid: number; // 计价货币ID - digitalcurrency枚举
+        realtradevalue: number; // 实际成交金额 - 按计价货币小数位
+        status: number; // 处理状态 - 1:待处理 2:已处理 3:处理失败
+        tradecharge: number; // 手续费 - 买方按成交金额 卖方按成交数量
+        tradedate: string; // 交易日(yyyyMMdd)
+        tradeid: string; // 成交单号(601+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
+        tradeprice: number; // 成交价格
+        tradeproperty: number; // 交易属性
+        tradetime: string; // 成交时间
+        tradetype: number; // 成交类别 - 枚举 tradetype(1:正常委托成交 2:定向做市成交(接单))
+        tradevalue: number; // 成交金额 - 按计价货币小数位
+        tradevolume: number; // 成交数量 - 按基础货币小数位
+        userid: number; // 用户ID
+    }
+
+    /** 获取用户现货账户流水表 请求 */
+    interface TaaccountDigitalLogsReq {
+        digitalaccountid: string; // 数字账户ID
+        tradedate?: string; // 交易日(yyyyMMdd)
+        businesscodes?: string; // 业务类型(多个逗号分隔) - 枚举digitalbusinesscode(1:充值 2:提现 3:转入 4:转出 5:现货交易 6:现货交易手续费 7:提现手续费...)
+    }
+
+    /** 获取用户现货账户流水表 响应 */
+    interface TaaccountDigitalLogsRsp {
+        aftervalue: number; // 变更后
+        beforevalue: number; // 变更前
+        changevalue: number; // 变更值
+        createtime: string; // 创建时间
+        currencyid: number; // 货币ID - 枚举"digitalcurrency"
+        digitalaccountid: string; // 数字账号ID
+        digitalbusinesscode: number; // 业务编号 - 枚举"digitalbusinesscode"(1:充值 2:提现 3:转入 4:转出 5:现货交易 6:现货交易手续费 7:提现手续费...)
+        digitaloperatetype: number; // 操作类型 - 枚举"digitaloperatetype"(1.冻结 2:解冻 3:增加 4:减少 5:最大冻结)
+        logid: string; // 流水ID(402+Unix秒时间戳(10位)+xxxxxx)
+        remark: string; // 备注
+        tradedate: string; // 创建交易日(yyyyMMdd)
+        userid: number; // 用户ID
+    }
+}

+ 2 - 0
src/types/model/goods.d.ts

@@ -11,6 +11,7 @@ declare namespace Model {
         agreeunit: number; // 合约单位
         areauserid: number; // 所属机构
         bannerurls: string; // Banner图片(2:1)(逗号分隔)
+        basecurrencycode: string; // 基础货币代码(80:Goodscurrencyid)
         buyotherfeealgorithm: number; // 买交收其它费用算法
         buyotherfeevalue: number; // 买交收其它费用值
         buypricemovealgorithm: number; // 买交收升贴水算法
@@ -58,6 +59,7 @@ declare namespace Model {
         provideraccountid: number; // 发售方资金账户ID(49)\供货商资金账户ID(50)
         provideruserid: number; // 发售方用户ID(49)\供货商(50)
         qtydecimalplace: number; // 成交量小数位
+        quotecurrencycode: string; // 计价货币代码(80:currencyid)
         quotegear: number; // 行情档位(1-10)
         quoteminunit: number; // 行情最小变动单位 [整数,报价小数位一起使用]
         relatedgoodsid: number; // 关联参考商品ID

+ 3 - 0
src/types/model/market.d.ts

@@ -144,6 +144,7 @@ declare namespace Model {
         provideruserid: number; // 发售方用户ID(49)\供货商(50)
         pictureurl: string; // 商品图片
         goodstradetype: number;//商品交易权限类型 - 1:可建可平 3:不可建可平
+        goodscurrencyid: number; // 合约货币ID
         currencyid: number;//报价货币ID
         thumurls: string; // 缩略图片(1:1)(逗号分隔)
         slratiodefault: number; // 止损默认比例
@@ -154,6 +155,8 @@ declare namespace Model {
         tpratioup: number; // 止盈比例上限
         tpslflag: number; // 是否开启止盈止损 - 0:不开启 1:开启
         tpslforceflag: number; // 是否强制止盈止损 - 0:不强制 1:强制
+        basecurrencycode: string; // 基础货币代码(80:Goodscurrencyid)
+        quotecurrencycode: string; // 计价货币代码(80:currencyid)
         traderules: Proto.TradeRuleInfoStruct['TradeRules'] // 交易规则
         tradefees: Proto.TradeFeeInfoStruct['TradeFees'] // 交易费用
     }

+ 3 - 2
src/types/proto/digital.d.ts

@@ -1,4 +1,5 @@
 import { IMessageHead } from './proto'
+import Long from 'long'
 
 declare global {
     namespace Proto {
@@ -9,7 +10,7 @@ declare global {
             ClientOrderTime: string; // 客户端委托时间
             ClientType: number; // 终端类型
             LoginID: number; // 登陆账号
-            BaseAccountID: number; // 基础货币账号
+            BaseAccountID: Long; // 基础货币账号
             GoodsID: number; // 商品ID
             MarketID: number; // 市场ID
             ValidType: number; // 校验类型
@@ -48,7 +49,7 @@ declare global {
             TPRatio: number; // 止盈比例
             SLFlag: number; // 止损标识:0-未设置1-设置
             SLRatio: number; // 止损比例
-            QuoteAccountID: number; // 计价数字账户
+            QuoteAccountID: Long; // 计价数字账户
             OrderMode: number; // 委托方式-1:按数量
         }