92 lines
4.6 KiB
JavaScript
92 lines
4.6 KiB
JavaScript
// cron-jobs.js
|
||
const { logActivity } = require('./database');
|
||
|
||
/**
|
||
* Проверяет задачи с типом document_approval, у которых указан номер документа,
|
||
* и автоматически переводит всех их исполнителей в статус completed.
|
||
* Задача остаётся открытой (closed_at не заполняется).
|
||
* @param {Object} db - экземпляр базы данных SQLite
|
||
*/
|
||
function checkDocumentsForCompletion(db) {
|
||
console.log('🔄 [CRON] Проверка задач документов для автоматического завершения исполнителей...');
|
||
|
||
// Находим активные задачи типа document, у которых есть номер документа
|
||
// и которые ещё не закрыты (closed_at IS NULL) – можно оставить для страховки
|
||
const query = `
|
||
SELECT id, title, document_n
|
||
FROM tasks
|
||
WHERE task_type = 'document'
|
||
AND status = 'active'
|
||
AND closed_at IS NULL
|
||
AND document_n IS NOT NULL
|
||
AND document_n != ''
|
||
`;
|
||
|
||
db.all(query, [], (err, tasks) => {
|
||
if (err) {
|
||
console.error('❌ [CRON] Ошибка при поиске задач документов:', err);
|
||
return;
|
||
}
|
||
|
||
if (!tasks || tasks.length === 0) {
|
||
console.log('ℹ️ [CRON] Нет задач документов, требующих завершения исполнителей.');
|
||
return;
|
||
}
|
||
|
||
console.log(`🔍 [CRON] Найдено ${tasks.length} задач документов с номером.`);
|
||
|
||
tasks.forEach(task => {
|
||
// Для каждой задачи находим всех исполнителей, у которых статус не 'completed'
|
||
const assignmentQuery = `
|
||
SELECT id, user_id, status
|
||
FROM task_assignments
|
||
WHERE task_id = ? AND status != 'completed'
|
||
`;
|
||
|
||
db.all(assignmentQuery, [task.id], (err, assignments) => {
|
||
if (err) {
|
||
console.error(`❌ [CRON] Ошибка при получении исполнителей задачи ${task.id}:`, err);
|
||
return;
|
||
}
|
||
|
||
if (!assignments || assignments.length === 0) {
|
||
console.log(`ℹ️ [CRON] Задача ${task.id} (${task.title}) уже имеет всех исполнителей со статусом completed.`);
|
||
return;
|
||
}
|
||
|
||
console.log(`📋 [CRON] Задача ${task.id}: нужно завершить ${assignments.length} исполнителей.`);
|
||
|
||
// Обновляем статус каждого исполнителя на 'completed'
|
||
assignments.forEach(assignment => {
|
||
db.run(
|
||
`UPDATE task_assignments SET status = 'completed', updated_at = CURRENT_TIMESTAMP WHERE id = ?`,
|
||
[assignment.id],
|
||
function(err) {
|
||
if (err) {
|
||
console.error(`❌ [CRON] Ошибка обновления назначения ${assignment.id}:`, err);
|
||
} else {
|
||
console.log(`✅ [CRON] Исполнитель ${assignment.user_id} задачи ${task.id} завершён автоматически.`);
|
||
|
||
// Логируем действие
|
||
try {
|
||
logActivity(
|
||
task.id,
|
||
0, // системное действие, user_id = null
|
||
'AUTO_COMPLETED',
|
||
`Автоматически завершено после указания номера документа`
|
||
);
|
||
} catch (logErr) {
|
||
console.error('❌ [CRON] Ошибка логирования:', logErr);
|
||
}
|
||
}
|
||
}
|
||
);
|
||
});
|
||
});
|
||
});
|
||
});
|
||
}
|
||
|
||
module.exports = {
|
||
checkDocumentsForCompletion
|
||
}; |