diff --git a/sf_tool_management/controllers/controllers.py b/sf_tool_management/controllers/controllers.py index d7f2adee..4b68e3f8 100644 --- a/sf_tool_management/controllers/controllers.py +++ b/sf_tool_management/controllers/controllers.py @@ -8,6 +8,35 @@ from odoo.http import request class Manufacturing_Connect(http.Controller): + @http.route('/AutoDeviceApi/ToolGroup', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, + cors="*") + def get_functional_tool_groups_Info(self, **kw): + """ + 刀具组接口 + :param kw: + :return: + """ + logging.info('get_functional_tool_groups_Info:%s' % kw) + try: + datas = request.httprequest.data + ret = json.loads(datas) + # ret = json.loads(ret['result']) + logging.info('DeviceId:%s' % ret) + functional_tools = request.env['sf.tool.inventory'].sudo().search([]) + + res = {'Succeed': True, 'Datas': []} + if functional_tools: + for item in functional_tools: + res['Datas'].append({ + 'GroupName': item.tool_groups_id.name, + 'ToolId': item.functional_cutting_tool_model_id.name, + 'ToolName': item.name + }) + except Exception as e: + res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} + logging.info('get_functional_tool_groups_Info error:%s' % e) + return json.JSONEncoder().encode(res) + @http.route('/AutoDeviceApi/ToolInventory', type='json', auth='none', methods=['GET', 'POST'], csrf=False, cors="*") def get_functional_tool_inventory_Info(self, **kw): @@ -67,3 +96,34 @@ class Manufacturing_Connect(http.Controller): res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} logging.info('get_functional_tool_entity_Info error:%s' % e) return json.JSONEncoder().encode(res) + + @http.route('/AutoDeviceApi/PutToolParameter', type='http', auth='none', methods=['GET', 'POST'], csrf=False, + cors="*") + def put_tool_preset_parameter_port(self, **kw): + """ + 刀具预调仪接口 + :param kw: + :return: + """ + logging.info('put_tool_preset_parameter_port:%s' % kw) + res = {'Succeed': True, 'Datas': []} + try: + datas = request.httprequest.data + ret = str(datas, 'utf-8') + data_lists = ret.split(",") + data_list = [data.replace('+', '') for data in data_lists] + logging.info(data_list) + tool_assembly = request.env['sf.functional.tool.assembly'].sudo().search( + [('assembly_order_code', '=', data_list[0]), ('start_preset_bool', '=', True)]) + if not tool_assembly: + return json.JSONEncoder().encode( + {'Succeed': False, 'ErrorCode': 201, 'code': data_list[0], 'Error': '没有找到正在组装的组装单!'}) + tool_assembly.write({ + 'after_assembly_tool_loading_length': float(data_list[1] or "0"), # 高度(总长度) + 'after_assembly_functional_tool_diameter': float(data_list[2] or "0"), # 直径 + 'after_assembly_knife_tip_r_angle': float(data_list[3] or "0") # R角 + }) + except Exception as e: + res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} + logging.info('put_tool_preset_parameter_port error:%s' % e) + return json.JSONEncoder().encode(res) \ No newline at end of file diff --git a/sf_tool_management/models/__init__.py b/sf_tool_management/models/__init__.py index b589e095..b6020280 100644 --- a/sf_tool_management/models/__init__.py +++ b/sf_tool_management/models/__init__.py @@ -6,4 +6,5 @@ from . import mrp_workorder from . import functional_tool_enroll from . import fixture_material_search from . import fixture_enroll +from . import temporary_data_processing_methods diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index 3125cf01..0f4c9813 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -549,12 +549,14 @@ class FunctionalToolAssembly(models.Model): chuck_name = fields.Char('') # ============================================== # 组装功能刀具参数信息 + start_preset_bool = fields.Boolean('开始预调', default=False) barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', readonly=True) after_assembly_functional_tool_name = fields.Char(string='组装后功能刀具名称', readonly=True) after_assembly_functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='组装后功能刀具类型', readonly=True) - after_assembly_functional_tool_diameter = fields.Float(string='组装后功能刀具直径(mm)', readonly=True) - after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)', readonly=True) + after_assembly_functional_tool_diameter = fields.Float(string='组装后功能刀具直径(mm)', readonly=True, + digits=(10, 3)) + after_assembly_knife_tip_r_angle = fields.Float(string='组装后刀尖R角(mm)', readonly=True, digits=(10, 3)) after_assembly_new_former = fields.Selection([('0', '新'), ('1', '旧')], string='组装后新/旧', readonly=True) cut_time = fields.Integer(string='已切削时间(min)', readonly=True) cut_length = fields.Float(string='已切削长度(mm)', readonly=True) @@ -566,8 +568,9 @@ class FunctionalToolAssembly(models.Model): after_assembly_max_lifetime_value = fields.Integer(string='组装后最大寿命值(min)', readonly=True) after_assembly_alarm_value = fields.Integer(string='组装后报警值(min)', readonly=True) after_assembly_used_value = fields.Integer(string='组装后已使用值(min)', readonly=True) - after_assembly_tool_loading_length = fields.Float(string='组装后总长度(mm)', readonly=True) - after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)', readonly=True) + after_assembly_tool_loading_length = fields.Float(string='组装后总长度(mm)', readonly=True, digits=(10, 3)) + after_assembly_handle_length = fields.Float(string='组装后刀柄长度(mm)', readonly=True, digits=(10, 3)) + after_assembly_functional_tool_length = fields.Float(string='组装后伸出长(mm)', readonly=True, digits=(10, 3)) after_assembly_effective_length = fields.Float(string='组装后有效长(mm)', readonly=True) L_D_number = fields.Float(string='L/D值(mm)', readonly=True) hiding_length = fields.Float(string='避空长(mm)', readonly=True) @@ -585,29 +588,64 @@ class FunctionalToolAssembly(models.Model): active = fields.Boolean(string='已归档', default=True) + def put_start_preset(self): + self.search([('start_preset_bool', '=', True)]).write({'start_preset_bool': False}) + self.write({ + 'after_assembly_tool_loading_length': 0, + 'after_assembly_functional_tool_diameter': 0, + 'after_assembly_knife_tip_r_angle': 0, + 'start_preset_bool': True + }) + return { + 'type': 'ir.actions.act_window', + 'res_model': 'sf.functional.tool.assembly.order', + 'name': '功能刀具组装单', + 'view_mode': 'form', + 'target': 'new', + 'context': {'default_name': self.name, + 'default_assembly_order_code': self.assembly_order_code, + 'default_production_line_name_id': self.production_line_name_id.id, + 'default_machine_tool_name_id': self.machine_tool_name_id.id, + 'default_cutter_spacing_code_id': self.cutter_spacing_code_id.id, + 'default_functional_tool_name': self.functional_tool_name, + 'default_functional_tool_type_id': self.functional_tool_type_id.id, + 'default_tool_groups_id': self.tool_groups_id.id, + 'default_functional_tool_diameter': self.functional_tool_diameter, + 'default_knife_tip_r_angle': self.knife_tip_r_angle, + 'default_tool_loading_length': self.tool_loading_length, + 'default_functional_tool_length': self.functional_tool_length, + 'default_effective_length': self.effective_length, + 'default_whether_standard_knife': self.whether_standard_knife, + 'default_coarse_middle_thin': self.coarse_middle_thin, + 'default_new_former': self.new_former, + 'default_use_tool_time': self.use_tool_time, + 'default_reason_for_applying': self.reason_for_applying + } + } + def _get_code(self, loading_task_source): """ 自动生成组装单编码 """ new_time = str(fields.Date.today()) - datetime = new_time[2:4] + new_time[5:7] + new_time[-2:] + datetime = new_time[2:4] + new_time[5:7] + if loading_task_source == '0': + code = 'C' + datetime + elif loading_task_source == '1': + code = 'J' + datetime + elif loading_task_source == '2': + code = 'K' + datetime + else: + code = False functional_tool_assembly = self.env['sf.functional.tool.assembly'].sudo().search( [('loading_task_source', '=', loading_task_source), - ('assembly_order_code', 'ilike', datetime)], limit=1, order="id desc") + ('assembly_order_code', 'ilike', code)], limit=1, order="id desc") if not functional_tool_assembly: num = "%03d" % 1 else: m = int(functional_tool_assembly.assembly_order_code[-3:]) + 1 num = "%03d" % m - if loading_task_source == '0': - code = 'CAMZZD' + datetime + str(num) - elif loading_task_source == '1': - code = 'JTZZD' + datetime + str(num) - elif loading_task_source == '2': - code = 'MTSZZD' + datetime + str(num) - else: - code = False - return code + return code + str(num) def get_functional_tool(self, val): functional_tools = self.env['sf.functional.tool.assembly'].search( @@ -825,6 +863,10 @@ class FunctionalToolDismantle(models.Model): logging.info('%s刀具确认开始拆解' % self.dismantle_cause) if self.functional_tool_id.functional_tool_status == '已拆除': raise ValidationError('Rfid为【%s】的功能刀具已经拆解,请勿重复操作!' % self.functional_tool_id.rfid_dismantle) + # 对拆解的功能刀具进行校验,只有在刀具房的功能刀具才能拆解 + if self.functional_tool_id.tool_room_num == 0: + raise ValidationError('Rfid为【%s】的功能刀具当前位置为【%s】,不能进行拆解!' % ( + self.rfid, self.functional_tool_id.current_location)) location = self.env['stock.location'].search([('name', '=', '刀具组装位置')]) location_dest = self.env['stock.location'].search([('name', '=', '刀具房')]) # =================刀柄是否[报废]拆解======= diff --git a/sf_tool_management/models/functional_tool.py b/sf_tool_management/models/functional_tool.py index 52565174..6f7e14bb 100644 --- a/sf_tool_management/models/functional_tool.py +++ b/sf_tool_management/models/functional_tool.py @@ -25,12 +25,13 @@ class FunctionalCuttingToolEntity(models.Model): sf_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', group_expand='_read_group_mrs_cutting_tool_type_id', compute_sudo=True) - functional_tool_diameter = fields.Float(string='刀具直径(mm)', readonly=True) - knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True) + functional_tool_diameter = fields.Float(string='刀具直径(mm)', readonly=True, digits=(10, 3)) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=True, digits=(10, 3)) coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=True) new_former = fields.Selection([('0', '新'), ('1', '旧')], string='新/旧', readonly=True) - tool_loading_length = fields.Float(string='总长度(mm)', readonly=True) - functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True) + tool_loading_length = fields.Float(string='总长度(mm)', readonly=True, digits=(10, 3)) + handle_length = fields.Float(string='刀柄长度(mm)',readonly=True, digits=(10, 3)) + functional_tool_length = fields.Float(string='伸出长(mm)', readonly=True, digits=(10, 3)) effective_length = fields.Float(string='有效长(mm)', readonly=True) tool_room_num = fields.Integer(string='刀具房数量', readonly=True) line_edge_knife_library_num = fields.Integer(string='线边刀库数量', readonly=True) @@ -51,13 +52,6 @@ class FunctionalCuttingToolEntity(models.Model): safe_inventory_id = fields.Many2one('sf.real.time.distribution.of.functional.tools', string='功能刀具安全库存', readonly=True) - def button_safe_inventory_id(self): - """更新功能刀具关联的安全库存记录""" - tool_is = self.search([]) - for item in tool_is: - item.safe_inventory_id = self.env['sf.real.time.distribution.of.functional.tools'].search( - [('functional_name_id', '=', item.tool_name_id.id)])[0] - @api.depends('barcode_id.quant_ids', 'functional_tool_status') def _compute_current_location_id(self): for record in self: diff --git a/sf_tool_management/models/maintenance_equipment.py b/sf_tool_management/models/maintenance_equipment.py index a4bcf751..5486b2f6 100644 --- a/sf_tool_management/models/maintenance_equipment.py +++ b/sf_tool_management/models/maintenance_equipment.py @@ -61,6 +61,12 @@ class SfMaintenanceEquipment(models.Model): def write_maintenance_equipment_tool(self, datas): if datas: + # 清除设备机床刀位的刀具信息 + for obj in self.product_template_ids: + obj.write({ + 'functional_tool_name_id': False, + 'tool_install_time': None + }) for data in datas: maintenance_equipment_id = self.search([('name', '=', data['DeviceId'])]) if maintenance_equipment_id: diff --git a/sf_tool_management/models/temporary_data_processing_methods.py b/sf_tool_management/models/temporary_data_processing_methods.py new file mode 100644 index 00000000..e63caff7 --- /dev/null +++ b/sf_tool_management/models/temporary_data_processing_methods.py @@ -0,0 +1,38 @@ +from odoo import fields, models, api + + +class FunctionalCuttingToolEntity(models.Model): + _inherit = 'sf.functional.cutting.tool.entity' + + def button_safe_inventory_id(self): + """更新功能刀具关联的安全库存记录""" + tool_is = self.search([]) + for item in tool_is: + item.safe_inventory_id = self.env['sf.real.time.distribution.of.functional.tools'].search( + [('functional_name_id', '=', item.tool_name_id.id)])[0] + + +class FunctionalToolAssembly(models.Model): + _inherit = 'sf.functional.tool.assembly' + + def put_assembly_order_code(self): + assembly_list = self.search([('assemble_status', '=', '0')], order="id asc") + for item in assembly_list: + code = item.assembly_order_code[-9:-5] + if item.loading_task_source == '0': + code = 'C' + code + elif item.loading_task_source == '1': + code = 'J' + code + elif item.loading_task_source == '2': + code = 'K' + code + + functional_tool_assembly = self.env['sf.functional.tool.assembly'].sudo().search( + [('loading_task_source', '=', item.loading_task_source), + ('assembly_order_code', 'ilike', code)], limit=1, order="id desc") + if not functional_tool_assembly: + num = "%04d" % 1 + else: + m = int(functional_tool_assembly.assembly_order_code[-3:]) + 1 + num = "%04d" % m + + item.assembly_order_code = "%s%s" % (code, num) diff --git a/sf_tool_management/views/functional_tool_views.xml b/sf_tool_management/views/functional_tool_views.xml index ac98a703..76607a16 100644 --- a/sf_tool_management/views/functional_tool_views.xml +++ b/sf_tool_management/views/functional_tool_views.xml @@ -46,8 +46,8 @@
-