Files
KCGL/db_migrations/unify_approval_timezone.sql
yueli 2045a89330 feat(db): 审批单据时间口径统一 + 补注册 scrap_selection 权限
unify_approval_timezone.sql:
  · scrap_approval 的 4 个时间列由 timestamptz 改为 timestamp without time zone,
    与 outbound/borrow 对齐(该表当时无业务数据,转换零损失);
  · 三张审批表 created_at/updated_at 的 DB 默认值由 UTC 的 now()/CURRENT_TIMESTAMP
    统一为 timezone('Asia/Shanghai', now()),杜绝绕过 ORM 的写入偏 8 小时。

add_scrap_selection_perm.sql:
  GET /scrap/scan 一直声明需要 scrap_selection,但该权限码从未写入
  sys_element / sys_role_permission,精确匹配与前缀展开匹配全部落空,
  导致除 SUPER_ADMIN 外没有任何角色能调用扫码接口。现补注册,
  并授予所有已持有 scrap_execute(按单报废执行)的角色。
2026-09-10 10:14:19 +08:00

44 lines
2.6 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================================================
-- 审批类单据时间口径统一(全部落到 naive 北京时间)
--
-- 背景:
-- 1) 容器内 PostgreSQL 时区为 Etc/UTC,库级默认 now() / CURRENT_TIMESTAMP 均为 UTC;
-- 2) scrap_approval 原先用 timestamptz 列 + tz-aware Python 值,而
-- outbound_approval / borrow_approval 用 timestamp without time zone 列;
-- 三张表口径不一致,且 outbound/borrow 的 DB 默认值 CURRENT_TIMESTAMP 是 UTC,
-- 一旦有绕过 ORM 的写入就会产生 8 小时偏差。
--
-- 目标:
-- · 三张审批单表的 created_at / updated_at 统一为 timestamp without time zone;
-- · DB 侧默认值统一为 timezone('Asia/Shanghai', now()),即北京时间;
-- · 应用层(SQLAlchemy 模型)始终显式传 beijing_time(),不依赖 DB 默认值。
--
-- 执行: docker exec -i inventory_db psql -U test -d inventory_system < 本文件
-- =============================================================================
BEGIN;
-- -----------------------------------------------------------------------------
-- 1) scrap_approval:timestamptz -> timestamp without time zone
-- (该表此前无业务数据,转换不会造成既有时间语义漂移;
-- ALTER 后原 timestamptz 值会按会话时区 UTC 取钟面值,如需保留请先备份)
-- -----------------------------------------------------------------------------
ALTER TABLE scrap_approval
ALTER COLUMN created_at TYPE timestamp without time zone,
ALTER COLUMN updated_at TYPE timestamp without time zone,
ALTER COLUMN approved_at TYPE timestamp without time zone,
ALTER COLUMN executed_at TYPE timestamp without time zone;
ALTER TABLE scrap_approval ALTER COLUMN created_at SET DEFAULT timezone('Asia/Shanghai', now());
ALTER TABLE scrap_approval ALTER COLUMN updated_at SET DEFAULT timezone('Asia/Shanghai', now());
-- -----------------------------------------------------------------------------
-- 2) outbound_approval / borrow_approval:DB 默认值由 UTC 改为北京时间
-- 列类型本就是 naive,无需转换
-- -----------------------------------------------------------------------------
ALTER TABLE outbound_approval ALTER COLUMN created_at SET DEFAULT timezone('Asia/Shanghai', now());
ALTER TABLE outbound_approval ALTER COLUMN updated_at SET DEFAULT timezone('Asia/Shanghai', now());
ALTER TABLE borrow_approval ALTER COLUMN created_at SET DEFAULT timezone('Asia/Shanghai', now());
ALTER TABLE borrow_approval ALTER COLUMN updated_at SET DEFAULT timezone('Asia/Shanghai', now());
COMMIT;