li.shaoyi преди 2 години
родител
ревизия
02b6b110b9

+ 0 - 2
src/business/login/index.ts

@@ -4,7 +4,6 @@ import { login, logout } from '@/services/api/account'
 import { useLoginStore, useEnumStore, useErrorInfoStore, useUserStore, useFuturesStore, useAccountStore, usePositionStore, useNoticeStore } from '@/stores'
 import service from '@/services'
 import tradeSocket from '@/services/websocket/trade'
-import quoteSocket from '@/services/websocket/quote'
 import eventBus from '@/services/bus'
 import { checkToken, checkTokenLoop, stopCheckToken } from '@/business/common'
 import { encryptBody } from '@/services/websocket/package/crypto'
@@ -51,7 +50,6 @@ export function useLogin(persist = false) {
         positionStore.getTradePosition()
         noticeStore.getNoticeList()
         tradeSocket.connect()
-        quoteSocket.connect()
         checkTokenLoop()
     }
 

+ 11 - 5
src/business/order/index.ts

@@ -11,6 +11,7 @@ import { useFuturesStore } from '@/stores'
 export const useSBYJOrder = (selectedRow?: Model.SBYJMyOrderRsp) => {
     const futuresStore = useFuturesStore()
     const loading = ref(false)
+    const error = ref(false)
     const orderList = ref<Model.SBYJMyOrderRsp[]>([])
 
     const orderComputedList = computed(() => {
@@ -22,19 +23,20 @@ export const useSBYJOrder = (selectedRow?: Model.SBYJMyOrderRsp) => {
 
     // 订单详情
     const detail = computed(() => {
-        const result = { ...selectedRow }
         if (selectedRow) {
-            result.depositRate = calcDepositRate(selectedRow)
+            selectedRow.depositRate = calcDepositRate(selectedRow)
         }
-        return result
+        return selectedRow
     })
 
     // 计算定金率
     const calcDepositRate = ({ tHDetailEx }: Model.SBYJMyOrderRsp) => {
         const quote = futuresStore.getGoodsQuote(tHDetailEx.goodsID)
         const { ask = 0, bid = 0, agreeunit = 0 } = quote.value ?? {}
-        // 计算浮动盈亏 (根据方向取买卖价 * 手数 * 合约乘数 - 持仓金额) * 方向标识
-        const float = (tHDetailEx.buyOrSell === BuyOrSell.Buy ? bid : ask) * tHDetailEx.holderQty * agreeunit - tHDetailEx.holderAmount
+        const price = tHDetailEx.buyOrSell === BuyOrSell.Buy ? bid : ask // 根据方向取买卖价
+
+        // 计算浮动盈亏 (价格 * 手数 * 合约乘数 - 持仓金额) * 方向标识
+        const float = price ? price * tHDetailEx.holderQty * agreeunit - tHDetailEx.holderAmount : 0
         const floatpl = float * (tHDetailEx.buyOrSell === BuyOrSell.Buy ? 1 : -1)
         // 计算定金率 (已付定金 + 补充定金 +盈亏 - 已计滞纳金) / 已付定金
         const depositRate = (tHDetailEx.payedDeposit + tHDetailEx.restockDeposit + floatpl - tHDetailEx.callAteFee) / tHDetailEx.payedDeposit
@@ -51,12 +53,16 @@ export const useSBYJOrder = (selectedRow?: Model.SBYJMyOrderRsp) => {
                 }
             })
             orderList.value = res.data
+        } catch {
+            error.value = true
         } finally {
             loading.value = false
         }
     }
 
     return {
+        loading,
+        error,
         orderList,
         orderComputedList,
         detail,

+ 38 - 9
src/packages/pc/components/modules/listing/index.vue

@@ -21,8 +21,8 @@
                 </el-form-item>
                 <el-form-item prop="OrderPrice" label="价格">
                     <div class="el-form-item--col">
-                        <el-input-number placeholder="请输入" :min="0" :step="priceStep" :precision="quote?.decimalplace"
-                            v-model="formData.OrderPrice" />
+                        <el-input-number ref="priceRef" placeholder="请输入" :min="0" :step="priceStep"
+                            :precision="quote?.decimalplace" v-model="formData.OrderPrice" @keyup.enter="qtyInputFocus" />
                         <div v-if="quote">
                             <div class="row-price g-price-up">
                                 <Icon icon="Top" />
@@ -37,8 +37,8 @@
                 </el-form-item>
                 <el-form-item prop="OrderQty" label="数量">
                     <div class="g-qty-group">
-                        <el-input-number placeholder="请输入" :min="0" :precision="0" :step="qtyStep"
-                            v-model="formData.OrderQty" />
+                        <el-input-number ref="qtyRef" placeholder="请输入" :min="0" :precision="0" :step="qtyStep"
+                            v-model="formData.OrderQty" @keyup.enter="submitFocus" />
                         <el-radio-group size="small" v-model="qtyStep" @change="onRadioChange">
                             <el-radio v-for="(value, index) in qtyStepList" :key="index" :label="value" border />
                         </el-radio-group>
@@ -47,7 +47,8 @@
             </el-form>
             <div class="footer-btnbar">
                 <template v-if="formData.BuyOrSell === BuyOrSell.Buy">
-                    <el-button type="primary" :loading="loading" :disabled="!goodsStore.goodsId || !formData.OrderQty"
+                    <el-button ref="submitRef" type="primary" :loading="loading"
+                        :disabled="!goodsStore.goodsId || !formData.OrderQty"
                         @click="onSubmit(EBuildType.BUILDTYPE_OPEN)">订立买入</el-button>
                     <el-button type="primary" :loading="loading"
                         :disabled="!formData.OrderQty || !sellQty || (formData.OrderQty > sellQty)"
@@ -57,7 +58,8 @@
                     </el-button>
                 </template>
                 <template v-if="formData.BuyOrSell === BuyOrSell.Sell">
-                    <el-button type="primary" :loading="loading" :disabled="!goodsStore.goodsId || !formData.OrderQty"
+                    <el-button ref="submitRef" type="primary" :loading="loading"
+                        :disabled="!goodsStore.goodsId || !formData.OrderQty"
                         @click="onSubmit(EBuildType.BUILDTYPE_OPEN)">订立卖出</el-button>
                     <el-button type="primary" :loading="loading"
                         :disabled="!formData.OrderQty || !buyQty || (formData.OrderQty > buyQty)"
@@ -72,7 +74,7 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, computed, watch } from 'vue'
+import { shallowRef, computed, watch, onMounted } from 'vue'
 import { ElMessage, ElMessageBox, FormInstance, FormRules } from 'element-plus'
 import { EPriceMode, EListingSelectType, EDelistingType, EBuildType, EValidType, EOrderOperateType } from '@/constants/client'
 import { BuyOrSell, getBuyOrSellList } from '@/constants/order'
@@ -90,6 +92,10 @@ const formRef = shallowRef<FormInstance>()
 const qtyStepList = [1, 10, 100] // 数量步长列表
 const qtyStep = shallowRef(qtyStepList[0]) // 数量步长
 
+const priceRef = shallowRef()
+const qtyRef = shallowRef()
+const submitRef = shallowRef()
+
 // 商品盘面
 const quote = computed(() => futuresStore.getGoodsQuote(goodsStore.goodsCode).value)
 
@@ -132,18 +138,36 @@ const formRules: FormRules = {
     }],
 }
 
