Handy_Cao 2 år sedan
förälder
incheckning
0d29c9880c

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

@@ -0,0 +1,115 @@
+<!-- 商品订单-合约汇总-交收 -->
+<template>
+    <app-drawer title="交收" width="80%" 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-item label="商品代码/名称">
+                <span>{{ selectedRow.goodscode }}/{{ selectedRow.goodsname }}</span>
+            </el-form-item>
+            <el-form-item label="持仓方向" >
+                <span>{{ getBuyOrSellName(selectedRow.buyorsell) }}</span>
+            </el-form-item>
+            <el-form-item label="持仓金额">
+                <span>{{ formatDecimal(selectedRow.curholderamount) }}</span>
+            </el-form-item>
+            <el-form-item label="持仓数量">
+                <span>{{ formatDecimal(selectedRow.curpositionqty) }}</span>
+            </el-form-item>
+            <el-form-item label="冻结数量">
+                <span>{{ formatDecimal(selectedRow.frozenqty) }}</span>
+            </el-form-item>
+            <el-form-item label="可用数量">
+                <span>{{ formatDecimal(selectedRow.enableqty) }}</span>
+            </el-form-item>
+            <el-form-item label="持仓均价">
+                <span>{{ formatDecimal(selectedRow.averageprice) }}</span>
+            </el-form-item>
+            <el-form-item label="对手方">
+                <span>{{ selectedRow.matchname }}</span>
+            </el-form-item>
+            <el-form-item label="参考损益">
+                <template #value>
+                    <span :class="closepl ? 'g-price-up' : 'g-price-down'">{{ formatDecimal(closepl) }}</span>
+                </template>
+            </el-form-item>
+            <el-form-item prop="DeliveryLot" label="交收数量">
+                <el-input-number placeholder="请输入数量" v-model="formData.DeliveryLot" :max="selectedRow.enableqty" min="0" />
+            </el-form-item>
+            <el-form-item prop="DeliveryInfo" label="交收信息">
+                <el-input placeholder="请输入交收信息" v-model="formData.DeliveryInfo" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button type="info" @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">交收</el-button>
+        </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 } from '@/filters'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Model.TradePositionRsp>,
+        required: true,
+    }
+})
+
+const { formSubmit, formData, loading } = useOfflineDelivery()
+const show = ref(true)
+const refresh = ref(false)
+const formRef = ref<FormInstance>()
+const futuresStore = useFuturesStore()
+const quote = futuresStore.getQuoteInfo(props.selectedRow.goodscode)
+
+/// 计算参考损益
+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 formRules: FormRules = {
+    DeliveryLot: [{
+        message: '请输入交收数量',
+        validator: () => {
+            return !!formData.DeliveryLot
+        }
+    }],
+    DeliveryInfo: [{
+        required: true,
+        message: '请输入交收信息',
+        validator: () => {
+            return !!formData.DeliveryInfo
+        }
+    }],
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    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)
+    })
+}
+
+</script>

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

