From 6077164b326a7088d2dda3e187b908ea0fcd2ebb Mon Sep 17 00:00:00 2001 From: TianKai Ma Date: Mon, 31 Aug 2026 11:22:03 +0800 Subject: [PATCH] feat(bus): publish 2026 fall and Taihu timetables --- static/bus_data.json | 1259 ------------------------------------ static/bus_data_v2.json | 1130 -------------------------------- static/bus_data_v3.json | 2 +- tests/test_bus_data_gen.py | 93 +++ tools/bus_data_gen.py | 490 ++++++++++---- 5 files changed, 453 insertions(+), 2521 deletions(-) delete mode 100644 static/bus_data.json delete mode 100644 static/bus_data_v2.json create mode 100644 tests/test_bus_data_gen.py diff --git a/static/bus_data.json b/static/bus_data.json deleted file mode 100644 index 89794367847..00000000000 --- a/static/bus_data.json +++ /dev/null @@ -1,1259 +0,0 @@ -{ - "update_time": "20230920", - "buses": [ - { - "id": "1", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 6, - "startMin": 50, - "timeTable": [ - 10, - 0, - 45 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "2", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 8, - "startMin": 0, - "timeTable": [ - 10, - 0, - 45 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "3", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 12, - "startMin": 40, - "timeTable": [ - 10, - 0, - 45 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "4", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 14, - "startMin": 30, - "timeTable": [ - 10, - 0, - 45 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "5", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 18, - "startMin": 25, - "timeTable": [ - 10, - 0, - 45 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "6", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 21, - "startMin": 20, - "timeTable": [ - 10, - 0, - 45 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "7", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 22, - "startMin": 5, - "timeTable": [ - 10, - 0, - 45 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "8", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 6, - "startMin": 40, - "timeTable": [ - 5, - 0, - 40 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "9", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 8, - "startMin": 0, - "timeTable": [ - 5, - 0, - 40 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "10", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 9, - "startMin": 35, - "timeTable": [ - 5, - 0, - 40 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "11", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 12, - "startMin": 40, - "timeTable": [ - 5, - 0, - 40 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "12", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 14, - "startMin": 10, - "timeTable": [ - 5, - 0, - 40 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "13", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 18, - "startMin": 5, - "timeTable": [ - 5, - 0, - 40 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "14", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 21, - "startMin": 45, - "timeTable": [ - 5, - 0, - 40 - ], - "type": "weekday", - "stationNum": 4 - }, - { - "id": "15", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 7, - "startMin": 0, - "timeTable": [ - 10, - 0, - 50 - ], - "type": "weekend", - "stationNum": 4 - }, - { - "id": "16", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 12, - "startMin": 40, - "timeTable": [ - 10, - 0, - 50 - ], - "type": "weekend", - "stationNum": 4 - }, - { - "id": "17", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 18, - "startMin": 30, - "timeTable": [ - 10, - 0, - 50 - ], - "type": "weekend", - "stationNum": 4 - }, - { - "id": "18", - "from": "\u4e1c\u533a", - "to": "\u9ad8\u65b0", - "startHour": 21, - "startMin": 50, - "timeTable": [ - 10, - 0, - 50 - ], - "type": "weekend", - "stationNum": 4 - }, - { - "id": "19", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 8, - "startMin": 0, - "timeTable": [ - 5, - 0, - 45 - ], - "type": "weekend", - "stationNum": 4 - }, - { - "id": "20", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 13, - "startMin": 40, - "timeTable": [ - 5, - 0, - 45 - ], - "type": "weekend", - "stationNum": 4 - }, - { - "id": "21", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 16, - "startMin": 0, - "timeTable": [ - 5, - 0, - 45 - ], - "type": "weekend", - "stationNum": 4 - }, - { - "id": "22", - "from": "\u9ad8\u65b0", - "to": "\u4e1c\u533a", - "startHour": 21, - "startMin": 50, - "timeTable": [ - 5, - 0, - 45 - ], - "type": "weekend", - "stationNum": 4 - }, - { - "id": "23", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 7, - "startMin": 25, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "24", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 11, - "startMin": 35, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "25", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 13, - "startMin": 30, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "26", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 17, - "startMin": 30, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "27", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 18, - "startMin": 40, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "28", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 21, - "startMin": 15, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "29", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 9, - "startMin": 20, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "30", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 9, - "startMin": 35, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "31", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 12, - "startMin": 20, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "32", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 15, - "startMin": 30, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "33", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 15, - "startMin": 50, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "34", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 17, - "startMin": 50, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "35", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 20, - "startMin": 10, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "36", - "from": "\u4e1c\u533a", - "to": "\u897f\u533a", - "startHour": 22, - "startMin": 10, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "37", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 7, - "startMin": 35, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "38", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 11, - "startMin": 45, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "39", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 13, - "startMin": 40, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "40", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 17, - "startMin": 40, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "41", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 18, - "startMin": 50, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "42", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 21, - "startMin": 25, - "timeTable": [ - 0, - 10 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "43", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 9, - "startMin": 30, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "44", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 9, - "startMin": 45, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "45", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 12, - "startMin": 30, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "46", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 15, - "startMin": 40, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "47", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 16, - "startMin": 0, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "48", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 18, - "startMin": 0, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "49", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 20, - "startMin": 20, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "50", - "from": "\u897f\u533a", - "to": "\u4e1c\u533a", - "startHour": 22, - "startMin": 20, - "timeTable": [ - 0, - 10 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "51", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 11, - "startMin": 45, - "timeTable": [ - 15 - ], - "type": "all", - "stationNum": 2 - }, - { - "id": "52", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 17, - "startMin": 45, - "timeTable": [ - 15 - ], - "type": "all", - "stationNum": 2 - }, - { - "id": "53", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 19, - "startMin": 0, - "timeTable": [ - 15 - ], - "type": "all", - "stationNum": 2 - }, - { - "id": "54", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 21, - "startMin": 35, - "timeTable": [ - 15 - ], - "type": "all", - "stationNum": 2 - }, - { - "id": "55", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 7, - "startMin": 30, - "timeTable": [ - 15 - ], - "type": "all", - "stationNum": 2 - }, - { - "id": "56", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 13, - "startMin": 40, - "timeTable": [ - 15 - ], - "type": "all", - "stationNum": 2 - }, - { - "id": "57", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 19, - "startMin": 15, - "timeTable": [ - 15 - ], - "type": "all", - "stationNum": 2 - }, - { - "id": "58", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 21, - "startMin": 50, - "timeTable": [ - 15 - ], - "type": "all", - "stationNum": 2 - }, - { - "id": "59", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 7, - "startMin": 35, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "60", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 8, - "startMin": 30, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "61", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 11, - "startMin": 35, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "62", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 12, - "startMin": 5, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "63", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 12, - "startMin": 40, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "64", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 14, - "startMin": 30, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "65", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 17, - "startMin": 25, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "66", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 18, - "startMin": 10, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "67", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 20, - "startMin": 30, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "68", - "from": "\u4e1c\u533a", - "to": "\u5357\u533a", - "startHour": 22, - "startMin": 30, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "69", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 7, - "startMin": 10, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "70", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 8, - "startMin": 0, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "71", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 8, - "startMin": 30, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "72", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 9, - "startMin": 0, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "73", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 12, - "startMin": 0, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "74", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 13, - "startMin": 20, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "75", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 14, - "startMin": 0, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "76", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 15, - "startMin": 10, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "77", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 18, - "startMin": 20, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "78", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 20, - "startMin": 45, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "79", - "from": "\u5357\u533a", - "to": "\u4e1c\u533a", - "startHour": 22, - "startMin": 45, - "timeTable": [ - 15 - ], - "type": "weekday", - "stationNum": 2 - }, - { - "id": "80", - "from": "\u897f\u533a", - "to": "\u5357\u533a", - "startHour": 11, - "startMin": 35, - "timeTable": [ - 0, - 20 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "81", - "from": "\u897f\u533a", - "to": "\u5357\u533a", - "startHour": 17, - "startMin": 35, - "timeTable": [ - 0, - 20 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "82", - "from": "\u897f\u533a", - "to": "\u5357\u533a", - "startHour": 18, - "startMin": 50, - "timeTable": [ - 0, - 20 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "83", - "from": "\u897f\u533a", - "to": "\u5357\u533a", - "startHour": 21, - "startMin": 35, - "timeTable": [ - 0, - 20 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "84", - "from": "\u5357\u533a", - "to": "\u897f\u533a", - "startHour": 7, - "startMin": 30, - "timeTable": [ - 0, - 20 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "85", - "from": "\u5357\u533a", - "to": "\u897f\u533a", - "startHour": 13, - "startMin": 40, - "timeTable": [ - 0, - 20 - ], - "type": "all", - "stationNum": 3 - }, - { - "id": "86", - "from": "\u897f\u533a", - "to": "\u5357\u533a", - "startHour": 7, - "startMin": 35, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "87", - "from": "\u897f\u533a", - "to": "\u5357\u533a", - "startHour": 12, - "startMin": 30, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "88", - "from": "\u897f\u533a", - "to": "\u5357\u533a", - "startHour": 18, - "startMin": 0, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "89", - "from": "\u897f\u533a", - "to": "\u5357\u533a", - "startHour": 20, - "startMin": 20, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "90", - "from": "\u897f\u533a", - "to": "\u5357\u533a", - "startHour": 22, - "startMin": 20, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "91", - "from": "\u5357\u533a", - "to": "\u897f\u533a", - "startHour": 7, - "startMin": 10, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "92", - "from": "\u5357\u533a", - "to": "\u897f\u533a", - "startHour": 8, - "startMin": 0, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "93", - "from": "\u5357\u533a", - "to": "\u897f\u533a", - "startHour": 8, - "startMin": 30, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "94", - "from": "\u5357\u533a", - "to": "\u897f\u533a", - "startHour": 9, - "startMin": 0, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "95", - "from": "\u5357\u533a", - "to": "\u897f\u533a", - "startHour": 13, - "startMin": 20, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "96", - "from": "\u5357\u533a", - "to": "\u897f\u533a", - "startHour": 14, - "startMin": 0, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - }, - { - "id": "97", - "from": "\u5357\u533a", - "to": "\u897f\u533a", - "startHour": 15, - "startMin": 10, - "timeTable": [ - 0, - 20 - ], - "type": "weekday", - "stationNum": 3 - } - ] -} diff --git a/static/bus_data_v2.json b/static/bus_data_v2.json deleted file mode 100644 index bb52bd10377..00000000000 --- a/static/bus_data_v2.json +++ /dev/null @@ -1,1130 +0,0 @@ -{ - "campuses": [ - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 3, - "name": "\u5317\u533a", - "latitude": 117.268125, - "longitude": 31.841933 - }, - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - }, - { - "id": 5, - "name": "\u5148\u7814\u9662", - "latitude": 117.129257, - "longitude": 31.826345 - }, - { - "id": 6, - "name": "\u9ad8\u65b0", - "latitude": 117.129369, - "longitude": 31.820447 - } - ], - "routes": [ - [ - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - }, - { - "id": 3, - "name": "\u5317\u533a", - "latitude": 117.268125, - "longitude": 31.841933 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - } - ], - [ - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 3, - "name": "\u5317\u533a", - "latitude": 117.268125, - "longitude": 31.841933 - }, - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - } - ], - [ - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - }, - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - } - ], - [ - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - }, - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - } - ], - [ - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - } - ], - [ - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - } - ], - [ - { - "id": 6, - "name": "\u9ad8\u65b0", - "latitude": 117.129369, - "longitude": 31.820447 - }, - { - "id": 5, - "name": "\u5148\u7814\u9662", - "latitude": 117.129257, - "longitude": 31.826345 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - } - ], - [ - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 5, - "name": "\u5148\u7814\u9662", - "latitude": 117.129257, - "longitude": 31.826345 - }, - { - "id": 6, - "name": "\u9ad8\u65b0", - "latitude": 117.129369, - "longitude": 31.820447 - } - ] - ], - "weekday_routes": [ - { - "route": [ - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - }, - { - "id": 3, - "name": "\u5317\u533a", - "latitude": 117.268125, - "longitude": 31.841933 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - } - ], - "time": [ - [ - "07:25", - null, - "07:35" - ], - [ - "09:20", - null, - "09:30" - ], - [ - "09:35", - null, - "09:45" - ], - [ - "11:35", - null, - "11:45" - ], - [ - "12:20", - null, - "12:30" - ], - [ - "13:30", - null, - "13:40" - ], - [ - "15:30", - null, - "15:40" - ], - [ - "15:50", - null, - "16:00" - ], - [ - "17:30", - null, - "17:40" - ], - [ - "17:50", - null, - "18:00" - ], - [ - "18:40", - null, - "18:50" - ], - [ - "20:10", - null, - "20:20" - ], - [ - "21:15", - null, - "21:25" - ], - [ - "22:10", - null, - "22:20" - ] - ] - }, - { - "route": [ - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 3, - "name": "\u5317\u533a", - "latitude": 117.268125, - "longitude": 31.841933 - }, - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - } - ], - "time": [ - [ - "07:35", - null, - "07:45" - ], - [ - "09:30", - null, - "09:40" - ], - [ - "09:45", - null, - "09:55" - ], - [ - "11:45", - null, - "11:55" - ], - [ - "12:30", - null, - "12:40" - ], - [ - "13:40", - null, - "13:50" - ], - [ - "15:40", - null, - "15:50" - ], - [ - "16:00", - null, - "16:10" - ], - [ - "17:40", - null, - "17:50" - ], - [ - "18:00", - null, - "18:10" - ], - [ - "18:50", - null, - "19:00" - ], - [ - "20:20", - null, - "20:30" - ], - [ - "21:25", - null, - "21:35" - ], - [ - "22:20", - null, - "22:30" - ] - ] - }, - { - "route": [ - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - }, - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - } - ], - "time": [ - [ - "07:35", - "07:50" - ], - [ - "08:30", - "08:45" - ], - [ - "11:35", - "11:50" - ], - [ - "11:45", - "12:00" - ], - [ - "12:05", - "12:20" - ], - [ - "12:40", - "12:55" - ], - [ - "14:30", - "14:45" - ], - [ - "17:25", - "17:40" - ], - [ - "17:45", - "18:00" - ], - [ - "18:10", - "18:25" - ], - [ - "19:00", - "19:15" - ], - [ - "20:30", - "20:45" - ], - [ - "21:35", - "21:50" - ], - [ - "22:30", - "22:45" - ] - ] - }, - { - "route": [ - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - }, - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - } - ], - "time": [ - [ - "07:10", - "07:25" - ], - [ - "07:30", - "07:45" - ], - [ - "08:00", - "08:15" - ], - [ - "09:00", - "09:15" - ], - [ - "12:00", - "12:15" - ], - [ - "13:20", - "13:35" - ], - [ - "13:40", - "13:55" - ], - [ - "14:00", - "14:15" - ], - [ - "15:10", - "15:25" - ], - [ - "18:20", - "18:35" - ], - [ - "19:15", - "19:30" - ], - [ - "20:45", - "21:00" - ], - [ - "21:50", - "22:05" - ], - [ - "22:45", - "23:00" - ] - ] - }, - { - "route": [ - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - } - ], - "time": [ - [ - "07:35", - "07:55" - ], - [ - "11:35", - "11:55" - ], - [ - "12:30", - "12:50" - ], - [ - "17:35", - "17:55" - ], - [ - "18:00", - "18:20" - ], - [ - "18:50", - "19:10" - ], - [ - "20:20", - "20:40" - ], - [ - "21:35", - "21:55" - ], - [ - "22:20", - "22:40" - ] - ] - }, - { - "route": [ - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - } - ], - "time": [ - [ - "07:10", - "07:30" - ], - [ - "07:30", - "07:50" - ], - [ - "08:00", - "08:20" - ], - [ - "08:30", - "08:50" - ], - [ - "09:00", - "09:20" - ], - [ - "13:20", - "13:40" - ], - [ - "13:40", - "14:00" - ], - [ - "14:00", - "14:20" - ], - [ - "15:10", - "15:30" - ] - ] - }, - { - "route": [ - { - "id": 6, - "name": "\u9ad8\u65b0", - "latitude": 117.129369, - "longitude": 31.820447 - }, - { - "id": 5, - "name": "\u5148\u7814\u9662", - "latitude": 117.129257, - "longitude": 31.826345 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - } - ], - "time": [ - [ - "06:40", - "06:45", - null, - "07:30" - ], - [ - "08:00", - "08:05", - null, - "08:50" - ], - [ - "09:35", - "09:40", - null, - "10:25" - ], - [ - "12:50", - "12:55", - null, - "13:40" - ], - [ - "14:30", - "14:35", - null, - "15:20" - ], - [ - "18:30", - "18:35", - null, - "19:20" - ], - [ - "22:05", - "22:10", - null, - "22:55" - ] - ] - }, - { - "route": [ - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 5, - "name": "\u5148\u7814\u9662", - "latitude": 117.129257, - "longitude": 31.826345 - }, - { - "id": 6, - "name": "\u9ad8\u65b0", - "latitude": 117.129369, - "longitude": 31.820447 - } - ], - "time": [ - [ - "06:50", - "07:00", - null, - "07:45" - ], - [ - "08:00", - "08:10", - null, - "08:55" - ], - [ - "12:50", - "13:00", - null, - "13:45" - ], - [ - "14:30", - "14:40", - null, - "15:25" - ], - [ - "18:30", - "18:40", - null, - "19:25" - ], - [ - "21:20", - "21:30", - null, - "22:15" - ], - [ - "22:05", - "22:15", - null, - "23:00" - ] - ] - } - ], - "weekend_routes": [ - { - "route": [ - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - }, - { - "id": 3, - "name": "\u5317\u533a", - "latitude": 117.268125, - "longitude": 31.841933 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - } - ], - "time": [ - [ - "07:25", - null, - "07:35" - ], - [ - "11:35", - null, - "11:45" - ], - [ - "13:30", - null, - "13:40" - ], - [ - "17:30", - null, - "17:40" - ], - [ - "18:40", - null, - "18:50" - ], - [ - "21:15", - null, - "21:25" - ] - ] - }, - { - "route": [ - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 3, - "name": "\u5317\u533a", - "latitude": 117.268125, - "longitude": 31.841933 - }, - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - } - ], - "time": [ - [ - "07:35", - null, - "07:45" - ], - [ - "11:45", - null, - "11:55" - ], - [ - "13:40", - null, - "13:50" - ], - [ - "17:40", - null, - "17:50" - ], - [ - "18:50", - null, - "19:00" - ], - [ - "21:25", - null, - "21:35" - ] - ] - }, - { - "route": [ - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - }, - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - } - ], - "time": [ - [ - "11:45", - "12:00" - ], - [ - "17:45", - "18:00" - ], - [ - "19:00", - "19:15" - ], - [ - "21:35", - "21:50" - ] - ] - }, - { - "route": [ - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - }, - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - } - ], - "time": [ - [ - "07:30", - "07:45" - ], - [ - "13:40", - "13:55" - ], - [ - "19:15", - "19:30" - ], - [ - "21:50", - "22:05" - ] - ] - }, - { - "route": [ - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - } - ], - "time": [ - [ - "11:35", - "11:55" - ], - [ - "17:35", - "17:55" - ], - [ - "18:50", - "19:10" - ], - [ - "21:35", - "21:55" - ] - ] - }, - { - "route": [ - { - "id": 4, - "name": "\u5357\u533a", - "latitude": 117.283853, - "longitude": 31.822112 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - } - ], - "time": [ - [ - "07:30", - "07:50" - ], - [ - "13:40", - "14:00" - ] - ] - }, - { - "route": [ - { - "id": 6, - "name": "\u9ad8\u65b0", - "latitude": 117.129369, - "longitude": 31.820447 - }, - { - "id": 5, - "name": "\u5148\u7814\u9662", - "latitude": 117.129257, - "longitude": 31.826345 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - } - ], - "time": [ - [ - "08:00", - "08:05", - null, - "08:50" - ], - [ - "13:40", - "13:45", - null, - "14:30" - ], - [ - "16:00", - "16:05", - null, - "16:50" - ], - [ - "21:50", - "21:55", - null, - "22:40" - ] - ] - }, - { - "route": [ - { - "id": 1, - "name": "\u4e1c\u533a", - "latitude": 117.268264, - "longitude": 31.83892 - }, - { - "id": 2, - "name": "\u897f\u533a", - "latitude": 117.256645, - "longitude": 31.839258 - }, - { - "id": 5, - "name": "\u5148\u7814\u9662", - "latitude": 117.129257, - "longitude": 31.826345 - }, - { - "id": 6, - "name": "\u9ad8\u65b0", - "latitude": 117.129369, - "longitude": 31.820447 - } - ], - "time": [ - [ - "07:00", - "07:10", - null, - "07:55" - ], - [ - "12:50", - "13:00", - null, - "13:45" - ], - [ - "18:30", - "18:40", - null, - "19:25" - ], - [ - "21:50", - "22:00", - null, - "22:45" - ] - ] - } - ], - "message": { - "message": "\u672c\u8868\u4e3a 2024 \u6625\u5b63\u5b66\u671f\u65f6\u95f4\u8868\uff0c\u6765\u6e90\uff1a\u8717\u58f3\u5c0f\u9053\u6d88\u606f", - "url": "https://mp.weixin.qq.com/s/IQP3Qh2MNfwNJwiyvORr5g" - } -} \ No newline at end of file diff --git a/static/bus_data_v3.json b/static/bus_data_v3.json index 2841f6eb693..082b2033c47 100644 --- a/static/bus_data_v3.json +++ b/static/bus_data_v3.json @@ -1 +1 @@ -{"campuses": [{"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 3, "name": "北区", "latitude": 117.268125, "longitude": 31.841933}, {"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}, {"id": 5, "name": "先研院", "latitude": 117.129257, "longitude": 31.826345}, {"id": 6, "name": "高新", "latitude": 117.129369, "longitude": 31.820447}], "routes": [{"id": 1, "campuses": [{"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}, {"id": 3, "name": "北区", "latitude": 117.268125, "longitude": 31.841933}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}]}, {"id": 2, "campuses": [{"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 3, "name": "北区", "latitude": 117.268125, "longitude": 31.841933}, {"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}]}, {"id": 3, "campuses": [{"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}, {"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}]}, {"id": 4, "campuses": [{"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}, {"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}]}, {"id": 5, "campuses": [{"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}]}, {"id": 6, "campuses": [{"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}]}, {"id": 7, "campuses": [{"id": 6, "name": "高新", "latitude": 117.129369, "longitude": 31.820447}, {"id": 5, "name": "先研院", "latitude": 117.129257, "longitude": 31.826345}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}]}, {"id": 8, "campuses": [{"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 5, "name": "先研院", "latitude": 117.129257, "longitude": 31.826345}, {"id": 6, "name": "高新", "latitude": 117.129369, "longitude": 31.820447}]}, {"id": 11, "campuses": [{"id": 6, "name": "高新", "latitude": 117.129369, "longitude": 31.820447}, {"id": 5, "name": "先研院", "latitude": 117.129257, "longitude": 31.826345}]}, {"id": 12, "campuses": [{"id": 5, "name": "先研院", "latitude": 117.129257, "longitude": 31.826345}, {"id": 6, "name": "高新", "latitude": 117.129369, "longitude": 31.820447}]}], "weekday_routes": [{"id": 1, "route": {"id": 1, "campuses": [{"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}, {"id": 3, "name": "北区", "latitude": 117.268125, "longitude": 31.841933}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}]}, "time": [["08:15", null, "08:25"], ["11:30", null, "11:40"], ["14:10", null, "14:20"], ["17:00", null, "17:10"], ["19:00", null, "19:10"]]}, {"id": 2, "route": {"id": 2, "campuses": [{"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 3, "name": "北区", "latitude": 117.268125, "longitude": 31.841933}, {"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}]}, "time": [["08:25", null, "08:35"], ["11:40", null, "11:50"], ["14:20", null, "14:30"], ["17:10", null, "17:20"], ["19:10", null, "19:20"]]}, {"id": 3, "route": {"id": 3, "campuses": [{"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}, {"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}]}, "time": [["11:40", "11:55"], ["17:10", "17:25"], ["19:20", "19:35"]]}, {"id": 4, "route": {"id": 4, "campuses": [{"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}, {"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}]}, "time": [["08:00", "08:15"], ["14:10", "14:25"], ["19:35", "19:50"]]}, {"id": 5, "route": {"id": 5, "campuses": [{"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}]}, "time": [["11:30", "11:50"], ["17:00", "17:20"], ["19:10", "19:30"]]}, {"id": 6, "route": {"id": 6, "campuses": [{"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}]}, "time": [["08:00", "08:20"], ["14:10", "14:30"]]}, {"id": 7, "route": {"id": 7, "campuses": [{"id": 6, "name": "高新", "latitude": 117.129369, "longitude": 31.820447}, {"id": 5, "name": "先研院", "latitude": 117.129257, "longitude": 31.826345}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}]}, "time": [["08:45", "08:50", null, "09:35"], ["13:30", "13:35", null, "14:20"], ["19:00", "19:05", null, "19:50"], ["21:00", "21:05", null, "21:50"]]}, {"id": 8, "route": {"id": 8, "campuses": [{"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 5, "name": "先研院", "latitude": 117.129257, "longitude": 31.826345}, {"id": 6, "name": "高新", "latitude": 117.129369, "longitude": 31.820447}]}, "time": [["07:30", "07:40", null, "08:20"], ["12:30", "12:40", null, "13:20"], ["18:00", "18:10", null, "18:50"], ["20:00", "20:10", null, "20:50"]]}], "weekend_routes": [{"id": 1, "route": {"id": 1, "campuses": [{"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}, {"id": 3, "name": "北区", "latitude": 117.268125, "longitude": 31.841933}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}]}, "time": [["08:15", null, "08:25"], ["11:30", null, "11:40"], ["14:10", null, "14:20"], ["17:00", null, "17:10"], ["19:00", null, "19:10"]]}, {"id": 2, "route": {"id": 2, "campuses": [{"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 3, "name": "北区", "latitude": 117.268125, "longitude": 31.841933}, {"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}]}, "time": [["08:25", null, "08:35"], ["11:40", null, "11:50"], ["14:20", null, "14:30"], ["17:10", null, "17:20"], ["19:10", null, "19:20"]]}, {"id": 3, "route": {"id": 3, "campuses": [{"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}, {"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}]}, "time": [["11:40", "11:55"], ["17:10", "17:25"], ["19:20", "19:35"]]}, {"id": 4, "route": {"id": 4, "campuses": [{"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}, {"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}]}, "time": [["08:00", "08:15"], ["14:10", "14:25"], ["19:35", "19:50"]]}, {"id": 5, "route": {"id": 5, "campuses": [{"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}]}, "time": [["11:30", "11:50"], ["17:00", "17:20"], ["19:10", "19:30"]]}, {"id": 6, "route": {"id": 6, "campuses": [{"id": 4, "name": "南区", "latitude": 117.283853, "longitude": 31.822112}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}]}, "time": [["08:00", "08:20"], ["14:10", "14:30"]]}, {"id": 7, "route": {"id": 7, "campuses": [{"id": 6, "name": "高新", "latitude": 117.129369, "longitude": 31.820447}, {"id": 5, "name": "先研院", "latitude": 117.129257, "longitude": 31.826345}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}]}, "time": [["08:45", "08:50", null, "09:35"], ["13:30", "13:35", null, "14:20"], ["19:00", "19:05", null, "19:50"], ["21:00", "21:05", null, "21:50"]]}, {"id": 8, "route": {"id": 8, "campuses": [{"id": 1, "name": "东区", "latitude": 117.268264, "longitude": 31.83892}, {"id": 2, "name": "西区", "latitude": 117.256645, "longitude": 31.839258}, {"id": 5, "name": "先研院", "latitude": 117.129257, "longitude": 31.826345}, {"id": 6, "name": "高新", "latitude": 117.129369, "longitude": 31.820447}]}, "time": [["07:30", "07:40", null, "08:20"], ["12:30", "12:40", null, "13:20"], ["18:00", "18:10", null, "18:50"], ["20:00", "20:10", null, "20:50"]]}], "message": {"message": "本表为 2026 暑期时间表(8月1日—8月29日),来源:蜗壳小道消息", "url": "https://mp.weixin.qq.com/s/aWF0UA63pQmM5MWiAtTeKg"}} \ No newline at end of file +{"campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}, {"id": 5, "name": "先研院", "latitude": 31.826345, "longitude": 117.129257}, {"id": 6, "name": "高新", "latitude": 31.820447, "longitude": 117.129369}, {"id": 7, "name": "太湖路园区", "latitude": 31.824495, "longitude": 117.296554}], "routes": [{"id": 1, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}]}, {"id": 2, "campuses": [{"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, {"id": 3, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}]}, {"id": 4, "campuses": [{"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, {"id": 5, "campuses": [{"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}]}, {"id": 6, "campuses": [{"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}]}, {"id": 7, "campuses": [{"id": 6, "name": "高新", "latitude": 31.820447, "longitude": 117.129369}, {"id": 5, "name": "先研院", "latitude": 31.826345, "longitude": 117.129257}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, {"id": 8, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 5, "name": "先研院", "latitude": 31.826345, "longitude": 117.129257}, {"id": 6, "name": "高新", "latitude": 31.820447, "longitude": 117.129369}]}, {"id": 13, "campuses": [{"id": 7, "name": "太湖路园区", "latitude": 31.824495, "longitude": 117.296554}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, {"id": 14, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 7, "name": "太湖路园区", "latitude": 31.824495, "longitude": 117.296554}]}], "weekday_routes": [{"id": 1, "route": {"id": 1, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}]}, "time": [["07:30", null, "07:40"], ["09:20", null, "09:30"], ["09:35", null, "09:45"], ["11:35", null, "11:45"], ["12:15", null, "12:25"], ["13:30", null, "13:40"], ["15:30", null, "15:40"], ["15:50", null, "16:00"], ["17:30", null, "17:40"], ["17:50", null, "18:00"], ["18:40", null, "18:50"], ["20:10", null, "20:20"], ["21:15", null, "21:25"], ["22:10", null, "22:20"]]}, {"id": 2, "route": {"id": 2, "campuses": [{"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["07:40", null, "07:50"], ["09:30", null, "09:40"], ["09:45", null, "09:55"], ["11:45", null, "11:55"], ["12:25", null, "12:35"], ["13:40", null, "13:50"], ["15:40", null, "15:50"], ["16:00", null, "16:10"], ["17:40", null, "17:50"], ["18:00", null, "18:10"], ["18:50", null, "19:00"], ["20:20", null, "20:30"], ["21:25", null, "21:35"], ["22:20", null, "22:30"]]}, {"id": 3, "route": {"id": 3, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}]}, "time": [["07:30", "07:45"], ["08:30", "08:45"], ["11:35", "11:50"], ["11:45", "12:00"], ["12:10", "12:25"], ["12:35", "12:50"], ["14:30", "14:45"], ["17:25", "17:40"], ["17:45", "18:00"], ["18:10", "18:25"], ["19:00", "19:15"], ["20:30", "20:45"], ["21:35", "21:50"], ["22:30", "22:45"]]}, {"id": 4, "route": {"id": 4, "campuses": [{"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["07:10", "07:25"], ["07:30", "07:45"], ["08:00", "08:15"], ["08:30", "08:45"], ["09:00", "09:15"], ["12:05", "12:20"], ["13:20", "13:35"], ["13:40", "13:55"], ["14:00", "14:15"], ["15:10", "15:25"], ["18:20", "18:35"], ["19:15", "19:30"], ["20:45", "21:00"], ["21:50", "22:05"], ["22:45", "23:00"]]}, {"id": 5, "route": {"id": 5, "campuses": [{"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}]}, "time": [["07:35", null, "07:55"], ["11:35", null, "11:55"], ["12:25", null, "12:45"], ["17:35", null, "17:55"], ["18:00", null, "18:20"], ["18:50", null, "19:10"], ["20:20", null, "20:40"], ["21:25", null, "21:45"], ["22:20", null, "22:40"]]}, {"id": 6, "route": {"id": 6, "campuses": [{"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}]}, "time": [["07:10", null, "07:30"], ["07:30", null, "07:50"], ["08:00", null, "08:20"], ["08:30", null, "08:50"], ["09:00", null, "09:20"], ["13:20", null, "13:40"], ["13:40", null, "14:00"], ["14:00", null, "14:20"], ["15:10", null, "15:30"]]}, {"id": 7, "route": {"id": 7, "campuses": [{"id": 6, "name": "高新", "latitude": 31.820447, "longitude": 117.129369}, {"id": 5, "name": "先研院", "latitude": 31.826345, "longitude": 117.129257}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["06:40", "06:45", null, "07:25"], ["08:00", "08:05", null, "08:50"], ["09:35", "09:40", null, "10:20"], ["12:50", "12:55", null, "13:35"], ["14:30", "14:35", null, "15:25"], ["16:00", "16:05", null, "16:50"], ["18:30", "18:35", null, "19:25"], ["22:05", "22:10", null, "22:50"]]}, {"id": 8, "route": {"id": 8, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 5, "name": "先研院", "latitude": 31.826345, "longitude": 117.129257}, {"id": 6, "name": "高新", "latitude": 31.820447, "longitude": 117.129369}]}, "time": [["06:50", "07:00", null, "07:40"], ["08:00", "08:10", null, "09:00"], ["12:50", "13:00", null, "13:40"], ["14:30", "14:40", null, "15:25"], ["16:00", "16:10", null, "16:50"], ["18:30", "18:40", null, "19:30"], ["21:20", "21:30", null, "22:00"], ["22:05", "22:15", null, "23:00"]]}, {"id": 13, "route": {"id": 13, "campuses": [{"id": 7, "name": "太湖路园区", "latitude": 31.824495, "longitude": 117.296554}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["09:10", "09:40"], ["10:30", "11:00"], ["11:30", "12:00"], ["13:30", "13:50"], ["15:00", "15:30"], ["18:30", "19:00"], ["21:30", "22:00"]]}, {"id": 14, "route": {"id": 14, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 7, "name": "太湖路园区", "latitude": 31.824495, "longitude": 117.296554}]}, "time": [["07:10", "07:40"], ["09:10", "09:40"], ["10:30", "11:00"], ["11:30", "12:00"], ["13:30", "13:50"], ["18:40", "19:10"], ["22:10", "22:40"]]}], "saturday_routes": [{"id": 1, "route": {"id": 1, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}]}, "time": [["07:30", null, "07:40"], ["11:35", null, "11:45"], ["13:30", null, "13:40"], ["17:30", null, "17:40"], ["18:40", null, "18:50"], ["21:15", null, "21:25"]]}, {"id": 2, "route": {"id": 2, "campuses": [{"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["07:40", null, "07:50"], ["11:45", null, "11:55"], ["13:40", null, "13:50"], ["17:40", null, "17:50"], ["18:50", null, "19:00"], ["21:25", null, "21:35"]]}, {"id": 3, "route": {"id": 3, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}]}, "time": [["11:45", "12:00"], ["17:45", "18:00"], ["19:00", "19:15"], ["21:35", "21:50"]]}, {"id": 4, "route": {"id": 4, "campuses": [{"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["07:30", "07:45"], ["13:40", "13:55"], ["19:15", "19:30"], ["21:50", "22:05"]]}, {"id": 5, "route": {"id": 5, "campuses": [{"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}]}, "time": [["11:35", null, "11:55"], ["17:35", null, "17:55"], ["18:50", null, "19:10"], ["21:25", null, "21:45"]]}, {"id": 6, "route": {"id": 6, "campuses": [{"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}]}, "time": [["07:30", null, "07:50"], ["13:40", null, "14:00"]]}, {"id": 9, "route": {"id": 7, "campuses": [{"id": 6, "name": "高新", "latitude": 31.820447, "longitude": 117.129369}, {"id": 5, "name": "先研院", "latitude": 31.826345, "longitude": 117.129257}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["08:00", "08:05", null, "08:50"], ["13:40", "13:45", null, "14:30"], ["16:00", "16:05", null, "16:50"], ["21:50", "21:55", null, "22:40"]]}, {"id": 10, "route": {"id": 8, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 5, "name": "先研院", "latitude": 31.826345, "longitude": 117.129257}, {"id": 6, "name": "高新", "latitude": 31.820447, "longitude": 117.129369}]}, "time": [["06:50", "07:00", null, "07:40"], ["12:50", "13:00", null, "13:40"], ["18:30", "18:40", null, "19:30"], ["21:50", "22:00", null, "22:50"]]}, {"id": 13, "route": {"id": 13, "campuses": [{"id": 7, "name": "太湖路园区", "latitude": 31.824495, "longitude": 117.296554}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["07:10", "07:40"], ["09:10", "09:40"], ["10:30", "11:00"], ["11:30", "12:00"], ["13:30", "13:50"], ["15:00", "15:30"], ["18:30", "19:00"], ["21:30", "22:00"]]}, {"id": 14, "route": {"id": 14, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 7, "name": "太湖路园区", "latitude": 31.824495, "longitude": 117.296554}]}, "time": [["07:10", "07:40"], ["09:10", "09:40"], ["10:30", "11:00"], ["11:30", "12:00"], ["13:30", "13:50"], ["18:40", "19:10"], ["22:10", "22:40"]]}], "sunday_routes": [{"id": 1, "route": {"id": 1, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}]}, "time": [["07:30", null, "07:40"], ["11:35", null, "11:45"], ["13:30", null, "13:40"], ["17:30", null, "17:40"], ["18:40", null, "18:50"], ["21:15", null, "21:25"]]}, {"id": 2, "route": {"id": 2, "campuses": [{"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["07:40", null, "07:50"], ["11:45", null, "11:55"], ["13:40", null, "13:50"], ["17:40", null, "17:50"], ["18:50", null, "19:00"], ["21:25", null, "21:35"]]}, {"id": 3, "route": {"id": 3, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}]}, "time": [["11:45", "12:00"], ["17:45", "18:00"], ["19:00", "19:15"], ["21:35", "21:50"]]}, {"id": 4, "route": {"id": 4, "campuses": [{"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["07:30", "07:45"], ["13:40", "13:55"], ["19:15", "19:30"], ["21:50", "22:05"]]}, {"id": 5, "route": {"id": 5, "campuses": [{"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}]}, "time": [["11:35", null, "11:55"], ["17:35", null, "17:55"], ["18:50", null, "19:10"], ["21:25", null, "21:45"]]}, {"id": 6, "route": {"id": 6, "campuses": [{"id": 4, "name": "南区", "latitude": 31.822112, "longitude": 117.283853}, {"id": 3, "name": "北区", "latitude": 31.841933, "longitude": 117.268125}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}]}, "time": [["07:30", null, "07:50"], ["13:40", null, "14:00"]]}, {"id": 9, "route": {"id": 7, "campuses": [{"id": 6, "name": "高新", "latitude": 31.820447, "longitude": 117.129369}, {"id": 5, "name": "先研院", "latitude": 31.826345, "longitude": 117.129257}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["08:00", "08:05", null, "08:50"], ["13:40", "13:45", null, "14:30"], ["16:00", "16:05", null, "16:50"], ["21:50", "21:55", null, "22:40"]]}, {"id": 10, "route": {"id": 8, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 2, "name": "西区", "latitude": 31.839258, "longitude": 117.256645}, {"id": 5, "name": "先研院", "latitude": 31.826345, "longitude": 117.129257}, {"id": 6, "name": "高新", "latitude": 31.820447, "longitude": 117.129369}]}, "time": [["06:50", "07:00", null, "07:40"], ["12:50", "13:00", null, "13:40"], ["18:30", "18:40", null, "19:30"], ["21:50", "22:00", null, "22:50"]]}, {"id": 13, "route": {"id": 13, "campuses": [{"id": 7, "name": "太湖路园区", "latitude": 31.824495, "longitude": 117.296554}, {"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}]}, "time": [["11:30", "12:00"], ["13:30", "13:50"], ["21:30", "22:00"]]}, {"id": 14, "route": {"id": 14, "campuses": [{"id": 1, "name": "东区", "latitude": 31.83892, "longitude": 117.268264}, {"id": 7, "name": "太湖路园区", "latitude": 31.824495, "longitude": 117.296554}]}, "time": [["07:30", "08:00"], ["11:30", "12:00"], ["13:30", "13:50"], ["22:10", "22:40"]]}], "message": {"message": "校园及高新校区班车自2026年8月30日起试运行,太湖路园区班车自2026年8月27日起试运行。来源:中国科大官方时刻表。", "url": "https://www.ustc.edu.cn/ggfw/rdlj.htm"}} \ No newline at end of file diff --git a/tests/test_bus_data_gen.py b/tests/test_bus_data_gen.py new file mode 100644 index 00000000000..0ff0939e0e0 --- /dev/null +++ b/tests/test_bus_data_gen.py @@ -0,0 +1,93 @@ +import json +import tempfile +import unittest +from pathlib import Path + +from tools.bus_data_gen import generate_bus_data + +ROOT = Path(__file__).resolve().parent.parent +ARTIFACT = ROOT / "static" / "bus_data_v3.json" +DAY_TYPES = ("weekday_routes", "saturday_routes", "sunday_routes") + + +def load_json(path: Path) -> dict: + return json.loads(path.read_text(encoding="utf-8")) + + +def find_schedule(payload: dict, day_type: str, route_id: int) -> dict: + return next( + schedule + for schedule in payload[day_type] + if schedule["route"]["id"] == route_id + ) + + +class BusDataGeneratorTest(unittest.TestCase): + def test_generated_artifact_matches_generator(self) -> None: + with tempfile.TemporaryDirectory() as temporary_dir: + generated_path = generate_bus_data(Path(temporary_dir) / "bus.json") + self.assertEqual(load_json(generated_path), load_json(ARTIFACT)) + + def test_campus_and_route_ids_are_unique(self) -> None: + payload = load_json(ARTIFACT) + campus_ids = [campus["id"] for campus in payload["campuses"]] + route_ids = [route["id"] for route in payload["routes"]] + self.assertEqual(len(campus_ids), len(set(campus_ids))) + self.assertEqual(len(route_ids), len(set(route_ids))) + routes_by_id = {route["id"]: route for route in payload["routes"]} + self.assertEqual( + [campus["id"] for campus in routes_by_id[5]["campuses"]], + [2, 3, 4], + ) + self.assertEqual( + [campus["id"] for campus in routes_by_id[6]["campuses"]], + [4, 3, 2], + ) + self.assertEqual( + payload["campuses"][-1], + { + "id": 7, + "name": "太湖路园区", + "latitude": 31.824495, + "longitude": 117.296554, + }, + ) + + def test_every_stop_time_row_matches_route_stop_count(self) -> None: + payload = load_json(ARTIFACT) + for day_type in DAY_TYPES: + for schedule in payload[day_type]: + stop_count = len(schedule["route"]["campuses"]) + self.assertTrue(schedule["time"]) + for stop_times in schedule["time"]: + self.assertEqual(len(stop_times), stop_count) + + def test_taihu_has_day_specific_departures(self) -> None: + payload = load_json(ARTIFACT) + weekday_taihu_to_east = find_schedule(payload, "weekday_routes", 13) + saturday_taihu_to_east = find_schedule(payload, "saturday_routes", 13) + sunday_taihu_to_east = find_schedule(payload, "sunday_routes", 13) + + self.assertNotIn(["07:10", "07:40"], weekday_taihu_to_east["time"]) + self.assertEqual(saturday_taihu_to_east["time"][0], ["07:10", "07:40"]) + self.assertEqual( + sunday_taihu_to_east["time"], + [["11:30", "12:00"], ["13:30", "13:50"], ["21:30", "22:00"]], + ) + + weekday_east_to_taihu = find_schedule(payload, "weekday_routes", 14) + sunday_east_to_taihu = find_schedule(payload, "sunday_routes", 14) + self.assertEqual(weekday_east_to_taihu["time"][0], ["07:10", "07:40"]) + self.assertEqual(sunday_east_to_taihu["time"][0], ["07:30", "08:00"]) + + def test_schema_and_message_use_current_sources(self) -> None: + payload = load_json(ARTIFACT) + self.assertNotIn("weekend_routes", payload) + message = payload["message"] + self.assertIn("2026年8月30日", message["message"]) + self.assertIn("2026年8月27日", message["message"]) + self.assertEqual(message["url"], "https://www.ustc.edu.cn/ggfw/rdlj.htm") + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/bus_data_gen.py b/tools/bus_data_gen.py index 71117191d87..6a676da83ac 100644 --- a/tools/bus_data_gen.py +++ b/tools/bus_data_gen.py @@ -15,12 +15,13 @@ def __init__(self, id: int, name: str, latitude: float, longitude: float): longitude: float -east = Campus(1, "东区", 117.268264, 31.83892) -west = Campus(2, "西区", 117.256645, 31.839258) -north = Campus(3, "北区", 117.268125, 31.841933) -south = Campus(4, "南区", 117.283853, 31.822112) -xianyanyuan = Campus(5, "先研院", 117.129257, 31.826345) -gaoxin = Campus(6, "高新", 117.129369, 31.820447) +east = Campus(1, "东区", 31.83892, 117.268264) +west = Campus(2, "西区", 31.839258, 117.256645) +north = Campus(3, "北区", 31.841933, 117.268125) +south = Campus(4, "南区", 31.822112, 117.283853) +xianyanyuan = Campus(5, "先研院", 31.826345, 117.129257) +gaoxin = Campus(6, "高新", 31.820447, 117.129369) +taihu = Campus(7, "太湖路园区", 31.824495, 117.296554) class Route: @@ -43,112 +44,330 @@ def __init__(self, id: int, route: Route, time: list[list[str | None]]): time: list[list[str | None]] -class RouteScheduleP: - def __init__( - self, id: int, route: Route, time: list[tuple[list[str | None], bool]] - ): - self.id = id - self.route = route - self.time = time - - id: int - route: Route - time: list[tuple[list[str | None], bool]] - - def convert(self, is_weekend: bool) -> RouteSchedule: - if is_weekend: - return RouteSchedule(self.id, self.route, [x[0] for x in self.time if x[1]]) - else: - return RouteSchedule(self.id, self.route, [x[0] for x in self.time]) - - -# 2026 暑期时刻表(8月1日—8月29日),工作日与周末相同 -rsA = RouteSchedule( - 1, - Route(1, [east, north, west]), - [ - ["08:15", None, "08:25"], - ["11:30", None, "11:40"], - ["14:10", None, "14:20"], - ["17:00", None, "17:10"], - ["19:00", None, "19:10"], - ], -) - -rsB = RouteSchedule( - 2, - Route(2, [west, north, east]), - [ - ["08:25", None, "08:35"], - ["11:40", None, "11:50"], - ["14:20", None, "14:30"], - ["17:10", None, "17:20"], - ["19:10", None, "19:20"], - ], -) - -rsC = RouteSchedule( - 3, - Route(3, [east, south]), - [ - ["11:40", "11:55"], - ["17:10", "17:25"], - ["19:20", "19:35"], - ], -) - -rsD = RouteSchedule( - 4, - Route(4, [south, east]), - [ - ["08:00", "08:15"], - ["14:10", "14:25"], - ["19:35", "19:50"], - ], -) - -rsE = RouteSchedule( - 5, - Route(5, [west, south]), - [ - ["11:30", "11:50"], - ["17:00", "17:20"], - ["19:10", "19:30"], - ], -) - -rsF = RouteSchedule( - 6, - Route(6, [south, west]), - [ - ["08:00", "08:20"], - ["14:10", "14:30"], - ], -) - -rsG = RouteSchedule( - 7, - Route(7, [gaoxin, xianyanyuan, west, east]), - [ - ["08:45", "08:50", None, "09:35"], - ["13:30", "13:35", None, "14:20"], - ["19:00", "19:05", None, "19:50"], - ["21:00", "21:05", None, "21:50"], - ], -) - -rsH = RouteSchedule( - 8, - Route(8, [east, west, xianyanyuan, gaoxin]), - [ - ["07:30", "07:40", None, "08:20"], - ["12:30", "12:40", None, "13:20"], - ["18:00", "18:10", None, "18:50"], - ["20:00", "20:10", None, "20:50"], - ], -) +east_west = Route(1, [east, north, west]) +west_east = Route(2, [west, north, east]) +east_south = Route(3, [east, south]) +south_east = Route(4, [south, east]) +west_south = Route(5, [west, north, south]) +south_west = Route(6, [south, north, west]) +gaoxin_east = Route(7, [gaoxin, xianyanyuan, west, east]) +east_gaoxin = Route(8, [east, west, xianyanyuan, gaoxin]) +taihu_east = Route(13, [taihu, east]) +east_taihu = Route(14, [east, taihu]) + + +# 校园班车运行时刻表(2026 年 8 月 30 日试运行)。 +# 工作日表包含图中所有工作日班次;双休表仅包含红色 ★ 班次。 +campus_weekday_routes = [ + RouteSchedule( + 1, + east_west, + [ + ["07:30", None, "07:40"], + ["09:20", None, "09:30"], + ["09:35", None, "09:45"], + ["11:35", None, "11:45"], + ["12:15", None, "12:25"], + ["13:30", None, "13:40"], + ["15:30", None, "15:40"], + ["15:50", None, "16:00"], + ["17:30", None, "17:40"], + ["17:50", None, "18:00"], + ["18:40", None, "18:50"], + ["20:10", None, "20:20"], + ["21:15", None, "21:25"], + ["22:10", None, "22:20"], + ], + ), + RouteSchedule( + 2, + west_east, + [ + ["07:40", None, "07:50"], + ["09:30", None, "09:40"], + ["09:45", None, "09:55"], + ["11:45", None, "11:55"], + ["12:25", None, "12:35"], + ["13:40", None, "13:50"], + ["15:40", None, "15:50"], + ["16:00", None, "16:10"], + ["17:40", None, "17:50"], + ["18:00", None, "18:10"], + ["18:50", None, "19:00"], + ["20:20", None, "20:30"], + ["21:25", None, "21:35"], + ["22:20", None, "22:30"], + ], + ), + RouteSchedule( + 3, + east_south, + [ + ["07:30", "07:45"], + ["08:30", "08:45"], + ["11:35", "11:50"], + ["11:45", "12:00"], + ["12:10", "12:25"], + ["12:35", "12:50"], + ["14:30", "14:45"], + ["17:25", "17:40"], + ["17:45", "18:00"], + ["18:10", "18:25"], + ["19:00", "19:15"], + ["20:30", "20:45"], + ["21:35", "21:50"], + ["22:30", "22:45"], + ], + ), + RouteSchedule( + 4, + south_east, + [ + ["07:10", "07:25"], + ["07:30", "07:45"], + ["08:00", "08:15"], + ["08:30", "08:45"], + ["09:00", "09:15"], + ["12:05", "12:20"], + ["13:20", "13:35"], + ["13:40", "13:55"], + ["14:00", "14:15"], + ["15:10", "15:25"], + ["18:20", "18:35"], + ["19:15", "19:30"], + ["20:45", "21:00"], + ["21:50", "22:05"], + ["22:45", "23:00"], + ], + ), + RouteSchedule( + 5, + west_south, + [ + ["07:35", None, "07:55"], + ["11:35", None, "11:55"], + ["12:25", None, "12:45"], + ["17:35", None, "17:55"], + ["18:00", None, "18:20"], + ["18:50", None, "19:10"], + ["20:20", None, "20:40"], + ["21:25", None, "21:45"], + ["22:20", None, "22:40"], + ], + ), + RouteSchedule( + 6, + south_west, + [ + ["07:10", None, "07:30"], + ["07:30", None, "07:50"], + ["08:00", None, "08:20"], + ["08:30", None, "08:50"], + ["09:00", None, "09:20"], + ["13:20", None, "13:40"], + ["13:40", None, "14:00"], + ["14:00", None, "14:20"], + ["15:10", None, "15:30"], + ], + ), +] + +campus_saturday_routes = [ + RouteSchedule( + 1, + east_west, + [ + ["07:30", None, "07:40"], + ["11:35", None, "11:45"], + ["13:30", None, "13:40"], + ["17:30", None, "17:40"], + ["18:40", None, "18:50"], + ["21:15", None, "21:25"], + ], + ), + RouteSchedule( + 2, + west_east, + [ + ["07:40", None, "07:50"], + ["11:45", None, "11:55"], + ["13:40", None, "13:50"], + ["17:40", None, "17:50"], + ["18:50", None, "19:00"], + ["21:25", None, "21:35"], + ], + ), + RouteSchedule( + 3, + east_south, + [ + ["11:45", "12:00"], + ["17:45", "18:00"], + ["19:00", "19:15"], + ["21:35", "21:50"], + ], + ), + RouteSchedule( + 4, + south_east, + [ + ["07:30", "07:45"], + ["13:40", "13:55"], + ["19:15", "19:30"], + ["21:50", "22:05"], + ], + ), + RouteSchedule( + 5, + west_south, + [ + ["11:35", None, "11:55"], + ["17:35", None, "17:55"], + ["18:50", None, "19:10"], + ["21:25", None, "21:45"], + ], + ), + RouteSchedule( + 6, + south_west, + [["07:30", None, "07:50"], ["13:40", None, "14:00"]], + ), +] + + +# 高新校区班车运行时刻表(2026 年 8 月 30 日试运行)。 +gaoxin_weekday_routes = [ + RouteSchedule( + 7, + gaoxin_east, + [ + ["06:40", "06:45", None, "07:25"], + ["08:00", "08:05", None, "08:50"], + ["09:35", "09:40", None, "10:20"], + ["12:50", "12:55", None, "13:35"], + ["14:30", "14:35", None, "15:25"], + ["16:00", "16:05", None, "16:50"], + ["18:30", "18:35", None, "19:25"], + ["22:05", "22:10", None, "22:50"], + ], + ), + RouteSchedule( + 8, + east_gaoxin, + [ + ["06:50", "07:00", None, "07:40"], + ["08:00", "08:10", None, "09:00"], + ["12:50", "13:00", None, "13:40"], + ["14:30", "14:40", None, "15:25"], + ["16:00", "16:10", None, "16:50"], + ["18:30", "18:40", None, "19:30"], + ["21:20", "21:30", None, "22:00"], + ["22:05", "22:15", None, "23:00"], + ], + ), +] + +gaoxin_saturday_routes = [ + RouteSchedule( + 9, + gaoxin_east, + [ + ["08:00", "08:05", None, "08:50"], + ["13:40", "13:45", None, "14:30"], + ["16:00", "16:05", None, "16:50"], + ["21:50", "21:55", None, "22:40"], + ], + ), + RouteSchedule( + 10, + east_gaoxin, + [ + ["06:50", "07:00", None, "07:40"], + ["12:50", "13:00", None, "13:40"], + ["18:30", "18:40", None, "19:30"], + ["21:50", "22:00", None, "22:50"], + ], + ), +] + + +# 太湖路园区班车运行时刻表(2026 年 8 月 27 日试运行)。 +taihu_weekday_routes = [ + RouteSchedule( + 13, + taihu_east, + [ + ["09:10", "09:40"], + ["10:30", "11:00"], + ["11:30", "12:00"], + ["13:30", "13:50"], + ["15:00", "15:30"], + ["18:30", "19:00"], + ["21:30", "22:00"], + ], + ), + RouteSchedule( + 14, + east_taihu, + [ + ["07:10", "07:40"], + ["09:10", "09:40"], + ["10:30", "11:00"], + ["11:30", "12:00"], + ["13:30", "13:50"], + ["18:40", "19:10"], + ["22:10", "22:40"], + ], + ), +] + +taihu_saturday_routes = [ + RouteSchedule( + 13, + taihu_east, + [ + ["07:10", "07:40"], + ["09:10", "09:40"], + ["10:30", "11:00"], + ["11:30", "12:00"], + ["13:30", "13:50"], + ["15:00", "15:30"], + ["18:30", "19:00"], + ["21:30", "22:00"], + ], + ), + RouteSchedule( + 14, + east_taihu, + [ + ["07:10", "07:40"], + ["09:10", "09:40"], + ["10:30", "11:00"], + ["11:30", "12:00"], + ["13:30", "13:50"], + ["18:40", "19:10"], + ["22:10", "22:40"], + ], + ), +] -summer_routes = [rsA, rsB, rsC, rsD, rsE, rsF, rsG, rsH] +taihu_sunday_routes = [ + RouteSchedule( + 13, + taihu_east, + [["11:30", "12:00"], ["13:30", "13:50"], ["21:30", "22:00"]], + ), + RouteSchedule( + 14, + east_taihu, + [ + ["07:30", "08:00"], + ["11:30", "12:00"], + ["13:30", "13:50"], + ["22:10", "22:40"], + ], + ), +] class Message: @@ -166,41 +385,50 @@ def __init__( campuses: list[Campus], routes: list[Route], weekday_routes: list[RouteSchedule], - weekend_routes: list[RouteSchedule], + saturday_routes: list[RouteSchedule], + sunday_routes: list[RouteSchedule], message: Message, ): self.campuses = campuses self.routes = routes self.weekday_routes = weekday_routes - self.weekend_routes = weekend_routes + self.saturday_routes = saturday_routes + self.sunday_routes = sunday_routes self.message = message campuses: list[Campus] routes: list[Route] weekday_routes: list[RouteSchedule] - weekend_routes: list[RouteSchedule] + saturday_routes: list[RouteSchedule] + sunday_routes: list[RouteSchedule] message: Message data = BusData( - campuses=[east, west, north, south, xianyanyuan, gaoxin], + campuses=[east, west, north, south, xianyanyuan, gaoxin, taihu], routes=[ - Route(1, [east, north, west]), - Route(2, [west, north, east]), - Route(3, [east, south]), - Route(4, [south, east]), - Route(5, [west, south]), - Route(6, [south, west]), - Route(7, [gaoxin, xianyanyuan, west, east]), - Route(8, [east, west, xianyanyuan, gaoxin]), - Route(11, [gaoxin, xianyanyuan]), - Route(12, [xianyanyuan, gaoxin]), + east_west, + west_east, + east_south, + south_east, + west_south, + south_west, + gaoxin_east, + east_gaoxin, + taihu_east, + east_taihu, ], - weekday_routes=summer_routes, - weekend_routes=summer_routes, + weekday_routes=campus_weekday_routes + gaoxin_weekday_routes + taihu_weekday_routes, + saturday_routes=campus_saturday_routes + + gaoxin_saturday_routes + + taihu_saturday_routes, + sunday_routes=campus_saturday_routes + gaoxin_saturday_routes + taihu_sunday_routes, message=Message( - message="本表为 2026 暑期时间表(8月1日—8月29日),来源:蜗壳小道消息", - url="https://mp.weixin.qq.com/s/aWF0UA63pQmM5MWiAtTeKg", + message=( + "校园及高新校区班车自2026年8月30日起试运行," + "太湖路园区班车自2026年8月27日起试运行。来源:中国科大官方时刻表。" + ), + url="https://www.ustc.edu.cn/ggfw/rdlj.htm", ), ) @@ -215,8 +443,8 @@ def generate_bus_data(output_path: Path | None = None) -> Path: output_path = ( Path(__file__).resolve().parent.parent / "static" / "bus_data_v3.json" ) - with open(output_path, "w") as f: - f.write(str(data_json)) + with open(output_path, "w", encoding="utf-8") as output_file: + output_file.write(data_json) return output_path