#!/bin/bash # refresh_materialized_views.sh # 数据导入后刷新所有物化视图并更新费用物化表 # 用法: bash scripts/refresh_materialized_views.sh [YYYY-MM-DD] # 示例: bash scripts/refresh_materialized_views.sh 2026-04-01 set -e MONTH_START="${1:-$(date -u +%Y-%m-01)}" DB_HOST="${DB_HOST:-localhost}" DB_PORT="${DB_PORT:-5432}" DB_USER="${DB_USER:-freedak}" DB_NAME="${DB_NAME:-bill_query}" echo "==========================================" echo " 刷新物化视图" echo " 月份: ${MONTH_START}" echo " 数据库: ${DB_NAME}@${DB_HOST}:${DB_PORT}" echo "==========================================" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" <= '${MONTH_START}' AND closed_at < ('${MONTH_START}'::date + interval '1 month') UNION ALL SELECT 'risk_rating', count(*), round(sum(received)::numeric,2) FROM analytics.mv_store_risk_rating_monthly WHERE month_start = '${MONTH_START}' UNION ALL SELECT 'theo_cost', count(*), round(sum(sales_received)::numeric,2) FROM analytics.mv_store_theoretical_actual_cost_monthly WHERE month_start = '${MONTH_START}' UNION ALL SELECT 'op_expense', count(*), round(sum(received)::numeric,2) FROM analytics.mv_store_operating_expense_monthly WHERE report_month = '${MONTH_START}'; SELECT '=== 门店覆盖检查 ===' AS header; SELECT r.store_code, r.store_name, r.received, CASE WHEN e.sales_store_code IS NOT NULL THEN '有费用' ELSE '无费用' END AS expense_status FROM analytics.mv_store_risk_rating_monthly r LEFT JOIN analytics.mv_store_operating_expense_monthly e ON r.store_code = e.sales_store_code AND e.report_month = '${MONTH_START}' WHERE r.month_start = '${MONTH_START}' AND r.received > 0 AND e.sales_store_code IS NULL ORDER BY r.received DESC; EOF echo "==========================================" echo " 刷新完成!" echo "=========================================="