diff --git a/sf_bf_connect/models/jd_eclp.py b/sf_bf_connect/models/jd_eclp.py index d755c7be..6d6a0e38 100644 --- a/sf_bf_connect/models/jd_eclp.py +++ b/sf_bf_connect/models/jd_eclp.py @@ -56,7 +56,7 @@ class JdEclp(models.Model): """ res = super(JdEclp, self).button_validate() if self.check_out == 'OUT': - if self.logistics_way != '自提': + if self.logistics_way != '自提' and self.logistics_way: if self.logistics_status != '2': raise ValidationError('非自提订单,必须先下物流单,并获取物流面单后才可出库!') return res diff --git a/sf_dlm/views/product_template_view.xml b/sf_dlm/views/product_template_view.xml index c62ae8cd..bbff27e9 100644 --- a/sf_dlm/views/product_template_view.xml +++ b/sf_dlm/views/product_template_view.xml @@ -55,7 +55,7 @@ - stock.group_stock_user,product.group_stock_packaging,sf_base.group_sale_salemanager,sf_base.group_sale_director,sf_base.group_purchase,sf_base.group_purchase_director + stock.group_stock_user,product.group_stock_packaging,sf_base.group_sale_salemanager,sf_base.group_sale_director,sf_base.group_purchase,sf_base.group_purchase_director,sf_base.group_plan_dispatch diff --git a/sf_oca/models/tier_validation.py b/sf_oca/models/tier_validation.py index 1ca4c29c..02581609 100644 --- a/sf_oca/models/tier_validation.py +++ b/sf_oca/models/tier_validation.py @@ -1,13 +1,7 @@ # Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from ast import literal_eval - -from lxml import etree - from odoo import _, api, fields, models -from odoo.exceptions import ValidationError -from odoo.tools.misc import frozendict class TierValidation(models.AbstractModel): diff --git a/sf_oca/templates/tier_validation_templates.xml b/sf_oca/templates/tier_validation_templates.xml index 24108bcc..8ec96ca7 100644 --- a/sf_oca/templates/tier_validation_templates.xml +++ b/sf_oca/templates/tier_validation_templates.xml @@ -1,122 +1,34 @@ - - - - - + + + 发起审批 + + + 取消审批 + {'invisible': ['|','|',('review_ids', '=', []),('#{state_field}', + '#{state_operator}', #{state_value}), ('validated', '=', True)]} + + - - - - - - + + + + 这个单据需要验证. + + - - 这个单据需要验证. - - - - + + 审批已通过. - - - - - Operation has been - validated - ! - - - - - - Operation has been - rejected - . - - - - - - - - - - - - - - - - - - - - - - - - - - + + + 验证 + + + 拒绝 diff --git a/sf_plan/models/custom_plan.py b/sf_plan/models/custom_plan.py index 73f8c5c7..fd1e231a 100644 --- a/sf_plan/models/custom_plan.py +++ b/sf_plan/models/custom_plan.py @@ -230,8 +230,8 @@ class sf_production_plan(models.Model): record.env['mrp.production'].sudo().browse(i).schedule_state = '已排' # record.production_id.date_planned_start = record.date_planned_start # record.production_id.date_planned_finished = record.date_planned_finished - record.production_id.production_line_id = record.production_line_id.id - record.production_id.workorder_ids.filtered( + record.sudo().production_id.production_line_id = record.production_line_id.id + record.sudo().production_id.workorder_ids.filtered( lambda b: b.routing_type == "装夹预调").workpiece_delivery_ids.write( {'production_line_id': record.production_line_id.id, 'plan_start_processing_time': record.date_planned_start}) diff --git a/sf_tool_management/models/functional_tool.py b/sf_tool_management/models/functional_tool.py index 989b4578..88e8ea03 100644 --- a/sf_tool_management/models/functional_tool.py +++ b/sf_tool_management/models/functional_tool.py @@ -11,6 +11,7 @@ class FunctionalCuttingToolEntity(models.Model): _description = '功能刀具列表' functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具组装单', readonly=True) + tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组', related='functional_tool_name_id.tool_groups_id') code = fields.Char('编码') rfid = fields.Char('Rfid', readonly=True) @@ -469,10 +470,7 @@ class RealTimeDistributionOfFunctionalTools(models.Model): """ # 根据功能刀具名称、刀具组、直径或尖刀R角、粗/中/精查询该功能刀具是否已经存在 record = self.env['sf.real.time.distribution.of.functional.tools'].search( - [('functional_name_id', '=', vals['functional_name_id']), - ('sf_cutting_tool_type_id', '=', vals['sf_cutting_tool_type_id']), - ('diameter', '=', vals['diameter']), ('knife_tip_r_angle', '=', vals['knife_tip_r_angle']), - ('coarse_middle_thin', '=', vals['coarse_middle_thin']), ('tool_groups_id', '=', vals['tool_groups_id'])]) + [('functional_name_id', '=', vals['functional_name_id'])]) if len(record) > 0: for obj in record: obj.write({'sf_functional_cutting_tool_entity_ids': [(4, sf_functional_cutting_tool_entity_ids.id)]}) diff --git a/sf_tool_management/models/functional_tool_enroll.py b/sf_tool_management/models/functional_tool_enroll.py index 61ca4731..8a2a7965 100644 --- a/sf_tool_management/models/functional_tool_enroll.py +++ b/sf_tool_management/models/functional_tool_enroll.py @@ -60,6 +60,7 @@ class StockLot(models.Model): _description = '刀具物料序列号注册' def enroll_tool_material_stock(self): + logging.info('调用刀具物料序列号注册接口: enroll_tool_material_stock()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -69,6 +70,7 @@ class StockLot(models.Model): self._get_sync_stock_lot(objs_all, str_url, token, headers) def sync_enroll_tool_material_stock_all(self): + logging.info('调用刀具物料序列号注册接口: sync_enroll_tool_material_stock_all()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -104,6 +106,7 @@ class ToolMaterial(models.Model): crea_url = '/api/tool_material/create' def enroll_tool_material(self): + logging.info('调用刀具物料注册接口: enroll_tool_material()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -113,6 +116,7 @@ class ToolMaterial(models.Model): self._get_sync_tool_material_search(objs_all, str_url, token, headers) def sync_enroll_tool_material_all(self): + logging.info('调用刀具物料注册接口: sync_enroll_tool_material_all()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -163,6 +167,7 @@ class FunctionalCuttingToolEntity(models.Model): # 注册同步功能刀具列表 def enroll_functional_tool_entity(self): + logging.info('调用功能刀具列表注册接口: enroll_functional_tool_entity()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -172,6 +177,7 @@ class FunctionalCuttingToolEntity(models.Model): self._get_sync_functional_cutting_tool_entity(objs_all, str_url, token, headers) def esync_enroll_functional_tool_entity_all(self): + logging.info('调用功能刀具列表注册接口: esync_enroll_functional_tool_entity_all()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -256,6 +262,7 @@ class FunctionalToolWarning(models.Model): # 注册同步功能刀具预警 def enroll_functional_tool_warning(self): + logging.info('调用功能刀具预警注册接口: enroll_functional_tool_warning()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -265,6 +272,7 @@ class FunctionalToolWarning(models.Model): self.get_sync_functional_tool_warning(objs_all, str_url, token, headers) def sync_enroll_functional_tool_warning_all(self): + logging.info('调用功能刀具预警注册接口: sync_enroll_functional_tool_warning_all()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -329,6 +337,7 @@ class StockMoveLine(models.Model): # 注册同步功能刀具出入库记录 def enroll_functional_tool_move(self): + logging.info('调用功能刀具出入库记录注册接口: enroll_functional_tool_move()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -338,6 +347,7 @@ class StockMoveLine(models.Model): self.get_sync_stock_move_line(objs_all, str_url, token, headers) def sync_enroll_functional_tool_move_all(self): + logging.info('调用功能刀具出入库记录注册接口: sync_enroll_functional_tool_move_all()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -393,6 +403,7 @@ class RealTimeDistributionFunctionalTools(models.Model): # 注册同步功能刀具预警 def enroll_functional_tool_real_time_distribution(self): + logging.info('调用功能刀具安全库存注册接口: enroll_functional_tool_real_time_distribution()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] @@ -402,6 +413,7 @@ class RealTimeDistributionFunctionalTools(models.Model): self.get_sync_real_time_distribution_functional_tools(objs_all, str_url, token, headers) def sync_enroll_functional_tool_real_time_distribution_all(self): + logging.info('调用功能刀具安全库存注册接口: sync_enroll_functional_tool_real_time_distribution_all()') sf_sync_config = self.env['res.config.settings'].get_values() token = sf_sync_config['token'] sf_secret_key = sf_sync_config['sf_secret_key'] diff --git a/sf_tool_management/security/ir.model.access.csv b/sf_tool_management/security/ir.model.access.csv index 58879f72..26b45aeb 100644 --- a/sf_tool_management/security/ir.model.access.csv +++ b/sf_tool_management/security/ir.model.access.csv @@ -1,4 +1,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_sf_functional_cutting_tool_entity,sf.functional.cutting.tool.entity,model_sf_functional_cutting_tool_entity,base.group_user,1,1,1,0 access_sf_functional_cutting_tool_entity,sf.functional.cutting.tool.entity,model_sf_functional_cutting_tool_entity,sf_base.group_sf_tool_user,1,1,1,0 access_sf_functional_cutting_tool_entity_group_plan_dispatch,sf.functional.cutting.tool.entity,model_sf_functional_cutting_tool_entity,sf_base.group_plan_dispatch,1,0,0,0 access_sf_functional_cutting_tool_entity_group_sf_order_user,sf.functional.cutting.tool.entity,model_sf_functional_cutting_tool_entity,sf_base.group_sf_order_user,1,0,0,0 @@ -21,9 +22,9 @@ access_sf_tool_change_requirement_information_group_plan_dispatch,sf.tool.change access_sf_tool_transfer_request_information,sf.tool.transfer.request.information,model_sf_tool_transfer_request_information,sf_base.group_sf_tool_user,1,1,1,0 access_sf_tool_transfer_request_information_group_plan_dispatch,sf.tool.transfer.request.information,model_sf_tool_transfer_request_information,sf_base.group_plan_dispatch,1,0,0,0 -access_sf_functional_tool_assembly,sf.functional.tool.assembly,model_sf_functional_tool_assembly,sf_base.group_sf_tool_user,1,1,1,0 +access_sf_functional_tool_assembly_group_sf_tool_user,sf.functional.tool.assembly_group_sf_tool_user,model_sf_functional_tool_assembly,sf_base.group_sf_tool_user,1,1,1,0 +access_sf_functional_tool_assembly_group_user,sf.functional.tool.assembly_group_user,model_sf_functional_tool_assembly,base.group_user,1,0,0,0 access_sf_functional_tool_assembly_group_plan_dispatch,sf.functional.tool.assembly,model_sf_functional_tool_assembly,sf_base.group_plan_dispatch,1,0,0,0 - access_sf_functional_tool_assembly_order,sf.functional.tool.assembly.order,model_sf_functional_tool_assembly_order,sf_base.group_sf_tool_user,1,1,1,0 access_sf_functional_tool_assembly_order_group_plan_dispatch,sf.functional.tool.assembly.order,model_sf_functional_tool_assembly_order,sf_base.group_plan_dispatch,1,0,0,0 @@ -34,5 +35,6 @@ access_sf_fixture_material_search,sf.fixture.material.search,model_sf_fixture_ma access_sf_fixture_material_search_group_plan_dispatch,sf.fixture.material.search,model_sf_fixture_material_search,sf_base.group_plan_dispatch,1,0,0,0 -access_sf_functional_tool_dismantle_group_sf_tool_user,sf.functional.tool.dismantle,model_sf_functional_tool_dismantle,sf_base.group_sf_tool_user,1,1,1,0 -access_sf_functional_tool_dismantle_group_plan_dispatch,sf.functional.tool.dismantle,model_sf_functional_tool_dismantle,sf_base.group_plan_dispatch,1,0,0,0 +access_sf_functional_tool_dismantle,sf.functional.tool.dismantle,model_sf_functional_tool_dismantle,base.group_user,1,1,1,0 +access_sf_functional_tool_dismantle_group_sf_tool_user,sf.functional.tool.dismantle_group_sf_tool_user,model_sf_functional_tool_dismantle,sf_base.group_sf_tool_user,1,1,1,0 +access_sf_functional_tool_dismantle_group_plan_dispatch,sf.functional.tool.dismantle_group_plan_dispatch,model_sf_functional_tool_dismantle,sf_base.group_plan_dispatch,1,0,0,0 diff --git a/sf_tool_management/views/functional_tool_views.xml b/sf_tool_management/views/functional_tool_views.xml index abad7539..093ada1f 100644 --- a/sf_tool_management/views/functional_tool_views.xml +++ b/sf_tool_management/views/functional_tool_views.xml @@ -400,6 +400,9 @@ + + + diff --git a/sf_tool_management/wizard/wizard.py b/sf_tool_management/wizard/wizard.py index cb32833a..f6cba36b 100644 --- a/sf_tool_management/wizard/wizard.py +++ b/sf_tool_management/wizard/wizard.py @@ -634,12 +634,7 @@ class FunctionalToolAssemblyOrder(models.TransientModel): record_1 = self.env['sf.functional.cutting.tool.entity'].create(desc_2) # 创建安全库存信息 self.env['sf.real.time.distribution.of.functional.tools'].create_or_edit_safety_stock({ - 'functional_name_id': self.after_name_id.id, - 'sf_cutting_tool_type_id': self.after_assembly_functional_tool_type_id.id, - 'tool_groups_id': self.after_tool_groups_id.id, - 'diameter': self.after_assembly_functional_tool_diameter, - 'knife_tip_r_angle': self.after_assembly_knife_tip_r_angle, - 'coarse_middle_thin': self.after_assembly_coarse_middle_thin, + 'functional_name_id': self.after_name_id.id }, record_1) # =====================修改功能刀具组装单、机床换刀申请、CAM工单程序用刀计划的状态============== @@ -820,7 +815,7 @@ class ProductProduct(models.Model): stock_location_id = self.env['stock.location'].search([('name', '=', '组装后')]) # 创建功能刀具该批次/序列号 库存移动和移动历史 stock_lot.create_stock_quant(location_inventory_id, stock_location_id, functional_tool_assembly.id, - self.assembly_order_code, obj, obj.after_tool_groups_id) + obj.assembly_order_code, obj, obj.after_tool_groups_id) return stock_lot
- - 这个单据需要验证. - - - - + + 审批已通过.
- - Operation has been - validated - ! -
- - Operation has been - rejected - . -