li.shaoyi 2 лет назад
Родитель
Сommit
7b15211af1
24 измененных файлов с 976 добавлено и 300 удалено
  1. 6 4
      src/business/trade/index.ts
  2. 3 0
      src/constants/funcode.ts
  3. 5 0
      src/packages/mobile/router/index.ts
  4. 4 0
      src/packages/mobile/views/order/delivery/Index.vue
  5. 49 0
      src/packages/mobile/views/order/delivery/components/offline/detail/Index.vue
  6. 95 0
      src/packages/mobile/views/order/delivery/components/offline/list/Index.vue
  7. 51 0
      src/packages/mobile/views/order/delivery/components/online/detail/Index.vue
  8. 84 0
      src/packages/mobile/views/order/delivery/components/online/list/Index.vue
  9. 83 22
      src/packages/mobile/views/order/position/components/transfer/delivery/Index.vue
  10. 132 0
      src/packages/mobile/views/order/position/components/transfer/delivery/trade/Index.vue
  11. 3 2
      src/packages/mobile/views/order/position/components/transfer/list/Index.vue
  12. 1 1
      src/packages/mobile/views/order/position/components/transfer/listing/Index.vue
  13. 78 0
      src/packages/mobile/views/transfer/delisting/Index.vue
  14. 0 0
      src/packages/mobile/views/transfer/delisting/components/delisting/index.less
  15. 119 0
      src/packages/mobile/views/transfer/delisting/components/delisting/index.vue
  16. 11 22
      src/packages/mobile/views/transfer/detail/Index.vue
  17. 0 128
      src/packages/mobile/views/transfer/detail/components/delisting/index.vue
  18. 0 13
      src/packages/mobile/views/transfer/detail/components/listing/index.less
  19. 0 106
      src/packages/mobile/views/transfer/detail/components/listing/index.vue
  20. 2 0
      src/packages/mobile/views/transfer/detail/index.less
  21. 11 0
      src/services/api/trade/index.ts
  22. 51 1
      src/services/api/transfer/index.ts
  23. 138 0
      src/types/model/transfer.d.ts
  24. 50 1
      src/types/proto/trade.d.ts

+ 6 - 4
src/business/trade/index.ts

@@ -481,7 +481,7 @@ export function useSpotPresalePointPrice(WRTradeDetailID = '0') {
 export function useCancelOrder() {
     const loading = shallowRef(false)
     /// 参数信息
-    const formData = reactive<Partial<Proto.CancelOrderReq>> ({
+    const formData = reactive<Partial<Proto.CancelOrderReq>>({
         OperatorID: loginStore.loginId,
         OrderSrc: OrderSrc.ORDERSRC_CLIENT,
         AccountID: accountStore.accountId,
@@ -554,8 +554,6 @@ export function useOrder() {
     const loading = shallowRef(false)
 
     const formData = reactive<Partial<Proto.OrderReq>>({
-        ClientSerialNo: v4(),
-        ClientOrderTime: formatDate(new Date().toISOString()),
         ClientType: ClientType.Web,
         LoginID: loginStore.loginId,
         AccountID: accountStore.accountId,
@@ -575,7 +573,11 @@ export function useOrder() {
             loading.value = true
 
             return await order({
-                data: formData
+                data: {
+                    ...formData,
+                    ClientSerialNo: v4(),
+                    ClientOrderTime: formatDate(new Date().toISOString()),
+                }
             })
         } finally {
             loading.value = false

+ 3 - 0
src/constants/funcode.ts

@@ -95,4 +95,7 @@ export enum FunCode {
     CancelOrderRsp = 196612,  // 撤单应答(0, 3, 4)
     HolderCloseReq = 196713,  // 按单平仓请求(196713)
     HolderCloseRsp = 196714,  // 按单平仓应答(196714)
+
+    DeliveryOrderReq = 393217, // 交割申报请求
+    DeliveryOrderRsp = 393218, // 交割申报应答
 } 

+ 5 - 0
src/packages/mobile/router/index.ts

@@ -190,6 +190,11 @@ const routes: Array<RouteRecordRaw> = [
         name: 'transfer-detail',
         component: () => import('../views/transfer/detail/Index.vue'),
       },
+      {
+        path: 'delisting',
+        name: 'transfer-delisting',
+        component: () => import('../views/transfer/delisting/Index.vue'),
+      },
     ],
   },
   {

+ 4 - 0
src/packages/mobile/views/order/delivery/Index.vue

@@ -5,8 +5,10 @@
         </template>
         <Tabs class="van-tabs--list" v-model:active="active" :swipe-threshold="4">
             <Tab title="线上交收单">
+                <component :is="componentMap.get('online')" />
             </Tab>
             <Tab title="线下交收单">
+                <component :is="componentMap.get('offline')" />
             </Tab>
             <Tab title="现货提货单">
                 <component :is="componentMap.get('spot')" />
@@ -20,6 +22,8 @@ import { shallowRef, defineAsyncComponent } from 'vue'
 import { Tab, Tabs } from 'vant'
 
 const componentMap = new Map<string, unknown>([
+    ['online', defineAsyncComponent(() => import('./components/online/list/Index.vue'))], // 线上交收单
+    ['offline', defineAsyncComponent(() => import('./components/offline/list/Index.vue'))], // 线下交收单
     ['spot', defineAsyncComponent(() => import('./components/spot/list/Index.vue'))], // 现货提货单
 ])
 

+ 49 - 0
src/packages/mobile/views/order/delivery/components/offline/detail/Index.vue

@@ -0,0 +1,49 @@
+<!-- 交收提货-线下交收单-详情 -->
+<template>
+    <app-modal direction="right" height="100%" v-model:show="showModal">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar title="线下交收单" @back="closed" />
+            </template>
+            <div class="g-form__container">
+                <CellGroup title="线下交收单信息">
+                    <Cell title="商品代码/名称" :value="selectedRow.goodsnamedisplay" />
+                    <Cell title="交收方向" :value="selectedRow.buyorselldisplay" />
+                    <Cell title="交收数量" :value="selectedRow.deliveryqty" />
+                    <Cell title="交收价格" :value="selectedRow.deliveryprice" />
+                    <Cell title="交收货款" :value="selectedRow.deliveryamount" />
+                    <Cell title="交收对手方" :value="selectedRow.matchusername" />
+                    <Cell title="交收信息" :value="selectedRow.deliveryinfo" />
+                    <Cell title="申请时间" :value="selectedRow.reqtime" />
+                    <Cell title="单据状态" :value="selectedRow.orderstatusdisplay" />
+                    <Cell title="交收单号" :value="selectedRow.deliveryorderid" />
+                </CellGroup>
+            </div>
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { CellGroup, Cell } from 'vant'
+import AppModal from '@/components/base/modal/index.vue'
+
+defineProps({
+    selectedRow: {
+        type: Object as PropType<Model.MineTradeGoodsDeliveryOfflinesRsp>,
+        required: true,
+    }
+})
+
+const showModal = shallowRef(true)
+
+// 关闭弹窗
+const closed = () => {
+    showModal.value = false
+}
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed,
+})
+</script>

+ 95 - 0
src/packages/mobile/views/order/delivery/components/offline/list/Index.vue

@@ -0,0 +1,95 @@
+<!-- 交收提货-线下交收单 -->
+<template>
+    <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error" v-model:pageIndex="pageIndex"
+        :page-count="pageCount" @refresh="run">
+        <div class="g-order-list">
+            <div class="g-order-list__box" v-for="(item, index) in dataList" :key="index">
+                <div class="g-order-list__titlebar">
+                    <div class="left">
+                        <h4>{{ item.goodsnamedisplay }}</h4>
+                        <span>{{ item.deliveryorderid }}</span>
+                    </div>
+                    <div class="right">
+                        <span>{{ item.orderstatus }}</span>
+                    </div>
+                </div>
+                <div class="g-order-list__content">
+                    <ul>
+                        <li>
+                            <span>交收方向</span>
+                            <span>{{ item.buyorselldisplay }}</span>
+                        </li>
+                        <li>
+                            <span>交收数量</span>
+                            <span>{{ item.deliveryqty }}</span>
+                        </li>
+                        <li>
+                            <span>交收价格</span>
+                            <span>{{ item.deliveryprice }}</span>
+                        </li>
+                        <li>
+                            <span>交收货款</span>
+                            <span>{{ item.deliveryamount }}</span>
+                        </li>
+                        <li>
+                            <span>交收信息</span>
+                            <span>{{ item.deliveryinfo }}</span>
+                        </li>
+                        <li>
+                            <span>申请时间</span>
+                            <span>{{ formatDate(item.reqtime, 'YYYY-MM-DD') }}</span>
+                        </li>
+                    </ul>
+                </div>
+                <div class="g-order-list__btnbar">
+                    <Button size="small" @click="showComponent('detail', item)" round>详情</Button>
+                </div>
+            </div>
+        </div>
+        <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)" @closed="closeComponent"
+            v-if="componentId" />
+    </app-pull-refresh>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, defineAsyncComponent } from 'vue'
+import { Button } from 'vant'
+import { formatDate } from '@/filters'
+import { useComponent } from '@/hooks/component'
+import { useRequest } from '@/hooks/request'
+import { queryMineTradeGoodsDeliveryOfflines } from '@/services/api/transfer'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+
+const componentMap = new Map<string, unknown>([
+    ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
+])
+
+const dataList = shallowRef<Model.MineTradeGoodsDeliveryOfflinesRsp[]>([])
+const selectedRow = shallowRef<Model.MineTradeGoodsDeliveryOfflinesRsp>()
+const error = shallowRef(false)
+const pullRefreshRef = shallowRef()
+
+const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
+    pullRefreshRef.value?.refresh()
+})
+
+const { loading, pageIndex, pageCount, run } = useRequest(queryMineTradeGoodsDeliveryOfflines, {
+    params: {
+        pagesize: 20,
+    },
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    },
+    onError: () => {
+        error.value = true
+    }
+})
+
+const showComponent = (componentName: string, row: Model.MineTradeGoodsDeliveryOfflinesRsp) => {
+    selectedRow.value = row
+    openComponent(componentName)
+}
+</script>

+ 51 - 0
src/packages/mobile/views/order/delivery/components/online/detail/Index.vue

@@ -0,0 +1,51 @@
+<!-- 交收提货-线上交收单-详情 -->
+<template>
+    <app-modal direction="right" height="100%" v-model:show="showModal">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar title="线上交收单" @back="closed" />
+            </template>
+            <div class="g-form__container">
+                <CellGroup title="线上交收单信息">
+                    <Cell title="商品代码/名称" :value="selectedRow.wrtypename" />
+                    <Cell title="订货价" :value="selectedRow.xdeliveryprice" />
+                    <Cell title="升贴水" :value="selectedRow.deliverypricemove" />
+                    <Cell title="总货款" :value="selectedRow.deliveryamount" />
+                    <Cell title="剩余货款" :value="selectedRow.xgoodsremainamount" />
+                    <Cell title="总金额" :value="selectedRow.deliverytotalamount" />
+                    <Cell title="剩余金额" :value="selectedRow.remaintotalamount" />
+                    <Cell title="仓库" :value="selectedRow.warehousename" />
+                    <Cell title="发货方" :value="selectedRow.matchusername" />
+                    <Cell title="申请时间" :value="selectedRow.deliverytime" />
+                    <Cell title="交收合约" :value="selectedRow.xgoodscode + '/' + selectedRow.xgoodsname" />
+                    <Cell title="交收单号" :value="selectedRow.deliveryid" />
+                </CellGroup>
+            </div>
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { CellGroup, Cell } from 'vant'
+import AppModal from '@/components/base/modal/index.vue'
+
+defineProps({
+    selectedRow: {
+        type: Object as PropType<Model.WrDeliveryDetailRsp>,
+        required: true,
+    }
+})
+
+const showModal = shallowRef(true)
+
+// 关闭弹窗
+const closed = () => {
+    showModal.value = false
+}
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed,
+})
+</script>

