forked from liweijie/education
1 line
30 KiB
JSON
1 line
30 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\\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 /** 格式化后端 LocalDateTime(2026-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"]}]} |