li.shaoyi 1 год назад
Родитель
Сommit
1aa08cfa44

+ 29 - 0
src/constants/order.ts

@@ -25,4 +25,33 @@ export function getBuyOrSellList() {
 export function getBuyOrSellName(value?: number) {
     const item = getBuyOrSellList().find((e) => e.value === value)
     return item?.label ?? value
+}
+
+/**
+ * 费用算法
+ */
+export enum FeeAlgorithm {
+    Fixed = 0, // 固定值
+    Ratio = 1 // 比率
+}
+
+/**
+ * 获取费用算法列表
+ * @returns 
+ */
+export function getFeeAlgorithmList() {
+    return [
+        { label: '固定值', value: FeeAlgorithm.Fixed },
+        { label: '比率', value: FeeAlgorithm.Ratio },
+    ]
+}
+
+/**
+ * 获取费用算法名称
+ * @param value 
+ * @returns 
+ */
+export function getFeeAlgorithmName(value?: number) {
+    const item = getFeeAlgorithmList().find((e) => e.value === value)
+    return item?.label ?? value
 }

+ 2 - 2
src/hooks/datatable-v2/index.ts

@@ -56,12 +56,12 @@ export function useDataTable<T>(options: DataTableOptions = {}) {
 }
 
 export function useDataFilter<T>(defaultOption: FilterOption<T, keyof T>) {
-    const queryParams = shallowRef<Partial<T>>({})
-
     const defaultOptionCopy = _.cloneDeep(defaultOption)
 
     const filterOption: FilterOption<T, keyof T> = reactive(Object.create(defaultOptionCopy))
 
+    const queryParams = computed(() => getQueryParams())
+
     // 重置所有过滤条件
     const resetFilters = () => {
         const { filters } = _.cloneDeep(defaultOption)

+ 1 - 1
src/packages/pc/views/query/order/deliveryorder/components/details/index.vue

@@ -55,7 +55,7 @@ const detailProps1 = computed(() => {
     const result: CellProp[] = [
         { prop: 'deliveryticket', label: '申报流水号:' },
         { prop: 'deliveryorderid', label: '委托单号:' },
-        { prop: 'tradedate', label: '交易日:', formatValue: () => formatDate(histradedate ? histradedate : tradedate, 'YYYY-MM-DD') },
+        { prop: 'tradedate', label: '交易日:', formatValue: () => formatDate(histradedate || tradedate, 'YYYY-MM-DD') },
         { prop: 'accountid', label: '申报人(账号):', formatValue: (val) => val && `${accountname}(${accountid})` },
         { prop: 'matchaccountid', label: '对手(账号):', formatValue: (val) => val && `${matchaccountname}(${matchaccountid})` },
         { prop: 'deliveryorderstatus', label: '交收状态:', formatValue: (val) => deliveryorderstatus1Enum.getEnumTypeName(val) },

+ 1 - 8
src/packages/pc/views/query/order/deliveryorder/index.vue

@@ -17,7 +17,7 @@
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
                 <app-operation :data-list="getActionButtons(['query_order_deliveryorder_export'])"
-                    @click="openComponentOnClick" />
+                    @click="(code: string) => openComponent(code)" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
@@ -43,14 +43,12 @@ import { useEnum } from '@/hooks/enum'
 import { useRequest } from '@/hooks/request'
 import { useOperation } from '@/hooks/operation'
 import { queryDeliveryOrder } from '@/services/api/order'
-import { i18n } from '@/stores'
 import AppTable from '@pc/components/base/table/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'
 import AppOperation from '@pc/components/base/operation/index.vue'
 import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
 
 const deliveryorderstatus1Enum = useEnum('deliveryorderstatus1') // 状态
-const { global: { t } } = i18n
 const dateValue = shallowRef<string[] | null>([])
 
 const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.DeliveryOrderRsp>({
@@ -148,9 +146,4 @@ const onReset = () => {
     dateValue.value = []
     resetFilters()
 }
-
-const openComponentOnClick = (code: string) => {
-    queryParams.value = processRequiredParams()
-    openComponent(code)
-}
 </script>

+ 164 - 0
src/packages/pc/views/query/order/deliverytrade/components/details/index.vue

@@ -0,0 +1,164 @@
+<!-- 查询管理-内部订单查询-交收成交查询-详情 -->
+<template>
+    <app-drawer title="详细" width="960" v-model:show="show">
+        <app-table-details title="交收单信息" :data="data" :label-width="200" :cell-props="detailProps1" :column="2">
+            <!-- 会员服务费设置值 -->
+            <template #memberchargevalue v-if="data">
+                <template v-if="data.memberchargevalue">
+                    <span v-if="data.feealgorithm === FeeAlgorithm.Ratio">
+                        {{ parseTenThousand(data.memberchargevalue) }}
+                    </span>
+                    <span v-else>{{ data.memberchargevalue }}</span>
+                </template>
+                <template v-else>
+                    {{ handleNoneValue() }}
+                </template>
+            </template>
+            <!-- 平台服务费设置值 -->
+            <template #exchchargevalue v-if="data">
+                <template v-if="data.exchchargevalue">
+                    <span v-if="data.feealgorithm === FeeAlgorithm.Ratio">
+                        {{ parseTenThousand(data.exchchargevalue) }}
+                    </span>
+                    <span v-else>{{ data.exchchargevalue }}</span>
+                </template>
+                <template v-else>
+                    {{ handleNoneValue() }}
+                </template>
+            </template>
+        </app-table-details>
+        <app-table-details title="仓单信息" :data="data" :label-width="200" :cell-props="detailProps2" :column="2" />
+        <app-table-details title="交易合约" :data="data" :label-width="200" :cell-props="detailProps3" :column="2" />
+        <app-table-details title="辅助合约一" :data="data" :label-width="200" :cell-props="detailProps4" :column="2"
+            v-if="!!data?.ppricemode" />
+        <app-table-details title="辅助合约二" :data="data" :label-width="200" :cell-props="detailProps5" :column="2"
+            v-if="!!data?.p2pricemode" />
+        <template #footer>
+            <el-button @click="onCancel(false)">{{ t('operation.close') }}</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType, computed } from 'vue'
+import { ElMessage } from 'element-plus'
+import { formatDate, parseTenThousand, handleNoneValue } from '@/filters'
+import { getBuyOrSellName, BuyOrSell, getFeeAlgorithmName, FeeAlgorithm } from '@/constants/order'
+import { useEnum } from '@/hooks/enum'
+import { useRequest } from '@/hooks/request'
+import { querySettlementDealDetail } from '@/services/api/order'
+import { CellProp } from '@pc/components/base/table-details/types'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppTableDetails from '@pc/components/base/table-details/index.vue'
+import { i18n } from '@/stores'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Model.SettlementDealRsp>,
+        required: true
+    }
+})
+
+const { global: { t } } = i18n
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const deliveryorderstatus1Enum = useEnum('deliveryorderstatus1') // 状态
+
+const { data } = useRequest(querySettlementDealDetail, {
+    params: {
+        buyorsell: props.record.buyorsell,
+        deliveryid: props.record.deliveryid,
+        histradedate: props.record.histradedate
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const detailProps1 = computed(() => {
+    const { buyorsell, histradedate, tradedate, accountname, accountid, matchaccountname, matchaccountid, feealgorithm } = data.value ?? {}
+    const buyer = buyorsell === BuyOrSell.Buy ? `${accountname}(${accountid})` : `${matchaccountname}(${matchaccountid})`
+    const seller = buyorsell === BuyOrSell.Buy ? `${matchaccountname}(${matchaccountid})` : `${accountname}(${accountid})`
+
+    const result: CellProp[] = [
+        { prop: 'deliveryid', label: '交收单号:' },
+        { prop: 'tradedate', label: '交易日:', formatValue: () => formatDate(histradedate || tradedate, 'YYYY-MM-DD') },
+        { prop: 'buyorsell', label: '方向:', formatValue: (val) => getBuyOrSellName(val) },
+        { prop: 'accountid', label: '买方(账号):', formatValue: (val) => val && buyer },
+        { prop: 'matchaccountid', label: '卖方(账号):', formatValue: (val) => val && seller },
+        { prop: 'deliverytotalamount', label: '交收总金额:' },
+        { prop: 'deliveryprice', label: '交收单价:' },
+        { prop: 'deliverycharge', label: '交收服务费:' },
+        { prop: 'deliverypricemove', label: '升贴水总额:' },
+        { prop: 'remaintotalamount', label: '剩余总金额:' },
+        { prop: 'deliverystatus', label: '状态:', formatValue: (val) => deliveryorderstatus1Enum.getEnumTypeName(val) },
+        { prop: 'deliverytime', label: '成交时间:', formatValue: (val) => formatDate(val) },
+        { prop: 'feealgorithm', label: '服务费收取方式:', formatValue: (val) => getFeeAlgorithmName(val) },
+        { prop: 'memberchargevalue', label: '会员服务费设置值:' },
+        { prop: 'exchchargevalue', label: '平台服务费设置值:' },
+        { prop: 'deliveryorderid', label: '申报单号:' },
+    ]
+
+    return result
+})
+
+const detailProps2 = computed(() => {
+    const { deliveryqty = 0, deliveryrtradeqty = 0, deliverygoodsunitname = '', wrstandardcode, wrstandardname } = data.value ?? {}
+
+    const result: CellProp[] = [
+        { prop: 'wrstandardcode', label: '现货商品:', formatValue: (val) => val && `${wrstandardcode}/${wrstandardname}` },
+        { prop: 'deliveryqty', label: '申报数量:', formatValue: () => deliveryqty + deliverygoodsunitname },
+        { prop: 'deliveryrtradeqty', label: '成交数量:', formatValue: () => deliveryrtradeqty + deliverygoodsunitname },
+    ]
+
+    data.value?.wrFactorTypeItemList.forEach((item) => {
+        if (item.dgfactoryitemtypename) {
+            result.push({ prop: item.dgfactoryitemid.toString(), label: item.dgfactoryitemtypename + ':', formatValue: () => item.dgfactoryitemname })
+        }
+    })
+
+    return result
+})
+
+const detailProps3 = computed(() => {
+    const result: CellProp[] = [
+        { prop: 'xgoodsname', label: '交易合约:' },
+        { prop: 'xdeliveryprice', label: '交收单价:', decimal: 2 },
+        { prop: 'xdeliverycloseqty', label: '订单手数:' },
+    ]
+
+    return result
+})
+
+const detailProps4 = computed(() => {
+    const { ppricemode } = data.value ?? {}
+
+    const result: CellProp[] = [
+        { prop: 'ppricemode', label: '价格方式:' },
+        { prop: 'pgoodsname', label: '辅助合约一:', show: ppricemode === 1 },
+        { prop: 'pdeliveryprice', label: '交收价格:', decimal: 2 },
+        { prop: 'pdeliverycloseqty', label: '订单手数:' },
+    ]
+
+    return result
+})
+
+const detailProps5 = computed(() => {
+    const { p2pricemode } = data.value ?? {}
+
+    const result: CellProp[] = [
+        { prop: 'p2pricemode', label: '价格方式:' },
+        { prop: 'p2goodsname', label: '辅助合约二:', show: p2pricemode === 1 },
+        { prop: 'p2deliveryprice', label: '交收价格:', decimal: 2 },
+        { prop: 'p2deliverycloseqty', label: '订单手数:' },
+    ]
+
+    return result
+})
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+</script>

+ 158 - 1
src/packages/pc/views/query/order/deliverytrade/index.vue

@@ -1,7 +1,164 @@
 <!-- 查询管理-内部订单查询-交收成交查询 -->
 <template>
-    <app-view></app-view>
+    <app-view>
+        <template #header>
+            <app-filter :option="filterOption" :rules="filterRules">
+                <template #ishis="{ item }">
+                    <el-form-item :label="item.label" prop="ishis">
+                        <el-select v-model="item.value">
+                            <el-option v-for="option in item.options?.()" :key="option.value" :label="option.label"
+                                :value="option.value" />
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="日期" prop="date" v-if="item.value === 1">
+                        <el-date-picker type="daterange" v-model="dateValue" value-format="YYYYMMDD"
+                            start-placeholder="开始时间" end-placeholder="结束时间" />
+                    </el-form-item>
+                </template>
+            </app-filter>
+        </template>
+        <app-table :data="dataList" :columns="tableColumns" :loading="loading">
+            <template #headerLeft>
+                <app-operation :data-list="getActionButtons(['query_order_deliverytrade_export'])"
+                    @click="(code: string) => openComponent(code)" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons(['query_order_deliverytrade_details'])"
+                    @click="(code: string) => openComponent(code, row)" circle />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="onSearch" />
+            </template>
+        </app-table>
+        <component :is="componentMap.get(componentId)" v-bind="{ record, queryParams }" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
 </template>
 
 <script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { ElMessage, FormRules } from 'element-plus'
+import { getBuyOrSellList, getBuyOrSellName } from '@/constants/order'
+import { useDataFilter } from '@/hooks/datatable-v2'
+import { useRequest } from '@/hooks/request'
+import { useOperation } from '@/hooks/operation'
+import { querySettlementDeal } from '@/services/api/order'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
+
+const dateValue = shallowRef<string[] | null>([])
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.SettlementDealRsp>({
+    onClose: () => onSearch()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(querySettlementDeal, {
+    params: {
+        pageNum: 1,
+        pageSize: 20,
+        ishis: 0
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'deliveryid', label: '交收单号' },
+    { field: 'tradedate', label: '交易日' },
+    { field: 'buyorsell', label: '方向', formatValue: (val) => getBuyOrSellName(val) },
+    { field: 'accountid', label: '买方' },
+    { field: 'matchaccountid', label: '卖方' },
+    { field: 'deliverygoodsname', label: '现货商品' },
+    { field: 'deliveryqty', label: '现货数量' },
+    { field: 'deliveryprice', label: '交收单价' },
+    { field: 'deliveryamount', label: '货款总金额' },
+    { field: 'deliverypricemove', label: '升贴水总金额' },
+    { field: 'deliverycharge', label: '交收服务费' },
+    { field: 'deliveryorderid', label: '委托单号' },
+    { field: 'operate', label: '操作', fixed: 'right' }
+])
+
+// 表单验证规则
+const filterRules: FormRules = {
+    date: [{
+        required: true,
+        validator: () => {
+            return !!dateValue.value && dateValue.value.length === 2
+        }
+    }]
+}
+
+const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilter<Model.SettlementDealReq>({
+    filters: [
+        {
+            field: 'deliveryid',
+            label: '交收单号',
+        },
+        {
+            field: 'wrstandardid',
+            label: '现货商品',
+            placeholder: '请输入商品ID'
+        },
+        {
+            field: 'xgoodsid',
+            label: '主商品',
+            placeholder: '请输入商品ID'
+        },
+        {
+            field: 'deliveryorderid',
+            label: '委托单号',
+        },
+        {
+            field: 'accountid',
+            label: '资金账户',
+            placeholder: '请输入资金账户ID'
+        },
+        {
+            field: 'tradedate',
+            label: '交易日',
+        },
+        {
+            field: 'buyorsell',
+            label: '方向',
+            options: () => getBuyOrSellList()
+        },
+        {
+            field: 'ishis',
+            label: '交收数据类型',
+            value: 0,
+            options: () => [
+                { label: '当前', value: 0 },
+                { label: '历史', value: 1 }
+            ]
+        },
+    ],
+    buttons: [
+        { label: '查询', className: 'el-button--primary', onClick: () => onSearch() },
+        { label: '重置', className: 'el-button--primary', validateEvent: false, onClick: () => onReset() }
+    ]
+})
+
+// 处理请求参数
+const processRequiredParams = () => {
+    const qs = getQueryParams()
+    const [startDate, endDate] = dateValue.value || []
+    qs.startdate = startDate
+    qs.enddate = endDate
+    return qs
+}
+
+const onSearch = () => {
+    const qs = processRequiredParams()
+    run(qs)
+}
+
+const onReset = () => {
+    dateValue.value = []
+    resetFilters()
+}
 </script>

+ 1 - 6
src/packages/pc/views/query/order/liquidation/index.vue

@@ -7,7 +7,7 @@
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
                 <app-operation :data-list="getActionButtons(['query_order_liquidation_export'])"
-                    @click="openComponentOnClick" />
+                    @click="(code: string) => openComponent(code)" />
             </template>
             <!-- 操作 -->
             <template #operate="{ row }">
@@ -113,9 +113,4 @@ const onSearch = () => {
     const qs = processRequiredParams()
     run(qs)
 }
-
-const openComponentOnClick = (code: string) => {
-    queryParams.value = processRequiredParams()
-    openComponent(code)
-}
 </script>

+ 64 - 0
src/packages/pc/views/query/order/offlinedelivery/components/details/index.vue

@@ -0,0 +1,64 @@
+<!-- 查询管理-内部订单查询-线下交收单查询-详情 -->
+<template>
+    <app-drawer title="详细" width="960" v-model:show="show">
+        <app-table-details :data="data" :label-width="160" :cell-props="detailProps1" :column="2" />
+        <template #footer>
+            <el-button @click="onCancel">{{ t('operation.close') }}</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { formatDate } from '@/filters'
+import { getBuyOrSellName } from '@/constants/order'
+import { useRequest } from '@/hooks/request'
+import { queryOfflineDetail } from '@/services/api/order'
+import { CellProp } from '@pc/components/base/table-details/types'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppTableDetails from '@pc/components/base/table-details/index.vue'
+import { i18n } from '@/stores'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Model.OfflineRsp>,
+        required: true
+    }
+})
+
+const { t } = i18n.global
+const show = shallowRef(true)
+
+const { data } = useRequest(queryOfflineDetail, {
+    params: {
+        deliveryorderid: props.record.deliveryorderid
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const detailProps1: CellProp[] = [
+    { prop: 'deliveryorderid', label: '交收单号:' },
+    { prop: 'username', label: '申请人:' },
+    { prop: 'goodsdisplay', label: '交收商品:' },
+    { prop: 'buyorsell', label: '方向:', formatValue: (val) => getBuyOrSellName(val) },
+    { prop: 'deliveryqty', label: '申请交收数量:' },
+    { prop: 'sucdeliveryqty', label: '实际交收数量:' },
+    { prop: 'cancledeliveryqty', label: '撤销交收数量:' },
+    { prop: 'deliveryprice', label: '交收价格:' },
+    { prop: 'deliveryamount', label: '交收货款:' },
+    { prop: 'matchname', label: '对手方:' },
+    { prop: 'deliveryinfo', label: '交收信息:' },
+    { prop: 'reqtime', label: '申请时间:', formatValue: (val) => formatDate(val) },
+    { prop: 'orderstatusdisplay', label: '交收状态:' },
+    { prop: 'remark', label: '备注:' },
+    { prop: 'deliverycharge', label: '交收手续费:' },
+    { prop: 'closetime', label: '完成时间:' },
+]
+
+const onCancel = () => {
+    show.value = false
+}
+</script>

+ 104 - 1
src/packages/pc/views/query/order/offlinedelivery/index.vue

@@ -1,7 +1,110 @@
 <!-- 查询管理-内部订单查询-线下交收单查询 -->
 <template>
-    <app-view></app-view>
+    <app-view>
+        <template #header>
+            <app-filter :option="filterOption">
+                <template #startdate="{ item }">
+                    <el-form-item :label="item.label" prop="cycletime">
+                        <el-date-picker v-model="item.value" value-format="YYYYMMDD" placeholder="请选择" />
+                    </el-form-item>
+                </template>
+            </app-filter>
+        </template>
+        <app-table :data="dataList" :columns="tableColumns" :loading="loading">
+            <template #headerLeft>
+                <app-operation :data-list="getActionButtons(['query_order_offlinedelivery_export'])"
+                    @click="(code: string) => openComponent(code)" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons(['query_order_offlinedelivery_details'])"
+                    @click="(code: string) => openComponent(code, row)" circle />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="onSearch" />
+            </template>
+        </app-table>
+        <component :is="componentMap.get(componentId)" v-bind="{ record, queryParams }" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
 </template>
 
 <script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { ElMessage } from 'element-plus'
+import { getBuyOrSellList } from '@/constants/order'
+import { useDataFilter } from '@/hooks/datatable-v2'
+import { useRequest } from '@/hooks/request'
+import { useOperation } from '@/hooks/operation'
+import { queryOffline } from '@/services/api/order'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.OfflineRsp>({
+    onClose: () => onSearch()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(queryOffline, {
+    params: {
+        pageNum: 1,
+        pageSize: 20
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { field: 'deliveryorderid', label: '交收单号' },
+    { field: 'username', label: '申请人' },
+    { field: 'goodsdisplay', label: '交收商品' },
+    { field: 'buyorselldisplay', label: '方向' },
+    { field: 'deliveryqty', label: '申请交收数量' },
+    { field: 'sucdeliveryqty', label: '实际交收数量' },
+    { field: 'deliveryprice', label: '交收价格' },
+    { field: 'deliveryamount', label: '交收货款' },
+    { field: 'matchname', label: '对手方' },
+    { field: 'reqtime', label: '申请时间' },
+    { field: 'orderstatusdisplay', label: '交收状态' },
+    { field: 'operate', label: '操作', fixed: 'right' }
+])
+
+const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilter<Model.OfflineReq>({
+    filters: [
+        {
+            field: 'deliveryorderstatus',
+            label: '单据状态',
+            options: () => []
+        },
+        {
+            field: 'deliverygoodsname',
+            label: '交收商品',
+        },
+        {
+            field: 'accountname',
+            label: '账户',
+        },
+        {
+            field: 'startdate',
+            label: '申请日期',
+        },
+        {
+            field: 'buyorsell',
+            label: '方向',
+            options: () => getBuyOrSellList()
+        }
+    ],
+    buttons: [
+        { label: '查询', className: 'el-button--primary', onClick: () => onSearch() },
+        { label: '重置', className: 'el-button--primary', validateEvent: false, onClick: () => resetFilters() }
+    ]
+})
+
+const onSearch = () => {
+    const qs = getQueryParams()
+    run(qs)
+}
 </script>

+ 1 - 6
src/packages/pc/views/query/order/tradesumm/index.vue

@@ -13,7 +13,7 @@
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
                 <app-operation :data-list="getActionButtons(['query_order_tradesumm_export'])"
-                    @click="openComponentOnClick" />
+                    @click="(code: string) => openComponent(code)" />
             </template>
             <template #footer>
                 <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
@@ -111,9 +111,4 @@ const onSearch = () => {
     const qs = getQueryParams()
     run(qs)
 }
-
-const openComponentOnClick = (code: string) => {
-    queryParams.value = getQueryParams()
-    openComponent(code)
-}
 </script>

+ 98 - 95
src/packages/pc/views/report/account/index.vue

@@ -2,31 +2,31 @@
 <template>
     <app-view calss="report-account">
         <template #header>
-            <el-form ref="formRef" class="report-account__filter" :model="params" :rules="formRules"
-                :show-message="false">
-                <el-form-item :label="t('report.account.cycletype')" prop="cycletype">
-                    <el-select v-model="params.cycletype" @change="onTypeChange">
-                        <el-option v-for="item in getReportTypeList()" :key="item.value" :label="item.label"
-                            :value="item.value" />
-                    </el-select>
-                </el-form-item>
-                <el-form-item :label="t('report.account.cycletime')" prop="cycletime">
-                    <el-date-picker :type="dateType" v-model="params.cycletime" :format="dateFormat"
-                        :value-format="dateFormat" :placeholder="t('common.pleasechoice')" />
-                </el-form-item>
-                <el-form-item :label="t('report.account.quarter')" prop="quarter" v-if="params.cycletype === ReportType.Quarter">
-                    <el-select v-model="params.quarter">
-                        <el-option v-for="item in getQuarterList()" :key="item.value" :label="item.label"
-                            :value="item.value" />
-                    </el-select>
-                </el-form-item>
-                <el-form-item :label="t('report.account.accountid')" prop="accountid">
-                    <app-select-account v-model="params.accountid" @change="onAccountChange" />
-                </el-form-item>
-                <el-form-item>
-                    <el-button type="primary" @click="onSearch">{{ t('operation.search') }}</el-button>
-                </el-form-item>
-            </el-form>
+            <app-filter :option="filterOption">
+                <template #cycletime="{ item }">
+                    <el-form-item :label="item.label" prop="cycletime">
+                        <el-date-picker :type="dateType" v-model="item.value" :format="dateFormat"
+                            :value-format="dateFormat" :placeholder="t('common.pleasechoice')" />
+                    </el-form-item>
+                </template>
+                <template #quarter="{ item }">
+                    <el-form-item :label="item.label" prop="quarter"
+                        v-if="queryParams.cycletype === ReportType.Quarter">
+                        <el-select v-model="item.value">
+                            <el-option v-for="item in getQuarterList()" :key="item.value" :label="item.label"
+                                :value="item.value" />
+                        </el-select>
+                    </el-form-item>
+                    <template v-else>
+                        {{ (item.value = undefined) }}
+                    </template>
+                </template>
+                <template #accountid="{ item }">
+                    <el-form-item :label="item.label" prop="accountid">
+                        <app-select-account v-model="item.value" @change="onAccountChange" />
+                    </el-form-item>
+                </template>
+            </app-filter>
             <div class="report-account__info" v-if="selectedAccount">
                 <span>{{ t('report.account.accountid1') }}{{ selectedAccount.relatedname }}</span>
                 <span>{{ t('report.account.accountid') }}{{ selectedAccount.accountid }}</span>
@@ -43,35 +43,71 @@
 </template>
 
 <script lang="ts" setup>
-import { shallowRef, reactive, defineAsyncComponent, computed } from 'vue'
-import { FormInstance, FormRules } from 'element-plus'
+import { shallowRef, defineAsyncComponent, computed } from 'vue'
 import { useRoute } from 'vue-router'
 import { findTreeNodeById, formatDate } from '@/filters'
+import { useDataFilter } from '@/hooks/datatable-v2'
 import { ReportType, getReportTypeList, getQuarterList } from '@/constants/report'
 import { useRequest } from '@/hooks/request'
 import { queryCommonFlag } from '@/services/api/account'
 import { i18n, useRouterStore } from '@/stores'
 import AppSelectAccount from '@pc/components/modules/select-account/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
 
 const route = useRoute()
 const routerStore = useRouterStore()
 const { global: { t } } = i18n
-const formRef = shallowRef<FormInstance>()
 const componentRef = shallowRef()
 const componentIndex = shallowRef(0)
 const selectedAccount = shallowRef<Model.TAAccountChildrenSelectRsp>()
+const params = shallowRef<Partial<Model.TaaccountReportReq>>({})
 
-const params = reactive<Model.TaaccountReportReq>({
-    accountid: 0,
-    cycletime: '',
-    cycletype: 0,
-    pageNum: 1,
-    pageSize: 20
+const { children = [] } = findTreeNodeById(routerStore.userRoutes, String(route.name), { id: 'resourceCode' }) ?? {}
+
+const loadComponent = () => {
+    const item = children[componentIndex.value]
+    if (item) {
+        const componentString = item.component.replace(/^\/+/, '')
+        const componentPath = componentString.replace(/\.\w+$/, '')
+        return defineAsyncComponent(() => import('/' + process.env.VUE_APP_ROOT + componentPath + '.vue'))
+    }
+    return undefined
+}
+
+const { queryParams, filterOption, getQueryParams } = useDataFilter<Model.TaaccountReportReq>({
+    filters: [
+        {
+            field: 'cycletype',
+            label: t('report.account.cycletype'),
+            value: 0,
+            required: true,
+            options: () => getReportTypeList()
+        },
+        {
+            field: 'cycletime',
+            label: t('report.account.cycletime'),
+            required: true
+        },
+        {
+            field: 'quarter',
+            label: t('report.account.quarter'),
+            required: true
+        },
+        {
+            field: 'accountid',
+            label: t('report.account.accountid'),
+            required: true
+        }
+    ],
+    buttons: [
+        { label: '查询', className: 'el-button--primary', onClick: () => onSearch() },
+        //{ label: '重置', className: 'el-button--primary', validateEvent: false, onClick: () => resetFilters() }
+    ]
 })
 
 // 日期类型
 const dateType = computed(() => {
-    switch (params.cycletype) {
+    switch (queryParams.value.cycletype) {
         case ReportType.Week:
             return 'week'
         case ReportType.Month:
@@ -86,7 +122,7 @@ const dateType = computed(() => {
 
 // 日期格式
 const dateFormat = computed(() => {
-    switch (params.cycletype) {
+    switch (queryParams.value.cycletype) {
         case ReportType.Month:
             return 'YYYY-MM'
         case ReportType.Quarter:
@@ -97,72 +133,39 @@ const dateFormat = computed(() => {
     }
 })
 
-const { children = [] } = findTreeNodeById(routerStore.userRoutes, String(route.name), { id: 'resourceCode' }) ?? {}
-
-useRequest(queryCommonFlag, {
-    onSuccess: (res) => {
-        params.cycletime = formatDate(res.data.tradedate, 'YYYY-MM-DD')
-    }
-})
-
-// 表单验证规则
-const formRules: FormRules = {
-    cycletype: [{ required: true }],
-    cycletime: [{ required: true }],
-    quarter: [{ required: true }],
-    accountid: [{
-        required: true,
-        validator: (rule, value, callback) => {
-            if (value) {
-                callback()
-            } else {
-                callback(new Error( t('report.account.tips1')))
-            }
-        },
-    }],
+const onAccountChange = (item?: Model.TAAccountChildrenSelectRsp) => {
+    selectedAccount.value = item
 }
 
-const loadComponent = () => {
-    const item = children[componentIndex.value]
-    if (item) {
-        const componentString = item.component.replace(/^\/+/, '')
-        const componentPath = componentString.replace(/\.\w+$/, '')
-        return defineAsyncComponent(() => import('/' + process.env.VUE_APP_ROOT + componentPath + '.vue'))
-    }
-    return undefined
-}
+const onSearch = () => {
+    const qs = getQueryParams()
+    qs.pageNum = 1
+    qs.pageSize = 20
 
-const onTypeChange = (value: ReportType) => {
-    const dateValue = params.cycletime
-    if (dateValue) {
-        switch (value) {
-            case ReportType.Month:
-                params.cycletime = formatDate(dateValue, 'YYYY-MM')
-                break
-            case ReportType.Quarter:
-            case ReportType.Year:
-                params.cycletime = formatDate(dateValue, 'YYYY')
-                break
-            default:
-                params.cycletime = formatDate(dateValue, 'YYYY-MM-DD')
-        }
+    switch (qs.cycletype) {
+        case ReportType.Month:
+            qs.cycletime = formatDate(qs.cycletime, 'YYYY-MM')
+            break
+        case ReportType.Quarter:
+        case ReportType.Year:
+            qs.cycletime = formatDate(qs.cycletime, 'YYYY')
+            break
+        default:
+            qs.cycletime = formatDate(qs.cycletime, 'YYYY-MM-DD')
     }
-}
 
-const onAccountChange = (item?: Model.TAAccountChildrenSelectRsp) => {
-    selectedAccount.value = item
-}
+    params.value = qs
 
-const onSearch = () => {
-    params.pageNum = 1
-    formRef.value?.validate((valid) => {
-        if (valid) {
-            setTimeout(() => {
-                componentRef.value.query?.()
-            }, 20)
-        }
-    })
+    setTimeout(() => {
+        componentRef.value.query?.()
+    }, 20)
 }
+
+useRequest(queryCommonFlag, {
+    onSuccess: (res) => {
+        filterOption.filters[1].value = formatDate(res.data.tradedate, 'YYYY-MM-DD')
+    }
+})
 </script>
 
 <style lang="less">

+ 64 - 76
src/packages/pc/views/report/profitshare/index.vue

@@ -2,37 +2,36 @@
 <template>
     <app-view>
         <template #header>
-            <el-form ref="formRef" class="el-form--filter" :model="queryParams" :rules="formRules"
-                :show-message="false">
-                <el-form-item :label="t('report.profitshare.cycletype')" prop="cycletype">
-                    <el-select v-model="queryParams.cycletype">
-                        <el-option v-for="item in getReportTypeList()" :key="item.value" :label="item.label"
-                            :value="item.value" />
-                    </el-select>
-                </el-form-item>
-                <el-form-item :label="t('report.profitshare.tradedate')" prop="tradedate">
-                    <el-date-picker :type="dateType" v-model="queryParams.tradedate" :format="dateFormat"
-                    :placeholder="t('common.pleasechoice')" />
-                </el-form-item>
-                <el-form-item :label="t('report.profitshare.quarter')" prop="quarter" v-if="queryParams.cycletype === ReportType.Quarter">
-                    <el-select v-model="queryParams.quarter">
-                        <el-option v-for="item in getQuarterList()" :key="item.value" :label="item.label"
-                            :value="item.value" />
-                    </el-select>
-                </el-form-item>
-                <el-form-item :label="t('report.profitshare.isson')" prop="isson">
-                    <el-switch v-model="queryParams.isson" active-value="1" inactive-value="0" />
-                </el-form-item>
-                <el-form-item>
-                    <el-button type="primary" @click="onSearch(false)">{{ t('operation.search') }}</el-button>
-                    <el-button type="primary" @click="onSearch(true)">{{ t('operation.reset') }}</el-button>
-                </el-form-item>
-            </el-form>
+            <app-filter :option="filterOption">
+                <template #tradedate="{ item }">
+                    <el-form-item :label="item.label" prop="tradedate">
+                        <el-date-picker :type="dateType" v-model="item.value" :format="dateFormat"
+                            :value-format="dateFormat" :placeholder="t('common.pleasechoice')" />
+                    </el-form-item>
+                </template>
+                <template #quarter="{ item }">
+                    <el-form-item :label="item.label" prop="quarter"
+                        v-if="queryParams.cycletype === ReportType.Quarter">
+                        <el-select v-model="item.value">
+                            <el-option v-for="item in getQuarterList()" :key="item.value" :label="item.label"
+                                :value="item.value" />
+                        </el-select>
+                    </el-form-item>
+                    <template v-else>
+                        {{ (item.value = undefined) }}
+                    </template>
+                </template>
+                <template #isson="{ item }">
+                    <el-form-item :label="item.label" prop="isson">
+                        <el-switch v-model="item.value" active-value="1" inactive-value="0" />
+                    </el-form-item>
+                </template>
+            </app-filter>
         </template>
         <app-table :data="dataList" :columns="tableColumns" :loading="loading">
             <template #headerLeft>
-                <app-operation :data-list="getActionButtons(['query_order_institutionsumm_export'])"
-                    @click="openComponentOnClick" />
+                <app-operation :data-list="getActionButtons(['query_order_profitshare_export'])"
+                    @click="(code: string) => openComponent(code)" />
             </template>
             <template #footer>
                 <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
@@ -46,8 +45,9 @@
 
 <script lang="ts" setup>
 import { computed, ref } from 'vue'
-import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { ElMessage } from 'element-plus'
 import { useEnum } from '@/hooks/enum'
+import { useDataFilter } from '@/hooks/datatable-v2'
 import { useRequest } from '@/hooks/request'
 import { formatDate } from '@/filters'
 import { shareAmountQuery } from '@/services/api/report'
@@ -56,17 +56,12 @@ import { getReportTypeList, ReportType, getQuarterList } from '@/constants/repor
 import AppTable from '@pc/components/base/table/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'
 import AppOperation from '@pc/components/base/operation/index.vue'
+import AppFilter from '@pc/components/base/table-filter-v2/index.vue'
 import { i18n } from '@/stores'
 
 const roleTypeEnum = useEnum('roleType') // 角色
 
 const { global: { t } } = i18n
-const formRef = ref<FormInstance>()
-
-const queryParams = ref<Partial<Model.ShareAmountQueryReq>>({
-    cycletype: 0,
-    isson: 0
-})
 
 const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.ShareAmountQueryRsp>({
     onClose: () => onSearch()
@@ -83,6 +78,36 @@ const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(shareA
     }
 })
 
+const { queryParams, filterOption, getQueryParams, resetFilters } = useDataFilter<Model.ShareAmountQueryReq>({
+    filters: [
+        {
+            field: 'cycletype',
+            label: t('report.profitshare.cycletype'),
+            value: 0,
+            options: () => getReportTypeList()
+        },
+        {
+            field: 'tradedate',
+            label: t('report.profitshare.tradedate'),
+            required: true
+        },
+        {
+            field: 'quarter',
+            label: t('report.account.quarter'),
+            required: true
+        },
+        {
+            field: 'isson',
+            label: t('report.profitshare.isson'),
+            value: 0
+        }
+    ],
+    buttons: [
+        { label: '查询', className: 'el-button--primary', onClick: () => onSearch() },
+        { label: '重置', className: 'el-button--primary', validateEvent: false, onClick: () => resetFilters() }
+    ]
+})
+
 // 日期类型
 const dateType = computed(() => {
     switch (queryParams.value.cycletype) {
@@ -98,7 +123,6 @@ const dateType = computed(() => {
     }
 })
 
-
 // 日期格式
 const dateFormat = computed(() => {
     switch (queryParams.value.cycletype) {
@@ -122,45 +146,9 @@ const tableColumns = ref<Model.TableColumn[]>([
     { field: 'divideamount', label: 'report.profitshare.divideamount' }
 ])
 
-// 表单验证规则
-const formRules: FormRules = {
-    tradedate: [{ required: true }],
-    quarter: [{ required: true }],
-}
-
-// 处理日期格式
-const formatDateByCycleType = () => {
-    const dateValue = queryParams.value.tradedate
-
-    if (queryParams.value.cycletype !== ReportType.Quarter) {
-        queryParams.value.quarter = undefined
-    }
-
-    queryParams.value.tradedate = formatDate(dateValue, dateFormat.value)
-}
-
-const onSearch = (clear = false) => {
-    if (clear) {
-        queryParams.value = {
-            cycletype: 0,
-            isson: 0
-        }
-    } else {
-        formRef.value?.validate((valid) => {
-            if (valid) {
-                formatDateByCycleType()
-                run(queryParams.value)
-            }
-        })
-    }
-}
-
-const openComponentOnClick = (code: string) => {
-    formRef.value?.validate((valid) => {
-        if (valid) {
-            formatDateByCycleType()
-            openComponent(code)
-        }
-    })
+const onSearch = () => {
+    const qs = getQueryParams()
+    qs.tradedate = formatDate(qs.tradedate, dateFormat.value) // 处理日期格式
+    run(qs)
 }
 </script>

+ 49 - 0
src/services/api/order/index.ts

@@ -221,4 +221,53 @@ export function queryDeliveryOrder(options: CommonFetchOptions<{ request: Model.
  */
 export function queryDeliveryOrderDetail(options: CommonFetchOptions<{ request: Model.DeliveryOrderDetailReq; response: Model.DeliveryOrderDetailRsp; }>) {
     return httpClient.commonRequest('/query/deliveryOrderDetail', 'get', options)
+}
+
+/**
+ * 内部订单查询--> 交收成交 --> 获取列表
+ */
+export function querySettlementDeal(options: CommonFetchOptions<{ request: Model.SettlementDealReq; response: Model.SettlementDealRsp[]; }>) {
+    return httpClient.commonRequest('/query/querySettlementDeal', 'get', options)
+}
+
+/**
+ * 内部订单查询--> 交收成交 --> 交收成交详情
+ */
+export function querySettlementDealDetail(options: CommonFetchOptions<{ request: Model.SettlementDealDetailReq; response: Model.SettlementDealDetailRsp; }>) {
+    return httpClient.commonRequest('/query/settlementDealDetail', 'get', options)
+}
+
+/**
+ * 内部订单查询--> 线下交收单查询 --> 获取列表
+ */
+export function queryOffline(options: CommonFetchOptions<{ request: Model.OfflineReq; response: Model.OfflineRsp[]; }>) {
+    return httpClient.commonRequest('/query/queryoffline', 'get', options)
+}
+
+/**
+ * 内部订单查询--> 线下交收单查询 --> 详情
+ */
+export function queryOfflineDetail(options: CommonFetchOptions<{ request: Model.OfflineDetailReq; response: Model.OfflineDetailRsp; }>) {
+    return httpClient.commonRequest('/query/offlinedetail', 'get', options)
+}
+
+/**
+ * 内部订单查询--> 线下交收单查询 --> 导出
+ */
+export function offlineExport(options: CommonFetchOptions<{ request: Model.OfflineReq; response: string; }>) {
+    return httpClient.commonRequest('/query/offlineexport', 'get', options)
+}
+
+/**
+ * 内部订单查询--> 线下交收单查询 --> 确认交收
+ */
+export function offlineClose(options: CommonFetchOptions<{ request: Model.offlineCloseReq; }>) {
+    return httpClient.commonRequest('/query/offlineclose', 'get', options)
+}
+
+/**
+ * 内部订单查询--> 线下交收单查询 --> 交收失败
+ */
+export function offlineFail(options: CommonFetchOptions<{ request: Model.offlineFailReq; }>) {
+    return httpClient.commonRequest('/query/offlinefail', 'get', options)
 }

+ 174 - 0
src/types/model/order.d.ts

@@ -1357,4 +1357,178 @@ declare namespace Model {
         xdeliveryqty: number; // 合约数量
         xgoodsname: string; // 交易合约
     }
+
+    /** 内部订单查询--> 交收成交 --> 获取列表 请求 */
+    interface SettlementDealReq {
+        accountid?: string; // 资金账户
+        buyorsell?: number; // 方向
+        deliveryid?: string; // 交收单号
+        deliveryorderid?: string; // 委托单号
+        enddate?: string; // 结束日期
+        ishis: number; // 交收数据类型 0正常 1历史
+        mainorderflag?: number;
+        pageNum: number; // 页码
+        pageSize: number; // 页大小
+        startdate?: string; // 开始日期
+        tradedate?: string; // 交易日
+        userid?: number;
+        wrstandardid?: string; // 现货商品
+        xgoodsid?: number; // 主商品
+    }
+
+    /** 内部订单查询--> 交收成交 --> 获取列表 响应 */
+    interface SettlementDealRsp {
+        accountid: number;
+        accountname: string;
+        buyorsell: number; // 方向
+        deliveryamount: number; // 货款总金额
+        deliverycharge: number; // 交收服务费
+        deliverygoodsname: string; // 现货商品
+        deliveryid: string; // 交收单号
+        deliveryorderid: string; // 委托单号
+        deliveryprice: number; // 交收单价
+        deliverypricemove: number; // 升贴水总金额
+        deliveryqty: string; // 现货数量
+        histradedate: string;
+        loginid: number;
+        matchaccountid: number;
+        matchaccountname: string;
+        matchloginid: number;
+        tradedate: string; // 交易日
+        unitname: string;
+    }
+
+    /** 内部订单查询--> 交收成交 --> 交收成交详情 请求 */
+    interface SettlementDealDetailReq {
+        buyorsell: number;
+        deliveryid: string;
+        histradedate: string;
+    }
+
+    /** 内部订单查询--> 交收成交 --> 交收成交详情 响应 */
+    interface SettlementDealDetailRsp {
+        accountid: number;
+        accountname: string; // 买方(账号)
+        buydeliveryapplyorderid: string; // 卖申报委托单号
+        buyorsell: number; // 方向
+        deliverycharge: number; // 交收服务费
+        deliverygoodsunitname: string;
+        deliveryid: string; // 交收单号
+        deliveryorderid: string; // 申报单号
+        deliveryprice: number; // 交收单价
+        deliverypricemove: number; // 升贴水总额
+        deliveryqty: number; // 申报数量
+        deliveryrtradeqty: number; // 交收数量
+        deliverystatus: number; // 状态
+        deliverytime: string; // 成交时间
+        deliverytotalamount: number; // 交收总金额
+        exchchargevalue: number; // 平台服务费设置值
+        feealgorithm: number; // 服务费收取方式
+        freezemargin: number; // 卖方冻结保证金
+        histradedate: string; // 交易日
+        iszhongjiang: string;
+        marginalgorithm: number; // 卖方交收收取方式
+        marginvalue: number; // 卖方交收保证金值
+        matchaccountid: number;
+        matchaccountname: string; // 卖方(账号)
+        memberchargevalue: number; // 会员服务费设置值
+        p2deliverycloseqty: number; // 订单手数
+        p2deliveryprice: number;
+        p2goodsname: string; // 辅助合约二
+        p2pricemode: number; // 价格方式
+        pgoodsname: string; // 辅助合约一
+        pdeliverycloseqty: number; // 订单手数
+        pdeliveryprice: number;
+        ppricemode: number; // 价格方式
+        receiveraddress: string; // 提货地址
+        remaintotalamount: number; // 剩余总金额
+        selldeliveryapplyorderid: string; // 买申报委托单号
+        takemode: number; // 提货方式
+        tradedate: string;
+        wrFactorTypeItemList: {
+            createtime: string; // 创建时间
+            creatorid: number; // 创建人
+            dgfactoryitemid: number; // 选择项ID
+            dgfactoryitemname: string;
+            dgfactoryitemtypeid: number; // 要素选择项类型ID
+            dgfactoryitemtypename: string;
+            updatetime: string; // 更新时间
+            updatorid: number; // 更新人
+            wrfactortypeid: string; // 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
+        }[];
+        wrfactortypeid: string;
+        wrstandardcode: string; // 现货商品
+        wrstandardname: string;
+        xgoodsname: string; // 交易合约
+        xdeliverycloseqty: number; // 订单手数
+        xdeliveryprice: number; // 合约价格
+    }
+
+    /** 内部订单查询--> 线下交收单查询 --> 获取列表 请求 */
+    interface OfflineReq {
+        accountname?: string; // 账户
+        buyorsell?: number; // 方向
+        deliverygoodsname?: string; // 交收商品
+        deliveryorderstatus?: string; // 单据状态
+        matchuserid?: number;
+        pageNum: number; // 页码
+        pageSize: number; // 页大小
+        startdate?: string; // 申请日期
+    }
+
+    /** 内部订单查询--> 线下交收单查询 --> 获取列表 响应 */
+    interface OfflineRsp {
+        buyorselldisplay: string; // 方向
+        deliveryamount: string; // 交收货款
+        deliveryorderid: string; // 交收单号
+        deliveryprice: string; // 交收价格
+        deliveryqty: string; // 申请交收数量
+        goodsdisplay: string; // 交收商品
+        marketid: number;
+        matchname: string; // 对手方
+        orderstatus: number;
+        orderstatusdisplay: string; // 交收状态
+        reqtime: string; // 申请时间
+        sucdeliveryqty: string; // 实际交收数量
+        username: string; // 申请人
+    }
+
+    /** 内部订单查询--> 线下交收单查询 --> 详情 请求 */
+    interface OfflineDetailReq {
+        deliveryorderid: string;
+    }
+
+    /** 内部订单查询--> 线下交收单查询 --> 详情 响应 */
+    interface OfflineDetailRsp {
+        buyorsell: number; // 方向
+        cancledeliveryqty: number; // 撤销交收数量
+        closetime: string; // 完成时间
+        deliveryamount: number; // 交收货款
+        deliverycharge: number; // 交收手续费
+        deliveryinfo: string; // 交收信息
+        deliveryorderid: string; // 交收单号
+        deliveryprice: number; // 交收价格
+        deliveryqty: number; // 申请交收数量
+        goodsdisplay: string; // 交收商品
+        goodunitid: string;
+        matchname: string; // 对手方
+        orderstatusdisplay: number; // 交收状态
+        remark: string; // 备注
+        reqtime: string; // 申请时间
+        sucdeliveryqty: number; // 实际交收数量
+        username: string; // 申请人
+    }
+
+    /** 内部订单查询--> 线下交收单查询 --> 确认交收 请求 */
+    interface offlineCloseReq {
+        deliveryorderid: string;
+        marketid: number;
+    }
+
+    /** 内部订单查询--> 线下交收单查询 --> 确认交收 请求 */
+    interface offlineFailReq {
+        auditremark: string;
+        deliveryorderid: string;
+        marketid: number;
+    }
 }