diff --git a/sf_base/models/basic_parameters_fixture.py b/sf_base/models/basic_parameters_fixture.py index 0dfb4b6d..57d55bde 100644 --- a/sf_base/models/basic_parameters_fixture.py +++ b/sf_base/models/basic_parameters_fixture.py @@ -59,7 +59,7 @@ class BasicParametersFixture(models.Model): magnetic_field_height = fields.Float('磁场高度(mm)', digits=(16, 2)) magnetic_pole_plate_grinding_allowance = fields.Float('磁极板磨削余量(mm)', digits=(16, 2)) - # '转接板夹具' 字段 + # '转接板(锁板)夹具' 字段 screw_size = fields.Float('螺牙大小(mm)', digits=(16, 2)) via_hole_diameter = fields.Float('过孔直径(mm)', digits=(16, 2)) diff --git a/sf_base/models/fixture.py b/sf_base/models/fixture.py index 91aec75e..d6455550 100644 --- a/sf_base/models/fixture.py +++ b/sf_base/models/fixture.py @@ -45,7 +45,7 @@ class FixtureModel(models.Model): magnet_fixture_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id', string='磁吸夹具基本参数') adapter_board_fixture_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id', - string='转接板夹具基本参数') + string='转接板(锁板)夹具基本参数') scroll_chuck_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id', string='三爪卡盘基本参数') @@ -67,7 +67,7 @@ class FixtureModel(models.Model): if fixture_material_id: if self.fixture_material_id.name == "气动夹具": code = self._get_code("JKM-C-JJWL-QDJJ-") - elif self.fixture_material_id.name == "转接板夹具": + 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-") diff --git a/sf_base/views/fixture_view.xml b/sf_base/views/fixture_view.xml index 15f43fb1..0a7d1e8e 100644 --- a/sf_base/views/fixture_view.xml +++ b/sf_base/views/fixture_view.xml @@ -341,7 +341,7 @@ + attrs="{'invisible': [('fixture_material_type', '!=', '转接板(锁板)夹具')]}"> diff --git a/sf_quality/security/ir.model.access.csv b/sf_quality/security/ir.model.access.csv index 45811bc7..8e91f577 100644 --- a/sf_quality/security/ir.model.access.csv +++ b/sf_quality/security/ir.model.access.csv @@ -1,6 +1,6 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_quality_point_group_quality,quality_point_group_quality,quality.model_quality_point,sf_base.group_quality,1,1,1,0 -access_quality_point_group_quality_director,quality_point_group_quality_director,quality.model_quality_point,sf_base.group_quality_director,1,1,0,0 +access_quality_point_group_quality_director,quality_point_group_quality_director,quality.model_quality_point,sf_base.group_quality_director,1,1,1,0 access_quality_point_group_plan_dispatch,quality_point_group_plan_dispatch,quality.model_quality_point,sf_base.group_plan_dispatch,1,0,0,0 access_quality_point_group_plan_director,quality_point_group_plan_director,quality.model_quality_point,sf_base.group_plan_director,1,0,0,0 access_quality_point_group_sf_equipment_user,quality_point_group_sf_equipment_user,quality.model_quality_point,sf_base.group_sf_equipment_user,1,0,0,0 @@ -30,8 +30,8 @@ access_quality_alert_group_sf_mrp_manager,quality_alert_group_sf_mrp_manager,qua access_quality_alert_group_equipment_user,quality_alert_group_equipment_user,quality.model_quality_alert,sf_maintenance.sf_group_equipment_user,1,0,0,0 access_quality_alert_group_equipment_manager,quality_alert_group_equipment_manager,quality.model_quality_alert,sf_maintenance.sf_group_equipment_manager,1,0,0,0 -access_quality_alert_team_group_quality,quality_alert_team_group_quality,quality.model_quality_alert_team,sf_base.group_quality,1,1,1,0 -access_quality_alert_team_group_quality_director,quality_alert_team_group_quality_director,quality.model_quality_alert_team,sf_base.group_quality_director,1,1,0,0 +access_quality_alert_team_group_quality,quality_alert_team_group_quality,quality.model_quality_alert_team,sf_base.group_quality,1,0,0,0 +access_quality_alert_team_group_quality_director,quality_alert_team_group_quality_director,quality.model_quality_alert_team,sf_base.group_quality_director,1,1,1,0 access_quality_alert_team_group_plan_dispatch,quality_alert_team_group_plan_dispatch,quality.model_quality_alert_team,sf_base.group_plan_dispatch,1,0,0,0 access_quality_alert_team_group_plan_director,quality_alert_team_group_plan_director,quality.model_quality_alert_team,sf_base.group_plan_director,1,0,0,0 access_quality_alert_team_group_sf_equipment_user,quality_alert_team_group_sf_equipment_user,quality.model_quality_alert_team,sf_base.group_sf_equipment_user,1,0,0,0 @@ -51,13 +51,13 @@ access_product_template_group_equipment_user,product_template_group_equipment_us access_product_template_group_equipment_manager,product_template_group_equipment_manager,product.model_product_template,sf_maintenance.sf_group_equipment_manager,1,0,0,0 access_quality_alert_stage_group_quality,quality_alert_stage_group_quality,quality.model_quality_alert_stage,sf_base.group_quality,1,0,0,0 -access_quality_alert_stage_group_quality_director,quality_alert_stage_group_quality_director,quality.model_quality_alert_stage,sf_base.group_quality_director,1,0,0,0 +access_quality_alert_stage_group_quality_director,quality_alert_stage_group_quality_director,quality.model_quality_alert_stage,sf_base.group_quality_director,1,1,1,0 access_quality_point_test_type_group_quality,quality_point_test_type_group_quality,quality.model_quality_point_test_type,sf_base.group_quality,1,0,0,0 access_quality_point_test_type_group_quality_director,quality_point_test_type_group_quality_director,quality.model_quality_point_test_type,sf_base.group_quality_director,1,0,0,0 access_quality_tag_group_quality,quality_tag_group_quality,quality.model_quality_tag,sf_base.group_quality,1,0,0,0 -access_quality_tag_group_quality_director,quality_tag_group_quality_director,quality.model_quality_tag,sf_base.group_quality_director,1,0,0,0 +access_quality_tag_group_quality_director,quality_tag_group_quality_director,quality.model_quality_tag,sf_base.group_quality_director,1,1,1,0 access_quality_reason_type_group_quality,quality_reason_group_quality,quality.model_quality_reason,sf_base.group_quality,1,0,0,0 access_quality_reason_type_group_quality_director,quality_reason_group_quality_director,quality.model_quality_reason,sf_base.group_quality_director,1,0,0,0 diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index 8cbcbb31..e1d0bad0 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -86,6 +86,7 @@ class ResaleOrderLine(models.Model): _inherit = 'sale.order.line' model_glb_file = fields.Binary('模型的glb文件') + check_status = fields.Selection(related='order_id.check_status') class RePurchaseOrder(models.Model): @@ -144,17 +145,31 @@ 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'): + 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'): + customer = self.env['res.partner'].search( + [('supplier_rank', '>', 0), ('user_id', '=', self.env.user.id)]) + if customer: + ids = [t.id for t in customer] + domain = [('id', 'in', ids)] + else: + domain = [('id', '=', False)] + return self._search(domain, limit=limit, access_rights_uid=name_get_uid) return super()._name_search(name, args, operator, limit, name_get_uid) @api.onchange('user_id') def _get_salesman(self): if self.customer_rank > 0: - self.user_id = self.env.user.id + if self.env.user.has_group('sf_base.group_sale_salemanager'): + self.user_id = self.env.user.id @api.onchange('purchase_user_id') def _get_purchaseman(self): if self.supplier_rank > 0: - self.purchase_user_id = self.env.user.id + if self.env.user.has_group('sf_base.group_purchase'): + self.purchase_user_id = self.env.user.id class ResUserToSale(models.Model): @@ -166,7 +181,10 @@ class ResUserToSale(models.Model): if self.env.user.has_group('sf_base.group_sale_director'): domain = [] elif self.env.user.has_group('sf_base.group_sale_salemanager'): - domain = [('id', '=', self.env.user.id)] + if self.id != self.env.user.id: + domain = [('id', '=', self.id)] + else: + domain = [('id', '=', self.env.user.id)] 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'): diff --git a/sf_sale/security/group_security.xml b/sf_sale/security/group_security.xml index 431b872b..c6af4225 100644 --- a/sf_sale/security/group_security.xml +++ b/sf_sale/security/group_security.xml @@ -32,7 +32,7 @@ 销售经理查看自己的客户 - [('user_id','=',user.id),('customer_rank','>',0)] + [('user_id', '=', user.id),('customer_rank', '>', 0)] @@ -64,8 +64,9 @@ 采购总监查看所有的订单 - [(1,'=',1),('check_status','!=', False] + [(1,'=',1)] + diff --git a/sf_sale/security/ir.model.access.csv b/sf_sale/security/ir.model.access.csv index 3e3a8df0..569c146f 100644 --- a/sf_sale/security/ir.model.access.csv +++ b/sf_sale/security/ir.model.access.csv @@ -29,6 +29,8 @@ access_mrp_bom_group_sale_salemanager,mrp_bom_group_sale_salemanager,mrp.model_m access_mrp_bom_group_sale_director,mrp_bom_group_sale_director,mrp.model_mrp_bom,sf_base.group_sale_director,1,0,0,0 access_mrp_bom_group_purchase,mrp_bom_group_purchase,mrp.model_mrp_bom,sf_base.group_purchase,1,0,0,0 access_mrp_bom_group_purchase_director,mrp_bom_group_purchase_director,mrp.model_mrp_bom,sf_base.group_purchase_director,1,0,0,0 +access_mrp_bom_group_quality,mrp_bom_group_quality,mrp.model_mrp_bom,sf_base.group_quality,1,0,0,0 +access_mrp_bom_group_quality_director,mrp_bom_group_quality_director,mrp.model_mrp_bom,sf_base.group_quality_director,1,0,0,0 access_stock_move_group_sale_salemanager,stock_move_group_sale_salemanager,stock.model_stock_move,sf_base.group_sale_salemanager,1,0,0,0 access_stock_move_group_sale_director,stock_move_group_sale_director,stock.model_stock_move,sf_base.group_sale_director,1,0,0,0 access_stock_move_group_purchase,stock_move_group_purchase,stock.model_stock_move,sf_base.group_purchase,1,0,0,0 @@ -68,4 +70,10 @@ access_purchase_order_wizard_group_purchase_director,purchase_order_wizard_group access_crm_tag_group_sale_salemanager,crm_tag_group_sale_salemanager,sales_team.model_crm_tag,sf_base.group_sale_salemanager,1,0,0,0 access_crm_tag_group_sale_director,crm_tag_group_sale_director,sales_team.model_crm_tag,sf_base.group_sale_director,1,1,1,0 -access_sale_order,sale.order,sale.model_sale_order,sf_base.group_plan_dispatch,1,0,0,0 \ No newline at end of file +access_sale_order,sale.order,sale.model_sale_order,sf_base.group_plan_dispatch,1,0,0,0 +access_res_partner_group_purchase,res_partner_group_purchase,base.model_res_partner,sf_base.group_purchase,1,1,1,0 +access_res_partner_group_purchase_director,res_partner_group_purchase_director,base.model_res_partner,sf_base.group_purchase_director,1,1,1,0 +access_sale_advance_payment_inv_group_sale_salemanager,sale_advance_payment_inv_group_sale_salemanager,sale.model_sale_advance_payment_inv,sf_base.group_sale_salemanager,1,1,1,0 +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 + + diff --git a/sf_sale/views/purchase_order_view.xml b/sf_sale/views/purchase_order_view.xml index 93b59032..51dfaf63 100644 --- a/sf_sale/views/purchase_order_view.xml +++ b/sf_sale/views/purchase_order_view.xml @@ -6,6 +6,9 @@ purchase.order + + + diff --git a/sf_sale/views/res_partner_view.xml b/sf_sale/views/res_partner_view.xml index 2ab384eb..c7bb79af 100644 --- a/sf_sale/views/res_partner_view.xml +++ b/sf_sale/views/res_partner_view.xml @@ -6,6 +6,9 @@ res.partner +
+ false +
@@ -42,7 +45,7 @@ + attrs="{'required' : [('customer_rank','>', 0)]}"/> 1 @@ -69,6 +72,9 @@ res.partner + + false + diff --git a/sf_sale/views/sale_order_view.xml b/sf_sale/views/sale_order_view.xml index d1f0dfb8..db94b2c9 100644 --- a/sf_sale/views/sale_order_view.xml +++ b/sf_sale/views/sale_order_view.xml @@ -36,8 +36,7 @@ attrs="{'invisible': ['|','&',('check_status', '!=', 'approved'),('state', 'in', ['draft','cancel']),'&',('check_status', '=', 'approved'),('state', 'in', ['sale','cancel'])]}"/> - {'invisible': ['|',('check_status', '!=', 'approved'),('schedule_status', - 'not in', ['to schedule',False])]} + {'invisible': [('check_status', '=', False)]} @@ -63,7 +62,7 @@ + string="模型文件" attrs="{'readonly': [('state', 'in', ['draft'])]}"/> {'readonly': [('state', 'in', ['cancel','sale'])]} diff --git a/sf_tool_management/models/base.py b/sf_tool_management/models/base.py index e1d1010b..9f5721a5 100644 --- a/sf_tool_management/models/base.py +++ b/sf_tool_management/models/base.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- +import re from datetime import timedelta - from odoo import fields, models, api from odoo import SUPERUSER_ID from odoo.exceptions import ValidationError @@ -234,6 +234,7 @@ class FunctionalToolWarning(models.Model): class StockMoveLine(models.Model): _inherit = 'stock.move.line' _description = '功能刀具出入库记录' + _order = 'install_tool_time desc' functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称') functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', store=True, @@ -253,11 +254,11 @@ class RealTimeDistributionOfFunctionalTools(models.Model): _name = 'sf.real.time.distribution.of.functional.tools' _description = '功能刀具安全库存' - name = fields.Char('功能刀具名称') - sf_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', + name = fields.Char('功能刀具名称', readonly=False) + sf_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=False, group_expand='_read_mrs_cutting_tool_type_ids', store=True) - diameter = fields.Integer(string='刀具直径(mm)') - knife_tip_r_angle = fields.Float(string='刀尖R角(mm)') + diameter = fields.Integer(string='刀具直径(mm)', readonly=False) + knife_tip_r_angle = fields.Float(string='刀尖R角(mm)', readonly=False) tool_stock_num = fields.Integer(string='刀具房数量') side_shelf_num = fields.Integer(string='线边刀库数量') on_tool_stock_num = fields.Integer(string='机内刀库数量') @@ -266,10 +267,10 @@ class RealTimeDistributionOfFunctionalTools(models.Model): max_stock_num = fields.Integer('最高库存量') batch_replenishment_num = fields.Integer('批次补货量', readonly=True, compute='_compute_batch_replenishment_num') unit = fields.Char('单位') - image = fields.Binary('图片') + image = fields.Binary('图片', readonly=False) - coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精') - whether_standard_knife = fields.Boolean(string='是否标准刀', default=True) + coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], string='粗/中/精', readonly=False) + whether_standard_knife = fields.Boolean(string='是否标准刀', default=True, readonly=False) # 能力特征信息 suitable_machining_method_ids = fields.Many2many( 'maintenance.equipment.image', 'rel_machining_product_template_distribution', '适合加工方式', @@ -299,7 +300,7 @@ class RealTimeDistributionOfFunctionalTools(models.Model): @api.constrains('min_stock_num', 'max_stock_num') def _check_stock_num(self): for obj in self: - if obj.min_stock_num > obj.min_stock_num: + if obj.min_stock_num > obj.max_stock_num: raise ValidationError('【最低安全库存】不能高于【最高安全库存】!!!') @api.model @@ -326,31 +327,31 @@ class RealTimeDistributionOfFunctionalTools(models.Model): if tool.tool_stock_total < tool.min_stock_num: tool.batch_replenishment_num = tool.max_stock_num - tool.tool_stock_total # 根据判断创建功能刀具组装单 - if not tool.sf_functional_tool_assembly_ids: + if not tool.sf_functional_tool_assembly_ids and re.match(r'^\d+$', str(tool.id)): for i in range(tool.batch_replenishment_num): - tool.create_functional_tool_assembly() + tool.create_functional_tool_assembly(tool) print(i, ": ", tool.sf_functional_tool_assembly_ids) else: tool.batch_replenishment_num = 0 - def create_functional_tool_assembly(self): + def create_functional_tool_assembly(self, tool): """ 创建功能刀具组装单 """ - functional_tool_assembly = self.env['sf.functional.tool.assembly'].sudo().create({ - 'functional_tool_name': self.name, - 'functional_tool_type_id': self.sf_cutting_tool_type_id.id, - 'functional_tool_diameter': self.diameter, - 'knife_tip_r_angle': self.knife_tip_r_angle, - 'coarse_middle_thin': self.coarse_middle_thin, + functional_tool_assembly = tool.env['sf.functional.tool.assembly'].sudo().create({ + 'functional_tool_name': tool.name, + 'functional_tool_type_id': tool.sf_cutting_tool_type_id.id, + 'functional_tool_diameter': tool.diameter, + 'knife_tip_r_angle': tool.knife_tip_r_angle, + 'coarse_middle_thin': tool.coarse_middle_thin, 'loading_task_source': '2', 'use_tool_time': fields.Datetime.now() + timedelta(hours=4), 'applicant': '系统自动', 'apply_time': fields.Datetime.now(), - 'whether_standard_knife': self.whether_standard_knife, + 'whether_standard_knife': tool.whether_standard_knife, 'reason_for_applying': '安全库存', }) - self.sf_functional_tool_assembly_ids = [(4, functional_tool_assembly.id)] + tool.sf_functional_tool_assembly_ids = [(4, functional_tool_assembly.id)] def estimate_functional_tool_assembly_ids(self, tool): """ @@ -394,6 +395,15 @@ class RealTimeDistributionOfFunctionalTools(models.Model): vals['sf_functional_cutting_tool_entity_ids'] = sf_functional_cutting_tool_entity_ids.ids self.env['sf.real.time.distribution.of.functional.tools'].create(vals) + status_create = fields.Boolean('是否是新增状态', default=True) + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + vals['status_create'] = False + records = super(RealTimeDistributionOfFunctionalTools, self).create(vals_list) + return records + class MachineTableToolChangingApply(models.Model): _name = 'sf.machine.table.tool.changing.apply' diff --git a/sf_tool_management/views/tool_base_views.xml b/sf_tool_management/views/tool_base_views.xml index 86c42c92..42bb103b 100644 --- a/sf_tool_management/views/tool_base_views.xml +++ b/sf_tool_management/views/tool_base_views.xml @@ -310,22 +310,29 @@

- +

+ - - - - - + + + + + - + @@ -366,7 +373,7 @@ - + @@ -1162,7 +1169,7 @@ - + @@ -1173,7 +1180,7 @@ ir.actions.act_window sf.functional.tool.assembly tree,form,search - + {'search_default_no_assemble_status':1}
diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py index 89b9f854..f98da62e 100644 --- a/sf_tool_management/wizard/wizard.py +++ b/sf_tool_management/wizard/wizard.py @@ -537,6 +537,8 @@ class StockPicking(models.Model): self.env['stock.move.line'].create({ 'picking_id': picking_id.id, 'product_id': stock_lot.product_id.id, + 'location_id': picking_id.location_id.id, + 'location_dest_id': picking_id.location_dest_id.id, 'lot_id': stock_lot.id, 'qty_done': 1, 'functional_tool_name_id': functional_tool_assembly.id