Przeglądaj źródła

增加履约功能

Handy_Cao 2 lat temu
rodzic
commit
a8c394b13f

+ 120 - 0
src/business/performance/index.ts

@@ -0,0 +1,120 @@
+import { ref, shallowRef } from 'vue'
+import {
+    performanceContractedApply,
+    performanceManualConfirm,
+    performanceModifyContact,
+    performanceDelayApply
+} from '@/services/api/performance'
+
+
+// 违约申请请求
+export function usePerformanceContractedApply() {
+    const loading = shallowRef(false)
+
+    const formData = ref<Partial<Proto.PerformanceContractedApplyReq>>({
+        
+    })
+
+    const formSubmit = async () => {
+        try {
+            loading.value = true
+            return await performanceContractedApply({
+                data: {
+                    ...formData.value,
+                }
+            })
+        } finally {
+            loading.value = false
+        }
+    }
+
+    return {
+        loading,
+        formData,
+        formSubmit,
+    }
+}
+
+// 履约手动确认请求
+export function usePerformanceManualConfirm() {
+    const loading = shallowRef(false)
+
+    const formData = ref<Partial<Proto.PerformanceManualConfirmReq>>({
+        
+    })
+
+    const formSubmit = async () => {
+        try {
+            loading.value = true
+            return await performanceManualConfirm({
+                data: {
+                    ...formData.value,
+                }
+            })
+        } finally {
+            loading.value = false
+        }
+    }
+
+    return {
+        loading,
+        formData,
+        formSubmit,
+    }
+}
+
+// 履约修改联络信息请求
+export function usePerformanceModifyContact() {
+    const loading = shallowRef(false)
+
+    const formData = ref<Partial<Proto.PerformanceModifyContactReq>>({
+        
+    })
+
+    const formSubmit = async () => {
+        try {
+            loading.value = true
+            return await performanceModifyContact({
+                data: {
+                    ...formData.value,
+                }
+            })
+        } finally {
+            loading.value = false
+        }
+    }
+
+    return {
+        loading,
+        formData,
+        formSubmit,
+    }
+}
+
+// 延期申请请求
+export function usePerformanceDelayApply() {
+    const loading = shallowRef(false)
+
+    const formData = ref<Partial<Proto.PerformanceDelayApplyReq>>({
+        
+    })
+
+    const formSubmit = async () => {
+        try {
+            loading.value = true
+            return await performanceDelayApply({
+                data: {
+                    ...formData.value,
+                }
+            })
+        } finally {
+            loading.value = false
+        }
+    }
+
+    return {
+        loading,
+        formData,
+        formSubmit,
+    }
+}

+ 9 - 0
src/constants/funcode.ts

@@ -104,4 +104,13 @@ export enum FunCode {
     HoldAppendDepositRsp = 196720, // 持仓追加定金接口应答
     OfflineDeliveryReq = 196723,   // 线下交收申请请求
     OfflineDeliveryRsp = 196724,   // 线下交收申请请求
+
+    PerformanceContractedApplyReq       = 1310729, // 违约申请请求
+    PerformanceContractedApplyRsp       = 1310730, // 违约申请应答
+    PerformanceDelayApplyReq            = 1310725, // 延期申请请求
+    PerformanceDelayApplyRsp            = 1310726, // 延期申请应答
+    PerformanceManualConfirmReq         = 1310723, // 履约手动确认请求
+    PerformanceManualConfirmRsp         = 1310724, // 履约手动确认应答
+    PerformanceModifyContactReq         = 1310735, // 履约修改联络信息请求
+    PerformanceModifyContactRsp         = 1310736, // 履约修改联络信息回应
 } 

+ 34 - 0
src/constants/order.ts