@@ -0,0 +1,132 @@
+<!-- 商品订单-合约汇总-转让 -->
+<template>
+    <app-drawer title="转让" width="80%" v-model:show="show" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="120px" label-position="left" :model="formData"
+            :rules="formRules">
+            <el-form-item label="商品代码/名称">
+                <span>{{ selectedRow.goodscode }}/{{ selectedRow.goodsname }}</span>
+            </el-form-item>
+            <el-form-item label="持仓方向" >
+                <span>{{ getBuyOrSellName(selectedRow.buyorsell) }}</span>
+            </el-form-item>
+            <el-form-item label="持仓金额">
+                <span>{{ formatDecimal(selectedRow.curholderamount) }}</span>
+            </el-form-item>
+            <el-form-item label="持仓数量">
+                <span>{{ formatDecimal(selectedRow.curpositionqty) }}</span>
+            </el-form-item>
+            <el-form-item label="冻结数量">
+                <span>{{ formatDecimal(selectedRow.frozenqty) }}</span>
+            </el-form-item>
+            <el-form-item label="可用数量">
+                <span>{{ formatDecimal(selectedRow.enableqty) }}</span>
+            </el-form-item>
+            <el-form-item label="持仓均价">
+                <span>{{ formatDecimal(selectedRow.averageprice) }}</span>
+            </el-form-item>
+            <el-form-item label="参考损益">
+                <template #value>
+                    <span :class="closepl ? 'g-price-up' : 'g-price-down'">{{ formatDecimal(closepl) }}</span>
+                </template>
+            </el-form-item>
+            <el-form-item prop="OrderQty" label="转让数量">
+                <el-input-number placeholder="请输入数量" v-model="formData.OrderQty" :max="selectedRow.enableqty" min="0" />
+            </el-form-item>
+            <el-form-item prop="OrderPrice" label="转让价格">
+                <el-input-number placeholder="请输入价格" v-model="formData.OrderPrice" :decimal-length="selectedRow.decimalplace" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button type="primary" @click="onCloseSumit">提交</el-button>
+            <el-button type="danger" @click="onCancel(false)">取消</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref, PropType, computed, onMounted } from 'vue'
+import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { useOrder } from '@/business/trade'
+import { formatDecimal } from '@/filters'
+import { getBuyOrSellName, BuyOrSell } from '@/constants/order'
+import { useFuturesStore } from '@/stores'
+import { EBuildType, EDelistingType, EListingSelectType, EOrderOperateType, EPriceMode, EValidType } from '@/constants/client'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Model.TradePositionRsp>,
+        required: true
+    }
+})
+
+const futuresStore = useFuturesStore()
+const quote = futuresStore.getQuoteInfo(props.selectedRow.goodscode)
+// 损益
+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 { formSubmit, formData, loading } = useOrder()
+const show = ref(true)
+const refresh = ref(false)
+const formRef = ref<FormInstance>()
+
+const formRules: FormRules = {
+    OrderPrice: [{
+        message: '请输入转让价格',
+        validator: () => {
+            return !!formData.OrderPrice
+        }
+    }],
+    OrderQty: [{
+        message: '请输入转让数量',
+        validator: () => {
+            return !!formData.OrderQty
+        }
+    }],
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onCloseSumit = () => {
+    const { marketid, goodsid, buyorsell } = props.selectedRow
+        /// 市场ID
+        formData.Header = { GoodsID: goodsid }
+        formData.MarketID = marketid
+        formData.PriceMode = EPriceMode.PRICEMODE_LIMIT
+        formData.BuyOrSell = buyorsell === BuyOrSell.Buy ? BuyOrSell.Sell : BuyOrSell.Buy
+        formData.GoodsID = goodsid
+        formData.ListingSelectType = EListingSelectType.LISTINGSELECTTYPE_DELISTINGTHENLISTING
+        formData.DelistingType = EDelistingType.DELISTINGTYPE_PRICE
+        formData.BuildType = EBuildType.BUILDTYPE_CLOSE
+        formData.TimevalidType = EValidType.VALIDTYPE_DR
+        formData.OperateType = EOrderOperateType.ORDEROPERATETYPE_NORMAL
+
+        formSubmit().then(() => {
+            ElMessage.success('挂牌成功')
+            onCancel(true)
+        }).catch((err) => {
+            ElMessage.error('挂牌失败:' + err)
+        })
+}
+
+onMounted(() => {
+    const { bid, ask, presettle = 0 } = quote.value ?? {}
+    switch (props.selectedRow.buyorsell) {
+        case BuyOrSell.Buy:
+            formData.OrderPrice = ask || presettle
+            break
+        case BuyOrSell.Sell:
+            formData.OrderPrice = bid || presettle
+            break
+        default:
+            formData.OrderPrice = presettle
+    }
+})
+</script>

+ 4 - 2
src/packages/pc/views/footer/goods/position/index.vue

@@ -7,8 +7,10 @@
         </template>
          <!-- 展开行 -->
          <template #expand>
-            <el-button type="primary" @click="openComponent('delivery')">交收</el-button>
-            <el-button type="primary" @click="openComponent('transfer')">转让</el-button>
+            <div class="buttonbar">
+                <el-button type="primary" size="small" @click="openComponent('delivery')">交收</el-button>
+                <el-button type="danger" size="small" @click="openComponent('transfer')">转让</el-button>
+            </div>
         </template>
     </app-table>
     <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)" @closed="closeComponent"

