@selentar/analitoly 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/api/dist/dashboards/dash_1775220041958_v1r8io.json +829 -0
  4. package/api/dist/dashboards/dash_1775222037264_1rrsrd.json +309 -0
  5. package/api/dist/src/agent/agent.controller.d.ts +26 -0
  6. package/api/dist/src/agent/agent.controller.js +124 -0
  7. package/api/dist/src/agent/agent.controller.js.map +1 -0
  8. package/api/dist/src/agent/agent.module.d.ts +2 -0
  9. package/api/dist/src/agent/agent.module.js +23 -0
  10. package/api/dist/src/agent/agent.module.js.map +1 -0
  11. package/api/dist/src/agent/agent.service.d.ts +39 -0
  12. package/api/dist/src/agent/agent.service.js +389 -0
  13. package/api/dist/src/agent/agent.service.js.map +1 -0
  14. package/api/dist/src/agent/mcp-config.d.ts +9 -0
  15. package/api/dist/src/agent/mcp-config.js +51 -0
  16. package/api/dist/src/agent/mcp-config.js.map +1 -0
  17. package/api/dist/src/app.module.d.ts +2 -0
  18. package/api/dist/src/app.module.js +52 -0
  19. package/api/dist/src/app.module.js.map +1 -0
  20. package/api/dist/src/chart/chart.controller.d.ts +8 -0
  21. package/api/dist/src/chart/chart.controller.js +38 -0
  22. package/api/dist/src/chart/chart.controller.js.map +1 -0
  23. package/api/dist/src/chart/chart.module.d.ts +2 -0
  24. package/api/dist/src/chart/chart.module.js +24 -0
  25. package/api/dist/src/chart/chart.module.js.map +1 -0
  26. package/api/dist/src/chart/chart.service.d.ts +32 -0
  27. package/api/dist/src/chart/chart.service.js +106 -0
  28. package/api/dist/src/chart/chart.service.js.map +1 -0
  29. package/api/dist/src/chat/chat.controller.d.ts +14 -0
  30. package/api/dist/src/chat/chat.controller.js +73 -0
  31. package/api/dist/src/chat/chat.controller.js.map +1 -0
  32. package/api/dist/src/chat/chat.module.d.ts +2 -0
  33. package/api/dist/src/chat/chat.module.js +22 -0
  34. package/api/dist/src/chat/chat.module.js.map +1 -0
  35. package/api/dist/src/chat/chat.service.d.ts +25 -0
  36. package/api/dist/src/chat/chat.service.js +168 -0
  37. package/api/dist/src/chat/chat.service.js.map +1 -0
  38. package/api/dist/src/connection/connection.controller.d.ts +46 -0
  39. package/api/dist/src/connection/connection.controller.js +189 -0
  40. package/api/dist/src/connection/connection.controller.js.map +1 -0
  41. package/api/dist/src/connection/connection.model.d.ts +116 -0
  42. package/api/dist/src/connection/connection.model.js +23 -0
  43. package/api/dist/src/connection/connection.model.js.map +1 -0
  44. package/api/dist/src/connection/connection.module.d.ts +2 -0
  45. package/api/dist/src/connection/connection.module.js +31 -0
  46. package/api/dist/src/connection/connection.module.js.map +1 -0
  47. package/api/dist/src/connection/connection.repository.d.ts +16 -0
  48. package/api/dist/src/connection/connection.repository.js +195 -0
  49. package/api/dist/src/connection/connection.repository.js.map +1 -0
  50. package/api/dist/src/connection/connection.service.d.ts +50 -0
  51. package/api/dist/src/connection/connection.service.js +343 -0
  52. package/api/dist/src/connection/connection.service.js.map +1 -0
  53. package/api/dist/src/context/context.controller.d.ts +13 -0
  54. package/api/dist/src/context/context.controller.js +86 -0
  55. package/api/dist/src/context/context.controller.js.map +1 -0
  56. package/api/dist/src/context/context.module.d.ts +2 -0
  57. package/api/dist/src/context/context.module.js +39 -0
  58. package/api/dist/src/context/context.module.js.map +1 -0
  59. package/api/dist/src/context/context.service.d.ts +32 -0
  60. package/api/dist/src/context/context.service.js +177 -0
  61. package/api/dist/src/context/context.service.js.map +1 -0
  62. package/api/dist/src/dashboard/dashboard.controller.d.ts +21 -0
  63. package/api/dist/src/dashboard/dashboard.controller.js +109 -0
  64. package/api/dist/src/dashboard/dashboard.controller.js.map +1 -0
  65. package/api/dist/src/dashboard/dashboard.model.d.ts +15 -0
  66. package/api/dist/src/dashboard/dashboard.model.js +3 -0
  67. package/api/dist/src/dashboard/dashboard.model.js.map +1 -0
  68. package/api/dist/src/dashboard/dashboard.module.d.ts +2 -0
  69. package/api/dist/src/dashboard/dashboard.module.js +24 -0
  70. package/api/dist/src/dashboard/dashboard.module.js.map +1 -0
  71. package/api/dist/src/dashboard/dashboard.repository.d.ts +9 -0
  72. package/api/dist/src/dashboard/dashboard.repository.js +72 -0
  73. package/api/dist/src/dashboard/dashboard.repository.js.map +1 -0
  74. package/api/dist/src/dashboard/dashboard.service.d.ts +14 -0
  75. package/api/dist/src/dashboard/dashboard.service.js +87 -0
  76. package/api/dist/src/dashboard/dashboard.service.js.map +1 -0
  77. package/api/dist/src/datasource/connectors/connector.interface.d.ts +6 -0
  78. package/api/dist/src/datasource/connectors/connector.interface.js +3 -0
  79. package/api/dist/src/datasource/connectors/connector.interface.js.map +1 -0
  80. package/api/dist/src/datasource/connectors/mongo.connector.d.ts +30 -0
  81. package/api/dist/src/datasource/connectors/mongo.connector.js +167 -0
  82. package/api/dist/src/datasource/connectors/mongo.connector.js.map +1 -0
  83. package/api/dist/src/datasource/connectors/mongo.connector.test.d.ts +1 -0
  84. package/api/dist/src/datasource/connectors/mongo.connector.test.js +179 -0
  85. package/api/dist/src/datasource/connectors/mongo.connector.test.js.map +1 -0
  86. package/api/dist/src/datasource/connectors/postgres.connector.d.ts +50 -0
  87. package/api/dist/src/datasource/connectors/postgres.connector.js +213 -0
  88. package/api/dist/src/datasource/connectors/postgres.connector.js.map +1 -0
  89. package/api/dist/src/datasource/connectors/postgres.connector.test.d.ts +1 -0
  90. package/api/dist/src/datasource/connectors/postgres.connector.test.js +197 -0
  91. package/api/dist/src/datasource/connectors/postgres.connector.test.js.map +1 -0
  92. package/api/dist/src/datasource/datasource.controller.d.ts +16 -0
  93. package/api/dist/src/datasource/datasource.controller.js +79 -0
  94. package/api/dist/src/datasource/datasource.controller.js.map +1 -0
  95. package/api/dist/src/datasource/datasource.model.d.ts +26 -0
  96. package/api/dist/src/datasource/datasource.model.js +3 -0
  97. package/api/dist/src/datasource/datasource.model.js.map +1 -0
  98. package/api/dist/src/datasource/datasource.module.d.ts +2 -0
  99. package/api/dist/src/datasource/datasource.module.js +31 -0
  100. package/api/dist/src/datasource/datasource.module.js.map +1 -0
  101. package/api/dist/src/datasource/datasource.repository.d.ts +11 -0
  102. package/api/dist/src/datasource/datasource.repository.js +61 -0
  103. package/api/dist/src/datasource/datasource.repository.js.map +1 -0
  104. package/api/dist/src/datasource/datasource.service.d.ts +28 -0
  105. package/api/dist/src/datasource/datasource.service.js +95 -0
  106. package/api/dist/src/datasource/datasource.service.js.map +1 -0
  107. package/api/dist/src/example/example.controller.d.ts +10 -0
  108. package/api/dist/src/example/example.controller.js +43 -0
  109. package/api/dist/src/example/example.controller.js.map +1 -0
  110. package/api/dist/src/example/example.model.d.ts +6 -0
  111. package/api/dist/src/example/example.model.js +3 -0
  112. package/api/dist/src/example/example.model.js.map +1 -0
  113. package/api/dist/src/example/example.module.d.ts +2 -0
  114. package/api/dist/src/example/example.module.js +23 -0
  115. package/api/dist/src/example/example.module.js.map +1 -0
  116. package/api/dist/src/example/example.repository.d.ts +6 -0
  117. package/api/dist/src/example/example.repository.js +30 -0
  118. package/api/dist/src/example/example.repository.js.map +1 -0
  119. package/api/dist/src/example/example.service.d.ts +10 -0
  120. package/api/dist/src/example/example.service.js +31 -0
  121. package/api/dist/src/example/example.service.js.map +1 -0
  122. package/api/dist/src/integration/integration.controller.d.ts +15 -0
  123. package/api/dist/src/integration/integration.controller.js +69 -0
  124. package/api/dist/src/integration/integration.controller.js.map +1 -0
  125. package/api/dist/src/integration/integration.model.d.ts +17 -0
  126. package/api/dist/src/integration/integration.model.js +3 -0
  127. package/api/dist/src/integration/integration.model.js.map +1 -0
  128. package/api/dist/src/integration/integration.module.d.ts +2 -0
  129. package/api/dist/src/integration/integration.module.js +24 -0
  130. package/api/dist/src/integration/integration.module.js.map +1 -0
  131. package/api/dist/src/integration/integration.repository.d.ts +6 -0
  132. package/api/dist/src/integration/integration.repository.js +45 -0
  133. package/api/dist/src/integration/integration.repository.js.map +1 -0
  134. package/api/dist/src/integration/integration.service.d.ts +12 -0
  135. package/api/dist/src/integration/integration.service.js +78 -0
  136. package/api/dist/src/integration/integration.service.js.map +1 -0
  137. package/api/dist/src/main.d.ts +1 -0
  138. package/api/dist/src/main.js +19 -0
  139. package/api/dist/src/main.js.map +1 -0
  140. package/api/dist/src/mcp/grafana.mcp.d.ts +1 -0
  141. package/api/dist/src/mcp/grafana.mcp.js +95 -0
  142. package/api/dist/src/mcp/grafana.mcp.js.map +1 -0
  143. package/api/dist/src/mcp/graylog.mcp.d.ts +1 -0
  144. package/api/dist/src/mcp/graylog.mcp.js +241 -0
  145. package/api/dist/src/mcp/graylog.mcp.js.map +1 -0
  146. package/api/dist/src/mcp/mcp-server.d.ts +1 -0
  147. package/api/dist/src/mcp/mcp-server.js +336 -0
  148. package/api/dist/src/mcp/mcp-server.js.map +1 -0
  149. package/api/dist/src/paths.d.ts +8 -0
  150. package/api/dist/src/paths.js +50 -0
  151. package/api/dist/src/paths.js.map +1 -0
  152. package/api/dist/src/paths.test.d.ts +1 -0
  153. package/api/dist/src/paths.test.js +60 -0
  154. package/api/dist/src/paths.test.js.map +1 -0
  155. package/api/dist/src/project/project.controller.d.ts +44 -0
  156. package/api/dist/src/project/project.controller.js +79 -0
  157. package/api/dist/src/project/project.controller.js.map +1 -0
  158. package/api/dist/src/project/project.model.d.ts +19 -0
  159. package/api/dist/src/project/project.model.js +3 -0
  160. package/api/dist/src/project/project.model.js.map +1 -0
  161. package/api/dist/src/project/project.module.d.ts +2 -0
  162. package/api/dist/src/project/project.module.js +24 -0
  163. package/api/dist/src/project/project.module.js.map +1 -0
  164. package/api/dist/src/project/project.repository.d.ts +6 -0
  165. package/api/dist/src/project/project.repository.js +52 -0
  166. package/api/dist/src/project/project.repository.js.map +1 -0
  167. package/api/dist/src/project/project.service.d.ts +17 -0
  168. package/api/dist/src/project/project.service.js +163 -0
  169. package/api/dist/src/project/project.service.js.map +1 -0
  170. package/api/dist/tsconfig.tsbuildinfo +1 -0
  171. package/api/dist/vitest.config.d.ts +2 -0
  172. package/api/dist/vitest.config.js +10 -0
  173. package/api/dist/vitest.config.js.map +1 -0
  174. package/api/public/dist/Analitoly.png +0 -0
  175. package/api/public/dist/AnalitolyShort.png +0 -0
  176. package/api/public/dist/Gitlab.png +0 -0
  177. package/api/public/dist/Grafana.png +0 -0
  178. package/api/public/dist/Graylog.png +0 -0
  179. package/api/public/dist/Mongodb.png +0 -0
  180. package/api/public/dist/PostgreSQL.png +0 -0
  181. package/api/public/dist/assets/index-BPB3ckw4.js +222 -0
  182. package/api/public/dist/assets/index-CSAGa0SG.js +227 -0
  183. package/api/public/dist/index.html +12 -0
  184. package/bin/analitoly-mcp.js +18 -0
  185. package/bin/analitoly.js +38 -0
  186. package/package.json +54 -0
