forked from liweijie/education
1 line
20 KiB
JSON
1 line
20 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\\timetableConflict\\index.vue?vue&type=style&index=0&id=ddb2711c&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachBusiness\\timetableConflict\\index.vue","mtime":1787648748780},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoNCi5jb25mbGljdC1wYWdlIHsNCiAgLnNlY3Rpb24tY2FyZCB7DQogICAgYmFja2dyb3VuZDogI2ZmZjsNCiAgICBib3JkZXI6IDFweCBzb2xpZCAjZWJlZWY1Ow0KICAgIGJvcmRlci1yYWRpdXM6IDZweDsNCiAgICBwYWRkaW5nOiAxNnB4IDIwcHg7DQogICAgbWFyZ2luLWJvdHRvbTogMTZweDsNCg0KICAgIC5zZWN0aW9uLXRpdGxlIHsNCiAgICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7DQogICAgICBjb2xvcjogIzMwMzEzMzsNCiAgICB9DQoNCiAgICAuc2VjdGlvbi1oZWFkZXIgew0KICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQogICAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgICBnYXA6IDEycHg7DQogICAgICBtYXJnaW4tYm90dG9tOiAxNnB4Ow0KDQogICAgICAuaGVhZGVyLWFjdGlvbnMgew0KICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgICBnYXA6IDEycHg7DQoNCiAgICAgICAgLnRvb2xiYXItZm9ybSB7DQogICAgICAgICAgbWFyZ2luLXJpZ2h0OiA0cHg7DQoNCiAgICAgICAgICAueWVhci1pdGVtIHsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KDQogICAgLnNlY3Rpb24tZGVzYyB7DQogICAgICBtYXJnaW4tdG9wOiA4cHg7DQogICAgICBmb250LXNpemU6IDEzcHg7DQogICAgICBjb2xvcjogIzkwOTM5OTsNCiAgICB9DQoNCiAgICAuZGV0YWlsLWhlYWRlciB7DQogICAgICBtYXJnaW4tYm90dG9tOiAxMnB4Ow0KICAgIH0NCiAgfQ0KDQogIC8qIOajgOafpemhueWNoeeJh+e9keagvCAqLw0KICAuY2hlY2stZ3JpZCB7DQogICAgZGlzcGxheTogZ3JpZDsNCiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpOw0KICAgIGdhcDogMTZweDsNCiAgfQ0KDQogIC5jaGVjay1pdGVtLWNhcmQgew0KICAgIGJvcmRlcjogMXB4IHNvbGlkICNlYmVlZjU7DQogICAgYm9yZGVyLXJhZGl1czogNnB4Ow0KICAgIHBhZGRpbmc6IDE0cHggMTZweDsNCiAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMnMgZWFzZTsNCiAgICBjdXJzb3I6IHBvaW50ZXI7DQoNCiAgICAmOmhvdmVyIHsNCiAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgwLCAwLCAwLCAwLjA4KTsNCiAgICB9DQoNCiAgICAmLmFjdGl2ZSB7DQogICAgICBib3JkZXItY29sb3I6IHZhcigtLWVkdS1ncmVlbi1wcmltYXJ5LCAjMDA4NzVhKTsNCiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDAsIDEzNSwgOTAsIDAuMTUpOw0KICAgIH0NCg0KICAgIC5jaGVjay1pdGVtLWhlYWRlciB7DQogICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsNCiAgICAgIGdhcDogOHB4Ow0KDQogICAgICAuY2hlY2staXRlbS1uYW1lIHsNCiAgICAgICAgZm9udC1zaXplOiAxNHB4Ow0KICAgICAgICBmb250LXdlaWdodDogNjAwOw0KICAgICAgICBjb2xvcjogIzMwMzEzMzsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAuY2hlY2staXRlbS1kZXNjIHsNCiAgICAgIG1hcmdpbi10b3A6IDhweDsNCiAgICAgIGZvbnQtc2l6ZTogMTJweDsNCiAgICAgIGNvbG9yOiAjOTA5Mzk5Ow0KICAgICAgbGluZS1oZWlnaHQ6IDEuNTsNCiAgICB9DQoNCiAgICAuY2hlY2staXRlbS1mb290ZXIgew0KICAgICAgZGlzcGxheTogZmxleDsNCiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7DQogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQogICAgICBtYXJnaW4tdG9wOiAxMnB4Ow0KDQogICAgICAuY29uZmxpY3QtY291bnQgew0KICAgICAgICBmb250LXNpemU6IDEzcHg7DQogICAgICAgIGNvbG9yOiAjNjA2MjY2Ow0KDQogICAgICAgIGIgew0KICAgICAgICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC5kYW5nZXItdGV4dCB7DQogICAgY29sb3I6ICNmNTZjNmM7DQogICAgZm9udC13ZWlnaHQ6IDcwMDsNCiAgfQ0KDQogIC5ub3JtYWwtdGV4dCB7DQogICAgY29sb3I6ICM2N2MyM2E7DQogICAgZm9udC13ZWlnaHQ6IDcwMDsNCiAgfQ0KDQogIC5hY3RpdmUtbGFiZWwgew0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgICBmb250LXdlaWdodDogNDAwOw0KICAgIGNvbG9yOiB2YXIoLS1lZHUtZ3JlZW4tcHJpbWFyeSwgIzAwODc1YSk7DQogIH0NCg0KICAuZGV0YWlsLWNvdW50IHsNCiAgICBmb250LXNpemU6IDEzcHg7DQogICAgY29sb3I6ICM5MDkzOTk7DQogIH0NCg0KICAuZGV0YWlsLXBhZ2luYXRpb24gew0KICAgIG1hcmdpbi10b3A6IDEycHg7DQogICAgdGV4dC1hbGlnbjogcmlnaHQ7DQogIH0NCn0NCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0RA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/teachBusiness/timetableConflict","sourcesContent":["<template>\r\n <div class=\"app-container conflict-page\">\r\n <!-- 冲突检查区域 -->\r\n <div class=\"section-card\">\r\n <div class=\"section-header\">\r\n <div>\r\n <div class=\"section-title\">教学资源冲突检查</div>\r\n <div class=\"section-desc\">当前检查年度:{{ nd ? nd + ' 年' : '未选择' }},可单独检查或执行全部检查</div>\r\n </div>\r\n <div class=\"header-actions\">\r\n <el-form inline class=\"toolbar-form\" @submit.native.prevent>\r\n <el-form-item label=\"年度\" class=\"year-item\">\r\n <el-select v-model=\"nd\" placeholder=\"请选择年度\" style=\"width: 130px\" @change=\"handleNdChange\">\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>\r\n <el-button size=\"mini\" :disabled=\"loading\" @click=\"handleReset\">重置</el-button>\r\n <el-button type=\"primary\" size=\"mini\" :loading=\"loading\" @click=\"handleCheckAll\">执行全部检查</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- 检查项卡片网格 -->\r\n <div class=\"check-grid\">\r\n <div\r\n v-for=\"item in conflictItems\"\r\n :key=\"item.key\"\r\n class=\"check-item-card\"\r\n :class=\"{ active: activeKey === item.key }\"\r\n @click=\"selectCard(item)\"\r\n >\r\n <div class=\"check-item-header\">\r\n <span class=\"check-item-name\">{{ item.label }}</span>\r\n <el-tag :type=\"getStatus(item).type\" size=\"mini\">{{ getStatus(item).text }}</el-tag>\r\n </div>\r\n <div class=\"check-item-desc\">{{ item.desc }}</div>\r\n <div class=\"check-item-footer\">\r\n <span class=\"conflict-count\">\r\n 冲突数:\r\n <b :class=\"item.count > 0 ? 'danger-text' : 'normal-text'\">{{ item.count }}</b>\r\n </span>\r\n <el-button type=\"primary\" plain size=\"mini\" :disabled=\"loading\" @click.stop=\"handleCheck(item)\">检查</el-button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 冲突明细区域 -->\r\n <div class=\"section-card\">\r\n <div class=\"section-header detail-header\">\r\n <div class=\"section-title\">\r\n 冲突明细\r\n <span v-if=\"activeKey\" class=\"active-label\">— {{ activeLabel }}</span>\r\n </div>\r\n <span v-if=\"activeKey\" class=\"detail-count\">共 {{ detailTotal }} 条记录</span>\r\n </div>\r\n <template v-if=\"activeKey\">\r\n <el-table v-loading=\"detailLoading\" :data=\"activeDetails\" border stripe size=\"mini\" max-height=\"500\">\r\n <el-table-column type=\"index\" label=\"序号\" width=\"55\" align=\"center\" />\r\n <el-table-column label=\"冲突号\" width=\"90\" align=\"center\" show-overflow-tooltip>\r\n <template slot-scope=\"scope\">{{ scope.row.conflictNo || '-' }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"courseNames\" label=\"课程\" min-width=\"150\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column label=\"日期\" width=\"100\" align=\"center\">\r\n <template slot-scope=\"scope\">{{ fmtDate(scope.row.rq) }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"jc\" label=\"节次\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"xydNames\" label=\"班次\" min-width=\"140\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"teacherNames\" label=\"教员\" min-width=\"120\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"classroomNames\" label=\"场地\" min-width=\"140\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"responsibleDept\" label=\"责任单位\" min-width=\"110\" align=\"center\" show-overflow-tooltip />\r\n </el-table>\r\n <el-pagination\r\n v-if=\"detailTotal > 0\"\r\n class=\"detail-pagination\"\r\n background\r\n layout=\"total, prev, pager, next\"\r\n :current-page=\"detailQuery.pageNum\"\r\n :page-size=\"detailQuery.pageSize\"\r\n :total=\"detailTotal\"\r\n @current-change=\"handlePageChange\"\r\n />\r\n <el-empty v-if=\"detailTotal === 0 && !detailLoading\" description=\"暂无冲突明细\" />\r\n </template>\r\n <el-empty v-else v-show=\"!loading\" description=\"点击上方卡片「检查」按钮,在此查看冲突明细\" />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { checkConflict, checkAllConflict, resetConflict, getConflictDetails } from '@/api/teachBusiness/timetableConflict'\r\nimport { listAllSemester } from '@/api/teachBusiness/semester'\r\n\r\n// 四类检查卡片定义(标题/描述与后端 TimetableConflictDimension 枚举一致,作为页面布局常量;\r\n// 检查状态与冲突数完全来自后端接口)\r\nconst CARD_DEFS = [\r\n { key: 'TEAM_CONFLICT', label: '教学班时间冲突检查', desc: '同一教学班次在同一时间段被安排多门课程' },\r\n { key: 'ELECTIVE_REQUIRED_CONFLICT', label: '教学班必修与选修时间冲突检查', desc: '教学班次必修课与选修课时间重叠' },\r\n { key: 'TEACHER_CONFLICT', label: '教员时间冲突检查', desc: '同一教员在同一时间段被安排多门课程' },\r\n { key: 'CLASSROOM_CONFLICT', label: '教室时间冲突检查', desc: '同一教室在同一时间段被多门课程占用' }\r\n]\r\n\r\nexport default {\r\n name: 'TimetableConflict',\r\n data() {\r\n return {\r\n loading: false,\r\n detailLoading: false,\r\n // 年度(数据来自 /semester/all,真实后端数据)\r\n nd: undefined,\r\n yearOptions: [],\r\n conflictItems: CARD_DEFS.map(c => ({ ...c, count: 0, checked: false })),\r\n activeKey: '',\r\n activeDetails: [],\r\n detailTotal: 0,\r\n detailQuery: { pageNum: 1, pageSize: 20 }\r\n }\r\n },\r\n computed: {\r\n activeLabel() {\r\n const item = this.conflictItems.find(i => i.key === this.activeKey)\r\n return item ? item.label : ''\r\n }\r\n },\r\n created() {\r\n this.loadYearOptions()\r\n },\r\n methods: {\r\n /* ---------- 年度下拉(数据来自 /semester/all) ---------- */\r\n loadYearOptions() {\r\n return listAllSemester().then(response => {\r\n const list = response.data || []\r\n // 去重并按年度倒序\r\n const map = {}\r\n list.forEach(item => {\r\n if (item.nd !== null && item.nd !== undefined && item.nd !== '') map[item.nd] = item\r\n })\r\n const arr = Object.keys(map).sort((a, b) => String(b).localeCompare(String(a)))\r\n this.yearOptions = arr\r\n // 默认年度:优先当前学期(dqxq=true),否则取最新年度\r\n const current = list.find(item => item.dqxq === true)\r\n this.nd = (current && current.nd) || arr[0]\r\n return arr\r\n }).catch(() => {\r\n this.yearOptions = []\r\n this.nd = undefined\r\n return []\r\n })\r\n },\r\n fmtDate(rq) {\r\n return (rq || '').substring(0, 10)\r\n },\r\n getStatus(item) {\r\n if (!item.checked) return { type: 'info', text: '未检查' }\r\n return item.count > 0\r\n ? { type: 'danger', text: '存在 ' + item.count + ' 处冲突' }\r\n : { type: 'success', text: '无冲突' }\r\n },\r\n /* 用后端返回的单卡片结果同步对应卡片状态 */\r\n applyCard(card) {\r\n if (!card) return\r\n const item = this.conflictItems.find(i => i.key === card.dimensionCode)\r\n if (!item) return\r\n item.checked = card.checked\r\n item.count = card.conflictCount\r\n },\r\n applySummary(summary) {\r\n if (!summary || !summary.cards) return\r\n summary.cards.forEach(card => this.applyCard(card))\r\n },\r\n /* ---------- 单个检查 ---------- */\r\n handleCheck(item) {\r\n if (!this.nd) {\r\n this.$message.warning('请先选择年度')\r\n return\r\n }\r\n this.loading = true\r\n checkConflict({ nd: this.nd, dimensionCode: item.key }).then(response => {\r\n this.applyCard(response.data)\r\n this.activeKey = item.key\r\n this.detailQuery.pageNum = 1\r\n this.loadDetails()\r\n if (item.count > 0) {\r\n this.$message.warning('「' + item.label + '」检查完成,发现 ' + item.count + ' 处冲突')\r\n } else {\r\n this.$message.success('「' + item.label + '」检查完成,未发现冲突')\r\n }\r\n }).finally(() => {\r\n this.loading = false\r\n })\r\n },\r\n /* ---------- 全部检查 ---------- */\r\n handleCheckAll() {\r\n if (!this.nd) {\r\n this.$message.warning('请先选择年度')\r\n return\r\n }\r\n this.loading = true\r\n checkAllConflict({ nd: this.nd }).then(response => {\r\n const summary = response.data\r\n this.applySummary(summary)\r\n const total = summary ? summary.totalConflictCount : 0\r\n this.$message.success('全部检查完成,共发现 ' + total + ' 处冲突')\r\n const firstConflict = this.conflictItems.find(i => i.checked && i.count > 0)\r\n const firstChecked = this.conflictItems.find(i => i.checked)\r\n this.activeKey = firstConflict ? firstConflict.key : (firstChecked ? firstChecked.key : '')\r\n this.detailQuery.pageNum = 1\r\n if (this.activeKey) {\r\n this.loadDetails()\r\n } else {\r\n this.activeDetails = []\r\n this.detailTotal = 0\r\n }\r\n }).finally(() => {\r\n this.loading = false\r\n })\r\n },\r\n /* ---------- 重置 ---------- */\r\n handleReset() {\r\n if (!this.nd) {\r\n this.$message.warning('请先选择年度')\r\n return\r\n }\r\n resetConflict({ nd: this.nd }).then(response => {\r\n this.applySummary(response.data)\r\n this.activeKey = ''\r\n this.activeDetails = []\r\n this.detailTotal = 0\r\n this.$message.success('检查结果已重置')\r\n })\r\n },\r\n /* 点击卡片:仅已检查的卡片可查看其明细 */\r\n selectCard(item) {\r\n if (!item.checked) return\r\n this.activeKey = item.key\r\n this.detailQuery.pageNum = 1\r\n this.loadDetails()\r\n },\r\n /* ---------- 冲突明细 ---------- */\r\n loadDetails() {\r\n if (!this.activeKey) {\r\n this.activeDetails = []\r\n this.detailTotal = 0\r\n return\r\n }\r\n this.detailLoading = true\r\n getConflictDetails({\r\n nd: this.nd,\r\n dimensionCode: this.activeKey,\r\n pageNum: this.detailQuery.pageNum,\r\n pageSize: this.detailQuery.pageSize\r\n }).then(response => {\r\n const page = response.data || {}\r\n this.activeDetails = page.records || []\r\n this.detailTotal = page.total || 0\r\n }).catch(() => {\r\n this.activeDetails = []\r\n this.detailTotal = 0\r\n }).finally(() => {\r\n this.detailLoading = false\r\n })\r\n },\r\n handlePageChange(page) {\r\n this.detailQuery.pageNum = page\r\n this.loadDetails()\r\n },\r\n /* 切换年度:该年度检查状态未知,重置为未检查 */\r\n handleNdChange() {\r\n this.conflictItems.forEach(i => {\r\n i.checked = false\r\n i.count = 0\r\n })\r\n this.activeKey = ''\r\n this.activeDetails = []\r\n this.detailTotal = 0\r\n this.detailQuery.pageNum = 1\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.conflict-page {\r\n .section-card {\r\n background: #fff;\r\n border: 1px solid #ebeef5;\r\n border-radius: 6px;\r\n padding: 16px 20px;\r\n margin-bottom: 16px;\r\n\r\n .section-title {\r\n font-size: 16px;\r\n font-weight: 700;\r\n color: #303133;\r\n }\r\n\r\n .section-header {\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 .header-actions {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n\r\n .toolbar-form {\r\n margin-right: 4px;\r\n\r\n .year-item {\r\n margin-bottom: 0;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .section-desc {\r\n margin-top: 8px;\r\n font-size: 13px;\r\n color: #909399;\r\n }\r\n\r\n .detail-header {\r\n margin-bottom: 12px;\r\n }\r\n }\r\n\r\n /* 检查项卡片网格 */\r\n .check-grid {\r\n display: grid;\r\n grid-template-columns: repeat(2, 1fr);\r\n gap: 16px;\r\n }\r\n\r\n .check-item-card {\r\n border: 1px solid #ebeef5;\r\n border-radius: 6px;\r\n padding: 14px 16px;\r\n transition: box-shadow 0.2s ease;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\r\n }\r\n\r\n &.active {\r\n border-color: var(--edu-green-primary, #00875a);\r\n box-shadow: 0 0 0 2px rgba(0, 135, 90, 0.15);\r\n }\r\n\r\n .check-item-header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 8px;\r\n\r\n .check-item-name {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #303133;\r\n }\r\n }\r\n\r\n .check-item-desc {\r\n margin-top: 8px;\r\n font-size: 12px;\r\n color: #909399;\r\n line-height: 1.5;\r\n }\r\n\r\n .check-item-footer {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-top: 12px;\r\n\r\n .conflict-count {\r\n font-size: 13px;\r\n color: #606266;\r\n\r\n b {\r\n font-size: 18px;\r\n }\r\n }\r\n }\r\n }\r\n\r\n .danger-text {\r\n color: #f56c6c;\r\n font-weight: 700;\r\n }\r\n\r\n .normal-text {\r\n color: #67c23a;\r\n font-weight: 700;\r\n }\r\n\r\n .active-label {\r\n font-size: 14px;\r\n font-weight: 400;\r\n color: var(--edu-green-primary, #00875a);\r\n }\r\n\r\n .detail-count {\r\n font-size: 13px;\r\n color: #909399;\r\n }\r\n\r\n .detail-pagination {\r\n margin-top: 12px;\r\n text-align: right;\r\n }\r\n}\r\n</style>\r\n"]}]} |