li.shaoyi 3 gadi atpakaļ
vecāks
revīzija
3feee5258c

+ 1 - 1
.env.mobile

@@ -1,4 +1,4 @@
 VUE_APP_ENV = 'mobile'
-VUE_APP_TITLE = MTP-Mobile
+VUE_APP_TITLE = 铁合金掌上行
 VUE_APP_ROOT = src/packages/mobile/
 VUE_APP_HOST = localhost

+ 5 - 0
public/config/appconfig.j2

@@ -0,0 +1,5 @@
+{
+  "version": "1.0.8",
+  "versionCode": "100008",
+  "apiUrl": "{apiUrl}"
+}

+ 2 - 2
public/config/appconfig.json

@@ -1,5 +1,5 @@
 {
-  "version": "1.0.7",
-  "versionCode": "100007",
+  "version": "1.0.8",
+  "versionCode": "100008",
   "apiUrl": "http://218.17.158.45:16021/cfg?key=test_thj"
 }

+ 42 - 2
src/business/contract/index.ts

@@ -1,6 +1,7 @@
-import { shallowRef } from 'vue'
+import { shallowRef, reactive } from 'vue'
 import { useDataTable } from '@/hooks/datatable'
-import { queryTHJPurchaseTransfer } from '@/services/api/contract'
+import { EchartsDataset } from '@/hooks/echarts/line/interface'
+import { queryTHJPurchaseTransfer, queryTHJPurchaseTransferDetail } from '@/services/api/contract'
 
 // 合同转让列表
 export function useContractList() {
@@ -34,4 +35,43 @@ export function useContractList() {
         pageCount,
         getWrstandardList,
     }
+}
+
+// 合同转让详情
+export function useContractDetails(wrstandardid: number) {
+    const loading = shallowRef(false)
+    const details = shallowRef<Partial<Model.THJPurchaseTransferDetailRsp>>({})
+
+    // 图表数据
+    const chartData = reactive<EchartsDataset['line']['source']>({
+        price: [],
+        date: []
+    })
+
+    const getContractDetails = () => {
+        loading.value = true
+        return queryTHJPurchaseTransferDetail({
+            data: {
+                wrstandardid,
+            },
+            success: (res) => {
+                details.value = res.data
+
+                res.data.history.forEach(({ c, ts }) => {
+                    chartData.price.push(c)
+                    chartData.date.push(ts)
+                })
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        details,
+        chartData,
+        getContractDetails,
+    }
 }

+ 41 - 34
src/business/trade/index.ts

@@ -1,15 +1,17 @@
-import { ref, shallowRef } from 'vue'
+import { reactive, ref, shallowRef } from 'vue'
 import { v4 } from 'uuid'
 import { ClientType, OrderSrc } from '@/constants/client'
 import { useLoginStore } from '@/stores'
-import { spotPresaleDestingOrder, 
-         spotPresaleTransferCancel, 
-         spotPresaleTransferDesting, 
-         spotPresaleTransferListing, 
-         spotPresalePlayment, 
-         wrListingCancelOrder, 
-         spotPresaleDeliveryConfirm, 
-         spotPresaleBreachOfContractApply } from '@/services/api/trade'
+import {
+    spotPresaleDestingOrder,
+    spotPresaleTransferCancel,
+    spotPresaleTransferDesting,
+    spotPresaleTransferListing,
+    spotPresalePlayment,
+    wrListingCancelOrder,
+    spotPresaleDeliveryConfirm,
+    spotPresaleBreachOfContractApply
+} from '@/services/api/trade'
 import { formatDate } from "@/filters";
 import Long from 'long'
 
@@ -172,17 +174,17 @@ export function useSpotPresaleTransferCancel() {
 
     const transferCancelSubmit = (id: number) => {
         loading.value = true
-            return spotPresaleTransferCancel({
-                data: {
-                    UserID: getUserId(),
-                    WRTradeDetailID: Long.fromNumber(id),
-                    ClientSerialNo: v4(), // 客户端流水号
-                    ClientType: ClientType.Web // 终端类型
-                },
-                complete: () => {
-                    loading.value = false
-                }
-            })
+        return spotPresaleTransferCancel({
+            data: {
+                UserID: getUserId(),
+                WRTradeDetailID: Long.fromNumber(id),
+                ClientSerialNo: v4(), // 客户端流水号
+                ClientType: ClientType.Web // 终端类型
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
     }
 
     return {
@@ -194,26 +196,31 @@ export function useSpotPresaleTransferCancel() {
 // 铁合金现货预售转让摘牌接口请求
 export function useSpotPresaleTransferDesting() {
     const loading = shallowRef(false)
-    const { getUserId , getFirstAccountId} = useLoginStore()
+    const { getUserId, getFirstAccountId } = useLoginStore()
 
-    const destingSubmit = (id: number) => {
+    const formData = reactive<Proto.SpotPresaleTransferDestingReq>({
+        UserID: getUserId(),
+        AccountID: getFirstAccountId(),
+        TransferID: Long.fromNumber(0),
+        ClientType: ClientType.Web // 终端类型
+    })
+
+    const destingSubmit = () => {
         loading.value = true
-            return spotPresaleTransferDesting({
-                data: {
-                    UserID: getUserId(),
-                    AccountID: getFirstAccountId(),
-                    TransferID: Long.fromNumber(id),
-                    ClientSerialNo: v4(), // 客户端流水号
-                    ClientType: ClientType.Web // 终端类型
-                },
-                complete: () => {
-                    loading.value = false
-                }
-            })
+        return spotPresaleTransferDesting({
+            data: {
+                ...formData,
+                ClientSerialNo: v4(), // 客户端流水号
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
     }
 
     return {
         loading,
+        formData,
         destingSubmit
     }
 }

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

@@ -149,6 +149,11 @@ const routes: Array<RouteRecordRaw> = [
         path: '',
         name: 'contract',
         component: () => import('../views/contract/list/index.vue'),
+      },
+      {
+        path: 'details',
+        name: 'contract-details',
+        component: () => import('../views/contract/details/index.vue'),
       }
     ]
   },

+ 10 - 0
src/packages/mobile/views/contract/details/components/address/index.less

@@ -0,0 +1,10 @@
+.goods-details-address {
+    &__form {
+        .van-cell-group__title {
+            display        : flex;
+            justify-content: space-between;
+            align-items    : center;
+            padding        : 16px 32px 8px 32px;
+        }
+    }
+}

+ 163 - 0
src/packages/mobile/views/contract/details/components/address/index.vue

@@ -0,0 +1,163 @@
+<template>
+    <app-modal class="goods-details-address" direction="right" height="100%" v-model:show="showModal">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar :title="formItem.THJDeliveryMode === 2 ? '自提信息' : '代办运输信息'" @back="closed" />
+            </template>
+            <Form ref="formRef" class="goods-details-address__form g-form__container" @submit="onSubmit">
+                <CellGroup inset>
+                    <template #title>
+                        <span>联系信息</span>
+                        <span @click="showContact = true" style="color: #333;">
+                            <Icon name="add-o" />
+                            添加联系信息
+                        </span>
+                    </template>
+                    <Field v-model="formItem.ContactName" name="username" label="联系人" placeholder="必填"
+                        :rules="formRules.ContactName" />
+                    <Field v-model="formItem.ContactInfo" name="username" label="联系方式" placeholder="必填"
+                        :rules="formRules.ContactInfo" />
+                    <Field v-model="formItem.DesAddress" type="textarea" name="username" label="目的地地址" placeholder="必填"
+                        :rules="formRules.DesAddress" v-if="formItem.THJDeliveryMode === 3" />
+                </CellGroup>
+                <CellGroup inset>
+                    <template #title>
+                        <span>发票信息</span>
+                        <span @click="showReceipt = true" style="color: #333;">
+                            <Icon name="add-o" />
+                            添加发票信息
+                        </span>
+                    </template>
+                    <Field v-model="formItem.ReceiptInfo" type="textarea" name="username" label="发票信息" rows="5"
+                        placeholder="选填" :rules="formRules.ReceiptInfo" />
+                </CellGroup>
+            </Form>
+            <template #footer>
+                <div class="g-form__footer">
+                    <Button type="primary" @click="formRef?.submit" round block>确认</Button>
+                </div>
+            </template>
+        </app-view>
+        <app-contact v-model:show="showContact" @change="contactChange" />
+        <app-receipt v-model:show="showReceipt" @change="receiptChange" />
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, reactive, PropType } from 'vue'
+import { CellGroup, Button, Field, Form, FormInstance, FieldRule, Icon } from 'vant'
+import { getReceiptTypeName } from '@/constants/receipt'
+import AppModal from '@/components/base/modal/index.vue'
+import AppContact from '../contact/index.vue'
+import AppReceipt from '../receipt/index.vue'
+
+const props = defineProps({
+    formData: {
+        type: Object as PropType<Proto.SpotPresaleDestingOrderReq>,
+        required: true
+    }
+})
+
+const emit = defineEmits(['updated'])
+const formRef = shallowRef<FormInstance>()
+const showModal = shallowRef(true)
+const showContact = shallowRef(false) // 显示联系人选择列表
+const showReceipt = shallowRef(false) // 显示发票选择列表
+const formItem = reactive({ ...props.formData })
+
+// 表单验证规则
+const formRules: { [key in keyof Proto.SpotPresaleDestingOrderReq]?: FieldRule[] } = {
+    ContactName: [{
+        required: true,
+        message: '请输入联系人',
+    }],
+    ContactInfo: [{
+        required: true,
+        message: '请输入联系方式',
+    }],
+    DesAddress: [{
+        required: true,
+        message: '请输入目的地地址',
+    }],
+}
+
+// 选择联系信息
+const contactChange = (item: Model.UserReceiveInfoRsp) => {
+    formItem.ContactName = item.receivername
+    formItem.ContactInfo = item.phonenum
+
+    if (formItem.THJDeliveryMode === 3) {
+        formItem.DesAddress = [item.provincename, item.cityname, item.districtname, item.address].join(' ')
+    } else {
+        formItem.DesAddress = ''
+    }
+}
+
+// 选择发票信息
+const receiptChange = (item: Model.WrUserReceiptInfoRsp) => {
+    formItem.ReceiptInfo = ''
+    Object.entries(item).forEach(([key, value]) => {
+        if (value !== '') {
+            switch (key) {
+                case 'receipttype': {
+                    formItem.ReceiptInfo += '发票类型:' + getReceiptTypeName(Number(value)) + '\n'
+                    break
+                }
+                case 'username': {
+                    formItem.ReceiptInfo += '发票抬头:' + value + '\n'
+                    break
+                }
+                case 'taxpayerid': {
+                    formItem.ReceiptInfo += '税号:' + value + '\n'
+                    break
+                }
+                case 'receiptbank': {
+                    formItem.ReceiptInfo += '开户银行:' + value + '\n'
+                    break
+                }
+                case 'receiptaccount': {
+                    formItem.ReceiptInfo += '银行账号:' + value + '\n'
+                    break
+                }
+                case 'address': {
+                    formItem.ReceiptInfo += '企业地址:' + value + '\n'
+                    break
+                }
+                case 'contactinfo': {
+                    formItem.ReceiptInfo += '企业电话:' + value + '\n'
+                    break
+                }
+                case 'email': {
+                    formItem.ReceiptInfo += '邮箱:' + value + '\n'
+                    break
+                }
+            }
+        }
+    })
+}
+
+const onSubmit = () => {
+    emit('updated', formItem)
+    closed()
+}
+
+// 关闭弹窗
+const closed = () => {
+    if (showContact.value) {
+        showContact.value = false
+    } else if (showReceipt.value) {
+        showReceipt.value = false
+    } else {
+        showModal.value = false
+    }
+}
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed,
+})
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 30 - 0
src/packages/mobile/views/contract/details/components/contact/index.vue

@@ -0,0 +1,30 @@
+<template>
+    <app-modal direction="right" height="100%" v-model:show="showModal">
+        <app-address :show-radio="true" @change="onChange" />
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { computed } from 'vue'
+import AppModal from '@/components/base/modal/index.vue'
+import AppAddress from '@mobile/views/mine/address/index.vue'
+
+const props = defineProps({
+    show: {
+        type: Boolean,
+        default: false
+    }
+})
+
+const emit = defineEmits(['update:show', 'change'])
+
+const showModal = computed({
+    get: () => props.show,
+    set: (val) => emit('update:show', val)
+})
+
+const onChange = (item: Model.UserReceiveInfoRsp) => {
+    showModal.value = false
+    emit('change', item)
+}
+</script>

+ 30 - 0
src/packages/mobile/views/contract/details/components/receipt/index.vue

@@ -0,0 +1,30 @@
+<template>
+    <app-modal direction="right" height="100%" v-model:show="showModal">
+        <app-invoice :show-radio="true" @change="onChange" />
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { computed } from 'vue'
+import AppModal from '@/components/base/modal/index.vue'
+import AppInvoice from '@mobile/views/mine/invoice/index.vue'
+
+const props = defineProps({
+    show: {
+        type: Boolean,
+        default: false
+    }
+})
+
+const emit = defineEmits(['update:show', 'change'])
+
+const showModal = computed({
+    get: () => props.show,
+    set: (val) => emit('update:show', val)
+})
+
+const onChange = (item: Model.WrUserReceiptInfoRsp) => {
+    showModal.value = false
+    emit('change', item)
+}
+</script>

+ 67 - 0
src/packages/mobile/views/contract/details/index.less

@@ -0,0 +1,67 @@
+.goods-details {
+    &__form {
+        .form {
+            &-qty {
+                width: 100%;
+
+                &__input {
+                    display: flex;
+
+                    input {
+                        flex: 1;
+                    }
+
+                    span {
+                        white-space: nowrap;
+                    }
+                }
+
+                span {
+                    color: #999;
+                }
+            }
+
+            &-address {
+                display       : flex;
+                flex-direction: column;
+
+                &__placeholder {
+                    color: var(--van-field-placeholder-text-color);
+                }
+            }
+        }
+    }
+
+    &__content {
+        background-color: #fff;
+
+        .van-divider {
+            font-size  : .36rem;
+            font-weight: bold;
+            color      : #333;
+        }
+
+        .submitbar {
+            padding: .32rem;
+        }
+
+        .titlebar {
+            display        : flex;
+            align-items    : center;
+            justify-content: center;
+            gap            : .16rem;
+
+            span {
+                &:first-child {
+                    font-size: .32rem;
+                }
+
+                &:last-child {
+                    font-size  : .4rem;
+                    font-weight: bold;
+                    color      : #E84F42;
+                }
+            }
+        }
+    }
+}

+ 125 - 0
src/packages/mobile/views/contract/details/index.vue

@@ -0,0 +1,125 @@
+<template>
+    <app-view class="goods-details">
+        <template #header>
+            <app-navbar title="转让详情" />
+        </template>
+        <Form ref="formRef" class="goods-details__form" @submit="onSubmit">
+            <CellGroup>
+                <Field name="PresaleApplyID" label="交割日期" :rules="formRules.TransferID" is-link>
+                    <template #input>
+                        <app-select :options="deliveryDate" @confirm="onDateChange" />
+                    </template>
+                </Field>
+                <Field label="原定金价" v-if="selectedDate?.tradeprice">
+                    <template #input>
+                        <span>{{ selectedDate.enddate }}</span>
+                    </template>
+                </Field>
+                <Field label="数量" v-if="selectedDate?.tradeqty">
+                    <template #input>
+                        <span>{{ selectedDate.enddate }}</span>
+                    </template>
+                </Field>
+                <Field label="转让价格" v-if="selectedDate?.transferprice">
+                    <template #input>
+                        <span>{{ selectedDate.enddate }}</span>
+                    </template>
+                </Field>
+            </CellGroup>
+        </Form>
+        <div class="goods-details__content">
+            <div class="submitbar">
+                <Button type="primary" @click="formRef?.submit" round block>摘牌</Button>
+            </div>
+            <template v-if="chartData.price.length">
+                <Divider>历史价格走势</Divider>
+                <div class="chart">
+                    <component :is="componentMap.get('chart')" :loading="loading" :data-list="chartData" />
+                </div>
+            </template>
+            <Divider>商品详情</Divider>
+            <div class="gallery">
+                <template v-for="(url, index) in goodsImages" :key="index">
+                    <img :src="url" alt="" />
+                </template>
+            </div>
+        </div>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, computed, defineAsyncComponent } from 'vue'
+import { CellGroup, Button, Field, Form, FormInstance, Toast, FieldRule, Divider } from 'vant'
+import { fullloading } from '@/utils/vant'
+import { getImageUrl } from '@/filters'
+import { useNavigation } from '@/hooks/navigation'
+import { useContractDetails } from '@/business/contract'
+import { useSpotPresaleTransferDesting } from '@/business/trade'
+import AppSelect from '@mobile/components/base/select/index.vue'
+import Long from 'long'
+
+const componentMap = new Map<string, unknown>([
+    ['chart', defineAsyncComponent(() => import('@mobile/components/modules/echarts-line/index.vue'))],
+])
+
+const { router, getQueryStringToNumber } = useNavigation()
+
+const wrstandardid = getQueryStringToNumber('wrstandardid')
+const formRef = shallowRef<FormInstance>()
+
+const { loading, details, chartData, getContractDetails } = useContractDetails(wrstandardid)
+const { formData, destingSubmit } = useSpotPresaleTransferDesting()
+
+// 当前选中的交割日期
+const selectedDate = shallowRef<Model.THJPurchaseTransferDetailRsp['deliverydate'][number]>()
+// 商品信息
+const goodsinfo = computed<Partial<Model.THJPurchaseTransferDetailRsp['goodsinfo']>>(() => details.value.goodsinfo ?? {})
+
+// 商品图片列表
+const goodsImages = computed(() => {
+    const pictureurls = goodsinfo.value.pictureurls ?? ''
+    return pictureurls.split(',').map((path) => getImageUrl(path))
+})
+
+// 表单验证规则
+const formRules: { [key in keyof Proto.SpotPresaleTransferDestingReq]?: FieldRule[] } = {
+    TransferID: [{
+        message: '请选择交割日期',
+        validator: () => {
+            return !!formData.TransferID?.equals(0)
+        }
+    }],
+}
+
+// 交割日期列表
+const deliveryDate = computed(() => {
+    const list = details.value.deliverydate ?? []
+    return list.map((e) => ({
+        label: `${e.enddate} ${(e.depositrate * 100).toFixed(0)}%`,
+        value: e.transferid,
+    }))
+})
+
+// 切换交割日期
+const onDateChange = (value: string) => {
+    formData.TransferID = Long.fromString(value)
+    formRef.value?.validate('TransferID')
+}
+
+const onSubmit = () => {
+    fullloading(() => {
+        destingSubmit().then(() => {
+            Toast.success('摘牌成功')
+            router.replace({ name: 'my-order' })
+        }).catch((err) => {
+            Toast.fail(err)
+        })
+    })
+}
+
+getContractDetails()
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 26 - 0
src/packages/mobile/views/contract/list/index.less

@@ -0,0 +1,26 @@
+.contract {
+    &__header {
+        .van-search {
+            padding-top: 0;
+        }
+    }
+
+    &__container {
+        .van-cell__title {
+            display    : flex;
+            align-items: center;
+
+            img {
+                width        : 1.8rem;
+                height       : 1.8rem;
+                object-fit   : cover;
+                border-radius: .16rem;
+                margin-right : .4rem;
+            }
+
+            span {
+                flex: 1;
+            }
+        }
+    }
+}

+ 4 - 4
src/packages/mobile/views/contract/list/index.vue

@@ -1,16 +1,16 @@
 <template>
     <app-view class="contract">
         <template #header>
-            <app-navbar title="合同转让">
+            <app-navbar class="contract__header" title="合同转让">
                 <template #footer>
                     <Search shape="round" placeholder="商品搜索" disabled />
                 </template>
             </app-navbar>
         </template>
-        <app-pull-refresh v-model:error="error" v-model:pageIndex="pageIndex" :page-count="pageCount"
-            @refresh="onRefresh">
+        <app-pull-refresh class="contract__container" v-model:error="error" v-model:pageIndex="pageIndex"
+            :page-count="pageCount" @refresh="onRefresh">
             <template v-for="(item, index) in dataList" :key="index">
-                <Cell @click="$router.push({ name: 'goods-details', query: { wrstandardid: item.wrstandardid } })">
+                <Cell @click="$router.push({ name: 'contract-details', query: { wrstandardid: item.wrstandardid } })">
                     <template #title>
                         <img :src="getImageUrl(item.thumurls)" />
                         <span>{{ item.wrstandardname }}</span>

+ 8 - 11
src/packages/mobile/views/goods/details/index.vue

@@ -7,8 +7,7 @@
             <CellGroup>
                 <Field name="THJDeliveryMode" label="交割方式" :rules="formRules.THJDeliveryMode" is-link>
                     <template #input>
-                        <app-select v-model="formData.THJDeliveryMode" placeholder="请选择"
-                            :options="details.deliverymodes"
+                        <app-select v-model="formData.THJDeliveryMode" :options="details.deliverymodes"
                             :optionProps="{ label: 'enumdicname', value: 'enumitemname' }" />
                     </template>
                 </Field>
@@ -21,7 +20,7 @@
                 <Field name="DepositID" label="支付方式" :rules="formRules.DepositID" is-link
                     v-if="selectedDate?.presaleapplyid">
                     <template #input>
-                        <app-select v-model="formData.DepositID" placeholder="请选择" :options="presaleApplyDeposits" />
+                        <app-select v-model="formData.DepositID" :options="presaleApplyDeposits" />
                     </template>
                 </Field>
                 <Field label="交割日期" v-if="selectedDate?.presaleapplyid">
@@ -133,7 +132,7 @@ const presaleApplyDeposits = computed(() => {
     const presaleApplyId = selectedDate.value?.presaleapplyid
 
     return deposits.filter((e) => e.presaleapplyid === presaleApplyId).map(({ depositid, depositrate }) => ({
-        label: `${depositrate * 100}%`,
+        label: `${(depositrate * 100).toFixed(0)}%`,
         value: depositid
     }))
 })
@@ -181,14 +180,12 @@ const formRules: { [key in keyof Proto.SpotPresaleDestingOrderReq | 'addressInfo
             return !!formData.value.THJDeliveryMode
         }
     }],
-    PresaleApplyID: [
-        {
-            message: '请选择交割日期',
-            validator: () => {
-                return !!formData.value.PresaleApplyID
-            }
+    PresaleApplyID: [{
+        message: '请选择交割日期',
+        validator: () => {
+            return !!formData.value.PresaleApplyID
         }
-    ],
+    }],
     DepositID: [{
         message: '请选择支付方式',
         validator: () => {

+ 1 - 1
src/services/api/contract/index.ts

@@ -11,6 +11,6 @@ export function queryTHJPurchaseTransfer(params: HttpParams<{ req: Model.THJPurc
 /**
  * 查询合同转让详情
  */
-export function queryTHJPurchaseTransferDetail(params: HttpParams<{ req: Model.THJPurchaseTransferDetailReq, rsp: Model.THJPurchaseTransferDetailRsp[] }>) {
+export function queryTHJPurchaseTransferDetail(params: HttpParams<{ req: Model.THJPurchaseTransferDetailReq, rsp: Model.THJPurchaseTransferDetailRsp }>) {
     return httpRequest('/Ferroalloy/QueryTHJPurchaseTransferDetail', 'get', params);
 }

+ 10 - 10
src/services/api/trade/index.ts

@@ -26,62 +26,62 @@ export function spotPresaleBreachOfContractConfirm(params: TradeParams<Proto.Spo
 /**
  * 铁合金现货预售违约申请接口请求
  */
- export function spotPresaleBreachOfContractApply(params: TradeParams<Proto.SpotPresaleBreachOfContractApplyReq, Proto.SpotPresaleBreachOfContractApplyRsp>) {
+export function spotPresaleBreachOfContractApply(params: TradeParams<Proto.SpotPresaleBreachOfContractApplyReq, Proto.SpotPresaleBreachOfContractApplyRsp>) {
     return tradeServerRequest('SpotPresaleBreachOfContractApplyReq', 'SpotPresaleBreachOfContractApplyRsp', params);
 }
 
 /**
  * 铁合金现货预售付款处理接口请求
  */
- export function spotPresalePlayment(params: TradeParams<Proto.SpotPresalePlaymentReq, Proto.SpotPresalePlaymentRsp>) {
+export function spotPresalePlayment(params: TradeParams<Proto.SpotPresalePlaymentReq, Proto.SpotPresalePlaymentRsp>) {
     return tradeServerRequest('SpotPresalePlaymentReq', 'SpotPresalePlaymentRsp', params);
 }
 
 /**
  * 挂牌撤单请求
  */
- export function wrListingCancelOrder(params: TradeParams<Proto.WRListingCancelOrderReq, Proto.WRListingCancelOrderRsp>) {
+export function wrListingCancelOrder(params: TradeParams<Proto.WRListingCancelOrderReq, Proto.WRListingCancelOrderRsp>) {
     return tradeServerRequest('WRListingCancelOrderReq', 'WRListingCancelOrderRsp', params);
 }
 
 /**
  * 仓单出库申请
  */
- export function wrOutApply(params: TradeParams<Proto.WROutApplyReq, Proto.WROutApplyRsp>) {
+export function wrOutApply(params: TradeParams<Proto.WROutApplyReq, Proto.WROutApplyRsp>) {
     return tradeServerRequest('WROutApplyReq', 'WROutApplyRsp', params);
 }
 
 /**
  * 持仓单挂牌请求
  */
- export function hdWROrder(params: TradeParams<Proto.HdWROrderReq, Proto.HdWROrderRsp>) {
+export function hdWROrder(params: TradeParams<Proto.HdWROrderReq, Proto.HdWROrderRsp>) {
     return tradeServerRequest('HdWROrderReq', 'HdWROrderRsp', params);
 }
 
 /**
  * 持仓单摘牌请求
  */
- export function hdWRDealOrder(params: TradeParams<Proto.HdWRDealOrderReq, Proto.HdWRDealOrderRsp>) {
+export function hdWRDealOrder(params: TradeParams<Proto.HdWRDealOrderReq, Proto.HdWRDealOrderRsp>) {
     return tradeServerRequest('HdWRDealOrderReq', 'HdWRDealOrderRsp', params);
 }
 
 /**
  * 铁合金现货预售转让挂牌接口请求
  */
- export function spotPresaleTransferListing(params: TradeParams<Proto.SpotPresaleTransferListingReq, Proto.SpotPresaleTransferListingRsp>) {
+export function spotPresaleTransferListing(params: TradeParams<Proto.SpotPresaleTransferListingReq, Proto.SpotPresaleTransferListingRsp>) {
     return tradeServerRequest('SpotPresaleTransferListingReq', 'SpotPresaleTransferListingRsp', params);
 }
 
 /**
  * 铁合金现货预售转让撤销接口请求
  */
- export function spotPresaleTransferCancel(params: TradeParams<Proto.SpotPresaleTransferCancelReq, Proto.SpotPresaleTransferCancelRsp>) {
+export function spotPresaleTransferCancel(params: TradeParams<Proto.SpotPresaleTransferCancelReq, Proto.SpotPresaleTransferCancelRsp>) {
     return tradeServerRequest('SpotPresaleTransferCancelReq', 'SpotPresaleTransferCancelRsp', params);
 }
 
 /**
  * 铁合金现货预售转让摘牌接口请求
  */
- export function spotPresaleTransferDesting(params: TradeParams<Proto.SpotPresaleTransferDestingReq, Proto.SpotPresaleTransferDestingRsp>) {
-    return tradeServerRequest('SpotPresaleTransferDestingReq', 'SpotPresaleTransferDestingRsp', params);
+export function spotPresaleTransferDesting(params: TradeParams<Proto.SpotPresaleTransferDestingReq, Proto.SpotPresaleTransferDestingRsp>) {
+    return tradeServerRequest('SpotPresaleTransferDestingReq', 'SpotPresaleTransferDestingRsp', params, Market.THJ);
 }

+ 1 - 1
src/types/model/contract.d.ts

@@ -41,7 +41,7 @@ declare namespace Model {
             wrstandardcode: string; // 现货商品代码
             wrstandardid: number; // 现货商品ID(自增 SEQ_GOODS 确保不重复)
             wrstandardname: string; // 现货商品名称(模糊查询)
-        }[];
+        };
         history: {
             c: number; // 收盘价
             f: boolean; // 是否补充数据