forked from liweijie/education
1 line
38 KiB
JSON
1 line
38 KiB
JSON
{"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>"]}]} |