205 lines
9.2 KiB
PL/PgSQL
205 lines
9.2 KiB
PL/PgSQL
-- ============================================================
|
|
-- V3__user_extension.sql
|
|
-- 用户权限体系扩展脚本
|
|
-- 创建部门表、企业员工扩展表、项目员工扩展表、业主扩展表、房屋表、业主房屋绑定表
|
|
-- 同时扩展 auth_user 和 auth_role 表
|
|
-- ============================================================
|
|
|
|
BEGIN;
|
|
|
|
-- ============================================================
|
|
-- 1. 扩展 auth_user 表 - 添加用户类型和部门字段
|
|
-- ============================================================
|
|
|
|
ALTER TABLE auth_user ADD COLUMN IF NOT EXISTS user_type VARCHAR(20) DEFAULT 'ENTERPRISE';
|
|
ALTER TABLE auth_user ADD COLUMN IF NOT EXISTS dept_id UUID;
|
|
|
|
-- ============================================================
|
|
-- 2. 创建部门表
|
|
-- ============================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS dept (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
parent_id UUID REFERENCES dept(id) ON DELETE SET NULL,
|
|
dept_name VARCHAR(100) NOT NULL,
|
|
dept_code VARCHAR(50) UNIQUE,
|
|
leader_id UUID REFERENCES auth_user(id) ON DELETE SET NULL,
|
|
sort_order INT DEFAULT 0,
|
|
status VARCHAR(20) DEFAULT 'ACTIVE',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_dept_parent ON dept(parent_id);
|
|
|
|
-- ============================================================
|
|
-- 3. 创建企业员工扩展表
|
|
-- ============================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS enterprise_user (
|
|
user_id UUID PRIMARY KEY REFERENCES auth_user(id) ON DELETE CASCADE,
|
|
employee_no VARCHAR(50) UNIQUE,
|
|
dept_id UUID REFERENCES dept(id) ON DELETE SET NULL,
|
|
position VARCHAR(100),
|
|
entry_date DATE,
|
|
user_category VARCHAR(20) DEFAULT 'ENTERPRISE',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_enterprise_user_dept ON enterprise_user(dept_id);
|
|
|
|
-- ============================================================
|
|
-- 4. 创建项目员工扩展表
|
|
-- ============================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS project_staff (
|
|
user_id UUID PRIMARY KEY REFERENCES auth_user(id) ON DELETE CASCADE,
|
|
project_id UUID NOT NULL,
|
|
staff_type VARCHAR(20) DEFAULT 'GENERAL',
|
|
shift_type VARCHAR(20) DEFAULT 'DAY',
|
|
leader_id UUID REFERENCES auth_user(id) ON DELETE SET NULL,
|
|
assignment_status VARCHAR(20) DEFAULT 'ASSIGNED',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_project_staff_project ON project_staff(project_id);
|
|
CREATE INDEX IF NOT EXISTS idx_project_staff_user ON project_staff(user_id);
|
|
|
|
-- ============================================================
|
|
-- 5. 创建业主扩展表
|
|
-- ============================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS resident (
|
|
user_id UUID PRIMARY KEY REFERENCES auth_user(id) ON DELETE CASCADE,
|
|
id_card VARCHAR(18),
|
|
resident_type VARCHAR(20) DEFAULT 'OWNER',
|
|
verification_status VARCHAR(20) DEFAULT 'UNVERIFIED',
|
|
verified_at TIMESTAMP,
|
|
verified_by UUID REFERENCES auth_user(id),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_resident_type ON resident(resident_type);
|
|
|
|
-- ============================================================
|
|
-- 6. 创建房屋表
|
|
-- ============================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS space (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
project_id UUID NOT NULL,
|
|
building VARCHAR(50) NOT NULL,
|
|
unit VARCHAR(20) NOT NULL,
|
|
room_no VARCHAR(20) NOT NULL,
|
|
space_type VARCHAR(20) DEFAULT 'RESIDENTIAL',
|
|
floor INT,
|
|
unit_area DECIMAL(10, 2),
|
|
status VARCHAR(20) DEFAULT 'ACTIVE',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE(project_id, building, unit, room_no)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_space_project ON space(project_id);
|
|
|
|
-- ============================================================
|
|
-- 7. 创建业主房屋绑定表
|
|
-- ============================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS resident_space (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
user_id UUID NOT NULL REFERENCES auth_user(id) ON DELETE CASCADE,
|
|
space_id UUID NOT NULL REFERENCES space(id) ON DELETE CASCADE,
|
|
relation_type VARCHAR(20) DEFAULT 'OWNER',
|
|
binding_status VARCHAR(20) DEFAULT 'ACTIVE',
|
|
start_date DATE,
|
|
end_date DATE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_resident_space_user ON resident_space(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_resident_space_space ON resident_space(space_id);
|
|
|
|
-- ============================================================
|
|
-- 8. 扩展 auth_user_role 表 - 支持项目级角色
|
|
-- ============================================================
|
|
|
|
ALTER TABLE auth_user_role ADD COLUMN IF NOT EXISTS project_id UUID;
|
|
ALTER TABLE auth_user_role ADD COLUMN IF NOT EXISTS scope VARCHAR(20) DEFAULT 'ENTERPRISE';
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_user_role_scope ON auth_user_role(project_id, scope);
|
|
|
|
-- ============================================================
|
|
-- 9. 更新 auth_role 表 - 增强角色类型
|
|
-- ============================================================
|
|
|
|
ALTER TABLE auth_role ADD COLUMN IF NOT EXISTS scope VARCHAR(20) DEFAULT 'ENTERPRISE';
|
|
ALTER TABLE auth_role ADD COLUMN IF NOT EXISTS project_id UUID;
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_role_scope ON auth_role(scope);
|
|
|
|
-- ============================================================
|
|
-- 10. 更新现有数据
|
|
-- ============================================================
|
|
|
|
UPDATE auth_user SET user_type = 'ENTERPRISE' WHERE user_type IS NULL;
|
|
UPDATE auth_role SET type = 'SYSTEM', scope = 'ENTERPRISE' WHERE type IS NULL;
|
|
|
|
COMMIT;
|
|
|
|
-- ============================================================
|
|
-- 添加表和列注释(单独执行)
|
|
-- ============================================================
|
|
|
|
COMMENT ON TABLE dept IS '部门表';
|
|
COMMENT ON COLUMN dept.parent_id IS '上级部门ID';
|
|
COMMENT ON COLUMN dept.dept_name IS '部门名称';
|
|
COMMENT ON COLUMN dept.dept_code IS '部门编码';
|
|
COMMENT ON COLUMN dept.leader_id IS '部门负责人ID';
|
|
|
|
COMMENT ON TABLE enterprise_user IS '企业员工扩展表';
|
|
COMMENT ON COLUMN enterprise_user.employee_no IS '员工工号';
|
|
COMMENT ON COLUMN enterprise_user.dept_id IS '所属部门';
|
|
COMMENT ON COLUMN enterprise_user.position IS '职位';
|
|
COMMENT ON COLUMN enterprise_user.entry_date IS '入职日期';
|
|
COMMENT ON COLUMN enterprise_user.user_category IS '员工类别: ENTERPRISE-职能员工, MANAGEMENT-管理岗';
|
|
|
|
COMMENT ON TABLE project_staff IS '项目员工扩展表';
|
|
COMMENT ON COLUMN project_staff.project_id IS '所属项目';
|
|
COMMENT ON COLUMN project_staff.staff_type IS '员工类型: SECURITY-保安, CLEANING-保洁, GARDEN-绿化, MAINTENANCE-维修, CUSTOMER_SERVICE-客服, GENERAL-普通';
|
|
COMMENT ON COLUMN project_staff.shift_type IS '班次类型: DAY-白班, NIGHT-夜班, ROTATION-轮班';
|
|
COMMENT ON COLUMN project_staff.leader_id IS '班组长ID';
|
|
COMMENT ON COLUMN project_staff.assignment_status IS '在岗状态: ASSIGNED-在岗, ON_LEAVE-休假, TRANSFERRED-调岗';
|
|
|
|
COMMENT ON TABLE resident IS '业主住户扩展表';
|
|
COMMENT ON COLUMN resident.id_card IS '身份证号';
|
|
COMMENT ON COLUMN resident.resident_type IS '住户类型: OWNER-业主, FAMILY-家庭成员, TENANT-租户';
|
|
COMMENT ON COLUMN resident.verification_status IS '认证状态: UNVERIFIED-未认证, PENDING-待审核, VERIFIED-已认证, REJECTED-已拒绝';
|
|
COMMENT ON COLUMN resident.verified_by IS '认证人ID';
|
|
|
|
COMMENT ON TABLE space IS '房屋表';
|
|
COMMENT ON COLUMN space.project_id IS '所属项目';
|
|
COMMENT ON COLUMN space.building IS '楼栋';
|
|
COMMENT ON COLUMN space.unit IS '单元';
|
|
COMMENT ON COLUMN space.room_no IS '房号';
|
|
COMMENT ON COLUMN space.space_type IS '房屋类型: RESIDENTIAL-住宅, COMMERCIAL-商办';
|
|
COMMENT ON COLUMN space.floor IS '楼层';
|
|
COMMENT ON COLUMN space.unit_area IS '建筑面积';
|
|
|
|
COMMENT ON TABLE resident_space IS '业主房屋绑定表';
|
|
COMMENT ON COLUMN resident_space.user_id IS '用户ID';
|
|
COMMENT ON COLUMN resident_space.space_id IS '房屋ID';
|
|
COMMENT ON COLUMN resident_space.relation_type IS '关系类型: OWNER-业主, FAMILY-家属, TENANT-租户';
|
|
COMMENT ON COLUMN resident_space.binding_status IS '绑定状态: PENDING-待生效, ACTIVE-生效, EXPIRED-已过期, CANCELLED-已解绑';
|
|
COMMENT ON COLUMN resident_space.start_date IS '绑定开始日期';
|
|
COMMENT ON COLUMN resident_space.end_date IS '绑定结束日期';
|
|
|
|
COMMENT ON COLUMN auth_user.user_type IS '用户类型: ENTERPRISE-企业员工, PROJECT_STAFF-项目员工, RESIDENT-业主, CUSTOMER-客户';
|
|
COMMENT ON COLUMN auth_user.dept_id IS '所属部门ID';
|
|
COMMENT ON COLUMN auth_user_role.project_id IS '项目级角色的所属项目';
|
|
COMMENT ON COLUMN auth_user_role.scope IS '角色生效范围: ENTERPRISE-企业级, PROJECT-项目级, RESIDENT-住户级';
|
|
COMMENT ON COLUMN auth_role.scope IS '角色生效范围: ENTERPRISE-企业级, PROJECT-项目级';
|
|
COMMENT ON COLUMN auth_role.project_id IS '项目级角色的所属项目';
|