· 4 years ago · Apr 16, 2021, 06:18 AM
1<template>
2 <div class="interview-index">
3 <h2 class="intro-y text-lg font-medium mt-10">
4 Список ответов
5 </h2>
6 <div class="grid grid-cols-12 gap-6 mt-5">
7 <div class="intro-y col-span-12 overflow-auto lg:overflow-visible">
8
9 <pre>{{answers}}</pre>
10
11 <!--
12 <table class="table table-report" v-if="answers.length > 0">
13 <thead>
14 <tr>
15 <th class="whitespace-no-wrap">Пользователь</th>
16 <th class="text-right whitespace-no-wrap">Ответ</th>
17 <th class="text-right whitespace-no-wrap">Опрос</th>
18 <th class="text-right whitespace-no-wrap">Вопрос</th>
19 <th class="text-right whitespace-no-wrap">Дата получение ответа</th>
20 </tr>
21 </thead>
22 <tbody>
23 <tr class="intro-x" v-for="item in answers" :key="item.ID">
24 <td>{{ item.user.LAST_NAME != undefined ? item.user.LAST_NAME : '' }} {{ item.user.NAME != undefined ? item.user.NAME : '' }} {{ item.user.SECOND_NAME != undefined ? item.user.SECOND_NAME : '' }}</td>
25 <td class="text-right">{{ item.PREVIEW_TEXT ? item.PREVIEW_TEXT : 'Нет ответа' }}</td>
26 <td class="text-right">{{ item['interview'][0].NAME != undefined ? item['interview'][0].NAME : '' }}</td>
27 <td class="text-right">{{ item['question'][0].NAME != undefined ? item['question'][0].NAME : '' }}</td>
28 <td class="text-right">{{ item.PROPERTY_VALUES.ANSWER_DATE }}</td>
29 </tr>
30 </tbody>
31 </table>
32 -->
33
34 <p v-else>
35 Пусто
36 </p>
37
38 </div>
39 </div>
40
41 </div>
42</template>
43<script>
44export default {
45 data() {
46 return {
47 answers: [],
48 entity: 'MDBotUserAnswers',
49 usersData: [],
50 interviews: [],
51 questions: [],
52 load: false,
53 realData: [],
54 users: []
55 }
56 },
57 created () {
58 this.getData();
59 },
60 methods: {
61 /**
62 * Обеспечивает троттлинг запросов к API Битрикс24 на заданном уровне
63 * @return {object} Promise
64 */
65 throttleCall() {
66 return new Promise(resolve => {
67 let timeout = Math.round(this.lastRequestTime + 1e3 * (1 / this.throttle) - Date.now());
68 if (timeout <= 0) {
69 this.lastRequestTime = Date.now();
70 return resolve();
71 }
72 setTimeout(() => {
73 this.lastRequestTime = Date.now();
74 return resolve();
75 }, timeout);
76 });
77 },
78 /**
79 * Вызывает BX24.callMethod() c заданным методом и параметрами и возвращает объект промис
80 * @param {string} method Метод запроса
81 * @param {object} params Параметры запроса
82 * @return {object} Promise
83 * @see https://dev.1c-bitrix.ru/rest_help/js_library/rest/callMethod.php
84 */
85 async callMethod(method, params = {}) {
86 await this.throttleCall();
87 return new Promise((resolve, reject) => {
88 let callback = result => {
89 if (result.status != 200 || result.error()) {
90 return reject(`${result.error()} (callMethod ${method}: ${JSON.stringify(params)})`);
91 }
92 return resolve(result.data());
93 };
94 BX24.callMethod(method, params, callback);
95 });
96 },
97
98 /**
99 * Вызывает BX24.callBatch() с максимальным числом команд не более 50 и возвращает объект промис
100 * @param {array|object} calls Пакет запросов
101 * @param {boolean} haltOnError Прерывать исполнение пакета в при возникновении ошибки
102 * @return {object} Promise
103 * @see https://dev.1c-bitrix.ru/rest_help/js_library/rest/callBatch.php
104 */
105 async callBatch(calls, haltOnError = true) {
106 await this.throttleCall();
107 return new Promise((resolve, reject) => {
108 let callback = results => {
109 let data;
110 if (Array.isArray(results)) {
111 data = [];
112 for (let result of results) {
113 if (result.status != 200 || result.error()) {
114 return reject(`${result.error()} (callBatch ${result.query.method}: ${result.query.data})`);
115 }
116 data.push(result.data());
117 }
118 } else {
119 data = {};
120 for (let key of Object.keys(results)) {
121 let result = results[ key ];
122 if (result.status != 200 || result.error()) {
123 return reject(`${result.error()} (callBatch ${result.query.method}: ${result.query.data})`);
124 }
125 data[ key ] = result.data();
126 }
127 }
128 return resolve(data);
129 };
130 BX24.callBatch(calls, callback, haltOnError);
131 });
132 },
133
134 /**
135 * Main code
136 * */
137 async getData ()
138 {
139 // Получаем ответы пользователей
140 let getAnswers = await this.callMethod('entity.item.get', {
141 ENTITY: 'MDBotUserAnswers',
142 SORT: {ID: 'DESC'},
143 });
144
145 let iterviewsId = getAnswers.map(item => item.PROPERTY_VALUES.INTERVIEW),
146 questionsId = getAnswers.map(item => item.PROPERTY_VALUES.QUESTION),
147 usersId = getAnswers.map(item => item.NAME);
148
149
150
151 // Пакет запросов в виде объекта с максимальным числом команд в запросе 50
152 let calls = {
153 interviews: [
154 'entity.section.get',
155 {
156 ENTITY: "MDBotInterviews",
157 SORT: {ID: 'DESC'},
158 FILTER: {
159 ACTIVE: 'Y',
160 ID: iterviewsId,
161 }
162 }
163 ],
164 questions: [
165 'entity.item.get',
166 {
167 ENTITY: "MDBotInterviews",
168 SORT: {ID: 'DESC'},
169 FILTER: {
170 ACTIVE: 'Y',
171 ID: questionsId
172 }
173 }
174 ],
175 users: [
176 'user.get',
177 {
178 filter: {
179 ACTIVE: true,
180 ID: usersId
181 }
182 }
183 ],
184 };
185
186 // Отправляем пакет запросов в виде объекта
187 let getDataResponse = await this.callBatch(calls);
188
189
190 let result = [];
191
192 for(let answer of getAnswers)
193 {
194 answer['interview'] = getDataResponse.interviews.filter(interview => {
195 return interview.ID == answer.PROPERTY_VALUES.INTERVIEW ? interview : false;
196 });
197
198 answer['question'] = getDataResponse.questions.filter(question => {
199 return question.ID == answer.PROPERTY_VALUES.QUESTION ? question : false;
200 });
201
202 if(answer['interview'][0])
203 {
204 if(answer['interview'][0]['DESCRIPTION'] == 'Y')
205 {
206 answer['user'] = {
207 LAST_NAME: 'Анонимный пользователь',
208 NAME: ' ',
209 SECOND_NAME: ' '
210 };
211 /*
212 answer['user'] = [{
213 LAST_NAME: 'Анонимный пользователь',
214 NAME: '',
215 SECOND_NAME: ''
216 }];*/
217 }
218 else
219 {
220 let userData = getDataResponse.users.filter(user => {
221 return user.ID == answer.NAME ? user : false;
222 });
223
224 if(userData.length > 0)
225 {
226 answer['user'] = {
227 LAST_NAME: userData[0]['LAST_NAME'],
228 NAME: userData[0]['NAME'],
229 SECOND_NAME: userData[0]['SECOND_NAME']
230 };
231 }
232 }
233 }
234
235 answer['interviewId'] = answer.PROPERTY_VALUES.INTERVIEW;
236 answer['questionId'] = answer.PROPERTY_VALUES.QUESTION;
237
238 result.push(answer);
239 }
240
241 console.log(result);
242
243 let formatDate = this.formatDate(result);
244
245 this.answers = formatDate;
246
247 return result;
248 },
249
250 async removeSchedule(id) {
251 let result = confirm('Проущу подтвердить действию');
252 if (result == true)
253 {
254 let response = await this.callMethod('entity.item.delete', {ENTITY: this.entity, ID: id});
255 this.getData();
256 }
257 },
258
259 formatDate(data){
260 let interviews = [];
261
262 // group interview
263 data.forEach(function(question, index) {
264 let interview = Object.assign({}, question.interview[0]);
265
266 interview.questions = [];
267
268 let isPushed = interviews.find(item => item.ID == question.interviewId);
269
270 if (!isPushed) {
271 interviews.push(interview);
272 }
273
274 });
275
276 // group questions
277
278 data.forEach(function(question, index){
279 let interviewIndex = interviews.findIndex(item => item.ID === question.interviewId);
280 if (interviewIndex >= 0 && interviewIndex <= interviews.length - 1) {
281 let isPushed = interviews[interviewIndex].questions.find(item => item.ID == question.questionId);
282 if (!isPushed) {
283 let q = Object.assign(question.question[0], {users: {}});
284 interviews[interviewIndex].questions.push(q);
285 }
286 }
287 });
288
289 // group users
290 if (interviews.length > 0) {
291 interviews.forEach(function(interview, index1) {
292 interview.questions.forEach(function(interview_question, index2) {
293 let answers = data.filter(item => item.questionId == interview_question.ID);
294 if (answers && answers.length > 0) {
295 interview.questions[index2].users = answers;
296 }
297 });
298 });
299 }
300
301 return interviews;
302 },
303
304 getUserDataById(id, interviewId)
305 {
306 let interView = this.getInterviewDataById(interviewId);
307
308 if(interView != undefined)
309 {
310 if(interView.DESCRIPTION != null && interView.DESCRIPTION == 'Y')
311 {
312 return {
313 LAST_NAME: 'Анонимный пользователь',
314 NAME: ''
315 }
316 }
317 }
318
319 for (let user of this.users) {
320 if (user.ID == id){
321 return user
322 }
323 }
324
325
326 // the code you're looking for
327 var needle = id;
328
329 for (var i = 0; i < obj.length; i++){
330 if (obj[i].code == needle){
331 return obj[i];
332 }
333 }
334 },
335 getInterviewDataById(id)
336 {
337 for (let item of this.interviews) {
338 if (item.ID == id){
339 return item
340 }
341 }
342 },
343 getQuestionDataById(id)
344 {
345 for (let item of this.questions) {
346 if (item.ID == id){
347 return item
348 }
349 }
350 },
351 }
352}
353</script>
354<style scoped>
355
356</style>