// import { getAllList, getChatList, bindId, chatBegin } from '@/api/message' let timeouter = null let websock = null // 状态JSON // 设备状态 const PrinterStatus = { I: '空闲', B: '忙碌', P: '正在打印' } // // 设备报错 // const printer_errors = { // '0x11': '从光盘桶抓取到光驱时,光盘为空,请添加光盘后点击重试', // '0x12': '从光盘桶抓取到光驱时,抓取错误,请将该光盘放入光盘桶后点击重试', // '0x13': '从光盘桶抓取到光驱时,其他错误,请将该光盘放入光盘桶后点击重试', // '0x14': '从光盘桶抓取到打印托盘时,光盘为空,请添加光盘后点击重试', // '0x15': '从光盘桶抓取到打印托盘时,抓取错误,请将该光盘放入光盘桶后点击重试', // '0x16': '从光盘桶抓取到打印托盘时,其他错误,请将该光盘放入光盘桶后点击重试', // '0x17': '从光驱抓取到打印托盘时,光盘为空,请检查光驱弹出并将该光盘放入后点击重试', // '0x18': '从光驱抓取到打印托盘时,抓取错误,请将该光盘重新放入光驱后点击重试', // '0x19': '从光驱抓取到打印托盘时,其他错误,请将该光盘重新放入光驱后点击重试', // '0x1a': '从打印托盘抓取到出口时,光盘为空,请检查打印托盘弹出并将该光盘放入后点击重试', // '0x1b': '从打印托盘抓取到出口时,抓取错误,请将光该盘重新放入托盘后点击重试', // '0x1c': '从打印托盘抓取到出口时,其他错误,请将该光盘重新放入托盘后点击重试', // '0x1d': '从光驱抓取到出口时,光盘为空,光盘为空,请检查光驱弹出并将该光盘放入后点击重试', // '0x1e': '从光驱抓取到出口时,抓取错误,请将该光盘重新放入光驱后点击重试', // '0x1f': '从光驱抓取到出口时,其他错误,请将该光盘重新放入光驱后点击重试', // '0x21': '作业开始时设备错误,请清除故障后点击重试', // '0x10001': '通讯失败,请检查设备' // } // 提交任务报错 const submitErros = { '0x1': '读取任务JSON失败', '0x3': '新建任务失败', '0x4': '新建任务文件夹失败', '0x5': '没有任务数量', '0x6': '打印参数错误', '0x7': '刻录参数错误', '0x8': '没有任务', '0x9': '模板文件解析失败', '0xa': '打印类型错误', '0xb': 'csv文件读取失败', '0xc': '刻录路径错误', '0xd': '新建ISO文件失败', '0xe': '更新任务数据失败' } // 错误状态 const Error = { 1: '打印托盘移动错误', 2: '识别墨盒失败', 3: '打印机内部通讯错误', 4: '墨盒容量低', 5: '机械臂移动错误,请按功能按钮重试。', 6: '设备处于离线状态', 7: '设备门盖被打开,为了避免打印机失联请关闭门盖。', 8: '从打印托盘上抓取光盘时错误,请手动将光盘取走再点击重试。', 9: '多张光盘被抓取或移动,请检查后手动将光盘放回原处再点重试,如重试后继续错误,则需校准设备后再来重试。', 10: '从进盘仓到光驱的过程中,抓取错误,请手动将光盘放回进盘仓后重试。', 11: '从进盘仓到打印托盘的过程中,抓取错误,请手动将光盘放回进盘仓后重试。', 12: '从光驱到打印托盘的过程中,抓取错误,请手动将光盘放回光驱后重试。', 13: '打印机需要校准', 14: '检测墨盒错误', 15: '校准光盘桶失败', 16: '等待打印完成超时', 17: '从打印托盘抓取光盘时未找到光盘,请检查后手动将光盘取走后再点重试。', 18: '设备清洗', 19: '从光驱上抓取光盘时错误,请手动将光盘取走再点击重试', 32: '其他错误', } // const Error1 = { // 0: '托盘移动错误', // 1: '墨盒类型错误', // 2: '抓取光盘时未检测到光盘光盘已用完', // 3: '光盘掉落', // 4: '墨水车空警告', // 5: '光盘抓手错误', // 6: '抓取多张光盘错误', // 7: '机械臂挂钩错误或者机械臂归位错误' // } // const Error2 = { // 0: '墨水车伺服系统错误', // 1: '墨水车失速错误', // 2: '墨盒数据读取错误', // 3: '打印图像超出范围', // 4: '环境温度超出正常使用范围', // 5: '墨盒短路', // 6: '型号错误', // 7: '缓冲区溢出错误' // } // const Error3 = { // 0: '光盘已经打印' // } // 光驱信息 const CDName = { 1: '下光驱', 2: '上光驱' } const CDStatus = { 0: '无法确定光盘状态', 1: '没有光盘', 2: '光驱托盘打开', 3: '光驱未准备好', 4: '光盘状态正常,光盘已插入', 5: '校验中' } // 光盘类型 // CD类型:CD:1,DVD:2, DVD_DL:3,BD:4,BD_DL:5,BD_TL:6,BD_QL:7 const diskTypes = { 1: 'CD', 2: 'DVD', 3: 'BD' } const CDTypes = { 1: 'CD', 2: 'DVD', 3: 'DVD_DL', 4: 'BD', 5: 'BD_DL', 6: 'BD_TL', 7: 'BD_QL' } const size = 1024 const cd_types = [ { value: 1, label: 'CD 700MB', size: 700 * size * size }, { value: 2, label: 'DVD 4.7GB', size: 4.7 * size * size * size }, { value: 3, label: 'DVD_DL 8.5GB', size: 8.5 * size * size * size }, { value: 4, label: 'BD 25GB', size: 25 * size * size * size }, { value: 5, label: 'BD_DL 50GB', size: 50 * size * size * size }, { value: 6, label: 'BD_TL 100GB', size: 100 * size * size * size }, { value: 7, label: 'BD_QL 128GB', size: 128 * size * size * size } ] const defaultData = { // 任务列表 task_list: [ // { // task_uuid: '202042152', // task_name: '复制任务', // finish_freq: 2, // total_freq: 10, // task_status: 5, // ass_task: [ // { // task_size: 100000, // cd_type: 2, // start_time: '2024-04-01 12:00:00', // finish_time: '2024-04-01 12:00:00', // task_status: 5 // }, // { // task_size: 100000, // cd_type: 2, // start_time: '2024-04-01 12:00:00', // finish_time: '2024-04-01 12:00:00', // task_status: 5 // } // ] // }, // { // task_uuid: '202042152', // task_name: '复制任务', // finish_freq: 2, // total_freq: 10, // task_status: 2, // ass_task: [ // { // task_size: 100000, // cd_type: 2, // start_time: '2024-04-01 12:00:00', // finish_time: '2024-04-01 12:00:00', // task_status: 2 // }, // { // task_size: 100000, // cd_type: 2, // start_time: '2024-04-01 12:00:00', // finish_time: '2024-04-01 12:00:00', // task_status: 2 // } // ] // } ], // 设备信息 printer_info: { blue_last: 0, //蓝色墨盒遗留 calibration_flag: 0, // 是否校验设备 lack_ink: 0, // 缺墨警告 cover_flag: false, //是否盖盖 printer_name: '', //设备名称 printer_status: 'I', //设备状态 数字转成字符为I printer_tray: 'I', //设备托盘状态 数字转成字符为I red_last: 0, //红色墨盒遗留 yellow_last: 0, //黄色墨盒遗留 system_ip: '', //主机IP system_name: '', //主机名称 is_set_cddev: 0, serial_no: '', //设备序列号 // 左右光盘桶 strong_list: [ { strong_pos: 1, // 1:右光盘桶,2:左光盘桶 cd_type: 1, //CD类型:CD:1,DVD:2, DVD_DL:3,BD:4,BD_DL:5,BD_TL:6,BD_QL:7 cd_num: 0 }, { strong_pos: 2, cd_type: 2, cd_num: 0 } ], strongList: { 1: { strong_pos: 1, cd_type: 1, cd_num: 0 }, 2: { strong_pos: 2, cd_type: 2, cd_num: 0 } } }, // 光驱信息 cd_list: [ { cd_pos: 2, // 设备位置 1:下光驱,2:上光驱 cd_status: 4, // 设备状态 0:无法确定光盘状态 ,1:没有光盘 , 2:光驱托盘打开, 3:光驱未准备好,4:光盘状态正常,光盘已插入 cd_taskid: '', // 当前任务id dev_path: '', // 光驱路径 dev_type: 1, // 光驱类型 cd_assid: '', // 作业的卷标名 total_size: 0, // 总容量 use_size: 0, // 已使用容量 copy_scheduler: 0 // 任务进度 }, { cd_pos: 1, cd_status: 1, cd_taskid: '', dev_path: '', dev_type: 2 } ], // 日志信息 logList: [ // { // time: '2024-04-01 12:00:00', // text: '任务开始', // status: 'INFO' // } ], allLogList: [], // 手动设置光驱 cdList: [ // { // "dev_path":"/dev/sre", // "dev_name":"Finger Module 0110" // }, // { // "dev_path":"/dev/sre", // "dev_name":"PIONEER BD-RW BDR-289M 1.54" // }, // { // "dev_path":"/dev/sre", // "dev_name":"PIONEER BD-RW BDR-1313M 3.54" // } ], // 系统配置 settings: { log_level: 1, retry_freq: 2, cache_path: '/home/test/CDFile' } } const getDefaultState = () => { return { firstConnect: false, isConnect: false, connecting: false, serviceStatus: false, workStatus: true, reconnections: 0, PrinterStatus, CDName, CDStatus, diskTypes, CDTypes, cd_types, refreshTime: 10, // 错误信息 printer_error: {}, clearError: false, ...defaultData } } const state = getDefaultState() const mutations = { setData: (state, obj) => { state[obj.name] = obj.data } } const actions = { // 改变state值 setDatas: ({ commit }, data) => { commit('setData', data) }, // 初始化websocket initWebSocket({ state, commit, dispatch, rootState }) { if (typeof WebSocket === 'undefined') return console.log('您的浏览器不支持websocket') if ((websock && state.isConnect) || !rootState.user.token || state.connecting) { return } commit('setData', { name: 'connecting', data: true }) websock = new WebSocket(process.env.VUE_APP_SOCKET_API) websock.onmessage = function (res) { dispatch('websocketonmessage', res) } websock.onopen = function (res) { dispatch('websocketonopen', res) } websock.onerror = function (res) { dispatch('websocketonerror', res) } websock.onclose = function (res) { dispatch('websocketonclose', res) } }, // 接收消息 websocketonmessage({ state, commit, dispatch }, e) { const data = JSON.parse(e.data) // 转json对象 if (data.resp_name) { // 作业列表 if (data.resp_name === 'task_list') { commit('setData', { name: 'task_list', data: data.resp_info.task_list }) // 设备信息 } else if (data.resp_name === 'printer_info') { let info = data.resp_info info.printer_status = String.fromCharCode(info.printer_status) info.printer_tray = String.fromCharCode(info.printer_tray) let strong_list = {} for (let i = 0; i < info.strong_list.length; i++) { strong_list[info.strong_list[i].strong_pos] = info.strong_list[i] } info.strongList = strong_list // if (info.cover_flag && info.printer_name !== 'SE3') { // commit('setData', { name: 'printer_error', data: { type: 'error', notify: '设备门盖被打开,请关闭门盖。' } }) // } // if (info.calibration_flag) { // commit('setData', { name: 'printer_error', data: { type: 'error', notify: '请校准打印机。' } }) // } commit('setData', { name: 'printer_info', data: info }) // 驱动信息 } else if (data.resp_name === 'cd_info') { const list = data.resp_info.cd_list let cds = [] let isBD = false for (let i = 0; i < list.length; i++) { if (list[i].dev_type == 3) isBD = true if (i === 0) { cds.push(list[i]) } else { if (list[i].cd_pos == 2) { cds.unshift(list[i]) } else { cds.push(list[i]) } } } let types = CDTypes let typeLists = cd_types if (!isBD) { types = {} for (let key in CDTypes) { if (parseInt(key) < 4) types[key] = CDTypes[key] } typeLists = cd_types.slice(0, 3) } commit('setData', { name: 'CDTypes', data: types }) commit('setData', { name: 'cd_types', data: typeLists }) commit('setData', { name: 'cd_list', data: cds }) // 手动设置驱动 } else if (data.resp_name === 'get_all_cdlist') { commit('setData', { name: 'cdList', data: data.resp_info.cd_list || [] }) // 系统配置 } else if (data.resp_name === 'get_system_config') { commit('setData', { name: 'settings', data: data.resp_info }) // 新增日志 } else if (data.resp_name === 'add_log') { let logs = data.resp_info.add_log let loglist = [] let logLists = [...state.logList] for (let i = 0; i < logs.length; i++) { let texts = logs[i].split('|') if (logLists.length > 20) logLists.splice(logLists.length - 1, 1) loglist.unshift({ time: texts[0].replace(/\//g, '-').replace(/时/g, ':').replace(/分/g, ':').replace(/秒/g, ''), text: texts[2].replace(texts[2].split(' ')[0], ''), status: texts[1] }) } let list = [...loglist, ...logLists] commit('setData', { name: 'logList', data: list }) // 全部日志 } else if (data.resp_name === 'all_log') { let logs = data.resp_info.add_log let loglist = [] for (let i = 0; i < logs.length; i++) { let texts = logs[i].split('|') loglist.unshift({ time: texts[0].replace(/\//g, '-').replace(/时/g, ':').replace(/分/g, ':').replace(/秒/g, ''), text: texts[2].replace(texts[2].split(' ')[0], ''), status: texts[1] }) } commit('setData', { name: 'logList', data: loglist }) // 提交任务报错处理 } else if (data.resp_name === 'submit_task_res') { let error = data.resp_info let task_res = '0x' + error.task_res.toString(16) commit('setData', { name: 'printer_error', data: { type: 'error', notify: '任务' + error.task_uuid + '提交失败:' + submitErros[task_res] } }) // 打印报错处理 } else if (data.resp_name === 'printer_error') { let error = data.resp_info if (error.error) { let errors = error.error let continues = [8, 9, 10, 11, 12, 17, 19] let nojumps = [7, 8, 9, 10, 11, 12, 17, 19] for (let i = 0; i < errors.length; i++) { setTimeout(() => { let req = continues.indexOf(errors[i]) > -1 ? 'continue_task' : '' let noJump = nojumps.indexOf(errors[i]) > -1 if (req) { commit('setData', { name: 'printer_error', data: { type: 'error', confirm: Error[errors[i]], req: req, noJump: noJump } }) } else { commit('setData', { name: 'printer_error', data: { type: 'error', notify: Error[errors[i]], noJump: noJump } }) } }, 500) } } // if (error.error1) { // let errors = error.error1.toString(2).split('').reverse() // for (let i = 0; i < errors.length; i++) { // if (errors[i] == 1) { // setTimeout(() => { // commit('setData', { name: 'printer_error', data: { type: 'error', notify: Error1[i] } }) // }, 500) // } // } // } // if (error.error2) { // let errors = error.error2.toString(2).split('').reverse() // for (let i = 0; i < errors.length; i++) { // if (errors[i] == 1) { // setTimeout(() => { // commit('setData', { name: 'printer_error', data: { type: 'error', notify: Error2[i] } }) // }, 500) // } // } // } // if (error.error3) { // let errors = error.error3.toString(2).split('').reverse() // for (let i = 0; i < errors.length; i++) { // if (errors[i] == 1) { // setTimeout(() => { // commit('setData', { name: 'printer_error', data: { type: 'error', notify: Error3[i] } }) // }, 500) // } // } // } if (error.printer_error) { error.printer_error = '0x' + error.printer_error.toString(16) let continues = ['0x11', '0x12', '0x13', '0x14', '0x15', '0x16', '0x17', '0x18', '0x19', '0x1a', '0x1b', '0x1c', '0x1d', '0x1e', '0x1f', '0x21'] let req = continues.indexOf(error.printer_error) > -1 ? 'continue_task' : '' if (req) { commit('setData', { name: 'printer_error', data: { type: 'error', confirm: printer_errors[error.printer_error], req: req } }) } else { commit('setData', { name: 'printer_error', data: { type: 'error', notify: printer_errors[error.printer_error] } }) } } // 清除错误提示 } else if (data.resp_name === 'clean_iface_err') { commit('setData', { name: 'clearError', data: true }) setTimeout(() => { commit('setData', { name: 'clearError', data: false }) }, 1000); // 执行错误提示 } else { if (data.resp_info.res_code === 0) { } else { commit('setData', { name: 'printer_error', data: { type: 'error', notify: data.resp_info.res_msg || '操作失败' } }) } } } else { // 未知消息 console.log('报错信息: ' + JSON.stringify(data)) } }, // 心跳检测重连 pingCheck({ state, commit, dispatch, rootState }) { if (state.pingNum < 4) { let num = state.pingNum + 1 commit('setData', { name: 'pingNum', data: num }) timeouter = setTimeout(() => { dispatch('pingCheck') }, 10000) } else { dispatch('closeWebsocket') } }, // 发送消息 websocketsend({ commit, dispatch }, res) { return new Promise((resolve, reject) => { if (!state.serviceStatus) { commit('setData', { name: 'printer_error', data: { type: 'warning', message: '服务连接中,请耐心等待', noJump: true } }) reject() return } if (!state.isConnect) { commit('setData', { name: 'printer_error', data: { type: 'warning', message: '请先打开服务', noJump: true } }) reject() return } websock.send(JSON.stringify(res)) resolve() }) }, // 链接建立之后执行的方法 websocketonopen: ({ commit, dispatch }, res) => { console.log('链接建立之后执行send方法发送数据', res) commit('setData', { name: 'connecting', data: false }) commit('setData', { name: 'isConnect', data: true }) commit('setData', { name: 'serviceStatus', data: true }) }, // 链接关闭之后执行的方法 websocketonclose: ({ state, commit, dispatch }, res) => { console.log('断开链接', res) // 关闭 commit('setData', { name: 'connecting', data: false }) commit('setData', { name: 'isConnect', data: false }) for (let key in defaultData) { commit('setData', { name: key, data: defaultData[key] }) } const refreshTime = parseInt(state.refreshTime) * 1000 setTimeout(() => { dispatch('initWebSocket') }, refreshTime) if (state.workStatus) { } }, // 链接错误之后执行的方法 websocketonerror({ state, commit, dispatch }, res) { commit('setData', { name: 'firstConnect', data: true }) commit('setData', { name: 'connecting', data: false }) commit('setData', { name: 'isConnect', data: false }) commit('setData', { name: 'serviceStatus', data: false }) let num = state.reconnections + 1 commit('setData', { name: 'reconnections', data: num }) const refreshTime = parseInt(state.refreshTime) * 1000 setTimeout(() => { dispatch('initWebSocket') }, refreshTime) }, // 关闭 closeWebsocket: () => { // 关闭 if (websock) websock.close() } } export default { namespaced: true, state, mutations, actions }