HomeAccounting
281 строка · 11.2 Кб
1<template>
2<div class="my-4">
3
4<v-card>
5<v-card-title>
6<h2>Фильтры</h2>
7<v-container grid-list-md>
8<v-layout wrap>
9<v-flex xs12 sm4 md2>
10<v-autocomplete
11:items="revList"
12v-model="filterForm.rev"
13item-text="name"
14item-value="value"
15label="Доход или расход"
16clearable
17></v-autocomplete>
18</v-flex>
19<v-flex xs12 sm4 md2>
20<v-dialog
21ref="dialog"
22persistent
23v-model="DatePickerFilterStart"
24lazy
25full-width
26width="290px"
27>
28<v-text-field
29slot="activator"
30label="Дата от"
31v-model="filterForm.dateStart"
32prepend-icon="event"
33readonly
34clearable
35></v-text-field>
36<v-date-picker type="date" locale="ru" v-model="filterForm.dateStart" scrollable>
37<v-spacer></v-spacer>
38<v-btn flat color="primary" @click="DatePickerFilterStart=false">OK</v-btn>
39</v-date-picker>
40</v-dialog>
41</v-flex>
42<v-flex xs12 sm4 md2>
43<v-dialog
44ref="dialog"
45persistent
46v-model="DatePickerFilterEnd"
47lazy
48full-width
49width="290px"
50>
51<v-text-field
52slot="activator"
53label="Дата до"
54v-model="filterForm.dateEnd"
55prepend-icon="event"
56readonly
57clearable
58></v-text-field>
59<v-date-picker type="date" locale="ru" v-model="filterForm.dateEnd" scrollable>
60<v-spacer></v-spacer>
61<v-btn flat color="primary" @click="DatePickerFilterEnd=false">OK</v-btn>
62</v-date-picker>
63</v-dialog>
64</v-flex>
65<v-flex xs12 sm4 md3>
66<v-autocomplete
67:items="chartTypes"
68v-model="filterForm.chartType"
69item-text="name"
70item-value="value"
71label="Тип графика"
72clearable
73></v-autocomplete>
74</v-flex>
75<v-flex xs12 sm4 md2>
76<v-btn color="primary" @click="createValidator()" :disabled="requestButtonDisabled">Запросить</v-btn>
77</v-flex>
78</v-layout>
79</v-container>
80</v-card-title>
81</v-card>
82<v-card>
83<line-chart-component
84ref="chartLineCategories"
85:data="chartLineCategoriesData"
86:visibility="visibilityCharts.chartLineCategories">
87</line-chart-component>
88<pie-chart-component
89ref="pieChartCategories"
90:data="chartPieCategoriesData"
91:visibility="visibilityCharts.chartPieCategories">
92</pie-chart-component>
93</v-card>
94<v-card>
95<v-card-text>
96Выберите даты и тип, после нажмите кнопку запросить. Система будет подготавливать данные. Как только они будут готовы,
97система автоматически нарисует график. Для удобства можно щелкать по категориям, чтобы отфильтровать данные на графике.
98</v-card-text>
99</v-card>
100
101</div>
102</template>
103<script>
104import axios from "axios";
105import LineChartComponent from "./line-chart-component";
106import PieChartComponent from "./pie-chart-component";
107
108export default {
109name: "analytics",
110
111data: () => ({
112controlSum: '',
113
114visibilityCharts: {
115chartLineCategories: false,
116chartPieCategories: true,
117},
118
119dataWithServer: [],
120
121chartLineCategoriesData: [],
122chartPieCategoriesData: [],
123
124DatePickerFilterStart: false,
125DatePickerFilterEnd: false,
126
127filterForm: {
128rev: 2,
129dateStart: '',
130dateEnd: '',
131chartType: 'categoryMonth',
132},
133
134revList: [
135{
136value: 1,
137name: 'Доход',
138},
139{
140value: 2,
141name: 'Расход',
142},
143],
144
145chartTypes: [
146{
147value: 'dayJump',
148name: 'Скачки категорий за день',
149},
150{
151value: 'categoryMonth',
152name: 'Гистограма расходов по категории',
153},
154],
155
156interval: null,
157intervalCounter: 10,
158incrementIntervalCounter: 0,
159
160requestButtonDisabled: false,
161
162}),
163methods: {
164//Получает готовый json для графика, выключает интервал, прелоадер и разблокирует кнопку
165getData() {
166
167axios.post('/analytics/get-chart-data', {
168control_sum: this.controlSum,
169})
170.then(response=> {
171
172this.incrementIntervalCounter++;
173
174if(this.incrementIntervalCounter > this.intervalCounter)
175{
176clearInterval(this.interval);
177
178this.$store.commit('setPreloader', false);
179this.requestButtonDisabled = false;
180this.$store.commit('setAlert', {type: 'warning', status: true, message: 'сервер не отвечает'});
181this.interval = null;
182this.incrementIntervalCounter = 0;
183return null;
184}
185
186if(response.data.status !== 400) {
187this.dataWithServer = response.data;
188}
189else {
190this.$store.commit('setAlert', {type: 'warning', status: true, message: 'Не найдены данные по выбранным параметрам'})
191}
192
193if(response.data.status == 'try_again')
194{
195return null;
196}
197
198clearInterval(this.interval);
199
200this.$store.commit('setPreloader', false);
201this.requestButtonDisabled = false;
202this.interval = null;
203this.incrementIntervalCounter = 0;
204
205})
206.catch(error => {
207clearInterval(this.interval);
208this.interval = null;
209this.incrementIntervalCounter = 0;
210});
211},
212//Если проходит валидацию, дисейблим кнопу и запускаем предзагрузчик
213createValidator() {
214if (this.filterForm.dateStart !== '' && this.filterForm.dateEnd !== '' && this.filterForm !== '') {
215this.requestButtonDisabled = true;
216this.$store.commit('setPreloader');
217this.createGraph();
218}
219else {
220this.$store.commit('setAlert', {type: 'error', status: true, message: 'Не заполнены обязательные поля'})
221}
222},
223//Кидает запрос, там работает через очередь, вклчает интервал ожидания ответа
224createGraph() {
225axios.post('/analytics/create', {
226date_start: this.filterForm.dateStart + ' 00:00:00',
227date_end: this.filterForm.dateEnd + ' 23:59:59',
228rev: this.filterForm.rev,
229chart_type: this.filterForm.chartType,
230})
231.then(response=> {
232
233if(response.data.status === 200) {
234this.controlSum = response.data.controlSum;
235this.interval = setInterval(() => {
236this.getData();
237}, 2000);
238}
239
240
241})
242.catch(error => {
243console.error(error)
244});
245},
246
247},
248computed: {
249
250},
251watch: {
252dataWithServer() {
253switch (this.filterForm.chartType) {
254case 'dayJump':
255this.chartLineCategoriesData = this.dataWithServer;
256this.visibilityCharts.chartPieCategories = false;
257this.visibilityCharts.chartLineCategories = true;
258break;
259case 'categoryMonth':
260this.chartPieCategoriesData = this.dataWithServer;
261this.visibilityCharts.chartPieCategories = true;
262this.visibilityCharts.chartLineCategories = false;
263break;
264
265}
266}
267},
268mounted() {
269
270},
271components: {
272PieChartComponent,
273LineChartComponent,
274},
275
276}
277</script>
278
279<style scoped>
280
281</style>