PositionIndex.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <template>
  2. <!-- 持仓情况 -->
  3. <div class="positionPage flex-col">
  4. <div class="listBox">
  5. <s-header :name="$t('position.machineSalesRanking')" :noback="true" :isFixed="false"></s-header>
  6. <van-list v-model:loading="loading" v-model:error="error" :error-text="$t('public.requestFailed')"
  7. :finished="finished" :finished-text="$t('public.noMore')" offset="100" :immediate-check="false"
  8. @load="onLoad">
  9. <!-- 持仓情况 -->
  10. <div class="positionBox1 flex-col">
  11. <div class="searchRow flex-row justify-between">
  12. <div class="flex-col">
  13. <div class="flex-row justify-between bd3">
  14. <div class="flex-col outer4"></div>
  15. <span class="flex-col txt2">
  16. 持仓情况</span>
  17. </div>
  18. </div>
  19. </div>
  20. <img class="pic1" src="../../assets/device/line.png" />
  21. <!-- 股价/盈亏 -->
  22. <div class="o-plr-15 o-ptb-20">
  23. <div class="bd1 flex-col">
  24. <div class="box2 l-f l-flex-c l-flex-j-a">
  25. <!-- <div class="TextGroup flex-col">
  26. <div class="main6 flex-col justify-between align-center">
  27. <span class="word5">{{ twoNumber(currentPrice) }}</span>
  28. <span class="word6">当前股价¥</span>
  29. </div>
  30. </div> -->
  31. <div class="TextGroup flex-col">
  32. <div class="main6 flex-col justify-between align-center">
  33. <span class="word5">{{ stockNum }}</span>
  34. <span class="word6">持仓份额</span>
  35. </div>
  36. </div>
  37. <div class="TextGroup flex-col">
  38. <div class="main6 flex-col justify-between align-center">
  39. <span class="word5">{{ twoNumber(dailyDiff) }}</span>
  40. <span class="word6">当日盈亏¥</span>
  41. </div>
  42. </div>
  43. <div class="TextGroup flex-col">
  44. <div class="main6 flex-col justify-between align-center">
  45. <span class="word5">{{ twoNumber(totalDiff) }}</span>
  46. <span class="word6">总盈亏¥</span>
  47. </div>
  48. </div>
  49. </div>
  50. </div>
  51. </div>
  52. </div>
  53. <div class="positionBox1 flex-col">
  54. <div class="searchRow flex-row justify-between">
  55. <div class="flex-col">
  56. <div class="flex-row justify-between bd3">
  57. <div class="flex-col outer2"></div>
  58. <span class="flex-col txt2">
  59. 挂单历史</span>
  60. </div>
  61. </div>
  62. <!-- 菜单,搜索 -->
  63. <div class="flex-col">
  64. <div class="main5 flex-row justify-between">
  65. <!-- <van-popover v-model:show="showPopover" placement="left-start" theme="dark"
  66. :actions="actions" @select="selectLabel">
  67. <template #reference>
  68. <van-icon name="bars" class="fixed-icon o-pr-15" style="font-size: 0.55rem;"
  69. color="#4d6add" />
  70. </template>
  71. </van-popover> -->
  72. <img class="label2" src="../../assets/position/searchIcon.png" @click="searchClick" />
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. <!-- 挂单历史列表 -->
  78. <div class="positionBox2 flex-col justify-between">
  79. <div class="section1 flex-col">
  80. <div class="outer1 flex-col o-plr-15">
  81. <div v-if="hisLength === 0">
  82. <van-empty image="search" description="暂无挂单历史" />
  83. </div>
  84. <div v-else>
  85. <!-- <van-list v-model:loading="loading" :finished="finished" finished-text="没有更多了"
  86. @load="onLoad"> -->
  87. <div v-for="item in orderHisList" :key="item.id">
  88. <van-card>
  89. <template #title>
  90. <span class="word13">挂单数量:{{ item.entrustNumber }} 股
  91. &nbsp;&nbsp;&nbsp;&nbsp;</span>
  92. </template>
  93. <template #desc>
  94. <span class="word11">&nbsp;&nbsp;&nbsp;&nbsp;创建时间:{{ item.createTime
  95. }}</span>
  96. </template>
  97. <template #tags>
  98. <div v-if="item.type === '1'">交易类型:<van-tag type="warning">买入</van-tag>
  99. </div>
  100. <div v-else>交易类型:<van-tag type="success">卖出</van-tag></div>
  101. <!-- <van-tag type="danger">挂单失败</van-tag> -->
  102. </template>
  103. <template #price-top>
  104. <!-- status 状态:0过期,1生效,2撤单,3全部成交,4部分成交 -->
  105. <!-- <div>
  106. 交易状态:<van-tag plain round type="danger">{{ showStatusText(item.status) }}</van-tag>
  107. </div> -->
  108. <div v-if="item.status === '0'">挂单状态:<van-tag plain round
  109. type="danger">过期</van-tag></div>
  110. <div v-else-if="item.status === '1'">挂单状态:<van-tag plain round
  111. type="success">匹配中</van-tag></div>
  112. <div v-else-if="item.status === '2'">挂单状态:<van-tag plain round>撤单</van-tag>
  113. </div>
  114. <div v-else-if="item.status === '3'">挂单状态:<van-tag plain round
  115. type="primary">匹配成功</van-tag></div>
  116. <div v-else-if="item.status === '4'">挂单状态:<van-tag plain round
  117. color="#6b6bff">部分匹配成功</van-tag></div>
  118. <div v-else>挂单状态:<van-tag plain round>未知状态</van-tag></div>
  119. </template>
  120. <template #price>
  121. <span class="txt9">每股单价
  122. :¥{{ item.price }}
  123. </span>
  124. </template>
  125. </van-card>
  126. <br>
  127. </div>
  128. <!-- </van-list> -->
  129. </div>
  130. <!-- <van-back-top @click="backTop" right="5vw" bottom="10vh" /> -->
  131. </div>
  132. </div>
  133. </div>
  134. </van-list>
  135. </div>
  136. <!-- 搜索弹出框 -->
  137. <SearchPop ref="searchRef" @search="search($event)"></SearchPop>
  138. <div style="height: 50px;"></div>
  139. <!-- <nav-bar></nav-bar> -->
  140. </div>
  141. </template>
  142. <script setup>
  143. // 导入无数据组件
  144. import sHeader from "@/components/SimpleHeader"
  145. import { onMounted, reactive, ref } from "vue"
  146. import { listMyOrderHis, getMyStock } from "@/service/position";
  147. import SearchPop from "./SearchPop";
  148. import { showFailToast } from "vant";
  149. const orderHisList = ref([]);
  150. const error = ref(false);
  151. const loading = ref(false)
  152. const finished = ref(false)
  153. const hisLength = ref(0)
  154. const stockNum = ref(0)
  155. function twoNumber(val) {
  156. const num = parseFloat(val)
  157. if (!isNaN(num)) {
  158. return num.toFixed(2)
  159. } else {
  160. return val
  161. }
  162. }
  163. // 滚动加载
  164. const onLoad = async () => {
  165. // console.log("finished >>>", finished.value);
  166. if (!finished.value) {
  167. loading.value = true
  168. searchParams.current = searchParams.current + 1;
  169. getList();
  170. getMyStockFunc();
  171. }
  172. };
  173. let searchParams = reactive({
  174. current: 1, // 当前页,默认1
  175. size: 10, // 页大小,默认10条
  176. })
  177. // 查询列表
  178. const init = () => {
  179. getMyStockFunc();
  180. orderHisList.value = [];
  181. searchParams.current = 1;
  182. getList();
  183. };
  184. const getList = async () => {
  185. finished.value = false;
  186. const params = Object.assign({}, searchParams);
  187. const { data } = await listMyOrderHis(params);
  188. console.log("data.data >>>", data.data);
  189. if (data.code === "00000") {
  190. if (searchParams.current === 0) {
  191. orderHisList.value = [];
  192. }
  193. // 列表叠加
  194. orderHisList.value = orderHisList.value.concat(
  195. data.data.records
  196. );
  197. // hisLength.value = orderHisList.value.length
  198. hisLength.value = data.data.total
  199. if (orderHisList.value.length >= data.data.total) {
  200. finished.value = true;
  201. }
  202. // 加载状态结束
  203. loading.value = false;
  204. } else {
  205. showFailToast(data.message);
  206. }
  207. }
  208. onMounted(() => {
  209. init();
  210. });
  211. const buyPrice = ref()
  212. const currentPrice = ref()
  213. const dailyDiff = ref()
  214. const totalDiff = ref()
  215. const getMyStockFunc = async () => {
  216. const { data } = await getMyStock();
  217. if (data.code === '00000') {
  218. buyPrice.value = data.data.buyPrice
  219. currentPrice.value = data.data.currentPrice
  220. dailyDiff.value = data.data.dailyDiff
  221. totalDiff.value = data.data.totalDiff
  222. stockNum.value = data.data.stockNum
  223. }
  224. }
  225. const searchRef = ref(null);
  226. // 搜索点击
  227. const searchClick = () => {
  228. searchRef.value.showSearch();
  229. };
  230. // 搜索条件触发查询
  231. const search = (e) => {
  232. orderHisList.value = [];
  233. loading.value = true;
  234. searchParams.current = 1;
  235. searchParams = Object.assign(searchParams, e);
  236. getList();
  237. };
  238. </script>
  239. <style lang="less" scoped>
  240. @import "../../common/style/common";
  241. @import "../../styles/position/index";
  242. </style>