Index.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <template>
  2. <app-view class="g-detail">
  3. <template #header>
  4. <app-navbar title="挂牌详情" />
  5. </template>
  6. <Banner :data-list="topBanners" />
  7. <div class="g-detail__buy" v-if="quoteItem">
  8. <div class="title">
  9. <span>{{ quoteItem.wrstandardcode }} / {{ quoteItem.wrstandardname }}</span>
  10. </div>
  11. <div class="desc">
  12. <span>{{ quoteItem.warehousename }}</span>
  13. </div>
  14. <div class="info">
  15. <ul>
  16. <li>
  17. <span>卖价</span>
  18. <span>{{ handleNumberValue(quoteItem.sellprice) }}</span>
  19. </li>
  20. <li>
  21. <span>卖量</span>
  22. <span>{{ quoteItem.sellqty }}</span>
  23. </li>
  24. <li>
  25. <span>买价</span>
  26. <span>{{ handleNumberValue(quoteItem.buyprice) }}</span>
  27. </li>
  28. <li>
  29. <span>买量</span>
  30. <span>{{ quoteItem.buyqty }}</span>
  31. </li>
  32. </ul>
  33. </div>
  34. </div>
  35. <div class="trade">
  36. <div class="trade-section sell" v-if="sellList.length">
  37. <Cell title="卖出挂牌" />
  38. <app-list :columns="columns" :data-list="sellList">
  39. <template #operate="{ row }">
  40. <Button size="small" round @click="delistingListing(row, BuyOrSell.Buy)">{{ $t('quote.buy') }}</Button>
  41. </template>
  42. </app-list>
  43. </div>
  44. <div class="trade-section buy" v-if="buyList.length">
  45. <Cell title="买入挂牌" />
  46. <app-list :columns="columns" :data-list="buyList">
  47. <template #operate="{ row }">
  48. <Button size="small" round @click="delistingListing(row, BuyOrSell.Sell)">{{ $t('quote.selll') }}</Button>
  49. </template>
  50. </app-list>
  51. </div>
  52. </div>
  53. <div class="g-detail__desc">
  54. <template v-for="(url, index) in goodsImages" :key="index">
  55. <img :src="url" alt="" />
  56. </template>
  57. </div>
  58. <template #footer>
  59. <div class="g-form__footer">
  60. <!-- <div class="price" v-if="quoteItem">
  61. <span class="price-text">参考价:</span>
  62. <span class="price-unit">¥</span>
  63. <span class="price-integer">{{ quoteItem.spotgoodsprice }}</span>
  64. </div> -->
  65. <!-- <div class="submit"> -->
  66. <Button block type="danger" square class="submit-button danger"
  67. @click="toggleListing(BuyOrSell.Buy)">我要买</Button>
  68. <Button block color="#199e00" square class="submit-button warning"
  69. @click="toggleListing(BuyOrSell.Sell)">我要卖</Button>
  70. <!-- </div> -->
  71. </div>
  72. <component ref="componentRef" :is="componentMap.get(componentId)"
  73. v-bind="{ quoteItem, quoteDetail, buyorsell }" @closed="closeComponent" v-if="componentId" />
  74. </template>
  75. </app-view>
  76. </template>
  77. <script lang="ts" setup>
  78. import { shallowRef, computed, defineAsyncComponent, onUnmounted } from 'vue'
  79. import { Cell, Button } from 'vant'
  80. import { getFileUrl, handleNumberValue } from '@/filters'
  81. import { useRequest } from '@/hooks/request'
  82. import { useComponent } from '@/hooks/component'
  83. import { useNavigation } from '@mobile/router/navigation'
  84. import { BuyOrSell } from '@/constants/order'
  85. import { queryOrderQuote, queryOrderQuoteDetail } from '@/services/api/goods'
  86. import eventBus from '@/services/bus'
  87. import AppList from '@mobile/components/base/list/index.vue'
  88. import Banner from '@mobile/components/base/banner/index.vue'
  89. import service from '@/services'
  90. const componentMap = new Map<string, unknown>([
  91. ['listing', defineAsyncComponent(() => import('./components/listing/index.vue'))], // 挂牌
  92. ['delisting', defineAsyncComponent(() => import('./components/delisting/index.vue'))], // 摘牌
  93. ])
  94. const { getQueryString } = useNavigation()
  95. const { componentRef, componentId, openComponent, closeComponent } = useComponent()
  96. const quoteDetail = shallowRef<Model.OrderQuoteDetailRsp>() // 买卖详情
  97. const buyorsell = shallowRef(BuyOrSell.Buy) // 买卖方向
  98. const oem = service.getConfig('oem')
  99. const buyList = shallowRef<Model.OrderQuoteDetailRsp[]>([])
  100. const sellList = shallowRef<Model.OrderQuoteDetailRsp[]>([])
  101. const wrfactortypeid = getQueryString('wrfactortypeid') ?? '0'
  102. const { data: quoteItem, run: getOrderQuote } = useRequest(queryOrderQuote, {
  103. manual: true,
  104. params: {
  105. wrpricetype: 1,
  106. wrfactortypeid
  107. },
  108. onSuccess: (res) => {
  109. quoteItem.value = res.data[0]
  110. }
  111. })
  112. const { runAsync: getOrderQuoteDetail } = useRequest(queryOrderQuoteDetail, {
  113. manual: true,
  114. params: {
  115. wrpricetype: 1,
  116. haswr: 1,
  117. wrfactortypeid,
  118. buyorsell: buyorsell.value
  119. },
  120. })
  121. const columns: Model.TableColumn[] = oem != 'zrwyt' ? [
  122. { field: 'username', label: '挂牌方' },
  123. { field: 'orderqty', label: '数量' },
  124. { field: 'fixedprice', label: '价格' },
  125. { field: 'operate', label: '操作' },
  126. ] : [
  127. { field: 'orderqty', label: '数量' },
  128. { field: 'fixedprice', label: '价格' },
  129. { field: 'operate', label: '操作' },
  130. ]
  131. // 商品banner
  132. const topBanners = computed(() => {
  133. const bannerpicurl = quoteItem.value?.bannerpicurl ?? ''
  134. return bannerpicurl?.split(',').map((path) => getFileUrl(path))
  135. })
  136. // 商品图片列表
  137. const goodsImages = computed(() => {
  138. const pictureurls = quoteItem.value?.pictureurls ?? ''
  139. return pictureurls.split(',').map((path) => getFileUrl(path))
  140. })
  141. // 挂牌下单
  142. const toggleListing = (value: BuyOrSell) => {
  143. buyorsell.value = value
  144. openComponent('listing')
  145. }
  146. // 摘牌下单
  147. const delistingListing = (row: Model.OrderQuoteDetailRsp, value: BuyOrSell) => {
  148. buyorsell.value = value
  149. quoteDetail.value = row
  150. openComponent('delisting')
  151. }
  152. // 刷新数据
  153. const refresh = () => {
  154. getOrderQuote()
  155. getOrderQuoteDetail({
  156. buyorsell: BuyOrSell.Buy
  157. }).then((res) => {
  158. buyList.value = res.data
  159. })
  160. getOrderQuoteDetail({
  161. buyorsell: BuyOrSell.Sell
  162. }).then((res) => {
  163. sellList.value = res.data
  164. })
  165. }
  166. // 接收仓单贸易成交通知
  167. const wrTradeDealedNtf = eventBus.$on('ListingOrderChangeNtf', () => refresh())
  168. onUnmounted(() => {
  169. wrTradeDealedNtf.cancel()
  170. })
  171. refresh()
  172. </script>
  173. <style lang="less">
  174. @import './index.less';
  175. </style>