+// 价格输入框获取焦点
+const priceInputFocus = () => {
+    priceRef.value.focus()
+}
+
+// 数量输入框获取焦点
+const qtyInputFocus = () => {
+    qtyRef.value.focus()
+}
+
+// 提交按钮获取焦点
+const submitFocus = () => {
+    submitRef.value.ref.focus()
+}
+
 const onRadioChange = (value: number) => {
     formData.OrderQty = value
+    qtyInputFocus()
 }
 
 const onBuyClick = (price: number) => {
     formData.BuyOrSell = BuyOrSell.Sell
     formData.OrderPrice = price
+    priceInputFocus()
 }
 
 const onSellClick = (price: number) => {
     formData.BuyOrSell = BuyOrSell.Buy
     formData.OrderPrice = price
+    priceInputFocus()
 }
 
 // 提交挂牌
@@ -169,17 +193,22 @@ const onSubmit = (buildType: number) => {
                     ElMessage.success('挂牌成功')
                 }).catch((err) => {
                     ElMessage.error('挂牌失败:' + err)
+                }).finally(() => {
+                    priceInputFocus()
                 })
             })
         }
     })
 }
 
-watch(quote, () => {
+const goodsChange = () => {
     const { last = 0, presettle = 0 } = quote.value ?? {}
     formData.OrderPrice = last || presettle
     formData.OrderQty = qtyStep.value
-})
+}
+
+watch(() => goodsStore.goodsId, () => goodsChange())
+onMounted(() => goodsChange())
 </script>
 
 <style lang="less">

+ 3 - 1
src/packages/pc/views/footer/goods/order/index.vue

