feat: add analysis pages and raster risk map

Ship a new app version with broader analytics, restructured
dashboards, and a server-rendered risk map.

Frontend:
- Add Overview, Demographic, Disease, and Environmental Health
  analysis pages
- Add AnomalyMarkers, CalendarHeatmap, and MetricHeatmapTable
  components
- Rebuild Alerts map onto server-rendered raster risk tiles;
  expand Monitoring, Trend, and District Comparison views
- Extend API client, stores, and TypeScript types

Backend:
- Add environment router (pollutants, lag correlations)
- Add risk_raster util serving XYZ 100m risk tiles
- Expand cases endpoints (demographics, seasonality, diagnoses)
  and insights; harden auth and file-based loaders

Data & tooling:
- Add processed outpatient/inpatient/combined case parquet (LFS)
- Add nested CLAUDE.md guides, pyrightconfig, and test updates
This commit is contained in:
2026-06-21 17:35:03 +08:00
parent f092c3c550
commit e95e2f1338
63 changed files with 8534 additions and 988 deletions

View File

@@ -0,0 +1,526 @@
=== 说话人6 ===
[300.9s-301.7s] 好
=== 说话人2 ===
[318.0s-319.3s] 那不不有啊
[319.3s-320.2s] 那不有吗
=== 说话人6 ===
[320.2s-321.2s] 那不有
=== 说话人2 ===
[321.2s-322.2s] 那不有
[322.2s-322.7s] 那不有
[322.7s-323.9s] 那不有
=== 说话人6 ===
[323.9s-325.7s] 那不有
=== 说话人4 ===
[325.7s-326.8s] 那不有
=== 说话人6 ===
[332.6s-333.6s] 那不有
=== 说话人3 ===
[333.6s-351.3s] 那不有
=== 说话人6 ===
[351.3s-352.2s] 那不有
[352.2s-352.8s] 那不有
[352.8s-353.5s] 那不有
=== 说话人3 ===
[773.5s-774.9s] 因為因為住室太高了
[774.9s-776.4s] 而且他們有一個秘密
=== 说话人8 ===
[776.4s-778.3s] 只要非常趴趴坐自己
=== 说话人3 ===
[778.3s-779.6s] 但是就是趴秘密
=== 说话人1 ===
[779.6s-780.4s] 還是比較
=== 说话人3 ===
[780.4s-781.9s] 真的沒有問題
=== 说话人6 ===
[781.9s-783.3s] 沒有問題
=== 说话人8 ===
[783.3s-784.4s] 就不叫做話
=== 说话人3 ===
[784.4s-785.6s] 因為那個秘密
[785.6s-786.5s] 講的秘密
[786.5s-787.5s] 基本上是太高了
[787.5s-788.7s] 我們有一個秘密的交流
=== 说话人6 ===
[788.7s-789.2s] 其實
=== 说话人3 ===
[789.2s-790.9s] 三年秘密的交流
=== 说话人6 ===
[790.9s-791.9s] 其實就是說
=== 说话人3 ===
[791.9s-792.5s] 這個裡面
=== 说话人8 ===
[792.5s-793.4s] 趴坐這個的話
[793.4s-794.8s] 其實是真好趴
[794.8s-795.6s] 然後
[795.6s-796.2s] 然後
=== 说话人7 ===
[796.2s-797.5s] 我現在認識的話
=== 说话人6 ===
[797.5s-798.8s] 那個坐子比較多
[799.6s-800.1s] 因為
=== 说话人3 ===
[800.1s-801.4s] 現在坐
[801.4s-802.1s] 這個只有
=== 说话人8 ===
[802.1s-802.8s] 八花之後
[802.8s-803.4s] 崩潰
=== 说话人6 ===
[804.2s-805.4s] 崩潰
=== 说话人2 ===
[805.4s-806.7s] 把花穩回來
=== 说话人8 ===
[806.7s-807.4s] 它進屋
[807.4s-808.0s] 現在
=== 说话人1 ===
[808.2s-809.2s] 因為 ele ran global
[809.9s-810.5s] artist
=== 说话人4 ===
[810.5s-811.0s] 實體
=== 说话人5 ===
[811.0s-811.7s] 就不理
=== 说话人2 ===
[811.7s-812.7s] 一才玩樂
[812.7s-813.1s] 但是
=== 说话人1 ===
[813.1s-814.3s] 操方
=== 说话人2 ===
[814.3s-817.2s] 著制
[817.2s-820.7s] 因為很多
=== 说话人3 ===
[820.7s-827.4s] 太高了
=== 说话人5 ===
[1157.4s-1158.5s] 他就要到了現在
=== 说话人7 ===
[1158.5s-1160.4s] 所以他來自主持主持表
=== 说话人5 ===
[1160.4s-1162.9s] 哪些人以前的平常才見到呢
=== 说话人7 ===
[1162.9s-1165.4s] 讓你以前的在砍術店就爆發
[1165.4s-1168.1s] 但是沒有些經過的這反應的
[1168.1s-1170.2s] 這往他就可以一直了
=== 说话人1 ===
[1170.2s-1172.3s] 他只是要去砍得一百米
=== 说话人5 ===
[1172.3s-1173.8s] 所以他來自主持的一集
=== 说话人7 ===
[1173.8s-1175.8s] 但是如果到了我主持假裝
=== 说话人5 ===
[1175.8s-1177.3s] 全正的主持主持主持主持
[1177.3s-1178.8s] 來現在的嘛
[1178.8s-1180.2s] 我們來現在的這個主持
=== 说话人2 ===
[1180.8s-1182.7s] 來扮熱我主持在主持上
=== 说话人7 ===
[1182.7s-1184.0s] 主持主持上
=== 说话人5 ===
[1184.0s-1184.7s] 我們來的一集
=== 说话人1 ===
[1184.7s-1185.5s] 廖都在耍耍被豪華 hideway
=== 说话人7 ===
[1185.5s-1190.8s] 不要再拿頭、保護護金高一點
=== 说话人2 ===
[1190.8s-1191.4s] 都不能家庭
=== 说话人7 ===
[1191.4s-1193.0s] 把這個賣一次
[1193.0s-1194.6s] 給我一去回去
=== 说话人5 ===
[1194.6s-1209.6s] 我這是自各主持主持主持主持主持主持
=== 说话人1 ===
[1211.3s-1213.3s] 大家如果像
[1399.8s-1402.5s] 我感觉是找到大甲之间的事,
=== 说话人2 ===
[1403.6s-1405.8s] 因为我被人拌上自己的事,
=== 说话人5 ===
[1406.2s-1409.5s] 但是我做了一会的事,
=== 说话人8 ===
[1409.5s-1410.2s] 我做了一会的事,
=== 说话人4 ===
[1410.2s-1411.2s] 我做了一会的事,
=== 说话人5 ===
[1411.3s-1413.0s] 我做了一会的事,
=== 说话人1 ===
[1413.3s-1415.1s] 然后我一直在说,
=== 说话人5 ===
[1415.2s-1417.0s] 我一直在说,
=== 说话人8 ===
[1418.7s-1419.4s] 我一直在说,
[1569.6s-1571.6s] 然后去讲没有办法,
=== 说话人4 ===
[1571.9s-1572.2s] 这一天,
=== 说话人3 ===
[1572.2s-1573.8s] 我一直在说,
[1574.5s-1575.2s] 这个天,
[1575.3s-1577.7s] 三公里的天然是一三个天然,
[1578.1s-1579.0s] 所以这一天,
=== 说话人8 ===
[1579.3s-1580.9s] 我把这马上进去的时候,
=== 说话人3 ===
[1581.6s-1583.3s] 这个能不能进去,
=== 说话人5 ===
[1583.8s-1585.5s] 我们有多少人那种事,
=== 说话人8 ===
[1585.6s-1586.3s] 太少我,
=== 说话人6 ===
[1586.3s-1587.5s] 也有多少人,
[1589.3s-1591.2s] 也有多少人,
=== 说话人5 ===
[1593.4s-1594.3s] 也有多少人,
[1594.3s-1595.6s] 也有多少人,
=== 说话人8 ===
[1596.3s-1598.4s] 也有多少人,
=== 说话人5 ===
[1598.7s-1599.4s] 也有多少人,
=== 说话人6 ===
[1711.1s-1718.4s] 也有多少人。
=== 说话人5 ===
[2469.8s-2471.9s] 他有个笔伴的笔伴
[2471.9s-2473.8s] 去务力就走
[2473.8s-2474.8s] 关了笔伴的笔伴
[2475.4s-2477.5s] 然后就加入有超级
[2477.5s-2478.7s] 有很多笔伴的样
=== 说话人2 ===
[2478.7s-2479.4s] 三个笔伴
[2479.4s-2481.9s] 这在我们笔伴的
=== 说话人5 ===
[2481.9s-2483.7s] 可能是这就是百分之八
=== 说话人8 ===
[2483.7s-2484.4s] 之多样
=== 说话人2 ===
[2484.9s-2486.9s] 他有个笔伴的笔伴
=== 说话人5 ===
[2486.9s-2487.9s] 三个笔伴的笔伴
=== 说话人4 ===
[2487.9s-2489.2s] 这个笔伴的笔伴
=== 说话人5 ===
[2489.2s-2490.1s] 就是要务力
[2490.1s-2493.1s] 这个笔伴的笔伴
=== 说话人4 ===
[2493.3s-2493.7s] 也就是要务力
=== 说话人5 ===
[2493.7s-2495.3s] 也就是要务力
[2496.3s-2498.5s] 他在那笔伴
[2498.5s-2501.2s] 这笔伴的笔伴的笔伴
=== 说话人1 ===
[2501.2s-2502.4s] 就是要务力
=== 说话人4 ===
[2502.4s-2503.2s] 那笔伴的笔伴的笔伴
=== 说话人1 ===
[2503.2s-2503.9s] 那笔伴的笔伴
[2503.9s-2504.8s] 他都感兮
=== 说话人5 ===
[2504.8s-2505.9s] 所以他的笔伴的笔伴
=== 说话人8 ===
[2505.9s-2507.4s] 就说就像不好的笔伴
=== 说话人5 ===
[2507.4s-2508.4s] 很热闹的笔伴
=== 说话人6 ===
[2508.4s-2509.1s] 他能不能被笔伴
=== 说话人4 ===
[2509.1s-2510.1s] 他能被笔伴
=== 说话人6 ===
[2510.1s-2510.9s] 笔伴
=== 说话人5 ===
[2511.6s-2512.9s] 但是我们这笔伴
=== 说话人4 ===
[2512.9s-2514.2s] 有笔伴的笔伴
=== 说话人5 ===
[2514.2s-2515.9s] 前几个笔伴
=== 说话人2 ===
[2515.9s-2516.8s] 有没有看见的
=== 说话人4 ===
[2516.8s-2518.9s] 这笔伴的笔伴
[2518.9s-2519.5s] 那个笔伴
=== 说话人1 ===
[2519.5s-2520.2s] 没有看见
[2520.2s-2521.1s] 没有看见
[2522.8s-2523.7s] 他会到了
[2523.7s-2524.2s] 把笔伴
=== 说话人6 ===
[2528.5s-2530.4s] 接下音过找
=== 说话人8 ===
[2531.3s-2534.1s] 他一aps
=== 说话人6 ===
[2534.1s-2535.3s] 差不多
[2535.3s-2537.6s] 他上学
=== 说话人5 ===
[2537.9s-2540.0s] 我们整体加上
=== 说话人4 ===
[2540.0s-2540.8s] 那个笔伴
=== 说话人2 ===
[2540.8s-2542.5s] 你看看
=== 说话人5 ===
[2542.5s-2557.8s] 他比较感情
[4267.8s-4269.6s] 恐慌
=== 说话人7 ===
[4277.5s-4285.7s] 那国内主要我们给こちら
[4285.7s-4286.8s] 就是宪治 Show
=== 说话人3 ===
[4286.8s-4290.6s] 这是就是宪治 Audio
=== 说话人1 ===
[4290.6s-4292.5s] 他觉得他在来兜了
=== 说话人7 ===
[4292.5s-4296.2s] 不是这个话的志明
[4296.8s-4299.3s] 我来看你这种词的看法
=== 说话人4 ===
[4299.3s-4300.1s] 这个是一个人的
=== 说话人7 ===
[4301.4s-4302.8s] 所以我说一下
[4302.8s-4304.3s] 我就是诸个看法的问题
=== 说话人4 ===
[4304.3s-4306.2s] 这体的问题是一个诸个
=== 说话人5 ===
[4306.7s-4308.5s] 我听过我这口误的语语
[4308.5s-4310.5s] 这种不害怕怪怪
[4310.5s-4313.0s] 我诸了太太的语语语语
=== 说话人7 ===
[4313.0s-4314.7s] 我当时诸个不道理的
=== 说话人5 ===
[4315.8s-4318.7s] 这种不道理的语语语语语语语语语语
[4318.7s-4320.2s] 假如还有语语语语
[4320.2s-4321.7s] 这个语语语语语语语
[4321.7s-4326.1s] 这种不道理语语语语
=== 说话人2 ===
[4326.1s-4328.0s] 假如那进到了
=== 说话人7 ===
[4328.0s-4330.4s] 代表人做什么
=== 说话人5 ===
[4330.4s-4331.7s] 菠 çıkt
=== 说话人2 ===
[4331.7s-4349.8s] 摇灶的独援