Files
education/frontend/node_modules/.cache/vue-loader/bd37318a2a9bf71510fb7f4790b557a5.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\\teachBusiness\\semester\\index.vue?vue&type=style&index=0&id=4ae761cf&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachBusiness\\semester\\index.vue","mtime":1787641826318},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg0KLnRlYWNoLXNlbWVzdGVyIHsNCiAgLm1iOCB7DQogICAgbWFyZ2luLWJvdHRvbTogOHB4Ow0KICB9DQoNCiAgLyog5by556qX5YaF6KGo5Y2V77ya6Ziy5q2iIGxhYmVsIOaWh+Wtl+aNouihjOOAgeWtl+auteaLpeaMpOaNouihjCAqLw0KICA6OnYtZGVlcCAuZWwtZGlhbG9nX19ib2R5IHsNCiAgICBwYWRkaW5nLXRvcDogMTZweDsNCiAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsNCiAgfQ0KDQogIC8qIOWvueivneahhuaVtOS9k+S4pOagj+W4g+WxgCAqLw0KICAuc2VtZXN0ZXItZGlhbG9nLWJvZHkgew0KICAgIGRpc3BsYXk6IGJsb2NrOw0KICB9DQoNCiAgLyog6aG26YOo5a2m5pyf6YeN5aSN5o+Q56S65LiO6KGo5Y2V6Ze06LedICovDQogIC5zZW1lc3Rlci1kdXAtYWxlcnQgew0KICAgIG1hcmdpbi1ib3R0b206IDE2cHg7DQogIH0NCg0KICAuc2VtZXN0ZXItZm9ybS1jb2wgew0KICAgIHBhZGRpbmctcmlnaHQ6IDRweDsNCiAgfQ0KDQogIC5zZW1lc3Rlci1zd2l0Y2gtY29sIHsNCiAgICBwYWRkaW5nLWxlZnQ6IDI0cHg7DQogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZWJlZWY1Ow0KICB9DQoNCiAgLnNlbWVzdGVyLWRpYWxvZy1mb3JtIHsNCiAgICA6OnYtZGVlcCAuZWwtZm9ybS1pdGVtIHsNCiAgICAgIG1hcmdpbi1ib3R0b206IDE4cHg7DQogICAgfQ0KDQogICAgOjp2LWRlZXAgLmVsLWZvcm0taXRlbV9fbGFiZWwgew0KICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsNCiAgICAgIGxpbmUtaGVpZ2h0OiAzMnB4Ow0KICAgICAgcGFkZGluZy1yaWdodDogMTBweDsNCiAgICAgIGNvbG9yOiAjNjA2MjY2Ow0KICAgIH0NCg0KICAgIDo6di1kZWVwIC5lbC1mb3JtLWl0ZW1fX2NvbnRlbnQgew0KICAgICAgbGluZS1oZWlnaHQ6IDMycHg7DQogICAgfQ0KDQogICAgLmVsLWlucHV0LA0KICAgIC5lbC1zZWxlY3QsDQogICAgLmVsLWRhdGUtZWRpdG9yIHsNCiAgICAgIHdpZHRoOiAxMDAlOw0KICAgIH0NCiAgfQ0KDQogIC5mb3JtLXRpcCB7DQogICAgZm9udC1zaXplOiAxMnB4Ow0KICAgIGNvbG9yOiAjOTA5Mzk5Ow0KICAgIGxpbmUtaGVpZ2h0OiAxLjU7DQogICAgbWFyZ2luLXRvcDogNHB4Ow0KICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7DQogICAgcGFkZGluZy1sZWZ0OiAycHg7DQogIH0NCg0KICAubG9jay1ncm91cCB7DQogICAgZGlzcGxheTogZmxleDsNCiAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICB9DQoNCiAgLnN3aXRjaC1wYW5lbC10aXRsZSB7DQogICAgZm9udC1zaXplOiAxNHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgY29sb3I6ICMzMDMxMzM7DQogICAgbWFyZ2luLWJvdHRvbTogMTRweDsNCiAgICBwYWRkaW5nLWxlZnQ6IDJweDsNCiAgfQ0KDQogIC5zd2l0Y2gtcGFuZWwgew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICBnYXA6IDEycHg7DQogIH0NCg0KICAuc3dpdGNoLWl0ZW0gew0KICAgIHBhZGRpbmc6IDExcHggMTNweDsNCiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOw0KICAgIGJvcmRlcjogMXB4IHNvbGlkICNlYmVlZjU7DQogICAgYm9yZGVyLXJhZGl1czogNnB4Ow0KICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzLCBiYWNrZ3JvdW5kIDAuMnM7DQoNCiAgICAmOmhvdmVyIHsNCiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tZWR1LWdyZWVuLXByaW1hcnkpOw0KICAgICAgYmFja2dyb3VuZDogI2ZmZjsNCiAgICB9DQoNCiAgICAuZWwtY2hlY2tib3ggew0KICAgICAgaGVpZ2h0OiAyNnB4Ow0KICAgICAgZm9udC13ZWlnaHQ6IDYwMDsNCiAgICAgIGNvbG9yOiAjMzAzMTMzOw0KICAgIH0NCg0KICAgIC5zd2l0Y2gtdGlwIHsNCiAgICAgIGZvbnQtc2l6ZTogMTJweDsNCiAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7DQogICAgICBjb2xvcjogIzkwOTM5OTsNCiAgICAgIHRleHQtYWxpZ246IGp1c3RpZnk7DQogICAgICBtYXJnaW46IDJweCAwIDAgMnB4Ow0KICAgIH0NCiAgfQ0KfQ0K"},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAggBA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/teachBusiness/semester","sourcesContent":["<template>\r\n <div class=\"app-container teach-semester\">\r\n <!-- 工具栏 -->\r\n <el-row :gutter=\"10\" class=\"mb8\">\r\n <el-col :span=\"1.5\">\r\n <el-button type=\"primary\" plain icon=\"el-icon-plus\" size=\"mini\" @click=\"handleAdd\">新添</el-button>\r\n </el-col>\r\n <el-col :span=\"1.8\">\r\n <el-button type=\"success\" plain icon=\"el-icon-date\" size=\"mini\" :disabled=\"!currentSemester\"\r\n @click=\"handleEditCalendar\">\r\n 编辑校历\r\n </el-button>\r\n </el-col>\r\n <el-col :span=\"1.5\">\r\n <el-button type=\"danger\" plain icon=\"el-icon-delete\" size=\"mini\" :disabled=\"multiple\" @click=\"handleDelete\">\r\n 批量删除\r\n </el-button>\r\n </el-col>\r\n </el-row>\r\n\r\n <!-- 数据表格 -->\r\n <el-table v-loading=\"loading\" :data=\"semesterList\" border :height=\"tableHeight\" highlight-current-row\r\n @current-change=\"handleCurrentChange\" @selection-change=\"handleSelectionChange\">\r\n <el-table-column type=\"selection\" align=\"center\" width=\"50\" />\r\n <el-table-column label=\"学期名称\" align=\"center\" width=\"250\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ getSemesterName(scope.row.nd) }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"当前\" align=\"center\" width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <el-tag v-if=\"scope.row.dqxq\" type=\"success\" size=\"mini\">当前</el-tag>\r\n <span v-else>-</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"开学日期\" align=\"center\" prop=\"kxrq\" width=\"160\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ formatDate(scope.row.kxrq) }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"结束日期\" align=\"center\" prop=\"jsrq\" width=\"160\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ formatDate(scope.row.jsrq) }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"周数\" align=\"center\" prop=\"sdzs\" width=\"100\" />\r\n <el-table-column label=\"调课不审批\" align=\"center\" width=\"120\">\r\n <template slot-scope=\"scope\">\r\n <el-tag :type=\"scope.row.tkbsp ? 'primary' : 'info'\" size=\"mini\">{{ scope.row.tkbsp ? '是' : '否' }}</el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"禁止调课\" align=\"center\" width=\"120\">\r\n <template slot-scope=\"scope\">\r\n <el-tag :type=\"scope.row.jztk ? 'danger' : 'info'\" size=\"mini\">{{ scope.row.jztk ? '是' : '否' }}</el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"终结成绩定及格\" align=\"center\" width=\"160\">\r\n <template slot-scope=\"scope\">\r\n <el-tag :type=\"scope.row.zjcjdjg ? 'primary' : 'info'\" size=\"mini\">{{ scope.row.zjcjdjg ? '是' : '否'\r\n }}</el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"课时系数方案\" align=\"center\" width=\"160\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ getCoefficientLabel(scope.row.ksxsfabh) }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"锁定时长\" align=\"center\" width=\"100\">\r\n <template slot-scope=\"scope\">\r\n <span>{{ scope.row.sdjldw || '-' }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" align=\"center\" fixed=\"right\" class-name=\"table-action-column\">\r\n <template slot-scope=\"scope\">\r\n <el-button type=\"text\" size=\"mini\" icon=\"el-icon-edit\" @click=\"handleUpdate(scope.row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"mini\" icon=\"el-icon-delete\" class=\"text-danger\"\r\n @click=\"handleDelete(scope.row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n\r\n <pagination v-show=\"total > 0\" :total=\"total\" :page.sync=\"queryParams.pageNum\" :limit.sync=\"queryParams.pageSize\"\r\n @pagination=\"getList\" />\r\n\r\n <!-- 学期信息弹窗 -->\r\n <el-dialog :title=\"title\" :visible.sync=\"open\" width=\"900px\" append-to-body class=\"semester-dialog\">\r\n <el-alert v-if=\"isSemesterNameDuplicated()\" class=\"semester-dup-alert\" type=\"warning\" show-icon\r\n title=\"该学期已存在,不能重复添加\" :closable=\"false\" />\r\n <el-form ref=\"form\" class=\"semester-dialog-form\" :model=\"form\" :rules=\"rules\" label-width=\"96px\"\r\n label-position=\"right\">\r\n <el-row :gutter=\"20\" class=\"semester-dialog-body\">\r\n <!-- 左侧表单区 -->\r\n <el-col :span=\"15\" class=\"semester-form-col\">\r\n <el-form-item label=\"学期名称\">\r\n <el-input :value=\"getSemesterName(buildNd(form.xn, form.xq))\" readonly placeholder=\"请在下方选择年份和学期类型\"\r\n prefix-icon=\"el-icon-office-building\" />\r\n </el-form-item>\r\n <el-row :gutter=\"14\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"年份\" prop=\"xn\">\r\n <el-select v-model=\"form.xn\" placeholder=\"请选择年份\" :disabled=\"!isAdd\" style=\"width: 100%\"\r\n @change=\"checkSemesterNameUnique\">\r\n <el-option v-for=\"item in yearOptions\" :key=\"item\" :label=\"item + '年'\" :value=\"item\" />\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=\"学期类型\" prop=\"xq\">\r\n <el-select v-model=\"form.xq\" placeholder=\"请选择学期类型\" :disabled=\"!isAdd\" style=\"width: 100%\"\r\n @change=\"checkSemesterNameUnique\">\r\n <el-option v-for=\"item in semesterOptions\" :key=\"item.value\" :label=\"item.label\"\r\n :value=\"item.value\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"14\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"开学日期\" prop=\"kxrq\">\r\n <el-date-picker v-model=\"form.kxrq\" type=\"date\" placeholder=\"开学日期\" value-format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"结束日期\" prop=\"jsrq\">\r\n <el-date-picker v-model=\"form.jsrq\" type=\"date\" placeholder=\"结束日期\" value-format=\"yyyy-MM-dd\"\r\n style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"14\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"学期周数\" prop=\"sdzs\">\r\n <el-input-number v-model=\"form.sdzs\" :min=\"1\" :max=\"60\" controls-position=\"right\"\r\n style=\"width: 100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"课时系数方案\" prop=\"ksxsfabh\">\r\n <el-select v-model=\"form.ksxsfabh\" placeholder=\"请选择\" clearable style=\"width: 100%\">\r\n <el-option v-for=\"item in coefficientOptions\" :key=\"item.value\" :label=\"item.label\"\r\n :value=\"item.value\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-form-item label=\"锁定时长\">\r\n <div class=\"lock-group\">\r\n <el-input-number v-model=\"form.lockValue\" :min=\"0\" :max=\"99\" controls-position=\"right\"\r\n style=\"width: 120px\" />\r\n <el-radio-group v-model=\"form.lockUnit\" class=\"lock-unit\" style=\"margin-left: 28px\">\r\n <el-radio label=\"周\">周</el-radio>\r\n <el-radio label=\"月\">月</el-radio>\r\n </el-radio-group>\r\n </div>\r\n </el-form-item>\r\n <div class=\"form-tip\">以当前周星期四中午12点为界限,锁定【锁定周数】周的教学实施计划,被锁定的教学实施计划不允许教员自行调整。</div>\r\n </el-col>\r\n\r\n <!-- 右侧业务开关区 -->\r\n <el-col :span=\"9\" class=\"semester-switch-col\">\r\n <div class=\"switch-panel-title\">业务开关</div>\r\n <div class=\"switch-panel\">\r\n <div class=\"switch-item\">\r\n <el-checkbox v-model=\"form.dqxq\">当前学期</el-checkbox>\r\n <div class=\"switch-tip\">设定当前学期后,系统启动时会自动将该学期设置为默认学期。</div>\r\n </div>\r\n\r\n <div class=\"switch-item\">\r\n <el-checkbox v-model=\"form.jztk\">禁止调课</el-checkbox>\r\n <div class=\"switch-tip\">设定【禁止调课】后,教学信息系统中就无法对课程信息进行调整。</div>\r\n </div>\r\n\r\n <div class=\"switch-item\">\r\n <el-checkbox v-model=\"form.tkbsp\">调课不审批</el-checkbox>\r\n <div class=\"switch-tip\">\r\n 设定【调课不审批】后,在教学信息系统中调课时,如果只是更改教员,或更改授课地点,调课申请会立即生效。而对于改变授课地点,调课申请会立即生效。而对于改变授课时间、增加或减少授课教员的调课申请依然不受该设置影响,依然需要逐级审批后才能生效。\r\n </div>\r\n </div>\r\n\r\n <div class=\"switch-item\">\r\n <el-checkbox v-model=\"form.zjcjdjg\">终结成绩定及格</el-checkbox>\r\n <div class=\"switch-tip\">设定【终结成绩定及格】后,学员终结性成绩不及格的,最终成绩即为不及格。</div>\r\n </div>\r\n\r\n <div class=\"switch-item\">\r\n <el-checkbox v-model=\"form.jwldshtk\">教务机关审核教学计划调整</el-checkbox>\r\n <div class=\"switch-tip\">勾选:教务机关需要从行政入口对每个教学计划调整申请进行审批,同时再由管理员身份教务参谋进行最后的把关;不勾选:仅由管理员身份教务参谋进行最后的把关。</div>\r\n </div>\r\n </div>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\" class=\"dialog-footer\">\r\n <el-button type=\"primary\" @click=\"submitForm\">确 定</el-button>\r\n <el-button @click=\"cancel\">取 消</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { listSemester, getSemester, addSemester, updateSemester, delSemester } from \"@/api/teachBusiness/semester\"\r\n\r\nexport default {\r\n name: \"Semester\",\r\n data() {\r\n return {\r\n // 遮罩层\r\n loading: true,\r\n // 表格高度\r\n tableHeight: window.innerHeight - 280,\r\n // 总条数\r\n total: 0,\r\n // 学期列表数据\r\n semesterList: [],\r\n // 选中的学期数组\r\n ids: [],\r\n // 当前点击选中的学期\r\n currentSemester: null,\r\n // 非单个禁用\r\n single: true,\r\n // 非多个禁用\r\n multiple: true,\r\n // 弹出层标题\r\n title: \"\",\r\n // 是否显示弹出层\r\n open: false,\r\n // 是否新增\r\n isAdd: true,\r\n // 学年选项(当前年份 ± 10 年)\r\n yearOptions: [],\r\n // 学期选项:01 春季、02 夏季、03 秋季\r\n semesterOptions: [\r\n { value: '01', label: '春季学期' },\r\n { value: '02', label: '夏季学期' },\r\n { value: '03', label: '秋季学期' }\r\n ],\r\n // 课时系数方案选项(引用基础数据表,暂以静态占位)\r\n coefficientOptions: [\r\n { value: '1', label: '标准系数方案' },\r\n { value: '2', label: '综合系数方案' },\r\n { value: '3', label: '实训系数方案' }\r\n ],\r\n // 查询参数\r\n queryParams: {\r\n pageNum: 1,\r\n pageSize: 10\r\n },\r\n // 表单参数\r\n form: {},\r\n // 表单校验\r\n rules: {\r\n xn: [\r\n { required: true, message: \"请选择年份\", trigger: \"change\" }\r\n ],\r\n xq: [\r\n { required: true, message: \"请选择学期类型\", trigger: \"change\" }\r\n ],\r\n kxrq: [\r\n { required: true, message: \"请选择开学日期\", trigger: \"change\" }\r\n ],\r\n jsrq: [\r\n { required: true, message: \"请选择结束日期\", trigger: \"change\" }\r\n ]\r\n }\r\n }\r\n },\r\n created() {\r\n this.initYearOptions()\r\n this.getList()\r\n // 顶栏切换当前学期后,自动刷新本页数据\r\n this.$root.$on('semester-current-changed', this.handleCurrentChanged)\r\n },\r\n beforeDestroy() {\r\n this.$root.$off('semester-current-changed', this.handleCurrentChanged)\r\n },\r\n methods: {\r\n /** 顶栏切换当前学期后自动刷新 */\r\n handleCurrentChanged() {\r\n this.getList()\r\n },\r\n /** 初始化学年选项 */\r\n initYearOptions() {\r\n const current = new Date().getFullYear()\r\n const list = []\r\n for (let i = current - 10; i <= current + 10; i++) {\r\n list.push(i)\r\n }\r\n this.yearOptions = list\r\n },\r\n /** 学年+学期 -> 学期代号(如 2026 + 01 = 202601 */\r\n buildNd(xn, xq) {\r\n if (xn === undefined || xn === null || xn === '' || !xq) return ''\r\n return String(xn) + String(xq)\r\n },\r\n /** 学期代号 -> 学期名称(如 202601 -> 2026年春季学期) */\r\n getSemesterName(nd) {\r\n if (!nd) return ''\r\n const s = String(nd)\r\n const xn = s.slice(0, 4)\r\n const xq = s.slice(4)\r\n const map = { '01': '春季学期', '02': '夏季学期', '03': '秋季学期' }\r\n return xn + '年' + (map[xq] || '第' + xq + '学期')\r\n },\r\n /** 学期代号 -> {xn, xq} */\r\n parseNd(nd) {\r\n if (!nd) return { xn: undefined, xq: undefined }\r\n const s = String(nd)\r\n return { xn: s.slice(0, 4), xq: s.slice(4) }\r\n },\r\n /** 新增时校验学期名称(年份+学期类型拼接)是否已存在于表格 */\r\n isSemesterNameDuplicated() {\r\n if (!this.isAdd) return false\r\n const nd = this.buildNd(this.form.xn, this.form.xq)\r\n if (!nd) return false\r\n return this.semesterList.some(item => String(item.nd) === String(nd))\r\n },\r\n /** 年份/学期类型切换时实时刷新顶部重复提示 */\r\n checkSemesterNameUnique() {\r\n this.$forceUpdate()\r\n },\r\n /** 课时系数方案编号 -> 名称 */\r\n getCoefficientLabel(value) {\r\n if (!value && value !== 0) return '-'\r\n const found = this.coefficientOptions.find(o => String(o.value) === String(value))\r\n return found ? found.label : value\r\n },\r\n /** 格式化后端 LocalDateTime2026-02-23T00:00:00 -> 2026-02-23 */\r\n formatDate(value) {\r\n if (!value) return ''\r\n return String(value).slice(0, 10)\r\n },\r\n /** 查询学期列表 */\r\n getList() {\r\n this.loading = true\r\n listSemester(this.queryParams).then(response => {\r\n const data = response.data || {}\r\n this.semesterList = data.records || []\r\n this.total = data.total || 0\r\n this.loading = false\r\n }).catch(() => {\r\n this.semesterList = []\r\n this.total = 0\r\n this.loading = false\r\n })\r\n },\r\n /** 多选变化 */\r\n handleSelectionChange(selection) {\r\n this.ids = selection.map(item => item.nd)\r\n this.single = selection.length !== 1\r\n this.multiple = !selection.length\r\n },\r\n /** 单击行选中变化:记录当前选中的学期,用于启用「编辑校历」 */\r\n handleCurrentChange(currentRow) {\r\n this.currentSemester = currentRow || null\r\n },\r\n /** 组装提交数据 */\r\n buildPayload(form) {\r\n const lockValue = form.lockValue !== undefined && form.lockValue !== null ? form.lockValue : ''\r\n return {\r\n delFlag: 0,\r\n nd: this.buildNd(form.xn, form.xq),\r\n dqxq: !!form.dqxq,\r\n kxrq: form.kxrq ? form.kxrq + 'T00:00:00' : null,\r\n jsrq: form.jsrq ? form.jsrq + 'T00:00:00' : null,\r\n tkbsp: !!form.tkbsp,\r\n jztk: !!form.jztk,\r\n zjcjdjg: !!form.zjcjdjg,\r\n jwldshtk: !!form.jwldshtk,\r\n ksxsfabh: form.ksxsfabh || null,\r\n sdzs: form.sdzs,\r\n sdjldw: lockValue === '' ? '' : lockValue + form.lockUnit,\r\n xh: form.xh,\r\n jsonzd: \"{'1':1}\",\r\n kstjsj: null\r\n }\r\n },\r\n /** 新增按钮 */\r\n handleAdd() {\r\n this.reset()\r\n this.isAdd = true\r\n this.open = true\r\n this.title = \"学期信息 - 新增\"\r\n },\r\n /** 编辑按钮 */\r\n handleUpdate(row) {\r\n const semesterId = row && row.nd ? row.nd : this.ids[0]\r\n if (!semesterId) return\r\n this.reset()\r\n this.isAdd = false\r\n getSemester(semesterId).then(response => {\r\n const data = response.data || {}\r\n const { xn, xq } = this.parseNd(data.nd)\r\n // 解析锁定时长(如 \"2周\" / \"1月\" / \"1\"\r\n let lockValue = data.sdjldw\r\n let lockUnit = '周'\r\n if (lockValue) {\r\n const s = String(lockValue)\r\n if (s.endsWith('周')) { lockValue = s.slice(0, -1); lockUnit = '周' }\r\n else if (s.endsWith('月')) { lockValue = s.slice(0, -1); lockUnit = '月' }\r\n }\r\n this.form = {\r\n xn: xn,\r\n xq: xq,\r\n dqxq: !!data.dqxq,\r\n jztk: !!data.jztk,\r\n tkbsp: !!data.tkbsp,\r\n zjcjdjg: !!data.zjcjdjg,\r\n jwldshtk: !!data.jwldshtk,\r\n ksxsfabh: data.ksxsfabh,\r\n kxrq: this.formatDate(data.kxrq),\r\n jsrq: this.formatDate(data.jsrq),\r\n sdzs: data.sdzs,\r\n lockValue: lockValue,\r\n lockUnit: lockUnit,\r\n xh: data.xh\r\n }\r\n this.open = true\r\n this.title = \"学期信息 - 编辑\"\r\n }).catch(() => { })\r\n },\r\n /** 编辑校历按钮:对当前选中的学期编辑校历 */\r\n handleEditCalendar() {\r\n const row = this.currentSemester\r\n if (!row || !row.nd) return\r\n this.$router.push({\r\n path: '/teachBusiness/semester/semesterCalendar',\r\n query: { nd: row.nd, name: this.getSemesterName(row.nd) }\r\n })\r\n },\r\n /** 删除按钮 */\r\n handleDelete(row) {\r\n const semesterIds = row && row.nd ? [row.nd] : this.ids\r\n if (!semesterIds.length) return\r\n const names = semesterIds.map(nd => this.getSemesterName(nd)).join('、')\r\n this.$modal.confirm('确认删除学期【' + names + '】吗?').then(() => {\r\n // 批量删除:逐个调用\r\n const delList = semesterIds.map(nd => delSemester(nd))\r\n return Promise.all(delList)\r\n }).then(() => {\r\n this.getList()\r\n this.$modal.msgSuccess(\"删除成功\")\r\n }).catch(() => { })\r\n },\r\n /** 提交表单 */\r\n submitForm() {\r\n if (this.isSemesterNameDuplicated()) {\r\n this.$modal.msgWarning(\"该学期已存在,不能重复添加\")\r\n return\r\n }\r\n this.$refs[\"form\"].validate(valid => {\r\n if (valid) {\r\n const payload = this.buildPayload(this.form)\r\n const selfNd = payload.nd\r\n // 当前学期全局只能有一个:若本次设为当前,先把其他 dqxq=true 的取消\r\n const cancelOthers = payload.dqxq\r\n ? this.cancelOtherCurrent(selfNd)\r\n : Promise.resolve()\r\n cancelOthers.then(() => {\r\n if (this.isAdd) {\r\n return addSemester(payload)\r\n }\r\n return updateSemester(payload)\r\n }).then(() => {\r\n this.$modal.msgSuccess(this.isAdd ? \"新增成功\" : \"修改成功\")\r\n this.open = false\r\n this.getList()\r\n }).catch(() => { })\r\n }\r\n })\r\n },\r\n /** 取消其它“当前学期”,保证全局唯一 */\r\n cancelOtherCurrent(selfNd) {\r\n return listSemester({ pageNum: 1, pageSize: 100 }).then(response => {\r\n const data = response.data || {}\r\n const list = data.records || []\r\n const others = list.filter(i => i.dqxq && String(i.nd) !== String(selfNd))\r\n if (!others.length) return Promise.resolve()\r\n return Promise.all(others.map(o => updateSemester({ ...o, dqxq: false })))\r\n })\r\n },\r\n /** 重置表单 */\r\n reset() {\r\n this.form = {\r\n xn: undefined,\r\n xq: undefined,\r\n dqxq: false,\r\n jztk: false,\r\n tkbsp: false,\r\n zjcjdjg: false,\r\n jwldshtk: false,\r\n ksxsfabh: undefined,\r\n kxrq: undefined,\r\n jsrq: undefined,\r\n sdzs: 20,\r\n lockValue: 1,\r\n lockUnit: '周',\r\n xh: 1\r\n }\r\n this.resetForm(\"form\")\r\n },\r\n /** 取消按钮 */\r\n cancel() {\r\n this.open = false\r\n this.reset()\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.teach-semester {\r\n .mb8 {\r\n margin-bottom: 8px;\r\n }\r\n\r\n /* 弹窗内表单:防止 label 文字换行、字段拥挤换行 */\r\n ::v-deep .el-dialog__body {\r\n padding-top: 16px;\r\n padding-bottom: 16px;\r\n }\r\n\r\n /* 对话框整体两栏布局 */\r\n .semester-dialog-body {\r\n display: block;\r\n }\r\n\r\n /* 顶部学期重复提示与表单间距 */\r\n .semester-dup-alert {\r\n margin-bottom: 16px;\r\n }\r\n\r\n .semester-form-col {\r\n padding-right: 4px;\r\n }\r\n\r\n .semester-switch-col {\r\n padding-left: 24px;\r\n border-left: 1px solid #ebeef5;\r\n }\r\n\r\n .semester-dialog-form {\r\n ::v-deep .el-form-item {\r\n margin-bottom: 18px;\r\n }\r\n\r\n ::v-deep .el-form-item__label {\r\n white-space: nowrap;\r\n line-height: 32px;\r\n padding-right: 10px;\r\n color: #606266;\r\n }\r\n\r\n ::v-deep .el-form-item__content {\r\n line-height: 32px;\r\n }\r\n\r\n .el-input,\r\n .el-select,\r\n .el-date-editor {\r\n width: 100%;\r\n }\r\n }\r\n\r\n .form-tip {\r\n font-size: 12px;\r\n color: #909399;\r\n line-height: 1.5;\r\n margin-top: 4px;\r\n white-space: normal;\r\n padding-left: 2px;\r\n }\r\n\r\n .lock-group {\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n .switch-panel-title {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 14px;\r\n padding-left: 2px;\r\n }\r\n\r\n .switch-panel {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n }\r\n\r\n .switch-item {\r\n padding: 11px 13px;\r\n background: #fafafa;\r\n border: 1px solid #ebeef5;\r\n border-radius: 6px;\r\n transition: border-color 0.2s, background 0.2s;\r\n\r\n &:hover {\r\n border-color: var(--edu-green-primary);\r\n background: #fff;\r\n }\r\n\r\n .el-checkbox {\r\n height: 26px;\r\n font-weight: 600;\r\n color: #303133;\r\n }\r\n\r\n .switch-tip {\r\n font-size: 12px;\r\n line-height: 1.6;\r\n color: #909399;\r\n text-align: justify;\r\n margin: 2px 0 0 2px;\r\n }\r\n }\r\n}\r\n</style>\r\n"]}]}