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();