From d065ec21fa23cb6e4ffd752dc3f7a99c2c76d95b Mon Sep 17 00:00:00 2001 From: zty Date: Fri, 10 Jul 2026 02:48:23 -0400 Subject: [PATCH] =?UTF-8?q?fix(material):=20rankAndPaginate=20=E5=B0=8A?= =?UTF-8?q?=E9=87=8D=20sort=5Fval=20=E6=96=B9=E5=90=91,=20=E4=BF=9D?= =?UTF-8?q?=E7=95=99=20null=20=E6=9C=AB=E4=BD=8D=E4=B8=8E=E5=88=86?= =?UTF-8?q?=E6=A1=A3=E9=A1=BA=E5=BA=8F;=20=E5=88=A0=E6=97=A0=E7=94=A8=20im?= =?UTF-8?q?port?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01VCShKevM5prWZhp1kk1iGh --- .../服务端/iapip-svr/src/controllers/material.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/空气质量预测/源码/服务端/iapip-svr/src/controllers/material.ts b/空气质量预测/源码/服务端/iapip-svr/src/controllers/material.ts index ac46aae..4b63bb3 100644 --- a/空气质量预测/源码/服务端/iapip-svr/src/controllers/material.ts +++ b/空气质量预测/源码/服务端/iapip-svr/src/controllers/material.ts @@ -9,7 +9,7 @@ import { ID_PREFIX, DATA_TYPE, ERR_CODE } from '../common/constants' import authz from '../middlewares/authz' import Service from '../common/service' import moment from 'moment' -import { annotate, buildTierClassifier, computeYpt, Tier } from '../common/material-ranking' +import { annotate, buildTierClassifier, Tier } from '../common/material-ranking' // const PREDICT_FIELD: ((keyof PublicMaterial) | (keyof SelfMaterial))[] = [ // 'methanal', 'methanal_min_be', 'methanal_be_area', 'methanal_be_roc', @@ -35,7 +35,7 @@ async function loadTierClassifier(): Promise<(ypt: number | null) => Tier | null return buildTierClassifier([...pub, ...self]) } -// 注解 + 排序(ypt / *_be_area, 恒升序; group_by_tier 时先按档) + 分页 +// 注解 + 排序(ypt / *_be_area, 方向随 sort_val; group_by_tier 时先按档,档序固定不随方向翻转) + 分页 const TIER_ORDER: Record = { A: 0, B: 1, C: 2 } function rankAndPaginate(materials: AnyObj[], query: AnyObj, classify: (ypt: number | null) => Tier | null): AnyObj[] { let list: AnyObj[] = annotate(materials as never, classify) @@ -43,6 +43,7 @@ function rankAndPaginate(materials: AnyObj[], query: AnyObj, classify: (ypt: num const group = query.group_by_tier == 1 || query.group_by_tier === true if (sk || group) { const tierRank = (t: Tier | null) => (t === null ? 3 : TIER_ORDER[t]) + const dir = query.sort_val === 'desc' ? -1 : 1 list.sort((a, b) => { if (group) { const d = tierRank(a.health_tier) - tierRank(b.health_tier) @@ -50,10 +51,10 @@ function rankAndPaginate(materials: AnyObj[], query: AnyObj, classify: (ypt: num } const k = sk ?? 'ypt' const av = a[k], bv = b[k] - // 升序;null 排最后 + // null 恒排最后,不随方向翻转 if (av === null || av === undefined) return bv === null || bv === undefined ? 0 : 1 if (bv === null || bv === undefined) return -1 - return av === bv ? 0 : av > bv ? 1 : -1 + return av === bv ? 0 : (av > bv ? 1 : -1) * dir }) } if (query.size) {