6 changed files with 446 additions and 54 deletions
-
2.env.development
-
2public/static/测试.dlt
-
8src/views/archivesManage/caseManage/caseList/index.vue
-
8src/views/archivesManage/safeDoor/index.vue
-
357src/views/components/printRfid-w.vue
-
123src/views/components/printRfid.vue
@ -1,4 +1,4 @@ |
|||
{ |
|||
"Version": "1.1.0.1", |
|||
"Data": "84F6F9E0AD9F93949E999BE8D103EBDDE1DFE4E2E5E3F3EA0D0FF7CAA9B3AFAAEACECBBE11FA2EBB2D2F3218EBCACFF1C0CCCD10FE301305150C2F343217F0D99E8D8D909E97A09993BB9AA6A6EAD305EDA3A5F0E70A0C0DF5C6AAA6BAA8B8FCF529120211082D2D2E16F7EAF21A03350DFE02FF160D2B2D2E16F6DCCDC3DCCBAB91949DE1CAFC8CFDFF0001E9C4ACA2A99CA3A4AEC7B0A2AFA9B5F8E113FBEB0D062A292A2B15E2CFC6D6C7D3CDD1DA0DF62910070200142D2F30C00F2F3435DDBDA1948DA392B49E8EA4E8D1039204060709F09CF2DB0DF5E2E9F8EF1214152610CC10F92B15040716313132BF1134262710EFC9CBC1D1C9C4C61B0130E2C3F5F7F9F9FAE2B18E97A3E7D002EAB9A9979CF0E6090B0C0D0EF6D0D6F9E214FCDBCDBCBE060406140B2E323132331BF5BCEDD1C4EBCAD1CDD1BF170332170C1CD3F6F9F9FAFBE3C3A694A8E8D103EB285A852A637E305D9633608EF8EF121415262912BA11FA2E1406080D0A0B1A11342627292916C013FC2E16040F0B091B12F5F7F9F9FAE28EE5CDFFE7DAE9E00305060709F0ABF2DB0DF5E8F7EE111314152610EEC3C5C0E9D5CAD31900321AFCCCC6CFC6100C2F2C2D2E2F17F7CCCBC9EB96869DE0C9FBE3D5D7E6DD0002030405EDC79FD0A4A8B1F4DD0FF7EAF9F0131526292B10EAC1EEC2D6CCD2D71902341CFF0E06282F302C2D15EFC6E8CDD5D8CC9397949DE1CAFCE5D7E6DD0002030405EDC4A9A4AEC1A5B5B4AFABB3F9E214FCFE040410072A2E2D2E2F19F7D3DBCBEBBFCFCFC9CAD213FC2E16091B0F2F3435F6F7E0C18E9096BB9E9AA4C4A6A7A9ECD507F0E2F1E80B0D0E0F10F8C9ADA9BDBBCD12F82A1207140B2E323132331BE8EEC4C9CBCAE5BCC6D216FF3419091B12F5F7F9F9FAE2AFC69B9FA29CBFA39FA9EDD609F0E3F2E90C0E0F1011F9D4DCB2C6CBC6DEBAC4D214FD2F190A1910333526272910F0F8C9CDD0CAEDD4CDD41B04F6DED2E0F9FBFCFE8AABFF018EE00305EDBECCC9CFF2DB0D9C0E1011F9C9A4B0CCE5C5CECE12FD2D1507190E3133341CE0C4CEE2C117FB2D15160D3332301BF09A89B28BE1CAFCE5E5DCFF0102EAC49AAAA39FF0D90BBA9B0D0F101112FAC9A5BFCD12F82A12F2E6F4160F30323334350DE7EE10FE3013F1E7F50C0D0A171134F6F7F9F9E1BB92C4A69ABC9BA7A3A795EDD609F0E2F2E90C0E0F1011F9D8BCAACE10FA2911C0D2C3C3160F30323334350DECD1BED7ECC6D2D216FF3419F1D8C6AC8C90E0D7FAFCFEFEFFE7B8A6ABA9C2AAA2F0D80AF2E4E4F5EC0F11121314FCDDDBE7C3CFCF15FC2E16E4E81910333526272910E8C213FC2E16171131303435F6DEB98FB795A29CE5CE00E8DBEA0305060795B5090B980C9A" |
|||
"Data": "84F6F9E0AD9F93949E999BE8D103EBDDE1DFE4E2E5E3F3EA0D0FF7CAA9B3AFAAEACECBBE11FA2EBB2D2F3218EBCACFF1C0CCCD10FE301305150C2F343217F0D99E8D8D909E97A09993BB9AA6A6EAD305EDA3A5F0E70A0C0DF5C6AAA6BAA8B8FCF529120211082D2D2E16F7EAF21A03350DFE02FF160D2B2D2E16F6DCCDC3DCCBAB91949DE1CAFC8CFDFF0001E9C4ACA2A99CA3A4AEC7B0A2AFA9B5F8E113FBEB0D062A292A2B15E2CFC6D6C7D3CDD1DA0DF62910070200142D2F30C00F2F3435DDBDA1948DA392B49E8EA4E8D1039204060709F09CF2DB0DF5E2E9F8EF1214152610CC10F92B15040716313132BF1134262710EFC9CBC1D1C9C4C61B0130E2C3F5F7F9F9FAE2B18E97A3E7D002EAB9A9979CF0E6090B0C0D0EF6D0D6F9E214FCECD1C1CD06C6D6C9D2160F30323334350DE7BFEFD7CBE8C7D3CFD3C419FF341CCEDED6F8FAFBFCFEE5C4A896AAEAD305ED2A5D872B6580325F98356290FAF11426292B2911BC15FC2E160A0A0D0C0D1C032629292F3013BD15FE301B060B0D0EDDD4F8F9FAFBFCE590E6CF01E9DCEBE2050709090AF2ADF4DD0FF7EAF9F0131526292B10EDC5C9C2E9D7CED51902341CEEBEC9D1CC17092C2E2F303419F3CED08BAD99889EE2CBFEE5D6D9E8DF0204050607F0C9A0D2A6AAB3F6DF11F9ECFBF225292B292A12EEC3EEC4DACED2D91B04260E02100C2F2C2D2E2F17F4C8E4CFDA9A8E9699959FE3CDFEE6D9E8DF0204050607F0C6AAA6B0C3A7B7B6B1ADB5FBE42610030403120B2C2E2F323119F9D5DDBDDDC2D1D5D0C7CF15FE301B0B171134F6F7F9F9E1C3909398BCA09CA6C6A8A9ABEED809F1E4F3EA0D0F101112FACBAFBBD1C0CD11FA2E1407160F30323334350DDAF1C6CFD2C7E2BEC8D41B01301B0EDDD4F8F9FAFBFCE5B1C79DA1A49EC1A5A1ABF0D80AF2E5F4EB0E10111213FBD6EEC6CBCBC5E0BEC6D2160131190C1B12252729292F17EDF5CBCFD2CFEFD0CFD9DDC6F9E0D3E2FBFEFEFF8CAD010390E20507F0C0CDCBD1F4DD0F9E101213FBCBB6C4D1E5C4D0D214FD2F190919103335260EE3C6D4E9BE14FD2F171B0F2F3435DDB29D8BB38DE3CDFEE6E7DE010304ECC69CADA5A0F2DB0DBC9D0F11121314FCDBB9C4CD11FA2E14F2E8F8180F323435262710E9F417FB2D15F3E9FA0E090C1CD3F6F9F9FAFBE3BE94C5A89CBE9DA9A5A997F0D80AF2E4F4EB0E10111213FBDACEBED310F92B15C2D2C5C7180F323435262710EED7C5D4E9C8D4D41B01301BF69A88AF8E91E2D9FDFEFF0001E9BAA8ADABC4ADA4F1DA0CF4E6E6F7EE111314152610E2DBE6C5D3D115FE3218E4EA1B12252729292F17E5BF15FE301B190D3335F6F7F9E0BA91B998A49DE7D002EADDEC0507090996B70B0D9A0E9C" |
|||
} |
|||
@ -0,0 +1,357 @@ |
|||
<template> |
|||
<!-- 保留按钮(如需隐藏可加 v-show="false") --> |
|||
<div class="read-tid-template-print-container"> |
|||
<div v-show="false" class="btn"> |
|||
<el-button type="success" @click="handlePrint">打印</el-button> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import request from '@/utils/request' |
|||
import RFID from '@/api/RFID/RFID' |
|||
|
|||
export default { |
|||
name: 'ReadTidTemplatePrintRFID', |
|||
// 暴露方法给父组件调用(可选,父组件也可通过ref直接调用) |
|||
provide() { |
|||
return { |
|||
printRFID: this.handlePrint |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
// 固定配置 |
|||
tidChecked: true, // 先读TID |
|||
epcChecked: false, // 不读EPC |
|||
printCount: 1, // 打印1次 |
|||
emuType: '1', // ZPL仿真类型 |
|||
// 默认模板数据(可被覆盖) |
|||
defaultTemplateData: [ |
|||
{ elemID: 'EPC-01', actualData: '' } |
|||
], |
|||
// 存储读取到的TID |
|||
readTid: '' |
|||
} |
|||
}, |
|||
methods: { |
|||
getDateTime(date) { |
|||
if (date) { |
|||
const time = { |
|||
yyyy: date.getFullYear(), |
|||
MM: date.getMonth() + 1, |
|||
dd: date.getDate(), |
|||
hh: date.getHours(), |
|||
mm: date.getMinutes(), |
|||
ss: date.getSeconds(), |
|||
hm: Date.now(), |
|||
w: ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'][date.getDay()] |
|||
} |
|||
let format = 'yyyy-MM-dd hh:mm:ss:hm' |
|||
for (const temp in time) { |
|||
format = format.replace(temp, (Array(temp.length).join('0') + time[temp]).slice(-temp.length)) |
|||
} |
|||
return format |
|||
} |
|||
}, |
|||
creatLog(text) { |
|||
const logItem = `${this.getDateTime(new Date())}:${text}` |
|||
console.log(logItem) |
|||
}, |
|||
creatSucessLog(api, funcName, res) { |
|||
const log = res.outParams |
|||
? `${api}(${funcName}) successful, Message: ${JSON.stringify(res.outParams)}` |
|||
: `${api}(${funcName}) successful ` |
|||
this.creatLog(log) |
|||
}, |
|||
creatErrLog(api, funcName, res) { |
|||
const log = `${api}(${funcName}) failed, Message: ${res.rsltMsg}` |
|||
this.creatLog(log) |
|||
}, |
|||
generateUniqueId() { |
|||
const timestamp = Date.now().toString(36) |
|||
const randomNum = Math.random().toString(36).substr(2, 9) |
|||
return timestamp + randomNum |
|||
}, |
|||
// 发送POST请求(修复版) |
|||
sendPostRequest(funcId, funcName, data) { |
|||
return new Promise((resolve, reject) => { |
|||
// 第一步:先硬编码URL,对齐jQuery版本 |
|||
const targetUrl = process.env.NODE_ENV === 'production' ? window.g.printNJ : process.env.VUE_APP_PRINTNJ |
|||
// 第二步:明确配置请求头和数据格式 |
|||
request({ |
|||
url: targetUrl, // 直接使用目标地址,无需baseURL拼接 |
|||
method: 'post', |
|||
timeout: 30000, |
|||
headers: { |
|||
// 显式设置Content-Type,确保后端能解析JSON格式 |
|||
'Content-Type': 'application/json; charset=utf-8' |
|||
}, |
|||
data: JSON.stringify({ |
|||
version: '1.0', |
|||
seqNo: this.generateUniqueId(), |
|||
funcName: funcId, |
|||
inParams: data |
|||
}) |
|||
// 若axios自动序列化,也可保留对象格式: |
|||
// data: { |
|||
// version: '1.0', |
|||
// seqNo: this.generateUniqueId(), |
|||
// funcName: funcId, |
|||
// inParams: data |
|||
// } |
|||
}).then(response => { |
|||
const res = response |
|||
console.log('响应数据:', response) |
|||
if (res.rtnCode === '0') { |
|||
this.creatSucessLog(funcId, funcName, res) // 先记录日志,再resolve(顺序优化) |
|||
resolve(res.outParams) |
|||
} else { |
|||
this.creatErrLog(funcId, funcName, res) // 先记录日志,再reject |
|||
reject(res.rsltMsg) |
|||
} |
|||
}).catch(error => { |
|||
console.error('请求失败:', error) |
|||
this.$message.error('接口请求失败', { offset: 8 }) |
|||
reject(error.message || '未知网络错误') |
|||
}) |
|||
}) |
|||
}, |
|||
// 获取模板文件Base64 |
|||
getTemplateFileBase64() { |
|||
return new Promise((resolve, reject) => { |
|||
// 模板文件路径:public/static/ 下的模板文件,根据实际文件名修改 |
|||
const templateUrl = `${process.env.BASE_URL}static/测试.dlt` |
|||
|
|||
fetch(templateUrl) |
|||
.then(response => { |
|||
if (!response.ok) throw new Error('模板文件加载失败') |
|||
return response.blob() |
|||
}) |
|||
.then(blob => { |
|||
const reader = new FileReader() |
|||
reader.readAsDataURL(blob) |
|||
reader.onload = () => { |
|||
const base64 = reader.result.split(',')[1] |
|||
resolve(base64) |
|||
} |
|||
reader.onerror = (err) => reject(err) |
|||
}) |
|||
.catch(err => reject(err)) |
|||
}) |
|||
}, |
|||
/** |
|||
* 写入EAS数据(新增方法) |
|||
* @param {string} caseId - 盒ID |
|||
* @param {string} tid - 读取到的TID |
|||
* @returns {Promise} |
|||
*/ |
|||
async writeEAS(caseId, tid) { |
|||
try { |
|||
if (!caseId || !tid) { |
|||
this.$message.warning('盒ID或TID不能为空', { offset: 8 }) |
|||
return Promise.reject('盒ID或TID不能为空') |
|||
} |
|||
|
|||
const sDevID = process.env.NODE_ENV === 'production' ? window.g.sDevID : process.env.VUE_APP_SDEVID |
|||
|
|||
const writeParams = { |
|||
op: 'RFID_WriteEPC', |
|||
sDevID: sDevID, |
|||
EAS: '0', |
|||
Type: '2', |
|||
Code: caseId, |
|||
Tid: tid |
|||
} |
|||
|
|||
console.log('写入EAS参数:', writeParams) |
|||
const writeRes = await RFID.writeEPC(writeParams) |
|||
const res = JSON.parse(writeRes) |
|||
|
|||
if (res.code === '0') { |
|||
this.$message.success('标签绑定成功', { offset: 8 }) |
|||
return Promise.resolve(res) |
|||
} else if (res.code === '-1') { |
|||
this.$message.error('绑定失败', { offset: 8 }) |
|||
return Promise.reject('绑定失败') |
|||
} else if (res.code === '-1000') { |
|||
this.$message.error('读写器超时未响应', { offset: 8 }) |
|||
return Promise.reject('读写器超时未响应') |
|||
} else { |
|||
this.$message.error('操作失败', { offset: 8 }) |
|||
return Promise.reject(`操作失败,错误码:${res.code}`) |
|||
} |
|||
} catch (err) { |
|||
this.$message.error(`标签绑定操作异常:${err.message}`, { offset: 8 }) |
|||
return Promise.reject(err) |
|||
} |
|||
}, |
|||
/** |
|||
* 打印RFID标签 |
|||
* @param {Array|string} printData - 支持两种格式: |
|||
* 1. 字符串:单条数据的actualData(兼容旧调用方式) |
|||
* 2. 数组:多条模板数据,格式 [{elemID: 'xxx', actualData: 'xxx', caseId: 'xxx'}, ...] |
|||
* @returns {Promise} - 返回打印结果Promise |
|||
*/ |
|||
async handlePrint(printData) { |
|||
let templateDataList = [] |
|||
let caseId = '' |
|||
|
|||
if (typeof printData === 'string') { |
|||
templateDataList = [ |
|||
{ elemID: 'epc-id', actualData: printData } |
|||
] |
|||
} else if (Array.isArray(printData)) { |
|||
templateDataList = printData.filter(item => { |
|||
const isValid = item && item.elemID && item.actualData |
|||
if (!isValid) { |
|||
console.warn('过滤无效的模板数据:', item) |
|||
} |
|||
if (isValid && item.caseId && !caseId) { |
|||
caseId = item.caseId |
|||
} |
|||
return isValid |
|||
}) |
|||
} else { |
|||
templateDataList = this.defaultTemplateData.filter(item => item.elemID && item.actualData) |
|||
} |
|||
|
|||
if (templateDataList.length === 0) { |
|||
this.$message.warning('打印数据不能为空,请检查传入的模板数据', { offset: 8 }) |
|||
return Promise.reject('打印数据不能为空') |
|||
} |
|||
console.log('最终模板数据列表:', templateDataList) |
|||
|
|||
try { |
|||
// 1. 获取模板文件Base64 |
|||
const tmplFileSrc = await this.getTemplateFileBase64() |
|||
console.log('模板文件Base64', tmplFileSrc) |
|||
|
|||
// 2. 组装参数 |
|||
const params = { |
|||
tmplFileSrc, |
|||
printCount: this.printCount, |
|||
EMU_RADIO: this.emuType, |
|||
TID: this.tidChecked, |
|||
EPC: this.epcChecked, |
|||
rfidType: this.tidChecked ? '1' : (this.epcChecked ? '2' : '0') |
|||
} |
|||
console.log('组装参数', params) |
|||
|
|||
// 3. 设置语言 |
|||
await this.sendPostRequest('web_DSTP2x_SetLibLang', '设置语言', { 'language': '0' }) |
|||
|
|||
// 4. 枚举设备 |
|||
const devRes = await this.sendPostRequest('web_DSTP2x_EnumDev', '枚举设备', { 'enumType': '1' }) |
|||
let devName = devRes.enumList |
|||
if (devName.indexOf(',') !== -1) { |
|||
devName = devName.split(',')[0] |
|||
} |
|||
|
|||
// 5. 连接设备 |
|||
const connectRes = await this.sendPostRequest('web_DSTP2x_ConnEnumeratedDev', '连接设备', { 'devName': devName }) |
|||
|
|||
// 6. 检查打印机状态 |
|||
const statusRes = await this.sendPostRequest('web_DSTP2x_GetPrtStatus', '获取打印状态', { 'devHdl': connectRes.devHdl }) |
|||
if (statusRes.isReady !== '1') { |
|||
this.$message.error('打印机状态异常', { offset: 8 }) |
|||
await this.sendPostRequest('web_DSTP2x_DisconnDev', '断开连接', { 'devHdl': connectRes.devHdl }) |
|||
return Promise.reject('打印机状态异常') |
|||
} |
|||
|
|||
// 7. 设置仿真类型 |
|||
await this.sendPostRequest('web_DSTP2x_SetPrnEmulation', '设置仿真类型', { |
|||
'devHdl': connectRes.devHdl, |
|||
'emulation': params.EMU_RADIO |
|||
}) |
|||
|
|||
// 8. 设置超时时间 |
|||
await this.sendPostRequest('web_DSTP2x_SetCommTimeout', '设置超时时间', { |
|||
'devHdl': connectRes.devHdl, |
|||
'commType': '1', |
|||
'sendTimeout': '20000', |
|||
'recvTimeout': '20000' |
|||
}) |
|||
|
|||
// 9. 加载模板 |
|||
const tempRes = await this.sendPostRequest('web_DSTP2x_LoadLabelTmpl', '加载模板', { |
|||
'tmplFileSrcType': '1', |
|||
'tmplFileSrc': params.tmplFileSrc |
|||
}) |
|||
|
|||
// 10. 批量设置模板数据(支持多条) |
|||
for (const item of templateDataList) { |
|||
console.log(`设置模板数据 - elemID: ${item.elemID}, actualData: ${item.actualData}`) |
|||
await this.sendPostRequest('web_DSTP2x_SetTmplPrnData', `设置模板数据[${item.elemID}]`, { |
|||
'tmplHdl': tempRes.tmplHdl, |
|||
'elemID': item.elemID, |
|||
'actualData': item.actualData |
|||
}) |
|||
} |
|||
|
|||
// 11. 读RFID数据(并提取TID) |
|||
let rfidReadRes = null |
|||
if (params.rfidType !== '0') { |
|||
rfidReadRes = await this.sendPostRequest('web_DSTP2x_RFID_ReadData', '读RFID数据', { |
|||
'devHdl': connectRes.devHdl, |
|||
'rfidType': params.rfidType |
|||
}) |
|||
console.log('RFID读取结果:', rfidReadRes) |
|||
|
|||
if (rfidReadRes && rfidReadRes.tid) { |
|||
this.readTid = rfidReadRes.tid |
|||
} else if (rfidReadRes && rfidReadRes.data && rfidReadRes.data[0] && rfidReadRes.data[0].tid) { |
|||
this.readTid = rfidReadRes.data[0].tid |
|||
} |
|||
console.log('提取到的TID:', this.readTid) |
|||
|
|||
if (!this.readTid) { |
|||
this.$message.warning('读取到的标签缺少TID信息', { offset: 8 }) |
|||
} |
|||
} |
|||
|
|||
// 12. 执行打印 |
|||
await this.sendPostRequest('web_DSTP2x_PrintTmpl', '执行打印', { |
|||
'devHdl': connectRes.devHdl, |
|||
'tmplHdl': tempRes.tmplHdl, |
|||
'outFileType': '0' |
|||
}) |
|||
|
|||
// 13. 清理资源 |
|||
await this.sendPostRequest('web_DSTP2x_DeleteTmpl', '删除模板句柄', { 'tmplHdl': tempRes.tmplHdl }) |
|||
await this.sendPostRequest('web_DSTP2x_DisconnDev', '断开连接', { 'devHdl': connectRes.devHdl }) |
|||
|
|||
this.$message.success(`成功打印${templateDataList.length}条模板数据`, { offset: 8 }) |
|||
|
|||
// 14. 打印成功后,调用writeEAS方法(如果有TID和盒ID) |
|||
console.log(this.readTid + '/' + caseId) |
|||
if (this.readTid && caseId) { |
|||
console.log('开始执行标签绑定操作...') |
|||
await this.writeEAS(caseId, this.readTid) |
|||
} else if (!caseId) { |
|||
console.warn('未传入盒ID,跳过标签绑定') |
|||
this.$message.warning('未传入盒ID,跳过标签绑定', { offset: 8 }) |
|||
} else if (!this.readTid) { |
|||
console.warn('未读取到TID,跳过标签绑定') |
|||
this.$message.warning('未读取到TID,跳过标签绑定', { offset: 8 }) |
|||
} |
|||
|
|||
return Promise.resolve({ |
|||
success: true, |
|||
count: templateDataList.length, |
|||
data: templateDataList, |
|||
tid: this.readTid, |
|||
caseId: caseId |
|||
}) |
|||
} catch (error) { |
|||
console.error('打印流程异常:', error) |
|||
this.$message.error(`打印流程异常:${error}`, { offset: 8 }) |
|||
return Promise.reject(error) |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style scoped> |
|||
</style> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue