Files
education/frontend/node_modules/.cache/vue-loader/5c1c15bd5c806ebaddc8a115e084f2eb.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\\PeidangEditDialog.vue?vue&type=script&setup=true&lang=ts","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\shiftSemester\\PeidangEditDialog.vue","mtime":1787321107984},{"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:DQppbXBvcnQgeyBjb21wdXRlZCwgbmV4dFRpY2ssIHJlYWN0aXZlLCByZWYsIHdhdGNoIH0gZnJvbSAndnVlJw0KaW1wb3J0IHsgRWxNZXNzYWdlIH0gZnJvbSAnZWxlbWVudC1wbHVzJw0KaW1wb3J0IHsgQXJyb3dEb3duLCBBcnJvd1VwLCBSZWFkaW5nIH0gZnJvbSAnQGVsZW1lbnQtcGx1cy9pY29ucy12dWUnDQoNCi8vID09PT09PT09PT09PT09PT09PT09IOexu+Wei+WumuS5iSA9PT09PT09PT09PT09PT09PT09PQ0KDQovKiog6YWN5qGj6K++56iL6KGMICovDQppbnRlcmZhY2UgUGVpZGFuZ0NvdXJzZSB7DQogIGlkOiBzdHJpbmcNCiAgbmFtZTogc3RyaW5nICAgICAgICAgIC8vIOenkeebruWQjeensA0KICBzaG9ydDogc3RyaW5nICAgICAgICAgLy8g566A56ewDQogIHBsYW5TdGFydDogbnVtYmVyICAgICAvLyDorqHliJLotbflp4vlkagNCiAgYWN0dWFsU3RhcnQ6IG51bWJlciAgIC8vIOWunumZhei1t+Wni+WRqA0KICBlbmRXZWVrOiBudW1iZXIgICAgICAgLy8g57uT5p2f5ZGoDQogIGNvbnRpbnVvdXM6IGJvb2xlYW4gICAvLyDov57mjpLor77vvIjlkajlrabml7YgPj0gMjAg6buY6K6k6K6k5a6a77yJDQogIHByaW9yaXR5OiBudW1iZXIgICAgICAvLyDkvJjlhYjluo/mlbANCiAgd2Vla2x5SG91cnM6IG51bWJlciAgIC8vIOWRqOWtpuaXtg0KICBob3VyczogbnVtYmVyICAgICAgICAgLy8g5a2m5pe2DQogIHNjaGVkdWxlVGltZTogYm9vbGVhbiAvLyDljaDmraPor77ml7bpl7QNCiAgZ3JvdXA6IHN0cmluZyAgICAgICAgIC8vIOmFjeaho+e8lue7hA0KfQ0KDQovLyA9PT09PT09PT09PT09PT09PT09PSBQcm9wcyAmIEVtaXRzID09PT09PT09PT09PT09PT09PT09DQpjb25zdCBwcm9wcyA9IHdpdGhEZWZhdWx0cygNCiAgZGVmaW5lUHJvcHM8ew0KICAgIG1vZGVsVmFsdWU6IGJvb2xlYW4NCiAgICAvKiog5a2m5bm05a2m5pyf5ZCN56ewICovDQogICAgc2VtZXN0ZXJOYW1lPzogc3RyaW5nDQogICAgLyoqIOePreasoeagh+etvu+8iOWmgiDmlZnlrabkupTns7syMDE257qn5LiT5LiaMDExM+ePreasoTA0MTfvvIkgKi8NCiAgICBjbGFzc0xhYmVsPzogc3RyaW5nDQogIH0+KCksDQogIHsNCiAgICBzZW1lc3Rlck5hbWU6ICcyMDE3LTIwMTjlrablubTnrKzkuIDlrabmnJ8nLA0KICAgIGNsYXNzTGFiZWw6ICfmlZnlrabkupTns7syMDE257qn5LiT5LiaMDExM+ePreasoTA0MTcnDQogIH0NCikNCg0KY29uc3QgZW1pdCA9IGRlZmluZUVtaXRzPHsNCiAgKGU6ICd1cGRhdGU6bW9kZWxWYWx1ZScsIHZhbHVlOiBib29sZWFuKTogdm9pZA0KICAoZTogJ2NvbmZpcm0nKTogdm9pZA0KfT4oKQ0KDQpjb25zdCB2aXNpYmxlID0gY29tcHV0ZWQoew0KICBnZXQ6ICgpID0+IHByb3BzLm1vZGVsVmFsdWUsDQogIHNldDogKHZhbCkgPT4gZW1pdCgndXBkYXRlOm1vZGVsVmFsdWUnLCB2YWwpDQp9KQ0KDQovLyA9PT09PT09PT09PT09PT09PT09PSDml7bpl7TovbTlj4LmlbAgPT09PT09PT09PT09PT09PT09PT0NCi8qKiDor6Xnj63mrKHlvIDlrabotbflp4vlkajmrKEgKi8NCmNvbnN0IHN0YXJ0V2VlayA9IDgNCi8qKiDor6Xnj63mrKHlrabmnJ/nu5PmnZ/lkajmrKEgKi8NCmNvbnN0IGVuZFdlZWsgPSAzMg0KLyoqIOivpeePreasoeavj+WRqOWPr+WuieaOkueahOato+ivvuWtpuaXtuaXtuaVsO+8iOWOu+mZpOS4jeiDveaOkuivvuWtpuaXtu+8iSAqLw0KY29uc3Qgd2Vla2x5Q2FwYWNpdHkgPSA0MA0KDQovKiog5ZGo5bqP5YiX77yaOCB+IDMyICovDQpjb25zdCB3ZWVrcyA9IGNvbXB1dGVkPG51bWJlcltdPigoKSA9PiB7DQogIGNvbnN0IGFycjogbnVtYmVyW10gPSBbXQ0KICBmb3IgKGxldCB3ID0gc3RhcnRXZWVrOyB3IDw9IGVuZFdlZWs7IHcrKykgYXJyLnB1c2godykNCiAgcmV0dXJuIGFycg0KfSkNCg0KLyoqIOaciOWIu+W6pu+8muavjyA0IOWRqOS4uuS4gOaciO+8iDgtMTEg56ysMeaciO+8jDEyLTE1IOesrDLmnIguLi7vvInvvIzomZrnur/liIbpmpQgKi8NCmNvbnN0IG1vbnRoQnJlYWtzID0gWzEyLCAxNiwgMjAsIDI0LCAyOCwgMzJdDQoNCi8qKiDmmK/lkKbkuLrmnIjovrnnlYzliJfvvIjlt6bkvqfnlLvomZrnur/vvIkgKi8NCmNvbnN0IGlzTW9udGhCb3VuZGFyeSA9ICh3ZWVrOiBudW1iZXIpID0+IG1vbnRoQnJlYWtzLmluY2x1ZGVzKHdlZWspDQoNCi8qKiDmnIjku73kv6Hmga/vvJrmr4/mnIjljIXlkKvnmoTlkajmrKHkuI7lj6/lronmjpLmraPor77lrabml7YgKi8NCmNvbnN0IG1vbnRocyA9IGNvbXB1dGVkKCgpID0+IHsNCiAgY29uc3QgbGlzdDogeyBubzogbnVtYmVyOyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgdG90YWw6IG51bWJlciB9W10gPSBbXQ0KICBsZXQgbU5vID0gMQ0KICBsZXQgY3VyID0gc3RhcnRXZWVrDQogIHdoaWxlIChjdXIgPD0gZW5kV2Vlaykgew0KICAgIGNvbnN0IG5leHQgPSBtb250aEJyZWFrcy5maW5kKChiKSA9PiBiID4gY3VyKSA/PyBlbmRXZWVrICsgMQ0KICAgIGNvbnN0IG1FbmQgPSBNYXRoLm1pbihuZXh0IC0gMSwgZW5kV2VlaykNCiAgICBsaXN0LnB1c2goeyBubzogbU5vLCBzdGFydDogY3VyLCBlbmQ6IG1FbmQsIHRvdGFsOiAobUVuZCAtIGN1ciArIDEpICogd2Vla2x5Q2FwYWNpdHkgfSkNCiAgICBjdXIgPSBtRW5kICsgMQ0KICAgIG1ObysrDQogIH0NCiAgcmV0dXJuIGxpc3QNCn0pDQoNCi8qKiDlupXpg6jmr4/mnIjmsYfmgLvooYzmlbDmja7vvJp3ZWVrIC0+IOivpeaciOS/oeaBr++8iOS7heaciOmmluagvOWxleekuuaWh+Wtl++8iSAqLw0KY29uc3QgYm90dG9tQ2VsbHMgPSBjb21wdXRlZCgoKSA9PiB7DQogIGNvbnN0IG1hcDogUmVjb3JkPG51bWJlciwgeyBubzogbnVtYmVyOyB0b3RhbDogbnVtYmVyOyBzY2hlZHVsZWQ6IG51bWJlcjsgcmVtYWluaW5nOiBudW1iZXIgfT4gPSB7fQ0KICB3ZWVrcy52YWx1ZS5mb3JFYWNoKCh3KSA9PiB7DQogICAgY29uc3QgbSA9IG1vbnRocy52YWx1ZS5maW5kKChpdGVtKSA9PiB3ID49IGl0ZW0uc3RhcnQgJiYgdyA8PSBpdGVtLmVuZCkNCiAgICBpZiAoIW0pIHJldHVybg0KICAgIG1hcFt3XSA9IHsNCiAgICAgIG5vOiBtLm5vLA0KICAgICAgdG90YWw6IG0udG90YWwsDQogICAgICBzY2hlZHVsZWQ6IG1vbnRobHlTY2hlZHVsZWQodyksDQogICAgICByZW1haW5pbmc6IG0udG90YWwgLSBtb250aGx5U2NoZWR1bGVkKHcpDQogICAgfQ0KICB9KQ0KICByZXR1cm4gbWFwDQp9KQ0KDQovKiog5p+Q5ZGo5omA5pyJ6K++56iL5bey5a6J5o6S5a2m5pe25LmL5ZKMICovDQpjb25zdCBtb250aGx5U2NoZWR1bGVkID0gKHdlZWs6IG51bWJlcikgPT4NCiAgY291cnNlcy52YWx1ZS5yZWR1Y2UoKHN1bSwgYykgPT4gew0KICAgIGNvbnN0IG1hcCA9IGNvdXJzZVdlZWtIb3VycyhjKQ0KICAgIHJldHVybiBzdW0gKyAobWFwW3dlZWtdID8/IDApDQogIH0sIDApDQoNCi8vID09PT09PT09PT09PT09PT09PT09IOmFjeaho+ivvueoi+aVsOaNriA9PT09PT09PT09PT09PT09PT09PQ0KY29uc3QgY291cnNlcyA9IHJlZjxQZWlkYW5nQ291cnNlW10+KFsNCiAgLy8gLS0tLSDpnZ7ov57mjpLor77vvIjmjInlkajlrabml7blronmjpLvvIzok53oibLvvIzmr4/pl6jni6znq4vkuIDnu4TvvIkgLS0tLQ0KICB7IGlkOiAncDEnLCBuYW1lOiAn6K++56iL56eR55uuMDAxJywgc2hvcnQ6ICfmlL/msrsnLCBwbGFuU3RhcnQ6IDgsIGFjdHVhbFN0YXJ0OiA4LCBlbmRXZWVrOiAyMywgY29udGludW91czogZmFsc2UsIHByaW9yaXR5OiAxLCB3ZWVrbHlIb3VyczogNCwgaG91cnM6IDYwLCBzY2hlZHVsZVRpbWU6IHRydWUsIGdyb3VwOiAn57uEMScgfSwNCiAgeyBpZDogJ3AyJywgbmFtZTogJ+ivvueoi+enkeebrjAwMicsIHNob3J0OiAn5Yab5LqLJywgcGxhblN0YXJ0OiA4LCBhY3R1YWxTdGFydDogOCwgZW5kV2VlazogMjAsIGNvbnRpbnVvdXM6IGZhbHNlLCBwcmlvcml0eTogMiwgd2Vla2x5SG91cnM6IDQsIGhvdXJzOiA0OCwgc2NoZWR1bGVUaW1lOiB0cnVlLCBncm91cDogJ+e7hDInIH0sDQogIHsgaWQ6ICdwMycsIG5hbWU6ICfor77nqIvnp5Hnm64wMDMnLCBzaG9ydDogJ+aImOacrycsIHBsYW5TdGFydDogOCwgYWN0dWFsU3RhcnQ6IDEwLCBlbmRXZWVrOiAyMSwgY29udGludW91czogZmFsc2UsIHByaW9yaXR5OiAzLCB3ZWVrbHlIb3VyczogNCwgaG91cnM6IDQ0LCBzY2hlZHVsZVRpbWU6IHRydWUsIGdyb3VwOiAn57uEMycgfSwNCiAgeyBpZDogJ3A0JywgbmFtZTogJ+ivvueoi+enkeebrjAwNCcsIHNob3J0OiAn5oyH5oylJywgcGxhblN0YXJ0OiA4LCBhY3R1YWxTdGFydDogMTIsIGVuZFdlZWs6IDIyLCBjb250aW51b3VzOiBmYWxzZSwgcHJpb3JpdHk6IDQsIHdlZWtseUhvdXJzOiA0LCBob3VyczogNDAsIHNjaGVkdWxlVGltZTogdHJ1ZSwgZ3JvdXA6ICfnu4Q0JyB9LA0KICAvLyAtLS0tIOi/nuaOkuivvu+8iOWNleenkeeLrOi/m++8jOe6ouiJsu+8jOWFseS4uuS4gOe7hO+8iSAtLS0tDQogIHsgaWQ6ICdwNScsIG5hbWU6ICfor77nqIvnp5Hnm64wMDUnLCBzaG9ydDogJ+e7vOWQiOa8lOe7gycsIHBsYW5TdGFydDogOCwgYWN0dWFsU3RhcnQ6IDgsIGVuZFdlZWs6IDEzLCBjb250aW51b3VzOiB0cnVlLCBwcmlvcml0eTogNSwgd2Vla2x5SG91cnM6IDIwLCBob3VyczogMTAwLCBzY2hlZHVsZVRpbWU6IHRydWUsIGdyb3VwOiAn6L+e5o6S57uEJyB9LA0KICB7IGlkOiAncDYnLCBuYW1lOiAn6K++56iL56eR55uuMDA2Jywgc2hvcnQ6ICfph47okKXmi4nnu4MnLCBwbGFuU3RhcnQ6IDE0LCBhY3R1YWxTdGFydDogMTQsIGVuZFdlZWs6IDE2LCBjb250aW51b3VzOiB0cnVlLCBwcmlvcml0eTogNiwgd2Vla2x5SG91cnM6IDI0LCBob3VyczogNDgsIHNjaGVkdWxlVGltZTogdHJ1ZSwgZ3JvdXA6ICfov57mjpLnu4QnIH0NCl0pDQoNCi8qKiDmr4/pl6jor77nqIvmjInlkajliIbluIPnmoTlronmjpLlrabml7YgKi8NCmNvbnN0IGNvdXJzZVdlZWtIb3VycyA9IChjb3Vyc2U6IFBlaWRhbmdDb3Vyc2UpOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0+IHsNCiAgY29uc3QgbWFwOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge30NCiAgbGV0IHJlbWFpbmluZyA9IGNvdXJzZS5ob3Vycw0KICBsZXQgdyA9IGNvdXJzZS5hY3R1YWxTdGFydA0KICB3aGlsZSAocmVtYWluaW5nID4gMCAmJiB3IDw9IGNvdXJzZS5lbmRXZWVrKSB7DQogICAgY29uc3QgaCA9IE1hdGgubWluKGNvdXJzZS53ZWVrbHlIb3VycywgcmVtYWluaW5nKQ0KICAgIG1hcFt3XSA9IGgNCiAgICByZW1haW5pbmcgLT0gaA0KICAgIHcrKw0KICB9DQogIHJldHVybiBtYXANCn0NCg0KLyoqIOivvueoi+iuoeeul+WxnuaAp++8muW3suaOkuWtpuaXtiAvIOacquaOkuWtpuaXtiAqLw0KY29uc3QgY291cnNlU3RhdHMgPSAoY291cnNlOiBQZWlkYW5nQ291cnNlKSA9PiB7DQogIGNvbnN0IG1hcCA9IGNvdXJzZVdlZWtIb3Vycyhjb3Vyc2UpDQogIGNvbnN0IHNjaGVkdWxlZCA9IE9iamVjdC52YWx1ZXMobWFwKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKQ0KICByZXR1cm4geyBzY2hlZHVsZWQsIHJlbWFpbmluZzogTWF0aC5tYXgoMCwgY291cnNlLmhvdXJzIC0gc2NoZWR1bGVkKSB9DQp9DQoNCi8qKiDooajmoLzlsZXnpLrpobrluo/vvJrpnZ7ov57mjpLor77lnKjliY3vvIzov57mjpLor77lnKjlkI7vvJvnu4TlhoXmjInlrp7pmYXotbflp4vlkajjgIHkvJjlhYjluo/mlbDmjpLluo8gKi8NCmNvbnN0IGRpc3BsYXlDb3Vyc2VzID0gY29tcHV0ZWQ8UGVpZGFuZ0NvdXJzZVtdPigoKSA9Pg0KICBbLi4uY291cnNlcy52YWx1ZV0uc29ydCgoYSwgYikgPT4gew0KICAgIGlmIChhLmNvbnRpbnVvdXMgIT09IGIuY29udGludW91cykgcmV0dXJuIGEuY29udGludW91cyA/IDEgOiAtMQ0KICAgIGlmIChhLmFjdHVhbFN0YXJ0ICE9PSBiLmFjdHVhbFN0YXJ0KSByZXR1cm4gYS5hY3R1YWxTdGFydCAtIGIuYWN0dWFsU3RhcnQNCiAgICByZXR1cm4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHkNCiAgfSkNCikNCg0KLy8gPT09PT09PT09PT09PT09PT09PT0g6KGo5qC86YCJ5Lit5LiO5bGe5oCn6K6+572uID09PT09PT09PT09PT09PT09PT09DQpjb25zdCB0YWJsZVJlZiA9IHJlZigpDQpjb25zdCBjdXJyZW50Q291cnNlID0gcmVmPFBlaWRhbmdDb3Vyc2UgfCBudWxsPihudWxsKQ0KY29uc3QgaGFuZGxlQ3VycmVudENoYW5nZSA9IChyb3c6IFBlaWRhbmdDb3Vyc2UpID0+IHsNCiAgY3VycmVudENvdXJzZS52YWx1ZSA9IHJvdw0KfQ0KDQovKiog5bGe5oCn6K6+572u6KGo5Y2V77yI5Y+z5L6n77yJICovDQpjb25zdCBwcm9wRm9ybSA9IHJlYWN0aXZlKHsNCiAgd2Vla2x5SG91cnM6IDQsDQogIHN0YXJ0V2VlazogOCwNCiAgZW5kV2VlazogMTYsDQogIGNvbnRpbnVvdXM6IGZhbHNlLA0KICBwcmlvcml0eTogMSwNCiAgZ3JvdXA6ICcnDQp9KQ0KDQpjb25zdCBzeW5jUHJvcEZvcm0gPSAoKSA9PiB7DQogIGlmICghY3VycmVudENvdXJzZS52YWx1ZSkgcmV0dXJuDQogIHByb3BGb3JtLndlZWtseUhvdXJzID0gY3VycmVudENvdXJzZS52YWx1ZS53ZWVrbHlIb3Vycw0KICBwcm9wRm9ybS5zdGFydFdlZWsgPSBjdXJyZW50Q291cnNlLnZhbHVlLmFjdHVhbFN0YXJ0DQogIHByb3BGb3JtLmVuZFdlZWsgPSBjdXJyZW50Q291cnNlLnZhbHVlLmVuZFdlZWsNCiAgcHJvcEZvcm0uY29udGludW91cyA9IGN1cnJlbnRDb3Vyc2UudmFsdWUuY29udGludW91cw0KICBwcm9wRm9ybS5wcmlvcml0eSA9IGN1cnJlbnRDb3Vyc2UudmFsdWUucHJpb3JpdHkNCiAgcHJvcEZvcm0uZ3JvdXAgPSBjdXJyZW50Q291cnNlLnZhbHVlLmdyb3VwDQp9DQoNCndhdGNoKA0KICAoKSA9PiBwcm9wcy5tb2RlbFZhbHVlLA0KICAodmFsKSA9PiB7DQogICAgaWYgKCF2YWwpIHJldHVybg0KICAgIG5leHRUaWNrKCgpID0+IHsNCiAgICAgIHRhYmxlUmVmLnZhbHVlPy5zZXRDdXJyZW50Um93KGRpc3BsYXlDb3Vyc2VzLnZhbHVlWzBdKQ0KICAgICAgY3VycmVudENvdXJzZS52YWx1ZSA9IGRpc3BsYXlDb3Vyc2VzLnZhbHVlWzBdID8/IG51bGwNCiAgICAgIHN5bmNQcm9wRm9ybSgpDQogICAgfSkNCiAgfQ0KKQ0KDQovKiog5bGe5oCn6K6+572u5L+d5a2Y77ya5bqU55So5omA6YCJ6K++56iL55qE6YWN5qGj5bGe5oCnICovDQpjb25zdCBoYW5kbGVBcHBseVByb3AgPSAoKSA9PiB7DQogIGlmICghY3VycmVudENvdXJzZS52YWx1ZSkgew0KICAgIEVsTWVzc2FnZS53YXJuaW5nKCfor7flhYjlnKjooajmoLzkuK3pgInmi6nkuIDpl6jor77nqIsnKQ0KICAgIHJldHVybg0KICB9DQogIGNvbnN0IHJvdyA9IGN1cnJlbnRDb3Vyc2UudmFsdWUNCiAgcm93LndlZWtseUhvdXJzID0gcHJvcEZvcm0ud2Vla2x5SG91cnMNCiAgcm93LmFjdHVhbFN0YXJ0ID0gcHJvcEZvcm0uc3RhcnRXZWVrDQogIHJvdy5lbmRXZWVrID0gcHJvcEZvcm0uZW5kV2Vlaw0KICByb3cuY29udGludW91cyA9IHByb3BGb3JtLmNvbnRpbnVvdXMNCiAgcm93LnByaW9yaXR5ID0gcHJvcEZvcm0ucHJpb3JpdHkNCiAgcm93Lmdyb3VwID0gcHJvcEZvcm0uZ3JvdXANCiAgRWxNZXNzYWdlLnN1Y2Nlc3MoJ+mFjeaho+WxnuaAp+W3suW6lOeUqO+8iOWJjeerr+a8lOekuu+8iScpDQp9DQoNCi8qKiDkvJjlhYjluo/mlbDkuIrnp7vvvJrkvJjlhYjluo/mlbDlh48gMSAqLw0KY29uc3QgaGFuZGxlUHJpb3JpdHlVcCA9ICgpID0+IHsNCiAgaWYgKCFjdXJyZW50Q291cnNlLnZhbHVlKSB7DQogICAgRWxNZXNzYWdlLndhcm5pbmcoJ+ivt+WFiOWcqOihqOagvOS4remAieaLqeS4gOmXqOivvueoiycpDQogICAgcmV0dXJuDQogIH0NCiAgaWYgKGN1cnJlbnRDb3Vyc2UudmFsdWUucHJpb3JpdHkgPD0gMSkgew0KICAgIEVsTWVzc2FnZS5pbmZvKCflt7LmmK/mnIDpq5jkvJjlhYjluo/mlbAnKQ0KICAgIHJldHVybg0KICB9DQogIGN1cnJlbnRDb3Vyc2UudmFsdWUucHJpb3JpdHkgLT0gMQ0KICBzeW5jUHJvcEZvcm0oKQ0KfQ0KDQovKiog5LyY5YWI5bqP5pWw5LiL56e777ya5LyY5YWI5bqP5pWw5YqgIDEgKi8NCmNvbnN0IGhhbmRsZVByaW9yaXR5RG93biA9ICgpID0+IHsNCiAgaWYgKCFjdXJyZW50Q291cnNlLnZhbHVlKSB7DQogICAgRWxNZXNzYWdlLndhcm5pbmcoJ+ivt+WFiOWcqOihqOagvOS4remAieaLqeS4gOmXqOivvueoiycpDQogICAgcmV0dXJuDQogIH0NCiAgY3VycmVudENvdXJzZS52YWx1ZS5wcmlvcml0eSArPSAxDQogIHN5bmNQcm9wRm9ybSgpDQp9DQoNCi8vID09PT09PT09PT09PT09PT09PT09IOW6lemDqOaTjeS9nCA9PT09PT09PT09PT09PT09PT09PQ0KY29uc3QgaGFuZGxlQ29uZmlybSA9ICgpID0+IHsNCiAgZW1pdCgnY29uZmlybScpDQogIHZpc2libGUudmFsdWUgPSBmYWxzZQ0KfQ0K"},{"version":3,"sources":["PeidangEditDialog.vue"],"names":[],"mappings":";AACA;AACA;AACA;;AAEA;;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;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","file":"PeidangEditDialog.vue","sourceRoot":"src/views/teachOffice/shiftSemester","sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, nextTick, reactive, ref, watch } from 'vue'\r\nimport { ElMessage } from 'element-plus'\r\nimport { ArrowDown, ArrowUp, Reading } from '@element-plus/icons-vue'\r\n\r\n// ==================== 类型定义 ====================\r\n\r\n/** 配档课程行 */\r\ninterface PeidangCourse {\r\n id: string\r\n name: string // 科目名称\r\n short: string // 简称\r\n planStart: number // 计划起始周\r\n actualStart: number // 实际起始周\r\n endWeek: number // 结束周\r\n continuous: boolean // 连排课(周学时 >= 20 默认认定)\r\n priority: number // 优先序数\r\n weeklyHours: number // 周学时\r\n hours: number // 学时\r\n scheduleTime: boolean // 占正课时间\r\n group: string // 配档编组\r\n}\r\n\r\n// ==================== Props & Emits ====================\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue: boolean\r\n /** 学年学期名称 */\r\n semesterName?: string\r\n /** 班次标签(如 教学五系2016级专业0113班次0417 */\r\n classLabel?: string\r\n }>(),\r\n {\r\n semesterName: '2017-2018学年第一学期',\r\n classLabel: '教学五系2016级专业0113班次0417'\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n (e: 'update:modelValue', value: boolean): void\r\n (e: 'confirm'): void\r\n}>()\r\n\r\nconst visible = computed({\r\n get: () => props.modelValue,\r\n set: (val) => emit('update:modelValue', val)\r\n})\r\n\r\n// ==================== 时间轴参数 ====================\r\n/** 该班次开学起始周次 */\r\nconst startWeek = 8\r\n/** 该班次学期结束周次 */\r\nconst endWeek = 32\r\n/** 该班次每周可安排的正课学时时数(去除不能排课学时) */\r\nconst weeklyCapacity = 40\r\n\r\n/** 周序列:8 ~ 32 */\r\nconst weeks = computed<number[]>(() => {\r\n const arr: number[] = []\r\n for (let w = startWeek; w <= endWeek; w++) arr.push(w)\r\n return arr\r\n})\r\n\r\n/** 月刻度:每 4 周为一月(8-11 第1月,12-15 第2月...),虚线分隔 */\r\nconst monthBreaks = [12, 16, 20, 24, 28, 32]\r\n\r\n/** 是否为月边界列(左侧画虚线) */\r\nconst isMonthBoundary = (week: number) => monthBreaks.includes(week)\r\n\r\n/** 月份信息:每月包含的周次与可安排正课学时 */\r\nconst months = computed(() => {\r\n const list: { no: number; start: number; end: number; total: number }[] = []\r\n let mNo = 1\r\n let cur = startWeek\r\n while (cur <= endWeek) {\r\n const next = monthBreaks.find((b) => b > cur) ?? endWeek + 1\r\n const mEnd = Math.min(next - 1, endWeek)\r\n list.push({ no: mNo, start: cur, end: mEnd, total: (mEnd - cur + 1) * weeklyCapacity })\r\n cur = mEnd + 1\r\n mNo++\r\n }\r\n return list\r\n})\r\n\r\n/** 底部每月汇总行数据:week -> 该月信息(仅月首格展示文字) */\r\nconst bottomCells = computed(() => {\r\n const map: Record<number, { no: number; total: number; scheduled: number; remaining: number }> = {}\r\n weeks.value.forEach((w) => {\r\n const m = months.value.find((item) => w >= item.start && w <= item.end)\r\n if (!m) return\r\n map[w] = {\r\n no: m.no,\r\n total: m.total,\r\n scheduled: monthlyScheduled(w),\r\n remaining: m.total - monthlyScheduled(w)\r\n }\r\n })\r\n return map\r\n})\r\n\r\n/** 某周所有课程已安排学时之和 */\r\nconst monthlyScheduled = (week: number) =>\r\n courses.value.reduce((sum, c) => {\r\n const map = courseWeekHours(c)\r\n return sum + (map[week] ?? 0)\r\n }, 0)\r\n\r\n// ==================== 配档课程数据 ====================\r\nconst courses = ref<PeidangCourse[]>([\r\n // ---- 非连排课(按周学时安排,蓝色,每门独立一组) ----\r\n { id: 'p1', name: '课程科目001', short: '政治', planStart: 8, actualStart: 8, endWeek: 23, continuous: false, priority: 1, weeklyHours: 4, hours: 60, scheduleTime: true, group: '组1' },\r\n { id: 'p2', name: '课程科目002', short: '军事', planStart: 8, actualStart: 8, endWeek: 20, continuous: false, priority: 2, weeklyHours: 4, hours: 48, scheduleTime: true, group: '组2' },\r\n { id: 'p3', name: '课程科目003', short: '战术', planStart: 8, actualStart: 10, endWeek: 21, continuous: false, priority: 3, weeklyHours: 4, hours: 44, scheduleTime: true, group: '组3' },\r\n { id: 'p4', name: '课程科目004', short: '指挥', planStart: 8, actualStart: 12, endWeek: 22, continuous: false, priority: 4, weeklyHours: 4, hours: 40, scheduleTime: true, group: '组4' },\r\n // ---- 连排课(单科独进,红色,共为一组) ----\r\n { id: 'p5', name: '课程科目005', short: '综合演练', planStart: 8, actualStart: 8, endWeek: 13, continuous: true, priority: 5, weeklyHours: 20, hours: 100, scheduleTime: true, group: '连排组' },\r\n { id: 'p6', name: '课程科目006', short: '野营拉练', planStart: 14, actualStart: 14, endWeek: 16, continuous: true, priority: 6, weeklyHours: 24, hours: 48, scheduleTime: true, group: '连排组' }\r\n])\r\n\r\n/** 每门课程按周分布的安排学时 */\r\nconst courseWeekHours = (course: PeidangCourse): Record<number, number> => {\r\n const map: Record<number, number> = {}\r\n let remaining = course.hours\r\n let w = course.actualStart\r\n while (remaining > 0 && w <= course.endWeek) {\r\n const h = Math.min(course.weeklyHours, remaining)\r\n map[w] = h\r\n remaining -= h\r\n w++\r\n }\r\n return map\r\n}\r\n\r\n/** 课程计算属性:已排学时 / 未排学时 */\r\nconst courseStats = (course: PeidangCourse) => {\r\n const map = courseWeekHours(course)\r\n const scheduled = Object.values(map).reduce((a, b) => a + b, 0)\r\n return { scheduled, remaining: Math.max(0, course.hours - scheduled) }\r\n}\r\n\r\n/** 表格展示顺序:非连排课在前,连排课在后;组内按实际起始周、优先序数排序 */\r\nconst displayCourses = computed<PeidangCourse[]>(() =>\r\n [...courses.value].sort((a, b) => {\r\n if (a.continuous !== b.continuous) return a.continuous ? 1 : -1\r\n if (a.actualStart !== b.actualStart) return a.actualStart - b.actualStart\r\n return a.priority - b.priority\r\n })\r\n)\r\n\r\n// ==================== 表格选中与属性设置 ====================\r\nconst tableRef = ref()\r\nconst currentCourse = ref<PeidangCourse | null>(null)\r\nconst handleCurrentChange = (row: PeidangCourse) => {\r\n currentCourse.value = row\r\n}\r\n\r\n/** 属性设置表单(右侧) */\r\nconst propForm = reactive({\r\n weeklyHours: 4,\r\n startWeek: 8,\r\n endWeek: 16,\r\n continuous: false,\r\n priority: 1,\r\n group: ''\r\n})\r\n\r\nconst syncPropForm = () => {\r\n if (!currentCourse.value) return\r\n propForm.weeklyHours = currentCourse.value.weeklyHours\r\n propForm.startWeek = currentCourse.value.actualStart\r\n propForm.endWeek = currentCourse.value.endWeek\r\n propForm.continuous = currentCourse.value.continuous\r\n propForm.priority = currentCourse.value.priority\r\n propForm.group = currentCourse.value.group\r\n}\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (val) => {\r\n if (!val) return\r\n nextTick(() => {\r\n tableRef.value?.setCurrentRow(displayCourses.value[0])\r\n currentCourse.value = displayCourses.value[0] ?? null\r\n syncPropForm()\r\n })\r\n }\r\n)\r\n\r\n/** 属性设置保存:应用所选课程的配档属性 */\r\nconst handleApplyProp = () => {\r\n if (!currentCourse.value) {\r\n ElMessage.warning('请先在表格中选择一门课程')\r\n return\r\n }\r\n const row = currentCourse.value\r\n row.weeklyHours = propForm.weeklyHours\r\n row.actualStart = propForm.startWeek\r\n row.endWeek = propForm.endWeek\r\n row.continuous = propForm.continuous\r\n row.priority = propForm.priority\r\n row.group = propForm.group\r\n ElMessage.success('配档属性已应用(前端演示)')\r\n}\r\n\r\n/** 优先序数上移:优先序数减 1 */\r\nconst handlePriorityUp = () => {\r\n if (!currentCourse.value) {\r\n ElMessage.warning('请先在表格中选择一门课程')\r\n return\r\n }\r\n if (currentCourse.value.priority <= 1) {\r\n ElMessage.info('已是最高优先序数')\r\n return\r\n }\r\n currentCourse.value.priority -= 1\r\n syncPropForm()\r\n}\r\n\r\n/** 优先序数下移:优先序数加 1 */\r\nconst handlePriorityDown = () => {\r\n if (!currentCourse.value) {\r\n ElMessage.warning('请先在表格中选择一门课程')\r\n return\r\n }\r\n currentCourse.value.priority += 1\r\n syncPropForm()\r\n}\r\n\r\n// ==================== 底部操作 ====================\r\nconst handleConfirm = () => {\r\n emit('confirm')\r\n visible.value = false\r\n}\r\n</script>\r\n\r\n<template>\r\n <el-dialog\r\n v-model=\"visible\"\r\n :show-close=\"false\"\r\n width=\"96%\"\r\n top=\"3vh\"\r\n :close-on-click-modal=\"false\"\r\n :close-on-press-escape=\"false\"\r\n class=\"peidang-dialog\"\r\n >\r\n <!-- ==================== 自定义标题栏 ==================== -->\r\n <template #header>\r\n <div class=\"peidang-titlebar\">\r\n <el-icon class=\"title-icon\"><Reading /></el-icon>\r\n <span class=\"title-text\">\r\n 班次学期配档——{{ props.semesterName }}——{{ props.classLabel }}\r\n </span>\r\n </div>\r\n </template>\r\n\r\n <div class=\"peidang-body\">\r\n <!-- ==================== 上半部分:左右分栏 ==================== -->\r\n <div class=\"upper\">\r\n <!-- 左侧 75%:配档课程编组管理表格 -->\r\n <div class=\"table-area\">\r\n <el-table\r\n ref=\"tableRef\"\r\n :data=\"displayCourses\"\r\n border\r\n stripe\r\n highlight-current-row\r\n size=\"small\"\r\n max-height=\"240\"\r\n class=\"peidang-table\"\r\n @current-change=\"handleCurrentChange\"\r\n >\r\n <el-table-column prop=\"name\" label=\"科目名称\" width=\"100\" align=\"left\" show-overflow-tooltip />\r\n <el-table-column prop=\"short\" label=\"简称\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"planStart\" label=\"计划起始周\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"actualStart\" label=\"实际起始周\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"endWeek\" label=\"结束周\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column label=\"连排课\" width=\"50\" align=\"center\">\r\n <template #default=\"{ row }\">\r\n <el-checkbox :model-value=\"(row as PeidangCourse).continuous\" />\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"priority\" label=\"优先序数\" width=\"50\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"weeklyHours\" label=\"周学时\" width=\"50\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"hours\" label=\"学时\" width=\"50\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column label=\"正课时间\" width=\"60\" align=\"center\">\r\n <template #default=\"{ row }\">\r\n <el-checkbox :model-value=\"(row as PeidangCourse).scheduleTime\" />\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"已排学时\" width=\"50\" align=\"center\">\r\n <template #default=\"{ row }\">{{ courseStats(row as PeidangCourse).scheduled }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"未排学时\" width=\"50\" align=\"center\">\r\n <template #default=\"{ row }\">{{ courseStats(row as PeidangCourse).remaining }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"总班次任务数\" width=\"70\" align=\"center\">\r\n <template #default=\"{ row }\">{{ (row as PeidangCourse).continuous ? 1 : 1 }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"配档编组任务数\" width=\"80\" align=\"center\">\r\n <template #default=\"{ row }\">{{ (row as PeidangCourse).continuous ? 2 : 1 }}</template>\r\n </el-table-column>\r\n </el-table>\r\n </div>\r\n\r\n <!-- 右侧 25%:配档课程属性设置区 + 优先序数上下移动 -->\r\n <div class=\"prop-area\">\r\n <div class=\"prop-title\">配档课程属性</div>\r\n <el-form label-width=\"72px\" size=\"small\" class=\"prop-form\">\r\n <el-form-item label=\"周学时\">\r\n <el-input-number v-model=\"propForm.weeklyHours\" :min=\"1\" :max=\"40\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n <el-form-item label=\"起始周次\">\r\n <el-input-number v-model=\"propForm.startWeek\" :min=\"startWeek\" :max=\"endWeek\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n <el-form-item label=\"结束周次\">\r\n <el-input-number v-model=\"propForm.endWeek\" :min=\"startWeek\" :max=\"endWeek\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n <el-form-item label=\"连排课\">\r\n <el-checkbox v-model=\"propForm.continuous\">单科独进</el-checkbox>\r\n </el-form-item>\r\n <el-form-item label=\"优先序数\">\r\n <div class=\"priority-field\">\r\n <el-input-number v-model=\"propForm.priority\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n <el-button type=\"primary\" plain :icon=\"ArrowUp\" @click=\"handlePriorityUp\" />\r\n <el-button type=\"primary\" plain :icon=\"ArrowDown\" @click=\"handlePriorityDown\" />\r\n </div>\r\n </el-form-item>\r\n <el-form-item label=\"配档编组\">\r\n <el-input v-model=\"propForm.group\" />\r\n </el-form-item>\r\n </el-form>\r\n <el-button type=\"primary\" class=\"apply-btn\" @click=\"handleApplyProp\">应用属性</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 下半部分:配档显示区域(甘特图) ==================== -->\r\n <div class=\"gantt-area\">\r\n <div class=\"gantt-head\">\r\n <div class=\"gantt-label-col\">\r\n <div class=\"gantt-label\">课程 / 周次</div>\r\n </div>\r\n <div class=\"gantt-body\">\r\n <!-- 行1:周次刻度(红色竖线为周刻度) -->\r\n <div class=\"gantt-row\">\r\n <div\r\n v-for=\"w in weeks\"\r\n :key=\"w\"\r\n class=\"gantt-cell week-cell\"\r\n :class=\"{ 'month-boundary': isMonthBoundary(w) }\"\r\n >{{ w }}</div>\r\n </div>\r\n <!-- 行2:本周可安排正课学时 -->\r\n <div class=\"gantt-row info-row\">\r\n <div\r\n v-for=\"w in weeks\"\r\n :key=\"w\"\r\n class=\"gantt-cell\"\r\n :class=\"{ 'month-boundary': isMonthBoundary(w) }\"\r\n >可排{{ weeklyCapacity }}</div>\r\n </div>\r\n <!-- 行3:已安排学时 / 剩余学时 -->\r\n <div class=\"gantt-row info-row\">\r\n <div\r\n v-for=\"w in weeks\"\r\n :key=\"w\"\r\n class=\"gantt-cell\"\r\n :class=\"{ 'month-boundary': isMonthBoundary(w) }\"\r\n >\r\n <span class=\"sch\">已{{ monthlyScheduled(w) }}</span>\r\n <span class=\"rem\">余{{ Math.max(0, weeklyCapacity - monthlyScheduled(w)) }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 课程甘特条 -->\r\n <div class=\"gantt-courses\">\r\n <div v-for=\"course in displayCourses\" :key=\"course.id\" class=\"gantt-course\">\r\n <div class=\"gantt-label-col\">\r\n <div class=\"course-tag\" :class=\"course.continuous ? 'tag-continuous' : 'tag-normal'\">\r\n <span class=\"course-name\">{{ course.name }}{{ course.short }}</span>\r\n <span class=\"course-hours\">\r\n 已排{{ courseStats(course).scheduled }}\r\n <template v-if=\"courseStats(course).remaining > 0\">+{{ courseStats(course).remaining }}</template>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"gantt-body\">\r\n <div class=\"gantt-row bar-row\">\r\n <div\r\n v-for=\"w in weeks\"\r\n :key=\"w\"\r\n class=\"gantt-cell bar-cell\"\r\n :class=\"{\r\n 'month-boundary': isMonthBoundary(w),\r\n 'bar-active': w >= course.actualStart && w <= course.endWeek,\r\n 'bar-continuous': course.continuous,\r\n 'bar-normal': !course.continuous\r\n }\"\r\n >\r\n <span v-if=\"w >= course.actualStart && w <= course.endWeek\" class=\"bar-hours\">\r\n {{ courseWeekHours(course)[w] ?? '' }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 底部:本月可安排正课总学时(月刻度) -->\r\n <div class=\"gantt-foot\">\r\n <div class=\"gantt-label-col\">\r\n <div class=\"gantt-label\">本月正课总学时</div>\r\n </div>\r\n <div class=\"gantt-body\">\r\n <div class=\"gantt-row\">\r\n <div\r\n v-for=\"w in weeks\"\r\n :key=\"w\"\r\n class=\"gantt-cell month-cell\"\r\n :class=\"{ 'month-boundary': isMonthBoundary(w) }\"\r\n >\r\n <span v-if=\"bottomCells[w] && w === months.find((m) => m.end === w)?.end\" class=\"month-total\">\r\n 第{{ bottomCells[w].no }}月:可排{{ bottomCells[w].total }}(已排{{ bottomCells[w].scheduled }} + 余{{ bottomCells[w].remaining }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 底部操作 ==================== -->\r\n <template #footer>\r\n <div class=\"peidang-footer\">\r\n <el-button @click=\"visible = false\">取消(C)</el-button>\r\n <el-button type=\"primary\" @click=\"handleConfirm\">确定(O)</el-button>\r\n </div>\r\n </template>\r\n </el-dialog>\r\n</template>\r\n\r\n<style scoped lang=\"scss\">\r\n.peidang-dialog {\r\n // ========== 自定义标题栏 ==========\r\n :deep(.el-dialog__header) {\r\n margin: 0;\r\n padding: 0;\r\n }\r\n\r\n .peidang-titlebar {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n height: 40px;\r\n padding: 0 14px;\r\n background: linear-gradient(90deg, #0a246a 0%, #a6caf0 100%);\r\n color: #fff;\r\n\r\n .title-icon {\r\n font-size: 18px;\r\n color: #fff;\r\n }\r\n\r\n .title-text {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #fff;\r\n letter-spacing: 0.5px;\r\n }\r\n }\r\n\r\n :deep(.el-dialog__body) {\r\n padding: 12px;\r\n }\r\n\r\n :deep(.el-dialog__footer) {\r\n padding: 8px 12px;\r\n border-top: 1px solid #ebeef5;\r\n }\r\n\r\n .peidang-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 8px;\r\n }\r\n}\r\n\r\n.peidang-body {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 10px;\r\n\r\n // ========== 上半部分:左右分栏 ==========\r\n .upper {\r\n display: flex;\r\n gap: 10px;\r\n\r\n // 左侧 75%:表格\r\n .table-area {\r\n flex: 3;\r\n min-width: 0;\r\n border: 1px solid #ebeef5;\r\n border-radius: 4px;\r\n padding: 6px;\r\n overflow: hidden;\r\n\r\n .peidang-table {\r\n width: 100%;\r\n }\r\n }\r\n\r\n // 右侧 25%:属性设置\r\n .prop-area {\r\n flex: 1;\r\n min-width: 240px;\r\n border: 1px solid #ebeef5;\r\n border-radius: 4px;\r\n padding: 10px 12px;\r\n\r\n .prop-title {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 8px;\r\n padding-bottom: 6px;\r\n border-bottom: 1px solid #ebeef5;\r\n }\r\n\r\n .prop-form {\r\n .priority-field {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n width: 100%;\r\n\r\n .el-button {\r\n flex-shrink: 0;\r\n margin-left: 0;\r\n }\r\n }\r\n }\r\n\r\n .apply-btn {\r\n width: 100%;\r\n margin-top: 4px;\r\n }\r\n }\r\n }\r\n\r\n // ========== 下半部分:配档显示区域 ==========\r\n .gantt-area {\r\n border: 1px solid #ebeef5;\r\n border-radius: 4px;\r\n padding: 8px;\r\n overflow: auto;\r\n max-height: 320px;\r\n\r\n .gantt-head,\r\n .gantt-course,\r\n .gantt-foot {\r\n display: flex;\r\n align-items: stretch;\r\n min-width: 860px;\r\n }\r\n\r\n .gantt-label-col {\r\n flex-shrink: 0;\r\n width: 210px;\r\n display: flex;\r\n align-items: center;\r\n\r\n .gantt-label {\r\n font-size: 12px;\r\n color: #606266;\r\n font-weight: 600;\r\n white-space: nowrap;\r\n }\r\n }\r\n\r\n .gantt-body {\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n\r\n .gantt-row {\r\n display: flex;\r\n\r\n .gantt-cell {\r\n flex: 1;\r\n min-width: 34px;\r\n height: 24px;\r\n line-height: 24px;\r\n text-align: center;\r\n font-size: 11px;\r\n color: #303133;\r\n border-right: 1px solid #ebeef5;\r\n border-bottom: 1px solid #ebeef5;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n // 周刻度:顶部红色竖线\r\n .week-cell {\r\n font-weight: 600;\r\n color: #f56c6c;\r\n border-top: 2px solid #f56c6c;\r\n background: #fff5f5;\r\n }\r\n\r\n .info-row .gantt-cell {\r\n height: 20px;\r\n line-height: 20px;\r\n\r\n .sch {\r\n color: #1e6fff;\r\n }\r\n\r\n .rem {\r\n color: #e6a23c;\r\n margin-left: 2px;\r\n }\r\n }\r\n\r\n // 月刻度虚线\r\n .month-boundary {\r\n border-left: 1px dashed #909399;\r\n }\r\n\r\n // 课程条\r\n .bar-cell {\r\n height: 26px;\r\n position: relative;\r\n\r\n .bar-hours {\r\n font-size: 11px;\r\n font-weight: 600;\r\n }\r\n\r\n &.bar-active {\r\n &.bar-normal {\r\n background: #409eff;\r\n color: #fff;\r\n\r\n .bar-hours {\r\n color: #fff;\r\n }\r\n }\r\n\r\n &.bar-continuous {\r\n background: #f56c6c;\r\n color: #fff;\r\n\r\n .bar-hours {\r\n color: #fff;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .month-cell {\r\n height: 22px;\r\n line-height: 22px;\r\n\r\n .month-total {\r\n font-size: 11px;\r\n color: #606266;\r\n font-weight: 600;\r\n background: #f4f4f5;\r\n border: 1px solid #dcdfe6;\r\n border-radius: 2px;\r\n padding: 0 4px;\r\n white-space: nowrap;\r\n }\r\n }\r\n }\r\n\r\n .gantt-course {\r\n .gantt-label-col {\r\n align-items: center;\r\n\r\n .course-tag {\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n gap: 1px;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n font-size: 11px;\r\n\r\n &.tag-normal {\r\n background: #ecf5ff;\r\n border: 1px solid #a0cfff;\r\n color: #337ecc;\r\n }\r\n\r\n &.tag-continuous {\r\n background: #fef0f0;\r\n border: 1px solid #fbc4c4;\r\n color: #d63031;\r\n }\r\n\r\n .course-name {\r\n font-weight: 600;\r\n white-space: nowrap;\r\n }\r\n\r\n .course-hours {\r\n font-size: 10px;\r\n white-space: nowrap;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .gantt-foot {\r\n .gantt-label-col {\r\n align-items: center;\r\n }\r\n }\r\n }\r\n}\r\n</style>\r\n"]}]}