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

1 line
18 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\\classHour\\subsidy\\index.vue?vue&type=script&lang=js","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\classHour\\subsidy\\index.vue","mtime":1787567871602},{"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\\babel-loader\\lib\\index.js","mtime":1787309793142},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJw0KaW1wb3J0IHsNCiAgbGlzdEhvdXJTdGF0aXN0aWNzLA0KICBleHBvcnRIb3VyU3RhdGlzdGljcywNCiAgbGlzdEZlZVN0YXRpc3RpY3MsDQogIGV4cG9ydEZlZVN0YXRpc3RpY3MNCn0gZnJvbSAnQC9hcGkvY2xhc3NIb3VyL2hvdXJTdGF0Jw0KDQpleHBvcnQgZGVmYXVsdCB7DQogIG5hbWU6ICdTdWJzaWR5SW5kZXgnLA0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSBUYWIgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIGFjdGl2ZVRhYjogJ2hvdXInLA0KDQogICAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDor77ml7bnu5/orqHmn6Xor6LmnaHku7YgPT09PT09PT09PT09PT09PT09PT0NCiAgICAgIGhvdXJGb3JtOiB7DQogICAgICAgIG5kOiAnJywNCiAgICAgICAgeHE6ICcnLA0KICAgICAgICBqeXhtOiAnJw0KICAgICAgfSwNCg0KICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT0g6K++5pe26LS557uf6K6h5p+l6K+i5p2h5Lu2ID09PT09PT09PT09PT09PT09PT09DQogICAgICBmZWVGb3JtOiB7DQogICAgICAgIG5kOiAnJywNCiAgICAgICAgeHE6ICcnLA0KICAgICAgICBqeXhtOiAnJywNCiAgICAgICAga3NmYnpiaDogJycNCiAgICAgIH0sDQoNCiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09IOWQhCBUYWIg5YiX6KGo54q25oCBID09PT09PT09PT09PT09PT09PT09DQogICAgICBob3VyU3RhdGU6IHRoaXMuY3JlYXRlRW1wdHlTdGF0ZSgpLA0KICAgICAgZmVlU3RhdGU6IHRoaXMuY3JlYXRlRW1wdHlTdGF0ZSgpDQogICAgfQ0KICB9LA0KICBjb21wdXRlZDogew0KICAgIGN1cnJlbnRGb3JtKCkgew0KICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGFiID09PSAnaG91cicgPyB0aGlzLmhvdXJGb3JtIDogdGhpcy5mZWVGb3JtDQogICAgfSwNCiAgICBjdXJyZW50U3RhdGUoKSB7DQogICAgICByZXR1cm4gdGhpcy5hY3RpdmVUYWIgPT09ICdob3VyJyA/IHRoaXMuaG91clN0YXRlIDogdGhpcy5mZWVTdGF0ZQ0KICAgIH0NCiAgfSwNCiAgbW91bnRlZCgpIHsNCiAgICB0aGlzLmZldGNoTGlzdCgpDQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICBjcmVhdGVFbXB0eVN0YXRlKCkgew0KICAgICAgcmV0dXJuIHsgbGlzdDogW10sIGxvYWRpbmc6IGZhbHNlLCBwYWdlTnVtOiAxLCBwYWdlU2l6ZTogMjAsIHRvdGFsOiAwIH0NCiAgICB9LA0KDQogICAgLyoqIOaehOW7uuafpeivouWPguaVsO+8jOS7heS8oOmdnuepuuWtl+aute+8iOS4juWQjuerryBRdWVyeSDlrZfmrrXkuIDoh7TvvIkgKi8NCiAgICBidWlsZFBhcmFtcyhmb3JtKSB7DQogICAgICBjb25zdCBwYXJhbXMgPSB7fQ0KICAgICAgaWYgKGZvcm0ubmQgJiYgZm9ybS5uZC50cmltKCkpIHBhcmFtcy5uZCA9IGZvcm0ubmQudHJpbSgpDQogICAgICBpZiAoZm9ybS54cSAmJiBmb3JtLnhxLnRyaW0oKSkgcGFyYW1zLnhxID0gZm9ybS54cS50cmltKCkNCiAgICAgIGlmIChmb3JtLmp5eG0gJiYgZm9ybS5qeXhtLnRyaW0oKSkgcGFyYW1zLmp5eG0gPSBmb3JtLmp5eG0udHJpbSgpDQogICAgICBpZiAoZm9ybS5rc2ZiemJoICYmIGZvcm0ua3NmYnpiaC50cmltKCkpIHBhcmFtcy5rc2ZiemJoID0gZm9ybS5rc2ZiemJoLnRyaW0oKQ0KICAgICAgcmV0dXJuIHBhcmFtcw0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDmn6Xor6IgPT09PT09PT09PT09PT09PT09PT0NCiAgICBmZXRjaExpc3QoKSB7DQogICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY3VycmVudFN0YXRlDQogICAgICBjb25zdCBmb3JtID0gdGhpcy5jdXJyZW50Rm9ybQ0KICAgICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmFzc2lnbigNCiAgICAgICAgeyBwYWdlTnVtOiBzdGF0ZS5wYWdlTnVtLCBwYWdlU2l6ZTogc3RhdGUucGFnZVNpemUgfSwNCiAgICAgICAgdGhpcy5idWlsZFBhcmFtcyhmb3JtKQ0KICAgICAgKQ0KICAgICAgc3RhdGUubG9hZGluZyA9IHRydWUNCiAgICAgIGNvbnN0IHJlcSA9IHRoaXMuYWN0aXZlVGFiID09PSAnaG91cicgPyBsaXN0SG91clN0YXRpc3RpY3MocGFyYW1zKSA6IGxpc3RGZWVTdGF0aXN0aWNzKHBhcmFtcykNCiAgICAgIHJlcS50aGVuKHJlcyA9PiB7DQogICAgICAgIGNvbnN0IGRhdGEgPSAocmVzICYmIHJlcy5kYXRhKSB8fCB7fQ0KICAgICAgICBzdGF0ZS5saXN0ID0gZGF0YS5yZWNvcmRzIHx8IFtdDQogICAgICAgIHN0YXRlLnRvdGFsID0gZGF0YS50b3RhbCB8fCAwDQogICAgICB9KS5jYXRjaCgoKSA9PiB7DQogICAgICAgIHN0YXRlLmxpc3QgPSBbXQ0KICAgICAgICBzdGF0ZS50b3RhbCA9IDANCiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gew0KICAgICAgICBzdGF0ZS5sb2FkaW5nID0gZmFsc2UNCiAgICAgIH0pDQogICAgfSwNCg0KICAgIGhhbmRsZVRhYkNsaWNrKCkgew0KICAgICAgdGhpcy5jdXJyZW50U3RhdGUucGFnZU51bSA9IDENCiAgICAgIHRoaXMuZmV0Y2hMaXN0KCkNCiAgICB9LA0KDQogICAgaGFuZGxlUXVlcnkoKSB7DQogICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5wYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgIH0sDQoNCiAgICBoYW5kbGVQYWdlQ2hhbmdlKHBhZ2UpIHsNCiAgICAgIHRoaXMuY3VycmVudFN0YXRlLnBhZ2VOdW0gPSBwYWdlDQogICAgICB0aGlzLmZldGNoTGlzdCgpDQogICAgfSwNCg0KICAgIGhhbmRsZVNpemVDaGFuZ2Uoc2l6ZSkgew0KICAgICAgdGhpcy5jdXJyZW50U3RhdGUucGFnZVNpemUgPSBzaXplDQogICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5wYWdlTnVtID0gMQ0KICAgICAgdGhpcy5mZXRjaExpc3QoKQ0KICAgIH0sDQoNCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PSDlr7zlh7ogPT09PT09PT09PT09PT09PT09PT0NCiAgICBoYW5kbGVFeHBvcnQoKSB7DQogICAgICBjb25zdCBjbGVhbiA9IHRoaXMuYnVpbGRQYXJhbXModGhpcy5jdXJyZW50Rm9ybSkNCiAgICAgIGNvbnN0IGlzSG91ciA9IHRoaXMuYWN0aXZlVGFiID09PSAnaG91cicNCiAgICAgIGNvbnN0IHJlcSA9IGlzSG91ciA/IGV4cG9ydEhvdXJTdGF0aXN0aWNzKGNsZWFuKSA6IGV4cG9ydEZlZVN0YXRpc3RpY3MoY2xlYW4pDQogICAgICBjb25zdCBmaWxlTmFtZSA9IGlzSG91ciA/ICfor77ml7bnu5/orqEueGxzeCcgOiAn6K++5pe26LS557uf6K6hLnhsc3gnDQogICAgICByZXEudGhlbihibG9iID0+IHsNCiAgICAgICAgc2F2ZUFzKGJsb2IsIGZpbGVOYW1lKQ0KICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+WvvOWHuuaIkOWKnycpDQogICAgICB9KS5jYXRjaCgoKSA9PiB7fSkNCiAgICB9LA0KDQogICAgLyoqIOaVsOWAvOepuuWAvOaYvuekuuS4uiAnLSfvvIjkv53nlZkgMO+8iSAqLw0KICAgIGZtdFZhbHVlKHZhbCkgew0KICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCA/ICctJyA6IHZhbA0KICAgIH0NCiAgfQ0KfQ0K"},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/classHour/subsidy","sourcesContent":["<template>\r\n <div class=\"app-container subsidy-page\">\r\n <div class=\"list-title\">课时补助核算</div>\r\n\r\n <!-- ==================== Tab 切换 ==================== -->\r\n <el-tabs v-model=\"activeTab\" @tab-click=\"handleTabClick\">\r\n <el-tab-pane label=\"课时统计\" name=\"hour\" />\r\n <el-tab-pane label=\"课时费统计\" name=\"fee\" />\r\n </el-tabs>\r\n\r\n <!-- ==================== 1. 查询条件 ==================== -->\r\n <!-- 课时统计 -->\r\n <el-card v-if=\"activeTab === 'hour'\" shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"hourForm\" label-width=\"100px\" class=\"search-form\" @submit.native.prevent>\r\n <el-row :gutter=\"24\">\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"6\">\r\n <el-form-item label=\"学期年度\">\r\n <el-input v-model=\"hourForm.nd\" placeholder=\"如 2026\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"6\">\r\n <el-form-item label=\"学期序号\">\r\n <el-input v-model=\"hourForm.xq\" placeholder=\"如 1\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"6\">\r\n <el-form-item label=\"教员姓名\">\r\n <el-input v-model=\"hourForm.jyxm\" placeholder=\"请输入教员姓名\" clearable @keyup.enter.native=\"handleQuery\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"6\" class=\"search-actions-col\">\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" @click=\"handleQuery\">查询</el-button>\r\n <el-button type=\"primary\" plain @click=\"handleExport\">导出 Excel</el-button>\r\n </div>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </el-card>\r\n\r\n <!-- 课时费统计 -->\r\n <el-card v-else shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"feeForm\" label-width=\"100px\" class=\"search-form\" @submit.native.prevent>\r\n <el-row :gutter=\"24\">\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"6\">\r\n <el-form-item label=\"学期年度\">\r\n <el-input v-model=\"feeForm.nd\" placeholder=\"如 2026\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"6\">\r\n <el-form-item label=\"学期序号\">\r\n <el-input v-model=\"feeForm.xq\" placeholder=\"如 1\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"6\">\r\n <el-form-item label=\"教员姓名\">\r\n <el-input v-model=\"feeForm.jyxm\" placeholder=\"请输入教员姓名\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :xs=\"24\" :sm=\"12\" :md=\"6\">\r\n <el-form-item label=\"标准编号\">\r\n <el-input v-model=\"feeForm.ksfbzbh\" placeholder=\"课时费标准编号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"24\" class=\"search-actions-col\">\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" @click=\"handleQuery\">查询</el-button>\r\n <el-button type=\"primary\" plain @click=\"handleExport\">导出 Excel</el-button>\r\n </div>\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=\"table-card\">\r\n <div class=\"table-title\">{{ activeTab === 'hour' ? '课时统计列表' : '课时费统计列表' }}</div>\r\n <el-table v-loading=\"currentState.loading\" :data=\"currentState.list\" border stripe style=\"width: 100%\">\r\n <el-table-column type=\"index\" label=\"序号\" width=\"55\" align=\"center\" />\r\n <el-table-column prop=\"jysdh\" label=\"教研室代号\" width=\"100\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"jysmc\" label=\"教研室名称\" width=\"120\" show-overflow-tooltip />\r\n <el-table-column prop=\"jybh\" label=\"教员编号\" width=\"110\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"jyxm\" label=\"教员姓名\" width=\"100\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"zc\" label=\"职称\" width=\"90\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"nf\" label=\"年份\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"sbn\" label=\"上半年\" width=\"90\" align=\"right\" header-align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtValue(row.sbn) }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"xbn\" label=\"下半年\" width=\"90\" align=\"right\" header-align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtValue(row.xbn) }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"zj\" label=\"总计\" width=\"90\" align=\"right\" header-align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtValue(row.zj) }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"bzksl\" label=\"标准课时量\" width=\"100\" align=\"right\" header-align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtValue(row.bzksl) }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"cks\" label=\"超课时\" width=\"90\" align=\"right\" header-align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtValue(row.cks) }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"jsgs\" label=\"计算过程\" min-width=\"140\" show-overflow-tooltip />\r\n <el-table-column prop=\"jg\" label=\"结果\" width=\"90\" align=\"right\" header-align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtValue(row.jg) }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"ksfbzmc\" label=\"课时费标准\" width=\"110\" align=\"center\" show-overflow-tooltip />\r\n <el-table-column prop=\"ksfbz\" label=\"课时费单价\" width=\"100\" align=\"right\" header-align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtValue(row.ksfbz) }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"clksfbz\" label=\"超量课时费单价\" width=\"110\" align=\"right\" header-align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtValue(row.clksfbz) }}</template>\r\n </el-table-column>\r\n </el-table>\r\n\r\n <el-pagination\r\n :current-page=\"currentState.pageNum\"\r\n :page-size=\"currentState.pageSize\"\r\n :total=\"currentState.total\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n class=\"pagination\"\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 { saveAs } from 'file-saver'\r\nimport {\r\n listHourStatistics,\r\n exportHourStatistics,\r\n listFeeStatistics,\r\n exportFeeStatistics\r\n} from '@/api/classHour/hourStat'\r\n\r\nexport default {\r\n name: 'SubsidyIndex',\r\n data() {\r\n return {\r\n // ==================== Tab ====================\r\n activeTab: 'hour',\r\n\r\n // ==================== 课时统计查询条件 ====================\r\n hourForm: {\r\n nd: '',\r\n xq: '',\r\n jyxm: ''\r\n },\r\n\r\n // ==================== 课时费统计查询条件 ====================\r\n feeForm: {\r\n nd: '',\r\n xq: '',\r\n jyxm: '',\r\n ksfbzbh: ''\r\n },\r\n\r\n // ==================== 各 Tab 列表状态 ====================\r\n hourState: this.createEmptyState(),\r\n feeState: this.createEmptyState()\r\n }\r\n },\r\n computed: {\r\n currentForm() {\r\n return this.activeTab === 'hour' ? this.hourForm : this.feeForm\r\n },\r\n currentState() {\r\n return this.activeTab === 'hour' ? this.hourState : this.feeState\r\n }\r\n },\r\n mounted() {\r\n this.fetchList()\r\n },\r\n methods: {\r\n createEmptyState() {\r\n return { list: [], loading: false, pageNum: 1, pageSize: 20, total: 0 }\r\n },\r\n\r\n /** 构建查询参数,仅传非空字段(与后端 Query 字段一致) */\r\n buildParams(form) {\r\n const params = {}\r\n if (form.nd && form.nd.trim()) params.nd = form.nd.trim()\r\n if (form.xq && form.xq.trim()) params.xq = form.xq.trim()\r\n if (form.jyxm && form.jyxm.trim()) params.jyxm = form.jyxm.trim()\r\n if (form.ksfbzbh && form.ksfbzbh.trim()) params.ksfbzbh = form.ksfbzbh.trim()\r\n return params\r\n },\r\n\r\n // ==================== 查询 ====================\r\n fetchList() {\r\n const state = this.currentState\r\n const form = this.currentForm\r\n const params = Object.assign(\r\n { pageNum: state.pageNum, pageSize: state.pageSize },\r\n this.buildParams(form)\r\n )\r\n state.loading = true\r\n const req = this.activeTab === 'hour' ? listHourStatistics(params) : listFeeStatistics(params)\r\n req.then(res => {\r\n const data = (res && res.data) || {}\r\n state.list = data.records || []\r\n state.total = data.total || 0\r\n }).catch(() => {\r\n state.list = []\r\n state.total = 0\r\n }).finally(() => {\r\n state.loading = false\r\n })\r\n },\r\n\r\n handleTabClick() {\r\n this.currentState.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handleQuery() {\r\n this.currentState.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handlePageChange(page) {\r\n this.currentState.pageNum = page\r\n this.fetchList()\r\n },\r\n\r\n handleSizeChange(size) {\r\n this.currentState.pageSize = size\r\n this.currentState.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n // ==================== 导出 ====================\r\n handleExport() {\r\n const clean = this.buildParams(this.currentForm)\r\n const isHour = this.activeTab === 'hour'\r\n const req = isHour ? exportHourStatistics(clean) : exportFeeStatistics(clean)\r\n const fileName = isHour ? '课时统计.xlsx' : '课时费统计.xlsx'\r\n req.then(blob => {\r\n saveAs(blob, fileName)\r\n this.$message.success('导出成功')\r\n }).catch(() => {})\r\n },\r\n\r\n /** 数值空值显示为 '-'(保留 0) */\r\n fmtValue(val) {\r\n return val === null || val === undefined ? '-' : val\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.subsidy-page {\r\n .list-title {\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 12px;\r\n }\r\n\r\n // ==================== 1. 查询条件区域 ====================\r\n .search-card {\r\n margin-bottom: 16px;\r\n\r\n .search-form {\r\n .search-actions-col {\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n .search-actions {\r\n display: flex;\r\n gap: 12px;\r\n }\r\n }\r\n }\r\n\r\n // ==================== 2. 数据表格 ====================\r\n .table-card {\r\n .table-title {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 12px;\r\n }\r\n\r\n .pagination {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 12px;\r\n }\r\n }\r\n}\r\n</style>\r\n"]}]}