From 3afa0cfd16367cc1d135612f45b560ffe9442848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=A5=D0=B0?= =?UTF-8?q?=D0=BB=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Thu, 2 Jul 2026 15:59:16 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20reglament.sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reglament.sql | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 reglament.sql diff --git a/reglament.sql b/reglament.sql new file mode 100644 index 0000000..9346ab8 --- /dev/null +++ b/reglament.sql @@ -0,0 +1,182 @@ +-- ============================================================================= +-- Отчет по регламентным работам для периферийного оборудования (на месяц) +-- ============================================================================= + +WITH +-- 1. Получаем уникальные устройства из Zabbix и размножаем их +devices_raw AS ( + SELECT DISTINCT + h.host AS host_name, + COALESCE(h.name, h.host) AS visible_name, + COALESCE(hinv."name", 'не указан') AS equipment_type, + COALESCE(hinv.notes, '') AS object_number, + CASE + WHEN hinv.location_lat IS NOT NULL AND hinv.location_lon IS NOT NULL + AND hinv.location_lat != '' AND hinv.location_lon != '' + THEN hinv.location_lat || ' / ' || hinv.location_lon + WHEN hinv.location_lat IS NOT NULL AND hinv.location_lat != '' + THEN hinv.location_lat + WHEN hinv.location_lon IS NOT NULL AND hinv.location_lon != '' + THEN hinv.location_lon + ELSE '' + END AS coordinates, + CAST(nullif(regexp_replace(hinv.notes, 'ОБЪЕКТ №\s*', '', 'g'),'') AS INTEGER) AS object_num + FROM hosts h + LEFT JOIN host_inventory hinv + ON hinv.hostid = h.hostid + WHERE + h.status = 0 + AND h.host NOT LIKE '%WiMAX' + AND hinv."name" NOT LIKE '%Датчик дорожного полотна%' + AND hinv."name" != 'Дорожный контроллер Синтез-Д' + AND (CAST(nullif(regexp_replace(hinv.notes, 'ОБЪЕКТ №\s*', '', 'g'),'') AS INTEGER) + IN (1,2,4,5,8,9,11,12,14,24,25,27,28,29,30,31,32,34,35,36,38,40,41,42,43,44,45,46,48,49,50,51,53,54,55,57,58,60,62,63,64,65,66,67,68,69,70,76,77,81,82,84,85) + OR CAST(nullif(regexp_replace(hinv.notes, 'ОБЪЕКТ №\s*', '', 'g'),'') AS INTEGER) + IN (16,39,75,23)) + AND h.hostid != 10725 + AND ( + hinv."name" LIKE '%Видеокамера%' + OR hinv."name" LIKE '%Маршрутизатор%' + OR hinv."name" LIKE '%Детектор%' + OR hinv."name" LIKE '%Метеостанция%' + OR hinv."name" LIKE '%Коммутационный шкаф%' + ) +), + +-- Размножаем устройства: если есть Маршрутизатор и Коммутационный шкаф, создаем две записи +devices AS ( + -- Видеокамеры + SELECT + host_name, + visible_name, + equipment_type, + 'Видеокамера' AS report_type, + equipment_type AS full_equipment_name, + object_number, + coordinates, + object_num + FROM devices_raw + WHERE equipment_type LIKE '%Видеокамера%' + + UNION ALL + + -- Детекторы + SELECT + host_name, + visible_name, + equipment_type, + 'Детектор' AS report_type, + equipment_type AS full_equipment_name, + object_number, + coordinates, + object_num + FROM devices_raw + WHERE equipment_type LIKE '%Детектор%' + + UNION ALL + + -- Маршрутизаторы (если есть слово Маршрутизатор) + SELECT + host_name, + visible_name, + equipment_type, + 'Маршрутизатор' AS report_type, + REGEXP_REPLACE(equipment_type, '/ Коммутационный шкаф.*$', '') AS full_equipment_name, + object_number, + coordinates, + object_num + FROM devices_raw + WHERE equipment_type LIKE '%Маршрутизатор%' + + UNION ALL + + -- Коммутационные шкафы (если есть слово Коммутационный шкаф) + SELECT + host_name, + visible_name, + equipment_type, + 'Коммутационный шкаф' AS report_type, + 'Коммутационный шкаф' AS full_equipment_name, + object_number, + coordinates, + object_num + FROM devices_raw + WHERE equipment_type LIKE '%Коммутационный шкаф%' + + UNION ALL + + -- Метеостанции + SELECT + host_name, + visible_name, + equipment_type, + 'Метеостанция' AS report_type, + equipment_type AS full_equipment_name, + object_number, + coordinates, + object_num + FROM devices_raw + WHERE equipment_type LIKE '%Метеостанция%' +), + +-- 2. Соединяем устройства с регламентными работами +report_base AS ( + SELECT + d.host_name, + d.visible_name, + d.equipment_type, + d.report_type, + d.full_equipment_name, + d.object_number, + d.coordinates, + d.object_num, + TO_CHAR( + CASE + WHEN ${end_dt} IS NOT NULL THEN to_date(${end_dt}, 'yyyymmdd') + ELSE NOW()::date + END, + 'DD.MM.YYYY' + ) AS report_date, + r.briefdescription AS work_description, + r."Result" AS work_result, + ROW_NUMBER() OVER ( + PARTITION BY d.host_name, d.report_type + ORDER BY r.briefdescription + ) AS work_num + FROM devices d + CROSS JOIN report.reglamentsuka r + WHERE + d.report_type = r."type" +) + +-- 3. Финальный вывод +SELECT + ROW_NUMBER() OVER ( + ORDER BY + object_num NULLS LAST, + CASE report_type + WHEN 'Видеокамера' THEN 1 + WHEN 'Детектор' THEN 2 + WHEN 'Маршрутизатор' THEN 3 + WHEN 'Коммутационный шкаф' THEN 4 + WHEN 'Метеостанция' THEN 5 + ELSE 6 + END, + host_name, + work_num + ) AS "№ п/п", + -- Формируем название оборудования + CASE + WHEN report_type = 'Коммутационный шкаф' THEN 'Коммутационный шкаф' + WHEN report_type = 'Маршрутизатор' THEN 'Маршрутизатор' + WHEN report_type IN ('Видеокамера', 'Детектор', 'Метеостанция') + THEN full_equipment_name + ELSE full_equipment_name + END AS "Оборудование", + object_num AS "Объект", + coordinates AS "Координаты", + work_description AS "Описание_работ", + report_date AS "Дата", + work_result AS "Результат" +FROM report_base +ORDER BY "№ п/п"; \ No newline at end of file