@@ -58,7 +58,9 @@ const { loading, run, runAsync } = useRequest(queryTradeOrderDetail, {
     }
 })
 
-const { componentRef, componentId, openComponent, closeComponent } = useComponent()
+const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
+    run()
+})
 
 const { rowKey, expandKeys, selectedRow, rowClick } = useComposeTable<Model.TradeOrderDetailRsp>({ rowKey: 'orderid' })
 

+ 1 - 1
src/packages/pc/views/footer/goods/position/components/delivery/index.vue

@@ -21,7 +21,7 @@
                 <span>{{ selectedRow.enableqty }}</span>
             </el-form-item>
             <el-form-item label="持仓均价">
-                <span>{{ formatDecimal(selectedRow.averageprice) }}</span>
+                <span>{{ formatDecimal(selectedRow.averageprice, selectedRow.decimalplace) }}</span>
             </el-form-item>
             <el-form-item label="对手方">
                 <span>{{ selectedRow.matchname }}</span>

+ 1 - 1
src/packages/pc/views/footer/goods/position/components/transfer/index.vue

@@ -22,7 +22,7 @@
                 <span>{{ selectedRow.enableqty }}</span>
             </el-form-item>
             <el-form-item label="持仓均价">
-                <span>{{ formatDecimal(selectedRow.averageprice) }}</span>
+                <span>{{ formatDecimal(selectedRow.averageprice, selectedRow.decimalplace) }}</span>
             </el-form-item>
             <el-form-item label="参考损益">
                 <span :class="handlePriceColor(closepl)">{{ formatDecimal(closepl) }}</span>

+ 22 - 20
src/packages/sbyj/views/order/detail/index.vue

@@ -5,33 +5,33 @@
             <template #header>
                 <app-navbar title="订单详情" @back="closed" />
             </template>
-            <div class="order-detail__container g-form__container">
+            <div class="order-detail__container g-form__container" v-if="detail">
                 <CellGroup inset>
-                    <Cell :title="selectedRow.tHDetailEx.buyOrSell === BuyOrSell.Buy ? '买料订单' : '卖料订单'"
-                        :value="selectedRow.tHDetailEx.tradeID" />
-                    <Cell title="商品代码/名称" :value="selectedRow.goodsCode + '/' + selectedRow.goodsName" />
+                    <Cell :title="detail.tHDetailEx.buyOrSell === BuyOrSell.Buy ? '买料订单' : '卖料订单'"
+                        :value="detail.tHDetailEx.tradeID" />
+                    <Cell title="商品代码/名称" :value="detail.goodsCode + '/' + detail.goodsName" />
                     <Cell title="订单重量"
-                        :value="(selectedRow.tHDetailEx.holderQty * selectedRow.agreeUnit) + getGoodsUnitName(selectedRow.goodsUnitID)" />
+                        :value="(detail.tHDetailEx.holderQty * detail.agreeUnit) + getGoodsUnitName(detail.goodsUnitID)" />
                     <Cell title="可用数量"
-                        :value="((selectedRow.tHDetailEx.holderQty - selectedRow.tHDetailEx.freezeQty) * selectedRow.agreeUnit) + getGoodsUnitName(selectedRow.goodsUnitID)" />
-                    <Cell title="订单价格" :value="selectedRow.tHDetailEx.holderPrice" />
-                    <Cell title="已付定金" :value="selectedRow.tHDetailEx.payedDeposit" />
-                    <Cell title="已补定金" :value="selectedRow.tHDetailEx.restockDeposit" />
-                    <Cell title="订单天数" :value="selectedRow.tHDetailEx.holdDays" />
-                    <Cell title="滞纳金" :value="selectedRow.tHDetailEx.callAteFee" />
+                        :value="((detail.tHDetailEx.holderQty - detail.tHDetailEx.freezeQty) * detail.agreeUnit) + getGoodsUnitName(detail.goodsUnitID)" />
+                    <Cell title="订单价格" :value="detail.tHDetailEx.holderPrice" />
+                    <Cell title="已付定金" :value="detail.tHDetailEx.payedDeposit" />
+                    <Cell title="已补定金" :value="detail.tHDetailEx.restockDeposit" />
+                    <Cell title="订单天数" :value="detail.tHDetailEx.holdDays" />
+                    <Cell title="滞纳金" :value="detail.tHDetailEx.callAteFee" />
                     <Cell title="定金率">
                         <template #value>