+ 84 - 0
src/packages/mobile/views/order/delivery/components/online/list/Index.vue

@@ -0,0 +1,84 @@
+<!-- 交收提货-线上交收单 -->
+<template>
+    <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error" v-model:pageIndex="pageIndex"
+        :page-count="pageCount" @refresh="run">
+        <div class="g-order-list">
+            <div class="g-order-list__box" v-for="(item, index) in dataList" :key="index">
+                <div class="g-order-list__titlebar">
+                    <div class="left">
+                        <h4>{{ item.wrtypename }}</h4>
+                    </div>
+                    <div class="right">
+                        <span>{{ item.deliveryid }}</span>
+                    </div>
+                </div>
+                <div class="g-order-list__content">
+                    <ul>
+                        <li>
+                            <span>交收数量</span>
+                            <span>{{ item.deliveryqty }}</span>
+                        </li>
+                        <li>
+                            <span>订货价</span>
+                            <span>{{ item.xdeliveryprice }}</span>
+                        </li>
+                        <li>
+                            <span>升贴水</span>
+                            <span>{{ item.deliverypricemove }}</span>
+                        </li>
+                        <li>
+                            <span>剩余金额</span>
+                            <span>{{ item.remaintotalamount }}</span>
+                        </li>
+                        <li>
+                            <span>仓库</span>
+                            <span>{{ item.warehousename }}</span>
+                        </li>
+                        <li>
+                            <span>申请时间</span>
+                            <span>{{ formatDate(item.deliverytime, 'YYYY-MM-DD') }}</span>
+                        </li>
+                    </ul>
+                </div>
+                <div class="g-order-list__btnbar">
+                    <Button size="small" @click="showComponent('detail', item)" round>详情</Button>
+                </div>
+            </div>
+        </div>
+        <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)" @closed="closeComponent"
+            v-if="componentId" />
+    </app-pull-refresh>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, defineAsyncComponent } from 'vue'
+import { Button } from 'vant'
+import { formatDate } from '@/filters'
+import { useComponent } from '@/hooks/component'
+import { useRequest } from '@/hooks/request'
+import { queryWrDeliveryDetail } from '@/services/api/transfer'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+
+const componentMap = new Map<string, unknown>([
+    ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
+])
+
+const pullRefreshRef = shallowRef()
+const error = shallowRef(false)
+const selectedRow = shallowRef<Model.WrDeliveryDetailRsp>()
+
+const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
+    pullRefreshRef.value?.refresh()
+})
+
+const { dataList, loading, pageIndex, pageCount, run } = useRequest(queryWrDeliveryDetail, {
+    onError: () => {
+        error.value = true
+    }
+})
+
+const showComponent = (componentName: string, row: Model.WrDeliveryDetailRsp) => {
+    selectedRow.value = row
+    openComponent(componentName)
+}
+</script>

