From 916757dbb9d08ef2875fd3a8bd7a16ebe6d8f97c Mon Sep 17 00:00:00 2001
From: lxf <1371462558@qq.com>
Date: Tue, 24 Jun 2025 20:13:07 +0800
Subject: [PATCH] feat

---
 src/components/perpetual-order/index.vue            |  353 ++++++++++++---------
 src/i18n/en-US/index.js                             |    2 
 src/components/perpetual-open/index.vue             |  102 +++--
 src/page/perpetualContract/index.vue                |    4 
 src/components/perpetual-position-list/index2.vue   |  364 ++++++++++++++++++++++
 src/page/perpetualContract/perpetualHistory.vue     |   19 +
 src/components/perpetual-history-position/index.vue |   89 +++++
 src/i18n/CN/index.js                                |    2 
 8 files changed, 732 insertions(+), 203 deletions(-)

diff --git a/src/components/perpetual-history-position/index.vue b/src/components/perpetual-history-position/index.vue
index 42cbd26..3a8bd09 100644
--- a/src/components/perpetual-history-position/index.vue
+++ b/src/components/perpetual-history-position/index.vue
@@ -40,6 +40,54 @@
               {{ item.state ? handleText(item.state) : "--" }}
             </div>
           </div>
+          <div class="list-b">
+            <div>{{ $t("开仓价格") }}</div>
+            <div class="list-value">
+              {{ item.trade_avg_price }}
+            </div>
+          </div>
+          <div class="list-b">
+            <div>{{ $t("平仓价格") }}</div>
+            <div class="list-value">
+              {{ item.close_avg_price }}
+            </div>
+          </div>
+          <div class="list-b">
+            <div>{{ $t("保证金") }}</div>
+            <div class="list-value">
+              {{ item.deposit_open }}
+            </div>
+          </div>
+          <div class="list-b">
+            <div>{{ $t("手续费") }}</div>
+            <div class="list-value">
+              {{ item.fee }}
+            </div>
+          </div>
+          <div class="list-b">
+            <div>{{ $t("盈利率") }}</div>
+            <div
+              class="list-value"
+              :class="{
+                'text-green': item.profit / 1 > 0,
+                'text-red': item.profit / 1 < 0,
+              }"
+            >
+              {{ calculateProfitRate(item) }}
+            </div>
+          </div>
+          <div class="list-b">
+            <div>{{ $t("盈利") }}</div>
+            <div
+              class="list-value"
+              :class="{
+                'text-green': item.profit / 1 > 0,
+                'text-red': item.profit / 1 < 0,
+              }"
+            >
+              {{ item.profit }}
+            </div>
+          </div>
         </div>
       </div>
     </div>
@@ -88,7 +136,31 @@
     </template> -->
   </div>
 </template>
