凌晨一点零七分,朝阳区某社区养老服务中心家属群里跳出一张截图。没配字,就一行红字:“页面写余量2,后台是0。”右上角那个蓝色刷新图标,点到边缘都泛灰了——不是没人刷,是刷完照样空转。

轮询停在第三天早上八点

前端每15秒GET一次市级监管平台API。数字跳得勤。早高峰一来,单页每分钟发237次请求。监管平台扛不住,直接返回503。

错误没进日志。只在控制台闪一下就被吞掉。家属刷新,前台翻Excel,手一抖把“已满”打成“已瞒”。没人存心糊弄。就是三套时间根本没对齐:数据库事务提交延迟、API网关缓存TTL、前端机械轮询节拍。

我们砍掉了轮询。换成WebSocket直连/beds/{centerId}/live。连接建好后,payload压到178字节。数字一变,立刻触发speechSynthesis.speak(),语音内容只有六个字:“床位,三张”。音量设0.4,不带升调降调,专为听力尚可但看不清小字的老人备的。

TTS不支持?那就同步往DOM里塞<span aria-live="polite">床位,三张</span>。没动画,没淡入,没渐变。就一个替换、一句语音、一次语义播报。

上线第三天,某中心前台发来微信:“现在接电话少了一半。”

real-time bed availability dashboard

眼科医生说“我看不清”,我们就重写了整套色阶

最初那版D3热力图,蓝紫渐变很美。直到一位退休眼科医生放大到150%,说:“三个色块糊成一块,像隔着毛玻璃看。”

于是色阶换成深蓝#1E40AF → 中灰#94A3B8 → 浅黄#FDE047。麒麟V10自带色彩校准工具扫过,三档在高对比度+150%缩放下仍可区分。

每个区块都嵌了<time>标签:<time datetime="2026-06-03T08:00">今早八点</time>起,三楼护理岗有两位护士在岗。屏幕阅读器读出来是完整句子,不是“08:00,数值3”这种机器腔。

高德POI SDK加载失败时,页面不白屏。立刻切到离线路径图——那是提前缓存在IndexedDB里的步行拓扑关系,覆盖3km内全部助餐点。坐标系转换全塞进useGeoHeatmapTransform() Composable:输入WGS84经纬度数组,输出CSS Grid定位值。

地图缩放到15级以上,热力区块自动退化为点标记。不是为了省性能。是怕密密麻麻的色块盖住助餐点图标——老人找饭的地方,不能让颜色抢戏。

accessible heatmap nurse schedule

Excel才是他们真正的IDE

部署卡在最后一步。三位街道信息员,最熟的工具是Excel。不是不会点按钮,是点完不知道下一步该信谁:弹窗提示“上传成功”,但地图上没反应;重试又提示“文件已存在”。

原来SheetJS解析时把空行当有效数据,校验逻辑漏了时段格式校验。

上传流程砍掉所有花活——模板就四列:日期、时段、岗位、姓名。拖进表格,校验立刻跑起来。第7行时段写成“8:00-12:00”?边框直接变红,旁边浮出一行字:“第7行,时段格式应为‘08:00-12:00’”。不弹框,不跳转,错误就钉在原地,连光标都不挪。

统信UOS 2026.3实测,同时渲染17个中心GIS图层,GPU占用率63%,帧率稳在58–60fps。底图没动,直连省级养老服务云地理底图服务的WMTS接口;热力图图层叠在上面,靠CSS transform: scale() 做响应式缩放,不靠JS算宽高。

适老化不是调个字体、拉个对比度就交差的事。上周上线的养老服务中心后台,把民政局床位库、120调度系统和美团助餐API串起来时,我才意识到:老人点开页面看到“3张空床”那刻,背后是5个接口在387毫秒内没掉链子——信任从来不在设计稿里,而在每一次数据落地不卡顿的0.3秒。