forked from liweijie/education
1 line
19 KiB
JSON
1 line
19 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\\schedule\\planImport\\index.vue?vue&type=style&index=0&id=6537aaff&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\schedule\\planImport\\index.vue","mtime":1787640892009},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKDQoucGxhbi1pbXBvcnQtcGFnZSB7DQogIC5zZWFyY2gtY2FyZCB7DQogICAgbWFyZ2luLWJvdHRvbTogMTZweDsNCg0KICAgIC5zZWFyY2gtZm9ybSB7DQogICAgICAuZGF0ZS1yYW5nZSB7DQogICAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICAgIGdhcDogOHB4Ow0KDQogICAgICAgIC5kYXRlLWlucHV0IHsNCiAgICAgICAgICB3aWR0aDogMTgwcHg7DQogICAgICAgICAgZmxleC1zaHJpbms6IDA7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLmNoZWNrYm94LWdyb3VwIHsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgZ2FwOiAxNnB4Ow0KICAgICAgfQ0KDQogICAgICAuZm9ybS10aXAgew0KICAgICAgICBjb2xvcjogI2Y1NmM2YzsNCiAgICAgICAgZm9udC1zaXplOiAxMnB4Ow0KICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4Ow0KICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwMHB4Ow0KICAgICAgfQ0KDQogICAgICAuc2VhcmNoLWFjdGlvbnMgew0KICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOw0KICAgICAgICBwYWRkaW5nLXRvcDogOHB4Ow0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC5hY3Rpb24tY2FyZCB7DQogICAgbWFyZ2luLWJvdHRvbTogMTZweDsNCg0KICAgIC5hY3Rpb24tYmFyIHsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOw0KICAgICAgZ2FwOiAxNnB4Ow0KDQogICAgICAuYmFyLWxlZnQsDQogICAgICAuYmFyLWNlbnRlciwNCiAgICAgIC5iYXItcmlnaHQgew0KICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgICAgIGdhcDogMTBweDsNCiAgICAgIH0NCg0KICAgICAgLmJhci1yaWdodCB7DQogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOw0KICAgICAgfQ0KDQogICAgICAuZmlsZS1hcmVhIHsNCiAgICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgICAgZ2FwOiA4cHg7DQoNCiAgICAgICAgLmZpbGUtbmFtZSB7DQogICAgICAgICAgY29sb3I6ICM2MDYyNjY7DQogICAgICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLnRhYmxlLWNhcmQgew0KICAgIC5pbXBvcnQtdGFibGUgew0KICAgICAgd2lkdGg6IDEwMCU7DQogICAgfQ0KICB9DQp9DQo="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+TA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/schedule/planImport","sourcesContent":["<template>\r\n <div class=\"app-container plan-import-page\">\r\n <!-- ==================== 1. 查询条件 ==================== -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"searchForm\" label-width=\"100px\" class=\"search-form\">\r\n <!-- 第一行:课程时间独占整行 -->\r\n <el-row :gutter=\"24\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"课程时间\">\r\n <div class=\"date-range\">\r\n <span>从</span>\r\n <el-date-picker\r\n v-model=\"searchForm.kssj\"\r\n type=\"datetime\"\r\n value-format=\"yyyy-MM-dd HH:mm:ss\"\r\n placeholder=\"开始时间\"\r\n clearable\r\n class=\"date-input\"\r\n />\r\n <span>到</span>\r\n <el-date-picker\r\n v-model=\"searchForm.jssj\"\r\n type=\"datetime\"\r\n value-format=\"yyyy-MM-dd HH:mm:ss\"\r\n placeholder=\"结束时间\"\r\n clearable\r\n class=\"date-input\"\r\n />\r\n </div>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <!-- 下面分左右两栏 -->\r\n <el-row :gutter=\"24\">\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <el-form-item label=\"检查状态\">\r\n <div class=\"checkbox-group\">\r\n <el-checkbox v-model=\"searchForm.jcztYtg\">已通过</el-checkbox>\r\n <el-checkbox v-model=\"searchForm.jcztWtg\">未通过</el-checkbox>\r\n </div>\r\n </el-form-item>\r\n <el-form-item label=\"教员姓名\">\r\n <el-input v-model=\"searchForm.jyxm\" placeholder=\"请输入教员姓名\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"教学场地名称\">\r\n <el-input v-model=\"searchForm.jxcdmc\" placeholder=\"请输入教学场地名称\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <el-form-item label=\"忽略状态\">\r\n <div class=\"checkbox-group\">\r\n <el-checkbox v-model=\"searchForm.hlztYc\">有用</el-checkbox>\r\n <el-checkbox v-model=\"searchForm.hlztYbl\">已被忽略</el-checkbox>\r\n </div>\r\n </el-form-item>\r\n <el-form-item label=\"班次名称\">\r\n <el-input v-model=\"searchForm.bcmc\" placeholder=\"请输入班次名称\" clearable />\r\n </el-form-item>\r\n <el-form-item label=\"科目名称\">\r\n <el-input v-model=\"searchForm.kmmc\" placeholder=\"请输入科目名称\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-row>\r\n <el-col :span=\"24\" class=\"search-actions\">\r\n <el-button type=\"primary\" @click=\"handleSearch\">查询</el-button>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </el-card>\r\n\r\n <!-- ==================== 2. 操作按钮区 ==================== -->\r\n <el-card shadow=\"never\" class=\"action-card\">\r\n <div class=\"action-bar\">\r\n <div class=\"bar-left\">\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadTemplate\">\r\n 【课程表数据文件模板】下载\r\n </el-button>\r\n </div>\r\n\r\n <div class=\"bar-center\">\r\n <div class=\"file-area\">\r\n <input ref=\"fileInputRef\" type=\"file\" accept=\".xlsx,.xls\" style=\"display: none\" @change=\"handleFileChange\" />\r\n <el-button icon=\"el-icon-folder-opened\" @click=\"handleChooseFile\">选择文件</el-button>\r\n <span class=\"file-name\">{{ selectedFileName }}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"bar-right\">\r\n <el-button type=\"primary\" @click=\"handleImportToSystem\" :loading=\"importing\">缓存数据导入到系统</el-button>\r\n <el-button type=\"primary\" icon=\"el-icon-upload2\" @click=\"handleUploadToCache\">上传数据至缓存</el-button>\r\n <el-button @click=\"handleCheckCache\">检查缓存数据</el-button>\r\n <el-button type=\"danger\" plain @click=\"handleDeleteCache\">删除缓存数据</el-button>\r\n </div>\r\n </div>\r\n </el-card>\r\n\r\n <!-- ==================== 3. 数据表格 ==================== -->\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table v-loading=\"loading\" :data=\"tableData\" stripe border highlight-current-row class=\"import-table\">\r\n <el-table-column prop=\"nd\" label=\"年度\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"xh\" label=\"序号\" width=\"53\" align=\"center\" />\r\n <el-table-column prop=\"yxh\" label=\"原序号\" width=\"67\" align=\"center\" />\r\n <el-table-column prop=\"rq\" label=\"日期\" width=\"120\" align=\"center\" :formatter=\"formatDate\" />\r\n <el-table-column prop=\"yjc\" label=\"原节次\" width=\"67\" align=\"center\" />\r\n <el-table-column prop=\"jc\" label=\"节次\" width=\"53\" align=\"center\" />\r\n <el-table-column prop=\"kcmc\" label=\"课程名称\" width=\"85\" show-overflow-tooltip />\r\n <el-table-column prop=\"bc\" label=\"班次\" width=\"53\" show-overflow-tooltip />\r\n <el-table-column prop=\"zrdw\" label=\"责任单位\" width=\"81\" show-overflow-tooltip />\r\n <el-table-column prop=\"skjy\" label=\"授课教员\" width=\"81\" align=\"center\" />\r\n <el-table-column prop=\"jxcd\" label=\"教学场地\" width=\"81\" align=\"center\" />\r\n <el-table-column prop=\"jxnr\" label=\"教学内容\" width=\"81\" show-overflow-tooltip />\r\n <el-table-column prop=\"jxff\" label=\"教学方法\" width=\"81\" align=\"center\" />\r\n <el-table-column prop=\"jybz\" label=\"教员备注\" width=\"81\" show-overflow-tooltip />\r\n <el-table-column prop=\"jwbz\" label=\"教务备注\" width=\"81\" show-overflow-tooltip />\r\n <el-table-column prop=\"jcjg\" label=\"检查结果\" width=\"81\" align=\"center\" />\r\n <el-table-column prop=\"ytgjc\" label=\"已通过检查\" width=\"95\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <span>{{ row.ytgjc ? '是' : '否' }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"ybhl\" label=\"已被忽略\" width=\"81\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <span>{{ row.ybhl ? '是' : '否' }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"ybcl\" label=\"已被处理\" width=\"81\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <span>{{ row.ybcl ? '是' : '否' }}</span>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"ybdr\" label=\"已被导入\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <span>{{ row.ybdr ? '是' : '否' }}</span>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n\r\n <el-pagination\r\n :current-page=\"pageNum\"\r\n :page-size=\"pageSize\"\r\n :total=\"total\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n class=\"pagination-wrapper\"\r\n @current-change=\"handlePageChange\"\r\n @size-change=\"handleSizeChange\"\r\n />\r\n </el-card>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { listTeachingPlan, importTeachingPlan, downloadTeachingPlanTemplate } from '@/api/schedule/teachingPlan'\r\n\r\nexport default {\r\n name: 'PlanImportIndex',\r\n data() {\r\n return {\r\n // ==================== 查询表单 ====================\r\n searchForm: {\r\n kssj: '',\r\n jssj: '',\r\n jcztYtg: false,\r\n jcztWtg: true,\r\n hlztYc: false,\r\n hlztYbl: true,\r\n jyxm: '',\r\n bcmc: '',\r\n jxcdmc: '',\r\n kmmc: ''\r\n },\r\n\r\n // ==================== 文件上传与导入 ====================\r\n selectedFileName: '未选择任何文件',\r\n selectedFile: null,\r\n importing: false,\r\n\r\n // ==================== 表格数据 ====================\r\n tableData: [],\r\n loading: false,\r\n pageNum: 1,\r\n pageSize: 20,\r\n total: 0\r\n }\r\n },\r\n mounted() {\r\n this.fetchList()\r\n },\r\n methods: {\r\n // ==================== 查询 ====================\r\n // 仅传后端 Mapper 支持的字段:skjy(授课教员) bc(班次) kcmc(课程名称) ytgjc(已通过检查)\r\n // 课程时间、忽略状态、教学场地名称后端列表查询不支持,不传\r\n buildSearchParams() {\r\n const f = this.searchForm\r\n const params = { pageNum: this.pageNum, pageSize: this.pageSize }\r\n if (f.jyxm && f.jyxm.trim()) params.skjy = f.jyxm.trim()\r\n if (f.bcmc && f.bcmc.trim()) params.bc = f.bcmc.trim()\r\n if (f.kmmc && f.kmmc.trim()) params.kcmc = f.kmmc.trim()\r\n // 检查状态:仅勾选「已通过」或「未通过」其中之一时才按该条件过滤\r\n if (f.jcztYtg && !f.jcztWtg) params.ytgjc = true\r\n else if (!f.jcztYtg && f.jcztWtg) params.ytgjc = false\r\n return params\r\n },\r\n\r\n fetchList() {\r\n this.loading = true\r\n listTeachingPlan(this.buildSearchParams()).then(response => {\r\n const data = response.data || {}\r\n this.tableData = data.records || []\r\n this.total = data.total || 0\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 handleSearch() {\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handlePageChange(current) {\r\n this.pageNum = current\r\n this.fetchList()\r\n },\r\n\r\n handleSizeChange(size) {\r\n this.pageSize = size\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n /** 日期格式化 */\r\n formatDate(row, column, cellValue) {\r\n return cellValue ? String(cellValue).substring(0, 10) : ''\r\n },\r\n\r\n // ==================== 文件选择 ====================\r\n handleChooseFile() {\r\n this.$refs.fileInputRef && this.$refs.fileInputRef.click()\r\n },\r\n\r\n handleFileChange(event) {\r\n const target = event.target\r\n const file = target.files && target.files[0]\r\n if (file) {\r\n this.selectedFile = file\r\n this.selectedFileName = file.name\r\n } else {\r\n this.selectedFile = null\r\n this.selectedFileName = '未选择任何文件'\r\n }\r\n },\r\n\r\n // ==================== 下载模板 ====================\r\n handleDownloadTemplate() {\r\n downloadTeachingPlanTemplate().then(blob => {\r\n this.downloadBlob(blob, '教学实施计划导入模板.xlsx')\r\n this.$message.success('模板下载成功')\r\n }).catch(() => {})\r\n },\r\n\r\n downloadBlob(blob, fileName) {\r\n const url = window.URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = fileName\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n window.URL.revokeObjectURL(url)\r\n },\r\n\r\n // ==================== 导入到系统 ====================\r\n handleImportToSystem() {\r\n if (!this.selectedFile) {\r\n this.$message.warning('请先选择文件')\r\n return\r\n }\r\n this.importing = true\r\n importTeachingPlan(this.selectedFile).then(res => {\r\n const count = res && res.data\r\n if (count !== null && count !== undefined) {\r\n this.$message.success(`导入成功,共 ${count} 条记录`)\r\n } else {\r\n this.$message.success((res && res.msg) || '导入成功')\r\n }\r\n this.selectedFile = null\r\n this.selectedFileName = '未选择任何文件'\r\n this.$refs.fileInputRef && (this.$refs.fileInputRef.value = '')\r\n this.pageNum = 1\r\n this.fetchList()\r\n }).catch(() => {}).finally(() => {\r\n this.importing = false\r\n })\r\n },\r\n\r\n // ==================== 缓存操作(后端暂未提供) ====================\r\n handleUploadToCache() {\r\n this.$message.info('后端暂未提供该接口')\r\n },\r\n\r\n handleCheckCache() {\r\n this.$message.info('后端暂未提供该接口')\r\n },\r\n\r\n handleDeleteCache() {\r\n this.$message.info('后端暂未提供该接口')\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.plan-import-page {\r\n .search-card {\r\n margin-bottom: 16px;\r\n\r\n .search-form {\r\n .date-range {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n .date-input {\r\n width: 180px;\r\n flex-shrink: 0;\r\n }\r\n }\r\n\r\n .checkbox-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n }\r\n\r\n .form-tip {\r\n color: #f56c6c;\r\n font-size: 12px;\r\n margin-bottom: 12px;\r\n padding-left: 100px;\r\n }\r\n\r\n .search-actions {\r\n display: flex;\r\n justify-content: flex-end;\r\n padding-top: 8px;\r\n }\r\n }\r\n }\r\n\r\n .action-card {\r\n margin-bottom: 16px;\r\n\r\n .action-bar {\r\n display: flex;\r\n flex-wrap: wrap;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 16px;\r\n\r\n .bar-left,\r\n .bar-center,\r\n .bar-right {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 10px;\r\n }\r\n\r\n .bar-right {\r\n margin-left: auto;\r\n }\r\n\r\n .file-area {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n .file-name {\r\n color: #606266;\r\n font-size: 14px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .table-card {\r\n .import-table {\r\n width: 100%;\r\n }\r\n }\r\n}\r\n</style>\r\n"]}]} |