proshu-sozdat-sayt-dlya-otch/server.js

79 lines
3.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const http = require("http");
const fs = require("fs");
const path = require("path");
const XLSX = require("xlsx");
const PORT = process.env.PORT || 3000;
const DATA_FILE = path.join(__dirname, "123-1.xlsx");
let cachedData = null;
function loadData() {
if (cachedData) return cachedData;
try {
const wb = XLSX.readFile(DATA_FILE);
const ws = wb.Sheets["Проблемная B2G июнь"];
const rows = XLSX.utils.sheet_to_json(ws);
cachedData = rows.map(r => ({
"Регион": r["Регион"] || "",
"Сервер": r["Сервер"] || "",
"Район": r["Район CRM"] || "",
"Город": r["Город"] || "",
"Адрес": r["Адрес CRM"] || "",
"Сегмент": r["Сегмент"] || "",
"Категория": r["Категория"] || "",
"Лицевой счет": r["Лицевой счет"] || "",
"Абонент": r["Абонент"] || "",
"БИН": r["БИН/ИИН"] || "",
"Контракт": r["номер контракта crm"] || "",
"Начало": r["начало действия crm"] || "",
"Конец": r["Макс дата образования ДЗ"] || "",
"ДЗ итого": r["Дебиторская задолженность(Итого)"] || 0,
"ПДЗ": r["ПДЗ"] || 0,
"ИТОГО ПДЗ": r["ИТОГО ПДЗ на 01.06.2026"] || r["ИТОГО ПДЗ"] || 0,
"ЛС CRM": r["ЛС CRM 2.0"] || "",
"Менеджер": r["персональный менеджер"] || "",
"Период": r["период внесения"] || "",
"Статус С/Д": r["С/Д июнь"] || r["С/Д май"] || "",
"Статус": r["Статусы июнь"] || r["Статусы май"] || "",
"Отработка": r["Текущий статус июнь"] || r["Текущий статус май"] || "",
"Причина": r["Причина июнь"] || r["Причина май"] || "",
"Ход работы": r["Ход работы июнь"] || "",
"Сотрудник": r["Сотрудник"] || ""
})).filter(r => r["Абонент"] && r["Лицевой счет"]);
return cachedData;
} catch (e) {
console.error("Ошибка загрузки данных:", e.message);
return [];
}
}
function body(req) {
return new Promise((resolve) => {
let s = "";
req.on("data", (c) => (s += c));
req.on("end", () => { try { resolve(JSON.parse(s || "{}")); } catch (_) { resolve({}); } });
});
}
http.createServer(async (req, res) => {
if (req.method === "GET" && req.url === "/api/data") {
const data = loadData();
res.writeHead(200, {
"Content-Type": "application/json; charset=utf-8",
"Access-Control-Allow-Origin": "*"
});
return res.end(JSON.stringify(data));
}
let file = req.url === "/" ? "/index.html" : req.url.split("?")[0];
const full = path.join(__dirname, file);
if (full.startsWith(__dirname) && fs.existsSync(full) && fs.statSync(full).isFile()) {
const ext = path.extname(full);
const type = ext === ".css" ? "text/css" : ext === ".js" ? "application/javascript" : ext === ".json" ? "application/json" : "text/html";
res.writeHead(200, { "Content-Type": type + "; charset=utf-8" });
return res.end(fs.readFileSync(full));
}
res.writeHead(404); res.end("Not found");
}).listen(PORT, () => console.log("Сервер запущен на порту " + PORT));