li.shaoyi 2 gadi atpakaļ
vecāks
revīzija
4d113acf8c

+ 2 - 2
src/filters/index.ts

@@ -14,7 +14,7 @@ export function getUrl(url: string, base?: string) {
 }
 
 // 获取商品首图
-export function getFirstImage(url: string){
+export function getFirstImage(url: string) {
     const images = url.split(',').map((path) => getFileUrl(path))
     return images[0] ?? ''
 }
@@ -186,7 +186,7 @@ export function formatAmount(value: number, decimal = 2) {
  */
 export function formatDate(value?: string, format = 'YYYY-MM-DD HH:mm:ss') {
     if (value) {
-        return moment.parseZone(value).format(format)
+        return moment(value).format(format)
     }
     return handleNoneValue()
 }

+ 89 - 0
src/packages/pc/views/footer/goods/position/components/delivery16/index.less

@@ -0,0 +1,89 @@
+.app-delivery {
+    &__header {
+        border-bottom: 1px solid #162738;
+        padding-bottom: 10px;
+
+        span {
+            &:not(:first-child) {
+                margin-left: 20px;
+            }
+        }
+    }
+
+    &__form {
+        table {
+            width: 100%;
+            text-align: center;
+            border-collapse: collapse;
+
+            thead {
+                height: 36px;
+                color: #7A8A94;
+
+                th {
+                    font-weight: normal;
+                }
+            }
+
+            tbody {
+                background-color: #102442;
+
+                &.spacing {
+                    height: 10px;
+                    background-color: transparent;
+                }
+
+                tr {
+                    td {
+                        padding: 10px 12px;
+
+                        span {
+                            display: block;
+                        }
+                    }
+
+                    &:first-child {
+                        td {
+                            padding: 0 12px;
+
+                            span {
+                                border-bottom: 1px solid #122D55;
+                                padding: 8px 0;
+                            }
+                        }
+                    }
+                }
+            }
+
+            tr {
+
+                td,
+                th {
+                    &:first-child {
+                        text-align: left;
+                    }
+                }
+            }
+        }
+    }
+
+    &__details {
+        background-color: #162738;
+        padding: 6px;
+        margin-bottom: 20px;
+
+        li {
+            display: flex;
+            justify-content: space-between;
+            padding: 6px;
+
+            span:not(:first-child) {
+                margin-left: 10px;
+            }
+
+            .block-right {
+                margin-left: auto;
+            }
+        }
+    }
+}

+ 115 - 90
src/packages/pc/views/footer/goods/position/components/delivery16/index.vue

@@ -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>