Accept Merge Request #780: (feature/制造代码优化 -> develop)

Merge Request: 增加刀具管理权限控制,刀具组权限控制,隐藏工单上原生按钮,修复只读权限后修改记录无权限问题等

Created By: @马广威
Accepted By: @马广威
URL: https://jikimo-hn.coding.net/p/jikimo_sfs/d/jikimo_sf/git/merge/780?initial=true
This commit is contained in:
马广威
2024-01-22 15:40:23 +08:00
committed by Coding
10 changed files with 125 additions and 93 deletions

View File

@@ -28,7 +28,7 @@ access_sf_sync_common,sf_sync_common,model_sf_sync_common,base.group_user,1,1,1,
access_sf_international_standards,sf_international_standards,model_sf_international_standards,base.group_user,1,1,1,1 access_sf_international_standards,sf_international_standards,model_sf_international_standards,base.group_user,1,1,1,1
access_material_apply,material_apply,model_material_apply,base.group_user,1,1,1,1 access_material_apply,material_apply,model_material_apply,base.group_user,1,1,1,1
access_sf_cutting_tool_standard_library,sf_cutting_tool_standard_library,model_sf_cutting_tool_standard_library,base.group_user,1,1,1,1 access_sf_cutting_tool_standard_library,sf_cutting_tool_standard_library,model_sf_cutting_tool_standard_library,base.group_user,1,1,1,1
access_sf_tool_groups,sf_tool_groups,model_sf_tool_groups,base.group_user,1,1,1,1
access_sf_tool_materials_basic_parameters,sf_tool_materials_basic_parameters,model_sf_tool_materials_basic_parameters,base.group_user,1,1,1,1 access_sf_tool_materials_basic_parameters,sf_tool_materials_basic_parameters,model_sf_tool_materials_basic_parameters,base.group_user,1,1,1,1
access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,1,1,1,1 access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,1,1,1,1
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,1 access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,1
@@ -77,6 +77,9 @@ access_purchase_order_line_group_purchase,access_purchase_order_line_group_purch
access_purchase_order_line_group_purchase_director,access_purchase_order_line_group_purchase_director,purchase.model_purchase_order_line,sf_base.group_purchase_director,1,1,1,0 access_purchase_order_line_group_purchase_director,access_purchase_order_line_group_purchase_director,purchase.model_purchase_order_line,sf_base.group_purchase_director,1,1,1,0
access_spindle_taper_type,spindle_taper_type,model_spindle_taper_type,base.group_user,1,1,1,1 access_spindle_taper_type,spindle_taper_type,model_spindle_taper_type,base.group_user,1,1,1,1
access_sf_tool_groups_group_plan_dispatch,sf_tool_groups,model_sf_tool_groups,sf_base.group_plan_dispatch,1,0,0,0
access_sf_tool_groups_group_sf_tool_user,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_tool_user,1,1,1,1
access_purchase_order,purchase.order,purchase.model_purchase_order,sf_base.group_plan_dispatch,1,0,0,0 access_purchase_order,purchase.order,purchase.model_purchase_order,sf_base.group_plan_dispatch,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
28 access_material_apply material_apply model_material_apply base.group_user 1 1 1 1
29 access_sf_cutting_tool_standard_library sf_cutting_tool_standard_library model_sf_cutting_tool_standard_library base.group_user 1 1 1 1
30 access_sf_tool_groups access_sf_tool_materials_basic_parameters sf_tool_groups sf_tool_materials_basic_parameters model_sf_tool_groups model_sf_tool_materials_basic_parameters base.group_user 1 1 1 1
31 access_sf_tool_materials_basic_parameters access_sf_cutting_speed sf_tool_materials_basic_parameters sf_cutting_speed model_sf_tool_materials_basic_parameters model_sf_cutting_speed base.group_user 1 1 1 1
32 access_sf_cutting_speed access_sf_feed_per_tooth sf_cutting_speed sf_feed_per_tooth model_sf_cutting_speed model_sf_feed_per_tooth base.group_user 1 1 1 1
33 access_sf_feed_per_tooth access_sf_ramping_angle sf_feed_per_tooth sf_ramping_angle model_sf_feed_per_tooth model_sf_ramping_angle base.group_user 1 1 1 1
34 access_sf_ramping_angle access_sf_cutting_width_depth sf_ramping_angle sf_cutting_width_depth model_sf_ramping_angle model_sf_cutting_width_depth base.group_user 1 1 1 1
77 access_res_partner access_purchase_order res.partner purchase.order base.model_res_partner purchase.model_purchase_order sf_base.group_plan_dispatch 1 0 0 0
78 access_purchase_order_line access_res_partner purchase.order.line res.partner purchase.model_purchase_order_line base.model_res_partner sf_base.group_plan_dispatch 1 0 0 0
79 access_account_move_line access_purchase_order_line account.move.line purchase.order.line account.model_account_move_line purchase.model_purchase_order_line sf_base.group_plan_dispatch 1 0 0 0
80 access_account_move_line account.move.line account.model_account_move_line sf_base.group_plan_dispatch 1 0 0 0
81
82
83
84
85

View File

