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)
+