234 lines
6.7 KiB
JavaScript
234 lines
6.7 KiB
JavaScript
import { getConAssayTaskWithReportTemplateContent, queryTaskDetailListByAssayTaskId } from '@/nx/api/auncel'
|
||
export default {
|
||
//打印机Map对象
|
||
printMap: new Map(),
|
||
//检测连接
|
||
checkConnect(printer) {
|
||
printer.intervalID = setInterval(() => {
|
||
let iv = new Date().getTime() - printer.lastReceiveMessageTime //多久没接收到消息
|
||
if (iv > 30000) {
|
||
//如果超过30秒未接收到服务器消息,则关闭连接
|
||
console.log('已经' + iv + 'ms没接收到消息了,服务器估计没在了!')
|
||
clearInterval(printer.intervalID)
|
||
printer.socketTask.close()
|
||
}
|
||
}, 20000)
|
||
},
|
||
//开始心跳
|
||
heartbeatStart(printer) {
|
||
printer.timeoutID = setTimeout(() => {
|
||
let heartbeatData = {
|
||
cmd: 'heartbeat',
|
||
data: 'ping'
|
||
}
|
||
console.log(printer.printServerIp + ': 发送心跳。。。')
|
||
printer.socketTask.send({
|
||
data: JSON.stringify(heartbeatData)
|
||
})
|
||
}, 10000)
|
||
},
|
||
//清理心跳
|
||
heartbeatClear(printer) {
|
||
clearTimeout(printer.timeoutID)
|
||
},
|
||
//重置心跳
|
||
heartbeatReset(printer) {
|
||
this.heartbeatClear(printer)
|
||
this.heartbeatStart(printer)
|
||
},
|
||
//打开连接
|
||
open(printServerIp, printServerPort = 22333) {
|
||
//判断是否存在
|
||
let printer = this.printMap.get(printServerIp)
|
||
if (!printer) {
|
||
printer = {
|
||
isOpen: false,
|
||
isOpening: false, //打开中
|
||
socketTask: false,
|
||
timeoutID: -1,
|
||
intervalID: -1,
|
||
reConnectCount: 0, //重新连接次数
|
||
printServerIp: printServerIp,
|
||
printServerPort: printServerPort,
|
||
lastReceiveMessageTime: new Date().getTime()
|
||
}
|
||
}
|
||
//如果为正在打开,则返回
|
||
if (printer.isOpening) {
|
||
// console.log("已经正在打开中。。。");
|
||
return
|
||
}
|
||
//防止重复连接
|
||
if (printer.isOpen && printer.socketTask) {
|
||
console.log('websocket连接已打开。。。')
|
||
return
|
||
}
|
||
// console.log(printServerIp + ": WebSocket开始连接。。。");
|
||
printer.isOpening = true
|
||
let socketTask = uni.connectSocket({
|
||
url: 'ws://' + printServerIp + ':' + printServerPort + '/',
|
||
header: {
|
||
'content-type': 'application/json'
|
||
},
|
||
success: e => {
|
||
//连接成功,是需要监听onOpen。这里的成功只是创建(接口调用成功)
|
||
//console.log(e);
|
||
},
|
||
complete: () => {}
|
||
})
|
||
if (!socketTask) return
|
||
// console.log(socketTask);
|
||
printer.socketTask = socketTask
|
||
this.printMap.set(printServerIp, printer)
|
||
|
||
//监听开启
|
||
socketTask.onOpen(res => {
|
||
printer.isOpen = true
|
||
printer.isOpening = false
|
||
printer.reConnectCount = 0
|
||
uni.$emit('printStatus', {})
|
||
console.log(socketTask)
|
||
console.log(printServerIp + ': WebSocket连接成功。。。')
|
||
this.heartbeatStart(printer)
|
||
this.checkConnect(printer) //检测连接是否正常
|
||
})
|
||
|
||
//监听消息
|
||
socketTask.onMessage(res => {
|
||
printer.lastReceiveMessageTime = new Date().getTime()
|
||
let data = JSON.parse(res.data)
|
||
this.message(printer, data)
|
||
})
|
||
|
||
//监听关闭
|
||
socketTask.onClose(res => {
|
||
printer.isOpen = false
|
||
printer.isOpening = false
|
||
printer.socketTask = false
|
||
uni.$emit('printStatus', {})
|
||
// console.log(printer.printServerIp + ": WebSocket连接关闭。。。");
|
||
this.heartbeatClear(printer)
|
||
this.printMap.delete(printServerIp)
|
||
if (printer.reConnectCount <= 100) {
|
||
printer.reConnectCount += 1
|
||
this.reOpen(printer.printServerIp, printer.printServerPort)
|
||
}
|
||
})
|
||
|
||
//监听错误
|
||
socketTask.onError(res => {
|
||
printer.isOpen = false
|
||
printer.isOpening = false
|
||
printer.socketTask = false
|
||
uni.$emit('printStatus', {})
|
||
// console.log(printServerIp + ": WebSocket连接失败。。。");
|
||
// console.log(res);
|
||
this.heartbeatClear(printer)
|
||
this.printMap.delete(printServerIp)
|
||
if (printer.reConnectCount <= 100) {
|
||
printer.reConnectCount += 1
|
||
this.reOpen(printer.printServerIp, printer.printServerPort)
|
||
}
|
||
})
|
||
},
|
||
//重新打开
|
||
reOpen(printServerIp, printServerPort) {
|
||
this.timeoutID = setTimeout(() => {
|
||
// console.log("开始重连。。。");
|
||
this.open(printServerIp, printServerPort)
|
||
}, 5000)
|
||
},
|
||
//消息处理
|
||
message(printer, data) {
|
||
console.log(data)
|
||
switch (data.cmd) {
|
||
case 'heartbeat':
|
||
this.heartbeatReset(printer)
|
||
break
|
||
}
|
||
// switch (data.type){
|
||
// case "ycbm":
|
||
// console.log("一次编密");
|
||
// break;
|
||
// case "ecbm":
|
||
// console.log("二次编密");
|
||
// break;
|
||
// case "jmsy":
|
||
// console.log("简码收样");
|
||
// break;
|
||
// case "heartbeat":
|
||
// console.log("接收到心跳包回复:" + data.sampleCode);
|
||
// this.heartbeatReset(printer);
|
||
// break;
|
||
// }
|
||
},
|
||
//关闭连接
|
||
close(printServerIp) {
|
||
let printer = this.printMap.get(printServerIp)
|
||
if (!printer) return //不存在直接返回
|
||
if (printer.isOpen) {
|
||
printer.socketTask.close()
|
||
printer.isOpen = false
|
||
}
|
||
},
|
||
//发送消息
|
||
send(printServerIp, data) {
|
||
let printer = this.printMap.get(printServerIp)
|
||
if (!printer) {
|
||
//不存在则打开
|
||
this.open(printServerIp)
|
||
}
|
||
if (printer.socketTask) {
|
||
printer.socketTask.send({
|
||
data: data
|
||
})
|
||
}
|
||
},
|
||
//获取打印模板并执行打印
|
||
getPrintTemplateAndPrint(currentTask) {
|
||
const id = currentTask.taskTypeId
|
||
getConAssayTaskWithReportTemplateContent(id)
|
||
.then(res => {
|
||
this.print(currentTask, res)
|
||
})
|
||
.catch(err => {
|
||
console.log(err)
|
||
})
|
||
},
|
||
//调用send方法执行打印
|
||
print(currentTask, conAssayTask) {
|
||
const me = this
|
||
let id = currentTask.id
|
||
const reportTemplate = conAssayTask.reportTemplateDataContent
|
||
me.getReportData(id, function (res) {
|
||
const data = res.data || []
|
||
const reportData = {
|
||
data: data
|
||
}
|
||
let printData = {
|
||
// type: "preview",
|
||
type: 'print',
|
||
reportTemplate: reportTemplate,
|
||
reportData: JSON.stringify(reportData)
|
||
}
|
||
//连接打印服务
|
||
let printList = uni.getStorageSync('KEY_PRINT_LIST')
|
||
if (printList && printList.length > 0) {
|
||
let print = printList[0]
|
||
let printServerIp = print.printIp
|
||
me.send(printServerIp, JSON.stringify(printData))
|
||
}
|
||
})
|
||
},
|
||
//获取打印模板
|
||
getReportData(id, onComplete) {
|
||
const param = {
|
||
taskId: id,
|
||
hideResultFlag: 'true'
|
||
}
|
||
queryTaskDetailListByAssayTaskId(param).then(res => {
|
||
onComplete(res)
|
||
})
|
||
}
|
||
}
|