+ 83 - 22
src/packages/mobile/views/order/position/components/transfer/delivery/Index.vue

@@ -1,37 +1,67 @@
 <!-- 我的持仓-转让持仓-交收 -->
 <template>
-    <app-modal direction="right" height="100%" v-model:show="showModal">
+    <app-modal direction="right" height="100%" v-model:show="showModal" :refresh="refresh">
         <app-view class="g-form">
             <template #header>
-                <app-navbar title="转让持仓详情" @back="closed" />
+                <app-navbar title="交收申请" @back="closed" />
+            </template>
+            <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                <div class="g-order-list">
+                    <div class="g-order-list__box" v-for="(item, index) in dataList" :key="index">
+                        <div class="g-order-list__titlebar">
+                            <div class="left">
+                                <h4>{{ item.username }}</h4>
+                            </div>
+                        </div>
+                        <div class="g-order-list__content">
+                            <ul>
+                                <li>
+                                    <span>商品</span>
+                                    <span>{{ item.wrstandardname }}</span>
+                                </li>
+                                <li>
+                                    <span>仓库</span>
+                                    <span>{{ item.warehousename }}</span>
+                                </li>
+                                <li>
+                                    <span>升贴水</span>
+                                    <span>{{ item.pricemove }}</span>
+                                </li>
+                                <li>
+                                    <span>数量</span>
+                                    <span>{{ item.avalidqty }}</span>
+                                </li>
+                            </ul>
+                        </div>
+                        <div class="g-order-list__btnbar">
+                            <Button size="small" @click="showComponent('trade', item)" round>点选</Button>
+                        </div>
+                    </div>
+                </div>
+            </app-pull-refresh>
+            <template #footer>
+                <component ref="componentRef" v-bind="{ detail, selectedRow }" :is="componentMap.get(componentId)"
+                    @closed="closeComponent" v-if="componentId" />
             </template>
-            <div class="g-form__container">
-                <CellGroup title="预售认购信息">
-                    <Cell title="商品代码/名称" :value="selectedRow.goodsname" />
-                    <Cell title="持仓金额" :value="selectedRow.buycurholderamount" />
-                    <Cell title="持仓数量" :value="selectedRow.buycurpositionqty" />
-                    <Cell title="冻结数量" :value="selectedRow.buyfrozenqty" />
-                    <Cell title="可用数量" :value="selectedRow.buycurpositionqty - selectedRow.buyfrozenqty" />
-                    <Cell title="发售方" :value="selectedRow.sellname" />
-                    <Cell title="订货价" :value="selectedRow.presaleprice" />
-                    <Cell title="总货款" :value="selectedRow.buycurpositionqty * selectedRow.presaleprice" />
-                    <Cell title="转让订金比例" :value="selectedRow.transferdepositratio" />
-                    <Cell title="转让订金" :value="selectedRow.transferdeposit" />
-                    <Cell title="未付订金" :value="selectedRow.depositremain" />
-                    <Cell title="支付状态" :value="selectedRow.paystatus" />
-                    <Cell title="最后交易日" :value="selectedRow.lasttradedate" />
-                </CellGroup>
-            </div>
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, PropType } from 'vue'
-import { CellGroup, Cell } from 'vant'
+import { shallowRef, PropType, defineAsyncComponent } from 'vue'
+import { Button } from 'vant'
+import { useComponent } from '@/hooks/component'
+import { useRequest } from '@/hooks/request'
+import { queryWrDeliveryAvalidHoldLB } from '@/services/api/transfer'
 import AppModal from '@/components/base/modal/index.vue'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+
+const componentMap = new Map<string, unknown>([
+    ['trade', defineAsyncComponent(() => import('./trade/Index.vue'))], // 交收
+])
 
