li.shaoyi 2 yıl önce
ebeveyn
işleme
f232cf3ca3
30 değiştirilmiş dosya ile 1002 ekleme ve 471 silme
  1. 158 0
      src/packages/gstj/components/modules/delivery/index.vue
  2. 77 0
      src/packages/gstj/components/modules/delivery/warehouse-receipt.vue
  3. 27 27
      src/packages/gstj/views/order/list/components/goodsorder/history/Index.vue
  4. 27 27
      src/packages/gstj/views/order/list/components/goodstrade/history/Index.vue
  5. 28 28
      src/packages/gstj/views/order/list/components/listingorder/history/Index.vue
  6. 28 28
      src/packages/gstj/views/order/list/components/listingtrade/history/Index.vue
  7. 32 37
      src/packages/gstj/views/order/position/components/goods/close/Index.vue
  8. 30 0
      src/packages/gstj/views/order/position/components/goods/delivery16/index.vue
  9. 21 22
      src/packages/gstj/views/order/position/components/goods/delivery50/index.vue
  10. 10 8
      src/packages/gstj/views/order/position/components/goods/list/Index.vue
  11. 8 4
      src/packages/gstj/views/spot/add/components/buy/index.vue
  12. 6 1
      src/packages/gstj/views/spot/add/components/buy/warehouse-receipt.vue
  13. 1 1
      src/packages/gstj/views/spot/list/Index.vue
  14. 1 1
      src/packages/mobile/views/ballot/detail/components/delisting/index.vue
  15. 27 27
      src/packages/mobile/views/order/list/components/goodsorder/history/Index.vue
  16. 27 27
      src/packages/mobile/views/order/list/components/goodstrade/history/Index.vue
  17. 28 28
      src/packages/mobile/views/order/list/components/listingorder/history/Index.vue
  18. 28 28
      src/packages/mobile/views/order/list/components/listingtrade/history/Index.vue
  19. 27 27
      src/packages/mobile/views/order/list/components/swaporder/history/Index.vue
  20. 27 27
      src/packages/mobile/views/order/list/components/swaptrade/history/Index.vue
  21. 1 1
      src/packages/mobile/views/order/position/components/goods/list/Index.vue
  22. 1 1
      src/packages/pc/components/modules/goods-detail/index.vue
  23. 158 0
      src/packages/qxst/components/modules/delivery/index.vue
  24. 77 0
      src/packages/qxst/components/modules/delivery/warehouse-receipt.vue
  25. 27 27
      src/packages/qxst/views/order/list/components/goodsorder/history/Index.vue
  26. 27 27
      src/packages/qxst/views/order/list/components/goodstrade/history/Index.vue
  27. 32 37
      src/packages/qxst/views/order/position/components/goods/close/Index.vue
  28. 30 0
      src/packages/qxst/views/order/position/components/goods/delivery16/index.vue
  29. 21 22
      src/packages/qxst/views/order/position/components/goods/delivery50/index.vue
  30. 10 8
      src/packages/qxst/views/order/position/components/goods/list/Index.vue

+ 158 - 0
src/packages/gstj/components/modules/delivery/index.vue

@@ -0,0 +1,158 @@
+<!-- 交收操作 -->
+<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 title="持仓信息" inset v-if="$slots.header">
+                    <slot name="header"></slot>
+                </CellGroup>
+                <CellGroup title="交收信息" inset>
+                    <Field name="wrstandardname" label="点选仓单" placeholder="请选择" :rules="formRules.wrstandardname"
+                        v-model="checkedRow.wrstandardname" @click="showWarehouseReceipt = true" is-link readonly />
+                    <template v-if="checkedRow.deliverygoodsid">
+                        <Field label="持有人" v-model="checkedRow.username" readonly />
+                        <Field label="仓库" v-model="checkedRow.warehousename" readonly />
+                        <Field label="数量" v-model="checkedRow.avalidqty" readonly />
+                    </template>
+                </CellGroup>
+                <CellGroup inset>
+                    <Field name="DeliveryQty" type="digit" :rules="formRules.DeliveryQty" label="交收数量">
+                        <template #input>
+                            <Stepper v-model="formData.DeliveryQty" theme="round" button-size="22" :min="0" :max="maxQty"
+                                integer />
+                        </template>
+                    </Field>
+                    <Field label="升贴水">
+                        <template #input>
+                            {{ discount.toFixed(2) }}
+                        </template>
+                    </Field>
+                    <slot name="form" :discount="discount" :qty="formData.DeliveryQty ?? 0"></slot>
+                </CellGroup>
+            </Form>
+            <template #footer>
+                <Button block square type="danger" @click="formRef?.submit">提交</Button>
+            </template>
+        </app-view>
+        <component :is="WarehouseReceipt" v-model:show="showWarehouseReceipt" :goods-id="goodsId" @change="onChange" />
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { reactive, shallowRef, computed, defineAsyncComponent } from 'vue'
+import { v4 } from 'uuid'
+import { CellGroup, Button, FieldRule, Form, Field, Stepper, FormInstance } from 'vant'
+import { dialog, fullloading } 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({
+    goodsId: {
+        type: Number,
+        required: true,
+    },
+    total: {
+        type: Number,
+        required: true,
+    }
+})
+
+const WarehouseReceipt = defineAsyncComponent(() => import('./warehouse-receipt.vue'))
+
+const accountStore = useAccountStore()
+const showModal = shallowRef(true)
+const refresh = shallowRef(false) // 是否刷新父组件数据
+const formRef = shallowRef<FormInstance>()
+const checkedRow = shallowRef<Partial<Model.WrDeliveryAvalidHoldLBRsp>>({}) //选中的点选仓单
+const showWarehouseReceipt = shallowRef(false)
+
+const formData = reactive<Partial<Proto.DeliveryOrderReq>>({
+    ClientType: ClientType.Web,
+    AccountID: accountStore.currentAccountId,
+    XGoodsID: props.goodsId
+})
+
+// 可选最大交收数量
+const maxQty = computed(() => {
+    const avalidqty = checkedRow.value.avalidqty ?? 0
+    const enableqty = props.total
+    return avalidqty > enableqty ? enableqty : avalidqty
+})
+
+// 升贴水
+const discount = computed(() => (checkedRow.value.pricemove ?? 0) * (formData.DeliveryQty ?? 0))
+
+// 表单验证规则
+const formRules: { [key: string]: FieldRule[] } = {
+    wrstandardname: [{
+        message: '请选择点选仓单',
+        validator: () => {
+            return !!checkedRow.value.deliverygoodsid
+        }
+    }],
+    DeliveryQty: [{
+        message: '请输入交收数量',
+        validator: () => {
+            return !!formData.DeliveryQty
+        }
+    }],
+}
+
+// 选择现货仓单
+const onChange = (item: Model.WrDeliveryAvalidHoldLBRsp) => {
+    checkedRow.value = item
+    showWarehouseReceipt.value = false
+}
+
+const onSubmit = () => {
+    dialog({
+        message: '确认要交收吗?',
+        showCancelButton: true,
+    }).then(() => {
+        fullloading((hideLoading) => {
+            const item = checkedRow.value
+            formData.DeliveryGoodsID = item.deliverygoodsid
+            formData.XQty = formData.DeliveryQty
+            formData.DeliveryOrderDetail = {
+                AccountID: item.accountid, // 对手方账号
+                Qty: formData.DeliveryQty, // 点选数量
+                LadingBillID: item.ladingbillid,// 提单ID
+                SubNum: item.subnum, // 提单子单号
+                WRFactorTypeID: item.wrfactortypeid, // 仓单要素类型ID
+            }
+            formData.ClientSerialNo = v4()
+            formData.ClientOrderTime = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+
+            deliveryOrder({
+                data: formData
+            }).then(() => {
+                hideLoading('交收成功', 'success')
+                closed(true)
+            }).catch((err) => {
+                hideLoading(err, 'fail')
+            })
+        })
+    })
+}
+
+// 关闭弹窗
+const closed = (isRefresh = false) => {
+    if (showWarehouseReceipt.value) {
+        showWarehouseReceipt.value = false
+    } else {
+        refresh.value = isRefresh
+        showModal.value = false
+    }
+}
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed,
+})
+</script>

