115 lines
3.3 KiB
PL/PgSQL
115 lines
3.3 KiB
PL/PgSQL
-- ============================================
|
|
-- 此文件由 Meoo Cloud 自动生成,请勿修改
|
|
-- This file is auto-generated by Meoo Cloud, DO NOT MODIFY
|
|
-- ============================================
|
|
|
|
|
|
CREATE OR REPLACE VIEW v_plan_quantity_check AS
|
|
SELECT
|
|
p.id as plan_id,
|
|
p.plan_code,
|
|
p.status,
|
|
p.completed_quantity,
|
|
COALESCE(SUM(ir.quantity), 0) as inventory_total,
|
|
p.completed_quantity - COALESCE(SUM(ir.quantity), 0) as difference,
|
|
CASE
|
|
WHEN ABS(p.completed_quantity - COALESCE(SUM(ir.quantity), 0)) <= 0.01 THEN '✓ 一致'
|
|
ELSE '✗ 不一致'
|
|
END as check_result
|
|
FROM production_plans p
|
|
LEFT JOIN inventory_records ir ON ir.plan_id = p.id
|
|
GROUP BY p.id, p.plan_code, p.status, p.completed_quantity;
|
|
|
|
CREATE OR REPLACE VIEW v_payment_check AS
|
|
SELECT
|
|
id as payment_id,
|
|
plan_id,
|
|
quantity,
|
|
price_per_meter,
|
|
amount,
|
|
quantity * price_per_meter as expected_amount,
|
|
amount - (quantity * price_per_meter) as difference,
|
|
CASE
|
|
WHEN ABS(amount - (quantity * price_per_meter)) <= 0.01 THEN '✓ 一致'
|
|
ELSE '✗ 不一致'
|
|
END as check_result
|
|
FROM payments;
|
|
|
|
CREATE OR REPLACE VIEW v_accounts_payable_check AS
|
|
SELECT
|
|
ap.id as ap_id,
|
|
ap.plan_id,
|
|
ap.total_amount,
|
|
ap.paid_amount,
|
|
ap.unpaid_amount,
|
|
COALESCE(SUM(api.amount), 0) as items_total,
|
|
COALESCE(SUM(CASE WHEN api.status = 'paid' THEN api.amount ELSE 0 END), 0) as items_paid,
|
|
ap.total_amount - COALESCE(SUM(api.amount), 0) as total_diff,
|
|
ap.paid_amount - COALESCE(SUM(CASE WHEN api.status = 'paid' THEN api.amount ELSE 0 END), 0) as paid_diff,
|
|
CASE
|
|
WHEN ABS(ap.total_amount - COALESCE(SUM(api.amount), 0)) <= 0.01
|
|
AND ABS(ap.paid_amount - COALESCE(SUM(CASE WHEN api.status = 'paid' THEN api.amount ELSE 0 END), 0)) <= 0.01
|
|
THEN '✓ 一致'
|
|
ELSE '✗ 不一致'
|
|
END as check_result
|
|
FROM accounts_payable ap
|
|
LEFT JOIN accounts_payable_items api ON api.accounts_payable_id = ap.id
|
|
GROUP BY ap.id, ap.plan_id, ap.total_amount, ap.paid_amount, ap.unpaid_amount;
|
|
|
|
CREATE OR REPLACE FUNCTION run_data_integrity_check()
|
|
RETURNS TABLE (
|
|
check_type TEXT,
|
|
total_records BIGINT,
|
|
inconsistent_records BIGINT,
|
|
error_rate NUMERIC,
|
|
status TEXT
|
|
) LANGUAGE plpgsql AS $$
|
|
BEGIN
|
|
RETURN QUERY
|
|
SELECT
|
|
'plan_quantity'::TEXT,
|
|
COUNT(*)::BIGINT,
|
|
SUM(CASE WHEN check_result = '✗ 不一致' THEN 1 ELSE 0 END)::BIGINT,
|
|
ROUND(
|
|
SUM(CASE WHEN check_result = '✗ 不一致' THEN 1 ELSE 0 END)::NUMERIC /
|
|
NULLIF(COUNT(*), 0) * 100, 4
|
|
),
|
|
CASE
|
|
WHEN SUM(CASE WHEN check_result = '✗ 不一致' THEN 1 ELSE 0 END) = 0 THEN 'PASS'
|
|
ELSE 'FAIL'
|
|
END
|
|
FROM v_plan_quantity_check;
|
|
|
|
RETURN QUERY
|
|
SELECT
|
|
'payment_amount'::TEXT,
|
|
COUNT(*)::BIGINT,
|
|
SUM(CASE WHEN check_result = '✗ 不一致' THEN 1 ELSE 0 END)::BIGINT,
|
|
ROUND(
|
|
SUM(CASE WHEN check_result = '✗ 不一致' THEN 1 ELSE 0 END)::NUMERIC /
|
|
NULLIF(COUNT(*), 0) * 100, 4
|
|
),
|
|
CASE
|
|
WHEN SUM(CASE WHEN check_result = '✗ 不一致' THEN 1 ELSE 0 END) = 0 THEN 'PASS'
|
|
ELSE 'FAIL'
|
|
END
|
|
FROM v_payment_check;
|
|
|
|
RETURN QUERY
|
|
SELECT
|
|
'accounts_payable'::TEXT,
|
|
COUNT(*)::BIGINT,
|
|
SUM(CASE WHEN check_result = '✗ 不一致' THEN 1 ELSE 0 END)::BIGINT,
|
|
ROUND(
|
|
SUM(CASE WHEN check_result = '✗ 不一致' THEN 1 ELSE 0 END)::NUMERIC /
|
|
NULLIF(COUNT(*), 0) * 100, 4
|
|
),
|
|
CASE
|
|
WHEN SUM(CASE WHEN check_result = '✗ 不一致' THEN 1 ELSE 0 END) = 0 THEN 'PASS'
|
|
ELSE 'FAIL'
|
|
END
|
|
FROM v_accounts_payable_check;
|
|
END;
|
|
$$;
|
|
|