| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- 'use strict';
- // 校区地图:学校列表(JSON 种子 + 运行时),附带运营数据关联统计。
- // 本期只有只读接口;新建/编辑/启停在下一增量实现。
- const { sendJson } = require('../util.js');
- const { loadSchools } = require('../../schools-store.js');
- const { createOpsStore } = require('../../ops-store.js');
- function namesOf(school) {
- return new Set([school.name, ...(school.aliases || [])].map((n) => String(n).trim()).filter(Boolean));
- }
- function register(app, ctx) {
- const opsStore = createOpsStore(ctx.config);
- app.get('/api/schools', async ({ res }) => {
- const schools = loadSchools();
- // 关联运营数据:按学校名(含别名)匹配 ops_shop.school 与 ops_row.school
- let shops = [];
- let rows = [];
- let opsAvailable = false;
- try {
- const summary = await opsStore.summary();
- shops = summary.shops || [];
- rows = await opsStore.queryRows({});
- opsAvailable = true;
- } catch { /* ops 库不可用:只影响关联字段 */ }
- const payload = schools.map((school) => {
- const names = namesOf(school);
- const shopCount = shops.filter((s) => names.has(String(s.school || ''))).length;
- let lastDate = '';
- for (const row of rows) {
- if (!names.has(String(row.school || ''))) continue;
- if (!lastDate || row.date > lastDate) lastDate = row.date;
- }
- return {
- ...school,
- ops: opsAvailable ? { shopCount, lastDate: lastDate || null } : null,
- };
- });
- sendJson(res, 200, {
- schools: payload,
- opsAvailable,
- enabledCount: payload.filter((s) => s.enabled && s.lng != null).length,
- });
- });
- }
- module.exports = { register };
|