实现套餐生效条件覆盖与购买快照

This commit is contained in:
2026-07-22 20:51:12 +09:00
parent c7f8b4c702
commit 9818537239
30 changed files with 1092 additions and 149 deletions

View File

@@ -0,0 +1,32 @@
-- 为套餐使用记录增加购买时不可变计时条款快照;空值和零值保留为历史未快照标记。
ALTER TABLE tb_package_usage
ADD COLUMN expiry_base_snapshot VARCHAR(30) NOT NULL DEFAULT '',
ADD COLUMN calendar_type_snapshot VARCHAR(20) NOT NULL DEFAULT '',
ADD COLUMN duration_months_snapshot INTEGER NOT NULL DEFAULT 0,
ADD COLUMN duration_days_snapshot INTEGER NOT NULL DEFAULT 0;
COMMENT ON COLUMN tb_package_usage.expiry_base_snapshot IS '购买时生效条件快照,空字符串表示历史未快照';
COMMENT ON COLUMN tb_package_usage.calendar_type_snapshot IS '购买时周期类型快照,空字符串表示历史未快照';
COMMENT ON COLUMN tb_package_usage.duration_months_snapshot IS '购买时月数快照0表示未使用或历史未快照';
COMMENT ON COLUMN tb_package_usage.duration_days_snapshot IS '购买时天数快照0表示未使用或历史未快照';
-- 触发器只校验新记录及快照字段变更,历史空快照仍可更新状态等非快照字段。
CREATE OR REPLACE FUNCTION validate_package_usage_terms_snapshot()
RETURNS TRIGGER AS $$
BEGIN
IF NEW.expiry_base_snapshot NOT IN ('from_purchase', 'from_activation')
OR NOT (
(NEW.calendar_type_snapshot = 'natural_month' AND NEW.duration_months_snapshot > 0 AND NEW.duration_days_snapshot = 0)
OR (NEW.calendar_type_snapshot = 'by_day' AND NEW.duration_days_snapshot > 0 AND NEW.duration_months_snapshot = 0)
) THEN
RAISE EXCEPTION '套餐使用记录计时快照不完整或无效';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_validate_package_usage_terms_snapshot
BEFORE INSERT OR UPDATE OF expiry_base_snapshot, calendar_type_snapshot, duration_months_snapshot, duration_days_snapshot
ON tb_package_usage
FOR EACH ROW
EXECUTE FUNCTION validate_package_usage_terms_snapshot();