li.shaoyi 1 tahun lalu
induk
melakukan
3cd2a324d6

+ 2 - 2
app/package.json

@@ -1,6 +1,6 @@
 {
-  "name": "trading",
-  "version": "1.0.7",
+  "name": "trading-beta",
+  "version": "1.0.18",
   "main": "main.js",
   "dependencies": {
     "electron-updater": "^6.1.4",

+ 3 - 3
oem/sbyj/config/appconfig.json

@@ -1,9 +1,9 @@
 {
   "appId": "com.muchinfo.sbyj",
   "appName": "水贝亿爵",
-  "version": "1.0.6",
-  "versionCode": "100006",
-  "apiUrl": "http://112.74.182.230:8280/cfg?key=yjhj_sp",
+  "version": "1.0.7",
+  "versionCode": "100007",
+  "apiUrl": "http://192.168.31.171:8080/cfg?key=test_171",
   "tradeChannel": "ws",
   "modules": [
     "register",

+ 2 - 2
oem/zrwyt/config/appconfig.json

@@ -1,8 +1,8 @@
 {
   "appId": "com.muchinfo.zrwyt",
   "appName": "中融文遗通",
-  "version": "1.0.16",
-  "versionCode": "100016",
+  "version": "1.0.18",
+  "versionCode": "100018",
   "apiUrl": "http://192.168.31.134:8080/cfg?key=test_134",
   "tradeChannel": "ws",
   "modules": [

+ 1 - 79
oem/zrwyt/config/router.json

@@ -250,85 +250,7 @@
                 "code": "market_trade",
                 "url": "trade",
                 "urlType": 1,
-                "component": "Main",
-                "children": [
-                    {
-                        "authType": 1,
-                        "sort": 1,
-                        "title": "订单交易",
-                        "code": "market_trade_goods",
-                        "url": "goods",
-                        "urlType": 1,
-                        "component": "views/market/trade/goods/index.vue",
-                        "children": [
-                            {
-                                "authType": 2,
-                                "sort": 1,
-                                "title": "订单挂牌",
-                                "code": "market_trade_goods_50101",
-                                "hidden": true,
-                                "component": "views/market/trade/goods/list/index.vue"
-                            },
-                            {
-                                "authType": 2,
-                                "sort": 2,
-                                "title": "中远期挂牌",
-                                "code": "market_trade_goods_50102",
-                                "hidden": true,
-                                "component": "views/market/trade/goods/list/index.vue"
-                            },
-                            {
-                                "authType": 2,
-                                "sort": 3,
-                                "title": "周结挂牌",
-                                "code": "market_trade_goods_50103",
-                                "hidden": true,
-                                "component": "views/market/trade/goods/list/index.vue"
-                            },
-                            {
-                                "authType": 2,
-                                "sort": 4,
-                                "title": "月结挂牌",
-                                "code": "market_trade_goods_50104",
-                                "hidden": true,
-                                "component": "views/market/trade/goods/list/index.vue"
-                            },
-                            {
-                                "authType": 2,
-                                "sort": 1,
-                                "title": "全款挂牌",
-                                "code": "market_trade_goods_16201",
-                                "component": "views/market/trade/goods/list/index.vue"
-                            }
-                        ]
-                    },
-                    {
-                        "authType": 1,
-                        "sort": 2,
-                        "title": "预售转让",
-                        "code": "market_trade_presell",
-                        "url": "presell",
-                        "hidden": true,
-                        "urlType": 1,
-                        "component": "views/market/trade/presell/index.vue",
-                        "children": [
-                            {
-                                "authType": 2,
-                                "sort": 1,
-                                "title": "预售中签",
-                                "code": "market_trade_presell_ballot",
-                                "component": "views/market/trade/presell/ballot/index.vue"
-                            },
-                            {
-                                "authType": 2,
-                                "sort": 2,
-                                "title": "定金转让",
-                                "code": "market_trade_presell_49201",
-                                "component": "views/market/trade/presell/transfer/index.vue"
-                            }
-                        ]
-                    }
-                ]
+                "component": "views/market/trade/index.vue"
             }
         ]
     },

+ 1 - 0
src/packages/pc/components/base/table-v2/index.less

@@ -4,6 +4,7 @@
     display: flex;
     flex-direction: column;
     height: 100%;
+    color: #fff;
 
     &__header {
         display: flex;

+ 44 - 29
src/packages/pc/components/base/table-v2/index.vue

@@ -1,15 +1,19 @@
 <template>
   <div class="app-table-v2">
-    <el-auto-resizer v-if="dataList.length">
+    <el-auto-resizer>
       <template #default="{ height, width }">
-        <el-table-v2 :data="dataList" :columns="columns"  :width="width" :height="height" :header-height="32" :row-height="32" />
+        <el-table-v2 :data="tableList" :columns="createColumns(width)" :width="width" :height="height" :header-height="32"
+          :row-height="32" />
       </template>
     </el-auto-resizer>
   </div>
 </template>
 
-<script lang="ts" setup>
+<script lang="tsx" setup>
 import { shallowRef } from 'vue'
+import { Column } from 'element-plus'
+import { formatDate } from '@/filters'
+import { queryHisAmountLog } from '@/services/api/bank'
 
 defineProps({
   dataList: {
@@ -18,32 +22,43 @@ defineProps({
   }
 })
 
-const columns = shallowRef([
-  {
-    key: 'goodsname',
-    dataKey: 'goodsname',
-    title: '订单合约',
-    width: 150
-  },
-  {
-    key: 'buyorsell',
-    dataKey: 'buyorsell',
-    title: '类型',
-    width: 150
-  },
-  {
-    key: 'orderprice',
-    dataKey: 'orderprice',
-    title: '委托价',
-    width: 150
-  },
-  {
-    key: 'orderqty',
-    dataKey: 'orderqty',
-    title: '委托数量',
-    width: 150
-  }
-])
+const tableList = shallowRef<Model.HisAmountLogRsp[]>([])
+
+queryHisAmountLog().then((res) => {
+  tableList.value = res.data
+})
+
+const createColumns = (width: number) => {
+  const columnWidth = width / 4
+  const columns: Column[] = [
+    {
+      key: 'accountid',
+      dataKey: 'accountid',
+      title: '资金账号',
+      width: columnWidth,
+    },
+    {
+      key: 'operatetypename',
+      dataKey: 'operatetypename',
+      title: '资金类型',
+      width: columnWidth
+    },
+    {
+      key: 'amount',
+      dataKey: 'amount',
+      title: '金额',
+      width: columnWidth
+    },
+    {
+      key: 'createtime',
+      dataKey: 'createtime',
+      title: '时间',
+      width: columnWidth,
+      cellRenderer: ({ cellData }) => <span>{formatDate(cellData)}</span>
+    }
+  ]
+  return columns
+}
 </script>
 
 <style lang="less">

+ 10 - 0
src/packages/pc/components/base/table/index.vue

@@ -127,6 +127,16 @@ export default defineComponent({
       return handleNoneValue(value)
     }
 
+    // 监听滚动条
+    // onMounted(() => {
+    //   const scrollbar = tableRef.value?.scrollBarRef
+    //   const wrap = scrollbar?.wrapRef
+    //   wrap?.addEventListener('scroll', (e: Event) => {
+    //     const el = e.target as HTMLElement
+    //     console.log(el.scrollTop)
+    //   })
+    // })
+
     // 暴露组件属性
     expose({
       elTable: tableRef

+ 12 - 4
src/packages/pc/views/query/capital/history/index.vue

@@ -1,11 +1,11 @@
 <!-- 资金流水-历史记录 -->
 <template>
-    <app-table class="query-capital" :data="dataList" v-model:columns="tableColumns" :loading="loading">
+    <app-table class="query-capital" :data="tableList" v-model:columns="tableColumns" :loading="loading">
         <template #headerLeft>
             <app-filter :options="filterOptons">
                 <template #before>
-                    <el-date-picker type="daterange" effect="dark" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYY-MM-DD"
-                        v-model="filterDate" />
+                    <el-date-picker type="daterange" effect="dark" start-placeholder="开始日期" end-placeholder="结束日期"
+                        value-format="YYYY-MM-DD" v-model="filterDate" />
                 </template>
             </app-filter>
         </template>
@@ -25,12 +25,16 @@
         <template #createtime="{ value }">
             {{ formatDate(value) }}
         </template>
+        <template #append>
+            <el-button size="small" plain @click="loadMore" v-if="showLoadMore">加载更多</el-button>
+        </template>
     </app-table>
 </template>
 
 <script lang="ts" setup>
 import { shallowRef, computed } from 'vue'
 import { formatDate } from '@/filters'
+import { useLocalPagination } from '@/hooks/pagination'
 import { useDataFilter } from '@/hooks/datatable'
 import { useRequest } from '@/hooks/request'
 import { queryHisAmountLog } from '@/services/api/bank'
@@ -38,10 +42,14 @@ import AppTable from '@pc/components/base/table/index.vue'
 import AppFilter from '@pc/components/base/table-filter/index.vue'
 import { getOperateTypeSearchList } from '@/constants/order'
 
+const { tableList, showLoadMore, initTableData, loadMore } = useLocalPagination<Model.HisAmountLogRsp>(80)
 const { filterOptons, getQueryParams } = useDataFilter<Model.HisAmountLogReq>()
 const filterDate = shallowRef<string[]>([])
 
-const { loading, dataList, run } = useRequest(queryHisAmountLog, { manual: true })
+const { loading, dataList, run } = useRequest(queryHisAmountLog, {
+    manual: true,
+    onSuccess: (res) => initTableData(res.data)
+})
 
 const tableColumns = shallowRef<Model.TableColumn[]>([
     { prop: 'accountid', label: '资金账号' },

+ 40 - 9
src/packages/pc/views/query/trade/goods/history/index.vue

@@ -4,8 +4,8 @@
         <template #headerLeft>
             <app-filter :options="filterOptons">
                 <template #before>
-                    <el-date-picker type="daterange" effect="dark" start-placeholder="开始日期" end-placeholder="结束日期" value-format="YYYYMMDD"
-                        v-model="filterDate" />
+                    <el-date-picker type="daterange" effect="dark" start-placeholder="开始日期" end-placeholder="结束日期"
+                        value-format="YYYYMMDD" v-model="filterDate" />
                 </template>
             </app-filter>
         </template>
@@ -25,11 +25,14 @@
         <template #tradetime="{ value }">
             {{ formatDate(value) }}
         </template>
+        <template #append>
+            <el-button size="small" plain @click="loadMore" v-if="pageIndex < pageCount">加载更多</el-button>
+        </template>
     </app-table>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
+import { ref } from 'vue'
 import { formatDate, tmMatchAccountID } from '@/filters'
 import { useDataFilter } from '@/hooks/datatable'
 import { useRequest } from '@/hooks/request'
@@ -39,16 +42,25 @@ import AppTable from '@pc/components/base/table/index.vue'
 import AppFilter from '@pc/components/base/table-filter/index.vue'
 
 const { filterOptons, getQueryParams } = useDataFilter<Model.HisTradeDetailReq>()
-const filterDate = shallowRef<string[]>([])
+const filterDate = ref<string[]>([])
+const dataList = ref<Model.HisTradeDetailRsp[]>([])
 
-const { loading, dataList, run } = useRequest(queryHisTradeDetail, {
+const { loading, run, pageIndex, pageCount } = useRequest(queryHisTradeDetail, {
     params: {
+        pagesize: 30,
+        pageflag: 1,
         tradeMode: '50,16'
     },
-    manual: true
+    manual: true,
+    onSuccess: (res) => {
+        if (pageIndex.value === 1) {
+            dataList.value = []
+        }
+        dataList.value.push(...res.data)
+    }
 })
 
-const tableColumns = shallowRef<Model.TableColumn[]>([
+const tableColumns = ref<Model.TableColumn[]>([
     { prop: 'goodsname', label: '订单合约' },
     { prop: 'buyorsell', label: '类型' },
     { prop: 'buildtype', label: '成交类型' },
@@ -74,10 +86,29 @@ filterOptons.selectList = [
 ]
 
 filterOptons.buttonList = [
-    { lable: '查询', className: 'el-button--info', onClick: () => onSearch() },
-    { lable: '重置', className: 'el-button--info', onClick: () => onSearch(true) }
+    {
+        lable: '查询',
+        className: 'el-button--info',
+        onClick: () => {
+            pageIndex.value = 1
+            onSearch()
+        }
+    },
+    {
+        lable: '重置',
+        className: 'el-button--info',
+        onClick: () => {
+            pageIndex.value = 1
+            onSearch(true)
+        }
+    }
 ]
 
+const loadMore = () => {
+    pageIndex.value++
+    onSearch()
+}
+
 const onSearch = (clear = false) => {
     if (clear) {
         filterDate.value = []

+ 64 - 1
src/stores/modules/position.ts

@@ -1,7 +1,7 @@
 import { reactive, computed, toRefs } from 'vue'
 import { handlePriceColor, round } from '@/filters'
 import { BuyOrSell } from '@/constants/order'
-import { queryTradePosition } from '@/services/api/order'
+import { queryTradePosition, querySBYJMyOrders } from '@/services/api/order'
 import { useFuturesStore } from './futures'
 import { defineStore } from '../store'
 import eventBus from '@/services/bus'
@@ -77,4 +77,67 @@ export const usePositionStore = defineStore(() => {
         positionComputedList,
         posChangedNtf,
     }
+})
+
+export const useSBYJOrderStore = defineStore(() => {
+    const futuresStore = useFuturesStore()
+    const state = reactive({
+        loading: false,
+        error: false,
+        orderList: <Model.SBYJMyOrderRsp[]>[], // 订单列表
+    })
+
+    const orderComputedList = computed(() => {
+        state.orderList.forEach((e) => {
+            e.tHDetailEx.depositRate = calcDepositRate(e)
+            e.tHDetailEx.floatPL = calcFloatpl(e)
+        })
+        return state.orderList
+    })
+
+    // 计算浮动盈亏
+    const calcFloatpl = ({ tHDetailEx }: Model.SBYJMyOrderRsp) => {
+        const quote = futuresStore.getGoodsQuote(tHDetailEx.goodsID)
+        const { ask = 0, bid = 0, agreeunit = 0 } = quote.value ?? {}
+        const price = tHDetailEx.buyOrSell === BuyOrSell.Buy ? bid : ask // 根据方向取买卖价
+        // 计算浮动盈亏 (价格 * 手数 * 合约乘数 - 持仓金额) * 方向标识
+        const float = price ? price * tHDetailEx.holderQty * agreeunit - tHDetailEx.holderAmount : 0
+        return float * (tHDetailEx.buyOrSell === BuyOrSell.Buy ? 1 : -1)
+    }
+
+    // 计算定金率
+    const calcDepositRate = ({ tHDetailEx }: Model.SBYJMyOrderRsp) => {
+        const quote = futuresStore.getGoodsQuote(tHDetailEx.goodsID)
+        const { ask = 0, bid = 0, agreeunit = 0 } = quote.value ?? {}
+        const price = tHDetailEx.buyOrSell === BuyOrSell.Buy ? bid : ask // 根据方向取买卖价
+
+        // 计算浮动盈亏 (价格 * 手数 * 合约乘数 - 持仓金额) * 方向标识
+        const float = price ? price * tHDetailEx.holderQty * agreeunit - tHDetailEx.holderAmount : 0
+        const floatpl = float * (tHDetailEx.buyOrSell === BuyOrSell.Buy ? 1 : -1)
+        // 计算定金率 (已付定金 + 补充定金 +盈亏 - 已计滞纳金) / 已付定金
+        const depositRate = (tHDetailEx.payedDeposit + tHDetailEx.restockDeposit + floatpl - tHDetailEx.callAteFee) / tHDetailEx.payedDeposit
+        return depositRate
+    }
+
+    // 获取订单列表
+    const getSBYJMyOrders = async () => {
+        if (!state.loading) {
+            try {
+                state.error = false
+                state.loading = true
+                const res = await querySBYJMyOrders()
+                state.orderList = res.data
+            } catch {
+                state.error = true
+            } finally {
+                state.loading = false
+            }
+        }
+    }
+
+    return {
+        ...toRefs(state),
+        orderComputedList,
+        getSBYJMyOrders,
+    }
 })