diff --git a/jikimo_frontend/static/src/scss/custom_style.scss b/jikimo_frontend/static/src/scss/custom_style.scss index 2b1c6cfc..d8e2ab85 100644 --- a/jikimo_frontend/static/src/scss/custom_style.scss +++ b/jikimo_frontend/static/src/scss/custom_style.scss @@ -434,4 +434,19 @@ div:has(.o_required_modifier) > label::before { .o_list_renderer .flex-row-reverse > .text-end { text-align: left!important; +} + +// 设置modal弹窗样式 +.modal.o_technical_modal { + .modal-lg { + @media (min-width: 992px) { + max-width: 1200px; + } + @media (min-width: 576px) { + .o_form_view .o_inner_group { + grid-template-columns: auto; + } + } + + } } \ No newline at end of file diff --git a/sf_base/models/base.py b/sf_base/models/base.py index a2565d6d..6fc86e94 100644 --- a/sf_base/models/base.py +++ b/sf_base/models/base.py @@ -48,7 +48,7 @@ class MachineBrand(models.Model): active = fields.Boolean('有效', default=True) -#机床 +# 机床 class MachineTool(models.Model): _name = 'sf.machine_tool' _description = '机床' @@ -92,7 +92,8 @@ class MachineTool(models.Model): type_id = fields.Many2one('sf.machine_tool.type', '型号') brand_id = fields.Many2one('sf.machine.brand', string='品牌') state = fields.Selection( - [("正常", "正常"), ("故障停机", "故障停机"), ("计划维保", "计划维保"),("空闲", "空闲"),("封存(报废)", "封存(报废)")], + [("正常", "正常"), ("故障停机", "故障停机"), ("计划维保", "计划维保"), ("空闲", "空闲"), + ("封存(报废)", "封存(报废)")], default='正常', string="机床状态") # 0606新增字段 machine_tool_picture = fields.Binary('图片') @@ -357,8 +358,7 @@ class MachineToolType(models.Model): lq_image_id = fields.Many2many('maintenance.equipment.image', 'lq_equipment_id', string='冷却方式', domain="[('type', '=', '冷却方式')]") - - #待删除字段 + # 待删除字段 precision_min = fields.Float('X轴定位精度min(mm)', digits=(12, 3)) precision_max = fields.Float('X轴定位精度max(mm)', digits=(12, 3)) lead_screw = fields.Char('丝杆') diff --git a/sf_base/models/basic_parameters_fixture.py b/sf_base/models/basic_parameters_fixture.py index a1b1a9a6..7bd69a35 100644 --- a/sf_base/models/basic_parameters_fixture.py +++ b/sf_base/models/basic_parameters_fixture.py @@ -85,8 +85,10 @@ class BasicParametersFixture(models.Model): 'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'], 'carrying_capacity_max': obj['carrying_capacity_max'], 'rigidity': obj['rigidity'], - 'materials_model_id': obj['materials_model_id'], - 'machine_tool_type_id': obj['machine_tool_type_id'], + 'materials_model_id': self.env['sf.materials.model'].sudo().search( + [('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id, + 'machine_tool_type_id': self.env['sf.machine_tool.type'].sudo().search( + [('code', '=', obj['machine_tool_type_id']), ('active', '=', True)]).id, }) return zero_chuck_param_str @@ -106,7 +108,8 @@ class BasicParametersFixture(models.Model): 'way_to_install': obj['way_to_install'], 'type_of_drive': obj['type_of_drive'], 'carrying_capacity_max': obj['carrying_capacity_max'], - 'materials_model_id': obj['materials_model_id'], + 'materials_model_id': self.env['sf.materials.model'].sudo().search( + [('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id, 'rigidity': obj['rigidity'], }) return zero_tray_param_str @@ -129,9 +132,11 @@ class BasicParametersFixture(models.Model): 'chucking_power_max': obj['chucking_power_max'], 'carrying_capacity_max': obj['carrying_capacity_max'], 'rated_air_pressure': obj['rated_air_pressure'], - 'materials_model_id': obj['materials_model_id'], + 'materials_model_id': self.env['sf.materials.model'].sudo().search( + [('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id, 'rigidity': obj['rigidity'], - 'interface_materials_model_id': obj['interface_materials_model_id'], + 'interface_materials_model_id': self.env['sf.materials.model'].sudo().search( + [('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id, 'type_of_drive': obj['type_of_drive'], }) return pneumatic_fixture_param_str @@ -155,9 +160,11 @@ class BasicParametersFixture(models.Model): 'carrying_capacity_max': obj['carrying_capacity_max'], 'transverse_groove': obj['transverse_groove'], 'longitudinal_fitting_groove': obj['longitudinal_fitting_groove'], - 'materials_model_id': obj['materials_model_id'], + 'materials_model_id': self.env['sf.materials.model'].sudo().search( + [('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id, 'rigidity': obj['rigidity'], - 'interface_materials_model_id': obj['interface_materials_model_id'], + 'interface_materials_model_id': self.env['sf.materials.model'].sudo().search( + [('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id, 'type_of_drive': obj['type_of_drive'], }) return jaw_vice_fixture_param_str @@ -182,9 +189,11 @@ class BasicParametersFixture(models.Model): 'magnetic_field_height': obj['magnetic_field_height'], 'magnetic_pole_plate_grinding_allowance': obj['magnetic_pole_plate_grinding_allowance'], 'carrying_capacity_max': obj['carrying_capacity_max'], - 'materials_model_id': obj['materials_model_id'], + 'materials_model_id': self.env['sf.materials.model'].sudo().search( + [('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id, 'rigidity': obj['rigidity'], - 'interface_materials_model_id': obj['interface_materials_model_id'], + 'interface_materials_model_id': self.env['sf.materials.model'].sudo().search( + [('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id, 'type_of_drive': obj['type_of_drive'], }) return magnet_fixture_param_str @@ -206,7 +215,8 @@ class BasicParametersFixture(models.Model): 'gripper_diameter_max': obj['gripper_diameter_max'], 'chucking_power_max': obj['chucking_power_max'], 'carrying_capacity_max': obj['carrying_capacity_max'], - 'materials_model_id': obj['materials_model_id'], + 'materials_model_id': self.env['sf.materials.model'].sudo().search( + [('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id, 'rigidity': obj['rigidity'], 'screw_size': obj['screw_size'], 'via_hole_diameter': obj['via_hole_diameter'], @@ -232,7 +242,8 @@ class BasicParametersFixture(models.Model): 'gripper_diameter_max': obj['gripper_diameter_max'], 'chucking_power_max': obj['chucking_power_max'], 'carrying_capacity_max': obj['carrying_capacity_max'], - 'materials_model_id': obj['materials_model_id'], + 'materials_model_id': self.env['sf.materials.model'].sudo().search( + [('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id, 'rigidity': obj['rigidity'], 'mounting_hole_depth': obj['mounting_hole_depth'], 'centering_diameter': obj['centering_diameter'], diff --git a/sf_base/models/common.py b/sf_base/models/common.py index f6e6771a..7450fff9 100644 --- a/sf_base/models/common.py +++ b/sf_base/models/common.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- import logging from urllib.parse import urlencode -from odoo import fields, models +from odoo import fields, models, api +from odoo.exceptions import UserError + _logger = logging.getLogger(__name__) @@ -59,6 +61,14 @@ class MrsMaterialModel(models.Model): supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商') active = fields.Boolean('有效', default=True) + @api.constrains('gain_way', 'supplier_ids') + def _check_gain_way(self): + if not self.gain_way: + raise UserError("请输入获取方式") + if self.gain_way in ['外协', '采购']: + if not self.supplier_ids: + raise UserError("请添加供应商") + class MrsProductionProcessCategory(models.Model): _name = 'sf.production.process.category' diff --git a/sf_base/models/fixture.py b/sf_base/models/fixture.py index c1591745..52e2baf7 100644 --- a/sf_base/models/fixture.py +++ b/sf_base/models/fixture.py @@ -31,7 +31,7 @@ class FixtureModel(models.Model): fixture_material_type = fields.Char(string="夹具物料类型", related='fixture_material_id.name') multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型", required=True) brand_id = fields.Many2one('sf.machine.brand', string="品牌") - model_file = fields.Binary(string="3D模型图") + model_file = fields.Binary(string="图片") status = fields.Boolean('状态') active = fields.Boolean('有效', default=False) @@ -49,43 +49,42 @@ class FixtureModel(models.Model): string='转接板(锁板)夹具基本参数') scroll_chuck_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id', string='三爪卡盘基本参数') - - def _get_code(self, fixture_model_type_code): - fixture_model = self.env['sf.fixture.model'].sudo().search( - [('code', 'ilike', fixture_model_type_code)], - limit=1, - order="id desc") - if not fixture_model: - num = "%03d" % 1 - else: - m = int(fixture_model.code[-3:]) + 1 - num = "%03d" % m - return "%s%s" % (fixture_model_type_code, num) - code = fields.Char(string='编码', readonly=True) - def _onchange_fixture_material_id(self, fixture_material_id): - if fixture_material_id: - if self.fixture_material_id.name == "气动夹具": - code = self._get_code("JKM-C-JJWL-QDJJ-") - elif self.fixture_material_id.name == "转接板(锁板)夹具": - code = self._get_code("JKM-C-JJWL-ZJJJ-") - elif self.fixture_material_id.name == "磁吸夹具": - code = self._get_code("JKM-C-JJWL-CXJJ-") - elif self.fixture_material_id.name == "虎钳夹具": - code = self._get_code("JKM-C-JJWL-HQJJ-") - elif self.fixture_material_id.name == "零点托盘": - code = self._get_code("JKM-C-JJWL-LDTP-") - elif self.fixture_material_id.name == "三爪卡盘": - code = self._get_code("JKM-C-JJWL-SZKP-") - else: - code = self._get_code("JKM-C-JJWL-LDKP-") - return code - - @api.model_create_multi - def create(self, vals): - obj = super(FixtureModel, self).create(vals) - if obj.fixture_material_id: - code = self._onchange_fixture_material_id(obj.fixture_material_id) - obj.code = code - return obj + # def _get_code(self, fixture_model_type_code): + # fixture_model = self.env['sf.fixture.model'].sudo().search( + # [('code', 'ilike', fixture_model_type_code)], + # limit=1, + # order="id desc") + # if not fixture_model: + # num = "%03d" % 1 + # else: + # m = int(fixture_model.code[-3:]) + 1 + # num = "%03d" % m + # return "%s%s" % (fixture_model_type_code, num) + # + # def _onchange_fixture_material_id(self, fixture_material_id): + # if fixture_material_id: + # if self.fixture_material_id.name == "气动夹具": + # code = self._get_code("JKM-C-JJWL-QDJJ-") + # elif self.fixture_material_id.name == "转接板(锁板)夹具": + # code = self._get_code("JKM-C-JJWL-ZJJJ-") + # elif self.fixture_material_id.name == "磁吸夹具": + # code = self._get_code("JKM-C-JJWL-CXJJ-") + # elif self.fixture_material_id.name == "虎钳夹具": + # code = self._get_code("JKM-C-JJWL-HQJJ-") + # elif self.fixture_material_id.name == "零点托盘": + # code = self._get_code("JKM-C-JJWL-LDTP-") + # elif self.fixture_material_id.name == "三爪卡盘": + # code = self._get_code("JKM-C-JJWL-SZKP-") + # else: + # code = self._get_code("JKM-C-JJWL-LDKP-") + # return code + # + # @api.model_create_multi + # def create(self, vals): + # obj = super(FixtureModel, self).create(vals) + # if obj.fixture_material_id: + # code = self._onchange_fixture_material_id(obj.fixture_material_id) + # obj.code = code + # return obj diff --git a/sf_base/models/tool_base_new.py b/sf_base/models/tool_base_new.py index 7f3921a2..474c46f3 100644 --- a/sf_base/models/tool_base_new.py +++ b/sf_base/models/tool_base_new.py @@ -106,11 +106,8 @@ class CuttingToolModel(models.Model): chuck_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters', 'standard_library_id', string='夹头基本参数') cutting_speed_ids = fields.One2many('sf.cutting.speed', 'standard_library_id', string='切削速度Vc') - feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz', - domain=[('cutting_speed', '!=', False)]) - feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz', - domain=[('cutting_speed', '!=', False)]) - + feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(整体式刀具)') + feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(刀片)') material_model_id = fields.Many2one('sf.materials.model', '材料型号') # 适用夹头型号可以多选 # chuck_ids = fields.Many2many( diff --git a/sf_base/models/tool_other_features.py b/sf_base/models/tool_other_features.py index ec3ad238..7ad32bc2 100644 --- a/sf_base/models/tool_other_features.py +++ b/sf_base/models/tool_other_features.py @@ -122,7 +122,7 @@ class ToolMaterialsBasicParameters(models.Model): inner_diameter = fields.Float('内径(mm)') run_out_accuracy = fields.Char('跳动精度(mm)', size=20) top_diameter = fields.Float('顶部直径(mm)') - weight = fields.Float('重量(kg)', size=20) + weight = fields.Float('重量(kg)') clamping_length = fields.Float('夹持长度(mm)') clamping_tolerance = fields.Char('夹持公差(mm)', size=20) cooling_jacket = fields.Char('适用冷却套型号', size=50) @@ -162,7 +162,6 @@ class FeedPerTooth(models.Model): _order = 'blade_diameter,cutting_width_depth_id,materials_type_id' name = fields.Char('名称') - cutting_speed = fields.Char('切削速度', required=True) product_template_id = fields.Many2one('product.template') standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库') blade_diameter = fields.Integer('刃部直径(mm)', readonly=True) diff --git a/sf_base/views/fixture_view.xml b/sf_base/views/fixture_view.xml index 0a7d1e8e..692c3b7f 100644 --- a/sf_base/views/fixture_view.xml +++ b/sf_base/views/fixture_view.xml @@ -32,30 +32,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - 夹具物料 ir.actions.act_window @@ -96,28 +72,6 @@ - - - - - - - - - - - - - - - - - - - - - - 联装类型 ir.actions.act_window diff --git a/sf_base/views/tool_views.xml b/sf_base/views/tool_views.xml index 29f14547..77b5d1d8 100644 --- a/sf_base/views/tool_views.xml +++ b/sf_base/views/tool_views.xml @@ -509,7 +509,7 @@ 刀具组 ir.actions.act_window sf.tool.groups - tree,form,search + tree diff --git a/sf_dlm/views/product_template_view.xml b/sf_dlm/views/product_template_view.xml index 3748a669..7803b263 100644 --- a/sf_dlm/views/product_template_view.xml +++ b/sf_dlm/views/product_template_view.xml @@ -13,6 +13,18 @@ + + product.template.tree.inherit.sf + product.template + + + + False + + + + + product.template.stock.property.form.inherit product.template diff --git a/sf_maintenance/models/sf_maintenance.py b/sf_maintenance/models/sf_maintenance.py index 97deb883..acb87eb6 100644 --- a/sf_maintenance/models/sf_maintenance.py +++ b/sf_maintenance/models/sf_maintenance.py @@ -195,15 +195,15 @@ class SfMaintenanceEquipment(models.Model): machine_tool_id = fields.Many2one('sf.machine_tool', '机床') sf_maintenance_logs_ids = fields.One2many('sf.maintenance.logs', 'maintenance_equipment_id', '设备故障日志') - def name_get(self): - result = [] - for parameter in self: - if parameter.code: - name = parameter.name + '-' + parameter.code - else: - name = parameter.name - result.append((parameter.id, name)) - return result + # def name_get(self): + # result = [] + # for parameter in self: + # if parameter.code: + # name = parameter.name + '-' + parameter.code + # else: + # name = parameter.name + # result.append((parameter.id, name)) + # return result @api.model def create(self, vals): diff --git a/sf_manufacturing/__init__.py b/sf_manufacturing/__init__.py index 0650744f..f7209b17 100644 --- a/sf_manufacturing/__init__.py +++ b/sf_manufacturing/__init__.py @@ -1 +1,2 @@ from . import models +from . import controllers diff --git a/sf_manufacturing/controllers/__init__.py b/sf_manufacturing/controllers/__init__.py new file mode 100644 index 00000000..e046e49f --- /dev/null +++ b/sf_manufacturing/controllers/__init__.py @@ -0,0 +1 @@ +from . import controllers diff --git a/sf_manufacturing/controllers/controllers.py b/sf_manufacturing/controllers/controllers.py new file mode 100644 index 00000000..c4fd6b87 --- /dev/null +++ b/sf_manufacturing/controllers/controllers.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +import logging +import json +import base64 +from odoo import http +from odoo.http import request + + +class Manufacturing_Connect(http.Controller): + + @http.route('/AutoDeviceApi/GetWoInfo', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False, + cors="*") + def get_Work_Info(self, **kw): + """ + 自动化传递工单号获取工单信息 + :param kw: + :return: + """ + logging.info('get_Work_Info:%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['RfidCode'])]) + if workorder: + for item in workorder: + res['Datas'].append({ + 'BillId': item.production_id.name, + 'ProductionLine': item.production_line, + 'CraftName': item.name, + 'Quantity': 1, + '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_Work_Info error:%s' % e) + return json.JSONEncoder().encode(res) diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 7b54ebde..feb37787 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -608,7 +608,7 @@ class CNCprocessing(models.Model): estimated_processing_time = fields.Char('预计加工时间') remark = fields.Text('备注') workorder_id = fields.Many2one('mrp.workorder', string="工单") - workorder_id = fields.Many2one('mrp.production', string="制造定单") + production_id = fields.Many2one('mrp.production', string="制造订单") button_state = fields.Boolean(string='是否已经下发') # mrs下发编程单创建CNC加工 @@ -618,6 +618,8 @@ class CNCprocessing(models.Model): workorder = self.env['mrp.workorder'].search([('production_id.name', '=', ret['production_order_no']), ('processing_panel', '=', obj['processing_panel']), ('routing_type', '=', 'CNC加工')]) + logging.info('workorder:%s' % workorder) + logging.info('obj:%s' % obj) cnc_processing = self.env['sf.cnc.processing'].create({ 'workorder_id': workorder.id, 'sequence_number': obj['sequence_number'], @@ -633,7 +635,7 @@ class CNCprocessing(models.Model): 'estimated_processing_time': obj['estimated_processing_time'], 'remark': obj['remark'] }) - self.get_cnc_processing_file(ret['folder_name'], cnc_processing, workorder.processing_panel) + cnc_processing.get_cnc_processing_file(ret['folder_name'], cnc_processing, workorder.processing_panel) # cnc_workorder.state = 'done' cnc_workorder.work_state = '已编程' cnc_workorder.programming_state = '已编程' @@ -645,7 +647,7 @@ class CNCprocessing(models.Model): logging.info('folder_name:%s' % folder_name) serverdir = os.path.join('/tmp', folder_name, 'return', processing_panel) logging.info('serverdir:%s' % serverdir) - for root, files in os.walk(serverdir): + for root, dirs, files in os.walk(serverdir): for f in files: logging.info('f:%s' % f) if os.path.splitext(f)[1] == ".pdf": @@ -680,6 +682,7 @@ class CNCprocessing(models.Model): ftp = FtpController(str(ftp_resconfig['ftp_host']), int(ftp_resconfig['ftp_port']), ftp_resconfig['ftp_user'], ftp_resconfig['ftp_password']) download_state = ftp.download_file_tree(remotepath, serverdir) + logging.info('download_state:%s' % download_state) return download_state # 将nc文件存到attach的datas里 diff --git a/sf_manufacturing/models/product_template.py b/sf_manufacturing/models/product_template.py index ef635f78..42a392e2 100644 --- a/sf_manufacturing/models/product_template.py +++ b/sf_manufacturing/models/product_template.py @@ -437,7 +437,7 @@ class ResProductMo(models.Model): cutting_tool_blade_diameter = fields.Float('刃径/刃部直径(mm)') cutting_tool_cutter_arbor_diameter = fields.Float('刀杆直径(mm)') cutting_tool_min_machining_aperture = fields.Integer('最小加工孔径(mm)') - cutting_tool_install_blade_tip_num = fields.Integer('可装刀片数/齿数(个)', size=20) + cutting_tool_install_blade_tip_num = fields.Integer('可装刀片数/齿数(个)') cutting_tool_installing_structure = fields.Char('安装结构', size=20) cutting_tool_blade_id = fields.Many2one( 'sf.cutting_tool.standard.library', diff --git a/sf_mrs_connect/controllers/controllers.py b/sf_mrs_connect/controllers/controllers.py index bb6fd591..5cd28a08 100644 --- a/sf_mrs_connect/controllers/controllers.py +++ b/sf_mrs_connect/controllers/controllers.py @@ -22,22 +22,26 @@ class Sf_Mrs_Connect(http.Controller): datas = request.httprequest.data ret = json.loads(datas) ret = json.loads(ret['result']) + logging.info('下发编程单:%s' % ret) # 查询状态为进行中且类型为获取CNC加工程序的工单 cnc_production = request.env['mrp.production'].with_user( request.env.ref("base.user_admin")).search([('name', '=', ret['production_order_no'])]) + logging.info('制造订单号:%s' % cnc_production.name) if cnc_production: if ret['glb_file']: cnc_production.glb_file = base64.b64encode(ret['glb_file']) # 拉取所有加工面的程序文件 # i = 1 + for r in ret['processing_panel']: download_state = request.env['sf.cnc.processing'].with_user( request.env.ref("base.user_admin")).download_file_tmp( ret['folder_name'], r) - if not download_state: + if download_state == 0: res['status'] = -2 res['message'] = '制造订单号为%s的CNC程序文件从FTP拉取失败' % (cnc_production.name) return json.JSONEncoder().encode(res) + logging.info('创建cnc工单') request.env['sf.cnc.processing'].with_user( request.env.ref("base.user_admin")).cnc_processing_create(cnc_production, ret) return json.JSONEncoder().encode(res) diff --git a/sf_mrs_connect/models/ftp_operate.py b/sf_mrs_connect/models/ftp_operate.py index 2ef43467..341ec88e 100644 --- a/sf_mrs_connect/models/ftp_operate.py +++ b/sf_mrs_connect/models/ftp_operate.py @@ -35,8 +35,9 @@ class FtpController(): server = os.path.join(serverdir, file) if file.find(".") != -1: self.download_file(server, file) + return 1 except Exception: - return False + return 0 # 下载指定目录下的指定文件 def download_file(self, serverfile, remotefile): diff --git a/sf_mrs_connect/models/sync_common.py b/sf_mrs_connect/models/sync_common.py index b23b87b2..df9437ba 100644 --- a/sf_mrs_connect/models/sync_common.py +++ b/sf_mrs_connect/models/sync_common.py @@ -1465,7 +1465,7 @@ class SyncFixtureModel(models.Model): if result.get('fixture_model_yesterday_list'): for item in result['fixture_model_yesterday_list']: if item: - fixture_model = self.search([("code", '=', item['code'])]) + fixture_model = self.search([("code", '=', item['code']), ('active', 'in', [True, False])]) zero_chuck_list = [] for zero_chuck_id in item['zero_chuck_ids']: zero_chuck_list.append( @@ -1520,6 +1520,17 @@ class SyncFixtureModel(models.Model): "active": item['active'], }) else: + fixture_model.write({ + "zero_chuck_ids": [(5, 0, 0)], + "zero_tray_ids": [(5, 0, 0)], + "pneumatic_fixture_ids": [(5, 0, 0)], + "jaw_vice_fixture_ids": [(5, 0, 0)], + "magnet_fixture_ids": [(5, 0, 0)], + "adapter_board_fixture_ids": [(5, 0, 0)], + "scroll_chuck_ids": [(5, 0, 0)], + }) + self.env['sf.fixture.materials.basic.parameters'].sudo().search( + [('fixture_model_id', '=', False)]).unlink() fixture_model.write({ "name": item['name'], "code": item['code'], @@ -1555,7 +1566,7 @@ class SyncFixtureModel(models.Model): if result.get('fixture_model_all_list'): for item in result['fixture_model_all_list']: if item: - fixture_model = self.search([("code", '=', item['code'])]) + fixture_model = self.search([('code', '=', item['code']), ('active', 'in', [True, False])]) zero_chuck_list = [] for zero_chuck_id in item['zero_chuck_ids']: zero_chuck_list.append( @@ -1610,6 +1621,17 @@ class SyncFixtureModel(models.Model): "active": item['active'], }) else: + fixture_model.write({ + "zero_chuck_ids": [(5, 0, 0)], + "zero_tray_ids": [(5, 0, 0)], + "pneumatic_fixture_ids": [(5, 0, 0)], + "jaw_vice_fixture_ids": [(5, 0, 0)], + "magnet_fixture_ids": [(5, 0, 0)], + "adapter_board_fixture_ids": [(5, 0, 0)], + "scroll_chuck_ids": [(5, 0, 0)], + }) + self.env['sf.fixture.materials.basic.parameters'].sudo().search( + [('fixture_model_id', '=', False)]).unlink() fixture_model.write({ "name": item['name'], "code": item['code'], diff --git a/sf_quality/security/ir.model.access.csv b/sf_quality/security/ir.model.access.csv index 8e91f577..4374715d 100644 --- a/sf_quality/security/ir.model.access.csv +++ b/sf_quality/security/ir.model.access.csv @@ -12,6 +12,8 @@ access_quality_check_group_quality,quality_check_group_quality,quality.model_qua access_quality_check_group_quality_director,quality_check_group_quality_director,quality.model_quality_check,sf_base.group_quality_director,1,1,1,0 access_quality_check_group_plan_dispatch,quality_check_group_plan_dispatch,quality.model_quality_check,sf_base.group_plan_dispatch,1,0,0,0 access_quality_check_group_plan_director,quality_check_group_plan_director,quality.model_quality_check,sf_base.group_plan_director,1,0,0,0 +access_quality_check_group_purchase,quality_check_group_purchase,quality.model_quality_check,sf_base.group_purchase,1,0,0,0 +access_quality_check_group_purchase_director,quality_check_group_purchase_director,quality.model_quality_check,sf_base.group_purchase_director,1,0,0,0 access_quality_check_group_sf_equipment_user,quality_check_group_sf_equipment_user,quality.model_quality_check,sf_base.group_sf_equipment_user,1,0,0,0 access_quality_check_group_sf_tool_user,quality_check_group_sf_tool_user,quality.model_quality_check,sf_base.group_sf_tool_user,1,0,0,0 access_quality_check_group_sf_order_user,quality_check_group_sf_order_user,quality.model_quality_check,sf_base.group_sf_order_user,1,0,0,0 @@ -64,4 +66,8 @@ access_quality_reason_type_group_quality_director,quality_reason_group_quality_d access_quality_alert_stage,quality.alert.stage,quality.model_quality_alert_stage,sf_base.group_plan_dispatch,1,0,0,0 +access_stock_move_group_quality,stock_move_group_quality,stock.model_stock_move,sf_base.group_quality,1,1,0,0 +access_stock_move_group_quality_director,stock_move_group_quality_director,stock.model_stock_move,sf_base.group_quality_director,1,1,0,0 + + diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index 29a9be13..d2e97272 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -166,20 +166,20 @@ class ResPartnerToSale(models.Model): @api.constrains('name') def _check_name(self): - obj = self.sudo().search([('name', '=', self.name), ('id', '!=', self.id)]) + obj = self.sudo().search([('name', '=', self.name), ('id', '!=', self.id), ('active', '=', True)]) if obj: raise UserError('该名称已存在,请重新输入') @api.constrains('vat') def _check_vat(self): - obj = self.sudo().search([('vat', '=', self.vat), ('id', '!=', self.id)]) + obj = self.sudo().search([('vat', '=', self.vat), ('id', '!=', self.id), ('active', '=', True)]) if obj: raise UserError('该税ID已存在,请重新输入') @api.constrains('email') def _check_email(self): if self.customer_rank > 0: - obj = self.sudo().search([('email', '=', self.email), ('id', '!=', self.id)]) + obj = self.sudo().search([('email', '=', self.email), ('id', '!=', self.id), ('active', '=', True)]) if obj: raise UserError('该邮箱已存在,请重新输入') @@ -197,7 +197,7 @@ class ResPartnerToSale(models.Model): else: domain = [('id', '=', False)] return self._search(domain, limit=limit, access_rights_uid=name_get_uid) - elif self._context.get('is_supplier'): + elif self._context.get('is_supplier') or self.env.user.has_group('sf_base.group_purchase_director'): if self.env.user.has_group('sf_base.group_purchase_director'): domain = [('supplier_rank', '>', 0)] elif self.env.user.has_group('sf_base.group_purchase'): @@ -240,7 +240,7 @@ class ResUserToSale(models.Model): return self._search(domain, limit=limit, access_rights_uid=name_get_uid) elif self._context.get('supplier_rank'): if self.env.user.has_group('sf_base.group_purchase_director'): - domain = [('supplier_rank', '>', 0)] + domain = [] elif self.env.user.has_group('sf_base.group_purchase'): if self.id != self.env.user.id: domain = [('id', '=', self.id)] diff --git a/sf_sale/security/ir.model.access.csv b/sf_sale/security/ir.model.access.csv index e6b69761..7e893864 100644 --- a/sf_sale/security/ir.model.access.csv +++ b/sf_sale/security/ir.model.access.csv @@ -37,16 +37,16 @@ access_stock_move_group_purchase,stock_move_group_purchase,stock.model_stock_mov access_stock_move_group_purchase_director,stock_move_group_purchase_director,stock.model_stock_move,sf_base.group_purchase_director,1,0,0,0 access_stock_warehouse_orderpoint_group_sale_salemanager,stock_warehouse_orderpoint_group_sale_salemanager,stock.model_stock_warehouse_orderpoint,sf_base.group_sale_salemanager,1,0,0,0 access_stock_warehouse_orderpoint_group_sale_director,stock_warehouse_orderpoint_group_sale_director,stock.model_stock_warehouse_orderpoint,sf_base.group_sale_director,1,0,0,0 -access_stock_warehouse_orderpoint_group_purchase,stock_warehouse_orderpoint_group_purchase,stock.model_stock_warehouse_orderpoint,sf_base.group_purchase,1,0,0,0 -access_stock_warehouse_orderpoint_group_purchase_director,stock_warehouse_orderpoint_group_purchase_director,stock.model_stock_warehouse_orderpoint,sf_base.group_purchase_director,1,0,0,0 +access_stock_warehouse_orderpoint_group_purchase,stock_warehouse_orderpoint_group_purchase,stock.model_stock_warehouse_orderpoint,sf_base.group_purchase,1,1,0,0 +access_stock_warehouse_orderpoint_group_purchase_director,stock_warehouse_orderpoint_group_purchase_director,stock.model_stock_warehouse_orderpoint,sf_base.group_purchase_director,1,1,0,0 access_uom_uom_group_sale_salemanager,uom_uom_group_sale_salemanager,uom.model_uom_uom,sf_base.group_sale_salemanager,1,0,0,0 access_uom_uom_group_sale_director,uom_uom_group_sale_director,uom.model_uom_uom,sf_base.group_sale_director,1,1,1,0 access_uom_uom_group_purchase,uom_uom_group_purchase,uom.model_uom_uom,sf_base.group_purchase,1,0,0,0 -access_uom_uom_group_purchase_director,uom_uom_group_purchase_director,uom.model_uom_uom,sf_base.group_purchase_director,1,0,0,0 +access_uom_uom_group_purchase_director,uom_uom_group_purchase_director,uom.model_uom_uom,sf_base.group_purchase_director,1,1,1,0 access_uom_category_group_sale_salemanager,uom_category_group_sale_salemanager,uom.model_uom_category,sf_base.group_sale_salemanager,1,0,0,0 access_uom_category_group_sale_director,uom_category_group_sale_director,uom.model_uom_category,sf_base.group_sale_director,1,1,1,0 access_uom_category_group_purchase,uom_category_group_purchase,uom.model_uom_category,sf_base.group_purchase,1,0,0,0 -access_uom_category_group_purchase_director,uom_category_group_purchase_director,uom.model_uom_category,sf_base.group_purchase_director,1,0,0,0 +access_uom_category_group_purchase_director,uom_category_group_purchase_director,uom.model_uom_category,sf_base.group_purchase_director,1,1,1,0 access_sale_order_check_wizard_group_sale_salemanager,sale_order_check_wizard_group_sale_salemanager,model_sale_order_check_wizard,sf_base.group_sale_salemanager,1,1,1,0 access_sale_order_check_wizard_group_sale_director,sale_order_check_wizard_group_sale_director,model_sale_order_check_wizard,sf_base.group_sale_director,1,1,1,0 access_account_move_line_group_sale_salemanager,account_move_line_group_sale_salemanager,account.model_account_move_line,sf_base.group_sale_salemanager,1,1,1,0 @@ -81,5 +81,9 @@ access_sale_advance_payment_inv_group_sale_salemanager,sale_advance_payment_inv_ access_sale_advance_payment_inv_group_sale_director,sale_advance_payment_inv_group_sale_director,sale.model_sale_advance_payment_inv,sf_base.group_sale_director,1,1,1,0 access_sale_report_group_sale_salemanager,sale_report_group_sale_salemanager,sale.model_sale_report,sf_base.group_sale_salemanager,1,0,1,0 access_sale_report_group_sale_director,sale_report_group_sale_director,sale.model_sale_report,sf_base.group_sale_director,1,0,1,0 +access_product_supplierinfo_group_purchase_director,product.supplierinfo group_purchase_director,product.model_product_supplierinfo,sf_base.group_purchase_director,1,1,1,0 +access_product_category_group_purchase_director,product.category group_purchase_director,product.model_product_category,sf_base.group_purchase_director,1,1,1,0 + + diff --git a/sf_sale/views/sale_order_view.xml b/sf_sale/views/sale_order_view.xml index bfbf5520..247bbc75 100644 --- a/sf_sale/views/sale_order_view.xml +++ b/sf_sale/views/sale_order_view.xml @@ -54,6 +54,9 @@ sale.order + + +