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` +// +// `; +// // CodeField.template = 'sf_machine_connect.CodeField'; +// CodeField.props = standardFieldProps; +// +// // Add the field to the correct category +// registry.category("fields").add("code", CodeField); /** @odoo-module **/ import { browser } from "@web/core/browser/browser"; @@ -17,6 +99,8 @@ import {registry} from "@web/core/registry"; export class CodeField extends Component { setup() { super.setup(); + this.orm = this.env.services.orm; + this.record = this.props.record; } async onBarcodeBtnClick() { // console.log(BarcodeScanner) @@ -41,26 +125,97 @@ export class CodeField extends Component { } } 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, - }); + alert('我是search') + const domain = [["code", "=", barcode]]; + // const domain = []; + console.log(domain) + alert('走到这里了') + const fields = ["id", "code", "name", "state"]; + console.log(fields) + alert('走到这里了1') + const results = await this.orm.call("sf.tray", "search_read", [domain, fields]); + const values = await this.orm.call("sf.tray", "search_read", [domain]); + console.log(results) + alert('走到这里了2') return results.map((result) => { - const [id, displayName] = result; - return { - id, - name: displayName, - }; - }); + return { + id: result.id, + code: result.code, + name: result.name, + state: result.state, + values: values, + }; + }); } async onBarcodeScanned(barcode) { + // alert('我是ONbarcodeScanned') const results = await this.search(barcode); + console.log(results) const records = results.filter((r) => !!r.id); + console.log(records) if (records.length === 1) { - this.update([{ id: records[0].id, name: records[0].name }]); + if (records[0].state === '空闲') { + // const currentModel = this.env.models['mrp.workorder']; + console.log('currentModel',this) + console.log('this.record.data',this.record.data) + // const recordID = this.controllerParams.recordID; + // console.log('当前页面记录 ID:', recordID); + // console.log('this.record',this.record.id) + // console.log('this.record',this.controllerParams.recordID) + // const workorder = await this.orm.call('mrp.workorder', 'read', [this.record.data.id, ['id']]); + console.log('this.record.data.id', this.record.data.id) + const workorder = await this.orm.call('mrp.workorder', 'read', [this.record.data.id]); + console.log('workorder', workorder[0]) + const updatedRecord = await this.orm.call("sf.tray", "write", [ + [records[0].id], + { + // state: "占用", + workorder_id: workorder[0].id, + production_id: workorder[0].product_id[0], + // workorder_id: workorder.id, + }]); + console.log(workorder[0].routing_type); + console.log(workorder[0].production_id); + // const productionIDS = await this.orm.call('mrp.production', 'search', [[['id', '=', workorder[0].production_id[0]]]]); + const productionIDS = await this.orm.call('mrp.workorder', 'search', [[["production_id", "=", workorder[0].production_id[0]]]]); + console.log('prooooooo', productionIDS); + console.log('values', records[0].values[0]); + productionIDS.forEach(async (data) => { + // 处理每一个数据 + console.log(data); + const updatetrayRecord = await this.orm.call("mrp.workorder", "write", [ + [data], + { + tray_id: records[0].values[0].id, + // tray_id: false, + }]); + console.log(updatetrayRecord) + }); + // this.trigger_up('reload') + // this.props.update(records[0].code, records[0].values); + this.props.update(records[0].code, records[0].tray_id); + // this.trigger_up('button_clicked', { + // attrs: { + // name: 'save', + // }, + // }); + // this.do_action({ + // 'type': 'ir.actions.act_window', + // 'res_model': 'mrp.workorder', + // 'view_mode': 'form', + // 'view_type': 'form', + // 'res_id': workorder[0].id, + // 'target': 'current', + // }) + } else { + if (records[0].state === '占用') { + console.log('此托盘已占用,请检查') + alert('此托盘已占用,请检查') + } else { + console.log('此托盘已损坏,请登记') + } + } + } else { const searchInput = this.autocompleteContainerRef.el.querySelector("input"); searchInput.value = barcode; @@ -73,19 +228,27 @@ export class CodeField extends Component { } CodeField.template = xml` +
`; // CodeField.template = 'sf_machine_connect.CodeField'; CodeField.props = standardFieldProps; // Add the field to the correct category -registry.category("fields").add("code", CodeField); \ No newline at end of file +registry.category("fields").add("code", CodeField); + +// style="position: relative; left: 200px;" \ No newline at end of file diff --git a/sf_machine_connect/views/SfWorkOrderBarcodes.xml b/sf_machine_connect/views/SfWorkOrderBarcodes.xml index 5507f707..fbdbc43c 100644 --- a/sf_machine_connect/views/SfWorkOrderBarcodes.xml +++ b/sf_machine_connect/views/SfWorkOrderBarcodes.xml @@ -3,13 +3,18 @@