-defineProps({
+const props = defineProps({
     selectedRow: {
         type: Object as PropType<Model.MineTradePositionExsRsp>,
         required: true,
@@ -39,12 +69,43 @@ defineProps({
 })
 
 const showModal = shallowRef(true)
+const refresh = shallowRef(false) // 是否刷新父组件数据
+const error = shallowRef(false)
+const pullRefreshRef = shallowRef()
+const dataList = shallowRef<Model.WrDeliveryAvalidHoldLBRsp[]>([])
+const detail = shallowRef<Model.WrDeliveryAvalidHoldLBRsp>()
+
+const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
+    refresh.value = true
+    pullRefreshRef.value?.refresh()
+})
+
+const { loading, pageIndex, pageCount, run } = useRequest(queryWrDeliveryAvalidHoldLB, {
+    params: {
+        pagesize: 20,
+        goodsid: props.selectedRow.goodsid,
+    },
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    },
+    onError: () => {
+        error.value = true
+    }
+})
 
 // 关闭弹窗
 const closed = () => {
     showModal.value = false
 }
 
+const showComponent = (componentName: string, row: Model.WrDeliveryAvalidHoldLBRsp) => {
+    detail.value = row
+    openComponent(componentName)
+}
+
 // 暴露组件属性给父组件调用
 defineExpose({
     closed,

+ 132 - 0
src/packages/mobile/views/order/position/components/transfer/delivery/trade/Index.vue

@@ -0,0 +1,132 @@
+<template>
+    <app-modal direction="right" height="100%" v-model:show="showModal" :refresh="refresh">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar title="点选" @back="closed" />
+            </template>
+            <Form ref="formRef" class="g-form__container" @submit="onSubmit">
+                <CellGroup inset>
+                    <Cell title="商品代码/名称" :value="detail.wrstandardname" />
+                    <Cell title="仓库" :value="detail.warehousename" />
+                    <Cell title="升贴水" :value="discount" />
+                    <Cell title="数量" :value="detail.avalidqty" />
+                    <Cell title="总货款" :value="payment.toFixed(2)" />
+                    <Cell title="剩余货款" :value="available.toFixed(2)" />
+                    <Cell title="已付定金" :value="deposit.toFixed(2)" />
+                    <Field name="DeliveryQty" :rules="formRules.DeliveryQty" label="点选数量">
+                        <template #input>
+                            <Stepper v-model="formData.DeliveryQty" theme="round" button-size="22"
+                                :max="selectedRow.buycurpositionqty" :auto-fixed="false" integer />
+                        </template>
+                    </Field>
+                </CellGroup>
+            </Form>
+            <template #footer>
+                <div class="g-form__footer">
+                    <Button block round type="primary" @click="formRef?.submit">提交</Button>
+                </div>
+            </template>
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, reactive, PropType, computed } from 'vue'
+import { v4 } from 'uuid'
+import { CellGroup, Cell, Form, Field, Stepper, Button, FieldRule, FormInstance } from 'vant'
+import { fullloading, dialog } from '@/utils/vant'
+import { ClientType } from '@/constants/client'
+import { deliveryOrder } from '@/services/api/trade'
+import { useAccountStore } from '@/stores'
+import moment from 'moment'
+import AppModal from '@/components/base/modal/index.vue'
+
+const props = defineProps({
+    detail: {
+        type: Object as PropType<Model.WrDeliveryAvalidHoldLBRsp>,
+        required: true
+    },
+    selectedRow: {
+        type: Object as PropType<Model.MineTradePositionExsRsp>,
+        required: true
+    },
+})
+
+const accountStore = useAccountStore()
+const formRef = shallowRef<FormInstance>()
+const refresh = shallowRef(false) // 是否刷新父组件数据
+const showModal = shallowRef(true)
+
+const formData = reactive<Partial<Proto.DeliveryOrderReq>>({
+    ClientType: ClientType.Web,
+    AccountID: accountStore.accountId,
+    XGoodsID: props.detail.goodsid,
+    DeliveryGoodsID: props.detail.deliverygoodsid,
+})
+
+// 升贴水
+const discount = computed(() => {
+    return props.detail.pricemove * (formData.DeliveryQty ?? 0)
+})
+
+// 总货款
+const payment = computed(() => {
+    return props.selectedRow.presaleprice * (formData.DeliveryQty ?? 0)
+})
+
+// 剩余货款
+const available = computed(() => {
+    return payment.value * props.selectedRow.transferdepositratio
+})
+
+// 已付定金
+const deposit = computed(() => {
+    return payment.value - available.value + discount.value
+})
+
+// 表单验证规则
+const formRules: { [key in keyof Proto.DeliveryOrderReq]?: FieldRule[] } = {
+    DeliveryQty: [{
+        message: '请输入数量',
+        validator: () => {
+            return !!formData.DeliveryQty
+        }
+    }],
+}
+
+// 提交摘牌
+const onSubmit = () => {
+    formData.ClientSerialNo = v4()
+    formData.ClientOrderTime = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+    formData.XQty = formData.DeliveryQty
+    formData.DeliveryOrderDetail = {
+        AccountID: props.detail.accountid, // 对手方账号
+        Qty: formData.DeliveryQty, // 点选数量
+        LadingBillID: props.detail.ladingbillid,// 提单ID
+        SubNum: props.detail.subnum, // 提单子单号
+        WRFactorTypeID: props.detail.wrfactortypeid, // 仓单要素类型ID
+    }
+
+    fullloading((hideLoading) => {
+        deliveryOrder({
+            data: formData
+        }).then(() => {
+            hideLoading()
+            dialog('提交成功').then(() => closed(true))
+        }).catch((err) => {
+            hideLoading(err, 'fail')
+        })
+    })
+}
+
+// 关闭弹窗
+const closed = (isRefresh = false) => {
+    refresh.value = isRefresh
+    showModal.value = false
+}
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed,
+})
+</script>

+ 3 - 2
src/packages/mobile/views/order/position/components/transfer/list/Index.vue

@@ -51,7 +51,8 @@
                 <div class="g-order-list__btnbar">
                     <Button size="small" @click="showComponent('detail', item)" round
                         v-if="item.paystatus === 1">追加定金</Button>
-                    <Button size="small" @click="showComponent('sell', item)" round v-if="item.paystatus === 2">转让</Button>
+                    <Button size="small" @click="showComponent('listing', item)" round
+                        v-if="item.paystatus === 2">转让</Button>
                     <Button size="small" @click="showComponent('delivery', item)" round
                         v-if="item.paystatus === 2">交收</Button>
                     <Button size="small" @click="showComponent('detail', item)" round>详情</Button>
@@ -73,7 +74,7 @@ import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 
 const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))], // 详情
-    ['sell', defineAsyncComponent(() => import('../sell/Index.vue'))], // 转让
+    ['listing', defineAsyncComponent(() => import('../listing/Index.vue'))], // 挂牌
     ['delivery', defineAsyncComponent(() => import('../delivery/Index.vue'))], // 交收
 ])
 

+ 1 - 1
src/packages/mobile/views/order/position/components/transfer/sell/Index.vue → src/packages/mobile/views/order/position/components/transfer/listing/Index.vue

@@ -6,7 +6,7 @@
                 <app-navbar title="转让" @back="closed" />
             </template>
             <Form ref="formRef" class="g-form__container" @submit="onSubmit">
-                <CellGroup title="转让信息" inset>
+                <CellGroup inset>
                     <Field label="预售价">
                         <template #input>
                             <span>{{ selectedRow.presaleprice }}</span>

+ 78 - 0
src/packages/mobile/views/transfer/delisting/Index.vue

@@ -0,0 +1,78 @@
+<template>
+    <app-view>
+        <template #header>
+            <app-navbar title="转让列表" />
+        </template>
+        <div v-if="detail">{{ detail.goodsname }}</div>
+        <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error" v-model:pageIndex="pageIndex"
+            :page-count="pageCount" @refresh="run">
+            <app-list :columns="columns" :data-list="dataList">
+                <template #operate="{ row }">
+                    <Button type="primary" size="small" round @click="delisting(row)">买入</Button>
+                </template>
+            </app-list>
+        </app-pull-refresh>
+        <component ref="componentRef" :is="componentMap.get(componentId)" v-bind="{ detail, selectedRow }"
+            @closed="closeComponent" v-if="componentId" />
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, defineAsyncComponent } from 'vue'
+import { Button } from 'vant'
+import { useNavigation } from '@/hooks/navigation'
+import { BuyOrSell } from '@/constants/order'
+import { useComponent } from '@/hooks/component'
+import { useRequest } from '@/hooks/request'
+import { queryPresaleDefault, queryWrTradeOrderDetail } from '@/services/api/transfer'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+import AppList from '@mobile/components/base/list/index.vue'
+
+const componentMap = new Map<string, unknown>([
+    ['delisting', defineAsyncComponent(() => import('./components/delisting/index.vue'))], // 摘牌
+])
+
+const { getQueryStringToNumber } = useNavigation()
+const { componentRef, componentId, openComponent, closeComponent } = useComponent()
+const goodsid = getQueryStringToNumber('goodsid')
+const dataList = shallowRef<Model.WrTradeOrderDetailRsp[]>([])
+const selectedRow = shallowRef<Model.WrTradeOrderDetailRsp>()
+const error = shallowRef(false)
+const pullRefreshRef = shallowRef()
+
+const { data: detail } = useRequest(queryPresaleDefault, {
+    params: {
+        goodsid,
+    }
+})
+
+const { loading, pageIndex, pageCount, run } = useRequest(queryWrTradeOrderDetail, {
+    params: {
+        pagesize: 20,
+        goodsid,
+        buyorsell: BuyOrSell.Sell,
+    },
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    },
+    onError: () => {
+        error.value = true
+    }
+})
+
+const columns: Model.TableColumn[] = [
+    { prop: 'username', label: '挂牌方' },
+    { prop: 'orderqty', label: '数量' },
+    { prop: 'orderprice', label: '价格' },
+    { prop: 'operate', label: '操作' },
+]
+
+// 摘牌下单
+const delisting = (row: Model.WrTradeOrderDetailRsp) => {
+    selectedRow.value = row
+    openComponent('delisting')
+}
+</script>

