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.
225 lines
7.1 KiB
225 lines
7.1 KiB
{
|
|
"properties" : { },
|
|
"id" : "9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4",
|
|
"script" : null,
|
|
"groupId" : "f8e3d2c1b0a94e5f8a7b6c5d4e3f2a1",
|
|
"name" : "地图迁徙数据",
|
|
"createTime" : 1780882000000,
|
|
"updateTime" : 1781377000000,
|
|
"lock" : null,
|
|
"createBy" : "admin",
|
|
"updateBy" : "admin",
|
|
"path" : "/map-trading-network",
|
|
"method" : "GET",
|
|
"parameters" : [ ],
|
|
"options" : [ ],
|
|
"requestBody" : "",
|
|
"headers" : [ ],
|
|
"paths" : [ ],
|
|
"responseBody" : null,
|
|
"description" : "中央地图迁徙数据:gov_count_order_total。销售网络=origin_place含红原;源地供应=destination_place含红原;红原出栏=起终点均含红原。头数SUM(yak_number)。",
|
|
"requestBodyDefinition" : null,
|
|
"responseBodyDefinition" : null
|
|
}
|
|
================================
|
|
// gov_count_order_total:一条记录 = 一笔订单,头数 SUM(yak_number)
|
|
// outflow 销售网络:origin_place 含「红原」,按 destination_place 聚合
|
|
// inflow 源地供应:destination_place 含「红原」,按 origin_place 聚合
|
|
// local 红原出栏:destination_place 含「红原」且 origin_place 含「红原」,按 origin_place 乡镇聚合
|
|
// hubName 需与系统配置 mapHub.name 保持一致
|
|
|
|
var hubName = '红原县'
|
|
|
|
var getRowText = (row, camelKey, snakeKey) => {
|
|
if (row[camelKey]) {
|
|
return '' + row[camelKey]
|
|
}
|
|
if (row[snakeKey]) {
|
|
return '' + row[snakeKey]
|
|
}
|
|
return ''
|
|
}
|
|
|
|
var getRowNumber = (row, key) => {
|
|
var v = row[key]
|
|
if (v == null || v === '') {
|
|
return 0
|
|
}
|
|
return v
|
|
}
|
|
|
|
var normalizeCityKey = (name) => {
|
|
var text = '' + (name == null ? '' : name)
|
|
if (text.trim() == '') {
|
|
return '未知'
|
|
}
|
|
|
|
if (text.indexOf('北京') >= 0) { return '北京' }
|
|
if (text.indexOf('上海') >= 0) { return '上海' }
|
|
if (text.indexOf('天津') >= 0) { return '天津' }
|
|
if (text.indexOf('重庆') >= 0) { return '重庆' }
|
|
if (text.indexOf('成都') >= 0) { return '成都' }
|
|
if (text.indexOf('拉萨') >= 0) { return '拉萨' }
|
|
if (text.indexOf('西宁') >= 0) { return '西宁' }
|
|
if (text.indexOf('兰州') >= 0) { return '兰州' }
|
|
if (text.indexOf('西安') >= 0) { return '西安' }
|
|
if (text.indexOf('昆明') >= 0) { return '昆明' }
|
|
if (text.indexOf('贵阳') >= 0) { return '贵阳' }
|
|
if (text.indexOf('广州') >= 0) { return '广州' }
|
|
if (text.indexOf('深圳') >= 0) { return '深圳' }
|
|
if (text.indexOf('康定') >= 0) { return '康定' }
|
|
if (text.indexOf('香格里拉') >= 0) { return '香格里拉' }
|
|
if (text.indexOf('合作') >= 0) { return '合作' }
|
|
if (text.indexOf('甘南') >= 0) { return '甘南藏族自治州' }
|
|
if (text.indexOf('玉树') >= 0) { return '玉树' }
|
|
if (text.indexOf('甘孜') >= 0) { return '甘孜藏族自治州' }
|
|
if (text.indexOf('阿坝') >= 0) { return '阿坝县' }
|
|
if (text.indexOf('马尔康') >= 0) { return '马尔康' }
|
|
if (text.indexOf('理塘') >= 0) { return '理塘' }
|
|
if (text.indexOf('那曲') >= 0) { return '那曲' }
|
|
if (text.indexOf('果洛') >= 0) { return '果洛' }
|
|
if (text.indexOf('红原') >= 0) { return '红原县' }
|
|
|
|
return text
|
|
}
|
|
|
|
var buildDirectionalFlows = (rows, direction) => {
|
|
var flows = []
|
|
var valueMap = {}
|
|
var descMap = {}
|
|
|
|
if (!rows) {
|
|
return flows
|
|
}
|
|
|
|
for (row in rows) {
|
|
var rawName = getRowText(row, 'placeName', 'place_name')
|
|
var value = getRowNumber(row, 'value')
|
|
var sample = getRowText(row, 'samplePlace', 'sample_place')
|
|
if (sample == '') {
|
|
sample = rawName
|
|
}
|
|
|
|
if (value > 0) {
|
|
var cityKey = direction == 'local' ? rawName : normalizeCityKey(rawName)
|
|
if (cityKey != '未知') {
|
|
if (valueMap[cityKey] == null) {
|
|
valueMap[cityKey] = value
|
|
descMap[cityKey] = sample
|
|
if (direction == 'outflow') {
|
|
flows.push({
|
|
from: hubName,
|
|
to: cityKey,
|
|
value: value,
|
|
description: sample
|
|
})
|
|
} else {
|
|
flows.push({
|
|
from: cityKey,
|
|
to: hubName,
|
|
value: value,
|
|
description: sample
|
|
})
|
|
}
|
|
} else {
|
|
valueMap[cityKey] = valueMap[cityKey] + value
|
|
var descText = '' + descMap[cityKey]
|
|
if (descText.indexOf(sample) < 0 && sample != '') {
|
|
descMap[cityKey] = descText + ';' + sample
|
|
}
|
|
for (flow in flows) {
|
|
var flowCity = direction == 'outflow' ? flow.to : flow.from
|
|
if (flowCity == cityKey) {
|
|
flow.value = valueMap[cityKey]
|
|
flow.description = descMap[cityKey]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return flows
|
|
}
|
|
|
|
var outflowSql = """
|
|
SELECT
|
|
COALESCE(NULLIF(TRIM(destination_place), ''), '未知') AS place_name,
|
|
COALESCE(SUM(yak_number), 0) AS value,
|
|
MAX(destination_place) AS sample_place
|
|
FROM gov_count_order_total
|
|
WHERE origin_place IS NOT NULL
|
|
AND position('红原' in origin_place) > 0
|
|
AND destination_place IS NOT NULL
|
|
AND TRIM(destination_place) <> ''
|
|
GROUP BY COALESCE(NULLIF(TRIM(destination_place), ''), '未知')
|
|
HAVING COALESCE(SUM(yak_number), 0) > 0
|
|
ORDER BY value DESC, place_name
|
|
"""
|
|
|
|
var inflowSql = """
|
|
SELECT
|
|
COALESCE(NULLIF(TRIM(origin_place), ''), '未知') AS place_name,
|
|
COALESCE(SUM(yak_number), 0) AS value,
|
|
MAX(origin_place) AS sample_place
|
|
FROM gov_count_order_total
|
|
WHERE destination_place IS NOT NULL
|
|
AND position('红原' in destination_place) > 0
|
|
AND origin_place IS NOT NULL
|
|
AND TRIM(origin_place) <> ''
|
|
GROUP BY COALESCE(NULLIF(TRIM(origin_place), ''), '未知')
|
|
HAVING COALESCE(SUM(yak_number), 0) > 0
|
|
ORDER BY value DESC, place_name
|
|
"""
|
|
|
|
var localSql = """
|
|
SELECT
|
|
COALESCE(
|
|
NULLIF((regexp_match(origin_place, '([^省市区县]+(?:镇|乡|街道))'))[1], ''),
|
|
NULLIF(TRIM(origin_place), ''),
|
|
'未知'
|
|
) AS place_name,
|
|
COALESCE(SUM(yak_number), 0) AS value,
|
|
MAX(origin_place) AS sample_place
|
|
FROM gov_count_order_total
|
|
WHERE destination_place IS NOT NULL
|
|
AND position('红原' in destination_place) > 0
|
|
AND origin_place IS NOT NULL
|
|
AND position('红原' in origin_place) > 0
|
|
AND TRIM(origin_place) <> ''
|
|
GROUP BY COALESCE(
|
|
NULLIF((regexp_match(origin_place, '([^省市区县]+(?:镇|乡|街道))'))[1], ''),
|
|
NULLIF(TRIM(origin_place), ''),
|
|
'未知'
|
|
)
|
|
HAVING COALESCE(SUM(yak_number), 0) > 0
|
|
ORDER BY value DESC, place_name
|
|
"""
|
|
|
|
var outflowRows = db.select(outflowSql)
|
|
var inflowRows = db.select(inflowSql)
|
|
var localRows = db.select(localSql)
|
|
|
|
var outflowFlows = buildDirectionalFlows(outflowRows, 'outflow')
|
|
var inflowFlows = buildDirectionalFlows(inflowRows, 'inflow')
|
|
var localFlows = buildDirectionalFlows(localRows, 'local')
|
|
|
|
return {
|
|
tradingModes: {
|
|
outflow: {
|
|
title: '销售网络分布图',
|
|
description: '从' + hubName + '向全国各地输出牦牛的流向分布',
|
|
flows: outflowFlows
|
|
},
|
|
inflow: {
|
|
title: '源地供应分布图',
|
|
description: '全国各地向' + hubName + '供应牦牛的来源分布',
|
|
flows: inflowFlows
|
|
},
|
|
local: {
|
|
title: '红原出栏分布图',
|
|
description: hubName + '各乡镇牦牛出栏分布情况',
|
|
flows: localFlows
|
|
}
|
|
}
|
|
}
|
|
|