4.5 KiB
4.5 KiB
phase, plan, wave, title, depends_on, files_modified, autonomous, requirements
| phase | plan | wave | title | depends_on | files_modified | autonomous | requirements | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 5 | 2 | 2 | 公司招聘信息 channel 区分(DATA-04)+ 推送 API 确认(DATA-02) |
|
|
true |
|
Phase 5 Plan 02: company_job channel 区分(DATA-04 + DATA-02 确认)
Objective
DATA-02(确认已完成)
app/api/v1/job/job.py 已有三个推送接收端点:
POST /data/store(单条)POST /data/batch(批量同步)POST /data/batch-async(批量异步)
全部走 IngestService,channel 和 platform 由调用方在请求体中指定。
spiderJobs 只需调用这些 API,DATA-02 不需要后端改动。
DATA-04(需要修复)
company_jobs_sync.py 目前调用 router.store_batch(source, "mini", "job", jobs),
公司职位和搜索职位混用同一个 channel="mini",无法区分来源。
修复:
ChannelType枚举加COMPANY = "company"值- 各平台
ingest/configs/*.py注册channel="company"的配置 company_jobs_sync.py调用改为channel="company"
Must Haves
app/schemas/ingest.py中ChannelType枚举加COMPANY = "company"ingest/configs/boss.py注册channel="company", data_type="job"配置(共用 boss_job 表)ingest/configs/qcwy.py同样注册channel="company"配置ingest/configs/zhilian.py同样注册channel="company"配置company_jobs_sync.py中store_batch(source, "mini", "job", jobs)→store_batch(source, "company", "job", jobs)pipenv run python -c "from app.services.ingest import IngestService; print(IngestService.get_registry_info())"显示 channel=company 条目- 全量回归
pytest tests/无失败
Wave 2(依赖 Plan 01 完成)
Task 2.1: 更新 ChannelType 枚举
<read_first>
app/schemas/ingest.py(需读取确认当前 ChannelType 定义) </read_first>
Task 2.2: 各平台 configs 注册 channel="company" 配置
<read_first>
app/services/ingest/configs/boss.py(当前有 mini+job、mini+company 两条注册)app/services/ingest/configs/qcwy.pyapp/services/ingest/configs/zhilian.py</read_first>
boss.py 追加:
register(PlatformConfig(
platform="boss", channel="company", data_type="job",
table="boss_job", # 共用同一张表,通过 channel 列区分来源
dedup_fields=(DedupFieldSpec(column="job_id", extractor=_extract_job_id),),
))
qcwy.py 追加:
register(PlatformConfig(
platform="qcwy", channel="company", data_type="job",
table="qcwy_job",
dedup_fields=(
DedupFieldSpec(column="job_id", extractor=_extract_job_id),
DedupFieldSpec(column="update_date_time", extractor=_extract_update_dt),
),
))
zhilian.py 追加:(需读取 zhilian.py 确认 extractor 函数名)
register(PlatformConfig(
platform="zhilian", channel="company", data_type="job",
table="zhilian_job",
dedup_fields=(DedupFieldSpec(column="job_number", extractor=_extract_job_number),),
))
Task 2.3: 修改 company_jobs_sync.py
将 `sync_company_jobs()` 中: ```python # 修改前 store_result = await router.store_batch(source, "mini", "job", jobs)修改后
store_result = await router.store_batch(source, "company", "job", jobs)
</action>
<acceptance_criteria>
- `grep "company.*job" app/services/ingest/configs/boss.py` 有输出
- `grep '"company"' app/services/company_jobs_sync.py` 有输出
- `grep '"mini"' app/services/company_jobs_sync.py` 无输出(全部替换)
</acceptance_criteria>
---
## Verification
```bash
# 1. 确认 channel=company 注册存在
pipenv run python -c "
from app.services.ingest.configs import boss, qcwy, zhilian # 触发 register()
from app.services.ingest.registry import list_configs
company_configs = [c for c in list_configs() if c.channel == 'company']
print(f'channel=company 配置数: {len(company_configs)}')
for c in company_configs:
print(f' {c.platform} / {c.channel} / {c.data_type} → {c.table}')
assert len(company_configs) >= 3, '❌ 缺少注册配置'
print('✅ 注册配置完整')
"
# 2. 全量回归
pipenv run python -m pytest tests/ -v --tb=short