цвета

This commit is contained in:
2026-01-29 17:08:15 +05:00
parent 48394cd0cd
commit 827eeb59b9
12 changed files with 1992 additions and 467 deletions

View File

@@ -71,6 +71,9 @@ async function initializeDatabase() {
await initializeSQLite();
}
// Синхронизируем группы пользователей
await syncUserGroups();
return db;
}
@@ -92,6 +95,77 @@ function initializeSQLite() {
});
}
// Функция для синхронизации групп пользователей из старой структуры в новую
async function syncUserGroups() {
console.log('🔄 Синхронизация групп пользователей...');
try {
// Получаем всех пользователей
const users = await new Promise((resolve, reject) => {
db.all("SELECT id, groups FROM users WHERE groups IS NOT NULL AND groups != ''", [], (err, rows) => {
if (err) reject(err);
else resolve(rows || []);
});
});
let syncedCount = 0;
for (const user of users) {
try {
let groups = [];
try {
groups = JSON.parse(user.groups);
} catch (e) {
console.log(`⚠️ Не удалось распарсить группы для пользователя ${user.id}: ${user.groups}`);
continue;
}
// Для каждой группы
for (const groupName of groups) {
if (!groupName || typeof groupName !== 'string') continue;
// Находим ID группы
const group = await new Promise((resolve, reject) => {
db.get("SELECT id FROM user_groups WHERE name = ?", [groupName.trim()], (err, row) => {
if (err) reject(err);
else resolve(row);
});
});
if (group) {
// Добавляем пользователя в группу
await new Promise((resolve, reject) => {
db.run(
`INSERT INTO user_group_memberships (user_id, group_id)
VALUES (?, ?)
ON CONFLICT (user_id, group_id) DO NOTHING`,
[user.id, group.id],
function(err) {
if (err) reject(err);
else resolve();
}
);
});
console.log(`✅ Пользователь ${user.id} добавлен в группу "${groupName}"`);
} else {
console.log(`⚠️ Группа "${groupName}" не найдена для пользователя ${user.id}`);
}
}
syncedCount++;
} catch (error) {
console.error(`❌ Ошибка синхронизации пользователя ${user.id}:`, error.message);
}
}
console.log(`✅ Синхронизировано ${syncedCount} пользователей`);
} catch (error) {
console.error('❌ Ошибка синхронизации групп:', error);
}
}
function createSQLiteTables() {
// Таблица для истории уведомлений
db.run(`CREATE TABLE IF NOT EXISTS notification_history (
@@ -395,6 +469,71 @@ function createSQLiteTables() {
setTimeout(() => {
checkAndUpdateTableStructure();
}, 2000);
// Добавляем группы по умолчанию
setTimeout(() => {
addDefaultGroups();
}, 1000);
}
// Добавляем группы по умолчанию
function addDefaultGroups() {
const defaultGroups = [
{
name: 'Администрация',
description: 'Пользователи с правами администратора системы',
color: '#e74c3c',
can_approve_documents: true
},
{
name: 'Секретарь',
description: 'Группа для согласования документов',
color: '#3498db',
can_approve_documents: true
},
{
name: 'help',
description: 'Группа для получения заявок поддержки',
color: '#27ae60',
can_approve_documents: false
},
{
name: 'doc',
description: 'Группа для работы с документами',
color: '#9b59b6',
can_approve_documents: false
},
{
name: 'ahch',
description: 'Группа для AHCH задач',
color: '#e67e22',
can_approve_documents: false
}
];
defaultGroups.forEach(group => {
db.get("SELECT id FROM user_groups WHERE name = ?", [group.name], (err, existing) => {
if (err) {
console.error(`❌ Ошибка проверки группы ${group.name}:`, err.message);
return;
}
if (!existing) {
db.run(
`INSERT INTO user_groups (name, description, color, can_approve_documents)
VALUES (?, ?, ?, ?)`,
[group.name, group.description, group.color, group.can_approve_documents ? 1 : 0],
(insertErr) => {
if (insertErr) {
console.error(`❌ Ошибка создания группы ${group.name}:`, insertErr.message);
} else {
console.log(`✅ Группа "${group.name}" создана по умолчанию`);
}
}
);
}
});
});
}
function createSQLiteIndexes() {
@@ -1096,31 +1235,76 @@ async function createPostgresTables() {
// Создаем индексы
await createPostgresIndexes(client);
// Добавляем группы по умолчанию для PostgreSQL
await addDefaultGroupsPostgreSQL(client);
client.release();
console.log('✅ Таблицы PostgreSQL проверены/созданы');
// Проверяем структуру PostgreSQL таблиц
await checkPostgresTableStructure();
// Создаем группу "Секретарь" по умолчанию
try {
const checkResult = await client.query("SELECT id FROM user_groups WHERE name = 'Секретарь'");
if (checkResult.rows.length === 0) {
await client.query(`
INSERT INTO user_groups (name, description, color, can_approve_documents)
VALUES ('Секретарь', 'Группа для согласования документов', '#e74c3c', true)
`);
console.log('✅ Группа "Секретарь" создана по умолчанию');
}
} catch (error) {
console.warn('⚠️ Не удалось создать группу "Секретарь":', error.message);
}
} catch (error) {
console.error('❌ Ошибка создания таблиц PostgreSQL:', error.message);
}
}
// Добавляем группы по умолчанию для PostgreSQL
async function addDefaultGroupsPostgreSQL(client) {
const defaultGroups = [
{
name: 'Администрация',
description: 'Пользователи с правами администратора системы',
color: '#e74c3c',
can_approve_documents: true
},
{
name: 'Секретарь',
description: 'Группа для согласования документов',
color: '#3498db',
can_approve_documents: true
},
{
name: 'help',
description: 'Группа для получения заявок поддержки',
color: '#27ae60',
can_approve_documents: false
},
{
name: 'doc',
description: 'Группа для работы с документами',
color: '#9b59b6',
can_approve_documents: false
},
{
name: 'ahch',
description: 'Группа для AHCH задач',
color: '#e67e22',
can_approve_documents: false
}
];
for (const group of defaultGroups) {
try {
const checkResult = await client.query(
"SELECT id FROM user_groups WHERE name = $1",
[group.name]
);
if (checkResult.rows.length === 0) {
await client.query(
`INSERT INTO user_groups (name, description, color, can_approve_documents)
VALUES ($1, $2, $3, $4)`,
[group.name, group.description, group.color, group.can_approve_documents]
);
console.log(`✅ Группа "${group.name}" создана по умолчанию в PostgreSQL`);
}
} catch (error) {
console.error(`❌ Ошибка создания группы ${group.name}:`, error.message);
}
}
}
async function createPostgresIndexes(client) {
console.log('🔧 Создаем индексы для PostgreSQL...');
@@ -1620,6 +1804,7 @@ module.exports = {
USE_POSTGRES,
getDatabaseType: () => USE_POSTGRES ? 'PostgreSQL' : 'SQLite',
checkAndUpdateTableStructure, // Экспортируем для ручного запуска
syncUserGroups, // Экспортируем функцию синхронизации
// Функции для работы с группами
getUserGroups,
getGroupMembers,