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

1 line
30 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"remainingRequest":"C:\\Users\\Admin\\Desktop\\education\\frontend\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\shiftSemester\\index.vue?vue&type=style&index=0&id=99b93f96&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachOffice\\shiftSemester\\index.vue","mtime":1787648748789},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoNCi5hcHAtY29udGFpbmVyIHsNCiAgcGFkZGluZzogMjBweDsNCn0NCg0KLnNoaWZ0LXNlbWVzdGVyLXBhZ2Ugew0KICAvLyA9PT09PT09PT09IOmhtemdouagh+mimCA9PT09PT09PT09DQogIC5wYWdlLXRpdGxlIHsNCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICBjb2xvcjogIzMwMzEzMzsNCiAgICBtYXJnaW4tYm90dG9tOiAxMnB4Ow0KICAgIHBhZGRpbmctbGVmdDogMTBweDsNCiAgICBib3JkZXItbGVmdDogNHB4IHNvbGlkIHZhcigtLWVkdS1ncmVlbi1wcmltYXJ5KTsNCiAgfQ0KDQogIC8vID09PT09PT09PT0gMS4g5p+l6K+i5p2h5Lu25Yy65Z+fID09PT09PT09PT0NCiAgLnNlYXJjaC1jYXJkIHsNCiAgICBtYXJnaW4tYm90dG9tOiAxNnB4Ow0KICB9DQoNCiAgLy8gPT09PT09PT09PSAyLiDlt6XlhbfmoI/mjInpkq7ljLogPT09PT09PT09PQ0KICAubGlzdC10b29sYmFyIHsNCiAgICBkaXNwbGF5OiBmbGV4Ow0KICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICAgIGZsZXgtd3JhcDogd3JhcDsNCiAgICBnYXA6IDEycHg7DQogICAgbWFyZ2luLWJvdHRvbTogMTZweDsNCg0KICAgIC5sZWZ0LWdyb3VwLA0KICAgIC5yaWdodC1ncm91cCB7DQogICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgIGZsZXgtd3JhcDogd3JhcDsNCiAgICAgIGdhcDogOHB4Ow0KICAgIH0NCiAgfQ0KDQogIC8vID09PT09PT09PT0gMy4g5pWw5o2u6KGo5qC85Yy6ID09PT09PT09PT0NCiAgLnRhYmxlLWNhcmQgew0KICAgIC5jbGFzcy10YWJsZSB7DQogICAgICB3aWR0aDogMTAwJTsNCiAgICB9DQoNCiAgICAudGV4dC1kYW5nZXIgew0KICAgICAgY29sb3I6ICNmNTZjNmM7DQogICAgfQ0KDQogICAgLmxpc3QtcGFnaW5hdGlvbiB7DQogICAgICBtYXJnaW4tdG9wOiAxMnB4Ow0KICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7DQogICAgfQ0KICB9DQp9DQo="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAklBA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/teachOffice/shiftSemester","sourcesContent":["<template>\r\n <div class=\"app-container shift-semester-page\">\r\n <!-- ==================== 页面标题 ==================== -->\r\n <div class=\"page-title\">班次学期信息管理</div>\r\n\r\n <!-- ==================== 1. 查询条件区域 ==================== -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :inline=\"true\" :model=\"searchForm\" class=\"search-form\">\r\n <el-form-item label=\"班次编号\">\r\n <el-input\r\n v-model=\"searchForm.xydbh\"\r\n placeholder=\"请输入班次编号(模糊)\"\r\n clearable\r\n style=\"width: 220px\"\r\n @keyup.enter.native=\"handleQuery\"\r\n />\r\n </el-form-item>\r\n <el-form-item label=\"年度\">\r\n <el-select v-model=\"filterYear\" placeholder=\"全部年度\" clearable style=\"width: 140px\" @change=\"handleYearChange\">\r\n <el-option v-for=\"y in yearFilterOptions\" :key=\"y\" :label=\"`${y}年`\" :value=\"y\" />\r\n </el-select>\r\n </el-form-item>\r\n <el-form-item>\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleQuery\">查询</el-button>\r\n <el-button icon=\"el-icon-refresh\" @click=\"handleReset\">重置</el-button>\r\n </el-form-item>\r\n </el-form>\r\n </el-card>\r\n\r\n <!-- ==================== 2. 工具栏按钮区 ==================== -->\r\n <div class=\"list-toolbar\">\r\n <div class=\"left-group\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleBatchAdd\">批量创建班次学期</el-button>\r\n <el-button type=\"primary\" plain icon=\"el-icon-document-add\" @click=\"handleAdd\">新增</el-button>\r\n <el-button type=\"primary\" plain icon=\"el-icon-edit\" :disabled=\"!currentRow\" @click=\"handleEdit\">编辑</el-button>\r\n <el-button type=\"danger\" plain icon=\"el-icon-delete\" :disabled=\"!selection.length\" @click=\"handleDelete\">删除所选</el-button>\r\n <el-button type=\"primary\" plain icon=\"el-icon-date\" :disabled=\"!selection.length\" @click=\"handleQuickSetDates\">快速设定学期日期</el-button>\r\n <el-button type=\"primary\" plain icon=\"el-icon-notebook-2\" :disabled=\"!selection.length\" @click=\"handleSetJxrw\">批量设置教学任务</el-button>\r\n </div>\r\n <div class=\"right-group\">\r\n <el-button type=\"success\" plain icon=\"el-icon-calendar\" :disabled=\"!currentRow\" @click=\"handleEditCalendar\">编辑班历</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 3. 班次学期信息列表 ==================== -->\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table\r\n ref=\"tableRef\"\r\n v-loading=\"loading\"\r\n :data=\"displayData\"\r\n border\r\n stripe\r\n highlight-current-row\r\n size=\"small\"\r\n max-height=\"480\"\r\n class=\"class-table\"\r\n @selection-change=\"handleSelectionChange\"\r\n @current-change=\"handleCurrentChange\"\r\n >\r\n <template slot=\"empty\">\r\n <span>无数据!</span>\r\n </template>\r\n <el-table-column type=\"selection\" width=\"44\" align=\"center\" />\r\n <el-table-column type=\"index\" label=\"序号\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"xydbh\" label=\"班次编号\" min-width=\"150\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"nd\" label=\"年度\" width=\"80\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column label=\"学期第次\" width=\"90\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ xqdcLabel(row.xqdc) }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"kxrq\" label=\"开学日期\" width=\"110\" align=\"center\" :formatter=\"fmtDate\" />\r\n <el-table-column prop=\"jsrq\" label=\"结束日期\" width=\"110\" align=\"center\" :formatter=\"fmtDate\" />\r\n <el-table-column prop=\"zyjsbh\" label=\"专用教室\" width=\"100\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column label=\"教学任务\" min-width=\"160\" align=\"center\" show-overflow-tooltip>\r\n <template slot-scope=\"{ row }\">{{ taskName(row.jxrwbh) }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"开放教员排课\" width=\"110\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <el-tag v-if=\"Number(row.kfjypk) === 1\" type=\"success\" size=\"small\">开放</el-tag>\r\n <el-tag v-else type=\"info\" size=\"small\">关闭</el-tag>\r\n </template>\r\n </el-table-column>\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=\"200\" 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\" @click=\"handleEditCalendar(row)\">班历</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"text-danger\" @click=\"handleDeleteRow(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n\r\n <el-pagination\r\n class=\"list-pagination\"\r\n :current-page=\"pageNum\"\r\n :page-size=\"pageSize\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n :total=\"total\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n @size-change=\"handleSizeChange\"\r\n @current-change=\"handlePageChange\"\r\n />\r\n </el-card>\r\n\r\n <!-- ==================== 班次学期新增/编辑弹窗 ==================== -->\r\n <ClassSemesterDetailDialog\r\n :visible=\"detailVisible\"\r\n :mode=\"detailMode\"\r\n :semester=\"detailSemester\"\r\n :team-info=\"detailTeamInfo\"\r\n :year-options=\"yearOptions\"\r\n :task-options=\"taskOptions\"\r\n @update:visible=\"val => detailVisible = val\"\r\n @submit=\"handleDetailSubmit\"\r\n />\r\n\r\n <!-- ==================== 班历管理弹窗 ==================== -->\r\n <ClassCalendarDialog\r\n :visible=\"calendarVisible\"\r\n :semester=\"calendarSemester\"\r\n :semester-options=\"semesterOptions\"\r\n @update:visible=\"val => calendarVisible = val\"\r\n />\r\n\r\n <!-- ==================== 批量创建班次学期弹窗 ==================== -->\r\n <el-dialog\r\n :visible=\"batchAddVisible\"\r\n title=\"批量创建班次学期\"\r\n width=\"520px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => batchAddVisible = val\"\r\n >\r\n <el-form ref=\"batchAddFormRef\" :model=\"batchAddForm\" :rules=\"batchAddRules\" label-width=\"100px\">\r\n <el-form-item label=\"年度\" prop=\"nd\">\r\n <el-select v-model=\"batchAddForm.nd\" placeholder=\"请选择年度\" style=\"width: 100%\">\r\n <el-option v-for=\"y in yearOptions\" :key=\"y\" :label=\"`${y}年`\" :value=\"y\" />\r\n </el-select>\r\n </el-form-item>\r\n <el-form-item label=\"学期\" prop=\"xqdc\">\r\n <el-select v-model=\"batchAddForm.xqdc\" placeholder=\"请选择学期\" style=\"width: 100%\">\r\n <el-option label=\"春季学期\" value=\"春季学期\" />\r\n <el-option label=\"夏季学期\" value=\"夏季学期\" />\r\n <el-option label=\"秋季学期\" value=\"秋季学期\" />\r\n </el-select>\r\n </el-form-item>\r\n <el-form-item label=\"开始日期\" prop=\"startTime\">\r\n <el-date-picker v-model=\"batchAddForm.startTime\" type=\"date\" value-format=\"yyyy-MM-dd\" placeholder=\"请选择开始日期\" style=\"width: 100%\" />\r\n </el-form-item>\r\n <el-form-item label=\"结束日期\" prop=\"endTime\">\r\n <el-date-picker v-model=\"batchAddForm.endTime\" type=\"date\" value-format=\"yyyy-MM-dd\" placeholder=\"请选择结束日期\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"batchAddVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"saving\" @click=\"handleBatchAddSubmit\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- ==================== 快速设定学期日期弹窗 ==================== -->\r\n <el-dialog\r\n :visible=\"dateRangeVisible\"\r\n title=\"快速设定学期日期\"\r\n width=\"480px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => dateRangeVisible = val\"\r\n >\r\n <el-alert\r\n type=\"info\"\r\n :closable=\"false\"\r\n show-icon\r\n :title=\"`将对选中的 ${selection.length} 条班次学期统一设定开学/结束日期`\"\r\n style=\"margin-bottom: 16px\"\r\n />\r\n <el-form ref=\"dateRangeFormRef\" :model=\"dateRangeForm\" :rules=\"dateRangeRules\" label-width=\"100px\">\r\n <el-form-item label=\"开学日期\" prop=\"kxrq\">\r\n <el-date-picker v-model=\"dateRangeForm.kxrq\" type=\"date\" value-format=\"yyyy-MM-dd\" placeholder=\"请选择开学日期\" style=\"width: 100%\" />\r\n </el-form-item>\r\n <el-form-item label=\"结束日期\" prop=\"jsrq\">\r\n <el-date-picker v-model=\"dateRangeForm.jsrq\" type=\"date\" value-format=\"yyyy-MM-dd\" placeholder=\"请选择结束日期\" style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"dateRangeVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"saving\" @click=\"handleDateRangeSubmit\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- ==================== 批量设置教学任务弹窗 ==================== -->\r\n <el-dialog\r\n :visible=\"jxrwVisible\"\r\n title=\"批量设置教学任务\"\r\n width=\"480px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => jxrwVisible = val\"\r\n >\r\n <el-alert\r\n type=\"info\"\r\n :closable=\"false\"\r\n show-icon\r\n :title=\"`将对选中的 ${selection.length} 条班次学期统一设置教学任务`\"\r\n style=\"margin-bottom: 16px\"\r\n />\r\n <el-form ref=\"jxrwFormRef\" :model=\"jxrwForm\" :rules=\"jxrwRules\" label-width=\"100px\">\r\n <el-form-item label=\"教学任务\" prop=\"jxrwbh\">\r\n <el-select v-model=\"jxrwForm.jxrwbh\" placeholder=\"请选择教学任务\" filterable style=\"width: 100%\">\r\n <el-option v-for=\"opt in taskOptions\" :key=\"opt.bh\" :label=\"opt.rwmc\" :value=\"opt.bh\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"jxrwVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"saving\" @click=\"handleJxrwSubmit\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport ClassSemesterDetailDialog from './ClassSemesterDetailDialog.vue'\r\nimport ClassCalendarDialog from './ClassCalendarDialog.vue'\r\nimport { listSemester, allSemester, addSemester, updateSemester, delSemester, batchDeleteSemester, batchUpdateDateRange, batchUpdateJxrwbh, batchAddFromElective } from '@/api/studentRecords/semester'\r\nimport { listAllSemester } from '@/api/teachBusiness/semester'\r\nimport { listTeachingTask } from '@/api/teachBusiness/teachingTask'\r\n\r\nexport default {\r\n name: 'ShiftSemester',\r\n components: {\r\n ClassSemesterDetailDialog,\r\n ClassCalendarDialog\r\n },\r\n data() {\r\n return {\r\n loading: false,\r\n saving: false,\r\n\r\n // ==================== 查询条件 ====================\r\n searchForm: { xydbh: '' },\r\n filterYear: undefined,\r\n yearFilterOptions: [],\r\n\r\n // ==================== 列表与分页 ====================\r\n tableData: [],\r\n selection: [],\r\n currentRow: null,\r\n pageNum: 1,\r\n pageSize: 10,\r\n total: 0,\r\n\r\n // ==================== 下拉数据 ====================\r\n /** 年度下拉(来自 /semester/all */\r\n yearOptions: [],\r\n /** 教学任务下拉({ bh, rwmc } */\r\n taskOptions: [],\r\n /** 全部班次学期(用于班历复制目标选择) */\r\n semesterOptions: [],\r\n\r\n // ==================== 班次学期新增/编辑 ====================\r\n detailVisible: false,\r\n detailMode: 'add',\r\n detailSemester: null,\r\n detailTeamInfo: null,\r\n\r\n // ==================== 班历管理 ====================\r\n calendarVisible: false,\r\n calendarSemester: null,\r\n\r\n // ==================== 批量创建班次学期 ====================\r\n batchAddVisible: false,\r\n batchAddForm: { nd: undefined, xqdc: '', startTime: '', endTime: '' },\r\n batchAddRules: {\r\n nd: [{ required: true, message: '请选择年度', trigger: 'change' }],\r\n xqdc: [{ required: true, message: '请选择学期', trigger: 'change' }],\r\n startTime: [{ required: true, message: '请选择开始日期', trigger: 'change' }],\r\n endTime: [{ required: true, message: '请选择结束日期', trigger: 'change' }]\r\n },\r\n\r\n // ==================== 快速设定学期日期 ====================\r\n dateRangeVisible: false,\r\n dateRangeForm: { kxrq: '', jsrq: '' },\r\n dateRangeRules: {\r\n kxrq: [{ required: true, message: '请选择开学日期', trigger: 'change' }],\r\n jsrq: [{ required: true, message: '请选择结束日期', trigger: 'change' }]\r\n },\r\n\r\n // ==================== 批量设置教学任务 ====================\r\n jxrwVisible: false,\r\n jxrwForm: { jxrwbh: undefined },\r\n jxrwRules: {\r\n jxrwbh: [{ required: true, message: '请选择教学任务', trigger: 'change' }]\r\n }\r\n }\r\n },\r\n computed: {\r\n /** 本地按年度过滤(后端 /semester/list 仅支持 xydbh 模糊筛选) */\r\n displayData() {\r\n if (!this.filterYear) return this.tableData\r\n return this.tableData.filter(item => String(item.nd) === String(this.filterYear))\r\n }\r\n },\r\n mounted() {\r\n this.loadYearOptions()\r\n this.loadTaskOptions()\r\n this.loadSemesterOptions()\r\n this.loadList()\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 /** 教学任务编号 → 名称 */\r\n taskName(bh) {\r\n if (!bh) return '-'\r\n const opt = this.taskOptions.find(o => o.bh === bh)\r\n return opt ? opt.rwmc : bh\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 loadYearOptions() {\r\n listAllSemester().then(res => {\r\n const list = (res && res.data) || []\r\n const years = list.map(x => x.nd).filter(v => v !== undefined && v !== null && v !== '')\r\n this.yearOptions = [...new Set(years)].sort((a, b) => Number(a) - Number(b))\r\n }).catch(() => {\r\n this.yearOptions = []\r\n })\r\n },\r\n loadTaskOptions() {\r\n listTeachingTask({ pageNum: 1, pageSize: 1000 }).then(res => {\r\n const list = (res && res.data && res.data.records) || []\r\n this.taskOptions = list.filter(o => o.bh)\r\n }).catch(() => {\r\n this.taskOptions = []\r\n })\r\n },\r\n loadSemesterOptions() {\r\n allSemester().then(res => {\r\n this.semesterOptions = (res && res.data) || []\r\n }).catch(() => {\r\n this.semesterOptions = []\r\n })\r\n },\r\n\r\n /* ==================== 列表加载 ==================== */\r\n loadList() {\r\n this.loading = true\r\n const query = this.cleanPayload({\r\n pageNum: this.pageNum,\r\n pageSize: this.pageSize,\r\n xydbh: this.searchForm.xydbh\r\n })\r\n listSemester(query).then(res => {\r\n const data = (res && res.data) || {}\r\n this.tableData = data.records || []\r\n this.total = data.total || 0\r\n this.buildYearFilterOptions()\r\n this.loading = false\r\n }).catch(() => {\r\n this.tableData = []\r\n this.total = 0\r\n this.loading = false\r\n })\r\n },\r\n /** 本地年度过滤下拉(从当前数据动态生成,避免硬编码) */\r\n buildYearFilterOptions() {\r\n const years = this.tableData.map(r => r.nd).filter(v => v !== undefined && v !== null && v !== '')\r\n this.yearFilterOptions = [...new Set(years)].sort((a, b) => Number(a) - Number(b))\r\n },\r\n handleYearChange() {\r\n this.$nextTick(() => {\r\n if (this.$refs.tableRef) this.$refs.tableRef.setCurrentRow(null)\r\n this.currentRow = null\r\n })\r\n },\r\n handleSizeChange(size) {\r\n this.pageSize = size\r\n this.loadList()\r\n },\r\n handlePageChange(page) {\r\n this.pageNum = page\r\n this.loadList()\r\n },\r\n handleSelectionChange(rows) {\r\n this.selection = rows\r\n },\r\n handleCurrentChange(row) {\r\n this.currentRow = row\r\n },\r\n\r\n /* ==================== 查询 / 重置 ==================== */\r\n handleQuery() {\r\n this.pageNum = 1\r\n this.loadList()\r\n },\r\n handleReset() {\r\n this.searchForm.xydbh = ''\r\n this.filterYear = undefined\r\n this.pageNum = 1\r\n this.loadList()\r\n },\r\n\r\n /* ==================== 新增 / 编辑 ==================== */\r\n handleAdd() {\r\n this.detailMode = 'add'\r\n this.detailSemester = null\r\n this.detailTeamInfo = null\r\n this.detailVisible = true\r\n },\r\n handleEdit(row) {\r\n const target = row || this.currentRow\r\n if (!target) {\r\n this.$message.warning('请先选择一条班次学期信息')\r\n return\r\n }\r\n this.detailMode = 'edit'\r\n this.detailSemester = target\r\n this.detailTeamInfo = null\r\n this.detailVisible = true\r\n },\r\n handleDetailSubmit(payload) {\r\n this.saving = true\r\n const req = this.detailMode === 'edit'\r\n ? updateSemester(payload)\r\n : addSemester(payload)\r\n req.then(() => {\r\n this.saving = false\r\n this.detailVisible = false\r\n this.$message.success(this.detailMode === 'edit' ? '班次学期已更新' : '班次学期已新增')\r\n this.loadList()\r\n this.loadSemesterOptions()\r\n }).catch(() => {\r\n this.saving = false\r\n })\r\n },\r\n\r\n /* ==================== 删除 ==================== */\r\n handleDelete() {\r\n if (!this.selection.length) {\r\n this.$message.warning('请先勾选要删除的班次学期')\r\n return\r\n }\r\n this.$confirm(`确定删除选中的 ${this.selection.length} 条班次学期吗?删除后其下班历记录将一并删除。`, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n const bhList = this.selection.map(r => r.bh)\r\n batchDeleteSemester(bhList).then(() => {\r\n this.$message.success('已删除')\r\n this.loadList()\r\n this.loadSemesterOptions()\r\n })\r\n }).catch(() => {})\r\n },\r\n handleDeleteRow(row) {\r\n this.$confirm(`确定删除班次学期「${row.xydbh || row.bh}」吗?删除后其下班历记录将一并删除。`, '提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n delSemester(row.bh).then(() => {\r\n this.$message.success('已删除')\r\n this.loadList()\r\n this.loadSemesterOptions()\r\n })\r\n }).catch(() => {})\r\n },\r\n\r\n /* ==================== 编辑班历 ==================== */\r\n handleEditCalendar(row) {\r\n const target = row || this.currentRow\r\n if (!target) {\r\n this.$message.warning('请先在列表中选择一条班次学期信息')\r\n return\r\n }\r\n this.calendarSemester = target\r\n this.calendarVisible = true\r\n },\r\n\r\n /* ==================== 批量创建班次学期 ==================== */\r\n handleBatchAdd() {\r\n this.batchAddForm = { nd: this.yearOptions[0] || undefined, xqdc: '', startTime: '', endTime: '' }\r\n this.batchAddVisible = true\r\n this.$nextTick(() => {\r\n if (this.$refs.batchAddFormRef) this.$refs.batchAddFormRef.clearValidate()\r\n })\r\n },\r\n handleBatchAddSubmit() {\r\n this.$refs.batchAddFormRef.validate(valid => {\r\n if (!valid) return\r\n const f = this.batchAddForm\r\n this.saving = true\r\n batchAddFromElective({\r\n nd: f.nd,\r\n xqdc: f.xqdc,\r\n startTime: f.startTime,\r\n endTime: f.endTime\r\n }).then(res => {\r\n this.saving = false\r\n this.batchAddVisible = false\r\n const count = (res && res.data) || 0\r\n this.$message.success(`已创建 ${count} 个班次学期`)\r\n this.loadList()\r\n this.loadSemesterOptions()\r\n }).catch(() => {\r\n this.saving = false\r\n })\r\n })\r\n },\r\n\r\n /* ==================== 快速设定学期日期 ==================== */\r\n handleQuickSetDates() {\r\n if (!this.selection.length) {\r\n this.$message.warning('请先勾选要设定日期的班次学期')\r\n return\r\n }\r\n this.dateRangeForm = { kxrq: '', jsrq: '' }\r\n this.dateRangeVisible = true\r\n this.$nextTick(() => {\r\n if (this.$refs.dateRangeFormRef) this.$refs.dateRangeFormRef.clearValidate()\r\n })\r\n },\r\n handleDateRangeSubmit() {\r\n this.$refs.dateRangeFormRef.validate(valid => {\r\n if (!valid) return\r\n const f = this.dateRangeForm\r\n this.saving = true\r\n batchUpdateDateRange({\r\n bhList: this.selection.map(r => r.bh),\r\n xqkssj: f.kxrq,\r\n xqjssj: f.jsrq\r\n }).then(res => {\r\n this.saving = false\r\n this.dateRangeVisible = false\r\n const count = (res && res.data) || 0\r\n this.$message.success(`已更新 ${count} 条班次学期的日期`)\r\n this.loadList()\r\n }).catch(() => {\r\n this.saving = false\r\n })\r\n })\r\n },\r\n\r\n /* ==================== 批量设置教学任务 ==================== */\r\n handleSetJxrw() {\r\n if (!this.selection.length) {\r\n this.$message.warning('请先勾选要设置教学任务的班次学期')\r\n return\r\n }\r\n this.jxrwForm = { jxrwbh: undefined }\r\n this.jxrwVisible = true\r\n this.$nextTick(() => {\r\n if (this.$refs.jxrwFormRef) this.$refs.jxrwFormRef.clearValidate()\r\n })\r\n },\r\n handleJxrwSubmit() {\r\n this.$refs.jxrwFormRef.validate(valid => {\r\n if (!valid) return\r\n this.saving = true\r\n batchUpdateJxrwbh({\r\n bhList: this.selection.map(r => r.bh),\r\n jxrwbh: this.jxrwForm.jxrwbh\r\n }).then(res => {\r\n this.saving = false\r\n this.jxrwVisible = false\r\n const count = (res && res.data) || 0\r\n this.$message.success(`已更新 ${count} 条班次学期的教学任务`)\r\n this.loadList()\r\n }).catch(() => {\r\n this.saving = false\r\n })\r\n })\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.app-container {\r\n padding: 20px;\r\n}\r\n\r\n.shift-semester-page {\r\n // ========== 页面标题 ==========\r\n .page-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 12px;\r\n padding-left: 10px;\r\n border-left: 4px solid var(--edu-green-primary);\r\n }\r\n\r\n // ========== 1. 查询条件区域 ==========\r\n .search-card {\r\n margin-bottom: 16px;\r\n }\r\n\r\n // ========== 2. 工具栏按钮区 ==========\r\n .list-toolbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n margin-bottom: 16px;\r\n\r\n .left-group,\r\n .right-group {\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-card {\r\n .class-table {\r\n width: 100%;\r\n }\r\n\r\n .text-danger {\r\n color: #f56c6c;\r\n }\r\n\r\n .list-pagination {\r\n margin-top: 12px;\r\n text-align: right;\r\n }\r\n }\r\n}\r\n</style>\r\n"]}]}