Handy_Cao 2 年之前
父節點
當前提交
03d2248697

+ 2 - 2
public/config/router.json

@@ -342,7 +342,7 @@
                         "sort": 4,
                         "title": "掉期市场",
                         "code": "market_trade_swap",
-                        "url": "spot",
+                        "url": "swap",
                         "urlType": 1,
                         "component": "views/market/trade/swap/index.vue"
                     },
@@ -351,7 +351,7 @@
                         "sort": 5,
                         "title": "参考行情",
                         "code": "market_trade_market",
-                        "url": "spot",
+                        "url": "market",
                         "urlType": 1,
                         "component": "views/market/trade/market/index.vue"
                     }

+ 50 - 22
src/packages/mobile/views/swap/detail/components/delisting/Index.vue

@@ -24,11 +24,6 @@
                     <span>{{ selectedRow.orderprice }}</span>
                 </template>
             </Field>
-            <Field label="浮动价格" v-if="priceMove === 3">
-                <template #input>
-                    <span>{{ '******' }}</span>
-                </template>
-            </Field>
             <Field label="可摘数量">
                 <template #input>
                     <span>{{ selectedRow.orderqty }}</span>
@@ -37,12 +32,7 @@
             <Field name="OrderQty" :rules="formRules.OrderQty" label="挂牌数量">
                 <template #input>
                     <Stepper v-model="formData.OrderQty" theme="round" button-size="22" :min="0" :step="0.01"
-                        :max="selectedRow.orderqty" :auto-fixed="false" />
-                </template>
-            </Field>
-            <Field name="OrderPrice" v-if="priceMove === 2" :rules="formRules.OrderPrice" label="摘牌价格">
-                <template #input>
-                    <Stepper v-model="formData.OrderPrice" theme="round" button-size="22" :min="0" :auto-fixed="false" />
+                        :max="selectedRow.orderqty" :auto-fixed="false" @change="calculateDelistingAmount"/>
                 </template>
             </Field>
             <Field label="估算金额" v-if="priceMove === 3">
@@ -68,14 +58,15 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, PropType } from 'vue'
+import { shallowRef, PropType, computed } from 'vue'
 import { Form, FormInstance, Button, Field, RadioGroup, Radio, FieldRule, Stepper } from 'vant'
 import { handleRequestBigNumber } from '@/filters'
 import { useAccountStore, useFuturesStore } from '@/stores'
-import { EBuildType, EDelistingType, EListingSelectType, EOrderDirection, EOrderOperateType, EPriceMode, EValidType } from '@/constants/client'
+import { EBuildType, EDelistingType, EListingSelectType, EOrderOperateType, EPriceMode, EValidType } from '@/constants/client'
 import { useOrder } from '@/business/trade'
 import { fullloading, dialog } from '@/utils/vant'
-
+import { useRequest } from '@/hooks/request'
+import { queryTjmdTodayAccountMargin } from '@/services/api/swap'
 import AppPopup from '@mobile/components/base/popup/index.vue'
 
 const accountStore = useAccountStore()
@@ -88,6 +79,10 @@ const amount = shallowRef(0.0)
 const permargin = shallowRef(0.0)
 /// 价格类型
 const priceMove = shallowRef(EPriceMode.PRICEMODE_LIMIT)
