# -*- coding: utf-8 -*- import logging import requests import json from odoo import fields, models, api from odoo.exceptions import ValidationError from odoo.addons.sf_base.commons.common import Common _logger = logging.getLogger(__name__) class MachineBrandTags(models.Model): _name = 'sf.machine.brand.tags' _description = '标签' name = fields.Char('名称', size=50) color = fields.Integer('颜色', default=0) class MachineControlSystem(models.Model): _name = 'sf.machine.control_system' _description = '控制系统' code = fields.Char('编码', size=10) name = fields.Char('名称') remark = fields.Char('备注') brand_id = fields.Many2one('sf.machine.brand', '品牌') active = fields.Boolean('有效', default=True) # 品牌标签 class MachineBrand(models.Model): _name = 'sf.machine.brand' _description = '品牌' code = fields.Char('编码') name = fields.Char('名称') tag_ids = fields.Many2many('sf.machine.brand.tags', 'rel_machine_brand_tags', string='类别') image_brand = fields.Image("图片") remark = fields.Text('备注') active = fields.Boolean('有效', default=True) # 机床 class MachineTool(models.Model): _name = 'sf.machine_tool' _description = '机床' def get_no(self): partner = self.env['sf.machine_tool'].sudo().search( [('MTcode', '!=', '')], limit=1, order="id desc") if not partner: num = "%04d" % 1 else: m = int(partner.MTcode) + 1 num = "%04d" % m return num MTcode = fields.Char("编码", default=get_no) code = fields.Char('行业编码') name = fields.Char('名称') knife_type = fields.Selection( [("BT40", "BT40"), ("BT30", "BT30")], default="", string="刀把类型") number_of_knife_library = fields.Integer('刀库数量(把)') rotate_speed = fields.Integer('转速') number_of_axles = fields.Selection( [("三轴", "三轴"), ("四轴", "四轴"), ("五轴", "五轴")], default="", string="轴数") # 加工进程 x_axis = fields.Integer('X轴') y_axis = fields.Integer('Y轴') z_axis = fields.Integer('Z轴') b_axis = fields.Integer('B轴') c_axis = fields.Integer('C轴') remark = fields.Char('备注') is_binding = fields.Boolean('是否绑定机床', default=False) precision = fields.Float('加工精度') control_system_id = fields.Many2one('sf.machine.control_system', string="控制系统") # 多个机床型号对应一个机床 type_id = fields.Many2one('sf.machine_tool.type', '型号') brand_id = fields.Many2one('sf.machine.brand', string='品牌') state = fields.Selection( [("正常", "正常"), ("故障", "故障"), ("不可用", "不可用")], default='正常', string="机床状态") # 0606新增字段 machine_tool_picture = fields.Binary('图片') heightened_way = fields.Selection([ ('sifudianji', '伺服电机驱动'), ('youyagang', '油压缸驱动'), ('chilunjia', '齿轮架驱动') ], string="主轴加高方式", default='sifudianji') workpiece_load = fields.Char('工件负载') lead_screw = fields.Char('丝杆') workbench_L = fields.Char('工作台长度(mm)') workbench_W = fields.Char('工作台宽度(mm)') guide_rail = fields.Char('导轨') machine_tool_L = fields.Char('机床长度(mm)') machine_tool_W = fields.Char('机床宽度(mm)') machine_tool_H = fields.Char('机床高度(mm)') feed_speed = fields.Char('进给速度(mm/min)') tool_speed = fields.Char('刀具速度') distance = fields.Char('主轴端面至工作台面距离(mm)') taper = fields.Char('主轴锥度(°)') torque = fields.Char('主轴点击扭矩(n/m)') motor_power = fields.Char('主轴电机功率(kw)') tool_quality_max = fields.Char('刀具最大质量') tool_long_max = fields.Char('刀具最大长度') tool_diameter_max = fields.Char('刀具最大刀径') machine_tool_category = fields.Many2one('sf.machine_tool.category', string='机床类型') # 一个机床对应一個加工工厂,一个加工工厂对应多个机床 factory_id = fields.Many2one('res.partner', string='所属工厂', domain="[('is_factory', '=', True)]") # 一个机床对应一个供应商,一个供应商对应多个机床 supplier_id = fields.Many2one('res.partner', string='制造商', domain="[('is_vendor', '=', True)]") registration_date = fields.Date('注册日期') state_zc = fields.Selection([("已注册", "已注册"), ("未注册", "未注册")], string="注册状态", default='未注册') active = fields.Boolean('有效', default=True) @api.constrains('rotate_speed') def _check_rotate_speed(self): if self.rotate_speed <= 0: raise ValidationError("转速不能为0") @api.constrains('precision') def _check_precision(self): if self.precision <= 0.00: raise ValidationError("加工精度不能为0") @api.constrains('number_of_knife_library') def _check_number_of_knife_library(self): if self.number_of_knife_library <= 0: raise ValidationError("刀库数量不能为0") @api.constrains('x_axis') def _check_x_axis(self): if self.x_axis <= 0: raise ValidationError("加工行程里x轴不能为0") @api.constrains('y_axis') def _check_y_axis(self): if self.y_axis <= 0: raise ValidationError("加工行程里y轴不能为0") @api.constrains('z_axis') def _check_z_axis(self): if self.z_axis <= 0: raise ValidationError("加工行程里z轴不能为0") @api.constrains('b_axis') def _check_b_axis(self): if self.number_of_axles == '四轴': print(self.number_of_axles) if self.b_axis <= 0: raise ValidationError("加工行程里b轴不能为0") @api.constrains('c_axis') def _check_c_axis(self): if self.number_of_axles == '五轴': if self.c_axis <= 0: raise ValidationError("加工行程里c轴不能为0") @api.onchange('type_id') def get_type_info(self): for item in self: item.knife_type = item.type_id.knife_type item.number_of_knife_library = item.type_id.number_of_knife_library item.number_of_axles = item.type_id.number_of_axles item.rotate_speed = item.type_id.rotate_speed item.precision = item.type_id.precision item.control_system_id = item.type_id.control_system_id item.x_axis = item.type_id.x_axis item.y_axis = item.type_id.y_axis item.z_axis = item.type_id.z_axis item.b_axis = item.type_id.b_axis item.c_axis = item.type_id.c_axis item.machine_tool_picture = item.type_id.machine_tool_picture item.heightened_way = item.type_id.heightened_way item.workpiece_load = item.type_id.workpiece_load item.lead_screw = item.type_id.lead_screw item.workbench_L = item.type_id.workbench_L item.workbench_W = item.type_id.workbench_W item.guide_rail = item.type_id.guide_rail item.machine_tool_L = item.type_id.machine_tool_L item.machine_tool_W = item.type_id.machine_tool_W item.machine_tool_H = item.type_id.machine_tool_H item.feed_speed = item.type_id.feed_speed item.tool_speed = item.type_id.tool_speed item.distance = item.type_id.distance item.taper = item.type_id.taper item.torque = item.type_id.torque item.motor_power = item.type_id.motor_power item.tool_quality_max = item.type_id.tool_quality_max item.tool_long_max = item.type_id.tool_long_max item.tool_diameter_max = item.type_id.tool_diameter_max item.machine_tool_category = item.type_id.machine_tool_category.id # 注册同步机床 def enroll_machine_tool(self): sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] headers = Common.get_headers(self, token, sf_secret_key) strurl = sf_sync_config['sf_url'] + self.crea_url objs_all = self.env['sf.machine_tool'].search([('MTcode', '=', self.MTcode)]) machine_tool_list = [] if objs_all: for item in objs_all: val = { 'MTcode': item.MTcode, 'factory_token': token, 'id': item.id, 'name': item.name, 'code': item.code, 'precision': item.precision, 'knife_type': item.knife_type, 'number_of_knife_library': item.number_of_knife_library, 'rotate_speed': item.rotate_speed, 'number_of_axles': item.number_of_axles, 'control_system_id': self.env['sf.machine.control_system'].search( [('id', '=', item.control_system_id.id)]).code, 'type_id': self.env['sf.machine_tool.type'].search([('id', '=', item.type_id.id)]).code, 'brand_id': self.env['sf.machine.brand'].search([('id', '=', item.brand_id.id)]).code, 'supplier_id': item.supplier_id.id, 'x_axis': item.x_axis, 'y_axis': item.y_axis, 'z_axis': item.z_axis, 'b_axis': item.b_axis, 'c_axis': item.c_axis, 'state': item.state, 'active': item.active, } machine_tool_list.append(val) # kw = machine_tool_list kw = json.dumps(machine_tool_list, ensure_ascii=False) r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers) ret = r.json() self.code = ret['message'] self.state_zc = "已注册" if r == 200: return "机床注册成功" else: raise ValidationError("没有注册机床信息") class MachineToolType(models.Model): _name = 'sf.machine_tool.type' _description = '机床型号' # _order = 'priority desc, code, name, id' name = fields.Char('名称') brand_id = fields.Many2one('sf.machine.brand', string='品牌') knife_type = fields.Selection( [("BT40", "BT40"), ("BT30", "BT30"), ("BT50", "BT50")], default="", string="刀把类型") number_of_knife_library = fields.Integer('刀库数量') rotate_speed = fields.Integer('转速') # 0606新增字段 created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user) machine_tool_picture = fields.Binary('图片') heightened_way = fields.Selection([ ('sifudianji', '伺服电机驱动'), ('youyagang', '油压缸驱动'), ('chilunjia', '齿轮架驱动') ], string="主轴加高方式", default='sifudianji') workpiece_load = fields.Char('工件最大负载(kg)') lead_screw = fields.Char('丝杆') workbench_L = fields.Char('工作台长度(mm)') workbench_W = fields.Char('工作台宽度(mm)') guide_rail = fields.Char('导轨') machine_tool_L = fields.Char('机床长度(mm)') machine_tool_W = fields.Char('机床宽度(mm)') machine_tool_H = fields.Char('机床高度(mm)') feed_speed = fields.Char('进给速度(mm/min)') tool_speed = fields.Char('刀具速度(m/min)') distance_min = fields.Char('主轴端面至工作台面距离MIN(mm)') distance_max = fields.Char('主轴端面至工作台面距离MAX(mm)') taper = fields.Char('主轴锥度(°)') torque = fields.Char('主轴电机扭矩(n/m)') motor_power = fields.Char('主轴电机功率(kw)') tool_quality_max = fields.Char('刀具最大质量(kg)') tool_long_max = fields.Char('刀具最大长度(mm)') tool_diameter_max = fields.Char('刀具刀径max(mm)') tool_diameter_min = fields.Char('刀具刀径min(mm)') machine_tool_category = fields.Many2one('sf.machine_tool.category', string='机床类型') # 多个型号对应一个机床 machine_tool_id = fields.Many2one('sf.machine_tool', '机床') number_of_axles = fields.Selection( [("三轴", "三轴"), ("四轴", "四轴"), ("五轴", "五轴")], default="", string="轴数") # 加工进程 x_axis = fields.Integer('X轴') y_axis = fields.Integer('Y轴') z_axis = fields.Integer('Z轴') b_axis = fields.Integer('B轴') c_axis = fields.Integer('C轴') remark = fields.Char('备注') precision_min = fields.Float('X轴定位精度min(mm)', digits=(12, 3)) precision_max = fields.Float('X轴定位精度max(mm)', digits=(12, 3)) control_system_id = fields.Many2one('sf.machine.control_system', string="控制系统") active = fields.Boolean('有效', default=True) code = fields.Char('编码') def _get_ids(self, machine_tool_type_code): machine_tool_type_ids = [] for item in machine_tool_type_code: machine_tool_type = self.search([('code', '=', item)]) if machine_tool_type: machine_tool_type_ids.append(machine_tool_type.id) return [(6, 0, machine_tool_type_ids)] class MachineToolCategory(models.Model): _name = 'sf.machine_tool.category' _description = '机床类型' code = fields.Char('编码') name = fields.Char('名称') remark = fields.Text('备注') active = fields.Boolean('有效', default=True) category = fields.Selection([('shukong', u'数控'), ('putong', u'普通')], string=u'机床类别', default='shukong')