You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
399 lines
8.6 KiB
399 lines
8.6 KiB
<template>
|
|
<el-dialog
|
|
title="纸张管理"
|
|
:visible.sync="dialogVisible"
|
|
:close-on-click-modal="false"
|
|
width="900px"
|
|
top="5vh"
|
|
custom-class="paper-management-dialog"
|
|
:append-to-body="true"
|
|
@close="handleDialogClose"
|
|
>
|
|
<div class="paper-management-content">
|
|
<!-- 纸张表单区域 -->
|
|
<div class="form-section">
|
|
<PaperForm
|
|
:paper-data="currentPaper"
|
|
:is-edit-mode="isEditMode"
|
|
:existing-papers="paperList"
|
|
@save="handleSave"
|
|
@cancel="handleCancel"
|
|
/>
|
|
</div>
|
|
|
|
<!-- 纸张列表区域 -->
|
|
<div class="list-section">
|
|
<PaperList
|
|
:papers="paperList"
|
|
:loading="listLoading"
|
|
:table-height="300"
|
|
@edit="handleEdit"
|
|
@delete="handleDelete"
|
|
@refresh="loadPaperList"
|
|
@toggle-status="handleToggleStatus"
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 对话框底部 -->
|
|
<div slot="footer" class="dialog-footer">
|
|
<div class="footer-info">
|
|
<span class="paper-count">
|
|
共 {{ paperList.length }} 个纸张规格
|
|
({{ activePaperCount }} 个启用)
|
|
</span>
|
|
</div>
|
|
<div class="footer-actions">
|
|
<el-button @click="handleClose">关闭</el-button>
|
|
</div>
|
|
</div>
|
|
</el-dialog>
|
|
</template>
|
|
|
|
<script>
|
|
import PaperForm from './PaperForm.vue'
|
|
import PaperList from './PaperList.vue'
|
|
import { getPaperList } from '@/api/labelSetting/paperManagement.js'
|
|
import dynamicPaperConfig from '@/utils/paperConfigDynamic.js'
|
|
|
|
export default {
|
|
name: 'PaperManagementDialog',
|
|
components: {
|
|
PaperForm,
|
|
PaperList
|
|
},
|
|
props: {
|
|
visible: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
},
|
|
emits: ['update:visible', 'paper-updated'],
|
|
data() {
|
|
return {
|
|
paperList: [],
|
|
currentPaper: null,
|
|
isEditMode: false,
|
|
listLoading: false,
|
|
dialogVisible: false
|
|
}
|
|
},
|
|
computed: {
|
|
// 启用的纸张数量
|
|
activePaperCount() {
|
|
return this.paperList.filter(paper => paper.isActive).length
|
|
}
|
|
},
|
|
watch: {
|
|
visible: {
|
|
handler(newVal) {
|
|
this.dialogVisible = newVal
|
|
if (newVal) {
|
|
this.initDialog()
|
|
}
|
|
},
|
|
immediate: true
|
|
},
|
|
dialogVisible(newVal) {
|
|
// 当对话框关闭时,通知父组件
|
|
this.$emit('update:visible', newVal)
|
|
}
|
|
},
|
|
beforeDestroy() {
|
|
// 确保组件销毁前清理状态
|
|
this.paperList = []
|
|
this.currentPaper = null
|
|
this.isEditMode = false
|
|
this.listLoading = false
|
|
},
|
|
methods: {
|
|
// 初始化对话框
|
|
async initDialog() {
|
|
await this.loadPaperList()
|
|
this.resetForm()
|
|
},
|
|
|
|
// 重置对话框状态
|
|
resetDialog() {
|
|
this.resetForm()
|
|
this.paperList = []
|
|
},
|
|
|
|
// 加载纸张列表
|
|
async loadPaperList() {
|
|
try {
|
|
this.listLoading = true
|
|
|
|
const { data } = await getPaperList({
|
|
site: this.$store.state.user.site
|
|
})
|
|
|
|
if (data.code === 200) {
|
|
this.paperList = data.data || []
|
|
|
|
// 更新动态纸张配置缓存
|
|
this.paperList.forEach(paper => {
|
|
dynamicPaperConfig.addPaperToCache(paper)
|
|
})
|
|
|
|
console.log('纸张列表加载成功:', this.paperList.length)
|
|
} else {
|
|
this.$message.error(data.msg || '加载纸张列表失败')
|
|
this.paperList = []
|
|
}
|
|
} catch (error) {
|
|
console.error('加载纸张列表失败:', error)
|
|
this.$message.error('加载纸张列表失败,请重试')
|
|
this.paperList = []
|
|
} finally {
|
|
this.listLoading = false
|
|
}
|
|
},
|
|
|
|
// 保存纸张
|
|
handleSave(savedPaper) {
|
|
if (this.isEditMode) {
|
|
// 更新模式:更新列表中的纸张
|
|
const index = this.paperList.findIndex(p => p.id === savedPaper.id)
|
|
if (index >= 0) {
|
|
this.$set(this.paperList, index, savedPaper)
|
|
}
|
|
|
|
// 更新缓存
|
|
dynamicPaperConfig.addPaperToCache(savedPaper)
|
|
|
|
// 重置为新增模式
|
|
this.resetForm()
|
|
} else {
|
|
// 新增模式:添加到列表
|
|
this.paperList.unshift(savedPaper)
|
|
|
|
// 更新缓存
|
|
dynamicPaperConfig.addPaperToCache(savedPaper)
|
|
}
|
|
|
|
// 通知父组件纸张数据已更新
|
|
this.$emit('paper-updated', {
|
|
action: this.isEditMode ? 'update' : 'create',
|
|
paper: savedPaper
|
|
})
|
|
},
|
|
|
|
// 取消操作
|
|
handleCancel() {
|
|
this.resetForm()
|
|
},
|
|
|
|
// 编辑纸张
|
|
handleEdit(paper) {
|
|
this.currentPaper = { ...paper }
|
|
this.isEditMode = true
|
|
|
|
// 滚动到表单区域
|
|
this.$nextTick(() => {
|
|
const formSection = this.$el.querySelector('.form-section')
|
|
if (formSection) {
|
|
formSection.scrollIntoView({ behavior: 'smooth', block: 'start' })
|
|
}
|
|
})
|
|
},
|
|
|
|
// 删除纸张
|
|
handleDelete(deletedPaper) {
|
|
// 从列表中移除
|
|
this.paperList = this.paperList.filter(p => p.id !== deletedPaper.id)
|
|
|
|
// 从缓存中移除
|
|
dynamicPaperConfig.removePaperFromCache(deletedPaper.id)
|
|
|
|
// 如果删除的是当前编辑的纸张,重置表单
|
|
if (this.isEditMode && this.currentPaper && this.currentPaper.id === deletedPaper.id) {
|
|
this.resetForm()
|
|
}
|
|
|
|
// 通知父组件
|
|
this.$emit('paper-updated', {
|
|
action: 'delete',
|
|
paper: deletedPaper
|
|
})
|
|
},
|
|
|
|
// 切换纸张状态
|
|
handleToggleStatus(updatedPaper) {
|
|
// 更新列表中的纸张状态
|
|
const index = this.paperList.findIndex(p => p.id === updatedPaper.id)
|
|
if (index >= 0) {
|
|
this.$set(this.paperList, index, updatedPaper)
|
|
}
|
|
|
|
// 更新缓存
|
|
dynamicPaperConfig.addPaperToCache(updatedPaper)
|
|
|
|
// 通知父组件
|
|
this.$emit('paper-updated', {
|
|
action: 'toggle-status',
|
|
paper: updatedPaper
|
|
})
|
|
},
|
|
|
|
// 重置表单
|
|
resetForm() {
|
|
this.currentPaper = null
|
|
this.isEditMode = false
|
|
},
|
|
|
|
// 关闭对话框
|
|
handleClose() {
|
|
this.dialogVisible = false
|
|
},
|
|
|
|
// 对话框关闭事件处理
|
|
handleDialogClose() {
|
|
// 延迟清理状态,避免销毁时机冲突
|
|
this.$nextTick(() => {
|
|
this.resetDialog()
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.paper-management-dialog {
|
|
border-radius: 8px !important;
|
|
}
|
|
|
|
.paper-management-content {
|
|
max-height: 70vh;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.form-section {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.list-section {
|
|
margin-top: 5px;
|
|
}
|
|
|
|
.dialog-footer {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 12px 0 0 0;
|
|
border-top: 1px solid #e4e7ed;
|
|
margin-top: 16px;
|
|
}
|
|
|
|
.footer-info {
|
|
flex: 1;
|
|
}
|
|
|
|
.paper-count {
|
|
font-size: 13px;
|
|
color: #606266;
|
|
}
|
|
|
|
.footer-actions {
|
|
display: flex;
|
|
gap: 8px;
|
|
}
|
|
|
|
/* Element UI 分隔线样式 */
|
|
.paper-management-content .el-divider {
|
|
margin: 16px 0;
|
|
}
|
|
|
|
.paper-management-content .el-divider__text {
|
|
background-color: #fff;
|
|
color: #909399;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.paper-management-content .el-divider__text i {
|
|
font-size: 14px;
|
|
}
|
|
|
|
/* 滚动条样式 */
|
|
.paper-management-content::-webkit-scrollbar {
|
|
width: 6px;
|
|
}
|
|
|
|
.paper-management-content::-webkit-scrollbar-track {
|
|
background: #f1f1f1;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.paper-management-content::-webkit-scrollbar-thumb {
|
|
background: #c1c1c1;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.paper-management-content::-webkit-scrollbar-thumb:hover {
|
|
background: #a8a8a8;
|
|
}
|
|
|
|
/* 响应式调整 */
|
|
@media (max-width: 1200px) {
|
|
.paper-management-dialog {
|
|
width: 95% !important;
|
|
margin: 0 auto !important;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.paper-management-dialog {
|
|
width: 98% !important;
|
|
top: 2vh !important;
|
|
}
|
|
|
|
.paper-management-content {
|
|
max-height: 80vh;
|
|
}
|
|
|
|
.dialog-footer {
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
align-items: stretch;
|
|
}
|
|
|
|
.footer-info {
|
|
text-align: center;
|
|
}
|
|
|
|
.footer-actions {
|
|
justify-content: center;
|
|
}
|
|
}
|
|
</style>
|
|
|
|
<!-- 全局样式 -->
|
|
<style>
|
|
.paper-management-dialog {
|
|
border-radius: 8px !important;
|
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12) !important;
|
|
}
|
|
|
|
.paper-management-dialog .el-dialog__header {
|
|
padding: 16px 20px 12px !important;
|
|
border-bottom: 1px solid #e4e7ed !important;
|
|
background: #fafafa !important;
|
|
}
|
|
|
|
.paper-management-dialog .el-dialog__title {
|
|
font-size: 16px !important;
|
|
font-weight: 600 !important;
|
|
color: #303133 !important;
|
|
}
|
|
|
|
.paper-management-dialog .el-dialog__body {
|
|
padding: 20px !important;
|
|
background: #fff !important;
|
|
}
|
|
|
|
.paper-management-dialog .el-dialog__footer {
|
|
padding: 12px 20px 16px !important;
|
|
border-top: 1px solid #e4e7ed !important;
|
|
background: #fafafa !important;
|
|
}
|
|
</style>
|