-
+<!-- {
+  "order_no": "25062319103773064243",  // 订单编号
+  "amount_open": 169350.0,             // 开仓金额(USDT)
+  "symbol": "eth",                     // 交易对符号(ETH)
+  "lever_rate": 200.0,                 // 杠杆倍数(200倍)
+  "amount": 0.0,                       // 当前持仓金额(已平仓为0)
+  "create_time": "2025-06-23  07:10:37  AM",  // 开仓时间
+  "fee": 10.161,                       // 手续费(USDT)
+  "qiangPing": "2160.74289",           // 强平价格
+  "mark_price": 2414.6,                // 标记价格
+  "deposit_open": 270.96,              // 开仓保证金(USDT)
+  "stop_price_loss": 0.0,              // 止损价格(未设置)
+  "change_ratio": 0.0,                 // 价格变动比率
+  "close_time": "2025-06-23  12:16:22  PM",  // 平仓时间
+  "trade_avg_price": 2246.69,          // 开仓均价(USDT)
+  "close_avg_price": 2226.53,         // 平仓均价(USDT)
+  "stop_price_profit": 0.0,            // 止盈价格(未设置)
+  "volume": 0.0,                       // 当前持仓量(已平仓为0)
+  "volume_open": 75.0,                 // 开仓数量(ETH)
+  "name": "ETH/USDT",                  // 交易对名称
+  "deposit": 0.0,                      // 当前保证金(已平仓为0)
+  "state": "created",                  // 状态(已平仓)
+  "profit": "-486.28",                 // 盈亏金额(亏损486.28 USDT)
+  "direction": "buy"                   // 方向(买入/做多)
+} -->
 <script>
 export default {
   name: "perpetualHistoryPosition",
@@ -128,6 +200,14 @@
     },
   },
   methods: {
+    calculateProfitRate(item) {
+      if (!item.trade_avg_price || !item.close_avg_price) return "--";
+      const profitRate = (
+        ((item.close_avg_price - item.trade_avg_price) / item.trade_avg_price) *
+        100
+      ).toFixed(2);
+      return profitRate + "%";
+    },
     handleText(state) {
       let str = "";
       if (state == "created") {
@@ -251,4 +331,11 @@
   height: 1px;
   background: rgba(60, 58, 58, 0.6);
 }
+
+.text-red {
+  color: #ff0000 !important;
+}
+.text-green {
+  color: #1cd36d !important;
+}
 </style>
diff --git a/src/components/perpetual-open/index.vue b/src/components/perpetual-open/index.vue
index 24caf67..0f20263 100644
--- a/src/components/perpetual-open/index.vue
+++ b/src/components/perpetual-open/index.vue
@@ -197,44 +197,8 @@
                 <!-- {{ initFutrue.amount }} // 余额 -->
               </span>
               <!-- {{ form.lever_rate }} -->
-              <span
-                class="font-22 font-400 textColor"
-                v-if="form.lever_rate == 25"
-              >
-                {{
-                  Math.floor(initFutrue.amount / (initData.amount + 0.0375)) *
-                  form.lever_rate
-                }}
-                {{ $t("手数") }}
-              </span>
-              <span
-                class="font-22 font-400 textColor"
-                v-if="form.lever_rate == 50"
-              >
-                {{
-                  Math.floor(initFutrue.amount / (initData.amount + 0.075)) *
-                  form.lever_rate
-                }}
-                {{ $t("手数") }}
-              </span>
-              <span
-                class="font-22 font-400 textColor"
-                v-if="form.lever_rate == 100"
-              >
-                {{
-                  Math.floor(initFutrue.amount / (initData.amount + 0.15)) *
-                  form.lever_rate
-                }}
-                {{ $t("手数") }}
-              </span>
-              <span
-                class="font-22 font-400 textColor"
-                v-if="form.lever_rate == 200"
-              >
-                {{
-                  Math.floor(initFutrue.amount / (initData.amount + 0.3)) *
-                  form.lever_rate
-                }}
+              <span class="font-22 font-400 textColor">
+                {{ maxItems }}
                 {{ $t("手数") }}
               </span>
             </div>
@@ -253,10 +217,10 @@
               <span class="flex-1 text-right">75%</span>
               <span class="flex-1 text-right">100%</span>
             </div> -->
-            <!-- 张数输入 -->
+            <!-- 张数 滑块 -->
             <amount-slider
               ref="sliderRef"
-              :maxAmount="getVolumnByLever()"
+              :maxAmount="maxItems"
               @getAmount="getAmount"
             ></amount-slider>
           </template>
@@ -271,9 +235,7 @@
             <div class="flex justify-between mt-30">
               <div class="text-grey">{{ $t("保证金") }}</div>
               <div class="textColor">
-                {{
-                  ((form.amount * initData.amount) / form.lever_rate).toFixed(4)
-                }}
+                {{ margin.toFixed(4) }}
                 USDT
               </div>
             </div>
@@ -284,7 +246,7 @@
 			      ? initData.fee * (form.amount / 1)
 			      : (initData.fee * (form.amount / 1) * form.lever_rate) | nan
 			  }} -->
-              <div class="textColor">{{ calculatedFee.toFixed(4) }} USDT</div>
+              <div class="textColor">{{ fee.toFixed(4) }} USDT</div>
             </div>
           </template>
           <div
@@ -750,6 +712,52 @@
       // 可买数量
       return Math.floor(this.initOpen.volume / 1 / this.form.lever_rate);
     },
+    // 每份保证金
+    perItemMargin() {
+      console.log(
+        this.initData,
+        ": 每份保证金",
+        this.initData.amount / this.form.lever_rate
+      );
+      return this.initData.amount / this.form.lever_rate;
+    },
+    // 每份手续费(基于保证金)
+    perItemFee() {
+      const rateMap = {
+        25: 0.0375,
+        50: 0.075,
+        100: 0.15,
+        200: 0.3,
+      };
+      const rate = rateMap[this.form.lever_rate];
+      return this.perItemMargin * rate;
+    },
+    // 每份总支出
+    perItemTotalCost() {
+      return this.perItemMargin + this.perItemFee;
+    },
+    // 最大可购买整数份数
+    maxItems() {
+      console.log(this.initFutrue.amount, ": initFutrue.amount");
+      if (this.perItemTotalCost <= 0) return 0;
+      return Math.floor(this.initFutrue.amount / this.perItemTotalCost);
+    },
+    // 实际交易金额
+    actualTradeValue() {
+      return this.form.amount * this.initData.amount;
+    },
+    // 总保证金
+    margin() {
+      return this.form.amount * this.perItemMargin;
+    },
+    // 总手续费
+    fee() {
+      return this.form.amount * this.perItemFee;
+    },
+    // 总支出
+    totalExpenditure() {
+      return this.margin + this.fee;
+    },
     calculatedFee() {
       const rateMap = {
         25: 0.0375,
@@ -758,7 +766,10 @@
         200: 0.3,
       };
       const rate = rateMap[this.form.lever_rate];
-      return (this.form.amount * rate) / this.form.lever_rate;
+      console.log(this.initData.amount, ": initData.amount");
+      return (
+        (this.form.amount * this.initData.amount * rate) / this.form.lever_rate
+      );
       // : this.initData.amount * (this.form.amount / 1) * rate;
     },
   },
