feat(admin): 新增小组激活状态清单接口 /api/admin/teams

- router:GET /api/admin/teams(adminAuth;固定路径段,与既有路由无通配冲突)

- controller:teams() 整体透传 group/activated/includeTest(防前端筛选静默失效)

- service:getTeams(),键 = 组别+队伍号;成员并集 aggregation.team_uid ∪ contestants.team_id;学校取 aggregation.organization_cn;激活 = 全组成员均已激活;附 summary 与 schoolConflict

- model/aggregation:补声明运行库既有列 organization_cn / group(此前模型漏声明 ⇒ 查询被当未知列)

线上验证:R86 已部署上线,公网 /api/admin/teams 返回 401(鉴权在位)
This commit is contained in:
2026-10-09 09:33:05 +08:00
parent 481de69e3d
commit c101b15e2e
4 changed files with 221 additions and 0 deletions

View File

@@ -78,6 +78,25 @@ module.exports = app => {
defaultValue: null,
comment: '驳回原因',
},
// 所属单位 / 学校名称(报名表原始来源,R84 续六新增声明)
// ⚠️ 该列在运行库中**一直存在**(`SHOW COLUMNS FROM aggregation` 可见),
// 只是模型漏声明 ⇒ 任何 `attributes: ['organization_cn']` 查询都会
// 被 Sequelize 当作未知列。此处补齐仅为让模型与运行库一致,
// 声明为 allowNull:true,不改变既有写入路径的语义。
organization_cn: {
type: STRING(200),
allowNull: true,
defaultValue: null,
comment: '所属单位/学校名称',
},
// 参赛组别(zhongzhi/gaozhi/benke/jiaoshi)—— 同为运行库既有列,模型漏声明。
// ⚠️ `group` 是 MySQL 保留字,Sequelize 会自动加反引号;手写 SQL 时须自行反引号。
group: {
type: STRING(20),
allowNull: true,
defaultValue: null,
comment: '参赛组别',
},
// 记录创建时间
created_at: {
type: DATE,