iloom-flatten/migrations/20260604_143720_create_data_validation_functions.sql

103 lines
2.8 KiB
MySQL
Raw Normal View History

-- ============================================
-- 此文件由 Meoo Cloud 自动生成,请勿修改
-- This file is auto-generated by Meoo Cloud, DO NOT MODIFY
-- ============================================
CREATE OR REPLACE FUNCTION validate_plan_quantity_consistency()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
DECLARE
v_inventory_total NUMERIC;
v_tolerance NUMERIC := 0.01;
BEGIN
IF OLD.completed_quantity IS DISTINCT FROM NEW.completed_quantity THEN
SELECT COALESCE(SUM(quantity), 0) INTO v_inventory_total
FROM inventory_records
WHERE plan_id = NEW.id;
IF ABS(NEW.completed_quantity - v_inventory_total) > v_tolerance THEN
RAISE EXCEPTION
'数据完整性错误:计划 % 的完成数量(%)与入库记录总和(%)不一致,差异: %',
NEW.plan_code, NEW.completed_quantity, v_inventory_total,
NEW.completed_quantity - v_inventory_total;
END IF;
END IF;
RETURN NEW;
END;
$$;
CREATE OR REPLACE FUNCTION validate_inventory_record_positive()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
BEGIN
IF NEW.quantity < 0 THEN
RAISE EXCEPTION '入库数量不能为负数: %', NEW.quantity;
END IF;
IF NEW.rolls < 0 THEN
RAISE EXCEPTION '入库匹数不能为负数: %', NEW.rolls;
END IF;
IF NEW.price_per_meter < 0 THEN
RAISE EXCEPTION '单价不能为负数: %', NEW.price_per_meter;
END IF;
RETURN NEW;
END;
$$;
CREATE OR REPLACE FUNCTION validate_payment_amount()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
DECLARE
v_expected_amount NUMERIC;
v_tolerance NUMERIC := 0.01;
BEGIN
v_expected_amount := NEW.quantity * NEW.price_per_meter;
IF ABS(NEW.amount - v_expected_amount) > v_tolerance THEN
RAISE EXCEPTION
'付款金额不一致:期望 %(数量 % × 单价 %),实际 %',
v_expected_amount, NEW.quantity, NEW.price_per_meter, NEW.amount;
END IF;
RETURN NEW;
END;
$$;
CREATE OR REPLACE FUNCTION validate_accounts_payable_totals()
RETURNS TRIGGER LANGUAGE plpgsql AS $$
DECLARE
v_items_total NUMERIC;
v_items_paid NUMERIC;
v_tolerance NUMERIC := 0.01;
BEGIN
SELECT
COALESCE(SUM(amount), 0),
COALESCE(SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END), 0)
INTO v_items_total, v_items_paid
FROM accounts_payable_items
WHERE accounts_payable_id = NEW.id;
IF ABS(NEW.total_amount - v_items_total) > v_tolerance THEN
RAISE EXCEPTION
'应付账款总金额不一致:表头 %, 明细合计 %',
NEW.total_amount, v_items_total;
END IF;
IF ABS(NEW.paid_amount - v_items_paid) > v_tolerance THEN
RAISE EXCEPTION
'应付账款已付金额不一致:表头 %, 明细合计 %',
NEW.paid_amount, v_items_paid;
END IF;
IF ABS(NEW.unpaid_amount - (v_items_total - v_items_paid)) > v_tolerance THEN
RAISE EXCEPTION
'应付账款未付金额不一致:表头 %, 计算值 %',
NEW.unpaid_amount, (v_items_total - v_items_paid);
END IF;
RETURN NEW;
END;
$$;