fix(material): rankAndPaginate 尊重 sort_val 方向, 保留 null 末位与分档顺序; 删无用 import

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCShKevM5prWZhp1kk1iGh
This commit is contained in:
zty 2026-07-10 02:48:23 -04:00
parent f5ec58031a
commit d065ec21fa
1 changed files with 5 additions and 4 deletions

View File

@ -9,7 +9,7 @@ import { ID_PREFIX, DATA_TYPE, ERR_CODE } from '../common/constants'
import authz from '../middlewares/authz' import authz from '../middlewares/authz'
import Service from '../common/service' import Service from '../common/service'
import moment from 'moment' 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))[] = [ // const PREDICT_FIELD: ((keyof PublicMaterial) | (keyof SelfMaterial))[] = [
// 'methanal', 'methanal_min_be', 'methanal_be_area', 'methanal_be_roc', // '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]) return buildTierClassifier([...pub, ...self])
} }
// 注解 + 排序(ypt / *_be_area, 恒升序; group_by_tier 时先按档) + 分页 // 注解 + 排序(ypt / *_be_area, 方向随 sort_val; group_by_tier 时先按档,档序固定不随方向翻转) + 分页
const TIER_ORDER: Record<string, number> = { A: 0, B: 1, C: 2 } const TIER_ORDER: Record<string, number> = { A: 0, B: 1, C: 2 }
function rankAndPaginate(materials: AnyObj[], query: AnyObj, classify: (ypt: number | null) => Tier | null): AnyObj[] { function rankAndPaginate(materials: AnyObj[], query: AnyObj, classify: (ypt: number | null) => Tier | null): AnyObj[] {
let list: AnyObj[] = annotate(materials as never, classify) 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 const group = query.group_by_tier == 1 || query.group_by_tier === true
if (sk || group) { if (sk || group) {
const tierRank = (t: Tier | null) => (t === null ? 3 : TIER_ORDER[t]) const tierRank = (t: Tier | null) => (t === null ? 3 : TIER_ORDER[t])
const dir = query.sort_val === 'desc' ? -1 : 1
list.sort((a, b) => { list.sort((a, b) => {
if (group) { if (group) {
const d = tierRank(a.health_tier) - tierRank(b.health_tier) 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 k = sk ?? 'ypt'
const av = a[k], bv = b[k] const av = a[k], bv = b[k]
// 升序;null 排最后 // null 排最后,不随方向翻转
if (av === null || av === undefined) return bv === null || bv === undefined ? 0 : 1 if (av === null || av === undefined) return bv === null || bv === undefined ? 0 : 1
if (bv === null || bv === undefined) return -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) { if (query.size) {