info_action.js
4.74 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
/**
* 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, province_short_name province, update_time::date, confirmed_count,
row_number() over(partition by country, 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, ta.province, d.today, confirmed_count
from days d
left join ta on ta.update_time = d.today
where country notnull
order by 1,2,3
)
, pr as (
select country, province from stats group by 1,2
)
, dat as(
select pr.country, 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, province, today, confirmed_count, confirmed_count - COALESCE(lag(confirmed_count) over(partition by country, province order by today), 0) increase
from dat
order by 1,2,3
)
, summ as (
select country, today, sum(confirmed_count) confirmed_sum, sum(increase) increase
from rpt
group by 1,2
order by country, confirmed_sum desc
)
select country, 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, today) confirmed_sum from rpt
where province ~ :province
) t
group by 1,2
union all
select country, '全国' 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 = '中国'
group by 1
order by country, 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, 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
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);
}
};
};