feat: audit diff, mock SMS 999888, env photos, proxy pay lock, mini-user UX

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-03 20:47:28 +08:00
parent d90847bad0
commit e93e4b8f84
23 changed files with 524 additions and 135 deletions
@@ -83,6 +83,11 @@ export class AdminStorePackageAuditController {
});
}
@Get(':requestId')
detail(@Param('requestId') requestId: string) {
return this.packages.adminGetAuditDetail(BigInt(requestId));
}
@Put(':requestId/audit')
audit(
@CurrentUser() user: AuthUser,
@@ -221,6 +221,28 @@ export class StorePackageService {
]);
}
async adminGetAuditDetail(requestId: bigint) {
const req = await this.prisma.storePackageChangeRequest.findUnique({
where: { id: requestId },
include: { store: { select: { id: true, name: true } } },
});
if (!req) throw new NotFoundException('审核记录不存在');
const livePackages = await this.listLivePackages(req.storeId);
return serializeBigInt({
id: req.id.toString(),
storeId: req.storeId.toString(),
storeName: req.store.name,
status: req.status,
packages: req.packagesJson as unknown as StorePackageItemDto[],
livePackages,
submitterType: req.submitterType,
submitterId: req.submitterId.toString(),
rejectReason: req.rejectReason,
reviewedAt: req.reviewedAt?.toISOString() ?? null,
createdAt: req.createdAt.toISOString(),
});
}
async adminListAudits(query: { status?: string; page?: number; pageSize?: number }) {
const page = query.page ?? 1;
const pageSize = query.pageSize ?? 20;
@@ -670,7 +670,7 @@ export class StoreService {
return this.partnerGetStore(partnerAccountId, storeId);
}
/** 重新上传门头照 / 环境照:先软删旧 ENV,再写入去重后的新图(最多 3 张) */
/** 重新上传门头照 / 环境照:先软删旧 ENV,再写入去重后的新图(至少 3 张,不设上限 */
async partnerUpdateStoreMedia(
partnerAccountId: bigint,
storeId: bigint,
@@ -1271,7 +1271,7 @@ export class StoreService {
await this.assertStoreOwnedByAccount(partnerAccountId, storeId);
}
private normalizeEnvPhotoUrls(raw: unknown, max = 3): string[] {
private normalizeEnvPhotoUrls(raw: unknown): string[] {
if (!Array.isArray(raw)) return [];
const seen = new Set<string>();
const urls: string[] = [];
@@ -1280,7 +1280,6 @@ export class StoreService {
if (!url || seen.has(url)) continue;
seen.add(url);
urls.push(url);
if (urls.length >= max) break;
}
return urls;
}