app	method	pathExpression	bodyExpression	functionContext	evidence	file	line
web-school	POST	[integration]/api/devices/discover	JSON.stringify(body)	megoDiscover(body: { equipmentCode: string; candidates: string[] })	fetch	apps/web-school/src/services/api.ts	507
web-school	GET	[integration]/api/employees	\N	megoEmployees()	fetch	apps/web-school/src/services/api.ts	525
web-school	POST	[integration]/api/employees/refresh	JSON.stringify({ equipmentCode })	megoEmployeesRefresh(equipmentCode: string)	fetch	apps/web-school/src/services/api.ts	516
stream-tester	GET	/	(_req, res) => { res.setHeader('Cache-Control', 'no-store'); res.sendFile(path.join(pub, 'index.html')); }	\N	frontend-helper	apps/stream-tester/server.js	123
web-regulator	POST	/api/auth/login	JSON.stringify({ username, password })	login(username: string, password: string)	fetch	apps/web-regulator/src/stores/auth.ts	24
web-school	POST	/api/auth/login	JSON.stringify({ username, password })	login(username: string, password: string)	fetch	apps/web-school/src/stores/auth.ts	161
web-regulator	POST	/api/auth/logout	\N	logout()	fetch	apps/web-regulator/src/stores/auth.ts	52
web-school	POST	/api/auth/logout	\N	logout()	fetch	apps/web-school/src/stores/auth.ts	188
web-school	GET	/api/auth/me	\N	refreshMe()	fetch	apps/web-school/src/stores/auth.ts	106
web-school	POST	/api/auth/refresh	\N	refreshToken()	fetch	apps/web-school/src/stores/auth.ts	138
mobile-device	POST	/api/devices/discover	JSON.stringify(body)	megoDiscover(body: { equipmentCode: string; candidates: string[] })	fetch	apps/mobile-device/src/api/integration.ts	16
mobile-device	GET	/api/employees	\N	listEmployees()	fetch	apps/mobile-device/src/api.ts	21
mobile-device	GET	/api/employees	\N	megoEmployees()	fetch	apps/mobile-device/src/api/integration.ts	38
mobile-device	POST	/api/employees/refresh	JSON.stringify({ equipmentCode })	refreshEmployees(equipmentCode: string)	fetch	apps/mobile-device/src/api.ts	10
mobile-device	POST	/api/employees/refresh	JSON.stringify({ equipmentCode })	megoEmployeesRefresh(equipmentCode: string)	fetch	apps/mobile-device/src/api/integration.ts	27
mobile-device	GET	/api/morning-checks	\N	megoMorningChecks()	fetch	apps/mobile-device/src/api/integration.ts	45
web-school	GET	/audit/logs/${encodeURIComponent(id)}	\N	fetchAuditLogDetail(id: string)	fetch	apps/web-school/src/services/audit.ts	47
web-school	GET	/audit/logs/export.csv${qs ? `?${qs}` : ''}	\N	exportAuditCsv(params: AuditQuery)	fetch	apps/web-school/src/services/audit.ts	37
web-school	GET	/audit/logs${qs ? `?${qs}` : ''}	\N	fetchAuditLogs(params: AuditQuery)	fetch	apps/web-school/src/services/audit.ts	24
web-school	POST	/auth/change-password	\N	changePassword(body: { oldPassword: string; newPassword: string })	requestJson	apps/web-school/src/services/api.ts	241
web-school	POST	/auth/zhct-login	JSON.stringify({ username, password })	zhctExternalLogin(username, password)	fetch	apps/web-school/src/services/api.ts	1846
web-school	GET	/bright-local/ai/events?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null).map(([k,v])=>[k,String(v)])) as any).toString()}	\N	brightLocalAiEvents(params: { page?: number; pageSize?: number; type?: string; status?: 'OPEN'|'CLOSED'|'FALSE'|''; canteenId?: string|number; start?: string; end?: string })	frontend-helper	apps/web-school/src/services/api.ts	287
web-school	GET	/bright-local/ai/events/detail?id=${encodeURIComponent(id)}	\N	brightLocalAiEventDetail(id: string)	frontend-helper	apps/web-school/src/services/api.ts	298
web-school	GET	/bright-local/ai/events/export.csv${qs ? `?${qs}` : ''}	\N	brightLocalAiEventsExportCsv(params: { type?: string; status?: 'OPEN'|'CLOSED'|'FALSE'|''; canteenId?: string|number; start?: string; end?: string })	frontend-helper	apps/web-school/src/services/api.ts	292
web-school	POST	/bright-local/ai/events/handle	body	brightLocalAiEventHandleEx(body: { eventId: string; decision?: '已现场纠正' | '误报' | '其他'; note?: string; evidence?: string[]; handledBy?: string })	frontend-helper	apps/web-school/src/services/api.ts	297
web-school	POST	/bright-local/ai/events/handle/batch	items	brightLocalAiEventsBatchHandle(items: Array<{ eventId: string; decision?: '误报' | '已现场纠正' }>)	frontend-helper	apps/web-school/src/services/api.ts	299
web-school	POST	/bright-local/aibox-boxes	body	aiboxBoxCreate(body: { schoolId: number | string; canteenId?: number | string | null; aiboxName: string; aiboxBaseurl: string; aiboxAccount: string; aiboxPassword: string })	frontend-helper	apps/web-school/src/services/api.ts	364
web-school	DELETE	/bright-local/aibox-boxes?id=${encodeURIComponent(String(id))}	\N	aiboxBoxDelete(id: number | string)	frontend-helper	apps/web-school/src/services/api.ts	368
web-school	PATCH	/bright-local/aibox-boxes?id=${encodeURIComponent(String(id))}	body	aiboxBoxUpdate(id: number | string, body: { schoolId?: number | string; canteenId?: number | string | null; aiboxName?: string; aiboxBaseurl?: string; aiboxAccount?: string; aiboxPassword?: string })	frontend-helper	apps/web-school/src/services/api.ts	366
web-school	GET	/bright-local/aibox-boxes/full${schoolId ? `?schoolId=${encodeURIComponent(String(schoolId))}` : ''}	\N	aiboxBoxesFull(schoolId: string | number)	frontend-helper	apps/web-school/src/services/api.ts	362
web-school	GET	/bright-local/aibox-boxes${schoolId ? `?schoolId=${encodeURIComponent(String(schoolId))}` : ''}	\N	aiboxBoxes(schoolId: string | number)	frontend-helper	apps/web-school/src/services/api.ts	361
web-school	POST	/bright-local/channels	body	aiboxLocalChannelCreate(body: { schoolId: number | string; canteenId?: number | string | null; unitName: string; aiboxId?: number | string | null; aiboxName?: string; channelId: string; channelName?: string; faislenationCode?: string; flv?: string; hls?: string; rtmp?: string; rtsp?: string; webrtc?: string; wsFlv?: string; enabled?: boolean })	frontend-helper	apps/web-school/src/services/api.ts	358
web-school	DELETE	/bright-local/channels?id=${encodeURIComponent(String(id))}	\N	aiboxLocalChannelDelete(id: number | string)	frontend-helper	apps/web-school/src/services/api.ts	370
web-school	PATCH	/bright-local/channels?id=${encodeURIComponent(String(id))}	patchBody	aiboxLocalChannelUpdate(id: number | string, patchBody: { canteenId?: number | string | null; unitName?: string; aiboxId?: number | string | null; aiboxName?: string; channelId?: string; channelName?: string; faislenationCode?: string | null; flv?: string | null; hls?: string | null; rtmp?: string | null; rtsp?: string | null; webrtc?: string | null; wsFlv?: string | null; enabled?: boolean })	frontend-helper	apps/web-school/src/services/api.ts	360
web-school	GET	/bright-local/channels?schoolId=${encodeURIComponent(String(schoolId))}	\N	aiboxLocalChannels(params: { schoolId?: string | number; page?: number; pageSize?: number; channelId?: string; channelName?: string } | string | number)	frontend-helper	apps/web-school/src/services/api.ts	348
web-school	GET	/bright-local/channels${qs ? `?${qs}` : ''}	\N	aiboxLocalChannels(params: { schoolId?: string | number; page?: number; pageSize?: number; channelId?: string; channelName?: string } | string | number)	frontend-helper	apps/web-school/src/services/api.ts	355
web-school	GET	/bright-local/playback?${qs}	\N	brightLocalPlayback(schoolId: string, channelId: string, date: string, page: number, pageSize: number)	frontend-helper	apps/web-school/src/services/api.ts	282
web-school	POST	/bright-local/refresh?${qs}	\N	brightLocalRefresh(schoolId: string, channelId: string, date: string)	frontend-helper	apps/web-school/src/services/api.ts	332
web-school	GET	/bright-local/strangers?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params)\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	brightLocalStrangers(params: { canteenId?: string | number; start?: string; end?: string; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	302
web-school	GET	/bright-local/strangers/export.csv${qs ? `?${qs}` : ''}	\N	brightLocalStrangersExportCsv(params: { canteenId?: string | number; start?: string; end?: string })	frontend-helper	apps/web-school/src/services/api.ts	319
mobile-emergency	GET	/bright/reg/cameras${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	regCameras(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	11
screen	GET	/bright/reg/cameras${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	regCameras(schoolId: string)	frontend-helper	apps/screen/src/api/index.ts	7
web-regulator	GET	/bright/reg/cameras${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	brightCameras(schoolId: string)	frontend-helper	apps/web-regulator/src/services/api.ts	338
web-regulator	GET	/bright/reg/playback?schoolId=${encodeURIComponent(schoolId)}&cameraId=${encodeURIComponent(cameraId)}${start ? `&start=${encodeURIComponent(start)}` : ''}${end ? `&end=${encodeURIComponent(end)}` : ''}	\N	brightPlayback(schoolId: string, cameraId: string, start: string, end: string)	frontend-helper	apps/web-regulator/src/services/api.ts	342
mobile-emergency	POST	/bright/reg/snapshots	b	makeSnapshot(b: { schoolId: string; cameraId: string; at?: string; url?: string })	frontend-helper	apps/mobile-emergency/src/api/index.ts	12
screen	POST	/bright/reg/snapshots	b	makeSnapshot(b: { schoolId: string; cameraId: string; at?: string; url?: string })	frontend-helper	apps/screen/src/api/index.ts	13
web-regulator	POST	/bright/reg/snapshots	body	brightCreateSnapshot(body: { schoolId: string; cameraId: string; at?: string; url?: string; })	frontend-helper	apps/web-regulator/src/services/api.ts	357
web-regulator	GET	/bright/reg/snapshots?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null)) as any).toString()}	\N	brightSnapshots(params: { schoolId?: string; cameraId?: string; start?: string; end?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	348
mobile-device	GET	/bright/school/cameras${qs}	false	fetchSchoolCameras(schoolId: string)	frontend-helper	apps/mobile-device/src/api/modules/bright.ts	14
web-school	GET	/bright/school/cameras${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	brightCameras(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	244
web-school	GET	/bright/school/download?schoolId=${encodeURIComponent(schoolId)}&cameraId=${encodeURIComponent(cameraId)}${start ? `&start=${encodeURIComponent(start)}` : ''}${end ? `&end=${encodeURIComponent(end)}` : ''}	\N	brightDownload(schoolId: string, cameraId: string, start: string, end: string)	frontend-helper	apps/web-school/src/services/api.ts	335
web-school	GET	/bright/school/playback?schoolId=${encodeURIComponent(schoolId)}&cameraId=${encodeURIComponent(cameraId)}${start ? `&start=${encodeURIComponent(start)}` : ''}${end ? `&end=${encodeURIComponent(end)}` : ''}	\N	brightPlayback(schoolId: string, cameraId: string, start: string, end: string)	frontend-helper	apps/web-school/src/services/api.ts	271
web-school	POST	/bright/school/snapshots	body	brightCreateSnapshot(body: { schoolId?: string; cameraId: string; at?: string; url?: string; })	frontend-helper	apps/web-school/src/services/api.ts	376
web-school	GET	/bright/school/snapshots?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null)) as any).toString()}	\N	brightSnapshots(params: { schoolId?: string; cameraId?: string; start?: string; end?: string })	frontend-helper	apps/web-school/src/services/api.ts	341
web-school	GET	/bright/school/trustivs-camera-options${qs ? `?${qs}` : ''}	\N	brightTrustivsCameraOptions(params: { schoolId?: string; canteenId?: string })	frontend-helper	apps/web-school/src/services/api.ts	266
web-school	GET	/bright/school/trustivs-cameras${qs ? `?${qs}` : ''}	\N	brightTrustivsCameras(params: { schoolId?: string; canteenId?: string } | string)	frontend-helper	apps/web-school/src/services/api.ts	258
web-school	GET	/bright/school/trustivs-cameras${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	brightTrustivsCameras(params: { schoolId?: string; canteenId?: string } | string)	frontend-helper	apps/web-school/src/services/api.ts	251
web-regulator	GET	/bright/start/${encodeURIComponent(schoolId)}/${encodeURIComponent(cameraId)}	\N	brightStart(schoolId: string, cameraId: string)	frontend-helper	apps/web-regulator/src/services/api.ts	340
web-school	GET	/bright/start/${encodeURIComponent(schoolId)}/${encodeURIComponent(cameraId)}	\N	brightStart(schoolId: string, cameraId: string)	frontend-helper	apps/web-school/src/services/api.ts	269
mobile-device	GET	/bright/start/${encodeURIComponent(String(schoolId))}/${encodeURIComponent(String(cameraId))}	\N	brightStart(schoolId: string|number, cameraId: string)	frontend-helper	apps/mobile-device/src/services/api.ts	137
web-school	POST	/deviceIot/getDeviceIdBySerialNumber	{ serialNumber }	dewoBindSerial(serialNumber: string)	frontend-helper	apps/web-school/src/services/api.ts	736
web-school	GET	/deviceIot/serials	\N	deviceIotSerials()	frontend-helper	apps/web-school/src/services/api.ts	745
mobile-device	POST	/files/upload	JSON.stringify({ filename, content: dataUrl })	requestUpload(filename: string, dataUrl: string)	fetch	apps/mobile-device/src/pages/companion/quick.vue	316
web-regulator	POST	/files/upload	JSON.stringify({ filename, content })	uploadImageBase64(filename: string, content: string)	fetch	apps/web-regulator/src/services/api.ts	1473
web-school	POST	/files/upload	{ filename, content }	uploadFile(filename: string, content: string)	requestJson	apps/web-school/src/services/api.ts	832
web-school	POST	/gatewayGBS/openApi/getAIRecordByCompany	{ pageNum: 1, pageSize: 10, fsocialcreditcode: fsocialcreditcode.value, startTime: aiStart.value, endTime: aiEnd.value }	onGetAIRecords()	frontend-helper	apps/web-school/src/views/TrustivsTest.vue	161
web-school	GET	/gatewayGBS/openApi/getBackUrl	{ serial: serial.value, code: code.value, starttime: starttime.value, endtime: endtime.value }	onGetBackUrl()	frontend-helper	apps/web-school/src/views/TrustivsTest.vue	104
web-school	GET	/gatewayGBS/openApi/getCameraByCompany?${qs}	\N	onGetCameraByCompany()	frontend-helper	apps/web-school/src/views/TrustivsTest.vue	142
web-school	POST	/gatewayGBS/openApi/getChannelByDevice	{ deviceId: deviceId.value }	onGetChannelByDevice()	frontend-helper	apps/web-school/src/views/TrustivsTest.vue	151
web-school	POST	/gatewayGBS/openApi/getCompanyList	{ pageNum: 1, pageSize: 10, fsocialcreditcode: fsocialcreditcode.value }	onGetCompanyList()	frontend-helper	apps/web-school/src/views/TrustivsTest.vue	123
web-school	POST	/gatewayGBS/openApi/getDeviceListByCompany	{ pageNum: 1, pageSize: 10, fsocialcreditcode: fsocialcreditcode.value }	onGetDeviceList()	frontend-helper	apps/web-school/src/views/TrustivsTest.vue	132
web-school	GET	/gatewayGBS/openApi/getDownloadUrl	{ serial: serial.value, code: code.value, starttime: starttime.value, endtime: endtime.value }	onGetDownloadUrl()	frontend-helper	apps/web-school/src/views/TrustivsTest.vue	113
web-school	POST	/gatewayGBS/openApi/getStreamURL	{ serial: serial.value, code: code.value, type: streamType.value }	onGetStream()	frontend-helper	apps/web-school/src/views/TrustivsTest.vue	94
screen	GET	/health	\N	serverTime()	frontend-helper	apps/screen/src/api/index.ts	5
stream-tester	GET	/healthz	(_req, res) => res.status(200).send('ok')	\N	frontend-helper	apps/stream-tester/server.js	22
web-school	GET	/home/devices	\N	devices()	frontend-helper	apps/web-school/src/services/api.ts	237
web-school	GET	/home/hygiene	\N	hygiene()	frontend-helper	apps/web-school/src/services/api.ts	236
web-school	GET	/home/inbound	\N	inbound()	frontend-helper	apps/web-school/src/services/api.ts	234
mobile-emergency	GET	/home/inbound${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	inboundHistory(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	32
web-school	GET	/home/outbound	\N	outbound()	frontend-helper	apps/web-school/src/services/api.ts	235
mobile-emergency	GET	/home/outbound${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	outboundHistory(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	33
mobile-emergency	GET	/home/parent-feedback	\N	feedback()	frontend-helper	apps/mobile-emergency/src/api/index.ts	19
web-school	GET	/home/parent-feedback	\N	feedback()	frontend-helper	apps/web-school/src/services/api.ts	377
web-school	GET	/integration.config.json	\N	bootstrap()	fetch	apps/web-school/src/main.ts	14
web-school	GET	/iot/cameras${qs}	\N	cameras(company: string)	fetch	apps/web-school/src/api/streams.ts	32
web-school	GET	/iot/streams/play?cameraId=${encodeURIComponent(cameraId)}	\N	play(cameraId: string)	fetch	apps/web-school/src/api/streams.ts	37
stream-tester	GET	/proxy	async (req, res) => { try { const target = req.query.url; if (!target || typeof target !== 'string') return res.status(400).send('missing url'); const u = new URL(target); if (!/^https?:$/.test(u.protocol)) return res.status(400).send('unsupported protocol'); const hdrs = {}; // forward range headers for segments if (req.headers['range']) hdrs['range'] = req.headers['range']; const r = await fetch(u, { method: 'GET', headers: hdrs }); const contentType = r.headers.get('content-type') || ''; cons	\N	frontend-helper	apps/stream-tester/server.js	58
mobile-device	POST	/public/feedback	body	publicFeedback(body: { content: string; contact: string; schoolId?: string|number; canteenId?: string|number; at?: string })	frontend-helper	apps/mobile-device/src/services/api.ts	199
web-school	GET	/push/foodList${q?`?q=${encodeURIComponent(q)}`:''}	\N	foods(q: string)	frontend-helper	apps/web-school/src/services/api.ts	666
web-school	GET	/push/mealTypeList	\N	mealTypes()	frontend-helper	apps/web-school/src/services/api.ts	664
web-regulator	POST	/reg/ai/broadcast	body	aiBroadcast(body: { school: string; camera: string; text: string })	frontend-helper	apps/web-regulator/src/services/api.ts	331
web-regulator	GET	/reg/ai/broadcast/logs	\N	aiBroadcastLogs()	frontend-helper	apps/web-regulator/src/services/api.ts	333
web-regulator	GET	/reg/ai/events?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null),\n        ) as any,\n      ).toString()}	\N	aiEvents(params: { schoolId?: string; type?: string; status?: 'OPEN' | 'ACK' | 'CLOSED' | ''; start?: string; end?: string; page?: number; pageSize?: number; })	frontend-helper	apps/web-regulator/src/services/api.ts	137
mobile-emergency	GET	/reg/ai/events?${new URLSearchParams(Object.fromEntries(Object.entries({ page: 1, pageSize: 20, ...params }).filter(([, v]) => v !== undefined && v !== '')) as any).toString()}	\N	regAiEvents(params: { schoolId?: string; page?: number; pageSize?: number })	frontend-helper	apps/mobile-emergency/src/api/index.ts	15
web-regulator	GET	/reg/ai/methods	\N	aiMethods()	frontend-helper	apps/web-regulator/src/services/api.ts	334
web-regulator	GET	/reg/ai/schools	\N	aiSchools()	frontend-helper	apps/web-regulator/src/services/api.ts	335
mobile-emergency	GET	/reg/ai/tasks	\N	regAiTasks()	frontend-helper	apps/mobile-emergency/src/api/index.ts	23
web-regulator	POST	/reg/ai/tasks	body	aiTaskCreate(body: { name: string; items: string[]; method: string; period?: { start?: string; end?: string }; schools: string[]; })	frontend-helper	apps/web-regulator/src/services/api.ts	321
web-regulator	GET	/reg/ai/tasks?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null)) as any).toString()}	\N	aiTasks(params: { status?: '待处理' | '进行中' | '已完成' | ''; start?: string; end?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	311
web-regulator	PATCH	/reg/ai/tasks/${encodeURIComponent(id)}	patch	aiTaskUpdate(id: string, patch: any)	frontend-helper	apps/web-regulator/src/services/api.ts	324
web-regulator	PATCH	/reg/ai/tasks/${encodeURIComponent(id)}/status?id=${encodeURIComponent(id)}	{ status }	aiTaskSetStatus(id: string, status: '待处理' | '进行中' | '已完成')	frontend-helper	apps/web-regulator/src/services/api.ts	327
web-regulator	GET	/reg/alerts/config	\N	alertsConfigGet()	frontend-helper	apps/web-regulator/src/services/api.ts	1265
web-regulator	POST	/reg/alerts/config	JSON.stringify(patch)	alertsConfigSave(patch: any)	fetch	apps/web-regulator/src/services/api.ts	1272
web-regulator	POST	/reg/alerts/notify	JSON.stringify(body)	alertsNotify(body: { to: string[]; message: string; channel?: 'sms' | 'app' | 'both'; })	fetch	apps/web-regulator/src/services/api.ts	1290
web-regulator	POST	/reg/alerts/notify-rectify	JSON.stringify(payload)	alertsNotifyRectify(payload: { schoolId: string | number; title: string; detail?: string; refId?: string })	fetch	apps/web-regulator/src/services/api.ts	1302
web-regulator	GET	/reg/alerts/summary${Object.keys(params).length ? `?${new URLSearchParams(params as any).toString()}` : ''}	\N	alertsSummary(params: { start?: string; end?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	1176
web-regulator	GET	/reg/credentials/canteens	\N	getCertOverview()	frontend-helper	apps/web-regulator/src/services/api.ts	395
web-regulator	GET	/reg/credentials/canteens	\N	getExpiringCertificates(params: { days?: number })	frontend-helper	apps/web-regulator/src/services/api.ts	453
web-regulator	GET	/reg/credentials/canteens?id=${encodeURIComponent(params.certificateId)}	\N	getCertificateDetail(params: { certificateId: string })	frontend-helper	apps/web-regulator/src/services/api.ts	876
mobile-emergency	GET	/reg/credentials/canteens${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	regCanteens(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	6
web-regulator	GET	/reg/credentials/canteens${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	credCanteens(schoolId: string)	frontend-helper	apps/web-regulator/src/services/api.ts	361
web-regulator	GET	/reg/credentials/exceptions	\N	getCertOverview()	frontend-helper	apps/web-regulator/src/services/api.ts	433
web-regulator	GET	/reg/credentials/exceptions?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '')) as any).toString()}	\N	credExceptions(params: { type?: 'canteen' | 'worker' | 'supplier'; schoolId?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	373
web-regulator	PATCH	/reg/credentials/exceptions/measure?id=${encodeURIComponent(id)}	{ measure }	credSetMeasure(id: string, measure: string)	frontend-helper	apps/web-regulator/src/services/api.ts	377
mobile-emergency	GET	/reg/credentials/exceptions${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	regExceptions(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	9
web-regulator	GET	/reg/credentials/overview${qs ? `?${qs}` : ''}	\N	regCertOverview(params: { days?: number; schoolId?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	484
web-regulator	GET	/reg/credentials/suppliers	\N	getCertOverview()	frontend-helper	apps/web-regulator/src/services/api.ts	397
web-regulator	GET	/reg/credentials/suppliers	\N	getExpiringCertificates(params: { days?: number })	frontend-helper	apps/web-regulator/src/services/api.ts	455
web-regulator	GET	/reg/credentials/suppliers?id=${encodeURIComponent(params.certificateId)}	\N	getCertificateDetail(params: { certificateId: string })	frontend-helper	apps/web-regulator/src/services/api.ts	878
web-regulator	GET	/reg/credentials/suppliers?id=${params.supplierId}	\N	getSupplierRecords(params: { supplierId: string; startDate?: string; endDate?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	781
mobile-emergency	GET	/reg/credentials/suppliers${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	regSuppliers(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	8
web-regulator	GET	/reg/credentials/suppliers${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	credSuppliers(schoolId: string)	frontend-helper	apps/web-regulator/src/services/api.ts	369
web-regulator	GET	/reg/credentials/workers	\N	getCertOverview()	frontend-helper	apps/web-regulator/src/services/api.ts	396
web-regulator	GET	/reg/credentials/workers	\N	getExpiringCertificates(params: { days?: number })	frontend-helper	apps/web-regulator/src/services/api.ts	454
web-regulator	GET	/reg/credentials/workers?id=${encodeURIComponent(params.certificateId)}	\N	getCertificateDetail(params: { certificateId: string })	frontend-helper	apps/web-regulator/src/services/api.ts	877
mobile-emergency	GET	/reg/credentials/workers${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	regWorkers(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	7
web-regulator	GET	/reg/credentials/workers${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	credWorkers(schoolId: string)	frontend-helper	apps/web-regulator/src/services/api.ts	365
web-regulator	GET	/reg/food-waste/details?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null)) as any).toString()}	\N	foodWasteDetails(params: { schoolId?: string; source?: '库存损耗' | '加工制作损耗' | '剩菜剩饭损耗'; start?: string; end?: string; page?: number; pageSize?: number; })	frontend-helper	apps/web-regulator/src/services/api.ts	1133
web-regulator	GET	/reg/food-waste/ranking?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '')) as any).toString()}	\N	foodWasteRanking(params: { start?: string; end?: string; metric?: 'weight' | 'amount' })	frontend-helper	apps/web-regulator/src/services/api.ts	1120
web-regulator	GET	/reg/food-waste/summary?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '')) as any).toString()}	\N	foodWasteSummary(params: { schoolId?: string; start?: string; end?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	1151
web-regulator	GET	/reg/food-waste/trend?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '')) as any).toString()}	\N	foodWasteTrend(params: { schoolId?: string; start?: string; end?: string; bucket?: 'day' | 'week' | 'month'; })	frontend-helper	apps/web-regulator/src/services/api.ts	1162
web-regulator	GET	/reg/inspections/config	\N	regTemplates()	frontend-helper	apps/web-regulator/src/services/api.ts	295
web-regulator	GET	/reg/inspections/config	\N	inspConfigGet()	frontend-helper	apps/web-regulator/src/services/api.ts	1483
web-regulator	POST	/reg/inspections/config/items	{ name }	inspConfigAddItem(name: string)	frontend-helper	apps/web-regulator/src/services/api.ts	1484
web-regulator	POST	/reg/inspections/config/items/remove	{ name }	inspConfigRemoveItem(name: string)	frontend-helper	apps/web-regulator/src/services/api.ts	1485
web-regulator	POST	/reg/inspections/config/penalties	{ name }	inspConfigAddPenalty(name: string)	frontend-helper	apps/web-regulator/src/services/api.ts	1486
web-regulator	POST	/reg/inspections/config/penalties/remove	{ name }	inspConfigRemovePenalty(name: string)	frontend-helper	apps/web-regulator/src/services/api.ts	1487
web-regulator	POST	/reg/inspections/config/publications	{ name }	inspConfigAddPublication(name: string)	frontend-helper	apps/web-regulator/src/services/api.ts	1488
web-regulator	POST	/reg/inspections/config/publications/remove	{ name }	inspConfigRemovePublication(name: string)	frontend-helper	apps/web-regulator/src/services/api.ts	1489
web-regulator	POST	/reg/inspections/tasks	{ ...payloadBase, schoolId: sid, assignee: firstAssignee }	regTaskCreate(body: any)	frontend-helper	apps/web-regulator/src/services/api.ts	259
web-regulator	GET	/reg/inspections/tasks?${new URLSearchParams(\n        Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null)),\n      ).toString()}	\N	regPlans(params: { status?: string; type?: string; start?: string; end?: string; owner?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	287
web-regulator	GET	/reg/inspections/tasks/${encodeURIComponent(id)}	\N	regTaskDetail(id: string)	frontend-helper	apps/web-regulator/src/services/api.ts	284
web-regulator	PATCH	/reg/inspections/tasks/${encodeURIComponent(id)}	patch	regTaskUpdate(id: string, patch: any)	frontend-helper	apps/web-regulator/src/services/api.ts	266
web-regulator	PATCH	/reg/inspections/tasks/${encodeURIComponent(id)}	{ status: '进行中' }	regTaskStart(id: string)	frontend-helper	apps/web-regulator/src/services/api.ts	268
web-regulator	PATCH	/reg/inspections/tasks/${encodeURIComponent(id)}	{ status: '进行中' }	regTaskContinue(id: string)	frontend-helper	apps/web-regulator/src/services/api.ts	269
web-regulator	PATCH	/reg/inspections/tasks/${encodeURIComponent(id)}	{ assignee: body.to }	regTaskReassign(id: string, body: { to: string })	frontend-helper	apps/web-regulator/src/services/api.ts	282
web-regulator	PATCH	/reg/inspections/tasks/${encodeURIComponent(id)}	{ content: `【延期至】${body.planAt}`, planAt: body.planAt }	regTaskDelay(id: string, body: { planAt: string })	frontend-helper	apps/web-regulator/src/services/api.ts	283
web-regulator	POST	/reg/inspections/tasks/${encodeURIComponent(id)}/submit	{ passed, items: mapped, summary: body?.record?.text || '', images: imgs }	regTaskSubmitReport(id: string, body: any)	frontend-helper	apps/web-regulator/src/services/api.ts	279
web-regulator	POST	/reg/inspections/tasks/bulk	{ type: payloadBase.type, schools, assignees, grid: undefined, content, planAt, perAssignee: true, }	regTaskCreate(body: any)	frontend-helper	apps/web-regulator/src/services/api.ts	246
web-regulator	GET	/reg/ledgers/data-stats${qs ? `?${qs}` : ''}	\N	ledgerDataStats(params: { schoolIds?: string[]; date?: string; start?: string; end?: string; metric?: 'quality'|'submission'; modules?: string[]; noBySchool?: boolean })	frontend-helper	apps/web-regulator/src/services/api.ts	1025
web-regulator	GET	/reg/ledgers/detail?${new URLSearchParams({ type, id } as any).toString()}	\N	ledgerDetail(type: 'sampling' | 'disinfection' | 'dine' | 'waste', id: string)	frontend-helper	apps/web-regulator/src/services/api.ts	1030
web-regulator	GET	/reg/ledgers/dine${qs ? `?${qs}` : ''}	\N	ledgerDine(params: { schoolId?: string; status?: '草稿' | '已提交' | ''; meal?: string; start?: string; end?: string; page?: number; pageSize?: number; })	frontend-helper	apps/web-regulator/src/services/api.ts	958
mobile-emergency	GET	/reg/ledgers/dine${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	regLedgersDine(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	27
web-regulator	GET	/reg/ledgers/disinfection${qs ? `?${qs}` : ''}	\N	ledgerDisinfection(params: { schoolId?: string; schoolIds?: string[]; method?: string; start?: string; end?: string; page?: number; pageSize?: number; })	frontend-helper	apps/web-regulator/src/services/api.ts	937
mobile-emergency	GET	/reg/ledgers/disinfection${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	regLedgersDisinfection(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	26
web-regulator	GET	/reg/ledgers/pesticide${qs ? `?${qs}` : ''}	\N	ledgerPesticide(params: { schoolId?: string; schoolIds?: string[]; start?: string; end?: string; page?: number; pageSize?: number })	frontend-helper	apps/web-regulator/src/services/api.ts	992
web-regulator	GET	/reg/ledgers/sampling${qs ? `?${qs}` : ''}	\N	ledgerSampling(params: { schoolId?: string; schoolIds?: string[]; start?: string; end?: string; page?: number; pageSize?: number; })	frontend-helper	apps/web-regulator/src/services/api.ts	915
mobile-emergency	GET	/reg/ledgers/sampling${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	regLedgersSampling(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	25
web-regulator	GET	/reg/ledgers/search${qs ? `?${qs}` : ''}	\N	ledgerSearch(params: { schoolIds?: string[]; start?: string; end?: string; type?: 'morning'|'sampling'|'disinfection'|'pesticide'|'waste'|''; page?: number; pageSize?: number; modules?: string[]; noBySchool?: boolean })	frontend-helper	apps/web-regulator/src/services/api.ts	1042
web-regulator	GET	/reg/ledgers/stats${Object.keys(params).length ? `?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([,v]) => v !== undefined && v !== '' && v !== null)) as any).toString()}` : ''}	\N	ledgerStats(params: { schoolId?: string; start?: string; end?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	998
web-regulator	GET	/reg/ledgers/submit-stats${qs ? `?${qs}` : ''}	\N	ledgerSubmitStats(params: { schoolIds?: string[]; start?: string; end?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	1010
web-regulator	GET	/reg/ledgers/waste${qs ? `?${qs}` : ''}	\N	ledgerWaste(params: { schoolId?: string; schoolIds?: string[]; category?: string | number; start?: string; end?: string; page?: number; pageSize?: number; })	frontend-helper	apps/web-regulator/src/services/api.ts	978
mobile-emergency	GET	/reg/ledgers/waste${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	regLedgersWaste(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	28
web-regulator	GET	/reg/overview	\N	overview()	frontend-helper	apps/web-regulator/src/services/api.ts	96
web-regulator	GET	/reg/public/feedback/list?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null)) as any).toString()}	\N	publicFeedbackList(params: { schoolId?: string; type?: '表扬' | '建议' | '投诉' | '评价' | ''; status?: '待处理' | '已回复' | ''; start?: string; end?: string; page?: number; pageSize?: number; })	frontend-helper	apps/web-regulator/src/services/api.ts	1334
web-regulator	POST	/reg/public/feedback/reply	JSON.stringify({ id, replyContent: content })	publicFeedbackReply(id: string, content: string)	fetch	apps/web-regulator/src/services/api.ts	1357
web-regulator	GET	/reg/public/feedback/stats?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '')) as any).toString()}	\N	publicFeedbackStats(params: { schoolId?: string; start?: string; end?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	1353
web-regulator	GET	/reg/rectifications?${new URLSearchParams(\n        Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null)),\n      ).toString()}	\N	regRectifications(params: { status?: string; schoolId?: string; owner?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	299
web-regulator	GET	/reg/rectifications/${encodeURIComponent(id)}	\N	regRectifyDetail(id: string)	frontend-helper	apps/web-regulator/src/services/api.ts	304
web-regulator	POST	/reg/rectifications/${encodeURIComponent(id)}/approve	{}	regRectifyApprove(id: string)	frontend-helper	apps/web-regulator/src/services/api.ts	305
web-regulator	POST	/reg/rectifications/${encodeURIComponent(id)}/reject	body	regRectifyReject(id: string, body: { reason: string })	frontend-helper	apps/web-regulator/src/services/api.ts	306
web-regulator	GET	/reg/reports/daily${qs ? `?${qs}` : ''}	\N	dailyReport(params: { start?: string; end?: string; schoolId?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	1089
web-regulator	GET	/reg/reports/export?format=csv${qs ? `&${qs}` : ''}	\N	dailyReportExportCsv(params: { start: string; end: string; schoolId?: string })	fetch	apps/web-regulator/src/services/api.ts	1100
web-regulator	GET	/reg/reports/export?format=pdf${qs ? `&${qs}` : ''}	\N	dailyReportExportPdf(params: { start: string; end: string; schoolId?: string })	fetch	apps/web-regulator/src/services/api.ts	1113
mobile-device	GET	/reg/schools	true	fetchRegSchools()	frontend-helper	apps/mobile-device/src/api/modules/school.ts	6
mobile-device	GET	/reg/schools	\N	regSchools()	frontend-helper	apps/mobile-device/src/services/api.ts	132
mobile-emergency	GET	/reg/schools	\N	regSchools()	frontend-helper	apps/mobile-emergency/src/api/index.ts	4
screen	GET	/reg/schools	\N	regSchools()	frontend-helper	apps/screen/src/api/index.ts	6
web-school	GET	/reg/schools	\N	regSchools()	frontend-helper	apps/web-school/src/services/api.ts	239
web-regulator	POST	/reg/schools/config	body	sysSchoolCreate(body: { name: string; enabled?: boolean; defaultUsername?: string; defaultPassword?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	102
web-regulator	PATCH	/reg/schools/config?id=${encodeURIComponent(String(id))}	body	sysSchoolUpdate(id: number, body: { name?: string; enabled?: boolean; defaultUsername?: string; defaultPassword?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	103
web-regulator	POST	/reg/schools/config/delete	{ id }	sysSchoolDelete(id: number)	frontend-helper	apps/web-regulator/src/services/api.ts	104
web-regulator	GET	/reg/schools/config${(() => { const p = new URLSearchParams(); if (params.q) p.set('q', params.q); if (params.enabled !== '' && params.enabled !== undefined) p.set('enabled', String(!!params.enabled)); const s = p.toString(); return s ? `?${s}` : ''; })()}	\N	sysSchools(params: { q?: string; enabled?: boolean | '' })	frontend-helper	apps/web-regulator/src/services/api.ts	99
web-regulator	GET	/reg/schools/stats	\N	schools()	frontend-helper	apps/web-regulator/src/services/api.ts	97
web-regulator	GET	/reg/schools/stats	\N	<anonymous>()	frontend-helper	apps/web-regulator/src/services/api.ts	1191
web-regulator	GET	/reg/system/info	\N	sysInfoGet()	frontend-helper	apps/web-regulator/src/services/api.ts	1450
web-regulator	POST	/reg/system/info	JSON.stringify(body)	sysInfoSave(body: any)	fetch	apps/web-regulator/src/services/api.ts	1452
web-regulator	GET	/reg/system/permissions	\N	sysPermissions()	frontend-helper	apps/web-regulator/src/services/api.ts	1431
web-regulator	GET	/reg/system/roles	\N	sysRoles()	frontend-helper	apps/web-regulator/src/services/api.ts	1403
web-regulator	PATCH	/reg/system/roles	JSON.stringify(body)	sysRoleUpdate(body: { id: number; patch: { name?: string; remark?: string } })	fetch	apps/web-regulator/src/services/api.ts	1414
web-regulator	POST	/reg/system/roles	JSON.stringify(body)	sysRoleCreate(body: { name: string; remark?: string })	fetch	apps/web-regulator/src/services/api.ts	1405
web-regulator	POST	/reg/system/roles/delete	JSON.stringify({ id })	sysRoleDelete(id: number)	fetch	apps/web-regulator/src/services/api.ts	1423
web-regulator	POST	/reg/system/roles/permissions	JSON.stringify({ name, permissions })	sysSetRolePerms(name: string, permissions: string[])	fetch	apps/web-regulator/src/services/api.ts	1442
web-regulator	GET	/reg/system/settings	\N	sysSettingsGet()	frontend-helper	apps/web-regulator/src/services/api.ts	1461
web-regulator	POST	/reg/system/settings	JSON.stringify(body)	sysSettingsSave(body: any)	fetch	apps/web-regulator/src/services/api.ts	1463
web-regulator	POST	/reg/system/units	body	regUnitCreate(body: any)	frontend-helper	apps/web-regulator/src/services/api.ts	111
web-regulator	GET	/reg/system/units?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([,v]) => v !== undefined && v !== '' && v !== null)) as any).toString()}	\N	regUnits(params: { page?: number; pageSize?: number; q?: string })	frontend-helper	apps/web-regulator/src/services/api.ts	108
web-regulator	PATCH	/reg/system/units?id=${encodeURIComponent(id)}	body	regUnitUpdate(id: string, body: any)	frontend-helper	apps/web-regulator/src/services/api.ts	112
web-regulator	PATCH	/reg/system/units?id=${encodeURIComponent(id)}	{ enabled }	regUnitToggle(id: string, enabled: boolean)	frontend-helper	apps/web-regulator/src/services/api.ts	113
web-regulator	POST	/reg/system/units/clear	\N	regUnitsClear()	frontend-helper	apps/web-regulator/src/services/api.ts	115
web-regulator	POST	/reg/system/units/delete	{ id }	regUnitDelete(id: string)	frontend-helper	apps/web-regulator/src/services/api.ts	114
web-regulator	POST	/reg/system/users	JSON.stringify(body)	sysUserCreate(body: { username: string; displayName: string; roles?: string[]; enabled?: boolean; unitId?: number; })	fetch	apps/web-regulator/src/services/api.ts	1377
web-regulator	PATCH	/reg/system/users?id=${encodeURIComponent(id)}	JSON.stringify(patch)	sysUserUpdate(id: string, patch: any)	fetch	apps/web-regulator/src/services/api.ts	1386
web-regulator	POST	/reg/system/users/delete	JSON.stringify({ id })	sysUserDelete(id: string)	fetch	apps/web-regulator/src/services/api.ts	1395
web-regulator	GET	/reg/system/users/detail?id=${encodeURIComponent(id)}	\N	sysUserDetail(id: string)	frontend-helper	apps/web-regulator/src/services/api.ts	1369
web-regulator	POST	/reg/system/users/roles	JSON.stringify({ id, roles })	sysSetUserRoles(id: string, roles: string[])	fetch	apps/web-regulator/src/services/api.ts	1433
web-regulator	GET	/reg/system/users${(() => { const p = new URLSearchParams(); if (params.unitId !== undefined && params.unitId !== '' && params.unitId !== null) p.set('unitId', String(params.unitId)); const s = p.toString(); return s ? `?${s}` : ''; })()}	\N	sysUsers(params: { unitId?: string | number })	frontend-helper	apps/web-regulator/src/services/api.ts	1366
web-regulator	GET	/regulator/morning-checks${qs}	\N	regMorningChecks(params: { schoolId?: string; start?: string; end?: string; page?: number; pageSize?: number })	frontend-helper	apps/web-regulator/src/services/api.ts	1050
mobile-device	GET	/reports/school/daily${qs}	\N	fetchSchoolDaily(schoolId: string)	frontend-helper	apps/mobile-device/src/api/modules/reports.ts	23
mobile-emergency	GET	/reports/school/daily${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	schoolDaily(schoolId: string)	frontend-helper	apps/mobile-emergency/src/api/index.ts	21
screen	GET	/reports/school/daily${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	schoolDaily(schoolId: string)	frontend-helper	apps/screen/src/api/index.ts	12
web-school	GET	/reports/school/daily${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	schoolDaily(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	504
web-school	GET	/school/ai/events?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null),\n        ) as any,\n      ).toString()}	\N	aiEventsList(params: { schoolId?: string; type?: string; status?: 'OPEN' | 'ACK' | 'CLOSED' | 'FALSE'; canteenId?: string; start?: string; end?: string; page?: number; pageSize?: number; })	frontend-helper	apps/web-school/src/services/api.ts	393
mobile-device	GET	/school/ai/events?${q.toString()}	\N	fetchAiEvents(params: { schoolId?: string; page?: number; pageSize?: number })	frontend-helper	apps/mobile-device/src/api/modules/ai.ts	19
web-school	GET	/school/ai/events/detail?id=${encodeURIComponent(id)}	\N	aiEventDetail(id: string)	frontend-helper	apps/web-school/src/services/api.ts	489
web-school	GET	/school/ai/events/export.csv?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null),\n        ) as any,\n      ).toString()}	\N	aiEventsExportCsv(params: { schoolId?: string; type?: string; status?: 'OPEN' | 'ACK' | 'CLOSED' | 'FALSE'; cameraId?: string; canteenId?: string; start?: string; end?: string; })	frontend-helper	apps/web-school/src/services/api.ts	411
web-school	POST	/school/ai/events/handle	{ eventId, measure }	aiEventHandle(eventId: string, measure: string)	frontend-helper	apps/web-school/src/services/api.ts	487
web-school	POST	/school/ai/events/handle	body	aiEventHandleEx(body: { eventId: string; decision?: '已现场纠正' | '误报' | '其他'; note?: string; evidence?: string[]; handledBy?: string })	frontend-helper	apps/web-school/src/services/api.ts	488
web-school	POST	/school/ai/events/mock	body	aiEventsMock(body: { schoolId?: string; count?: number; perCameraCount?: number; start?: string; end?: string; handledRatio?: number; falseRatio?: number; cameraIds?: string[] })	frontend-helper	apps/web-school/src/services/api.ts	492
web-school	PATCH	/school/ai/events/status?id=${encodeURIComponent(id)}	{ status: 'FALSE' }	aiEventMarkFalse(id: string)	frontend-helper	apps/web-school/src/services/api.ts	491
web-school	GET	/school/ai/events/summary?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null),\n        ) as any,\n      ).toString()}	\N	aiEventsSummary(params: { schoolId?: string; dim?: 'day' | 'week' | 'month'; start?: string; end?: string; })	frontend-helper	apps/web-school/src/services/api.ts	430
web-school	GET	/school/ai/events/summary/export.csv?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null),\n        ) as any,\n      ).toString()}	\N	aiEventsSummaryExportCsv(params: { schoolId?: string; dim?: 'day' | 'week' | 'month'; start?: string; end?: string; })	frontend-helper	apps/web-school/src/services/api.ts	463
web-school	GET	/school/ai/events${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	schoolEvents(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	379
web-school	GET	/school/ai/home/summary/local?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null),\n        ) as any,\n      ).toString()}	\N	aiHomeTypesLocal(params: { schoolId?: string; start?: string; end?: string })	frontend-helper	apps/web-school/src/services/api.ts	448
web-school	GET	/school/ai/home/summary/network?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null),\n        ) as any,\n      ).toString()}	\N	aiHomeTypesNetwork(params: { schoolId?: string; start?: string; end?: string })	frontend-helper	apps/web-school/src/services/api.ts	439
web-school	GET	/school/ai/strangers?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params)\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	aiStrangers(params: { schoolId?: string | number; start?: string; end?: string; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	494
web-regulator	GET	/school/ai/types	\N	aiTypes()	frontend-helper	apps/web-regulator/src/services/api.ts	95
web-school	GET	/school/ai/types	\N	aiTypes()	frontend-helper	apps/web-school/src/services/api.ts	380
web-school	GET	/school/analytics/alerts?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null),\n        ) as any,\n      ).toString()}	\N	analyticsAlerts(params: { schoolId?: string; type?: string; status?: '未处理' | '已处理'; start?: string; end?: string; canteenId?: number })	frontend-helper	apps/web-school/src/services/api.ts	1367
web-regulator	GET	/school/analytics/alerts?${qs.toString()}	\N	alertsEvents(params: { type?: string; schoolId?: string; start?: string; end?: string; page?: number; pageSize?: number; })	frontend-helper	apps/web-regulator/src/services/api.ts	1215
web-regulator	POST	/school/analytics/alerts/handle	JSON.stringify(payload)	analyticsAlertHandle(payload: { id: string; type: string; measure?: string; status?: '未处理' | '已处理' })	fetch	apps/web-regulator/src/services/api.ts	1314
web-school	POST	/school/analytics/alerts/handle	JSON.stringify(payload)	analyticsAlertHandle(payload: { id: string; type: string; measure?: string; status?: '未处理' | '已处理' })	fetch	apps/web-school/src/services/api.ts	1375
web-school	GET	/school/analytics/dashboard${params.schoolId ? `?schoolId=${encodeURIComponent(params.schoolId)}` : ''}	\N	analyticsDashboard(params: { schoolId?: string })	frontend-helper	apps/web-school/src/services/api.ts	1361
screen	GET	/school/analytics/dashboard${s ? `?${s}` : ''}	\N	analyticsDashboard(params: { schoolId?: string | number; canteenId?: string | number })	frontend-helper	apps/screen/src/api/index.ts	19
mobile-device	GET	/school/analytics/health${qs ? `?${qs}` : ''}	\N	schoolHealth(params: { schoolId?: string|number; canteenId?: string|number })	frontend-helper	apps/mobile-device/src/services/api.ts	151
mobile-device	GET	/school/analytics/personnel-health${qs ? `?${qs}` : ''}	\N	schoolPersonnelHealth(params: { schoolId?: string|number; canteenId?: string|number })	frontend-helper	apps/mobile-device/src/services/api.ts	147
web-school	POST	/school/assets/maintenance	body	assetsCreate(body: { asset: string; date?: string; action: string; by: string; schoolId?: number; })	frontend-helper	apps/web-school/src/services/api.ts	888
web-school	GET	/school/assets/maintenance?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries({ ...params })\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	assetsList(params: { asset?: string; start?: string; end?: string; page?: number; pageSize?: number; schoolId?: number; })	frontend-helper	apps/web-school/src/services/api.ts	873
web-school	PATCH	/school/canteen-detail	JSON.stringify(body)	canteenDetailUpdate(body: { canteenId: number; name?: string; address?: string; manager?: string; phone?: string; areaCovered?: number; staffCount?: number; eatPersonCount?: number; remark?: string; biz?: { id?: number; number: string; authority?: string; issueAt: string; expireAt: string; imageUrl?: string }; food?: { id?: number; number: string; authority?: string; permitItems?: string; issueAt: string; expireAt: string; imageUrl?: string }; })	fetch	apps/web-school/src/services/api.ts	1325
mobile-device	GET	/school/canteen-detail?${qs}	\N	canteenDetail(params: { canteenId: number|string; schoolId?: number|string })	frontend-helper	apps/mobile-device/src/services/api.ts	191
web-school	GET	/school/canteen-detail?canteenId=${encodeURIComponent(String(canteenId))}${schoolId ? `&schoolId=${encodeURIComponent(String(schoolId))}` : ''}	\N	canteenDetail(canteenId: number | string, schoolId: number | string)	frontend-helper	apps/web-school/src/services/api.ts	1311
web-school	POST	/school/canteen-detail/delete	JSON.stringify({ canteenId })	canteenDetailDelete(canteenId: number)	fetch	apps/web-school/src/services/api.ts	1334
web-school	POST	/school/canteens	body	canteenCreateSimple(body: { schoolId?: number; name: string; code?: string; address?: string; manager?: string; phone?: string; enabled?: boolean; instrument?: string; ygSn?: string })	frontend-helper	apps/web-school/src/services/api.ts	1262
web-school	POST	/school/canteens	JSON.stringify(body)	canteenCreate(body: { schoolId?: number; name: string; address?: string; manager?: string; phone?: string })	fetch	apps/web-school/src/services/api.ts	1343
web-school	GET	/school/canteens?${qs}	\N	canteensAll(schoolId: string | number)	frontend-helper	apps/web-school/src/services/api.ts	1251
web-school	GET	/school/canteens?${qs}	\N	canteensByStatus(schoolId: string | number, enabled: 'all' | 'true' | 'false')	frontend-helper	apps/web-school/src/services/api.ts	1259
web-school	PATCH	/school/canteens?id=${encodeURIComponent(String(id))}	patchBody	canteenUpdateSimple(id: number, patchBody: { name?: string; code?: string; address?: string; manager?: string; phone?: string; enabled?: boolean; instrument?: string | null; ygSn?: string | null })	frontend-helper	apps/web-school/src/services/api.ts	1267
web-school	GET	/school/canteens/summary${schoolId ? `?schoolId=${encodeURIComponent(String(schoolId))}` : ''}	\N	canteensSummary(schoolId: string | number)	frontend-helper	apps/web-school/src/services/api.ts	1225
mobile-device	GET	/school/canteens${qs ? `?${qs}` : ''}	\N	canteens(params: { schoolId?: string|number; enabled?: 'true'|'false'|'all' })	frontend-helper	apps/mobile-device/src/services/api.ts	130
web-school	GET	/school/canteens${schoolId ? `?schoolId=${encodeURIComponent(String(schoolId))}` : ''}	\N	canteensList(schoolId: string | number)	frontend-helper	apps/web-school/src/services/api.ts	1244
web-school	GET	/school/cater/categories	\N	caterCategories()	frontend-helper	apps/web-school/src/services/api.ts	727
web-school	GET	/school/cater/select${qs?`?${qs}`:''}	\N	caterSelect(params: Record<string, any>)	requestJson	apps/web-school/src/services/api.ts	721
web-school	POST	/school/certificates	body	certCreate(body: { owner: string; type: string; number: string; expireAt: string; schoolId?: string | number })	frontend-helper	apps/web-school/src/services/api.ts	1207
web-school	GET	/school/certificates?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries({ ...params })\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	certList(params: { owner?: string; type?: string; status?: '有效' | '过期'; schoolId?: string | number })	frontend-helper	apps/web-school/src/services/api.ts	1198
web-school	PATCH	/school/certificates?id=${encodeURIComponent(id)}	body	certUpdate(id: string, body: { owner?: string; type?: string; number?: string; expireAt?: string })	frontend-helper	apps/web-school/src/services/api.ts	1208
web-school	POST	/school/certificates/delete	{ id }	certDelete(id: string)	frontend-helper	apps/web-school/src/services/api.ts	1209
mobile-device	POST	/school/companion-meals	body	companionCreate(body: any)	frontend-helper	apps/mobile-device/src/services/api.ts	201
web-school	POST	/school/companion-meals	JSON.stringify(body)	companionMealCreate(body: { schoolId?: string | number; canteenId?: string | number; dineDate: string; meal: '早餐'|'午餐'|'晚餐'; personName: string; dinersCount: number; dishAspects?: string[]; rating?: number; images?: string[]; opinion?: string; signatureData: string; status?: '草稿'|'已提交'; })	fetch	apps/web-school/src/services/api.ts	1492
web-school	GET	/school/companion-meals?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries({\n            ...params,\n            canteenIds: (params.canteenIds || []).join(','),\n          }).filter(([, v]) => v !== undefined && v !== '' && v !== null).map(([k,v])=>[k,String(v)]),\n        ) as any,\n      ).toString()}	\N	companionMealsList(params: { schoolId?: string | number; canteenIds?: Array<string|number>; person?: string; ratingFilter?: 'all'|'good'|'normal'|'bad'; start?: string; end?: string; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	1468
web-school	DELETE	/school/companion-meals/${encodeURIComponent(String(id))}	\N	companionMealDelete(id: string | number)	fetch	apps/web-school/src/services/api.ts	1511
web-school	GET	/school/companion-meals/${encodeURIComponent(String(id))}	\N	companionMealDetail(id: string | number)	frontend-helper	apps/web-school/src/services/api.ts	1500
web-school	PATCH	/school/companion-meals/${encodeURIComponent(String(id))}	JSON.stringify(patch)	companionMealUpdate(id: string | number, patch: any)	fetch	apps/web-school/src/services/api.ts	1502
web-school	POST	/school/device-iot	body	deviceIotCreate(body: any)	frontend-helper	apps/web-school/src/services/api.ts	739
web-school	GET	/school/device-iot?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([,v])=>v!==undefined&&v!==''&&v!==null).map(([k,v])=>[k,String(v)])) as any).toString()}	\N	deviceIotConfigs(params: { schoolId?: number; canteenId?: number; deviceKind?: string; vendor?: string; enabled?: 'true'|'false'|'all'; q?: string })	frontend-helper	apps/web-school/src/services/api.ts	738
web-school	DELETE	/school/device-iot?id=${encodeURIComponent(String(id))}	\N	deviceIotDelete(id: number)	frontend-helper	apps/web-school/src/services/api.ts	741
web-school	PATCH	/school/device-iot?id=${encodeURIComponent(String(id))}	body	deviceIotUpdate(id: number, body: any)	frontend-helper	apps/web-school/src/services/api.ts	740
web-school	POST	/school/device-safety	JSON.stringify(body)	deviceSafetyCreate(body: { schoolId?: number | string; canteenId?: number | string; deviceName: string; items: string[]; result: '正常' | '异常'; description?: string; measures?: string; handler?: string; imageUrl?: string; signatureData?: string; checkDate: string; })	fetch	apps/web-school/src/services/api.ts	1431
web-school	GET	/school/device-safety?${new URLSearchParams(\n        Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null).map(([k,v])=>[k,String(v)])) as any,\n      ).toString()}	\N	deviceSafetyList(params: { schoolId?: number | string; canteenId?: number; start?: string; end?: string; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	1413
web-school	PATCH	/school/device-safety/${encodeURIComponent(String(id))}	JSON.stringify(payload)	deviceSafetyUpdate(id: number | string, body: { canteenId?: number | string | null; deviceName?: string; items?: string[]; result?: '正常' | '异常'; description?: string | null; measures?: string | null; handler?: string | null; imageUrl?: string | null; signatureData?: string | null; checkDate?: string; schoolId?: number | string; // ignored server-side for update })	fetch	apps/web-school/src/services/api.ts	1457
web-school	GET	/school/device-safety/detail?id=${encodeURIComponent(String(id))}	\N	deviceSafetyDetail(id: number | string)	frontend-helper	apps/web-school/src/services/api.ts	1439
web-school	GET	/school/devices?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null),\n        ) as any,\n      ).toString()}	\N	devicesList(params: { schoolId?: string; type?: string; status?: string; q?: string })	frontend-helper	apps/web-school/src/services/api.ts	1386
web-school	GET	/school/dine/meal-options	\N	dineMealOptions()	frontend-helper	apps/web-school/src/services/api.ts	989
web-school	GET	/school/dine/meals	\N	dineMeals()	frontend-helper	apps/web-school/src/services/api.ts	988
web-school	POST	/school/dine/qr/create	typeof mealOrCode === 'number' ? { mealCode: mealOrCode, schoolId } : { mealKey: mealOrCode, schoolId }	dineQrCreate(mealOrCode: string | number, schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1020
web-school	POST	/school/dine/records	body	dineCreate(body: { meal?: string; mealCode?: number; people: string[]; imageUrl?: string; comment?: string; schoolId?: string; })	frontend-helper	apps/web-school/src/services/api.ts	1018
web-school	GET	/school/dine/records?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries({ ...params })\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	dineList(params: { meal?: string; mealCode?: number; exception?: 'true' | 'false'; start?: string; end?: string; page?: number; pageSize?: number; schoolId?: string; })	frontend-helper	apps/web-school/src/services/api.ts	1002
web-school	PATCH	/school/dine/records/${encodeURIComponent(id)}/measure	{ measure }	dineSetMeasure(id: string, measure: string)	frontend-helper	apps/web-school/src/services/api.ts	1019
web-school	POST	/school/disinfection/records	body	disinfectionCreate(body: { method: string; duration: number; items: string; canteenId: number; responsible: string; at: string; // ISO datetime temperature?: number; imageUrl?: string; schoolId?: string; })	frontend-helper	apps/web-school/src/services/api.ts	920
web-school	GET	/school/disinfection/records?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries({ ...params })\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	disinfectionList(params: { method?: string; exception?: 'true' | 'false'; start?: string; end?: string; page?: number; pageSize?: number; schoolId?: string; })	frontend-helper	apps/web-school/src/services/api.ts	901
web-school	GET	/school/disinfection/records/${encodeURIComponent(id)}	\N	disinfectionDetail(id: string)	frontend-helper	apps/web-school/src/services/api.ts	922
web-school	PATCH	/school/disinfection/records/${encodeURIComponent(id)}/measure	{ measure }	disinfectionSetMeasure(id: string, measure: string)	frontend-helper	apps/web-school/src/services/api.ts	921
web-school	POST	/school/disinfection/records/import	isCsv ? (payload as string) : payload	disinfectionImport(payload: { items: any[] } | string)	requestJson	apps/web-school/src/services/api.ts	925
mobile-device	GET	/school/disinfection/records${qs ? `?${qs}` : ''}	\N	disinfectionList(params: { schoolId?: number|string; canteenId?: number|string; page?: number; pageSize?: number; method?: string; exception?: 'true'|'false'; start?: string; end?: string })	frontend-helper	apps/mobile-device/src/services/api.ts	174
web-school	POST	/school/foods	body	schoolFoodsCreate(body: { code?: string; name: string; canteenId?: number; remark?: string; imageUrl?: string; enabled?: boolean; by?: string })	frontend-helper	apps/web-school/src/services/api.ts	686
web-school	GET	/school/foods?${new URLSearchParams(Object.fromEntries(Object.entries({ ...params }).filter(([,v])=>v!==undefined&&v!=='')) as any).toString()}	\N	schoolFoodsList(params: { q?: string; status?: 'enabled'|'disabled'|'all'; canteenId?: number; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	685
web-school	PATCH	/school/foods/${encodeURIComponent(String(id))}	body	schoolFoodsUpdate(id: number, body: any)	frontend-helper	apps/web-school/src/services/api.ts	687
web-school	DELETE	/school/foods/${encodeURIComponent(String(id))}${code?`?code=${encodeURIComponent(code)}`:''}	\N	schoolFoodsDelete(id: number, code: string)	frontend-helper	apps/web-school/src/services/api.ts	688
web-school	GET	/school/foods/exists?name=${encodeURIComponent(name)}${canteenId!==undefined?`&canteenId=${encodeURIComponent(String(canteenId))}`:''}	\N	schoolFoodsExists(name: string, canteenId: number)	frontend-helper	apps/web-school/src/services/api.ts	697
web-school	POST	/school/foods/import	body	schoolFoodsImport(body: { items?: any[]; csv?: string; overwrite?: boolean; by?: string })	frontend-helper	apps/web-school/src/services/api.ts	689
web-school	GET	/school/home/overview?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null),\n        ) as any,\n      ).toString()}	\N	homeOverview(params: { schoolId?: string; canteenId?: string; aiPeriod?: 'week' | '7d' })	frontend-helper	apps/web-school/src/services/api.ts	227
web-school	POST	/school/hygiene/inspections	body	hygieneCreate(body: { date?: string; result: '合格' | '不合格'; by: string; remark?: string; schoolId?: number; })	frontend-helper	apps/web-school/src/services/api.ts	862
web-school	GET	/school/hygiene/inspections?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries({ ...params })\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	hygieneList(params: { result?: '合格' | '不合格'; start?: string; end?: string; page?: number; pageSize?: number; schoolId?: number; })	frontend-helper	apps/web-school/src/services/api.ts	847
web-school	POST	/school/inventory/additives	body	invAdditiveCreate(body: { name: string; amount: number; dish?: string; by?: string; schoolId?: string; })	frontend-helper	apps/web-school/src/services/api.ts	1194
web-school	GET	/school/inventory/additives${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	invAdditives(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1184
web-school	POST	/school/inventory/categories	{ name, schoolId }	invCategoryCreate(name: string, schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1023
web-school	GET	/school/inventory/categories${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	invCategories(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1022
web-school	POST	/school/inventory/inbound	body	invInboundCreate(body: { productId: string; qty: number; supplierId?: string; warehouseId?: string; imageUrl?: string; schoolId?: string; })	frontend-helper	apps/web-school/src/services/api.ts	1114
web-school	POST	/school/inventory/inbound/doc	body	invInboundCreateDoc(body: any)	frontend-helper	apps/web-school/src/services/api.ts	1118
web-school	GET	/school/inventory/inbound/doc?docNo=${encodeURIComponent(docNo)}	\N	invInboundDocDetail(docNo: string)	frontend-helper	apps/web-school/src/services/api.ts	1117
web-school	PATCH	/school/inventory/inbound/doc?docNo=${encodeURIComponent(docNo)}	body	invInboundUpdateDoc(docNo: string, body: any)	frontend-helper	apps/web-school/src/services/api.ts	1119
web-school	GET	/school/inventory/inbound/docs${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	invInboundDocs(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1082
web-school	GET	/school/inventory/inbound${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	invInboundList(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1078
web-school	POST	/school/inventory/outbound	body	invOutboundCreate(body: { productId: string; qty: number; purpose?: string; by?: string; receiver?: string; canteenId?: number; date?: string; warehouseId?: string; schoolId?: string; })	frontend-helper	apps/web-school/src/services/api.ts	1151
web-school	GET	/school/inventory/outbound/batches?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params)\n            .filter(([, v]) => v !== undefined && v !== null && v !== '')\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	invOutboundBatches(params: { schoolId?: string | number; productId: string | number; canteenId?: string | number })	frontend-helper	apps/web-school/src/services/api.ts	1131
web-school	GET	/school/inventory/outbound${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	invOutboundList(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1121
web-school	POST	/school/inventory/products	body	invProductCreate(body: { schoolId?: string | number; name: string; unit: string; category?: string; spec?: string; lastPrice?: number })	frontend-helper	apps/web-school/src/services/api.ts	1026
web-school	PATCH	/school/inventory/products?id=${encodeURIComponent(String(id))}	patchBody	invProductUpdate(id: number, patchBody: any)	frontend-helper	apps/web-school/src/services/api.ts	1027
web-school	POST	/school/inventory/products/delete	{ id }	invProductDelete(id: number)	frontend-helper	apps/web-school/src/services/api.ts	1030
web-school	GET	/school/inventory/products/import/cloud	\N	invImportCloud()	frontend-helper	apps/web-school/src/services/api.ts	1028
web-school	POST	/school/inventory/products/import/template	{ schoolId, items }	invImportTemplate(schoolId: string | number | undefined, items: Array<{ name: string; unit: string; category?: string; spec?: string; lastPrice?: number }>)	frontend-helper	apps/web-school/src/services/api.ts	1029
web-school	GET	/school/inventory/products${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	invProducts(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1025
web-school	GET	/school/inventory/stock/batches?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params)\n            .filter(([, v]) => v !== undefined && v !== null && v !== '')\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	invStockBatches(params: { schoolId?: string | number; near?: 'true' | 'false' })	frontend-helper	apps/web-school/src/services/api.ts	1158
web-school	POST	/school/inventory/stock/stocktake	body	invStocktake(body: { productId: string; qty: number; schoolId?: string })	frontend-helper	apps/web-school/src/services/api.ts	1181
web-school	POST	/school/inventory/stock/stocktake-batch	body	invStocktakeBatch(body: { schoolId?: string | number; inboundId: number | string; actualQty: number; operator?: string })	frontend-helper	apps/web-school/src/services/api.ts	1180
web-school	GET	/school/inventory/stock${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	invStock(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1154
web-school	POST	/school/inventory/suppliers	body	invSupplierCreate(body: any)	frontend-helper	apps/web-school/src/services/api.ts	1053
web-school	GET	/school/inventory/suppliers?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries({ ...params })\n            .filter(([, v]) => v !== undefined && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	invSuppliers(params: { q?: string; enabled?: 'true' | 'false'; expired?: 'true' | 'false'; expireStart?: string; expireEnd?: string; page?: number; pageSize?: number; schoolId?: string; })	frontend-helper	apps/web-school/src/services/api.ts	1044
web-school	PATCH	/school/inventory/suppliers?id=${encodeURIComponent(id)}	body	invSupplierUpdate(id: string, body: any)	frontend-helper	apps/web-school/src/services/api.ts	1276
web-school	POST	/school/inventory/suppliers/${encodeURIComponent(String(id))}/certificates	body	invSupplierAddCert(id: string | number, body: { type: string; number?: string; authority?: string; expireAt?: string; imageUrl?: string })	frontend-helper	apps/web-school/src/services/api.ts	1304
web-school	POST	/school/inventory/suppliers/delete	{ id }	invSupplierDelete(id: string)	frontend-helper	apps/web-school/src/services/api.ts	1277
web-school	GET	/school/inventory/suppliers/detail?id=${encodeURIComponent(String(id))}	\N	invSupplierDetail(id: string | number)	frontend-helper	apps/web-school/src/services/api.ts	1278
web-school	POST	/school/inventory/suppliers/enable/batch	{ ids, enabled }	invSuppliersBatchEnable(ids: string[], enabled: boolean)	frontend-helper	apps/web-school/src/services/api.ts	1279
web-school	GET	/school/inventory/suppliers/export.csv	\N	invSuppliersExportCsv()	frontend-helper	apps/web-school/src/services/api.ts	1281
web-school	POST	/school/inventory/suppliers/import	isCsv ? (payload as string) : payload	invSuppliersImport(payload: { items: any[] } | string)	requestJson	apps/web-school/src/services/api.ts	1293
web-school	GET	/school/inventory/suppliers/summary?id=${encodeURIComponent(String(id))}	\N	invSupplierSummary(id: string | number)	frontend-helper	apps/web-school/src/services/api.ts	1307
web-school	POST	/school/inventory/warehouses	body	invWarehouseCreate(body: { name: string; location?: string; capacity?: number; schoolId?: string; })	frontend-helper	apps/web-school/src/services/api.ts	1064
web-school	PATCH	/school/inventory/warehouses?id=${encodeURIComponent(id)}	body	invWarehouseUpdate(id: string, body: { name?: string; location?: string; capacity?: number })	frontend-helper	apps/web-school/src/services/api.ts	1074
web-school	POST	/school/inventory/warehouses/delete	{ id }	invWarehouseDelete(id: string)	frontend-helper	apps/web-school/src/services/api.ts	1076
web-school	GET	/school/inventory/warehouses${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	invWarehouses(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1055
web-school	POST	/school/meal-plans	body	mealPlansCreate(body: { schoolId: number; canteenId?: number; date: string; meal: string; foods: string[]; remark?: string; by?: string })	frontend-helper	apps/web-school/src/services/api.ts	672
web-school	GET	/school/meal-plans?${new URLSearchParams(Object.fromEntries(Object.entries({ ...params }).filter(([,v])=>v!==undefined&&v!=='')) as any).toString()}	\N	mealPlansList(params: { schoolId?: number; canteenId?: number; start?: string; end?: string; meal?: string; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	669
web-school	DELETE	/school/meal-plans/${encodeURIComponent(String(id))}	\N	mealPlansDelete(id: number)	frontend-helper	apps/web-school/src/services/api.ts	674
web-school	PATCH	/school/meal-plans/${encodeURIComponent(String(id))}	body	mealPlansUpdate(id: number, body: any)	frontend-helper	apps/web-school/src/services/api.ts	673
web-school	POST	/school/meal-plans/copy-week	body	mealPlansCopyWeek(body: { schoolId: number; canteenId?: number; from: string; to: string; overwrite?: boolean })	frontend-helper	apps/web-school/src/services/api.ts	683
web-school	POST	/school/meal-plans/import	body	mealPlansImport(body: { items: any[]; overwrite?: boolean })	frontend-helper	apps/web-school/src/services/api.ts	682
web-school	GET	/school/messages/rectify?${new URLSearchParams(\n        Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null)) as any,\n      ).toString()}	\N	schoolRectifyMessages(params: { schoolId?: string; start?: string; end?: string; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	1651
web-school	POST	/school/morning-checks	body	morningCreate(body: { staff: string; temp: number; schoolId?: number; at?: string; // 指定日期/时间（可选） hygiene?: '正常'|'异常'; photoUrl?: string; // Optional third-party-compatible fields State?: number; CheckResult?: number; HeathResult?: number; IsUrl?: boolean | number; Picture_Img_Base64?: string; Picture_Img_Url?: string; Face_Img_Base64?: string; Face_Img_Url?: string; Picture_Back_Img_Base64?: string; Picture_Back_Img_Url?: string; })	frontend-helper	apps/web-school/src/services/api.ts	579
web-school	GET	/school/morning-checks?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params)\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	morningList(params: { schoolId?: number; canteenId?: number|string; staff?: string; result?: '正常' | '异常'; start?: string; end?: string; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	533
mobile-emergency	GET	/school/morning-checks?${new URLSearchParams(Object.fromEntries(Object.entries({ page: 1, pageSize: 50, ...params }).filter(([, v]) => v !== undefined && v !== '')) as any).toString()}	\N	morningChecks(params: { schoolId?: string; page?: number; pageSize?: number })	frontend-helper	apps/mobile-emergency/src/api/index.ts	30
web-school	DELETE	/school/morning-checks/${encodeURIComponent(String(id))}	\N	morningDelete(id: number)	frontend-helper	apps/web-school/src/services/api.ts	580
web-school	PATCH	/school/morning-checks/${encodeURIComponent(String(id))}/handle	body	morningSetHandle(id: number, body: { decision: 'allow'|'suspend'; note: string })	frontend-helper	apps/web-school/src/services/api.ts	582
web-school	PATCH	/school/morning-checks/${encodeURIComponent(String(id))}/measure	{ measure }	morningSetMeasure(id: number, measure: string)	frontend-helper	apps/web-school/src/services/api.ts	581
web-school	GET	/school/morning-checks/history?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params)\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	morningHistory(params: { schoolId: number | string; staff: number | string; date: string })	frontend-helper	apps/web-school/src/services/api.ts	543
web-school	GET	/school/morning-checks/overview?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null).map(([k,v])=>[k,String(v)]),\n        ) as any,\n      ).toString()}	\N	morningOverview(params: { schoolId?: number|string; date?: string })	frontend-helper	apps/web-school/src/services/api.ts	553
web-regulator	GET	/school/morning-checks${qs ? `?${qs}` : ''}	\N	schoolMorningChecks(params: { schoolId?: string; schoolIds?: string[]; staff?: string; result?: '正常' | '异常'; start?: string; end?: string; page?: number; pageSize?: number })	frontend-helper	apps/web-regulator/src/services/api.ts	1078
web-school	POST	/school/personnel	body	personnelCreate(body: any)	frontend-helper	apps/web-school/src/services/api.ts	1272
web-school	GET	/school/personnel?${new URLSearchParams(Object.fromEntries(Object.entries({ ...params }).filter(([,v])=>v!==undefined&&v!=='')) as any).toString()}	\N	personnelList(params: { schoolId?: number; name?: string; phone?: string; canteenId?: number; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	767
web-school	PATCH	/school/personnel?id=${encodeURIComponent(String(id))}	patchBody	personnelUpdate(id: number, patchBody: any)	frontend-helper	apps/web-school/src/services/api.ts	1273
web-school	POST	/school/personnel/delete	{ id }	personnelDelete(id: number)	frontend-helper	apps/web-school/src/services/api.ts	1274
web-school	GET	/school/personnel/detail?id=${encodeURIComponent(String(id))}	\N	personnelDetail(id: number | string)	frontend-helper	apps/web-school/src/services/api.ts	1275
mobile-device	GET	/school/personnel${qs ? `?${qs}` : ''}	\N	personnelList(params: { schoolId?: number|string; canteenId?: number|string; page?: number; pageSize?: number })	frontend-helper	apps/mobile-device/src/services/api.ts	196
web-school	POST	/school/pesticide/device/callback	body	pesticideDeviceCallback(body: { sample: string; device: string; result: '合格' | '不合格'; remark?: string; schoolId?: number; })	frontend-helper	apps/web-school/src/services/api.ts	985
web-school	POST	/school/pesticide/records	body	pesticideCreate(body: { sample: string; device: string; result: '合格' | '不合格'; imageUrl?: string; remark?: string; schoolId?: number; canteenId?: number; jiancedidian?: string; lianxidianhua?: string; tester?: string; value?: number | string; at?: string; // 检测时间（可选 ISO） })	frontend-helper	apps/web-school/src/services/api.ts	822
web-school	GET	/school/pesticide/records?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries({ ...params })\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	pesticideList(params: { q?: string; result?: '合格' | '不合格'; start?: string; end?: string; page?: number; pageSize?: number; schoolId?: number; })	frontend-helper	apps/web-school/src/services/api.ts	780
web-school	PATCH	/school/pesticide/records/${encodeURIComponent(String(id))}/measure	{ measure }	pesticideSetMeasure(id: number, measure: string)	frontend-helper	apps/web-school/src/services/api.ts	986
mobile-device	GET	/school/pesticide/records${qs ? `?${qs}` : ''}	\N	pesticideList(params: { schoolId?: number|string; canteenId?: number|string; page?: number; pageSize?: number; q?: string; result?: '合格'|'不合格'; start?: string; end?: string })	frontend-helper	apps/mobile-device/src/services/api.ts	186
web-school	POST	/school/public/config	cfg	publicConfigUpdate(cfg: any & { schoolId?: string })	frontend-helper	apps/web-school/src/services/api.ts	1353
web-school	GET	/school/public/config/audit${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	publicConfigAudit(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1354
web-school	GET	/school/public/config/feedback/qr?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([,v]) => v!==undefined && v!=='' && v!==null)) as any).toString()}	\N	publicFeedbackQr(params: { schoolId?: string; canteenId?: string })	frontend-helper	apps/web-school/src/services/api.ts	1356
web-school	GET	/school/public/config${schoolId ? `?schoolId=${encodeURIComponent(schoolId)}` : ''}	\N	publicConfigGet(schoolId: string)	frontend-helper	apps/web-school/src/services/api.ts	1352
web-school	GET	/school/public/feedback?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries(params)\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	publicFeedbackList(params: { schoolId: number | string; canteenId?: number | string; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	478
web-school	GET	/school/risk/catalog	\N	riskCatalog()	frontend-helper	apps/web-school/src/services/api.ts	1394
web-school	POST	/school/risk/catalog	JSON.stringify(body)	riskCatalogCreate(body: { category?: string; title: string; level: '低' | '中' | '高'; desc?: string; })	fetch	apps/web-school/src/services/api.ts	1401
web-school	PATCH	/school/risk/catalog?id=${encodeURIComponent(id)}	JSON.stringify(body)	riskCatalogUpdate(id: string, body: any)	fetch	apps/web-school/src/services/api.ts	1519
web-school	POST	/school/risk/catalog/delete	JSON.stringify({ id })	riskCatalogDelete(id: string)	fetch	apps/web-school/src/services/api.ts	1528
web-school	GET	/school/risk/catalog/export.csv	\N	riskCatalogExportCsv()	fetch	apps/web-school/src/services/api.ts	1640
web-school	POST	/school/risk/reports	JSON.stringify(body)	riskReportCreate(body: { schoolId?: string; location: string; object: string; desc: string; images?: string[]; riskId?: string; })	fetch	apps/web-school/src/services/api.ts	1559
web-school	GET	/school/risk/reports?${new URLSearchParams(Object.fromEntries(Object.entries({ ...params }).filter(([, v]) => v !== undefined && v !== '' && v !== null)) as any).toString()}	\N	riskReports(params: { schoolId?: string; status?: '待处理' | '整改中' | '已整改'; start?: string; end?: string; location?: string; object?: string; page?: number; pageSize?: number; })	frontend-helper	apps/web-school/src/services/api.ts	1548
web-school	GET	/school/risk/reports/detail?id=${encodeURIComponent(id)}	\N	riskReportDetail(id: string)	frontend-helper	apps/web-school/src/services/api.ts	1648
web-school	PATCH	/school/risk/reports/status?id=${encodeURIComponent(id)}	JSON.stringify(body)	riskReportSetStatus(id: string, body: { status: '待处理' | '整改中' | '已整改'; measures?: string; rectifiedBy?: string })	fetch	apps/web-school/src/services/api.ts	1571
web-school	POST	/school/risk/tasks	JSON.stringify(body)	riskTaskCreate(body: { assignee: string; location: string; object: string; riskId?: string; dueAt?: string; note?: string; })	fetch	apps/web-school/src/services/api.ts	1606
web-school	GET	/school/risk/tasks?${new URLSearchParams(Object.fromEntries(Object.entries({ ...params }).filter(([, v]) => v !== undefined && v !== '' && v !== null)) as any).toString()}	\N	riskTasks(params: { schoolId?: string; assignee?: string; status?: '待处理' | '进行中' | '已完成'; start?: string; end?: string; })	frontend-helper	apps/web-school/src/services/api.ts	1595
web-school	GET	/school/risk/tasks/detail?id=${encodeURIComponent(id)}	\N	riskTaskDetail(id: string)	frontend-helper	apps/web-school/src/services/api.ts	1646
web-school	PATCH	/school/risk/tasks/status?id=${encodeURIComponent(id)}	JSON.stringify({ status })	riskTaskSetStatus(id: string, status: '待处理' | '进行中' | '已完成')	fetch	apps/web-school/src/services/api.ts	1615
web-school	POST	/school/risk/tasks/submit	JSON.stringify({ id, result, images })	riskTaskSubmit(id: string, result: string, images: string[])	fetch	apps/web-school/src/services/api.ts	1624
web-school	POST	/school/sampling/operators	body	samplingOpsAdd(body: { schoolId?: number; canteenId?: number; serialNumber?: string; password?: string; faceOssUrl?: string; faceFilePath?: string; personnelIds: number[] })	frontend-helper	apps/web-school/src/services/api.ts	730
web-school	GET	/school/sampling/operators?${new URLSearchParams(Object.fromEntries(Object.entries({ ...params }).filter(([,v])=>v!==undefined&&v!=='')) as any).toString()}	\N	samplingOpsList(params: { schoolId?: number; page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	729
web-school	GET	/school/sampling/operators/detail?id=${encodeURIComponent(String(id))}	\N	samplingOpsDetail(id: string|number)	frontend-helper	apps/web-school/src/services/api.ts	734
web-school	POST	/school/sampling/operators/remove	body	samplingOpsRemove(body: { ids: number[] })	frontend-helper	apps/web-school/src/services/api.ts	731
web-school	POST	/school/sampling/operators/sync	body	samplingOpsSync(body: { schoolId?: number })	frontend-helper	apps/web-school/src/services/api.ts	732
web-school	POST	/school/sampling/operators/upsert	body	samplingOpsUpsert(body: { id: string|number; userName?: string; faceOssUrl?: string; faceFilePath?: string; updTime?: string; pushTime?: string; userNo?: string; jobTitle?: string; enabled?: boolean; canteenId?: number; serialNumber?: string; password?: string })	frontend-helper	apps/web-school/src/services/api.ts	733
web-school	POST	/school/sampling/records	body	samplingCreate(body: { sample: string; weight: number; imageUrl?: string; duration: number; by: string; cabinet?: string; schoolId?: number; canteenId?: number; cookTime?: string; })	frontend-helper	apps/web-school/src/services/api.ts	661
web-school	GET	/school/sampling/records?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries({ ...params })\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	samplingList(params: { sample?: string; status?: string; exception?: 'true' | 'false'; start?: string; end?: string; page?: number; pageSize?: number; schoolId?: number; })	frontend-helper	apps/web-school/src/services/api.ts	622
web-school	PATCH	/school/sampling/records/${encodeURIComponent(String(id))}/measure	{ measure }	samplingSetMeasure(id: number, measure: string)	frontend-helper	apps/web-school/src/services/api.ts	662
web-school	PATCH	/school/sampling/records/${encodeURIComponent(String(id))}/status	body	samplingUpdateStatus(id: number, body: { status?: 'ACTIVE' | 'CLEARED'; quyangUserName?: string; takeTime?: string })	frontend-helper	apps/web-school/src/services/api.ts	1069
mobile-device	GET	/school/sampling/records${qs ? `?${qs}` : ''}	\N	samplingList(params: { schoolId?: number|string; pageSize?: number; start?: string; end?: string })	frontend-helper	apps/mobile-device/src/services/api.ts	162
web-school	POST	/school/system/announcements	JSON.stringify(body)	sysAnnouncementCreate(body: { title: string; content: string }, traceId: string)	fetch	apps/web-school/src/services/api.ts	1664
web-school	GET	/school/system/announcements?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined)) as any).toString()}	\N	sysAnnouncements(params: { page?: number; pageSize?: number })	frontend-helper	apps/web-school/src/services/api.ts	1658
web-school	POST	/school/system/announcements/attach	JSON.stringify({ id, ...att })	sysAnnouncementAttach(id: string, att: { name: string; url: string }, traceId: string)	fetch	apps/web-school/src/services/api.ts	1826
web-school	GET	/school/system/announcements/detail?id=${encodeURIComponent(id)}	\N	sysAnnouncementDetail(id: string)	frontend-helper	apps/web-school/src/services/api.ts	1662
web-school	GET	/school/system/apps	\N	sysApps()	frontend-helper	apps/web-school/src/services/api.ts	1706
web-school	GET	/school/system/canteen	\N	sysCanteenGet()	fetch	apps/web-school/src/services/api.ts	1673
web-school	POST	/school/system/canteen	JSON.stringify(body)	sysCanteenSave(body: any)	fetch	apps/web-school/src/services/api.ts	1678
web-school	POST	/school/system/linkage/apply	JSON.stringify(body)	sysLinkageApply(body: { org: string; contact?: string; remark?: string })	fetch	apps/web-school/src/services/api.ts	1689
web-school	PATCH	/school/system/linkage/review?id=${encodeURIComponent(id)}	JSON.stringify({ status, comment })	sysLinkageReview(id: string, status: 'APPROVED' | 'REJECTED', comment: string)	fetch	apps/web-school/src/services/api.ts	1698
web-school	GET	/school/system/linkage${status ? `?status=${encodeURIComponent(status)}` : ''}	\N	sysLinkageList(status: 'PENDING' | 'APPROVED' | 'REJECTED')	frontend-helper	apps/web-school/src/services/api.ts	1687
web-school	GET	/school/system/news?${new URLSearchParams(Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '')) as any).toString()}	\N	sysNews(params: { page?: number; pageSize?: number; enabled?: 'true' | 'false' })	frontend-helper	apps/web-school/src/services/api.ts	825
web-school	GET	/school/system/news/detail?id=${encodeURIComponent(id)}	\N	sysNewsDetail(id: string)	frontend-helper	apps/web-school/src/services/api.ts	829
web-school	POST	/school/system/org-type	body	sysOrgTypeSave(orgType: 'school'|'enterprise', schoolId: number|string)	frontend-helper	apps/web-school/src/services/api.ts	1823
web-school	GET	/school/system/org-type${qs}	\N	sysOrgTypeGet(schoolId: number|string)	frontend-helper	apps/web-school/src/services/api.ts	1818
web-school	GET	/school/system/permissions	\N	sysPermissions()	frontend-helper	apps/web-school/src/services/api.ts	1804
web-school	PATCH	/school/system/roles	JSON.stringify({ id, patch })	sysRoleUpdate(id: number, patch: { name?: string; remark?: string }, traceId: string)	fetch	apps/web-school/src/services/api.ts	1771
web-school	POST	/school/system/roles	JSON.stringify({ name, remark, schoolId })	sysRoleCreate(name: string, remark: string, schoolId: number, traceId: string)	fetch	apps/web-school/src/services/api.ts	1753
web-school	GET	/school/system/roles?${new URLSearchParams(\n      Object.fromEntries(Object.entries(params).filter(([, v]) => v !== undefined && v !== '' && v !== null)) as any,\n    ).toString()}	\N	sysRoles(params: { schoolId?: number; q?: string })	frontend-helper	apps/web-school/src/services/api.ts	1749
web-school	POST	/school/system/roles/delete	JSON.stringify({ id })	sysRoleDelete(id: number)	fetch	apps/web-school/src/services/api.ts	1787
web-school	POST	/school/system/roles/permissions	JSON.stringify({ name, permissions })	sysRoleSetPermissions(name: string, permissions: string[], traceId: string)	fetch	apps/web-school/src/services/api.ts	1807
web-school	GET	/school/system/roles/permissions?name=${encodeURIComponent(name)}	\N	sysRolePermissions(name: string)	frontend-helper	apps/web-school/src/services/api.ts	1805
web-school	PATCH	/school/system/users	JSON.stringify({ id, patch })	sysUserUpdate(id: number | string, patch: { name?: string; phone?: string; remark?: string; enabled?: boolean; password?: string }, traceId: string)	fetch	apps/web-school/src/services/api.ts	1722
web-school	POST	/school/system/users	JSON.stringify(body)	sysUserCreate(body: { name: string; phone?: string; roles?: string[]; remark?: string; enabled?: boolean; password?: string }, traceId: string)	fetch	apps/web-school/src/services/api.ts	1709
web-school	POST	/school/system/users/delete	JSON.stringify({ id })	sysUserDelete(id: number | string, traceId: string)	fetch	apps/web-school/src/services/api.ts	1731
web-school	POST	/school/system/users/enabled	JSON.stringify({ id, enabled })	sysUserSetEnabled(id: number | string, enabled: boolean, traceId: string)	fetch	apps/web-school/src/services/api.ts	1740
web-school	POST	/school/system/users/roles	JSON.stringify({ id, roles })	sysUserSetRoles(id: string, roles: string[], traceId: string)	fetch	apps/web-school/src/services/api.ts	1796
web-school	GET	/school/system/users${schoolId!==undefined&&schoolId!==null&&String(schoolId) !== '' ? `?schoolId=${encodeURIComponent(String(schoolId))}` : ''}	\N	sysUsers(schoolId: string | number)	frontend-helper	apps/web-school/src/services/api.ts	1707
web-school	POST	/school/waste/categories	{ name }	wasteCategoryCreate(name: string)	frontend-helper	apps/web-school/src/services/api.ts	933
web-school	GET	/school/waste/categories?enabled=all	\N	wasteCategories()	frontend-helper	apps/web-school/src/services/api.ts	932
web-school	DELETE	/school/waste/categories/${encodeURIComponent(id)}	\N	wasteCategoryDelete(id: string)	frontend-helper	apps/web-school/src/services/api.ts	935
web-school	PATCH	/school/waste/categories/${encodeURIComponent(id)}/enable	{ enabled }	wasteCategorySetEnabled(id: string, enabled: boolean)	frontend-helper	apps/web-school/src/services/api.ts	934
web-school	POST	/school/waste/records	body	wasteCreate(body: { date?: string; category: string; amount: number; buyer: string; person: string; schoolId?: number; canteenId?: number; })	frontend-helper	apps/web-school/src/services/api.ts	964
web-school	GET	/school/waste/records?${new URLSearchParams(\n        Object.fromEntries(\n          Object.entries({ ...params })\n            .filter(([, v]) => v !== undefined && v !== '' && v !== null)\n            .map(([k, v]) => [k, String(v)]),\n        ) as any,\n      ).toString()}	\N	wasteList(params: { category?: string; start?: string; end?: string; page?: number; pageSize?: number; schoolId?: number; canteenId?: number; })	frontend-helper	apps/web-school/src/services/api.ts	947
web-school	DELETE	/school/waste/records/${encodeURIComponent(String(id))}	\N	wasteDelete(id: number)	frontend-helper	apps/web-school/src/services/api.ts	965
screen	GET	/screen/analytics/cameras${(() => {\n        const q: Record<string, string> = {};\n        if (schoolId !== undefined && schoolId !== null && String(schoolId) !== '') q.schoolId = String(schoolId);\n        if (canteenId !== undefined && canteenId !== null && String(canteenId) !== '') q.canteenId = String(canteenId);\n        const qs = new URLSearchParams(q as any).toString();\n        return qs ? `?${qs}` : '';\n      })()}	\N	schoolCameras(schoolId: string | number, canteenId: string | number)	frontend-helper	apps/screen/src/api/index.ts	71
mobile-device	GET	/screen/analytics/cameras${schoolId ? `?schoolId=${encodeURIComponent(String(schoolId))}` : ''}	\N	brightCameras(schoolId: string|number)	frontend-helper	apps/mobile-device/src/services/api.ts	135
mobile-device	GET	/screen/analytics/personnel-health${qs ? `?${qs}` : ''}	\N	screenPersonnelHealth(params: { schoolId?: string|number; canteenId?: string|number })	frontend-helper	apps/mobile-device/src/services/api.ts	143
web-school	GET	/system/storage/status	\N	storageStatus()	frontend-helper	apps/web-school/src/services/api.ts	742
