Files
education/frontend/node_modules/.cache/vue-loader/5997a41ab596100cad838586d62663a0.json
T

1 line
38 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\shiftSemester\\index.vue?vue&type=script&setup=true&lang=ts","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\shiftSemester\\index.vue","mtime":1787321744872},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\cache-loader\\dist\\cjs.js","mtime":1787309791955},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js","mtime":1787309793790}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:DQppbXBvcnQgeyBjb21wdXRlZCwgbmV4dFRpY2ssIG9uTW91bnRlZCwgcmVhY3RpdmUsIHJlZiB9IGZyb20gJ3Z1ZScNCmltcG9ydCB7IEVsTWVzc2FnZSwgRWxNZXNzYWdlQm94IH0gZnJvbSAnZWxlbWVudC1wbHVzJw0KaW1wb3J0IHsNCiAgQXJyb3dEb3duLA0KICBDYWxlbmRhciwNCiAgQ2xvc2UsDQogIENvbm5lY3Rpb24sDQogIERvY3VtZW50LA0KICBFZGl0UGVuLA0KICBMaWdodG5pbmcsDQogIE1hZ2ljU3RpY2ssDQogIFBsdXMsDQogIFJlZnJlc2gsDQogIFNvcnQNCn0gZnJvbSAnQGVsZW1lbnQtcGx1cy9pY29ucy12dWUnDQppbXBvcnQgQ2xhc3NTZW1lc3RlckRldGFpbERpYWxvZywgeyB0eXBlIE5ld0NsYXNzSW5mbyB9IGZyb20gJy4vQ2xhc3NTZW1lc3RlckRldGFpbERpYWxvZy52dWUnDQoNCi8qKiDnj63mrKHlrabmnJ/kv6Hmga/ooYwgKi8NCmludGVyZmFjZSBDbGFzc1NlbWVzdGVyUm93IHsNCiAgaWQ6IHN0cmluZyAgICAgICAgIC8vIOWUr+S4gOagh+ivhg0KICB4emR3OiBzdHJpbmcgICAgICAgLy8g6KGM5pS/6Zif5YirDQogIHhoOiBudW1iZXIgICAgICAgICAvLyDnj63mrKHluo/lj7cNCiAgYmM6IHN0cmluZyAgICAgICAgIC8vIOePree6p++8iOePreasoeWPt++8iQ0KICByczogbnVtYmVyICAgICAgICAgLy8g5Lq65pWwDQogIG5qOiBzdHJpbmcgICAgICAgICAvLyDlubTnuqcNCiAgeGt6eTogc3RyaW5nICAgICAgIC8vIOWtpuenkeS4k+S4mg0KICBreHJxOiBzdHJpbmcgICAgICAgLy8g5byA5a2m5pel5pyfDQogIGpzcnE6IHN0cmluZyAgICAgICAvLyDnu5PmnZ/ml6XmnJ8NCiAgeHFjYzogc3RyaW5nICAgICAgIC8vIOWtpuacn+esrOasoQ0KICB6eWpzOiBzdHJpbmcgICAgICAgLy8g5LiT55So5pWZ5a6kDQogIGp4cnc6IHN0cmluZyAgICAgICAvLyDmlZnlrabku7vliqENCiAgenM6IG51bWJlciAgICAgICAgIC8vIOWRqOaVsA0KICBrY3J3czogbnVtYmVyICAgICAgLy8g5oC76K++56iL5pWw77yI6K+l54+t5qyh55Sf5oiQ55qE6K++56iL5pWZ5a2m6K6h5YiS5pWw6YeP77yJDQogIGtjenM6IG51bWJlciAgICAgICAvLyDmgLvor77ml7bmlbANCiAga2ZweTogYm9vbGVhbiAgICAgIC8vIOW8gOaUvuaVmeWRmOaOkuivvg0KfQ0KDQovLyA9PT09PT09PT09PT09PT09PT09PSAxLiDlrablubTlrabmnJ/moIfpopjljLogPT09PT09PT09PT09PT09PT09PT0NCmNvbnN0IHNlbWVzdGVyTmFtZSA9ICcyMDE3LTIwMTjlrablubTnrKzkuIDlrabmnJ8nDQoNCi8vID09PT09PT09PT09PT09PT09PT09IDIuIOagoeWOhiAvIOmihOiuvuaXpeacn+S/oeaBr+WMuiA9PT09PT09PT09PT09PT09PT09PQ0KLyoqIOW9k+WJjeWtpuW5tOWtpuacn+agoeWOhiAqLw0KY29uc3Qgc2VtZXN0ZXIgPSByZWFjdGl2ZSh7DQogIGt4cnE6ICcyMDE3LTA3LTA4JywgIC8vIOagoeWOhuW8gOWtpuaXpeacnw0KICBqc3JxOiAnMjAxOC0wMi0xMScsICAvLyDmoKHljobnu5PmnZ/ml6XmnJ8NCiAgd2Vla3M6IDMyICAgICAgICAgICAgLy8g5a2m5pyf5ZGo5pWwDQp9KQ0KDQovKiog6aKE6K6+77yI54+t5qyh77yJ5pel5pyf77ya55So5LqO5om56YeP6K6+5a6a5omA6YCJ54+t5qyh55qE5byA5a2mL+e7k+adn+aXpeacnyAqLw0KY29uc3QgcHJlc2V0ID0gcmVhY3RpdmUoew0KICBreHJxOiAnMjAxNy0wNy0wOCcsICAvLyDpooTorr7lvIDlrabml6XmnJ8NCiAganNycTogJzIwMTgtMDItMTEnLCAgLy8g6aKE6K6+57uT5p2f5pel5pyfDQogIHdlZWtzOiAzMiAgICAgICAgICAgIC8vIOmihOiuvuWtpuacn+WRqOaVsA0KfSkNCg0KLyoqIOWQuOWPluaXpeacn++8muWwhuagoeWOhuaXpeacn+WkjeWItuWIsOmihOiuvuaXpeacnyAqLw0KY29uc3QgaGFuZGxlQWJzb3JiRGF0ZSA9ICgpID0+IHsNCiAgcHJlc2V0Lmt4cnEgPSBzZW1lc3Rlci5reHJxDQogIHByZXNldC5qc3JxID0gc2VtZXN0ZXIuanNycQ0KICBwcmVzZXQud2Vla3MgPSBzZW1lc3Rlci53ZWVrcw0KICBFbE1lc3NhZ2Uuc3VjY2Vzcygn5bey5ZC45Y+W5qCh5Y6G5pel5pyf5Yiw6aKE6K6+5pel5pyfJykNCn0NCg0KLy8gPT09PT09PT09PT09PT09PT09PT0gMy4g5p+l6K+i6Z2i5p2/ID09PT09PT09PT09PT09PT09PT09DQpjb25zdCBxdWVyeUZvcm0gPSByZWFjdGl2ZSh7DQogIGp4cnc6ICcnLCAgIC8vIOaVmeWtpuS7u+WKoe+8iOeUqOS6juaJuemHj+iuvue9ruaVmeWtpuS7u+WKoe+8iQ0KICB4cWNjOiAnJyAgICAvLyDlrabmnJ/nrKzmrKHvvIjnlKjkuo7mibnph4/orr7lrprlrabmnJ/nrKzmrKHvvIkNCn0pDQoNCi8vID09PT09PT09PT09PT09PT09PT09IDQuIOWPr+aWsOW7uuWtpuacn+S/oeaBr+eahOePreasoSA9PT09PT09PT09PT09PT09PT09PQ0KLyoqIOWPr+aWsOW7uuWtpuacn+S/oeaBr+eahOePreasoe+8muaWsOW7uueahOePreasoeOAgeW9k+WJjeWtpuacn+i/mOacquavleS4mueahOePreasoe+8jOS4lOW9k+WJjeWtpuacn+acquWIm+W7uuePreasoeWtpuacn+S/oeaBryAqLw0KY29uc3QgbmV3YWJsZUNsYXNzZXMgPSByZWY8TmV3Q2xhc3NJbmZvW10+KFtdKQ0KDQovKiog5pWZ5a2m54+t5qyh5a2m5pyf5L+h5oGv5piO57uG5by556qXICovDQpjb25zdCBkZXRhaWxWaXNpYmxlID0gcmVmKGZhbHNlKQ0KY29uc3QgZGV0YWlsTW9kZSA9IHJlZjwnY3JlYXRlJyB8ICdlZGl0Jz4oJ2NyZWF0ZScpDQpjb25zdCBzZWxlY3RlZE5ld0NsYXNzID0gcmVmPE5ld0NsYXNzSW5mbyB8IG51bGw+KG51bGwpDQpjb25zdCBzZWxlY3RlZEVkaXRSb3cgPSByZWY8Q2xhc3NTZW1lc3RlclJvdyB8IG51bGw+KG51bGwpDQoNCi8qKiDmlrDmt7vvvJrku47kuIvmi4nkuK3pgInmi6nlj6/mlrDlu7rlrabmnJ/kv6Hmga/nmoTnj63mrKHvvIzlvLnlh7rmmI7nu4bnqpflj6PliJvlu7ogKi8NCmNvbnN0IGhhbmRsZU5ld0NvbW1hbmQgPSAoaXRlbTogTmV3Q2xhc3NJbmZvIHwgc3RyaW5nKSA9PiB7DQogIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHJldHVybg0KICBzZWxlY3RlZE5ld0NsYXNzLnZhbHVlID0gaXRlbQ0KICBzZWxlY3RlZEVkaXRSb3cudmFsdWUgPSBudWxsDQogIGRldGFpbE1vZGUudmFsdWUgPSAnY3JlYXRlJw0KICBkZXRhaWxWaXNpYmxlLnZhbHVlID0gdHJ1ZQ0KfQ0KDQovKiog57yW6L6R77ya6YCJ5oup5LiA6KGM5ZCO5by55Ye65piO57uG56qX5Y+j5L+u5pS5ICovDQpjb25zdCBoYW5kbGVFZGl0ID0gKCkgPT4gew0KICBpZiAoIWN1cnJlbnRSb3cudmFsdWUpIHsNCiAgICBFbE1lc3NhZ2Uud2FybmluZygn6K+35YWI5Zyo5YiX6KGo5Lit6YCJ5oup5LiA5p2h54+t5qyh5a2m5pyf5L+h5oGvJykNCiAgICByZXR1cm4NCiAgfQ0KICBzZWxlY3RlZE5ld0NsYXNzLnZhbHVlID0gbnVsbA0KICBzZWxlY3RlZEVkaXRSb3cudmFsdWUgPSBjdXJyZW50Um93LnZhbHVlDQogIGRldGFpbE1vZGUudmFsdWUgPSAnZWRpdCcNCiAgZGV0YWlsVmlzaWJsZS52YWx1ZSA9IHRydWUNCn0NCg0KLyoqIOaJuemHj+WIm+W7uuaVmeWtpuePreasoeWtpuacn+S/oeaBryAqLw0KY29uc3QgaGFuZGxlQmF0Y2hDcmVhdGUgPSAoKSA9PiB7DQogIEVsTWVzc2FnZS5pbmZvKCfmibnph4/liJvlu7rmlZnlrabnj63mrKHlrabmnJ/kv6Hmga/vvIjmjqXlj6PlvoXmjqXlhaXvvIknKQ0KfQ0KDQovKiog5piO57uG56qX5Y+j56Gu6K6k77ya5Yib5bu65oiW5L+u5pS5ICovDQpjb25zdCBoYW5kbGVEZXRhaWxDb25maXJtID0gKCkgPT4gew0KICBkZXRhaWxWaXNpYmxlLnZhbHVlID0gZmFsc2UNCiAgaWYgKGRldGFpbE1vZGUudmFsdWUgPT09ICdjcmVhdGUnKSB7DQogICAgRWxNZXNzYWdlLnN1Y2Nlc3MoJ+W3suWIm+W7uuePreasoeWtpuacn+S/oeaBr++8iOaOpeWPo+W+heaOpeWFpe+8iScpDQogIH0gZWxzZSB7DQogICAgRWxNZXNzYWdlLnN1Y2Nlc3MoJ+W3suS/neWtmOePreasoeWtpuacn+S/oeaBr+S/ruaUue+8iOaOpeWPo+W+heaOpeWFpe+8iScpDQogIH0NCn0NCg0KLy8gPT09PT09PT09PT09PT09PT09PT0gNS4g54+t5qyh5a2m5pyf5L+h5oGv5YiX6KGoID09PT09PT09PT09PT09PT09PT09DQpjb25zdCB0YWJsZVJlZiA9IHJlZigpDQpjb25zdCBjdXJyZW50Um93ID0gcmVmPENsYXNzU2VtZXN0ZXJSb3cgfCBudWxsPihudWxsKQ0KY29uc3Qgc2VsZWN0aW9uID0gcmVmPENsYXNzU2VtZXN0ZXJSb3dbXT4oW10pDQoNCmNvbnN0IHRhYmxlRGF0YSA9IHJlZjxDbGFzc1NlbWVzdGVyUm93W10+KFsNCiAgeyBpZDogJzEnLCB4emR3OiAn5a2m5ZGYMemYnycsIHhoOiAxLCBiYzogJzAxNTAnLCByczogNDAsIG5qOiAnMjAxN+e6p+eniycsIHhrenk6ICfkuJPkuJo1Jywga3hycTogJzIwMTctMDktMDMnLCBqc3JxOiAnMjAxOC0wMi0wNScsIHhxY2M6ICfnrKwx5a2m5pyfJywgenlqczogJzEtMzA3JywganhydzogJzIwMTflubTkuIvljYrlubTmlZnlrabku7vliqEnLCB6czogMjQsIGtjcndzOiAxNCwga2N6czogNTEyLCBrZnB5OiB0cnVlIH0sDQogIHsgaWQ6ICcyJywgeHpkdzogJ+aVmeWtpuS6lOezuycsIHhoOiAxMSwgYmM6ICcwMjAxJywgcnM6IDMwLCBuajogJzIwMTbnuqcnLCB4a3p5OiAn5LiT5LiaMTEzJywga3hycTogJzIwMTctMDgtMjQnLCBqc3JxOiAnMjAxOC0wMi0wNScsIHhxY2M6ICfnrKwz5a2m5pyfJywgenlqczogJzYtMjAyJywganhydzogJzIwMTflubTkuIvljYrlubTmlZnlrabku7vliqEnLCB6czogMjUsIGtjcndzOiAxMiwga2N6czogNDgwLCBrZnB5OiBmYWxzZSB9LA0KICB7IGlkOiAnMycsIHh6ZHc6ICfmlZnlrabkuIPns7snLCB4aDogMTMsIGJjOiAnMDIwMycsIHJzOiAzNiwgbmo6ICcyMDE257qnJywgeGt6eTogJ+S4k+S4mjExNScsIGt4cnE6ICcyMDE3LTA4LTI0JywganNycTogJzIwMTgtMDItMDUnLCB4cWNjOiAn56ysM+WtpuacnycsIHp5anM6ICc4LTAwNycsIGp4cnc6ICfnoJTnqbbnlJ8yMDE35LiL5Y2K5bm05pWZ5a2m5Lu75YqhJywgenM6IDI1LCBrY3J3czogMTMsIGtjenM6IDUyMCwga2ZweTogdHJ1ZSB9DQpdKQ0KDQpjb25zdCBoYW5kbGVDdXJyZW50Q2hhbmdlID0gKHJvdzogQ2xhc3NTZW1lc3RlclJvdykgPT4gew0KICBjdXJyZW50Um93LnZhbHVlID0gcm93DQp9DQoNCmNvbnN0IGhhbmRsZVNlbGVjdGlvbkNoYW5nZSA9IChyb3dzOiBDbGFzc1NlbWVzdGVyUm93W10pID0+IHsNCiAgc2VsZWN0aW9uLnZhbHVlID0gcm93cw0KfQ0KDQovKiog5ZCI5bm25Y2V5YWD5qC877ya6KGM5pS/6Zif5Yir5YiX77yI56ys5LiA5YiX77yJ57q15ZCR5ZCI5bm255u45ZCM5YC8ICovDQpjb25zdCBzcGFuTWV0aG9kID0gKHsgcm93SW5kZXgsIGNvbHVtbkluZGV4IH06IHsgcm93SW5kZXg6IG51bWJlcjsgY29sdW1uSW5kZXg6IG51bWJlciB9KSA9PiB7DQogIGlmIChjb2x1bW5JbmRleCA9PT0gMSkgew0KICAgIGNvbnN0IGxpc3QgPSB0YWJsZURhdGEudmFsdWUNCiAgICBjb25zdCBjdXJyZW50ID0gbGlzdFtyb3dJbmRleF0NCiAgICBpZiAocm93SW5kZXggPiAwICYmIGxpc3Rbcm93SW5kZXggLSAxXS54emR3ID09PSBjdXJyZW50Lnh6ZHcpIHsNCiAgICAgIHJldHVybiB7IHJvd3NwYW46IDAsIGNvbHNwYW46IDAgfQ0KICAgIH0NCiAgICBsZXQgcm93c3BhbiA9IDENCiAgICBmb3IgKGxldCBpID0gcm93SW5kZXggKyAxOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgew0KICAgICAgaWYgKGxpc3RbaV0ueHpkdyA9PT0gY3VycmVudC54emR3KSByb3dzcGFuKysNCiAgICAgIGVsc2UgYnJlYWsNCiAgICB9DQogICAgcmV0dXJuIHsgcm93c3BhbiwgY29sc3BhbjogMSB9DQogIH0NCiAgcmV0dXJuIHsgcm93c3BhbjogMSwgY29sc3BhbjogMSB9DQp9DQoNCi8qKiDooajlpLTnibnmrormoLflvI/vvJrmgLvor77nqIvmlbDliJfnuqLmoYbmoIfms6ggKi8NCmNvbnN0IGhlYWRlckNlbGxDbGFzc05hbWUgPSAoeyBjb2x1bW4gfTogeyBjb2x1bW46IGFueSB9KSA9PiB7DQogIGlmIChjb2x1bW4ucHJvcGVydHkgPT09ICdrY3J3cycpIHJldHVybiAncmVkLWhlYWRlci1jZWxsJw0KICByZXR1cm4gJycNCn0NCg0KLy8gPT09PT09PT09PT09PT09PT09PT0gNi4g5om56YeP5pON5L2cID09PT09PT09PT09PT09PT09PT09DQovKiog5L+d5a2Y5b2T5YmN6YCJ5Lit6KGMIGlk77yM5L6b5om56YeP5pON5L2c5L2/55SoICovDQpjb25zdCBzZWxlY3RlZElkcyA9IGNvbXB1dGVkKCgpID0+IHNlbGVjdGlvbi52YWx1ZS5tYXAoKHIpID0+IHIuaWQpKQ0KDQovKiog5om56YeP5Yig6Zmk77ya5aSa6YCJIOKGkiDnoa7orqQg4oaSIOWIoOmZpCAqLw0KY29uc3QgaGFuZGxlQmF0Y2hEZWxldGUgPSBhc3luYyAoKSA9PiB7DQogIGlmICghc2VsZWN0ZWRJZHMudmFsdWUubGVuZ3RoKSB7DQogICAgRWxNZXNzYWdlLndhcm5pbmcoJ+ivt+WFiOWcqOWIl+ihqOS4remAieaLqeimgeWIoOmZpOeahOePreasoeWtpuacn+S/oeaBrycpDQogICAgcmV0dXJuDQogIH0NCiAgdHJ5IHsNCiAgICBhd2FpdCBFbE1lc3NhZ2VCb3guY29uZmlybSgNCiAgICAgIGDnoa7lrprliKDpmaTmiYDpgInmi6nnmoQgJHtzZWxlY3RlZElkcy52YWx1ZS5sZW5ndGh9IOadoeePreasoeWtpuacn+S/oeaBr+WQl++8n+WIoOmZpOWQjuS4jeWPr+aBouWkjeOAgmAsDQogICAgICAn5om56YeP5Yig6ZmkJywNCiAgICAgIHsgdHlwZTogJ3dhcm5pbmcnLCBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognIH0NCiAgICApDQogIH0gY2F0Y2ggew0KICAgIHJldHVybg0KICB9DQogIC8vIOiLpeWFs+iBlOS6huivvueoi+aVmeWtpuiuoeWIku+8jOWIoOmZpOWwhuiiq+WPlua2iO+8iOatpOWkhOS4uuWJjeerr+WNoOS9je+8jOetieW+heaOpeWPo+i/lOWbnuaYr+WQpuacieWFs+iBlO+8iQ0KICBjb25zdCBibG9ja2VkID0gc2VsZWN0aW9uLnZhbHVlLmZpbHRlcigocikgPT4gci5rY3J3cyA+IDApDQogIGlmIChibG9ja2VkLmxlbmd0aCkgew0KICAgIEVsTWVzc2FnZS53YXJuaW5nKCfliKDpmaTooqvlj5bmtojvvJrmiYDpgInnmoTnj63mrKHlrabmnJ/kv6Hmga/lt7LmnInor77nqIvmlZnlraborqHliJLlhbPogZTvvIzor7flhYjliKDpmaTlhbPogZTnmoTor77nqIvmlZnlraborqHliJLjgIInKQ0KICAgIHJldHVybg0KICB9DQogIGNvbnN0IGlkcyA9IG5ldyBTZXQoc2VsZWN0ZWRJZHMudmFsdWUpDQogIHRhYmxlRGF0YS52YWx1ZSA9IHRhYmxlRGF0YS52YWx1ZS5maWx0ZXIoKHIpID0+ICFpZHMuaGFzKHIuaWQpKQ0KICBFbE1lc3NhZ2Uuc3VjY2Vzcygn5bey5Yig6Zmk5omA6YCJ5oup55qE54+t5qyh5a2m5pyf5L+h5oGv77yI5o6l5Y+j5b6F5o6l5YWl77yJJykNCn0NCg0KLyoqIOaJuemHj+iuvuWumuaXpeacn++8muS9v+eUqOmihOiuvuW8gOWtpi/nu5PmnZ/ml6XmnJ/orr7nva7miYDpgInnj63mrKEgKi8NCmNvbnN0IGhhbmRsZUJhdGNoU2V0RGF0ZSA9ICgpID0+IHsNCiAgaWYgKCFzZWxlY3RlZElkcy52YWx1ZS5sZW5ndGgpIHsNCiAgICBFbE1lc3NhZ2Uud2FybmluZygn6K+35YWI5Zyo5YiX6KGo5Lit6YCJ5oup54+t5qyh5a2m5pyf5L+h5oGvJykNCiAgICByZXR1cm4NCiAgfQ0KICBjb25zdCBpZHMgPSBuZXcgU2V0KHNlbGVjdGVkSWRzLnZhbHVlKQ0KICB0YWJsZURhdGEudmFsdWUuZm9yRWFjaCgocikgPT4gew0KICAgIGlmIChpZHMuaGFzKHIuaWQpKSB7DQogICAgICByLmt4cnEgPSBwcmVzZXQua3hycQ0KICAgICAgci5qc3JxID0gcHJlc2V0LmpzcnENCiAgICB9DQogIH0pDQogIEVsTWVzc2FnZS5zdWNjZXNzKGDlt7Lkvb/nlKjpooTorr7ml6XmnJ/mibnph4/orr7lrpogJHtzZWxlY3RlZElkcy52YWx1ZS5sZW5ndGh9IOS4quePreasoeeahOW8gOWtpi/nu5PmnZ/ml6XmnJ/vvIjmjqXlj6PlvoXmjqXlhaXvvIlgKQ0KfQ0KDQovKiog5om56YeP6K6+572u5pWZ5a2m5Lu75Yqh77ya5bCG5omA6YCJ54+t5qyh5Yqg5YWl5b2T5YmN6YCJ5Lit55qE5pWZ5a2m5Lu75YqhICovDQpjb25zdCBoYW5kbGVCYXRjaFNldFRhc2sgPSAoKSA9PiB7DQogIGlmICghcXVlcnlGb3JtLmp4cncpIHsNCiAgICBFbE1lc3NhZ2Uud2FybmluZygn6K+35YWI5Zyo5p+l6K+i6Z2i5p2/5Lit6YCJ5oup44CQ5pWZ5a2m5Lu75Yqh44CRJykNCiAgICByZXR1cm4NCiAgfQ0KICBpZiAoIXNlbGVjdGVkSWRzLnZhbHVlLmxlbmd0aCkgew0KICAgIEVsTWVzc2FnZS53YXJuaW5nKCfor7flhYjlnKjliJfooajkuK3pgInmi6nnj63mrKHlrabmnJ/kv6Hmga8nKQ0KICAgIHJldHVybg0KICB9DQogIGNvbnN0IGlkcyA9IG5ldyBTZXQoc2VsZWN0ZWRJZHMudmFsdWUpDQogIHRhYmxlRGF0YS52YWx1ZS5mb3JFYWNoKChyKSA9PiB7DQogICAgaWYgKGlkcy5oYXMoci5pZCkpIHIuanhydyA9IHF1ZXJ5Rm9ybS5qeHJ3DQogIH0pDQogIEVsTWVzc2FnZS5zdWNjZXNzKGDlt7LlsIYgJHtzZWxlY3RlZElkcy52YWx1ZS5sZW5ndGh9IOS4quePreasoeaJuemHj+iuvue9ruWIsOaVmeWtpuS7u+WKoeOAjCR7cXVlcnlGb3JtLmp4cnd944CN77yI5o6l5Y+j5b6F5o6l5YWl77yJYCkNCn0NCg0KLyoqIOaJuemHj+iuvuWumuWtpuacn+esrOasoe+8muWwhuaJgOmAieePreasoeeahOWtpuacn+esrOasoeiuvuS4uuafpeivoumdouadv+S4reeahOWAvCAqLw0KY29uc3QgaGFuZGxlQmF0Y2hTZXRYcWNjID0gKCkgPT4gew0KICBpZiAoIXF1ZXJ5Rm9ybS54cWNjKSB7DQogICAgRWxNZXNzYWdlLndhcm5pbmcoJ+ivt+WFiOWcqOafpeivoumdouadv+S4rei+k+WFpeOAkOWtpuacn+esrOasoeOAkScpDQogICAgcmV0dXJuDQogIH0NCiAgaWYgKCFzZWxlY3RlZElkcy52YWx1ZS5sZW5ndGgpIHsNCiAgICBFbE1lc3NhZ2Uud2FybmluZygn6K+35YWI5Zyo5YiX6KGo5Lit6YCJ5oup54+t5qyh5a2m5pyf5L+h5oGvJykNCiAgICByZXR1cm4NCiAgfQ0KICBjb25zdCBpZHMgPSBuZXcgU2V0KHNlbGVjdGVkSWRzLnZhbHVlKQ0KICB0YWJsZURhdGEudmFsdWUuZm9yRWFjaCgocikgPT4gew0KICAgIGlmIChpZHMuaGFzKHIuaWQpKSByLnhxY2MgPSBxdWVyeUZvcm0ueHFjYw0KICB9KQ0KICBFbE1lc3NhZ2Uuc3VjY2Vzcyhg5bey5bCGICR7c2VsZWN0ZWRJZHMudmFsdWUubGVuZ3RofSDkuKrnj63mrKHnmoTlrabmnJ/nrKzmrKHorr7kuLrjgIwke3F1ZXJ5Rm9ybS54cWNjfeOAje+8iOaOpeWPo+W+heaOpeWFpe+8iWApDQp9DQoNCi8qKiDmibnph4/nlJ/miJDmlZnlraborqHliJLvvJrmoLnmja7kurrmiY3ln7nlhbvmlrnmoYjlkozlrabmnJ/nrKzmrKHnlJ/miJDlv4Xkv67or77nqIvmlZnlraborqHliJIgKi8NCmNvbnN0IGhhbmRsZUJhdGNoR2VuUGxhbiA9ICgpID0+IHsNCiAgaWYgKCFzZWxlY3RlZElkcy52YWx1ZS5sZW5ndGgpIHsNCiAgICBFbE1lc3NhZ2Uud2FybmluZygn6K+35YWI5Zyo5YiX6KGo5Lit6YCJ5oup54+t5qyh5a2m5pyf5L+h5oGvJykNCiAgICByZXR1cm4NCiAgfQ0KICBjb25zdCBpZHMgPSBuZXcgU2V0KHNlbGVjdGVkSWRzLnZhbHVlKQ0KICB0YWJsZURhdGEudmFsdWUuZm9yRWFjaCgocikgPT4gew0KICAgIGlmIChpZHMuaGFzKHIuaWQpICYmIHIua2Nyd3MgPT09IDApIHIua2Nyd3MgPSAxNCAvLyDnlJ/miJDlv4Xkv67or77nqIvmlZnlraborqHliJLvvIzmm7TmlrDmgLvor77nqIvmlbDvvIjliY3nq6/ljaDkvY3vvIkNCiAgfSkNCiAgRWxNZXNzYWdlLnN1Y2Nlc3MoYOW3suS4uiAke3NlbGVjdGVkSWRzLnZhbHVlLmxlbmd0aH0g5Liq54+t5qyh5om56YeP55Sf5oiQ5pWZ5a2m6K6h5YiS77yI5o6l5Y+j5b6F5o6l5YWl77yJYCkNCn0NCg0KLyoqIOaJuemHj+i9rOaNouW8gOaUvuaVmeWRmOaOkuivvueKtuaAge+8muWvueaJgOmAieePreasoeeahOW8gOaUvuaVmeWRmOaOkuivvuWxnuaAp+i/m+ihjOWPjemAiSAqLw0KY29uc3QgaGFuZGxlQmF0Y2hUb2dnbGVLZnB5ID0gKCkgPT4gew0KICBpZiAoIXNlbGVjdGVkSWRzLnZhbHVlLmxlbmd0aCkgew0KICAgIEVsTWVzc2FnZS53YXJuaW5nKCfor7flhYjlnKjliJfooajkuK3pgInmi6nnj63mrKHlrabmnJ/kv6Hmga8nKQ0KICAgIHJldHVybg0KICB9DQogIGNvbnN0IGlkcyA9IG5ldyBTZXQoc2VsZWN0ZWRJZHMudmFsdWUpDQogIHRhYmxlRGF0YS52YWx1ZS5mb3JFYWNoKChyKSA9PiB7DQogICAgaWYgKGlkcy5oYXMoci5pZCkpIHIua2ZweSA9ICFyLmtmcHkNCiAgfSkNCiAgRWxNZXNzYWdlLnN1Y2Nlc3MoYOW3suWvuSAke3NlbGVjdGVkSWRzLnZhbHVlLmxlbmd0aH0g5Liq54+t5qyh5om56YeP6L2s5o2i5byA5pS+5pWZ5ZGY5o6S6K++54q25oCB77yI5o6l5Y+j5b6F5o6l5YWl77yJYCkNCn0NCg0KLyoqIOWIt+aWsOWIl+ihqCAqLw0KY29uc3QgaGFuZGxlUmVmcmVzaCA9ICgpID0+IHsNCiAgRWxNZXNzYWdlLmluZm8oJ+WIt+aWsOWIl+ihqO+8iOaOpeWPo+W+heaOpeWFpe+8iScpDQp9DQoNCm9uTW91bnRlZCgoKSA9PiB7DQogIC8vIOm7mOiupOmAieS4reesrOS4gOihjA0KICBuZXh0VGljaygoKSA9PiB7DQogICAgaWYgKHRhYmxlRGF0YS52YWx1ZS5sZW5ndGgpIHsNCiAgICAgIHRhYmxlUmVmLnZhbHVlPy5zZXRDdXJyZW50Um93KHRhYmxlRGF0YS52YWx1ZVswXSkNCiAgICB9DQogIH0pDQp9KQ0K"},{"version":3,"sources":["index.vue"],"names":[],"mappings":";AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/teachOffice/shiftSemester","sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, nextTick, onMounted, reactive, ref } from 'vue'\r\nimport { ElMessage, ElMessageBox } from 'element-plus'\r\nimport {\r\n ArrowDown,\r\n Calendar,\r\n Close,\r\n Connection,\r\n Document,\r\n EditPen,\r\n Lightning,\r\n MagicStick,\r\n Plus,\r\n Refresh,\r\n Sort\r\n} from '@element-plus/icons-vue'\r\nimport ClassSemesterDetailDialog, { type NewClassInfo } from './ClassSemesterDetailDialog.vue'\r\n\r\n/** 班次学期信息行 */\r\ninterface ClassSemesterRow {\r\n id: string // 唯一标识\r\n xzdw: string // 行政队别\r\n xh: number // 班次序号\r\n bc: string // 班级(班次号)\r\n rs: number // 人数\r\n nj: string // 年级\r\n xkzy: string // 学科专业\r\n kxrq: string // 开学日期\r\n jsrq: string // 结束日期\r\n xqcc: string // 学期第次\r\n zyjs: string // 专用教室\r\n jxrw: string // 教学任务\r\n zs: number // 周数\r\n kcrws: number // 总课程数(该班次生成的课程教学计划数量)\r\n kczs: number // 总课时数\r\n kfpy: boolean // 开放教员排课\r\n}\r\n\r\n// ==================== 1. 学年学期标题区 ====================\r\nconst semesterName = '2017-2018学年第一学期'\r\n\r\n// ==================== 2. 校历 / 预设日期信息区 ====================\r\n/** 当前学年学期校历 */\r\nconst semester = reactive({\r\n kxrq: '2017-07-08', // 校历开学日期\r\n jsrq: '2018-02-11', // 校历结束日期\r\n weeks: 32 // 学期周数\r\n})\r\n\r\n/** 预设(班次)日期:用于批量设定所选班次的开学/结束日期 */\r\nconst preset = reactive({\r\n kxrq: '2017-07-08', // 预设开学日期\r\n jsrq: '2018-02-11', // 预设结束日期\r\n weeks: 32 // 预设学期周数\r\n})\r\n\r\n/** 吸取日期:将校历日期复制到预设日期 */\r\nconst handleAbsorbDate = () => {\r\n preset.kxrq = semester.kxrq\r\n preset.jsrq = semester.jsrq\r\n preset.weeks = semester.weeks\r\n ElMessage.success('已吸取校历日期到预设日期')\r\n}\r\n\r\n// ==================== 3. 查询面板 ====================\r\nconst queryForm = reactive({\r\n jxrw: '', // 教学任务(用于批量设置教学任务)\r\n xqcc: '' // 学期第次(用于批量设定学期第次)\r\n})\r\n\r\n// ==================== 4. 可新建学期信息的班次 ====================\r\n/** 可新建学期信息的班次:新建的班次、当前学期还未毕业的班次,且当前学期未创建班次学期信息 */\r\nconst newableClasses = ref<NewClassInfo[]>([])\r\n\r\n/** 教学班次学期信息明细弹窗 */\r\nconst detailVisible = ref(false)\r\nconst detailMode = ref<'create' | 'edit'>('create')\r\nconst selectedNewClass = ref<NewClassInfo | null>(null)\r\nconst selectedEditRow = ref<ClassSemesterRow | null>(null)\r\n\r\n/** 新添:从下拉中选择可新建学期信息的班次,弹出明细窗口创建 */\r\nconst handleNewCommand = (item: NewClassInfo | string) => {\r\n if (typeof item === 'string') return\r\n selectedNewClass.value = item\r\n selectedEditRow.value = null\r\n detailMode.value = 'create'\r\n detailVisible.value = true\r\n}\r\n\r\n/** 编辑:选择一行后弹出明细窗口修改 */\r\nconst handleEdit = () => {\r\n if (!currentRow.value) {\r\n ElMessage.warning('请先在列表中选择一条班次学期信息')\r\n return\r\n }\r\n selectedNewClass.value = null\r\n selectedEditRow.value = currentRow.value\r\n detailMode.value = 'edit'\r\n detailVisible.value = true\r\n}\r\n\r\n/** 批量创建教学班次学期信息 */\r\nconst handleBatchCreate = () => {\r\n ElMessage.info('批量创建教学班次学期信息(接口待接入)')\r\n}\r\n\r\n/** 明细窗口确认:创建或修改 */\r\nconst handleDetailConfirm = () => {\r\n detailVisible.value = false\r\n if (detailMode.value === 'create') {\r\n ElMessage.success('已创建班次学期信息(接口待接入)')\r\n } else {\r\n ElMessage.success('已保存班次学期信息修改(接口待接入)')\r\n }\r\n}\r\n\r\n// ==================== 5. 班次学期信息列表 ====================\r\nconst tableRef = ref()\r\nconst currentRow = ref<ClassSemesterRow | null>(null)\r\nconst selection = ref<ClassSemesterRow[]>([])\r\n\r\nconst tableData = ref<ClassSemesterRow[]>([\r\n { id: '1', xzdw: '学员1队', xh: 1, bc: '0150', rs: 40, nj: '2017级秋', xkzy: '专业5', kxrq: '2017-09-03', jsrq: '2018-02-05', xqcc: '第1学期', zyjs: '1-307', jxrw: '2017年下半年教学任务', zs: 24, kcrws: 14, kczs: 512, kfpy: true },\r\n { id: '2', xzdw: '教学五系', xh: 11, bc: '0201', rs: 30, nj: '2016级', xkzy: '专业113', kxrq: '2017-08-24', jsrq: '2018-02-05', xqcc: '第3学期', zyjs: '6-202', jxrw: '2017年下半年教学任务', zs: 25, kcrws: 12, kczs: 480, kfpy: false },\r\n { id: '3', xzdw: '教学七系', xh: 13, bc: '0203', rs: 36, nj: '2016级', xkzy: '专业115', kxrq: '2017-08-24', jsrq: '2018-02-05', xqcc: '第3学期', zyjs: '8-007', jxrw: '研究生2017下半年教学任务', zs: 25, kcrws: 13, kczs: 520, kfpy: true }\r\n])\r\n\r\nconst handleCurrentChange = (row: ClassSemesterRow) => {\r\n currentRow.value = row\r\n}\r\n\r\nconst handleSelectionChange = (rows: ClassSemesterRow[]) => {\r\n selection.value = rows\r\n}\r\n\r\n/** 合并单元格:行政队别列(第一列)纵向合并相同值 */\r\nconst spanMethod = ({ rowIndex, columnIndex }: { rowIndex: number; columnIndex: number }) => {\r\n if (columnIndex === 1) {\r\n const list = tableData.value\r\n const current = list[rowIndex]\r\n if (rowIndex > 0 && list[rowIndex - 1].xzdw === current.xzdw) {\r\n return { rowspan: 0, colspan: 0 }\r\n }\r\n let rowspan = 1\r\n for (let i = rowIndex + 1; i < list.length; i++) {\r\n if (list[i].xzdw === current.xzdw) rowspan++\r\n else break\r\n }\r\n return { rowspan, colspan: 1 }\r\n }\r\n return { rowspan: 1, colspan: 1 }\r\n}\r\n\r\n/** 表头特殊样式:总课程数列红框标注 */\r\nconst headerCellClassName = ({ column }: { column: any }) => {\r\n if (column.property === 'kcrws') return 'red-header-cell'\r\n return ''\r\n}\r\n\r\n// ==================== 6. 批量操作 ====================\r\n/** 保存当前选中行 id,供批量操作使用 */\r\nconst selectedIds = computed(() => selection.value.map((r) => r.id))\r\n\r\n/** 批量删除:多选 → 确认 → 删除 */\r\nconst handleBatchDelete = async () => {\r\n if (!selectedIds.value.length) {\r\n ElMessage.warning('请先在列表中选择要删除的班次学期信息')\r\n return\r\n }\r\n try {\r\n await ElMessageBox.confirm(\r\n `确定删除所选择的 ${selectedIds.value.length} 条班次学期信息吗?删除后不可恢复。`,\r\n '批量删除',\r\n { type: 'warning', confirmButtonText: '确定', cancelButtonText: '取消' }\r\n )\r\n } catch {\r\n return\r\n }\r\n // 若关联了课程教学计划,删除将被取消(此处为前端占位,等待接口返回是否有关联)\r\n const blocked = selection.value.filter((r) => r.kcrws > 0)\r\n if (blocked.length) {\r\n ElMessage.warning('删除被取消:所选的班次学期信息已有课程教学计划关联,请先删除关联的课程教学计划。')\r\n return\r\n }\r\n const ids = new Set(selectedIds.value)\r\n tableData.value = tableData.value.filter((r) => !ids.has(r.id))\r\n ElMessage.success('已删除所选择的班次学期信息(接口待接入)')\r\n}\r\n\r\n/** 批量设定日期:使用预设开学/结束日期设置所选班次 */\r\nconst handleBatchSetDate = () => {\r\n if (!selectedIds.value.length) {\r\n ElMessage.warning('请先在列表中选择班次学期信息')\r\n return\r\n }\r\n const ids = new Set(selectedIds.value)\r\n tableData.value.forEach((r) => {\r\n if (ids.has(r.id)) {\r\n r.kxrq = preset.kxrq\r\n r.jsrq = preset.jsrq\r\n }\r\n })\r\n ElMessage.success(`已使用预设日期批量设定 ${selectedIds.value.length} 个班次的开学/结束日期(接口待接入)`)\r\n}\r\n\r\n/** 批量设置教学任务:将所选班次加入当前选中的教学任务 */\r\nconst handleBatchSetTask = () => {\r\n if (!queryForm.jxrw) {\r\n ElMessage.warning('请先在查询面板中选择【教学任务】')\r\n return\r\n }\r\n if (!selectedIds.value.length) {\r\n ElMessage.warning('请先在列表中选择班次学期信息')\r\n return\r\n }\r\n const ids = new Set(selectedIds.value)\r\n tableData.value.forEach((r) => {\r\n if (ids.has(r.id)) r.jxrw = queryForm.jxrw\r\n })\r\n ElMessage.success(`已将 ${selectedIds.value.length} 个班次批量设置到教学任务「${queryForm.jxrw}」(接口待接入)`)\r\n}\r\n\r\n/** 批量设定学期第次:将所选班次的学期第次设为查询面板中的值 */\r\nconst handleBatchSetXqcc = () => {\r\n if (!queryForm.xqcc) {\r\n ElMessage.warning('请先在查询面板中输入【学期第次】')\r\n return\r\n }\r\n if (!selectedIds.value.length) {\r\n ElMessage.warning('请先在列表中选择班次学期信息')\r\n return\r\n }\r\n const ids = new Set(selectedIds.value)\r\n tableData.value.forEach((r) => {\r\n if (ids.has(r.id)) r.xqcc = queryForm.xqcc\r\n })\r\n ElMessage.success(`已将 ${selectedIds.value.length} 个班次的学期第次设为「${queryForm.xqcc}」(接口待接入)`)\r\n}\r\n\r\n/** 批量生成教学计划:根据人才培养方案和学期第次生成必修课程教学计划 */\r\nconst handleBatchGenPlan = () => {\r\n if (!selectedIds.value.length) {\r\n ElMessage.warning('请先在列表中选择班次学期信息')\r\n return\r\n }\r\n const ids = new Set(selectedIds.value)\r\n tableData.value.forEach((r) => {\r\n if (ids.has(r.id) && r.kcrws === 0) r.kcrws = 14 // 生成必修课程教学计划,更新总课程数(前端占位)\r\n })\r\n ElMessage.success(`已为 ${selectedIds.value.length} 个班次批量生成教学计划(接口待接入)`)\r\n}\r\n\r\n/** 批量转换开放教员排课状态:对所选班次的开放教员排课属性进行反选 */\r\nconst handleBatchToggleKfpy = () => {\r\n if (!selectedIds.value.length) {\r\n ElMessage.warning('请先在列表中选择班次学期信息')\r\n return\r\n }\r\n const ids = new Set(selectedIds.value)\r\n tableData.value.forEach((r) => {\r\n if (ids.has(r.id)) r.kfpy = !r.kfpy\r\n })\r\n ElMessage.success(`已对 ${selectedIds.value.length} 个班次批量转换开放教员排课状态(接口待接入)`)\r\n}\r\n\r\n/** 刷新列表 */\r\nconst handleRefresh = () => {\r\n ElMessage.info('刷新列表(接口待接入)')\r\n}\r\n\r\nonMounted(() => {\r\n // 默认选中第一行\r\n nextTick(() => {\r\n if (tableData.value.length) {\r\n tableRef.value?.setCurrentRow(tableData.value[0])\r\n }\r\n })\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"page-container\">\r\n <!-- ==================== 1. 学年学期标题区 ==================== -->\r\n <div class=\"semester-title\">{{ semesterName }}</div>\r\n\r\n <!-- ==================== 2. 校历 / 预设日期信息区 ==================== -->\r\n <el-card shadow=\"never\" class=\"date-card\">\r\n <div class=\"date-block\">\r\n <div class=\"block-label\">校历</div>\r\n <div class=\"block-fields\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">开学日期</span>\r\n <el-date-picker v-model=\"semester.kxrq\" type=\"date\" format=\"YYYY年M月D日\" value-format=\"YYYY-MM-DD\" style=\"width: 160px\" />\r\n </div>\r\n <div class=\"field\">\r\n <span class=\"field-label\">结束日期</span>\r\n <el-date-picker v-model=\"semester.jsrq\" type=\"date\" format=\"YYYY年M月D日\" value-format=\"YYYY-MM-DD\" style=\"width: 160px\" />\r\n </div>\r\n <div class=\"field\">\r\n <span class=\"field-label\">学期周数</span>\r\n <el-input-number v-model=\"semester.weeks\" :min=\"1\" controls-position=\"right\" style=\"width: 90px\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"date-block\">\r\n <div class=\"block-label\">预设</div>\r\n <div class=\"block-fields\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">开学日期</span>\r\n <el-date-picker v-model=\"preset.kxrq\" type=\"date\" format=\"YYYY年M月D日\" value-format=\"YYYY-MM-DD\" style=\"width: 160px\" />\r\n </div>\r\n <div class=\"field\">\r\n <span class=\"field-label\">结束日期</span>\r\n <el-date-picker v-model=\"preset.jsrq\" type=\"date\" format=\"YYYY年M月D日\" value-format=\"YYYY-MM-DD\" style=\"width: 160px\" />\r\n </div>\r\n <div class=\"field\">\r\n <span class=\"field-label\">学期周数</span>\r\n <el-input-number v-model=\"preset.weeks\" :min=\"1\" controls-position=\"right\" style=\"width: 90px\" />\r\n </div>\r\n <el-button class=\"absorb-btn\" @click=\"handleAbsorbDate\">吸取日期</el-button>\r\n </div>\r\n </div>\r\n </el-card>\r\n\r\n <!-- ==================== 3. 查询面板 ==================== -->\r\n <el-card shadow=\"never\" class=\"query-card\">\r\n <div class=\"query-fields\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">教学任务</span>\r\n <el-select v-model=\"queryForm.jxrw\" clearable placeholder=\"请选择教学任务\" style=\"width: 220px\">\r\n <el-option v-for=\"opt in ['2017年下半年教学任务', '研究生2017下半年教学任务']\" :key=\"opt\" :label=\"opt\" :value=\"opt\" />\r\n </el-select>\r\n </div>\r\n <div class=\"field\">\r\n <span class=\"field-label\">学期第次</span>\r\n <el-input v-model=\"queryForm.xqcc\" clearable placeholder=\"请输入学期第次\" style=\"width: 140px\" />\r\n </div>\r\n </div>\r\n </el-card>\r\n\r\n <!-- ==================== 4. 工具栏按钮区 ==================== -->\r\n <div class=\"toolbar\">\r\n <!-- 新添:下拉列出可新建学期信息的班次 -->\r\n <el-dropdown trigger=\"click\" @command=\"handleNewCommand\">\r\n <el-button type=\"primary\" plain>\r\n <el-icon><Plus /></el-icon>\r\n <span>新添</span>\r\n <el-icon class=\"el-icon--right\"><ArrowDown /></el-icon>\r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu class=\"new-class-menu\">\r\n <el-dropdown-item v-for=\"item in newableClasses\" :key=\"item.bc\" :command=\"item\">\r\n {{ item.bc }}{{ item.xkzy }}、{{ item.nj }}\r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n\r\n <el-button type=\"primary\" plain @click=\"handleEdit\">\r\n <el-icon><EditPen /></el-icon><span>编辑</span>\r\n </el-button>\r\n <el-button type=\"primary\" plain @click=\"handleBatchCreate\">\r\n <el-icon><Document /></el-icon><span>批量创建教学班次学期信息</span>\r\n </el-button>\r\n <el-button type=\"primary\" plain @click=\"handleBatchSetDate\">\r\n <el-icon><Calendar /></el-icon><span>批量设定日期</span>\r\n </el-button>\r\n <el-button type=\"primary\" plain @click=\"handleBatchSetTask\">\r\n <el-icon><Connection /></el-icon><span>批量设置教学任务</span>\r\n </el-button>\r\n <el-button type=\"primary\" plain @click=\"handleBatchSetXqcc\">\r\n <el-icon><Sort /></el-icon><span>批量设定学期第次</span>\r\n </el-button>\r\n <el-button type=\"primary\" plain @click=\"handleBatchGenPlan\">\r\n <el-icon><MagicStick /></el-icon><span>批量生成教学计划</span>\r\n </el-button>\r\n <el-button type=\"primary\" plain @click=\"handleBatchToggleKfpy\">\r\n <el-icon><Lightning /></el-icon><span>批量转换开放教员排课状态</span>\r\n </el-button>\r\n <el-button type=\"danger\" plain @click=\"handleBatchDelete\">\r\n <el-icon><Close /></el-icon><span>批量删除</span>\r\n </el-button>\r\n <el-button type=\"primary\" plain @click=\"handleRefresh\">\r\n <el-icon><Refresh /></el-icon><span>刷新</span>\r\n </el-button>\r\n </div>\r\n\r\n <!-- ==================== 5. 班次学期信息列表 ==================== -->\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table\r\n ref=\"tableRef\"\r\n :data=\"tableData\"\r\n border\r\n stripe\r\n highlight-current-row\r\n :span-method=\"spanMethod\"\r\n :header-cell-class-name=\"headerCellClassName\"\r\n max-height=\"480\"\r\n class=\"class-table\"\r\n @current-change=\"handleCurrentChange\"\r\n @selection-change=\"handleSelectionChange\"\r\n >\r\n <el-table-column type=\"selection\" width=\"45\" align=\"center\" fixed=\"left\" />\r\n <el-table-column prop=\"xzdw\" label=\"行政队别\" width=\"90\" align=\"center\" fixed=\"left\" show-overflow-tooltip />\r\n <el-table-column prop=\"xh\" label=\"班次序号\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"bc\" label=\"班级\" width=\"70\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"rs\" label=\"人数\" width=\"55\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"nj\" label=\"年级\" width=\"85\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"xkzy\" label=\"学科专业\" width=\"85\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"kxrq\" label=\"开学日期\" width=\"90\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"jsrq\" label=\"结束日期\" width=\"90\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"xqcc\" label=\"学期第次\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"zyjs\" label=\"专用教室\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"jxrw\" label=\"教学任务\" min-width=\"150\" align=\"left\" show-overflow-tooltip />\r\n <el-table-column prop=\"zs\" label=\"周数\" width=\"55\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"kcrws\" label=\"总课程数\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"kczs\" label=\"总课时数\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column label=\"开放教员排课\" width=\"100\" align=\"center\">\r\n <template #default=\"{ row }\">\r\n <el-tag :type=\"(row as ClassSemesterRow).kfpy ? 'success' : 'info'\" size=\"small\">\r\n {{ (row as ClassSemesterRow).kfpy ? '开放' : '关闭' }}\r\n </el-tag>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </el-card>\r\n\r\n <!-- ==================== 教学班次学期信息明细弹窗 ==================== -->\r\n <ClassSemesterDetailDialog\r\n v-model=\"detailVisible\"\r\n :mode=\"detailMode\"\r\n :class-info=\"selectedNewClass\"\r\n :edit-row=\"selectedEditRow\"\r\n :semester-name=\"semesterName\"\r\n :semester=\"semester\"\r\n :preset=\"preset\"\r\n @confirm=\"handleDetailConfirm\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style scoped lang=\"scss\">\r\n.page-container {\r\n padding: 20px;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 16px;\r\n min-height: 100%;\r\n\r\n // ========== 1. 学年学期标题区 ==========\r\n .semester-title {\r\n font-size: 24px;\r\n font-weight: 700;\r\n color: #1e6fff;\r\n }\r\n\r\n // ========== 2. 校历 / 预设日期信息区 ==========\r\n .date-card {\r\n .date-block {\r\n display: flex;\r\n align-items: center;\r\n gap: 14px;\r\n margin-bottom: 12px;\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n .block-label {\r\n flex-shrink: 0;\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #303133;\r\n width: 36px;\r\n text-align: center;\r\n background: #ecf5ff;\r\n border: 1px solid #d3e4fd;\r\n border-radius: 3px;\r\n padding: 4px 0;\r\n }\r\n\r\n .block-fields {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 16px;\r\n\r\n .field {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n .field-label {\r\n font-size: 14px;\r\n color: #606266;\r\n white-space: nowrap;\r\n }\r\n }\r\n\r\n .absorb-btn {\r\n height: 32px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ========== 3. 查询面板 ==========\r\n .query-card {\r\n .query-fields {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 24px;\r\n\r\n .field {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n .field-label {\r\n font-size: 14px;\r\n color: #606266;\r\n white-space: nowrap;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ========== 4. 工具栏按钮区 ==========\r\n .toolbar {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n\r\n .el-button + .el-button {\r\n margin-left: 0;\r\n }\r\n\r\n .el-button {\r\n display: inline-flex;\r\n align-items: center;\r\n }\r\n }\r\n\r\n // ========== 新建下拉菜单 ==========\r\n .new-class-menu {\r\n max-height: 320px;\r\n overflow-y: auto;\r\n }\r\n\r\n // ========== 5. 数据表格区 ==========\r\n .table-card {\r\n flex: 1;\r\n\r\n .class-table {\r\n width: 100%;\r\n\r\n // 当前行蓝色高亮\r\n :deep(.el-table__body tr.current-row > td.el-table__cell) {\r\n background-color: #d9ecff;\r\n }\r\n\r\n :deep(.el-table__body tr.current-row:hover > td.el-table__cell) {\r\n background-color: #d9ecff;\r\n }\r\n\r\n // 表头红色框标注列(总课程数)\r\n :deep(th.red-header-cell) {\r\n border: 2px solid #f56c6c !important;\r\n background: #fdeaea !important;\r\n }\r\n }\r\n }\r\n}\r\n</style>"]}]}