111
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { CircleDollarSign, Coins, DollarSign, Palette, Receipt, Settings, ShieldCheck, TrendingUp, Users } from 'lucide-vue-next'
|
||||
import { CircleDollarSign, Coins, DollarSign, Palette, Receipt, Settings, ShieldCheck, TrendingUp, Users, Wallet } from 'lucide-vue-next'
|
||||
|
||||
import type { NavGroup } from '@/components/app-sidebar/types'
|
||||
import { useAuthStore } from '@/stores/auth'
|
||||
@@ -19,6 +19,7 @@ export function useSidebar() {
|
||||
{ title: '数据看板', url: '/monisuo/dashboard', icon: DollarSign, roles: [1] },
|
||||
{ title: '用户管理', url: '/monisuo/users', icon: Users, roles: [1] },
|
||||
{ title: '币种管理', url: '/monisuo/coins', icon: Coins, roles: [1] },
|
||||
{ title: '钱包管理', url: '/monisuo/wallets', icon: Wallet, roles: [1] },
|
||||
{ title: '订单审批', url: '/monisuo/orders', icon: Receipt, roles: [1, 2] },
|
||||
{ title: '财务审批', url: '/monisuo/finance-orders', icon: CircleDollarSign, roles: [1, 3] },
|
||||
{ title: '业务分析', url: '/monisuo/analytics', icon: TrendingUp, roles: [1] },
|
||||
|
||||
@@ -40,6 +40,11 @@ function formatVal(val: number | string | undefined | null): string {
|
||||
return n.toFixed(2)
|
||||
}
|
||||
|
||||
function tradeTotalValue(userStats: any): number {
|
||||
if (!userStats?.tradeAccounts) return 0
|
||||
return userStats.tradeAccounts.reduce((sum: number, t: any) => sum + (Number(t.value) || 0), 0)
|
||||
}
|
||||
|
||||
function daysAgo(time: string | undefined | null): number {
|
||||
if (!time) return 0
|
||||
const d = new Date(time.replace('T', ' '))
|
||||
@@ -132,7 +137,6 @@ function copyToClipboard(text: string) {
|
||||
<UiTableHead class="text-right">
|
||||
应出款
|
||||
</UiTableHead>
|
||||
<UiTableHead>审批人</UiTableHead>
|
||||
<UiTableHead class="hidden xl:table-cell">
|
||||
时间
|
||||
</UiTableHead>
|
||||
@@ -143,12 +147,12 @@ function copyToClipboard(text: string) {
|
||||
</UiTableHeader>
|
||||
<UiTableBody>
|
||||
<UiTableRow v-if="pendingLoading">
|
||||
<UiTableCell :col-span="8" class="text-center py-8">
|
||||
<UiTableCell :col-span="7" class="text-center py-8">
|
||||
<UiSpinner class="mx-auto" />
|
||||
</UiTableCell>
|
||||
</UiTableRow>
|
||||
<UiTableRow v-else-if="pendingOrders.length === 0">
|
||||
<UiTableCell :col-span="8" class="text-center py-8 text-muted-foreground">
|
||||
<UiTableCell :col-span="7" class="text-center py-8 text-muted-foreground">
|
||||
<Icon icon="lucide:inbox" class="size-8 mx-auto mb-2 opacity-50" />
|
||||
<p>暂无待审核订单</p>
|
||||
</UiTableCell>
|
||||
@@ -167,9 +171,6 @@ function copyToClipboard(text: string) {
|
||||
<UiTableCell class="text-right font-mono font-bold text-green-600">
|
||||
{{ formatAmount(order.receivableAmount || 0) }}
|
||||
</UiTableCell>
|
||||
<UiTableCell class="text-sm">
|
||||
{{ order.approveAdminName || '-' }}
|
||||
</UiTableCell>
|
||||
<UiTableCell class="hidden xl:table-cell text-muted-foreground text-sm">
|
||||
{{ order.createTime }}
|
||||
</UiTableCell>
|
||||
@@ -227,9 +228,6 @@ function copyToClipboard(text: string) {
|
||||
<div class="text-sm text-muted-foreground mt-1">
|
||||
手续费: -{{ formatAmount(order.fee || 0) }} | 实际到账: {{ formatAmount(order.receivableAmount || 0) }}
|
||||
</div>
|
||||
<div class="text-sm text-muted-foreground mt-1">
|
||||
审批人: {{ order.approveAdminName || '-' }}
|
||||
</div>
|
||||
<div v-if="order.walletAddress" class="mt-2 text-sm">
|
||||
<span class="text-muted-foreground">提现地址:</span>
|
||||
<div class="font-mono text-xs break-all mt-1 flex items-center gap-1">
|
||||
@@ -342,7 +340,7 @@ function copyToClipboard(text: string) {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-3 gap-2 text-center pt-2 border-t">
|
||||
<div class="grid grid-cols-4 gap-2 text-center pt-2 border-t">
|
||||
<div>
|
||||
<div class="text-xs text-muted-foreground">
|
||||
冻结金额
|
||||
@@ -351,6 +349,14 @@ function copyToClipboard(text: string) {
|
||||
{{ formatVal(userStats.fundAccount?.frozen) }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-xs text-muted-foreground">
|
||||
交易账户
|
||||
</div>
|
||||
<div class="font-mono font-bold text-blue-600 dark:text-blue-400">
|
||||
{{ formatVal(tradeTotalValue(userStats)) }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-xs text-muted-foreground">
|
||||
推广人数
|
||||
@@ -527,7 +533,7 @@ function copyToClipboard(text: string) {
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-muted-foreground text-center">
|
||||
冻结: {{ formatVal(userStats.fundAccount?.frozen) }} | 推广: {{ userStats.referralStats?.directCount || 0 }}人 | 注册: {{ userStats.user?.createTime?.substring(0, 10) || '-' }}
|
||||
冻结: {{ formatVal(userStats.fundAccount?.frozen) }} | 交易账户: {{ formatVal(tradeTotalValue(userStats)) }} | 推广: {{ userStats.referralStats?.directCount || 0 }}人 | 注册: {{ userStats.user?.createTime?.substring(0, 10) || '-' }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
@@ -155,6 +155,12 @@ function formatVal(val: number | string | undefined | null): string {
|
||||
return n.toFixed(2)
|
||||
}
|
||||
|
||||
function tradeTotalValue(userStats: any): number {
|
||||
if (!userStats?.tradeAccounts) return 0
|
||||
return userStats.tradeAccounts.reduce((sum: number, t: any) => sum + (Number(t.value) || 0), 0)
|
||||
}
|
||||
|
||||
|
||||
function daysAgo(time: string | undefined | null): number {
|
||||
if (!time) return 0
|
||||
const d = new Date(time.replace('T', ' '))
|
||||
@@ -204,6 +210,7 @@ function getStatusText(order: OrderFund): string {
|
||||
case 2: return '已出款'
|
||||
case 3: return '已驳回'
|
||||
case 4: return '已取消'
|
||||
case 5: return '待财务审核'
|
||||
default: return '未知'
|
||||
}
|
||||
}
|
||||
@@ -747,7 +754,7 @@ function copyToClipboard(text: string) {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-3 gap-2 text-center pt-2 border-t">
|
||||
<div class="grid grid-cols-4 gap-2 text-center pt-2 border-t">
|
||||
<div>
|
||||
<div class="text-xs text-muted-foreground">
|
||||
冻结金额
|
||||
@@ -756,6 +763,14 @@ function copyToClipboard(text: string) {
|
||||
{{ formatVal(userStats.fundAccount?.frozen) }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-xs text-muted-foreground">
|
||||
交易账户
|
||||
</div>
|
||||
<div class="font-mono font-bold text-blue-600 dark:text-blue-400">
|
||||
{{ formatVal(tradeTotalValue(userStats)) }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-xs text-muted-foreground">
|
||||
推广人数
|
||||
@@ -1050,7 +1065,7 @@ function copyToClipboard(text: string) {
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-muted-foreground text-center">
|
||||
冻结: {{ formatVal(userStats.fundAccount?.frozen) }} | 推广: {{ userStats.referralStats?.directCount || 0 }}人 | 注册: {{ userStats.user?.createTime?.substring(0, 10) || '-' }}
|
||||
冻结: {{ formatVal(userStats.fundAccount?.frozen) }} | 交易账户: {{ formatVal(tradeTotalValue(userStats)) }} | 推广: {{ userStats.referralStats?.directCount || 0 }}人 | 注册: {{ userStats.user?.createTime?.substring(0, 10) || '-' }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.it.rattan.monisuo.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import java.time.LocalDateTime;
|
||||
@@ -26,6 +27,7 @@ public class ColdWallet {
|
||||
private String network;
|
||||
|
||||
/** 是否默认: false-否 true-是 */
|
||||
@JsonProperty("isDefault")
|
||||
private Boolean isDefault;
|
||||
|
||||
/** 状态: 0-禁用 1-启用 */
|
||||
|
||||
@@ -477,10 +477,14 @@ public class AssetService {
|
||||
referralStats.put("referrals", referralList);
|
||||
result.put("referralStats", referralStats);
|
||||
|
||||
// 6. 福利统计(从 account_flow 查询福利类型记录)
|
||||
// 6. 福利统计(从 account_flow 按 remark 匹配福利记录:新人首充/邀请奖励/间接推广)
|
||||
LambdaQueryWrapper<AccountFlow> bonusWrapper = new LambdaQueryWrapper<>();
|
||||
bonusWrapper.eq(AccountFlow::getUserId, userId)
|
||||
.eq(AccountFlow::getFlowType, 7)
|
||||
.eq(AccountFlow::getFlowType, 1)
|
||||
.and(w -> w
|
||||
.like(AccountFlow::getRemark, "新人首充")
|
||||
.or().like(AccountFlow::getRemark, "邀请奖励")
|
||||
.or().like(AccountFlow::getRemark, "间接推广"))
|
||||
.orderByDesc(AccountFlow::getCreateTime);
|
||||
List<AccountFlow> bonusFlows = accountFlowMapper.selectList(bonusWrapper);
|
||||
BigDecimal totalBonusClaimed = bonusFlows.stream()
|
||||
|
||||
@@ -10,7 +10,7 @@ spring:
|
||||
datasource:
|
||||
username: monisuo
|
||||
password: JPJ8wYicSGC8aRnk
|
||||
url: jdbc:mysql://8.155.172.147:3306/monisuo?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
|
||||
url: jdbc:mysql://8.155.172.147:3306/monisuo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
hikari:
|
||||
minimum-idle: 5
|
||||
|
||||
@@ -10,7 +10,7 @@ spring:
|
||||
datasource:
|
||||
username: root
|
||||
password: 897admin$$
|
||||
url: jdbc:mysql://47.97.10.240:3306/spccloud?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
|
||||
url: jdbc:mysql://47.97.10.240:3306/spccloud?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
|
||||
type: com.alibaba.druid.pool.DruidDataSource
|
||||
driver-class-name: com.mysql.jdbc.Driver
|
||||
initialSize: 1
|
||||
|
||||
Reference in New Issue
Block a user