@@ -495,7 +495,7 @@
<field name="name">刀具组</field> <field name="name">刀具组</field>
<field name="model">sf.tool.groups</field> <field name="model">sf.tool.groups</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree create="1" edit="1" delete="1" editable="bottom"> <tree editable="bottom">
<field name="name"/> <field name="name"/>
<field name="equipment_ids" widget="many2many_tags"/> <field name="equipment_ids" widget="many2many_tags"/>
<field name="remark"/> <field name="remark"/>

View File

@@ -107,16 +107,16 @@
<button name="button_start" type="object" string="开始" class="btn-success" <button name="button_start" type="object" string="开始" class="btn-success"
attrs="{'invisible': ['|', '|', '|','|','|', ('production_state','in', ('draft', 'done', attrs="{'invisible': ['|', '|', '|','|','|', ('production_state','in', ('draft', 'done',
'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')), 'cancel')), ('working_state', '=', 'blocked'), ('state', 'in', ('done', 'cancel')),
('is_user_working', '!=', False),('user_permissions','=',False),('name','=','获取CNC加工程序')]}"/> ('is_user_working', '!=', False),('user_permissions','=',False),('name','=','获取CNC加工程序')]}" groups="sf_base.group_sf_mrp_user"/>
<button name="button_pending" type="object" string="暂停" class="btn-warning" <button name="button_pending" type="object" string="暂停" class="btn-warning" groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': ['|', '|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False),('name','=','获取CNC加工程序')]}"/> attrs="{'invisible': ['|', '|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False),('name','=','获取CNC加工程序')]}"/>
<button name="button_finish" type="object" string="完成" class="btn-success" <button name="button_finish" type="object" string="完成" class="btn-success" groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"/> attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'), ('is_user_working', '=', False)]}"/>
<button name="%(mrp.act_mrp_block_workcenter_wo)d" type="action" string="停工" <button name="%(mrp.act_mrp_block_workcenter_wo)d" type="action" string="停工"
context="{'default_workcenter_id': workcenter_id}" class="btn-danger" context="{'default_workcenter_id': workcenter_id}" class="btn-danger" groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': ['|', '|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'),('user_permissions','=',False),('name','=','获取CNC加工程序')]}"/> attrs="{'invisible': ['|', '|','|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '=', 'blocked'),('user_permissions','=',False),('name','=','获取CNC加工程序')]}"/>
<button name="button_unblock" type="object" string="Unblock" <button name="button_unblock" type="object" string="Unblock"
context="{'default_workcenter_id': workcenter_id}" class="btn-danger" context="{'default_workcenter_id': workcenter_id}" class="btn-danger" groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked'),('name','=','获取CNC加工程序')]}"/> attrs="{'invisible': ['|', '|', ('production_state', 'in', ('draft', 'done', 'cancel')), ('working_state', '!=', 'blocked'),('name','=','获取CNC加工程序')]}"/>
</xpath> </xpath>
<xpath expr="//page[1]" position="before"> <xpath expr="//page[1]" position="before">

View File

@@ -194,7 +194,8 @@ class sf_production_plan(models.Model):
record.date_planned_start, record.date_planned_finished = \ record.date_planned_start, record.date_planned_finished = \
item.date_planned_start, item.date_planned_finished item.date_planned_start, item.date_planned_finished
record.state = 'done' record.state = 'done'
record.production_id.schedule_state = '已排' # record.production_id.schedule_state = '已排'
record.sudo().production_id.schedule_state = '已排'
# self.env['sale.order'].browse(record.production_id.origin).schedule_status = 'to process' # self.env['sale.order'].browse(record.production_id.origin).schedule_status = 'to process'
sale_obj = self.env['sale.order'].search([('name', '=', record.origin)]) sale_obj = self.env['sale.order'].search([('name', '=', record.origin)])
if 'S' in sale_obj.name: if 'S' in sale_obj.name:
@@ -202,7 +203,7 @@ class sf_production_plan(models.Model):
mrp_production_ids = record.production_id._get_children().ids mrp_production_ids = record.production_id._get_children().ids
print('mrp_production_ids', mrp_production_ids) print('mrp_production_ids', mrp_production_ids)
for i in mrp_production_ids: for i in mrp_production_ids:
record.env['mrp.production'].browse(i).schedule_state = '已排' record.env['mrp.production'].sudo().browse(i).schedule_state = '已排'
# record.production_id.date_planned_start = record.date_planned_start # record.production_id.date_planned_start = record.date_planned_start
# record.production_id.date_planned_finished = record.date_planned_finished # record.production_id.date_planned_finished = record.date_planned_finished
else: else:

View File