@@ -219,4 +219,38 @@ export function getPricemode2List() {
 export function getPricemode2Name(value: number) {
     const enums = getPricemode2List()
     return getEnumTypeName(enums, value)
+}
+
+/**
+ * 获取履约状态类型列表
+ * @returns 
+ */
+export function getPerformanceStatusList() {
+    return getEnumTypeList('performanceStatus')
+}
+
+/**
+ * 获取履约状态类型名称
+ * @returns 
+ */
+export function getPerformanceStatusName(value: number) {
+    const enums = getPerformanceStatusList()
+    return getEnumTypeName(enums, value)
+}
+
+/**
+ * 获取履约类型列表
+ * @returns 
+ */
+export function getPerformanceTypeList() {
+    return getEnumTypeList('performanceType')
+}
+
+/**
+ * 获取履约类型名称
+ * @returns 
+ */
+export function getPerformanceTypeName(value: number) {
+    const enums = getPerformanceTypeList()
+    return getEnumTypeName(enums, value)
 }

+ 122 - 9
src/packages/mobile/views/order/performance/Index.vue

@@ -3,18 +3,131 @@
         <template #header>
             <app-navbar title="履约信息" />
         </template>
-        <Tabs class="van-tabs--list" v-model:active="active" :swipe-threshold="4">
-            <Tab title="买履约">
-            </Tab>
-            <Tab title="卖履约">
-            </Tab>
-        </Tabs>
+        
+        <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error" v-model:pageIndex="pageIndex"
+        :page-count="pageCount" @refresh="onChange">
+            <Tabs class="van-tabs--list" v-model:active="buyorsell" :swipe-threshold="4" @click="onChange">
+                <Tab title="买履约" />
+                <Tab title="卖履约" />
+            </Tabs>
+            <div class="g-order-list">
+                <div class="g-order-list__box" v-for="(item, index) in dataList" :key="index">
+                    <div class="g-order-list__titlebar">
+                        <div class="left">
+                            <h4>{{ item.wrstandardcode }}/{{ item.wrstandardname }}</h4>
+                        </div>
+                        <div class="right">
+                            <span>{{ getPerformanceStatusName(item.performancestatus) }}</span>
+                        </div>
+                    </div>
+                    <div class="g-order-list__content">
+                        <ul>
+                            <li>
+                                <span>履约单号</span>
+                                <span>{{ item.performanceplanid }}</span>
+                            </li>
+                            <li>
+                                <span>时间</span>
+                                <span>{{ item.createtime }}</span>
+                            </li>
+                            <li>
+                                <span>类型</span>
+                                <span>{{ getPerformanceTypeName(item.performancetype) }}</span>
+                            </li>
+                            <li>
+                                <span>关联单号</span>
+                                <span>{{ item.relatedorderid }}</span>
+                            </li>
+                            <li>
+                                <span>履约数量</span>
+                                <span>{{ item.qty }}</span>
+                            </li>
+                            <li>
+                                <span>履约金额</span>
+                                <span>{{ item.amount }}</span>
+                            </li>
+                            <li>
+                                <span>买方已付</span>
+                                <span>{{ item.buypaidamount }}</span>
+                            </li>
+                            <li>
+                                <span>当前步骤</span>
+                                <span>{{ item.curstepname }}</span>
+                            </li>
+                            <li>
+                                <span>卖方已收</span>
+                                <span>{{ item.sellreceivedamount }}</span>
+                            </li>
+                            <li>
+                                <span>步骤到期日期</span>
+                                <span>{{ formatDate( item.curstepdeadline) }}</span>
+                            </li>
+                        </ul>
+                    </div>
+                    <div class="g-order-list__btnbar">
+                        <Button size="small" @click="showComponent('breach', item)" round>违约</Button>
+                        <Button size="small" @click="showComponent('modify', item)" round>修改</Button>
+                        <Button size="small" @click="showComponent('detail', item)" round>详情</Button>
+                    </div>
+                </div>
+            </div>
+            <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)" @closed="closeComponent"
+                v-if="componentId" />
+        </app-pull-refresh>
     </app-view>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { Tab, Tabs } from 'vant'
+import { shallowRef, defineAsyncComponent } from 'vue'
+import { Tab, Tabs, Button } from 'vant'
+import { useComponent } from '@/hooks/component'
+import { useRequest } from '@/hooks/request'
+import { queryPerformancePlan } from '@/services/api/performance'
+import { formatDate } from '@/filters'
+import { getPerformanceStatusName, getPerformanceTypeName } from '@/constants/order'
+
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+
+const componentMap = new Map<string, unknown>([
+    ['detail', defineAsyncComponent(() => import('./components/detail/Index.vue'))], // 详情
+    ['modify', defineAsyncComponent(() => import('./components/modify/Index.vue'))], // 修改
+    ['breach', defineAsyncComponent(() => import('./components/breach/Index.vue'))], //  违约
+])
+
+const dataList = shallowRef<Model.PerformancePlanRsp[]>([])
+const selectedRow = shallowRef<Model.PerformancePlanRsp>()
+const error = shallowRef(false)
+const pullRefreshRef = shallowRef()
+const buyorsell = shallowRef(0)
+
+const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
+    pullRefreshRef.value?.refresh()
+})
+
+const onChange = () => {
+    run({
+        buyorsell: buyorsell.value
+    })
+}
+
+const { loading, pageIndex, pageCount, run } = useRequest(queryPerformancePlan, {
+    params: {
+        buyorsell: buyorsell.value
+    },
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    },
+    onError: () => {
+        error.value = true
+    }
+})
+
+const showComponent = (componentName: string, row: Model.PerformancePlanRsp) => {
+    selectedRow.value = row
+    openComponent(componentName)
+}
 
