feat(rvw): Complete V2.0 Week 3 - Statistical validation extension and UX improvements

Week 3 Development Summary:

- Implement negative sign normalization (6 Unicode variants)

- Enhance T-test validation with smart sample size extraction

- Enhance SE triangle and CI-P consistency validation with subrow support

- Add precise sub-cell highlighting for P-values in multi-line cells

- Add frontend issue type Chinese translations (6 new types)

- Add file format tips for PDF/DOC uploads

Technical improvements:

- Add _clean_statistical_text() in extractor.py

- Add _safe_float() wrapper in validator.py

- Add ForensicsReport.tsx component

- Update ISSUE_TYPE_LABELS translations

Documentation:

- Add 2026-02-18 development record

- Update RVW module status (v5.1)

- Update system status (v5.2)

Status: Week 3 complete, ready for Week 4 testing
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-18 18:26:16 +08:00
parent 9f256c4a02
commit f9ed0c2528
36 changed files with 2790 additions and 501 deletions

View File

@@ -68,7 +68,7 @@ export function getMethodologyStatus(review: MethodologyReview | null | undefine
* @param editorialScore 稿约规范性分数
* @param methodologyScore 方法学分数
* @param agents 选择的智能体
* @returns 综合分数
* @returns 综合分数保留1位小数
*/
export function calculateOverallScore(
editorialScore: number | null | undefined,
@@ -78,18 +78,21 @@ export function calculateOverallScore(
const hasEditorial = agents.includes('editorial') && editorialScore != null;
const hasMethodology = agents.includes('methodology') && methodologyScore != null;
let score: number | null = null;
if (hasEditorial && hasMethodology) {
// 两个都选稿约40% + 方法学60%
return editorialScore! * 0.4 + methodologyScore! * 0.6;
score = editorialScore! * 0.4 + methodologyScore! * 0.6;
} else if (hasEditorial) {
// 只选规范性
return editorialScore!;
score = editorialScore!;
} else if (hasMethodology) {
// 只选方法学
return methodologyScore!;
score = methodologyScore!;
}
return null;
// 修复浮点数精度问题保留1位小数
return score !== null ? Math.round(score * 10) / 10 : null;
}
/**