Files
L2keka/server/src/services/teams-config.ts
T
hangshuo652 040808ef6b L2文档三大板块重构+评分细则不公开化;系统对齐:一键三轮评审、受验者注册表映射、提交状态探测工具
- 文档重构为 考核目的(1.x)/提交要求(2.x,含成果物需求)/考核内容(3.x) 板块编号体系
- 删除公开评分细则(7维表/合格线/难度赋分/功能拆分),保留验收基准与提交要求
- 自选题取消事前登记,改由 AGENTS.md 记录核心内容;前端同步移除登记字段
- 新增 l2-participants 注册表服务与 teams-config L2 URL 自动映射
- 新增 startReviewRounds 一键N轮评审(自动续跑+快照聚合中位数),前端「重新评审×3」
- 新增 check-repos.mjs 提交状态探测(API四态判定:已提交/空仓/未创建/未授权)
- 文档措辞与实现对齐(AI辅助评审)、修复引用/残片/格式问题
2026-08-26 10:52:23 +08:00

62 lines
1.7 KiB
TypeScript

import fs from 'fs';
import path from 'path';
import { findL2Participant, buildL2RepoUrl } from './l2-participants';
export interface GitteaConfig {
url: string;
user: string;
password: string;
repo: string;
token: string;
}
export interface TeamConfig {
no: number;
dept: string;
track: string;
gittea: GitteaConfig;
topic: string;
team: string;
leader: string;
employee_id: string;
email: string;
members: string;
remark: string;
}
const CONFIG_PATH = path.resolve(__dirname, '../../../config/teams.json');
let cached: TeamConfig[] | null = null;
export function loadTeams(): TeamConfig[] {
if (cached) return cached;
const raw = fs.readFileSync(CONFIG_PATH, 'utf-8');
const parsed = JSON.parse(raw);
cached = parsed.teams as TeamConfig[];
return cached;
}
export function findTeamByTitle(title: string): TeamConfig | undefined {
const t = title?.trim();
if (!t) return undefined;
return loadTeams().find((x) => x.team === t || x.leader === t);
}
export function buildRepoUrl(team: TeamConfig): string {
const base = team.gittea.url.replace(/\/+$/, '');
return `${base}/${encodeURIComponent(team.gittea.user)}/${encodeURIComponent(team.gittea.repo)}.git`;
}
export function resolveRepoUrlFromConfig(title: string, track: string, fallback: string): string {
if (track === '赛道一' || track === '赛道二') {
const team = findTeamByTitle(title);
if (team) return buildRepoUrl(team);
}
// L2考核:按受验者注册表(员工编号/姓名)映射拉取 URL,避免手动填写出错
if (track === 'L2考核') {
const p = findL2Participant(title);
if (p) return buildL2RepoUrl(p);
}
return fallback;
}