feat: 优化通道运营商与金额展示
This commit is contained in:
@@ -28,16 +28,33 @@ export class ChannelConfigurationService {
|
||||
carriers: query.carrier && query.carrier !== 'all' ? { has: normalizeBusinessCarrier(query.carrier) } : undefined,
|
||||
name: query.keyword?.trim() ? { contains: query.keyword.trim() } : undefined,
|
||||
};
|
||||
const [items, total] = await Promise.all([
|
||||
this.prisma.smsChannel.findMany({
|
||||
where,
|
||||
include: { connectionStates: true },
|
||||
orderBy: [{ createdAt: 'desc' }, { id: 'desc' }],
|
||||
skip: (page - 1) * pageSize,
|
||||
take: pageSize,
|
||||
}),
|
||||
this.prisma.smsChannel.count({ where }),
|
||||
]);
|
||||
const candidates = await this.prisma.smsChannel.findMany({ where, select: { id: true, name: true } });
|
||||
const total = candidates.length;
|
||||
if (total === 0) return { items: [], total, page, pageSize };
|
||||
const day = currentShanghaiDayRange();
|
||||
const counts = await this.prisma.$queryRaw<Array<{ channelId: string; total: number }>>(Prisma.sql`
|
||||
SELECT submit."channelId" AS "channelId", COUNT(*)::integer AS total
|
||||
FROM "SmsSubmitRecord" submit
|
||||
WHERE submit."channelId" IN (${Prisma.join(candidates.map((channel) => channel.id))})
|
||||
AND COALESCE(submit."submittedAt", submit."createdAt") >= ${day.startAt}
|
||||
AND COALESCE(submit."submittedAt", submit."createdAt") < ${day.endAt}
|
||||
AND submit."submitStatus" IN ('accepted', 'rejected', 'timeout')
|
||||
GROUP BY submit."channelId"
|
||||
`);
|
||||
const countByChannel = new Map(counts.map((row) => [row.channelId, Number(row.total)]));
|
||||
// 排序必须发生在分页前,否则只能重排当前页,翻页后会破坏“今日提交量降序”的业务口径。
|
||||
const pageIds = candidates
|
||||
.sort((left, right) => (countByChannel.get(right.id) ?? 0) - (countByChannel.get(left.id) ?? 0)
|
||||
|| left.name.localeCompare(right.name, 'zh-CN')
|
||||
|| left.id.localeCompare(right.id))
|
||||
.slice((page - 1) * pageSize, page * pageSize)
|
||||
.map((channel) => channel.id);
|
||||
const pageItems = await this.prisma.smsChannel.findMany({ where: { id: { in: pageIds } }, include: { connectionStates: true } });
|
||||
const itemById = new Map(pageItems.map((item) => [item.id, item]));
|
||||
const items = pageIds.flatMap((id) => {
|
||||
const item = itemById.get(id);
|
||||
return item ? [item] : [];
|
||||
});
|
||||
return { items, total, page, pageSize };
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user