编程单增加二维码
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user