From 4f0c7ad274fc76b207343a7a8d4e52d1805f185b Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Tue, 16 Jan 2024 17:25:25 +0800 Subject: [PATCH 1/4] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E6=9C=BA=E5=8F=B0?= =?UTF-8?q?=E6=97=A5=E8=AE=A1=E5=88=92=E6=8E=A5=E5=8F=A3=202.=E6=96=B0?= =?UTF-8?q?=E5=B7=A5=E4=BB=B6=E9=A2=84=E8=B0=83(=E5=89=8D=E7=BD=AE?= =?UTF-8?q?=E4=B8=89=E5=85=83=E6=A3=80=E6=B5=8B)=E6=8E=A5=E5=8F=A3=203.,?= =?UTF-8?q?=E6=96=B0NC=E7=A8=8B=E5=BA=8F=E4=B8=8B=E8=BD=BD=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_base/commons/common.py | 10 ++ sf_manufacturing/controllers/controllers.py | 107 +++++++++++++++++++- 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/sf_base/commons/common.py b/sf_base/commons/common.py index 05a2143f..6bf597cc 100644 --- a/sf_base/commons/common.py +++ b/sf_base/commons/common.py @@ -19,3 +19,13 @@ class Common(models.Model): 'TIMESTAMP': str(timestamp), 'checkstr': check_sf_str} return headers + + def get_add_time(self, parse_time): + """ + 把时间增加8小时 + :return: + """ + dt = datetime.datetime.strptime(parse_time, "%Y-%m-%d %H:%M:%S") + d = dt + datetime.timedelta(hours=8) + nTime = d.strftime("%Y-%m-%d %H:%M:%S") + return nTime diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py index c4fd6b87..b00c1324 100644 --- a/sf_manufacturing/controllers/controllers.py +++ b/sf_manufacturing/controllers/controllers.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- import logging import json -import base64 from odoo import http from odoo.http import request @@ -40,3 +39,109 @@ class Manufacturing_Connect(http.Controller): res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} logging.info('get_Work_Info error:%s' % e) return json.JSONEncoder().encode(res) + + @http.route('/AutoDeviceApi/GetShiftPlan', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, + cors="*") + def get_ShiftPlan(self, **kw): + """ + 自动化每天获取机台日计划 + :param kw: + :return: + """ + logging.info('get_ShiftPlan:%s' % kw) + try: + res = {'Succeed': True, 'Datas': []} + datas = request.httprequest.data + ret = json.loads(datas) + ret = json.loads(ret['result']) + logging.info('RfidCode:%s' % ret) + workorder = request.env['mrp.workorder'].sudo().search([('name', '=', ret['ProductionLine'])]) + if workorder: + for item in workorder: + date_planned_start = '' + date_planned_finished = '' + if item.date_planned_start is not False: + planned_start = item.date_planned_start.strftime("%Y-%m-%d %H:%M:%S") + date_planned_start = request.env['sf.sync.common'].sudo().get_add_time(planned_start) + if item.date_planned_finished is not False: + planned_finished = item.date_planned_finished.strftime("%Y-%m-%d %H:%M:%S") + date_planned_finished = request.env['sf.sync.common'].sudo().get_add_time(planned_finished) + res['Datas'].append({ + 'BillId': item.production_id.name, + 'RfidCode': item.RfidCode, + 'CraftName': item.name, + 'Quantity': 1, + 'WortkStart': date_planned_start, + 'WorkEnd': date_planned_finished, + 'MaterialId': item.product_id.default_code, + 'MaterialName': item.product_id.name, + # 'Spec':item.mat, + 'Material': item.materials_type_id.name + }) + except Exception as e: + res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} + logging.info('get_ShiftPlan error:%s' % e) + return json.JSONEncoder().encode(res) + + @http.route('/AutoDeviceApi/QcCheck', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, + cors="*") + def get_qcCheck(self, **kw): + """ + 工件预调(前置三元检测) + 1、前置三元检测在产线外:三元检测设备把测量信息上传给MES, + MES生成检测定位数据。中控系统传递RFID编号给MES获取测量偏置结果。(来源为三元检测工单上的字段) + :param kw: + :return: + """ + logging.info('get_qcCheck:%s' % kw) + try: + res = {'Succeed': True, 'Datas': []} + datas = request.httprequest.data + ret = json.loads(datas) + ret = json.loads(ret['result']) + logging.info('RfidCode:%s' % ret) + workorder = request.env['mrp.workorder'].sudo().search([('routing_type', '=', '前置三元定位检测')]) + if workorder: + for item in workorder: + res['Datas'].append({ + 'XOffset': item.production_id.name, + 'YOffset': item.RfidCode, + 'ZOffet': item.name, + 'COffset': 1 + }) + except Exception as e: + res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} + logging.info('get_qcCheck error:%s' % e) + return json.JSONEncoder().encode(res) + + @http.route('/AutoDeviceApi/QcCheck', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, + cors="*") + def get_qcCheck(self, **kw): + """ + 工件预调(前置三元检测) + 1、前置三元检测在产线外:三元检测设备把测量信息上传给MES, + MES生成检测定位数据。中控系统传递RFID编号给MES获取测量偏置结果。(来源为三元检测工单上的字段) + :param kw: + :return: + """ + logging.info('get_qcCheck:%s' % kw) + try: + res = {'Succeed': True, 'Datas': []} + datas = request.httprequest.data + ret = json.loads(datas) + ret = json.loads(ret['result']) + logging.info('RfidCode:%s' % ret) + workorder = request.env['mrp.workorder'].sudo().search([('routing_type', '=', '前置三元定位检测')]) + if workorder: + for item in workorder: + res['Datas'].append({ + 'XOffset': item.production_id.name, + 'YOffset': item.RfidCode, + 'ZOffet': item.name, + 'COffset': 1 + }) + except Exception as e: + res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} + logging.info('get_qcCheck error:%s' % e) + return json.JSONEncoder().encode(res) + From bba2c1d839bc712e5bd02dd51b8cd3e197b69786 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Wed, 17 Jan 2024 17:33:13 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8C=96=E4=BC=A0=E9=80=92=E5=B7=A5=E5=8D=95=E5=8F=B7=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=B7=A5=E5=8D=95=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_bf_connect/models/http.py | 34 ++++++++++----------- sf_manufacturing/controllers/controllers.py | 10 +++--- sf_manufacturing/models/product_template.py | 4 +-- sf_sale/models/auto_quatotion_common.py | 2 +- sf_sale/models/quick_easy_order.py | 4 +-- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/sf_bf_connect/models/http.py b/sf_bf_connect/models/http.py index 8f546c88..b911c999 100644 --- a/sf_bf_connect/models/http.py +++ b/sf_bf_connect/models/http.py @@ -24,23 +24,23 @@ class Http(models.AbstractModel): if 'HTTP_TOKEN' in datas: _logger.info('token:%s' % datas['HTTP_TOKEN']) # 查询密钥 - factory_secret = request.env['res.partner'].sudo().search( - [('sf_token', '=', datas['HTTP_TOKEN'])], limit=1) - if not factory_secret: - raise AuthenticationError('无效的token') - # 设置API接口请求时间,不能超过5秒 - # deltime = datetime.timedelta(seconds=30) - # if abs(int(datas['HTTP_TIMESTAMP']) - timestamp_str) > deltime.seconds: + # factory_secret = request.env['res.partner'].sudo().search( + # [('sf_token', '=', datas['HTTP_TOKEN'])], limit=1) + # if not factory_secret: + # raise AuthenticationError('无效的token') + # # 设置API接口请求时间,不能超过5秒 + # # deltime = datetime.timedelta(seconds=30) + # # if abs(int(datas['HTTP_TIMESTAMP']) - timestamp_str) > deltime.seconds: + # # raise AuthenticationError('请求已过期') + # post_time = int(datas['HTTP_TIMESTAMP']) + # datetime_post = datetime.fromtimestamp(post_time) + # datetime_now = datetime.now().replace(microsecond=0) + # datetime_del = datetime_now + timedelta(seconds=5) + # if datetime_post > datetime_del: # raise AuthenticationError('请求已过期') - post_time = int(datas['HTTP_TIMESTAMP']) - datetime_post = datetime.fromtimestamp(post_time) - datetime_now = datetime.now().replace(microsecond=0) - datetime_del = datetime_now + timedelta(seconds=5) - if datetime_post > datetime_del: - raise AuthenticationError('请求已过期') - check_str = '%s%s%s' % (datas['HTTP_TOKEN'], post_time, factory_secret.sf_secret_key) - check_sf_str = hashlib.sha1(check_str.encode('utf-8')).hexdigest() - if check_sf_str != datas['HTTP_CHECKSTR']: - raise AuthenticationError('数据校验不通过') + # check_str = '%s%s%s' % (datas['HTTP_TOKEN'], post_time, factory_secret.sf_secret_key) + # check_sf_str = hashlib.sha1(check_str.encode('utf-8')).hexdigest() + # if check_sf_str != datas['HTTP_CHECKSTR']: + # raise AuthenticationError('数据校验不通过') else: raise AuthenticationError('请求参数中无token') diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py index b00c1324..641dfb6b 100644 --- a/sf_manufacturing/controllers/controllers.py +++ b/sf_manufacturing/controllers/controllers.py @@ -20,9 +20,9 @@ class Manufacturing_Connect(http.Controller): res = {'Succeed': True, 'Datas': []} datas = request.httprequest.data ret = json.loads(datas) - ret = json.loads(ret['result']) logging.info('RfidCode:%s' % ret) - workorder = request.env['mrp.workorder'].sudo().search([('name', '=', ret['RfidCode'])]) + workorder = request.env['mrp.workorder'].sudo().search( + [('production_id.name', '=', 'WH/MO/00071'), ('routing_type', '=', '装夹')]) if workorder: for item in workorder: res['Datas'].append({ @@ -32,8 +32,9 @@ class Manufacturing_Connect(http.Controller): 'Quantity': 1, 'MaterialId': item.product_id.default_code, 'MaterialName': item.product_id.name, - # 'Spec':item.mat, - 'Material': item.materials_type_id.name + 'Spec': '%s×%s×%s' % (item.move_raw_ids.materiel_length, item.move_raw_ids.materiel_width, + item.move_raw_ids.materiel_height), + 'Material': item.product_id.materials_type_id.name }) except Exception as e: res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} @@ -144,4 +145,3 @@ class Manufacturing_Connect(http.Controller): res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} logging.info('get_qcCheck error:%s' % e) return json.JSONEncoder().encode(res) - diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 42a392e2..7a341c36 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -6,8 +6,8 @@ import os from odoo import models, fields, api, _ from odoo.exceptions import ValidationError from odoo.modules import get_resource_path -from OCC.Extend.DataExchange import read_step_file -from OCC.Extend.DataExchange import write_stl_file +# from OCC.Extend.DataExchange import read_step_file +# from OCC.Extend.DataExchange import write_stl_file class ResProductMo(models.Model): diff --git a/sf_sale/models/auto_quatotion_common.py b/sf_sale/models/auto_quatotion_common.py index 09ea3f0f..10b83aed 100644 --- a/sf_sale/models/auto_quatotion_common.py +++ b/sf_sale/models/auto_quatotion_common.py @@ -2,7 +2,7 @@ import logging from odoo.modules import get_resource_path from odoo import fields, models, api -from quatotion import readSql, feature_recognize, auto_quatotion +# from quatotion import readSql, feature_recognize, auto_quatotion __author__ = 'jinling.yang' _logger = logging.getLogger(__name__) diff --git a/sf_sale/models/quick_easy_order.py b/sf_sale/models/quick_easy_order.py index 1e5f274c..7419cc9a 100644 --- a/sf_sale/models/quick_easy_order.py +++ b/sf_sale/models/quick_easy_order.py @@ -5,8 +5,8 @@ import os import json from datetime import datetime import requests -from OCC.Extend.DataExchange import read_step_file -from OCC.Extend.DataExchange import write_stl_file +# from OCC.Extend.DataExchange import read_step_file +# from OCC.Extend.DataExchange import write_stl_file from odoo import models, fields, api from odoo.modules import get_resource_path from odoo.exceptions import ValidationError, UserError From daa7c467f9bf2adc2e7edc70b0049a639455deb0 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Mon, 22 Jan 2024 15:37:06 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=BF=98=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/product_template.py | 4 ++-- sf_sale/models/auto_quatotion_common.py | 2 +- sf_sale/models/quick_easy_order.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 2deba5af..90395d18 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -6,8 +6,8 @@ import os from odoo import models, fields, api, _ from odoo.exceptions import ValidationError from odoo.modules import get_resource_path -# from OCC.Extend.DataExchange import read_step_file -# from OCC.Extend.DataExchange import write_stl_file +from OCC.Extend.DataExchange import read_step_file +from OCC.Extend.DataExchange import write_stl_file class ResProductMo(models.Model): diff --git a/sf_sale/models/auto_quatotion_common.py b/sf_sale/models/auto_quatotion_common.py index 10b83aed..09ea3f0f 100644 --- a/sf_sale/models/auto_quatotion_common.py +++ b/sf_sale/models/auto_quatotion_common.py @@ -2,7 +2,7 @@ import logging from odoo.modules import get_resource_path from odoo import fields, models, api -# from quatotion import readSql, feature_recognize, auto_quatotion +from quatotion import readSql, feature_recognize, auto_quatotion __author__ = 'jinling.yang' _logger = logging.getLogger(__name__) diff --git a/sf_sale/models/quick_easy_order.py b/sf_sale/models/quick_easy_order.py index 7419cc9a..1e5f274c 100644 --- a/sf_sale/models/quick_easy_order.py +++ b/sf_sale/models/quick_easy_order.py @@ -5,8 +5,8 @@ import os import json from datetime import datetime import requests -# from OCC.Extend.DataExchange import read_step_file -# from OCC.Extend.DataExchange import write_stl_file +from OCC.Extend.DataExchange import read_step_file +from OCC.Extend.DataExchange import write_stl_file from odoo import models, fields, api from odoo.modules import get_resource_path from odoo.exceptions import ValidationError, UserError From b37d547359b255c56af15c60883d19294b83bd64 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Mon, 22 Jan 2024 15:41:20 +0800 Subject: [PATCH 4/4] =?UTF-8?q?http=E9=AA=8C=E8=AF=81=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=BF=98=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_bf_connect/models/http.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/sf_bf_connect/models/http.py b/sf_bf_connect/models/http.py index b911c999..8f546c88 100644 --- a/sf_bf_connect/models/http.py +++ b/sf_bf_connect/models/http.py @@ -24,23 +24,23 @@ class Http(models.AbstractModel): if 'HTTP_TOKEN' in datas: _logger.info('token:%s' % datas['HTTP_TOKEN']) # 查询密钥 - # factory_secret = request.env['res.partner'].sudo().search( - # [('sf_token', '=', datas['HTTP_TOKEN'])], limit=1) - # if not factory_secret: - # raise AuthenticationError('无效的token') - # # 设置API接口请求时间,不能超过5秒 - # # deltime = datetime.timedelta(seconds=30) - # # if abs(int(datas['HTTP_TIMESTAMP']) - timestamp_str) > deltime.seconds: - # # raise AuthenticationError('请求已过期') - # post_time = int(datas['HTTP_TIMESTAMP']) - # datetime_post = datetime.fromtimestamp(post_time) - # datetime_now = datetime.now().replace(microsecond=0) - # datetime_del = datetime_now + timedelta(seconds=5) - # if datetime_post > datetime_del: + factory_secret = request.env['res.partner'].sudo().search( + [('sf_token', '=', datas['HTTP_TOKEN'])], limit=1) + if not factory_secret: + raise AuthenticationError('无效的token') + # 设置API接口请求时间,不能超过5秒 + # deltime = datetime.timedelta(seconds=30) + # if abs(int(datas['HTTP_TIMESTAMP']) - timestamp_str) > deltime.seconds: # raise AuthenticationError('请求已过期') - # check_str = '%s%s%s' % (datas['HTTP_TOKEN'], post_time, factory_secret.sf_secret_key) - # check_sf_str = hashlib.sha1(check_str.encode('utf-8')).hexdigest() - # if check_sf_str != datas['HTTP_CHECKSTR']: - # raise AuthenticationError('数据校验不通过') + post_time = int(datas['HTTP_TIMESTAMP']) + datetime_post = datetime.fromtimestamp(post_time) + datetime_now = datetime.now().replace(microsecond=0) + datetime_del = datetime_now + timedelta(seconds=5) + if datetime_post > datetime_del: + raise AuthenticationError('请求已过期') + check_str = '%s%s%s' % (datas['HTTP_TOKEN'], post_time, factory_secret.sf_secret_key) + check_sf_str = hashlib.sha1(check_str.encode('utf-8')).hexdigest() + if check_sf_str != datas['HTTP_CHECKSTR']: + raise AuthenticationError('数据校验不通过') else: raise AuthenticationError('请求参数中无token')