Расчет АНОМАЛЬНО ВЫСОКОГО ПЛАСТОВОГО ДАВЛЕНИЯ (АВПД) на основе типовой формулы


    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;