-const active = shallowRef(0)
 </script>

+ 0 - 0
src/packages/mobile/views/order/performance/components/breach/Index.vue


+ 0 - 0
src/packages/mobile/views/order/performance/components/detail/Index.vue


+ 0 - 0
src/packages/mobile/views/order/performance/components/modify/Index.vue


+ 6 - 3
src/packages/mobile/views/swap/detail/Index.vue

@@ -41,20 +41,23 @@ import { Tab, Tabs, Button, showToast } from 'vant'
 import { useRequest } from '@/hooks/request'
 import { useNavigation } from '@/hooks/navigation'
 import { useComponent } from '@/hooks/component'
-import AppList from '@mobile/components/base/list/index.vue'
 import { queryTjmdTradeOrderDetail } from '@/services/api/swap'
 import { useLoginStore } from '@/stores'
+
 import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+import AppList from '@mobile/components/base/list/index.vue'
 
 const componentMap = new Map<string, unknown>([
     ['delisting', defineAsyncComponent(() => import('./components/delisting/Index.vue'))],
     ['listing', defineAsyncComponent(() => import('./components/listing/Index.vue'))],
 ])
-
+const pullRefreshRef = shallowRef()
 const loginStore = useLoginStore()
 
 const { getParamString } = useNavigation()
-const { componentRef, componentId, openComponent, closeComponent } = useComponent()
+const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
+    pullRefreshRef.value?.refresh()
+})
 const item: Model.QuoteGoodsListRsp = JSON.parse(getParamString('item')?.toString() || '{}')
 const tabIndex = shallowRef(0)
 const selectedRow = shallowRef<Model.TjmdTradeOrderDetailRsp>()

+ 86 - 0
src/services/api/performance/index.ts

@@ -0,0 +1,86 @@
+import { useLoginStore, useAccountStore } from '@/stores'
+import http from '@/services/http'
+import { RequestConfig } from '@/services/http/types'
+
+const loginStore = useLoginStore()
+const accountStore = useAccountStore()
+
+/**
+ * 查询履约信息
+ */
+export function queryPerformancePlan(config: RequestConfig<Model.PerformancePlanReq> = {}) {
+    return http.commonRequest<Model.PerformancePlanRsp[]>({
+        url: '/WrTrade2/QueryPerformancePlan',
+        params: {
+            userid: loginStore.userId,
+            ...config.data
+        },
+    })
+}
+
+/**
+ * 查询履约模板
+ */
+export function queryPermancePlanTmp(config: RequestConfig<Model.PermancePlanTmpReq> = {}) {
+    return http.commonRequest<Model.PermancePlanTmpRsp[]>({
+        url: '/WrTrade2/QueryPermancePlanTmp',
+        params: {
+            ...config.data
+        },
+    })
+}
+
+/**
+ * 违约申请请求
+ */
+export function performanceContractedApply(config: RequestConfig<Partial<Proto.PerformanceContractedApplyReq>>) {
+    return http.mqRequest<Proto.PerformanceContractedApplyRsp>({
+        data: {
+            Applicant: loginStore.userId,
+            ...config.data
+        },
+        requestCode: 'PerformanceContractedApplyReq',
+        responseCode: 'PerformanceContractedApplyRsp',
+    })
+}
+
+/**
+ * 延期申请请求
+ */
+export function performanceDelayApply(config: RequestConfig<Partial<Proto.PerformanceDelayApplyReq>>) {
+    return http.mqRequest<Proto.PerformanceDelayApplyRsp>({
+        data: {
+            applicant: loginStore.userId,
+            ...config.data
+        },
+        requestCode: 'PerformanceDelayApplyReq',
+        responseCode: 'PerformanceDelayApplyRsp',
+    })
+}
+
+/**
+ * 履约手动确认请求
+ */
+export function performanceManualConfirm(config: RequestConfig<Partial<Proto.PerformanceManualConfirmReq>>) {
+    return http.mqRequest<Proto.PerformanceManualConfirmRsp>({
+        data: {
+            ...config.data
+        },
+        requestCode: 'PerformanceManualConfirmReq',
+        responseCode: 'PerformanceManualConfirmRsp',
+    })
+}
+
+/**
+ * 履约修改联络信息请求
+ */
+export function performanceModifyContact(config: RequestConfig<Partial<Proto.PerformanceModifyContactReq>>) {
+    return http.mqRequest<Proto.PerformanceModifyContactRsp>({
+        data: {
+            AccountID: accountStore.accountId,
+            ...config.data
+        },
+        requestCode: 'PerformanceModifyContactReq',
+        responseCode: 'PerformanceModifyContactRsp',
+    })
+}

