Расчет АНОМАЛЬНО ВЫСОКОГО ПЛАСТОВОГО ДАВЛЕНИЯ (АВПД) на основе типовой формулы
CREATE OR REPLACE FUNCTION public.func_core_calc_avpd(
a_user_id integer,
a_parameters jsonb DEFAULT NULL::jsonb)
RETURNS jsonb
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
DECLARE
v_depth numeric; -- Глубина, м
v_density numeric; -- Плотность бурового раствора, г/см3
v_pressure numeric; -- Рассчитанное давление, МПа
v_gradient numeric; -- Градиент давления, МПа/м
v_hydrostatic_pressure numeric; -- Гидростатическое давление, МПа
v_is_avpd boolean; -- Флаг АВПД
v_result jsonb; -- Результат расчета
BEGIN
-- Начало выполнения функции
RAISE NOTICE 'func_core_calc_avpd: Начало выполнения (user_id: %, parameters: %)', a_user_id, a_parameters;
-- Извлечение параметров из JSON
v_depth := (a_parameters->>'depth')::numeric; -- Глубина в метрах
v_density := (a_parameters->>'density')::numeric; -- Плотность в г/см3
-- Проверка обязательных параметров
IF v_depth IS NULL OR v_density IS NULL THEN
RAISE EXCEPTION 'Не указаны обязательные параметры: depth или density';
END IF;
-- Расчет гидростатического давления (P = ρ * g * h)
-- Плотность переводим в кг/м3 (1 г/см3 = 1000 кг/м3), g = 9.81 м/с2, h в метрах
-- Результат в Па, затем переводим в МПа (1 МПа = 10^6 Па)
v_hydrostatic_pressure := (v_density * 1000 * 9.81 * v_depth) / 1000000;
-- Расчет градиента давления (МПа/м)
v_gradient := v_hydrostatic_pressure / v_depth;
-- Определение АВПД (обычно если градиент > 0.012 МПа/м)
v_is_avpd := v_gradient > 0.012;
-- Формирование результата
v_result := jsonb_build_object(
'hydrostatic_pressure', round(v_hydrostatic_pressure::numeric, 4), -- Гидростатическое давление, МПа
'gradient', round(v_gradient::numeric, 6), -- Градиент давления, МПа/м
'is_avpd', v_is_avpd, -- Флаг АВПД
'depth', v_depth, -- Глубина, м
'density', v_density -- Плотность, г/см3
);
-- Возвращаем результат расчета
RETURN jsonb_build_object(
'msg', 'ok',
'data', v_result
);
EXCEPTION
WHEN OTHERS THEN
-- Ошибка выполнения функции
RAISE WARNING 'func_core_calc_avpd: Ошибка (user_id: %): %', a_user_id, SQLERRM;
RETURN jsonb_build_object(
'msg', 'error',
'error', 'Ошибка func_core_calc_avpd: ' || SQLERRM
);
END;
$BODY$;
ALTER FUNCTION public.func_core_calc_avpd(integer, jsonb)
OWNER TO core;