+/// 保证金配置
+const margin = shallowRef<Model.TjmdTodayAccountMarginRsp>()
+/// 商品信息
+const goods = computed(() => futuresStore.getGoods(props.selectedRow.goodsid) ) 
 
 const props = defineProps({
     selectedRow: {
@@ -142,24 +137,57 @@ const formRules: { [key in keyof Proto.OrderReq]?: FieldRule[] } = {
     }],
 }
 
+/// 查询交易保证金信息
+useRequest(queryTjmdTodayAccountMargin, {
+    params: {
+        goodsid: props.selectedRow.goodsid.toString(),
+        accountid: accountStore.currentAccountId.toString()
+    },
+    onSuccess: (res) => {
+        /// 数据赋值
+        if (res.data.length != 0) {
+            margin.value = res.data[0]
+            /// 计算摘牌金额
+            calculateDelistingAmount()
+        }
+    }
+})
+
+/// 计算摘牌金额
+const calculateDelistingAmount = () => {
+    /// 如果保证金配置存在的情况下
+    if (margin.value?.infoc) {
+        const { MarginAlgorithm, MarketMarginValue } = margin.value?.infoc
+        const { OrderQty = 0 } = formData
+        const { orderprice } = props.selectedRow
+        const { agreeunit = 0 } = goods.value ?? {}
+        /// 按比例
+        if (MarginAlgorithm === 1) {
+            permargin.value = orderprice*OrderQty*agreeunit*MarketMarginValue
+        } else {
+            permargin.value = OrderQty*MarketMarginValue
+        }
+        amount.value = OrderQty*orderprice*agreeunit
+    }
+}
+
 // 提交挂牌
 const onSubmit = () => {
-    const { goodsid, orderid } = props.selectedRow
+    const { goodsid, orderid, orderprice, buyorsell } = props.selectedRow
+    const { marketid = 0 } = goods.value ?? {}
+
     /// 获取对应的市场ID
-    formData.MarketID = futuresStore.getGoodsMarket(goodsid)
-    formData.PriceMode = priceMove.value
+    formData.MarketID = marketid
+    formData.PriceMode = EPriceMode.PRICEMODE_LIMIT
     formData.RelatedID = handleRequestBigNumber(orderid)
-    formData.BuyOrSell = props.tabIndex === EOrderDirection.BUY ? EOrderDirection.SELL : EOrderDirection.BUY
+    formData.OrderPrice = orderprice
+    formData.BuyOrSell = buyorsell === BuyOrSell.Buy ? BuyOrSell.Sell : BuyOrSell.Buy
     formData.GoodsID = goodsid
-    formData.PriceMode = priceMove.value
     formData.ListingSelectType = EListingSelectType.LISTINGSELECTTYPE_DELISTING
     formData.DelistingType = EDelistingType.DELISTINGTYPE_SELECTED
     formData.BuildType = EBuildType.BUILDTYPE_OPEN
     formData.TimevalidType = EValidType.VALIDTYPE_DR
     formData.OperateType = EOrderOperateType.ORDEROPERATETYPE_NORMAL
-    formData.TriggerType = 0
-    formData.ServiceTime = ""
-    formData.ValidTime = ""
 
     fullloading((hideLoading) => {
         formSubmit().then(() => {

+ 119 - 19
src/packages/mobile/views/swap/detail/components/listing/Index.vue

@@ -21,28 +21,28 @@
             <Field name="OrderPrice" :rules="formRules.OrderPrice" label="挂牌价格" v-if="priceMove === 2">
                 <template #input>
                     <Stepper v-model="formData.OrderPrice" theme="round" button-size="22" :auto-fixed="false"
-                        :step="0.01" />
+                        :step="0.01" @change="calculateListingAmount"/>
                 </template>
             </Field>
             <Field name="MarketMaxSub" :rules="formRules.MarketMaxSub" label="点差" v-if="priceMove === 3">
                 <template #input>
                     <Stepper v-model="formData.MarketMaxSub" theme="round" button-size="22" :auto-fixed="false"
-                        :step="0.01" />
+                        :step="0.01" @change="calculateListingAmount"/>
                 </template>
             </Field>
-            <Field label="估算价格" v-if="priceMove === 3">
+            <Field name="OrderQty" :rules="formRules.OrderQty" label="挂牌数量">
                 <template #input>
-                    <span>0.0</span>
+                    <Stepper v-model="formData.OrderQty" theme="round" button-size="22" :auto-fixed="false" integer @change="calculateListingAmount" />
                 </template>
             </Field>
-            <Field label="参考价格" v-if="priceMove === 2">
+            <Field label="估算价格" v-if="priceMove === 3">
                 <template #input>
-                    <span>0.0</span>
+                    <span>{{ estimateprice.toFixed(goods?.decimalplace) }}</span>
                 </template>
             </Field>
-            <Field name="OrderQty" :rules="formRules.OrderQty" label="挂牌数量">
+            <Field label="参考价格" v-if="priceMove === 2">
                 <template #input>
-                    <Stepper v-model="formData.OrderQty" theme="round" button-size="22" :auto-fixed="false" integer />
+                    <span :class="quote?.lastColor">{{ quote?.last ?? 0.0 }}</span>
                 </template>
             </Field>
             <Field label="挂牌金额" v-if="priceMove === 2">
@@ -73,15 +73,28 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, PropType } from 'vue'
+import { shallowRef, PropType, computed } from 'vue'
 import { Form, FormInstance, Button, FieldRule, Field, Tab, Tabs, Stepper, Radio, RadioGroup } from 'vant'
 import { useOrder } from '@/business/trade'
 import { fullloading, dialog } from '@/utils/vant'
+import { useRequest } from '@/hooks/request'
+import { queryTjmdTodayAccountMargin } from '@/services/api/swap'
+import { queryWrMarketTradeConfig } from '@/services/api/goods'
 import { useAccountStore, useFuturesStore, useUserStore } from '@/stores'
 import { EPriceMode, EListingSelectType, EDelistingType, EBuildType, EValidType, EOrderOperateType } from '@/constants/client'
-
 import AppPopup from '@mobile/components/base/popup/index.vue'
 
+const props = defineProps({
+    item: {
+        type: Object as PropType<Model.QuoteGoodsListRsp>,
+        required: true
+    },
+    tabIndex: {
+        type: Number,
+        required: true
+    }
+})
+
 const accountStore = useAccountStore()
 const futuresStore = useFuturesStore()
 const userStore = useUserStore()
@@ -95,21 +108,108 @@ const permargin = shallowRef(0.0)
 const amount = shallowRef(0.0)
 /// 价格类型
 const priceMove = shallowRef(EPriceMode.PRICEMODE_LIMIT)
+/// 交易下单
 const { formData, formSubmit } = useOrder()
+/// 最大基差范围上限
+const maxBasis = shallowRef(0.0)
+/// 最小基差范围下限
+const minBasis = shallowRef(0.0)
+/// 估算价
+const estimateprice = shallowRef(0.0)
+// 商品盘面
+const quote = futuresStore.getGoodsQuote(props.item.refgoodsid) ?? {}
+/// 保证金参数设置
+const margin = shallowRef<Model.TjmdTodayAccountMarginRsp>()
+/// 商品信息
+const goods = computed(() => futuresStore.getGoods(props.item.goodsid) ) 
+/// 市场交易参数配置
+const config = shallowRef<Model.WrMarketTradeConfigRsp>()
 
-const props = defineProps({
-    item: {
-        type: Object as PropType<Model.QuoteGoodsListRsp>,
-        required: true
+/// 买卖方向
+const buyOrSell = shallowRef(props.tabIndex)
+
+/// 查询交易保证金信息
+useRequest(queryTjmdTodayAccountMargin, {
+    params: {
+        goodsid: props.item.goodsid.toString(),
+        accountid: accountStore.currentAccountId.toString()
     },
-    tabIndex: {
-        type: Number,
-        required: true
+    onSuccess: (res) => {
+        /// 数据赋值
+        if (res.data.length != 0) {
+            margin.value = res.data[0]
+            /// 计算摘牌金额
+            calculateListingAmount()
+        }
     }
 })
 
-/// 买卖方向
-const buyOrSell = shallowRef(props.tabIndex)
+/// 查询市场交易参数配置
+useRequest(queryWrMarketTradeConfig, {
+    params: {
+        marketid: userStore.getMarketId('TRADEMODE_TJMD')
+    },
+    onSuccess: (res) => {
+        /// 数据赋值
+        if (res.data.length != 0) {
+            /// 获取参数
+            config.value = res.data[0]
+            /// 计算基差范围
+            calculateBasis()
+        }
+    }
+})
+
+/// 计算挂牌金额
+const calculateListingAmount = () => {
+    /// 如果保证金配置存在的情况下
+    if (margin.value?.infoc) {
+        if (priceMove.value === 2) { /// 一口价
+            const { MarginAlgorithm, MarketMarginValue } = margin.value?.infoc
+            const { OrderQty = 0, OrderPrice = 0 } = formData
+            const { agreeunit = 0 } = goods.value ?? {}
+            /// 按比例
+            if (MarginAlgorithm === 1) {
+                permargin.value = OrderPrice*OrderQty*agreeunit*MarketMarginValue
+            } else {
+                permargin.value = OrderQty*MarketMarginValue
+            }
+            amount.value = OrderQty*OrderPrice*agreeunit
+        } else {
+            const last = futuresStore.getQuotePrice(props.item.refgoodscode)
+            const basic = formData.MarketMaxSub ?? 0.0
+            /// 浮动估算价价
+            estimateprice.value = basic+last.value
+            const { MarginAlgorithm, MarketMarginValue } = margin.value?.infoc
+            const { OrderQty = 0 } = formData
+            const { agreeunit = 0 } = goods.value ?? {}
+            /// 按比例
+            if (MarginAlgorithm === 1) {
+                permargin.value = estimateprice.value*OrderQty*agreeunit*MarketMarginValue
+            } else {
+                permargin.value = OrderQty*MarketMarginValue
+            }
+            amount.value = OrderQty*estimateprice.value*agreeunit
+        }
+    }
+}
+
+/// 计算基差范围
+const calculateBasis = () => {
+     /// 获取配置
+     if (config.value) {
+        const { basisdownratio, basisupratio} = config.value
+        const { preclose = 0 } = quote.value ?? {}
+        console.log(basisdownratio, basisupratio, preclose)
+         /* 基差范围大小
+           基差价格可以为负或为0
+           基差范围:
+           最大值=基差取值上限百分比*关联期货合约昨收价
+           最小值= -1 * 基差取值下限百分比*关联期货合约昨收价 */
+        maxBasis.value = basisupratio*preclose
+        minBasis.value = -1.0*basisdownratio*preclose
+     }
+}
 
 // 提交挂牌
 const onSubmit = () => {

+ 1 - 1
src/packages/pc/views/market/trade/swap/detail/index.vue

@@ -38,7 +38,7 @@
             </template>
             <Chart class="g-view-detail__container" v-bind="{ goodsCode }" v-if="active" />
             <Order class="g-view-detail__container" v-bind="{ goodsId }" v-else />
-            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+            <component ref="componentRef" v-bind="{ quoteGoods: selectedRow }" :is="componentMap.get(componentId)"
                     @closed="closeComponent" v-if="componentId" />
         </app-view>
     </teleport>

+ 121 - 12
src/packages/pc/views/market/trade/swap/detail/listing/index.vue

@@ -15,15 +15,15 @@
                 </el-radio-group>
             </el-form-item>
             <el-form-item v-if="priceMove === 2" prop="OrderPrice" label="挂牌价格">
-                <el-input-number placeholder="请输入" :min="0" :precision="2" v-model="formData.OrderPrice" />
+                <el-input-number placeholder="请输入" :min="0" :precision="2" v-model="formData.OrderPrice" @change="calculateListingAmount"/>
             </el-form-item>
             <el-form-item v-if="priceMove === 3" prop="MarketMaxSub" label="点差">
-                <el-input-number placeholder="请输入" :min="0" :precision="2" v-model="formData.MarketMaxSub" />
+                <el-input-number placeholder="请输入" :min="minBasis" :maxBasis="maxBasis" :precision="2" v-model="formData.MarketMaxSub" @change="calculateListingAmount" />
             </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" />
+                        v-model="formData.OrderQty" @change="calculateListingAmount" />
                     <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>
@@ -36,12 +36,9 @@
                 <span :class="quote?.lastColor">{{ quote?.last ?? 0.0 }}</span>
             </el-form-item>
             <el-form-item label="估算价格" v-if="priceMove === 3">
-                <span>0.0</span>
+                <span>{{ estimateprice.toFixed(goods?.decimalplace) }}</span>
             </el-form-item>
-            <el-form-item label="挂牌金额" v-if="priceMove === 2">
-                <span>{{ amount.toFixed(2) }}</span>
-            </el-form-item>
-            <el-form-item label="估算金额" v-if="priceMove === 3">
+            <el-form-item :label="priceMove === 2 ? '挂牌金额' : '估算金额'">
                 <span>{{ amount.toFixed(2) }}</span>
             </el-form-item>
             <el-form-item label="履约保证金">
@@ -59,15 +56,18 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, PropType } from 'vue'
+import { shallowRef, PropType, computed } from 'vue'
 import { ElMessage, FormInstance, FormRules, ElMessageBox } from 'element-plus'
 import { EBuildType, EDelistingType, EListingSelectType, EOrderOperateType, EPriceMode, EValidType } from '@/constants/client'
 import { useOrder } from '@/business/trade'
 import { useAccountStore, useFuturesStore, useUserStore } from '@/stores'
+import { useRequest } from '@/hooks/request'
+import { queryTjmdTodayAccountMargin } from '@/services/api/swap'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
+import { queryWrMarketTradeConfig } from '@/services/api/goods'
 
 const props = defineProps({
-    selectedRow: {
+    quoteGoods: {
         type: Object as PropType<Model.QuoteGoodsListRsp>,
         required: true
     }
@@ -83,6 +83,12 @@ const priceMove = shallowRef(EPriceMode.PRICEMODE_LIMIT)
 const amount = shallowRef(0.0)
 /// 履约保证金
 const permargin = shallowRef(0.0)
+/// 最大基差范围上限
+const maxBasis = shallowRef(0.0)
+/// 最小基差范围下限
+const minBasis = shallowRef(0.0)
+/// 估算价
+const estimateprice = shallowRef(0.0)
 
 const { formData, formSubmit, loading } = useOrder()
 const show = shallowRef(true)
@@ -91,8 +97,47 @@ const formRef = shallowRef<FormInstance>()
 const qtyStepList = [1, 5, 10, 20, 30, 50] // 数量步长列表
 const qtyStep = shallowRef(qtyStepList[0]) // 数量步长
 
+
 // 商品盘面
-const quote = futuresStore.getGoodsQuote(props.selectedRow.refgoodsid)
+const quote = futuresStore.getGoodsQuote(props.quoteGoods.refgoodsid) ?? {}
+/// 保证金参数设置
+const margin = shallowRef<Model.TjmdTodayAccountMarginRsp>()
+/// 商品信息
+const goods =  computed(() => futuresStore.getGoods(props.quoteGoods.goodsid) ) 
+/// 市场交易参数配置
+const config = shallowRef<Model.WrMarketTradeConfigRsp>()
+
+/// 查询交易保证金信息
+useRequest(queryTjmdTodayAccountMargin, {
+    params: {
+        goodsid: props.quoteGoods.goodsid.toString(),
+        accountid: accountStore.currentAccountId.toString()
+    },
+    onSuccess: (res) => {
+        /// 数据赋值
+        if (res.data.length != 0) {
+            margin.value = res.data[0]
+            /// 计算摘牌金额
+            calculateListingAmount()
+        }
+    }
+})
+
+/// 查询市场交易参数配置
+useRequest(queryWrMarketTradeConfig, {
+    params: {
+        marketid: userStore.getMarketId('TRADEMODE_TJMD')
+    },
+    onSuccess: (res) => {
+        /// 数据赋值
+        if (res.data.length != 0) {
+            /// 获取参数
+            config.value = res.data[0]
+            /// 计算基差范围
+            calculateBasis()
+        }
+    }
+})
 
 const formRules: FormRules = {
     OrderPrice: [{
@@ -115,10 +160,74 @@ const formRules: FormRules = {
             }
         }
     }],
+    MarketMaxSub: [{
+        required: true,
+        validator: (rule, value, callback) => {
+            if (value) {
+                callback()
+            } else {
+                callback(new Error('请输入基差'))
+            }
+        }
+    }],
 }
 
 const onRadioChange = (value: number) => {
+    /// 设置
     formData.OrderQty = value
+    /// 计算挂牌金额
+    calculateListingAmount()
+}
+
+/// 计算挂牌金额
+const calculateListingAmount = () => {
+    /// 如果保证金配置存在的情况下
+    if (margin.value?.infoc) {
+        if (priceMove.value === 2) { /// 一口价
+            const { MarginAlgorithm, MarketMarginValue } = margin.value?.infoc
+            const { OrderQty = 0, OrderPrice = 0 } = formData
+            const { agreeunit = 0 } = goods.value ?? {}
+            /// 按比例
+            if (MarginAlgorithm === 1) {
+                permargin.value = OrderPrice*OrderQty*agreeunit*MarketMarginValue
+            } else {
+                permargin.value = OrderQty*MarketMarginValue
+            }
+            amount.value = OrderQty*OrderPrice*agreeunit
+        } else {
+            const last = futuresStore.getQuotePrice(props.quoteGoods.refgoodscode)
+            const basic = formData.MarketMaxSub ?? 0.0
+            /// 浮动估算价价
+            estimateprice.value = basic+last.value
+            const { MarginAlgorithm, MarketMarginValue } = margin.value?.infoc
+            const { OrderQty = 0 } = formData
+            const { agreeunit = 0 } = goods.value ?? {}
+            /// 按比例
+            if (MarginAlgorithm === 1) {
+                permargin.value = estimateprice.value*OrderQty*agreeunit*MarketMarginValue
+            } else {
+                permargin.value = OrderQty*MarketMarginValue
+            }
+            amount.value = OrderQty*estimateprice.value*agreeunit
+        }
+    }
+}
+
+/// 计算基差范围
+const calculateBasis = () => {
+     /// 获取配置
+     if (config.value) {
+        const { basisdownratio, basisupratio} = config.value
+        const { preclose = 0 } = quote.value ?? {}
+        console.log(basisdownratio, basisupratio, preclose)
+         /* 基差范围大小
+           基差价格可以为负或为0
+           基差范围:
+           最大值=基差取值上限百分比*关联期货合约昨收价
+           最小值= -1 * 基差取值下限百分比*关联期货合约昨收价 */
+        maxBasis.value = basisupratio*preclose
+        minBasis.value = -1.0*basisdownratio*preclose
+     }
 }
 
 const onCancel = (isRefresh = false) => {
@@ -134,7 +243,7 @@ const onSubmit = () => {
                 '是否立即挂牌?'
             ).then(() => {
                 /// 买卖方向
-                const { goodsid } = props.selectedRow?? {}
+                const { goodsid } = props.quoteGoods?? {}
                 /// 获取对应的市场ID
                 formData.MarketID = futuresStore.getGoodsMarket(goodsid)
                 formData.OrderPrice = priceMove.value === EPriceMode.PRICEMODE_LIMIT ? formData.OrderPrice : 0.0

+ 62 - 30
src/packages/pc/views/market/trade/swap/detail/order/delisting/index.vue

@@ -10,37 +10,17 @@
             </el-form-item>
             <el-form-item label="价格类型" prop="PriceMove">
                 <el-radio-group v-model="priceMove">
-                    <el-radio :label="2">固定价</el-radio>
-                    <el-radio v-if="userStore.userType != 5" :label="3">浮动价</el-radio>
+                    <el-radio :label="2" v-if="selectedRow.pricemode === 2">固定价</el-radio>
+                    <el-radio :label="3" v-if="selectedRow.pricemode === 3">浮动价</el-radio>
                 </el-radio-group>
             </el-form-item>
-            <el-form-item label="当前价格" v-if="priceMove === 2">
-                <span>{{ formatDecimal(selectedRow.orderprice) }}</span>
+            <el-form-item label="挂牌价格">
+                <span>{{ selectedRow.orderprice }}</span>
             </el-form-item>
-            <el-form-item label="浮动价格" v-if="priceMove === 3">
-                <span>{{ '******' }}</span>
-            </el-form-item>
-            <el-form-item v-if="priceMove === 2" prop="OrderPrice" label="摘牌价格">
-                <el-input-number placeholder="请输入" :min="0" :precision="2" v-model="formData.OrderPrice" />
-            </el-form-item>
-            <el-form-item v-if="priceMove === 3" prop="MarketMaxSub" label="点差">
-                <el-input-number placeholder="请输入" :min="0" :precision="2" v-model="formData.MarketMaxSub" />
-            </el-form-item>
-            <el-form-item prop="OrderQty" label="摘牌数量">
-                <div class="g-qty-group">
-                    <el-input-number placeholder="请输入" :min="0" :max="selectedRow.orderqty" :precision="0" :step="qtyStep"
-                        v-model="formData.OrderQty" />
-                    <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>
-                </div>
-            </el-form-item> 
+            
             <el-form-item label="可摘数量">
                 <span>{{ selectedRow.orderqty }}</span>
             </el-form-item>
-            <el-form-item label="参考价格" v-if="priceMove === 2">
-                <span :class="quote?.lastColor">{{ quote?.last ?? 0.0 }}</span>
-            </el-form-item>
             <el-form-item label="估算价格" v-if="priceMove === 3">
                 <span>0.0</span>
             </el-form-item>
@@ -56,6 +36,15 @@
             <el-form-item label="可用资金">
                 <span>{{ accountStore.currentAccount.avaiableMoney?.toFixed(2) }}</span>
             </el-form-item>
+            <el-form-item prop="OrderQty" label="摘牌数量">
+                <div class="g-qty-group">
+                    <el-input-number placeholder="请输入" :disabled="userStore.userType === 5" :min="0" :max="selectedRow.orderqty" :precision="0" :step="qtyStep"
+                        v-model="formData.OrderQty" />
+                    <el-radio-group size="small" v-model="qtyStep" @change="onRadioChange" v-if="userStore.userType === 5">
+                        <el-radio v-for="(value, index) in qtyStepList" :key="index" :label="value" border />
+                    </el-radio-group>
+                </div>
+            </el-form-item> 
         </el-form>
         <template #footer>
             <el-button type="info" @click="onCancel(false)">取消</el-button>
@@ -68,11 +57,12 @@
 <script lang="ts" setup>
 import { shallowRef, PropType, computed } from 'vue'
 import { ElMessage, FormInstance, FormRules, ElMessageBox } from 'element-plus'
-import { formatDecimal, handleRequestBigNumber } from '@/filters'
+import { handleRequestBigNumber } from '@/filters'
 import { EBuildType, EDelistingType, EListingSelectType, EOrderOperateType, EPriceMode, EValidType } from '@/constants/client'
 import { BuyOrSell } from '@/constants/order'
 import { useOrder } from '@/business/trade'
-import { usePosition } from '@/business/position'
+import { useRequest } from '@/hooks/request'
+import { queryTjmdTodayAccountMargin } from '@/services/api/swap'
 import { useFuturesStore, useAccountStore, useUserStore } from '@/stores'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 
@@ -80,12 +70,17 @@ const props = defineProps({
     selectedRow: {
         type: Object as PropType<Model.TjmdTradeOrderDetailRsp>,
         required: true
+    },
+    quoteGoods: {
+        type: Object as PropType<Model.QuoteGoodsListRsp>,
+        required: false
     }
 })
 
 const accountStore = useAccountStore()
 const userStore = useUserStore()
 
+
 /// 价格类型
 const priceMove = shallowRef(EPriceMode.PRICEMODE_LIMIT)
 /// 挂牌金额
@@ -100,9 +95,44 @@ const refresh = shallowRef(false)
 const formRef = shallowRef<FormInstance>()
 const qtyStepList = [1, 5, 10, 20, 30, 50] // 数量步长列表
 const qtyStep = shallowRef(qtyStepList[0]) // 数量步长
+/// 保证金配置
+const margin = shallowRef<Model.TjmdTodayAccountMarginRsp>()
+/// 商品信息
+const goods = computed(() => futuresStore.getGoods(props.selectedRow.goodsid) ) 
 
-// 商品盘面
-const quote = futuresStore.getGoodsQuote(props.selectedRow.goodsid)
+/// 查询交易保证金信息
+useRequest(queryTjmdTodayAccountMargin, {
+    params: {
+        goodsid: props.selectedRow.goodsid.toString(),
+        accountid: accountStore.currentAccountId.toString()
+    },
+    onSuccess: (res) => {
+        /// 数据赋值
+        if (res.data.length != 0) {
+            margin.value = res.data[0]
+            /// 计算摘牌金额
+            calculateDelistingAmount()
+        }
+    }
+})
+
+/// 计算摘牌金额
+const calculateDelistingAmount = () => {
+    /// 如果保证金配置存在的情况下
+    if (margin.value?.infoc) {
+        const { MarginAlgorithm, MarketMarginValue } = margin.value?.infoc
+        const { OrderQty = 0 } = formData
+        const { orderprice } = props.selectedRow
+        const { agreeunit = 0 } = goods.value ?? {}
+        /// 按比例
+        if (MarginAlgorithm === 1) {
+            permargin.value = orderprice*OrderQty*agreeunit*MarketMarginValue
+        } else {
+            permargin.value = OrderQty*MarketMarginValue
+        }
+        amount.value = OrderQty*orderprice*agreeunit
+    }
+}
 
 const formRules: FormRules = {
     OrderQty: [{
@@ -119,6 +149,8 @@ const formRules: FormRules = {
 
 const onRadioChange = (value: number) => {
     formData.OrderQty = value
+    /// 计算挂牌金额
+    calculateDelistingAmount()
 }
 
 const onCancel = (isRefresh = false) => {
@@ -134,7 +166,7 @@ const onSubmit = (buildType: number) => {
                 '是否立即摘牌?'
             ).then(() => {
                 const { goodsid, orderid, orderprice, buyorsell } = props.selectedRow
-                const { marketid = 0 } = quote.value ?? {}
+                const { marketid = 0 } = goods.value ?? {}
 
                 /// 获取对应的市场ID
                 formData.MarketID = marketid

+ 6 - 2
src/packages/pc/views/market/trade/swap/detail/order/index.vue

@@ -21,13 +21,13 @@
                 </div>
             </template>
         </app-table>
-        <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)" @closed="closeComponent"
+        <component ref="componentRef" v-bind="{ selectedRow, quoteGoods }" :is="componentMap.get(componentId)" @closed="closeComponent"
             v-if="componentId" />
     </div>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, defineAsyncComponent, watch } from 'vue'
+import { shallowRef, defineAsyncComponent, watch, PropType } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { BuyOrSell } from '@/constants/order'
 import { useComponent } from '@/hooks/component'
@@ -41,6 +41,10 @@ const props = defineProps({
         type: Number,
         required: true
     },
+    quoteGoods: {
+        type: Object as PropType<Model.QuoteGoodsListRsp>,
+        required: false
+    }
 })
 
 const componentMap = new Map<string, unknown>([

+ 1 - 3
src/packages/pc/views/market/trade/swap/index.vue

@@ -36,14 +36,13 @@
 import { shallowRef, onUnmounted, defineAsyncComponent, computed } from 'vue'
 import { useComponent } from '@/hooks/component'
 import { parsePercent, handleNumberValue, formatDecimal } from '@/filters'
-import { useFuturesStore, useGlobalStore, useUserStore } from '@/stores'
+import { useFuturesStore, useUserStore } from '@/stores'
 import { useRequest } from '@/hooks/request'
 import { queryQuoteGoodsList } from '@/services/api/swap'
 import quoteSocket from '@/services/websocket/quote'
 import AppTable from '@pc/components/base/table/index.vue'
 
 const subscribe = quoteSocket.createSubscribe()
-const globalStore = useGlobalStore()
 const { onResponse } = useFuturesStore()
 const futuresStore = useFuturesStore()
 const userStore = useUserStore()
@@ -116,7 +115,6 @@ onResponse(() => {
 })
 
 onUnmounted(() => {
-    globalStore.showGoodsListing = false
     subscribe.stop()
 })
 

+ 17 - 1
src/stores/modules/futures.ts

@@ -142,7 +142,16 @@ export const useFuturesStore = defineStore(() => {
     const getQuotePrice = (goodsCode: string) => {
         return computed(() => {
             const quote = getGoodsQuote(goodsCode)
-            return quote.value?.last ?? 0
+            const { last = 0, presettle = 0, preclose = 0 } = quote.value ?? {}
+            if (last != 0.0) {
+                return last
+            } else if (presettle != 0.0) {
+                return presettle
+            } else if ( preclose != 0.0) {
+                return preclose
+            } else {
+                return 0.0
+            }
         })
     }
 
@@ -152,6 +161,12 @@ export const useFuturesStore = defineStore(() => {
         return quote?.goodsname ?? ''
     }
 
+    // 获取对应的商品
+    const getGoods = (code: string | number) => {
+        const goods = state.goodsList.find((e) => e.goodscode === code || e.goodsid === code)
+        return goods
+    }
+
     // 获取商品市场ID
     const getGoodsMarket = (code: string | number) => {
         const quote = state.goodsList.find((e) => e.goodscode === code || e.goodsid === code)
@@ -431,5 +446,6 @@ export const useFuturesStore = defineStore(() => {
         updateGoodsQuote,
         quoteWatch,
         quotePushNotify,
+        getGoods
     }
 })