-                            <span :class="selectedRow.tHDetailEx.depositRate <= 0.4 ? 'g-price-up' : ''">
-                                {{ parsePercent(selectedRow.tHDetailEx.depositRate) }}
+                            <span :class="detail.tHDetailEx.depositRate <= 0.4 ? 'g-price-up' : ''">
+                                {{ parsePercent(detail.tHDetailEx.depositRate) }}
                             </span>
                         </template>
                     </Cell>
                     <Cell title="冻结重量"
-                        :value="(selectedRow.tHDetailEx.freezeQty * selectedRow.agreeUnit) + getGoodsUnitName(selectedRow.goodsUnitID)" />
+                        :value="(detail.tHDetailEx.freezeQty * detail.agreeUnit) + getGoodsUnitName(detail.goodsUnitID)" />
                     <Cell title="交收重量"
-                        :value="(selectedRow.tHDetailEx.deliveryQty * selectedRow.agreeUnit) + getGoodsUnitName(selectedRow.goodsUnitID)" />
+                        :value="(detail.tHDetailEx.deliveryQty * detail.agreeUnit) + getGoodsUnitName(detail.goodsUnitID)" />
                     <Cell title="订单时间"
-                        :value="(selectedRow.tHDetailEx.deliveryQty * selectedRow.agreeUnit) + getGoodsUnitName(selectedRow.goodsUnitID)" />
+                        :value="(detail.tHDetailEx.deliveryQty * detail.agreeUnit) + getGoodsUnitName(detail.goodsUnitID)" />
                 </CellGroup>
             </div>
         </app-view>
@@ -44,18 +44,20 @@ import { CellGroup, Cell } from 'vant'
 import { parsePercent } from '@/filters'
 import { BuyOrSell } from '@/constants/order'
 import AppModal from '@/components/base/modal/index.vue'
+import { useSBYJOrder } from '@/business/order'
 import { getGoodsUnitName } from '@/constants/unit'
 
-const showModal = shallowRef(true)
-const refresh = shallowRef(false) // 是否刷新父组件数据
-
-defineProps({
+const props = defineProps({
     selectedRow: {
         type: Object as PropType<Model.SBYJMyOrderRsp>,
         required: true,
     }
 })
 
+const { detail } = useSBYJOrder(props.selectedRow)
+const showModal = shallowRef(true)
+const refresh = shallowRef(false) // 是否刷新父组件数据
+
 // 关闭弹窗
 const closed = (isRefresh = false) => {
     refresh.value = isRefresh

+ 7 - 13
src/packages/sbyj/views/order/list/index.vue

@@ -3,10 +3,9 @@
         <template #header>
             <app-navbar title="我的订单" />
         </template>
-        <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error" v-model:pageIndex="pageIndex"
-            :page-count="pageCount" @refresh="run">
+        <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error" @refresh="getSBYJMyOrders">
             <div class="g-order-list">
-                <div class="g-order-list__box" v-for="(item, index) in dataList" :key="index">
+                <div class="g-order-list__box" v-for="(item, index) in orderComputedList" :key="index">
                     <div class="g-order-list__titlebar">
                         <div class="left">
                             <h4>
@@ -77,14 +76,13 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, defineAsyncComponent } from 'vue'
+import { onMounted, shallowRef, defineAsyncComponent } from 'vue'
 import { BuyOrSell } from '@/constants/order'
 import { formatDecimal, parsePercent, handleNumberValue } from '@/filters'
 import { getGoodsUnitName } from '@/constants/unit'
 import { useComponent } from '@/hooks/component'
-import { useRequest } from '@/hooks/request'
-import { querySBYJMyOrders } from '@/services/api/order'
 import { Button } from 'vant'
+import { useSBYJOrder } from '@/business/order'
 import AppPullRefresh from '../../../components/base/pull-refresh/index.vue'
 
 const componentMap = new Map<string, unknown>([
@@ -94,19 +92,15 @@ const componentMap = new Map<string, unknown>([
     ['closeholder', defineAsyncComponent(() => import('./components/close-holder/index.vue'))], // 转让
 ])
 
-const error = shallowRef(false)
+const { getSBYJMyOrders, orderComputedList, loading, error } = useSBYJOrder()
 const selectedRow = shallowRef<Model.SBYJMyOrderRsp>()
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent()
 
-const { dataList, loading, pageIndex, pageCount, run } = useRequest(querySBYJMyOrders, {
-    onError: () => {
-        error.value = true
-    }
-})
-
 const showComponent = (componentName: string, row: Model.SBYJMyOrderRsp) => {
     selectedRow.value = row
     openComponent(componentName)
 }
+
+onMounted(() => getSBYJMyOrders())
 </script>