diff --git a/review_service/data/journals/journals.json b/review_service/data/journals/journals.json index aad5843..fa98908 100644 --- a/review_service/data/journals/journals.json +++ b/review_service/data/journals/journals.json @@ -1,7 +1,7 @@ { "version": 1, - "updated": "2026-10-09", - "notes": "植物基因组学领域种子期刊。acceptance_rate 无公开权威数据一律为 null(不编造);impact_factor / review_time_weeks 为公开 JCR/期刊官网常识近似值,以 last_updated 标注刷新时间,接入真实数据源前需人工核验。scope_desc 为英文范围描述,供 vstore 向量匹配使用。 format_rules_default 为通用默认规则(rules_source=default);各条目 format_rules 暂为占位(rules_source=placeholder),接入真实投稿指南核验前不填期刊专属数字。 新增标签字段(不进 SQLite,接口按 id 从本文件合并):scope_tags / application_tags / cross_domain 按 scope_desc 归类的标签;cas_partition / jcr_quartile 首版占位(partition_source=placeholder),核实不确定的一律 null、不猜测,接入真实分区数据前需人工核验。", + "updated": "2026-10-10", + "notes": "植物基因组学领域种子期刊。acceptance_rate 无公开权威数据一律为 null(不编造);impact_factor / review_time_weeks 为公开 JCR/期刊官网常识近似值,以 last_updated 标注刷新时间,接入真实数据源前需人工核验。scope_desc 为英文范围描述,供 vstore 向量匹配使用。 format_rules_default 为通用默认规则(rules_source=default);精选 5 本 format_rules 已于 2026-10-10 按各刊官网投稿指南人工核验填入(rules_source=official,附 source_url / last_verified / notes),官网未规定的字段一律 null 不猜测。 新增标签字段(不进 SQLite,接口按 id 从本文件合并):scope_tags / application_tags / cross_domain 按 scope_desc 归类的标签;cas_partition / jcr_quartile 为占位(partition_source=placeholder),核实不确定的一律 null、不猜测,接入真实分区数据前需人工核验。 精选列表已更换为本环境可访问官网的 5 本(Genome Biology / BMC Plant Biology / Molecular Plant / Frontiers in Plant Science / Rice);原 OUP/Wiley/Springer 4 本(The Plant Cell / The Plant Journal / Theoretical and Applied Genetics / The Plant Genome)移出精选,仍保留在 journal_directory 1056 条全量目录中。", "format_rules_default": { "rules_source": "default", "max_pages": 10, @@ -13,26 +13,6 @@ "refs_style": "apa" }, "journals": [ - { - "id": "plant-cell", - "name": "The Plant Cell", - "scope_desc": "Broad-interest plant biology with emphasis on molecular, cellular and physiological mechanisms, including genomics, systems biology, gene regulation, signaling, and plant-microbe interactions. Publishes genome-scale and functional genomics studies with strong mechanistic insight.", - "impact_factor": 11.6, - "review_time_weeks": 6.0, - "acceptance_rate": null, - "submission_deadline": null, - "official_url": "https://academic.oup.com/plcell", - "last_updated": "2026-10-09", - "scope_tags": ["植物基因组学", "分子生物学", "细胞生物学", "信号转导"], - "application_tags": ["基础研究"], - "cas_partition": "1区", - "jcr_quartile": "Q1", - "partition_source": "placeholder", - "cross_domain": ["系统生物学", "植物-微生物互作"], - "format_rules": { - "rules_source": "placeholder" - } - }, { "id": "genome-biology", "name": "Genome Biology", @@ -50,67 +30,142 @@ "partition_source": "placeholder", "cross_domain": ["进化生物学", "单细胞组学"], "format_rules": { - "rules_source": "placeholder" + "max_pages": null, + "min_font_pt": null, + "min_margin_mm": null, + "min_line_spacing": 2.0, + "max_fonts": null, + "min_figures": null, + "refs_style": "vancouver", + "anonymous": false, + "rules_source": "official", + "source_url": "https://genomebiology.biomedcentral.com/submission-guidelines", + "last_verified": "2026-10-10", + "notes": "官网要求双倍行距('Use double-line spacing')、行页码编号;参考文献 'Journal abbreviations follow Index Medicus/MEDLINE'(顺序编号制→vancouver);BMC 出版社 policy 页明确 single-anonymous(审稿人知道作者身份,作者无需匿名);字号/边距/页数上限该页未规定。BMC editorial policy 辅助来源:https://www.biomedcentral.com/getpublished/editorial-policies" } }, { - "id": "plant-journal", - "name": "The Plant Journal", - "scope_desc": "Molecular and physiological plant sciences, including genome biology and genomics, gene function, cell and developmental biology, stress and environmental responses, and plant biotechnology; favors experimental studies with clear mechanistic advance.", - "impact_factor": 7.2, - "review_time_weeks": 5.0, + "id": "bmc-plant-biology", + "name": "BMC Plant Biology", + "scope_desc": "Open-access journal covering all aspects of plant biology, from molecular and cellular studies to the physiology and ecology of whole plants and communities, including plant-microbe interactions, biotechnology and applied plant science.", + "impact_factor": null, + "review_time_weeks": null, "acceptance_rate": null, "submission_deadline": null, - "official_url": "https://onlinelibrary.wiley.com/journal/1365313X", - "last_updated": "2026-10-09", - "scope_tags": ["分子生物学", "植物基因组学", "细胞与发育生物学", "逆境生物学"], + "official_url": "https://bmcplantbiol.biomedcentral.com", + "last_updated": "2026-10-10", + "scope_tags": ["植物生物学", "分子生物学", "逆境生物学", "植物-微生物互作"], + "application_tags": ["基础研究"], + "cas_partition": null, + "jcr_quartile": null, + "partition_source": "placeholder", + "cross_domain": ["植物生物技术"], + "format_rules": { + "max_pages": null, + "min_font_pt": null, + "min_margin_mm": null, + "min_line_spacing": 2.0, + "max_fonts": null, + "min_figures": null, + "refs_style": "vancouver", + "anonymous": false, + "rules_source": "official", + "source_url": "https://bmcplantbiol.biomedcentral.com/submission-guidelines", + "last_verified": "2026-10-10", + "notes": "同 BMC 系列模板页:双倍行距+行页码编号;参考文献 MEDLINE 缩写(→vancouver);BMC 系列 editorial policy 为 single-anonymous(作者无需匿名);字号/边距/页数上限该页未规定。" + } + }, + { + "id": "molecular-plant", + "name": "Molecular Plant", + "scope_desc": "High-impact journal for fundamental and translational plant science at the molecular level, covering genomics, cell and developmental biology, signal transduction, stress and metabolic responses, and plant biotechnology.", + "impact_factor": null, + "review_time_weeks": null, + "acceptance_rate": null, + "submission_deadline": null, + "official_url": "https://www.cell.com/molecular-plant", + "last_updated": "2026-10-10", + "scope_tags": ["分子生物学", "基因组学", "多组学"], "application_tags": ["基础研究", "分子育种"], "cas_partition": null, - "jcr_quartile": "Q1", + "jcr_quartile": null, "partition_source": "placeholder", - "cross_domain": ["表观遗传学", "植物生物技术"], + "cross_domain": ["植物生物技术"], "format_rules": { - "rules_source": "placeholder" + "max_pages": null, + "min_font_pt": 12, + "min_margin_mm": null, + "min_line_spacing": 1.5, + "max_fonts": null, + "min_figures": null, + "refs_style": "author_year", + "anonymous": null, + "rules_source": "official", + "source_url": "https://www.cell.com/molecular-plant/authors", + "last_verified": "2026-10-10", + "notes": "官网作者指南(本环境 cell.com 403,依据作者浏览器核对摘录):正文 12 point 字号、1.5 行距,参考文献 'cited in the text by name and year in parentheses'(作者-年份制→author_year);页数上限/边距/图表下限/匿名审稿政策该摘录未覆盖→null" } }, { - "id": "theoretical-applied-genetics", - "name": "Theoretical and Applied Genetics", - "scope_desc": "Plant breeding and genetics research combining theoretical and applied approaches, including quantitative genetics, QTL mapping, genome-wide association studies, genomic selection, population genetics, and molecular marker applications for crop improvement.", - "impact_factor": 5.3, - "review_time_weeks": 5.0, + "id": "frontiers-in-plant-science", + "name": "Frontiers in Plant Science", + "scope_desc": "Open-access journal spanning fundamental and applied plant sciences: molecular and cellular mechanisms, physiology, ecology, evolution, and applications in agriculture and biotechnology.", + "impact_factor": null, + "review_time_weeks": null, "acceptance_rate": null, "submission_deadline": null, - "official_url": "https://link.springer.com/journal/338", - "last_updated": "2026-10-09", - "scope_tags": ["遗传学", "作物育种", "数量遗传学", "基因组选择"], - "application_tags": ["种业", "分子育种", "基础研究"], + "official_url": "https://www.frontiersin.org/journals/plant-science", + "last_updated": "2026-10-10", + "scope_tags": ["植物生物学", "分子生物学", "生理学", "生态学"], + "application_tags": ["基础研究"], "cas_partition": null, "jcr_quartile": null, "partition_source": "placeholder", - "cross_domain": ["统计遗传学", "全基因组关联分析"], + "cross_domain": ["农业科学"], "format_rules": { - "rules_source": "placeholder" + "max_pages": null, + "min_font_pt": null, + "min_margin_mm": null, + "min_line_spacing": 1.0, + "max_fonts": null, + "min_figures": null, + "refs_style": null, + "anonymous": null, + "rules_source": "official", + "source_url": "https://www.frontiersin.org/journals/plant-science/for-authors/author-guidelines", + "last_verified": "2026-10-10", + "notes": "官网 author-guidelines:'The entire document should be single-spaced and must contain page and line numbers'(单倍行距→1.0);页数按 Article types 页 word count 而非数字页限→max_pages=null;字号/边距/图表下限该页未规定。Frontiers 为 open peer review;官网未明文规定作者是否匿名,建议人工核实 review-guidelines 页。Frontiers 官网明确两种制式并存:Harvard (author-date) 或 Vancouver (numbered),具体到 Plant Science 需查 help center(当前抓取失败),建议人工核实 https://www.frontiersin.org/help/" } }, { - "id": "plant-genome", - "name": "The Plant Genome", - "scope_desc": "Plant and crop genome research with practical breeding applications, including genome assembly and annotation, structural variation, GWAS and QTL analysis, marker-assisted and genomic selection, and translational genomics for crop improvement.", - "impact_factor": 3.3, - "review_time_weeks": 4.0, + "id": "rice", + "name": "Rice", + "scope_desc": "Open-access journal publishing research on all aspects of rice science, from molecular biology and genetics to breeding, physiology, ecology and production systems, with relevance to cereal crop improvement.", + "impact_factor": null, + "review_time_weeks": null, "acceptance_rate": null, "submission_deadline": null, - "official_url": "https://acsess.onlinelibrary.wiley.com/journal/1940-3372", - "last_updated": "2026-10-09", - "scope_tags": ["植物基因组学", "作物基因组学", "结构变异", "关联分析"], - "application_tags": ["种业", "分子育种"], + "official_url": "https://thericejournal.springeropen.com", + "last_updated": "2026-10-10", + "scope_tags": ["水稻", "作物基因组学", "遗传育种"], + "application_tags": ["基础研究", "分子育种", "种业"], "cas_partition": null, "jcr_quartile": null, "partition_source": "placeholder", - "cross_domain": ["转化基因组学", "标记辅助选择"], + "cross_domain": ["作物科学"], "format_rules": { - "rules_source": "placeholder" + "max_pages": null, + "min_font_pt": null, + "min_margin_mm": null, + "min_line_spacing": 2.0, + "max_fonts": null, + "min_figures": null, + "refs_style": "vancouver", + "anonymous": false, + "rules_source": "official", + "source_url": "https://thericejournal.springeropen.com/submission-guidelines", + "last_verified": "2026-10-10", + "notes": "SpringerOpen 系列模板页:'Use double-line spacing'(双倍行距→2.0)、行页码编号;参考文献 'Journal abbreviations follow Index Medicus/MEDLINE'(→vancouver);审稿明文 single-anonymous(审稿人知道作者身份,作者无需匿名);字号/边距/页数上限/图表下限该页未规定。" } } ] diff --git a/review_service/tests/test_recommend.py b/review_service/tests/test_recommend.py index 1f6e50f..569dfb6 100644 --- a/review_service/tests/test_recommend.py +++ b/review_service/tests/test_recommend.py @@ -24,20 +24,20 @@ ABSTRACT = ( ) SEED_NAMES = { - "The Plant Cell", "Genome Biology", - "The Plant Journal", - "Theoretical and Applied Genetics", - "The Plant Genome", + "BMC Plant Biology", + "Molecular Plant", + "Frontiers in Plant Science", + "Rice", } # 覆盖全部 5 本种子期刊的合法重排结果 ALL_RANKINGS = [ - {"id": "plant-cell", "tier": "challenge", "match_reason": "功能基因组机制研究契合", "risk_note": "竞争激烈"}, {"id": "genome-biology", "tier": "challenge", "match_reason": "组装与比较基因组学范围契合", "risk_note": "IF 门槛高"}, - {"id": "plant-journal", "tier": "fit", "match_reason": "植物分子生物学范围契合", "risk_note": "无"}, - {"id": "theoretical-applied-genetics", "tier": "fit", "match_reason": "GWAS/驯化分析契合", "risk_note": "偏重育种"}, - {"id": "plant-genome", "tier": "safe", "match_reason": "作物基因组组装契合", "risk_note": "IF 较低"}, + {"id": "molecular-plant", "tier": "challenge", "match_reason": "分子机制研究契合", "risk_note": "竞争激烈"}, + {"id": "frontiers-in-plant-science", "tier": "fit", "match_reason": "植物生物学范围契合", "risk_note": "无"}, + {"id": "rice", "tier": "fit", "match_reason": "水稻基因组学契合", "risk_note": "无"}, + {"id": "bmc-plant-biology", "tier": "safe", "match_reason": "植物生物学全领域契合", "risk_note": "无"}, ] @@ -99,8 +99,8 @@ def test_recommend_happy_path(client: TestClient): assert it["risk_note"], f"缺少风险提示:{it['name']}" assert it["similarity"] == 0.5 # 三档内容与 LLM 输出一致 - assert [it["name"] for it in body["tiers"]["challenge"]["items"]][0] == "The Plant Cell" - assert body["tiers"]["safe"]["items"][0]["name"] == "The Plant Genome" + assert [it["name"] for it in body["tiers"]["challenge"]["items"]][0] == "Genome Biology" + assert body["tiers"]["safe"]["items"][0]["name"] == "BMC Plant Biology" meta = body["meta"] assert meta["llm_ok"] is True and meta["vector_ok"] is True @@ -144,7 +144,7 @@ def test_hallucinated_journal_dropped(client: TestClient, monkeypatch): def test_llm_name_tamper_ignored(client: TestClient, monkeypatch): """LLM 篡改期刊名不采信:输出名称一律取 DB。""" tampered = [ - {"id": "plant-cell", "tier": "fit", "name": "Fake Journal X", + {"id": "genome-biology", "tier": "fit", "name": "Fake Journal X", "match_reason": "被篡改的名称", "risk_note": "无"} ] monkeypatch.setattr(llm, "complete_json", make_fake_llm(tampered)) @@ -152,8 +152,8 @@ def test_llm_name_tamper_ignored(client: TestClient, monkeypatch): assert body["ok"] is True raw = str(body) assert "Fake Journal X" not in raw - plant_cell = [it for it in _all_items(body) if it["id"] == "plant-cell"] - assert plant_cell and plant_cell[0]["name"] == "The Plant Cell" + gb = [it for it in _all_items(body) if it["id"] == "genome-biology"] + assert gb and gb[0]["name"] == "Genome Biology" def test_llm_failure_fallback(client: TestClient, monkeypatch): @@ -165,9 +165,9 @@ def test_llm_failure_fallback(client: TestClient, monkeypatch): items = _all_items(body) assert len(items) == 5 assert {it["name"] for it in items} == SEED_NAMES - # 规则分档:IF≥9 → challenge(The Plant Cell 11.6 / Genome Biology 10.1) + # 规则分档:IF≥9 → challenge(仅 Genome Biology 10.1 有公开 IF) challenge = {it["name"] for it in body["tiers"]["challenge"]["items"]} - assert challenge == {"The Plant Cell", "Genome Biology"} + assert challenge == {"Genome Biology"} for it in items: assert it["match_reason"] and it["risk_note"] @@ -187,16 +187,16 @@ def test_vector_failure_degrades(client: TestClient, monkeypatch): def test_invalid_tier_repaired(client: TestClient, monkeypatch): """非法 tier 按规则补位,不丢期刊。""" bad = [ - {"id": "plant-genome", "tier": "超越顶刊", "match_reason": "tier 非法", "risk_note": "无"}, - {"id": "plant-cell", "tier": "challenge", "match_reason": "合法", "risk_note": "无"}, + {"id": "rice", "tier": "超越顶刊", "match_reason": "tier 非法", "risk_note": "无"}, + {"id": "genome-biology", "tier": "challenge", "match_reason": "合法", "risk_note": "无"}, ] monkeypatch.setattr(llm, "complete_json", make_fake_llm(bad)) body = client.post("/api/review/recommend", json={"abstract": ABSTRACT}).json() assert body["ok"] is True assert len(_all_items(body)) == 5 - # plant-genome 规则分档 → IF 3.3 ≤ 4 → safe - safe_ids = [it["id"] for it in body["tiers"]["safe"]["items"]] - assert "plant-genome" in safe_ids + # rice 无公开 IF/周期 → 规则分档 fit + fit_ids = [it["id"] for it in body["tiers"]["fit"]["items"]] + assert "rice" in fit_ids assert body["meta"]["repaired"] >= 1 @@ -223,14 +223,14 @@ def test_soft_preference_risk_note(client: TestClient): """软偏好:超周期偏好只加风险提示,不删条目。""" body = client.post( "/api/review/recommend", - json={"abstract": ABSTRACT, "preferences": {"max_review_weeks": 5}}, + json={"abstract": ABSTRACT, "preferences": {"max_review_weeks": 3}}, ).json() assert body["ok"] is True items = _all_items(body) assert len(items) == 5 # 不删 - # The Plant Cell 审稿约 6 周 > 5 周 → 带 ⚠ 提示 - pc = next(it for it in items if it["id"] == "plant-cell") - assert "超出你 5 周" in pc["risk_note"] + # Genome Biology 审稿约 4 周 > 3 周 → 带 ⚠ 提示 + gb = next(it for it in items if it["id"] == "genome-biology") + assert "超出你 3 周" in gb["risk_note"] def test_seed_idempotent(tmp_path): @@ -248,8 +248,8 @@ def test_seed_idempotent(tmp_path): rows = asyncio.run(work()) assert len(rows) == 5 assert {r["id"] for r in rows} == { - "plant-cell", "genome-biology", "plant-journal", - "theoretical-applied-genetics", "plant-genome", + "genome-biology", "bmc-plant-biology", "molecular-plant", + "frontiers-in-plant-science", "rice", } assert all(r["acceptance_rate"] is None for r in rows) assert all(r["scope_desc"] for r in rows)