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.
131 lines
3.0 KiB
131 lines
3.0 KiB
{
|
|
"properties" : { },
|
|
"id" : "2b3c4d5e6f748590a1b2c3d4e5f6789",
|
|
"script" : null,
|
|
"groupId" : "f8e3d2c1b0a94e5f8a7b6c5d4e3f2a1",
|
|
"name" : "实时交易统计",
|
|
"createTime" : 1780876800000,
|
|
"updateTime" : 1781365000000,
|
|
"lock" : null,
|
|
"createBy" : "admin",
|
|
"updateBy" : "admin",
|
|
"path" : "/real-time-stats",
|
|
"method" : "GET",
|
|
"parameters" : [ {
|
|
"name" : "dimension",
|
|
"value" : null,
|
|
"description" : "时间维度:day(最新统计日)/week(近7天)/month(近30天),不传则返回全部",
|
|
"required" : false,
|
|
"dataType" : "String",
|
|
"type" : null,
|
|
"defaultValue" : null,
|
|
"validateType" : null,
|
|
"error" : null,
|
|
"expression" : null,
|
|
"children" : null
|
|
} ],
|
|
"options" : [ ],
|
|
"requestBody" : "",
|
|
"headers" : [ ],
|
|
"paths" : [ ],
|
|
"responseBody" : null,
|
|
"description" : "实时交易统计:数据源 gov_count_item(只读)。key=mnjyzl/jdjyzl/xsshsl/cgshsl,按 count_date 汇总。",
|
|
"requestBodyDefinition" : null,
|
|
"responseBodyDefinition" : null
|
|
}
|
|
================================
|
|
// gov_count_item 指标 key:
|
|
// mnjyzl 牦牛交易总量
|
|
// jdjyzl 订单交易总量
|
|
// xsshsl 销售商户数量
|
|
// cgshsl 采购商户数量
|
|
// 同一 key + count_date 可能有多条,取 MAX(value);
|
|
// 交易量类(mnjyzl/jdjyzl)在 week/month 内按日求和,商户数类取区间内最大值。
|
|
|
|
var sql = """
|
|
WITH daily AS (
|
|
SELECT
|
|
key,
|
|
count_date,
|
|
MAX(value) AS value
|
|
FROM gov_count_item
|
|
WHERE TRIM(name) IN (
|
|
'牦牛交易总量',
|
|
'订单交易总量',
|
|
'销售商户数量',
|
|
'采购商户数量'
|
|
)
|
|
GROUP BY key, count_date
|
|
),
|
|
anchor AS (
|
|
SELECT MAX(count_date) AS latest_date FROM daily
|
|
),
|
|
day_stats AS (
|
|
SELECT d.key, d.value
|
|
FROM daily d
|
|
CROSS JOIN anchor a
|
|
WHERE d.count_date = a.latest_date
|
|
),
|
|
week_stats AS (
|
|
SELECT
|
|
d.key,
|
|
CASE
|
|
WHEN d.key IN ('mnjyzl', 'jdjyzl') THEN SUM(d.value)
|
|
ELSE MAX(d.value)
|
|
END AS value
|
|
FROM daily d
|
|
CROSS JOIN anchor a
|
|
WHERE d.count_date >= a.latest_date - INTERVAL '6 days'
|
|
GROUP BY d.key
|
|
),
|
|
month_stats AS (
|
|
SELECT
|
|
d.key,
|
|
CASE
|
|
WHEN d.key IN ('mnjyzl', 'jdjyzl') THEN SUM(d.value)
|
|
ELSE MAX(d.value)
|
|
END AS value
|
|
FROM daily d
|
|
CROSS JOIN anchor a
|
|
WHERE d.count_date >= a.latest_date - INTERVAL '29 days'
|
|
GROUP BY d.key
|
|
)
|
|
SELECT 'day' AS dim, key, value FROM day_stats
|
|
UNION ALL
|
|
SELECT 'week' AS dim, key, value FROM week_stats
|
|
UNION ALL
|
|
SELECT 'month' AS dim, key, value FROM month_stats
|
|
ORDER BY dim, key
|
|
"""
|
|
|
|
var rows = db.select(sql)
|
|
|
|
var createEmptyStats = () => {
|
|
return {
|
|
mnjyzl: 0,
|
|
jdjyzl: 0,
|
|
xsshsl: 0,
|
|
cgshsl: 0
|
|
}
|
|
}
|
|
|
|
var result = {
|
|
day: createEmptyStats(),
|
|
week: createEmptyStats(),
|
|
month: createEmptyStats()
|
|
}
|
|
|
|
for (row in rows) {
|
|
var dim = row.dim
|
|
var metricKey = row.key
|
|
if (result[dim]) {
|
|
result[dim][metricKey] = row.value != null ? row.value : 0
|
|
}
|
|
}
|
|
|
|
var dim = dimension
|
|
if (dim && result[dim]) {
|
|
return result[dim]
|
|
}
|
|
|
|
return result
|
|
|