forked from liweijie/education
1 line
68 KiB
JSON
1 line
68 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\\teachingLog\\organLog\\index.vue?vue&type=style&index=2&id=31859a28&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\teachingLog\\organLog\\index.vue","mtime":1787311575928},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKDQoucGFnZS1jb250YWluZXIgew0KICBwYWRkaW5nOiAyMHB4Ow0KfQ0KDQoucGFnZS10aXRsZSB7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LXdlaWdodDogNjAwOw0KICBjb2xvcjogIzMwMzEzMzsNCiAgbWFyZ2luLWJvdHRvbTogMjBweDsNCn0NCg0KLnNlYXJjaC1jYXJkIHsNCiAgbWFyZ2luLWJvdHRvbTogMTZweDsNCg0KICAuc2VhcmNoLWZvcm0gew0KICAgIC53LWZ1bGwgew0KICAgICAgd2lkdGg6IDEwMCU7DQogICAgfQ0KDQogICAgLmVsLXJvdyB7DQogICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2ViZWVmNTsNCg0KICAgICAgJjpsYXN0LWNoaWxkIHsNCiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAuZWwtY29sIHsNCiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNlYmVlZjU7DQoNCiAgICAgICY6bGFzdC1jaGlsZCB7DQogICAgICAgIGJvcmRlci1yaWdodDogbm9uZTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAuZWwtZm9ybS1pdGVtIHsNCiAgICAgIG1hcmdpbi1ib3R0b206IDA7DQogICAgICBwYWRkaW5nOiAxMnB4Ow0KICAgIH0NCg0KICAgIC5jaGFuZ2Utb3B0aW9ucyB7DQogICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsNCiAgICAgIGdhcDogOHB4Ow0KDQogICAgICAuZWwtcmFkaW8tZ3JvdXAsDQogICAgICAuZWwtY2hlY2tib3gtZ3JvdXAgew0KICAgICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAgICBmbGV4LXdyYXA6IHdyYXA7DQogICAgICAgIGdhcDogMTJweDsNCiAgICAgIH0NCg0KICAgICAgJi5kaXNhYmxlZCB7DQogICAgICAgIG9wYWNpdHk6IDAuNjsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICAuc2VhcmNoLWFjdGlvbnMgew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsNCiAgICBwYWRkaW5nOiAxMnB4Ow0KICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWJlZWY1Ow0KICB9DQp9DQoNCi50YWJsZS1jYXJkIHsNCiAgLmVsLXRhYmxlIHsNCiAgICB3aWR0aDogMTAwJTsNCiAgfQ0KfQ0K"},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAskDA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/teachingLog/organLog","sourcesContent":["<script setup lang=\"ts\">\r\nimport { onMounted, ref } from 'vue'\r\n\r\nimport { ElMessage, ElMessageBox } from 'element-plus'\r\nimport { formatDate } from '@/utils/format'\r\nimport {\r\n getTeachingLogList,\r\n deleteTeachingLog,\r\n batchReportTeachingLog,\r\n recheckTeachingLog,\r\n exportTeachingLogWord,\r\n importTeachingLogExcel,\r\n downloadTeachingLogTemplate,\r\n getTeachingLogByBh,\r\n type TeachingLogItem,\r\n type TeachingLogListParams\r\n} from '@/api/log'\r\n\r\nconst pageTitle = ref('教学日志管理查询')\r\n\r\n// ==================== 查询表单 ====================\r\ninterface SearchForm {\r\n ksrq: string\r\n ksrqEnabled: boolean\r\n jsrq: string\r\n jsrqEnabled: boolean\r\n kcmc: string\r\n kcmcEnabled: boolean\r\n jys: string\r\n jysEnabled: boolean\r\n jxff: string\r\n jxffEnabled: boolean\r\n rzzt: string\r\n rzztEnabled: boolean\r\n skjy: string\r\n skjyEnabled: boolean\r\n pxqb: string\r\n pxqbEnabled: boolean\r\n changeType: string\r\n changeTypeEnabled: boolean\r\n changeTypes: string[]\r\n rwlb: string\r\n rwlbEnabled: boolean\r\n}\r\n\r\nconst searchForm = ref<SearchForm>({\r\n ksrq: '',\r\n ksrqEnabled: false,\r\n jsrq: '',\r\n jsrqEnabled: false,\r\n kcmc: '',\r\n kcmcEnabled: false,\r\n jys: '教研室',\r\n jysEnabled: false,\r\n jxff: '理论讲授',\r\n jxffEnabled: false,\r\n rzzt: '教务部门导入教员类',\r\n rzztEnabled: false,\r\n skjy: '教务处',\r\n skjyEnabled: false,\r\n pxqb: '',\r\n pxqbEnabled: false,\r\n changeType: '与教学计划一致',\r\n changeTypeEnabled: false,\r\n changeTypes: [],\r\n rwlb: '全军院校训练规划内任务',\r\n rwlbEnabled: false\r\n})\r\n\r\nconst jysOptions = ['教研室', '防空兵系', '通信工程系', '装甲兵系']\r\nconst jxffOptions = ['理论讲授', '讨论', '实操', '演示', '实验', '演习']\r\nconst skjyOptions = ['教务处', '张三', '李四', '王五', '赵六']\r\nconst rzztOptions = ['教务部门导入教员类', '管理员手工添加']\r\nconst rwlbOptions = ['全军院校训练规划内任务', '其他任务']\r\nconst changeTypeOptions = [\r\n { label: '与教学计划一致', value: '与教学计划一致' },\r\n { label: '已改动教学计划', value: '已改动教学计划' },\r\n { label: '手动拟制', value: '手动拟制' }\r\n]\r\nconst changeTypeList = [\r\n { label: '已改动教员', value: '已改动教员' },\r\n { label: '已改动时间', value: '已改动时间' },\r\n { label: '已改动课目', value: '已改动课目' },\r\n { label: '已改动内容', value: '已改动内容' },\r\n { label: '已改动教学方法', value: '已改动教学方法' },\r\n { label: '已改动场地', value: '已改动场地' },\r\n { label: '已改动期班', value: '已改动期班' }\r\n]\r\n\r\n// ==================== 分页 ====================\r\nconst pageNum = ref(1)\r\nconst pageSize = ref(20)\r\nconst total = ref(0)\r\n\r\n// ==================== 数据表格 ====================\r\nconst loading = ref(false)\r\nconst selectedRows = ref<TeachingLogItem[]>([])\r\nconst tableData = ref<TeachingLogItem[]>([])\r\n\r\nconst handleSelectionChange = (rows: TeachingLogItem[]) => {\r\n selectedRows.value = rows\r\n}\r\n\r\n/** 根据\"勾选启用\"模式构建实际查询参数 */\r\nconst buildSearchParams = (): TeachingLogListParams => {\r\n const form = searchForm.value\r\n const params: TeachingLogListParams = {\r\n pageNum: pageNum.value,\r\n pageSize: pageSize.value\r\n }\r\n if (form.ksrqEnabled && form.ksrq) params.ksrq = form.ksrq\r\n if (form.jsrqEnabled && form.jsrq) params.jsrq = form.jsrq\r\n if (form.kcmcEnabled && form.kcmc) params.kcmc = form.kcmc\r\n if (form.jysEnabled && form.jys) params.jys = form.jys\r\n if (form.jxffEnabled && form.jxff) params.jxff = form.jxff\r\n if (form.rzztEnabled && form.rzzt) params.rzzt = form.rzzt\r\n if (form.skjyEnabled && form.skjy) params.skjy = form.skjy\r\n if (form.pxqbEnabled && form.pxqb) params.pxqb = form.pxqb\r\n if (form.rwlbEnabled && form.rwlb) params.rwlb = form.rwlb\r\n if (form.changeTypeEnabled && form.changeType) params.gdqk = form.changeType\r\n if (form.changeTypeEnabled && form.changeTypes.length > 0) {\r\n params.gdxxqk = form.changeTypes.join(',')\r\n }\r\n return params\r\n}\r\n\r\n/** 从响应中提取列表数据和总数(兼容 records / list / rows 等常见字段名) */\r\nconst extractListData = (res: any) => {\r\n const data = res.data || res\r\n // 兼容多种后端返回格式\r\n const list = data.records || data.list || data.rows || []\r\n const total = data.total ?? data.totalCount ?? data.totalRows ?? 0\r\n return { list, total }\r\n}\r\n\r\n/** 查询(从第 1 页开始) */\r\nconst handleSearch = async () => {\r\n loading.value = true\r\n pageNum.value = 1\r\n try {\r\n const params = buildSearchParams()\r\n const res = await getTeachingLogList(params)\r\n if (res.code === 200 || res.code === 0) {\r\n const { list, total: totalCount } = extractListData(res)\r\n tableData.value = list\r\n total.value = totalCount\r\n }\r\n } catch {\r\n // 错误已由拦截器统一处理\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\n/** 分页变化 */\r\nconst handlePageChange = async (page: number) => {\r\n pageNum.value = page\r\n loading.value = true\r\n try {\r\n const params = buildSearchParams()\r\n const res = await getTeachingLogList(params)\r\n if (res.code === 200 || res.code === 0) {\r\n const { list, total: totalCount } = extractListData(res)\r\n tableData.value = list\r\n total.value = totalCount\r\n }\r\n } catch {\r\n // 错误已由拦截器统一处理\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\n/** 每页条数变化 */\r\nconst handleSizeChange = async (size: number) => {\r\n pageSize.value = size\r\n pageNum.value = 1\r\n loading.value = true\r\n try {\r\n const params = buildSearchParams()\r\n const res = await getTeachingLogList(params)\r\n if (res.code === 200 || res.code === 0) {\r\n const { list, total: totalCount } = extractListData(res)\r\n tableData.value = list\r\n total.value = totalCount\r\n }\r\n } catch {\r\n // 错误已由拦截器统一处理\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\n/** 刷新(重新加载当前页) */\r\nconst handleRefresh = async () => {\r\n loading.value = true\r\n try {\r\n const params = buildSearchParams()\r\n const res = await getTeachingLogList(params)\r\n if (res.code === 200 || res.code === 0) {\r\n const { list, total: totalCount } = extractListData(res)\r\n tableData.value = list\r\n total.value = totalCount\r\n }\r\n } catch {\r\n // 错误已由拦截器统一处理\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\n// 页面加载时自动查询\r\nonMounted(() => {\r\n handleSearch()\r\n})\r\n\r\n/** 批量删除 */\r\nconst handleDeleteSelected = async () => {\r\n if (selectedRows.value.length === 0) {\r\n ElMessage.warning('请先选择要删除的记录')\r\n return\r\n }\r\n try {\r\n await ElMessageBox.confirm(\r\n `确定要删除选中的 ${selectedRows.value.length} 条记录吗?`,\r\n '删除确认',\r\n { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }\r\n )\r\n const ids = selectedRows.value\r\n .map((row) => (row as any).bh)\r\n .filter(Boolean) as (string | number)[]\r\n if (ids.length === 0) {\r\n ElMessage.warning('所选记录缺少日志编号')\r\n return\r\n }\r\n await deleteTeachingLog(ids)\r\n ElMessage.success(`已删除 ${ids.length} 条记录`)\r\n handleSearch()\r\n } catch (err: any) {\r\n if (err !== 'cancel') {\r\n // 错误已由拦截器处理\r\n }\r\n }\r\n}\r\n\r\n/** 批量上报 */\r\nconst handleBatchReport = async () => {\r\n if (selectedRows.value.length === 0) {\r\n ElMessage.warning('请先选择要上报的记录')\r\n return\r\n }\r\n try {\r\n await ElMessageBox.confirm(\r\n `确定要批量上报选中的 ${selectedRows.value.length} 条记录吗?`,\r\n '上报确认',\r\n { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }\r\n )\r\n const ids = selectedRows.value\r\n .map((row) => (row as any).bh)\r\n .filter(Boolean) as (string | number)[]\r\n if (ids.length === 0) {\r\n ElMessage.warning('所选记录缺少日志编号')\r\n return\r\n }\r\n await batchReportTeachingLog(ids)\r\n ElMessage.success(`已批量上报 ${ids.length} 条记录`)\r\n handleSearch()\r\n } catch (err: any) {\r\n if (err !== 'cancel') {\r\n // 错误已由拦截器处理\r\n }\r\n }\r\n}\r\n\r\n/** 重新检查通报变更情况 */\r\nconst handleRecheck = async () => {\r\n try {\r\n await recheckTeachingLog()\r\n ElMessage.success('重新检查完成')\r\n } catch {\r\n // 错误已由拦截器处理\r\n }\r\n}\r\n\r\n/** 导出 Word */\r\nconst handleExportWord = async () => {\r\n try {\r\n const form = searchForm.value\r\n const params: Record<string, any> = {}\r\n if (form.ksrqEnabled && form.ksrq) params.ksrq = form.ksrq\r\n if (form.jsrqEnabled && form.jsrq) params.jsrq = form.jsrq\r\n if (form.kcmcEnabled && form.kcmc) params.kcmc = form.kcmc\r\n if (form.jysEnabled && form.jys) params.jys = form.jys\r\n if (form.jxffEnabled && form.jxff) params.jxff = form.jxff\r\n if (form.rzztEnabled && form.rzzt) params.rzzt = form.rzzt\r\n if (form.skjyEnabled && form.skjy) params.skjy = form.skjy\r\n if (form.pxqbEnabled && form.pxqb) params.pxqb = form.pxqb\r\n if (form.rwlbEnabled && form.rwlb) params.rwlb = form.rwlb\r\n if (form.changeTypeEnabled && form.changeType) params.gdqk = form.changeType\r\n if (form.changeTypeEnabled && form.changeTypes.length > 0) {\r\n params.gdxxqk = form.changeTypes.join(',')\r\n }\r\n\r\n const res = await exportTeachingLogWord(params)\r\n // 创建 Blob 并下载\r\n const blob = new Blob([res as any], {\r\n type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\r\n })\r\n const url = window.URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = `教学日志_${new Date().toISOString().slice(0, 10)}.docx`\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n window.URL.revokeObjectURL(url)\r\n ElMessage.success('导出成功')\r\n } catch {\r\n // 错误已由拦截器处理\r\n }\r\n}\r\n\r\n// ==================== 查看详情 ====================\r\nconst detailVisible = ref(false)\r\nconst detailLoading = ref(false)\r\nconst detailData = ref<Record<string, any>>({})\r\n\r\nconst handleDetail = async (row: TeachingLogItem) => {\r\n // 先用行数据兜底展示(列表接口已返回完整字段)\r\n detailData.value = { ...(row as Record<string, any>) }\r\n detailVisible.value = true\r\n const bh = row.bh\r\n if (!bh) return\r\n // 尝试拉取详情接口刷新,接口不可用时不阻断展示\r\n detailLoading.value = true\r\n try {\r\n const res = await getTeachingLogByBh(String(bh))\r\n if (res.code === 200 || res.code === 0 && res.data) {\r\n detailData.value = res.data || {}\r\n }\r\n } catch {\r\n // 详情接口 404 等异常时保留行数据展示\r\n } finally {\r\n detailLoading.value = false\r\n }\r\n}\r\n\r\n/** 切换视图 */\r\nconst handleSwitchView = () => {\r\n ElMessage.info('转教学计划视图')\r\n}\r\n\r\n// ==================== 导入 Excel ====================\r\nconst importFileInput = ref<HTMLInputElement | null>(null)\r\nconst importing = ref(false)\r\n\r\n/** 触发文件选择 */\r\nconst handleImportExcel = () => {\r\n importFileInput.value?.click()\r\n}\r\n\r\n/** 文件选择后自动上传 */\r\nconst handleImportFileChange = async (e: Event) => {\r\n const files = (e.target as HTMLInputElement).files\r\n if (!files || files.length === 0) return\r\n const file = files[0]\r\n\r\n importing.value = true\r\n try {\r\n const res = await importTeachingLogExcel(file)\r\n if (res.code === 200 || res.code === 0) {\r\n ElMessage.success(res.message || '导入成功')\r\n handleSearch()\r\n } else {\r\n ElMessage.error(res.message || '导入失败')\r\n }\r\n } catch {\r\n // 错误已由拦截器统一处理\r\n } finally {\r\n importing.value = false\r\n // 重置 input 以便再次选择同一文件\r\n if (importFileInput.value) {\r\n importFileInput.value.value = ''\r\n }\r\n }\r\n}\r\n\r\n/** 下载导入模板 */\r\nconst handleDownloadTemplate = async () => {\r\n try {\r\n const res = await downloadTeachingLogTemplate()\r\n const blob = new Blob([res as any], {\r\n type: 'application/vnd.ms-excel'\r\n })\r\n const url = window.URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = '导入教学日志模板.xls'\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n window.URL.revokeObjectURL(url)\r\n ElMessage.success('模板下载成功')\r\n } catch {\r\n // 错误已由拦截器统一处理\r\n }\r\n}\r\n\r\n</script>\r\n\r\n<template>\r\n <div class=\"page-container\">\r\n <!-- 查询条件 -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <div class=\"form-title\">\r\n <span class=\"title-left\">教学日志管理-教学日志视图</span>\r\n <span class=\"title-link\" @click=\"handleSwitchView\">转教学计划视图</span>\r\n </div>\r\n <el-form :model=\"searchForm\" label-width=\"110px\" class=\"search-form\">\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.ksrqEnabled\">开始日期</el-checkbox>\r\n </template>\r\n <el-date-picker v-model=\"searchForm.ksrq\" type=\"date\" value-format=\"YYYY-MM-DD\" placeholder=\"选择开始日期\"\r\n class=\"w-full\" :disabled=\"!searchForm.ksrqEnabled\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.jsrqEnabled\">结束日期</el-checkbox>\r\n </template>\r\n <el-date-picker v-model=\"searchForm.jsrq\" type=\"date\" value-format=\"YYYY-MM-DD\" placeholder=\"选择结束日期\"\r\n class=\"w-full\" :disabled=\"!searchForm.jsrqEnabled\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.kcmcEnabled\">课程名称</el-checkbox>\r\n </template>\r\n <el-input v-model=\"searchForm.kcmc\" placeholder=\"请输入课程名称\" clearable :disabled=\"!searchForm.kcmcEnabled\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.jysEnabled\">教研室</el-checkbox>\r\n </template>\r\n <el-select v-model=\"searchForm.jys\" placeholder=\"请选择教研室\" class=\"w-full\"\r\n :disabled=\"!searchForm.jysEnabled\">\r\n <el-option v-for=\"item in jysOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.jxffEnabled\">教学方法</el-checkbox>\r\n </template>\r\n <el-select v-model=\"searchForm.jxff\" placeholder=\"请选择教学方法\" class=\"w-full\"\r\n :disabled=\"!searchForm.jxffEnabled\">\r\n <el-option v-for=\"item in jxffOptions\" :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>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.rzztEnabled\">日志状态</el-checkbox>\r\n </template>\r\n <el-select v-model=\"searchForm.rzzt\" placeholder=\"请选择日志状态\" class=\"w-full\"\r\n :disabled=\"!searchForm.rzztEnabled\">\r\n <el-option v-for=\"item in rzztOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.skjyEnabled\">授课教员</el-checkbox>\r\n </template>\r\n <el-select v-model=\"searchForm.skjy\" placeholder=\"请选择授课教员\" class=\"w-full\"\r\n :disabled=\"!searchForm.skjyEnabled\">\r\n <el-option v-for=\"item in skjyOptions\" :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>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.pxqbEnabled\">培训期班</el-checkbox>\r\n </template>\r\n <el-input v-model=\"searchForm.pxqb\" placeholder=\"请输入培训期班\" clearable :disabled=\"!searchForm.pxqbEnabled\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.changeTypeEnabled\">改动情况</el-checkbox>\r\n </template>\r\n <div class=\"change-options\" :class=\"{ disabled: !searchForm.changeTypeEnabled }\">\r\n <el-radio-group v-model=\"searchForm.changeType\" :disabled=\"!searchForm.changeTypeEnabled\">\r\n <el-radio v-for=\"item in changeTypeOptions\" :key=\"item.value\" :label=\"item.value\">{{ item.label\r\n }}</el-radio>\r\n </el-radio-group>\r\n <el-checkbox-group v-model=\"searchForm.changeTypes\" :disabled=\"!searchForm.changeTypeEnabled\">\r\n <el-checkbox v-for=\"item in changeTypeList\" :key=\"item.value\" :label=\"item.value\" />\r\n </el-checkbox-group>\r\n </div>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.rwlbEnabled\">任务类别</el-checkbox>\r\n </template>\r\n <el-select v-model=\"searchForm.rwlb\" placeholder=\"请选择任务类别\" class=\"w-full\"\r\n :disabled=\"!searchForm.rwlbEnabled\">\r\n <el-option v-for=\"item in rwlbOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n\r\n <div class=\"search-tip\">\r\n 注意:勾选\"选择框\"表示启用该项对应的查询条件。\r\n </div>\r\n\r\n <div class=\"search-actions\">\r\n <div class=\"left-group\">\r\n <el-button type=\"primary\" @click=\"handleDeleteSelected\">删除所选</el-button>\r\n <el-button type=\"primary\" @click=\"handleBatchReport\">批准上报所选</el-button>\r\n <el-button type=\"primary\" @click=\"handleRecheck\">重新检查通报变更情况</el-button>\r\n <el-button type=\"primary\" @click=\"handleExportWord\">导出到 Word</el-button>\r\n <el-button type=\"primary\" @click=\"handleRefresh\">刷新</el-button>\r\n <el-button type=\"success\" :loading=\"importing\" @click=\"handleImportExcel\">导入教学日志</el-button>\r\n <el-button type=\"primary\" @click=\"handleDownloadTemplate\">下载模板</el-button>\r\n </div>\r\n <el-button type=\"primary\" @click=\"handleSearch\">查询</el-button>\r\n </div>\r\n\r\n <!-- 隐藏的文件选择器,用于导入 Excel -->\r\n <input\r\n ref=\"importFileInput\"\r\n type=\"file\"\r\n accept=\".xls,.xlsx\"\r\n style=\"display: none\"\r\n @change=\"handleImportFileChange\"\r\n />\r\n </el-card>\r\n\r\n <!-- 日志详情对话框 -->\r\n <el-dialog v-model=\"detailVisible\" title=\"教学日志详情\" width=\"700px\" destroy-on-close>\r\n <div v-loading=\"detailLoading\">\r\n <el-descriptions v-if=\"!detailLoading\" :column=\"2\" border>\r\n <el-descriptions-item label=\"编号\">{{ detailData.bh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"统一编号\">{{ detailData.tybh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"教员编号\">{{ detailData.jybh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"教员姓名\">{{ detailData.jyxm || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"课程名称\">{{ detailData.kcmc || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"任务类别\">{{ detailData.rwlb || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"日期\">{{ detailData.rq || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"节次\">\r\n {{ detailData.qsjc && detailData.jsjc ? `${detailData.qsjc}-${detailData.jsjc}节` : '-' }}\r\n </el-descriptions-item>\r\n <el-descriptions-item label=\"教学方法\">{{ detailData.jsfs || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"创建方式\">{{ detailData.jxrzcjfs || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"应到人数\">{{ detailData.ydrs ?? '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"实到人数\">{{ detailData.sdrs ?? '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"培训期班信息\" :span=\"2\">{{ detailData.pxqbxx || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"授课地点\" :span=\"2\">{{ detailData.skdd || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"状态\">{{ detailData.zt || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"教研室\">{{ detailData.jysmc || detailData.jys || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"变动汇总\" :span=\"2\">{{ detailData.gdqk || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"变动详细情况\" :span=\"2\">{{ detailData.gdxxqk || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"退回意见\" :span=\"2\">{{ detailData.thyj || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"创建时间\">{{ detailData.cjsj || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"修改时间\">{{ detailData.xgsj || '-' }}</el-descriptions-item>\r\n </el-descriptions>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 数据表格 -->\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table v-loading=\"loading\" :data=\"tableData\" stripe border highlight-current-row\r\n @selection-change=\"handleSelectionChange\">\r\n <el-table-column type=\"selection\" width=\"50\" align=\"center\" />\r\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"rwlb\" label=\"库任务类别\" width=\"120\" align=\"center\" />\r\n <el-table-column prop=\"jyxm\" label=\"主讲教员\" width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"rq\" label=\"日期\" width=\"120\" align=\"center\" :formatter=\"formatDate\" />\r\n <el-table-column label=\"节次\" width=\"80\" align=\"center\">\r\n <template #default=\"{ row }\">\r\n {{ row.qsjc && row.jsjc ? `${row.qsjc}-${row.jsjc}节` : (row.qsjc ?? '-') }}\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"kcmc\" label=\"课程名称\" min-width=\"150\" show-overflow-tooltip />\r\n <el-table-column prop=\"pxqbxx\" label=\"培训期班信息\" min-width=\"140\" show-overflow-tooltip />\r\n <el-table-column label=\"人数\" width=\"70\" align=\"center\">\r\n <template #default=\"{ row }\">{{ row.sdrs ?? row.ydrs ?? '-' }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"分组指导教员\" width=\"120\" align=\"center\">\r\n <template #default=\"{ row }\">{{ row.fzyzdjy || '-' }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"jsfs\" label=\"教学方法\" width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"zt\" label=\"日志状态\" width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"gdqk\" label=\"变动汇总\" min-width=\"120\" show-overflow-tooltip />\r\n <el-table-column prop=\"jxrzcjfs\" label=\"创建方式\" width=\"100\" align=\"center\" />\r\n <el-table-column label=\"详细\" width=\"80\" align=\"center\" fixed=\"right\">\r\n <template #default=\"{ row }\">\r\n <el-button type=\"primary\" link @click=\"handleDetail(row as TeachingLogItem)\">详细</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n\r\n <!-- 分页 -->\r\n <div class=\"pagination-wrapper\">\r\n <el-pagination v-model:current-page=\"pageNum\" v-model:page-size=\"pageSize\" :page-sizes=\"[10, 20, 50, 100]\"\r\n :total=\"total\" layout=\"total, sizes, prev, pager, next, jumper\" background @current-change=\"handlePageChange\"\r\n @size-change=\"handleSizeChange\" />\r\n </div>\r\n </el-card>\r\n </div>\r\n</template>\r\n\r\n<style scoped lang=\"scss\">\r\n.page-container {\r\n padding: 20px;\r\n}\r\n\r\n.page-title {\r\n text-align: center;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 20px;\r\n}\r\n\r\n.search-card {\r\n margin-bottom: 16px;\r\n\r\n .form-title {\r\n display: flex;\r\n align-items: center;\r\n padding: 12px 12px 0;\r\n\r\n .title-left {\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-right: 20px;\r\n }\r\n\r\n .title-link {\r\n font-size: 16px;\r\n font-weight: 600;\r\n color: #409eff;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n text-decoration: underline;\r\n }\r\n }\r\n }\r\n\r\n .search-form {\r\n .w-full {\r\n width: 100%;\r\n }\r\n\r\n .el-row {\r\n border-bottom: 1px solid #ebeef5;\r\n\r\n &:last-child {\r\n border-bottom: none;\r\n }\r\n }\r\n\r\n .el-col {\r\n border-right: 1px solid #ebeef5;\r\n\r\n &:last-child {\r\n border-right: none;\r\n }\r\n }\r\n\r\n .el-form-item__label {\r\n white-space: normal;\r\n line-height: 1.4;\r\n text-align: left;\r\n justify-content: flex-start;\r\n }\r\n\r\n .el-form-item {\r\n margin-bottom: 0;\r\n padding: 10px 12px;\r\n }\r\n\r\n .change-options {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n\r\n .el-radio-group,\r\n .el-checkbox-group {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n }\r\n\r\n &.disabled {\r\n opacity: 0.6;\r\n }\r\n }\r\n }\r\n\r\n .search-tip {\r\n font-size: 12px;\r\n color: #f56c6c;\r\n padding: 8px 12px;\r\n }\r\n\r\n .search-actions {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 12px;\r\n border-top: 1px solid #ebeef5;\r\n\r\n .left-group {\r\n display: flex;\r\n gap: 8px;\r\n flex-wrap: wrap;\r\n }\r\n\r\n }\r\n}\r\n\r\n.table-card {\r\n .el-table {\r\n width: 100%;\r\n }\r\n\r\n .pagination-wrapper {\r\n display: flex;\r\n justify-content: flex-end;\r\n padding: 16px 0 0;\r\n }\r\n}\r\n</style>\r\n\r\n\r\n<script setup lang=\"ts\">\r\nimport { reactive, ref } from 'vue'\r\nimport { ElMessage } from 'element-plus'\r\nimport {\r\n getTeachingLogList,\r\n deleteTeachingLog,\r\n rejectTeachingLog,\r\n recheckTeachingLog,\r\n approveTeachingLog,\r\n addTeachingLog,\r\n type TeachingLogItem,\r\n} from '@/api/log'\r\n\r\n// ==================== 1. 查询条件 ====================\r\ninterface SearchForm {\r\n startDateEnabled: boolean\r\n startDate: string\r\n endDateEnabled: boolean\r\n endDate: string\r\n courseNameEnabled: boolean\r\n courseName: string\r\n teachMethodEnabled: boolean\r\n teachMethod: string\r\n changeEnabled: boolean\r\n change: string\r\n taskCategoryEnabled: boolean\r\n taskCategory: string\r\n deptEnabled: boolean\r\n dept: string\r\n teacherEnabled: boolean\r\n teacher: string\r\n classNameEnabled: boolean\r\n className: string\r\n}\r\n\r\nconst searchForm = reactive<SearchForm>({\r\n startDateEnabled: true,\r\n startDate: '2026-06-27',\r\n endDateEnabled: true,\r\n endDate: '2026-07-07',\r\n courseNameEnabled: false,\r\n courseName: '',\r\n teachMethodEnabled: false,\r\n teachMethod: '理论讲授',\r\n changeEnabled: false,\r\n change: '与教学计划一致',\r\n taskCategoryEnabled: false,\r\n taskCategory: '全军院校训练规划内任务',\r\n deptEnabled: false,\r\n dept: '教务处',\r\n teacherEnabled: false,\r\n teacher: '教务处',\r\n classNameEnabled: false,\r\n className: ''\r\n})\r\n\r\nconst teachMethodOptions = ['理论讲授', '实践教学', '研讨教学', '案例教学', '实操演练']\r\nconst changeOptions = [\r\n '与教学计划一致',\r\n '已改动教学计划',\r\n '手动拟制',\r\n '教员变动',\r\n '时间变动',\r\n '课程变动',\r\n '授课方式变动',\r\n '任务类别变动',\r\n '期班变动',\r\n '地点变动',\r\n '课题变动'\r\n]\r\nconst taskCategoryOptions = ['全军院校训练规划内任务', '其他任务(含研究生导师指导)']\r\nconst deptOptions = ['教务处', '指挥系', '政治工作教研室', '军事基础教研室', '装备保障教研室']\r\nconst teacherOptions = ['教务处', '张三', '李四', '王五', '赵六', '孙七']\r\n\r\n/** 查询 */\r\nconst handleQuery = async () => {\r\n loading.value = true\r\n try {\r\n const params: Record<string, any> = { pageNum: 1, pageSize: 9999 }\r\n if (searchForm.startDateEnabled && searchForm.startDate) params.ksrq = searchForm.startDate\r\n if (searchForm.endDateEnabled && searchForm.endDate) params.jsrq = searchForm.endDate\r\n if (searchForm.courseNameEnabled && searchForm.courseName) params.kcmc = searchForm.courseName\r\n if (searchForm.teachMethodEnabled && searchForm.teachMethod) params.jxff = searchForm.teachMethod\r\n if (searchForm.changeEnabled && searchForm.change) params.gdqk = searchForm.change\r\n if (searchForm.taskCategoryEnabled && searchForm.taskCategory) params.rwlb = searchForm.taskCategory\r\n if (searchForm.deptEnabled && searchForm.dept) params.jys = searchForm.dept\r\n if (searchForm.teacherEnabled && searchForm.teacher) params.skjy = searchForm.teacher\r\n if (searchForm.classNameEnabled && searchForm.className) params.pxqb = searchForm.className\r\n\r\n const res: any = await getTeachingLogList(params as any)\r\n let records: TeachingLogItem[] = res?.data?.records || res?.data?.list || res?.data || []\r\n if (!Array.isArray(records)) records = []\r\n\r\n tableData.length = 0\r\n records.forEach((item, idx) => {\r\n tableData.push({\r\n id: idx + 1,\r\n _bh: item.bh || '',\r\n taskCategory: item.rwlb || item.pxqbxx || '-',\r\n lecturer: item.jyxm || '-',\r\n date: (item.rq || '').substring(0, 10) || '-',\r\n period: item.qsjc && item.jsjc ? `${item.qsjc}-${item.jsjc}节` : '-',\r\n courseName: item.kcmc || '-',\r\n className: item.pxqbxx || '-',\r\n studentCount: item.sdrs ?? item.ydrs ?? 0,\r\n groupTeacher: '-',\r\n teachMethod: item.jxff || '-',\r\n logStatus: item.zt || '-',\r\n changeSummary: item.gdqk || (Array.isArray(item.gdqkList) && item.gdqkList.length > 0 ? '有变更' : '无'),\r\n createWay: item.jxrzcjfs || '-'\r\n })\r\n })\r\n ElMessage.success(`查询完成,共 ${tableData.length} 条记录`)\r\n } catch (err: any) {\r\n console.error('查询失败:', err)\r\n ElMessage.error(err?.message || '查询失败')\r\n } finally {\r\n loading.value = false\r\n }\r\n}\r\n\r\n/** 重置:恢复默认值 */\r\nconst handleReset = () => {\r\n searchForm.startDateEnabled = true\r\n searchForm.startDate = '2026-06-27'\r\n searchForm.endDateEnabled = true\r\n searchForm.endDate = '2026-07-07'\r\n searchForm.courseNameEnabled = false\r\n searchForm.courseName = ''\r\n searchForm.teachMethodEnabled = false\r\n searchForm.teachMethod = '理论讲授'\r\n searchForm.changeEnabled = false\r\n searchForm.change = '与教学计划一致'\r\n searchForm.taskCategoryEnabled = false\r\n searchForm.taskCategory = '全军院校训练规划内任务'\r\n searchForm.deptEnabled = false\r\n searchForm.dept = '教务处'\r\n searchForm.teacherEnabled = false\r\n searchForm.teacher = '教务处'\r\n searchForm.classNameEnabled = false\r\n searchForm.className = ''\r\n ElMessage.success('已重置查询条件')\r\n}\r\n\r\n// ==================== 3. 数据表格 ====================\r\ninterface TableRow {\r\n id: number\r\n _bh: string\r\n taskCategory: string\r\n lecturer: string\r\n date: string\r\n period: string\r\n courseName: string\r\n className: string\r\n studentCount: number\r\n groupTeacher: string\r\n teachMethod: string\r\n logStatus: string\r\n changeSummary: string\r\n createWay: string\r\n}\r\n\r\nconst loading = ref(false)\r\nconst tableData = reactive<TableRow[]>([])\r\n\r\n/** 表格多选 */\r\nconst selectedRows = ref<TableRow[]>([])\r\nconst handleSelectionChange = (rows: TableRow[]) => {\r\n selectedRows.value = rows\r\n}\r\n\r\n/** 详情 */\r\nconst handleDetail = (row: TableRow) => {\r\n console.log('查看详情:', row)\r\n ElMessage.info(`查看「${row.courseName}」详情(前端模拟)`)\r\n}\r\n\r\n// ==================== 2. 操作按钮 ====================\r\nconst remark = ref('')\r\n\r\nconst requireSelect = (): TableRow[] => {\r\n if (selectedRows.value.length === 0) {\r\n ElMessage.warning('请先选择记录')\r\n return []\r\n }\r\n return selectedRows.value\r\n}\r\n\r\nconst handleDelete = async () => {\r\n const rows = requireSelect()\r\n if (!rows.length) return\r\n try {\r\n await deleteTeachingLog(rows.map(r => r._bh))\r\n ElMessage.success(`已删除 ${rows.length} 条`)\r\n handleQuery()\r\n } catch (err: any) { if (err !== 'cancel') console.error('删除失败:', err) }\r\n}\r\n\r\nconst handleAudit = async () => {\r\n const rows = requireSelect()\r\n if (!rows.length) return\r\n try {\r\n for (const r of rows) {\r\n await approveTeachingLog(r._bh, remark.value || '')\r\n }\r\n ElMessage.success(`已审核通过 ${rows.length} 条`)\r\n handleQuery()\r\n } catch (err: any) { if (err !== 'cancel') console.error('审核失败:', err) }\r\n}\r\n\r\nconst handleWithdraw = async () => {\r\n const rows = requireSelect()\r\n if (!rows.length) return\r\n try {\r\n for (const r of rows) await rejectTeachingLog(r._bh, remark.value || '撤回重填')\r\n ElMessage.success(`已撤回 ${rows.length} 条`)\r\n handleQuery()\r\n } catch (err: any) { if (err !== 'cancel') console.error('撤回失败:', err) }\r\n}\r\n\r\nconst handleRecheck = async () => {\r\n const rows = requireSelect()\r\n if (!rows.length) return\r\n try {\r\n await recheckTeachingLog()\r\n ElMessage.success(`已重新检查 ${rows.length} 条记录的变更情况`)\r\n handleQuery()\r\n } catch (err: any) { if (err !== 'cancel') console.error('检查失败:', err) }\r\n}\r\n\r\nconst handleExportWord = () => {\r\n const bhs = selectedRows.value.map(r => r._bh).join(',')\r\n if (bhs) {\r\n window.open(`/api/log/teaching-log/export?bhs=${bhs}`, '_blank')\r\n } else {\r\n window.open('/api/log/teaching-log/export', '_blank')\r\n }\r\n}\r\n\r\n// ==================== 新增测试数据(临时) ====================\r\nconst addTestLoading = ref(false)\r\nconst handleAddTest = async () => {\r\n addTestLoading.value = true\r\n try {\r\n const now = new Date()\r\n const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`\r\n const res: any = await addTeachingLog({\r\n bh: `LOG-TEST-${Date.now()}`,\r\n rq: `${dateStr}T00:00:00`,\r\n qsjc: '1',\r\n jsjc: '2',\r\n kcmc: '测试课程',\r\n jyxm: '测试教员',\r\n jxff: '讲授',\r\n rwlb: '全军院校训练规划内任务',\r\n } as any)\r\n if (res?.code === 200 || res?.code === 0 || res === undefined) {\r\n ElMessage.success('测试数据已创建')\r\n handleQuery()\r\n } else {\r\n ElMessage.error(res?.message || '创建失败')\r\n }\r\n } catch (err: any) {\r\n console.error('创建失败:', err)\r\n ElMessage.error(err?.message || '创建失败')\r\n } finally {\r\n addTestLoading.value = false\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"page-container\">\r\n <el-card shadow=\"never\">\r\n <!-- ==================== 1. 查询条件区域 ==================== -->\r\n <div class=\"section-card query-card\">\r\n <el-row :gutter=\"32\">\r\n <!-- 左列 -->\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <div class=\"query-field\">\r\n <el-checkbox v-model=\"searchForm.startDateEnabled\" />\r\n <span class=\"q-label\">开始日期</span>\r\n <el-date-picker v-model=\"searchForm.startDate\" type=\"date\" value-format=\"YYYY-MM-DD\" placeholder=\"请选择\"\r\n class=\"q-control\" :disabled=\"!searchForm.startDateEnabled\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <el-checkbox v-model=\"searchForm.courseNameEnabled\" />\r\n <span class=\"q-label\">课程名称</span>\r\n <el-input v-model=\"searchForm.courseName\" placeholder=\"请输入课程名称\" clearable class=\"q-control\"\r\n :disabled=\"!searchForm.courseNameEnabled\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <el-checkbox v-model=\"searchForm.teachMethodEnabled\" />\r\n <span class=\"q-label\">教学方法</span>\r\n <el-select v-model=\"searchForm.teachMethod\" placeholder=\"请选择\" class=\"q-control\"\r\n :disabled=\"!searchForm.teachMethodEnabled\">\r\n <el-option v-for=\"item in teachMethodOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </div>\r\n <div class=\"query-field query-field-block\" :class=\"{ disabled: !searchForm.changeEnabled }\">\r\n <el-radio-group v-model=\"searchForm.change\" :disabled=\"!searchForm.changeEnabled\">\r\n <div class=\"change-header\">\r\n <el-checkbox v-model=\"searchForm.changeEnabled\" />\r\n <span class=\"change-label\">改动情况</span>\r\n <div class=\"radio-row\">\r\n <el-radio v-for=\"item in changeOptions.slice(0, 4)\" :key=\"item\" :value=\"item\">{{ item }}</el-radio>\r\n </div>\r\n </div>\r\n <div class=\"radio-row radio-row-indent\">\r\n <el-radio v-for=\"item in changeOptions.slice(4, 8)\" :key=\"item\" :value=\"item\">{{ item }}</el-radio>\r\n </div>\r\n <div class=\"radio-row radio-row-indent\">\r\n <el-radio v-for=\"item in changeOptions.slice(8)\" :key=\"item\" :value=\"item\">{{ item }}</el-radio>\r\n </div>\r\n </el-radio-group>\r\n </div>\r\n <div class=\"query-field\">\r\n <el-checkbox v-model=\"searchForm.taskCategoryEnabled\" />\r\n <span class=\"q-label\">任务类别</span>\r\n <el-select v-model=\"searchForm.taskCategory\" placeholder=\"请选择\" class=\"q-control\"\r\n :disabled=\"!searchForm.taskCategoryEnabled\">\r\n <el-option v-for=\"item in taskCategoryOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </div>\r\n </el-col>\r\n\r\n <!-- 右列 -->\r\n <el-col :xs=\"24\" :md=\"12\">\r\n <div class=\"query-field\">\r\n <el-checkbox v-model=\"searchForm.endDateEnabled\" />\r\n <span class=\"q-label\">结束日期</span>\r\n <el-date-picker v-model=\"searchForm.endDate\" type=\"date\" value-format=\"YYYY-MM-DD\" placeholder=\"请选择\"\r\n class=\"q-control\" :disabled=\"!searchForm.endDateEnabled\" />\r\n </div>\r\n <div class=\"query-field\">\r\n <el-checkbox v-model=\"searchForm.deptEnabled\" />\r\n <span class=\"q-label\">教研室</span>\r\n <el-select v-model=\"searchForm.dept\" placeholder=\"请选择\" class=\"q-control\"\r\n :disabled=\"!searchForm.deptEnabled\">\r\n <el-option v-for=\"item in deptOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </div>\r\n <div class=\"query-field\">\r\n <el-checkbox v-model=\"searchForm.teacherEnabled\" />\r\n <span class=\"q-label\">授课教员</span>\r\n <el-select v-model=\"searchForm.teacher\" placeholder=\"请选择\" class=\"q-control\"\r\n :disabled=\"!searchForm.teacherEnabled\">\r\n <el-option v-for=\"item in teacherOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </div>\r\n <div class=\"query-field\">\r\n <el-checkbox v-model=\"searchForm.classNameEnabled\" />\r\n <span class=\"q-label\">培训班</span>\r\n <el-input v-model=\"searchForm.className\" placeholder=\"请输入培训班\" clearable class=\"q-control\"\r\n :disabled=\"!searchForm.classNameEnabled\" />\r\n </div>\r\n </el-col>\r\n </el-row>\r\n\r\n <div class=\"query-footer\">\r\n <el-button class=\"gray-btn\" @click=\"handleReset\">重置</el-button>\r\n <el-button class=\"blue-btn\" @click=\"handleQuery\">查询</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 2. 操作按钮区域 ==================== -->\r\n <div class=\"section-card action-card\">\r\n <div class=\"action-bar\">\r\n <el-button class=\"gray-btn\" @click=\"handleDelete\">删除所选</el-button>\r\n <el-button class=\"gray-btn\" @click=\"handleAudit\">审核通过所选</el-button>\r\n <el-input v-model=\"remark\" placeholder=\"请输入备注/原因\" clearable class=\"action-input\" />\r\n <el-button class=\"gray-btn\" @click=\"handleWithdraw\">撤回重填所选</el-button>\r\n <el-button class=\"gray-btn\" @click=\"handleRecheck\">重新检查所选变更情况</el-button>\r\n <el-button class=\"gray-btn\" @click=\"handleExportWord\">导出到Word</el-button>\r\n </div>\r\n </div>\r\n\r\n <!-- ==================== 3. 数据表格区域 ==================== -->\r\n <div class=\"section-card table-card\">\r\n <el-table :data=\"tableData\" border stripe @selection-change=\"handleSelectionChange\" class=\"main-table\">\r\n <el-table-column type=\"selection\" width=\"50\" />\r\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"taskCategory\" label=\"任务类别\" show-overflow-tooltip />\r\n <el-table-column prop=\"lecturer\" label=\"主讲教员\" width=\"90\" align=\"center\" />\r\n <el-table-column prop=\"date\" label=\"日期\" width=\"110\" align=\"center\" />\r\n <el-table-column prop=\"period\" label=\"节次\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"courseName\" label=\"课程名称\" width=\"120\" show-overflow-tooltip />\r\n <el-table-column prop=\"className\" label=\"培训期班信息\" width=\"140\" show-overflow-tooltip />\r\n <el-table-column prop=\"studentCount\" label=\"人数\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"groupTeacher\" label=\"分组指导教员\" width=\"110\" align=\"center\" />\r\n <el-table-column prop=\"teachMethod\" label=\"教学方法\" width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"logStatus\" label=\"日志状态\" width=\"90\" align=\"center\" />\r\n <el-table-column prop=\"changeSummary\" label=\"变动汇总\" width=\"110\" align=\"center\" />\r\n <el-table-column prop=\"createWay\" label=\"创建方式\" width=\"110\" align=\"center\" />\r\n <el-table-column label=\"详细\" width=\"80\" align=\"center\">\r\n <template #default=\"{ row }\">\r\n <el-button type=\"primary\" link @click=\"handleDetail(row as TableRow)\">详细</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </div>\r\n </el-card>\r\n </div>\r\n</template>\r\n\r\n<style scoped lang=\"scss\">\r\n.page-container {\r\n padding: 20px;\r\n}\r\n\r\n// ==================== 公共区域容器 ====================\r\n.section-card {\r\n background: #fff;\r\n border-radius: 8px;\r\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);\r\n padding: 16px 20px;\r\n margin-bottom: 16px;\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n}\r\n\r\n// ==================== 1. 查询条件区域 ====================\r\n.query-card {\r\n .query-field {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 16px;\r\n min-height: 32px;\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n :deep(.el-checkbox) {\r\n margin-right: 6px;\r\n flex-shrink: 0;\r\n }\r\n\r\n .q-label {\r\n width: 80px;\r\n flex-shrink: 0;\r\n font-size: 13px;\r\n color: #303133;\r\n text-align: right;\r\n margin-right: 10px;\r\n }\r\n\r\n .q-control {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n &.query-field-block {\r\n flex-direction: column;\r\n padding-top: 0;\r\n\r\n .el-radio-group {\r\n width: 100%;\r\n }\r\n\r\n .change-header {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n margin-bottom: 4px;\r\n\r\n .el-checkbox {\r\n flex-shrink: 0;\r\n }\r\n\r\n .change-label {\r\n width: 80px;\r\n flex-shrink: 0;\r\n font-size: 13px;\r\n color: #303133;\r\n text-align: right;\r\n margin-right: 10px;\r\n }\r\n\r\n .radio-row {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px 16px;\r\n flex: 1;\r\n margin-bottom: 0;\r\n }\r\n }\r\n\r\n .radio-row {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px 16px;\r\n margin-bottom: 4px;\r\n }\r\n\r\n .radio-row-indent {\r\n padding-left: 120px;\r\n }\r\n }\r\n }\r\n\r\n .query-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 12px;\r\n margin-top: 12px;\r\n padding-top: 12px;\r\n border-top: 1px solid #ebeef5;\r\n }\r\n}\r\n\r\n// ==================== 2. 操作按钮区域 ====================\r\n.action-card {\r\n .action-bar {\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n gap: 10px;\r\n\r\n .action-input {\r\n width: 240px;\r\n flex-shrink: 0;\r\n }\r\n }\r\n}\r\n\r\n// ==================== 3. 数据表格区域 ====================\r\n.table-card {\r\n .main-table {\r\n :deep(.cell) {\r\n font-size: 12px;\r\n }\r\n }\r\n}\r\n\r\n// ==================== 按钮样式 ====================\r\n.gray-btn {\r\n height: 28px;\r\n padding: 2px 14px;\r\n font-size: 12px;\r\n background: #f5f5f5;\r\n border: 1px solid #c0c4cc;\r\n color: #333;\r\n border-radius: 2px;\r\n\r\n &:hover,\r\n &:focus {\r\n background: #ebebeb;\r\n border-color: #c0c4cc;\r\n color: #333;\r\n }\r\n}\r\n\r\n.blue-btn {\r\n height: 28px;\r\n padding: 2px 16px;\r\n font-size: 12px;\r\n background: #409eff;\r\n border: none;\r\n color: #fff;\r\n border-radius: 2px;\r\n\r\n &:hover,\r\n &:focus {\r\n background: #66b1ff;\r\n color: #fff;\r\n }\r\n}\r\n</style>\r\n\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref } from 'vue'\r\n\r\nimport { ElMessage } from 'element-plus'\r\nimport { formatDate } from '@/utils/format'\r\n\r\nconst pageTitle = ref('机关已审核教学日志')\r\n\r\n// ==================== 查询表单 ====================\r\ninterface SearchForm {\r\n ksrq: string\r\n ksrqEnabled: boolean\r\n jsrq: string\r\n jsrqEnabled: boolean\r\n kcmc: string\r\n kcmcEnabled: boolean\r\n jys: string\r\n jysEnabled: boolean\r\n jxff: string\r\n jxffEnabled: boolean\r\n skjy: string\r\n skjyEnabled: boolean\r\n gdqkEnabled: boolean\r\n createSource: string\r\n changeTypes: string[]\r\n rwlb: string\r\n rwlbEnabled: boolean\r\n pxqb: string\r\n pxqbEnabled: boolean\r\n}\r\n\r\nconst searchForm = ref<SearchForm>({\r\n ksrq: '2026-06-27',\r\n ksrqEnabled: false,\r\n jsrq: '2026-07-07',\r\n jsrqEnabled: false,\r\n kcmc: '',\r\n kcmcEnabled: false,\r\n jys: '',\r\n jysEnabled: false,\r\n jxff: '理论讲授',\r\n jxffEnabled: false,\r\n skjy: '教务处',\r\n skjyEnabled: false,\r\n gdqkEnabled: false,\r\n createSource: '',\r\n changeTypes: [],\r\n rwlb: '全军院校训练规划内任务',\r\n rwlbEnabled: false,\r\n pxqb: '',\r\n pxqbEnabled: false\r\n})\r\n\r\nconst jysOptions = ['教研室', '防空兵系', '通信工程系', '装甲兵系']\r\nconst jxffOptions = ['理论讲授', '讨论', '实操', '演示']\r\nconst skjyOptions = ['教务处', '张三', '李四', '王五']\r\nconst rwlbOptions = ['全军院校训练规划内任务', '其他任务']\r\nconst createSourceOptions = ['由教学计划创建', '已改动教学计划', '手动拟制']\r\nconst changeTypeOptions = [\r\n '教员变动',\r\n '时间变动',\r\n '课程变动',\r\n '授课方式变动',\r\n '任务类别变动',\r\n '期班变动',\r\n '地点变动',\r\n '课题变动'\r\n]\r\n\r\nconst handleSearch = () => {\r\n ElMessage.success('查询机关已审核教学日志(前端模拟)')\r\n console.log('查询条件:', searchForm.value)\r\n}\r\n\r\n// ==================== 表格数据 ====================\r\ninterface AuditedLogItem {\r\n xh: number\r\n rwlb: string\r\n zjjy: string\r\n rq: string\r\n jc: string\r\n kcmc: string\r\n pxqbxx: string\r\n rs: number\r\n fzzdjy: string\r\n jxff: string\r\n rzzt: string\r\n bdhz: string\r\n cjfs: string\r\n}\r\n\r\nconst loading = ref(false)\r\nconst selectedRows = ref<AuditedLogItem[]>([])\r\nconst tableData = ref<AuditedLogItem[]>([])\r\n\r\nconst handleSelectionChange = (rows: AuditedLogItem[]) => {\r\n selectedRows.value = rows\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"page-container\">\r\n <!-- 页面标题 -->\r\n <div class=\"page-title\">{{ pageTitle }}</div>\r\n\r\n <!-- 查询条件 -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"searchForm\" label-width=\"110px\" class=\"search-form\">\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.ksrqEnabled\">开始日期</el-checkbox>\r\n </template>\r\n <el-date-picker\r\n v-model=\"searchForm.ksrq\"\r\n type=\"date\"\r\n value-format=\"YYYY-MM-DD\"\r\n placeholder=\"选择开始日期\"\r\n class=\"w-full\"\r\n :disabled=\"!searchForm.ksrqEnabled\"\r\n />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.jsrqEnabled\">结束日期</el-checkbox>\r\n </template>\r\n <el-date-picker\r\n v-model=\"searchForm.jsrq\"\r\n type=\"date\"\r\n value-format=\"YYYY-MM-DD\"\r\n placeholder=\"选择结束日期\"\r\n class=\"w-full\"\r\n :disabled=\"!searchForm.jsrqEnabled\"\r\n />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.kcmcEnabled\">课程名称</el-checkbox>\r\n </template>\r\n <el-input v-model=\"searchForm.kcmc\" placeholder=\"请输入课程名称\" clearable :disabled=\"!searchForm.kcmcEnabled\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.jysEnabled\">教研室</el-checkbox>\r\n </template>\r\n <el-select v-model=\"searchForm.jys\" placeholder=\"请选择教研室\" class=\"w-full\" :disabled=\"!searchForm.jysEnabled\">\r\n <el-option v-for=\"item in jysOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.jxffEnabled\">教学方法</el-checkbox>\r\n </template>\r\n <el-select v-model=\"searchForm.jxff\" placeholder=\"请选择教学方法\" class=\"w-full\" :disabled=\"!searchForm.jxffEnabled\">\r\n <el-option v-for=\"item in jxffOptions\" :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>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.skjyEnabled\">授课教员</el-checkbox>\r\n </template>\r\n <el-select v-model=\"searchForm.skjy\" placeholder=\"请选择授课教员\" class=\"w-full\" :disabled=\"!searchForm.skjyEnabled\">\r\n <el-option v-for=\"item in skjyOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"24\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.gdqkEnabled\">改动情况</el-checkbox>\r\n </template>\r\n <div class=\"change-options\" :class=\"{ disabled: !searchForm.gdqkEnabled }\">\r\n <el-radio-group v-model=\"searchForm.createSource\" :disabled=\"!searchForm.gdqkEnabled\">\r\n <el-radio v-for=\"item in createSourceOptions\" :key=\"item\" :label=\"item\">{{ item }}</el-radio>\r\n </el-radio-group>\r\n <el-checkbox-group v-model=\"searchForm.changeTypes\" :disabled=\"!searchForm.gdqkEnabled\">\r\n <el-checkbox v-for=\"item in changeTypeOptions\" :key=\"item\" :label=\"item\" />\r\n </el-checkbox-group>\r\n </div>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"12\">\r\n <el-form-item>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.rwlbEnabled\">任务类别</el-checkbox>\r\n </template>\r\n <el-select v-model=\"searchForm.rwlb\" placeholder=\"请选择任务类别\" class=\"w-full\" :disabled=\"!searchForm.rwlbEnabled\">\r\n <el-option v-for=\"item in rwlbOptions\" :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>\r\n <template #label>\r\n <el-checkbox v-model=\"searchForm.pxqbEnabled\">培训期班</el-checkbox>\r\n </template>\r\n <el-input v-model=\"searchForm.pxqb\" placeholder=\"请输入培训期班\" clearable :disabled=\"!searchForm.pxqbEnabled\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" @click=\"handleSearch\">查询</el-button>\r\n </div>\r\n </el-card>\r\n\r\n <!-- 数据表格 -->\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table\r\n v-loading=\"loading\"\r\n :data=\"tableData\"\r\n stripe\r\n border\r\n highlight-current-row\r\n @selection-change=\"handleSelectionChange\"\r\n >\r\n <el-table-column type=\"selection\" width=\"50\" align=\"center\" />\r\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"rwlb\" label=\"任务类别\" width=\"120\" align=\"center\" />\r\n <el-table-column prop=\"zjjy\" label=\"主讲教员\" width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"rq\" label=\"日期\" width=\"120\" align=\"center\" :formatter=\"formatDate\" />\r\n <el-table-column prop=\"jc\" label=\"节次\" width=\"80\" align=\"center\" />\r\n <el-table-column prop=\"kcmc\" label=\"课程名称\" min-width=\"150\" show-overflow-tooltip />\r\n <el-table-column prop=\"pxqbxx\" label=\"培训期班信息\" min-width=\"140\" show-overflow-tooltip />\r\n <el-table-column prop=\"rs\" label=\"人数\" width=\"70\" align=\"center\" />\r\n <el-table-column prop=\"fzzdjy\" label=\"分组指导教员\" width=\"120\" align=\"center\" />\r\n <el-table-column prop=\"jxff\" label=\"教学方法\" width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"rzzt\" label=\"日志状态\" width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"bdhz\" label=\"变动汇总\" min-width=\"120\" show-overflow-tooltip />\r\n <el-table-column prop=\"cjfs\" label=\"创建方式\" width=\"100\" align=\"center\" />\r\n <el-table-column label=\"详细\" width=\"80\" align=\"center\">\r\n <template #default=\"{ row }\">\r\n <el-button type=\"primary\" link>详细</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </el-card>\r\n </div>\r\n</template>\r\n\r\n<style scoped lang=\"scss\">\r\n.page-container {\r\n padding: 20px;\r\n}\r\n\r\n.page-title {\r\n text-align: center;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: #303133;\r\n margin-bottom: 20px;\r\n}\r\n\r\n.search-card {\r\n margin-bottom: 16px;\r\n\r\n .search-form {\r\n .w-full {\r\n width: 100%;\r\n }\r\n\r\n .el-row {\r\n border-bottom: 1px solid #ebeef5;\r\n\r\n &:last-child {\r\n border-bottom: none;\r\n }\r\n }\r\n\r\n .el-col {\r\n border-right: 1px solid #ebeef5;\r\n\r\n &:last-child {\r\n border-right: none;\r\n }\r\n }\r\n\r\n .el-form-item {\r\n margin-bottom: 0;\r\n padding: 12px;\r\n }\r\n\r\n .change-options {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n\r\n .el-radio-group,\r\n .el-checkbox-group {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 12px;\r\n }\r\n\r\n &.disabled {\r\n opacity: 0.6;\r\n }\r\n }\r\n }\r\n\r\n .search-actions {\r\n display: flex;\r\n justify-content: flex-end;\r\n padding: 12px;\r\n border-top: 1px solid #ebeef5;\r\n }\r\n}\r\n\r\n.table-card {\r\n .el-table {\r\n width: 100%;\r\n }\r\n}\r\n</style>\r\n"]}]} |