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

1 line
35 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\\ClassCalendarDialog.vue?vue&type=style&index=0&id=7537bbc1&scoped=true&lang=scss","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\\css-loader\\dist\\cjs.js","mtime":1787309792478},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\loaders\\stylePostLoader.js","mtime":1787309794547},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\postcss-loader\\src\\index.js","mtime":1787309793084},{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\sass-loader\\dist\\cjs.js","mtime":1787309791955},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKDQouY2xhc3MtY2FsZW5kYXIgew0KICAvLyA9PT09PT09PT09IDEuIOWtpuacn+S4juePreasoeS/oeaBryA9PT09PT09PT09DQogIC5pbmZvLXBhbmVsIHsNCiAgICBiYWNrZ3JvdW5kOiAjZmZmOw0KICAgIGJvcmRlcjogMXB4IHNvbGlkICNlYmVlZjU7DQogICAgYm9yZGVyLXJhZGl1czogNHB4Ow0KICAgIHBhZGRpbmc6IDEycHggMjBweDsNCiAgICBtYXJnaW4tYm90dG9tOiAxMnB4Ow0KDQogICAgLmluZm8tdGl0bGUtcm93IHsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7DQogICAgICBnYXA6IDIwcHg7DQogICAgICBtYXJnaW4tYm90dG9tOiA4cHg7DQoNCiAgICAgIC5zZW1lc3Rlci1uYW1lLA0KICAgICAgLmNsYXNzLW5hbWUgew0KICAgICAgICBmb250LXNpemU6IDIwcHg7DQogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7DQogICAgICAgIGNvbG9yOiAjMWU2ZmZmOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC5kYXRlLXJhbmdlLXJvdyB7DQogICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICAgIGdhcDogNHB4Ow0KDQogICAgICAucmFuZ2UtaXRlbSB7DQogICAgICAgIGZvbnQtc2l6ZTogMTNweDsNCiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICAgICAgY29sb3I6ICMxZTZmZmY7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLy8gPT09PT09PT09PSAyLiDmk43kvZzmjInpkq7ljLrln58gPT09PT09PT09PQ0KICAuc2V0dGluZ3MtcGFuZWwgew0KICAgIGJhY2tncm91bmQ6ICNmZmY7DQogICAgYm9yZGVyOiAxcHggc29saWQgI2ViZWVmNTsNCiAgICBib3JkZXItcmFkaXVzOiA0cHg7DQogICAgcGFkZGluZzogMTJweCAyMHB4Ow0KICAgIG1hcmdpbi1ib3R0b206IDEycHg7DQoNCiAgICAuYWN0aW9uLWJ1dHRvbnMtcm93IHsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgZmxleC13cmFwOiB3cmFwOw0KICAgICAgZ2FwOiA4cHg7DQogICAgfQ0KICB9DQoNCiAgLy8gPT09PT09PT09PSAzLiDooajmoLzljLrln58gPT09PT09PT09PQ0KICAudGFibGUtYXJlYSB7DQogICAgYmFja2dyb3VuZDogI2ZmZjsNCiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWJlZWY1Ow0KICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgICBvdmVyZmxvdzogaGlkZGVuOw0KDQogICAgLnNlbGVjdC10aXAgew0KICAgICAgcGFkZGluZzogNnB4IDEycHg7DQogICAgICBmb250LXNpemU6IDEycHg7DQogICAgICBjb2xvcjogIzkwOTM5OTsNCiAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWJlZWY1Ow0KICAgICAgYmFja2dyb3VuZDogI2ZhZmFmYTsNCiAgICB9DQogIH0NCg0KICAudGV4dC1kYW5nZXIgew0KICAgIGNvbG9yOiAjZjU2YzZjOw0KICB9DQp9DQoNCi8vID09PT09PT09PT0g5by556qX5YaF6KGo5Y2V5YiG5Yy65qCH6aKYID09PT09PT09PT0NCi5lZGl0LWZvcm0gew0KICAuZm9ybS1zZWN0aW9uLXRpdGxlIHsNCiAgICBmb250LXNpemU6IDEzcHg7DQogICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICBjb2xvcjogIzMwMzEzMzsNCiAgICBtYXJnaW46IDZweCAwIDEwcHg7DQogICAgcGFkZGluZzogNnB4IDEwcHg7DQogICAgYmFja2dyb3VuZDogI2YwZjdmZjsNCiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkICMxZTZmZmY7DQogIH0NCn0NCg0K"},{"version":3,"sources":["ClassCalendarDialog.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;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"]}]}