@@ -315,17 +311,19 @@ export default {
tableDisplayFields(val) {
this.doLayout()
},
- isProject: function(newValue, oldValue) {
- },
- isHasProject: function(newValue, oldValue) {
- },
- fixedStatusBar: function(newValue, oldValue) {
- },
- projectSelection: function(newValue, oldValue) {
+ // 监听打印弹窗状态,确保子组件加载完成后再连接打印服务
+ printDialogVisible(newVal) {
+ if (newVal && this.$refs.printComponent) {
+ // 弹窗已打开,子组件已挂载,执行连接操作
+ this.$refs.printComponent.connectprinter()
+ }
},
+ isProject: function(newValue, oldValue) {},
+ isHasProject: function(newValue, oldValue) {},
+ fixedStatusBar: function(newValue, oldValue) {},
+ projectSelection: function(newValue, oldValue) {},
smartQuery: {
- handler(n, o) {
- },
+ handler(n, o) {},
deep: true
}
},
@@ -353,51 +351,41 @@ export default {
}
this.query.queryType = this.stateOptions[0].value
},
- mounted() {
- },
+ mounted() {},
methods: {
- // 打印条码
+ // 打印标签(优化后,解决时序问题)
onPrint(res) {
+ console.log('打印条码', res.length)
this.codeLoading = true
if (res && res.length !== 0) {
+ // 转换打印数据格式
this.printLabelList = res.map(item => {
return {
lsfFileVarList: [
{
lsfFileVar: {
- varname: 'barcode', // 模板中的条形码变量名,需和打印模板一致
- // varvalue: '编号:' + item.barcode
- // varvalue: '编号\r\n1字第0000001号'
- // varvalue: '15字第000000001号'
- varvalue: item.archive_no
+ varname: 'barcode',
+ varvalue: item.archive_no || ''
}
},
{
lsfFileVar: {
varname: 'title',
- // varvalue: '姓名:' + item.title
- // varvalue: '姓名\r\n李军'
- // varvalue: '李军'
- varvalue: item.maintitle
+ varvalue: item.maintitle || ''
}
},
{
lsfFileVar: {
varname: 'nativePlace',
- // varvalue: '籍贯\r\n北京'
- // varvalue: '湖北武汉'
- varvalue: item.native_place
+ varvalue: item.native_place || ''
}
}
]
}
})
- // 打开打印弹窗
+ // 先赋值数据,再打开弹窗(确保子组件props同步)
this.printDialogVisible = true
- this.$nextTick(() => {
- this.$refs.printComponent.connectprinter()
- })
this.codeLoading = false
} else {
this.$message({
@@ -408,44 +396,81 @@ export default {
}
},
+ // 打印弹窗关闭后,重置子组件状态
+ handlePrintDialogClosed() {
+ if (this.$refs.printComponent) {
+ // 关闭子组件WebSocket连接
+ if (this.$refs.printComponent.wsocket) {
+ this.$refs.printComponent.wsocket.close()
+ this.$refs.printComponent.wsocket = null
+ }
+ // 重置子组件打印状态
+ this.$refs.printComponent.isPrinting = false
+ this.$refs.printComponent.hasSentPrintCmd = false
+ this.$refs.printComponent.numberPrinted = 0
+ }
+ // 清空打印数据
+ this.printLabelList = []
+ },
+
// 文件/案卷重置query
resetQuery() {
+ this.query = {
+ queryType: '',
+ queryTitle: '',
+ archiveNo: '',
+ archiveCtgNo: '',
+ responsibleby: '',
+ docNo: '',
+ documentNo: '',
+ barcode: '',
+ folderLocation: '',
+ tempNo: ''
+ }
if (this.selectedCategory.isType === 5) {
this.queryOption = [
{ value: 'queryTitle', label: '姓名' },
{ value: 'archiveNo', label: '编号' }
- // { value: 'responsibleby', label: '责任者' },
- // { value: 'docNo', label: '发文字号 ' },
- // { value: 'barcode', label: '条形码' },
- // { value: 'folderLocation', label: '地址码' },
- // { value: 'tempNo', label: '临时卷号' }
]
} else {
this.queryOption = [
{ value: 'queryTitle', label: '姓名' },
{ value: 'archiveNo', label: '档号' }
- // { value: 'archiveCtgNo', label: '实体分类号' },
- // { value: 'barcode', label: '条形码' },
- // { value: 'folderLocation', label: '地址码' }
]
}
this.anjuanInputSelect = this.queryOption[0].value
},
+
// 档案列表获取显示列
getTableDisplayFields(type) {
this.getTableItemCommon(type)
},
+
+ // 表格重新布局
+ doLayout() {
+ this.$nextTick(() => {
+ this.$refs.table?.doLayout()
+ })
+ },
+
+ // 分页大小改变
handleSizeChange(size) {
this.page.size = size
this.page.page = 1
this.getListCommon('anjuanData', 'anjuanTableHeight', 1)
this.$nextTick(() => {
- this.selections = this.$refs.table.selection
+ this.selections = this.$refs.table?.selection || []
})
},
- // list
+
+ // 页码改变
+ handleCurrentPage(page) {
+ this.page.page = page
+ this.getListCommon('anjuanData', 'anjuanTableHeight', 1)
+ },
+
+ // 获取表格列表
getTableList() {
- // this.query.queryType = null
this.query.queryTitle = ''
this.query.archiveNo = ''
this.query.archiveCtgNo = ''
@@ -555,6 +580,7 @@ export default {
}
this.getTotalSumAll()
},
+
// 借阅
handleLending() {
const index = this.selections.findIndex((item) => item.is_storage === 0 || item.is_storage === '' || item.is_storage === 1)
@@ -572,9 +598,7 @@ export default {
this.$message.error('当前档案已借出,还未归还')
return false
}
- const params = this.selections.map(item => {
- return item.id
- })
+ const params = this.selections.map(item => item.id)
FetchIsExistBorrow(params).then(data => {
if (data.length === 0) {
this.lengingVisible = true
@@ -587,9 +611,7 @@ export default {
},
// 确认借阅
handleLendingConfirm() {
- const params = this.selections.map(item => {
- return item.id
- })
+ const params = this.selections.map(item => item.id)
FetchAddArchivesWaitRegister(params).then(data => {
if (data.length !== 0) {
this.$message.success('借阅成功')
diff --git a/src/views/archivesManage/caseManage/caseList/module/print.vue b/src/views/archivesManage/caseManage/caseList/module/print.vue
index db3cee7..6b0139b 100644
--- a/src/views/archivesManage/caseManage/caseList/module/print.vue
+++ b/src/views/archivesManage/caseManage/caseList/module/print.vue
@@ -39,23 +39,31 @@ export default {
},
Operate: 'print',
// 电脑上模板地址的路径
- lsfFilePath: '/home/it0/zmin/新标签01.lsf',
+ lsfFilePath: '/home/it0/mb/mb01.lsf',
// 打印内容
labels: []
},
printerstatus: '',
pvimg:
- 'data:image/png;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADsAk8DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z',
+ 'data:image/png;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCADsAk8DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z',
numberPrintneed: 1,
- numberPrinted: 0
+ numberPrinted: 0,
+ // 打印锁,防止重复触发打印指令
+ isPrinting: false,
+ // 缓存打印列表,避免无效更新
+ cachedPrintList: [],
+ // 新增:标记单轮打印是否已发送过打印指令,避免重复发送
+ hasSentPrintCmd: false
}
},
watch: {
printList: {
immediate: true,
handler(newVal) {
- if (newVal && newVal.length > 0) {
- this.jsonstring.labels = newVal
+ // 仅当printList真正变化时,才更新缓存和打印数据
+ if (newVal && newVal.length > 0 && JSON.stringify(newVal) !== JSON.stringify(this.cachedPrintList)) {
+ this.cachedPrintList = [...newVal]
+ this.jsonstring.labels = [...newVal]
this.numberPrintneed = newVal.length // 打印数量等于选中的档案盒数量
}
}
@@ -68,7 +76,9 @@ export default {
this.serverIP = ZMINConfig.ip
this.serverPort = ZMINConfig.port
this.jsonstring.lsfFilePath = ZMINConfig.filePath
- this.jsonstring.labels = this.printList
+ // 初始化缓存打印列表
+ this.cachedPrintList = [...this.printList]
+ this.jsonstring.labels = [...this.printList]
console.log('this.jsonstring.labels', this.jsonstring.labels)
},
methods: {
@@ -77,18 +87,6 @@ export default {
// 定义 WebSocket 服务器地址
const wsserver = `ws://${this.serverIP}:${this.serverPort}/`
- // 检查浏览器是否支持 WebSocket
- // if ('WebSocket' in window) {
- // // 创建 WebSocket 连接
- // this.wsocket = new WebSocket(wsserver)
- // } else if ('MozWebSocket' in window) {
- // // 兼容旧版 Firefox 浏览器
- // this.wsocket = new MozWebSocket(wsserver)
- // } else {
- // // 如果浏览器不支持 WebSocket,显示错误消息
- // this.$message.error('不支持当前浏览器!')
- // return
- // }
// 替换原来的浏览器兼容判断
if ('WebSocket' in window) {
this.wsocket = new WebSocket(wsserver)
@@ -107,12 +105,20 @@ export default {
this.wsocket.onclose = () => {
// 更新打印机状态为“与打印服务断开连接!”
this.printerstatus = '与打印服务断开连接!'
+ // 连接断开时重置所有状态
+ this.isPrinting = false
+ this.hasSentPrintCmd = false
+ this.numberPrinted = 0
}
// WebSocket 连接发生错误时的回调函数
this.wsocket.onerror = () => {
// 显示错误消息“数据传输错误,请检查打印服务是否已经运行!”
this.$message.error('数据传输错误,请检查打印服务是否已经运行!')
+ // 连接错误时重置所有状态
+ this.isPrinting = false
+ this.hasSentPrintCmd = false
+ this.numberPrinted = 0
}
// WebSocket 接收到消息时的回调函数
@@ -142,6 +148,10 @@ export default {
// 如果状态码不在预定义范围内,显示通用错误消息
this.printerstatus = `打印机状态异常,错误代码:${printerstatus}`
this.$message.error(`打印机状态异常,错误代码:${printerstatus}`)
+ // 异常时重置所有状态
+ this.isPrinting = false
+ this.hasSentPrintCmd = false
+ this.numberPrinted = 0
return
}
@@ -149,25 +159,39 @@ export default {
this.printerstatus = `打印机状态异常:${statusmsg}`
// 显示错误消息
this.$message.error(`打印机状态异常:${statusmsg}`)
+ // 异常时重置所有状态
+ this.isPrinting = false
+ this.hasSentPrintCmd = false
+ this.numberPrinted = 0
return
} else {
// 如果状态码为 0,表示打印机正常
- if (this.numberPrinted < this.numberPrintneed) {
- // 如果已打印数量小于需要打印的数量,继续打印
+ if (!this.hasSentPrintCmd) {
+ // 仅发送1次打印指令,避免重复发送
this.printlabel()
+ this.hasSentPrintCmd = true
} else {
- // 如果已打印数量达到需要打印的数量,显示成功消息并重置计数
- this.$message.success(`已打印完 ${this.numberPrinted} 张标签。`)
- this.numberPrinted = 0
+ // 已发送过指令,不再重复发送,等待打印完成消息
+ this.printerstatus = '打印机就绪,等待打印完成...'
}
}
} else if (receivecontent.indexOf('打印完成') === 0) {
- // 如果消息以 "打印完成" 开头,表示一张标签打印完成
+ // 如果消息以 "打印完成" 开头,累加计数
this.numberPrinted++
- // 更新打印机状态为已打印的数量
this.printerstatus = `${this.numberPrinted} 张标签打印完成。`
- // 如果已打印数量小于需要打印的数量,继续获取打印机状态
- if (this.numberPrinted < this.numberPrintneed) { this.wsocket.send('ZM_GetPrinterStatus_USB|500') }
+
+ // 核心:当计数达到需要打印的数量时,直接结束本轮打印,忽略后续重复的“打印完成”消息
+ if (this.numberPrinted >= this.numberPrintneed) {
+ this.$message.success(`已打印完 ${this.numberPrintneed} 张标签(忽略后端重复回调)。`)
+ // 重置本轮打印状态
+ this.isPrinting = false
+ this.hasSentPrintCmd = false
+ this.numberPrinted = 0
+ this.jsonstring.labels = [...this.cachedPrintList]
+ return // 停止后续逻辑,忽略多余的打印完成消息
+ }
+
+ // 计数未达标时,不再查询状态(避免触发额外打印)
} else if (receivecontent.indexOf('ZM_PrintLabel_Preview:') === 0) {
// 如果消息以 "ZM_PrintLabel_Preview:" 开头,表示标签预览完成
const imagebase64string = receivecontent.replace(
@@ -191,39 +215,91 @@ export default {
this.wsocket.close()
this.wsocket = null
}
+ // 连接时重置所有状态
+ this.isPrinting = false
+ this.hasSentPrintCmd = false
+ this.numberPrinted = 0
this.connection()
setTimeout(() => {
- // 获取打印机序列号
- this.wsocket.send('ZM_GetPrinterNameAndSN')
+ // 获取打印机序列号(先判断连接状态)
+ if (this.wsocket && this.wsocket.readyState === WebSocket.OPEN) {
+ this.wsocket.send('ZM_GetPrinterNameAndSN')
+ }
}, 500)
},
// 打印标签按钮触发
printstart() {
- if (this.wsocket == null) {
- this.$message.error('请先连接打印服务')
+ // 判断连接状态
+ if (this.wsocket == null || this.wsocket.readyState !== WebSocket.OPEN) {
+ this.$message.error('请先连接打印服务并确保连接正常')
+ return
+ }
+ // 判断是否有打印数据
+ if (this.cachedPrintList.length === 0) {
+ this.$message.warning('暂无需要打印的标签数据')
+ return
+ }
+ // 打印中时禁止重复触发
+ if (this.isPrinting) {
+ this.$message.warning('当前正在打印,请稍后再操作')
return
}
+
+ // 启动打印时重置本轮状态
+ this.isPrinting = true
+ this.hasSentPrintCmd = false
this.numberPrinted = 0
+ this.jsonstring.labels = [...this.cachedPrintList]
+ this.numberPrintneed = this.cachedPrintList.length
+ // 先查询打印机状态,准备发送打印指令
this.wsocket.send('ZM_GetPrinterStatus_USB|500')
},
// 标签打印
printlabel() {
+ // 未加锁或已发送过指令时,不执行打印
+ if (!this.isPrinting || this.hasSentPrintCmd) return
this.jsonstring.Operate = 'print'
const newjsonstring = JSON.stringify(this.jsonstring)
console.log('标签打印newjsonstring', newjsonstring)
- this.wsocket.send(newjsonstring)
+ // 确保连接正常后发送指令
+ if (this.wsocket && this.wsocket.readyState === WebSocket.OPEN) {
+ this.wsocket.send(newjsonstring)
+ }
},
// 标签预览
previewlabel() {
+ // 判断连接状态
+ if (this.wsocket == null || this.wsocket.readyState !== WebSocket.OPEN) {
+ this.$message.error('请先连接打印服务并确保连接正常')
+ return
+ }
+ // 判断是否有预览数据
+ if (this.cachedPrintList.length === 0) {
+ this.$message.warning('暂无需要预览的标签数据')
+ return
+ }
+
this.jsonstring.Operate = 'preview'
+ // 预览前确保标签数据是最新缓存的
+ this.jsonstring.labels = [...this.cachedPrintList]
const newjsonstring = JSON.stringify(this.jsonstring)
console.log('标签预览this.jsonstring', this.jsonstring)
console.log('标签预览newjsonstring', newjsonstring)
this.wsocket.send(newjsonstring)
}
+ },
+ // 组件销毁前关闭WebSocket连接,防止内存泄漏
+ beforeUnmount() {
+ if (this.wsocket != null) {
+ this.wsocket.close()
+ this.wsocket = null
+ }
+ this.isPrinting = false
+ this.hasSentPrintCmd = false
+ this.numberPrinted = 0
}
}
diff --git a/src/views/components/AccessDoor.vue b/src/views/components/AccessDoor.vue
index ad91c04..239249e 100644
--- a/src/views/components/AccessDoor.vue
+++ b/src/views/components/AccessDoor.vue
@@ -24,7 +24,8 @@