+ 2 - 1
src/packages/pc/views/footer/spot/order/index.vue

@@ -50,7 +50,8 @@ const { loading, dataList, run } = useRequest(queryWrOrderDetail, {
     params: {
         wrtradetype: 1,
         marketid: 17201,
-        haswr: 1
+        haswr: 1,
+        bcancel: 1
     },
 })
 

+ 5 - 5
src/packages/pc/views/footer/spot/position/components/listing/index.vue

@@ -4,19 +4,19 @@
         <el-form ref="formRef" class="el-form--vertical" label-width="120px" label-position="left" :model="formData"
             :rules="formRules">
             <el-form-item label="商品代码/名称">
-                <span>{{selectedRow.wrstandardcode}}/{{ selectedRow.wrstandardname }}</span>
+                <span>{{ selectedRow.wrstandardcode }}/{{ selectedRow.wrstandardname }}</span>
             </el-form-item>
             <el-form-item label="仓库" >
-                <span>{{selectedRow.warehousename}}</span>
+                <span>{{ selectedRow.warehousename }}</span>
             </el-form-item>
             <el-form-item label="库存量">
-                <span>{{selectedRow.qty}}</span>
+                <span>{{ selectedRow.qty }}</span>
             </el-form-item>
             <el-form-item label="冻结量">
-                <span>{{selectedRow.freezerqty}}</span>
+                <span>{{ selectedRow.freezerqty }}</span>
             </el-form-item>
             <el-form-item label="可用量">
-                <span>{{selectedRow.enableqty}}</span>
+                <span>{{ selectedRow.enableqty }}</span>
             </el-form-item>
             <el-form-item prop="OrderQty" label="挂牌数量">
                 <el-input-number placeholder="请输入挂牌数量" v-model="formData.OrderQty" :max="selectedRow.enableqty" min="0" />

+ 175 - 31
src/packages/pc/views/footer/spot/position/components/pickup/index.vue

@@ -1,48 +1,199 @@
 <!-- 现货仓单-现货明细-提货 -->
 <template>
-    <app-drawer title="充值" v-model:show="show" :loading="loading" :refresh="refresh">
-        <el-form ref="formRef" class="el-form--vertical" label-width="100px" label-position="left" :model="formData"
+    <app-drawer title="提货" v-model:show="show" :width="960" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="120px" :model="formData"
             :rules="formRules">
-            <el-form-item prop="Amount" label="充值金额">
-                <el-input-number placeholder="请输入" v-model="formData.Amount" />
+            <el-form-item label="商品代码/名称">
+                <span>{{selectedRow.wrstandardcode}}/{{ selectedRow.wrstandardname }}</span>
             </el-form-item>
