v4.0.18版本更新

This commit is contained in:
2026-09-08 13:47:42 +08:00
parent 23ba639e9b
commit 253430b291
14 changed files with 136 additions and 25 deletions
@@ -3,7 +3,7 @@ import { Link } from 'react-router-dom';
import { Button, Popconfirm, Space, Table, Typography, message } from 'antd';
import type { ColumnsType } from 'antd/es/table';
import type { PartnerAssocSummary, PartnerAssocUserItem } from '@dukang/shared-types';
import { request, type HqProfile, type Paginated } from '../lib/api';
import { request, requestDownload, type HqProfile, type Paginated } from '../lib/api';
import { fmtTime } from '../lib/constants';
import ActivityPosterDownloadModal from './ActivityPosterDownloadModal';
@@ -27,6 +27,7 @@ export default function PartnerAssocPanel({ partnerId }: PartnerAssocPanelProps)
const [canEditAssoc, setCanEditAssoc] = useState(false);
const [canDownloadPosters, setCanDownloadPosters] = useState(false);
const [posterDownloadOpen, setPosterDownloadOpen] = useState(false);
const [downloadingQr, setDownloadingQr] = useState(false);
const loadSummary = useCallback(async () => {
const data = await request<PartnerAssocSummary>(`/admin/partners/${partnerId}/assoc`);
@@ -78,6 +79,26 @@ export default function PartnerAssocPanel({ partnerId }: PartnerAssocPanelProps)
}
}
async function downloadBareQrcode() {
if (!summary?.qrcodeUrl) {
message.warning('尚未生成关联码');
return;
}
setDownloadingQr(true);
try {
await requestDownload(
`/admin/partners/${partnerId}/assoc/qrcode`,
{},
`partner-assoc-${partnerId}.png`,
);
message.success('已开始下载二维码');
} catch (e) {
message.error(e instanceof Error ? e.message : '下载二维码失败');
} finally {
setDownloadingQr(false);
}
}
async function unbind(userId: string) {
try {
await request(`/admin/partners/${partnerId}/assoc/users/${userId}/unbind`, { method: 'POST' });
@@ -137,12 +158,19 @@ export default function PartnerAssocPanel({ partnerId }: PartnerAssocPanelProps)
{summary?.userCount ?? 0}
</Link>
</Typography.Paragraph>
<Button loading={issuing} onClick={() => void reissue()}>
{summary?.qrcodeUrl ? '补发关联码' : '生成关联码'}
</Button>
{canDownloadPosters ? (
<Button onClick={() => setPosterDownloadOpen(true)}></Button>
) : null}
<Space wrap>
<Button loading={issuing} onClick={() => void reissue()}>
{summary?.qrcodeUrl ? '补发关联码' : '生成关联码'}
</Button>
{summary?.qrcodeUrl ? (
<Button loading={downloadingQr} onClick={() => void downloadBareQrcode()}>
</Button>
) : null}
{canDownloadPosters ? (
<Button onClick={() => setPosterDownloadOpen(true)}></Button>
) : null}
</Space>
</div>
</Space>
<Table