@@ -47,13 +47,13 @@ class FunctionalCuttingToolEntity(models.Model):
if record.barcode_id.quant_ids: if record.barcode_id.quant_ids:
for quant_id in record.barcode_id.quant_ids: for quant_id in record.barcode_id.quant_ids:
if quant_id.inventory_quantity_auto_apply > 0: if quant_id.inventory_quantity_auto_apply > 0:
record.current_location_id = quant_id.location_id record.sudo().current_location_id = quant_id.location_id
record.current_location = quant_id.location_id.name record.sudo().current_location = quant_id.location_id.name
if record.current_location_id: if record.current_location_id:
record.get_location_num() record.sudo().get_location_num()
else: else:
record.current_location_id = False record.sudo().current_location_id = False
record.current_location = False record.sudo().current_location = False
def get_location_num(self): def get_location_num(self):
""" """
@@ -131,24 +131,24 @@ class FunctionalCuttingToolEntity(models.Model):
print('111') print('111')
if record.cutting_tool_integral_model_id: if record.cutting_tool_integral_model_id:
print(record.cutting_tool_integral_model_id) print(record.cutting_tool_integral_model_id)
record.suitable_machining_method_ids = record.cutting_tool_integral_model_id.suitable_machining_method_ids.ids record.sudo().suitable_machining_method_ids = record.cutting_tool_integral_model_id.suitable_machining_method_ids.ids
record.blade_tip_characteristics_id = record.cutting_tool_integral_model_id.blade_tip_characteristics_id.id record.sudo().blade_tip_characteristics_id = record.cutting_tool_integral_model_id.blade_tip_characteristics_id.id
record.handle_type_id = record.cutting_tool_integral_model_id.handle_type_id.id record.sudo().handle_type_id = record.cutting_tool_integral_model_id.handle_type_id.id
record.cutting_direction_ids = record.cutting_tool_integral_model_id.cutting_direction_ids.ids record.sudo().cutting_direction_ids = record.cutting_tool_integral_model_id.cutting_direction_ids.ids
record.suitable_coolant_ids = record.cutting_tool_integral_model_id.suitable_coolant_ids.ids record.sudo().suitable_coolant_ids = record.cutting_tool_integral_model_id.suitable_coolant_ids.ids
print(record.cutting_tool_integral_model_id.blade_tip_characteristics_id.ids) print(record.cutting_tool_integral_model_id.blade_tip_characteristics_id.ids)
elif record.cutting_tool_blade_model_id: elif record.cutting_tool_blade_model_id:
record.suitable_machining_method_ids = record.cutting_tool_blade_model_id.suitable_machining_method_ids.ids record.sudo().suitable_machining_method_ids = record.cutting_tool_blade_model_id.suitable_machining_method_ids.ids
record.blade_tip_characteristics_id = record.cutting_tool_blade_model_id.blade_tip_characteristics_id.id record.sudo().blade_tip_characteristics_id = record.cutting_tool_blade_model_id.blade_tip_characteristics_id.id
record.handle_type_id = record.cutting_tool_blade_model_id.handle_type_id.id record.sudo().handle_type_id = record.cutting_tool_blade_model_id.handle_type_id.id
record.cutting_direction_ids = record.cutting_tool_blade_model_id.cutting_direction_ids.ids record.sudo().cutting_direction_ids = record.cutting_tool_blade_model_id.cutting_direction_ids.ids
record.suitable_coolant_ids = record.cutting_tool_blade_model_id.suitable_coolant_ids.ids record.sudo().suitable_coolant_ids = record.cutting_tool_blade_model_id.suitable_coolant_ids.ids
else: else:
record.suitable_machining_method_ids = [] record.sudo().suitable_machining_method_ids = []
record.blade_tip_characteristics_id = None record.sudo().blade_tip_characteristics_id = None
record.handle_type_id = None record.sudo().handle_type_id = None
record.cutting_direction_ids = [] record.sudo().cutting_direction_ids = []
record.suitable_coolant_ids = [] record.sudo().suitable_coolant_ids = []
def _get_functional_tool_model_ids(self, functional_tool_model_code): def _get_functional_tool_model_ids(self, functional_tool_model_code):
functional_tool_model_ids = [] functional_tool_model_ids = []
@@ -341,9 +341,9 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
def _compute_name(self): def _compute_name(self):
for obj in self: for obj in self:
if obj.tool_groups_id: if obj.tool_groups_id:
obj.name = '%s-D%sR%s' % (obj.tool_groups_id.name, obj.diameter, obj.knife_tip_r_angle) obj.sudo().name = '%s-D%sR%s' % (obj.tool_groups_id.name, obj.diameter, obj.knife_tip_r_angle)
else: else:
obj.name = None obj.sudo().name = None
@api.constrains('min_stock_num', 'max_stock_num') @api.constrains('min_stock_num', 'max_stock_num')
def _check_stock_num(self): def _check_stock_num(self):
@@ -361,26 +361,26 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
for tool in self: for tool in self:
if tool: if tool:
# 判断功能刀具组装单是否已经完成 # 判断功能刀具组装单是否已经完成
tool.estimate_functional_tool_assembly_ids(tool) tool.sudo().estimate_functional_tool_assembly_ids(tool)
tool.get_stock_num(tool) tool.sudo().get_stock_num(tool)
# 计算当前库存量 # 计算当前库存量
tool.tool_stock_total = tool.tool_stock_num + tool.side_shelf_num + tool.on_tool_stock_num tool.sudo().tool_stock_total = tool.tool_stock_num + tool.side_shelf_num + tool.on_tool_stock_num
# 如果当前库存量小于最低库存量,计算批次补货量 # 如果当前库存量小于最低库存量,计算批次补货量
tool.open_batch_replenishment_num(tool) tool.sudo().open_batch_replenishment_num(tool)
def open_batch_replenishment_num(self, tool): def open_batch_replenishment_num(self, tool):
""" """
计算批次补货量 计算批次补货量
""" """
if tool.tool_stock_total < tool.min_stock_num: if tool.tool_stock_total < tool.min_stock_num:
tool.batch_replenishment_num = tool.max_stock_num - tool.tool_stock_total tool.sudo().batch_replenishment_num = tool.max_stock_num - tool.tool_stock_total
# 根据判断创建功能刀具组装单 # 根据判断创建功能刀具组装单
if not tool.sf_functional_tool_assembly_ids and re.match(r'^\d+$', str(tool.id)): if not tool.sf_functional_tool_assembly_ids and re.match(r'^\d+$', str(tool.id)):
for i in range(tool.batch_replenishment_num): for i in range(tool.batch_replenishment_num):
tool.create_functional_tool_assembly(tool) tool.sudo().create_functional_tool_assembly(tool)
print(i, ": ", tool.sf_functional_tool_assembly_ids) print(i, ": ", tool.sf_functional_tool_assembly_ids)
else: else:
tool.batch_replenishment_num = 0 tool.sudo().batch_replenishment_num = 0
def create_functional_tool_assembly(self, tool): def create_functional_tool_assembly(self, tool):
""" """
@@ -400,7 +400,7 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
'whether_standard_knife': tool.whether_standard_knife, 'whether_standard_knife': tool.whether_standard_knife,
'reason_for_applying': '安全库存', 'reason_for_applying': '安全库存',
}) })
tool.sf_functional_tool_assembly_ids = [(4, functional_tool_assembly.id)] tool.sudo().sf_functional_tool_assembly_ids = [(4, functional_tool_assembly.id)]
def estimate_functional_tool_assembly_ids(self, tool): def estimate_functional_tool_assembly_ids(self, tool):
""" """
@@ -409,24 +409,24 @@ class RealTimeDistributionOfFunctionalTools(models.Model):
for sf_functional_tool_assembly_id in tool.sf_functional_tool_assembly_ids: for sf_functional_tool_assembly_id in tool.sf_functional_tool_assembly_ids:
if sf_functional_tool_assembly_id.assemble_status == '0': if sf_functional_tool_assembly_id.assemble_status == '0':
return False return False
tool.sf_functional_tool_assembly_ids = [] tool.sudo().sf_functional_tool_assembly_ids = []
def get_stock_num(self, tool): def get_stock_num(self, tool):
""" """
计算刀具房数量、线边刀库数量、机内刀库数量 计算刀具房数量、线边刀库数量、机内刀库数量
""" """
if tool: if tool:
tool.tool_stock_num = 0 tool.sudo().tool_stock_num = 0
tool.side_shelf_num = 0 tool.sudo().side_shelf_num = 0
tool.on_tool_stock_num = 0 tool.sudo().on_tool_stock_num = 0
if tool.sf_functional_cutting_tool_entity_ids: if tool.sf_functional_cutting_tool_entity_ids:
for cutting_tool in tool.sf_functional_cutting_tool_entity_ids: for cutting_tool in tool.sf_functional_cutting_tool_entity_ids:
if cutting_tool.tool_room_num > 0: if cutting_tool.tool_room_num > 0:
tool.tool_stock_num += 1 tool.sudo().tool_stock_num += 1
elif cutting_tool.line_edge_knife_library_num > 0: elif cutting_tool.line_edge_knife_library_num > 0:
tool.side_shelf_num += 1 tool.sudo().side_shelf_num += 1
elif cutting_tool.machine_knife_library_num > 0: elif cutting_tool.machine_knife_library_num > 0:
tool.on_tool_stock_num += 1 tool.sudo().on_tool_stock_num += 1
def create_or_edit_safety_stock(self, vals, sf_functional_cutting_tool_entity_ids): def create_or_edit_safety_stock(self, vals, sf_functional_cutting_tool_entity_ids):
""" """
@@ -511,21 +511,21 @@ class MachineTableToolChangingApply(models.Model):
def _compute_functional_tool_status(self): def _compute_functional_tool_status(self):
for record in self: for record in self:
if record.alarm_value < record.used_value: if record.alarm_value < record.used_value:
record.functional_tool_status = '报警' record.sudo().functional_tool_status = '报警'
else: else:
record.functional_tool_status = '正常' record.sudo().functional_tool_status = '正常'
@api.depends('maintenance_equipment_id') @api.depends('maintenance_equipment_id')
def _compute_machine_table_type_id(self): def _compute_machine_table_type_id(self):
for record in self: for record in self:
if record: if record:
record.production_line_id = record.maintenance_equipment_id.production_line_id.id record.sudo().production_line_id = record.maintenance_equipment_id.production_line_id.id
record.machine_table_type_id = record.maintenance_equipment_id.category_id.id record.sudo().machine_table_type_id = record.maintenance_equipment_id.category_id.id
record.machine_tool_code = record.maintenance_equipment_id.code record.sudo().machine_tool_code = record.maintenance_equipment_id.code
else: else:
record.production_line_id = None record.sudo().production_line_id = None
record.machine_table_type_id = None record.sudo().machine_table_type_id = None
record.machine_tool_code = None record.sudo().machine_tool_code = None
@api.constrains("cutter_spacing_code_id") @api.constrains("cutter_spacing_code_id")
def _check_cutter_spacing_code_id(self): def _check_cutter_spacing_code_id(self):

