Index.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <app-view class="swap-detail">
  3. <template #header>
  4. <app-navbar :title="item.goodscode + '/' + item.goodsname">
  5. <template #right>
  6. <div class="button-more" v-if="userStore.userType != 5" @click="onListing">
  7. <span>挂牌</span>
  8. </div>
  9. </template>
  10. </app-navbar>
  11. </template>
  12. <component :is="Price" v-bind="{ goodsCode }" />
  13. <component :is="Chart" v-bind="{ goodsCode }" />
  14. <Tabs v-model:active="tabIndex" @click="onRefresh" style="margin-top: .2rem;">
  15. <Tab title="买大厅" :name="BuyOrSell.Buy" />
  16. <Tab title="卖大厅" :name="BuyOrSell.Sell" />
  17. </Tabs>
  18. <div class="trade-section sell" v-if="dataList.length">
  19. <app-list :columns="columns" :data-list="dataList">
  20. <template #orderprice="{ row }">
  21. <span :class="quote?.lastColor">{{ row.pricemode === 3 ? estimateprice(row) : row.orderprice
  22. }}</span>
  23. </template>
  24. <template #username="{ row }">
  25. <span>{{ row.userid }}/{{ row.username }}</span>
  26. </template>
  27. <template #operate="{ row }">
  28. <Button size="small" type="primary" :disabled="isDisable(row)" @click="onDelisting(row)">
  29. {{ getDelistingButtonTitles(tabIndex, row) }}
  30. </Button>
  31. </template>
  32. </app-list>
  33. </div>
  34. <Empty description="暂无数据" v-else />
  35. <component :is="Tik" v-bind="{ goodsCode }" />
  36. <component ref="componentRef" :is="componentMap.get(componentId)" v-bind="{ selectedRow, tabIndex, item }"
  37. @closed="closeComponent" v-if="componentId" />
  38. </app-view>
  39. </template>
  40. <script lang="ts" setup>
  41. import { shallowRef, defineAsyncComponent, computed } from 'vue'
  42. import { Tab, Tabs, Button, showToast,Empty } from 'vant'
  43. import { useRequest } from '@/hooks/request'
  44. import { useNavigation } from '@mobile/router/navigation'
  45. import { useComponent } from '@/hooks/component'
  46. import { BuyOrSell } from '@/constants/order'
  47. import { queryTjmdTradeOrderDetail, queryMdUserSwapProtocol } from '@/services/api/swap'
  48. import { useFuturesStore } from '@/stores'
  49. import { useLoginStore, useUserStore } from '@/stores'
  50. import AppList from '@mobile/components/base/list/index.vue'
  51. import { getUserId } from '@/services/methods/user'
  52. import { formatDecimal } from '@/filters'
  53. const Price = defineAsyncComponent(() => import('@mobile/components/modules/quote/price/index.vue'))
  54. const Chart = defineAsyncComponent(() => import('@mobile/components/modules/hqchart/index.vue'))
  55. const Tik = defineAsyncComponent(() => import('@mobile/components/modules/quote/tik/index.vue'))
  56. const componentMap = new Map<string, unknown>([
  57. ['delisting', defineAsyncComponent(() => import('./components/delisting/Index.vue'))],
  58. ['listing', defineAsyncComponent(() => import('./components/listing/Index.vue'))],
  59. ])
  60. const loginStore = useLoginStore()
  61. const { getGlobalUrlParams, router } = useNavigation()
  62. const item: Model.QuoteGoodsListRsp = getGlobalUrlParams()
  63. const tabIndex = shallowRef(0)
  64. const selectedRow = shallowRef<Model.TjmdTradeOrderDetailRsp>()
  65. const futuresStore = useFuturesStore()
  66. const quote = futuresStore.getGoodsQuote(item.refgoodsid)
  67. const goodsCode = computed(() => quote.value?.goodscode ?? '')
  68. const userStore = useUserStore()
  69. const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => onRefresh())
  70. /// 查询用户掉期协议签署表
  71. const { dataList: protocolList } = useRequest(queryMdUserSwapProtocol, {
  72. params: {
  73. userId: getUserId()
  74. }
  75. })
  76. /// 估算价格
  77. const estimateprice = (row: Model.TjmdTradeOrderDetailRsp) => {
  78. const decimalplace = (item.decimalplace ?? 2.0)
  79. return formatDecimal((row.marketmaxsub + (quote.value?.last ?? 0.0)), decimalplace)
  80. }
  81. const isDisable = (row: Model.TjmdTradeOrderDetailRsp) => {
  82. return row.userid === getUserId() || (status(row) === 2 || status(row) === 3)
  83. }
  84. const status = (row: Model.TjmdTradeOrderDetailRsp) => {
  85. return protocolList.value.find((e) => e.areauserid === row.userid)?.protocolstatus ?? 1
  86. }
  87. const { dataList, run } = useRequest(queryTjmdTradeOrderDetail, {
  88. params: {
  89. goodsid: item.goodsid,
  90. buyorsell: tabIndex.value
  91. }
  92. })
  93. const getDelistingButtonTitles = (tab: number, row: Model.TjmdTradeOrderDetailRsp) => {
  94. /// 如果是机构自己的单 不能签署
  95. if (row.userid === getUserId()) {
  96. return '摘牌'
  97. }
  98. switch (status(row)) {
  99. case 1:
  100. return '签署'
  101. case 2:
  102. return '待审核'
  103. case 3:
  104. return '待审核'
  105. default:
  106. return '摘牌'
  107. }
  108. }
  109. /// 每隔 30 秒去刷新请求数据信息
  110. setTimeout(() => {
  111. // 获取买卖大厅数据
  112. run()
  113. }, 30 * 1000)
  114. const onRefresh = () => {
  115. run({
  116. buyorsell: tabIndex.value,
  117. })
  118. }
  119. const columns: Model.TableColumn[] = [
  120. { prop: 'orderprice', label: '价格' },
  121. { prop: 'orderqty', label: '数量' },
  122. { prop: 'username', label: '挂牌方' },
  123. { prop: 'operate', label: '摘牌' },
  124. ]
  125. const onDelisting = (row: Model.TjmdTradeOrderDetailRsp) => {
  126. selectedRow.value = row
  127. /// 不能与自己成交
  128. if (row.userid === loginStore.userId) {
  129. showToast('不能与自己成交')
  130. return
  131. }
  132. switch (status(row)) {
  133. case 4: /// 已签署
  134. openComponent('delisting')
  135. break;
  136. case 1: /// 未签署
  137. /// 传对应的机构 ID
  138. /// 进行下一步
  139. router.push({ name: 'account-protocol', query: { memberUserId: row.userid.toString() } })
  140. break;
  141. default: /// 其他状态
  142. break;
  143. }
  144. }
  145. const onListing = () => {
  146. openComponent('listing')
  147. }
  148. </script>