|
@@ -1,6 +1,6 @@
|
|
|
-<!-- 挂牌点价-持仓明细-转让 -->
|
|
|
|
|
|
|
+<!-- 挂牌点价-持仓明细-平仓 -->
|
|
|
<template>
|
|
<template>
|
|
|
- <app-drawer :title="t('operation.transfer')" :width="800" v-model:show="show" :loading="loading" :refresh="refresh">
|
|
|
|
|
|
|
+ <app-drawer :title="t('operation.close')" :width="800" v-model:show="show" :loading="loading" :refresh="refresh">
|
|
|
<el-form ref="formRef" class="el-form--horizontal" label-width="120px" :model="formData" :rules="formRules">
|
|
<el-form ref="formRef" class="el-form--horizontal" label-width="120px" :model="formData" :rules="formRules">
|
|
|
<el-form-item :label="t('position.transfer.goodsname')">
|
|
<el-form-item :label="t('position.transfer.goodsname')">
|
|
|
<span>{{ selectedRow.goodscode }}/{{ selectedRow.goodsname }}</span>
|
|
<span>{{ selectedRow.goodscode }}/{{ selectedRow.goodsname }}</span>
|
|
@@ -17,16 +17,26 @@
|
|
|
<el-form-item :label="t('position.transfer.holderprice')">
|
|
<el-form-item :label="t('position.transfer.holderprice')">
|
|
|
<span>{{ formatDecimal(selectedRow.holderprice, selectedRow.decimalplace) }}</span>
|
|
<span>{{ formatDecimal(selectedRow.holderprice, selectedRow.decimalplace) }}</span>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item :label="t('position.transfer.freezeqty')">
|
|
|
|
|
|
|
+ <el-form-item :label="t('position.goods.freezeqty')">
|
|
|
<span>{{ selectedRow.freezeqty }}</span>
|
|
<span>{{ selectedRow.freezeqty }}</span>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
|
|
+ <el-form-item :label="t('position.transfer.enableqty')">
|
|
|
|
|
+ <span>{{ maxQty }}</span>
|
|
|
|
|
+ </el-form-item>
|
|
|
<el-form-item :label="t('position.transfer.closepl')">
|
|
<el-form-item :label="t('position.transfer.closepl')">
|
|
|
<span :class="handlePriceColor(closepl)">{{ formatDecimal(closepl, selectedRow.decimalplace) }}</span>
|
|
<span :class="handlePriceColor(closepl)">{{ formatDecimal(closepl, selectedRow.decimalplace) }}</span>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item :label="t('position.transfer.enableqty')">
|
|
|
|
|
- <span>{{ maxQty }}</span>
|
|
|
|
|
|
|
+ <el-form-item prop="PriceMode" :label="t('quote.pricing.pricemode')">
|
|
|
|
|
+ <el-radio-group v-model="formData.PriceMode">
|
|
|
|
|
+ <el-radio v-for="(item, index) in getPricemode2List()" :key="index" :label="item.value">
|
|
|
|
|
+ {{ item.label }}
|
|
|
|
|
+ </el-radio>
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item prop="MarketMaxSub" :label="t('quote.pricing.marketmaxsub1')" v-if="formData.PriceMode === PriceMode.Market">
|
|
|
|
|
+ <el-input-number ref="priceRef" :placeholder="t('common.pleaseenter')" :min="0" :max="999" v-model="formData.MarketMaxSub" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item prop="OrderPrice" :label="t('position.transfer.transferprice')">
|
|
|
|
|
|
|
+ <el-form-item prop="OrderPrice" :label="t('position.transfer.transferprice')" v-if="formData.PriceMode === PriceMode.Limit">
|
|
|
<el-input-number :placeholder="t('position.transfer.tips3')" v-model="formData.OrderPrice" :step="quote?.decimalvalue"
|
|
<el-input-number :placeholder="t('position.transfer.tips3')" v-model="formData.OrderPrice" :step="quote?.decimalvalue"
|
|
|
:precision="quote?.decimalplace" />
|
|
:precision="quote?.decimalplace" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -34,6 +44,12 @@
|
|
|
<div class="g-qty-group">
|
|
<div class="g-qty-group">
|
|
|
<el-input-number :placeholder="t('position.transfer.tips4')" v-model="formData.OrderQty" :precision="0" :max="maxQty"
|
|
<el-input-number :placeholder="t('position.transfer.tips4')" v-model="formData.OrderQty" :precision="0" :max="maxQty"
|
|
|
:min="0" />
|
|
:min="0" />
|
|
|
|
|
+ <el-radio-group size="small" v-model="qtyStep" @change="onRadioChange">
|
|
|
|
|
+ <el-radio v-for="(value, index) in qtyStepList" :key="index" :label="value" border
|
|
|
|
|
+ style="width: 25%;">
|
|
|
|
|
+ {{ parsePercent(value, 0) }}
|
|
|
|
|
+ </el-radio>
|
|
|
|
|
+ </el-radio-group>
|
|
|
</div>
|
|
</div>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
@@ -48,10 +64,10 @@
|
|
|
import { ref, PropType, computed, onMounted } from 'vue'
|
|
import { ref, PropType, computed, onMounted } from 'vue'
|
|
|
import { ElMessage, FormInstance, FormRules } from 'element-plus'
|
|
import { ElMessage, FormInstance, FormRules } from 'element-plus'
|
|
|
import { useOrder } from '@/business/trade'
|
|
import { useOrder } from '@/business/trade'
|
|
|
-import { formatDecimal, handlePriceColor, handleRequestBigNumber } from '@/filters'
|
|
|
|
|
-import { getBuyOrSellName, BuyOrSell } from '@/constants/order'
|
|
|
|
|
-import { useFuturesStore, usePositionStore, i18n } from '@/stores'
|
|
|
|
|
-import { EBuildType, EDelistingType, EListingSelectType, EPriceMode, EValidType } from '@/constants/client'
|
|
|
|
|
|
|
+import { formatDecimal, handlePriceColor, handleRequestBigNumber, parsePercent } from '@/filters'
|
|
|
|
|
+import { getBuyOrSellName, BuyOrSell, getPricemode2List, PriceMode } from '@/constants/order'
|
|
|
|
|
+import { useFuturesStore, usePositionStore, i18n, useSettingStore } from '@/stores'
|
|
|
|
|
+import { EBuildType, EDelistingType, EListingSelectType, EValidType, EOrderOperateType } from '@/constants/client'
|
|
|
import AppDrawer from '@pc/components/base/drawer/index.vue'
|
|
import AppDrawer from '@pc/components/base/drawer/index.vue'
|
|
|
|
|
|
|
|
const props = defineProps({
|
|
const props = defineProps({
|
|
@@ -63,8 +79,17 @@ const props = defineProps({
|
|
|
|
|
|
|
|
const futuresStore = useFuturesStore()
|
|
const futuresStore = useFuturesStore()
|
|
|
const positionStore = usePositionStore()
|
|
const positionStore = usePositionStore()
|
|
|
|
|
+const settingStore = useSettingStore()
|
|
|
|
|
+// 价格类型
|
|
|
|
|
+const orderPriceType = computed(() => settingStore.getSettingValue('orderPriceType'))
|
|
|
const quote = futuresStore.getGoodsQuote(props.selectedRow.goodscode)
|
|
const quote = futuresStore.getGoodsQuote(props.selectedRow.goodscode)
|
|
|
const { t } = i18n.global
|
|
const { t } = i18n.global
|
|
|
|
|
+const qtyStepList = [0.25, 0.5, 0.75, 1] // 数量步长列表
|
|
|
|
|
+const qtyStep = ref(1) // 数量步长
|
|
|
|
|
+const { formSubmit, formData, loading } = useOrder()
|
|
|
|
|
+const show = ref(true)
|
|
|
|
|
+const refresh = ref(false)
|
|
|
|
|
+const formRef = ref<FormInstance>()
|
|
|
|
|
|
|
|
// 可用数量
|
|
// 可用数量
|
|
|
const maxQty = computed(() => {
|
|
const maxQty = computed(() => {
|
|
@@ -84,11 +109,6 @@ const closepl = computed(() => {
|
|
|
return price ? (marketValue - holderamount) * (buyorsell === BuyOrSell.Buy ? 1 : -1) : 0
|
|
return price ? (marketValue - holderamount) * (buyorsell === BuyOrSell.Buy ? 1 : -1) : 0
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
-const { formSubmit, formData, loading } = useOrder()
|
|
|
|
|
-const show = ref(true)
|
|
|
|
|
-const refresh = ref(false)
|
|
|
|
|
-const formRef = ref<FormInstance>()
|
|
|
|
|
-
|
|
|
|
|
const formRules: FormRules = {
|
|
const formRules: FormRules = {
|
|
|
OrderPrice: [{
|
|
OrderPrice: [{
|
|
|
message: t('position.transfer.tips3'),
|
|
message: t('position.transfer.tips3'),
|
|
@@ -96,6 +116,16 @@ const formRules: FormRules = {
|
|
|
return !!formData.OrderPrice
|
|
return !!formData.OrderPrice
|
|
|
}
|
|
}
|
|
|
}],
|
|
}],
|
|
|
|
|
+ MarketMaxSub: [{
|
|
|
|
|
+ type: 'number',
|
|
|
|
|
+ validator: (rule, value, callback) => {
|
|
|
|
|
+ if (value) {
|
|
|
|
|
+ callback()
|
|
|
|
|
+ } else {
|
|
|
|
|
+ callback(new Error(t('quote.pricing.tips3')))
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }],
|
|
|
OrderQty: [{
|
|
OrderQty: [{
|
|
|
message: t('position.transfer.tips4'),
|
|
message: t('position.transfer.tips4'),
|
|
|
validator: () => {
|
|
validator: () => {
|
|
@@ -109,6 +139,31 @@ const onCancel = (isRefresh = false) => {
|
|
|
refresh.value = isRefresh
|
|
refresh.value = isRefresh
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+const getOrderPrice = () => {
|
|
|
|
|
+ const { last, bid, ask, presettle = 0 } = quote.value ?? {}
|
|
|
|
|
+ const price = last || presettle
|
|
|
|
|
+ // 1=现价,2=对手价,3=实时价,4=实时对手价
|
|
|
|
|
+ switch (orderPriceType.value) {
|
|
|
|
|
+ case 1:
|
|
|
|
|
+ case 3:
|
|
|
|
|
+ return price
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ case 4:
|
|
|
|
|
+ if (formData.BuyOrSell === BuyOrSell.Buy) {
|
|
|
|
|
+ return ask || price
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return bid || price
|
|
|
|
|
+ }
|
|
|
|
|
+ default:
|
|
|
|
|
+ return 0
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const marketPrice = computed(() => {
|
|
|
|
|
+ const { ask = 0, bid = 0 } = quote.value ?? {}
|
|
|
|
|
+ return formData.BuyOrSell === BuyOrSell.Buy ? ask : bid
|
|
|
|
|
+})
|
|
|
|
|
+
|
|
|
const onCloseSumit = () => {
|
|
const onCloseSumit = () => {
|
|
|
formRef.value?.validate((valid) => {
|
|
formRef.value?.validate((valid) => {
|
|
|
if (valid) {
|
|
if (valid) {
|
|
@@ -116,26 +171,34 @@ const onCloseSumit = () => {
|
|
|
/// 市场ID
|
|
/// 市场ID
|
|
|
formData.Header = { MarketID: marketid, GoodsID: goodsid }
|
|
formData.Header = { MarketID: marketid, GoodsID: goodsid }
|
|
|
formData.MarketID = marketid
|
|
formData.MarketID = marketid
|
|
|
- formData.PriceMode = EPriceMode.PRICEMODE_LIMIT
|
|
|
|
|
|
|
+ if (formData.PriceMode === PriceMode.Market) { formData.OrderPrice = marketPrice.value }
|
|
|
formData.BuyOrSell = buyorsell === BuyOrSell.Buy ? BuyOrSell.Sell : BuyOrSell.Buy
|
|
formData.BuyOrSell = buyorsell === BuyOrSell.Buy ? BuyOrSell.Sell : BuyOrSell.Buy
|
|
|
formData.GoodsID = goodsid
|
|
formData.GoodsID = goodsid
|
|
|
formData.ListingSelectType = EListingSelectType.LISTINGSELECTTYPE_DELISTINGTHENLISTING
|
|
formData.ListingSelectType = EListingSelectType.LISTINGSELECTTYPE_DELISTINGTHENLISTING
|
|
|
formData.DelistingType = EDelistingType.DELISTINGTYPE_PRICE
|
|
formData.DelistingType = EDelistingType.DELISTINGTYPE_PRICE
|
|
|
formData.BuildType = EBuildType.BUILDTYPE_CLOSE
|
|
formData.BuildType = EBuildType.BUILDTYPE_CLOSE
|
|
|
formData.TimevalidType = EValidType.VALIDTYPE_DR
|
|
formData.TimevalidType = EValidType.VALIDTYPE_DR
|
|
|
- formData.OperateType = 24
|
|
|
|
|
|
|
+ formData.OperateType = EOrderOperateType.ORDEROPERATETYPE_HOLDER_CLOSE
|
|
|
formData.RelatedID = handleRequestBigNumber(tradeid)
|
|
formData.RelatedID = handleRequestBigNumber(tradeid)
|
|
|
|
|
|
|
|
formSubmit().then(() => {
|
|
formSubmit().then(() => {
|
|
|
- ElMessage.success(t('position.transfer.tips2'))
|
|
|
|
|
|
|
+ if (settingStore.getSettingValue('showOrderSuccessMessage')) {
|
|
|
|
|
+ ElMessage.success(t('position.transfer.tips2'))
|
|
|
|
|
+ }
|
|
|
onCancel(true)
|
|
onCancel(true)
|
|
|
}).catch((err) => {
|
|
}).catch((err) => {
|
|
|
- ElMessage.error(t('common.submitfailure') + err)
|
|
|
|
|
|
|
+ if (settingStore.getSettingValue('showOrderFailMessage')) {
|
|
|
|
|
+ ElMessage.error(t('common.submitfailure') + err)
|
|
|
|
|
+ }
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+const onRadioChange = (value: number) => {
|
|
|
|
|
+ formData.OrderQty = Math.trunc(maxQty.value * value) || 1
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
const { bid, ask, presettle = 0 } = quote.value ?? {}
|
|
const { bid, ask, presettle = 0 } = quote.value ?? {}
|
|
|
switch (props.selectedRow.buyorsell) {
|
|
switch (props.selectedRow.buyorsell) {
|
|
@@ -148,6 +211,9 @@ onMounted(() => {
|
|
|
default:
|
|
default:
|
|
|
formData.OrderPrice = presettle
|
|
formData.OrderPrice = presettle
|
|
|
}
|
|
}
|
|
|
|
|
+ formData.OrderPrice = getOrderPrice()
|
|
|
formData.OrderQty = maxQty.value
|
|
formData.OrderQty = maxQty.value
|
|
|
|
|
+ formData.PriceMode = PriceMode.Market
|
|
|
|
|
+ formData.MarketMaxSub = 100.0
|
|
|
})
|
|
})
|
|
|
</script>
|
|
</script>
|