+ 1 - 1
src/stores/modules/enum.ts

@@ -12,7 +12,7 @@ export interface EnumType {
     disabled?: boolean;
 }
 
-const enumKeys = ['clientType', 'scoreConfigType', 'accountBusinessCode', 'certificatetype', 'signstatus', 'thjOrderStatus', 'THJDeliveryMode', 'goodsunit', 'WROutInApplyStatus2', 'THJTransferStatus', 'WRTradeOrderStatus', 'THJMarket', 'THJProfitRoleType', 'appointmentModelOut', 'orderstatus', 'Pricemode2'] as const
+const enumKeys = ['clientType', 'scoreConfigType', 'performanceStatus', 'performanceType', 'accountBusinessCode', 'certificatetype', 'signstatus', 'thjOrderStatus', 'THJDeliveryMode', 'goodsunit', 'WROutInApplyStatus2', 'THJTransferStatus', 'WRTradeOrderStatus', 'THJMarket', 'THJProfitRoleType', 'appointmentModelOut', 'orderstatus', 'Pricemode2'] as const
 
 const enumMap = new Map<typeof enumKeys[number], ShallowRef<Model.EnumRsp[]>>()
 

+ 195 - 0
src/types/model/performance.d.ts

@@ -0,0 +1,195 @@
+declare namespace Model {
+    /** 查询履约信息 请求 */
+    interface PerformancePlanReq {
+        /// 用户id
+        userid?: number
+        /// 买卖方向 0-买 1-卖 
+        buyorsell: number
+        /// 履约状态(可多个,逗号隔开) 1:待激活 2:正常 3:处理错误 4:违约待处理 5:违约处理中 6:完成 7.违约已完成 8:释放冻结失败 9:超时待处理 10:超时关闭
+        status?: string
+        /// 开始交易日(yyyymmdd)
+        begindate?: string
+        /// 结束交易日(yyyymmdd)
+        enddate?: string
+    }
+
+    /** 查询履约信息 回应 */
+    interface PerformancePlanRsp {
+        /// 履约激活月 无仓单的交易收月
+        activatemonth: string
+        /// 履约金额(总金额)
+        amount: number
+        /// 开始交易日(yyyymmdd)
+        begindate: string
+        /// 买方账号
+        buyaccountid: number
+        /// 履约冻结(买履约)
+        buyerfreezeamount: number
+        /// 履约冻结剩余(买履约)
+        buyerfreezeamountremain: number
+        /// 买卖方向 0-买 1-卖
+        buyorsell: number
+        /// 买方已冻/已扣金额 (已付金额)
+        buypaidamount: number
+        /// 买方名字
+        buyusername: string
+        /// 合同ID
+        contractid: number
+        /// 创建时间
+        createtime: string
+        /// 创建人
+        creatorid: number
+        /// 当前步骤到期时间
+        curstepdeadline: string
+        /// 当前步骤ID
+        curstepid: string
+        /// 当前步骤名称
+        curstepname: string
+        /// 品种代码
+        deliverygoodscode: string
+        /// 品种ID
+        deliverygoodsid: number
+        /// 品种名称
+        deliverygoodsname: string
+        /// 结束交易日(yyyymmdd)
+        enddate: string
+        /// 单位名称
+        enumdicname: string
+        /// 运费
+        expressfee: number
+        /// 是否确认运费 - 0:无 1:买方确认 2:卖方确认
+        expressfeeconfirmed: number
+        /// 是否确认溢短 - 0:没有 1:买方确认 2:卖方确认
+        hasovershort: number
+        /// 类型 0-仓单预售 1-仓单贸易
+        haswr: number
+        /// 市场ID
+        marketid: number
+        /// 中间商资金账号ID
+        middleaccountid: number
+        /// 中间商用户ID
+        middleuserid: number
+        /// 现货商品最小变动值
+        minivalue: number
+        /// 选择项比较串【{选择项ID}+{冒号}+选择项值 } ,逗号分隔,头尾加逗号】-- 所有选择项拼接,用于比较
+        optioncompare: string
+        /// 溢短金额
+        overshortamount: number
+        /// 溢短数量
+        overshortqty: number
+        /// 付款方式 - 1:冻结 2:扣款
+        paymenttype: number
+        /// 履约计划ID(130+yyMMddHHmmss+xxxx)
+        performanceplanid: string
+        /// 履约状态 - 1:初始化 2:正常 3:处理错误 4:违约待处理 5:违约处理中 6:完成 7.违约已完成 8:释放冻结失败 9:超时待处理 10:超时关闭
+        performancestatus: number
+        /// 履约类型 - 0:通用 1:交割 2:仓单贸易 3:预售集采 4:竞拍-降价式 (无仓单) 5:挂牌期权 6:竞拍-降价式 7:竞拍-竞价式 8:竞拍-大宗式 9:荷兰式 10:法币C2C 11:报价系统 12:挂牌系统
+        performancetype: number
+        /// 履约数量
+        qty: number
+        /// 关联单号(履约类型的关联单号)
+        relatedorderid: string
+        /// 备注
+        remark: string
+        /// 卖方账号
+        sellaccountid: number
+        /// 履约冻结(卖履约)
+        sellerfreezeamount: number
+        /// 履约冻结剩余(卖履约)
+        sellerfreezeamountremain: number
+        /// 卖方已收金额
+        sellreceivedamount: number
+        /// 卖方名字
+        sellusername: string
+        /// 发货备注[物流单号]
+        shipremark: string
+        /// 开始时间
+        starttime: string
+        /// 履约步骤类型ID - 1:买方支付 2:卖方收款 3:买方自提 4:卖方发货 5:买方确认货 6:卖方发票 7:买方确认票 8:仓单转移 9:释放卖方冻结 10:货款溢短 11:生成合同[中江] 12:运费 90:确认支付 91. 确认放行 92买方支付(直接扣款) 用于-1模板“
+        steptypeid: number
+        /// 履约类型 名称
+        typename: string
+        /// 剩余款(待支付金额)
+        unpaidamount: number
+        /// 用户id
+        userid: number
+        /// 仓库ID
+        warehouseid: number
+        /// 仓库名称
+        warehousename: string
+        /// 仓单要素类型ID(212+Unix秒时间戳(10位)+xxxxxx)
+        wrfactortypeid: string
+        /// 仓单要素类型名称(选择项要素的名称合并显示,逗号分隔)
+        wrfactortypename: string
+        /// 现货商品代码
+        wrstandardcode: string
+        /// 现货商品ID
+        wrstandardid: number
+        /// 商品名称
+        wrstandardname: string
+        /// 仓单受让用户
+        wrtransferuserid: number
+        /// 商品
+        wrtypename: string
+    }
+
+    /** 查询履约模板 请求 */
+    interface PermancePlanTmpReq {
+        /// 用户id
+        userid?: number
+        /// 模板类型(逗号隔开), 0:通用 1:交割 2:仓单贸易 3:预售集采 7:竞拍-竞价式 8:竞拍-大宗式 9:荷兰式–失效枚举:4:竞拍-降价式 (无仓单) 5:挂牌期权 6:竞拍-降价式
+        tmptype?: number
+        /// 是否包含公共模板(用户id为空的) 1-包含
+        includepub?: number
+        /// 市场id(天津麦顿指定此参数,其它不用)
+        marketid?: number
+    }
+
+    /** 查询履约模板 回应 */
+    interface PermancePlanTmpRsp {
+        /// AutoID 模板id
+        autoid: number
+        /// 创建时间
+        createtime: string
+        /// 创建人
+        creatorid: number
+        /// 步骤信息列表
+        lstStep: [ListStep] 
+        /// 支付方式 - 1:冻结 2:扣款
+        paymenttype: number
+        /// 提货方式 - 1:无 2:买方自提 3:卖方发货
+        takemode: number
+        /// 模板名称
+        templatename: string
+        /// 模板类型 - 0:通用 1:交割 2:仓单贸易 3:预售集采 7:竞拍-竞价式 8:竞拍-大宗式 9:荷兰式–失效枚举:4:竞拍-降价式 (无仓单) 5:挂牌期权 6:竞拍-降价式
+        templatetype: number
+        /// 所属用户
+        userid: number
+    }
+
+    /// 步骤信息列表
+    interface ListStep {
+        /// AutoID
+        autoid: number
+        /// 是否自动 - 0:不自动 1:自动
+        isauto: number
+        /// 备注
+        remark: string
+        /// 天数信息(T+N)
+        stepdate: string
+        /// 距离上一步天数
+        stepdays: number
+        /// 步骤序号
+        stepindex: number
+        /// 步骤信息(步骤名称+步骤值)
+        stepinfo: string
+        /// 履约步骤类型ID - 1:买方支付 2:卖方收款 3:买方自提 4:卖方发货 5:买方确认货 6:卖方发票 7:买方确认票 8:仓单转移 9:释放卖方冻结 10:货款溢短 11:生成合同[中江] 12:运费 90:确认支付 91. 确认放行 92买方支付(直接扣款) 用于-1模板“
+        steptypeid: number
+        /// 步骤名称
+        steptypename: string
+        /// 步骤值
+        stepvalue: number
+        /// 履约计划模板ID
+        templateid: number
+    }
+}

