From 085e6359ce76714b51ed9fdf458f6754b784f947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=B0=A7?= Date: Tue, 15 Apr 2025 15:47:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E7=A8=8B=E5=8D=95=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_mrs_connect/controllers/controllers.py | 88 +++++++++++++++++++++-- 1 file changed, 81 insertions(+), 7 deletions(-) diff --git a/sf_mrs_connect/controllers/controllers.py b/sf_mrs_connect/controllers/controllers.py index 7599ed6c..5404f313 100644 --- a/sf_mrs_connect/controllers/controllers.py +++ b/sf_mrs_connect/controllers/controllers.py @@ -3,9 +3,13 @@ import logging import os import json import base64 +from qrcode.main import QRCode +import PyPDF2 from odoo import http, fields, models from odoo.http import request from odoo.addons.sf_base.controllers.controllers import MultiInheritController +import qrcode + class Sf_Mrs_Connect(http.Controller, MultiInheritController): @@ -22,6 +26,7 @@ class Sf_Mrs_Connect(http.Controller, MultiInheritController): try: res = {'status': 1, 'message': '成功'} datas = request.httprequest.data + model_id = None ret = json.loads(datas) ret = json.loads(ret['result']) logging.info('下发编程单:%s' % ret) @@ -57,6 +62,7 @@ class Sf_Mrs_Connect(http.Controller, MultiInheritController): res['message'] = '编程单号为%s的CNC程序文件从FTP拉取失败' % (ret['programming_no']) return json.JSONEncoder().encode(res) for production in productions: + model_id = production.product_id.model_id # 一个编程单的制造订单对应同一个模型 production.write({'programming_state': '已编程', 'work_state': '已编程', 'is_rework': False}) for panel in ret['processing_panel'].split(','): # 查询状态为进行中且工序类型为CNC加工的工单 @@ -83,19 +89,22 @@ class Sf_Mrs_Connect(http.Controller, MultiInheritController): # panel) program_path_tmp_panel = os.path.join('/tmp', ret['folder_name'], 'return', panel) files_panel = os.listdir(program_path_tmp_panel) + panel_file_path = '' if files_panel: for file in files_panel: file_extension = os.path.splitext(file)[1] if file_extension.lower() == '.pdf': panel_file_path = os.path.join(program_path_tmp_panel, file) logging.info('panel_file_path:%s' % panel_file_path) - cnc_workorder.write({'cnc_worksheet': base64.b64encode(open(panel_file_path, 'rb').read())}) - pre_workorder = productions.workorder_ids.filtered( - lambda ap: ap.routing_type in ['装夹预调', '人工线下加工'] and ap.state not in ['done', 'rework' - 'cancel'] and ap.processing_panel == panel) - if pre_workorder: - pre_workorder.write( - {'processing_drawing': base64.b64encode(open(panel_file_path, 'rb').read())}) + + cnc_workorder.write({'cnc_worksheet': base64.b64encode(open(panel_file_path, 'rb').read())}) + pre_workorder = productions.workorder_ids.filtered( + lambda ap: ap.routing_type in ['装夹预调', '人工线下加工'] and ap.state not in ['done', 'rework' + 'cancel'] and ap.processing_panel == panel) + if pre_workorder: + self._add_qr_code_to_pdf(panel_file_path, model_id) + pre_workorder.write( + {'processing_drawing': base64.b64encode(open(panel_file_path, 'rb').read())}) productions.write({'programming_state': '已编程', 'work_state': '已编程'}) productions.filtered(lambda p: p.production_type == '人工线下加工').write({'manual_quotation': True}) logging.info('已更新制造订单编程状态:%s' % productions.ids) @@ -268,3 +277,68 @@ class Sf_Mrs_Connect(http.Controller, MultiInheritController): request.cr.rollback() logging.info('get_cnc_processing_create error:%s' % e) return json.JSONEncoder().encode(res) + + + def _add_qr_code_to_pdf(self, panel_file_path, model_id): + if not os.path.exists(panel_file_path): + logging.warning(f'文件不存在: {panel_file_path}') + return False + + # 生成二维码 + qr = qrcode.QRCode(version=1, box_size=10, border=5) + qr.add_data(str(model_id)) + qr.make(fit=True) + qr_img = qr.make_image(fill_color="black", back_color="white") + + # 保存二维码为临时文件 + qr_temp_path = '/tmp/qr_temp.png' + qr_img.save(qr_temp_path) + + # 创建一个临时PDF文件路径 + output_temp_path = '/tmp/output_temp.pdf' + + # 使用reportlab创建一个新的PDF + from reportlab.pdfgen import canvas + from reportlab.lib.units import inch + from PyPDF2 import PdfFileReader, PdfFileWriter + + # 读取原始PDF + existing_pdf = PdfFileReader(open(panel_file_path, "rb")) + output = PdfFileWriter() + + # 处理第一页 + page = existing_pdf.getPage(0) + # 获取页面尺寸 + page_width = float(page.mediaBox.getWidth()) + page_height = float(page.mediaBox.getHeight()) + + # 创建一个新的PDF页面用于放置二维码 + c = canvas.Canvas(output_temp_path, pagesize=(page_width, page_height)) + # 在右下角绘制二维码,预留边距 + qr_size = 1 * inch # 二维码大小为1英寸 + margin = 0.4 * inch # 边距为0.4英寸 + c.drawImage(qr_temp_path, page_width - qr_size - margin, margin, width=qr_size, height=qr_size) + c.save() + + # 读取带有二维码的临时PDF + qr_pdf = PdfFileReader(open(output_temp_path, "rb")) + qr_page = qr_pdf.getPage(0) + + # 合并原始页面和二维码页面 + page.mergePage(qr_page) + output.addPage(page) + + # 添加剩余的页面 + for i in range(1, existing_pdf.getNumPages()): + output.addPage(existing_pdf.getPage(i)) + + # 保存最终的PDF + with open(panel_file_path, "wb") as output_file: + output.write(output_file) + + # 清理临时文件 + qr_pdf.close() + os.remove(qr_temp_path) + os.remove(output_temp_path) + + return True \ No newline at end of file