# Plan 04-01 Summary: facade 层迁移至 spiderJobs.platforms.* + asyncio.to_thread 桥接

**Status:** Complete
**Tasks:** 3/3
**Commit:** 见 04 总提交

## 架构修正（用户反馈）

**初始方案**：facade 直接 import `spiderJobs.platforms.*` — **错误**，spiderJobs 是独立运行脚本

**修正后正确架构：**
```
crawler_core  ←  共享底层库
    ↑        ↑
spiderJobs  app/services/crawler/_boss/job51/zhilian_api/client/sign
(独立脚本)  (后端私有实现层)
              ↑
           boss.py / qcwy.py / zhilian.py（facade）
```

## What was built

将 `app/services/crawler/` 三个 facade 文件从调用内部私有复制文件改为直接调用 `spiderJobs.platforms.*`：

| 文件 | 旧导入 | 新导入 |
|------|--------|--------|
| `boss.py` | `_boss_api/_boss_client/_boss_sign` | `spiderJobs.platforms.boss.{api,client,sign}` |
| `qcwy.py` | `_job51_api/_job51_client` | `spiderJobs.platforms.job51.{api,client}` |
| `zhilian.py` | `_zhilian_api/_zhilian_client/_zhilian_sign` | `spiderJobs.platforms.zhilian.{api,client,sign}` |

每个 Service 类新增 4 个 async 方法（`asyncio.to_thread` 桥接，满足 ARCH-06）：
- `BossService`: `async_get_job_detail / async_get_company_detail / async_get_company_jobs / async_search_jobs`
- `QcwyService`: `async_get_job_detail / async_get_company_info / async_get_company_jobs / async_search_jobs`
- `ZhilianService`: `async_get_job_detail / async_get_company_detail / async_get_company_jobs / async_search_jobs`

## Verification

```
python -c "from app.services.crawler.boss import BossService ..." → ✅
grep "asyncio.to_thread" ... → ✅ 存在
pytest tests/ -v → 106 passed ✅
```

## Self-Check: PASSED
