# 数据库迁移说明

## 工单处理过程记录系统迁移

### 新增表：`work_order_process_history`

```sql
CREATE TABLE IF NOT EXISTS work_order_process_history (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    work_order_id INTEGER NOT NULL,
    processor_name VARCHAR(100) NOT NULL,
    processor_role VARCHAR(50),
    processor_region VARCHAR(50),
    process_content TEXT NOT NULL,
    action_type VARCHAR(50) NOT NULL,
    previous_status VARCHAR(50),
    new_status VARCHAR(50),
    assigned_module VARCHAR(50),
    process_time DATETIME NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (work_order_id) REFERENCES work_orders(id)
);

CREATE INDEX idx_process_history_workorder ON work_order_process_history(work_order_id);
CREATE INDEX idx_process_history_time ON work_order_process_history(process_time);
```

### WorkOrder表新增字段

如果使用SQLite，可以使用以下SQL添加字段：

```sql
-- 注意：SQLite不支持直接ALTER TABLE添加多个列，需要逐个添加

ALTER TABLE work_orders ADD COLUMN assigned_module VARCHAR(50);
ALTER TABLE work_orders ADD COLUMN module_owner VARCHAR(100);
ALTER TABLE work_orders ADD COLUMN dispatcher VARCHAR(100);
ALTER TABLE work_orders ADD COLUMN dispatch_time DATETIME;
ALTER TABLE work_orders ADD COLUMN region VARCHAR(50);
```

### 使用Python脚本迁移（推荐）

创建迁移脚本 `migrate_process_history.py`：

```python
# -*- coding: utf-8 -*-
"""
数据库迁移脚本：添加工单处理过程记录表和相关字段
"""
from src.core.database import db_manager
from src.core.models import Base, WorkOrderProcessHistory
from sqlalchemy import text

def migrate_database():
    """执行数据库迁移"""
    try:
        with db_manager.get_session() as session:
            # 创建新表
            WorkOrderProcessHistory.__table__.create(db_manager.engine, checkfirst=True)

            # 检查并添加新字段（SQLite需要特殊处理）
            try:
                # 尝试添加字段（如果已存在会报错，可以忽略）
                session.execute(text("ALTER TABLE work_orders ADD COLUMN assigned_module VARCHAR(50)"))
            except Exception as e:
                print(f"字段 assigned_module 可能已存在: {e}")

            try:
                session.execute(text("ALTER TABLE work_orders ADD COLUMN module_owner VARCHAR(100)"))
            except Exception as e:
                print(f"字段 module_owner 可能已存在: {e}")

            try:
                session.execute(text("ALTER TABLE work_orders ADD COLUMN dispatcher VARCHAR(100)"))
            except Exception as e:
                print(f"字段 dispatcher 可能已存在: {e}")

            try:
                session.execute(text("ALTER TABLE work_orders ADD COLUMN dispatch_time DATETIME"))
            except Exception as e:
                print(f"字段 dispatch_time 可能已存在: {e}")

            try:
                session.execute(text("ALTER TABLE work_orders ADD COLUMN region VARCHAR(50)"))
            except Exception as e:
                print(f"字段 region 可能已存在: {e}")

            session.commit()
            print("数据库迁移完成！")

    except Exception as e:
        print(f"数据库迁移失败: {e}")
        raise

if __name__ == "__main__":
    migrate_database()
```

### 执行迁移

运行迁移脚本：
```bash
python migrate_process_history.py
```

或者直接在Python交互式环境中执行：
```python
from migrate_process_history import migrate_database
migrate_database()
```

## 注意事项

1. **备份数据库**：在执行迁移前，请务必备份现有数据库
2. **SQLite限制**：如果使用SQLite，ALTER TABLE添加列的操作在某些情况下可能失败，如果字段已存在会报错
3. **数据迁移**：现有工单的处理过程历史记录（存储在`resolution`字段中的）不会自动迁移到新表，需要手动处理
4. **索引优化**：新表已包含必要的索引，如果数据量大可以考虑添加更多索引

