71 lines
2.7 KiB
MySQL
Raw Normal View History

-- CRM tables in PostgreSQL (mirrors MySQL crm_* schema for CrmRepo compatibility)
CREATE TABLE IF NOT EXISTS crm_tenant (
id BIGSERIAL PRIMARY KEY,
tenant_id VARCHAR(32) NOT NULL UNIQUE,
tenant_name VARCHAR(100) NOT NULL,
tenant_code VARCHAR(64) NOT NULL DEFAULT '' UNIQUE,
status SMALLINT NOT NULL DEFAULT 1,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS crm_tenant_user (
id BIGSERIAL PRIMARY KEY,
tenant_user_id VARCHAR(32) NOT NULL UNIQUE,
tenant_id VARCHAR(32) NOT NULL,
user_id VARCHAR(32) NOT NULL,
is_primary SMALLINT NOT NULL DEFAULT 1,
status SMALLINT NOT NULL DEFAULT 1,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
UNIQUE (tenant_id, user_id)
);
CREATE INDEX IF NOT EXISTS idx_crm_tenant_user_uid ON crm_tenant_user(user_id);
CREATE TABLE IF NOT EXISTS crm_tenant_relationship (
id BIGSERIAL PRIMARY KEY,
relationship_id VARCHAR(40) NOT NULL UNIQUE,
owner_tenant_id VARCHAR(32) NOT NULL,
from_tenant_id VARCHAR(32) NOT NULL,
to_tenant_id VARCHAR(32) NOT NULL,
relation_type VARCHAR(32) NOT NULL,
status SMALLINT NOT NULL DEFAULT 1,
valid_from TIMESTAMP NOT NULL DEFAULT NOW(),
valid_to TIMESTAMP NULL,
source VARCHAR(32) NOT NULL DEFAULT 'manual',
created_by VARCHAR(32) NOT NULL DEFAULT '',
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
CHECK (from_tenant_id <> to_tenant_id)
);
CREATE UNIQUE INDEX IF NOT EXISTS uk_crm_rel_unique
ON crm_tenant_relationship(owner_tenant_id, from_tenant_id, to_tenant_id, relation_type, valid_from);
CREATE INDEX IF NOT EXISTS idx_crm_rel_from ON crm_tenant_relationship(owner_tenant_id, from_tenant_id, status);
CREATE INDEX IF NOT EXISTS idx_crm_rel_to ON crm_tenant_relationship(owner_tenant_id, to_tenant_id, status);
CREATE TABLE IF NOT EXISTS crm_tenant_relationship_history (
id BIGSERIAL PRIMARY KEY,
history_id VARCHAR(40) NOT NULL UNIQUE,
relationship_id VARCHAR(40) NOT NULL,
change_type VARCHAR(32) NOT NULL,
before_json JSONB NULL,
after_json JSONB NULL,
changed_by VARCHAR(32) NOT NULL DEFAULT '',
changed_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_crm_rel_hist ON crm_tenant_relationship_history(relationship_id, changed_at DESC);
-- Seed
INSERT INTO crm_tenant (tenant_id, tenant_name, tenant_code, status)
VALUES ('t_default_001', '默认租户', 'DEFAULT', 1)
ON CONFLICT (tenant_id) DO NOTHING;
INSERT INTO crm_tenant_user (tenant_user_id, tenant_id, user_id, is_primary, status)
VALUES ('tu_admin_001', 't_default_001', 'u_admin_001', 1, 1)
ON CONFLICT (tenant_id, user_id) DO NOTHING;