+ 77 - 0
src/packages/gstj/components/modules/delivery/warehouse-receipt.vue

@@ -0,0 +1,77 @@
+<template>
+    <app-modal direction="right" height="100%">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar title="选择点选仓单" @back="closed" />
+            </template>
+            <RadioGroup class="g-form__container" v-model="checkedRow" v-if="dataList.length">
+                <CellGroup v-for="(item, index) in dataList" :key="index" @click="onChange(item)" inset>
+                    <Cell>
+                        <template #title>
+                            <Radio :name="item" checked-color="#ee0a24">
+                                <ul style="margin-left: .2rem;">
+                                    <li>
+                                        <span>持有人:</span>
+                                        <span>{{ item.username }}</span>
+                                    </li>
+                                    <li>
+                                        <span>商品:</span>
+                                        <span>{{ item.wrstandardname }}</span>
+                                    </li>
+                                    <li>
+                                        <span>仓库:</span>
+                                        <span>{{ item.warehousename }}</span>
+                                    </li>
+                                    <li>
+                                        <span>数量:</span>
+                                        <span>{{ item.avalidqty }}</span>
+                                    </li>
+                                    <li>
+                                        <span>升贴水:</span>
+                                        <span>{{ item.pricemove }}</span>
+                                    </li>
+                                </ul>
+                            </Radio>
+                        </template>
+                    </Cell>
+                </CellGroup>
+            </RadioGroup>
+            <Empty description="暂无数据" v-else />
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { RadioGroup, Radio, Cell, CellGroup, Empty } from 'vant'
+import { useRequest } from '@/hooks/request'
+import { queryWrDeliveryAvalidHoldLB } from '@/services/api/transfer'
+import AppModal from '@/components/base/modal/index.vue'
+
+const props = defineProps({
+    goodsId: {
+        type: Number,
+        required: true,
+    },
+})
+
+const emit = defineEmits(['update:show', 'change'])
+const checkedRow = shallowRef<Model.WrDeliveryAvalidHoldLBRsp>()
+
+const { dataList } = useRequest(queryWrDeliveryAvalidHoldLB, {
+    params: {
+        goodsid: props.goodsId,
+    },
+})
+
+// 选择仓单
+const onChange = (item: Model.WrDeliveryAvalidHoldLBRsp) => {
+    checkedRow.value = item
+    emit('change', item)
+}
+
+// 关闭弹窗
+const closed = () => {
+    emit('update:show', false)
+}
+</script>

+ 27 - 27
src/packages/gstj/views/order/list/components/goodsorder/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -47,17 +50,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryHisTradeOrderDetail } from '@/services/api/order'
 import { getBuyOrSellName, getWRTradeOrderStatusName } from '@/constants/order'
@@ -70,14 +73,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.HisTradeOrderDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.HisTradeOrderDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -87,14 +88,11 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.HisTradeOrderDetailReq>({
-    tradeMode: '50,16'
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryHisTradeOrderDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        tradeMode: '50,16',
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -112,18 +110,20 @@ const showComponent = (componentName: string, row: Model.HisTradeOrderDetailRsp)
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.startDate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.endDate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.startDate + '-' + formData.endDate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [startDate, endDate] = dateRange.value
+    run({
+        startDate,
+        endDate,
+    })
 }
 
 // 关闭弹窗

+ 27 - 27
src/packages/gstj/views/order/list/components/goodstrade/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -52,17 +55,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryHisTradeDetail } from '@/services/api/order'
 import { getBuyOrSellName, getBuildTypeName } from '@/constants/order'