-            <el-form-item label="凭证">
-                <app-upload :file-types="['image']" type-message="请选择正确的图片类型" @change="onUploadChange" />
+            <el-form-item label="仓库" >
+                <span>{{selectedRow.warehousename}}</span>
+            </el-form-item>
+            <el-form-item label="库存量">
+                <span>{{selectedRow.qty}}</span>
+            </el-form-item>
+            <el-form-item label="冻结量">
+                <span>{{selectedRow.freezerqty}}</span>
+            </el-form-item>
+            <el-form-item label="可用量">
+                <span>{{selectedRow.enableqty}}</span>
+            </el-form-item>
+            <el-form-item prop="OrderQty" label="提货数量">
+                <el-input-number placeholder="请输入提货数量" v-model="orderQty" :max="selectedRow.enableqty" min="0" />
+            </el-form-item>
+            <el-form-item prop="AppointmentModel" label="提货方式">
+                <el-select v-model="formData.AppointmentModel" :disabled="loading">
+                    <el-option :label="item.label" :value="item.value" v-for="(item, index) in getAppointmentModelOutList()"
+                        :key="index" />
+                </el-select>
+            </el-form-item>
+            <el-form-item prop="ContractName" label="联系人">
+                <div class="el-form-item--col">
+                        <el-input type="textarea" :rows="2" v-model="formData.ContactName" />
+                        <el-dropdown trigger="click" v-if="addressList.length">
+                            <el-icon :size="20" style="cursor: pointer;">
+                                <CirclePlusFilled />
+                            </el-icon>
+                            <template #dropdown>
+                                <el-dropdown-menu>
+                                    <el-dropdown-item v-for="(item, index) in addressList" :key="index"
+                                        @click="addressChange(item)">
+                                        {{ [item.provincename, item.cityname, item.districtname, item.address].join(' ') }}
+                                    </el-dropdown-item>
+                                </el-dropdown-menu>
+                            </template>
+                        </el-dropdown>
+                    </div>
+            </el-form-item>
+            <el-form-item prop="ContactNum" label="联系方式">
+                <el-input placeholder="请输入" v-model="formData.ContactNum" />
+            </el-form-item>
+            <el-form-item prop="Region" class="el-form-item--row" label="收货地区">
+                <app-region class="el-form-item--col" v-model:province="formData.ProvinceID"
+                    v-model:city="formData.CityID" v-model:district="formData.DistrictID" />
+            </el-form-item>
+            <el-form-item class="el-form-item--row" prop="Address" label="收货地址">
+                <el-input placeholder="请输入" v-model="formData.Address" />
+            </el-form-item>
+            <el-form-item prop="AppointmentRemark" class="el-form-item--row" label="发票信息">
+                <div class="el-form-item--col">
+                    <el-input type="textarea" :rows="2" v-model="formData.AppointmentRemark" />
+                    <el-dropdown trigger="click" v-if="invoiceList.length">
+                        <el-icon :size="20" style="cursor: pointer;">
+                            <CirclePlusFilled />
+                        </el-icon>
+                        <template #dropdown>
+                            <el-dropdown-menu>
+                                <el-dropdown-item v-for="(item, index) in invoiceList" :key="index"
+                                    @click="invoiceChange(item)">
+                                    {{ [getReceiptTypeName(item.receipttype), item.username].join(' ') }}
+                                </el-dropdown-item>
+                            </el-dropdown-menu>
+                        </template>
+                    </el-dropdown>
+                </div>
             </el-form-item>
         </el-form>
         <template #footer>
-            <el-button type="primary" @click="formSubmit">提交</el-button>
+            <el-button type="primary" @click="onSubmit">提货</el-button>
             <el-button @click="onCancel(false)" plain>取消</el-button>
         </template>
     </app-drawer>
 </template>
 
 <script lang="ts" setup>
-import { ref, PropType } from 'vue'
+import { shallowRef, ref, PropType } from 'vue'
 import { ElMessage, FormInstance, FormRules } from 'element-plus'
-import { useDoDeposit } from '@/business/bank'
+import { useWrOutInApply } from '@/business/trade'
+import { useRequest } from '@/hooks/request'
+import { getAppointmentModelOutList } from '@/constants/order'
+import { queryUserReceiveInfo, queryWrUserReceiptInfo } from '@/services/api/user'
+import { getReceiptTypeName } from '@/constants/receipt'
+import AppRegion from '@pc/components/base/region/index.vue'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
-import AppUpload from '@pc/components/base/upload/index.vue'
+
+const { dataList: invoiceList } = useRequest(queryWrUserReceiptInfo)
+const { dataList: addressList } = useRequest(queryUserReceiveInfo)
 
 const props = defineProps({
     selectedRow: {
-        type: Object as PropType<Model.TaAccountsRsp>,
-        required: true
+        type: Object as PropType<Model.HoldLBRsp>,
+        required: true,
     }
 })
 
