From 42178e3e1eb07b5fbfa4aa2feea06c82b4de0cef Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Fri, 26 Apr 2024 18:04:30 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E4=BA=A7=E7=BA=BF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=96=B0=E5=A2=9EIsComplete=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/controllers/controllers.py | 137 +++++++++++--------- sf_manufacturing/controllers/workpiece.py | 3 +- sf_manufacturing/models/mrp_workorder.py | 5 +- sf_manufacturing/models/product_template.py | 4 +- sf_sale/models/quick_easy_order.py | 4 +- sf_sale/models/quick_easy_order_old.py | 4 +- 6 files changed, 87 insertions(+), 70 deletions(-) diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py index 707b391d..6be34597 100644 --- a/sf_manufacturing/controllers/controllers.py +++ b/sf_manufacturing/controllers/controllers.py @@ -422,32 +422,40 @@ class Manufacturing_Connect(http.Controller): logging.info('ret:%s' % ret) if 'DeviceId' in ret: logging.info('DeviceId:%s' % ret['DeviceId']) - for i in range(1, 5): - logging.info('F-RfidCode:%s' % i) - if f'RfidCode{i}' in ret: - rfid_code = ret[f'RfidCode{i}'] - logging.info('RfidCode:%s' % rfid_code) - domain = [ - ('feeder_station_destination_id.name', '=', ret['DeviceId']), - ('workorder_id.rfid_code', '=', rfid_code), - ('status', '=', '已配送'), - ('type', '=', '上产线') - ] - workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(domain, order='id asc') - if workpiece_delivery: - for wd in workpiece_delivery: - logging.info('wd.production_id:%s' % wd.production_id.name) - if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '待上产线': - logging.info('wd.production_line_state:%s' % wd.production_id.production_line_state) - wd.production_id.write({'production_line_state': '已上产线'}) - next_workpiece = request.env['sf.workpiece.delivery'].sudo().search( - [('workorder_id.rfid_code', '=', rfid_code), ('type', '=', '下产线'), - ('production_id', '=', wd.production_id.id)]) - if next_workpiece: - logging.info('next_workpiece:%s' % next_workpiece.delivery_num) - next_workpiece.write({'status': '待下发', 'task_delivery_time': datetime.now()}) + if 'IsComplete' in ret: + if ret['IsComplete'] is True: + for i in range(1, 5): + logging.info('F-RfidCode:%s' % i) + if f'RfidCode{i}' in ret: + rfid_code = ret[f'RfidCode{i}'] + logging.info('RfidCode:%s' % rfid_code) + domain = [ + ('feeder_station_destination_id.name', '=', ret['DeviceId']), + ('workorder_id.rfid_code', '=', rfid_code), + ('status', '=', '已配送'), + ('type', '=', '上产线') + ] + workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(domain, + order='id asc') + if workpiece_delivery: + for wd in workpiece_delivery: + logging.info('wd.production_id:%s' % wd.production_id.name) + if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '待上产线': + logging.info( + 'wd.production_line_state:%s' % wd.production_id.production_line_state) + wd.production_id.write({'production_line_state': '已上产线'}) + next_workpiece = request.env['sf.workpiece.delivery'].sudo().search( + [('workorder_id.rfid_code', '=', rfid_code), ('type', '=', '下产线'), + ('production_id', '=', wd.production_id.id)]) + if next_workpiece: + logging.info('next_workpiece:%s' % next_workpiece.delivery_num) + next_workpiece.write( + {'status': '待下发', 'task_delivery_time': datetime.now()}) + else: + res = {'Succeed': False, 'ErrorCode': 204, + 'Error': 'DeviceId为%s没有对应的已配送工件数据' % ret['DeviceId']} else: - res = {'Succeed': False, 'ErrorCode': 203, 'Error': '该DeviceId没有对应的已配送工件数据'} + res = {'Succeed': False, 'ErrorCode': 203, 'Error': '未传IsComplete字段'} else: res = {'Succeed': False, 'ErrorCode': 201, 'Error': '未传DeviceId字段'} except Exception as e: @@ -455,7 +463,7 @@ class Manufacturing_Connect(http.Controller): logging.info('AGVToProduct error:%s' % e) return json.JSONEncoder().encode(res) - @http.route('/AutoDeviceApi/AGVDownProduct', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, + @http.route('/AutoDeviceApi/AGVDownProduct', type='json', auth='none', methods=['GET', 'POST'], csrf=False, cors="*") def AGVDownProduct(self, **kw): """ @@ -473,39 +481,50 @@ class Manufacturing_Connect(http.Controller): if 'DeviceId' in ret: logging.info('DeviceId:%s' % ret['DeviceId']) delivery_Arr = [] - for i in range(1, 5): - logging.info('F-RfidCode:%s' % i) - if f'RfidCode{i}' in ret: - rfid_code = ret[f'RfidCode{i}'] - logging.info('RfidCode:%s' % rfid_code) - domain = [ - ('feeder_station_start_id.name', '=', ret['DeviceId']), - ('workorder_id.rfid_code', '=', rfid_code), - ('status', '=', '待下发'), - ('type', '=', '下产线') - ] - workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(domain, order='id asc') - if workpiece_delivery: - for wd in workpiece_delivery: - logging.info('wd.production_id:%s' % wd.production_id.name) - if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '已上产线': - logging.info('wd.production_line_state:%s' % wd.production_id.production_line_state) - wd.production_id.write({'production_line_state': '已下产线'}) - delivery_Arr.append({wd.id}) - next_workpiece = request.env['sf.workpiece.delivery'].sudo().search( - [('workorder_id.rfid_code', '=', rfid_code), ('type', '=', '运送空料架'), - ('production_id', '=', wd.production_id.id)]) - if next_workpiece: - logging.info('next_workpiece:%s' % next_workpiece.delivery_num) - next_workpiece.write({'status': '待下发', 'task_delivery_time': datetime.now()}) - if delivery_Arr: - logging.info('delivery_Arr:%s' % delivery_Arr) - delivery_workpiece = request.env['sf.workpiece.delivery'].sudo().search( - [('id', 'in', delivery_Arr)]) - if delivery_workpiece: - logging.info('开始向agv下发下产线任务') - delivery_workpiece._delivery_avg() - logging.info('agv下发下产线任务下发完成') + if 'IsComplete' in ret: + if ret['IsComplete'] is True: + for i in range(1, 5): + logging.info('F-RfidCode:%s' % i) + if f'RfidCode{i}' in ret: + rfid_code = ret[f'RfidCode{i}'] + logging.info('RfidCode:%s' % rfid_code) + domain = [ + ('feeder_station_start_id.name', '=', ret['DeviceId']), + ('workorder_id.rfid_code', '=', rfid_code), + ('status', '=', '待下发'), + ('type', '=', '下产线') + ] + workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search(domain, + order='id asc') + if workpiece_delivery: + for wd in workpiece_delivery: + logging.info('wd.production_id:%s' % wd.production_id.name) + if wd.workorder_id.state == 'done' and wd.production_id.production_line_state == '已上产线': + logging.info( + 'wd.production_line_state:%s' % wd.production_id.production_line_state) + wd.production_id.write({'production_line_state': '已下产线'}) + delivery_Arr.append({wd.id}) + next_workpiece = request.env['sf.workpiece.delivery'].sudo().search( + [('workorder_id.rfid_code', '=', rfid_code), + ('type', '=', '运送空料架'), + ('production_id', '=', wd.production_id.id)]) + if next_workpiece: + logging.info('next_workpiece:%s' % next_workpiece.delivery_num) + next_workpiece.write( + {'status': '待下发', 'task_delivery_time': datetime.now()}) + else: + res = {'Succeed': False, 'ErrorCode': 204, + 'Error': 'DeviceId为%s没有对应的已配送工件数据' % ret['DeviceId']} + if delivery_Arr: + logging.info('delivery_Arr:%s' % delivery_Arr) + delivery_workpiece = request.env['sf.workpiece.delivery'].sudo().search( + [('id', 'in', delivery_Arr)]) + if delivery_workpiece: + logging.info('开始向agv下发下产线任务') + delivery_workpiece._delivery_avg() + logging.info('agv下发下产线任务下发完成') + else: + res = {'Succeed': False, 'ErrorCode': 203, 'Error': '未传IsComplete字段'} except Exception as e: res = {'Succeed': False, 'ErrorCode': 202, 'Error': e} logging.info('AGVDownProduct error:%s' % e) diff --git a/sf_manufacturing/controllers/workpiece.py b/sf_manufacturing/controllers/workpiece.py index 820e0002..8cda129b 100644 --- a/sf_manufacturing/controllers/workpiece.py +++ b/sf_manufacturing/controllers/workpiece.py @@ -28,8 +28,7 @@ class Workpiece(http.Controller): req_codes = ret['reqCode'].split(',') for req_code in req_codes: workpiece_delivery = request.env['sf.workpiece.delivery'].sudo().search( - [('production_id.name', '=', req_code.rsplit('-', 1)[0]), - ('delivery_num', '=', req_code.strip())]) + [('delivery_num', '=', req_code.strip()), ('task_completion_time', '=', False)]) if workpiece_delivery: workpiece_delivery.write({'status': '已配送', 'task_completion_time': datetime.now()}) else: diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 7ad53612..90ffddf6 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -485,10 +485,8 @@ class ResMrpWorkOrder(models.Model): def _json_workpiece_delivery_list(self, production): return [ [0, '', {'production_id': production.id, 'type': '上产线', 'delivery_num': '%s-%s' % (production.name, 1)}], - [0, '', {'production_id': production.id, 'type': '下产线', 'delivery_num': '%s-%s' % (production.name, 2)}], [0, '', - {'production_id': production.id, 'type': '运送空料架', 'delivery_num': '%s-%s' % (production.name, 3)}], - ] + {'production_id': production.id, 'type': '下产线', 'delivery_num': '%s-%s' % (production.name, 2)}], ] # 拼接工单对象属性值(表面工艺) def _json_workorder_surface_process_str(self, production, route, process_parameter, supplier_id): @@ -1162,6 +1160,7 @@ class WorkPieceDelivery(models.Model): agv_site = self.env['sf.agv.site'].search([]) if agv_site: agv_site.update_site_state() + # if config = self.env['res.config.settings'].get_values() positionCode_Arr = [] delivery_Arr = [] diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index 16ea429a..d766629c 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -7,8 +7,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/quick_easy_order.py b/sf_sale/models/quick_easy_order.py index 1ece6b86..ed52d9de 100644 --- a/sf_sale/models/quick_easy_order.py +++ b/sf_sale/models/quick_easy_order.py @@ -8,8 +8,8 @@ from datetime import datetime import requests from odoo import http from odoo.http import request -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 diff --git a/sf_sale/models/quick_easy_order_old.py b/sf_sale/models/quick_easy_order_old.py index 724d4369..24bf5738 100644 --- a/sf_sale/models/quick_easy_order_old.py +++ b/sf_sale/models/quick_easy_order_old.py @@ -6,8 +6,8 @@ import os from datetime import datetime from stl import mesh # from OCC.Core.GProp import GProp_GProps -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.addons.sf_base.commons.common import Common from odoo import models, fields, api from odoo.modules import get_resource_path From 5eb946d9365362667b6195b431485898eef51a34 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Sun, 28 Apr 2024 11:34:17 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96agv=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/controllers/controllers.py | 25 ++------ sf_manufacturing/models/agv_setting.py | 14 ++--- sf_manufacturing/models/mrp_workorder.py | 60 +++++++++++++------ sf_manufacturing/models/product_template.py | 4 +- sf_manufacturing/views/agv_setting_views.xml | 2 - sf_manufacturing/views/mrp_workorder_view.xml | 13 ++-- sf_sale/models/quick_easy_order.py | 4 +- sf_sale/models/quick_easy_order_old.py | 4 +- 8 files changed, 66 insertions(+), 60 deletions(-) diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py index 93d080a6..1568f7c7 100644 --- a/sf_manufacturing/controllers/controllers.py +++ b/sf_manufacturing/controllers/controllers.py @@ -451,13 +451,6 @@ class Manufacturing_Connect(http.Controller): logging.info( 'wd.production_line_state:%s' % wd.production_id.production_line_state) wd.production_id.write({'production_line_state': '已上产线'}) - next_workpiece = request.env['sf.workpiece.delivery'].sudo().search( - [('workorder_id.rfid_code', '=', rfid_code), ('type', '=', '下产线'), - ('production_id', '=', wd.production_id.id)]) - if next_workpiece: - logging.info('next_workpiece:%s' % next_workpiece.delivery_num) - next_workpiece.write( - {'status': '待下发', 'task_delivery_time': datetime.now()}) else: res = {'Succeed': False, 'ErrorCode': 204, 'Error': 'DeviceId为%s没有对应的已配送工件数据' % ret['DeviceId']} @@ -470,7 +463,7 @@ class Manufacturing_Connect(http.Controller): logging.info('AGVToProduct error:%s' % e) return json.JSONEncoder().encode(res) - @http.route('/AutoDeviceApi/AGVDownProduct', type='json', auth='none', methods=['GET', 'POST'], csrf=False, + @http.route('/AutoDeviceApi/AGVDownProduct', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, cors="*") def AGVDownProduct(self, **kw): """ @@ -510,15 +503,7 @@ class Manufacturing_Connect(http.Controller): logging.info( 'wd.production_line_state:%s' % wd.production_id.production_line_state) wd.production_id.write({'production_line_state': '已下产线'}) - delivery_Arr.append({wd.id}) - next_workpiece = request.env['sf.workpiece.delivery'].sudo().search( - [('workorder_id.rfid_code', '=', rfid_code), - ('type', '=', '运送空料架'), - ('production_id', '=', wd.production_id.id)]) - if next_workpiece: - logging.info('next_workpiece:%s' % next_workpiece.delivery_num) - next_workpiece.write( - {'status': '待下发', 'task_delivery_time': datetime.now()}) + delivery_Arr.append(wd.id) else: res = {'Succeed': False, 'ErrorCode': 204, 'Error': 'DeviceId为%s没有对应的已配送工件数据' % ret['DeviceId']} @@ -528,8 +513,10 @@ class Manufacturing_Connect(http.Controller): [('id', 'in', delivery_Arr)]) if delivery_workpiece: logging.info('开始向agv下发下产线任务') - delivery_workpiece._delivery_avg() - logging.info('agv下发下产线任务下发完成') + is_free = delivery_workpiece._check_avgsite_state() + if is_free is True: + delivery_workpiece._delivery_avg() + logging.info('agv下发下产线任务下发完成') else: res = {'Succeed': False, 'ErrorCode': 203, 'Error': '未传IsComplete字段'} except Exception as e: diff --git a/sf_manufacturing/models/agv_setting.py b/sf_manufacturing/models/agv_setting.py index 70075285..dad6ec4f 100644 --- a/sf_manufacturing/models/agv_setting.py +++ b/sf_manufacturing/models/agv_setting.py @@ -8,7 +8,6 @@ class AgvSetting(models.Model): _name = 'sf.agv.site' _description = 'agv站点' - number = fields.Integer('序号') name = fields.Char('位置编号') owning_region = fields.Char('所属区域') state = fields.Selection([ @@ -26,12 +25,13 @@ class AgvSetting(models.Model): center_control_r = requests.get(center_control_url, params={}, headers=headers) ret = center_control_r.json() logging.info('工件配送-请求中控站点信息:%s' % ret) - datas = ret['Datas'] - for item in self: - for da in datas: - if da['DeviceId'] == item.name: - if da['AtHome'] is True: - item.state = '占用' + if ret['Succeed'] is True: + datas = ret['Datas'] + for item in self: + for da in datas: + if da['DeviceId'] == item.name: + if da['AtHome'] is True: + item.state = '占用' class AgvTaskRoute(models.Model): diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 90ffddf6..9e3dde4c 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -486,7 +486,7 @@ class ResMrpWorkOrder(models.Model): return [ [0, '', {'production_id': production.id, 'type': '上产线', 'delivery_num': '%s-%s' % (production.name, 1)}], [0, '', - {'production_id': production.id, 'type': '下产线', 'delivery_num': '%s-%s' % (production.name, 2)}], ] + {'production_id': production.id, 'type': '下产线', 'delivery_num': '%s-%s' % (production.name, 2)}]] # 拼接工单对象属性值(表面工艺) def _json_workorder_surface_process_str(self, production, route, process_parameter, supplier_id): @@ -1095,9 +1095,12 @@ class WorkPieceDelivery(models.Model): [('上产线', '上产线'), ('下产线', '下产线'), ('运送空料架', '运送空料架')], string='类型') delivery_duration = fields.Float('配送时长', compute='_compute_delivery_duration') status = fields.Selection( - [('待下发', '待下发'), ('待配送', '待配送'), ('已配送', '已配送')], string='状态', ) + [('待下发', '待下发'), ('待配送', '待配送'), ('已配送', '已配送')], string='状态', default='待下发') is_cnc_program_down = fields.Boolean('程序是否下发', default=False) + # @api.model + # def create(self, vals): + @api.onchange('route_id') def onchange_route(self): if self.route_id: @@ -1113,7 +1116,7 @@ class WorkPieceDelivery(models.Model): same_production_line_id = None same_route_id = None down_status = '待下发' - production_type = '上产线' + production_type = None num = 0 for item in self: num += 1 @@ -1126,8 +1129,10 @@ class WorkPieceDelivery(models.Model): is_not_route += 1 else: raise UserError('请选择【任务路线】再进行配送') - # if production_type != item.type: - # raise UserError('请选择类型为【上产线】的制造订单进行配送') + if production_type is None: + production_type = item.type + if production_type != item.type: + raise UserError('请选择类型为%s的制造订单进行配送' % production_type) if down_status != item.status: raise UserError('请选择状态为【待下发】的制造订单进行配送') if same_production_line_id is None: @@ -1144,23 +1149,40 @@ class WorkPieceDelivery(models.Model): raise UserError('您所选择制造订单的【目的生产线】不一致,请重新确认') if is_not_route >= 1: raise UserError('您所选择制造订单的【任务路线】不一致,请重新确认') - if delivery_ids: - return { - 'name': _('确认'), - 'type': 'ir.actions.act_window', - 'view_mode': 'form', - 'res_model': 'sf.workpiece.delivery.wizard', - 'target': 'new', - 'context': { - 'default_delivery_ids': [(6, 0, delivery_ids)], - }} + is_free = self._check_avgsite_state() + if is_free is True: + if delivery_ids: + return { + 'name': _('确认'), + 'type': 'ir.actions.act_window', + 'view_mode': 'form', + 'res_model': 'sf.workpiece.delivery.wizard', + 'target': 'new', + 'context': { + 'default_delivery_ids': [(6, 0, delivery_ids)], + }} + else: + raise UserError("您所选择制造订单的【任务路线】的【终点接驳站】已占用,请在该接驳站空闲时进行配送") - # 配送至avg小车 - def _delivery_avg(self): + # 验证agv站点是否可用 + def _check_avgsite_state(self): + is_free = False agv_site = self.env['sf.agv.site'].search([]) if agv_site: agv_site.update_site_state() - # if + for item in self: + if item.type in ["上产线", "下产线"]: + logging.info('工件配送-起点状态:%s-%s' % ( + item.feeder_station_start_id.name, item.feeder_station_start_id.state)) + logging.info('工件配送-终点状态:%s-%s' % ( + item.feeder_station_destination_id.name, item.feeder_station_destination_id.state)) + if item.feeder_station_start_id.state == '占用' and item.feeder_station_destination_id.state == '空闲': + is_free = True + logging.info('is_free:%s' % is_free) + return is_free + + # 配送至avg小车 + def _delivery_avg(self): config = self.env['res.config.settings'].get_values() positionCode_Arr = [] delivery_Arr = [] @@ -1172,7 +1194,7 @@ class WorkPieceDelivery(models.Model): if feeder_station_destination is None: feeder_station_destination = item.feeder_station_destination_id.name delivery_Arr.append(item.delivery_num) - delivery_str = ', '.join(map(str, delivery_Arr)) + delivery_str = ','.join(map(str, delivery_Arr)) if feeder_station_start is not None: positionCode_Arr.append({ 'positionCode': feeder_station_start, diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index d766629c..16ea429a 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -7,8 +7,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_manufacturing/views/agv_setting_views.xml b/sf_manufacturing/views/agv_setting_views.xml index dea85e6a..61b25e10 100644 --- a/sf_manufacturing/views/agv_setting_views.xml +++ b/sf_manufacturing/views/agv_setting_views.xml @@ -7,7 +7,6 @@ sf.agv.site - @@ -39,7 +38,6 @@ - diff --git a/sf_manufacturing/views/mrp_workorder_view.xml b/sf_manufacturing/views/mrp_workorder_view.xml index f381e481..0611e1e3 100644 --- a/sf_manufacturing/views/mrp_workorder_view.xml +++ b/sf_manufacturing/views/mrp_workorder_view.xml @@ -608,9 +608,9 @@ sf.workpiece.delivery - - - + + + @@ -621,7 +621,6 @@ - @@ -631,10 +630,10 @@ 工件配送 sf.workpiece.delivery - - + + {'search_default_on_down':1} tree,search - + [('type','in',['上产线','下产线'])] diff --git a/sf_sale/models/quick_easy_order.py b/sf_sale/models/quick_easy_order.py index ed52d9de..1ece6b86 100644 --- a/sf_sale/models/quick_easy_order.py +++ b/sf_sale/models/quick_easy_order.py @@ -8,8 +8,8 @@ from datetime import datetime import requests from odoo import http from odoo.http import request -# 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 diff --git a/sf_sale/models/quick_easy_order_old.py b/sf_sale/models/quick_easy_order_old.py index 24bf5738..724d4369 100644 --- a/sf_sale/models/quick_easy_order_old.py +++ b/sf_sale/models/quick_easy_order_old.py @@ -6,8 +6,8 @@ import os from datetime import datetime from stl import mesh # from OCC.Core.GProp import GProp_GProps -# 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.addons.sf_base.commons.common import Common from odoo import models, fields, api from odoo.modules import get_resource_path From 24722f474c5e64a813b97a8b7dd045ccfa548ed2 Mon Sep 17 00:00:00 2001 From: "jinling.yang" Date: Sun, 28 Apr 2024 11:43:11 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=85=8D=E9=80=81?= =?UTF-8?q?=E6=97=B6agv=E7=AB=99=E7=82=B9=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sf_manufacturing/models/mrp_workorder.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 9e3dde4c..dd7dbd3c 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -1176,7 +1176,9 @@ class WorkPieceDelivery(models.Model): item.feeder_station_start_id.name, item.feeder_station_start_id.state)) logging.info('工件配送-终点状态:%s-%s' % ( item.feeder_station_destination_id.name, item.feeder_station_destination_id.state)) - if item.feeder_station_start_id.state == '占用' and item.feeder_station_destination_id.state == '空闲': + if ( + item.feeder_station_start_id.state == '占用' and item.feeder_station_destination_id.state == '空闲') or ( + item.feeder_station_start_id.state == '空闲' and item.feeder_station_destination_id.state == '空闲'): is_free = True logging.info('is_free:%s' % is_free) return is_free