@@ -857,6 +868,7 @@
   methods: {
     //获取张数
     getAmount(val) {
+      console.log(val, "获取张数");
       this.form.amount = val || 0;
       // if(this.form.lever_rate==25){
       //  this.form.amount = Math.floor((this.initFutrue.amount-(this.initFutrue.amount *  0.0375))/this.initData.amount)
diff --git a/src/components/perpetual-order/index.vue b/src/components/perpetual-order/index.vue
index ca187e0..395f56f 100644
--- a/src/components/perpetual-order/index.vue
+++ b/src/components/perpetual-order/index.vue
@@ -1,184 +1,227 @@
 <template>
-    <!-- 永续合约订单列表页 -->
-    <div>
-        <div class="items-center mt-18">
-            <div class="flex justify-between border-b-color">
-                <div class="flex pb-10">
-                    <template v-if="topIndex / 1 === 1">
-                        <!-- <div class="w-280 flex flex-col items-center textColor1" @click="tabClick('1')"  :class="type=='1'?'active-line':''">{{ $t('当前委托') }}</div>
+  <!-- 永续合约订单列表页 -->
+  <div>
+    <div class="items-center mt-18">
+      <div class="flex justify-between border-b-color">
+        <div class="flex pb-10">
+          <template v-if="topIndex / 1 === 1">
+            <!-- <div class="w-280 flex flex-col items-center textColor1" @click="tabClick('1')"  :class="type=='1'?'active-line':''">{{ $t('当前委托') }}</div>
                         <div class="w-280 flex flex-col items-center ml-30 textColor1" @click="tabClick('2')" :class="type=='2'?'active-line':''">{{ $t('持有仓位') }}</div> -->
-                        <div class="px-10  py-10 flex  items-center text-grey" @click="tabClick('1')"
-                            :class="type == '1' ? 'active-line' : ''">{{ $t('持有仓位') }}<span v-if="type == '1'">({{
-                                orderHold.length }})</span></div>
-                        <div class="px-10  ml-50  py-10 flex  items-center text-grey" @click="tabClick('2')"
-                            :class="type == '2' ? 'active-line' : ''">{{ $t('当前委托') }}</div>
-                    </template>
-                    <template v-else>
-                        <div class="px-10  py-10 flex  items-center text-grey" @click="tabClick('3')"
-                            :class="type == '3' ? 'active-line' : ''">{{ $t('持有仓位') }}<span v-if="type == '2'">({{
-                                orderCur.length
-                            }})111</span></div>
-                        <div class="px-10  ml-50  py-10 flex  items-center text-grey" @click="tabClick('4')"
-                            :class="type == '4' ? 'active-line' : ''">{{ $t('历史仓位') }}</div>
-                    </template>
-                </div>
-                <img src="../../assets/image/public/record.png" alt="record-img" class="w-32 h-35 pr-30 py-15  "
-                    @click="goHistory" />
+            <div
+              class="px-10 py-10 flex items-center text-grey"
+              @click="tabClick('1')"
+              :class="type == '1' ? 'active-line' : ''"
+            >
+              {{ $t("持有仓位")
+              }}<span v-if="type == '1'">({{ orderHold.length }})</span>
             </div>
-            <!-- 永续-->
-            <template v-if="topIndex / 1 === 1">
-                <!-- 委托列表 -->
-                <div v-if="type == '1'">
-                    <!-- <PerpetualEntrustList :list-data="orderCur" @recall="$emit('recall', $event)"></PerpetualEntrustList> -->
-                    <PerpetualPositionList :list-data="orderHold" @sell="$emit('recall', $event)"></PerpetualPositionList>
-                </div>
-                <!-- 持有仓位列表 -->
-                <div v-if="type == '2'">
-                    <!-- <PerpetualPositionList :list-data="orderHold" @sell="$emit('recall', $event)"></PerpetualPositionList> -->
-                    <PerpetualEntrustList :list-data="orderCur" @recall="$emit('recall', $event)"></PerpetualEntrustList>
-                </div>
-            </template>
-            <!-- 交割-->
-            <template v-else>
-                <div v-if="type == '3'">
-                    <futrue-hold-list :price="price" :symbol="symbol" :list-data="futrueHold" />
-                </div>
-                <div v-if="type == '4'">
-                    <futrue-histroy-position  :list-data="futrueHistroy" />
-                </div>
-            </template>
+            <div
+              class="px-10 ml-50 py-10 flex items-center text-grey"
+              @click="tabClick('2')"
+              :class="type == '2' ? 'active-line' : ''"
+            >
+              {{ $t("当前委托") }}
+            </div>
+          </template>
+          <template v-else>
+            <div
+              class="px-10 py-10 flex items-center text-grey"
+              @click="tabClick('3')"
+              :class="type == '3' ? 'active-line' : ''"
+            >
+              {{ $t("持有仓位")
+              }}<span v-if="type == '2'">({{ orderCur.length }})111</span>
+            </div>
+            <div
+              class="px-10 ml-50 py-10 flex items-center text-grey"
+              @click="tabClick('4')"
+              :class="type == '4' ? 'active-line' : ''"
+            >
+              {{ $t("历史仓位") }}
+            </div>
+          </template>
         </div>
+        <img
+          src="../../assets/image/public/record.png"
+          alt="record-img"
+          class="w-32 h-35 pr-30 py-15"
+          @click="goHistory"
+        />
+      </div>
+      <!-- 永续-->
+      <template v-if="topIndex / 1 === 1">
+        <!-- 委托列表 -->
+        <div v-if="type == '1'">
+          <!-- <PerpetualEntrustList :list-data="orderCur" @recall="$emit('recall', $event)"></PerpetualEntrustList> -->
+          <PerpetualPositionList
+            :list-data="orderHold"
+            @sell="$emit('recall', $event)"
+          ></PerpetualPositionList>
+        </div>
+        <!-- 持有仓位列表 -->
+        <div v-if="type == '2'">
+          <!-- <PerpetualPositionList :list-data="orderHold" @sell="$emit('recall', $event)"></PerpetualPositionList> -->
+          <PerpetualEntrustList
+            :list-data="orderCur"
+            @recall="$emit('recall', $event)"
+          ></PerpetualEntrustList>
+        </div>
+      </template>
+      <!-- 交割-->
+      <template v-else>
+        <div v-if="type == '3'">
+          <futrue-hold-list
+            :price="price"
+            :symbol="symbol"
+            :list-data="futrueHold"
+          />
+        </div>
+        <div v-if="type == '4'">
+          <futrue-histroy-position :list-data="futrueHistroy" />
+        </div>
+      </template>
     </div>
+  </div>
 </template>
 
 <script>
-import PerpetualEntrustList from '../perpetual-entrust-list/index.vue';
-import PerpetualPositionList from '../perpetual-position-list/index.vue';
-import futrueHoldList from '@/page/deliveryContract/hold.vue'
-import futrueHistroyPosition from '@/page/deliveryContract/position.vue'
+import PerpetualEntrustList from "../perpetual-entrust-list/index.vue";
+import PerpetualPositionList from "../perpetual-position-list/index2.vue";
+import futrueHoldList from "@/page/deliveryContract/hold.vue";
+import futrueHistroyPosition from "@/page/deliveryContract/position.vue";
 
 export default {
-    name: "perpetualOrder",
-    data() {
-        return {
-            type: '1', // 1:永续持有,2:永续当前,3:交割持有,4:交割历史
-        };
+  name: "perpetualOrder",
+  data() {
+    return {
+      type: "1", // 1:永续持有,2:永续当前,3:交割持有,4:交割历史
+    };
+  },
+  props: {
+    topIndex: {
+      type: [Number, String],
+      default: 1,
     },
-    props: {
-        topIndex: {
-            type: [Number, String],
-            default: 1
-        },
-        symbol: {
-            type: String,
-            default: ''
-        },
-        orderCur: { //
-            type: Array,
-            default() {
-                return []
-            }
-        },
-        orderHold: {
-            type: Array,
-            default() {
-                return []
-            }
-        },
-        futrueHold: {
-            type: Array,
-            default() {
-                return []
-            }
-        },
-        futrueHistroy: {
-            type: Array,
-            default() {
-                return []
-            }
-        },
-        price: {
-            type: [Number, String],
-            default: '0.00'
-        },
+    symbol: {
+      type: String,
+      default: "",
     },
-    watch: {
-        topIndex(val) {
-            if (val / 1 === 1) {
-                this.type = '1'
-                this.tabClick('1')
-            } else {
-                this.type = '3'
-                this.tabClick('3')
-            }
-        }
+    orderCur: {
+      //
+      type: Array,
+      default() {
+        return [];
+      },
     },
-    mounted() {
-        if (this.topIndex == 1) {
-            this.type = '1'
-            this.tabClick('1')
-        } else {
-            this.type = '3'
-            this.tabClick('3')
-        }
+    orderHold: {
+      type: Array,
+      default() {
+        return [];
+      },
     },
-    activated() {
-        if (this.topIndex == 1) {
-            this.type = '1'
-            this.tabClick('1')
-        } else {
-            this.type = '3'
-            this.tabClick('3')
-        }
+    futrueHold: {
+      type: Array,
+      default() {
+        return [];
+      },
     },
-    methods: {
-        tabClick(type) {
-            this.type = type;
-            if (type == '1') { //  && !this.orderCur.length
-                //this.$emit('tab', 'fetchOrderListCur')
-                this.$emit('tab', 'fetchOrderListHold')
-            }
-            if (type === '2') { //  && !this.orderHold.length
-                //this.$emit('tab', 'fetchOrderListHold')
-                this.$emit('tab', 'fetchOrderListCur')
-            }
-            if (type === '3') {
-                this.$emit('tab', 'fetchFutrueHoldList')
-            }
-            if (type === '4') {
-                this.$emit('tab', 'fetchFutrueHistory')
-            }
-            // this.$emit(type)
-        },
-        goHistory() {
-            const url = this.topIndex / 1 === 1 ? 'perpetualHistory' : 'deliveryContractHistory'
-            this.$router.push({
-                path: `/${url}?symbol=${this.symbol}`
-            });
-        }
+    futrueHistroy: {
+      type: Array,
+      default() {
+        return [];
+      },
     },
-    components: { PerpetualEntrustList, PerpetualPositionList, futrueHistroyPosition, futrueHoldList }
-}
-
+    price: {
+      type: [Number, String],
+      default: "0.00",
+    },
+  },
+  watch: {
+    topIndex(val) {
+      if (val / 1 === 1) {
+        this.type = "1";
+        this.tabClick("1");
+      } else {
+        this.type = "3";
+        this.tabClick("3");
+      }
+    },
+  },
+  mounted() {
+    if (this.topIndex == 1) {
+      this.type = "1";
+      this.tabClick("1");
+    } else {
+      this.type = "3";
+      this.tabClick("3");
+    }
+  },
+  activated() {
+    if (this.topIndex == 1) {
+      this.type = "1";
+      this.tabClick("1");
+    } else {
+      this.type = "3";
+      this.tabClick("3");
+    }
+  },
+  methods: {
+    tabClick(type) {
+      this.type = type;
+      if (type == "1") {
+        //  && !this.orderCur.length
+        //this.$emit('tab', 'fetchOrderListCur')
+        this.$emit("tab", "fetchOrderListHold");
+      }
+      if (type === "2") {
+        //  && !this.orderHold.length
+        //this.$emit('tab', 'fetchOrderListHold')
+        this.$emit("tab", "fetchOrderListCur");
+      }
+      if (type === "3") {
+        this.$emit("tab", "fetchFutrueHoldList");
+      }
+      if (type === "4") {
+        this.$emit("tab", "fetchFutrueHistory");
+      }
+      // this.$emit(type)
+    },
+    goHistory() {
+      const url =
+        this.topIndex / 1 === 1
+          ? "perpetualHistory"
+          : "deliveryContractHistory";
+      this.$router.push({
+        path: `/${url}?symbol=${this.symbol}`,
+      });
+    },
+  },
+  components: {
+    PerpetualEntrustList,
+    PerpetualPositionList,
+    futrueHistroyPosition,
+    futrueHoldList,
+  },
+};
 </script>
 
 <style lang="scss" scoped>
 .all-cancel-btn {
-    background-color: #EAEBEF;
+  background-color: #eaebef;
 }
 
 .cancel-btn {
-    background-color: #EAEBEF;
+  background-color: #eaebef;
 }
 
 .active-line {
-    position: relative;
-    // padding: 15px 0;
-    color: #fff;
+  position: relative;
+  // padding: 15px 0;
+  color: #fff;
 
-    @include themify() {
-        background-color: themed("color_main");
-    }
+  @include themify() {
+    background-color: themed("color_main");
+  }
 }
 
 // .active-line::after{
@@ -194,6 +237,6 @@
 //        }
 // }
 .textColor1 {
-    color: #fff;
+  color: #fff;
 }
 </style>
diff --git a/src/components/perpetual-position-list/index2.vue b/src/components/perpetual-position-list/index2.vue
new file mode 100644
index 0000000..a28e84f
--- /dev/null
+++ b/src/components/perpetual-position-list/index2.vue
@@ -0,0 +1,364 @@
+<template>
+  <!-- 持有仓位列表 -->
+  <div>
+    <!--        <div class="flex justify-between" v-if="listData.length">-->
+    <!--            <div class="flex" @click.stop="changeIcon">-->
+    <!--                <img v-show="!iconShow" src="../../assets/image/public/grey-rounded.png" alt="" class="w-38 h-38"/>-->
+    <!--                <img v-show="iconShow" src="../../assets/image/public/blue-rounded.png" alt="" class="w-38 h-38"/>-->
+    <!--                <div class="ml-37">{{ $t('隐藏其它合约') }}</div>-->
+    <!--            </div>-->
+    <!--            <button class="border-none all-cancel-btn pl-34 pr-34 pt-10 pb-10 font-25" @click="onSellAll">{{ $t('一键平仓') }}</button>-->
+    <!--        </div>-->
+    <div
+      :class="[isStyle ? 'border-b-color' : '']"
+      v-for="item in listData"
+      :key="item.order_no"
+    >
+      <div class="flex justify-between pt-44 pb-44">
+        <div class="flex flex-col">
+          <div class="flex items-center">
+            <div
+              class="pl-29 pr-29 pt-11 pb-11 text-white open-btn"
+              :class="item.direction == 'buy' ? ' bg-green' : 'bg-red'"
+            >
+              {{ item.direction == "buy" ? $t("开多") : $t("开空") }}
+            </div>
+            <div class="ml-22 font-31 font-600">
+              <span class="" :class="[isStyle ? 'textColor1 ' : 'textColor']"
+                >{{ item.name }} {{ $t("永续") }}</span
+              >
+              <span class="text-grey font-28 font-400 ml-17 mr-17"
+                >{{ $t("全仓") }}
+                <!-- {{ item.lever_rate }}x -->
+              </span>
+            </div>
+            <img
+              v-if="item.direction == 'buy'"
+              src="../../assets/image/public/green-leverage.png"
+              alt=""
+              class="w-32 h-32"
+            />
+            <img
+              v-else
+              src="../../assets/image/public/red-leverage.png"
+              alt=""
+              class="w-32 h-32"
+            />
+          </div>
+        </div>
+      </div>
+      <div class="flex justify-between">
+        <!-- <div class="flex-1 text-left">
+          <div class="text-grey">
+            {{ $t("未实现盈亏(USDT)") }}
+          </div>
+          <div
+            class="mt-20"
+            :class="item.profit > 0 ? 'text-green' : 'text-red'"
+          >
+            {{ item.profit > 0 ? "+" + item.profit : item.profit }}
+          </div>
+        </div>
+
+        <div class="flex-1 flex flex-col text-left">
+          <div class="text-grey">ROE</div>
+          <div
+            class="mt-20"
+            :class="item.change_ratio / 1 > 0 ? 'text-green' : 'text-red'"
+          >
+            {{ item.change_ratio }}%
+          </div>
+        </div> -->
+        <div class="flex-1 text-left">
+          <div class="text-grey h40">{{ $t("时间") }}</div>
+          <div
+            class="mt-20"
+            :class="[isStyle ? 'textColor1 ' : 'textColor']"
+            style="width: 80px"
+          >
+            {{ item.create_time }}
+          </div>
+        </div>
+        <div class="flex-1 text-left">
+          <div class="text-grey h40">{{ $t("持仓数量") }}</div>
+          <div class="mt-20" :class="[isStyle ? 'textColor1 ' : 'textColor']">
+            {{ item.amount }}
+          </div>
+        </div>
+        <div class="flex-1 text-left">
+          <div class="text-grey h40">{{ $t("保证金") }}</div>
+          <div class="mt-20" :class="[isStyle ? 'textColor1 ' : 'textColor']">
+            {{ item.deposit }}
+          </div>
+        </div>
+
+        <div class="flex-2 flex flex-col text-center justify-cen">
+          <button
+            class="greyBg border-none pl-34 pr-34 pt-10 pb-10 rounded"
+            @click="onSell(item.order_no)"
+          >
+            {{ $t("平仓") }}
+          </button>
+        </div>
+      </div>
+      <!-- <div class="flex pt-44 pb-32"> -->
+
+      <!-- <div class="flex-2 flex flex-col text-center justify-end">
+          <div
+            class="font-25 border-light-blue detail-btn colorMain"
+            @click.stop="clickzyzs(item)"
+            style="padding: 4px 8px"
+          >
+            {{ $t("止盈") }}{{ $t("止损") }}
+          </div>
+        </div> -->
+      <!-- </div> -->
+      <!-- <div class="flex pb-32"> -->
+      <!-- <div class="flex-1 flex flex-col text-left">
+          <div class="text-grey">{{ $t("开仓价格") }}</div>
+          <div class="mt-20" :class="[isStyle ? 'textColor1 ' : 'textColor']">
+            {{ item.trade_avg_price }}
+          </div>
+        </div>
+        <div class="flex-1 flex flex-col text-left">
+          <div class="text-grey">{{ $t("强平价格") }}</div>
+          <div class="mt-20" :class="[isStyle ? 'textColor1 ' : 'textColor']">
+            {{ item.qiangPing }}
+          </div>
+        </div> -->
+      <!-- <div class="flex-1">
+          <div class="text-grey">{{ $t("标记价格") }}</div>
+          <div class="mt-20" :class="[isStyle ? 'textColor1 ' : 'textColor']">
+            {{ item.mark_price }}
+          </div>
+        </div> -->
+      <!-- <div class="flex-2 flex flex-col items-center justify-end">
+          <button
+            class="font-30 border-light-blue detail-btn colorMain w-125 h-60"
+            @click="goDetail(item)"
+          >
+            {{ $t("详情") }}
+          </button>
+        </div> -->
+      <!-- </div> -->
+    </div>
+    <van-popup
+      :closeable="true"
+      v-if="iszyzs && selectIndex == 1"
+      v-model="iszyzs"
+      style="
+        width: 350px;
+        height: 220px;
+        display: flex;
+        justify-content: center;
+        flex-direction: column;
+      "
+      class="rounded-2xl"
+    >
+      <div
+        class="h-76 lh-76 inputBackground mb-30 flex pr-20 justify-center rounded-lg textColor"
+        style="margin-top: 20px; width: 80%; margin-left: 10%"
+      >
+        <input
+          :placeholder="selectIndex == 1 ? $t('请输入止盈金额') : ''"
+          class="inputBackground pl-20 h-76 border-none text-left rounded-lg"
+          v-model="stop_price_profit"
+        />
+        <span class="font-22 font-400 textColor">{{ $t("止盈") }}</span>
+      </div>
+      <div
+        class="h-76 lh-76 inputBackground mb-30 flex pr-20 justify-center rounded-lg textColor"
+        style="margin-bottom: 20px; width: 80%; margin-left: 10%"
+        v-if="selectIndex == 1"
+      >
+        <input
+          :placeholder="selectIndex == 1 ? $t('请输入止损金额') : ''"
+          class="inputBackground pl-20 h-76 border-none text-left rounded-lg"
+          v-model="stop_price_loss"
+        />
+        <span class="font-22 font-400 textColor">{{ $t("止损") }}</span>
+      </div>
+      <div
+        class="btn"
+        style="
+          width: 100%;
+          display: flex;
+          justify-content: center;
+          align-items: center;
+        "
+      >
+        <div
+          class="btn_right"
+          @click="iszyzs = false"
+          style="
+            width: 50%;
+            text-align: center;
+            height: 100%;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+          "
+        >
+          {{ $t("取消") }}
+        </div>
+        <div
+          class="btn_left"
+          @click="zyzsclick"
+          style="
+            width: 50%;
+            text-align: center;
+            height: 100%;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+          "
+        >
+          {{ $t("确认") }}
+        </div>
+      </div>
+    </van-popup>
+    <div class="text-grey text-center py-300" v-if="!listData.length">
+      {{ $t("您目前没有持仓") }}
+    </div>
+  </div>
+</template>
+
+<script>
+import { _orderSell, _orderSellBatch, _getzyzs } from "@/API/trade.api";
+import { Dialog, Popup } from "vant";
+//import { i18n } from "@/i18n";
+export default {
+  name: "perpetualPositionList",
+  data() {
+    return {
+      iconShow: false,
+      isStyle: true,
+      selectIndex: 1,
+      xzitem: {},
+      iszyzs: false,
+      stop_price_loss: "",
+      stop_price_profit: "",
+    };
+  },
+  props: {
+    type: {
+      type: String,
+      default: "2", // 2 永续合约历史持仓,3交割合约持仓
+    },
+    listData: {
+      type: Array,
+      default() {
+        return [];
+      },
+    },
+  },
+  mounted() {
+    if (this.$route.path == "/funds") {
+      this.isStyle = false;
+    }
+  },
+  components: {
+    [Popup.name]: Popup,
+  },
+  methods: {
+    clickzyzs(item) {
+      this.iszyzs = true;
+      this.xzitem = item;
+    },
+    zyzsclick() {
+      console.log(this.xzitem.order_no);
+      var data = {
+        stop_price_loss: this.stop_price_loss,
+        order_no: this.xzitem.order_no,
+        stop_price_profit: this.stop_price_profit,
+      };
+      _getzyzs(data).then((res) => {
+        this.$toast(this.$t("成功"));
+        this.iszyzs = false;
+      });
+    },
+    changeIcon() {
+      this.iconShow = !this.iconShow;
+    },
+    goDetail(item) {
+      this.$router.push({
+        path: "/orderDetail?order_no=" + item.order_no,
+      });
+    },
+    onSell(order_no) {
+      // 平仓单个
+      Dialog.confirm({
+        confirmButtonText: this.$t("确定"),
+        cancelButtonText: this.$t("取消"),
+        title: this.$t("平仓提示"),
+        message: this.$t("是否平仓?"),
+      })
+        .then(() => {
+          _orderSell({ order_no }).then(() => {
+            this.$toast(this.$t("平仓成功"));
+            this.$emit("sell", order_no);
+          });
+        })
+        .catch(() => {});
+    },
+    onSellAll() {
+      // 平仓全部
+      _orderSellBatch().then(() => {
+        this.$toast(this.$t("平仓成功"));
+        this.$emit("sell");
+      });
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+.text-grey {
+  color: #868c9a;
+  font-size: 25px;
+}
+.open-btn {
+  border-radius: 7px;
+}
+
+.detail-btn {
+  border: 1px solid;
+  border-radius: 7px;
+
+  @include themify() {
+    background: themed("btn_background1");
+  }
+
+  @include themify() {
+    border: themed("btn_background1");
+  }
+}
+
+// .detail-btn1 {
+//   border: 1px solid;
+//   border-radius: 7px;
+// }
+// .textColor{
+//   color: #333;
+// }
+// .textColor1{
+//   color: #333;
+//   color: #fff;
+// }
+.greyBg {
+  @include themify() {
+    background: themed("btn_background2");
+  }
+
+  color: #818181;
+}
+
+.border-b-color {
+  @include themify() {
+    border-bottom: 1px solid themed("border_color");
+  }
+}
+
+.h40 {
+  height: 3rem;
+}
+</style>
diff --git a/src/i18n/CN/index.js b/src/i18n/CN/index.js
index ca93bd8..c3ea517 100644
--- a/src/i18n/CN/index.js
+++ b/src/i18n/CN/index.js
@@ -1526,6 +1526,8 @@
     "加载完毕": "加載完畢",
     "操作": "操作",
     "盈亏": "盈虧",
+    "盈利": "盈利",
+    "盈利率": "盈利率",
     "开仓金额": "開倉金額",
     "可平金额": "可平金額",
     "建仓成本": "建倉成本",
diff --git a/src/i18n/en-US/index.js b/src/i18n/en-US/index.js
index 9a05757..30758c5 100644
--- a/src/i18n/en-US/index.js
+++ b/src/i18n/en-US/index.js
@@ -1553,6 +1553,8 @@
   "加载完毕": "Loading complete",
   "操作": "Operate",
   "盈亏": "P/L",
+  "盈利": "Profit",
+  "盈利率": "Profit rate",
   "开仓金额": "Amount",
   "可平金额": "Closable amount",
   "建仓成本": "Average",
diff --git a/src/page/perpetualContract/index.vue b/src/page/perpetualContract/index.vue
index 0a63170..c1d6871 100644
--- a/src/page/perpetualContract/index.vue
+++ b/src/page/perpetualContract/index.vue
@@ -90,9 +90,9 @@
     </div>
     <!-- <div class="fixed w-full shadow z-10 tabBackground1"> -->
     <div class="flex justify-between px-30 py-10">
-      <span class="font-24 textColor2"
+      <!-- <span class="font-24 textColor2"
         >{{ symbolname }}&nbsp;{{ $t("k线图表") }}</span
-      >
+      > -->
       <!-- <van-icon class="textColor" @click.stop="showCharts = !showCharts"
                     :name="showCharts ? 'arrow-down' : 'arrow-up'"></van-icon> -->
     </div>
diff --git a/src/page/perpetualContract/perpetualHistory.vue b/src/page/perpetualContract/perpetualHistory.vue
index ac02bb4..f5491fb 100644
--- a/src/page/perpetualContract/perpetualHistory.vue
+++ b/src/page/perpetualContract/perpetualHistory.vue
@@ -86,6 +86,12 @@
               </div>
             </van-list>
           </template>
+
+          <div v-if="type === 'position'">
+            <PerpetualPositionList
+              :list-data="orderHold"
+            ></PerpetualPositionList>
+          </div>
         </van-tab>
       </van-tabs>
     </div>
@@ -96,6 +102,7 @@
 import assetsHead from "@/components/assets-head";
 import PerpetualEntrustList from "@/components/perpetual-entrust-list/index.vue";
 import PerpetualHistoryPosition from "@/components/perpetual-history-position/index.vue";
+import PerpetualPositionList from "@/components/perpetual-position-list/index.vue";
 import { _orderListCur, _orderListHold } from "@/API/trade.api";
 import { _getCoins } from "@/API/home.api";
 import { List, Tab, Tabs, DropdownMenu, DropdownItem } from "vant";
@@ -103,6 +110,7 @@
   data() {
     return {
       type: "orders",
+      orderHold: [], // 永续持有仓位
       dataList: {
         orders: [],
         hisorders: [],
@@ -117,6 +125,10 @@
         {
           title: this.$t("历史委托"),
           type: "hisorders",
+        },
+        {
+          title: this.$t("当前持仓"),
+          type: "position",
         },
       ],
       loading: false,
@@ -149,6 +161,12 @@
       this.$router.go(-1);
     },
     async fetchList(symbol) {
+      if (this.type === "position") {
+        _orderListHold().then((data) => {
+          this.orderHold = data;
+        });
+        return;
+      }
       const _api = this.type === "orders" ? _orderListCur : _orderListHold;
       const type = this.type;
       symbol = "";
@@ -181,6 +199,7 @@
   components: {
     PerpetualEntrustList,
     PerpetualHistoryPosition,
+    PerpetualPositionList,
     assetsHead,
     [DropdownMenu.name]: DropdownMenu,
     [DropdownItem.name]: DropdownItem,

--
Gitblit v1.9.3