@@ -0,0 +1,829 @@
1
+ {
2
+ "id": "dash_1775220041958_v1r8io",
3
+ "name": "Автосохранение",
4
+ "createdAt": "2026-04-03T12:40:41.958Z",
5
+ "updatedAt": "2026-04-03T12:42:22.942Z",
6
+ "charts": [
7
+ {
8
+ "chartId": "chart_1775220039706",
9
+ "echartsOption": {
10
+ "tooltip": {
11
+ "trigger": "axis"
12
+ },
13
+ "xAxis": {
14
+ "type": "category",
15
+ "data": [
16
+ "19 авг",
17
+ "25 авг",
18
+ "16 сен",
19
+ "24 сен",
20
+ "11 ноя",
21
+ "12 ноя",
22
+ "14 ноя",
23
+ "17 ноя",
24
+ "26 ноя",
25
+ "19 дек",
26
+ "14 янв"
27
+ ],
28
+ "axisLabel": {
29
+ "rotate": 45,
30
+ "fontSize": 11
31
+ }
32
+ },
33
+ "yAxis": {
34
+ "type": "value",
35
+ "name": "Аккаунты",
36
+ "minInterval": 1
37
+ },
38
+ "series": [
39
+ {
40
+ "name": "Новые аккаунты",
41
+ "type": "line",
42
+ "data": [
43
+ 1,
44
+ 1,
45
+ 2,
46
+ 1,
47
+ 1,
48
+ 1,
49
+ 1,
50
+ 1,
51
+ 1,
52
+ 1,
53
+ 1
54
+ ],
55
+ "smooth": true,
56
+ "areaStyle": {
57
+ "opacity": 0.3,
58
+ "color": "#5470c6"
59
+ },
60
+ "lineStyle": {
61
+ "color": "#5470c6",
62
+ "width": 2
63
+ },
64
+ "itemStyle": {
65
+ "color": "#5470c6"
66
+ },
67
+ "symbol": "circle",
68
+ "symbolSize": 8,
69
+ "markPoint": {
70
+ "data": [
71
+ {
72
+ "type": "max",
73
+ "name": "Макс"
74
+ }
75
+ ]
76
+ }
77
+ }
78
+ ],
79
+ "grid": {
80
+ "left": "10%",
81
+ "right": "5%",
82
+ "bottom": "20%"
83
+ }
84
+ },
85
+ "title": "Новые аккаунты по дням",
86
+ "description": "Динамика регистрации новых аккаунтов с августа 2025",
87
+ "sourceQuery": "SELECT DATE_TRUNC('day', created_at) AS day, COUNT(*) AS new_accounts FROM account WHERE deleted_at IS NULL GROUP BY 1 ORDER BY 1",
88
+ "position": 0
89
+ },
90
+ {
91
+ "chartId": "chart_1775220045851",
92
+ "echartsOption": {
93
+ "tooltip": {
94
+ "trigger": "axis"
95
+ },
96
+ "legend": {
97
+ "data": [
98
+ "Активные подписки",
99
+ "Отписки"
100
+ ],
101
+ "top": 5
102
+ },
103
+ "xAxis": {
104
+ "type": "category",
105
+ "data": [
106
+ "19 авг",
107
+ "25 авг",
108
+ "16 сен",
109
+ "17 сен",
110
+ "24 сен",
111
+ "3 окт",
112
+ "11 ноя",
113
+ "12 ноя",
114
+ "14 ноя",
115
+ "17 ноя",
116
+ "24 ноя",
117
+ "25 ноя",
118
+ "26 ноя",
119
+ "19 дек",
120
+ "14 янв"
121
+ ],
122
+ "axisLabel": {
123
+ "rotate": 45,
124
+ "fontSize": 10
125
+ }
126
+ },
127
+ "yAxis": {
128
+ "type": "value",
129
+ "minInterval": 1
130
+ },
131
+ "series": [
132
+ {
133
+ "name": "Активные подписки",
134
+ "type": "bar",
135
+ "data": [
136
+ 1,
137
+ 1,
138
+ 0,
139
+ 0,
140
+ 1,
141
+ 1,
142
+ 0,
143
+ 0,
144
+ 2,
145
+ 1,
146
+ 1,
147
+ 1,
148
+ 1,
149
+ 1,
150
+ 1
151
+ ],
152
+ "itemStyle": {
153
+ "color": "#91cc75"
154
+ }
155
+ },
156
+ {
157
+ "name": "Отписки",
158
+ "type": "bar",
159
+ "data": [
160
+ 0,
161
+ 0,
162
+ 6,
163
+ 2,
164
+ 3,
165
+ 0,
166
+ 1,
167
+ 1,
168
+ 10,
169
+ 0,
170
+ 0,
171
+ 0,
172
+ 0,
173
+ 0,
174
+ 0
175
+ ],
176
+ "itemStyle": {
177
+ "color": "#ee6666"
178
+ }
179
+ }
180
+ ],
181
+ "grid": {
182
+ "left": "10%",
183
+ "right": "5%",
184
+ "bottom": "22%"
185
+ }
186
+ },
187
+ "title": "Новые подписки vs Отписки по дням",
188
+ "description": "Активация и деактивация офферов по дням",
189
+ "sourceQuery": "SELECT DATE_TRUNC('day', activated_at), COUNT(*) FILTER (WHERE deactivated_at IS NULL), COUNT(*) FILTER (WHERE deactivated_at IS NOT NULL) FROM activated_offer GROUP BY 1 ORDER BY 1",
190
+ "position": 1
191
+ },
192
+ {
193
+ "chartId": "chart_1775220050242",
194
+ "echartsOption": {
195
+ "tooltip": {
196
+ "trigger": "item",
197
+ "formatter": "{b}: {c} ({d}%)"
198
+ },
199
+ "legend": {
200
+ "orient": "vertical",
201
+ "left": "left"
202
+ },
203
+ "series": [
204
+ {
205
+ "type": "pie",
206
+ "radius": [
207
+ "40%",
208
+ "70%"
209
+ ],
210
+ "data": [
211
+ {
212
+ "value": 6,
213
+ "name": "ASSISTANT_PACKAGE",
214
+ "itemStyle": {
215
+ "color": "#5470c6"
216
+ }
217
+ },
218
+ {
219
+ "value": 6,
220
+ "name": "PRO_PACKAGE",
221
+ "itemStyle": {
222
+ "color": "#fac858"
223
+ }
224
+ }
225
+ ],
226
+ "label": {
227
+ "formatter": "{b}\n{c} подп. ({d}%)"
228
+ },
229
+ "emphasis": {
230
+ "itemStyle": {
231
+ "shadowBlur": 10,
232
+ "shadowOffsetX": 0,
233
+ "shadowColor": "rgba(0,0,0,0.5)"
234
+ }
235
+ }
236
+ }
237
+ ]
238
+ },
239
+ "title": "Активные подписки по пакету",
240
+ "description": "Распределение активных подписчиков по тарифному пакету",
241
+ "sourceQuery": "SELECT o.package_code, COUNT(*) FROM activated_offer ao JOIN offer o ON ao.offer_id = o.id WHERE ao.deactivated_at IS NULL GROUP BY o.package_code",
242
+ "position": 2
243
+ },
244
+ {
245
+ "chartId": "chart_1775220054719",
246
+ "echartsOption": {
247
+ "tooltip": {
248
+ "trigger": "item",
249
+ "formatter": "{b}: {c} ({d}%)"
250
+ },
251
+ "series": [
252
+ {
253
+ "type": "pie",
254
+ "radius": [
255
+ "35%",
256
+ "65%"
257
+ ],
258
+ "data": [
259
+ {
260
+ "value": 6,
261
+ "name": "NIKA 🎙️",
262
+ "itemStyle": {
263
+ "color": "#ee6666"
264
+ }
265
+ },
266
+ {
267
+ "value": 5,
268
+ "name": "DARIA 🎙️",
269
+ "itemStyle": {
270
+ "color": "#73c0de"
271
+ }
272
+ },
273
+ {
274
+ "value": 1,
275
+ "name": "SERGEY 🎙️",
276
+ "itemStyle": {
277
+ "color": "#3ba272"
278
+ }
279
+ }
280
+ ],
281
+ "label": {
282
+ "formatter": "{b}\n{c} польз. ({d}%)"
283
+ },
284
+ "emphasis": {
285
+ "itemStyle": {
286
+ "shadowBlur": 10
287
+ }
288
+ }
289
+ }
290
+ ]
291
+ },
292
+ "title": "Выбор голоса секретаря (активные подписки)",
293
+ "description": "Какой голос выбирают активные пользователи",
294
+ "sourceQuery": "SELECT sps.selected_voice_code, COUNT(*) FROM secretary_package_settings sps JOIN activated_offer ao ON sps.activated_offer_id = ao.id WHERE ao.deactivated_at IS NULL AND sps.selected_voice_code IS NOT NULL GROUP BY sps.selected_voice_code",
295
+ "position": 3
296
+ },
297
+ {
298
+ "chartId": "chart_1775220058657",
299
+ "echartsOption": {
300
+ "tooltip": {
301
+ "trigger": "axis"
302
+ },
303
+ "xAxis": {
304
+ "type": "category",
305
+ "data": [
306
+ "PROVIDER_API",
307
+ "TELEGRAM"
308
+ ]
309
+ },
310
+ "yAxis": {
311
+ "type": "value",
312
+ "name": "Подписчики",
313
+ "minInterval": 1
314
+ },
315
+ "series": [
316
+ {
317
+ "type": "bar",
318
+ "data": [
319
+ {
320
+ "value": 12,
321
+ "itemStyle": {
322
+ "color": "#5470c6"
323
+ }
324
+ },
325
+ {
326
+ "value": 6,
327
+ "itemStyle": {
328
+ "color": "#26A5E4"
329
+ }
330
+ }
331
+ ],
332
+ "label": {
333
+ "show": true,
334
+ "position": "top",
335
+ "fontSize": 14,
336
+ "fontWeight": "bold"
337
+ },
338
+ "barMaxWidth": 80
339
+ }
340
+ ],
341
+ "grid": {
342
+ "left": "12%",
343
+ "right": "5%",
344
+ "bottom": "10%"
345
+ }
346
+ },
347
+ "title": "Активные каналы уведомлений",
348
+ "description": "Через какие каналы подключены активные подписчики",
349
+ "sourceQuery": "SELECT spac.channel_code, COUNT(*) FROM secretary_package_active_channels spac JOIN ... WHERE ao.deactivated_at IS NULL GROUP BY spac.channel_code",
350
+ "position": 4
351
+ },
352
+ {
353
+ "chartId": "chart_1775220065213",
354
+ "echartsOption": {
355
+ "tooltip": {
356
+ "trigger": "axis",
357
+ "axisPointer": {
358
+ "type": "shadow"
359
+ }
360
+ },
361
+ "xAxis": {
362
+ "type": "value",
363
+ "name": "Звонков"
364
+ },
365
+ "yAxis": {
366
+ "type": "category",
367
+ "data": [
368
+ "Обратный звонок",
369
+ "Проблемы со связью",
370
+ "Сброс после приветствия",
371
+ "Рекламный бот",
372
+ "Доставка",
373
+ "Заказ обратного звонка"
374
+ ],
375
+ "axisLabel": {
376
+ "fontSize": 11,
377
+ "width": 180,
378
+ "overflow": "break"
379
+ }
380
+ },
381
+ "series": [
382
+ {
383
+ "type": "bar",
384
+ "data": [
385
+ {
386
+ "value": 42,
387
+ "itemStyle": {
388
+ "color": "#91cc75"
389
+ }
390
+ },
391
+ {
392
+ "value": 13,
393
+ "itemStyle": {
394
+ "color": "#fac858"
395
+ }
396
+ },
397
+ {
398
+ "value": 8,
399
+ "itemStyle": {
400
+ "color": "#ee6666"
401
+ }
402
+ },
403
+ {
404
+ "value": 1,
405
+ "itemStyle": {
406
+ "color": "#73c0de"
407
+ }
408
+ },
409
+ {
410
+ "value": 1,
411
+ "itemStyle": {
412
+ "color": "#3ba272"
413
+ }
414
+ },
415
+ {
416
+ "value": 1,
417
+ "itemStyle": {
418
+ "color": "#fc8452"
419
+ }
420
+ }
421
+ ],
422
+ "label": {
423
+ "show": true,
424
+ "position": "right"
425
+ }
426
+ }
427
+ ],
428
+ "grid": {
429
+ "left": "35%",
430
+ "right": "10%",
431
+ "top": "5%",
432
+ "bottom": "10%"
433
+ }
434
+ },
435
+ "title": "Топ типов входящих звонков (MongoDB)",
436
+ "description": "Классификация звонков по callType — как секретарь интерпретирует звонки",
437
+ "sourceQuery": "db.incomingCallEvent.aggregate([{$group: {_id: \"$callType\", cnt: {$sum:1}}}, {$sort:{cnt:-1}}, {$limit:6}])",
438
+ "position": 5
439
+ },
440
+ {
441
+ "chartId": "chart_1775220070632",
442
+ "echartsOption": {
443
+ "tooltip": {
444
+ "trigger": "item",
445
+ "formatter": "{b}: {c} ({d}%)"
446
+ },
447
+ "legend": {
448
+ "orient": "vertical",
449
+ "right": 10,
450
+ "top": "center"
451
+ },
452
+ "series": [
453
+ {
454
+ "type": "pie",
455
+ "radius": [
456
+ "40%",
457
+ "70%"
458
+ ],
459
+ "center": [
460
+ "40%",
461
+ "50%"
462
+ ],
463
+ "data": [
464
+ {
465
+ "value": 31,
466
+ "name": "UNKNOWN",
467
+ "itemStyle": {
468
+ "color": "#aaa"
469
+ }
470
+ },
471
+ {
472
+ "value": 26,
473
+ "name": "USER_AFTER_\nCANT_ANSWER",
474
+ "itemStyle": {
475
+ "color": "#5470c6"
476
+ }
477
+ },
478
+ {
479
+ "value": 5,
480
+ "name": "USER_ON_START",
481
+ "itemStyle": {
482
+ "color": "#fac858"
483
+ }
484
+ },
485
+ {
486
+ "value": 3,
487
+ "name": "TECH_ERROR",
488
+ "itemStyle": {
489
+ "color": "#ee6666"
490
+ }
491
+ },
492
+ {
493
+ "value": 1,
494
+ "name": "USER_AFTER_\nGREETING",
495
+ "itemStyle": {
496
+ "color": "#91cc75"
497
+ }
498
+ }
499
+ ],
500
+ "label": {
501
+ "formatter": "{b}\n{c} ({d}%)"
502
+ },
503
+ "emphasis": {
504
+ "itemStyle": {
505
+ "shadowBlur": 10
506
+ }
507
+ }
508
+ }
509
+ ]
510
+ },
511
+ "title": "Причины завершения звонка (hangUpType)",
512
+ "description": "Как завершались звонки — USER_AFTER_CANT_ANSWER означает что абонент недоступен",
513
+ "sourceQuery": "db.incomingCallEvent.aggregate([{$group: {_id: \"$hangUpType\", cnt: {$sum:1}}}, {$sort:{cnt:-1}}])",
514
+ "position": 6
515
+ },
516
+ {
517
+ "chartId": "chart_1775220075775",
518
+ "echartsOption": {
519
+ "tooltip": {
520
+ "trigger": "axis",
521
+ "axisPointer": {
522
+ "type": "shadow"
523
+ }
524
+ },
525
+ "xAxis": {
526
+ "type": "category",
527
+ "data": [
528
+ "incomingCall",
529
+ "updateOfferStatus",
530
+ "updateChannelStatus",
531
+ "updateAccount",
532
+ "updateVoice"
533
+ ],
534
+ "axisLabel": {
535
+ "rotate": 20,
536
+ "fontSize": 11
537
+ }
538
+ },
539
+ "yAxis": {
540
+ "type": "log",
541
+ "name": "Событий (лог. шкала)",
542
+ "min": 1
543
+ },
544
+ "series": [
545
+ {
546
+ "type": "bar",
547
+ "data": [
548
+ {
549
+ "value": 769,
550
+ "itemStyle": {
551
+ "color": "#5470c6"
552
+ }
553
+ },
554
+ {
555
+ "value": 30,
556
+ "itemStyle": {
557
+ "color": "#91cc75"
558
+ }
559
+ },
560
+ {
561
+ "value": 11,
562
+ "itemStyle": {
563
+ "color": "#fac858"
564
+ }
565
+ },
566
+ {
567
+ "value": 4,
568
+ "itemStyle": {
569
+ "color": "#ee6666"
570
+ }
571
+ },
572
+ {
573
+ "value": 1,
574
+ "itemStyle": {
575
+ "color": "#73c0de"
576
+ }
577
+ }
578
+ ],
579
+ "label": {
580
+ "show": true,
581
+ "position": "top",
582
+ "formatter": "{c}"
583
+ },
584
+ "barMaxWidth": 80
585
+ }
586
+ ],
587
+ "grid": {
588
+ "left": "12%",
589
+ "right": "5%",
590
+ "bottom": "15%"
591
+ }
592
+ },
593
+ "title": "Аналитические события (MongoDB analyticsEvent)",
594
+ "description": "Топ событий платформы — incomingCall составляет подавляющее большинство",
595
+ "sourceQuery": "db.analyticsEvent.aggregate([{$group:{_id:\"$name\",cnt:{$sum:1}}},{$sort:{cnt:-1}},{$limit:5}])",
596
+ "position": 7
597
+ },
598
+ {
599
+ "chartId": "chart_1775220115047",
600
+ "echartsOption": {
601
+ "tooltip": {
602
+ "trigger": "axis",
603
+ "axisPointer": {
604
+ "type": "shadow"
605
+ }
606
+ },
607
+ "xAxis": {
608
+ "type": "value",
609
+ "name": "Количество звонков"
610
+ },
611
+ "yAxis": {
612
+ "type": "category",
613
+ "data": [
614
+ "Авито (маскировка)",
615
+ "угу угу",
616
+ "Займ-спам (бот)",
617
+ "да",
618
+ "угу алло",
619
+ "мм",
620
+ "Заказ (номер скрыт)",
621
+ "алло алло",
622
+ "здравствуйте",
623
+ "здравствуй",
624
+ "алло здравствуй",
625
+ "угу",
626
+ "алло",
627
+ "hangup",
628
+ "Нет распознавания"
629
+ ],
630
+ "axisLabel": {
631
+ "fontSize": 11
632
+ }
633
+ },
634
+ "series": [
635
+ {
636
+ "type": "bar",
637
+ "data": [
638
+ {
639
+ "value": 788,
640
+ "itemStyle": {
641
+ "color": "#73c0de"
642
+ }
643
+ },
644
+ {
645
+ "value": 790,
646
+ "itemStyle": {
647
+ "color": "#73c0de"
648
+ }
649
+ },
650
+ {
651
+ "value": 1042,
652
+ "itemStyle": {
653
+ "color": "#ee6666"
654
+ }
655
+ },
656
+ {
657
+ "value": 1528,
658
+ "itemStyle": {
659
+ "color": "#91cc75"
660
+ }
661
+ },
662
+ {
663
+ "value": 1240,
664
+ "itemStyle": {
665
+ "color": "#91cc75"
666
+ }
667
+ },
668
+ {
669
+ "value": 1372,
670
+ "itemStyle": {
671
+ "color": "#91cc75"
672
+ }
673
+ },
674
+ {
675
+ "value": 1462,
676
+ "itemStyle": {
677
+ "color": "#73c0de"
678
+ }
679
+ },
680
+ {
681
+ "value": 1600,
682
+ "itemStyle": {
683
+ "color": "#91cc75"
684
+ }
685
+ },
686
+ {
687
+ "value": 2370,
688
+ "itemStyle": {
689
+ "color": "#91cc75"
690
+ }
691
+ },
692
+ {
693
+ "value": 3837,
694
+ "itemStyle": {
695
+ "color": "#91cc75"
696
+ }
697
+ },
698
+ {
699
+ "value": 4168,
700
+ "itemStyle": {
701
+ "color": "#91cc75"
702
+ }
703
+ },
704
+ {
705
+ "value": 21296,
706
+ "itemStyle": {
707
+ "color": "#5470c6"
708
+ }
709
+ },
710
+ {
711
+ "value": 36769,
712
+ "itemStyle": {
713
+ "color": "#5470c6"
714
+ }
715
+ },
716
+ {
717
+ "value": 98203,
718
+ "itemStyle": {
719
+ "color": "#fac858"
720
+ }
721
+ },
722
+ {
723
+ "value": 292209,
724
+ "itemStyle": {
725
+ "color": "#aaa"
726
+ }
727
+ }
728
+ ],
729
+ "label": {
730
+ "show": true,
731
+ "position": "right"
732
+ }
733
+ }
734
+ ],
735
+ "grid": {
736
+ "left": "28%",
737
+ "right": "14%",
738
+ "top": "3%",
739
+ "bottom": "8%"
740
+ }
741
+ },
742
+ "title": "Топ первых фраз звонящих (calls_bee_stat · 533K звонков)",
743
+ "description": "Что говорит звонящий в самом начале — нераспознанная речь лидирует (292K)",
744
+ "sourceQuery": "SELECT first_phrase, COUNT(*) FROM calls_bee_stat WHERE first_phrase IS NOT NULL GROUP BY first_phrase ORDER BY cnt DESC LIMIT 15",
745
+ "position": 8
746
+ },
747
+ {
748
+ "chartId": "chart_1775220116864",
749
+ "echartsOption": {
750
+ "tooltip": {
751
+ "trigger": "axis"
752
+ },
753
+ "xAxis": {
754
+ "type": "category",
755
+ "data": [
756
+ "0–10 сек",
757
+ "10–30 сек",
758
+ "30–60 сек",
759
+ "1–2 мин",
760
+ "2–5 мин",
761
+ "5+ мин"
762
+ ],
763
+ "name": "Длительность"
764
+ },
765
+ "yAxis": {
766
+ "type": "value",
767
+ "name": "Звонков"
768
+ },
769
+ "series": [
770
+ {
771
+ "type": "bar",
772
+ "data": [
773
+ {
774
+ "value": 353229,
775
+ "itemStyle": {
776
+ "color": "#5470c6"
777
+ }
778
+ },
779
+ {
780
+ "value": 142210,
781
+ "itemStyle": {
782
+ "color": "#91cc75"
783
+ }
784
+ },
785
+ {
786
+ "value": 23736,
787
+ "itemStyle": {
788
+ "color": "#fac858"
789
+ }
790
+ },
791
+ {
792
+ "value": 7614,
793
+ "itemStyle": {
794
+ "color": "#fc8452"
795
+ }
796
+ },
797
+ {
798
+ "value": 2660,
799
+ "itemStyle": {
800
+ "color": "#ee6666"
801
+ }
802
+ },
803
+ {
804
+ "value": 3179,
805
+ "itemStyle": {
806
+ "color": "#73c0de"
807
+ }
808
+ }
809
+ ],
810
+ "label": {
811
+ "show": true,
812
+ "position": "top"
813
+ },
814
+ "barMaxWidth": 80
815
+ }
816
+ ],
817
+ "grid": {
818
+ "left": "14%",
819
+ "right": "5%",
820
+ "bottom": "12%"
821
+ }
822
+ },
823
+ "title": "Распределение длительности звонков (calls_bee_stat · 533K)",
824
+ "description": "66% звонков — короче 10 секунд. Классический профиль missed/spam звонков",
825
+ "sourceQuery": "SELECT CASE WHEN duration < 10 THEN '0-10s' WHEN duration < 30 THEN '10-30s' ... END, COUNT(*) FROM calls_bee_stat GROUP BY 1",
826
+ "position": 9
827
+ }
828
+ ]
829
+ }