li.shaoyi 2 år sedan
förälder
incheckning
c8c3f76494

+ 17 - 0
src/constants/account.ts

@@ -59,3 +59,20 @@ export function getCertificateTypeCodeValue(label: string) {
     const enums = getCertificateTypeList()
     return getEnumTypeValue(enums, label)
 }
+
+/**
+ * 获取铁合金收益角色列表
+ * @returns 
+ */
+export function getTHJProfitRoleTypeList() {
+    return getEnumTypeList('THJProfitRoleType')
+}
+
+/**
+ * 获取铁合金收益角色名称
+ * @returns 
+ */
+export function getTHJProfitRoleTypeName(value: number) {
+    const enums = getTHJProfitRoleTypeList()
+    return getEnumTypeName(enums, value)
+}

+ 7 - 11
src/constants/market.ts

@@ -1,6 +1,6 @@
 import { useEnumStore } from '@/stores'
 
-const { getEnumTypeName } = useEnumStore()
+const { getEnumTypeList, getEnumTypeName } = useEnumStore()
 
 /**
  * 交易市场
@@ -17,22 +17,18 @@ export enum Market {
 }
 
 /**
- * 获取交易市场列表
+ * 获取铁合金市场列表
  * @returns 
  */
-export function getMarketList() {
-    return [
-        { label: '采购', value: Market.THJ },
-        { label: '转让', value: Market.THJ_Transfer },
-        { label: '供求', value: Market.THJ_Listing },
-    ]
+export function getTHJMarketList() {
+    return getEnumTypeList('THJMarket')
 }
 
 /**
- * 获取交易市场名称
+ * 获取铁合金市场名称
  * @returns 
  */
-export function getMarketName(value?: number) {
-    const enums = getMarketList()
+export function getTHJMarketName(value: number) {
+    const enums = getTHJMarketList()
     return getEnumTypeName(enums, value)
 }

+ 3 - 3
src/mock/router.ts

@@ -20,10 +20,10 @@ const appmenu = {
                 authType: 1,
                 sort: 1,
                 title: '收益查询',
-                code: 'bill',
-                url: '/bill',
+                code: 'profit',
+                url: '/profit',
                 urlType: 1,
-                component: 'views/bill/index.vue',
+                component: 'views/profit/index.vue',
                 icon: 'TrendCharts',
             },
         ]

+ 7 - 3
src/packages/mobile/router/animateRouter.ts

@@ -9,6 +9,8 @@ interface HistoryState {
 }
 
 export default new (class {
+    private storageKey = 'mobile@' + window.location.hostname;
+
     private _state = ref<HistoryState>({
         history: [],
         excludeViews: [],
@@ -20,7 +22,7 @@ export default new (class {
     state;
 
     constructor() {
-        const state = sessionStorage.getItem('historyState');
+        const state = sessionStorage.getItem(this.storageKey);
         if (state) {
             this._state.value = JSON.parse(state);
         }
@@ -130,7 +132,9 @@ export default new (class {
                 }
             } else {
                 // 忽略重定向的页面
-                if (!route.redirectedFrom) {
+                if (route.redirectedFrom) {
+                    //transitionName.value = 'route-in'; // 前进动画
+                } else {
                     history.value.push(route);
                     if (history.value.length > 1) {
                         transitionName.value = 'route-in'; // 前进动画
@@ -140,6 +144,6 @@ export default new (class {
         }
 
         actionName.value = '';
-        sessionStorage.setItem('historyState', JSON.stringify(this._state.value));
+        sessionStorage.setItem(this.storageKey, JSON.stringify(this._state.value));
     }
 })

+ 3 - 0
src/packages/mobile/router/index.ts

@@ -31,6 +31,9 @@ const routes: Array<RouteRecordRaw> = [
         path: "",
         name: "Home",
         component: () => import("../views/home/index.vue"),
+        meta: {
+          ignoreAuth: true,
+        },
       },
     ],
   },

+ 1 - 1
src/packages/mobile/views/boot/index.vue

@@ -45,7 +45,7 @@ const autoLogin = (loading = false) => {
       router.replace({ name: 'Home' })
     }
   }).catch(() => {
-    router.replace({ name: 'UserLogin' })
+    router.replace({ name: 'Home' })
   }).finally(() => {
     toast?.close()
     localStorage.setItem('thj_app_guide', 'false')

+ 2 - 2
src/packages/mobile/views/mine/generalize/components/tradedata/index.vue

@@ -8,7 +8,7 @@
             </template>
             <!-- 市场 -->
             <template #marketid="{ value }">
-                {{ getMarketName(value) }}
+                {{ getTHJMarketName(value) }}
             </template>
             <!-- 吨数 -->
             <template #tradeqty="{ row }">
@@ -27,7 +27,7 @@
 import { shallowRef, watch } from 'vue'
 import { formatDate } from '@/filters'
 import { useQueryTHJTradeDataList } from '@/business/goods'
-import { getMarketName } from '@/constants/market'
+import { getTHJMarketName } from '@/constants/market'
 import { Empty } from 'vant'
 import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
 import AppList from '@mobile/components/base/list/index.vue'

+ 2 - 2
src/packages/mobile/views/mine/generalize/index.vue

@@ -64,7 +64,7 @@ import AppQrcode from '@mobile/components/base/qrcode/index.vue'
 import TradeData from './components/tradedata/index.vue'
 import Promotion from './components/promotion/index.vue'
 import { getServiceUrl } from '@/services/http'
-import { Market, getMarketList } from '@/constants/market'
+import { Market, getTHJMarketList } from '@/constants/market'
 
 const { getUserId } = useLoginStore()
 const showQRCode = shallowRef(false)
@@ -85,7 +85,7 @@ const dropdownMenus = [
 const dropdownTypes = computed(() => {
     switch (selectedMenu.value) {
         case 0: {
-            return getMarketList().map((e) => ({
+            return getTHJMarketList().map((e) => ({
                 text: e.label,
                 value: e.value,
             }))

+ 2 - 2
src/packages/pc/components/base/pagination/index.less

@@ -1,6 +1,6 @@
 .app-pagination {
-    display        : flex;
-    justify-content: center;
+    display: flex;
+    justify-content: flex-end;
 
     .el-pagination {
         padding: 0;

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

@@ -65,7 +65,7 @@ export default defineComponent({
     // 是否显示头部工具栏
     showToolbar: {
       type: Boolean,
-      default: true
+      default: false
     },
     loading: {
       type: Boolean,

+ 1 - 0
src/packages/pc/components/layouts/header/index.less

@@ -18,6 +18,7 @@
     &__right {
         display: flex;
         align-items: center;
+        margin-left: auto;
 
         .iconbar {
             display: flex;

+ 18 - 18
src/packages/pc/components/layouts/page/index.less

@@ -1,19 +1,19 @@
 .app-page {
     display: flex;
-    height : 100%;
+    height: 100%;
 
     &__sidebar {
-        height                    : 100%;
-        overflow-y                : auto;
+        height: 100%;
+        overflow-y: auto;
         -webkit-overflow-scrolling: touch;
     }
 
     &__wrapper {
-        flex            : 1;
-        display         : flex;
-        flex-direction  : column;
+        flex: 1;
+        display: flex;
+        flex-direction: column;
         background-color: #e7ebed;
-        overflow        : hidden;
+        overflow: hidden;
     }
 
     &__wrapper &__header {
@@ -24,7 +24,7 @@
 
             [class^='g-icon']::before {
                 font-size: 20px;
-                cursor   : pointer;
+                cursor: pointer;
             }
 
             .g-icon--expand::before {
@@ -38,21 +38,21 @@
     }
 
     &__wrapper &__main {
-        flex          : 1;
-        display       : flex;
+        flex: 1;
+        display: flex;
         flex-direction: column;
-        overflow      : hidden;
+        overflow: hidden;
     }
 
     &__wrapper &__main &__navbar {
-        z-index         : 1;
+        z-index: 1;
         background-color: #fff;
-        box-shadow      : 0 2px 16px 0 rgba(0, 0, 0, .1);
+        box-shadow: 0 2px 16px 0 rgba(0, 0, 0, .1);
     }
 
     &__wrapper &__main &__container {
-        flex    : 1;
-        overflow: hidden;
+        flex: 1;
+        overflow-y: auto;
     }
 
     /* teleport 为空时隐藏元素 */
@@ -68,13 +68,13 @@
     .view-enter-from,
     .view-leave-to {
         transform: translateX(20px);
-        opacity  : 0;
+        opacity: 0;
     }
 
     .view-enter-active,
     .view-leave-active {
         pointer-events: none;
-        will-change   : opacity, transform;
-        transition    : opacity 200ms, transform 200ms;
+        will-change: opacity, transform;
+        transition: opacity 200ms, transform 200ms;
     }
 }

+ 10 - 0
src/packages/pc/components/layouts/sidebar/index.less

@@ -33,7 +33,17 @@
         }
 
         .logo {
+            display: flex;
+            align-items: center;
             font-weight: bold;
+
+            &::before {
+                content: '';
+                width: 32px;
+                height: 32px;
+                background-image: url('@pc/assets/logo.svg');
+                margin-right: 10px;
+            }
         }
     }
 

+ 5 - 3
src/packages/pc/router/historyRouter.ts

@@ -16,6 +16,8 @@ interface HistoryState {
 }
 
 export default new (class {
+    private storageKey = 'pc@' + window.location.hostname;
+
     private _state = ref<HistoryState>({
         historyStacks: [],
         historyIndex: 0,
@@ -27,7 +29,7 @@ export default new (class {
     state;
 
     constructor() {
-        const state = sessionStorage.getItem('historyState');
+        const state = sessionStorage.getItem(this.storageKey);
         if (state) {
             const data: HistoryState = JSON.parse(state);
             this._state.value = data;
@@ -130,7 +132,7 @@ export default new (class {
         }
 
         actionName.value = '';
-        sessionStorage.setItem('historyState', JSON.stringify(this._state.value));
+        sessionStorage.setItem(this.storageKey, JSON.stringify(this._state.value));
     }
 
     /**
@@ -145,7 +147,7 @@ export default new (class {
 
             if (index > -1) {
                 historyStacks.value.splice(index, 1);
-                sessionStorage.setItem('historyState', JSON.stringify(this._state.value));
+                sessionStorage.setItem(this.storageKey, JSON.stringify(this._state.value));
             }
         }
     }

+ 0 - 60
src/packages/pc/views/bill/index.vue

@@ -1,60 +0,0 @@
-<template>
-    <app-view class="bill">
-        <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
-            <template #footer>
-                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
-                    @change="getTHJProfits" />
-            </template>
-        </app-table>
-    </app-view>
-</template>
-
-<script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { useDataTable } from '@/hooks/datatable'
-import { queryTHJProfits } from '@/services/api/common'
-import { useLoginStore } from '@/stores'
-import AppTable from '@pc/components/base/table/index.vue'
-import AppPagination from '@pc/components/base/pagination/index.vue'
-
-const { getUserId } = useLoginStore()
-const { dataList, total, pageIndex, pageSize } = useDataTable<Model.THJProfitsRsp>()
-const loading = shallowRef(false)
-
-const tableColumns = shallowRef([
-    { prop: 'marketname', label: '市场' },
-    { prop: 'firend', label: '下单好友' },
-    { prop: 'buyorselldisplay', label: '方向' },
-    { prop: 'wrstandardname', label: '商品' },
-    { prop: 'tradeqty', label: '成交数量' },
-    { prop: 'chargeamount', label: '手续费总额' },
-    { prop: 'profitamount', label: '分润金额' },
-    { prop: 'profitroletypedisplay', label: '分润角色' },
-    { prop: 'brokerrate', label: '会员比例' },
-    { prop: 'brokerprofitrate', label: '会员释出比例' },
-    { prop: 'levelonevalue', label: '一级比例' },
-    { prop: 'leveltwovalue', label: '二级比例' },
-    { prop: 'tradeid', label: '成交单号' },
-    { prop: 'tradetimedisplay', label: '成交时间' },
-])
-
-const getTHJProfits = () => {
-    loading.value = true
-    queryTHJProfits({
-        data: {
-            userid: getUserId(),
-            page: pageIndex.value,
-            pagesize: pageSize.value,
-        },
-        success: (res) => {
-            total.value = res.total
-            dataList.value = res.data
-        },
-        complete: () => {
-            loading.value = false
-        }
-    })
-}
-
-getTHJProfits()
-</script>

+ 7 - 0
src/packages/pc/views/member/index.less

@@ -0,0 +1,7 @@
+.member {
+    height: 100%;
+
+    .el-main {
+        padding: 0;
+    }
+}

+ 150 - 16
src/packages/pc/views/member/index.vue

@@ -1,36 +1,78 @@
 <template>
-    <el-container>
+    <el-container class="member">
         <el-aside>
             <el-scrollbar>
-
+                <app-view>
+                    <template #header>
+                        <el-input v-model="filterText" placeholder="请输入好友" />
+                    </template>
+                    <el-tree ref="treeRef" :data="treeList" :filter-node-method="filterNode"
+                        :expand-on-click-node="false" highlight-current default-expand-all @node-click="onNodeClick" />
+                </app-view>
             </el-scrollbar>
         </el-aside>
         <el-main>
             <el-scrollbar>
-                <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
-                    <template #footer>
-                        <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
-                            @change="getTHJFriends" />
+                <app-view>
+                    <template #header>
+                        <app-filter :options="filterOptons" :loading="loading" />
                     </template>
-                </app-table>
+                    <!-- 表格数据 -->
+                    <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
+                        <!-- 手机号 -->
+                        <template #mobile="{ value }">
+                            {{ getPhoneNumber(value) }}
+                        </template>
+                        <!-- 是否已实名 -->
+                        <template #hasauth="{ value }">
+                            {{ getAuthStatusName(value) }}
+                        </template>
+                        <!-- 开户时间 -->
+                        <template #createtime="{ value }">
+                            {{ formatDate(value) }}
+                        </template>
+                        <template #footer>
+                            <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                                @change="onRefresh" />
+                        </template>
+                    </app-table>
+                </app-view>
             </el-scrollbar>
         </el-main>
     </el-container>
 </template>
 
 <script lang="ts" setup>
-import { shallowRef } from 'vue'
-import { useDataTable } from '@/hooks/datatable'
-import { queryTHJFriends } from '@/services/api/common'
+import { shallowRef, reactive, watch } from 'vue'
+import { ElMessage, ElTree } from 'element-plus'
+import { formatDate } from '@/filters'
+import { useDataTable, useDataFilter } from '@/hooks/datatable'
+import { queryTHJFriends, queryInvestorLevelGroup } from '@/services/api/common'
 import { useLoginStore } from '@/stores'
+import { decryptAES } from '@/utils/websocket/crypto'
 import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'
 
+interface TreeData {
+    label: string;
+    children?: TreeData[];
+}
+
 const { getUserId } = useLoginStore()
 const { dataList, total, pageIndex, pageSize } = useDataTable<Model.THJFriendsRsp>()
+const { filterOptons, getQueryParams } = useDataFilter<Model.THJFriendsReq>()
 const loading = shallowRef(false)
+const treeRef = shallowRef<InstanceType<typeof ElTree>>()
+const filterText = shallowRef('')
+const userId = shallowRef(getUserId()) // 当前用户ID
 
-const tableColumns = shallowRef([
+const treeList = reactive<TreeData[]>([{
+    label: '登录用户',
+    children: []
+}])
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
     { prop: 'customername', label: '好友名称' },
     { prop: 'mobile', label: '手机号' },
     { prop: 'groupname', label: '客户等级' },
@@ -39,17 +81,66 @@ const tableColumns = shallowRef([
     { prop: 'createtime', label: '开户时间' },
 ])
 
-const getTHJFriends = () => {
+filterOptons.selectList = [
+    {
+        label: '等级',
+        key: 'levelgroupid',
+        options: [],
+    },
+]
+
+filterOptons.inputList = [
+    { label: '名称', keys: ['customername'] },
+    { label: '手机号', keys: ['mobile'] },
+]
+
+filterOptons.buttonList = [
+    { lable: '重置', onClick: () => onSearch(true) },
+    { lable: '查询', className: 'el-button--primary', onClick: () => onSearch() }
+]
+
+// 获取实名状态
+const getAuthStatusName = (status: number) => {
+    switch (status) {
+        case 1: {
+            return '已认证'
+        }
+        case 2: {
+            return '已提交'
+        }
+        case 3: {
+            return '已拒绝'
+        }
+        default: {
+            return '未认证'
+        }
+    }
+}
+
+// 获取手机号码
+const getPhoneNumber = (value: string) => {
+    const phoneNumber = decryptAES(value)
+    return phoneNumber
+}
+
+const getTHJFriends = (params: Partial<Model.THJFriendsReq> = {}) => {
     loading.value = true
-    queryTHJFriends({
+    return queryTHJFriends({
         data: {
-            userid: getUserId(),
+            userid: userId.value,
             page: pageIndex.value,
             pagesize: pageSize.value,
+            ...params
         },
         success: (res) => {
             total.value = res.total
             dataList.value = res.data
+
+            if (treeList[0].children?.length === 0) {
+                treeList[0].children = res.data.map((e) => ({
+                    label: e.customername
+                }))
+            }
         },
         complete: () => {
             loading.value = false
@@ -57,5 +148,48 @@ const getTHJFriends = () => {
     })
 }
 
-getTHJFriends()
-</script>
+// 当节点被点击的时候触发
+const onNodeClick = (data: TreeData) => {
+    console.log(data)
+    onSearch()
+}
+
+// 过滤树节点
+const filterNode = (value: string, data: TreeData) => {
+    if (value) {
+        return data.label.includes(value)
+    }
+    return true
+}
+
+const onSearch = (clear = false) => {
+    getQueryParams((qs) => {
+        pageIndex.value = 1
+        getTHJFriends(qs)
+    }, clear)
+}
+
+const onRefresh = () => {
+    getQueryParams((qs) => {
+        getTHJFriends(qs).catch((err) => ElMessage.error(err))
+    })
+}
+
+queryInvestorLevelGroup({
+    success: (res) => {
+        const [levelGroups] = filterOptons.selectList
+        levelGroups.options = res.data.map((e) => ({
+            label: e.groupname,
+            value: e.levelgroupid
+        }))
+    }
+})
+onRefresh()
+watch(filterText, (val) => {
+    treeRef.value?.filter(val)
+})
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 114 - 0
src/packages/pc/views/profit/index.vue

@@ -0,0 +1,114 @@
+<template>
+    <app-view class="bill">
+        <template #header>
+            <app-filter :options="filterOptons" :loading="loading" />
+        </template>
+        <!-- 表格数据 -->
+        <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading">
+            <!-- 成交时间 -->
+            <template #tradetimedisplay="{ value }">
+                {{ formatDate(value) }}
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="onRefresh" />
+            </template>
+        </app-table>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { ElMessage } from 'element-plus'
+import { formatDate } from '@/filters'
+import { getTHJMarketList } from '@/constants/market'
+import { getTHJProfitRoleTypeName } from '@/constants/account'
+import { useDataTable, useDataFilter } from '@/hooks/datatable'
+import { queryTHJProfits } from '@/services/api/common'
+import { useLoginStore } from '@/stores'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppFilter from '@pc/components/base/table-filter/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+
+const { getUserId } = useLoginStore()
+const { dataList, total, pageIndex, pageSize } = useDataTable<Model.THJProfitsRsp>()
+const { filterOptons, getQueryParams } = useDataFilter<Model.THJProfitsReq>()
+const loading = shallowRef(false)
+
+const tableColumns = shallowRef<Model.TableColumn[]>([
+    { prop: 'marketname', label: '市场' },
+    { prop: 'firend', label: '下单好友' },
+    { prop: 'buyorselldisplay', label: '方向' },
+    { prop: 'wrstandardname', label: '商品', width: 140 },
+    { prop: 'tradeqty', label: '成交数量' },
+    { prop: 'chargeamount', label: '手续费总额' },
+    { prop: 'profitamount', label: '分润金额' },
+    { prop: 'profitroletypedisplay', label: '分润角色' },
+    { prop: 'brokerrate', label: '会员比例' },
+    { prop: 'brokerprofitrate', label: '会员释出比例' },
+    { prop: 'levelonevalue', label: '一级比例' },
+    { prop: 'leveltwovalue', label: '二级比例' },
+    { prop: 'tradeid', label: '成交单号', width: 200 },
+    { prop: 'tradetimedisplay', label: '成交时间', width: 180 },
+])
+
+filterOptons.selectList = [
+    {
+        label: '市场',
+        key: 'marketid',
+        options: getTHJMarketList(),
+    },
+    {
+        label: '角色',
+        key: 'userid',
+        options: [
+            { label: getTHJProfitRoleTypeName(3), value: 3 },
+            { label: getTHJProfitRoleTypeName(4), value: 4 }
+        ],
+    },
+]
+
+filterOptons.inputList = [
+    { label: '好友', keys: ['accountname'] },
+    { label: '商品', keys: ['goods'] },
+]
+
+filterOptons.buttonList = [
+    { lable: '重置', onClick: () => onSearch(true) },
+    { lable: '查询', className: 'el-button--primary', onClick: () => onSearch() }
+]
+
+const getTHJProfits = (params: Partial<Model.THJProfitsReq> = {}) => {
+    loading.value = true
+    return queryTHJProfits({
+        data: {
+            userid: getUserId(),
+            page: pageIndex.value,
+            pagesize: pageSize.value,
+            ...params,
+        },
+        success: (res) => {
+            total.value = res.total
+            dataList.value = res.data
+        },
+        complete: () => {
+            loading.value = false
+        }
+    })
+}
+
+const onSearch = (clear = false) => {
+    getQueryParams((qs) => {
+        pageIndex.value = 1
+        getTHJProfits(qs)
+    }, clear)
+}
+
+const onRefresh = () => {
+    getQueryParams((qs) => {
+        getTHJProfits(qs).catch((err) => ElMessage.error(err))
+    })
+}
+
+onRefresh()
+</script>

+ 7 - 0
src/services/api/common/index.ts

@@ -94,6 +94,13 @@ export function queryUserLevelInfo(params: HttpParams<{ req: Model.UserLevelInfo
 }
 
 /**
+ * 查询查询我推荐的好友等级
+ */
+export function queryInvestorLevelGroup(params: HttpParams<{ rsp: Model.InvestorLevelGroupRsp[] }>) {
+    return httpRequest('/Ferroalloy/QueryInvestorLevelGroup', 'get', params);
+}
+
+/**
  * 查询好友
  */
 export function queryTHJFriends(params: HttpParams<{ req: Model.THJFriendsReq, rsp: Model.THJFriendsRsp[] }>) {

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

@@ -16,7 +16,7 @@ interface StoreState {
     loading: boolean;
     allEnums: ShallowRef<Model.EnumRsp[]>;
 }
-const enumKeys = ['clientType', 'scoreConfigType', 'accountBusinessCode', 'certificatetype', 'signstatus', 'thjOrderStatus', 'THJDeliveryMode', 'goodsunit', 'WROutInApplyStatus2', 'THJTransferStatus', 'WRTradeOrderStatus'] as const
+const enumKeys = ['clientType', 'scoreConfigType', 'accountBusinessCode', 'certificatetype', 'signstatus', 'thjOrderStatus', 'THJDeliveryMode', 'goodsunit', 'WROutInApplyStatus2', 'THJTransferStatus', 'WRTradeOrderStatus', 'THJMarket', 'THJProfitRoleType'] as const
 
 /**
  * 枚举存储类
@@ -89,7 +89,7 @@ const store = new (class extends VueStore<StoreState>{
         /** 根据枚举值获取枚举名称 */
         getEnumTypeName: (enums: EnumType[], value?: number) => {
             const item = enums.find((e) => e.value === value)
-            return item?.label ?? value
+            return item?.label ?? value?.toString() ?? '无效枚举'
         },
         /** 根据枚举名称获取对应的值 */
         getEnumTypeValue: (enums: EnumType[], label?: string) => {

+ 8 - 0
src/types/model/common.d.ts

@@ -159,6 +159,14 @@ declare global {
             progress: number; // 进度
         }
 
+        /** 查询查询我推荐的好友等级 响应 */
+        interface InvestorLevelGroupRsp {
+            grouplevel: number;
+            groupname: string;
+            keepbuyqty: number;
+            levelgroupid: number;
+        }
+
         /** 查询好友 请求 */
         interface THJFriendsReq {
             userid: number; // 用户ID