# -*- coding: utf-8 -*- # Part of SmartGo. See LICENSE file for full copyright and licensing details. import base64 import logging import math import qrcode from io import BytesIO from odoo import api, fields, models from pystrich.code128 import Code128Encoder from odoo.exceptions import UserError _logger = logging.getLogger(__name__) class CNCprocessing(models.Model): _inherit = 'cnc.processing' _description = "CNC加工" workorder_id = fields.Many2one('mrp.workorder', string="工单") class Tray(models.Model): _inherit = 'sf.tray' _description = '托盘' qr_image = fields.Binary(string="托盘二维码", compute='compute_qr_image') production_id = fields.Many2one('mrp.production', string='制造订单', related='workorder_id.production_id' ) workorder_id = fields.Many2one('mrp.workorder', string="工单" ) @api.onchange('production_id') def updateTrayState(self): if self.workorder_id != False: self.state = '占用' else: self.state = '空闲' def unclamp(self): self.workorder_id = False self.production_id = False self.state = '空闲' @api.depends('code') def compute_qr_image(self): for item in self: if not item.code: item.qr_image = False continue # 根据code动态生成二维码图片 # qr = qrcode.QRCode( # version=1, # error_correction=qrcode.constants.ERROR_CORRECT_L, # box_size=10, # border=4, # ) # qr.add_data(item.code) # qr.make(fit=True) # img = qr.make_image() # 生成条形码文件 # bar = barcode.get("ean13", "123456789102", writer=ImageWriter()) # a = bar.get_fullcode() # b = bar.save('occ') # 生成条形码图片 partner_encoder = Code128Encoder(item.code) # 转换bytes流 temp = BytesIO() partner_encoder.save(temp) # img.save(temp, format='PNG') qr_image = base64.b64encode(temp.getvalue()) item.qr_image = qr_image ''' 工单绑定托盘信息 ''' class MrpWorkOrder(models.Model): _inherit = 'mrp.workorder' _description = '工单' tray_ids = fields.One2many('sf.tray', 'workorder_id', string='托盘') # def get_tray_info(self): # @api.onchange('X_axis', 'Y_axis', 'Z_axis') # def get_center_point(self): # return 'X:%s,Y:%s,Z:%s' % (self.X_axis, self.Y_axis, self.Z_axis) # 加工面 surface = fields.Selection([("前面", "前面"), ("后面", "后面"), ("左面", "左面"), ("右面", "右面"), ("上面", "上面")], string="加工面1") material_center_point = fields.Char(string='配料中心点') X1_axis = fields.Float(string='Lx1', default=0) Y1_axis = fields.Float(string='Ly1', default=0) Z1_axis = fields.Float(string='Lz1', default=0) X2_axis = fields.Float(string='Lx2', default=0) Y2_axis = fields.Float(string='Ly2', default=0) Z2_axis = fields.Float(string='Lz2', default=0) X3_axis = fields.Float(string='Fx3', default=0) Y3_axis = fields.Float(string='Fy3', default=0) Z3_axis = fields.Float(string='Fz3', default=0) X4_axis = fields.Float(string='Fx4', default=0) Y4_axis = fields.Float(string='Fy4', default=0) Z4_axis = fields.Float(string='Fz4', default=0) X5_axis = fields.Float(string='Rx5', default=0) Y5_axis = fields.Float(string='Ry5', default=0) Z5_axis = fields.Float(string='Rz5', default=0) X6_axis = fields.Float(string='Rx6', default=0) Y6_axis = fields.Float(string='Ry6', default=0) Z6_axis = fields.Float(string='Rz6', default=0) X7_axis = fields.Float(string='Bx7', default=0) Y7_axis = fields.Float(string='By7', default=0) Z7_axis = fields.Float(string='Bz7', default=0) X8_axis = fields.Float(string='Bx8', default=0) Y8_axis = fields.Float(string='By8', default=0) Z8_axis = fields.Float(string='Bz8', default=0) X9_axis = fields.Float(string='Uz9', default=0) Y9_axis = fields.Float(string='Uz9', default=0) Z9_axis = fields.Float(string='Uz9', default=0) X10_axis = fields.Float(string='Uz10', default=0) Y10_axis = fields.Float(string='Uz10', default=0) Z10_axis = fields.Float(string='Uz10', default=0) # 扫码绑定托盘方法 def gettray(self): return "" # 计算配料中心点和与x轴倾斜度方法 def getcenter(self): x1 = self.X1_axis x2 = self.X2_axis x3 = self.X3_axis x4 = self.X4_axis x5 = self.X5_axis x6 = self.X6_axis x7 = self.X7_axis x8 = self.X8_axis y1 = self.Y1_axis y2 = self.Y2_axis y3 = self.Y3_axis y4 = self.Y4_axis y5 = self.Y5_axis y6 = self.Y6_axis y7 = self.Y7_axis y8 = self.Y8_axis z1 = self.Z9_axis x0 = ((x3 - x4) * (x2 * y1 - x1 * y2) - (x1 - x2) * (x4 * y3 - x3 * y4)) / ( (x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4)) y0 = ((y3 - y4) * (y2 * x1 - y1 * x2) - (y1 - y2) * (y4 * x3 - y3 * x4)) / ( (y3 - y4) * (x1 - x2) - (y1 - y2) * (x3 - x4)) x1 = ((x7 - x8) * (x6 * y5 - x5 * y7) - (x5 - x6) * (x8 * y7 - x7 * y8)) / ( (x7 - x8) * (y5 - y6) - (x5 - x6) * (y7 - y8)); y1 = ((y7 - y8) * (y6 * x5 - y5 * x7) - (y5 - y6) * (y8 * x7 - y7 * x8)) / ( (y7 - y8) * (x5 - x6) - (y5 - y6) * (x7 - x8)) x = (x0 + x1) / 2 y = (y0 + y1) / 2 z = z1 / 2 jd = math.atan2((x7 - x8), (y7 - y8)) jdz = jd * 180 / math.pi print("(%s,%s)" % (x, y)) self.material_center_point = ("(%s,%s,%s)" % (x, y, z)) self.X_deviation_angle = jdz X_deviation_angle = fields.Integer(string="X轴偏差度", default=0) test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], string="检测结果") cnc_ids = fields.One2many("cnc.processing", 'workorder_id', string="CNC加工") # @api.depends('tray_id') # def updateTrayState(self): # # for item in self: # if item.tray_code == False: # continue # trayInfo = self.env['sf.tray'].sudo.search([('code', '=', item.tray_code)]) # if trayInfo: # trayInfo.update( # { # 'production_id': item.production_id, # 'state': "占用", # } # ) def recreateManufacturing(self): return "" def recreateWorkerOrder(self): return "" ''' 制造订单绑定托盘信息 ''' class MrpProduction(models.Model): _inherit = 'mrp.production' _description = "制造订单" tray_ids = fields.One2many('sf.tray', 'production_id', string="托盘")