forked from liweijie/education
1 line
48 KiB
JSON
1 line
48 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\\ClassCalendarDialog.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\shiftSemester\\ClassCalendarDialog.vue","mtime":1787649343833},{"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\\babel-loader\\lib\\index.js","mtime":1787309793142},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgQ2xhc3NUZWFtU2VsZWN0RGlhbG9nIGZyb20gJy4vQ2xhc3NUZWFtU2VsZWN0RGlhbG9nLnZ1ZScNCmltcG9ydCB7DQogIGxpc3RDbGFzc0NhbGVuZGFyLA0KICB1cGRhdGVDbGFzc0NhbGVuZGFyLA0KICBiYXRjaENvcHlDYWxlbmRhciwNCiAgYmF0Y2hDb3B5Q2FsZW5kYXJCeVNlbWVzdGVyLA0KICBhZGRUZWFtVGFzaywNCiAgZGVsVGVhbVRhc2ssDQogIGJhdGNoUHJlc2V0TWVyZ2UsDQogIGJhdGNoUHJlc2V0U3BsaXQsDQogIGF1dG9HZW5lcmF0ZVJlcXVpcmVkQ291cnNlcw0KfSBmcm9tICdAL2FwaS9zdHVkZW50UmVjb3Jkcy9jbGFzc0NhbGVuZGFyJw0KDQpleHBvcnQgZGVmYXVsdCB7DQogIG5hbWU6ICdDbGFzc0NhbGVuZGFyRGlhbG9nJywNCiAgY29tcG9uZW50czogeyBDbGFzc1RlYW1TZWxlY3REaWFsb2cgfSwNCiAgcHJvcHM6IHsNCiAgICB2aXNpYmxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sDQogICAgLyoqIOmAieS4reeahOePreasoeWtpuacn+iusOW9le+8iOWQqyBiaC94eWRiaC94cWRjL25kL3h5ZG1jL2t4cnEvanNyce+8iSAqLw0KICAgIHNlbWVzdGVyOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDogbnVsbCB9LA0KICAgIC8qKiDlj6/pgInnmoTnm67moIfnj63mrKHlrabmnJ/liJfooajvvIjlt7LlkKvnj63mrKHlkI3np7DnmoTlrozmlbTliJfooajvvIkgKi8NCiAgICBzZW1lc3Rlck9wdGlvbnM6IHsgdHlwZTogQXJyYXksIGRlZmF1bHQ6ICgpID0+IFtdIH0NCiAgfSwNCiAgZGF0YSgpIHsNCiAgICByZXR1cm4gew0KICAgICAgbG9hZGluZzogZmFsc2UsDQogICAgICBzYXZpbmc6IGZhbHNlLA0KICAgICAgcmVjb3JkczogW10sDQogICAgICBzZWxlY3Rpb246IFtdLA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmlrDlop4v57yW6L6RID09PT09PT09PT09PT09PT09PT09DQogICAgICBlZGl0VmlzaWJsZTogZmFsc2UsDQogICAgICBlZGl0TW9kZTogJ2FkZCcsDQogICAgICBlZGl0Rm9ybTogdGhpcy5jcmVhdGVFbXB0eUVkaXRGb3JtKCksDQogICAgICBlZGl0UnVsZXM6IHsNCiAgICAgICAgamM6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl6K++56iL566A56ewJywgdHJpZ2dlcjogJ2JsdXInIH1dDQogICAgICB9LA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDlpI3liLbliLDlhbblroPnj63mrKEgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIHRlYW1TZWxlY3RWaXNpYmxlOiBmYWxzZSwNCiAgICAgIGFwcGx5TW9kZTogJ3JlZ2lvbicsDQogICAgICBjb3B5Tm90ZTogJycNCiAgICB9DQogIH0sDQogIGNvbXB1dGVkOiB7DQogICAgZGlhbG9nVmlzaWJsZTogew0KICAgICAgZ2V0KCkgew0KICAgICAgICByZXR1cm4gdGhpcy52aXNpYmxlDQogICAgICB9LA0KICAgICAgc2V0KHZhbCkgew0KICAgICAgICB0aGlzLiRlbWl0KCd1cGRhdGU6dmlzaWJsZScsIHZhbCkNCiAgICAgIH0NCiAgICB9LA0KICAgIHNhZmVTZW1lc3RlcigpIHsNCiAgICAgIHJldHVybiB0aGlzLnNlbWVzdGVyIHx8IHt9DQogICAgfSwNCiAgICBjbGFzc05hbWUoKSB7DQogICAgICBjb25zdCBzID0gdGhpcy5zYWZlU2VtZXN0ZXINCiAgICAgIHJldHVybiBzLnh5ZG1jIHx8IHMueHlkYmggfHwgJycNCiAgICB9LA0KICAgIHNlbWVzdGVyVGl0bGUoKSB7DQogICAgICBjb25zdCBzID0gdGhpcy5zYWZlU2VtZXN0ZXINCiAgICAgIGNvbnN0IG5kID0gcy5uZCAhPT0gdW5kZWZpbmVkICYmIHMubmQgIT09IG51bGwgJiYgcy5uZCAhPT0gJycgPyBgJHtzLm5kfeW5tGAgOiAnJw0KICAgICAgY29uc3QgeHEgPSB0aGlzLnhxZGNMYWJlbChzLnhxZGMpDQogICAgICByZXR1cm4gYCR7bmR9JHt4cX1gDQogICAgfSwNCiAgICBzZW1lc3RlcldlZWtzKCkgew0KICAgICAgY29uc3QgcyA9IHRoaXMuc2FmZVNlbWVzdGVyDQogICAgICBpZiAoIXMua3hycSB8fCAhcy5qc3JxKSByZXR1cm4gJy0nDQogICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKFN0cmluZyhzLmt4cnEpLnNsaWNlKDAsIDEwKSkNCiAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKFN0cmluZyhzLmpzcnEpLnNsaWNlKDAsIDEwKSkNCiAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLnJvdW5kKChlbmQgLSBzdGFydCkgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpICsgMQ0KICAgICAgcmV0dXJuIGRpZmYgPiAwID8gTWF0aC5jZWlsKGRpZmYgLyA3KSA6ICctJw0KICAgIH0sDQogICAgLyoqIOePreWOhue7n+iuoe+8muivvueoi+aVsCAvIOaAu+WtpuaXtiAvIOaAu+WtpuWIhiAqLw0KICAgIHN1bW1hcnkoKSB7DQogICAgICBjb25zdCB0b3RhbFhzID0gdGhpcy5yZWNvcmRzLnJlZHVjZSgoc3VtLCByKSA9PiBzdW0gKyAoTnVtYmVyKHIueHMpIHx8IDApLCAwKQ0KICAgICAgY29uc3QgdG90YWxYZiA9IHRoaXMucmVjb3Jkcy5yZWR1Y2UoKHN1bSwgcikgPT4gc3VtICsgKE51bWJlcihyLnhmKSB8fCAwKSwgMCkNCiAgICAgIHJldHVybiB7IHRvdGFsWHMsIHRvdGFsWGYgfQ0KICAgIH0sDQogICAgZWRpdFRpdGxlKCkgew0KICAgICAgcmV0dXJuIHRoaXMuZWRpdE1vZGUgPT09ICdlZGl0JyA/ICfnvJbovpHnj63ljoborrDlvZUnIDogJ+aWsOWinuePreWOhuiusOW9lScNCiAgICB9DQogIH0sDQogIHdhdGNoOiB7DQogICAgdmlzaWJsZSh2YWwpIHsNCiAgICAgIGlmICh2YWwpIHsNCiAgICAgICAgdGhpcy5sb2FkRGF0YSgpDQogICAgICB9DQogICAgfQ0KICB9LA0KICBtZXRob2RzOiB7DQogICAgLyogLS0tLS0tLS0tLSDmoLzlvI/ljJYgLS0tLS0tLS0tLSAqLw0KICAgIGZtdERhdGUodmFsKSB7DQogICAgICBpZiAoIXZhbCkgcmV0dXJuICctJw0KICAgICAgcmV0dXJuIFN0cmluZyh2YWwpLnNsaWNlKDAsIDEwKQ0KICAgIH0sDQogICAgeHFkY0xhYmVsKHZhbCkgew0KICAgICAgaWYgKHZhbCA9PT0gMSB8fCB2YWwgPT09ICcxJykgcmV0dXJuICfnrKwx5a2m5pyfJw0KICAgICAgaWYgKHZhbCA9PT0gMiB8fCB2YWwgPT09ICcyJykgcmV0dXJuICfnrKwy5a2m5pyfJw0KICAgICAgaWYgKHZhbCA9PT0gMyB8fCB2YWwgPT09ICczJykgcmV0dXJuICfnrKwz5a2m5pyfJw0KICAgICAgcmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gbnVsbCAmJiB2YWwgIT09ICcnID8gYOesrCR7dmFsfeWtpuacn2AgOiAnLScNCiAgICB9LA0KICAgIGNsZWFuUGF5bG9hZChvYmopIHsNCiAgICAgIGNvbnN0IHBheWxvYWQgPSB7fQ0KICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiB7DQogICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV0NCiAgICAgICAgaWYgKHZhbHVlICE9PSAnJyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgcGF5bG9hZFtrZXldID0gdmFsdWUNCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICAgIHJldHVybiBwYXlsb2FkDQogICAgfSwNCg0KICAgIC8qIC0tLS0tLS0tLS0g5YiX6KGo5Yqg6L29IC0tLS0tLS0tLS0gKi8NCiAgICBsb2FkRGF0YSgpIHsNCiAgICAgIGNvbnN0IHMgPSB0aGlzLnNlbWVzdGVyIHx8IHt9DQogICAgICBpZiAoIXMuYmgpIHJldHVybg0KICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZQ0KICAgICAgbGlzdENsYXNzQ2FsZW5kYXIocy5iaCkudGhlbihyZXMgPT4gew0KICAgICAgICB0aGlzLnJlY29yZHMgPSAocmVzICYmIHJlcy5kYXRhKSB8fCBbXQ0KICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkuY2F0Y2goKCkgPT4gew0KICAgICAgICB0aGlzLnJlY29yZHMgPSBbXQ0KICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgfSkNCiAgICB9LA0KDQogICAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKHJvd3MpIHsNCiAgICAgIHRoaXMuc2VsZWN0aW9uID0gcm93cw0KICAgIH0sDQoNCiAgICAvKiAtLS0tLS0tLS0tIOaWsOWiniAvIOe8lui+kSAtLS0tLS0tLS0tICovDQogICAgY3JlYXRlRW1wdHlFZGl0Rm9ybSgpIHsNCiAgICAgIGNvbnN0IHMgPSB0aGlzLnNlbWVzdGVyIHx8IHt9DQogICAgICByZXR1cm4gew0KICAgICAgICBiaDogJycsDQogICAgICAgIG5kOiBzLm5kLA0KICAgICAgICB4eWRiaDogcy54eWRiaCB8fCAnJywNCiAgICAgICAgeHFkYzogcy54cWRjLA0KICAgICAgICB4eWR4cWJoOiBzLmJoIHx8ICcnLA0KICAgICAgICBqYzogJycsDQogICAgICAgIGtiaDogJycsDQogICAgICAgIGtseDogJycsDQogICAgICAgIGtjeGg6IHVuZGVmaW5lZCwNCiAgICAgICAgamhrY3hoOiB1bmRlZmluZWQsDQogICAgICAgIHhoYnM6IHVuZGVmaW5lZCwNCiAgICAgICAganliaDogJycsDQogICAgICAgIGpzYmg6ICcnLA0KICAgICAgICByczogdW5kZWZpbmVkLA0KICAgICAgICB6a3M6IHVuZGVmaW5lZCwNCiAgICAgICAgeHM6IHVuZGVmaW5lZCwNCiAgICAgICAgbGx4czogdW5kZWZpbmVkLA0KICAgICAgICBzanhzOiB1bmRlZmluZWQsDQogICAgICAgIHhmOiB1bmRlZmluZWQsDQogICAgICAgIGtza3M6IHVuZGVmaW5lZCwNCiAgICAgICAga3NiaDogJycsDQogICAgICAgIGtzZGQ6ICcnLA0KICAgICAgICBjamZ6OiAnJywNCiAgICAgICAgYmpyeHlwamY6IHVuZGVmaW5lZCwNCiAgICAgICAga3Nrc2J4czogdW5kZWZpbmVkLA0KICAgICAgICBqeXNkaDogJycsDQogICAgICAgIGp5c2poanliaDogJycsDQogICAgICAgIGp5c2poYno6ICcnLA0KICAgICAgICBwZHhoOiB1bmRlZmluZWQsDQogICAgICAgIHBkcXN6OiB1bmRlZmluZWQsDQogICAgICAgIHBkYXo6IHVuZGVmaW5lZCwNCiAgICAgICAgcGR6emtzajogdW5kZWZpbmVkLA0KICAgICAgICBwZGJ6OiB1bmRlZmluZWQsDQogICAgICAgIHBkdGJ5a3h4Yno6IHVuZGVmaW5lZCwNCiAgICAgICAgcGRxeXpkeXhzOiB1bmRlZmluZWQsDQogICAgICAgIHBkemR5eHNmYnNqOiAnJywNCiAgICAgICAgYnoyOiB1bmRlZmluZWQsDQogICAgICAgIGJ6OiAnJw0KICAgICAgfQ0KICAgIH0sDQoNCiAgICBoYW5kbGVBZGQoKSB7DQogICAgICB0aGlzLmVkaXRNb2RlID0gJ2FkZCcNCiAgICAgIHRoaXMuZWRpdEZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5RWRpdEZvcm0oKQ0KICAgICAgdGhpcy5lZGl0VmlzaWJsZSA9IHRydWUNCiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsNCiAgICAgICAgaWYgKHRoaXMuJHJlZnMuZWRpdEZvcm1SZWYpIHRoaXMuJHJlZnMuZWRpdEZvcm1SZWYuY2xlYXJWYWxpZGF0ZSgpDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVFZGl0KHJvdykgew0KICAgICAgdGhpcy5lZGl0TW9kZSA9ICdlZGl0Jw0KICAgICAgY29uc3QgcyA9IHRoaXMuc2VtZXN0ZXIgfHwge30NCiAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmNyZWF0ZUVtcHR5RWRpdEZvcm0oKQ0KICAgICAgT2JqZWN0LmtleXMoZm9ybSkuZm9yRWFjaChrZXkgPT4gew0KICAgICAgICBpZiAocm93W2tleV0gIT09IHVuZGVmaW5lZCAmJiByb3dba2V5XSAhPT0gbnVsbCkgZm9ybVtrZXldID0gcm93W2tleV0NCiAgICAgIH0pDQogICAgICBmb3JtLnh5ZHhxYmggPSBzLmJoIHx8IHJvdy54eWR4cWJoDQogICAgICB0aGlzLmVkaXRGb3JtID0gZm9ybQ0KICAgICAgdGhpcy5lZGl0VmlzaWJsZSA9IHRydWUNCiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsNCiAgICAgICAgaWYgKHRoaXMuJHJlZnMuZWRpdEZvcm1SZWYpIHRoaXMuJHJlZnMuZWRpdEZvcm1SZWYuY2xlYXJWYWxpZGF0ZSgpDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVFZGl0U3VibWl0KCkgew0KICAgICAgdGhpcy4kcmVmcy5lZGl0Rm9ybVJlZi52YWxpZGF0ZSh2YWxpZCA9PiB7DQogICAgICAgIGlmICghdmFsaWQpIHJldHVybg0KICAgICAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5jbGVhblBheWxvYWQoeyAuLi50aGlzLmVkaXRGb3JtIH0pDQogICAgICAgIGNvbnN0IHJlcSA9IHRoaXMuZWRpdE1vZGUgPT09ICdlZGl0Jw0KICAgICAgICAgID8gdXBkYXRlQ2xhc3NDYWxlbmRhcihwYXlsb2FkKQ0KICAgICAgICAgIDogYWRkVGVhbVRhc2socGF5bG9hZCkNCiAgICAgICAgdGhpcy5zYXZpbmcgPSB0cnVlDQogICAgICAgIHJlcS50aGVuKCgpID0+IHsNCiAgICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlDQogICAgICAgICAgdGhpcy5lZGl0VmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKHRoaXMuZWRpdE1vZGUgPT09ICdlZGl0JyA/ICfnj63ljoborrDlvZXlt7Lmm7TmlrAnIDogJ+ePreWOhuiusOW9leW3suaWsOWinicpDQogICAgICAgICAgdGhpcy5sb2FkRGF0YSgpDQogICAgICAgIH0pLmNhdGNoKCgpID0+IHsNCiAgICAgICAgICB0aGlzLnNhdmluZyA9IGZhbHNlDQogICAgICAgIH0pDQogICAgICB9KQ0KICAgIH0sDQoNCiAgICAvKiAtLS0tLS0tLS0tIOWIoOmZpCAtLS0tLS0tLS0tICovDQogICAgaGFuZGxlRGVsZXRlKHJvdykgew0KICAgICAgdGhpcy4kY29uZmlybShg56Gu5a6a5Yig6Zmk6K+l54+t5Y6G6K6w5b2V77yIJHtyb3cuamMgfHwgcm93LmJofe+8ieWQl++8n2AsICfmj5DnpLonLCB7DQogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgIHR5cGU6ICd3YXJuaW5nJw0KICAgICAgfSkudGhlbigoKSA9PiB7DQogICAgICAgIGRlbFRlYW1UYXNrKHJvdy5iaCkudGhlbigoKSA9PiB7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCflt7LliKDpmaQnKQ0KICAgICAgICAgIHRoaXMubG9hZERhdGEoKQ0KICAgICAgICB9KQ0KICAgICAgfSkuY2F0Y2goKCkgPT4ge30pDQogICAgfSwNCg0KICAgIC8qIC0tLS0tLS0tLS0g6Ieq5Yqo55Sf5oiQ5b+F5L+u6K++56iLIC0tLS0tLS0tLS0gKi8NCiAgICBoYW5kbGVBdXRvR2VuZXJhdGUoKSB7DQogICAgICBjb25zdCBzID0gdGhpcy5zZW1lc3RlciB8fCB7fQ0KICAgICAgaWYgKCFzLnh5ZGJoIHx8ICFzLnhxZGMpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCflvZPliY3nj63mrKHlrabmnJ/nvLrlsJHlrablkZjpmJ/nvJblj7fmiJblrabmnJ/nrKzmrKHvvIzml6Dms5Xoh6rliqjnlJ/miJAnKQ0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIHRoaXMuJGNvbmZpcm0oJ+WwhuaMieS4k+S4muaVmeWtpuiuoeWIkuiHquWKqOeUn+aIkOivpeePreasoeeahOW/heS/ruivvueoi++8iOW3suWtmOWcqOeahOivvueoi+S4jeS8mumHjeWkjea3u+WKoO+8ie+8jOaYr+WQpue7p+e7re+8nycsICfmj5DnpLonLCB7DQogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgIHR5cGU6ICd3YXJuaW5nJw0KICAgICAgfSkudGhlbigoKSA9PiB7DQogICAgICAgIGF1dG9HZW5lcmF0ZVJlcXVpcmVkQ291cnNlcyhzLnh5ZGJoLCBzLnhxZGMpLnRoZW4ocmVzID0+IHsNCiAgICAgICAgICBjb25zdCBjb3VudCA9IChyZXMgJiYgcmVzLmRhdGEpIHx8IDANCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoYOW3suiHquWKqOeUn+aIkCAke2NvdW50fSDpl6jlv4Xkv67or77nqItgKQ0KICAgICAgICAgIHRoaXMubG9hZERhdGEoKQ0KICAgICAgICB9KQ0KICAgICAgfSkuY2F0Y2goKCkgPT4ge30pDQogICAgfSwNCg0KICAgIC8qIC0tLS0tLS0tLS0g6aKE6K6+5ZCI54+tIC8g5ouG54+tIC0tLS0tLS0tLS0gKi8NCiAgICBoYW5kbGVQcmVzZXRNZXJnZSgpIHsNCiAgICAgIGNvbnN0IGJocyA9IHRoaXMuc2VsZWN0aW9uLm1hcChyID0+IHIuYmgpDQogICAgICBpZiAoIWJocy5sZW5ndGgpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7flhYjli77pgInopoHlkIjnj63nmoTnj63ljoborrDlvZUnKQ0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIHRoaXMuJGNvbmZpcm0oYOWwhuaMieW5tOW6puS4uumAieS4reeahCAke2Jocy5sZW5ndGh9IOadoeiusOW9leiuvue9rue7n+S4gOeahOivvuasoeW6j+WPt++8jOaYr+WQpue7p+e7re+8n2AsICfmj5DnpLonLCB7DQogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgIHR5cGU6ICd3YXJuaW5nJw0KICAgICAgfSkudGhlbigoKSA9PiB7DQogICAgICAgIGJhdGNoUHJlc2V0TWVyZ2UoYmhzKS50aGVuKHJlcyA9PiB7DQogICAgICAgICAgY29uc3QgY291bnQgPSAocmVzICYmIHJlcy5kYXRhKSB8fCAwDQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKGDlt7LlrozmiJAgJHtjb3VudH0g5p2h6K6w5b2V55qE6aKE6K6+5ZCI54+tYCkNCiAgICAgICAgICB0aGlzLmxvYWREYXRhKCkNCiAgICAgICAgfSkNCiAgICAgIH0pLmNhdGNoKCgpID0+IHt9KQ0KICAgIH0sDQoNCiAgICBoYW5kbGVQcmVzZXRTcGxpdCgpIHsNCiAgICAgIGNvbnN0IGJocyA9IHRoaXMuc2VsZWN0aW9uLm1hcChyID0+IHIuYmgpDQogICAgICBpZiAoIWJocy5sZW5ndGgpIHsNCiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7flhYjli77pgInopoHmi4bnj63nmoTnj63ljoborrDlvZUnKQ0KICAgICAgICByZXR1cm4NCiAgICAgIH0NCiAgICAgIHRoaXMuJGNvbmZpcm0oYOWwhua4heepuumAieS4reeahCAke2Jocy5sZW5ndGh9IOadoeiusOW9leeahOivvuasoeW6j+WPt++8jOaYr+WQpue7p+e7re+8n2AsICfmj5DnpLonLCB7DQogICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgIHR5cGU6ICd3YXJuaW5nJw0KICAgICAgfSkudGhlbigoKSA9PiB7DQogICAgICAgIGJhdGNoUHJlc2V0U3BsaXQoYmhzKS50aGVuKHJlcyA9PiB7DQogICAgICAgICAgY29uc3QgY291bnQgPSAocmVzICYmIHJlcy5kYXRhKSB8fCAwDQogICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKGDlt7LlrozmiJAgJHtjb3VudH0g5p2h6K6w5b2V55qE6aKE6K6+5ouG54+tYCkNCiAgICAgICAgICB0aGlzLmxvYWREYXRhKCkNCiAgICAgICAgfSkNCiAgICAgIH0pLmNhdGNoKCgpID0+IHt9KQ0KICAgIH0sDQoNCiAgICAvKiAtLS0tLS0tLS0tIOW6lOeUqOS6juWFtuWug+ePreasoSAtLS0tLS0tLS0tICovDQogICAgaGFuZGxlQXBwbHlSZWdpb24oKSB7DQogICAgICBjb25zdCBiaHMgPSB0aGlzLnNlbGVjdGlvbi5tYXAociA9PiByLmJoKQ0KICAgICAgaWYgKCFiaHMubGVuZ3RoKSB7DQogICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn6K+35YWI5Yu+6YCJ6KaB5bqU55So55qE54+t5Y6G6K6w5b2V77yI6YCJ5a6a5Yy65Z+f77yJJykNCiAgICAgICAgcmV0dXJuDQogICAgICB9DQogICAgICB0aGlzLmFwcGx5TW9kZSA9ICdyZWdpb24nDQogICAgICB0aGlzLmNvcHlOb3RlID0gYOWwhumAieS4reeahCAke2Jocy5sZW5ndGh9IOadoeePreWOhuiusOW9leWkjeWItuWIsOaJgOmAieePreasoWANCiAgICAgIHRoaXMudGVhbVNlbGVjdFZpc2libGUgPSB0cnVlDQogICAgfSwNCg0KICAgIGhhbmRsZUFwcGx5V2hvbGUoKSB7DQogICAgICB0aGlzLmFwcGx5TW9kZSA9ICd3aG9sZScNCiAgICAgIHRoaXMuY29weU5vdGUgPSAn5bCG5pW05Liq54+t5Y6G5aSN5Yi25Yiw5omA6YCJ54+t5qyhJw0KICAgICAgdGhpcy50ZWFtU2VsZWN0VmlzaWJsZSA9IHRydWUNCiAgICB9LA0KDQogICAgaGFuZGxlVGVhbUNvbmZpcm0odGFyZ2V0cykgew0KICAgICAgaWYgKCF0YXJnZXRzIHx8ICF0YXJnZXRzLmxlbmd0aCkgcmV0dXJuDQogICAgICBjb25zdCB0YXJnZXRCaExpc3QgPSB0YXJnZXRzLm1hcCh0ID0+IHQuYmgpDQogICAgICBpZiAodGhpcy5hcHBseU1vZGUgPT09ICd3aG9sZScpIHsNCiAgICAgICAgYmF0Y2hDb3B5Q2FsZW5kYXJCeVNlbWVzdGVyKHsNCiAgICAgICAgICBzb3VyY2VYeWR4cWJoOiB0aGlzLnNlbWVzdGVyLmJoLA0KICAgICAgICAgIHRhcmdldEJoTGlzdDogdGFyZ2V0QmhMaXN0DQogICAgICAgIH0pLnRoZW4ocmVzID0+IHsNCiAgICAgICAgICBjb25zdCBkYXRhID0gKHJlcyAmJiByZXMuZGF0YSkgfHwge30NCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoYOW3suWkjeWItuaVtOS4quePreWOhu+8jOWFseaWsOWiniAke2RhdGEuY291bnQgfHwgMH0g5p2h6K6w5b2VYCkNCiAgICAgICAgICB0aGlzLmxvYWREYXRhKCkNCiAgICAgICAgfSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIGJhdGNoQ29weUNhbGVuZGFyKHsNCiAgICAgICAgICBzb3VyY2VCaExpc3Q6IHRoaXMuc2VsZWN0aW9uLm1hcChyID0+IHIuYmgpLA0KICAgICAgICAgIHRhcmdldEJoTGlzdDogdGFyZ2V0QmhMaXN0DQogICAgICAgIH0pLnRoZW4ocmVzID0+IHsNCiAgICAgICAgICBjb25zdCBkYXRhID0gKHJlcyAmJiByZXMuZGF0YSkgfHwge30NCiAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoYOW3suWkjeWItumAieWumuWMuuWfn++8jOWFseaWsOWiniAke2RhdGEuY291bnQgfHwgMH0g5p2h6K6w5b2VYCkNCiAgICAgICAgICB0aGlzLmxvYWREYXRhKCkNCiAgICAgICAgfSkNCiAgICAgIH0NCiAgICB9LA0KDQogICAgLyogLS0tLS0tLS0tLSDliLfmlrAgLS0tLS0tLS0tLSAqLw0KICAgIGhhbmRsZVJlZnJlc2goKSB7DQogICAgICB0aGlzLmxvYWREYXRhKCkNCiAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcygn5bey5Yi35paw54+t5Y6GJykNCiAgICB9DQogIH0NCn0NCg=="},{"version":3,"sources":["ClassCalendarDialog.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+TA;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;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;;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;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;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;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;;AAEA;AACA;AACA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA","file":"ClassCalendarDialog.vue","sourceRoot":"src/views/teachOffice/shiftSemester","sourcesContent":["<template>\r\n <el-dialog\r\n :visible=\"dialogVisible\"\r\n :title=\"`班历管理——${semesterTitle}`\"\r\n width=\"1200px\"\r\n top=\"6vh\"\r\n :close-on-click-modal=\"false\"\r\n class=\"class-calendar-dialog\"\r\n @update:visible=\"val => dialogVisible = val\"\r\n >\r\n <div v-loading=\"loading\" class=\"class-calendar\">\r\n <!-- ==================== 1. 学期与班次信息 ==================== -->\r\n <div class=\"info-panel\">\r\n <div class=\"info-title-row\">\r\n <span class=\"semester-name\">{{ semesterTitle }}</span>\r\n <span class=\"class-name\">{{ className }}</span>\r\n </div>\r\n <div class=\"date-range-row\">\r\n <div class=\"range-item\">学期日期:{{ fmtDate(safeSemester.kxrq) }} 至 {{ fmtDate(safeSemester.jsrq) }},共 {{ semesterWeeks }} 周</div>\r\n <div class=\"range-item\">班历记录:{{ records.length }} 条,总学时 {{ summary.totalXs }},总学分 {{ summary.totalXf }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 2. 操作按钮区域 ==================== -->\r\n <div class=\"settings-panel\">\r\n <div class=\"action-buttons-row\">\r\n <el-button type=\"primary\" size=\"small\" icon=\"el-icon-plus\" @click=\"handleAdd\">新增记录</el-button>\r\n <el-button size=\"small\" @click=\"handleAutoGenerate\">自动生成必修课程</el-button>\r\n <el-button size=\"small\" @click=\"handlePresetMerge\">预设合班</el-button>\r\n <el-button size=\"small\" @click=\"handlePresetSplit\">预设拆班</el-button>\r\n <el-button size=\"small\" @click=\"handleApplyRegion\">选定区域应用于其它班次</el-button>\r\n <el-button size=\"small\" @click=\"handleApplyWhole\">整个班历应用于其它班次</el-button>\r\n <el-button size=\"small\" icon=\"el-icon-refresh\" @click=\"handleRefresh\">刷新</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 3. 班历记录表格 ==================== -->\r\n <div class=\"table-area\">\r\n <el-table\r\n ref=\"tableRef\"\r\n :data=\"records\"\r\n border\r\n stripe\r\n size=\"small\"\r\n max-height=\"480\"\r\n class=\"calendar-table\"\r\n @selection-change=\"handleSelectionChange\"\r\n >\r\n <el-table-column type=\"selection\" width=\"40\" align=\"center\" />\r\n <el-table-column type=\"index\" label=\"序号\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"kcxh\" label=\"课次序号\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"jhkcxh\" label=\"计划课次\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"jc\" label=\"简称\" width=\"100\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"kbh\" label=\"课编号\" width=\"120\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"klx\" label=\"课类型\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"jybh\" label=\"教员编号\" width=\"100\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"jsbh\" label=\"教室编号\" width=\"100\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"zks\" label=\"周课时\" width=\"70\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"xs\" label=\"学时\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"llxs\" label=\"理论学时\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"sjxs\" label=\"实践学时\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"xf\" label=\"学分\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"rs\" label=\"人数\" width=\"60\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"ksbh\" label=\"考试编号\" width=\"100\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"ksdd\" label=\"考试地点\" width=\"110\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"bz\" label=\"备注\" min-width=\"120\" align=\"left\" header-align=\"center\" show-overflow-tooltip />\r\n <el-table-column label=\"操作\" width=\"120\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" @click=\"handleEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"text-danger\" @click=\"handleDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <div class=\"select-tip\">\r\n 提示:勾选多条记录后可进行 预设合班 / 预设拆班 / 选定区域应用于其它班次 操作;删除为物理删除,请谨慎操作。\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div slot=\"footer\">\r\n <el-button @click=\"dialogVisible = false\">关闭</el-button>\r\n </div>\r\n\r\n <!-- ==================== 班历记录新增/编辑弹窗 ==================== -->\r\n <el-dialog\r\n :visible=\"editVisible\"\r\n :title=\"editTitle\"\r\n width=\"760px\"\r\n :close-on-click-modal=\"false\"\r\n append-to-body\r\n @update:visible=\"val => editVisible = val\"\r\n >\r\n <el-form ref=\"editFormRef\" :model=\"editForm\" :rules=\"editRules\" label-width=\"120px\" size=\"small\" class=\"edit-form\">\r\n <div class=\"form-section-title\">基本信息</div>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"简称\" prop=\"jc\">\r\n <el-input v-model=\"editForm.jc\" placeholder=\"课程简称\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"课编号\">\r\n <el-input v-model=\"editForm.kbh\" placeholder=\"课程编号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"课类型\">\r\n <el-input v-model=\"editForm.klx\" placeholder=\"如 必修/选修/实践\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"课次序号\">\r\n <el-input-number v-model=\"editForm.kcxh\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"计划课次序号\">\r\n <el-input-number v-model=\"editForm.jhkcxh\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"序号标识\">\r\n <el-input-number v-model=\"editForm.xhbs\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教员编号\">\r\n <el-input v-model=\"editForm.jybh\" placeholder=\"教员编号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教室编号\">\r\n <el-input v-model=\"editForm.jsbh\" placeholder=\"教室编号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"人数\">\r\n <el-input-number v-model=\"editForm.rs\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"周课时\">\r\n <el-input-number v-model=\"editForm.zks\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <div class=\"form-section-title\">学时学分</div>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学时\">\r\n <el-input-number v-model=\"editForm.xs\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"理论学时\">\r\n <el-input-number v-model=\"editForm.llxs\" :min=\"0\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"实践学时\">\r\n <el-input-number v-model=\"editForm.sjxs\" :min=\"0\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学分\">\r\n <el-input-number v-model=\"editForm.xf\" :min=\"0\" :precision=\"1\" :step=\"0.5\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <div class=\"form-section-title\">考试信息</div>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"考试课时\">\r\n <el-input-number v-model=\"editForm.ksks\" :min=\"0\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"考试编号\">\r\n <el-input v-model=\"editForm.ksbh\" placeholder=\"考试编号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"考试地点\">\r\n <el-input v-model=\"editForm.ksdd\" placeholder=\"考试地点\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"成绩分制\">\r\n <el-input v-model=\"editForm.cjfz\" placeholder=\"如 百分制/等级制\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"不计入平均分\">\r\n <el-select v-model=\"editForm.bjrxypjf\" clearable style=\"width: 100%\">\r\n <el-option label=\"是\" :value=\"1\" />\r\n <el-option label=\"否\" :value=\"0\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"考试课时不显示\">\r\n <el-select v-model=\"editForm.ksksbxs\" clearable style=\"width: 100%\">\r\n <el-option label=\"是\" :value=\"1\" />\r\n <el-option label=\"否\" :value=\"0\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <div class=\"form-section-title\">教研室计划</div>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教研室代号\">\r\n <el-input v-model=\"editForm.jysdh\" placeholder=\"教研室代号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"计划教员编号\">\r\n <el-input v-model=\"editForm.jysjhjybh\" placeholder=\"教研室计划教员编号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-form-item label=\"计划备注\">\r\n <el-input v-model=\"editForm.jysjhbz\" type=\"textarea\" :rows=\"2\" placeholder=\"教研室计划备注\" clearable />\r\n </el-form-item>\r\n <div class=\"form-section-title\">配档设置</div>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"配档序号\">\r\n <el-input-number v-model=\"editForm.pdxh\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"配档起始周\">\r\n <el-input-number v-model=\"editForm.pdqsz\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"配档按周\">\r\n <el-input-number v-model=\"editForm.pdaz\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"占正课时间\">\r\n <el-input-number v-model=\"editForm.pdzzksj\" :min=\"0\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"配档编组\">\r\n <el-input-number v-model=\"editForm.pdbz\" :min=\"1\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"同班异课选修编组\">\r\n <el-select v-model=\"editForm.pdtbykxxbz\" clearable style=\"width: 100%\">\r\n <el-option label=\"是\" :value=\"1\" />\r\n <el-option label=\"否\" :value=\"0\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"启用自定义学时\">\r\n <el-select v-model=\"editForm.pdqyzdyxs\" clearable style=\"width: 100%\">\r\n <el-option label=\"是\" :value=\"1\" />\r\n <el-option label=\"否\" :value=\"0\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编组\">\r\n <el-input-number v-model=\"editForm.bz2\" :min=\"0\" controls-position=\"right\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-form-item label=\"自定义学时分布\">\r\n <el-input v-model=\"editForm.pdzdyxsfbsj\" type=\"textarea\" :rows=\"2\" placeholder=\"配档自定义学时分布数据\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"备注\">\r\n <el-input v-model=\"editForm.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"备注\" clearable />\r\n </el-form-item>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button size=\"small\" @click=\"editVisible = false\">取消</el-button>\r\n <el-button size=\"small\" type=\"primary\" :loading=\"saving\" @click=\"handleEditSubmit\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- ==================== 目标班次学期选取弹窗 ==================== -->\r\n <ClassTeamSelectDialog\r\n :visible=\"teamSelectVisible\"\r\n :semester-list=\"semesterOptions\"\r\n :exclude-bh=\"semester.bh\"\r\n :exclude-note=\"copyNote\"\r\n @update:visible=\"val => teamSelectVisible = val\"\r\n @confirm=\"handleTeamConfirm\"\r\n />\r\n </el-dialog>\r\n</template>\r\n\r\n<script>\r\nimport ClassTeamSelectDialog from './ClassTeamSelectDialog.vue'\r\nimport {\r\n listClassCalendar,\r\n updateClassCalendar,\r\n batchCopyCalendar,\r\n batchCopyCalendarBySemester,\r\n addTeamTask,\r\n delTeamTask,\r\n batchPresetMerge,\r\n batchPresetSplit,\r\n autoGenerateRequiredCourses\r\n} from '@/api/studentRecords/classCalendar'\r\n\r\nexport default {\r\n name: 'ClassCalendarDialog',\r\n components: { ClassTeamSelectDialog },\r\n props: {\r\n visible: { type: Boolean, default: false },\r\n /** 选中的班次学期记录(含 bh/xydbh/xqdc/nd/xydmc/kxrq/jsrq) */\r\n semester: { type: Object, default: null },\r\n /** 可选的目标班次学期列表(已含班次名称的完整列表) */\r\n semesterOptions: { type: Array, default: () => [] }\r\n },\r\n data() {\r\n return {\r\n loading: false,\r\n saving: false,\r\n records: [],\r\n selection: [],\r\n\r\n // ==================== 新增/编辑 ====================\r\n editVisible: false,\r\n editMode: 'add',\r\n editForm: this.createEmptyEditForm(),\r\n editRules: {\r\n jc: [{ required: true, message: '请输入课程简称', trigger: 'blur' }]\r\n },\r\n\r\n // ==================== 复制到其它班次 ====================\r\n teamSelectVisible: false,\r\n applyMode: 'region',\r\n copyNote: ''\r\n }\r\n },\r\n computed: {\r\n dialogVisible: {\r\n get() {\r\n return this.visible\r\n },\r\n set(val) {\r\n this.$emit('update:visible', val)\r\n }\r\n },\r\n safeSemester() {\r\n return this.semester || {}\r\n },\r\n className() {\r\n const s = this.safeSemester\r\n return s.xydmc || s.xydbh || ''\r\n },\r\n semesterTitle() {\r\n const s = this.safeSemester\r\n const nd = s.nd !== undefined && s.nd !== null && s.nd !== '' ? `${s.nd}年` : ''\r\n const xq = this.xqdcLabel(s.xqdc)\r\n return `${nd}${xq}`\r\n },\r\n semesterWeeks() {\r\n const s = this.safeSemester\r\n if (!s.kxrq || !s.jsrq) return '-'\r\n const start = new Date(String(s.kxrq).slice(0, 10))\r\n const end = new Date(String(s.jsrq).slice(0, 10))\r\n const diff = Math.round((end - start) / (1000 * 60 * 60 * 24)) + 1\r\n return diff > 0 ? Math.ceil(diff / 7) : '-'\r\n },\r\n /** 班历统计:课程数 / 总学时 / 总学分 */\r\n summary() {\r\n const totalXs = this.records.reduce((sum, r) => sum + (Number(r.xs) || 0), 0)\r\n const totalXf = this.records.reduce((sum, r) => sum + (Number(r.xf) || 0), 0)\r\n return { totalXs, totalXf }\r\n },\r\n editTitle() {\r\n return this.editMode === 'edit' ? '编辑班历记录' : '新增班历记录'\r\n }\r\n },\r\n watch: {\r\n visible(val) {\r\n if (val) {\r\n this.loadData()\r\n }\r\n }\r\n },\r\n methods: {\r\n /* ---------- 格式化 ---------- */\r\n fmtDate(val) {\r\n if (!val) return '-'\r\n return String(val).slice(0, 10)\r\n },\r\n xqdcLabel(val) {\r\n if (val === 1 || val === '1') return '第1学期'\r\n if (val === 2 || val === '2') return '第2学期'\r\n if (val === 3 || val === '3') return '第3学期'\r\n return val !== undefined && val !== null && val !== '' ? `第${val}学期` : '-'\r\n },\r\n cleanPayload(obj) {\r\n const payload = {}\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n payload[key] = value\r\n }\r\n })\r\n return payload\r\n },\r\n\r\n /* ---------- 列表加载 ---------- */\r\n loadData() {\r\n const s = this.semester || {}\r\n if (!s.bh) return\r\n this.loading = true\r\n listClassCalendar(s.bh).then(res => {\r\n this.records = (res && res.data) || []\r\n this.loading = false\r\n }).catch(() => {\r\n this.records = []\r\n this.loading = false\r\n })\r\n },\r\n\r\n handleSelectionChange(rows) {\r\n this.selection = rows\r\n },\r\n\r\n /* ---------- 新增 / 编辑 ---------- */\r\n createEmptyEditForm() {\r\n const s = this.semester || {}\r\n return {\r\n bh: '',\r\n nd: s.nd,\r\n xydbh: s.xydbh || '',\r\n xqdc: s.xqdc,\r\n xydxqbh: s.bh || '',\r\n jc: '',\r\n kbh: '',\r\n klx: '',\r\n kcxh: undefined,\r\n jhkcxh: undefined,\r\n xhbs: undefined,\r\n jybh: '',\r\n jsbh: '',\r\n rs: undefined,\r\n zks: undefined,\r\n xs: undefined,\r\n llxs: undefined,\r\n sjxs: undefined,\r\n xf: undefined,\r\n ksks: undefined,\r\n ksbh: '',\r\n ksdd: '',\r\n cjfz: '',\r\n bjrxypjf: undefined,\r\n ksksbxs: undefined,\r\n jysdh: '',\r\n jysjhjybh: '',\r\n jysjhbz: '',\r\n pdxh: undefined,\r\n pdqsz: undefined,\r\n pdaz: undefined,\r\n pdzzksj: undefined,\r\n pdbz: undefined,\r\n pdtbykxxbz: undefined,\r\n pdqyzdyxs: undefined,\r\n pdzdyxsfbsj: '',\r\n bz2: undefined,\r\n bz: ''\r\n }\r\n },\r\n\r\n handleAdd() {\r\n this.editMode = 'add'\r\n this.editForm = this.createEmptyEditForm()\r\n this.editVisible = true\r\n this.$nextTick(() => {\r\n if (this.$refs.editFormRef) this.$refs.editFormRef.clearValidate()\r\n })\r\n },\r\n\r\n handleEdit(row) {\r\n this.editMode = 'edit'\r\n const s = this.semester || {}\r\n const form = this.createEmptyEditForm()\r\n Object.keys(form).forEach(key => {\r\n if (row[key] !== undefined && row[key] !== null) form[key] = row[key]\r\n })\r\n form.xydxqbh = s.bh || row.xydxqbh\r\n this.editForm = form\r\n this.editVisible = true\r\n this.$nextTick(() => {\r\n if (this.$refs.editFormRef) this.$refs.editFormRef.clearValidate()\r\n })\r\n },\r\n\r\n handleEditSubmit() {\r\n this.$refs.editFormRef.validate(valid => {\r\n if (!valid) return\r\n const payload = this.cleanPayload({ ...this.editForm })\r\n const req = this.editMode === 'edit'\r\n ? updateClassCalendar(payload)\r\n : addTeamTask(payload)\r\n this.saving = true\r\n req.then(() => {\r\n this.saving = false\r\n this.editVisible = false\r\n this.$message.success(this.editMode === 'edit' ? '班历记录已更新' : '班历记录已新增')\r\n this.loadData()\r\n }).catch(() => {\r\n this.saving = false\r\n })\r\n })\r\n },\r\n\r\n /* ---------- 删除 ---------- */\r\n handleDelete(row) {\r\n this.$confirm(`确定删除该班历记录(${row.jc || row.bh})吗?`, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n delTeamTask(row.bh).then(() => {\r\n this.$message.success('已删除')\r\n this.loadData()\r\n })\r\n }).catch(() => {})\r\n },\r\n\r\n /* ---------- 自动生成必修课程 ---------- */\r\n handleAutoGenerate() {\r\n const s = this.semester || {}\r\n if (!s.xydbh || !s.xqdc) {\r\n this.$message.warning('当前班次学期缺少学员队编号或学期第次,无法自动生成')\r\n return\r\n }\r\n this.$confirm('将按专业教学计划自动生成该班次的必修课程(已存在的课程不会重复添加),是否继续?', '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n autoGenerateRequiredCourses(s.xydbh, s.xqdc).then(res => {\r\n const count = (res && res.data) || 0\r\n this.$message.success(`已自动生成 ${count} 门必修课程`)\r\n this.loadData()\r\n })\r\n }).catch(() => {})\r\n },\r\n\r\n /* ---------- 预设合班 / 拆班 ---------- */\r\n handlePresetMerge() {\r\n const bhs = this.selection.map(r => r.bh)\r\n if (!bhs.length) {\r\n this.$message.warning('请先勾选要合班的班历记录')\r\n return\r\n }\r\n this.$confirm(`将按年度为选中的 ${bhs.length} 条记录设置统一的课次序号,是否继续?`, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n batchPresetMerge(bhs).then(res => {\r\n const count = (res && res.data) || 0\r\n this.$message.success(`已完成 ${count} 条记录的预设合班`)\r\n this.loadData()\r\n })\r\n }).catch(() => {})\r\n },\r\n\r\n handlePresetSplit() {\r\n const bhs = this.selection.map(r => r.bh)\r\n if (!bhs.length) {\r\n this.$message.warning('请先勾选要拆班的班历记录')\r\n return\r\n }\r\n this.$confirm(`将清空选中的 ${bhs.length} 条记录的课次序号,是否继续?`, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n batchPresetSplit(bhs).then(res => {\r\n const count = (res && res.data) || 0\r\n this.$message.success(`已完成 ${count} 条记录的预设拆班`)\r\n this.loadData()\r\n })\r\n }).catch(() => {})\r\n },\r\n\r\n /* ---------- 应用于其它班次 ---------- */\r\n handleApplyRegion() {\r\n const bhs = this.selection.map(r => r.bh)\r\n if (!bhs.length) {\r\n this.$message.warning('请先勾选要应用的班历记录(选定区域)')\r\n return\r\n }\r\n this.applyMode = 'region'\r\n this.copyNote = `将选中的 ${bhs.length} 条班历记录复制到所选班次`\r\n this.teamSelectVisible = true\r\n },\r\n\r\n handleApplyWhole() {\r\n this.applyMode = 'whole'\r\n this.copyNote = '将整个班历复制到所选班次'\r\n this.teamSelectVisible = true\r\n },\r\n\r\n handleTeamConfirm(targets) {\r\n if (!targets || !targets.length) return\r\n const targetBhList = targets.map(t => t.bh)\r\n if (this.applyMode === 'whole') {\r\n batchCopyCalendarBySemester({\r\n sourceXydxqbh: this.semester.bh,\r\n targetBhList: targetBhList\r\n }).then(res => {\r\n const data = (res && res.data) || {}\r\n this.$message.success(`已复制整个班历,共新增 ${data.count || 0} 条记录`)\r\n this.loadData()\r\n })\r\n } else {\r\n batchCopyCalendar({\r\n sourceBhList: this.selection.map(r => r.bh),\r\n targetBhList: targetBhList\r\n }).then(res => {\r\n const data = (res && res.data) || {}\r\n this.$message.success(`已复制选定区域,共新增 ${data.count || 0} 条记录`)\r\n this.loadData()\r\n })\r\n }\r\n },\r\n\r\n /* ---------- 刷新 ---------- */\r\n handleRefresh() {\r\n this.loadData()\r\n this.$message.success('已刷新班历')\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.class-calendar {\r\n // ========== 1. 学期与班次信息 ==========\r\n .info-panel {\r\n background: #fff;\r\n border: 1px solid #ebeef5;\r\n border-radius: 4px;\r\n padding: 12px 20px;\r\n margin-bottom: 12px;\r\n\r\n .info-title-row {\r\n display: flex;\r\n align-items: baseline;\r\n gap: 20px;\r\n margin-bottom: 8px;\r\n\r\n .semester-name,\r\n .class-name {\r\n font-size: 20px;\r\n font-weight: 700;\r\n color: #1e6fff;\r\n }\r\n }\r\n\r\n .date-range-row {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n\r\n .range-item {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: #1e6fff;\r\n }\r\n }\r\n }\r\n\r\n // ========== 2. 操作按钮区域 ==========\r\n .settings-panel {\r\n background: #fff;\r\n border: 1px solid #ebeef5;\r\n border-radius: 4px;\r\n padding: 12px 20px;\r\n margin-bottom: 12px;\r\n\r\n .action-buttons-row {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 8px;\r\n }\r\n }\r\n\r\n // ========== 3. 表格区域 ==========\r\n .table-area {\r\n background: #fff;\r\n border: 1px solid #ebeef5;\r\n border-radius: 4px;\r\n overflow: hidden;\r\n\r\n .select-tip {\r\n padding: 6px 12px;\r\n font-size: 12px;\r\n color: #909399;\r\n border-top: 1px solid #ebeef5;\r\n background: #fafafa;\r\n }\r\n }\r\n\r\n .text-danger {\r\n color: #f56c6c;\r\n }\r\n}\r\n\r\n// ========== 弹窗内表单分区标题 ==========\r\n.edit-form {\r\n .form-section-title {\r\n font-size: 13px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin: 6px 0 10px;\r\n padding: 6px 10px;\r\n background: #f0f7ff;\r\n border-left: 3px solid #1e6fff;\r\n }\r\n}\r\n\r\n</style>\r\n"]}]} |