info_action.js
4.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/**
* info_action
* Created by lintry on 2020/1/28.
*/
"use strict";
module.exports = function (dbo) {
//api公共模块
const _ = require('lodash'),
po = global.po,
Result = require('kml-express-stage-lib').Result,
logger = global.loggers.system,
redisDb = require('../../init/redis-promisify'),
moment = require('moment');
/**
* 按日期统计
* @param req
* @returns {Promise<Result>}
*/
this.statGet = async (req) => {
try {
// 获取数据
let params = req.query;
let {province} = params;
province = province || '';
// 代码逻辑区域
let result = await dbo.query(`
with days as (
select generate_series('2020-01-24'::date, CURRENT_DATE, '1 days')::date today
)
, ta as (
select * from (
select country_name, province_short_name province, update_time::date, confirmed_count,
row_number() over(partition by country_name, province_short_name, update_time::date order by update_time desc) rn
from tb_mf_timeline_area
) t
where rn = 1
)
, stats as (
select country_name, ta.province, d.today, confirmed_count
from days d
left join ta on ta.update_time = d.today
where country_name notnull
order by 1,2,3
)
, pr as (
select country_name, province from stats group by 1,2
)
, dat as(
select pr.country_name, pr.province, d.today, COALESCE(st.confirmed_count, max(st.confirmed_count) over(partition by pr.province order by d.today)) confirmed_count
from pr
cross join days d
left join stats st on st.province = pr.province and st.today = d.today
order by 1,2,3
)
, rpt as (
select country_name, province, today, confirmed_count, confirmed_count - COALESCE(lag(confirmed_count) over(partition by country_name, province order by today), 0) increase
from dat
order by 1,2,3
)
, summ as (
select country_name, today, sum(confirmed_count) confirmed_sum, sum(increase) increase
from rpt
where province != '中国'
group by 1,2
order by country_name, confirmed_sum desc
)
select country_name, province, max(confirmed_count) max_count, jsonb_agg(today order by today) days, jsonb_agg(confirmed_count order by today) confirmed_counts,
jsonb_agg(increase order by today) increase,
max(confirmed_sum) confirmed_sum
from ( select *, sum(confirmed_count) over(partition by country_name, today) confirmed_sum from rpt
where province ~ :province
) t
group by 1,2
union all
select country_name, '全国' province, max(confirmed_sum) max_count, jsonb_agg(today order by today) days, jsonb_agg(confirmed_sum order by today) confirmed_counts,
jsonb_agg(increase order by today) increase,
max(confirmed_sum)
from summ
where country_name = '中国'
group by 1
order by country_name, max_count desc
`, {replacements: {province}, type: dbo.QueryTypes.SELECT});
return Result.Ok('成功!', result);
} catch (e) {
logger.error('失败!', e);
return Result.Error('失败!', e.message);
}
};
/**
* 最新情况
* @param req
* @returns {Promise<Result>}
*/
this.latestGet = async (req) => {
try {
// 获取数据
let params = req.query;
let {date, province} = params;
date = date || moment().format('YYYY-MM-DD');
province = province || '';
// 代码逻辑区域
let result = await dbo.query(`
with t as (
select update_time, province_short_name province, confirmed_count, suspected_count, cured_count, dead_count, "comment", cities, country_name, row_number() over(partition by province_short_name order by update_time desc) rn
from tb_mf_timeline_area
where update_time::date = :date
and province_name ~ :province
)
select update_time, province, confirmed_count, suspected_count, cured_count, dead_count, "comment", cities, country_name
from t
where rn = 1
order by confirmed_count desc
`, {replacements: {date, province}, type: dbo.QueryTypes.SELECT});
return Result.Ok('成功!', result);
} catch (e) {
logger.error('失败!', e);
return Result.Error('失败!', e.message);
}
};
};