li.shaoyi 2 lat temu
rodzic
commit
541d90c4ff

+ 2 - 1
src/business/goods/index.ts

@@ -278,13 +278,14 @@ export function useOrderQuoteList() {
     const { dataList, total, pageIndex, pageSize, pageCount } = useDataTable<Model.OrderQuoteRsp>()
     const loading = shallowRef(false)
 
-    const getOrderQuoteList = async () => {
+    const getOrderQuoteList = async (params: Partial<Model.OrderQuoteReq> = {}) => {
         loading.value = true
         await queryOrderQuote({
             data: {
                 page: pageIndex.value,
                 pagesize: pageSize.value,
                 wrpricetype: 1,
+                ...params,
             },
             success: (res) => {
                 total.value = res.total

+ 2 - 0
src/constants/funcode.ts

@@ -47,6 +47,8 @@ export enum FunCode {
     // 交易通知
     MoneyChangedNotify = 131076, // 资金变化通知
     UserChangeNtf = 131106,    /// 用户变更通知(0, 2, 34)
+    WRTradeDealedNtf = 131110, // 仓单贸易成交通知
+    ListingOrderChangeNtf = 131176, // 挂牌委托变更广播通知
 
     // 行情内容
     QuoteBeat = 0x12, // 心跳

+ 2 - 2
src/packages/mobile/views/credit/signin/index.vue

@@ -86,7 +86,7 @@
                         <Button type="primary" round @click="toPurchase">去完成</Button>
                     </div>
                 </dd>
-                <dd class="list-item" v-if="false">
+                <!-- <dd class="list-item">
                     <div class="list-item__title">
                         <div class="title-icon">
                             <img src="@mobile/assets/icons/goods.png" />
@@ -99,7 +99,7 @@
                     <div class="list-item__button">
                         <Button type="primary" round @click="toSupplyDemand">去完成</Button>
                     </div>
-                </dd>
+                </dd> -->
             </dl>
         </div>
         <app-register-code v-model:show="showQRCode" :text="userAccount.refernum" />

+ 2 - 3
src/packages/mobile/views/mine/order/detail/wrorder/index.vue

@@ -22,7 +22,7 @@
         </div>
         <template #footer>
             <div class="g-form__footer" v-if="detail">
-                <Button block v-if="detail.wrtradeorderstatus === (3 | 7)" round type="primary"
+                <Button block v-if="detail.wrtradeorderstatus === (3 || 7)" round type="primary"
                     @click="spotConfirmSubmit">撤销</Button>
             </div>
         </template>
@@ -61,7 +61,7 @@ const spotConfirmSubmit = () => {
             fullloading((hideLoading) => {
                 cancelSubmit(param.wrtradeorderid, param.buyorsell).then(() => {
                     hideLoading()
-                    dialog('撤销请求成功,请耐心等待审核。').then(() => {
+                    dialog('撤销请求成功。').then(() => {
                         router.back()
                     })
                 }).catch((err) => {
@@ -72,5 +72,4 @@ const spotConfirmSubmit = () => {
     }
 
 }
-
 </script>

+ 8 - 3
src/packages/mobile/views/mine/order/list/components/transferbuy/index.vue

@@ -1,8 +1,8 @@
 <!-- 我的订单-转让成交 -->
 <template>
     <app-view class="order-list-purchase">
-        <app-pull-refresh class="order-list__wrapper" v-model:error="error" v-model:pageIndex="pageIndex"
-            :page-count="pageCount" @refresh="onRefresh">
+        <app-pull-refresh ref="pullRefreshRef" class="order-list__wrapper" v-model:error="error"
+            v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
             <ul class="section">
                 <li class="section-item" v-for="(item, index) in dataList" :key="index">
                     <div class="section-item__titlebar">
@@ -49,7 +49,7 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
+import { shallowRef, onActivated } from 'vue'
 import { Button } from 'vant'
 import { useNavigation } from '@/hooks/navigation'
 import { getGoodsUnitName } from '@/constants/unit'
@@ -59,6 +59,7 @@ import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const { router } = useNavigation()
 const { pageIndex, pageCount, getTHJPurchaseTransferOrder } = useQueryTHJPurchaseTransferOrder()
+const pullRefreshRef = shallowRef()
 const dataList = shallowRef<Model.THJPurchaseTransferOrderRsp[]>([])
 const error = shallowRef(false)
 
@@ -79,4 +80,8 @@ const onRefresh = (finish: () => void) => {
         finish()
     })
 }
+
+onActivated(() => {
+    pullRefreshRef.value?.refresh()
+})
 </script>

+ 8 - 3
src/packages/mobile/views/mine/order/list/components/transfersell/index.vue

@@ -1,8 +1,8 @@
 <!-- 我的订单-转让委托 -->
 <template>
     <app-view class="order-list-purchase">
-        <app-pull-refresh class="order-list__wrapper" v-model:error="error" v-model:pageIndex="pageIndex"
-            :page-count="pageCount" @refresh="onRefresh">
+        <app-pull-refresh ref="pullRefreshRef" class="order-list__wrapper" v-model:error="error"
+            v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
             <ul class="section">
                 <li class="section-item" v-for="(item, index) in dataList" :key="index">
                     <div class="section-item__titlebar">
@@ -44,7 +44,7 @@
 
 <script lang="ts" setup>
 
-import { shallowRef } from 'vue'
+import { shallowRef, onActivated } from 'vue'
 import { Button } from 'vant'
 import { useNavigation } from '@/hooks/navigation'
 import { getGoodsUnitName } from '@/constants/unit'
@@ -54,6 +54,7 @@ import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const { router } = useNavigation()
 const { pageIndex, pageCount, getTHJPurchaseTransferOrder } = useQueryTHJPurchaseTransferOrder()
+const pullRefreshRef = shallowRef()
 const dataList = shallowRef<Model.THJPurchaseTransferOrderRsp[]>([])
 const error = shallowRef(false)
 
@@ -74,4 +75,8 @@ const onRefresh = (finish: () => void) => {
         finish()
     })
 }
+
+onActivated(() => {
+    pullRefreshRef.value?.refresh()
+})
 </script>

+ 8 - 3
src/packages/mobile/views/mine/order/list/components/wrorder/index.vue

@@ -1,8 +1,8 @@
 <!-- 我的订单-供求委托 -->
 <template>
     <app-view class="wrorderdetail">
-        <app-pull-refresh class="order-list__wrapper" v-model:pageIndex="pageIndex" v-model:error="error"
-            :page-count="pageCount" @refresh="onRefresh">
+        <app-pull-refresh ref="pullRefreshRef" class="order-list__wrapper" v-model:pageIndex="pageIndex"
+            v-model:error="error" :page-count="pageCount" @refresh="onRefresh">
             <ul class="section">
                 <li class="section-item" v-for="(item, index) in dataList" :key="index">
                     <div class="section-item__titlebar">
@@ -39,7 +39,7 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
+import { shallowRef, onActivated } from 'vue'
 import { Button } from 'vant'
 import { handleNoneValue } from '@/filters'
 import { getWRTradeOrderStatusName } from '@/constants/order'
@@ -49,6 +49,7 @@ import { useNavigation } from '@/hooks/navigation'
 
 const { router } = useNavigation()
 const { pageIndex, pageCount, getWrOrderDetail } = useQueryWrOrderDetail()
+const pullRefreshRef = shallowRef()
 const dataList = shallowRef<Model.WrOrderDetailRsp[]>([])
 const error = shallowRef(false)
 
@@ -69,4 +70,8 @@ const onRefresh = (finish: () => void) => {
         finish()
     })
 }
+
+onActivated(() => {
+    pullRefreshRef.value?.refresh()
+})
 </script>

+ 8 - 3
src/packages/mobile/views/mine/order/list/components/wrtrade/index.vue

@@ -1,8 +1,8 @@
 <!-- 我的订单-供求成交 -->
 <template>
     <app-view class="wrtradedetail">
-        <app-pull-refresh class="order-list__wrapper" v-model:pageIndex="pageIndex" :page-count="pageCount"
-            v-model:error="error" @refresh="onRefresh">
+        <app-pull-refresh ref="pullRefreshRef" class="order-list__wrapper" v-model:pageIndex="pageIndex"
+            :page-count="pageCount" v-model:error="error" @refresh="onRefresh">
             <ul class="section">
                 <li class="section-item" v-for="(item, index) in dataList" :key="index">
                     <div class="section-item__titlebar">
@@ -40,7 +40,7 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
+import { shallowRef, onActivated } from 'vue'
 import { Button } from 'vant'
 import { formatDate, handleNoneValue } from '@/filters'
 import { getBuyOrSellName } from '@/constants/order'
@@ -50,6 +50,7 @@ import { useNavigation } from '@/hooks/navigation'
 
 const { router } = useNavigation()
 const { pageIndex, pageCount, getWrTradeDetail } = useQueryWrTradeDetail()
+const pullRefreshRef = shallowRef()
 const dataList = shallowRef<Model.WrTradeDetailRsp[]>([])
 const error = shallowRef(false)
 
@@ -70,4 +71,8 @@ const onRefresh = (finish: () => void) => {
         finish()
     })
 }
+
+onActivated(() => {
+    pullRefreshRef.value?.refresh()
+})
 </script>

+ 7 - 3
src/packages/mobile/views/mine/wareorder/list/components/holdlb/index.vue

@@ -1,7 +1,7 @@
 <template>
     <app-view class="wareorder-list-purchase">
-        <app-pull-refresh class="wareorder-list__wrapper" v-model:error="error" v-model:pageIndex="pageIndex"
-            :page-count="pageCount" @refresh="onRefresh">
+        <app-pull-refresh ref="pullRefreshRef" class="wareorder-list__wrapper" v-model:error="error"
+            v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
             <ul class="section">
                 <li class="section-item" v-for="(item, index) in dataList" :key="index">
                     <div class="section-item__titlebar">
@@ -49,8 +49,12 @@ const componentMap = new Map<string, unknown>([
     ['pickup', defineAsyncComponent(() => import('../../../components/pickup/index.vue'))],
 ])
 
-const { componentRef, componentId, openComponent, closeComponent } = useComponent()
+const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
+    pullRefreshRef.value?.refresh()
+})
+
 const { pageIndex, pageCount, getHoldLB } = useQueryHoldLB()
+const pullRefreshRef = shallowRef()
 const dataList = shallowRef<Model.HoldLBRsp[]>([])
 const selectedRow = shallowRef()
 const error = shallowRef(false)

+ 5 - 5
src/packages/mobile/views/supply-demand/detail/components/delisting/index.vue

@@ -1,6 +1,6 @@
 <template>
-    <app-popup class="supply-demand-listing" :title="buyorsell === BuyOrSell.Sell ? '卖出' : '买入'"
-        v-model:show="showModal" :refresh="refresh">
+    <app-popup class="supply-demand-listing" :title="buyorsell === BuyOrSell.Sell ? '卖出' : '买入'" v-model:show="showModal"
+        :refresh="refresh">
         <Form class="supply-demand-listing__form" ref="formRef" @submit="onSubmit">
             <Field label="挂牌方">
                 <template #input>
@@ -59,7 +59,7 @@ import AppPopup from '@mobile/components/base/popup/index.vue'
 import AppSelect from '@mobile/components/base/select/index.vue'
 
 const props = defineProps({
-    quote: {
+    quoteItem: {
         type: Object as PropType<Model.OrderQuoteRsp>,
         required: true
     },
@@ -114,7 +114,7 @@ const onConfirm = (value: string) => {
 
 // 提交摘牌
 const onSubmit = () => {
-    const { wrfactortypeid = '0' } = props.quote ?? {}
+    const { wrfactortypeid = '0' } = props.quoteItem ?? {}
     const { wrtradeorderid = '0', marketid } = props.quoteDetail ?? {}
 
     formData.Header = {
@@ -145,7 +145,7 @@ const onSubmit = () => {
 queryHoldLB({
     data: {
         accountid: firstAccountId.value,
-        wrstandardid: props.quote.wrstandardid
+        wrstandardid: props.quoteItem.wrstandardid
     },
     success: (res) => {
         dataList.value = res.data

+ 10 - 8
src/packages/mobile/views/supply-demand/detail/components/listing/index.vue

@@ -1,10 +1,10 @@
 <template>
-    <app-popup class="supply-demand-listing" :title="buyorsell === BuyOrSell.Sell ? '我要卖' : '我要买'"
-        v-model:show="showModal">
+    <app-popup class="supply-demand-listing" :title="buyorsell === BuyOrSell.Sell ? '我要卖' : '我要买'" v-model:show="showModal"
+        :refresh="refresh">
         <Form class="supply-demand-listing__form" ref="formRef" @submit="onSubmit">
             <Field name="FixedPrice" :rules="formRules.FixedPrice" label="价格">
                 <template #input>
-                    <Stepper v-model="formData.FixedPrice" :default-value="quote.spotgoodsprice" theme="round"
+                    <Stepper v-model="formData.FixedPrice" :default-value="quoteItem.spotgoodsprice" theme="round"
                         button-size="22" />
                 </template>
             </Field>
@@ -50,7 +50,7 @@ import AppPopup from '@mobile/components/base/popup/index.vue'
 import AppSelect from '@mobile/components/base/select/index.vue'
 
 const props = defineProps({
-    quote: {
+    quoteItem: {
         type: Object as PropType<Model.OrderQuoteRsp>,
         required: true
     },
@@ -64,12 +64,14 @@ const { firstAccountId } = loginStore.$mapGetters()
 const { avaiableMoney } = accountStore.$mapGetters()
 const { formData, listingSubmit, amount } = useHdWROrder()
 const formRef = shallowRef<FormInstance>()
+const refresh = shallowRef(false) // 是否刷新父组件数据
 const showModal = shallowRef(true)
 const dataList = shallowRef<Model.HoldLBRsp[]>([]) //现货仓单列表
 const selectedRow = shallowRef<Model.HoldLBRsp>() //选择的仓单
 
 // 关闭弹窗
-const closed = () => {
+const closed = (isRefresh = false) => {
+    refresh.value = isRefresh
     showModal.value = false
 }
 
@@ -115,7 +117,7 @@ const onSubmit = () => {
     formData.BuyOrSell = props.buyorsell
 
     if (formData.BuyOrSell === BuyOrSell.Buy) {
-        const { wrstandardid, deliverygoodsid, wrfactortypeid = '0' } = props.quote ?? {}
+        const { wrstandardid, deliverygoodsid, wrfactortypeid = '0' } = props.quoteItem ?? {}
         formData.WRStandardID = wrstandardid
         formData.DeliveryGoodsID = deliverygoodsid
         formData.WRFactorTypeId = Long.fromString(wrfactortypeid)
@@ -131,7 +133,7 @@ const onSubmit = () => {
     fullloading((hideLoading) => {
         listingSubmit().then(() => {
             hideLoading()
-            dialog('挂牌提交成功。').then(() => closed())
+            dialog('挂牌提交成功。').then(() => closed(true))
         }).catch((err) => {
             showFailToast(err)
         })
@@ -141,7 +143,7 @@ const onSubmit = () => {
 queryHoldLB({
     data: {
         accountid: firstAccountId.value,
-        wrstandardid: props.quote.wrstandardid
+        wrstandardid: props.quoteItem.wrstandardid
     },
     success: (res) => {
         dataList.value = res.data

+ 42 - 29
src/packages/mobile/views/supply-demand/detail/index.vue

@@ -3,7 +3,7 @@
         <template #header>
             <app-navbar title="供求详情" />
         </template>
-        <div v-if="quote" class="supply-demand-details__content">
+        <div v-if="quoteItem" class="supply-demand-details__content">
             <Swipe class="banner" :autoplay="5000" indicator-color="white" lazy-render>
                 <SwipeItem v-for="(url, index) in topBanners" :key="index">
                     <img :src="url" />
@@ -13,45 +13,45 @@
                 <table cellspacing="0" cellpadding="0">
                     <tr>
                         <th colspan="3">
-                            <h1>{{ quote.wrstandardname }}</h1>
+                            <h1>{{ quoteItem.wrstandardname }}</h1>
                         </th>
                     </tr>
                     <tr>
                         <td>
                             <span>卖价:</span>
-                            <span>{{ quote.sellprice }}</span>
+                            <span>{{ quoteItem.sellprice }}</span>
                         </td>
                         <td>
                             <span>卖量:</span>
-                            <span>{{ quote.sellqty }}</span>
+                            <span>{{ quoteItem.sellqty }}</span>
                         </td>
                         <td rowspan="3" style="vertical-align:top">
                             <div class="goods-price">
-                                <h4>参考价(元/{{ quote.enumdicname }})</h4>
-                                <h2>{{ quote.spotgoodsprice }}</h2>
+                                <h4>参考价(元/{{ quoteItem.enumdicname }})</h4>
+                                <h2>{{ quoteItem.spotgoodsprice }}</h2>
                             </div>
                         </td>
                     </tr>
                     <tr>
                         <td>
                             <span>买价:</span>
-                            <span>{{ quote.buyprice }}</span>
+                            <span>{{ quoteItem.buyprice }}</span>
                         </td>
                         <td>
                             <span>买量:</span>
-                            <span>{{ quote.buyqty }}</span>
+                            <span>{{ quoteItem.buyqty }}</span>
                         </td>
                     </tr>
                     <tr>
                         <td colspan="2">
                             <span>仓库:</span>
-                            <span>{{ quote.warehousename }}</span>
+                            <span>{{ quoteItem.warehousename }}</span>
                         </td>
                     </tr>
                 </table>
             </div>
             <div class="trade">
-                <div class="trade-section sell">
+                <div class="trade-section sell" v-if="sellList.length">
                     <Cell title="卖价" />
                     <app-list :columns="columns" :data-list="sellList">
                         <template #operate="{ row }">
@@ -59,7 +59,7 @@
                         </template>
                     </app-list>
                 </div>
-                <div class="trade-section buy">
+                <div class="trade-section buy" v-if="buyList.length">
                     <Cell title="买价" />
                     <app-list :columns="columns" :data-list="buyList">
                         <template #operate="{ row }">
@@ -77,24 +77,25 @@
         </div>
         <Empty v-else />
         <template #footer>
-            <div class="g-form__footer" v-if="quote">
+            <div class="g-form__footer" v-if="quoteItem">
                 <Button type="warning" block round @click="toggleListing(BuyOrSell.Sell)">我要卖</Button>
                 <Button type="primary" block round @click="toggleListing(BuyOrSell.Buy)">我要买</Button>
             </div>
-            <component ref="componentRef" :is="componentMap.get(componentId)" v-bind="{ quote, quoteDetail, buyorsell }"
+            <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 } from 'vue'
+import { shallowRef, computed, defineAsyncComponent, onUnmounted } from 'vue'
 import { Cell, Swipe, SwipeItem, Empty, Divider, Button } from 'vant'
 import { getImageUrl } from '@/filters'
 import { useComponent } from '@/hooks/component'
 import { useNavigation } from '@/hooks/navigation'
 import { BuyOrSell } from '@/constants/order'
-import { useOrderQuoteDetail } from '@/business/goods'
+import { useOrderQuoteList, useOrderQuoteDetail } from '@/business/goods'
+import eventBus from '@/services/bus'
 import AppList from '@mobile/components/base/list/index.vue'
 
 const componentMap = new Map<string, unknown>([
@@ -102,19 +103,15 @@ const componentMap = new Map<string, unknown>([
     ['delisting', defineAsyncComponent(() => import('./components/delisting/index.vue'))], // 摘牌
 ])
 
-const { route } = useNavigation()
+const { getQueryString } = useNavigation()
 const { componentRef, componentId, openComponent, closeComponent } = useComponent()
-const item = route.params.item
-const quote = shallowRef<Model.OrderQuoteRsp>()
-const quoteDetail = shallowRef<Model.OrderQuoteDetailRsp>()
+const quoteDetail = shallowRef<Model.OrderQuoteDetailRsp>() // 买卖详情
 const buyorsell = shallowRef(BuyOrSell.Buy) // 买卖方向
 
-if (item) {
-    quote.value = JSON.parse(item.toString())
-}
-
-const { dataList: buyList, getOrderQuoteList: getOrderBuyList } = useOrderQuoteDetail(quote.value?.wrfactortypeid)
-const { dataList: sellList, getOrderQuoteList: getOrderSellList } = useOrderQuoteDetail(quote.value?.wrfactortypeid)
+const wrfactortypeid = getQueryString('wrfactortypeid')
+const { dataList, getOrderQuoteList } = useOrderQuoteList()
+const { dataList: buyList, getOrderQuoteList: getOrderBuyList } = useOrderQuoteDetail(wrfactortypeid)
+const { dataList: sellList, getOrderQuoteList: getOrderSellList } = useOrderQuoteDetail(wrfactortypeid)
 
 const columns: Model.TableColumn[] = [
     { prop: 'username', label: '挂牌方' },
@@ -123,15 +120,18 @@ const columns: Model.TableColumn[] = [
     { prop: 'operate', label: '操作' },
 ]
 
+// 供求详情
+const quoteItem = computed(() => dataList.value[0])
+
 // 商品banner
 const topBanners = computed(() => {
-    const bannerpicurl = quote.value?.bannerpicurl ?? ''
+    const bannerpicurl = quoteItem.value?.bannerpicurl ?? ''
     return bannerpicurl?.split(',').map((path) => getImageUrl(path))
 })
 
 // 商品图片列表
 const goodsImages = computed(() => {
-    const pictureurls = quote.value?.pictureurls ?? ''
+    const pictureurls = quoteItem.value?.pictureurls ?? ''
     return pictureurls.split(',').map((path) => getImageUrl(path))
 })
 
@@ -148,8 +148,21 @@ const delistingListing = (row: Model.OrderQuoteDetailRsp, value: BuyOrSell) => {
     openComponent('delisting')
 }
 
-getOrderBuyList(BuyOrSell.Buy)
-getOrderSellList(BuyOrSell.Sell)
+// 刷新数据
+const refresh = () => {
+    getOrderQuoteList({ wrfactortypeid })
+    getOrderBuyList(BuyOrSell.Buy)
+    getOrderSellList(BuyOrSell.Sell)
+}
+
+// 接收仓单贸易成交通知
+const wrTradeDealedNtf = eventBus.$on('ListingOrderChangeNtf', () => refresh())
+
+onUnmounted(() => {
+    wrTradeDealedNtf.cancel()
+})
+
+refresh()
 </script>
 
 <style lang="less">

+ 35 - 12
src/packages/mobile/views/supply-demand/list/index.less

@@ -2,24 +2,47 @@
     &__header {
         .van-search {
             padding-top: 0;
+            background-color: transparent;
         }
     }
 
     &__container {
-        .van-cell__title {
-            display: flex;
-            align-items: center;
+        .list {
+            padding: .2rem .2rem 0 .2rem;
 
-            img {
-                width: 1.8rem;
-                height: 1.8rem;
-                object-fit: cover;
-                border-radius: .16rem;
-                margin-right: .4rem;
-            }
+            &-item {
+                display: flex;
+                align-items: center;
+                border-radius: .1rem;
+                overflow: hidden;
+                padding: .2rem;
+
+                &:not(:last-child) {
+                    margin-bottom: .2rem;
+                }
+
+                .block {
+                    &:first-child {
+                        flex: 1;
+                        display: flex;
+                        align-items: center;
+
+                        img {
+                            width: 1.8rem;
+                            height: 1.8rem;
+                            object-fit: cover;
+                            border-radius: .16rem;
+                            margin-right: .4rem;
+                        }
+                    }
 
-            span {
-                flex: 1;
+                    &:last-child {
+                        .van-button {
+                            width: 1.3rem;
+                            height: .5rem;
+                        }
+                    }
+                }
             }
         }
     }

+ 24 - 11
src/packages/mobile/views/supply-demand/list/index.vue

@@ -3,27 +3,33 @@
     <template #header>
       <app-navbar class="supply-demand__header" title="供求" :show-back-button="false">
         <template #footer>
-          <Search shape="round" placeholder="商品搜索" disabled />
+          <Search shape="round" placeholder="商品搜索" v-model="keyword" @search="pullRefreshRef.refresh()" />
         </template>
       </app-navbar>
     </template>
-    <app-pull-refresh class="supply-demand__container" v-model:error="error" v-model:pageIndex="pageIndex"
-      :page-count="pageCount" @refresh="onRefresh">
+    <app-pull-refresh ref="pullRefreshRef" class="supply-demand__container" v-model:error="error"
+      v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
       <template v-for="(item, index) in dataList" :key="index">
-        <Cell @click="$router.push({ name: 'SupplyDemandDetail', params: { item: JSON.stringify(item) } })">
-          <template #title>
-            <img :src="getFirstImage(item.thumurls)" />
-            <span>{{ item.wrstandardname }}</span>
-          </template>
-        </Cell>
+        <ul class="list">
+          <li class="list-item g-block--bg" v-for="(item, index) in dataList" :key="index">
+            <div class="block">
+              <img :src="getFirstImage(item.thumurls)" />
+              <span>{{ item.wrstandardname }}</span>
+            </div>
+            <div class="block">
+              <Button type="primary" size="small" round
+                @click="$router.push({ name: 'SupplyDemandDetail', query: { wrfactortypeid: item.wrfactortypeid } })">去供求</Button>
+            </div>
+          </li>
+        </ul>
       </template>
     </app-pull-refresh>
   </app-view>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { Cell, Search } from 'vant'
+import { shallowRef, onActivated } from 'vue'
+import { Search, Button } from 'vant'
 import { getImageUrl } from '@/filters'
 import { useOrderQuoteList } from '@/business/goods'
 import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
@@ -31,6 +37,8 @@ import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 const { pageIndex, pageCount, getOrderQuoteList } = useOrderQuoteList()
 const dataList = shallowRef<Model.OrderQuoteRsp[]>([])
 const error = shallowRef(false)
+const pullRefreshRef = shallowRef()
+const keyword = shallowRef('')
 
 // 获取商品首图
 const getFirstImage = (url: string) => {
@@ -50,6 +58,11 @@ const onRefresh = (finish: () => void) => {
     finish()
   })
 }
+
+onActivated(() => {
+  keyword.value = ''
+  pullRefreshRef.value?.refresh()
+})
 </script>
 
 <style lang="less">

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

@@ -41,7 +41,7 @@ export function spotPresalePlayment(params: TradeParams<Proto.SpotPresalePlaymen
  * 挂牌撤单请求
  */
 export function wrListingCancelOrder(params: TradeParams<Proto.WRListingCancelOrderReq, Proto.WRListingCancelOrderRsp>) {
-    return tradeServerRequest('WRListingCancelOrderReq', 'WRListingCancelOrderRsp', params, Market.THJ);
+    return tradeServerRequest('WRListingCancelOrderReq', 'WRListingCancelOrderRsp', params, Market.THJ_Listing);
 }
 
 /**

+ 2 - 0
src/services/bus/interface.ts

@@ -8,6 +8,8 @@ export enum EventKey {
     LogoutNotify, // 用户登出通知
     MoneyChangedNotify, // 资金变动通知
     UserChangeNtf,       // 账户变更通知
+    WRTradeDealedNtf, // 仓单贸易成交通知
+    ListingOrderChangeNtf, // 挂牌委托变更广播通知
 }
 
 /**

+ 98 - 31
src/services/http/index@next.ts

@@ -1,9 +1,10 @@
-import { shallowRef, onUnmounted } from 'vue'
+import { ref, onUnmounted } from 'vue'
 import axios, { AxiosRequestConfig, Method } from 'axios'
 //import qs from 'qs'
 //import cryptojs from 'crypto-js'
 //import { addPending, removePending } from './pending'
 import { loginStore } from '@/stores'
+import { HttpParams, CommonParams, HttpResponse, Payload, ResultCode } from './interface'
 import { useDataTable } from '@/hooks/datatable'
 import service from '@/services'
 
@@ -63,7 +64,7 @@ const httpService = new (class {
         )
     }
 
-    httpRequest = async <T>(url: string, method: Method, payload?: T) => {
+    request = async (url: string, method: Method, payload?: unknown) => {
         const config = await service.onReady()
         this.axiosInstance.defaults.baseURL = config.goCommonSearchUrl
         const requestConfig: AxiosRequestConfig = {
@@ -81,48 +82,114 @@ const httpService = new (class {
         }
         return this.axiosInstance(requestConfig)
     }
+
+    httpRequest = async <T>(url: string, method: Method, payload?: unknown, errMsg?: string) => {
+        return await this.request(url, method, payload).then((res) => {
+            const data = res.data as HttpResponse<T>
+            switch (data.code) {
+                case ResultCode.InvalidToken:
+                    return Promise.reject('令牌无效')
+                case ResultCode.Success:
+                    return Promise.resolve(data.data)
+                default:
+                    return Promise.reject(data.msg)
+            }
+        }).catch((err) => {
+            const msg = err ?? (errMsg ? '请求失败: ' + errMsg : '请求失败,请稍后重试')
+            return Promise.reject(msg)
+        })
+    }
 })
 
 export const { httpRequest } = httpService
 
 
 function queryLoginId(params: string) {
-    return httpRequest('/User/GetLoginID', 'get', params)
+    return httpRequest<Model.LoginQueryRsp>('/User/GetLoginID', 'get', params)
 }
 
-function useRequest<Rsp, Req>(aa: (params: Req) => Promise<Rsp>, options: { params: Req, success?: (res: Rsp) => void }) {
-    const { dataList, total, pageIndex, pageSize, pageCount } = useDataTable<Rsp>()
-    const loading = shallowRef(false)
+interface RequestOptions<Req, Rsp> {
+    params: Req;
+    pagination: boolean;
+    onSuccess?: (res: Rsp) => void;
+    onFail: (err: string) => void;
+}
 
-    const run = (payload?: Partial<Req>) => {
-        aa({ ...options.params, ...payload }).then((res) => {
-            options.success && options.success(res)
-        })
-    }
+// function useRequest<Req, Rsp>(fnAsync: (params: Req) => Promise<Rsp>, options: RequestOptions<Req, Rsp>) {
+//     const loading = ref(false)
 
-    const cancel = () => {
-        console.log('取消请求')
-    }
+//     if (options.pagination) {
+//         const { dataList, filters, total, pageIndex, pageSize, pageCount } = useDataTable<Rsp>()
 
-    onUnmounted(() => {
-        cancel()
-    })
+//         const defaultParams = {
+//             page: pageIndex.value,
+//             pagesize: pageSize.value,
+//             ...options.params
+//         }
 
-    return {
-        loading,
-        dataList,
-        total,
-        pageIndex,
-        pageSize,
-        pageCount,
-        run,
-        cancel,
-    }
-}
+//         const run = (payload?: Partial<Req>) => {
+//             fnAsync({ ...defaultParams, ...payload }).then((res) => {
+//                 if (Array.isArray(res)) {
+//                     dataList.value = res
+//                 }
+//                 options.onSuccess && options.onSuccess(res)
+//             })
+//         }
+//     } else {
+//         const data = ref<Rsp>()
 
-const { run } = useRequest(queryLoginId, {
-    params: '12'
-})
+//     }
+
+
+
+//     const cancel = () => {
+//         console.log('取消请求')
+//     }
+
+//     onUnmounted(() => {
+//         cancel()
+//     })
+
+//     return {
+//         loading,
+//         data,
+//         run,
+//         cancel,
+//     }
+// }
+
+// function usePaginationRequest<Rsp, Req>(aa: (params: Req) => Promise<Rsp>, options: { params: Req, success?: (res: Rsp) => void }) {
+//     const { dataList, filters, total, pageIndex, pageSize, pageCount } = useDataTable<Rsp>()
+//     const { loading, data, run, cancel } = useRequest(aa, options)
+
+//     return {
+//         loading,
+//         dataList,
+//         filters,
+//         total,
+//         pageIndex,
+//         pageSize,
+//         pageCount,
+//         run,
+//         cancel,
+//     }
+// }
+
+// const { run, data } = useRequest(queryLoginId, {
+//     data: {
+//         page: pageIndex.value,
+//         pagesize: pageSize.value,
+//         pageflag: 1,
+//         accountID: firstAccountId.value.toString(),
+//     },
+//     success: (res) => {
+//         total.value = res.total
+//         dataList.value = res.data
+//     },
+//     complete: () => {
+//         loading.value = false
+//     }
+// })
 
 /**
  * 获取服务配置地址

+ 3 - 3
src/services/index.ts

@@ -51,17 +51,17 @@ export default new (class {
      */
     private tryinit = (msg: string) => {
         return new Promise<typeof this.config>((resolve, reject) => {
-            if (this.retryCount >= 5) {
+            if (this.retryCount >= 10) {
                 this.retryCount = 0
                 this.isPending = false
                 reject(msg)
             } else {
                 this.retryCount++
                 // 自动计算每次重试的延时,重试次数越多,延时越大
-                const delay = this.retryCount * 5000
+                // const delay = this.retryCount * 3000
                 setTimeout(() => {
                     resolve(this.init())
-                }, delay)
+                }, 3000)
             }
         })
     }

+ 15 - 8
src/services/socket/index.ts

@@ -39,6 +39,15 @@ export default new (class {
             const delay = 1000; // 延迟推送消息,防止短时间内重复请求
 
             switch (funCode) {
+                case FunCode.LogoutRsp: {
+                    // 通知上层 用户登出
+                    protobuf.responseDecode<Proto.LogoutRsp>(FunCode[funCode], content).then(({ RetCode, RetDesc }) => {
+                        const msg = errorInfoStore.actions.getErrorInfoByCode(RetCode)
+                        const error = (RetDesc || RetCode).toString();
+                        eventBus.$emit('LogoutNotify', msg ?? error);
+                    })
+                    break;
+                }
                 case FunCode.MoneyChangedNotify: {
                     timerInterceptor.debounce(() => {
                         // 通知上层 资金变动
@@ -46,20 +55,18 @@ export default new (class {
                     }, delay, funCode.toString())
                     break;
                 }
-                case FunCode.UserChangeNtf: {  // 账户信息变更通知
+                case FunCode.UserChangeNtf: {
                     timerInterceptor.debounce(() => {
                         // 账户信息变更通知
                         eventBus.$emit('UserChangeNtf');
                     }, delay, funCode.toString())
                     break;
                 }
-                case FunCode.LogoutRsp: {
-                    // 通知上层 用户登出
-                    protobuf.responseDecode<Proto.LogoutRsp>(FunCode[funCode], content).then(({ RetCode, RetDesc }) => {
-                        const msg = errorInfoStore.actions.getErrorInfoByCode(RetCode)
-                        const error = (RetDesc || RetCode).toString();
-                        eventBus.$emit('LogoutNotify', msg ?? error);
-                    })
+                case FunCode.ListingOrderChangeNtf: {
+                    timerInterceptor.debounce(() => {
+                        // 挂牌委托变更广播通知
+                        eventBus.$emit('ListingOrderChangeNtf');
+                    }, delay, funCode.toString())
                     break;
                 }
                 default: {

+ 1 - 1
src/types/model/goods.d.ts

@@ -418,7 +418,7 @@ declare namespace Model {
         wrstandardid?: number; // 品类id
         brandid?: number; // 品牌id(dgfactoryitemid)
         yearsid?: number; // 年份id(dgfactoryitemid)
-        wrfactortypeid?: number; // 仓单要素id
+        wrfactortypeid?: string; // 仓单要素id
         deliverymonth?: string; // 交收月(yyyy-mm) 仓单预售填写
     }