feat(material): 管理端 /api/mtrl/pub|self 接入 ypt 排序与分组
This commit is contained in:
parent
d065ec21fa
commit
8f6002b8bb
|
|
@ -1049,12 +1049,12 @@ materialRouter.get(
|
||||||
sort_key: {
|
sort_key: {
|
||||||
anyOf: [
|
anyOf: [
|
||||||
{
|
{
|
||||||
enum: ['name', 'category', 'brand', 'factory', 'spec', 'eco_level', 'health_level', 'sort_order', 'methanal_be_area', 'tvoc_be_area', 'benzene_be_area', 'toluene_be_area', 'p_xylene_be_area', 'created_at', 'updated_at']
|
enum: ['name', 'category', 'brand', 'factory', 'spec', 'eco_level', 'health_level', 'sort_order', 'methanal_be_area', 'tvoc_be_area', 'benzene_be_area', 'toluene_be_area', 'p_xylene_be_area', 'created_at', 'updated_at', 'ypt']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'array',
|
type: 'array',
|
||||||
items: {
|
items: {
|
||||||
enum: ['name', 'category', 'brand', 'factory', 'spec', 'eco_level', 'health_level', 'sort_order', 'methanal_be_area', 'tvoc_be_area', 'benzene_be_area', 'toluene_be_area', 'p_xylene_be_area', 'created_at', 'updated_at']
|
enum: ['name', 'category', 'brand', 'factory', 'spec', 'eco_level', 'health_level', 'sort_order', 'methanal_be_area', 'tvoc_be_area', 'benzene_be_area', 'toluene_be_area', 'p_xylene_be_area', 'created_at', 'updated_at', 'ypt']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -1079,6 +1079,10 @@ materialRouter.get(
|
||||||
size: {
|
size: {
|
||||||
type: 'number',
|
type: 'number',
|
||||||
minimum: 1
|
minimum: 1
|
||||||
|
},
|
||||||
|
group_by_tier: {
|
||||||
|
type: 'number',
|
||||||
|
enum: [0, 1]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
@ -1086,7 +1090,8 @@ materialRouter.get(
|
||||||
}, { coerceTypes: true }),
|
}, { coerceTypes: true }),
|
||||||
async ctx => {
|
async ctx => {
|
||||||
const acctCert = ctx.state.acct_cert as AcctCert
|
const acctCert = ctx.state.acct_cert as AcctCert
|
||||||
const { collected, with_cltrs, ...query } = ctx.state.query
|
// group_by_tier 不是 Prisma 列,需从传给 dynSearch 的 query 中剔除,否则 findMany 报未知字段
|
||||||
|
const { collected, with_cltrs, group_by_tier, ...query } = ctx.state.query
|
||||||
const conditions: AnyObj = {
|
const conditions: AnyObj = {
|
||||||
...dynSearch(query, {
|
...dynSearch(query, {
|
||||||
fuzzyFields: ['material_id', 'name', 'category', 'brand', 'factory', 'spec', 'creator_name'],
|
fuzzyFields: ['material_id', 'name', 'category', 'brand', 'factory', 'spec', 'creator_name'],
|
||||||
|
|
@ -1112,8 +1117,12 @@ materialRouter.get(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete conditions.take; delete conditions.skip
|
||||||
if (!query.sort_key) {
|
if (!query.sort_key) {
|
||||||
conditions.orderBy = [{ sort_order: 'asc' }, { updated_at: 'desc' }]
|
conditions.orderBy = [{ sort_order: 'asc' }, { updated_at: 'desc' }]
|
||||||
|
} else if (query.sort_key === 'ypt') {
|
||||||
|
// ypt 是内存计算字段,非 Prisma 列,不能下推为 orderBy
|
||||||
|
delete conditions.orderBy
|
||||||
}
|
}
|
||||||
if (!isNone(collected) && !acctCert.is_admin) {
|
if (!isNone(collected) && !acctCert.is_admin) {
|
||||||
if (!conditions.where) {
|
if (!conditions.where) {
|
||||||
|
|
@ -1136,7 +1145,8 @@ materialRouter.get(
|
||||||
mtrl.collectors = []
|
mtrl.collectors = []
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
ctx.body = materials
|
const classify = await loadTierClassifier()
|
||||||
|
ctx.body = rankAndPaginate(materials, { ...query, group_by_tier }, classify)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -1802,12 +1812,12 @@ materialRouter.get(
|
||||||
sort_key: {
|
sort_key: {
|
||||||
anyOf: [
|
anyOf: [
|
||||||
{
|
{
|
||||||
enum: ['name', 'category', 'brand', 'factory', 'spec', 'eco_level', 'health_level', 'sort_order', 'creator_name', 'methanal_be_area', 'tvoc_be_area', 'benzene_be_area', 'toluene_be_area', 'p_xylene_be_area', 'created_at', 'updated_at']
|
enum: ['name', 'category', 'brand', 'factory', 'spec', 'eco_level', 'health_level', 'sort_order', 'creator_name', 'methanal_be_area', 'tvoc_be_area', 'benzene_be_area', 'toluene_be_area', 'p_xylene_be_area', 'created_at', 'updated_at', 'ypt']
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'array',
|
type: 'array',
|
||||||
items: {
|
items: {
|
||||||
enum: ['name', 'category', 'brand', 'factory', 'spec', 'eco_level', 'health_level', 'sort_order', 'creator_name', 'methanal_be_area', 'tvoc_be_area', 'benzene_be_area', 'toluene_be_area', 'p_xylene_be_area', 'created_at', 'updated_at']
|
enum: ['name', 'category', 'brand', 'factory', 'spec', 'eco_level', 'health_level', 'sort_order', 'creator_name', 'methanal_be_area', 'tvoc_be_area', 'benzene_be_area', 'toluene_be_area', 'p_xylene_be_area', 'created_at', 'updated_at', 'ypt']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
@ -1832,6 +1842,10 @@ materialRouter.get(
|
||||||
size: {
|
size: {
|
||||||
type: 'number',
|
type: 'number',
|
||||||
minimum: 1
|
minimum: 1
|
||||||
|
},
|
||||||
|
group_by_tier: {
|
||||||
|
type: 'number',
|
||||||
|
enum: [0, 1]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
additionalProperties: false
|
additionalProperties: false
|
||||||
|
|
@ -1839,7 +1853,8 @@ materialRouter.get(
|
||||||
}, { coerceTypes: true }),
|
}, { coerceTypes: true }),
|
||||||
async ctx => {
|
async ctx => {
|
||||||
const acctCert = ctx.state.acct_cert as AcctCert
|
const acctCert = ctx.state.acct_cert as AcctCert
|
||||||
const query = ctx.state.query
|
// group_by_tier 不是 Prisma 列,需从传给 dynSearch 的 query 中剔除,否则 findMany 报未知字段
|
||||||
|
const { group_by_tier, ...query } = ctx.state.query
|
||||||
if (!acctCert.is_admin) {
|
if (!acctCert.is_admin) {
|
||||||
query.creator_id = acctCert.id
|
query.creator_id = acctCert.id
|
||||||
}
|
}
|
||||||
|
|
@ -1857,10 +1872,16 @@ materialRouter.get(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete conditions.take; delete conditions.skip
|
||||||
if (!query.sort_key) {
|
if (!query.sort_key) {
|
||||||
conditions.orderBy = [{ sort_order: 'asc' }, { updated_at: 'desc' }]
|
conditions.orderBy = [{ sort_order: 'asc' }, { updated_at: 'desc' }]
|
||||||
|
} else if (query.sort_key === 'ypt') {
|
||||||
|
// ypt 是内存计算字段,非 Prisma 列,不能下推为 orderBy
|
||||||
|
delete conditions.orderBy
|
||||||
}
|
}
|
||||||
ctx.body = await db.selfMaterial.findMany(conditions as never)
|
const selfMaterials = await db.selfMaterial.findMany(conditions as never)
|
||||||
|
const classify = await loadTierClassifier()
|
||||||
|
ctx.body = rankAndPaginate(selfMaterials, { ...query, group_by_tier }, classify)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue