This commit is contained in:
sion
2026-04-10 01:22:25 +08:00
parent 046744d83b
commit 8d3c3b36df
7 changed files with 46 additions and 18 deletions

View File

@@ -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] },

View File

@@ -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>

View File

@@ -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>

View File

@@ -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-启用 */

View File

@@ -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()

View File

@@ -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

View File

@@ -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