182 lines
6.6 KiB
SQL
182 lines
6.6 KiB
SQL
-- =============================================================================
|
|
-- Отчет по регламентным работам для периферийного оборудования (на месяц)
|
|
-- =============================================================================
|
|
|
|
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 "№ п/п"; |