diff --git a/sf_bf_connect/models/jd_eclp.py b/sf_bf_connect/models/jd_eclp.py index 5a7579af..030d3da2 100644 --- a/sf_bf_connect/models/jd_eclp.py +++ b/sf_bf_connect/models/jd_eclp.py @@ -52,31 +52,31 @@ class JdEclp(models.Model): sale_order_id = self.env['sale.order'].search([('name', '=', self.origin)]) # stock_picking_type_id = self.enc['stock.picking.type'].search([('picking_type_id', '=', '')]) # if sale_order_id.address_of_delivery != False: - - - - if 'OUT' in self.name: - raw_addres = sale_order_id.address_of_delivery.split('这是一个标志位,用来不分隔字符串') - # _logger.info('=================dddd====', sale_order_id.address_of_delivery) - # _logger.info('=================dddd====', type(sale_order_id.address_of_delivery)) - # _logger.info('========================================', raw_addres) - # _logger.info('=================dddd====', self.display_name) - # _logger.info('=================dddd====', type(self.display_name)) - # # _logger.info(self.receiverName, self.receiverMobile) - # _logger.info(1111111111111111111111111111111111111111111111) - self.receiverName = sale_order_id.person_of_delivery - self.receiverMobile = sale_order_id.telephone_of_delivery - self.receiverProvinceName = cpca.transform(raw_addres).values.tolist()[0][0] - self.receiverCityName = cpca.transform(raw_addres).values.tolist()[0][1] - self.receiverCountyName = cpca.transform(raw_addres).values.tolist()[0][2] - self.receiverTownName = cpca.transform(raw_addres).values.tolist()[0][3] - else: - self.receiverName = self.receiverName - self.receiverMobile = self.receiverMobile - self.receiverProvinceName = self.receiverProvinceName - self.receiverCityName = self.receiverCityName - self.receiverCountyName = self.receiverCountyName - self.receiverTownName = self.receiverTownName + try: + if 'OUT' in self.name: + raw_addres = sale_order_id.address_of_delivery.split('这是一个标志位,用来不分隔字符串') + # _logger.info('=================dddd====', sale_order_id.address_of_delivery) + # _logger.info('========================================', raw_addres) + # _logger.info('=================dddd====', self.display_name) + # _logger.info('=================dddd====', type(self.display_name)) + # # _logger.info(self.receiverName, self.receiverMobile) + # _logger.info(1111111111111111111111111111111111111111111111) + self.receiverName = sale_order_id.person_of_delivery + self.receiverMobile = sale_order_id.telephone_of_delivery + self.receiverProvinceName = cpca.transform(raw_addres).values.tolist()[0][0] + self.receiverCityName = cpca.transform(raw_addres).values.tolist()[0][1] + self.receiverCountyName = cpca.transform(raw_addres).values.tolist()[0][2] + self.receiverTownName = cpca.transform(raw_addres).values.tolist()[0][3] + else: + self.receiverName = self.receiverName + self.receiverMobile = self.receiverMobile + self.receiverProvinceName = self.receiverProvinceName + self.receiverCityName = self.receiverCityName + self.receiverCountyName = self.receiverCountyName + self.receiverTownName = self.receiverTownName + except Exception as e: + print(f"Error address is none: {e}") + pass diff --git a/sf_machine_connect/__init__.py b/sf_machine_connect/__init__.py index c536983e..9b429614 100644 --- a/sf_machine_connect/__init__.py +++ b/sf_machine_connect/__init__.py @@ -1,2 +1,2 @@ from . import models -from . import wizard \ No newline at end of file +from . import wizard diff --git a/sf_machine_connect/models/ftp_client.py b/sf_machine_connect/models/ftp_client.py index 9b5dda7a..9236f86e 100644 --- a/sf_machine_connect/models/ftp_client.py +++ b/sf_machine_connect/models/ftp_client.py @@ -7,7 +7,7 @@ import hashlib import time import requests from datetime import datetime - +from odoo.http import request from odoo import fields, models, api, _ from odoo.exceptions import ValidationError from odoo.exceptions import UserError @@ -138,16 +138,49 @@ class Machine_ftp(models.Model): machine_ip = fields.Char('机床IP') machine_signed = fields.Char('机床刷新间隔') machine_status = fields.Char('机床在线状态') - machine_time_on = fields.Char('机床总在线时长') - machine_tool_num = fields.Char('机床当前刀具') - machine_program = fields.Char('机床当前程序') + machine_cnc_type = fields.Char('机床CNC型号') + machine_axis_count = fields.Char('机床轴总数') machine_run_status = fields.Char('机床运行状态') - machine_run_time = fields.Char('机床总运行时长') - machine_cut_time = fields.Char('机床总切削时长') - machine_cut_status = fields.Char('机床切削状态') machine_emg_status = fields.Char('机床急停状态') - machine_mode = fields.Char('机床操作模式') - machine_spindle_speed = fields.Char('机床主轴转速') + machine_cut_status = fields.Char('机床当前切削状态') + machine_mode = fields.Char('机床当前操作模式') + machine_spindle_load = fields.Char('机床主轴负载') + machine_x_mach = fields.Char('机床X轴机械坐标') + machine_x_abs_mach = fields.Char('机床X轴当前位置') + machine_x_rel_mach = fields.Char('机床X轴相对工件坐标') + machine_x_dis_mach = fields.Char('机床X轴目标距离') + machine_x_axis_load = fields.Char('机床X轴伺服轴负载') + machine_y_mach = fields.Char('机床Y轴机械坐标') + machine_y_abs_mach = fields.Char('机床Y轴当前位置') + machine_y_rel_mach = fields.Char('机床Y轴相对工件坐标') + machine_y_dis_mach = fields.Char('机床Y轴目标距离') + machine_y_axis_load = fields.Char('机床Y轴伺服轴负载') + machine_z_mach = fields.Char('机床Z轴机械坐标') + machine_z_abs_mach = fields.Char('机床Z轴当前位置') + machine_z_rel_mach = fields.Char('机床Z轴相对工件坐标') + machine_z_dis_mach = fields.Char('机床Z轴目标距离') + machine_z_axis_load = fields.Char('机床Z轴伺服轴负载') + machine_tool_num = fields.Char('机床当前刀位号') + machine_program = fields.Char('机床主程序名称') + machine_current_prg = fields.Char('机床当前执行指令') + machine_prg_seq = fields.Char('机床当前执行语句号') + machine_spindle_speed_set = fields.Char('机床设定主轴速度') + machine_act_spindle_speed = fields.Char('机床实际主轴转速') + machine_feed_speed_set = fields.Char('机床设定进给速度') + machine_act_feed_speed = fields.Char('机床实际进给速度') + machine_spindle_feed = fields.Char('机床主轴倍率') + machine_feed_rate = fields.Char('机床进给倍率') + machine_rapid_feed = fields.Char('机床快速移动倍率') + machine_run_time = fields.Char('机床运行时间') + machine_cut_time = fields.Char('机床切削时间') + machine_keep_alive_time = fields.Char('机床上电时间') + machine_circle_time = fields.Char('机床循环时间') + machine_product_counts = fields.Char('机床加工件数') + machine_system_date = fields.Char('机床系统日期') + machine_system_time = fields.Char('机床系统时间') + machine_alarm_msg = fields.Char('机床系统报警') + + # 刀位配置 tool_num1 = fields.Char('刀位1') tool_num2 = fields.Char('刀位2') @@ -222,6 +255,7 @@ class WorkCenterBarcode(models.Model): """ _inherit = "mrp.workorder" + # barcode = fields.Binary(string='条码', default='UP-ALL') compensation_value_x = fields.Float(string='X轴补偿值') compensation_value_y = fields.Float(string='Y轴补偿值') button_compensation_state = fields.Boolean(string='是否已经补偿', readonly=True) @@ -343,6 +377,95 @@ class WorkCenterBarcode(models.Model): _logger.info("=====================================", e) raise UserError('NC下发执行超时, 请检查下发状态') + def up_merge_all(self): + """ + 此函数用于将NC代码一键合并下发到机床 + :return: + """ + # 一键合并下发前删除机床上的全部程序 + try: + filepath = '/nc2machine' + del_list = os.listdir(filepath) + _logger.info("=====================================%s" % del_list) + for f in del_list: + file_path = os.path.join(filepath, f) + if os.path.isfile(file_path): + os.remove(file_path) + except Exception as e: + _logger.info("=====================================", e) + raise UserError('程序删除失败,请重试') + # host="192.168.2.158", port=8080, username="MITSUBISHI", password="CNC" + try: + self.compensation() + except Exception: + raise UserError("补偿值写入执行超时,请检查机床状态或者写入状态") + sequence_collect = [] + host = self.workcenter_id.machine_tool_id.ftp_host + port = self.workcenter_id.machine_tool_id.ftp_port + username = self.workcenter_id.machine_tool_id.ftp_num + pwd = self.workcenter_id.machine_tool_id.ftp_pwd + remote_path = self.workcenter_id.machine_tool_id.ftp_remote_path + _logger.info("=====================1666666661111================%s,%s,%s,%s" % (host, port, username, pwd)) + ftp = ftp_operate.FtpController(host, port, username, pwd) + _logger.info("=====================1777777777111================") + file_path_local = '' + file_path_remote = '' + + try: + # 给文件名 + _logger.info('启动') + begin_name1 = self.cnc_ids[0].cnc_id.display_name.split('-') + _logger.info(begin_name1) + temp_name1 = begin_name1[-1].split('.') + final_name = '%s-ALL-MERGE.%s' % (begin_name1[0], temp_name1[-1]) + _logger.info(final_name) + for item in self.cnc_ids: + a = item.cnc_id + sequence_collect.append(item.sequence_number) + datas = base64.standard_b64decode(a.datas) + # file_path = '{}\{}\{}'.format(a._filestore(), a.store_fname.split('/'[0]), a.display_name) + file_path_local = '{}/{}'.format('/nc2machine', final_name) + # 本地测试一键下发 + # file_path_local = '{}/{}'.format('D:\\jikimo', a.display_name) + # file_path_remote = '{}\{}'.format('//M80(192,168,2,142)//DS', a.display_name) + file_path_remote = '{}\{}'.format(remote_path, final_name) + # 合并文件 + with open(file_path_local, mode='ab+') as file: + file.write(datas) + item.button_state = True + _logger.info('========一键下发前合并成功===============') + + # 去除合并文件中间部分的头尾 + with open(file_path_local, mode='rb+') as f: + # _logger.info(f.read()) + # content = f.read() + # _logger.info(content) + new_content = f.read().replace(b'\r\nM30\r\n%\r\n%\r\n', b'\r\n') + # _logger.info(new_content) + f.seek(0) + f.truncate() + f.write(new_content) + _logger.info('========二次合并成功===============') + + # 存在本地的文件下发到机床 + ftp.upload_file(remotepath=file_path_remote, localpath=file_path_local) + _logger.info("======%s一键合并下发成功======" % a.display_name) + ftp.close_ftp() + # 增加一键合并下发记录 + up_time = str(datetime.now()) + sequence_str = ','.join(sequence_collect) + self.delivery_records.create({ + 'delivery_type': '一键合并下发', + 'delivery_time': up_time, + 'influence_record': sequence_str, + }) + _logger.info("=====================22================") + except Exception as e: + for item in self.cnc_ids: + item.button_state = False + _logger.info("=====================================", e) + raise UserError('NC下发执行超时, 请检查下发状态') + def get__state(self): pay_time = str(datetime.now()) json = { @@ -359,6 +482,59 @@ class WorkCenterBarcode(models.Model): url = 'https://bfm.cs.jikimo.com/api/get/state' requests.post(url, json=json, data=None) + def action_test(self, barcode=12345): + + workorder_obj = self.env['mrp.workorder'].sudo().search([('tray_code', '=', barcode)]) + action = { + 'name': '工单', + # 'name': name, + 'type': 'ir.actions.act_window', + # 'view_type': 'form', + 'view_mode': 'form', + 'res_model': 'mrp.workorder', + 'view_id': self.env.ref('mrp.mrp_production_workorder_form_view_inherit').id, + 'res_id': 1023, + 'target': 'current', + 'context': {'id': workorder_obj.id}, + # 'flags': {'initial_mode': 'edit'}, + } + return action + # result = request.env['ir.actions.act_window'].sudo().create(action).read()[0] + # action = {'action': action} + # return result + + @api.model + def get_product_id_by_barcode(self, barcode, **kwargs): + print(kwargs) + print(barcode) + print('111111111111111111111') + workorder_obj_target = self.env['mrp.workorder'].sudo().search([('tray_code', '=', barcode)]) + workorder_obj_current = self.env['mrp.workorder'].sudo().search([('id', '=', kwargs['current_id'])]) + # workorder_cnc = self.env['mrp.workorder'].sudo().search(['&', ('production_id', '=', workorder_obj.production_id.id), ('name', '=', 'CNC加工')]) + workorder_cnc = self.env['mrp.workorder'].sudo().search(['&', ('production_id', '=', workorder_obj_target.production_id.id), ('name', '=', workorder_obj_current.name)]) + print('222222222222222222222222') + if workorder_obj_target: + print(workorder_obj_target) + print(workorder_obj_target.id) + action = { + 'name': '工单', + 'type': 'ir.actions.act_window', + # 'view_type': 'form', + 'views': [[False, 'form']], + 'view_mode': 'form', + 'res_model': 'mrp.workorder', + 'view_id': request.env.ref('mrp.mrp_production_workorder_form_view_inherit').id, + 'res_id': workorder_cnc.id, + 'target': 'current', + 'context': {'id': workorder_obj_target.id}, + # 'flags': {'initial_mode': 'edit'}, + } + action = {'result': action, 'error': '返回错误'} + action1 = json.dumps(action) + return action1 + else: + return False + class CuttingTimeToolType(models.Model): _inherit = 'sf.cutting_tool.type' @@ -381,6 +557,7 @@ class DeliveryRecord(models.Model): 扫码托盘码可查到制造订单,由制造订单查工单 """ _name = "delivery.record" + _description = "Delivery Record" delivery_type = fields.Char(string='下发方式', readonly=True) delivery_time = fields.Char(string='下发时间', readonly=True) diff --git a/sf_machine_connect/models/ftp_operate.py b/sf_machine_connect/models/ftp_operate.py index dd75ee09..277851ff 100644 --- a/sf_machine_connect/models/ftp_operate.py +++ b/sf_machine_connect/models/ftp_operate.py @@ -49,7 +49,7 @@ class FtpController: self.port = port self.username = username self.password = password - _logger.info("===================ftppppp==================%s,%s,%s,%s" % self.host, self.port, self.username, self.password) + # _logger.info("===================ftppppp==================%s,%s,%s,%s" % self.host, self.port, self.username, self.password) # 测试 print("==============================================") print(self.username, self.port, self.host, self.password) diff --git a/sf_machine_connect/security/ir.model.access.csv b/sf_machine_connect/security/ir.model.access.csv index cfd49500..abbfb2de 100644 --- a/sf_machine_connect/security/ir.model.access.csv +++ b/sf_machine_connect/security/ir.model.access.csv @@ -1,5 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink - access_up_select_wizard,up.select.wizard,model_up_select_wizard,base.group_user,1,1,1,1 access_delivery_record,delivery.record,model_delivery_record,base.group_user,1,1,1,1 -access_mrp_workorder,mrp.workorder,model_mrp_workorder,base.group_user,1,1,1,1 diff --git a/sf_machine_connect/static/src/js/test.js b/sf_machine_connect/static/src/js/test.js index 14c95939..1e160c60 100644 --- a/sf_machine_connect/static/src/js/test.js +++ b/sf_machine_connect/static/src/js/test.js @@ -1,3 +1,85 @@ +// /** @odoo-module **/ +// +// import { browser } from "@web/core/browser/browser"; +// import { Dialog } from "@web/core/dialog/dialog"; +// import { _lt } from "@web/core/l10n/translation"; +// import { useChildRef, useOwnedDialogs, useService } from "@web/core/utils/hooks"; +// import { sprintf } from "@web/core/utils/strings"; +// import { isMobileOS } from "@web/core/browser/feature_detection"; +// import * as BarcodeScanner from "@web/webclient/barcode/barcode_scanner"; +// +// const {xml, Component} = owl; +// import { standardFieldProps } from "@web/views/fields/standard_field_props"; +// // Import the registry +// import {registry} from "@web/core/registry"; +// +// +// export class CodeField extends Component { +// setup() { +// super.setup(); +// } +// async onBarcodeBtnClick() { +// const barcode = await BarcodeScanner.scanBarcode(); +// if (barcode) { +// await this.onBarcodeScanned(barcode); +// if ("vibrate" in browser.navigator) { +// browser.navigator.vibrate(100); +// } +// } else { +// this.notification.add(this.env._t("Please, scan again !"), { +// type: "warning", +// }); +// } +// } +// async search(barcode) { +// const results = await this.orm.call("sf.tray", "name_search", [code], { +// name: barcode, +// args: this.getDomain(), +// operator: "ilike", +// limit: 2, // If one result we set directly and if more than one we use normal flow so no need to search more +// context: this.context, +// }); +// return results.map((result) => { +// const [id, displayName] = result; +// return { +// id, +// name: displayName, +// }; +// }); +// } +// async onBarcodeScanned(barcode) { +// const results = await this.search(barcode); +// const records = results.filter((r) => !!r.id); +// if (records.length === 1) { +// this.update([{ id: records[0].id, name: records[0].name }]); +// } else { +// const searchInput = this.autocompleteContainerRef.el.querySelector("input"); +// searchInput.value = barcode; +// searchInput.dispatchEvent(new Event("input")); +// if (this.env.isSmall) { +// searchInput.click(); +// } +// } +// } +// } +// +// CodeField.template = xml` +//