View File

@@ -1,20 +1,34 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink 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,1 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,1
access_sf_functional_tool_warning,sf.functional.tool.warning,model_sf_functional_tool_warning,base.group_user,1,1,1,1 access_sf_functional_tool_warning,sf.functional.tool.warning,model_sf_functional_tool_warning,sf_base.group_sf_tool_user,1,1,1,1
access_sf_real_time_distribution_of_functional_tools,sf.real.time.distribution.of.functional.tools,model_sf_real_time_distribution_of_functional_tools,base.group_user,1,1,1,1 access_sf_real_time_distribution_of_functional_tools,sf.real.time.distribution.of.functional.tools,model_sf_real_time_distribution_of_functional_tools,sf_base.group_sf_tool_user,1,1,1,1
access_sf_cam_work_order_program_knife_plan,sf.cam.work.order.program.knife.plan,model_sf_cam_work_order_program_knife_plan,base.group_user,1,1,1,1 access_sf_cam_work_order_program_knife_plan,sf.cam.work.order.program.knife.plan,model_sf_cam_work_order_program_knife_plan,sf_base.group_sf_tool_user,1,1,1,1
access_sf_machine_table_tool_changing_apply,sf.machine.table.tool.changing.apply,model_sf_machine_table_tool_changing_apply,base.group_user,1,1,1,1 access_sf_machine_table_tool_changing_apply,sf.machine.table.tool.changing.apply,model_sf_machine_table_tool_changing_apply,sf_base.group_sf_tool_user,1,1,1,1
access_sf_tool_change_requirement_information,sf.tool.change.requirement.information,model_sf_tool_change_requirement_information,base.group_user,1,1,1,1 access_sf_tool_change_requirement_information,sf.tool.change.requirement.information,model_sf_tool_change_requirement_information,sf_base.group_sf_tool_user,1,1,1,1
access_sf_tool_transfer_request_information,sf.tool.transfer.request.information,model_sf_tool_transfer_request_information,base.group_user,1,1,1,1 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,1
access_sf_functional_tool_assembly,sf.functional.tool.assembly,model_sf_functional_tool_assembly,base.group_user,1,1,1,1
access_sf_functional_tool_assembly_order,sf.functional.tool.assembly.order,model_sf_functional_tool_assembly_order,base.group_user,1,1,1,1
access_sf_tool_material_search,sf.tool.material.search,model_sf_tool_material_search,base.group_user,1,1,1,1
access_sf_functional_tool_assembly,sf.functional.tool.assembly,model_sf_functional_tool_assembly,sf_base.group_sf_tool_user,1,1,1,1
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,1
access_sf_tool_material_search,sf.tool.material.search,model_sf_tool_material_search,sf_base.group_sf_tool_user,1,1,1,1
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_tool_warning_group_plan_dispatch,sf.functional.tool.warning,model_sf_functional_tool_warning,sf_base.group_plan_dispatch,1,0,0,0
access_sf_real_time_distribution_of_functional_tools_group_plan_dispatch,sf.real.time.distribution.of.functional.tools,model_sf_real_time_distribution_of_functional_tools,sf_base.group_plan_dispatch,1,0,0,0
access_sf_cam_work_order_program_knife_plan_group_plan_dispatch,sf.cam.work.order.program.knife.plan,model_sf_cam_work_order_program_knife_plan,sf_base.group_plan_dispatch,1,0,0,0
access_sf_machine_table_tool_changing_apply_group_plan_dispatch,sf.machine.table.tool.changing.apply,model_sf_machine_table_tool_changing_apply,sf_base.group_plan_dispatch,1,0,0,0
access_sf_tool_change_requirement_information_group_plan_dispatch,sf.tool.change.requirement.information,model_sf_tool_change_requirement_information,sf_base.group_plan_dispatch,1,0,0,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_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_group_plan_dispatch,sf.functional.tool.assembly.order,model_sf_functional_tool_assembly_order,sf_base.group_plan_dispatch,1,0,0,0
access_sf_tool_material_search_group_plan_dispatch,sf.tool.material.search,model_sf_tool_material_search,sf_base.group_plan_dispatch,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_sf_functional_cutting_tool_entity sf.functional.cutting.tool.entity model_sf_functional_cutting_tool_entity base.group_user sf_base.group_sf_tool_user 1 1 1 1
3 access_sf_functional_tool_warning sf.functional.tool.warning model_sf_functional_tool_warning base.group_user sf_base.group_sf_tool_user 1 1 1 1
4 access_sf_real_time_distribution_of_functional_tools sf.real.time.distribution.of.functional.tools model_sf_real_time_distribution_of_functional_tools base.group_user sf_base.group_sf_tool_user 1 1 1 1
5 access_sf_cam_work_order_program_knife_plan sf.cam.work.order.program.knife.plan model_sf_cam_work_order_program_knife_plan base.group_user sf_base.group_sf_tool_user 1 1 1 1
6 access_sf_machine_table_tool_changing_apply sf.machine.table.tool.changing.apply model_sf_machine_table_tool_changing_apply base.group_user sf_base.group_sf_tool_user 1 1 1 1
7 access_sf_tool_change_requirement_information sf.tool.change.requirement.information model_sf_tool_change_requirement_information base.group_user sf_base.group_sf_tool_user 1 1 1 1
8 access_sf_tool_transfer_request_information sf.tool.transfer.request.information model_sf_tool_transfer_request_information base.group_user sf_base.group_sf_tool_user 1 1 1 1
9 access_sf_functional_tool_assembly sf.functional.tool.assembly model_sf_functional_tool_assembly base.group_user sf_base.group_sf_tool_user 1 1 1 1
10 access_sf_functional_tool_assembly_order sf.functional.tool.assembly.order model_sf_functional_tool_assembly_order base.group_user sf_base.group_sf_tool_user 1 1 1 1
11 access_sf_tool_material_search sf.tool.material.search model_sf_tool_material_search base.group_user sf_base.group_sf_tool_user 1 1 1 1
12 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
13 access_sf_functional_tool_warning_group_plan_dispatch sf.functional.tool.warning model_sf_functional_tool_warning sf_base.group_plan_dispatch 1 0 0 0
14 access_sf_real_time_distribution_of_functional_tools_group_plan_dispatch sf.real.time.distribution.of.functional.tools model_sf_real_time_distribution_of_functional_tools sf_base.group_plan_dispatch 1 0 0 0
15 access_sf_cam_work_order_program_knife_plan_group_plan_dispatch sf.cam.work.order.program.knife.plan model_sf_cam_work_order_program_knife_plan sf_base.group_plan_dispatch 1 0 0 0
16 access_sf_machine_table_tool_changing_apply_group_plan_dispatch sf.machine.table.tool.changing.apply model_sf_machine_table_tool_changing_apply sf_base.group_plan_dispatch 1 0 0 0
17 access_sf_tool_change_requirement_information_group_plan_dispatch sf.tool.change.requirement.information model_sf_tool_change_requirement_information sf_base.group_plan_dispatch 1 0 0 0
18 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
19 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
20 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
21 access_sf_tool_material_search_group_plan_dispatch sf.tool.material.search model_sf_tool_material_search sf_base.group_plan_dispatch 1 0 0 0
22
23
24
25
26
27
28
29
30
31
32
33
34