@@ -75,14 +78,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.HisTradeDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.HisTradeDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -92,14 +93,11 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.HisTradeDetailReq>({
-    tradeMode: '50,16'
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryHisTradeDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        tradeMode: '50,16',
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -117,18 +115,20 @@ const showComponent = (componentName: string, row: Model.HisTradeDetailRsp) => {
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.startDate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.endDate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.startDate + '-' + formData.endDate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [startDate, endDate] = dateRange.value
+    run({
+        startDate,
+        endDate,
+    })
 }
 
 // 关闭弹窗

+ 28 - 28
src/packages/gstj/views/order/list/components/listingorder/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -48,17 +51,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryWrOrderDetail } from '@/services/api/order'
 import { getBuyOrSellName, getWRTradeOrderStatusName } from '@/constants/order'
@@ -71,14 +74,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.WrOrderDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.WrOrderDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -88,15 +89,12 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.WrOrderDetailReq>({
-    marketid: 17201,
-    haswr: 1,
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryWrOrderDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        marketid: 17201,
+        haswr: 1,
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -114,18 +112,20 @@ const showComponent = (componentName: string, row: Model.WrOrderDetailRsp) => {
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.begindate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.enddate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.begindate + '-' + formData.enddate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [begindate, enddate] = dateRange.value
+    run({
+        begindate,
+        enddate,
+    })
 }
 
 // 关闭弹窗

+ 28 - 28
src/packages/gstj/views/order/list/components/listingtrade/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -45,17 +48,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryWrTradeDetail } from '@/services/api/order'
 import { getBuyOrSellName } from '@/constants/order'
@@ -68,14 +71,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.WrTradeDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.WrTradeDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -85,15 +86,12 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.WrTradeDetailReq>({
-    marketid: 17201,
-    haswr: 1
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryWrTradeDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        marketid: 17201,
+        haswr: 1
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -111,18 +109,20 @@ const showComponent = (componentName: string, row: Model.WrTradeDetailRsp) => {
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.begindate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.enddate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.begindate + '-' + formData.enddate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [begindate, enddate] = dateRange.value
+    run({
+        begindate,
+        enddate,
+    })
 }
 
 // 关闭弹窗

+ 32 - 37
src/packages/gstj/views/order/position/components/goods/close/Index.vue

@@ -3,54 +3,52 @@
     <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>
-            <div class="order-detail__container g-form__container">
-                <CellGroup title="持仓信息">
+            <Form ref="formRef" class="g-form__container" @submit="onCloseSumit">
+                <CellGroup title="持仓信息" inset>
                     <Cell title="商品代码/名称" :value="`${selectedRow.goodscode}/${selectedRow.goodsname}`" />
                     <Cell title="持仓方向" :value="getBuyOrSellName(selectedRow.buyorsell)" />
                     <Cell title="持仓金额" :value="formatDecimal(selectedRow.curholderamount)" />
-                    <Cell title="持仓数量" :value="formatDecimal(selectedRow.curpositionqty)" />
-                    <Cell title="冻结数量" :value="formatDecimal(selectedRow.frozenqty)" />
-                    <Cell title="可用数量" :value="formatDecimal(selectedRow.enableqty)" />
+                    <Cell title="持仓数量" :value="selectedRow.curpositionqty" />
+                    <Cell title="冻结数量" :value="selectedRow.frozenqty" />
+                    <Cell title="可用数量" :value="selectedRow.enableqty" />
                     <Cell title="持仓均价" :value="formatDecimal(selectedRow.averageprice)" />
                     <Cell title="参考损益">
                         <template #value>
-                            <span :class="handlePriceColor(closepl, 0.0)">{{ formatDecimal(closepl) }}</span>
+                            <span :class="selectedRow.closeplColor">{{ formatDecimal(selectedRow.closepl) }}</span>
                         </template>
                     </Cell>
                 </CellGroup>
-                <CellGroup title="转让信息">
+                <CellGroup title="转让信息" inset>
                     <Cell title="当前价" :value="handleNumberValue(quote?.last)" />
-                    <Form class="goods-close__form" ref="formRef" @submit="onCloseSumit" v-if="props">
-                        <Field name="OrderPrice" :rules="formRules.OrderPrice" label="转让价格">
-                            <template #input>
-                                <Stepper v-model="formData.OrderPrice" theme="round" button-size="22" :min="0"
-                                    :decimal-length="selectedRow.decimalplace" :auto-fixed="false" />
-                            </template>
-                        </Field>
-                        <Field name="OrderQty" :rules="formRules.OrderQty" label="转让数量">
-                            <template #input>
-                                <Stepper v-model="formData.OrderQty" theme="round" button-size="22" :min="0"
-                                    :max="selectedRow.enableqty" :auto-fixed="false" integer />
-                            </template>
-                        </Field>
-                    </Form>
+                    <Field name="OrderPrice" :rules="formRules.OrderPrice" label="转让价格">
+                        <template #input>
+                            <Stepper v-model="formData.OrderPrice" theme="round" button-size="22" :min="0"
+                                :decimal-length="selectedRow.decimalplace" :auto-fixed="false" />
+                        </template>
+                    </Field>
+                    <Field name="OrderQty" :rules="formRules.OrderQty" label="转让数量">
+                        <template #input>
+                            <Stepper v-model="formData.OrderQty" theme="round" button-size="22" :min="0"
+                                :max="selectedRow.enableqty" :auto-fixed="false" integer />
+                        </template>
+                    </Field>
                 </CellGroup>
-            </div>
+            </Form>
             <template #footer>
-                <Button block square type="danger" @click="onCloseSumit">转让</Button>
+                <Button block square type="danger" @click="formRef?.submit">转让</Button>
             </template>
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, PropType, onMounted, computed } from 'vue'
+import { shallowRef, PropType, onMounted } from 'vue'
 import AppModal from '@/components/base/modal/index.vue'
-import { CellGroup, Cell, Button, FieldRule, Form, Field, Stepper } from 'vant'
+import { CellGroup, Cell, Button, FieldRule, Form, Field, Stepper, FormInstance } from 'vant'
 import { getBuyOrSellName, BuyOrSell } from '@/constants/order'
-import { formatDecimal, handleNumberValue, handlePriceColor } from '@/filters'
+import { formatDecimal, handleNumberValue } from '@/filters'
 import { useOrder } from '@/business/trade'
 import { dialog, fullloading } from '@/utils/vant'
 import { useFuturesStore } from '@/stores'
@@ -58,27 +56,24 @@ import { EBuildType, EDelistingType, EListingSelectType, EOrderOperateType, EPri
 
 const props = defineProps({
     selectedRow: {
-        type: Object as PropType<Model.TradePositionRsp>,
+        type: Object as PropType<Model.TradePositionRsp & {
+            closepl: number; // 浮动盈亏
+            closeplColor: string; // 浮动盈亏颜色
+        }>,
         required: true,
     }
 })
 
 const futuresStore = useFuturesStore()
 const quote = futuresStore.getGoodsQuote(props.selectedRow.goodscode)
+const formRef = shallowRef<FormInstance>()
 const showModal = shallowRef(true)
 // 是否刷新父组件数据
 const refresh = shallowRef(false)
 const { formSubmit, formData } = useOrder()
 
-// 损益
-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: { [key in keyof Proto.OrderReq]?: FieldRule[] } = {
+const formRules: { [key: string]: FieldRule[] } = {
     OrderPrice: [{
         message: '请输入转让价格',
         validator: () => {
@@ -115,7 +110,7 @@ const onCloseSumit = () => {
         /// loding....
         fullloading((hideLoading) => {
             formSubmit().then(() => {
-                hideLoading('转让成功')
+                hideLoading('转让成功', 'success')
                 closed(true)
             }).catch((err) => {
                 hideLoading(err, 'fail')

+ 30 - 0
src/packages/gstj/views/order/position/components/goods/delivery16/index.vue

@@ -0,0 +1,30 @@
+<!-- 我的订单- 订单持仓 - 交收 -->
+<template>
+    <Delivery ref="deliveryRef" v-bind="{ goodsId: selectedRow.goodsid, total: selectedRow.enableqty }">
+        <template #header>
+            <Cell title="商品代码/名称" :value="`${selectedRow.goodscode}/${selectedRow.goodsname}`" />
+            <Cell title="持仓数量" :value="selectedRow.curpositionqty" />
+            <Cell title="可用数量" :value="selectedRow.enableqty" />
+        </template>
+    </Delivery>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { Cell } from 'vant'
+import Delivery from '../../../../../../components/modules/delivery/index.vue'
+
+defineProps({
+    selectedRow: {
+        type: Object as PropType<Model.TradePositionRsp>,
+        required: true,
+    }
+})
+
+const deliveryRef = shallowRef()
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed: () => deliveryRef.value?.closed(),
+})
+</script>

+ 21 - 22
src/packages/gstj/views/order/position/components/goods/delivery/Index.vue → src/packages/gstj/views/order/position/components/goods/delivery50/index.vue

@@ -3,16 +3,16 @@
     <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>
-            <div class="order-detail__container g-form__container">
-                <CellGroup title="持仓信息">
+            <Form ref="formRef" class="g-form__container" @submit="onDeliverySumit">
+                <CellGroup title="持仓信息" inset>
                     <Cell title="商品代码/名称" :value="`${selectedRow.goodscode}/${selectedRow.goodsname}`" />
                     <Cell title="持仓方向" :value="getBuyOrSellName(selectedRow.buyorsell)" />
                     <Cell title="持仓金额" :value="formatDecimal(selectedRow.marketamount)" />
-                    <Cell title="持仓数量" :value="formatDecimal(selectedRow.curpositionqty)" />
-                    <Cell title="冻结数量" :value="formatDecimal(selectedRow.frozenqty)" />
-                    <Cell title="可用数量" :value="formatDecimal(selectedRow.enableqty)" />
+                    <Cell title="持仓数量" :value="selectedRow.curpositionqty" />
+                    <Cell title="冻结数量" :value="selectedRow.frozenqty" />
+                    <Cell title="可用数量" :value="selectedRow.enableqty" />
                     <Cell title="持仓均价" :value="formatDecimal(selectedRow.averageprice)" />
                     <Cell title="参考损益">
                         <template #value>
@@ -20,23 +20,21 @@
                         </template>
                     </Cell>
                 </CellGroup>
-                <CellGroup title="交收信息">
+                <CellGroup title="交收信息" inset>
                     <Cell title="交收对手方" :value="selectedRow.matchname" />
-                    <Form class="goods-close__form" ref="formRef" @submit="onDeliverySumit" v-if="props">
-                        <Field name="DeliveryLot" type="digit" :rules="formRules.DeliveryLot" label="交收数量">
-                            <template #input>
-                                <Stepper v-model="formData.DeliveryLot" theme="round" button-size="22" :min="0"
-                                    :max="selectedRow.enableqty" :auto-fixed="false" integer />
-                            </template>
-                        </Field>
-                        <Field name="DeliveryInfo" v-model="formData.DeliveryInfo" type="textarea" autosize clearable
-                            :rules="formRules.DeliveryInfo" maxlength="50" label="交收信息" placeholder="请输入交收信息">
-                        </Field>
-                    </Form>
+                    <Field name="DeliveryLot" type="digit" :rules="formRules.DeliveryLot" label="交收数量">
+                        <template #input>
+                            <Stepper v-model="formData.DeliveryLot" theme="round" button-size="22" :min="0"
+                                :max="selectedRow.enableqty" :auto-fixed="false" integer />
+                        </template>
+                    </Field>
+                    <Field name="DeliveryInfo" v-model="formData.DeliveryInfo" type="textarea" autosize clearable
+                        :rules="formRules.DeliveryInfo" maxlength="50" label="交收信息" placeholder="请输入交收信息">
+                    </Field>
                 </CellGroup>
-            </div>
+            </Form>
             <template #footer>
-                <Button type="primary" block round @click="onDeliverySumit">交收</Button>
+                <Button block square type="danger" @click="formRef?.submit">提交</Button>
             </template>
         </app-view>
     </app-modal>
@@ -45,7 +43,7 @@
 <script lang="ts" setup>
 import { shallowRef, PropType, computed } from 'vue'
 import AppModal from '@/components/base/modal/index.vue'
-import { CellGroup, Cell, Button, FieldRule, Form, Field, Stepper } from 'vant'
+import { CellGroup, Cell, Button, FieldRule, Form, Field, Stepper, FormInstance } from 'vant'
 import { getBuyOrSellName, BuyOrSell } from '@/constants/order'
 import { formatDecimal } from '@/filters'
 import { useOfflineDelivery } from '@/business/trade'
@@ -62,6 +60,7 @@ const props = defineProps({
 const showModal = shallowRef(true)
 // 是否刷新父组件数据
 const refresh = shallowRef(false)
+const formRef = shallowRef<FormInstance>()
 const { formSubmit, formData } = useOfflineDelivery()
 const futuresStore = useFuturesStore()
 const quote = futuresStore.getGoodsQuote(props.selectedRow.goodscode)
@@ -74,7 +73,7 @@ const closepl = computed(() => {
 })
 
 // 表单验证规则
-const formRules: { [key in keyof Proto.OfflineDeliveryReq]?: FieldRule[] } = {
+const formRules: { [key: string]: FieldRule[] } = {
     DeliveryLot: [{
         message: '请输入交收数量',
         validator: (val) => {

+ 10 - 8
src/packages/gstj/views/order/position/components/goods/list/Index.vue

@@ -17,7 +17,7 @@
                     <ul>
                         <li>
                             <span>持有数量</span>
-                            <span>{{ formatDecimal(item.curpositionqty) }}</span>
+                            <span>{{ item.curpositionqty }}</span>
                         </li>
                         <li>
                             <span>持仓均价</span>
@@ -25,7 +25,7 @@
                         </li>
                         <li>
                             <span>冻结数量</span>
-                            <span>{{ formatDecimal(item.frozenqty) }}</span>
+                            <span>{{ item.frozenqty }}</span>
                         </li>
                         <li>
                             <span>持仓金额</span>
@@ -33,11 +33,11 @@
                         </li>
                         <li>
                             <span>可用数量</span>
-                            <span>{{ formatDecimal(item.enableqty) }}</span>
+                            <span>{{ item.enableqty }}</span>
                         </li>
                         <li>
                             <span>参考损益</span>
-                            <span :class="handlePriceColor(item.closepl, 0)">
+                            <span :class="item.closeplColor">
                                 {{ formatDecimal(item.closepl) }}
                             </span>
                         </li>
@@ -45,7 +45,8 @@
                 </div>
                 <div class="g-order-list__btnbar" v-if="item.enableqty">
                     <Button size="small" @click="showComponent('close', item)" round>转让</Button>
-                    <Button size="small" @click="showComponent('delivery', item)" round>交收</Button>
+                    <Button size="small" @click="showComponent(item.trademode === 16 ? 'delivery16' : 'delivery50', item)"
+                        round>交收</Button>
                 </div>
             </div>
         </div>
@@ -60,16 +61,17 @@ import { Button } from 'vant'
 import { useComponent } from '@/hooks/component'
 import AppPullRefresh from '../../../../../../components/base/pull-refresh/index.vue'
 import { getBuyOrSellName } from '@/constants/order'
-import { formatDecimal, handleNumberValue, handlePriceColor } from '@/filters'
+import { formatDecimal, handleNumberValue } from '@/filters'
 import { usePosition } from '@/business/position'
 import eventBus from '@/services/bus'
 
 const componentMap = new Map<string, unknown>([
     ['close', defineAsyncComponent(() => import('../close/Index.vue'))],
-    ['delivery', defineAsyncComponent(() => import('../delivery/Index.vue'))]
+    ['delivery50', defineAsyncComponent(() => import('../delivery50/index.vue'))],
+    ['delivery16', defineAsyncComponent(() => import('../delivery16/index.vue'))]
 ])
 
-const { positionList, loading } = usePosition(50)
+const { positionList, loading } = usePosition(50, 16)
 const selectedRow = shallowRef<Model.TradePositionRsp>()
 const pullRefreshRef = shallowRef()
 

+ 8 - 4
src/packages/gstj/views/spot/add/components/buy/index.vue

@@ -4,10 +4,9 @@
             <CellGroup inset>
                 <Performance ref="performanceRef" tmptype="0,2" name="PerformanceTemplateID"
                     v-model="formData.PerformanceTemplateID" />
-                <Field name="WRFactorTypeId" label="现货仓单" placeholder="请选择" v-model="selectedRow.wrfactortypeid"
+                <Field name="WRFactorTypeId" label="现货仓单" placeholder="请选择" v-model="selectedRow.wrstandardname"
                     :rules="formRules.WRFactorTypeId" @click="showWarehouseReceipt = true" is-link readonly />
                 <template v-if="selectedRow.wrfactortypeid">
-                    <Field label="商品" v-model="selectedRow.wrstandardname" readonly />
                     <Field label="仓库" v-model="selectedRow.warehousename" readonly />
                     <Field label="可用量">
                         <template #input>
@@ -127,7 +126,12 @@ const formSubmit = () => {
 
 // 离开页面前关闭组件
 onBeforeRouteLeave((to, from, next) => {
-    const flag = performanceRef.value?.closed()
-    next(flag)
+    if (showWarehouseReceipt.value) {
+        showWarehouseReceipt.value = false
+        next(false)
+    } else {
+        const flag = performanceRef.value?.closed()
+        next(flag)
+    }
 })
 </script>

+ 6 - 1
src/packages/gstj/views/spot/add/components/buy/warehouse-receipt.vue

@@ -2,7 +2,7 @@
     <app-modal direction="right" height="100%">
         <app-view class="g-form">
             <template #header>
-                <app-navbar title="选择现货仓单" />
+                <app-navbar title="选择现货仓单" @back="closed" />
             </template>
             <RadioGroup class="g-form__container" v-model="checkedRow" v-if="dataList.length">
                 <CellGroup v-for="(item, index) in dataList" :key="index" @click="onChange(item)" inset>
@@ -48,4 +48,9 @@ const onChange = (item: Model.HoldLBRsp) => {
     checkedRow.value = item
     emit('change', item)
 }
+
+// 关闭弹窗
+const closed = () => {
+    emit('update:show', false)
+}
 </script>

+ 1 - 1
src/packages/gstj/views/spot/list/Index.vue

@@ -4,7 +4,7 @@
             <app-navbar title="现货挂牌" :show-back-button="false">
                 <template #right>
                     <Icon name="add" size=".4rem" @click="$router.push({ name: 'spot-add' })" />
-                    <Icon name="bars" size=".4rem" @click="isWaterfall = !isWaterfall" />
+                    <Icon name="bars" size=".4rem" @click="isWaterfall = !isWaterfall" style="margin-left: .2rem;" />
                 </template>
             </app-navbar>
         </template>

+ 1 - 1
src/packages/mobile/views/ballot/detail/components/delisting/index.vue

@@ -58,7 +58,7 @@ const refresh = shallowRef(false) // 是否刷新父组件数据
 const showModal = shallowRef(true)
 
 // 表单验证规则
-const formRules: { [key in keyof Proto.OrderReq]?: FieldRule[] } = {
+const formRules: { [key: string]: FieldRule[] } = {
     OrderQty: [{
         validator: (val) => {
             if (val) {

+ 27 - 27
src/packages/mobile/views/order/list/components/goodsorder/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -47,17 +50,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryHisTradeOrderDetail } from '@/services/api/order'
 import { getBuyOrSellName, getWRTradeOrderStatusName } from '@/constants/order'
@@ -70,14 +73,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.HisTradeOrderDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.HisTradeOrderDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -87,14 +88,11 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.HisTradeOrderDetailReq>({
-    tradeMode: '50,16',
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryHisTradeOrderDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        tradeMode: '50,16',
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -112,18 +110,20 @@ const showComponent = (componentName: string, row: Model.HisTradeOrderDetailRsp)
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.startDate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.endDate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.startDate + '-' + formData.endDate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [startDate, endDate] = dateRange.value
+    run({
+        startDate,
+        endDate,
+    })
 }
 
 // 关闭弹窗

+ 27 - 27
src/packages/mobile/views/order/list/components/goodstrade/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -52,17 +55,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryHisTradeDetail } from '@/services/api/order'
 import { getBuyOrSellName, getBuildTypeName } from '@/constants/order'
@@ -75,14 +78,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.HisTradeDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.HisTradeDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -92,14 +93,11 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.HisTradeDetailReq>({
-    tradeMode: '50,16'
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryHisTradeDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        tradeMode: '50,16',
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -117,18 +115,20 @@ const showComponent = (componentName: string, row: Model.HisTradeDetailRsp) => {
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.startDate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.endDate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.startDate + '-' + formData.endDate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [startDate, endDate] = dateRange.value
+    run({
+        startDate,
+        endDate,
+    })
 }
 
 // 关闭弹窗

+ 28 - 28
src/packages/mobile/views/order/list/components/listingorder/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -48,17 +51,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryWrOrderDetail } from '@/services/api/order'
 import { getBuyOrSellName, getWRTradeOrderStatusName } from '@/constants/order'
@@ -71,14 +74,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.WrOrderDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.WrOrderDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -88,15 +89,12 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.WrOrderDetailReq>({
-    marketid: 17201,
-    haswr: 1,
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryWrOrderDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        marketid: 17201,
+        haswr: 1,
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -114,18 +112,20 @@ const showComponent = (componentName: string, row: Model.WrOrderDetailRsp) => {
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.begindate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.enddate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.begindate + '-' + formData.enddate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [begindate, enddate] = dateRange.value
+    run({
+        begindate,
+        enddate,
+    })
 }
 
 // 关闭弹窗

+ 28 - 28
src/packages/mobile/views/order/list/components/listingtrade/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -45,17 +48,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryWrTradeDetail } from '@/services/api/order'
 import { getBuyOrSellName } from '@/constants/order'
@@ -68,14 +71,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.WrTradeDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.WrTradeDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -85,15 +86,12 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.WrTradeDetailReq>({
-    marketid: 17201,
-    haswr: 1
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryWrTradeDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        marketid: 17201,
+        haswr: 1
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -111,18 +109,20 @@ const showComponent = (componentName: string, row: Model.WrTradeDetailRsp) => {
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.begindate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.enddate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.begindate + '-' + formData.enddate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [begindate, enddate] = dateRange.value
+    run({
+        begindate,
+        enddate,
+    })
 }
 
 // 关闭弹窗

+ 27 - 27
src/packages/mobile/views/order/list/components/swaporder/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -47,17 +50,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryHisTradeOrderDetail } from '@/services/api/order'
 import { getBuyOrSellName, getWRTradeOrderStatusName } from '@/constants/order'
@@ -70,14 +73,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.HisTradeOrderDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.HisTradeOrderDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -87,14 +88,11 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.HisTradeOrderDetailReq>({
-    tradeMode: '46',
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryHisTradeOrderDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        tradeMode: '46',
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -112,18 +110,20 @@ const showComponent = (componentName: string, row: Model.HisTradeOrderDetailRsp)
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.startDate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.endDate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.startDate + '-' + formData.endDate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [startDate, endDate] = dateRange.value
+    run({
+        startDate,
+        endDate,
+    })
 }
 
 // 关闭弹窗

+ 27 - 27
src/packages/mobile/views/order/list/components/swaptrade/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -49,17 +52,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryHisTradeDetail } from '@/services/api/order'
 import { getBuyOrSellName, getBuildTypeName } from '@/constants/order'
@@ -72,14 +75,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.HisTradeDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.HisTradeDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -89,14 +90,11 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.HisTradeDetailReq>({
-    tradeMode: '46'
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryHisTradeDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        tradeMode: '46'
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -114,18 +112,20 @@ const showComponent = (componentName: string, row: Model.HisTradeDetailRsp) => {
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.startDate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.endDate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.startDate + '-' + formData.endDate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [startDate, endDate] = dateRange.value
+    run({
+        startDate,
+        endDate,
+    })
 }
 
 // 关闭弹窗

+ 1 - 1
src/packages/mobile/views/order/position/components/goods/list/Index.vue

@@ -61,7 +61,7 @@ import { Button } from 'vant'
 import { useComponent } from '@/hooks/component'
 import AppPullRefresh from '../../../../../../components/base/pull-refresh/index.vue'
 import { getBuyOrSellName } from '@/constants/order'
-import { formatDecimal, handleNumberValue, handlePriceColor } from '@/filters'
+import { formatDecimal, handleNumberValue } from '@/filters'
 import { usePosition } from '@/business/position'
 import eventBus from '@/services/bus'
 

+ 1 - 1
src/packages/pc/components/modules/goods-detail/index.vue

@@ -16,7 +16,7 @@
                     <div class="buttonbar">
                         <template v-if="market">
                             <span style="color: #3a87f7;padding:0 10px;">
-                                市场状态:{{ getRunStatusName(market.runstatus) }}
+                                市场状态:{{ [2, 6].includes(market.runstatus) ? getRunStatusName(market.runstatus) : '未开市' }}
                             </span>
                         </template>
                         <slot name="headerRight"></slot>

+ 158 - 0
src/packages/qxst/components/modules/delivery/index.vue

@@ -0,0 +1,158 @@
+<!-- 交收操作 -->
+<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 title="持仓信息" inset v-if="$slots.header">
+                    <slot name="header"></slot>
+                </CellGroup>
+                <CellGroup title="交收信息" inset>
+                    <Field name="wrstandardname" label="点选仓单" placeholder="请选择" :rules="formRules.wrstandardname"
+                        v-model="checkedRow.wrstandardname" @click="showWarehouseReceipt = true" is-link readonly />
+                    <template v-if="checkedRow.deliverygoodsid">
+                        <Field label="持有人" v-model="checkedRow.username" readonly />
+                        <Field label="仓库" v-model="checkedRow.warehousename" readonly />
+                        <Field label="数量" v-model="checkedRow.avalidqty" readonly />
+                    </template>
+                </CellGroup>
+                <CellGroup inset>
+                    <Field name="DeliveryQty" type="digit" :rules="formRules.DeliveryQty" label="交收数量">
+                        <template #input>
+                            <Stepper v-model="formData.DeliveryQty" theme="round" button-size="22" :min="0" :max="maxQty"
+                                integer />
+                        </template>
+                    </Field>
+                    <Field label="升贴水">
+                        <template #input>
+                            {{ discount.toFixed(2) }}
+                        </template>
+                    </Field>
+                    <slot name="form" :discount="discount" :qty="formData.DeliveryQty ?? 0"></slot>
+                </CellGroup>
+            </Form>
+            <template #footer>
+                <Button block square type="danger" @click="formRef?.submit">提交</Button>
+            </template>
+        </app-view>
+        <component :is="WarehouseReceipt" v-model:show="showWarehouseReceipt" :goods-id="goodsId" @change="onChange" />
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { reactive, shallowRef, computed, defineAsyncComponent } from 'vue'
+import { v4 } from 'uuid'
+import { CellGroup, Button, FieldRule, Form, Field, Stepper, FormInstance } from 'vant'
+import { dialog, fullloading } 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({
+    goodsId: {
+        type: Number,
+        required: true,
+    },
+    total: {
+        type: Number,
+        required: true,
+    }
+})
+
+const WarehouseReceipt = defineAsyncComponent(() => import('./warehouse-receipt.vue'))
+
+const accountStore = useAccountStore()
+const showModal = shallowRef(true)
+const refresh = shallowRef(false) // 是否刷新父组件数据
+const formRef = shallowRef<FormInstance>()
+const checkedRow = shallowRef<Partial<Model.WrDeliveryAvalidHoldLBRsp>>({}) //选中的点选仓单
+const showWarehouseReceipt = shallowRef(false)
+
+const formData = reactive<Partial<Proto.DeliveryOrderReq>>({
+    ClientType: ClientType.Web,
+    AccountID: accountStore.currentAccountId,
+    XGoodsID: props.goodsId
+})
+
+// 可选最大交收数量
+const maxQty = computed(() => {
+    const avalidqty = checkedRow.value.avalidqty ?? 0
+    const enableqty = props.total
+    return avalidqty > enableqty ? enableqty : avalidqty
+})
+
+// 升贴水
+const discount = computed(() => (checkedRow.value.pricemove ?? 0) * (formData.DeliveryQty ?? 0))
+
+// 表单验证规则
+const formRules: { [key: string]: FieldRule[] } = {
+    wrstandardname: [{
+        message: '请选择点选仓单',
+        validator: () => {
+            return !!checkedRow.value.deliverygoodsid
+        }
+    }],
+    DeliveryQty: [{
+        message: '请输入交收数量',
+        validator: () => {
+            return !!formData.DeliveryQty
+        }
+    }],
+}
+
+// 选择现货仓单
+const onChange = (item: Model.WrDeliveryAvalidHoldLBRsp) => {
+    checkedRow.value = item
+    showWarehouseReceipt.value = false
+}
+
+const onSubmit = () => {
+    dialog({
+        message: '确认要交收吗?',
+        showCancelButton: true,
+    }).then(() => {
+        fullloading((hideLoading) => {
+            const item = checkedRow.value
+            formData.DeliveryGoodsID = item.deliverygoodsid
+            formData.XQty = formData.DeliveryQty
+            formData.DeliveryOrderDetail = {
+                AccountID: item.accountid, // 对手方账号
+                Qty: formData.DeliveryQty, // 点选数量
+                LadingBillID: item.ladingbillid,// 提单ID
+                SubNum: item.subnum, // 提单子单号
+                WRFactorTypeID: item.wrfactortypeid, // 仓单要素类型ID
+            }
+            formData.ClientSerialNo = v4()
+            formData.ClientOrderTime = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+
+            deliveryOrder({
+                data: formData
+            }).then(() => {
+                hideLoading('交收成功', 'success')
+                closed(true)
+            }).catch((err) => {
+                hideLoading(err, 'fail')
+            })
+        })
+    })
+}
+
+// 关闭弹窗
+const closed = (isRefresh = false) => {
+    if (showWarehouseReceipt.value) {
+        showWarehouseReceipt.value = false
+    } else {
+        refresh.value = isRefresh
+        showModal.value = false
+    }
+}
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed,
+})
+</script>

+ 77 - 0
src/packages/qxst/components/modules/delivery/warehouse-receipt.vue

@@ -0,0 +1,77 @@
+<template>
+    <app-modal direction="right" height="100%">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar title="选择点选仓单" @back="closed" />
+            </template>
+            <RadioGroup class="g-form__container" v-model="checkedRow" v-if="dataList.length">
+                <CellGroup v-for="(item, index) in dataList" :key="index" @click="onChange(item)" inset>
+                    <Cell>
+                        <template #title>
+                            <Radio :name="item" checked-color="#ee0a24">
+                                <ul style="margin-left: .2rem;">
+                                    <li>
+                                        <span>持有人:</span>
+                                        <span>{{ item.username }}</span>
+                                    </li>
+                                    <li>
+                                        <span>商品:</span>
+                                        <span>{{ item.wrstandardname }}</span>
+                                    </li>
+                                    <li>
+                                        <span>仓库:</span>
+                                        <span>{{ item.warehousename }}</span>
+                                    </li>
+                                    <li>
+                                        <span>数量:</span>
+                                        <span>{{ item.avalidqty }}</span>
+                                    </li>
+                                    <li>
+                                        <span>升贴水:</span>
+                                        <span>{{ item.pricemove }}</span>
+                                    </li>
+                                </ul>
+                            </Radio>
+                        </template>
+                    </Cell>
+                </CellGroup>
+            </RadioGroup>
+            <Empty description="暂无数据" v-else />
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { RadioGroup, Radio, Cell, CellGroup, Empty } from 'vant'
+import { useRequest } from '@/hooks/request'
+import { queryWrDeliveryAvalidHoldLB } from '@/services/api/transfer'
+import AppModal from '@/components/base/modal/index.vue'
+
+const props = defineProps({
+    goodsId: {
+        type: Number,
+        required: true,
+    },
+})
+
+const emit = defineEmits(['update:show', 'change'])
+const checkedRow = shallowRef<Model.WrDeliveryAvalidHoldLBRsp>()
+
+const { dataList } = useRequest(queryWrDeliveryAvalidHoldLB, {
+    params: {
+        goodsid: props.goodsId,
+    },
+})
+
+// 选择仓单
+const onChange = (item: Model.WrDeliveryAvalidHoldLBRsp) => {
+    checkedRow.value = item
+    emit('change', item)
+}
+
+// 关闭弹窗
+const closed = () => {
+    emit('update:show', false)
+}
+</script>

+ 27 - 27
src/packages/qxst/views/order/list/components/goodsorder/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -47,17 +50,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryHisTradeOrderDetail } from '@/services/api/order'
 import { getBuyOrSellName, getWRTradeOrderStatusName } from '@/constants/order'
@@ -70,14 +73,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.HisTradeOrderDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.HisTradeOrderDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -87,14 +88,11 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.HisTradeOrderDetailReq>({
-    tradeMode: '50,16'
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryHisTradeOrderDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        tradeMode: '50,16',
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -112,18 +110,20 @@ const showComponent = (componentName: string, row: Model.HisTradeOrderDetailRsp)
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.startDate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.endDate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.startDate + '-' + formData.endDate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [startDate, endDate] = dateRange.value
+    run({
+        startDate,
+        endDate,
+    })
 }
 
 // 关闭弹窗

+ 27 - 27
src/packages/qxst/views/order/list/components/goodstrade/history/Index.vue

@@ -3,11 +3,14 @@
     <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 #footer>
+                        <Cell title="查询日期" :value="dateRange.join('-')" @click="showCalendar = true" is-link />
+                    </template>
+                </app-navbar>
             </template>
-            <Cell title="查询日期" :value="date" @click="show = true" is-link></Cell>
             <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
-                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="run">
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
                 <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">
@@ -52,17 +55,17 @@
                         </div>
                     </div>
                 </div>
-                <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
-                    @closed="closeComponent" v-if="componentId" />
             </app-pull-refresh>
-            <Calendar :show="show" type="range" :max-date="new Date()" :min-date="moment().subtract(1, 'years').toDate()"
-                @close="onClose" @confirm="onConfirm" />
+            <Calendar v-model:show="showCalendar" type="range" :max-date="new Date()"
+                :min-date="moment().subtract(1, 'years').toDate()" @confirm="onConfirm" />
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)"
+                @closed="closeComponent" v-if="componentId" />
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, ref, reactive, defineAsyncComponent } from 'vue'
+import { shallowRef, ref, defineAsyncComponent } from 'vue'
 import { useRequest } from '@/hooks/request'
 import { queryHisTradeDetail } from '@/services/api/order'
 import { getBuyOrSellName, getBuildTypeName } from '@/constants/order'
@@ -75,14 +78,12 @@ import AppPullRefresh from '../../../../../../components/base/pull-refresh/index
 
 const dataList = shallowRef<Model.HisTradeDetailRsp[]>([])
 const showModal = shallowRef(true)
-/// 是否显示日历
-const show = shallowRef(false)
-/// 显示日期
-const date = ref('')
 const selectedRow = shallowRef<Model.HisTradeDetailRsp>()
 const error = shallowRef(false)
 const pullRefreshRef = shallowRef()
 const refresh = shallowRef(false) // 是否刷新父组件数据
+const showCalendar = shallowRef(false) // 是否显示日期选择器
+const dateRange = ref<string[]>([]) // 日期范围
 
 const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
     pullRefreshRef.value?.refresh()
@@ -92,14 +93,11 @@ const componentMap = new Map<string, unknown>([
     ['detail', defineAsyncComponent(() => import('../detail/Index.vue'))],
 ])
 
-const formData = reactive<Model.HisTradeDetailReq>({
-    tradeMode: '50,16'
-})
-
 const { loading, pageIndex, pageCount, run } = useRequest(queryHisTradeDetail, {
     manual: true,
     params: {
-        ...formData
+        pagesize: 20,
+        tradeMode: '50,16',
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
@@ -117,18 +115,20 @@ const showComponent = (componentName: string, row: Model.HisTradeDetailRsp) => {
     openComponent(componentName)
 }
 
-const onClose = () => {
-    show.value = false
+// 选择日期
+const onConfirm = ([start, end]: Date[]) => {
+    showCalendar.value = false
+    dateRange.value = [formatDate(start.toISOString(), 'YYYYMMDD'), formatDate(end.toISOString(), 'YYYYMMDD')]
+    pageIndex.value = 1
+    pullRefreshRef.value?.refresh()
 }
 
-const onConfirm = (values: Date[]) => {
-    const [start, end] = values;
-    show.value = false
-    formData.startDate = formatDate(start.toString(), 'YYYYMMDD')
-    formData.endDate = formatDate(end.toString(), 'YYYYMMDD')
-    date.value = formData.startDate + '-' + formData.endDate
-    /// 查询
-    pullRefreshRef.value?.refresh()
+const onRefresh = () => {
+    const [startDate, endDate] = dateRange.value
+    run({
+        startDate,
+        endDate,
+    })
 }
 
 // 关闭弹窗

+ 32 - 37
src/packages/qxst/views/order/position/components/goods/close/Index.vue

@@ -3,54 +3,52 @@
     <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>
-            <div class="order-detail__container g-form__container">
-                <CellGroup title="持仓信息">
+            <Form ref="formRef" class="g-form__container" @submit="onCloseSumit">
+                <CellGroup title="持仓信息" inset>
                     <Cell title="商品代码/名称" :value="`${selectedRow.goodscode}/${selectedRow.goodsname}`" />
                     <Cell title="持仓方向" :value="getBuyOrSellName(selectedRow.buyorsell)" />
                     <Cell title="持仓金额" :value="formatDecimal(selectedRow.curholderamount)" />
-                    <Cell title="持仓数量" :value="formatDecimal(selectedRow.curpositionqty)" />
-                    <Cell title="冻结数量" :value="formatDecimal(selectedRow.frozenqty)" />
-                    <Cell title="可用数量" :value="formatDecimal(selectedRow.enableqty)" />
+                    <Cell title="持仓数量" :value="selectedRow.curpositionqty" />
+                    <Cell title="冻结数量" :value="selectedRow.frozenqty" />
+                    <Cell title="可用数量" :value="selectedRow.enableqty" />
                     <Cell title="持仓均价" :value="formatDecimal(selectedRow.averageprice)" />
                     <Cell title="参考损益">
                         <template #value>
-                            <span :class="handlePriceColor(closepl, 0.0)">{{ formatDecimal(closepl) }}</span>
+                            <span :class="selectedRow.closeplColor">{{ formatDecimal(selectedRow.closepl) }}</span>
                         </template>
                     </Cell>
                 </CellGroup>
-                <CellGroup title="转让信息">
+                <CellGroup title="转让信息" inset>
                     <Cell title="当前价" :value="handleNumberValue(quote?.last)" />
-                    <Form class="goods-close__form" ref="formRef" @submit="onCloseSumit" v-if="props">
-                        <Field name="OrderPrice" :rules="formRules.OrderPrice" label="转让价格">
-                            <template #input>
-                                <Stepper v-model="formData.OrderPrice" theme="round" button-size="22" :min="0"
-                                    :decimal-length="selectedRow.decimalplace" :auto-fixed="false" />
-                            </template>
-                        </Field>
-                        <Field name="OrderQty" :rules="formRules.OrderQty" label="转让数量">
-                            <template #input>
-                                <Stepper v-model="formData.OrderQty" theme="round" button-size="22" :min="0"
-                                    :max="selectedRow.enableqty" :auto-fixed="false" integer />
-                            </template>
-                        </Field>
-                    </Form>
+                    <Field name="OrderPrice" :rules="formRules.OrderPrice" label="转让价格">
+                        <template #input>
+                            <Stepper v-model="formData.OrderPrice" theme="round" button-size="22" :min="0"
+                                :decimal-length="selectedRow.decimalplace" :auto-fixed="false" />
+                        </template>
+                    </Field>
+                    <Field name="OrderQty" :rules="formRules.OrderQty" label="转让数量">
+                        <template #input>
+                            <Stepper v-model="formData.OrderQty" theme="round" button-size="22" :min="0"
+                                :max="selectedRow.enableqty" :auto-fixed="false" integer />
+                        </template>
+                    </Field>
                 </CellGroup>
-            </div>
+            </Form>
             <template #footer>
-                <Button block square type="danger" @click="onCloseSumit">转让</Button>
+                <Button block square type="danger" @click="formRef?.submit">转让</Button>
             </template>
         </app-view>
     </app-modal>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, PropType, onMounted, computed } from 'vue'
+import { shallowRef, PropType, onMounted } from 'vue'
 import AppModal from '@/components/base/modal/index.vue'
-import { CellGroup, Cell, Button, FieldRule, Form, Field, Stepper } from 'vant'
+import { CellGroup, Cell, Button, FieldRule, Form, Field, Stepper, FormInstance } from 'vant'
 import { getBuyOrSellName, BuyOrSell } from '@/constants/order'
-import { formatDecimal, handleNumberValue, handlePriceColor } from '@/filters'
+import { formatDecimal, handleNumberValue } from '@/filters'
 import { useOrder } from '@/business/trade'
 import { dialog, fullloading } from '@/utils/vant'
 import { useFuturesStore } from '@/stores'
@@ -58,27 +56,24 @@ import { EBuildType, EDelistingType, EListingSelectType, EOrderOperateType, EPri
 
 const props = defineProps({
     selectedRow: {
-        type: Object as PropType<Model.TradePositionRsp>,
+        type: Object as PropType<Model.TradePositionRsp & {
+            closepl: number; // 浮动盈亏
+            closeplColor: string; // 浮动盈亏颜色
+        }>,
         required: true,
     }
 })
 
 const futuresStore = useFuturesStore()
 const quote = futuresStore.getGoodsQuote(props.selectedRow.goodscode)
+const formRef = shallowRef<FormInstance>()
 const showModal = shallowRef(true)
 // 是否刷新父组件数据
 const refresh = shallowRef(false)
 const { formSubmit, formData } = useOrder()
 
-// 损益
-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: { [key in keyof Proto.OrderReq]?: FieldRule[] } = {
+const formRules: { [key: string]: FieldRule[] } = {
     OrderPrice: [{
         message: '请输入转让价格',
         validator: () => {
@@ -115,7 +110,7 @@ const onCloseSumit = () => {
         /// loding....
         fullloading((hideLoading) => {
             formSubmit().then(() => {
-                hideLoading('转让成功')
+                hideLoading('转让成功', 'success')
                 closed(true)
             }).catch((err) => {
                 hideLoading(err, 'fail')

+ 30 - 0
src/packages/qxst/views/order/position/components/goods/delivery16/index.vue

@@ -0,0 +1,30 @@
+<!-- 我的订单- 订单持仓 - 交收 -->
+<template>
+    <Delivery ref="deliveryRef" v-bind="{ goodsId: selectedRow.goodsid, total: selectedRow.enableqty }">
+        <template #header>
+            <Cell title="商品代码/名称" :value="`${selectedRow.goodscode}/${selectedRow.goodsname}`" />
+            <Cell title="持仓数量" :value="selectedRow.curpositionqty" />
+            <Cell title="可用数量" :value="selectedRow.enableqty" />
+        </template>
+    </Delivery>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { Cell } from 'vant'
+import Delivery from '../../../../../../components/modules/delivery/index.vue'
+
+defineProps({
+    selectedRow: {
+        type: Object as PropType<Model.TradePositionRsp>,
+        required: true,
+    }
+})
+
+const deliveryRef = shallowRef()
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed: () => deliveryRef.value?.closed(),
+})
+</script>

+ 21 - 22
src/packages/qxst/views/order/position/components/goods/delivery/Index.vue → src/packages/qxst/views/order/position/components/goods/delivery50/index.vue

@@ -3,16 +3,16 @@
     <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>
-            <div class="order-detail__container g-form__container">
-                <CellGroup title="持仓信息">
+            <Form ref="formRef" class="g-form__container" @submit="onDeliverySumit">
+                <CellGroup title="持仓信息" inset>
                     <Cell title="商品代码/名称" :value="`${selectedRow.goodscode}/${selectedRow.goodsname}`" />
                     <Cell title="持仓方向" :value="getBuyOrSellName(selectedRow.buyorsell)" />
                     <Cell title="持仓金额" :value="formatDecimal(selectedRow.marketamount)" />
-                    <Cell title="持仓数量" :value="formatDecimal(selectedRow.curpositionqty)" />
-                    <Cell title="冻结数量" :value="formatDecimal(selectedRow.frozenqty)" />
-                    <Cell title="可用数量" :value="formatDecimal(selectedRow.enableqty)" />
+                    <Cell title="持仓数量" :value="selectedRow.curpositionqty" />
+                    <Cell title="冻结数量" :value="selectedRow.frozenqty" />
+                    <Cell title="可用数量" :value="selectedRow.enableqty" />
                     <Cell title="持仓均价" :value="formatDecimal(selectedRow.averageprice)" />
                     <Cell title="参考损益">
                         <template #value>
@@ -20,23 +20,21 @@
                         </template>
                     </Cell>
                 </CellGroup>
-                <CellGroup title="交收信息">
+                <CellGroup title="交收信息" inset>
                     <Cell title="交收对手方" :value="selectedRow.matchname" />
-                    <Form class="goods-close__form" ref="formRef" @submit="onDeliverySumit" v-if="props">
-                        <Field name="DeliveryLot" type="digit" :rules="formRules.DeliveryLot" label="交收数量">
-                            <template #input>
-                                <Stepper v-model="formData.DeliveryLot" theme="round" button-size="22" :min="0"
-                                    :max="selectedRow.enableqty" :auto-fixed="false" integer />
-                            </template>
-                        </Field>
-                        <Field name="DeliveryInfo" v-model="formData.DeliveryInfo" type="textarea" autosize clearable
-                            :rules="formRules.DeliveryInfo" maxlength="50" label="交收信息" placeholder="请输入交收信息">
-                        </Field>
-                    </Form>
+                    <Field name="DeliveryLot" type="digit" :rules="formRules.DeliveryLot" label="交收数量">
+                        <template #input>
+                            <Stepper v-model="formData.DeliveryLot" theme="round" button-size="22" :min="0"
+                                :max="selectedRow.enableqty" :auto-fixed="false" integer />
+                        </template>
+                    </Field>
+                    <Field name="DeliveryInfo" v-model="formData.DeliveryInfo" type="textarea" autosize clearable
+                        :rules="formRules.DeliveryInfo" maxlength="50" label="交收信息" placeholder="请输入交收信息">
+                    </Field>
                 </CellGroup>
-            </div>
+            </Form>
             <template #footer>
-                <Button type="primary" block round @click="onDeliverySumit">交收</Button>
+                <Button block square type="danger" @click="formRef?.submit">提交</Button>
             </template>
         </app-view>
     </app-modal>
@@ -45,7 +43,7 @@
 <script lang="ts" setup>
 import { shallowRef, PropType, computed } from 'vue'
 import AppModal from '@/components/base/modal/index.vue'
-import { CellGroup, Cell, Button, FieldRule, Form, Field, Stepper } from 'vant'
+import { CellGroup, Cell, Button, FieldRule, Form, Field, Stepper, FormInstance } from 'vant'
 import { getBuyOrSellName, BuyOrSell } from '@/constants/order'
 import { formatDecimal } from '@/filters'
 import { useOfflineDelivery } from '@/business/trade'
@@ -62,6 +60,7 @@ const props = defineProps({
 const showModal = shallowRef(true)
 // 是否刷新父组件数据
 const refresh = shallowRef(false)
+const formRef = shallowRef<FormInstance>()
 const { formSubmit, formData } = useOfflineDelivery()
 const futuresStore = useFuturesStore()
 const quote = futuresStore.getGoodsQuote(props.selectedRow.goodscode)
@@ -74,7 +73,7 @@ const closepl = computed(() => {
 })
 
 // 表单验证规则
-const formRules: { [key in keyof Proto.OfflineDeliveryReq]?: FieldRule[] } = {
+const formRules: { [key: string]: FieldRule[] } = {
     DeliveryLot: [{
         message: '请输入交收数量',
         validator: (val) => {

+ 10 - 8
src/packages/qxst/views/order/position/components/goods/list/Index.vue

@@ -17,7 +17,7 @@
                     <ul>
                         <li>
                             <span>持有数量</span>
-                            <span>{{ formatDecimal(item.curpositionqty) }}</span>
+                            <span>{{ item.curpositionqty }}</span>
                         </li>
                         <li>
                             <span>持仓均价</span>
@@ -25,7 +25,7 @@
                         </li>
                         <li>
                             <span>冻结数量</span>
-                            <span>{{ formatDecimal(item.frozenqty) }}</span>
+                            <span>{{ item.frozenqty }}</span>
                         </li>
                         <li>
                             <span>持仓金额</span>
@@ -33,11 +33,11 @@
                         </li>
                         <li>
                             <span>可用数量</span>
-                            <span>{{ formatDecimal(item.enableqty) }}</span>
+                            <span>{{ item.enableqty }}</span>
                         </li>
                         <li>
                             <span>参考损益</span>
-                            <span :class="handlePriceColor(item.closepl, 0)">
+                            <span :class="item.closeplColor">
                                 {{ formatDecimal(item.closepl) }}
                             </span>
                         </li>
@@ -45,7 +45,8 @@
                 </div>
                 <div class="g-order-list__btnbar" v-if="item.enableqty">
                     <Button size="small" @click="showComponent('close', item)" round>转让</Button>
-                    <!-- <Button size="small" @click="showComponent('delivery', item)" round>交收</Button> -->
+                    <Button size="small" @click="showComponent(item.trademode === 16 ? 'delivery16' : 'delivery50', item)"
+                        round>交收</Button>
                 </div>
             </div>
         </div>
@@ -60,16 +61,17 @@ import { Button } from 'vant'
 import { useComponent } from '@/hooks/component'
 import AppPullRefresh from '../../../../../../components/base/pull-refresh/index.vue'
 import { getBuyOrSellName } from '@/constants/order'
-import { formatDecimal, handleNumberValue, handlePriceColor } from '@/filters'
+import { formatDecimal, handleNumberValue } from '@/filters'
 import { usePosition } from '@/business/position'
 import eventBus from '@/services/bus'
 
 const componentMap = new Map<string, unknown>([
     ['close', defineAsyncComponent(() => import('../close/Index.vue'))],
-    ['delivery', defineAsyncComponent(() => import('../delivery/Index.vue'))]
+    ['delivery50', defineAsyncComponent(() => import('../delivery50/index.vue'))],
+    ['delivery16', defineAsyncComponent(() => import('../delivery16/index.vue'))]
 ])
 
-const { positionList, loading } = usePosition(50)
+const { positionList, loading } = usePosition(50, 16)
 const selectedRow = shallowRef<Model.TradePositionRsp>()
 const pullRefreshRef = shallowRef()