| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- <template>
- <app-view class="g-detail">
- <template #header>
- <app-navbar title="挂牌详情" />
- </template>
- <Banner :data-list="topBanners" />
- <div class="g-detail__buy" v-if="quoteItem">
- <div class="title">
- <span>{{ quoteItem.wrstandardcode }} / {{ quoteItem.wrstandardname }}</span>
- </div>
- <div class="desc">
- <span>{{ quoteItem.warehousename }}</span>
- </div>
- <div class="info">
- <ul>
- <li>
- <span>卖价</span>
- <span>{{ handleNumberValue(quoteItem.sellprice) }}</span>
- </li>
- <li>
- <span>卖量</span>
- <span>{{ quoteItem.sellqty }}</span>
- </li>
- <li>
- <span>买价</span>
- <span>{{ handleNumberValue(quoteItem.buyprice) }}</span>
- </li>
- <li>
- <span>买量</span>
- <span>{{ quoteItem.buyqty }}</span>
- </li>
- </ul>
- </div>
- </div>
- <div class="trade">
- <div class="trade-section sell" v-if="sellList.length">
- <Cell title="卖出挂牌" />
- <app-list :columns="columns" :data-list="sellList">
- <template #operate="{ row }">
- <Button size="small" round @click="delistingListing(row, BuyOrSell.Buy)">{{ $t('quote.buy') }}</Button>
- </template>
- </app-list>
- </div>
- <div class="trade-section buy" v-if="buyList.length">
- <Cell title="买入挂牌" />
- <app-list :columns="columns" :data-list="buyList">
- <template #operate="{ row }">
- <Button size="small" round @click="delistingListing(row, BuyOrSell.Sell)">{{ $t('quote.selll') }}</Button>
- </template>
- </app-list>
- </div>
- </div>
- <div class="g-detail__desc">
- <template v-for="(url, index) in goodsImages" :key="index">
- <img :src="url" alt="" />
- </template>
- </div>
- <template #footer>
- <div class="g-form__footer">
- <!-- <div class="price" v-if="quoteItem">
- <span class="price-text">参考价:</span>
- <span class="price-unit">¥</span>
- <span class="price-integer">{{ quoteItem.spotgoodsprice }}</span>
- </div> -->
- <!-- <div class="submit"> -->
- <Button block type="danger" square class="submit-button danger"
- @click="toggleListing(BuyOrSell.Buy)">我要买</Button>
- <Button block color="#199e00" square class="submit-button warning"
- @click="toggleListing(BuyOrSell.Sell)">我要卖</Button>
- <!-- </div> -->
- </div>
- <component ref="componentRef" :is="componentMap.get(componentId)"
- v-bind="{ quoteItem, quoteDetail, buyorsell }" @closed="closeComponent" v-if="componentId" />
- </template>
- </app-view>
- </template>
- <script lang="ts" setup>
- import { shallowRef, computed, defineAsyncComponent, onUnmounted } from 'vue'
- import { Cell, Button } from 'vant'
- import { getFileUrl, handleNumberValue } from '@/filters'
- import { useRequest } from '@/hooks/request'
- import { useComponent } from '@/hooks/component'
- import { useNavigation } from '@mobile/router/navigation'
- import { BuyOrSell } from '@/constants/order'
- import { queryOrderQuote, queryOrderQuoteDetail } from '@/services/api/goods'
- import eventBus from '@/services/bus'
- import AppList from '@mobile/components/base/list/index.vue'
- import Banner from '@mobile/components/base/banner/index.vue'
- import service from '@/services'
- const componentMap = new Map<string, unknown>([
- ['listing', defineAsyncComponent(() => import('./components/listing/index.vue'))], // 挂牌
- ['delisting', defineAsyncComponent(() => import('./components/delisting/index.vue'))], // 摘牌
- ])
- const { getQueryString } = useNavigation()
- const { componentRef, componentId, openComponent, closeComponent } = useComponent()
- const quoteDetail = shallowRef<Model.OrderQuoteDetailRsp>() // 买卖详情
- const buyorsell = shallowRef(BuyOrSell.Buy) // 买卖方向
- const oem = service.getConfig('oem')
- const buyList = shallowRef<Model.OrderQuoteDetailRsp[]>([])
- const sellList = shallowRef<Model.OrderQuoteDetailRsp[]>([])
- const wrfactortypeid = getQueryString('wrfactortypeid') ?? '0'
- const { data: quoteItem, run: getOrderQuote } = useRequest(queryOrderQuote, {
- manual: true,
- params: {
- wrpricetype: 1,
- wrfactortypeid
- },
- onSuccess: (res) => {
- quoteItem.value = res.data[0]
- }
- })
- const { runAsync: getOrderQuoteDetail } = useRequest(queryOrderQuoteDetail, {
- manual: true,
- params: {
- wrpricetype: 1,
- haswr: 1,
- wrfactortypeid,
- buyorsell: buyorsell.value
- },
- })
- const columns: Model.TableColumn[] = oem != 'zrwyt' ? [
- { field: 'username', label: '挂牌方' },
- { field: 'orderqty', label: '数量' },
- { field: 'fixedprice', label: '价格' },
- { field: 'operate', label: '操作' },
- ] : [
- { field: 'orderqty', label: '数量' },
- { field: 'fixedprice', label: '价格' },
- { field: 'operate', label: '操作' },
- ]
- // 商品banner
- const topBanners = computed(() => {
- const bannerpicurl = quoteItem.value?.bannerpicurl ?? ''
- return bannerpicurl?.split(',').map((path) => getFileUrl(path))
- })
- // 商品图片列表
- const goodsImages = computed(() => {
- const pictureurls = quoteItem.value?.pictureurls ?? ''
- return pictureurls.split(',').map((path) => getFileUrl(path))
- })
- // 挂牌下单
- const toggleListing = (value: BuyOrSell) => {
- buyorsell.value = value
- openComponent('listing')
- }
- // 摘牌下单
- const delistingListing = (row: Model.OrderQuoteDetailRsp, value: BuyOrSell) => {
- buyorsell.value = value
- quoteDetail.value = row
- openComponent('delisting')
- }
- // 刷新数据
- const refresh = () => {
- getOrderQuote()
- getOrderQuoteDetail({
- buyorsell: BuyOrSell.Buy
- }).then((res) => {
- buyList.value = res.data
- })
- getOrderQuoteDetail({
- buyorsell: BuyOrSell.Sell
- }).then((res) => {
- sellList.value = res.data
- })
- }
- // 接收仓单贸易成交通知
- const wrTradeDealedNtf = eventBus.$on('ListingOrderChangeNtf', () => refresh())
- onUnmounted(() => {
- wrTradeDealedNtf.cancel()
- })
- refresh()
- </script>
- <style lang="less">
- @import './index.less';
- </style>
|