+ 93 - 0
src/types/proto/performance.d.ts

@@ -0,0 +1,93 @@
+import { IMessageHead } from './proto'
+import Long from 'long'
+
+declare global {
+    namespace Proto {
+        // 违约申请请求 0 20 9
+        interface PerformanceContractedApplyReq {
+            /// MessageHead 消息头
+            Header?: IMessageHead;
+            PerformancePlanID?: number;  // uint64 履约计划ID
+            BreachType?: number;  // uint32 违约方类型
+            Applicant?: number;  // uint64 违约申请人
+            ApplyRemark?: string; // string 申请备注
+            Attachment?: string;// string 附件
+        }
+        // 违约申请应答 0 20 10
+        interface PerformanceContractedApplyRsp {
+            /// MessageHead 消息头
+            Header?: IMessageHead;
+            // 返回码
+            RetCode: number; 
+            // 描述信息
+            RetDesc: string; 
+            // uint64 履约计划ID
+            PerformancePlanID: number; 
+        }
+        // 延期申请请求 0 20 5
+        interface PerformanceDelayApplyReq {
+            /// MessageHead 消息头
+            Header?: IMessageHead;
+            PerformancePlanStepID?: number;  // uint64 履约计划步骤ID
+            delaydays?: number;  // uint32 申请延期天数
+            applicant?: number;  // uint64 申请人
+            applyremark?: string; // string 申请备注
+        }
+        // 延期申请应答 0 20 6
+        interface PerformanceDelayApplyRsp {
+            /// MessageHead 消息头
+            Header?: IMessageHead;
+            // 返回码
+            RetCode: number; 
+            // 描述信息
+            RetDesc: string; 
+            // uint64 履约计划步骤ID
+            PerformancePlanStepID: number;  
+            // uint64 申请人
+            applicant: number;  
+        }
+        // 履约手动确认请求 0 20 3
+        interface PerformanceManualConfirmReq {
+            /// MessageHead 消息头
+            Header?: IMessageHead;
+            PerformancePlanStepID?: number;  // uint64 履约计划步骤ID
+            OverShortAmount?: number;  // double 溢短金额
+            PerformanceExecuteSide?: number;  // uint32 履约步骤执行方 1买方 2 卖方
+            StepRemark?: string;  // string 步骤备注
+            OverShortQty?: number;  // double 溢短数量
+            ExpressFee?: number;  // double 运费金额
+        }
+        // 履约手动确认应答 0 20 4
+        interface PerformanceManualConfirmRsp {
+            /// MessageHead 消息头
+            Header?: IMessageHead;
+            // 返回码
+            RetCode: number; 
+            // 描述信息
+            RetDesc: string; 
+            // uint64 履约计划步骤ID
+            PerformancePlanStepID: number;   
+        }
+        // 履约修改联络信息请求 0 20 15
+        interface PerformanceModifyContactReq {
+            /// MessageHead 消息头
+            Header?: IMessageHead;
+            PerformancePlanID?: number;  // uint64 履约计划ID
+            AccountID?: number;  // uint64 账号
+            ContactInfo?: string; // string 联络信息
+        }
+        // 履约修改联络信息回应 0 20 16
+        interface PerformanceModifyContactRsp {
+            /// MessageHead 消息头
+            Header?: IMessageHead;
+            // 返回码
+            RetCode: number; 
+            // 描述信息
+            RetDesc: string; 
+            // uint64 履约计划ID
+            PerformancePlanID: number;  
+            // uint64 账号
+            AccountID: number;  
+        }
+    }
+}