From 6b2608e41952add688bbac34201e7358b68d3a2a Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Fri, 23 Feb 2024 17:24:46 +0800 Subject: [PATCH 1/5] =?UTF-8?q?ftp=E6=B7=BB=E5=8A=A0=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_mrs_connect/models/ftp_operate.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sf_mrs_connect/models/ftp_operate.py b/sf_mrs_connect/models/ftp_operate.py index eaf214de..1d97e56f 100644 --- a/sf_mrs_connect/models/ftp_operate.py +++ b/sf_mrs_connect/models/ftp_operate.py @@ -48,10 +48,12 @@ class FtpController(): logging.info('serverdir:%s' % serverdir) logging.info('reportpath:%s' % reportpath) target_dir1 = target_dir.split('/') - logging.info('target_dir1:%s' % target_dir1[0]) - self.ftp.cwd(target_dir1) # 切换工作路径 - logging.info('FTP目录111111:%s' % target_dir) + logging.info('target_dir1:%s' % target_dir1[1]) + target_dir = os.path.join('/', target_dir1[1]) + logging.info('target_dir:%s' % target_dir) self.ftp.cwd(target_dir) # 切换工作路径 + logging.info('FTP目录111111:%s' % target_dir[2]) + self.ftp.cwd(target_dir[2]) # 切换工作路径 logging.info('FTP目录:%s' % target_dir) remotenames = self.ftp.nlst() logging.info('FTP目录检测报告文件:%s' % remotenames) From 4fcbf57e9726402795a2913f4c18c137772f323b Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Fri, 23 Feb 2024 17:24:58 +0800 Subject: [PATCH 2/5] Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into develop --- sf_warehouse/models/model.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/sf_warehouse/models/model.py b/sf_warehouse/models/model.py index 74e1ad4e..4b53ea75 100644 --- a/sf_warehouse/models/model.py +++ b/sf_warehouse/models/model.py @@ -73,7 +73,6 @@ class SfLocation(models.Model): ], string='货位状态', default='空闲') # product_id = fields.Many2one('product.template', string='产品') product_id = fields.Many2one('product.product', string='产品', compute='_compute_product_id', readonly=True) - # product_id = fields.Many2one('product.product', string='产品', readonly=True) product_sn_id = fields.Many2one('stock.lot', string='产品序列号') # time_test = fields.Char(string='time') # 添加SQL约束 @@ -364,7 +363,7 @@ class ShelfLocation(models.Model): ('禁用', '禁用') ], string='货位状态', default='空闲', readonly=True) # product_id = fields.Many2one('product.template', string='产品') - product_id = fields.Many2one('product.product', string='产品', compute='_compute_product_id', readonly=True) + product_id = fields.Many2one('product.product', string='产品', readonly=True) product_sn_id = fields.Many2one('stock.lot', string='产品序列号') # 修改货位状态为禁用 @@ -386,13 +385,11 @@ class ShelfLocation(models.Model): record.sudo().location_status = '占用' else: - if record.production_id: - record.location_status = '占用' - else: - record.product_id = False - # record.location_status = '空闲' + record.product_id = False + # record.location_status = '空闲' - # 调取获取货位信息接口 + + #调取获取货位信息接口 def get_sf_shelf_location_info(self): # sf_sync_config = self.env['res.config.settings'].get_values() # token = sf_sync_config['token'] From db48ef396e4f58b39a013271e5b011552fa1adb3 Mon Sep 17 00:00:00 2001 From: yuxianghui <3437689193@qq.com> Date: Fri, 23 Feb 2024 17:29:04 +0800 Subject: [PATCH 3/5] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E4=B8=AD?= =?UTF-8?q?=E6=8E=A7=E6=8E=A5=E5=8F=A314-16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_quality/models/quality.py | 38 ++++++------ sf_tool_management/controllers/controllers.py | 48 --------------- sf_tool_management/models/base.py | 14 ++++- .../models/maintenance_equipment.py | 58 +++++++++++++++---- sf_tool_management/models/mrp_workorder.py | 24 ++++---- .../views/sf_maintenance_equipment.xml | 2 +- sf_tool_management/views/tool_base_views.xml | 6 +- sf_warehouse/models/model.py | 4 +- 8 files changed, 98 insertions(+), 96 deletions(-) diff --git a/sf_quality/models/quality.py b/sf_quality/models/quality.py index 748d8bca..ee289415 100644 --- a/sf_quality/models/quality.py +++ b/sf_quality/models/quality.py @@ -1,34 +1,36 @@ import json import requests +import logging from odoo import fields, models, api from odoo.exceptions import ValidationError +from datetime import datetime from odoo.addons.sf_base.commons.common import Common class QualityCheck(models.Model): _inherit = "quality.check" - _description = '零件特采' # ==========零件特采接口========== - def _register_tool_groups(self): - create_url = '/AutoDeviceApi/PartSpecProc' - 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'] + create_url - val = { - 'RfidCode': None, - } - kw = json.dumps(val, ensure_ascii=False) - r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers) + def _register_quality_check(self): + # create_url = '/AutoDeviceApi/PartSpecProc' + # 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) + headers = {'Authorization': 'Ba F2CF5DCC-1A00-4234-9E95-65603F70CC8A'} + crea_url = "https://x24467i973.zicp.fun/AutoDeviceApi/PartSpecProc" + val = ['0037835872'] + r = requests.post(crea_url, json=val, headers=headers) ret = r.json() - if r == 200: + logging.info('_register_quality_check:%s' % ret) + if ret['Succeed']: return "零件特采发送成功" else: raise ValidationError("零件特采发送失败") - # @api.onchange('quality_state') - # def _onchange_quality_state(self): - # if self.quality_state in ['pass', 'fail']: - # self._register_tool_groups() + def do_fail(self): + self.write({ + 'quality_state': 'fail', + 'user_id': self.env.user.id, + 'control_date': datetime.now()}) + self._register_quality_check() diff --git a/sf_tool_management/controllers/controllers.py b/sf_tool_management/controllers/controllers.py index 84ef7664..0b003dc6 100644 --- a/sf_tool_management/controllers/controllers.py +++ b/sf_tool_management/controllers/controllers.py @@ -8,54 +8,6 @@ from odoo.http import request class Manufacturing_Connect(http.Controller): - # @http.route('/AutoDeviceApi/GetToolInfo', type='json', auth='none', methods=['GET', 'POST'], csrf=False, - # cors="*") - # def get_equipment_tool_Info(self, **kw): - # """ - # 机床刀库实时信息 - # :param kw: - # :return: - # """ - # logging.info('get_equipment_tool_Info:%s' % kw) - # try: - # datas = request.httprequest.data - # ret = json.loads(datas) - # ret = json.loads(ret.get('result')) - # logging.info('DeviceId:%s' % ret) - # equipment = request.env['maintenance.equipment'].sudo().search([('name', '=', ret['DeviceId'])]) - # - # res = {'Succeed': True, 'Datas': []} - # if equipment: - # for item in equipment: - # data = [] - # for equipment_tool_id in item.product_template_ids: - # functional_tool_id = self.env['sf.functional.cutting.tool.entity'].sudo().search( - # [('code', '=', equipment_tool_id.tool_code)]) - # - # alarm_time = None - # if functional_tool_id.functional_tool_status == '报警': - # alarm_time = self.env['sf.functional.tool.warning'].sudo().search( - # [('code', '=', equipment_tool_id.tool_code)]).alarm_time - # equipment_tool = { - # 'RfidCode': None, - # 'ToolId': equipment_tool_id.code, - # 'ToolName': equipment_tool_id.functional_tool_name_id.name, - # 'MaxLife': equipment_tool_id.life_value_max, - # 'UseLife': equipment_tool_id.used_value, - # 'AddDatetime': equipment_tool_id.tool_install_time, - # 'State': functional_tool_id.functional_tool_status, - # 'WarnDate': alarm_time if alarm_time else False - # } - # data.append(equipment_tool) - # res['Datas'].append({ - # 'DeviceId': item.name, - # 'Data': data - # }) - # except Exception as e: - # res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} - # logging.info('get_equipment_tool_Info error:%s' % e) - # return json.JSONEncoder().encode(res) - @http.route('/AutoDeviceApi/ToolGroup', type='json', auth='none', methods=['GET', 'POST'], csrf=False, cors="*") def get_functional_tool_groups_Info(self, **kw): diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index a4e374c6..8fad0b08 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -692,6 +692,15 @@ class CAMWorkOrderProgramKnifePlan(models.Model): names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID) return categories.browse(names) + @api.onchange('plan_execute_status') + def _onchange_plan_execute_status(self): + for record in self: + if record.plan_execute_status == '已完成': + self.env['sf.cnc.processing'].register_cnc_processing(record) + + def knife_plan_cnc_processing(self): + self.env['sf.cnc.processing'].register_cnc_processing(self) + def apply_for_tooling(self): """ 申请装刀 @@ -757,13 +766,12 @@ class CAMWorkOrderProgramKnifePlan(models.Model): if functional_tools: for functional_tool in functional_tools: if functional_tool.on_tool_stock_num == 0: - # self.env['sf.cnc.processing'].register_cnc_processing(cnc_processing) if functional_tool.tool_stock_num == 0 and functional_tool.side_shelf_num == 0: status = True else: status = True if status: - self.env['sf.cam.work.order.program.knife.plan'].sudo().create({ + knife_plan = self.env['sf.cam.work.order.program.knife.plan'].sudo().create({ 'name': cnc_processing.workorder_id.production_id.name, 'cam_procedure_code': cnc_processing.program_name, 'filename': cnc_processing.cnc_id.name, @@ -778,6 +786,8 @@ class CAMWorkOrderProgramKnifePlan(models.Model): 'shank_model': cnc_processing.cutting_tool_handle_type, 'estimated_processing_time': cnc_processing.estimated_processing_time, }) + # 创建装刀请求 + knife_plan.apply_for_tooling() class FunctionalToolAssembly(models.Model): diff --git a/sf_tool_management/models/maintenance_equipment.py b/sf_tool_management/models/maintenance_equipment.py index 3c1eec9e..9f3cefba 100644 --- a/sf_tool_management/models/maintenance_equipment.py +++ b/sf_tool_management/models/maintenance_equipment.py @@ -1,5 +1,6 @@ import json import requests +import logging from odoo import models, api, fields from odoo.exceptions import ValidationError from odoo.addons.sf_base.commons.common import Common @@ -21,6 +22,10 @@ class SfMaintenanceEquipmentTool(models.Model): used_value = fields.Integer('已使用值(min)', related='functional_tool_name_id.used_value') tool_install_time = fields.Datetime('机内装刀时间') + # def write_tool(self, datas): + # if datas: + # print(datas) + @api.model_create_multi def create(self, vals_list): tools = super().create(vals_list) @@ -38,23 +43,52 @@ class SfMaintenanceEquipment(models.Model): # ==========机床当前刀库实时信息接口========== def register_equipment_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 = "https://x24467i973.zicp.fun/AutoDeviceApi/GetToolInfos" - val = { - "DeviceId": self.name - } - kw = json.dumps(val, ensure_ascii=False) - r = requests.get(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers) + # 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) + headers = {'Authorization': 'Ba F2CF5DCC-1A00-4234-9E95-65603F70CC8A'} + crea_url = "https://x24467i973.zicp.fun/AutoDeviceApi/GetToolInfos" + params = {"DeviceId": self.name} + r = requests.get(crea_url, params=params, headers=headers) ret = r.json() - print(ret) - if r == 200: + logging.info('register_equipment_tool:%s' % ret) + datas = ret['Datas'] + self.write_maintenance_equipment_tool(datas) + if ret['Succeed']: return "机床当前刀库实时信息指令发送成功" else: raise ValidationError("机床当前刀库实时信息指令发送失败") + def write_maintenance_equipment_tool(self, datas): + if datas: + for data in datas: + maintenance_equipment_id = self.search([('name', '=', data['DeviceId'])]) + if maintenance_equipment_id: + equipment_tool_id = self.env['maintenance.equipment.tool'].sudo().search( + [('equipment_id', '=', maintenance_equipment_id.id), ('code', '=', data['ToolId'])]) + functional_tool_id = self.env['sf.functional.cutting.tool.entity'].sudo().search( + [('rfid', '=', data['RfidCode'])]) + time = None + if data['AddDatetime']: + datatime = str(data['AddDatetime']) + time = fields.Datetime.from_string(datatime[0:10] + ' ' + datatime[11:19]) + if equipment_tool_id and functional_tool_id: + tool_install_time = {'Nomal': '正常', 'Warning': '报警'} + equipment_tool_id.write({ + 'functional_tool_name_id': functional_tool_id.id, + 'tool_install_time': time + }) + functional_tool_id.write({ + 'max_lifetime_value': data['MaxLife'], + 'used_value': data['UseLife'], + 'functional_tool_status': tool_install_time.get(data['State']) + }) + else: + raise ValidationError('获取的【%s】设备不存在!!!' % data['DeviceId']) + else: + raise ValidationError('没有获取到刀具库信息!!!') + class StockLot(models.Model): _inherit = 'stock.lot' diff --git a/sf_tool_management/models/mrp_workorder.py b/sf_tool_management/models/mrp_workorder.py index 9bb638e7..df9a341e 100644 --- a/sf_tool_management/models/mrp_workorder.py +++ b/sf_tool_management/models/mrp_workorder.py @@ -1,5 +1,6 @@ import json import requests +import logging from odoo import fields, models, api from odoo.exceptions import ValidationError from odoo.addons.sf_base.commons.common import Common @@ -10,21 +11,22 @@ class CNCprocessing(models.Model): _description = 'CNC加工用刀检测' # ==========MES装刀指令接口========== - def register_cnc_processing(self, cnc_processing): - 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) + def register_cnc_processing(self, knife_plan): + # 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) + headers = {'Authorization': 'Ba F2CF5DCC-1A00-4234-9E95-65603F70CC8A'} strurl = "https://x24467i973.zicp.fun/AutoDeviceApi/ToolLoadInstruct" val = { - 'DeviceId': cnc_processing.workorder_id.machine_tool_name, - 'RfidCode': None, - 'ToolId': cnc_processing.cutting_tool_no + 'DeviceId': knife_plan.machine_table_name, + 'RfidCode': knife_plan.sf_functional_tool_assembly_id.rfid, + 'ToolId': int(knife_plan.cutter_spacing_code_id.code[1:]) } - kw = json.dumps(val, ensure_ascii=False) - r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers) + r = requests.post(strurl, json=val, headers=headers) ret = r.json() - if r == 200: + logging.info('register_cnc_processing:%s' % ret) + if ret['Succeed']: return "MES装刀指令发送成功" else: raise ValidationError("MES装刀指令发送失败") diff --git a/sf_tool_management/views/sf_maintenance_equipment.xml b/sf_tool_management/views/sf_maintenance_equipment.xml index dbdafe1e..39a7d2c8 100644 --- a/sf_tool_management/views/sf_maintenance_equipment.xml +++ b/sf_tool_management/views/sf_maintenance_equipment.xml @@ -12,7 +12,7 @@