From 8fce9290220651eaf98fd98c8b56ab6cb1795761 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Wed, 30 Nov 2022 11:25:37 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BB=8Eftp=E8=8E=B7=E5=8F=96cnc=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_bf_connect/models/http.py | 2 +- sf_manufacturing/models/mrp_workorder.py | 20 ++++++++- sf_mrs_connect/controllers/controllers.py | 8 +++- sf_mrs_connect/models/__init__.py | 1 + sf_mrs_connect/models/ftp_operate.py | 53 +++++++++++++++++++++++ 5 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 sf_mrs_connect/models/ftp_operate.py diff --git a/sf_bf_connect/models/http.py b/sf_bf_connect/models/http.py index 44001357..2396571f 100644 --- a/sf_bf_connect/models/http.py +++ b/sf_bf_connect/models/http.py @@ -27,7 +27,7 @@ class Http(models.AbstractModel): raise AuthenticationError('无效的token') timestamp_str = int(time.time()) # 设置API接口请求时间,不能超过5秒 - deltime = datetime.timedelta(seconds=60) + deltime = datetime.timedelta(seconds=5) if abs(int(datas['HTTP_TIMESTAMP'])-timestamp_str) > deltime.seconds: raise AuthenticationError('请求已过期') # 获得sha1_str加密字符串 diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 8de51b8a..4c2ff966 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1,3 +1,4 @@ +import os import json import requests import logging @@ -5,6 +6,7 @@ from datetime import datetime from dateutil.relativedelta import relativedelta from odoo import api, fields, models, SUPERUSER_ID, _ from odoo.addons.sf_base.commons.common import Common +from odoo.addons.sf_mrs_connect.models.ftp_operate import FtpController class ResMrpWorkOrder(models.Model): @@ -319,7 +321,7 @@ class CNCprocessing(models.Model): workorder = self.env['mrp.workorder'].search([('production_id.name', '=', obj['manufacturing_order_no']), ('processing_panel', '=', obj['processing_panel']), ('routing_type', '=', 'CNC加工')]) - self.env['sf.cnc.processing'].create({ + vals = { 'workorder_id': workorder.id, 'sequence_number': obj['sequence_number'], 'program_name': obj['program_name'], @@ -333,4 +335,20 @@ class CNCprocessing(models.Model): 'cutting_tool_handle_type': obj['cutting_tool_handle_type'], 'remark': obj['remark'] # 'FJGDate': obj[''] + } + return self.env['sf.cnc.processing'].create(vals) + + def attachment_create(self, name, data): + attachment = self.env['ir.attachment'].create({ + 'datas': data, + 'type': 'binary', + 'description': '程序文件', + 'name': name }) + return attachment + + def download_file_tmp(self, model_code, processing_panel): + remotepath = os.path.join('/', model_code, 'return', processing_panel) + serverdir = os.path.join('/tmp', model_code, 'return', processing_panel) + ftp = FtpController() + ftp.download_file_tree(remotepath, serverdir) diff --git a/sf_mrs_connect/controllers/controllers.py b/sf_mrs_connect/controllers/controllers.py index 55bcef40..9e613d7c 100644 --- a/sf_mrs_connect/controllers/controllers.py +++ b/sf_mrs_connect/controllers/controllers.py @@ -8,7 +8,7 @@ from odoo.http import request class Sf_Mrs_Connect(http.Controller): - @http.route('/api/cnc_processing/create', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, + @http.route('/api/cnc_processing/create', type='json', auth='none', methods=['GET', 'POST'], csrf=False, cors="*") def get_cnc_processing_create(self, **kw): """ @@ -22,6 +22,10 @@ class Sf_Mrs_Connect(http.Controller): ret = json.loads(datas) ret = json.loads(ret['result']) for obj in ret: - request.env['sf.cnc.processing'].with_user(request.env.ref("base.user_admin")).CNCprocessing_create(obj) + cnc = request.env['sf.cnc.processing'].with_user(request.env.ref("base.user_admin")).CNCprocessing_create(obj) + # 从ftp拉取对应的文件 + model_code = cnc.workorder_id.product_id.barcode + processing_panel = cnc.workorder_id.processing_panel + cnc.with_user(request.env.ref("base.user_admin")).download_file_tmp(model_code, processing_panel) except Exception as e: logging.info('get_cnc_processing_create error:%s' % e) diff --git a/sf_mrs_connect/models/__init__.py b/sf_mrs_connect/models/__init__.py index 57e1fb8a..0d47aefc 100644 --- a/sf_mrs_connect/models/__init__.py +++ b/sf_mrs_connect/models/__init__.py @@ -1,3 +1,4 @@ +from . import ftp_operate from . import res_config_setting from . import sync_common diff --git a/sf_mrs_connect/models/ftp_operate.py b/sf_mrs_connect/models/ftp_operate.py new file mode 100644 index 00000000..e5a4fb66 --- /dev/null +++ b/sf_mrs_connect/models/ftp_operate.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +import os +import posixpath +from odoo.modules import get_resource_path +from ftplib import FTP +import logging + + +# FTP接口类 +class FtpController(): + ''' + 这是ftp接口类,在类初始化的时候就连接了ftp服务器,能否成功连接有反馈。 + 类中定义了两个接口:上传接口和删除接口 + ''' + + ftp = FTP() + + def __init__(self, host="192.168.50.202", port=21, username="ftpuser", password="123456"): + try: + self.ftp.connect(host, port) + self.ftp.login(username, password) + logging.info("连接: %s" % 111111) + except: + logging.info("连接失败: ") + + # 下载目录下的文件 + def download_file_tree(self, remotepath, serverdir): + if not os.path.exists(serverdir): + os.makedirs(serverdir) + logging.info("remotepath: %s" % remotepath) + self.ftp.cwd(remotepath) + logging.info("serverdir: %s" % serverdir) + remotenames = self.ftp.nlst() + logging.info("remotenames: %s" % remotenames) + for file in remotenames: + server = os.path.join(serverdir, file) + if file.find(".") == -1: + if not os.path.exists(serverdir): + os.makedirs(serverdir) + self.download_file_tree(server, file) + else: + logging.info("server: %s" % server) + self.download_file(server, file) + self.ftp.cwd("..") + return True + + +def download_file(self, serverfile, remotefile): # 下载指定目录下的指定文件 + file_handler = open(serverfile, 'wb') + logging.info("file_handler: %s" % file_handler) + self.ftp.retrbinary('RETR ' + remotefile, file_handler.write) + file_handler.close() + return True From 1bf8e8a268375b806955697471e250618d7d1405 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Wed, 30 Nov 2022 17:19:46 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=86=99=E5=85=A5cnc?= =?UTF-8?q?=E5=85=B3=E8=81=94=E7=9A=84attach=E9=87=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_workorder.py | 16 +++++++++++- sf_mrs_connect/controllers/controllers.py | 6 ++++- sf_mrs_connect/models/ftp_operate.py | 30 +++++++++-------------- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 4c2ff966..9c46fd6e 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -2,6 +2,7 @@ import os import json import requests import logging +import base64 from datetime import datetime from dateutil.relativedelta import relativedelta from odoo import api, fields, models, SUPERUSER_ID, _ @@ -321,6 +322,8 @@ class CNCprocessing(models.Model): workorder = self.env['mrp.workorder'].search([('production_id.name', '=', obj['manufacturing_order_no']), ('processing_panel', '=', obj['processing_panel']), ('routing_type', '=', 'CNC加工')]) + logging.info('workorder:%s' % workorder) + logging.info('production_id.name:%s' % workorder.production_id.name) vals = { 'workorder_id': workorder.id, 'sequence_number': obj['sequence_number'], @@ -340,7 +343,7 @@ class CNCprocessing(models.Model): def attachment_create(self, name, data): attachment = self.env['ir.attachment'].create({ - 'datas': data, + 'datas': base64.b64encode(data), 'type': 'binary', 'description': '程序文件', 'name': name @@ -352,3 +355,14 @@ class CNCprocessing(models.Model): serverdir = os.path.join('/tmp', model_code, 'return', processing_panel) ftp = FtpController() ftp.download_file_tree(remotepath, serverdir) + return serverdir + + def write_file(self, nc_file_path, cnc): + if os.path.exists(nc_file_path): + with open(nc_file_path, 'rb') as file: + data_bytes = file.read() + attachment = self.attachment_create(cnc.program_name + '.NC', data_bytes) + cnc.write({'cnc_id': attachment.id}) + file.close() + else: + return False diff --git a/sf_mrs_connect/controllers/controllers.py b/sf_mrs_connect/controllers/controllers.py index 9e613d7c..d903d58e 100644 --- a/sf_mrs_connect/controllers/controllers.py +++ b/sf_mrs_connect/controllers/controllers.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import json import logging +import os from datetime import date, timedelta from odoo import http from odoo.http import request @@ -23,9 +24,12 @@ class Sf_Mrs_Connect(http.Controller): ret = json.loads(ret['result']) for obj in ret: cnc = request.env['sf.cnc.processing'].with_user(request.env.ref("base.user_admin")).CNCprocessing_create(obj) + logging.info('cnc:%s' % cnc) # 从ftp拉取对应的文件 model_code = cnc.workorder_id.product_id.barcode processing_panel = cnc.workorder_id.processing_panel - cnc.with_user(request.env.ref("base.user_admin")).download_file_tmp(model_code, processing_panel) + server_dir = cnc.with_user(request.env.ref("base.user_admin")).download_file_tmp(model_code, processing_panel) + cnc_file_path = os.path.join(server_dir, cnc.program_name + '.NC') + cnc.with_user(request.env.ref("base.user_admin")).write_file(cnc_file_path, cnc) except Exception as e: logging.info('get_cnc_processing_create error:%s' % e) diff --git a/sf_mrs_connect/models/ftp_operate.py b/sf_mrs_connect/models/ftp_operate.py index e5a4fb66..1e79db0d 100644 --- a/sf_mrs_connect/models/ftp_operate.py +++ b/sf_mrs_connect/models/ftp_operate.py @@ -27,27 +27,19 @@ class FtpController(): def download_file_tree(self, remotepath, serverdir): if not os.path.exists(serverdir): os.makedirs(serverdir) - logging.info("remotepath: %s" % remotepath) - self.ftp.cwd(remotepath) - logging.info("serverdir: %s" % serverdir) - remotenames = self.ftp.nlst() - logging.info("remotenames: %s" % remotenames) - for file in remotenames: - server = os.path.join(serverdir, file) - if file.find(".") == -1: - if not os.path.exists(serverdir): - os.makedirs(serverdir) - self.download_file_tree(server, file) - else: - logging.info("server: %s" % server) - self.download_file(server, file) - self.ftp.cwd("..") - return True + self.ftp.cwd(remotepath) + remotenames = self.ftp.nlst() + for file in remotenames: + server = os.path.join(serverdir, file) + if file.find(".") != -1: + self.download_file(server, file) + else: + return False -def download_file(self, serverfile, remotefile): # 下载指定目录下的指定文件 +# 下载指定目录下的指定文件 +def download_file(self, serverfile, remotefile): file_handler = open(serverfile, 'wb') - logging.info("file_handler: %s" % file_handler) self.ftp.retrbinary('RETR ' + remotefile, file_handler.write) file_handler.close() - return True +