| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- const UZZ_BASE_URL = window.location.origin;
- function parseWeeks(weekStr) {
- if (!weekStr) return [];
- const segments = weekStr.split(',');
- let weeks = [];
- const segmentRegex = /(\d+)(?:-(\d+))?\s*周?(\([单双]\))?/g;
- for (const segment of segments) {
- segmentRegex.lastIndex = 0;
- let match;
- while ((match = segmentRegex.exec(segment)) !== null) {
- const start = parseInt(match[1]);
- const end = match[2] ? parseInt(match[2]) : start;
- const flagStr = match[3] || '';
- let flag = 0;
- if (flagStr.includes('单')) flag = 1;
- else if (flagStr.includes('双')) flag = 2;
- for (let i = start; i <= end; i++) {
- if (flag === 1 && i % 2 !== 1) continue;
- if (flag === 2 && i % 2 !== 0) continue;
- if (!weeks.includes(i)) weeks.push(i);
- }
- }
- }
- return weeks.sort((a, b) => a - b);
- }
- function parseJsonData(jsonData) {
- if (!jsonData || !Array.isArray(jsonData.kbList)) return [];
- const finalCourseList = [];
- for (const item of jsonData.kbList) {
- const weeks = parseWeeks(item.zcd);
- const sectionParts = item.jcs.split('-');
- const startSection = parseInt(sectionParts[0]);
- const endSection = parseInt(sectionParts[sectionParts.length - 1]);
- const day = parseInt(item.xqj);
- if (weeks.length > 0 && !isNaN(day)) {
- finalCourseList.push({
- name: item.kcmc.trim(),
- teacher: item.xm ? item.xm.trim() : "未知",
- position: item.cdmc ? item.cdmc.trim() : "未知",
- day: day,
- startSection: startSection,
- endSection: endSection,
- weeks: weeks
- });
- }
- }
- return finalCourseList;
- }
- const TimeSlots = [
- { number: 1, startTime: "08:00", endTime: "08:50" },
- { number: 2, startTime: "08:50", endTime: "09:40" },
- { number: 3, startTime: "10:10", endTime: "11:00" },
- { number: 4, startTime: "11:00", endTime: "11:50" },
- { number: 5, startTime: "14:30", endTime: "15:20" },
- { number: 6, startTime: "15:20", endTime: "16:10" },
- { number: 7, startTime: "16:40", endTime: "17:30" },
- { number: 8, startTime: "17:30", endTime: "18:20" },
- { number: 9, startTime: "19:30", endTime: "20:20" },
- { number: 10, startTime: "20:20", endTime: "21:10" }
- ];
- async function runImportFlow() {
- const $ = window.jQuery;
-
- // 强拦截:由于正方系统的 gnmkdm 模块会话校验,必须要求用户在课表页面才能请求 API
- if (!$ || !$('#xnm').length || !$('#xqm').length) {
- await window.AndroidBridgePromise.showAlert(
- "导入提示",
- "正方教务系统限制:请务必先点击进入【正方教务管理系统】->【个人课表查询】页面后,再点击一键导入!",
- "我知道了"
- );
- return;
- }
- AndroidBridge.showToast("正在获取当前页面课表数据...");
-
- // 直接静默提取页面上已经选好的学年和学期
- const xnm = $('#xnm').val();
- const xqm = $('#xqm').val();
- try {
- const apiUrl = `${UZZ_BASE_URL}/jwglxt/kbcx/xskbcx_cxXsgrkb.html?gnmkdm=N2151`;
- const body = `xnm=${xnm}&xqm=${xqm}&kzlx=ck&xsdm=&kclbdm=`;
- const response = await fetch(apiUrl, {
- method: 'POST',
- headers: { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' },
- body: body
- });
- const json = await response.json();
- const courses = parseJsonData(json);
- if (courses.length === 0) {
- await window.AndroidBridgePromise.showAlert("导入失败", "该学年学期未找到课程数据,请确认页面上显示的课表是否为空。", "确定");
- return;
- }
- await window.AndroidBridgePromise.saveImportedCourses(JSON.stringify(courses));
- await window.AndroidBridgePromise.savePresetTimeSlots(JSON.stringify(TimeSlots));
- AndroidBridge.showToast(`成功导入 ${courses.length} 门课程!`);
- AndroidBridge.notifyTaskCompletion();
- } catch (e) {
- await window.AndroidBridgePromise.showAlert("导入失败", "接口请求异常,请确认教务系统网络通畅。", "确定");
- console.error(e);
- }
- }
- runImportFlow();
|