import qrcode import base64 from io import BytesIO from odoo import models, fields, api class MaintenanceEquipment(models.Model): _name = 'maintenance.equipment' _inherit = ['maintenance.equipment', 'printing.utils'] qr_code_image = fields.Binary(string='二维码', compute='_generate_qr_code') @api.depends('name') def _generate_qr_code(self): for record in self: # Generate QR code qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) qr.add_data(record.name) qr.make(fit=True) qr_image = qr.make_image(fill_color="black", back_color="white") # Encode the image data in base64 image_stream = BytesIO() qr_image.save(image_stream, format="PNG") encoded_image = base64.b64encode(image_stream.getvalue()) record.qr_code_image = encoded_image def print_single_method(self): print('self.name========== %s' % self.name) self.ensure_one() qr_code_data = self.qr_code_image if not qr_code_data: raise UserError("没有找到二维码数据。") maintenance_equipment_name = self.name # host = "192.168.50.110" # 可以根据实际情况修改 # port = 9100 # 可以根据实际情况修改 # 获取默认打印机配置 printer_config = self.env['printer.configuration'].sudo().search([('model', '=', '机床二维码')], limit=1) if not printer_config: raise UserError('请先配置打印机') host = printer_config.printer_id.ip_address port = printer_config.printer_id.port self.print_qr_code(maintenance_equipment_name, host, port) def generate_zpl_code(self, code): """生成ZPL代码用于打印二维码标签 Args: code: 需要编码的内容 Returns: str: ZPL指令字符串 """ zpl_code = "^XA\n" # 开始ZPL格式 # 设置打印参数 zpl_code += "^LH0,0\n" # 设置标签起始位置 zpl_code += "^CI28\n" # 设置中文编码 zpl_code += "^PW400\n" # 设置打印宽度为400点 zpl_code += "^LL300\n" # 设置标签长度为300点 # 打印标题 zpl_code += "^FO10,20\n" # 设置标题位置 zpl_code += "^A0N,30,30\n" # 设置字体大小 zpl_code += "^FD机床二维码^FS\n" # 打印标题文本 # 打印二维码 zpl_code += "^FO50,60\n" # 设置二维码位置 zpl_code += f"^BQN,2,8\n" # 设置二维码参数:模式2,放大倍数8 zpl_code += f"^FDLA,{code}^FS\n" # 二维码内容 # 打印编码文本 zpl_code += "^FO50,220\n" # 设置编码文本位置 zpl_code += "^A0N,25,25\n" # 设置字体大小 zpl_code += f"^FD编码: {code}^FS\n" # 打印编码文本 # 打印日期 zpl_code += "^FO50,260\n" zpl_code += "^A0N,20,20\n" zpl_code += f"^FD打印日期: {fields.Date.today()}^FS\n" zpl_code += "^PQ1\n" # 打印1份 zpl_code += "^XZ\n" # 结束ZPL格式 return zpl_code