-const { formData, onSubmit, extendInfo, loading } = useDoDeposit(props.selectedRow.userid)
+const { formData, applySubmit, orderQty, loading } = useWrOutInApply(props.selectedRow)
 const show = ref(true)
 const refresh = ref(false)
 const formRef = ref<FormInstance>()
+const regionName = shallowRef('') // 地区名称
 
+// 表单验证规则
 const formRules: FormRules = {
-    Amount: [{ required: true, message: '请输入充值金额' }],
+    orderQty: [{
+        message: '请输入提货数量',
+        validator: () => {
+            return !!orderQty.value
+        }
+    }],
+    ContactName: [{
+        required: true,
+        message: '请输入联系人',
+    }],
+    ContactNum: [{
+        required: true,
+        message: '请输入联系方式',
+    }],
+    Region: [{
+        message: '请选择收货地区',
+        validator: () => {
+            return !!formData.ProvinceID && !!formData.CityID && !!formData.DistrictID
+        }
+    }],
+    Address: [{
+        required: true,
+        message: '请输入收货地址',
+    }],
+    AppointmentRemark: [{
+        required: true,
+        message: '请输入发票信息',
+    }],
 }
 
-const onUploadChange = (file: { filePath: string }) => {
-    console.log(file.filePath)
-    extendInfo.certificate_photo_url = file.filePath
+// 选择地址
+const addressChange = (item: Model.UserReceiveInfoRsp) => {
+    formData.ContactName = item.receivername
+    formData.ContactNum = item.phonenum
+    formData.ProvinceID = item.provinceid
+    formData.CityID = item.cityid
+    formData.DistrictID = item.districtid
+    formData.Address = item.address
+    regionName.value = [item.provincename, item.cityname, item.districtname].join(' ')
+    formRef.value?.validate('Region')
+}
+
+
+// 选择发票
+const invoiceChange = (item: Model.WrUserReceiptInfoRsp) => {
+    formData.AppointmentRemark = ''
+    Object.entries(item).forEach(([key, value]) => {
+        if (value !== '') {
+            switch (key) {
+                case 'receipttype': {
+                    formData.AppointmentRemark += '发票类型:' + getReceiptTypeName(Number(value)) + '\n'
+                    break
+                }
+                case 'username': {
+                    formData.AppointmentRemark += '户名:' + value + '\n'
+                    break
+                }
+                case 'address': {
+                    formData.AppointmentRemark += '地址:' + value + '\n'
+                    break
+                }
+                case 'contactinfo': {
+                    formData.AppointmentRemark += '联系方式:' + value + '\n'
+                    break
+                }
+                case 'idnum': {
+                    formData.AppointmentRemark += '身份证号码:' + value + '\n'
+                    break
+                }
+                case 'receiptaccount': {
+                    formData.AppointmentRemark += '发票帐号:' + value + '\n'
+                    break
+                }
+                case 'receiptbank': {
+                    formData.AppointmentRemark += '发票开户行:' + value + '\n'
+                    break
+                }
+                case 'taxpayerid': {
+                    formData.AppointmentRemark += '纳税人识别号:' + value + '\n'
+                    break
+                }
+            }
+        }
+    })
 }
 
 const onCancel = (isRefresh = false) => {
@@ -50,20 +201,13 @@ const onCancel = (isRefresh = false) => {
     refresh.value = isRefresh
 }
 
-const formSubmit = () => {
-    formRef.value?.validate((valid) => {
-        if (valid) {
-            if (formData.CusBankID) {
-                onSubmit().then(() => {
-                    ElMessage.success('提交成功')
-                    onCancel(true)
-                }).catch((err) => {
-                    ElMessage.error('提交失败:' + err)
-                })
-            } else {
-                ElMessage.error('未签约')
-            }
-        }
+const onSubmit = () => {
+    applySubmit().then(() => {
+        ElMessage.success('提货申请成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提货申请失败:' + err)
     })
 }
+
 </script>