li.shaoyi преди 3 години
родител
ревизия
d205b1f351

+ 32 - 38
src/common/components/commonDes/commonDes.vue

@@ -1,15 +1,9 @@
 <template>
-  <a-descriptions :column="column"
-                  :bordered="bordered"
-                  class="commom-des">
-    <a-descriptions-item v-for="(item, i) in list"
-                         :key="i + 'des'"
-                         :label="item.label">
-      <span :class="item.className ? item.className : 'white'"
-            @click="onClick(item)">{{item.value}}</span>
+  <a-descriptions :column="column" :bordered="bordered" class="commom-des">
+    <a-descriptions-item v-for="(item, i) in list" :key="i + 'des'" :label="item.label">
+      <span :class="item.className ? item.className : 'white'" @click="onClick(item)">{{item.value}}</span>
     </a-descriptions-item>
-    <a-descriptions-item v-if="slotDesName"
-                         :label="slotDesName">
+    <a-descriptions-item v-if="slotDesName" :label="slotDesName">
       <slot></slot>
     </a-descriptions-item>
   </a-descriptions>
@@ -19,35 +13,35 @@ import { defineComponent, PropType } from 'vue';
 import { DescriptionsList } from './interface';
 
 export default defineComponent({
-    name: 'des-list',
-    components: {},
-    props: {
-        column: {
-            // 一行的 DescriptionItems 数量
-            type: Number,
-            default: 2,
-        },
-        bordered: {
-            // 是否展示边框
-            type: Boolean,
-            default: false,
-        },
-        slotDesName: {
-            // 使用插槽的时候,DescriptionItems 的内容描述
-            type: String,
-            default: '',
-        },
-        list: {
-            type: Array as PropType<DescriptionsList[]>,
-            default: [],
-        },
+  name: 'des-list',
+  components: {},
+  props: {
+    column: {
+      // 一行的 DescriptionItems 数量
+      type: Number,
+      default: 2,
     },
-    setup(props, context) {
-        function onClick(value: DescriptionsList) {
-            context.emit('onClick', value);
-        }
-        return { onClick };
+    bordered: {
+      // 是否展示边框
+      type: Boolean,
+      default: false,
+    },
+    slotDesName: {
+      // 使用插槽的时候,DescriptionItems 的内容描述
+      type: String,
+      default: '',
     },
+    list: {
+      type: Array as PropType<DescriptionsList[]>,
+      default: [],
+    },
+  },
+  setup(props, context) {
+    function onClick(value: DescriptionsList) {
+      context.emit('onClick', value);
+    }
+    return { onClick };
+  },
 });
 </script>
 
@@ -55,7 +49,7 @@ export default defineComponent({
 .commom-des {
     .ant-descriptions-item-label {
         display: inline-block;
-        width: 130px;
+        width: 140px;
         line-height: 30px;
         padding-left: 16px;
         color: @m-grey1;

+ 7 - 11
src/layout/components/header.vue

@@ -38,12 +38,7 @@
     <div>
       <a-popover v-model:visible="visible" trigger="click" placement="bottomRight">
         <template #content>
-          <div
-            v-for="item in setMenu"
-            class="popItem"
-            @click="chooseSetMenu(item.path)"
-            :key="item.path"
-          >{{ item.name }}</div>
+          <div v-for="item in setMenu" class="popItem" @click="chooseSetMenu(item.path)" :key="item.path">{{ item.name }}</div>
         </template>
         <a-avatar :size="24">
           <template #icon>
@@ -104,6 +99,7 @@ const setFn = () => {
     if (path === 'logout') {
       logout();
       APP.closeServer();
+      APP.closeQuote();
       Router.replace('/login');
     } else {
       changeTheme(path as ThemeEnum);
@@ -164,10 +160,10 @@ export default defineComponent({
 </script>
 <style lang="less">
 .friendIcon {
-  .icon {
-    font-size: 20px;
-    line-height: 32px;
-    margin: 6px 5px;
-  }
+    .icon {
+        font-size: 20px;
+        line-height: 32px;
+        margin: 6px 5px;
+    }
 }
 </style>

+ 10 - 0
src/services/go/Tjmd/index.ts

@@ -46,3 +46,13 @@ export function queryTjmdMarketSection(): Promise<type.TjmdMarketSection[]> {
     });
 }
 
+/**
+ * 掉期商品订单详情(交易确认书)
+ * /Order/QueryTradePosition
+ * @param //  交易模式 - 格式:1,2,3
+ */
+export function queryTjmdHolderDetailTradeInfo(req: type.QueryTjmdHolderDetailTradeInfoReq): Promise<type.QueryTjmdHolderDetailTradeInfoRsp[]> {
+    return commonSearch_go('/Tjmd/QueryTjmdHolderDetailTradeInfo', req).catch((err) => {
+        throw new Error(`掉期商品订单详情(交易确认书): ${err}`);
+    });
+}

+ 32 - 1
src/services/go/Tjmd/interface.ts

@@ -155,4 +155,35 @@ export interface TjmdMarketSection {
     pictureurl: string; // 图片url, 规格(90*90)
 
     mlist: TjmdMarketSectionConfig[]; // 市场列表(板块下面有多少个市场)
-}
+}
+
+/**
+ * 掉期商品订单详情请求(交易确认书)
+ */
+export interface QueryTjmdHolderDetailTradeInfoReq {
+    tradeid: string
+}
+
+/**
+ * 掉期商品订单详情返回(交易确认书)
+ */
+export interface QueryTjmdHolderDetailTradeInfoRsp {
+    agreeunit: number;// 合约乘数
+    buyaccountid: string;// 买方账户
+    buyusername: string;// 买方
+    delistingdate: string;// 最后结算日
+    expiredate: string;// 到期结算价定价日
+    exprieprice: string;// 到期清算价格
+    goodscode: string;// 商品代码
+    goodsid: number;// 商品ID
+    goodsname: string;// 商品名称(交易标的)
+    lasttradedate: string;// 最后交易日
+    listingdate: string;// 开始交易日
+    openprice: number;// 成交价
+    openqty: number;// 交易数量
+    sellaccountid: string;// 卖方账户
+    sellusername: string;// 卖方
+    tradeamount: number;// 初始名义价值
+    tradedate: string;// 成交日期
+    tradeid: string;// 成交编号
+}

+ 57 - 59
src/services/go/ermcp/order/interface.ts

@@ -265,62 +265,62 @@ export interface QueryTradeOrderDetailReq {
  * 委托单查询返回(合约市场)
  */
 export interface QueryTradeOrderDetailRsp {
-    accountid	:number;//账户ID[报价币种]
-    buildtype	:number;//委托单据类型 - 1:建仓 2:平仓 3:先平后建
-    buyorsell	:number;//买卖 - number;
-//:买 1:卖
-    cancelorderid	:string;//撤单单号(撤单时填写)
-    cancelqty	:number;//撤单数量
-    clienttype	:number;//客户端类型 - number;
-//:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端安卓 4:网页客户端 5:微信客户端 6:手机客户端苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江)
-    closefreezecharge	:number;//平仓冻结手续费(先建后平操作,需要记录)
-    closeqty	:number;//平仓数量(先建后平操作 需要记录)
-    closetradeqty	:number;//平仓成交数量(先建后平操作,需要记录)
-    closeunfreezecharge	:number;//平仓解冻手续费(先建后平操作,需要记录)
-    decimalplace	:number;//商品报价小数位
-    delistingtype	:number;//摘牌类型 - 1:价格最优 2:点选成交
-    enableqty	:number;//可用数量 = 委托数量 - 成交数量 - 撤单数量
-    enumdicname	:string;//单位名称
-    freezecharge	:number;//冻结手续费
-    freezemargin	:number;//冻结保证金(冻结交易金额)
-    goodscode	:string;//商品代码
-    goodsid	:number;//商品ID
-    goodsname	:string;//商品名称
-    goodunitid	:number;//商品单位id
-    listingselecttype	:number;//挂牌点选类型 - 1:挂牌 2:摘牌 3:先摘后挂
-    marketid	:number;//市场ID
-    marketname	:string;//市场名称
-    openfreezecharge	:number;//开仓冻结手续费(先建后平操作,需要记录)
-    openqty	:number;//开仓数量(先建后平操作,需要记录)
-    opentradeqty	:number;//开仓成交数量(先建后平操作,需要记录)
-    openunfreezecharge	:number;//开仓解冻手续费(先建后平操作,需要记录)
-    operatetype	:number;//操作类型 - 1:正常下单 2:斩仓 3:转单 4:结算撤单 5:系统卖出(适用于先平后建的卖出) 6:行情源报价 7:(结算)到期强平 8:(结算)协议转让 9:系统对冲单 1number;
-//:(结算)到期无效 11:交割协议转让 12:交割协议平仓 13:交割成交(所有权) 14:管理端强行平仓 15:管理端协议转让
-    operatorid	:number;//登录账号(LoginID)
-    orderid	:string;//委托单号(1number;
-//number;
-//+Unix秒时间戳(1number;
-//位)+2位(MarketServiceID)+xxxx)
-    orderprice	:number;//委托价格
-    orderqty	:number;//委托数量
-    ordersrc	:number;//委托来源 - 1:客户端 2:管理端 3:风控服务 4:交割服务 5:交易服务 6:交易日结 7:商品强平 8:管理端商品退市强平 9:交易接口 1number;
-//:交割服务商被动(受托竞价) 11:预埋触发
-    orderstatus	:number;//委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 1number;
-//:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
-    ordertime	:string;//委托时间
-    preorderid	:string;//关联预埋单号(止盈止损单时填写)
-    pricemode	:number;//取价方式 - 1:市价 2: 限价
-    qtydecimalplace	:number;//商品报价小数位
-    relatedid	:string;//关联单号(交割单)
-    tradedate	:string;//交易日(yyyyMMdd)
-    trademode	:number;//交易模式
-    tradeqty	:number;//成交数量
-    unfreezecharge	:number;//解冻手续费
-    unfreezemargin	:number;//解冻保证金
-    validtime	:string;//有效期限
-    validtype	:number;//有效类型 - 1当日有效 2本周有效 3指定日期有效 4一直有效 5指定时间有效
-    volumetype	:number;//当时间有效类型为 “立即执行否则取消 IOC” 时,需要此项 - number;
-//:任意量 1:最小量(暂时不支持) 2:全部量
+    accountid: number;//账户ID[报价币种]
+    buildtype: number;//委托单据类型 - 1:建仓 2:平仓 3:先平后建
+    buyorsell: number;//买卖 - number;
+    //:买 1:卖
+    cancelorderid: string;//撤单单号(撤单时填写)
+    cancelqty: number;//撤单数量
+    clienttype: number;//客户端类型 - number;
+    //:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端安卓 4:网页客户端 5:微信客户端 6:手机客户端苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江)
+    closefreezecharge: number;//平仓冻结手续费(先建后平操作,需要记录)
+    closeqty: number;//平仓数量(先建后平操作 需要记录)
+    closetradeqty: number;//平仓成交数量(先建后平操作,需要记录)
+    closeunfreezecharge: number;//平仓解冻手续费(先建后平操作,需要记录)
+    decimalplace: number;//商品报价小数位
+    delistingtype: number;//摘牌类型 - 1:价格最优 2:点选成交
+    enableqty: number;//可用数量 = 委托数量 - 成交数量 - 撤单数量
+    enumdicname: string;//单位名称
+    freezecharge: number;//冻结手续费
+    freezemargin: number;//冻结保证金(冻结交易金额)
+    goodscode: string;//商品代码
+    goodsid: number;//商品ID
+    goodsname: string;//商品名称
+    goodunitid: number;//商品单位id
+    listingselecttype: number;//挂牌点选类型 - 1:挂牌 2:摘牌 3:先摘后挂
+    marketid: number;//市场ID
+    marketname: string;//市场名称
+    openfreezecharge: number;//开仓冻结手续费(先建后平操作,需要记录)
+    openqty: number;//开仓数量(先建后平操作,需要记录)
+    opentradeqty: number;//开仓成交数量(先建后平操作,需要记录)
+    openunfreezecharge: number;//开仓解冻手续费(先建后平操作,需要记录)
+    operatetype: number;//操作类型 - 1:正常下单 2:斩仓 3:转单 4:结算撤单 5:系统卖出(适用于先平后建的卖出) 6:行情源报价 7:(结算)到期强平 8:(结算)协议转让 9:系统对冲单 1number;
+    //:(结算)到期无效 11:交割协议转让 12:交割协议平仓 13:交割成交(所有权) 14:管理端强行平仓 15:管理端协议转让
+    operatorid: number;//登录账号(LoginID)
+    orderid: string;//委托单号(1number;
+    //number;
+    //+Unix秒时间戳(1number;
+    //位)+2位(MarketServiceID)+xxxx)
+    orderprice: number;//委托价格
+    orderqty: number;//委托数量
+    ordersrc: number;//委托来源 - 1:客户端 2:管理端 3:风控服务 4:交割服务 5:交易服务 6:交易日结 7:商品强平 8:管理端商品退市强平 9:交易接口 1number;
+    //:交割服务商被动(受托竞价) 11:预埋触发
+    orderstatus: number;//委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 1number;
+    //:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
+    ordertime: string;//委托时间
+    preorderid: string;//关联预埋单号(止盈止损单时填写)
+    pricemode: number;//取价方式 - 1:市价 2: 限价
+    qtydecimalplace: number;//商品报价小数位
+    relatedid: string;//关联单号(交割单)
+    tradedate: string;//交易日(yyyyMMdd)
+    trademode: number;//交易模式
+    tradeqty: number;//成交数量
+    unfreezecharge: number;//解冻手续费
+    unfreezemargin: number;//解冻保证金
+    validtime: string;//有效期限
+    validtype: number;//有效类型 - 1当日有效 2本周有效 3指定日期有效 4一直有效 5指定时间有效
+    volumetype: number;//当时间有效类型为 “立即执行否则取消 IOC” 时,需要此项 - number;
+    //:任意量 1:最小量(暂时不支持) 2:全部量
 }
 
 /**
@@ -364,6 +364,4 @@ export interface QueryTradePositionRsp {
     tnusedqty: number;//T+N使用量(可以使用T+N的冻结数量)
     trademode: number;//交易模式
     usedmargin: number;//占用保证金[商品币种]
-}
-
-
+}

+ 1 - 1
src/utils/websocket/index.ts

@@ -465,7 +465,7 @@ export class MTP2WebSocket<T extends Package40 | Package50> {
                 this.onReconnectChangeState && this.onReconnectChangeState(this, ReconnectChangeState.ReconnectSuccessed);
             }).catch(() => {
                 if (!this.isBrokenReconnecting) {
-                    console.log(this.packageType, this.host, `第${this.reconnectCount}次重连失败`);
+                    console.warn(this.packageType, this.host, `第${this.reconnectCount}次重连失败`);
                     this.onReconnectChangeState && this.onReconnectChangeState(this, ReconnectChangeState.FailAndWaitPeriod);
                 }
             })

+ 104 - 0
src/views/order/swap_the_order/components/swap_commodity_contract_summary/components/detail/index.vue

@@ -0,0 +1,104 @@
+<template>
+  <!-- 商品订单-合约汇总-详情 -->
+  <a-modal class="commonModal custom-finish" title="商品掉期交易确认书" v-model:visible="visible" centered :maskClosable="false" @cancel="cancel" width="890px">
+    <template #footer>
+      <a-button key="submit" class="cancelBtn" :loading="loading" :disabled="loading" @click="cancel">取消</a-button>
+      <a-button key="submit" type="primary" :loading="loading" :disabled="loading" @click="cancel">确认</a-button>
+    </template>
+    <a-form class="inlineForm">
+      <fieldset class="formFieldSet">
+        <legend>基本信息</legend>
+        <Des :list="baseInfo" />
+      </fieldset>
+      <fieldset class="formFieldSet">
+        <legend>商品信息</legend>
+        <Des :list="goodsInfo" />
+      </fieldset>
+    </a-form>
+  </a-modal>
+</template>
+
+<script lang="ts">
+import { defineComponent, PropType, ref } from 'vue';
+import { QueryTradeHolderDetailRsp } from "@/services/go/order/interface";
+import { _closeModal } from '@/common/setup/modal/modal';
+import { Des, handleDesList } from '@/common/components/commonDes';
+import { queryTjmdHolderDetailTradeInfo } from '@/services/go/Tjmd'
+import { formatTime, formatValue } from '@/common/methods';
+
+export default defineComponent({
+  emits: ['cancel', 'update'],
+  components: {
+    Des
+  },
+  props: {
+    selectedRow: {
+      type: Object as PropType<QueryTradeHolderDetailRsp>,
+      default: {},
+    },
+  },
+  setup(props, context) {
+    const { visible, cancel } = _closeModal(context);
+    const maskClosableFlag = ref<boolean>(false);
+    const loading = ref<boolean>(false);
+
+    // 基本信息
+    const { desList: baseInfo, getDesList: getBaseInfo } = handleDesList();
+    // 商品信息
+    const { desList: goodsInfo, getDesList: getGoodsInfo } = handleDesList();
+
+    queryTjmdHolderDetailTradeInfo({ tradeid: props.selectedRow.tradeid }).then((res) => {
+      if (res.length) {
+        const data = res[0];
+
+        // 基本信息
+        const base = [
+          { label: '成交日期', value: formatValue(formatTime(data.tradedate, 'd')) },
+          { label: '成交编号', value: formatValue(data.tradeid) },
+          { label: '买方', value: formatValue(data.buyusername) },
+          { label: '卖方', value: formatValue(data.sellusername) },
+          { label: '买方账户', value: formatValue(data.buyaccountid) },
+          { label: '卖方账户', value: formatValue(data.sellaccountid) },
+        ]
+
+        // 现货信息
+        const spot = [
+          { label: '成交编号', value: formatValue(data.tradeid) },
+          { label: '交易标的', value: formatValue(data.goodsname) },
+          { label: '开始交易日', value: formatValue(formatTime(data.listingdate, 'd')) },
+          { label: '最后交易日', value: formatValue(formatTime(data.lasttradedate, 'd')) },
+          { label: '最后结算日', value: formatValue(formatTime(data.delistingdate, 'd')) },
+          { label: '合约乘数', value: formatValue(data.agreeunit) },
+          { label: '交易数量', value: formatValue(data.openqty) },
+          { label: '成交价', value: formatValue(data.openprice) },
+          { label: '初始名义价值', value: formatValue(data.tradeamount) },
+          { label: '到期清算价格', value: formatValue(data.exprieprice) },
+          { label: '到期结算价定价日', value: formatValue(formatTime(data.expiredate, 'd')) },
+        ]
+
+        getBaseInfo(base);
+        getGoodsInfo(spot);
+      }
+    })
+
+    return {
+      visible,
+      cancel,
+      loading,
+      baseInfo,
+      goodsInfo,
+      maskClosableFlag,
+    };
+  },
+});
+</script>
+
+<style lang="less">
+.custom-finish {
+    .upload {
+        .look {
+            margin-left: 0;
+        }
+    }
+}
+</style>

+ 5 - 1
src/views/order/swap_the_order/components/swap_commodity_contract_summary/index.vue

@@ -79,6 +79,7 @@ export default defineComponent({
     BtnList,
     swap_commodity_contract_summary_deal_closed: defineAsyncComponent(() => import('./components/swap_commodity_contract_summary_deal_closed/index.vue')), // 协议平仓
     swap_commodity_contract_summary_order_closed: defineAsyncComponent(() => import('./components/swap_commodity_contract_summary_order_closed/index.vue')), // 平仓
+    detail: defineAsyncComponent(() => import('./components/detail/index.vue')), // 详情
   },
   setup() {
     const { positionList, swapList, getHoldsList, getSwapList, getTradeHolderDetail, useProfitloss } = useHazardRates();
@@ -98,6 +99,7 @@ export default defineComponent({
       queryFn: queryTableAction,
       tableName: 'table_pcweb_spot_trade_bottom_commodity_contract_summary',
       recordList: getRecordItemTab(),
+      isDetail: true,
     };
 
     // 现价
@@ -113,7 +115,7 @@ export default defineComponent({
     function handleBtnList(record: QueryTradePositionRsp, btnList: BtnListType[]) {
       // 贸易圈
       // 只有机构 才有平仓
-      const diaoqi = isInvestment() ? ['swap_commodity_contract_summary_deal_closed', 'swap_commodity_contract_summary_order_closed'] : ['swap_commodity_contract_summary_deal_closed'];
+      const diaoqi = isInvestment() ? ['swap_commodity_contract_summary_deal_closed', 'swap_commodity_contract_summary_order_closed', 'detail'] : ['swap_commodity_contract_summary_deal_closed', 'detail'];
       return btnList.filter((e) => diaoqi.includes(e.code));
     }
     const {
@@ -123,9 +125,11 @@ export default defineComponent({
       componentId, closeComponent, openComponent,  // 控制异步组件
       btnList, // 表格按钮
     } = handleComposeOrderTable<QueryTradePositionRsp>(param)
+
     function clsoeAction(value: boolean) {
       closeComponent(value)
     }
+
     Bus.$on('spotTrade', () => {
       queryTableAction()
     });