+ 0 - 0
src/packages/mobile/views/transfer/detail/components/delisting/index.less → src/packages/mobile/views/transfer/delisting/components/delisting/index.less


+ 119 - 0
src/packages/mobile/views/transfer/delisting/components/delisting/index.vue

@@ -0,0 +1,119 @@
+<template>
+    <app-modal direction="right" height="100%" v-model:show="showModal">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar title="买入" @back="closed" />
+            </template>
+            <Form ref="formRef" class="g-form__container" @submit="onSubmit">
+                <CellGroup title="买入信息" inset>
+                    <Field label="预售价">
+                        <template #input>
+                            <span>{{ detail.presaleprice }}</span>
+                        </template>
+                    </Field>
+                    <Field label="转让定金比例">
+                        <template #input>
+                            <span>{{ detail.transferdepositratio }}</span>
+                        </template>
+                    </Field>
+                    <Field label="订单量">
+                        <template #input>
+                            <span>{{ selectedRow.orderqty }}</span>
+                        </template>
+                    </Field>
+                    <Field label="转让价">
+                        <template #input>
+                            <span>{{ selectedRow.orderprice }}</span>
+                        </template>
+                    </Field>
+                    <Field name="OrderQty" :rules="formRules.OrderQty" label="买入数量">
+                        <template #input>
+                            <Stepper v-model="formData.OrderQty" theme="round" button-size="22" :auto-fixed="false"
+                                integer />
+                        </template>
+                    </Field>
+                </CellGroup>
+            </Form>
+            <template #footer>
+                <div class="g-form__footer">
+                    <Button block round type="primary" @click="formRef?.submit">提交</Button>
+                </div>
+            </template>
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { CellGroup, Form, Field, Stepper, Button, FieldRule, FormInstance } from 'vant'
+import { fullloading, dialog } from '@/utils/vant'
+import { useOrder } from '@/business/trade'
+import AppModal from '@/components/base/modal/index.vue'
+import { BuyOrSell } from '@/constants/order'
+import { EPriceMode, EValidType, EListingSelectType, EBuildType } from '@/constants/client'
+
+const props = defineProps({
+    detail: {
+        type: Object as PropType<Model.PresaleDefaultRsp>,
+        required: true
+    },
+    selectedRow: {
+        type: Object as PropType<Model.WrTradeOrderDetailRsp>,
+        required: true
+    },
+})
+
+const { formData, formSubmit } = useOrder()
+const formRef = shallowRef<FormInstance>()
+const refresh = shallowRef(false) // 是否刷新父组件数据
+const showModal = shallowRef(true)
+
+// 表单验证规则
+const formRules: { [key in keyof Proto.OrderReq]?: FieldRule[] } = {
+    OrderPrice: [{
+        message: '请输入价格',
+        validator: () => {
+            return !!formData.OrderPrice
+        }
+    }],
+    OrderQty: [{
+        message: '请输入数量',
+        validator: () => {
+            return !!formData.OrderQty
+        }
+    }],
+}
+
+// 关闭弹窗
+const closed = (isRefresh = false) => {
+    refresh.value = isRefresh
+    showModal.value = false
+}
+
+// 提交摘牌
+const onSubmit = () => {
+    const { goodsid, orderid } = props.selectedRow
+    formData.GoodsID = goodsid
+    formData.MarketID = 49201
+    formData.BuyOrSell = BuyOrSell.Buy
+    formData.RelatedID = orderid
+    formData.ValidType = EValidType.VALIDTYPE_YZ
+    formData.PriceMode = EPriceMode.PRICEMODE_LIMIT
+    formData.ListingSelectType = EListingSelectType.LISTINGSELECTTYPE_DELISTING
+    formData.BuildType = EBuildType.BUILDTYPE_OPEN
+
+    fullloading((hideLoading) => {
+        formSubmit().then(() => {
+            hideLoading()
+            dialog('提交成功').then(() => closed(true))
+        }).catch((err) => {
+            hideLoading(err, 'fail')
+        })
+    })
+}
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed,
+})
+</script>

+ 11 - 22
src/packages/mobile/views/transfer/detail/Index.vue

@@ -24,8 +24,6 @@
                 <span>{{ detail.goodsname }}</span>
             </div>
         </div>
-        <Cell title="转让列表" />
-        <app-list :columns="columns" :data-list="sellList" />
         <div class="g-detail__desc">
             <template v-for="(url, index) in detailImages" :key="index">
                 <img :src="url" alt="" />
@@ -33,30 +31,28 @@
         </div>
         <template #footer>
             <div class="g-detail__footer">
-                <Button type="primary" block round @click="openComponent('listing')">我要转让</Button>
+                <Button type="warning" block round @click="openComponent('listing')" v-if="dataList.length">转让</Button>
+                <Button type="primary" block round
+                    @click="$router.push({ name: 'transfer-delisting', query: { goodsid } })">买入</Button>
             </div>
-            <component ref="componentRef" :is="componentMap.get(componentId)" v-bind="{ detail }" @closed="closeComponent"
-                v-if="componentId" />
+            <component ref="componentRef" :is="componentMap.get(componentId)" v-bind="{ selectedRow: dataList[0] }"
+                @closed="closeComponent" v-if="componentId" />
         </template>
     </app-view>
 </template>
 
 <script lang="ts" setup>
 import { computed, defineAsyncComponent } from 'vue'
-import { Swipe, SwipeItem, Button, Cell } from 'vant'
+import { Swipe, SwipeItem, Button } from 'vant'
 import { getFileUrl } from '@/filters'
 import { useRequest } from '@/hooks/request'
-import { BuyOrSell } from '@/constants/order'
-import { queryPresaleDefault } from '@/services/api/transfer'
-import { queryTjmdTradeOrderDetail } from '@/services/api/swap'
+import { queryPresaleDefault, queryMineTradePositionExs } from '@/services/api/transfer'
 import { useComponent } from '@/hooks/component'
 import { useNavigation } from '@/hooks/navigation'
 import { useFuturesStore } from '@/stores'
-import AppList from '@mobile/components/base/list/index.vue'
 
 const componentMap = new Map<string, unknown>([
-    ['listing', defineAsyncComponent(() => import('./components/listing/index.vue'))], // 挂牌
-    ['delisting', defineAsyncComponent(() => import('./components/delisting/index.vue'))], // 摘牌
+    ['listing', defineAsyncComponent(() => import('@mobile/views/order/position/components/transfer/listing/Index.vue'))], // 挂牌
 ])
 
 const { getQueryStringToNumber } = useNavigation()
@@ -64,27 +60,20 @@ const { componentRef, componentId, openComponent, closeComponent } = useComponen
 const { getQuotePrice } = useFuturesStore()
 const goodsid = getQueryStringToNumber('goodsid')
 
+// 获取转让详情
 const { data: detail } = useRequest(queryPresaleDefault, {
     params: {
         goodsid,
     }
 })
 