View File

@@ -43,7 +43,7 @@
</header> </header>
<sheet> <sheet>
<div class="oe_button_box" name="button_box"> <div class="oe_button_box" name="button_box">
<button class="oe_stat_button" <button class="oe_stat_button" groups="sf_base.group_sf_mrp_user"
name="open_functional_tool_warning" name="open_functional_tool_warning"
icon="fa-list-ul" icon="fa-list-ul"
type="object"> type="object">
@@ -53,7 +53,7 @@
</span> </span>
</div> </div>
</button> </button>
<button class="oe_stat_button" <button class="oe_stat_button" groups="sf_base.group_sf_mrp_user"
name="open_stock_move_line" name="open_stock_move_line"
icon="fa-list-ul" icon="fa-list-ul"
type="object"> type="object">
@@ -63,7 +63,7 @@
</span> </span>
</div> </div>
</button> </button>
<button class="oe_stat_button" <button class="oe_stat_button" groups="sf_base.group_sf_mrp_user"
name="open_safety_stock" name="open_safety_stock"
icon="fa-list-ul" icon="fa-list-ul"
type="object"> type="object">
@@ -287,7 +287,7 @@
<field name="name">功能刀具安全库存</field> <field name="name">功能刀具安全库存</field>
<field name="model">sf.real.time.distribution.of.functional.tools</field> <field name="model">sf.real.time.distribution.of.functional.tools</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<tree create="1" edit="1" delete="0"> <tree>
<field name="name"/> <field name="name"/>
<field name="sf_cutting_tool_type_id" invisible="True"/> <field name="sf_cutting_tool_type_id" invisible="True"/>
<field name="tool_groups_id"/> <field name="tool_groups_id"/>
@@ -310,7 +310,7 @@
<field name="name">功能刀具安全库存</field> <field name="name">功能刀具安全库存</field>
<field name="model">sf.real.time.distribution.of.functional.tools</field> <field name="model">sf.real.time.distribution.of.functional.tools</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form create="0" edit="1" delete="0"> <form>
<sheet> <sheet>
<div class="oe_title"> <div class="oe_title">
<h1> <h1>
@@ -552,7 +552,7 @@
'default_replacement_effective_length': effective_length, 'default_replacement_effective_length': effective_length,
}" }"
attrs="{'invisible': [('status', '!=', '0')]}" attrs="{'invisible': [('status', '!=', '0')]}"
class="btn-primary" class="btn-primary" groups="sf_base.group_sf_mrp_user"
/> />
<button string="转移" <button string="转移"
name="%(sf_tool_management.sf_tool_transfer_request_information_act)d" name="%(sf_tool_management.sf_tool_transfer_request_information_act)d"
@@ -578,13 +578,13 @@
'default_extension_length': extension_length, 'default_extension_length': extension_length,
'default_effective_length': effective_length, 'default_effective_length': effective_length,
}" }"
class="btn-primary" class="btn-primary" groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': ['|',('status', '!=', '0'), ('functional_tool_name_id', '=', False)]}" attrs="{'invisible': ['|',('status', '!=', '0'), ('functional_tool_name_id', '=', False)]}"
/> />
<button string="撤回换刀申请" name="revocation_1" type="object" class="btn-primary" <button string="撤回换刀申请" name="revocation_1" type="object" class="btn-primary"
attrs="{'invisible': [('status', '!=', '1')]}" confirm="是否确认撤回换刀申请"/> attrs="{'invisible': [('status', '!=', '1')]}" groups="sf_base.group_sf_mrp_user" confirm="是否确认撤回换刀申请"/>
<button string="撤回转移" name="revocation_2" type="object" class="btn-primary" <button string="撤回转移" name="revocation_2" type="object" class="btn-primary"
attrs="{'invisible': [('status', '!=', '2')]}" confirm="是否确认撤回转移"/> attrs="{'invisible': [('status', '!=', '2')]}" groups="sf_base.group_sf_mrp_user" confirm="是否确认撤回转移"/>
</tree> </tree>
</field> </field>
</record> </record>
@@ -630,7 +630,7 @@
'default_replacement_effective_length': effective_length, 'default_replacement_effective_length': effective_length,
}" }"
attrs="{'invisible': [('status', '!=', '0')]}" attrs="{'invisible': [('status', '!=', '0')]}"
class="btn-primary" class="btn-primary" groups="sf_base.group_sf_mrp_user"
/> />
<button string="转移" <button string="转移"
name="%(sf_tool_management.sf_tool_transfer_request_information_act)d" name="%(sf_tool_management.sf_tool_transfer_request_information_act)d"
@@ -654,11 +654,11 @@
'default_extension_length': extension_length, 'default_extension_length': extension_length,
'default_effective_length': effective_length, 'default_effective_length': effective_length,
}" }"
class="btn-primary" class="btn-primary" groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': ['|',('status', '!=', '0'),('functional_tool_name_id', '=', False)]}"/> attrs="{'invisible': ['|',('status', '!=', '0'),('functional_tool_name_id', '=', False)]}"/>
<button string="撤回换刀申请" name="revocation_1" type="object" class="btn-primary" <button string="撤回换刀申请" name="revocation_1" type="object" class="btn-primary"
attrs="{'invisible': [('status', '!=', '1')]}" confirm="是否确认撤回换刀申请"/> attrs="{'invisible': [('status', '!=', '1')]}" groups="sf_base.group_sf_mrp_user" confirm="是否确认撤回换刀申请"/>
<button string="撤回转移" name="revocation_2" type="object" class="btn-primary" <button string="撤回转移" name="revocation_2" type="object" groups="sf_base.group_sf_mrp_user" class="btn-primary"
attrs="{'invisible': [('status', '!=', '2')]}" confirm="是否确认撤回转移"/> attrs="{'invisible': [('status', '!=', '2')]}" confirm="是否确认撤回转移"/>
</header> </header>
<field name="functional_tool_status" string="状态" invisible="True"/> <field name="functional_tool_status" string="状态" invisible="True"/>
@@ -946,9 +946,9 @@
'default_use_tool_time':use_tool_time, 'default_use_tool_time':use_tool_time,
'default_reason_for_applying':reason_for_applying, 'default_reason_for_applying':reason_for_applying,
}" }"
attrs="{'invisible': [('assemble_status', '!=', '0')]}" attrs="{'invisible': [('assemble_status', '!=', '0')]}" groups="sf_base.group_sf_mrp_user"
class="btn-primary"/> class="btn-primary"/>
<button string="组装单打印" name="assemble_single_print" type="object" <button string="组装单打印" name="assemble_single_print" type="object" groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary" attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary"
confirm="是否确认打印组装单"/> confirm="是否确认打印组装单"/>
</tree> </tree>
@@ -963,7 +963,7 @@
<header> <header>
<button string="组装" <button string="组装"
name="%(sf_tool_management.sf_functional_tool_assembly_order_act)d" name="%(sf_tool_management.sf_functional_tool_assembly_order_act)d"
type="action" type="action" groups="sf_base.group_sf_mrp_user"
context="{'default_name':name, context="{'default_name':name,
'default_assembly_order_code':assembly_order_code, 'default_assembly_order_code':assembly_order_code,
'default_production_line_name_id':production_line_name_id, 'default_production_line_name_id':production_line_name_id,
@@ -986,10 +986,10 @@
attrs="{'invisible': [('assemble_status', '!=', '0')]}" attrs="{'invisible': [('assemble_status', '!=', '0')]}"
class="btn-primary"/> class="btn-primary"/>
<button string="打印二维码" name="automatic_printing_of_QR_code" type="object" <button string="打印二维码" name="automatic_printing_of_QR_code" type="object" groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary" attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary"
confirm="是否确认打印二维码"/> confirm="是否确认打印二维码"/>
<button string="组装单打印" name="assemble_single_print" type="object" <button string="组装单打印" name="assemble_single_print" type="object" groups="sf_base.group_sf_mrp_user"
attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary" attrs="{'invisible': [('assemble_status', '=', '0')]}" class="btn-primary"
confirm="是否确认打印组装单"/> confirm="是否确认打印组装单"/>
<field name="assemble_status" widget="statusbar" statusbar_visible="0,1"/> <field name="assemble_status" widget="statusbar" statusbar_visible="0,1"/>

View File

@@ -287,11 +287,11 @@ class ShelfLocation(models.Model):
""" """
for record in self: for record in self:
if record.product_sn_id: if record.product_sn_id:
record.product_id = record.product_sn_id.product_id record.sudo().product_id = record.product_sn_id.product_id
record.location_status = '占用' record.sudo().location_status = '占用'
else: else:
record.product_id = False record.sudo().product_id = False
record.location_status = '空闲' record.sudo().location_status = '空闲'
@api.depends('location_type') @api.depends('location_type')
def _compute_hide_what(self): def _compute_hide_what(self):
@@ -300,12 +300,12 @@ class ShelfLocation(models.Model):
:return: :return:
""" """
for record in self: for record in self:
record.hide_shelf = False record.sudo().hide_shelf = False
record.hide_location = False record.sudo().hide_location = False
if record.location_type and record.location_type == '货架': if record.location_type and record.location_type == '货架':
record.hide_shelf = True record.sudo().hide_shelf = True
elif record.location_type and record.location_type == '货位': elif record.location_type and record.location_type == '货位':
record.hide_location = True record.sudo().hide_location = True
else: else:
pass pass

View File

@@ -96,7 +96,7 @@ access_stock_lot_label_layout_user,lot.label.layout.user,stock.model_lot_label_l
access_stock_replenish_option,stock.replenishment.option,stock.model_stock_replenishment_option,sf_warehouse.group_sf_stock_user,1,1,1,0 access_stock_replenish_option,stock.replenishment.option,stock.model_stock_replenishment_option,sf_warehouse.group_sf_stock_user,1,1,1,0
access_mrp_production,mrp.production,mrp.model_mrp_production,sf_warehouse.group_sf_stock_user,1,1,1,0 access_mrp_production,mrp.production,mrp.model_mrp_production,sf_warehouse.group_sf_stock_user,1,1,1,0
access_sf_shelf_location_group_plan_dispatch,sf.shelf.location,model_sf_shelf_location,sf_base.group_plan_dispatch,1,1,0,0 access_sf_shelf_location_group_plan_dispatch,sf.shelf.location,model_sf_shelf_location,sf_base.group_plan_dispatch,1,0,0,0
access_stock_move,stock.move,stock.model_stock_move,sf_base.group_plan_dispatch,1,1,1,0 access_stock_move,stock.move,stock.model_stock_move,sf_base.group_plan_dispatch,1,1,1,0
access_stock_picking,stock.picking,stock.model_stock_picking,sf_base.group_plan_dispatch,1,0,0,0 access_stock_picking,stock.picking,stock.model_stock_picking,sf_base.group_plan_dispatch,1,0,0,0
access_stock_lot_group_plan_dispatch,stock.lot,stock.model_stock_lot,sf_base.group_plan_dispatch,1,0,0,0 access_stock_lot_group_plan_dispatch,stock.lot,stock.model_stock_lot,sf_base.group_plan_dispatch,1,0,0,0
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
96 access_sf_shelf_location_group_plan_dispatch sf.shelf.location model_sf_shelf_location sf_base.group_plan_dispatch 1 1 0 0 0
97 access_stock_move stock.move stock.model_stock_move sf_base.group_plan_dispatch 1 1 1 0
98 access_stock_picking stock.picking stock.model_stock_picking sf_base.group_plan_dispatch 1 0 0 0
99 access_stock_lot_group_plan_dispatch stock.lot stock.model_stock_lot sf_base.group_plan_dispatch 1 0 0 0
100 access_stock_lot_group_plan_director stock.lot stock.model_stock_lot sf_base.group_plan_director 1 1 1 0
101 access_stock_warehouse_orderpoint stock.warehouse.orderpoint stock.model_stock_warehouse_orderpoint sf_base.group_plan_dispatch 1 1 0 0
102 access_product_product product.product product.model_product_product sf_base.group_plan_dispatch 1 0 0 0

View File

@@ -73,5 +73,19 @@
</field> </field>
</record> </record>
<record id="sf_vpicktree" model="ir.ui.view">
<field name="name">sf.vpicktree</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.vpicktree"/>
<field name="arch" type="xml">
<xpath expr="//header//button[@name='do_unreserve']" position="replace">
<button name="do_unreserve" type="object" string="取消保留" groups="sf_warehouse.group_sf_stock_user"/>
</xpath>
<xpath expr="//header//button[@name='action_assign']" position="replace">
<button name="action_assign" type="object" string="检查可用量" groups="sf_warehouse.group_sf_stock_user"/>
</xpath>
</field>
</record>
</data> </data>
</odoo> </odoo>