forked from liweijie/education
1 line
24 KiB
JSON
1 line
24 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\\classHour\\plan\\components\\PlanTab.vue?vue&type=style&index=0&id=480d5208&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\classHour\\plan\\components\\PlanTab.vue","mtime":1787313687801},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKLnBsYW4tdGFiIHsKICAuc2VhcmNoLWNhcmQgewogICAgbWFyZ2luLWJvdHRvbTogMTZweDsKICB9CgogIC5zZWFyY2gtZm9ybSB7CiAgICA6OnYtZGVlcCAuZWwtZm9ybS1pdGVtIHsKICAgICAgbWFyZ2luLWJvdHRvbTogMThweDsKICAgIH0KCiAgICAuc2VhcmNoLWFjdGlvbnMtcm93IHsKICAgICAgbWFyZ2luLXRvcDogMnB4OwogICAgICBib3JkZXItdG9wOiAxcHggZGFzaGVkICNlYmVlZjU7CiAgICAgIHBhZGRpbmctdG9wOiAxNHB4OwogICAgfQoKICAgIC5zZWFyY2gtYWN0aW9ucyB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIGdhcDogMTJweDsKICAgIH0KICB9CgogIC50YWJsZS1jYXJkIHsKICAgIC50YWJsZS1oZWFkZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7CgogICAgICAudGFibGUtdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGNvbG9yOiAjMzAzMTMzOwogICAgICB9CgogICAgICAudGFibGUtYWN0aW9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGdhcDogMTBweDsKICAgICAgfQogICAgfQoKICAgIC5wYWdpbmF0aW9uLXdyYXBwZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICBtYXJnaW4tdG9wOiAxNnB4OwogICAgfQogIH0KCiAgLmZvcm0tZGlhbG9nLWZvcm0gewogICAgbWF4LWhlaWdodDogNjJ2aDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBwYWRkaW5nLXJpZ2h0OiA2cHg7CgogICAgOjp2LWRlZXAgLmVsLWRpdmlkZXItLWhvcml6b250YWwgewogICAgICBtYXJnaW46IDRweCAwIDE2cHg7CiAgICB9CiAgfQoKICAudGV4dC1kYW5nZXIgewogICAgY29sb3I6ICNmNTZjNmM7CiAgICBwYWRkaW5nOiAwOwogIH0KfQo="},{"version":3,"sources":["PlanTab.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoaA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","file":"PlanTab.vue","sourceRoot":"src/views/classHour/plan/components","sourcesContent":["<template>\n <div class=\"plan-tab\">\n <!-- ==================== 1. 查询条件 ==================== -->\n <el-card shadow=\"never\" class=\"search-card\">\n <el-form ref=\"searchFormRef\" :model=\"searchForm\" label-width=\"90px\" class=\"search-form\">\n <el-row :gutter=\"24\">\n <el-col :xs=\"24\" :sm=\"12\" :md=\"12\" :lg=\"8\" :xl=\"8\">\n <el-form-item label=\"编号\">\n <el-input v-model=\"searchForm.bh\" placeholder=\"请输入编号\" clearable @keyup.enter.native=\"handleSearch\" />\n </el-form-item>\n </el-col>\n <el-col :xs=\"24\" :sm=\"12\" :md=\"12\" :lg=\"8\" :xl=\"8\">\n <el-form-item label=\"名称\">\n <el-input v-model=\"searchForm.mc\" placeholder=\"请输入名称\" clearable @keyup.enter.native=\"handleSearch\" />\n </el-form-item>\n </el-col>\n </el-row>\n <el-row class=\"search-actions-row\">\n <el-col :span=\"24\" class=\"search-actions\">\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleSearch\">查询</el-button>\n <el-button icon=\"el-icon-refresh\" @click=\"handleReset\">重置</el-button>\n </el-col>\n </el-row>\n </el-form>\n </el-card>\n\n <!-- ==================== 2. 列表 ==================== -->\n <el-card shadow=\"never\" class=\"table-card\">\n <div class=\"table-header\">\n <span class=\"table-title\">{{ title }}列表:</span>\n <div class=\"table-actions\">\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleAdd\">新增{{ title }}</el-button>\n </div>\n </div>\n <el-table v-loading=\"loading\" :data=\"tableData\" stripe border highlight-current-row>\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" fixed=\"left\" />\n <el-table-column prop=\"bh\" label=\"编号\" width=\"160\" align=\"center\" fixed=\"left\" show-overflow-tooltip />\n <el-table-column prop=\"mc\" label=\"名称\" min-width=\"140\" fixed=\"left\" show-overflow-tooltip />\n <el-table-column prop=\"mrbzksl\" label=\"默认标准课时量\" width=\"140\" align=\"center\" />\n <el-table-column prop=\"mrksfbz\" label=\"默认课时费标准\" width=\"140\" align=\"center\" />\n <el-table-column prop=\"mrclksfbz\" label=\"默认超量课时费标准\" width=\"160\" align=\"center\" />\n <el-table-column prop=\"xgjxbzksfbz\" label=\"相关教学补助课时费标准\" width=\"180\" align=\"center\" />\n <el-table-column prop=\"jxyxbz\" label=\"绩效优秀补助\" width=\"120\" align=\"center\" />\n <el-table-column prop=\"jxlhbz\" label=\"绩效良好补助\" width=\"120\" align=\"center\" />\n <el-table-column prop=\"jxzdbz\" label=\"绩效中等补助\" width=\"120\" align=\"center\" />\n <el-table-column prop=\"jxjgbz\" label=\"绩效及格补助\" width=\"120\" align=\"center\" />\n <el-table-column prop=\"jxbjgbz\" label=\"绩效不及格补助\" width=\"130\" align=\"center\" />\n <el-table-column prop=\"sm\" label=\"说明\" min-width=\"140\" show-overflow-tooltip />\n <el-table-column prop=\"cjsj\" label=\"创建时间\" width=\"165\" align=\"center\" show-overflow-tooltip />\n <el-table-column label=\"操作\" :width=\"showDelete ? 200 : 160\" align=\"center\" fixed=\"right\">\n <template slot-scope=\"scope\">\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-view\" @click=\"handleView(scope.row)\">详情</el-button>\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-edit\" @click=\"handleEdit(scope.row)\">编辑</el-button>\n <el-button v-if=\"showDelete\" type=\"text\" size=\"small\" icon=\"el-icon-delete\" class=\"text-danger\" @click=\"handleDelete(scope.row)\">删除</el-button>\n </template>\n </el-table-column>\n </el-table>\n\n <el-pagination\n :current-page=\"pageNum\"\n :page-size=\"pageSize\"\n :total=\"total\"\n :page-sizes=\"[10, 20, 50, 100]\"\n layout=\"total, sizes, prev, pager, next, jumper\"\n class=\"pagination-wrapper\"\n @current-change=\"handlePageChange\"\n @size-change=\"handleSizeChange\"\n />\n </el-card>\n\n <!-- ==================== 3. 新增/编辑对话框 ==================== -->\n <el-dialog\n :title=\"formTitle\"\n :visible.sync=\"formDialogVisible\"\n width=\"820px\"\n :close-on-click-modal=\"false\"\n >\n <el-form ref=\"formRef\" :model=\"form\" :rules=\"formRules\" label-width=\"160px\" class=\"form-dialog-form\">\n <el-divider content-position=\"left\">基本信息</el-divider>\n <el-row :gutter=\"16\">\n <el-col :span=\"12\">\n <el-form-item label=\"编号\" prop=\"bh\">\n <el-input v-model=\"form.bh\" :disabled=\"!isAdd\" placeholder=\"请输入编号\" />\n </el-form-item>\n </el-col>\n <el-col :span=\"12\">\n <el-form-item label=\"名称\" prop=\"mc\">\n <el-input v-model=\"form.mc\" placeholder=\"请输入名称\" />\n </el-form-item>\n </el-col>\n <el-col :span=\"12\">\n <el-form-item label=\"默认标准课时量\" prop=\"mrbzksl\">\n <el-input-number v-model=\"form.mrbzksl\" :min=\"0\" :precision=\"2\" :step=\"1\" controls-position=\"right\" style=\"width: 100%\" placeholder=\"请输入默认标准课时量\" />\n </el-form-item>\n </el-col>\n <el-col :span=\"12\">\n <el-form-item label=\"默认课时费标准\" prop=\"mrksfbz\">\n <el-input-number v-model=\"form.mrksfbz\" :min=\"0\" :precision=\"2\" :step=\"1\" controls-position=\"right\" style=\"width: 100%\" placeholder=\"请输入默认课时费标准\" />\n </el-form-item>\n </el-col>\n <el-col :span=\"12\">\n <el-form-item label=\"默认超量课时费标准\" prop=\"mrclksfbz\">\n <el-input-number v-model=\"form.mrclksfbz\" :min=\"0\" :precision=\"2\" :step=\"1\" controls-position=\"right\" style=\"width: 100%\" placeholder=\"请输入默认超量课时费标准\" />\n </el-form-item>\n </el-col>\n <el-col :span=\"12\">\n <el-form-item label=\"相关教学补助课时费标准\" prop=\"xgjxbzksfbz\">\n <el-input-number v-model=\"form.xgjxbzksfbz\" :min=\"0\" :precision=\"2\" :step=\"1\" controls-position=\"right\" style=\"width: 100%\" placeholder=\"请输入相关教学补助课时费标准\" />\n </el-form-item>\n </el-col>\n </el-row>\n\n <el-divider content-position=\"left\">绩效补助</el-divider>\n <el-row :gutter=\"16\">\n <el-col :span=\"12\">\n <el-form-item label=\"绩效优秀补助\" prop=\"jxyxbz\">\n <el-input-number v-model=\"form.jxyxbz\" :min=\"0\" :precision=\"2\" :step=\"1\" controls-position=\"right\" style=\"width: 100%\" placeholder=\"请输入绩效优秀补助\" />\n </el-form-item>\n </el-col>\n <el-col :span=\"12\">\n <el-form-item label=\"绩效良好补助\" prop=\"jxlhbz\">\n <el-input-number v-model=\"form.jxlhbz\" :min=\"0\" :precision=\"2\" :step=\"1\" controls-position=\"right\" style=\"width: 100%\" placeholder=\"请输入绩效良好补助\" />\n </el-form-item>\n </el-col>\n <el-col :span=\"12\">\n <el-form-item label=\"绩效中等补助\" prop=\"jxzdbz\">\n <el-input-number v-model=\"form.jxzdbz\" :min=\"0\" :precision=\"2\" :step=\"1\" controls-position=\"right\" style=\"width: 100%\" placeholder=\"请输入绩效中等补助\" />\n </el-form-item>\n </el-col>\n <el-col :span=\"12\">\n <el-form-item label=\"绩效及格补助\" prop=\"jxjgbz\">\n <el-input-number v-model=\"form.jxjgbz\" :min=\"0\" :precision=\"2\" :step=\"1\" controls-position=\"right\" style=\"width: 100%\" placeholder=\"请输入绩效及格补助\" />\n </el-form-item>\n </el-col>\n <el-col :span=\"12\">\n <el-form-item label=\"绩效不及格补助\" prop=\"jxbjgbz\">\n <el-input-number v-model=\"form.jxbjgbz\" :min=\"0\" :precision=\"2\" :step=\"1\" controls-position=\"right\" style=\"width: 100%\" placeholder=\"请输入绩效不及格补助\" />\n </el-form-item>\n </el-col>\n </el-row>\n\n <el-divider content-position=\"left\">其他信息</el-divider>\n <el-row :gutter=\"16\">\n <el-col :span=\"24\">\n <el-form-item label=\"说明\">\n <el-input v-model=\"form.sm\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入说明\" />\n </el-form-item>\n </el-col>\n <el-col :span=\"24\">\n <el-form-item label=\"备注\">\n <el-input v-model=\"form.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入备注\" />\n </el-form-item>\n </el-col>\n </el-row>\n </el-form>\n <div slot=\"footer\" class=\"dialog-footer\">\n <el-button @click=\"formDialogVisible = false\">取 消</el-button>\n <el-button type=\"primary\" :loading=\"formSaving\" @click=\"handleFormSubmit\">确 定</el-button>\n </div>\n </el-dialog>\n\n <!-- ==================== 4. 详情对话框 ==================== -->\n <el-dialog :title=\"title + '详情'\" :visible.sync=\"viewDialogVisible\" width=\"720px\" :close-on-click-modal=\"false\">\n <div v-loading=\"viewLoading\" class=\"detail-body\">\n <el-descriptions :column=\"2\" border>\n <el-descriptions-item label=\"编号\">{{ viewForm.bh || '-' }}</el-descriptions-item>\n <el-descriptions-item label=\"名称\">{{ viewForm.mc || '-' }}</el-descriptions-item>\n <el-descriptions-item label=\"默认标准课时量\">{{ fmtVal(viewForm.mrbzksl) }}</el-descriptions-item>\n <el-descriptions-item label=\"默认课时费标准\">{{ fmtVal(viewForm.mrksfbz) }}</el-descriptions-item>\n <el-descriptions-item label=\"默认超量课时费标准\">{{ fmtVal(viewForm.mrclksfbz) }}</el-descriptions-item>\n <el-descriptions-item label=\"相关教学补助课时费标准\">{{ fmtVal(viewForm.xgjxbzksfbz) }}</el-descriptions-item>\n <el-descriptions-item label=\"绩效优秀补助\">{{ fmtVal(viewForm.jxyxbz) }}</el-descriptions-item>\n <el-descriptions-item label=\"绩效良好补助\">{{ fmtVal(viewForm.jxlhbz) }}</el-descriptions-item>\n <el-descriptions-item label=\"绩效中等补助\">{{ fmtVal(viewForm.jxzdbz) }}</el-descriptions-item>\n <el-descriptions-item label=\"绩效及格补助\">{{ fmtVal(viewForm.jxjgbz) }}</el-descriptions-item>\n <el-descriptions-item label=\"绩效不及格补助\">{{ fmtVal(viewForm.jxbjgbz) }}</el-descriptions-item>\n <el-descriptions-item label=\"创建时间\">{{ viewForm.cjsj || '-' }}</el-descriptions-item>\n <el-descriptions-item label=\"修改时间\">{{ viewForm.xgsj || '-' }}</el-descriptions-item>\n <el-descriptions-item label=\"说明\" :span=\"2\">{{ viewForm.sm || '-' }}</el-descriptions-item>\n <el-descriptions-item label=\"备注\" :span=\"2\">{{ viewForm.bz || '-' }}</el-descriptions-item>\n </el-descriptions>\n </div>\n <div slot=\"footer\" class=\"dialog-footer\">\n <el-button @click=\"viewDialogVisible = false\">关 闭</el-button>\n </div>\n </el-dialog>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"PlanTab\",\n props: {\n // 方案名称(如 课时费方案 / 课时方案)\n title: {\n type: String,\n required: true\n },\n // 接口集合:{ list, get, add, update, del }\n api: {\n type: Object,\n required: true\n },\n // 是否展示删除操作(课时方案无删除接口)\n showDelete: {\n type: Boolean,\n default: true\n }\n },\n data() {\n return {\n // ==================== 查询条件 ====================\n searchForm: {\n bh: '',\n mc: ''\n },\n\n // ==================== 列表数据 ====================\n loading: false,\n tableData: [],\n total: 0,\n pageNum: 1,\n pageSize: 20,\n\n // ==================== 新增/编辑 ====================\n formDialogVisible: false,\n formTitle: '',\n isAdd: true,\n formSaving: false,\n form: this.createEmptyForm(),\n formRules: {\n bh: [{ required: true, message: \"编号不能为空\", trigger: \"blur\" }],\n mc: [{ required: true, message: \"名称不能为空\", trigger: \"blur\" }],\n mrbzksl: [{ required: true, message: \"默认标准课时量不能为空\", trigger: \"change\" }],\n mrksfbz: [{ required: true, message: \"默认课时费标准不能为空\", trigger: \"change\" }],\n mrclksfbz: [{ required: true, message: \"默认超量课时费标准不能为空\", trigger: \"change\" }],\n xgjxbzksfbz: [{ required: true, message: \"相关教学补助课时费标准不能为空\", trigger: \"change\" }],\n jxyxbz: [{ required: true, message: \"绩效优秀补助不能为空\", trigger: \"change\" }],\n jxlhbz: [{ required: true, message: \"绩效良好补助不能为空\", trigger: \"change\" }],\n jxzdbz: [{ required: true, message: \"绩效中等补助不能为空\", trigger: \"change\" }],\n jxjgbz: [{ required: true, message: \"绩效及格补助不能为空\", trigger: \"change\" }],\n jxbjgbz: [{ required: true, message: \"绩效不及格补助不能为空\", trigger: \"change\" }]\n },\n\n // ==================== 详情 ====================\n viewDialogVisible: false,\n viewLoading: false,\n viewForm: {}\n }\n },\n created() {\n this.fetchList()\n },\n methods: {\n /** 空值显示占位符(保留 0 值) */\n fmtVal(val) {\n return val !== null && val !== undefined ? val : '-'\n },\n\n /** 创建空表单 */\n createEmptyForm() {\n return {\n bh: '',\n mc: '',\n mrbzksl: undefined,\n mrksfbz: undefined,\n mrclksfbz: undefined,\n xgjxbzksfbz: undefined,\n jxyxbz: undefined,\n jxlhbz: undefined,\n jxzdbz: undefined,\n jxjgbz: undefined,\n jxbjgbz: undefined,\n sm: '',\n bz: ''\n }\n },\n\n // ==================== 查询列表 ====================\n fetchList() {\n this.loading = true\n const params = {\n pageNum: this.pageNum,\n pageSize: this.pageSize\n }\n // 文本条件非空时才传\n ;['bh', 'mc'].forEach(key => {\n if (this.searchForm[key] !== '' && this.searchForm[key] !== null && this.searchForm[key] !== undefined) {\n params[key] = this.searchForm[key].trim()\n }\n })\n this.api.list(params).then(response => {\n const data = response.data || {}\n this.tableData = data.records || []\n this.total = data.total || 0\n this.loading = false\n }).catch(() => {\n this.tableData = []\n this.total = 0\n this.loading = false\n })\n },\n\n handleSearch() {\n this.pageNum = 1\n this.fetchList()\n },\n\n handleReset() {\n this.searchForm = {\n bh: '',\n mc: ''\n }\n this.pageNum = 1\n this.fetchList()\n },\n\n handlePageChange(current) {\n this.pageNum = current\n this.fetchList()\n },\n\n handleSizeChange(size) {\n this.pageSize = size\n this.pageNum = 1\n this.fetchList()\n },\n\n // ==================== 新增/编辑 ====================\n handleAdd() {\n this.isAdd = true\n this.formTitle = '新增' + this.title\n this.form = this.createEmptyForm()\n this.formDialogVisible = true\n this.$nextTick(() => {\n this.$refs.formRef && this.$refs.formRef.clearValidate()\n })\n },\n\n handleEdit(row) {\n this.isAdd = false\n this.formTitle = '编辑' + this.title\n this.form = this.createEmptyForm()\n this.formDialogVisible = true\n this.$nextTick(() => {\n this.$refs.formRef && this.$refs.formRef.clearValidate()\n })\n this.api.get(row.bh).then(response => {\n const data = response.data || {}\n this.form = {\n bh: data.bh,\n mc: data.mc,\n mrbzksl: data.mrbzksl !== null && data.mrbzksl !== undefined ? data.mrbzksl : undefined,\n mrksfbz: data.mrksfbz !== null && data.mrksfbz !== undefined ? data.mrksfbz : undefined,\n mrclksfbz: data.mrclksfbz !== null && data.mrclksfbz !== undefined ? data.mrclksfbz : undefined,\n xgjxbzksfbz: data.xgjxbzksfbz !== null && data.xgjxbzksfbz !== undefined ? data.xgjxbzksfbz : undefined,\n jxyxbz: data.jxyxbz !== null && data.jxyxbz !== undefined ? data.jxyxbz : undefined,\n jxlhbz: data.jxlhbz !== null && data.jxlhbz !== undefined ? data.jxlhbz : undefined,\n jxzdbz: data.jxzdbz !== null && data.jxzdbz !== undefined ? data.jxzdbz : undefined,\n jxjgbz: data.jxjgbz !== null && data.jxjgbz !== undefined ? data.jxjgbz : undefined,\n jxbjgbz: data.jxbjgbz !== null && data.jxbjgbz !== undefined ? data.jxbjgbz : undefined,\n sm: data.sm,\n bz: data.bz\n }\n }).catch(() => {})\n },\n\n handleFormSubmit() {\n this.$refs.formRef.validate(valid => {\n if (!valid) return\n this.formSaving = true\n const payload = { ...this.form }\n const request = this.isAdd ? this.api.add(payload) : this.api.update(payload)\n request.then(() => {\n this.$message.success(this.isAdd ? '新增成功' : '修改成功')\n this.formDialogVisible = false\n this.fetchList()\n }).catch(() => {\n }).finally(() => {\n this.formSaving = false\n })\n })\n },\n\n // ==================== 删除 ====================\n handleDelete(row) {\n // 防御性拦截:无删除接口(课时方案)时禁止删除,避免误操作\n if (!this.showDelete || !this.api.del) {\n this.$message.warning('该方案不支持删除')\n return\n }\n this.$confirm(`确定要删除「${row.mc || row.bh || '该方案'}」吗?`, '系统提示', {\n confirmButtonText: '确定',\n cancelButtonText: '取消',\n type: 'warning'\n }).then(() => {\n return this.api.del(row.bh)\n }).then(() => {\n this.$message.success('删除成功')\n this.fetchList()\n }).catch(() => {})\n },\n\n // ==================== 详情 ====================\n handleView(row) {\n this.viewDialogVisible = true\n this.viewLoading = true\n this.viewForm = {}\n this.api.get(row.bh).then(response => {\n this.viewForm = response.data || {}\n this.viewLoading = false\n }).catch(() => {\n this.viewLoading = false\n })\n }\n }\n}\n</script>\n\n<style scoped lang=\"scss\">\n.plan-tab {\n .search-card {\n margin-bottom: 16px;\n }\n\n .search-form {\n ::v-deep .el-form-item {\n margin-bottom: 18px;\n }\n\n .search-actions-row {\n margin-top: 2px;\n border-top: 1px dashed #ebeef5;\n padding-top: 14px;\n }\n\n .search-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n }\n }\n\n .table-card {\n .table-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 16px;\n\n .table-title {\n font-size: 16px;\n font-weight: 600;\n color: #303133;\n }\n\n .table-actions {\n display: flex;\n align-items: center;\n gap: 10px;\n }\n }\n\n .pagination-wrapper {\n display: flex;\n justify-content: flex-end;\n margin-top: 16px;\n }\n }\n\n .form-dialog-form {\n max-height: 62vh;\n overflow-y: auto;\n padding-right: 6px;\n\n ::v-deep .el-divider--horizontal {\n margin: 4px 0 16px;\n }\n }\n\n .text-danger {\n color: #f56c6c;\n padding: 0;\n }\n}\n</style>\n"]}]} |