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

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,6 @@
-- 回滚套餐分配生效条件覆盖字段及其枚举约束。
ALTER TABLE tb_shop_package_allocation
DROP CONSTRAINT IF EXISTS chk_shop_package_allocation_expiry_base_override;
ALTER TABLE tb_shop_package_allocation
DROP COLUMN IF EXISTS expiry_base_override;

View File

@@ -0,0 +1,9 @@
-- 为套餐分配增加可选生效条件覆盖NULL 表示跟随套餐默认值。
ALTER TABLE tb_shop_package_allocation
ADD COLUMN expiry_base_override VARCHAR(30);
COMMENT ON COLUMN tb_shop_package_allocation.expiry_base_override IS '到期时间基准覆盖NULL表示跟随套餐默认值';
ALTER TABLE tb_shop_package_allocation
ADD CONSTRAINT chk_shop_package_allocation_expiry_base_override
CHECK (expiry_base_override IS NULL OR expiry_base_override IN ('from_purchase', 'from_activation'));

View File

@@ -0,0 +1,9 @@
-- 回滚套餐使用记录的购买计时条款快照字段。
DROP TRIGGER IF EXISTS trg_validate_package_usage_terms_snapshot ON tb_package_usage;
DROP FUNCTION IF EXISTS validate_package_usage_terms_snapshot();
ALTER TABLE tb_package_usage
DROP COLUMN IF EXISTS duration_days_snapshot,
DROP COLUMN IF EXISTS duration_months_snapshot,
DROP COLUMN IF EXISTS calendar_type_snapshot,
DROP COLUMN IF EXISTS expiry_base_snapshot;

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();