Files
education/frontend/node_modules/.cache/vue-loader/3555afe7ca6bbfce1e27f7a7731a09e0.json
T

1 line
75 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\\textbook\\index.vue?vue&type=style&index=0&id=1652319a&scoped=true&lang=scss","dependencies":[{"path":"C:\\Users\\Admin\\Desktop\\education\\frontend\\src\\views\\textbook\\index.vue","mtime":1787640892029},{"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:CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoNCi5hcHAtY29udGFpbmVyIHsNCiAgcGFkZGluZzogMjBweDsNCn0NCg0KLnRleHRib29rLXRhYnMgew0KICAuc2VhcmNoLWNhcmQgew0KICAgIG1hcmdpbi1ib3R0b206IDE2cHg7DQoNCiAgICAuc2VhcmNoLWZvcm0gew0KICAgICAgLnctZnVsbCB7DQogICAgICAgIHdpZHRoOiAxMDAlOw0KICAgICAgfQ0KDQogICAgICAuZWwtZm9ybS1pdGVtIHsNCiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsNCiAgICAgICAgcGFkZGluZzogMTBweCAxMnB4Ow0KICAgICAgfQ0KICAgIH0NCg0KICAgIC5zZWFyY2gtYWN0aW9ucyB7DQogICAgICBkaXNwbGF5OiBmbGV4Ow0KICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsNCiAgICAgIHBhZGRpbmc6IDEycHg7DQogICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2ViZWVmNTsNCiAgICB9DQogIH0NCg0KICAubGlzdC10aXRsZSB7DQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiA2MDA7DQogICAgY29sb3I6ICMzMDMxMzM7DQogICAgbWFyZ2luLWJvdHRvbTogMTJweDsNCiAgfQ0KDQogIC5saXN0LXRvb2xiYXIgew0KICAgIGRpc3BsYXk6IGZsZXg7DQogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsNCiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47DQogICAgZ2FwOiAxMnB4Ow0KICAgIGZsZXgtd3JhcDogd3JhcDsNCiAgICBtYXJnaW4tYm90dG9tOiAxNnB4Ow0KDQogICAgLmxlZnQtZ3JvdXAsDQogICAgLnJpZ2h0LWdyb3VwIHsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgZ2FwOiAxMnB4Ow0KICAgICAgZmxleC13cmFwOiB3cmFwOw0KICAgIH0NCg0KICAgIC5maWxlLWlucHV0IHsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBhbGlnbi1pdGVtczogY2VudGVyOw0KICAgICAgZ2FwOiA4cHg7DQoNCiAgICAgIC5maWxlLW5hbWUgew0KICAgICAgICBmb250LXNpemU6IDE0cHg7DQogICAgICAgIGNvbG9yOiAjNjA2MjY2Ow0KICAgICAgICBtaW4td2lkdGg6IDEyMHB4Ow0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC50YWJsZS1jYXJkIHsNCiAgICBtYXJnaW4tYm90dG9tOiAxNnB4Ow0KDQogICAgOjp2LWRlZXAoLmVsLXRhYmxlKSB7DQogICAgICB3aWR0aDogMTAwJTsNCiAgICB9DQoNCiAgICAucGFnaW5hdGlvbi13cmFwIHsNCiAgICAgIGRpc3BsYXk6IGZsZXg7DQogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOw0KICAgICAgbWFyZ2luLXRvcDogMTZweDsNCiAgICB9DQogIH0NCg0KICAubWFyZ2luLWxlZnQtMTAgew0KICAgIG1hcmdpbi1sZWZ0OiAxMHB4Ow0KICB9DQoNCiAgLy8g6KGo5qC85pON5L2c5oyJ6ZKu5paH5a2X6aKc6ImyDQogIC5kYW5nZXItdGV4dCB7DQogICAgY29sb3I6ICNmNTZjNmM7DQogICAgcGFkZGluZzogMDsNCiAgfQ0KfQ0K"},{"version":3,"sources":["index.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA87CA;AACA;AACA;;AAEA;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;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA","file":"index.vue","sourceRoot":"src/views/textbook","sourcesContent":["<template>\r\n <div class=\"app-container textbook-page\">\r\n <el-tabs v-model=\"activeTab\" type=\"border-card\" class=\"textbook-tabs\">\r\n <!-- 教材信息 -->\r\n <el-tab-pane label=\"教材信息\" name=\"info\">\r\n <!-- 查询条件 -->\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"searchForm\" label-width=\"90px\" class=\"search-form\">\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"编号\">\r\n <el-input v-model=\"searchForm.bh\" placeholder=\"请输入编号\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教材名称\">\r\n <el-input v-model=\"searchForm.mc\" placeholder=\"请输入教材名称\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"作者\">\r\n <el-input v-model=\"searchForm.zz\" placeholder=\"请输入作者\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"出版社\">\r\n <el-input v-model=\"searchForm.cbs\" placeholder=\"请输入出版社\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"ISBN\">\r\n <el-input v-model=\"searchForm.isbn\" placeholder=\"请输入ISBN\" clearable />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教材分类\">\r\n <el-select v-model=\"searchForm.jcfl\" placeholder=\"全部\" clearable class=\"w-full\">\r\n <el-option v-for=\"item in jcflOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教材类型\">\r\n <el-select v-model=\"searchForm.jclx\" placeholder=\"全部\" clearable class=\"w-full\">\r\n <el-option v-for=\"item in jclxOptions\" :key=\"item\" :label=\"item\" :value=\"item\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"停用\">\r\n <el-select v-model=\"searchForm.tyType\" class=\"w-full\">\r\n <el-option label=\"全部\" value=\"\" />\r\n <el-option label=\"在用\" value=\"0\" />\r\n <el-option label=\"已停用\" value=\"1\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleSearch\">查询</el-button>\r\n <el-button icon=\"el-icon-refresh\" @click=\"handleReset\">重置</el-button>\r\n </div>\r\n </el-card>\r\n\r\n <!-- 教材信息列表 -->\r\n <div class=\"list-title\">教材信息列表:</div>\r\n <div class=\"list-toolbar\">\r\n <div class=\"left-group\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleNew\">新建教材信息</el-button>\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadList\">下载教材列表</el-button>\r\n <el-button icon=\"el-icon-folder-opened\" @click=\"handleDownloadZip\">所选文件资料打包ZIP下载</el-button>\r\n </div>\r\n <div class=\"right-group\">\r\n <el-button icon=\"el-icon-download\" @click=\"handleDownloadTemplate\">【教材数据文件模板】下载</el-button>\r\n <div class=\"file-input\">\r\n <input ref=\"fileInput\" type=\"file\" accept=\".xls,.xlsx\" style=\"display: none\" @change=\"handleFileChange\" />\r\n <el-button icon=\"el-icon-folder-opened\" @click=\"handleChooseFile\">选择文件</el-button>\r\n <span class=\"file-name\">{{ fileName }}</span>\r\n <el-button type=\"primary\" icon=\"el-icon-upload2\" @click=\"handleImport\">上传数据</el-button>\r\n </div>\r\n </div>\r\n </div>\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 <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"mc\" label=\"教材名称\" min-width=\"150\" show-overflow-tooltip />\r\n <el-table-column prop=\"zz\" label=\"作者\" min-width=\"120\" show-overflow-tooltip />\r\n <el-table-column prop=\"cbs\" label=\"出版社\" min-width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"cbrq\" label=\"出版日期\" min-width=\"100\" align=\"center\" :formatter=\"formatDate\" />\r\n <el-table-column prop=\"isbn\" label=\"ISBN\" min-width=\"140\" show-overflow-tooltip />\r\n <el-table-column prop=\"jclx\" label=\"教材类型\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"jcfl\" label=\"教材分类\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"jcbxlx\" label=\"编写类型\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"jcly\" label=\"教材来源\" min-width=\"130\" align=\"center\" />\r\n <el-table-column label=\"停用\" min-width=\"80\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <el-tag :type=\"row.ty ? 'danger' : 'success'\" size=\"small\">{{ row.ty ? '是' : '否' }}</el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" width=\"140\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-edit\" @click=\"handleEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"danger-text\" @click=\"handleDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <el-empty v-if=\"!loading && tableData.length === 0\" description=\"暂无教材数据\" :image-size=\"60\" />\r\n <div class=\"pagination-wrap\">\r\n <el-pagination\r\n :current-page=\"pageNum\"\r\n :page-size=\"pageSize\"\r\n :total=\"total\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n background\r\n @size-change=\"handleSizeChange\"\r\n @current-change=\"handleCurrentChange\"\r\n />\r\n </div>\r\n </el-card>\r\n </el-tab-pane>\r\n\r\n <!-- 教材库存单 -->\r\n <el-tab-pane label=\"教材库存单\" name=\"stock\">\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"stockSearchForm\" label-width=\"90px\" class=\"search-form\">\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"编号\"><el-input v-model=\"stockSearchForm.bh\" placeholder=\"请输入编号\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"名称\"><el-input v-model=\"stockSearchForm.mc\" placeholder=\"请输入名称\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"类别\"><el-input v-model=\"stockSearchForm.lb\" placeholder=\"请输入类别\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"字别\"><el-input v-model=\"stockSearchForm.zb\" placeholder=\"请输入字别\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"状态\"><el-input v-model=\"stockSearchForm.zt\" placeholder=\"请输入状态\" clearable /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleStockSearch\">查询</el-button>\r\n <el-button icon=\"el-icon-refresh\" @click=\"handleStockReset\">重置</el-button>\r\n </div>\r\n </el-card>\r\n\r\n <div class=\"list-title\">教材库存单列表:</div>\r\n <div class=\"list-toolbar\">\r\n <div class=\"left-group\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleStockNew\">新增库存单</el-button>\r\n </div>\r\n </div>\r\n\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table v-loading=\"stockLoading\" :data=\"stockTableData\" stripe border highlight-current-row>\r\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"mc\" label=\"名称\" min-width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"qksm\" label=\"情况说明\" min-width=\"130\" show-overflow-tooltip />\r\n <el-table-column prop=\"lb\" label=\"类别\" min-width=\"90\" align=\"center\" />\r\n <el-table-column prop=\"zb\" label=\"字别\" min-width=\"90\" align=\"center\" />\r\n <el-table-column prop=\"cbbmbh\" label=\"承办部门编号\" min-width=\"110\" show-overflow-tooltip />\r\n <el-table-column prop=\"cbrbh\" label=\"承办人编号\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"bgybh\" label=\"保管员编号\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"sprbh\" label=\"审批人编号\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"zt\" label=\"状态\" min-width=\"90\" align=\"center\" />\r\n <el-table-column label=\"创建时间\" min-width=\"150\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtDateTime(row.cjsj) || '-' }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"修改时间\" min-width=\"150\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtDateTime(row.xgsj) || '-' }}</template>\r\n </el-table-column>\r\n <el-table-column label=\"操作\" width=\"150\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-view\" @click=\"handleStockDetail(row)\">详情</el-button>\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-edit\" @click=\"handleStockEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"danger-text\" @click=\"handleStockDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <el-empty v-if=\"!stockLoading && stockTableData.length === 0\" description=\"暂无库存单数据\" :image-size=\"60\" />\r\n <div class=\"pagination-wrap\">\r\n <el-pagination\r\n :current-page=\"stockPageNum\"\r\n :page-size=\"stockPageSize\"\r\n :total=\"stockTotal\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n background\r\n @size-change=\"handleStockSizeChange\"\r\n @current-change=\"handleStockCurrentChange\"\r\n />\r\n </div>\r\n </el-card>\r\n </el-tab-pane>\r\n\r\n <!-- 教材库存明细项 -->\r\n <el-tab-pane label=\"教材库存明细项\" name=\"detail\">\r\n <el-card shadow=\"never\" class=\"search-card\">\r\n <el-form :model=\"detailSearchForm\" label-width=\"110px\" class=\"search-form\">\r\n <el-row :gutter=\"0\">\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"编号\"><el-input v-model=\"detailSearchForm.bh\" placeholder=\"请输入编号\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"库存单编号\"><el-input v-model=\"detailSearchForm.jckcdbbh\" placeholder=\"请输入库存单编号\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"教材信息编号\"><el-input v-model=\"detailSearchForm.jcxxbh\" placeholder=\"请输入教材信息编号\" clearable /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"6\">\r\n <el-form-item label=\"还回完毕\">\r\n <el-select v-model=\"detailSearchForm.hwbwType\" class=\"w-full\">\r\n <el-option label=\"全部\" value=\"\" />\r\n <el-option label=\"未还回\" value=\"0\" />\r\n <el-option label=\"已还回\" value=\"1\" />\r\n </el-select>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div class=\"search-actions\">\r\n <el-button type=\"primary\" icon=\"el-icon-search\" @click=\"handleDetailSearch\">查询</el-button>\r\n <el-button icon=\"el-icon-refresh\" @click=\"handleDetailReset\">重置</el-button>\r\n </div>\r\n </el-card>\r\n\r\n <div class=\"list-title\">教材库存明细项列表:</div>\r\n <div class=\"list-toolbar\">\r\n <div class=\"left-group\">\r\n <el-button type=\"primary\" icon=\"el-icon-plus\" @click=\"handleDetailNew\">新增库存明细项</el-button>\r\n </div>\r\n </div>\r\n\r\n <el-card shadow=\"never\" class=\"table-card\">\r\n <el-table v-loading=\"detailLoading\" :data=\"detailTableData\" stripe border highlight-current-row>\r\n <el-table-column type=\"index\" label=\"序号\" width=\"60\" align=\"center\" />\r\n <el-table-column prop=\"jckcdbbh\" label=\"库存单编号\" min-width=\"100\" align=\"center\" />\r\n <el-table-column prop=\"jcxxbh\" label=\"教材信息编号\" min-width=\"110\" align=\"center\" />\r\n <el-table-column prop=\"sl\" label=\"数量\" min-width=\"80\" align=\"center\" />\r\n <el-table-column prop=\"qzkcmxxbh\" label=\"前置库存明细项编号\" min-width=\"130\" show-overflow-tooltip />\r\n <el-table-column label=\"还回完毕\" min-width=\"90\" align=\"center\">\r\n <template slot-scope=\"{ row }\">\r\n <el-tag :type=\"row.hwbw ? 'success' : 'info'\" size=\"small\">{{ row.hwbw ? '是' : '否' }}</el-tag>\r\n </template>\r\n </el-table-column>\r\n <el-table-column label=\"还回完毕时间\" min-width=\"150\" align=\"center\">\r\n <template slot-scope=\"{ row }\">{{ fmtDateTime(row.hwbwsj) || '-' }}</template>\r\n </el-table-column>\r\n <el-table-column prop=\"bz\" label=\"备注\" min-width=\"120\" show-overflow-tooltip />\r\n <el-table-column label=\"操作\" width=\"150\" align=\"center\" fixed=\"right\">\r\n <template slot-scope=\"{ row }\">\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-view\" @click=\"handleDetailView(row)\">详情</el-button>\r\n <el-button type=\"text\" size=\"small\" icon=\"el-icon-edit\" @click=\"handleDetailEdit(row)\">编辑</el-button>\r\n <el-button type=\"text\" size=\"small\" class=\"danger-text\" @click=\"handleDetailDelete(row)\">删除</el-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n <el-empty v-if=\"!detailLoading && detailTableData.length === 0\" description=\"暂无库存明细项数据\" :image-size=\"60\" />\r\n <div class=\"pagination-wrap\">\r\n <el-pagination\r\n :current-page=\"detailPageNum\"\r\n :page-size=\"detailPageSize\"\r\n :total=\"detailTotal\"\r\n :page-sizes=\"[10, 20, 50, 100]\"\r\n layout=\"total, sizes, prev, pager, next, jumper\"\r\n background\r\n @size-change=\"handleDetailSizeChange\"\r\n @current-change=\"handleDetailCurrentChange\"\r\n />\r\n </div>\r\n </el-card>\r\n </el-tab-pane>\r\n </el-tabs>\r\n\r\n <!-- 新建教材对话框 -->\r\n <el-dialog\r\n :visible=\"addDialogVisible\"\r\n title=\"新建教材\"\r\n width=\"780px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => addDialogVisible = val\"\r\n >\r\n <el-form ref=\"addFormRef\" :model=\"addForm\" :rules=\"formRules\" label-width=\"140px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材名称\" prop=\"mc\"><el-input v-model=\"addForm.mc\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编写类型\" prop=\"jcbxlx\">\r\n <el-select v-model=\"addForm.jcbxlx\" placeholder=\"请选择\" style=\"width:100%\">\r\n <el-option v-for=\"item in jcbxlxOptions\" :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-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"作者\"><el-input v-model=\"addForm.zz\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版社\"><el-input v-model=\"addForm.cbs\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"ISBN\"><el-input v-model=\"addForm.isbn\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版日期\">\r\n <el-date-picker v-model=\"addForm.cbrq\" type=\"date\" value-format=\"yyyy-MM-dd\" placeholder=\"选择\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材分类\">\r\n <el-select v-model=\"addForm.jcfl\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcflOptions\" :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 label=\"教材类型\">\r\n <el-select v-model=\"addForm.jclx\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jclxOptions\" :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-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"重点类型\">\r\n <el-select v-model=\"addForm.jczdlx\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jczdlxOptions\" :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 label=\"教材来源\">\r\n <el-select v-model=\"addForm.jcly\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jclyOptions\" :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-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材层次\">\r\n <el-select v-model=\"addForm.jccc\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcccOptions\" :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 label=\"出版方式\">\r\n <el-select v-model=\"addForm.cbfs\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in cbfsOptions\" :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-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"版次\"><el-input v-model=\"addForm.bc\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"开本\"><el-input v-model=\"addForm.kb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"单价\"><el-input-number v-model=\"addForm.dj\" :min=\"0\" :precision=\"2\" style=\"width:100%\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"计量单位\">\r\n <el-select v-model=\"addForm.jldw\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jldwOptions\" :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-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"责任教员联系方式\"><el-input v-model=\"addForm.zrjyjlxff\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材代码\"><el-input v-model=\"addForm.jcdm\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材密级\">\r\n <el-select v-model=\"addForm.jcmj\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcmjOptions\" :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 label=\"编写单位\"><el-input v-model=\"addForm.bxdw\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"备注\"><el-input v-model=\"addForm.bz\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"属性\">\r\n <el-checkbox v-model=\"addForm.xcy\">需彩印</el-checkbox>\r\n <el-checkbox v-model=\"addForm.ty\" class=\"margin-left-10\">停用</el-checkbox>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n <div slot=\"footer\">\r\n <el-button @click=\"addDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"addSaving\" @click=\"handleAddConfirm\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 编辑教材对话框 -->\r\n <el-dialog\r\n :visible=\"editDialogVisible\"\r\n title=\"编辑教材\"\r\n width=\"780px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => editDialogVisible = val\"\r\n >\r\n <div v-loading=\"editLoading\">\r\n <el-form ref=\"editFormRef\" :model=\"editForm\" :rules=\"formRules\" label-width=\"140px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编号\"><el-input v-model=\"editForm.bh\" disabled /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材名称\" prop=\"mc\"><el-input v-model=\"editForm.mc\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编写类型\" prop=\"jcbxlx\">\r\n <el-select v-model=\"editForm.jcbxlx\" placeholder=\"请选择\" style=\"width:100%\">\r\n <el-option v-for=\"item in jcbxlxOptions\" :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 label=\"作者\"><el-input v-model=\"editForm.zz\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版社\"><el-input v-model=\"editForm.cbs\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"ISBN\"><el-input v-model=\"editForm.isbn\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版日期\">\r\n <el-date-picker v-model=\"editForm.cbrq\" type=\"date\" value-format=\"yyyy-MM-dd\" placeholder=\"选择\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材分类\">\r\n <el-select v-model=\"editForm.jcfl\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcflOptions\" :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-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材类型\">\r\n <el-select v-model=\"editForm.jclx\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jclxOptions\" :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 label=\"重点类型\">\r\n <el-select v-model=\"editForm.jczdlx\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jczdlxOptions\" :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-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材来源\">\r\n <el-select v-model=\"editForm.jcly\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jclyOptions\" :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 label=\"教材层次\">\r\n <el-select v-model=\"editForm.jccc\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcccOptions\" :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-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"出版方式\">\r\n <el-select v-model=\"editForm.cbfs\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in cbfsOptions\" :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 label=\"版次\"><el-input v-model=\"editForm.bc\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"开本\"><el-input v-model=\"editForm.kb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"单价\"><el-input-number v-model=\"editForm.dj\" :min=\"0\" :precision=\"2\" style=\"width:100%\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"计量单位\">\r\n <el-select v-model=\"editForm.jldw\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jldwOptions\" :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 label=\"责任教员联系方式\"><el-input v-model=\"editForm.zrjyjlxff\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材代码\"><el-input v-model=\"editForm.jcdm\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材密级\">\r\n <el-select v-model=\"editForm.jcmj\" placeholder=\"请选择\" clearable style=\"width:100%\">\r\n <el-option v-for=\"item in jcmjOptions\" :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-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编写单位\"><el-input v-model=\"editForm.bxdw\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"备注\"><el-input v-model=\"editForm.bz\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"属性\">\r\n <el-checkbox v-model=\"editForm.xcy\">需彩印</el-checkbox>\r\n <el-checkbox v-model=\"editForm.ty\" class=\"margin-left-10\">停用</el-checkbox>\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </div>\r\n <div slot=\"footer\">\r\n <el-button @click=\"editDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"editSaving\" @click=\"handleEditConfirm\">保存</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 库存单新增/编辑对话框 -->\r\n <el-dialog\r\n :visible=\"stockFormDialogVisible\"\r\n :title=\"isStockAdd ? '新增库存单' : '编辑库存单'\"\r\n width=\"640px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => stockFormDialogVisible = val\"\r\n >\r\n <div v-loading=\"stockFormLoading\">\r\n <el-form ref=\"stockFormRef\" :model=\"stockForm\" :rules=\"stockFormRules\" label-width=\"120px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编号\" v-if=\"!isStockAdd\"><el-input v-model=\"stockForm.bh\" disabled /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"名称\" prop=\"mc\"><el-input v-model=\"stockForm.mc\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"类别\"><el-input v-model=\"stockForm.lb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"字别\"><el-input v-model=\"stockForm.zb\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"承办部门编号\"><el-input v-model=\"stockForm.cbbmbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"承办人编号\"><el-input v-model=\"stockForm.cbrbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"保管员编号\"><el-input v-model=\"stockForm.bgybh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"审批人编号\"><el-input v-model=\"stockForm.sprbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"状态\"><el-input v-model=\"stockForm.zt\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"情况说明\"><el-input v-model=\"stockForm.qksm\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"备注\"><el-input v-model=\"stockForm.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"JSONZD\"><el-input v-model=\"stockForm.jsonzd\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </div>\r\n <div slot=\"footer\">\r\n <el-button @click=\"stockFormDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"stockSaving\" @click=\"handleStockFormConfirm\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 库存单详情对话框 -->\r\n <el-dialog\r\n :visible=\"stockDetailDialogVisible\"\r\n title=\"库存单详情\"\r\n width=\"640px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => stockDetailDialogVisible = val\"\r\n >\r\n <el-descriptions :column=\"2\" border size=\"medium\">\r\n <el-descriptions-item label=\"编号\">{{ stockDetailData.bh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"名称\">{{ stockDetailData.mc || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"类别\">{{ stockDetailData.lb || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"字别\">{{ stockDetailData.zb || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"情况说明\" :span=\"2\">{{ stockDetailData.qksm || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"承办部门编号\">{{ stockDetailData.cbbmbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"承办人编号\">{{ stockDetailData.cbrbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"保管员编号\">{{ stockDetailData.bgybh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"审批人编号\">{{ stockDetailData.sprbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"状态\">{{ stockDetailData.zt || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"备注\">{{ stockDetailData.bz || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"JSONZD\">{{ stockDetailData.jsonzd || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"创建时间\">{{ fmtDateTime(stockDetailData.cjsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"修改时间\">{{ fmtDateTime(stockDetailData.xgsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"提交时间\">{{ fmtDateTime(stockDetailData.tjsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"审批时间\">{{ fmtDateTime(stockDetailData.spsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"执行时间\">{{ fmtDateTime(stockDetailData.zxsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"结束时间\">{{ fmtDateTime(stockDetailData.jssj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"退回意见\">{{ stockDetailData.thyj || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"退回时间\">{{ fmtDateTime(stockDetailData.thsj) || '-' }}</el-descriptions-item>\r\n </el-descriptions>\r\n <div slot=\"footer\">\r\n <el-button @click=\"stockDetailDialogVisible = false\">关闭</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 库存明细项新增/编辑对话框 -->\r\n <el-dialog\r\n :visible=\"detailFormDialogVisible\"\r\n :title=\"isDetailAdd ? '新增库存明细项' : '编辑库存明细项'\"\r\n width=\"640px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => detailFormDialogVisible = val\"\r\n >\r\n <div v-loading=\"detailFormLoading\">\r\n <el-form ref=\"detailFormRef\" :model=\"detailForm\" :rules=\"detailFormRules\" label-width=\"140px\" class=\"add-form\">\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"编号\" v-if=\"!isDetailAdd\"><el-input v-model=\"detailForm.bh\" disabled /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"库存单编号\" prop=\"jckcdbbh\"><el-input v-model=\"detailForm.jckcdbbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"教材信息编号\" prop=\"jcxxbh\"><el-input v-model=\"detailForm.jcxxbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"数量\" prop=\"sl\"><el-input-number v-model=\"detailForm.sl\" :min=\"0\" :precision=\"0\" style=\"width:100%\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"前置库存明细项编号\"><el-input v-model=\"detailForm.qzkcmxxbh\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"还回完毕\">\r\n <el-switch v-model=\"detailForm.hwbw\" active-text=\"是\" inactive-text=\"否\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"12\">\r\n <el-form-item label=\"还回完毕时间\">\r\n <el-date-picker v-model=\"detailForm.hwbwsj\" type=\"datetime\" value-format=\"yyyy-MM-dd HH:mm:ss\" placeholder=\"选择\" style=\"width:100%\" />\r\n </el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"备注\"><el-input v-model=\"detailForm.bz\" type=\"textarea\" :rows=\"2\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n <el-row :gutter=\"16\">\r\n <el-col :span=\"24\">\r\n <el-form-item label=\"JSONZD\"><el-input v-model=\"detailForm.jsonzd\" placeholder=\"请输入\" /></el-form-item>\r\n </el-col>\r\n </el-row>\r\n </el-form>\r\n </div>\r\n <div slot=\"footer\">\r\n <el-button @click=\"detailFormDialogVisible = false\">取消</el-button>\r\n <el-button type=\"primary\" :loading=\"detailSaving\" @click=\"handleDetailFormConfirm\">确定</el-button>\r\n </div>\r\n </el-dialog>\r\n\r\n <!-- 库存明细项详情对话框 -->\r\n <el-dialog\r\n :visible=\"detailViewDialogVisible\"\r\n title=\"库存明细项详情\"\r\n width=\"640px\"\r\n :close-on-click-modal=\"false\"\r\n @update:visible=\"val => detailViewDialogVisible = val\"\r\n >\r\n <el-descriptions :column=\"2\" border size=\"medium\">\r\n <el-descriptions-item label=\"编号\">{{ detailViewData.bh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"库存单编号\">{{ detailViewData.jckcdbbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"教材信息编号\">{{ detailViewData.jcxxbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"数量\">{{ fmtVal(detailViewData.sl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"前置库存明细项编号\" :span=\"2\">{{ detailViewData.qzkcmxxbh || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"还回完毕\">\r\n <el-tag :type=\"detailViewData.hwbw ? 'success' : 'info'\" size=\"small\">{{ detailViewData.hwbw ? '是' : '否' }}</el-tag>\r\n </el-descriptions-item>\r\n <el-descriptions-item label=\"还回完毕时间\">{{ fmtDateTime(detailViewData.hwbwsj) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"备注\">{{ detailViewData.bz || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"JSONZD\">{{ detailViewData.jsonzd || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"快照_事务后库存数量\">{{ fmtVal(detailViewData.kzswHkcsl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"快照_事务后借出数量\">{{ fmtVal(detailViewData.kzswHjcsl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"快照_事务前库存数量\">{{ fmtVal(detailViewData.kzswQkcsl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"快照_事务前借出数量\">{{ fmtVal(detailViewData.kzswQjcsl) }}</el-descriptions-item>\r\n <el-descriptions-item label=\"创建时间\">{{ fmtDateTime(detailViewData.createTime) || '-' }}</el-descriptions-item>\r\n <el-descriptions-item label=\"更新时间\">{{ fmtDateTime(detailViewData.updateTime) || '-' }}</el-descriptions-item>\r\n </el-descriptions>\r\n <div slot=\"footer\">\r\n <el-button @click=\"detailViewDialogVisible = false\">关闭</el-button>\r\n </div>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { saveAs } from 'file-saver'\r\nimport {\r\n listTeachingMaterial,\r\n getTeachingMaterialById,\r\n addTeachingMaterial,\r\n updateTeachingMaterial,\r\n deleteTeachingMaterial,\r\n downloadTeachingMaterialTemplate,\r\n importTeachingMaterial\r\n} from '@/api/textbook/teachingMaterial'\r\nimport {\r\n listTeachingStock,\r\n getTeachingStock,\r\n addTeachingStock,\r\n updateTeachingStock,\r\n deleteTeachingStock,\r\n listTeachingStockDetail,\r\n getTeachingStockDetail,\r\n addTeachingStockDetail,\r\n updateTeachingStockDetail,\r\n deleteTeachingStockDetail\r\n} from '@/api/textbook/teachingStock'\r\n\r\nexport default {\r\n name: 'TextbookIndex',\r\n data() {\r\n return {\r\n activeTab: 'info',\r\n\r\n // ==================== 查询表单(仅后端 Mapper 支持的字段) ====================\r\n searchForm: {\r\n bh: '', mc: '', zz: '', cbs: '', isbn: '',\r\n jcfl: '', jclx: '', tyType: ''\r\n },\r\n\r\n // ==================== 下拉选项 ====================\r\n jcflOptions: ['基本教材', '辅助教材', '参考资料'],\r\n jclxOptions: ['国家规划', '军队规划', '院校自编'],\r\n jcbxlxOptions: ['自编', '选用'],\r\n jczdlxOptions: ['一般教材', '重点教材', '规划教材'],\r\n jclyOptions: ['教研保障中心外购', '自购', '上级配发'],\r\n jcccOptions: ['无', '本科', '研究生'],\r\n cbfsOptions: ['公开出版', '内部出版'],\r\n jcmjOptions: ['公开', '内部', '秘密'],\r\n jldwOptions: ['本', '册'],\r\n\r\n // ==================== 表格数据 ====================\r\n loading: false,\r\n tableData: [],\r\n pageNum: 1,\r\n pageSize: 20,\r\n total: 0,\r\n\r\n // ==================== 新建教材 ====================\r\n addDialogVisible: false,\r\n addSaving: false,\r\n addForm: this.createEmptyForm(),\r\n\r\n // ==================== 编辑教材 ====================\r\n editDialogVisible: false,\r\n editLoading: false,\r\n editSaving: false,\r\n editForm: this.createEmptyForm(),\r\n\r\n // ==================== 表单校验 ====================\r\n formRules: {\r\n mc: [{ required: true, message: '请输入教材名称', trigger: 'blur' }],\r\n jcbxlx: [{ required: true, message: '请选择编写类型', trigger: 'change' }]\r\n },\r\n\r\n // ==================== 导入 ====================\r\n selectedFile: null,\r\n\r\n // ==================== 教材库存单(JCKCD ====================\r\n stockSearchForm: { bh: '', mc: '', lb: '', zb: '', zt: '' },\r\n stockLoading: false,\r\n stockTableData: [],\r\n stockPageNum: 1,\r\n stockPageSize: 20,\r\n stockTotal: 0,\r\n stockFormDialogVisible: false,\r\n stockFormLoading: false,\r\n stockSaving: false,\r\n isStockAdd: true,\r\n stockForm: this.createEmptyStockForm(),\r\n stockFormRules: {\r\n mc: [{ required: true, message: '请输入名称', trigger: 'blur' }]\r\n },\r\n stockDetailDialogVisible: false,\r\n stockDetailData: {},\r\n\r\n // ==================== 教材库存明细项(JCKCMXX ====================\r\n detailSearchForm: { bh: '', jckcdbbh: '', jcxxbh: '', hwbwType: '' },\r\n detailLoading: false,\r\n detailTableData: [],\r\n detailPageNum: 1,\r\n detailPageSize: 20,\r\n detailTotal: 0,\r\n detailFormDialogVisible: false,\r\n detailFormLoading: false,\r\n detailSaving: false,\r\n isDetailAdd: true,\r\n detailForm: this.createEmptyDetailForm(),\r\n detailFormRules: {\r\n jckcdbbh: [{ required: true, message: '请输入库存单编号', trigger: 'blur' }],\r\n jcxxbh: [{ required: true, message: '请输入教材信息编号', trigger: 'blur' }],\r\n sl: [{ required: true, message: '请输入数量', trigger: 'change' }]\r\n },\r\n detailViewDialogVisible: false,\r\n detailViewData: {}\r\n }\r\n },\r\n computed: {\r\n fileName() {\r\n return (this.selectedFile && this.selectedFile.name) || '未选择任何文件'\r\n }\r\n },\r\n mounted() {\r\n this.fetchList()\r\n },\r\n methods: {\r\n /** 表格日期格式化 */\r\n formatDate(row, column, cellValue) {\r\n return cellValue ? String(cellValue).slice(0, 10) : ''\r\n },\r\n\r\n /** 统一格式化后端 LocalDateTime(去除 T、截断到秒) */\r\n fmtDateTime(val) {\r\n if (val === null || val === undefined || val === '') return ''\r\n return String(val).replace('T', ' ').slice(0, 19)\r\n },\r\n\r\n /** 空值显示为 '-'Vue 2 模板表达式不支持 ?? 运算符) */\r\n fmtVal(val) {\r\n return (val === null || val === undefined || val === '') ? '-' : val\r\n },\r\n\r\n /** 创建空白教材表单 */\r\n createEmptyForm() {\r\n return {\r\n mc: '', zz: '', cbs: '', isbn: '', cbrq: '', jcfl: '', jclx: '',\r\n jcbxlx: '', jczdlx: '', jcly: '', jccc: '', bc: '', kb: '', dj: null,\r\n jldw: '本', zrjyjlxff: '', jcdm: '', cbfs: '', jcmj: '', bxdw: '',\r\n bz: '', xcy: false, ty: false\r\n }\r\n },\r\n\r\n /** 创建空白库存单表单 */\r\n createEmptyStockForm() {\r\n return {\r\n mc: '', qksm: '', lb: '', zb: '', cbbmbh: '', cbrbh: '',\r\n bgybh: '', sprbh: '', zt: '', bz: '', jsonzd: ''\r\n }\r\n },\r\n\r\n /** 创建空白库存明细项表单 */\r\n createEmptyDetailForm() {\r\n return {\r\n jckcdbbh: '', jcxxbh: '', sl: null, qzkcmxxbh: '',\r\n hwbw: false, hwbwsj: '', bz: '', jsonzd: ''\r\n }\r\n },\r\n\r\n /** 移除空值 */\r\n cleanPayload(obj) {\r\n const payload = {}\r\n Object.keys(obj).forEach(key => {\r\n const value = obj[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n payload[key] = value\r\n }\r\n })\r\n return payload\r\n },\r\n\r\n // ==================== 列表加载 ====================\r\n buildQuery() {\r\n const params = {}\r\n ;['bh', 'mc', 'zz', 'cbs', 'isbn', 'jcfl', 'jclx'].forEach(key => {\r\n const value = this.searchForm[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n params[key] = String(value).trim()\r\n }\r\n })\r\n if (this.searchForm.tyType === '0') params.ty = false\r\n else if (this.searchForm.tyType === '1') params.ty = true\r\n return params\r\n },\r\n\r\n fetchList() {\r\n this.loading = true\r\n const params = {\r\n pageNum: this.pageNum,\r\n pageSize: this.pageSize,\r\n ...this.buildQuery()\r\n }\r\n listTeachingMaterial(params).then(response => {\r\n const data = response.data || {}\r\n this.tableData = data.records || []\r\n this.total = data.total || 0\r\n this.loading = false\r\n }).catch(() => {\r\n this.tableData = []\r\n this.total = 0\r\n this.loading = false\r\n })\r\n },\r\n\r\n // ==================== 查询 / 重置 ====================\r\n handleSearch() {\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handleReset() {\r\n this.searchForm = {\r\n bh: '', mc: '', zz: '', cbs: '', isbn: '',\r\n jcfl: '', jclx: '', tyType: ''\r\n }\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n\r\n handleSizeChange(size) {\r\n this.pageSize = size\r\n this.pageNum = 1\r\n this.fetchList()\r\n },\r\n handleCurrentChange(page) {\r\n this.pageNum = page\r\n this.fetchList()\r\n },\r\n\r\n // ==================== 无后端接口的操作 ====================\r\n handleDownloadList() {\r\n this.$message.info('后端暂未提供该接口')\r\n },\r\n\r\n handleDownloadZip() {\r\n this.$message.info('后端暂未提供该接口')\r\n },\r\n\r\n // ==================== 新建教材 ====================\r\n handleNew() {\r\n this.addForm = this.createEmptyForm()\r\n this.$nextTick(() => {\r\n this.$refs.addFormRef && this.$refs.addFormRef.clearValidate()\r\n })\r\n this.addDialogVisible = true\r\n },\r\n\r\n handleAddConfirm() {\r\n this.$refs.addFormRef.validate(valid => {\r\n if (!valid) return\r\n this.addSaving = true\r\n addTeachingMaterial(this.buildPayload(this.addForm)).then(() => {\r\n this.$message.success('新增成功')\r\n this.addDialogVisible = false\r\n this.fetchList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.addSaving = false\r\n })\r\n })\r\n },\r\n\r\n // ==================== 编辑教材 ====================\r\n handleEdit(row) {\r\n this.editDialogVisible = true\r\n this.editLoading = true\r\n getTeachingMaterialById(row.id).then(response => {\r\n const data = response.data || {}\r\n const form = this.createEmptyForm()\r\n Object.keys(form).forEach(key => {\r\n if (data[key] !== undefined && data[key] !== null) form[key] = data[key]\r\n })\r\n // 日期字段截断适配 date 控件\r\n if (form.cbrq) form.cbrq = String(form.cbrq).slice(0, 10)\r\n form.id = data.id\r\n form.bh = data.bh\r\n this.editForm = form\r\n this.editLoading = false\r\n }).catch(() => {\r\n this.editDialogVisible = false\r\n this.editLoading = false\r\n })\r\n },\r\n\r\n handleEditConfirm() {\r\n this.$refs.editFormRef.validate(valid => {\r\n if (!valid) return\r\n const payload = this.buildPayload(this.editForm)\r\n if (!this.editForm.id) {\r\n this.$message.warning('缺少记录ID,无法保存')\r\n return\r\n }\r\n payload.id = this.editForm.id\r\n payload.bh = this.editForm.bh\r\n this.editSaving = true\r\n updateTeachingMaterial(payload).then(() => {\r\n this.$message.success('保存成功')\r\n this.editDialogVisible = false\r\n this.fetchList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.editSaving = false\r\n })\r\n })\r\n },\r\n\r\n /** 组装新增/编辑请求体(JCXX 实体,仅传非空字段) */\r\n buildPayload(form) {\r\n const payload = this.cleanPayload({\r\n mc: form.mc,\r\n zz: form.zz,\r\n cbs: form.cbs,\r\n isbn: form.isbn,\r\n jcfl: form.jcfl,\r\n jclx: form.jclx,\r\n jcbxlx: form.jcbxlx,\r\n jczdlx: form.jczdlx,\r\n jcly: form.jcly,\r\n jccc: form.jccc,\r\n bc: form.bc,\r\n kb: form.kb,\r\n jldw: form.jldw,\r\n zrjyjlxff: form.zrjyjlxff,\r\n jcdm: form.jcdm,\r\n cbfs: form.cbfs,\r\n jcmj: form.jcmj,\r\n bxdw: form.bxdw,\r\n bz: form.bz,\r\n xcy: !!form.xcy,\r\n ty: !!form.ty\r\n })\r\n // 日期字段转 ISO(后端 cbrq 为 LocalDateTime\r\n if (form.cbrq) payload.cbrq = form.cbrq + 'T00:00:00'\r\n // 数值字段\r\n if (form.dj !== '' && form.dj !== null && form.dj !== undefined) {\r\n payload.dj = Number(form.dj)\r\n }\r\n return payload\r\n },\r\n\r\n // ==================== 删除 ====================\r\n handleDelete(row) {\r\n if (!row.id) {\r\n this.$message.warning('当前行缺少ID')\r\n return\r\n }\r\n this.$confirm(`确定要删除教材「${row.mc || row.bh}」吗?`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n deleteTeachingMaterial(row.id).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchList()\r\n }).catch(() => {})\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 模板下载 / 导入 ====================\r\n handleDownloadTemplate() {\r\n downloadTeachingMaterialTemplate().then(blob => {\r\n saveAs(blob, '教材管理导入模板.xls')\r\n this.$message.success('模板下载成功')\r\n }).catch(() => {})\r\n },\r\n\r\n handleChooseFile() {\r\n this.$refs.fileInput && this.$refs.fileInput.click()\r\n },\r\n\r\n handleFileChange(e) {\r\n const input = e.target\r\n if (input.files && input.files.length > 0) {\r\n this.selectedFile = input.files[0]\r\n }\r\n },\r\n\r\n handleImport() {\r\n if (!this.selectedFile) {\r\n this.$message.warning('请先选择文件')\r\n return\r\n }\r\n importTeachingMaterial(this.selectedFile).then(response => {\r\n const count = (response && response.data) || 0\r\n this.$message.success(`导入成功,共导入 ${count} 条`)\r\n this.selectedFile = null\r\n if (this.$refs.fileInput) this.$refs.fileInput.value = ''\r\n this.fetchList()\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 教材库存单 ====================\r\n buildStockQuery() {\r\n const params = {}\r\n ;['bh', 'mc', 'lb', 'zb', 'zt'].forEach(key => {\r\n const value = this.stockSearchForm[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n params[key] = String(value).trim()\r\n }\r\n })\r\n return params\r\n },\r\n\r\n fetchStockList() {\r\n this.stockLoading = true\r\n const params = {\r\n pageNum: this.stockPageNum,\r\n pageSize: this.stockPageSize,\r\n ...this.buildStockQuery()\r\n }\r\n listTeachingStock(params).then(response => {\r\n const data = response.data || {}\r\n this.stockTableData = data.records || []\r\n this.stockTotal = data.total || 0\r\n this.stockLoading = false\r\n }).catch(() => {\r\n this.stockTableData = []\r\n this.stockTotal = 0\r\n this.stockLoading = false\r\n })\r\n },\r\n\r\n handleStockSearch() {\r\n this.stockPageNum = 1\r\n this.fetchStockList()\r\n },\r\n\r\n handleStockReset() {\r\n this.stockSearchForm = { bh: '', mc: '', lb: '', zb: '', zt: '' }\r\n this.stockPageNum = 1\r\n this.fetchStockList()\r\n },\r\n\r\n handleStockSizeChange(size) {\r\n this.stockPageSize = size\r\n this.stockPageNum = 1\r\n this.fetchStockList()\r\n },\r\n handleStockCurrentChange(page) {\r\n this.stockPageNum = page\r\n this.fetchStockList()\r\n },\r\n\r\n handleStockNew() {\r\n this.isStockAdd = true\r\n this.stockForm = this.createEmptyStockForm()\r\n this.$nextTick(() => {\r\n this.$refs.stockFormRef && this.$refs.stockFormRef.clearValidate()\r\n })\r\n this.stockFormDialogVisible = true\r\n },\r\n\r\n handleStockEdit(row) {\r\n this.isStockAdd = false\r\n this.stockFormDialogVisible = true\r\n this.stockFormLoading = true\r\n getTeachingStock(row.id).then(response => {\r\n const data = response.data || {}\r\n const form = this.createEmptyStockForm()\r\n Object.keys(form).forEach(key => {\r\n if (data[key] !== undefined && data[key] !== null) form[key] = data[key]\r\n })\r\n form.id = data.id\r\n form.bh = data.bh\r\n this.stockForm = form\r\n this.stockFormLoading = false\r\n }).catch(() => {\r\n this.stockFormDialogVisible = false\r\n this.stockFormLoading = false\r\n })\r\n },\r\n\r\n buildStockPayload() {\r\n const f = this.stockForm\r\n const payload = this.cleanPayload({\r\n mc: f.mc,\r\n qksm: f.qksm,\r\n lb: f.lb,\r\n zb: f.zb,\r\n cbbmbh: f.cbbmbh,\r\n cbrbh: f.cbrbh,\r\n bgybh: f.bgybh,\r\n sprbh: f.sprbh,\r\n zt: f.zt,\r\n bz: f.bz,\r\n jsonzd: f.jsonzd\r\n })\r\n return payload\r\n },\r\n\r\n handleStockFormConfirm() {\r\n this.$refs.stockFormRef.validate(valid => {\r\n if (!valid) return\r\n const payload = this.buildStockPayload()\r\n if (!this.isStockAdd) {\r\n if (!this.stockForm.id) {\r\n this.$message.warning('缺少记录ID,无法保存')\r\n return\r\n }\r\n payload.id = this.stockForm.id\r\n payload.bh = this.stockForm.bh\r\n }\r\n this.stockSaving = true\r\n const request = this.isStockAdd ? addTeachingStock(payload) : updateTeachingStock(payload)\r\n request.then(() => {\r\n this.$message.success(this.isStockAdd ? '新增成功' : '修改成功')\r\n this.stockFormDialogVisible = false\r\n this.fetchStockList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.stockSaving = false\r\n })\r\n })\r\n },\r\n\r\n handleStockDetail(row) {\r\n this.stockDetailData = row\r\n this.stockDetailDialogVisible = true\r\n },\r\n\r\n handleStockDelete(row) {\r\n if (!row.id) {\r\n this.$message.warning('当前行缺少ID')\r\n return\r\n }\r\n this.$confirm(`确定要删除库存单「${row.mc || row.bh}」吗?`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n deleteTeachingStock(row.id).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchStockList()\r\n }).catch(() => {})\r\n }).catch(() => {})\r\n },\r\n\r\n // ==================== 教材库存明细项 ====================\r\n buildDetailQuery() {\r\n const params = {}\r\n ;['bh', 'jckcdbbh', 'jcxxbh'].forEach(key => {\r\n const value = this.detailSearchForm[key]\r\n if (value !== '' && value !== null && value !== undefined) {\r\n params[key] = String(value).trim()\r\n }\r\n })\r\n if (this.detailSearchForm.hwbwType === '0') params.hwbw = false\r\n else if (this.detailSearchForm.hwbwType === '1') params.hwbw = true\r\n return params\r\n },\r\n\r\n fetchDetailList() {\r\n this.detailLoading = true\r\n const params = {\r\n pageNum: this.detailPageNum,\r\n pageSize: this.detailPageSize,\r\n ...this.buildDetailQuery()\r\n }\r\n listTeachingStockDetail(params).then(response => {\r\n const data = response.data || {}\r\n this.detailTableData = data.records || []\r\n this.detailTotal = data.total || 0\r\n this.detailLoading = false\r\n }).catch(() => {\r\n this.detailTableData = []\r\n this.detailTotal = 0\r\n this.detailLoading = false\r\n })\r\n },\r\n\r\n handleDetailSearch() {\r\n this.detailPageNum = 1\r\n this.fetchDetailList()\r\n },\r\n\r\n handleDetailReset() {\r\n this.detailSearchForm = { bh: '', jckcdbbh: '', jcxxbh: '', hwbwType: '' }\r\n this.detailPageNum = 1\r\n this.fetchDetailList()\r\n },\r\n\r\n handleDetailSizeChange(size) {\r\n this.detailPageSize = size\r\n this.detailPageNum = 1\r\n this.fetchDetailList()\r\n },\r\n handleDetailCurrentChange(page) {\r\n this.detailPageNum = page\r\n this.fetchDetailList()\r\n },\r\n\r\n handleDetailNew() {\r\n this.isDetailAdd = true\r\n this.detailForm = this.createEmptyDetailForm()\r\n this.$nextTick(() => {\r\n this.$refs.detailFormRef && this.$refs.detailFormRef.clearValidate()\r\n })\r\n this.detailFormDialogVisible = true\r\n },\r\n\r\n handleDetailEdit(row) {\r\n this.isDetailAdd = false\r\n this.detailFormDialogVisible = true\r\n this.detailFormLoading = true\r\n getTeachingStockDetail(row.id).then(response => {\r\n const data = response.data || {}\r\n const form = this.createEmptyDetailForm()\r\n Object.keys(form).forEach(key => {\r\n if (data[key] !== undefined && data[key] !== null) form[key] = data[key]\r\n })\r\n if (form.hwbwsj) form.hwbwsj = String(form.hwbwsj).replace('T', ' ').slice(0, 19)\r\n form.id = data.id\r\n form.bh = data.bh\r\n this.detailForm = form\r\n this.detailFormLoading = false\r\n }).catch(() => {\r\n this.detailFormDialogVisible = false\r\n this.detailFormLoading = false\r\n })\r\n },\r\n\r\n buildDetailPayload() {\r\n const f = this.detailForm\r\n const payload = this.cleanPayload({\r\n jckcdbbh: f.jckcdbbh,\r\n jcxxbh: f.jcxxbh,\r\n qzkcmxxbh: f.qzkcmxxbh,\r\n hwbw: !!f.hwbw,\r\n bz: f.bz,\r\n jsonzd: f.jsonzd\r\n })\r\n if (f.sl !== '' && f.sl !== null && f.sl !== undefined) {\r\n payload.sl = Number(f.sl)\r\n }\r\n // 还回完毕时间为 LocalDateTime,转 ISO\r\n if (f.hwbwsj) payload.hwbwsj = f.hwbwsj.replace(' ', 'T')\r\n return payload\r\n },\r\n\r\n handleDetailFormConfirm() {\r\n this.$refs.detailFormRef.validate(valid => {\r\n if (!valid) return\r\n const payload = this.buildDetailPayload()\r\n if (!this.isDetailAdd) {\r\n if (!this.detailForm.id) {\r\n this.$message.warning('缺少记录ID,无法保存')\r\n return\r\n }\r\n payload.id = this.detailForm.id\r\n payload.bh = this.detailForm.bh\r\n }\r\n this.detailSaving = true\r\n const request = this.isDetailAdd ? addTeachingStockDetail(payload) : updateTeachingStockDetail(payload)\r\n request.then(() => {\r\n this.$message.success(this.isDetailAdd ? '新增成功' : '修改成功')\r\n this.detailFormDialogVisible = false\r\n this.fetchDetailList()\r\n }).catch(() => {\r\n }).finally(() => {\r\n this.detailSaving = false\r\n })\r\n })\r\n },\r\n\r\n handleDetailView(row) {\r\n this.detailViewData = row\r\n this.detailViewDialogVisible = true\r\n },\r\n\r\n handleDetailDelete(row) {\r\n if (!row.id) {\r\n this.$message.warning('当前行缺少ID')\r\n return\r\n }\r\n this.$confirm(`确定要删除库存明细项「${row.bh}」吗?`, '系统提示', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n type: 'warning'\r\n }).then(() => {\r\n deleteTeachingStockDetail(row.id).then(() => {\r\n this.$message.success('删除成功')\r\n this.fetchDetailList()\r\n }).catch(() => {})\r\n }).catch(() => {})\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.textbook-tabs {\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-form-item {\r\n margin-bottom: 0;\r\n padding: 10px 12px;\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 .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 .list-toolbar {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n margin-bottom: 16px;\r\n\r\n .left-group,\r\n .right-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n flex-wrap: wrap;\r\n }\r\n\r\n .file-input {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n\r\n .file-name {\r\n font-size: 14px;\r\n color: #606266;\r\n min-width: 120px;\r\n }\r\n }\r\n }\r\n\r\n .table-card {\r\n margin-bottom: 16px;\r\n\r\n ::v-deep(.el-table) {\r\n width: 100%;\r\n }\r\n\r\n .pagination-wrap {\r\n display: flex;\r\n justify-content: flex-end;\r\n margin-top: 16px;\r\n }\r\n }\r\n\r\n .margin-left-10 {\r\n margin-left: 10px;\r\n }\r\n\r\n // 表格操作按钮文字颜色\r\n .danger-text {\r\n color: #f56c6c;\r\n padding: 0;\r\n }\r\n}\r\n</style>\r\n"]}]}