diff --git a/jikimo_work_reporting_api/controllers/main.py b/jikimo_work_reporting_api/controllers/main.py index c2594875..76b55dc9 100644 --- a/jikimo_work_reporting_api/controllers/main.py +++ b/jikimo_work_reporting_api/controllers/main.py @@ -6,9 +6,9 @@ from odoo.addons.sf_machine_connect.models.ftp_operate import transfer_nc_files class MainController(http.Controller): @http.route('/api/manual_download_program', type='json', methods=['POST'], auth='wechat_token', cors='*') - def work_reporting(self, **kwargs): + def manual_download_program(self): """ - + 人工线下加工传输编程文件 """ data = json.loads(request.httprequest.data) maintenance_equipment_name = data.get('maintenance_equipment_name') diff --git a/sf_base/commons/Printer.py b/sf_base/commons/Printer.py index 563d9dea..e9d31282 100644 --- a/sf_base/commons/Printer.py +++ b/sf_base/commons/Printer.py @@ -8,6 +8,7 @@ class Printer(models.Model): name = fields.Char(string='名称', required=True) ip_address = fields.Char(string='IP 地址', required=True) port = fields.Integer(string='端口', default=9100) + type = fields.Selection([('zpl', 'ZPL'), ('normal', '普通')], string='类型', default='zpl') class TableStyle(models.Model): diff --git a/sf_base/views/Printer.xml b/sf_base/views/Printer.xml index 0e199b32..157121c9 100644 --- a/sf_base/views/Printer.xml +++ b/sf_base/views/Printer.xml @@ -9,6 +9,7 @@ + @@ -24,6 +25,7 @@ + diff --git a/sf_maintenance/models/__init__.py b/sf_maintenance/models/__init__.py index b07aa1eb..4e925ec6 100644 --- a/sf_maintenance/models/__init__.py +++ b/sf_maintenance/models/__init__.py @@ -4,4 +4,4 @@ from . import sf_maintenance_oee from . import sf_maintenance_logs from . import sf_equipment_maintenance_standards from . import sf_maintenance_requests -from . import maintenance_qrcode_printer +from . import maintenance_printer diff --git a/sf_maintenance/models/maintenance_qrcode_printer.py b/sf_maintenance/models/maintenance_printer.py similarity index 98% rename from sf_maintenance/models/maintenance_qrcode_printer.py rename to sf_maintenance/models/maintenance_printer.py index 7d1950e7..b2c251aa 100644 --- a/sf_maintenance/models/maintenance_qrcode_printer.py +++ b/sf_maintenance/models/maintenance_printer.py @@ -42,7 +42,7 @@ class MaintenanceEquipment(models.Model): # port = 9100 # 可以根据实际情况修改 # 获取默认打印机配置 - printer_config = self.env['printer.configuration'].sudo().search([('model', '=', '机床二维码')], limit=1) + printer_config = self.env['printer.configuration'].sudo().search([('model', '=', self._name)], limit=1) if not printer_config: raise UserError('请先配置打印机') host = printer_config.printer_id.ip_address diff --git a/sf_manufacturing/models/__init__.py b/sf_manufacturing/models/__init__.py index e6845317..4a0a2a33 100644 --- a/sf_manufacturing/models/__init__.py +++ b/sf_manufacturing/models/__init__.py @@ -16,4 +16,5 @@ from . import sf_production_common from . import sale_order from . import quick_easy_order from . import purchase_order -from . import quality_check \ No newline at end of file +from . import quality_check +from . import workorder_printer diff --git a/sf_manufacturing/models/workorder_printer.py b/sf_manufacturing/models/workorder_printer.py new file mode 100644 index 00000000..46eb3b8b --- /dev/null +++ b/sf_manufacturing/models/workorder_printer.py @@ -0,0 +1,134 @@ +import qrcode +import base64 +import logging +import tempfile +import os +import platform +import socket +import subprocess +from io import BytesIO +from odoo import models, fields, api +from odoo.exceptions import UserError + +_logger = logging.getLogger(__name__) + +class MrpWorkorder(models.Model): + _name = 'mrp.workorder' + _inherit = ['mrp.workorder', 'printing.utils'] + + def print_pdf(self, printer_config, pdf_data): + """跨平台打印函数,支持网络打印机(IP:端口)""" + # 将PDF数据保存到临时文件 + with tempfile.NamedTemporaryFile(delete=False, suffix='.pdf') as temp_file: + pdf_binary = base64.b64decode(pdf_data) + temp_file.write(pdf_binary) + temp_file_path = temp_file.name + + _logger.info(f"开始打印PDF文件: {temp_file_path}") + + try: + # 获取打印机名称或IP地址 + printer_name = printer_config.printer_id.name + if not printer_name: + raise UserError('打印机名称未配置') + + # 使用打印机配置中的IP地址和端口 + printer_ip = printer_config.printer_id.ip_address + printer_port = printer_config.printer_id.port + _logger.info(f"使用网络打印机: IP={printer_ip}, 端口={printer_port}") + + if platform.system() == 'Windows': + _logger.info(f"Windows环境不支持网络打印机") + else: # Linux环境 + # try: + # import cups + + # # 处理网络打印机情况 + # _logger.info(f"Linux环境下连接网络打印机: {printer_ip}:{printer_port}") + + # # 创建连接 + # conn = cups.Connection() + + # # 检查打印机是否已经添加到系统 + # printers = conn.getPrinters() + # _logger.info(f"可用打印机列表: {list(printers.keys())}") + + # network_printer_name = f"IP_{printer_ip}_{printer_port}" + + # # 如果打印机不存在,尝试添加 + # if network_printer_name not in printers: + # _logger.info(f"添加网络打印机: {network_printer_name}") + # conn.addPrinter( + # network_printer_name, + # device=f"socket://{printer_ip}:{printer_port}", + # info=f"Network Printer {printer_ip}:{printer_port}", + # location="Network" + # ) + # # 设置打印机为启用状态 + # conn.enablePrinter(network_printer_name) + # _logger.info(f"网络打印机添加成功: {network_printer_name}") + + # # 打印文件 + # _logger.info(f"开始打印到网络打印机: {network_printer_name}") + # job_id = conn.printFile(network_printer_name, temp_file_path, "工单打印", {}) + # _logger.info(f"打印作业ID: {job_id}") + + + # except ImportError as ie: + # _logger.error(f"导入CUPS库失败: {str(ie)}") + + # 尝试使用lp命令打印 + try: + _logger.info("尝试使用lp命令打印...") + + # 使用socket设置打印 + cmd = f"lp -h {printer_ip}:{printer_port} -d {printer_name} {temp_file_path}" + + _logger.info(f"执行lp打印命令: {cmd}") + result = subprocess.run(cmd, shell=True, check=True, capture_output=True) + _logger.info(f"lp打印结果: {result.stdout.decode()}") + except Exception as e: + _logger.error(f"lp命令打印失败: {str(e)}") + raise UserError(f'打印失败,请安装cups打印库: pip install pycups 或确保lp命令可用') + + return True + except Exception as e: + _logger.error(f"打印失败详细信息: {str(e)}") + raise UserError(f'打印失败: {str(e)}') + finally: + # 清理临时文件 + if os.path.exists(temp_file_path): + try: + os.unlink(temp_file_path) + _logger.info(f"临时文件已清理: {temp_file_path}") + except Exception as e: + _logger.error(f"清理临时文件失败: {str(e)}") + + def _compute_state(self): + super(MrpWorkorder, self)._compute_state() + for workorder in self: + work_ids = workorder.production_id.workorder_ids.filtered(lambda w: w.routing_type == '装夹预调' or w.routing_type == '人工线下加工') + for wo in work_ids: + if wo.state == 'ready' and not wo.production_id.product_id.is_print_program: + # 触发打印程序 + pdf_data = self.processing_drawing + try: + if pdf_data: + # 获取默认打印机配置 + printer_config = self.env['printer.configuration'].sudo().search([('model', '=', self._name), ('printer_id.type', '=', 'normal')], limit=1) + if not printer_config: + raise UserError('请先配置打印机') + + # 执行打印 + if self.print_pdf(printer_config, pdf_data): + wo.production_id.product_id.is_print_program = True + _logger.info(f"工单 {wo.name} 的PDF已成功打印") + + except Exception as e: + _logger.error(f'打印配置错误: {str(e)}') + +class ProductTemplate(models.Model): + _inherit = 'product.template' + + is_print_program = fields.Boolean(string='是否打印程序', default=False) +