ParkCommandCenterMapper.xml
6.26 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zteits.parking.module.park.dal.mysql.commandcenter.ParkCommandCenterMapper">
<!--
指挥中心聚合 SQL(只读)
口径(与 ParkDashboardMapper 保持一致):
1. 在用停车场 = parking_lot.data_status = 1 AND state = 1,演示车场(state=2)不计入;
2. 订单 = order_park,data_state = 1;
3. 支付单 = pay_order,data_state = 1 AND pay_order_state = 40(支付成功)
AND order_big_type = 100(停车费);td_b_pay_order 是 2017 年的历史表,不要混用;
4. 时间入参 [begin, end) 由 Service 按「今天 00:00 ~ 明天 00:00」传入,SQL 不做日期函数。
-->
<sql id="activeLotCondition">
l.data_status = 1
AND l.state = 1
</sql>
<!-- 今日分时进出场:进场按 park_in_time 计、出场按 park_out_time 计,各自分组后合并 -->
<select id="selectHourlyFlow"
resultType="com.zteits.parking.module.park.dal.mysql.commandcenter.row.HourFlowRow">
SELECT h.hour,
SUM(h.in_count) AS in_count,
SUM(h.out_count) AS out_count
FROM (
SELECT HOUR(o.park_in_time) AS hour,
COUNT(*) AS in_count,
0 AS out_count
FROM order_park o
INNER JOIN parking_lot l ON l.pl_no = o.pl_no
WHERE <include refid="activeLotCondition"/>
AND o.data_state = 1
AND o.park_in_time >= #{begin}
AND o.park_in_time < #{end}
GROUP BY HOUR(o.park_in_time)
UNION ALL
SELECT HOUR(o.park_out_time) AS hour,
0 AS in_count,
COUNT(*) AS out_count
FROM order_park o
INNER JOIN parking_lot l ON l.pl_no = o.pl_no
WHERE <include refid="activeLotCondition"/>
AND o.data_state = 1
AND o.park_out_time >= #{begin}
AND o.park_out_time < #{end}
GROUP BY HOUR(o.park_out_time)
) h
GROUP BY h.hour
ORDER BY h.hour
</select>
<!-- 今日各区县进出场:同一条 UNION ALL 后再按区县汇总 -->
<select id="selectDistrictFlow"
resultType="com.zteits.parking.module.park.dal.mysql.commandcenter.row.DistrictFlowRow">
SELECT f.district,
SUM(f.in_count) AS in_count,
SUM(f.out_count) AS out_count
FROM (
SELECT l.pl_country_name AS district,
COUNT(*) AS in_count,
0 AS out_count
FROM order_park o
INNER JOIN parking_lot l ON l.pl_no = o.pl_no
WHERE <include refid="activeLotCondition"/>
AND o.data_state = 1
AND o.park_in_time >= #{begin}
AND o.park_in_time < #{end}
GROUP BY l.pl_country_name
UNION ALL
SELECT l.pl_country_name AS district,
0 AS in_count,
COUNT(*) AS out_count
FROM order_park o
INNER JOIN parking_lot l ON l.pl_no = o.pl_no
WHERE <include refid="activeLotCondition"/>
AND o.data_state = 1
AND o.park_out_time >= #{begin}
AND o.park_out_time < #{end}
GROUP BY l.pl_country_name
) f
GROUP BY f.district
</select>
<!-- 今日出场订单的停车时长分档:d1 ≤30 分钟 / d2 30-60 分钟 / d3 1-2 小时 / d4 >2 小时 -->
<select id="selectDurationByDistrict"
resultType="com.zteits.parking.module.park.dal.mysql.commandcenter.row.DurationRow">
SELECT l.pl_country_name AS district,
SUM(CASE WHEN o.secs <= 1800 THEN 1 ELSE 0 END) AS d1,
SUM(CASE WHEN o.secs > 1800 AND o.secs <= 3600 THEN 1 ELSE 0 END) AS d2,
SUM(CASE WHEN o.secs > 3600 AND o.secs <= 7200 THEN 1 ELSE 0 END) AS d3,
SUM(CASE WHEN o.secs > 7200 THEN 1 ELSE 0 END) AS d4
FROM (
SELECT o.pl_no,
COALESCE(o.parking_duration,
TIMESTAMPDIFF(SECOND, o.park_in_time, o.park_out_time)) AS secs
FROM order_park o
WHERE o.data_state = 1
AND o.park_out_time >= #{begin}
AND o.park_out_time < #{end}
AND o.park_in_time IS NOT NULL
) o
INNER JOIN parking_lot l ON l.pl_no = o.pl_no
WHERE <include refid="activeLotCondition"/>
GROUP BY l.pl_country_name
ORDER BY l.pl_country_name
</select>
<!-- 最近进出场事件:一条订单取最近一次动作(出场优先) -->
<select id="selectRecentEvents"
resultType="com.zteits.parking.module.park.dal.mysql.commandcenter.row.EventRow">
SELECT o.car_number,
o.pl_name,
o.park_in_time,
o.park_out_time
FROM order_park o
INNER JOIN parking_lot l ON l.pl_no = o.pl_no
WHERE <include refid="activeLotCondition"/>
AND o.data_state = 1
AND COALESCE(o.park_out_time, o.park_in_time) >= #{since}
ORDER BY COALESCE(o.park_out_time, o.park_in_time) DESC
LIMIT #{limit}
</select>
<!--
今日支付成功的支付单,按支付方式聚合。
注意:现网写入的是 pay_order(pay_order_state = 40 表示支付成功),
td_b_pay_order 是 2017 年的历史表(pay_order_state = 1),不要混用。
-->
<select id="selectPaymentAgg"
resultType="com.zteits.parking.module.park.dal.mysql.commandcenter.row.PaymentAggRow">
SELECT p.pay_type,
COUNT(*) AS cnt,
COALESCE(SUM(p.order_act_fee), 0) AS amount
FROM pay_order p
INNER JOIN parking_lot l ON l.pl_no = p.pl_no
WHERE <include refid="activeLotCondition"/>
AND p.data_state = 1
AND p.pay_order_state = 40
AND p.order_big_type = 100
AND p.create_date >= #{begin}
AND p.create_date < #{end}
GROUP BY p.pay_type
ORDER BY cnt DESC
</select>
</mapper>