feat(assoc): v4.0.1 合伙人关联码、分佣账单与 H5 用户管理
订单佣金只认关联用户;合伙人备注写入独立表;H5 增加用户管理与首页统计。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||
import { Link, useNavigate } from 'react-router-dom';
|
||||
import type { PartnerLeaderboardEntry } from '@dukang/shared-types';
|
||||
import type { PartnerAssocStats, PartnerLeaderboardEntry } from '@dukang/shared-types';
|
||||
import PullToRefresh from '@dukang/shared-ui/PullToRefresh';
|
||||
import { usePartnerPageView } from '../lib/usePageView';
|
||||
import { isLoggedIn, request } from '../lib/api';
|
||||
@@ -153,6 +153,7 @@ export default function HomePage() {
|
||||
const [stores, setStores] = useState<Array<Record<string, unknown>>>([]);
|
||||
const [orders, setOrders] = useState<Array<Record<string, unknown>>>([]);
|
||||
const [leaderboardEntries, setLeaderboardEntries] = useState<PartnerLeaderboardEntry[]>([]);
|
||||
const [assocStats, setAssocStats] = useState<PartnerAssocStats | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
document.title = '工作台';
|
||||
@@ -197,6 +198,16 @@ export default function HomePage() {
|
||||
setStores([]);
|
||||
}
|
||||
|
||||
if (isPrimary) {
|
||||
tasks.push(
|
||||
request<PartnerAssocStats>('PARTNER_H5', '/partner/assoc/stats', { silent: true })
|
||||
.then(setAssocStats)
|
||||
.catch(() => setAssocStats(null)),
|
||||
);
|
||||
} else {
|
||||
setAssocStats(null);
|
||||
}
|
||||
|
||||
tasks.push(
|
||||
fetchPartnerLeaderboard('month')
|
||||
.then((data) => {
|
||||
@@ -208,7 +219,7 @@ export default function HomePage() {
|
||||
);
|
||||
|
||||
return Promise.all(tasks).then(() => undefined);
|
||||
}, [navigate, account, canOrders, canDashboard, canStores]);
|
||||
}, [navigate, account, canOrders, canDashboard, canStores, isPrimary]);
|
||||
|
||||
useEffect(() => {
|
||||
void loadHome();
|
||||
@@ -287,6 +298,51 @@ export default function HomePage() {
|
||||
</>
|
||||
)}
|
||||
|
||||
{isPrimary && (
|
||||
<>
|
||||
<Link to="/users" className="partner-bento-card" style={{ display: 'block', marginBottom: 16, color: 'inherit', textDecoration: 'none' }}>
|
||||
<div className="partner-bento-header">
|
||||
<h2 className="headline-md">关联用户</h2>
|
||||
<span className="amount-lg" style={{ fontSize: 24 }}>{assocStats?.userTotal ?? 0}</span>
|
||||
</div>
|
||||
<div className="partner-store-stats">
|
||||
<div className="partner-store-stat">
|
||||
<div>
|
||||
<p className="label-md text-muted">本日</p>
|
||||
<p className="headline-md">{assocStats?.userToday ?? 0}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="partner-store-stat">
|
||||
<div>
|
||||
<p className="label-md text-muted">本月</p>
|
||||
<p className="headline-md">{assocStats?.userMonth ?? 0}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Link>
|
||||
<Link to="/users/orders" className="partner-bento-card" style={{ display: 'block', marginBottom: 16, color: 'inherit', textDecoration: 'none' }}>
|
||||
<div className="partner-bento-header">
|
||||
<h2 className="headline-md">关联用户订单</h2>
|
||||
<span className="amount-lg" style={{ fontSize: 24 }}>{assocStats?.orderTotal ?? 0}</span>
|
||||
</div>
|
||||
<div className="partner-store-stats">
|
||||
<div className="partner-store-stat">
|
||||
<div>
|
||||
<p className="label-md text-muted">本日</p>
|
||||
<p className="headline-md">{assocStats?.orderToday ?? 0}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="partner-store-stat">
|
||||
<div>
|
||||
<p className="label-md text-muted">本月</p>
|
||||
<p className="headline-md">{assocStats?.orderMonth ?? 0}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</Link>
|
||||
</>
|
||||
)}
|
||||
|
||||
{isWarehouse && (
|
||||
<p className="headline-md" style={{ marginBottom: 8 }}>订单管理</p>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user