-const { dataList: sellList } = useRequest(queryTjmdTradeOrderDetail, {
+// 获取转让持仓
+const { dataList } = useRequest(queryMineTradePositionExs, {
     params: {
-        pagesize: 3,
         goodsid,
-        buyorsell: BuyOrSell.Sell,
     }
 })
 
-const columns: Model.TableColumn[] = [
-    { prop: 'username', label: '挂牌方' },
-    { prop: 'orderqty', label: '数量' },
-    { prop: 'orderprice', label: '价格' },
-    { prop: 'operate', label: '操作' },
-]
-
 // 商品banner
 const detailBanners = computed(() => {
     const bannerpicurl = detail.value?.bannerpicurl ?? ''

+ 0 - 128
src/packages/mobile/views/transfer/detail/components/delisting/index.vue

@@ -1,128 +0,0 @@
-<template>
-    <app-popup class="supply-demand-listing" title="出价" v-model:show="showModal" :refresh="refresh">
-        <Form class="supply-demand-listing__form" ref="formRef" @submit="onSubmit">
-            <Field label="起拍价">
-                <template #input>
-                    <span>{{ detail.startprice }}</span>
-                </template>
-            </Field>
-            <Field name="OrderPrice" :rules="formRules.OrderPrice" label="认购价">
-                <template #input>
-                    <Stepper v-model="formData.OrderPrice" theme="round" :min="detail.startprice" :decimal-length="2"
-                        :auto-fixed="false" button-size="22" />
-                </template>
-            </Field>
-            <Field name="OrderQty" :rules="formRules.OrderQty" label="认购数量">
-                <template #input>
-                    <Stepper v-model="formData.OrderQty" theme="round" :max="detail.presaleqty" button-size="22"
-                        :auto-fixed="false" integer />
-                </template>
-            </Field>
-            <Field label="预售定金">
-                <template #input>
-                    <span>{{ earnest }}</span>
-                </template>
-            </Field>
-            <Field label="可用资金">
-                <template #input>
-                    <span>{{ accountStore.avaiableMoney.toFixed(2) }}</span>
-                </template>
-            </Field>
-        </Form>
-        <template #footer>
-            <Button type="primary" block round @click="formRef?.submit">确定</Button>
-        </template>
-    </app-popup>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, PropType, onMounted, computed } from 'vue'
-import { Form, Field, Stepper, Button, FieldRule, FormInstance } from 'vant'
-import { fullloading, dialog } from '@/utils/vant'
-import { useAccountStore } from '@/stores'
-import { useOrder } from '@/business/trade'
-import AppPopup from '@mobile/components/base/popup/index.vue'
-import { BuyOrSell } from '@/constants/order'
-import { EPriceMode, EValidType } from '@/constants/client'
-//import AppSelect from '@mobile/components/base/select/index.vue'
-
-const props = defineProps({
-    detail: {
-        type: Object as PropType<Model.PresaleAuctionsRsp>,
-        required: true
-    },
-})
-
-const { formData, formSubmit } = useOrder()
-const accountStore = useAccountStore()
-const formRef = shallowRef<FormInstance>()
-const refresh = shallowRef(false) // 是否刷新父组件数据
-const showModal = shallowRef(true)
-
-// 表单验证规则
-const formRules: { [key in keyof Proto.OrderReq]?: FieldRule[] } = {
-    OrderPrice: [{
-        message: '请输入价格',
-        validator: () => {
-            return !!formData.OrderPrice
-        }
-    }],
-    OrderQty: [{
-        message: '请输入数量',
-        validator: () => {
-            return !!formData.OrderQty
-        }
-    }],
-}
-
-// 预售定金
-const earnest = computed(() => {
-    switch (props.detail.presaledepositalgorithm) {
-        case 1:
-            return (props.detail.presaledepositvalue * 100).toFixed(2)
-        case 2:
-            return props.detail.presaledepositvalue.toFixed(2)
-        default:
-            return '0.0'
-    }
-})
-
-// 关闭弹窗
-const closed = (isRefresh = false) => {
-    refresh.value = isRefresh
-    showModal.value = false
-}
-
-// 提交摘牌
-const onSubmit = () => {
-    const { applyid, goodsid, marketid } = props.detail
-    formData.GoodsID = goodsid
-    formData.MarketID = marketid
-    formData.BuyOrSell = BuyOrSell.Buy
-    formData.RelatedID = applyid
-    formData.ValidType = EValidType.VALIDTYPE_YZ
-    formData.PriceMode = EPriceMode.PRICEMODE_LIMIT
-
-    fullloading((hideLoading) => {
-        formSubmit().then(() => {
-            hideLoading()
-            dialog('提交成功').then(() => closed(true))
-        }).catch((err) => {
-            hideLoading(err, 'fail')
-        })
-    })
-}
-
-onMounted(() => {
-    formData.OrderPrice = props.detail.startprice
-})
-
-// 暴露组件属性给父组件调用
-defineExpose({
-    closed,
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 0 - 13
src/packages/mobile/views/transfer/detail/components/listing/index.less

@@ -1,13 +0,0 @@
-.supply-demand-listing {
-    &__form {
-        .van-stepper {
-            display: flex;
-            align-items: center;
-            width: 100%;
-
-            &__input {
-                flex: 1;
-            }
-        }
-    }
-}

+ 0 - 106
src/packages/mobile/views/transfer/detail/components/listing/index.vue

@@ -1,106 +0,0 @@
-<template>
-    <app-popup title="转让" v-model:show="showModal" :refresh="refresh">
-        <Form ref="formRef" @submit="onSubmit">
-            <Field label="预售价">
-                <template #input>
-                    <span>{{ detail.presaleprice }}</span>
-                </template>
-            </Field>
-            <Field label="可用量">
-                <template #input>
-                    <span>{{ 0 }}</span>
-                </template>
-            </Field>
-            <Field name="OrderPrice" :rules="formRules.OrderPrice" label="转让价">
-                <template #input>
-                    <Stepper v-model="formData.OrderPrice" theme="round" :min="detail.presaleprice" :decimal-length="2"
-                        :auto-fixed="false" button-size="22" />
-                </template>
-            </Field>
-            <Field name="OrderQty" :rules="formRules.OrderQty" label="转让数量">
-                <template #input>
-                    <Stepper v-model="formData.OrderQty" theme="round" :max="0" button-size="22" :auto-fixed="false"
-                        integer />
-                </template>
-            </Field>
-        </Form>
-        <template #footer>
-            <Button type="primary" block round @click="formRef?.submit">确定</Button>
-        </template>
-    </app-popup>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef, PropType, onMounted, computed } from 'vue'
-import { Form, Field, Stepper, Button, FieldRule, FormInstance } from 'vant'
-import { fullloading, dialog } from '@/utils/vant'
-import { useAccountStore } from '@/stores'
-import { useOrder } from '@/business/trade'
-import AppPopup from '@mobile/components/base/popup/index.vue'
-import { BuyOrSell } from '@/constants/order'
-import { EPriceMode, EValidType } from '@/constants/client'
-//import AppSelect from '@mobile/components/base/select/index.vue'
-
-const props = defineProps({
-    detail: {
-        type: Object as PropType<Model.PresaleDefaultRsp>,
-        required: true
-    },
-})
-
-const { formData, formSubmit } = useOrder()
-const formRef = shallowRef<FormInstance>()
-const refresh = shallowRef(false) // 是否刷新父组件数据
-const showModal = shallowRef(true)
-
-// 表单验证规则
-const formRules: { [key in keyof Proto.OrderReq]?: FieldRule[] } = {
-    OrderPrice: [{
-        message: '请输入价格',
-        validator: () => {
-            return !!formData.OrderPrice
-        }
-    }],
-    OrderQty: [{
-        message: '请输入数量',
-        validator: () => {
-            return !!formData.OrderQty
-        }
-    }],
-}
-
-// 关闭弹窗
-const closed = (isRefresh = false) => {
-    refresh.value = isRefresh
-    showModal.value = false
-}
-
-// 提交挂牌
-const onSubmit = () => {
-    // const { applyid, goodsid, marketid } = props.detail
-    // formData.GoodsID = goodsid
-    // formData.MarketID = marketid
-    // formData.BuyOrSell = BuyOrSell.Buy
-    // formData.RelatedID = applyid
-    // formData.ValidType = EValidType.VALIDTYPE_YZ
-    // formData.PriceMode = EPriceMode.PRICEMODE_LIMIT
-
-    fullloading((hideLoading) => {
-        formSubmit().then(() => {
-            hideLoading()
-            dialog('提交成功').then(() => closed(true))
-        }).catch((err) => {
-            hideLoading(err, 'fail')
-        })
-    })
-}
-
-// 暴露组件属性给父组件调用
-defineExpose({
-    closed,
-})
-</script>
-
-<style lang="less">
-@import './index.less';
-</style>

+ 2 - 0
src/packages/mobile/views/transfer/detail/index.less

@@ -94,6 +94,8 @@
     }
 
     &__footer {
+        display: flex;
+        gap: .2rem;
         background-color: #fff;
         padding: .12rem .24rem;
     }

+ 11 - 0
src/services/api/trade/index.ts

@@ -200,4 +200,15 @@ export function holderClose(config: RequestConfig<Proto.HolderCloseReq>) {
         requestCode: 'HolderCloseReq',
         responseCode: 'HolderCloseRsp',
     })
+}
+
+/**
+ * 交割申报
+ */
+export function deliveryOrder(config: RequestConfig<Partial<Proto.DeliveryOrderReq>>) {
+    return http.mqRequest<Proto.DeliveryOrderRsp>({
+        data: config.data,
+        requestCode: 'DeliveryOrderReq',
+        responseCode: 'DeliveryOrderRsp',
+    })
 }

+ 51 - 1
src/services/api/transfer/index.ts

@@ -1,8 +1,9 @@
-import { useLoginStore } from '@/stores'
+import { useLoginStore, useAccountStore } from '@/stores'
 import http from '@/services/http'
 import { RequestConfig } from '@/services/http/types'
 
 const loginStore = useLoginStore()
+const accountStore = useAccountStore()
 
 /**
  * 查询转让详情
@@ -51,4 +52,53 @@ export function queryMineTradeTradeDetails(config: RequestConfig<Model.MineTrade
             ...config.data
         },
     })
+}
+
+/**
+ * 查询合约交收可点选仓单
+ */
+export function queryWrDeliveryAvalidHoldLB(config: RequestConfig<Model.WrDeliveryAvalidHoldLBReq> = {}) {
+    return http.commonRequest<Model.WrDeliveryAvalidHoldLBRsp[]>({
+        url: '/WrTrade2/QueryWrDeliveryAvalidHoldLB',
+        params: {
+            accountid: accountStore.accountId,
+            ...config.data
+        },
+    })
+}
+
+/**
+ * 查询合约交易买卖大厅
+ */
+export function queryWrTradeOrderDetail(config: RequestConfig<Model.WrTradeOrderDetailReq> = {}) {
+    return http.commonRequest<Model.WrTradeOrderDetailRsp[]>({
+        url: '/WrTrade2/QueryWrTradeOrderDetail',
+        params: config.data,
+    })
+}
+
+/**
+ * 查询交收
+ */
+export function queryWrDeliveryDetail(config: RequestConfig<Model.WrDeliveryDetailReq> = {}) {
+    return http.commonRequest<Model.WrDeliveryDetailRsp[]>({
+        url: '/WrTrade2/QueryWrDeliveryDetail',
+        params: {
+            userid: loginStore.userId,
+            ...config.data
+        },
+    })
+}
+
+/**
+ * 交收提货-线下交收单
+ */
+export function queryMineTradeGoodsDeliveryOfflines(config: RequestConfig<Model.MineTradeGoodsDeliveryOfflinesReq> = {}) {
+    return http.commonRequest<Model.MineTradeGoodsDeliveryOfflinesRsp[]>({
+        url: '/Mine/QueryMineTradeGoodsDeliveryOfflines',
+        params: {
+            userid: loginStore.userId,
+            ...config.data
+        },
+    })
 }

+ 138 - 0
src/types/model/transfer.d.ts

@@ -19,6 +19,7 @@ declare namespace Model {
     /** 我的持仓-转让持仓 请求 */
     interface MineTradePositionExsReq {
         userid?: number; // 用户ID
+        goodsid?: number; // 商品ID
         page?: number; // 页码
         pagesize?: number; // 每页条数
     }
@@ -186,4 +187,141 @@ declare namespace Model {
         tradetime: string; // 成交时间
         tradetype: number; // 成交类别 - 1:正常委托成交 2:定向做市成交(接单) 3:交割协议平仓成交 4:交割减仓成交 5:到期强平成交 6:风控斩仓成交 7:协议平仓(管理端)成交 8:仓单转持仓成交 9: 交割协议转让成交 10:受托竞价成交(接单) 11:协议转让成交 12:系统强行平仓 13:期权违约平仓
     }
+
+    /** 查询合约交收可点选仓单 请求 */
+    interface WrDeliveryAvalidHoldLBReq {
+        accountid?: number; // 资金账号
+        goodsid: number; // 商品id
+    }
+
+    /** 查询合约交收可点选仓单 响应  */
+    interface WrDeliveryAvalidHoldLBRsp {
+        accountid: number; // 资金账号
+        avalidqty: number; // 数量(可点选数量)
+        deliverygoodsid: number; // 品种id
+        enumdicname: string; // 单位名称
+        goodsid: number; // x合约商品id
+        ladingbillid: string; // 提单id
+        pgoodscode: string; // p商品代码(点价合约)
+        pgoodsid: number; // p商品id(点价合约)
+        pgoodsname: string; // p商品名称(点价合约)
+        pricemove: number; // 升贴水
+        subnum: number; // 提单子id
+        userid: number; // 用户id
+        username: string; // 仓单持有人
+        warehousecode: string; // 仓库代码
+        warehouseid: number; // 仓库id
+        warehousename: string; // 仓库名称
+        wrfactortypeid: string; // 仓单要素id
+        wrstandardcode: string; // 品代码
+        wrstandardid: number; // 品类d
+        wrstandardname: string; // 品类名称
+        wrtypename: string; // 商品
+        xgoodscode: string; // x合约代码
+        xgoodsname: string; // x合约名称
+    }
+
+    /** 查询合约交易买卖大厅 请求 */
+    interface WrTradeOrderDetailReq {
+        goodsid: number; // 商品id
+        buyorsell: number; // 买卖方向 0-买 1-卖
+        page?: number; // 页码
+        pagesize?: number; // 每页条数
+    }
+
+    /** 查询合约交易买卖大厅 响应 */
+    interface WrTradeOrderDetailRsp {
+        buyorsell: number; // 买卖方向 0-买 1-卖
+        goodsid: number; // 商品id
+        orderid: string; // 委托单号
+        orderprice: number; // 期初均价
+        orderqty: number; // 委托数量
+        userid: number; // 用户id
+        username: string; // 用户名称(已脱敏)
+    }
+
+    /** 查询交收 请求 */
+    interface WrDeliveryDetailReq {
+        userid?: number; // 用户id
+        accountid?: number; // 资金账号id
+        begindate?: number; // 开始交易日(yyyymmdd)
+        enddate?: number; // 结束交易日(yyyymmdd)
+    }
+
+    /** 查询交收 响应 */
+    interface WrDeliveryDetailRsp {
+        accountid: number; // 账号ID
+        averageprice: number; // 期初均价
+        begindate: string; // 开始交易日(yyyymmdd)
+        buyorsell: number; // 方向 - 0:买 1:卖
+        deliveryamount: number; // 货款金额(X总货款+P总货款)
+        deliveryid: string; // 交割单号(121+Unix秒时间戳(10位)+xxxxxx)
+        deliveryorderid: string; // 申报单号
+        deliverypricemove: number; // 升贴水(升贴水总额)
+        deliveryqty: number; // 交收数量(点选数量)
+        deliverystatus: number; // 状态 - 1:待成交 2:已成交 3:成交失败 4:履约完成
+        deliverytime: string; // 交割时间
+        deliverytotalamount: number; // 交收金额
+        enddate: string; // 结束交易日(yyyymmdd)
+        enumdicname: string; // 单位名称
+        matchaccountid: number; // 对手账号ID
+        matchusername: string; // 对手方名称(仓单持有人)
+        p1goodsremainamount: number; // 点价货款 ps:当PPRICEMODE=2时, 界面需显示"-"
+        pdeliverycloseqty: number; // p合约平仓数量
+        pdeliveryprice: number; // 点价价格 ps:当PPRICEMODE=2时, 界面需显示"-"
+        pgoodscode: string; // 商品代码
+        pgoodsid: number; // p点选合约id
+        pgoodsname: string; // 商品名称
+        ppricemode: number; // 点价价格方式 - 1:商品价 2:固定值
+        remaintotalamount: number; // 实际剩余总货款 = (X、P剩余总货款 + 升贴水总额) * (实际成交数量/交割数量)
+        tradedate: string; // 交易日(yyyymmdd)
+        userid: number; // 用户id
+        username: string; // 用户名称
+        warehousename: string; // 仓库名称
+        wrfactortypeid: string; // 仓单要素类型ID
+        wrtypename: string; // 商品
+        xdeliverycloseqty: number; // 合约数量
+        xdeliveryprice: number; // 交易合约交割价
+        xgoodsamount: number; // 期初均价
+        xgoodscode: string; // 商品代码
+        xgoodsid: number; // x交易合约ID
+        xgoodsname: string; // 商品名称
+        xgoodsremainamount: number; // X剩余总货款
+    }
+
+    /** 交收提货-线下交收单 请求 */
+    interface MineTradeGoodsDeliveryOfflinesReq {
+        userid?: number; // 用户id
+        page?: number; // 页码
+        pagesize?: number; // 每页条数
+    }
+
+    /** 交收提货-线下交收单 响应 */
+    interface MineTradeGoodsDeliveryOfflinesRsp {
+        accountid: number; // 账户ID
+        buyorsell: number; // 交收方向 - 0:买 1:卖
+        buyorselldisplay: string; // 交收方向
+        closetime: string; // 完成时间
+        closetradedate: string; // 完成交易日
+        deliveryamount: number; // 交收货款
+        deliveryinfo: string; // 交收信息
+        deliverylot: number; // 交收手数
+        deliveryorderid: string; // 交收单号(905+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
+        deliveryprice: number; // 交收价格
+        deliveryqty: number; // 交收数量 (手数*合约乘数)
+        goodscode: string; // 期货合约代码(内部)
+        goodsid: number; // 商品ID
+        goodsname: string; // 期货合约名称
+        goodsnamedisplay: string; // 商品名称
+        goodsunit: string; // 单位
+        marketid: number; // 市场ID
+        matchaccountid: number; // 对手方AccountID
+        matchuserid: number; // 对手方UserID
+        matchusername: string; // [交收对手方]客户名称(企业名称)
+        orderstatus: number; // 单据状态 - 1:待处理 2:交收中 3:已完成
+        orderstatusdisplay: string; // 单据状态
+        reqtime: string; // 申请时间
+        reqtradedate: string; // 申请交易日
+        userid: number; // 申请用户ID
+    }
 }

+ 50 - 1
src/types/proto/trade.d.ts

@@ -481,7 +481,7 @@ declare global {
             OrderSrc?: number; // uint32 单据来源
             OperatorID?: number; // uint64 操作员账号ID
         }
-        
+
         // 按单平仓应答 0 3 106
         interface HolderCloseRsp {
             Header?: IMessageHead; // 消息头
@@ -490,5 +490,54 @@ declare global {
             OrderID?: number; // 一级生成的订单号
             OrderTime?: string; // 接收委托交易的时间
         }
+
+        /** 交割申报单明细 */
+        interface DeliveryOrderDetail {
+            AccountID: number; // 对手方账号
+            Qty: number; // 点选数量
+            BrandID: number; // 品牌
+            QualityID: number; // 品质
+            StandardID: number; // 规格
+            WarehouseID: number; // 仓库
+            DeliveryMonthID: number; // 月份
+            ReceiverAddress: string; // 提货地址
+            TakeMode: number; // 提货方式
+            LadingBillID: string; // 提单ID
+            SubNum: number; // 提单子单号
+            WRFactorTypeID: string; // 仓单要素类型ID
+        }
+
+        /** 交割申报请求 */
+        interface DeliveryOrderReq {
+            Header?: IMessageHead; // 消息头
+            ClientSerialNo: string; // 客户端流水号
+            ClientOrderTime: string; // 客户端委托时间
+            ClientType: number; // 终端类型
+            AccountID: number; // 交易账号
+            XGoodsID: number; // 主商品ID(交割合约)
+            PGoodsID: number; // 辅助商品ID(辅助合约)
+            P2GoodsID: number; // 辅助商品ID(辅助合约2)
+            DeliveryGoodsID: number; // 交割商品ID
+            XQty: number; // 交割合约数量
+            PQty: number; // 辅助合约数量
+            P2Qty: number; // 辅助合约2数量
+            DeliveryQty: number; // 交割商品仓单数量
+            OperateType: number; // 操作类型:
+            OrderSrc: number; // 单据来源
+            OperatorID: number; // 操作员账号ID
+            DeliveryOrderDetail: Partial<DeliveryOrderDetail>; // 关联仓单头寸
+            TakeMode: number; // 提货方式
+            ReceiverAddress: string; // 提货地址
+        }
+
+        /** 交割申报应答 */
+        interface DeliveryOrderRsp {
+            Header?: IMessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ClientSerialNo: string; // 客户端流水号
+            DeliveryOrderDetails: DeliveryOrderDetail[]; // 一级生成的订单号
+            OrderTime: string; // 接收委托交易的时间
+        }
     }
 }