Files
yunhaifinance/backend/migrations/003_create_procurement_logistics_tables.sql
T

281 lines
10 KiB
SQL
Raw Normal View History

-- ============================================
-- 采购-付款-物流-退库一体化流程 - 数据库迁移脚本
-- 版本:v1.0
-- 日期:2026-04-07
-- 遵循设计方案:采购-付款-物流-退库一体化流程设计方案.md
-- ============================================
-- ============================================
-- 第一部分:创建新表
-- ============================================
-- 表1:跨境物流公司表 (logistics_companies)
-- 设计方案章节:9.9 跨境物流公司表
CREATE TABLE IF NOT EXISTS logistics_companies (
id SERIAL PRIMARY KEY,
code TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
address TEXT,
phone TEXT,
email TEXT,
quotation_description TEXT,
status TEXT DEFAULT 'active',
remark TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_logistics_companies_code ON logistics_companies(code);
CREATE INDEX IF NOT EXISTS idx_logistics_companies_status ON logistics_companies(status);
-- 表2:物流公司收款信息表 (logistics_company_payment_infos)
-- 设计方案章节:9.10 物流公司收款信息表
CREATE TABLE IF NOT EXISTS logistics_company_payment_infos (
id SERIAL PRIMARY KEY,
logistics_company_id INTEGER NOT NULL,
account_name TEXT,
account_number TEXT,
bank_name TEXT,
qr_code TEXT,
is_default INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (logistics_company_id) REFERENCES logistics_companies(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_lc_payment_infos_company ON logistics_company_payment_infos(logistics_company_id);
-- 表3:物流单表 (logistics_records)
-- 设计方案章节:9.4 物流单表
CREATE TABLE IF NOT EXISTS logistics_records (
id SERIAL PRIMARY KEY,
code TEXT UNIQUE NOT NULL,
purchase_order_id INTEGER NOT NULL,
ship_from TEXT DEFAULT 'Laos',
logistics_company_id INTEGER,
logistics_company TEXT,
tracking_number TEXT,
ship_date DATE,
ship_location TEXT,
estimated_arrival_date DATE,
customs_arrival_date DATE,
customs_clearance_date DATE,
use_hub INTEGER DEFAULT 0,
hub_arrival_date DATE,
hub_receiver TEXT,
hub_verified_quantity REAL,
second_ship_date DATE,
primary_freight REAL DEFAULT 0,
primary_freight_currency TEXT DEFAULT 'CNY',
primary_freight_status TEXT DEFAULT 'pending',
primary_freight_document TEXT,
secondary_freight REAL DEFAULT 0,
secondary_freight_currency TEXT DEFAULT 'LAK',
secondary_freight_status TEXT DEFAULT 'pending',
driver_phone TEXT,
cargo_weight REAL,
transport_distance REAL,
final_arrival_date DATE,
final_location TEXT,
status TEXT DEFAULT 'pending',
remark TEXT,
created_by TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id),
FOREIGN KEY (logistics_company_id) REFERENCES logistics_companies(id)
);
CREATE INDEX IF NOT EXISTS idx_logistics_records_code ON logistics_records(code);
CREATE INDEX IF NOT EXISTS idx_logistics_records_order ON logistics_records(purchase_order_id);
CREATE INDEX IF NOT EXISTS idx_logistics_records_status ON logistics_records(status);
CREATE INDEX IF NOT EXISTS idx_logistics_records_company ON logistics_records(logistics_company_id);
-- 表4:验收单表 (verification_records)
-- 设计方案章节:9.5 验收单表
CREATE TABLE IF NOT EXISTS verification_records (
id SERIAL PRIMARY KEY,
code TEXT UNIQUE NOT NULL,
purchase_order_id INTEGER NOT NULL,
logistics_record_id INTEGER,
verification_type TEXT DEFAULT 'direct',
verification_date DATE NOT NULL,
verifier TEXT NOT NULL,
items TEXT,
total_ordered REAL,
total_received REAL,
total_verified REAL,
total_rejected REAL DEFAULT 0,
project_id INTEGER,
storage_type TEXT,
status TEXT DEFAULT 'pending',
remark TEXT,
attachments TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id),
FOREIGN KEY (logistics_record_id) REFERENCES logistics_records(id),
FOREIGN KEY (project_id) REFERENCES projects(id)
);
CREATE INDEX IF NOT EXISTS idx_verification_records_code ON verification_records(code);
CREATE INDEX IF NOT EXISTS idx_verification_records_order ON verification_records(purchase_order_id);
CREATE INDEX IF NOT EXISTS idx_verification_records_status ON verification_records(status);
-- 表5:退库单表 (return_records)
-- 设计方案章节:9.6 退库单表
CREATE TABLE IF NOT EXISTS return_records (
id SERIAL PRIMARY KEY,
code TEXT UNIQUE NOT NULL,
project_id INTEGER NOT NULL,
return_type TEXT DEFAULT 'warehouse',
return_date DATE NOT NULL,
applicant TEXT NOT NULL,
items TEXT,
total_quantity REAL,
total_amount REAL,
cost_adjustment REAL DEFAULT 0,
refund_amount REAL DEFAULT 0,
status TEXT DEFAULT 'pending',
remark TEXT,
attachments TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (project_id) REFERENCES projects(id)
);
CREATE INDEX IF NOT EXISTS idx_return_records_code ON return_records(code);
CREATE INDEX IF NOT EXISTS idx_return_records_project ON return_records(project_id);
CREATE INDEX IF NOT EXISTS idx_return_records_status ON return_records(status);
-- 表6:材料价格历史表 (material_price_history)
-- 设计方案章节:9.7 材料价格历史表
CREATE TABLE IF NOT EXISTS material_price_history (
id SERIAL PRIMARY KEY,
product_id INTEGER NOT NULL,
purchase_order_id INTEGER,
supplier_id INTEGER,
supplier_country TEXT,
unit_price REAL NOT NULL,
currency TEXT DEFAULT 'CNY',
quantity REAL,
purchase_date DATE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(id),
FOREIGN KEY (purchase_order_id) REFERENCES purchase_orders(id),
FOREIGN KEY (supplier_id) REFERENCES suppliers(id)
);
CREATE INDEX IF NOT EXISTS idx_material_price_history_product ON material_price_history(product_id);
CREATE INDEX IF NOT EXISTS idx_material_price_history_supplier ON material_price_history(supplier_id);
CREATE INDEX IF NOT EXISTS idx_material_price_history_date ON material_price_history(purchase_date);
-- 表7:项目材料库存表 (project_material_inventory)
-- 设计方案章节:9.8 项目材料库存表
CREATE TABLE IF NOT EXISTS project_material_inventory (
id SERIAL PRIMARY KEY,
project_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
product_name TEXT,
unit TEXT,
purchased_quantity REAL DEFAULT 0,
received_quantity REAL DEFAULT 0,
used_quantity REAL DEFAULT 0,
returned_quantity REAL DEFAULT 0,
current_quantity REAL DEFAULT 0,
total_amount REAL DEFAULT 0,
average_price REAL DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (project_id) REFERENCES projects(id),
FOREIGN KEY (product_id) REFERENCES products(id),
UNIQUE(project_id, product_id)
);
CREATE INDEX IF NOT EXISTS idx_project_material_inventory_project ON project_material_inventory(project_id);
CREATE INDEX IF NOT EXISTS idx_project_material_inventory_product ON project_material_inventory(product_id);
-- ============================================
-- 第二部分:扩展现有表字段(SQLite不支持IF NOT EXISTS,需要手动处理)
-- ============================================
-- 扩展 purchase_orders 表
-- 设计方案章节:9.1 采购订单表
ALTER TABLE purchase_orders ADD COLUMN project_id INTEGER;
ALTER TABLE purchase_orders ADD COLUMN supplier_country TEXT DEFAULT 'Laos';
ALTER TABLE purchase_orders ADD COLUMN estimated_amount REAL DEFAULT 0;
ALTER TABLE purchase_orders ADD COLUMN paid_amount REAL DEFAULT 0;
ALTER TABLE purchase_orders ADD COLUMN contract_url TEXT;
ALTER TABLE purchase_orders ADD COLUMN quotation_url TEXT;
ALTER TABLE purchase_orders ADD COLUMN actual_delivery_date DATE;
ALTER TABLE purchase_orders ADD COLUMN remark TEXT;
-- 扩展 purchase_order_items 表
-- 设计方案章节:9.2 采购订单明细表
ALTER TABLE purchase_order_items ADD COLUMN received_quantity REAL DEFAULT 0;
ALTER TABLE purchase_order_items ADD COLUMN verified_quantity REAL DEFAULT 0;
-- 扩展 payment_plans 表
-- 设计方案章节:9.3 付款计划表
ALTER TABLE payment_plans ADD COLUMN stage TEXT;
ALTER TABLE payment_plans ADD COLUMN planned_date DATE;
ALTER TABLE payment_plans ADD COLUMN planned_amount REAL;
ALTER TABLE payment_plans ADD COLUMN planned_percentage REAL;
ALTER TABLE payment_plans ADD COLUMN actual_amount REAL DEFAULT 0;
ALTER TABLE payment_plans ADD COLUMN actual_date DATE;
ALTER TABLE payment_plans ADD COLUMN payment_request_id INTEGER;
ALTER TABLE payment_plans ADD COLUMN reminder_days INTEGER DEFAULT 3;
ALTER TABLE payment_plans ADD COLUMN remark TEXT;
-- 扩展 payment_requests 表
-- 设计方案章节:9.12 付款申请表扩展
ALTER TABLE payment_requests ADD COLUMN payment_type TEXT DEFAULT 'material';
ALTER TABLE payment_requests ADD COLUMN purchase_order_id INTEGER;
ALTER TABLE payment_requests ADD COLUMN logistics_company_id INTEGER;
ALTER TABLE payment_requests ADD COLUMN logistics_document_url TEXT;
ALTER TABLE payment_requests ADD COLUMN driver_phone TEXT;
ALTER TABLE payment_requests ADD COLUMN cargo_weight REAL;
ALTER TABLE payment_requests ADD COLUMN transport_distance REAL;
-- 扩展 suppliers 表
-- 设计方案章节:9.13 供应商表扩展
ALTER TABLE suppliers ADD COLUMN supply_category TEXT;
ALTER TABLE suppliers ADD COLUMN country TEXT;
ALTER TABLE suppliers ADD COLUMN address TEXT;
ALTER TABLE suppliers ADD COLUMN phone TEXT;
ALTER TABLE suppliers ADD COLUMN email TEXT;
ALTER TABLE suppliers ADD COLUMN status TEXT DEFAULT 'active';
-- 扩展 purchase_requests 表
-- 设计方案章节:9.14 采购申请表扩展
ALTER TABLE purchase_requests ADD COLUMN expected_date DATE;
-- 创建新索引
CREATE INDEX IF NOT EXISTS idx_purchase_orders_project ON purchase_orders(project_id);
CREATE INDEX IF NOT EXISTS idx_purchase_orders_supplier_country ON purchase_orders(supplier_country);
CREATE INDEX IF NOT EXISTS idx_payment_requests_type ON payment_requests(payment_type);
CREATE INDEX IF NOT EXISTS idx_payment_requests_order ON payment_requests(purchase_order_id);
CREATE INDEX IF NOT EXISTS idx_suppliers_country ON suppliers(country);
CREATE INDEX IF NOT EXISTS idx_suppliers_status ON suppliers(status);