You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
3.1 KiB
116 lines
3.1 KiB
{
|
|
"properties" : { },
|
|
"id" : "5e6f7a8490b1c2d3e4f5a678903",
|
|
"script" : null,
|
|
"groupId" : "f8e3d2c1b0a94e5f8a7b6c5d4e3f2a1",
|
|
"name" : "活牛鲜肉价格趋势",
|
|
"createTime" : 1780877200000,
|
|
"updateTime" : null,
|
|
"lock" : null,
|
|
"createBy" : "admin",
|
|
"updateBy" : "admin",
|
|
"path" : "/price-trend",
|
|
"method" : "GET",
|
|
"parameters" : [ ],
|
|
"options" : [ ],
|
|
"requestBody" : "",
|
|
"headers" : [ ],
|
|
"paths" : [ ],
|
|
"responseBody" : null,
|
|
"description" : "活牛/鲜肉价格趋势:近8个月市场采集均价。数据源 yak_trade_market_price,活牛=LIVE_YAK,鲜肉=FRESH_MEAT,直接使用 price 字段及 unit 单位,不做重量折算。",
|
|
"requestBodyDefinition" : null,
|
|
"responseBodyDefinition" : null
|
|
}
|
|
================================
|
|
// 只读查询,不修改任何数据
|
|
// 数据源:yak_trade_market_price(市场采集价格,已含 price + unit)
|
|
// price_type: LIVE_YAK=活牛, FRESH_MEAT=鲜肉/牛肉
|
|
|
|
var monthBucketSql = """
|
|
SELECT
|
|
d.month_start,
|
|
d.offs,
|
|
TO_CHAR(d.month_start, 'FMMM') || '月' AS label
|
|
FROM (
|
|
SELECT
|
|
(date_trunc('month', CURRENT_DATE) - (offs || ' months')::interval)::date AS month_start,
|
|
offs
|
|
FROM generate_series(7, 0, -1) AS offs
|
|
) d
|
|
ORDER BY d.offs DESC
|
|
"""
|
|
|
|
var livePriceSql = """
|
|
SELECT
|
|
date_trunc('month', p.price_date)::date AS month_start,
|
|
ROUND(AVG(p.price)::numeric, 2) AS live_cattle_price
|
|
FROM yak_trade_market_price p
|
|
WHERE p.price_type = 'LIVE_YAK'
|
|
AND p.price_date >= date_trunc('month', CURRENT_DATE) - INTERVAL '7 months'
|
|
GROUP BY date_trunc('month', p.price_date)::date
|
|
"""
|
|
|
|
var beefPriceSql = """
|
|
SELECT
|
|
date_trunc('month', p.price_date)::date AS month_start,
|
|
ROUND(AVG(p.price)::numeric, 2) AS beef_price
|
|
FROM yak_trade_market_price p
|
|
WHERE p.price_type = 'FRESH_MEAT'
|
|
AND p.price_date >= date_trunc('month', CURRENT_DATE) - INTERVAL '7 months'
|
|
GROUP BY date_trunc('month', p.price_date)::date
|
|
"""
|
|
|
|
var unitSql = """
|
|
SELECT
|
|
MAX(CASE WHEN price_type = 'LIVE_YAK' THEN unit END) AS live_unit,
|
|
MAX(CASE WHEN price_type = 'FRESH_MEAT' THEN unit END) AS beef_unit
|
|
FROM yak_trade_market_price
|
|
WHERE price_type IN ('LIVE_YAK', 'FRESH_MEAT')
|
|
"""
|
|
|
|
var buckets = db.select(monthBucketSql)
|
|
var liveRows = db.select(livePriceSql)
|
|
var beefRows = db.select(beefPriceSql)
|
|
var unitRows = db.select(unitSql)
|
|
|
|
var liveMap = {}
|
|
var beefMap = {}
|
|
|
|
for (row in liveRows) {
|
|
liveMap[row.monthStart] = row.liveCattlePrice
|
|
}
|
|
|
|
for (row in beefRows) {
|
|
beefMap[row.monthStart] = row.beefPrice
|
|
}
|
|
|
|
var liveUnit = '元/公斤'
|
|
var beefUnit = '元/公斤'
|
|
if (unitRows && unitRows.length > 0) {
|
|
if (unitRows[0].liveUnit) {
|
|
liveUnit = unitRows[0].liveUnit
|
|
}
|
|
if (unitRows[0].beefUnit) {
|
|
beefUnit = unitRows[0].beefUnit
|
|
}
|
|
}
|
|
|
|
var labels = []
|
|
var liveCattlePrice = []
|
|
var beefPrice = []
|
|
|
|
for (bucket in buckets) {
|
|
var monthKey = bucket.monthStart
|
|
labels.push(bucket.label)
|
|
liveCattlePrice.push(liveMap[monthKey] != null ? liveMap[monthKey] : null)
|
|
beefPrice.push(beefMap[monthKey] != null ? beefMap[monthKey] : null)
|
|
}
|
|
|
|
return {
|
|
labels: labels,
|
|
liveCattlePrice: liveCattlePrice,
|
|
beefPrice: beefPrice,
|
|
unit: liveUnit,
|
|
liveUnit: liveUnit,
|
|
beefUnit: beefUnit
|
|
}
|
|
|