|
|
@@ -1,63 +1,79 @@
|
|
|
<!-- 商品订单-合约汇总-交收 -->
|
|
|
<template>
|
|
|
- <app-drawer title="交收" :width="600" v-model:show="show" :loading="loading" :refresh="refresh">
|
|
|
- <div>
|
|
|
+ <app-drawer class="app-delivery" title="交收" :width="600" v-model:show="show" :loading="loading" :refresh="refresh">
|
|
|
+ <div class="app-delivery__header">
|
|
|
<span>持仓数量:{{ selectedRow.curpositionqty }}</span>
|
|
|
<span>可用数量:{{ selectedRow.enableqty }}</span>
|
|
|
</div>
|
|
|
- <table class="table-form" cellspacing="0" cellpadding="0" border="1" style="width: 100%;text-align: center;">
|
|
|
- <tr>
|
|
|
- <th>持有人/商品/仓库</th>
|
|
|
- <th>升贴水</th>
|
|
|
- <th>数量</th>
|
|
|
- <th>选择数量</th>
|
|
|
- </tr>
|
|
|
- <template v-for="(item, index) in dataList" :key="index">
|
|
|
- <tr>
|
|
|
- <td colspan="4">{{ item.username }}</td>
|
|
|
- </tr>
|
|
|
- <tr>
|
|
|
- <td>{{ item.wrstandardname }}</td>
|
|
|
- <td rowspan="2">{{ item.pricemove }}</td>
|
|
|
- <td rowspan="2">{{ item.avalidqty }}</td>
|
|
|
- <td rowspan="2">
|
|
|
- <el-input-number placeholder="请输入" v-model="item.deliveryLot" :precision="0" :max="item.avalidqty"
|
|
|
- :min="0" />
|
|
|
- </td>
|
|
|
- </tr>
|
|
|
- <tr>
|
|
|
- <td>{{ item.warehousename }}</td>
|
|
|
- </tr>
|
|
|
- <tr v-if="(dataList.length - 1) > index">
|
|
|
- <td colspan="4"></td>
|
|
|
- </tr>
|
|
|
- </template>
|
|
|
- </table>
|
|
|
- <div>
|
|
|
- <span>已点选数量:{{ totalQty }}</span>
|
|
|
- </div>
|
|
|
- <div>
|
|
|
- <span>点选合约:{{ selectedRow.goodscode }}</span>
|
|
|
- </div>
|
|
|
- <div>
|
|
|
- <span :class="selectedRow.lastColor">现价:{{ selectedRow.lastprice }}</span>
|
|
|
+ <div class="app-delivery__form el-form--vertical">
|
|
|
+ <table cellspacing="0" cellpadding="0">
|
|
|
+ <thead>
|
|
|
+ <tr>
|
|
|
+ <th>持有人/商品/仓库</th>
|
|
|
+ <th>升贴水</th>
|
|
|
+ <th>数量</th>
|
|
|
+ <th>交收数量</th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <template v-for="(item, index) in dataList" :key="index">
|
|
|
+ <tbody>
|
|
|
+ <tr>
|
|
|
+ <td colspan="4">
|
|
|
+ <span>{{ item.username }}</span>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <td>
|
|
|
+ <span>{{ item.wrstandardname }}</span>
|
|
|
+ <span>{{ item.warehousename }}</span>
|
|
|
+ </td>
|
|
|
+ <td>{{ item.pricemove }}</td>
|
|
|
+ <td>{{ item.avalidqty }}</td>
|
|
|
+ <td>
|
|
|
+ <el-input-number placeholder="请输入" v-model="item.deliveryLot" :precision="0"
|
|
|
+ :max="maxQty(index)" :min="0" />
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ <tbody class="spacing" v-if="(dataList.length - 1) > index"></tbody>
|
|
|
+ </template>
|
|
|
+ </table>
|
|
|
</div>
|
|
|
<template #footer>
|
|
|
- <el-button type="info" @click="onCancel(false)">取消</el-button>
|
|
|
- <el-button type="primary" @click="onSubmit">交收</el-button>
|
|
|
+ <ul class="app-delivery__details">
|
|
|
+ <li>
|
|
|
+ <div class="block-left">
|
|
|
+ <span>{{ selectedRow.goodsname }}</span>
|
|
|
+ <span :class="selectedRow.lastColor">{{ selectedRow.lastprice }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="block-right">
|
|
|
+ <span>已点选数量:{{ totalQty }}</span>
|
|
|
+ </div>
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <div class="block-right">
|
|
|
+ <span>升贴水:{{ discount }}</span>
|
|
|
+ </div>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ <div class="app-delivery__btnbar">
|
|
|
+ <el-button type="info" @click="onCancel(false)">取消</el-button>
|
|
|
+ <el-button type="primary" @click="onSubmit">交收</el-button>
|
|
|
+ </div>
|
|
|
</template>
|
|
|
</app-drawer>
|
|
|
</template>
|
|
|
|
|
|
<script lang="ts" setup>
|
|
|
import { ref, PropType, computed } from 'vue'
|
|
|
-import { ElMessage, FormInstance, FormRules } from 'element-plus'
|
|
|
-import { useOfflineDelivery } from '@/business/trade'
|
|
|
-import { useFuturesStore } from '@/stores'
|
|
|
-import { getBuyOrSellName, BuyOrSell } from '@/constants/order'
|
|
|
-import { formatDecimal, handlePriceColor } from '@/filters'
|
|
|
+import { v4 } from 'uuid'
|
|
|
+import { ElMessage } from 'element-plus'
|
|
|
+import { ClientType } from '@/constants/client'
|
|
|
import { useRequest } from '@/hooks/request'
|
|
|
import { queryWrDeliveryAvalidHoldLB } from '@/services/api/transfer'
|
|
|
+import { deliveryOrder } from '@/services/api/trade'
|
|
|
+import { useAccountStore } from '@/stores'
|
|
|
+import moment from 'moment'
|
|
|
import AppDrawer from '@pc/components/base/drawer/index.vue'
|
|
|
|
|
|
const props = defineProps({
|
|
|
@@ -67,13 +83,11 @@ const props = defineProps({
|
|
|
}
|
|
|
})
|
|
|
|
|
|
-const { formSubmit, formData, loading } = useOfflineDelivery()
|
|
|
+const accountStore = useAccountStore()
|
|
|
const show = ref(true)
|
|
|
const refresh = ref(false)
|
|
|
-const formRef = ref<FormInstance>()
|
|
|
-const futuresStore = useFuturesStore()
|
|
|
+const loading = ref(false)
|
|
|
const dataList = ref<(Model.WrDeliveryAvalidHoldLBRsp & { deliveryLot: number })[]>([])
|
|
|
-const quote = futuresStore.getGoodsQuote(props.selectedRow.goodscode)
|
|
|
|
|
|
useRequest(queryWrDeliveryAvalidHoldLB, {
|
|
|
params: {
|
|
|
@@ -90,31 +104,17 @@ useRequest(queryWrDeliveryAvalidHoldLB, {
|
|
|
// 已点选数量
|
|
|
const totalQty = computed(() => dataList.value.reduce((pre, cur) => pre + cur.deliveryLot, 0))
|
|
|
|
|
|
-// 剩余可用点选数量
|
|
|
-const remainQty = computed(() => props.selectedRow.enableqty - totalQty.value)
|
|
|
-
|
|
|
-/// 计算参考损益
|
|
|
-const closepl = computed(() => {
|
|
|
- const { last = 0 } = quote.value ?? {}
|
|
|
- const { curpositionqty, curholderamount, agreeunit, buyorsell } = props.selectedRow
|
|
|
- return (last * curpositionqty * agreeunit - curholderamount) * (buyorsell === BuyOrSell.Buy ? 1 : -1)
|
|
|
+// 升贴水
|
|
|
+const discount = computed(() => {
|
|
|
+ return dataList.value.reduce((pre, cur) => pre + cur.deliveryLot * cur.pricemove, 0)
|
|
|
})
|
|
|
|
|
|
-// 表单验证规则
|
|
|
-const formRules: FormRules = {
|
|
|
- DeliveryLot: [{
|
|
|
- message: '请输入交收数量',
|
|
|
- validator: () => {
|
|
|
- return !!formData.DeliveryLot
|
|
|
- }
|
|
|
- }],
|
|
|
- DeliveryInfo: [{
|
|
|
- required: true,
|
|
|
- message: '请输入交收信息',
|
|
|
- validator: () => {
|
|
|
- return !!formData.DeliveryInfo
|
|
|
- }
|
|
|
- }],
|
|
|
+// 最大交收数量
|
|
|
+const maxQty = (index: number) => {
|
|
|
+ const item = dataList.value[index]
|
|
|
+ const total = dataList.value.reduce((pre, cur, i) => i === index ? pre : pre + cur.deliveryLot, 0) // 计算已点选数量
|
|
|
+ const max = props.selectedRow.enableqty - total
|
|
|
+ return max >= item.avalidqty ? item.avalidqty : max
|
|
|
}
|
|
|
|
|
|
const onCancel = (isRefresh = false) => {
|
|
|
@@ -122,24 +122,49 @@ const onCancel = (isRefresh = false) => {
|
|
|
refresh.value = isRefresh
|
|
|
}
|
|
|
|
|
|
-const onSubmit = () => {
|
|
|
- formRef.value?.validate((valid) => {
|
|
|
- if (valid) {
|
|
|
- const { marketid, goodsid, goodscode, buyorsell } = props.selectedRow
|
|
|
- /// 市场ID
|
|
|
- formData.Header = { MarketID: marketid, GoodsID: goodsid }
|
|
|
- formData.GoodsCode = goodscode
|
|
|
- formData.GoodsID = goodsid
|
|
|
- formData.BuyOrSell = buyorsell
|
|
|
- formSubmit().then(() => {
|
|
|
- ElMessage.success('交收成功')
|
|
|
- onCancel(true)
|
|
|
- }).catch((err) => {
|
|
|
- ElMessage.error('交收失败:' + err)
|
|
|
- })
|
|
|
+const onSubmit = async () => {
|
|
|
+ if (dataList.value.some((e) => e.deliveryLot)) {
|
|
|
+ const errMessage: string[] = []
|
|
|
+ loading.value = true
|
|
|
+ for (let i = 0; i < dataList.value.length; i++) {
|
|
|
+ const e = dataList.value[i]
|
|
|
+ if (e.deliveryLot) {
|
|
|
+ await deliveryOrder({
|
|
|
+ data: {
|
|
|
+ ClientType: ClientType.Web,
|
|
|
+ AccountID: accountStore.currentAccountId,
|
|
|
+ XGoodsID: props.selectedRow.goodsid,
|
|
|
+ DeliveryGoodsID: e.deliverygoodsid,
|
|
|
+ ClientSerialNo: v4(),
|
|
|
+ ClientOrderTime: moment(new Date()).format('YYYY-MM-DD HH:mm:ss'),
|
|
|
+ XQty: e.deliveryLot,
|
|
|
+ DeliveryQty: e.deliveryLot,
|
|
|
+ DeliveryOrderDetail: {
|
|
|
+ AccountID: e.accountid, // 对手方账号
|
|
|
+ Qty: e.deliveryLot, // 点选数量
|
|
|
+ LadingBillID: e.ladingbillid,// 提单ID
|
|
|
+ SubNum: e.subnum, // 提单子单号
|
|
|
+ WRFactorTypeID: e.wrfactortypeid, // 仓单要素类型ID
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }).catch((err) => {
|
|
|
+ errMessage.push(err)
|
|
|
+ })
|
|
|
+ }
|
|
|
}
|
|
|
- })
|
|
|
-
|
|
|
+ loading.value = false
|
|
|
+ if (errMessage.length) {
|
|
|
+ ElMessage.error('部分交收失败:' + errMessage[0])
|
|
|
+ } else {
|
|
|
+ ElMessage.success('提交成功')
|
|
|
+ }
|
|
|
+ onCancel(true)
|
|
|
+ } else {
|
|
|
+ ElMessage.warning('请输入交收数量')
|
|
|
+ }
|
|
|
}
|
|
|
+</script>
|
|
|
|
|
|
-</script>
|
|
|
+<style lang="less">
|
|
|
+@import './index.less';
|
|
|
+</style>
|