diff --git a/sf_base/security/ir.model.access.csv b/sf_base/security/ir.model.access.csv index 25d384f0..d182fb76 100644 --- a/sf_base/security/ir.model.access.csv +++ b/sf_base/security/ir.model.access.csv @@ -1,40 +1,72 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,base.group_user,1,1,1,1 -access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,base.group_user,1,1,1,1 -access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,base.group_user,1,1,1,1 -access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,base.group_user,1,1,1,1 -access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,base.group_user,1,1,1,1 -access_sf_processing_order,sf_processing_order,model_sf_processing_order,base.group_user,1,1,1,1 -access_sf_production_process,sf_production_process,model_sf_production_process,base.group_user,1,1,1,1 -access_sf_production_materials,sf_production_materials,model_sf_production_materials,base.group_user,1,1,1,1 -access_sf_materials_model,sf_materials_model,model_sf_materials_model,base.group_user,1,1,1,1 -access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,base.group_user,1,1,1,1 -access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,1 -access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,1 -access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,base.group_user,1,1,1,1 -access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,base.group_user,1,1,1,1 -access_sf_cutting_tool_material,sf_cutting_tool_material,model_sf_cutting_tool_material,base.group_user,1,1,1,1 -access_sf_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,base.group_user,1,1,1,1 -access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,base.group_user,1,1,1,1 -access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,base.group_user,1,1,1,1 -access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,base.group_user,1,1,1,1 -access_sf_fixture_materials_basic_parameters,sf_fixture_materials_basic_parameters,model_sf_fixture_materials_basic_parameters,base.group_user,1,1,1,1 - -access_sf_multi_mounting_type,sf_multi_mounting_type,model_sf_multi_mounting_type,base.group_user,1,1,1,1 -access_sf_fixture_model,sf_fixture_model,model_sf_fixture_model,base.group_user,1,1,1,1 +access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,base.group_user,1,1,1,0 +access_sf_machine_tool_admin,sf_machine_tool_admin,model_sf_machine_tool,base.group_system,1,1,1,0 +access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,base.group_user,1,1,1,0 +access_sf_machine_tool_type_admin,sf_machine_tool_type_admin,model_sf_machine_tool_type,base.group_system,1,1,1,0 +access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,base.group_user,1,1,1,0 +access_sf_machine_brand_admin,sf_machine_brand_admin,model_sf_machine_brand,base.group_system,1,1,1,0 +access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,base.group_user,1,1,1,0 +access_sf_machine_brand_tags_admin,sf_machine_brand_tags_admin,model_sf_machine_brand_tags,base.group_system,1,1,1,0 +access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,base.group_user,1,1,1,0 +access_sf_machine_control_system_admin,sf_machine_control_system_admin,model_sf_machine_control_system,base.group_system,1,1,1,0 +access_sf_processing_order,sf_processing_order,model_sf_processing_order,base.group_user,1,1,1,0 +access_sf_processing_order_admin,sf_processing_order_admin,model_sf_processing_order,base.group_system,1,1,1,0 +access_sf_production_process,sf_production_process,model_sf_production_process,base.group_user,1,1,1,0 +access_sf_production_process_admin,sf_production_process_admin,model_sf_production_process,base.group_system,1,1,1,0 +access_sf_production_materials,sf_production_materials,model_sf_production_materials,base.group_user,1,1,1,0 +access_sf_production_materials_admin,sf_production_materials_admin,model_sf_production_materials,base.group_system,1,1,1,0 +access_sf_materials_model,sf_materials_model,model_sf_materials_model,base.group_user,1,1,1,0 +access_sf_materials_model_admin,sf_materials_model_admin,model_sf_materials_model,base.group_system,1,1,1,0 +access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,base.group_user,1,1,1,0 +access_sf_processing_technology_admin,sf_processing_technology_admin,model_sf_processing_technology,base.group_system,1,1,1,0 +access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,0 +access_sf_supplier_sort_admin,sf_supplier_sort_admin,model_sf_supplier_sort,base.group_system,1,1,1,0 +access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,0 +access_sf_production_process_parameter_admin,sf_production_process_parameter_admin,model_sf_production_process_parameter,base.group_system,1,1,1,0 +access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,base.group_user,1,1,1,0 +access_sf_production_process_category_admin,sf_production_process_category_admin,model_sf_production_process_category,base.group_system,1,1,1,0 +access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,base.group_user,1,1,1,0 +access_sf_machine_tool_category_admin,sf_machine_tool_category_admin,model_sf_machine_tool_category,base.group_system,1,1,1,0 +access_sf_cutting_tool_material,sf_cutting_tool_material,model_sf_cutting_tool_material,base.group_user,1,1,1,0 +access_sf_cutting_tool_material_admin,sf_cutting_tool_material_admin,model_sf_cutting_tool_material,base.group_system,1,1,1,0 +access_sf_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,base.group_user,1,1,1,0 +access_sf_cutting_tool_type_admin,sf_cutting_tool_type_admin,model_sf_cutting_tool_type,base.group_system,1,1,1,0 +access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,base.group_user,1,1,1,0 +access_sf_functional_cutting_tool_admin,sf_functional_cutting_tool_admin,model_sf_functional_cutting_tool,base.group_system,1,1,1,0 +access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,base.group_user,1,1,1,0 +access_sf_functional_cutting_tool_model_admin,sf_functional_cutting_tool_model_admin,model_sf_functional_cutting_tool_model,base.group_system,1,1,1,0 +access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,base.group_user,1,1,1,0 +access_sf_fixture_material_admin,sf_fixture_material_admin,model_sf_fixture_material,base.group_system,1,1,1,0 +access_sf_fixture_materials_basic_parameters,sf_fixture_materials_basic_parameters,model_sf_fixture_materials_basic_parameters,base.group_user,1,1,1,0 +access_sf_fixture_materials_basic_parameters_admin,sf_fixture_materials_basic_parameters_admin,model_sf_fixture_materials_basic_parameters,base.group_system,1,1,1,0 +access_sf_multi_mounting_type,sf_multi_mounting_type,model_sf_multi_mounting_type,base.group_user,1,1,1,0 +access_sf_multi_mounting_type_admin,sf_multi_mounting_type_admin,model_sf_multi_mounting_type,base.group_system,1,1,1,0 +access_sf_fixture_model,sf_fixture_model,model_sf_fixture_model,base.group_user,1,1,1,0 +access_sf_fixture_model_admin,sf_fixture_model_admin,model_sf_fixture_model,base.group_system,1,1,1,0 access_sf_functional_fixture_type,sf_functional_fixture_type,model_sf_functional_fixture_type,base.group_user,1,1,1,1 -access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,base.group_user,1,1,1,1 -access_sf_sync_common,sf_sync_common,model_sf_sync_common,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_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_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_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,1 +access_sf_functional_fixture_type_admin,sf_functional_fixture_type_admin,model_sf_functional_fixture_type,base.group_system,1,1,1,0 +access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,base.group_user,1,1,1,0 +access_sf_functional_fixture_admin,sf_functional_fixture_admin,model_sf_functional_fixture,base.group_system,1,1,1,0 +access_sf_sync_common,sf_sync_common,model_sf_sync_common,base.group_user,1,1,1,0 +access_sf_sync_common,sf_sync_common_admin,model_sf_sync_common_admin,base.group_system,1,1,1,0 +access_sf_international_standards,sf_international_standards,model_sf_international_standards,base.group_user,1,1,1,0 +access_sf_international_standards_admin,sf_international_standards_admin,model_sf_international_standards,base.group_system,1,1,1,0 +access_material_apply,material_apply,model_material_apply,base.group_user,1,1,1,0 +access_material_apply_admin,material_apply_admin,model_material_apply,base.group_system,1,1,1,0 +access_sf_cutting_tool_standard_library,sf_cutting_tool_standard_library,model_sf_cutting_tool_standard_library,base.group_user,1,1,1,0 +access_sf_cutting_tool_standard_library_admin,sf_cutting_tool_standard_library_admin,model_sf_cutting_tool_standard_library,base.group_system,1,1,1,0 +access_sf_tool_materials_basic_parameters,sf_tool_materials_basic_parameters,model_sf_tool_materials_basic_parameters,base.group_user,1,1,1,0 +access_sf_tool_materials_basic_parameters_admin,sf_tool_materials_basic_parameters_admin,model_sf_tool_materials_basic_parameters,base.group_system,1,1,1,0 +access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,1,1,1,0 +access_sf_cutting_speed_admin,sf_cutting_speed_admin,model_sf_cutting_speed,base.group_system,1,1,1,0 +access_sf_cutting_speed_group_purchase_director,sf_cutting_speed_group_purchase_director,model_sf_cutting_speed,sf_base.group_purchase_director,1,1,1,0 +access_sf_cutting_speed_group_sale_director,sf_cutting_speed_group_sale_director,model_sf_cutting_speed,sf_base.group_sale_director,1,1,1,0 +access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,0 +access_sf_feed_per_tooth_admin,sf_feed_per_tooth_admin,model_sf_feed_per_tooth,base.group_system,1,1,1,0 access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,base.group_user,1,1,1,1 +access_sf_ramping_angle_admin,sf_ramping_angle_admin,model_sf_ramping_angle,base.group_system,1,1,1,1 access_sf_cutting_width_depth,sf_cutting_width_depth,model_sf_cutting_width_depth,base.group_user,1,1,1,1 - +access_sf_cutting_width_depth_admin,sf_cutting_width_depth_admin,model_sf_cutting_width_depth,base.group_system,1,1,1,1 access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,sf_base.group_sf_mrp_user,1,0,0,0 access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,sf_base.group_sf_mrp_user,1,0,0,0 access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,sf_base.group_sf_mrp_user,1,0,0,0 diff --git a/sf_manufacturing/models/mrp_production.py b/sf_manufacturing/models/mrp_production.py index 8eb17dfd..7c4915c1 100644 --- a/sf_manufacturing/models/mrp_production.py +++ b/sf_manufacturing/models/mrp_production.py @@ -50,6 +50,9 @@ class MrpProduction(models.Model): work_state = fields.Char('业务状态') programming_state = fields.Char('编程状态') glb_file = fields.Binary("glb模型文件") + production_line_id = fields.Many2one('sf.production.line', string='生产线') + plan_start_processing_time = fields.Datetime('计划开始加工时间') + @api.depends( 'move_raw_ids.state', 'move_raw_ids.quantity_done', 'move_finished_ids.state', @@ -511,7 +514,7 @@ class MrpProduction(models.Model): # if completed products make other confirmed/partially_available moves available, assign them done_move_finished_ids = ( - productions_to_backorder.move_finished_ids | productions_not_to_backorder.move_finished_ids).filtered( + productions_to_backorder.move_finished_ids | productions_not_to_backorder.move_finished_ids).filtered( lambda m: m.state == 'done') done_move_finished_ids._trigger_assign() diff --git a/sf_manufacturing/models/mrp_workorder.py b/sf_manufacturing/models/mrp_workorder.py index 19476b8a..d066582b 100644 --- a/sf_manufacturing/models/mrp_workorder.py +++ b/sf_manufacturing/models/mrp_workorder.py @@ -122,15 +122,16 @@ class ResMrpWorkOrder(models.Model): chuck_type_id = fields.Char(string="卡盘类型") chuck_model_id = fields.Char(string="卡盘型号") tray_serial_number = fields.Char(string="托盘序列号") - tray_name = fields.Char(string="托盘名称") + tray_product_id = fields.Many2one('product.product', string="托盘名称") tray_brand_id = fields.Many2one('sf.machine.brand', string="托盘品牌") - tray_type_id = fields.Char(string="托盘类型") - tray_model_id = fields.Char(string="托盘型号") + tray_type_id = fields.Many2one('sf.fixture.material', string="托盘类型") + tray_model_id = fields.Many2one('sf.fixture.model', string="托盘型号") total_wight = fields.Float(string="总重量") maximum_carrying_weight = fields.Char(string="最大承载重量[kg]") maximum_clamping_force = fields.Char(string="最大夹持力[n]") production_line = fields.Char(string="生产线") preset_program_information = fields.Char(string="预调程序信息") + workpiece_delivery_ids = fields.One2many('sf.workpiece.delivery', 'workorder_id', '工件配送') @api.onchange('is_ok') def _onchange_inspection_user_id(self): @@ -195,9 +196,24 @@ class ResMrpWorkOrder(models.Model): work = workorder.production_id.workorder_ids work.compensation_value_x = eval(self.material_center_point)[0] work.compensation_value_y = eval(self.material_center_point)[1] + workorder.button_finish() + except: raise UserError("参数计算有误") + def button_workpiece_delivery(self): + if self.routing_type == '装夹预调': + if not self.workpiece_delivery_ids: + raise UserError('请添加【工件配送】信息') + else: + for item in self.workpiece_delivery_ids: + if not item.feeder_station_start: + raise UserError('【工件配送】明细中请输入起点接驳站') + if not item.workpiece_code: + raise UserError('请对【同运工件】进行扫描') + else: + item.write({'task_delivery_time': fields.Datetime.now()}) + # 拼接工单对象属性值 def json_workorder_str(self, k, production, route): # 计算预计时长duration_expected @@ -240,7 +256,9 @@ class ResMrpWorkOrder(models.Model): 'date_planned_finished': False, 'duration_expected': duration_expected, 'duration': 0, - + 'workpiece_delivery_ids': False if not route.routing_type == '装夹预调' else self.env[ + 'sf.workpiece.delivery'].create( + {'production_id': production.id}) }] return workorders_values_str @@ -551,6 +569,9 @@ class ResMrpWorkOrder(models.Model): raise UserError(_('请先完成上一步工单')) def button_finish(self): + if self.routing_type == '装夹预调': + if not self.material_center_point and self.X_deviation_angle > 0: + raise UserError("请对前置三元检测定位参数进行计算定位") if self.picking_out_id: picking_out = self.env['stock.picking'].search([('id', '=', self.picking_out_id.id)]) if picking_out.workorder_out_id: @@ -582,11 +603,7 @@ class ResMrpWorkOrder(models.Model): for move_raw_id in self.production_id.move_raw_ids: move_raw_id.quantity_done = move_raw_id.product_uom_qty self.production_id.button_mark_done1() - # self.production_id.state = 'done' - - - - + # self.production_id.state = 'done' class CNCprocessing(models.Model): @@ -724,73 +741,71 @@ class SfWorkOrderBarcodes(models.Model): _name = "mrp.workorder" _inherit = ["mrp.workorder", "barcodes.barcode_events_mixin"] - # def on_barcode_scanned(self, barcode): - # workorder = self.env['mrp.workorder'].browse(self.ids) - # if "*" not in barcode: - # if self.routing_type == '装夹': - # tray_code = self.env['sf.tray'].search([('code', '=', barcode)]) - # self.tray_code = tray_code.code - # self.tray_id = workorder.gettray_auto(barcode) - # elif self.routing_type == '前置三元定位检测': - # print('我是前置三元检测') - # logging.info('我是前置三元检测') - # elif self.routing_type == 'CNC加工': - # if barcode == 'UP-ALL': - # print("我是一键合并下发") - # logging.info('我是一键合并下发') - # self.up_merge_all() - # else: - # print('CNC加工') - # # print(barcode) - # # a = self.env['sf.tray'].search([('code', '=', barcode)]) - # # print(a) - # # # workorder_obj = self.env['mrp.workorder'].search([('tray_code', '=', barcode)], limit=1) - # # workorder_obj = self.env['mrp.workorder'].search([('tray_code', '=', barcode)]) - # # e = workorder_obj.id - # # print(workorder_obj) - # # action = { - # # 'name': '工单', - # # 'type': 'ir.actions.act_window', - # # # 'view_type': 'form', - # # 'view_mode': 'form', - # # 'res_model': 'mrp.workorder', - # # 'view_id': self.env.ref('mrp.mrp_production_workorder_form_view_inherit').id, - # # # 'res_id': workorder_obj.id, - # # 'res_id': 1023, - # # 'target': 'current', - # # # 'context': self.env.context, - # # # 'flags': {'initial_mode': 'edit'}, - # # } - # # return action - # - # elif self.routing_type == '后置三元质量检测': - # print('后置三元检测') - # elif self.routing_type == '解除装夹': - # print("我是解除装夹") - # else: - # pass - # - # else: - # self.pro_code_ok = workorder.pro_code_is_ok(barcode) + def on_barcode_scanned(self, barcode): + workorder = self.env['mrp.workorder'].browse(self.ids) + # workorder = self.env['mrp.workorder'].search( + # [('routing_type', '=', '装夹预调'), ('production_id', '=', self.production_id.id)]) + if workorder: + if workorder.routing_type == '装夹预调': + stock_move_line = self.env['stock.move.line'].search([('lot_name', '=', barcode)]) + if stock_move_line.product_id.categ_type == '夹具': + workorder.write({ + 'tray_serial_number': stock_move_line.lot_name, + 'tray_product_id': stock_move_line.product_id.id, + 'tray_brand_id': stock_move_line.product_id.brand_id.id, + 'tray_type_id': stock_move_line.product_id.fixture_material_id.id, + 'tray_model_id': stock_move_line.product_id.fixture_model_id.id + }) + workorder.button_start() + else: + embryo_stock_lot = self.env['stock.lot'].search([('name', '=', barcode)]) + if embryo_stock_lot: + embryo_stock_move_line = self.env['stock.move.line'].search( + [('product_id', '=', embryo_stock_lot.product_id.id), + ('reference', '=', workorder.production_id.name), + ('lot_id', '=', embryo_stock_lot.id), + ('product_category_name', '=', '坯料')]) + if embryo_stock_move_line: + workpiece_delivery = self.env['sf.workpiece.delivery'].search( + [('workorder_id', '=', workorder.id)], limit=1, order='id asc') + if workpiece_delivery: + embryo_workpiece_code = workpiece_delivery.workpiece_code + if workpiece_delivery.workpiece_code and embryo_stock_lot.name not in \ + workpiece_delivery.workpiece_code: + embryo_workpiece_code = workpiece_delivery.workpiece_code + ',' + \ + embryo_stock_lot.name + if not workpiece_delivery.workpiece_code: + embryo_workpiece_code = embryo_stock_lot.name + workpiece_delivery.write({'workpiece_code': embryo_workpiece_code}) + else: + raise UserError('工件生产线不一致,请重新确认') -class WorkpieceDelivery(models.Model): - _name = 'sf.workpiece.delivery' - _description = '工件配送单列表' +class WorkPieceDelivery(models.Model): + _name = "sf.workpiece.delivery" + _description = '工件配送' - name = fields.Char('工件编码/任务编码') - mrp_workorder_id = fields.Many2one('mrp.workorder', string='工件编码/任务编码', - domain=[('name', 'in', ('装夹', '解除装夹'))]) + workorder_id = fields.Many2one('mrp.workorder', string='工单', readonly=True) + production_id = fields.Many2one('mrp.production', string='制造订单', readonly=True) + production_line_id = fields.Many2one('sf.production.line', compute='_compute_production_line_id', + string='目标生产线', readonly=True, + store=True) + plan_start_processing_time = fields.Datetime('计划开始加工时间', readonly=True) workpiece_code = fields.Char('同运工件编码') feeder_station_start = fields.Char('起点接驳站') feeder_station_destination = fields.Char('目的接驳站') - production_line_id = fields.Many2one('sf.production.line', string='目标生产线') task_delivery_time = fields.Datetime('任务下发时间') task_completion_time = fields.Datetime('任务完成时间') delivery_time = fields.Char('配送时长', compute='_compute_delivery_time') status = fields.Selection([('待下发', '待下发'), ('待配送', '待配送'), ('已配送', '已配送')], string='状态', default='待下发') + @api.depends('production_id.production_line_id') + def _compute_production_line_id(self): + if self.production_id.production_line_id: + self.production_line_id = self.production_id.production_line_id.id + self.plan_start_processing_time = self.production_id.plan_start_processing_time + @api.depends('task_delivery_time', 'task_completion_time') def _compute_delivery_time(self): for obj in self: diff --git a/sf_manufacturing/models/stock.py b/sf_manufacturing/models/stock.py index 06269fc5..f13abf6b 100644 --- a/sf_manufacturing/models/stock.py +++ b/sf_manufacturing/models/stock.py @@ -359,7 +359,6 @@ class ReStockMove(models.Model): materiel_height = fields.Float(string='物料高度', digits=(16, 4)) def _get_new_picking_values_Res(self, item, sorted_workorders, rescode): - logging.info('new_picking-rescode: %s' % rescode) return { 'name': self.env['stock.picking']._get_name_Res(rescode), 'origin': item.name, @@ -373,165 +372,21 @@ class ReStockMove(models.Model): 'state': 'confirmed', } - # 将采购到的夹具注册到Cloud - def _register_fixture(self): - create_url = '/api/factory_fixture_material/create' - config = self.env['res.config.settings'].get_values() - headers = Common.get_headers(self, config['token'], config['sf_secret_key']) - strurl = config['sf_url'] + create_url - for item in self: - val = { - 'token': config['token'], - 'name': item.product_id.name, - 'brand_code': self.env['sf.machine.brand'].search([('id', '=', item.product_id.brand_id.id)]).code, - 'fixture_material_code': self.env['sf.fixture.material'].search( - [('id', '=', item.product_id.fixture_material_id.id)]).code, - 'fixture_materials_type_code': self.env['sf.materials.model'].search( - [('id', '=', item.product_id.materials_type_id.id)]).materials_no, - 'fixture_clamping_way': item.product_id.fixture_clamping_way, - 'fixture_port_type': item.product_id.fixture_port_type, - 'fixture_length': item.product_id.tool_length, - 'fixture_width': item.product_id.tool_width, - 'fixture_height': item.product_id.tool_height, - 'fixture_weight': item.product_id.tool_weight, - 'fixture_amount': int(item.quantity_done), - 'fixture_model_file': '' if not item.product_id.fixture_model_file else base64.b64encode( - item.product_id.fixture_model_file).decode( - 'utf-8'), - 'fixture_clamp_workpiece_length_max': item.product_id.fixture_clamp_workpiece_length_max, - 'fixture_clamp_workpiece_width_max': item.product_id.fixture_clamp_workpiece_width_max, - 'fixture_clamp_workpiece_height_max': item.product_id.fixture_clamp_workpiece_height_max, - 'fixture_clamp_workpiece_diameter_max': item.product_id.fixture_clamp_workpiece_diameter_max, - 'fixture_maximum_carrying_weight': item.product_id.fixture_maximum_carrying_weight, - 'fixture_maximum_clamping_force': item.product_id.fixture_maximum_clamping_force, - 'fixture_driving_way': '' if not item.product_id.fixture_driving_way - else item.product_id.fixture_driving_way, - 'fixture_apply_machine_tool_type_codes': self.env[ - 'product.template']._json_apply_machine_tool_type_item_code(item), - 'fixture_through_hole_size': item.product_id.fixture_through_hole_size, - 'fixture_screw_size': item.product_id.fixture_screw_size, - } - try: - if item.product_id.industry_code: - val['industry_code'] = item.product_id.industry_code - ret = requests.post(strurl, json={}, data=val, headers=headers) - ret = ret.json() - if ret['status'] == 200: - if not item.product_id.industry_code: - item.product_id.write({'register_state': '已注册', 'industry_code': ret['industry_code']}) - else: - item.product_id.write({'register_state': '已注册'}) - else: - item.product_id.write({'register_state': '注册失败'}) - except Exception as e: - raise UserError("注册夹具到云端失败,请联系管理员!") - - # 将采购到的刀具注册到Cloud - def _register_cutting_tool(self): - create_url = '/api/factory_cutting_tool_material/create' - config = self.env['res.config.settings'].get_values() - headers = Common.get_headers(self, config['token'], config['sf_secret_key']) - strurl = config['sf_url'] + create_url - for item in self: - val = { - 'token': config['token'], - 'name': item.product_id.name, - 'brand_code': self.env['sf.machine.brand'].search([('id', '=', item.product_id.brand_id.id)]).code, - 'cutting_tool_material_code': self.env['sf.cutting.tool.material'].search( - [('id', '=', item.product_id.cutting_tool_material_id.id)]).code, - 'cutting_tool_type_code': self.env['sf.cutting.tool.type'].search( - [('id', '=', item.product_id.cutting_tool_type_id.id)]).code, - 'material_model_code': self.env['sf.materials.model'].search( - [('id', '=', item.product_id.materials_type_id.id)]).materials_no, - 'tool_length': item.product_id.tool_length, - 'tool_width': item.product_id.tool_width, - 'tool_height': item.product_id.tool_height, - 'tool_thickness': item.product_id.tool_thickness, - 'tool_weight': item.product_id.tool_weight, - 'tool_hardness': item.product_id.tool_hardness, - 'coating_material': item.product_id.coating_material, - 'amount': int(item.quantity_done), - # 'model_file': '' if not item.product_id.fixture_model_file else base64.b64encode( - # item.product_id.fixture_model_file).decode( - # 'utf-8'), - 'total_length': item.product_id.cutting_tool_total_length, - 'shank_length': item.product_id.cutting_tool_shank_length, - 'blade_length': item.product_id.cutting_tool_blade_length, - 'neck_length': item.product_id.cutting_tool_neck_length, - 'neck_diameter': item.product_id.cutting_tool_neck_diameter, - 'shank_diameter': item.product_id.cutting_tool_shank_diameter, - 'blade_tip_diameter': item.product_id.cutting_tool_blade_tip_diameter, - 'blade_tip_taper': item.product_id.cutting_tool_blade_tip_taper, - 'blade_helix_angle': item.product_id.cutting_tool_blade_helix_angle, - 'blade_type': item.product_id.cutting_tool_blade_type, - 'coarse_medium_fine': '' if item.product_id.cutting_tool_coarse_medium_fine is False - else item.product_id.cutting_tool_coarse_medium_fine, - 'run_out_accuracy_max': item.product_id.cutting_tool_run_out_accuracy_max, - 'run_out_accuracy_min': item.product_id.cutting_tool_run_out_accuracy_min, - 'head_diameter': item.product_id.cutting_tool_head_diameter, - 'diameter': item.product_id.cutting_tool_diameter, - 'blade_number': '' if item.product_id.cutting_tool_blade_number is False - else item.product_id.cutting_tool_blade_number, - 'front_angle': item.product_id.cutting_tool_front_angle, - 'rear_angle': item.product_id.cutting_tool_rear_angle, - 'main_included_angle': item.product_id.cutting_tool_main_included_angle, - 'chuck_codes': self.env['product.template']._json_chuck_item_code(item), - 'cutter_bar_codes': self.env['product.template']._json_cutter_bar_item_code(item), - 'cutter_pad_codes': self.env['product.template']._json_cutter_pad_item_code(item), - 'blade_codes': self.env['product.template']._json_blade_item_code(item), - 'handle_codes': self.env['product.template']._json_handle_item_code(item), - 'nut': item.product_id.cutting_tool_nut, - 'top_angle': item.product_id.cutting_tool_top_angle, - 'jump_accuracy': item.product_id.cutting_tool_jump_accuracy, - 'working_hardness': item.product_id.cutting_tool_working_hardness, - 'blade_diameter': item.product_id.cutting_tool_blade_diameter, - 'wrench': item.product_id.cutting_tool_wrench, - 'accuracy_level': item.product_id.cutting_tool_accuracy_level, - 'clamping_way': item.product_id.cutting_tool_clamping_way, - 'clamping_length': item.product_id.cutting_tool_clamping_length, - 'clamping_tolerance': item.product_id.cutting_tool_clamping_tolerance, - 'diameter_max': item.product_id.cutting_tool_diameter_max, - 'clamping_diameter_min': item.product_id.cutting_tool_clamping_diameter_min, - 'clamping_diameter_max': item.product_id.cutting_tool_clamping_diameter_max, - 'detection_accuracy_max': item.product_id.cutting_tool_detection_accuracy_max, - 'detection_accuracy_min': item.product_id.cutting_tool_detection_accuracy_min, - 'is_rough_finish': item.product_id.cutting_tool_is_rough_finish, - 'is_finish': item.product_id.cutting_tool_is_finish, - 'is_drill_hole': item.product_id.cutting_tool_is_drill_hole, - 'is_safety_lock': item.product_id.cutting_tool_is_safety_lock, - 'is_high_speed_cutting': item.product_id.cutting_tool_is_high_speed_cutting, - 'dynamic_balance_class': item.product_id.cutting_tool_dynamic_balance_class, - 'change_time': item.product_id.cutting_tool_change_time, - 'standard_speed': item.product_id.cutting_tool_standard_speed, - 'speed_max': item.product_id.cutting_tool_speed_max, - 'cooling_type': item.product_id.cutting_tool_cooling_type, - 'body_accuracy': item.product_id.cutting_tool_body_accuracy, - 'apply_lock_nut_model': item.product_id.apply_lock_nut_model, - 'apply_lock_wrench_model': item.product_id.apply_lock_wrench_model, - 'tool_taper': item.product_id.cutting_tool_taper, - 'flange_length': item.product_id.cutting_tool_flange_length, - 'flange_diameter': item.product_id.cutting_tool_flange_diameter, - 'outer_diameter': item.product_id.cutting_tool_outer_diameter, - 'inner_diameter': item.product_id.cutting_tool_inner_diameter, - 'cooling_suit_type_ids': item.product_id.cooling_suit_type_ids, - 'er_size_model': item.product_id.cutting_tool_er_size_model, - 'image': '' if not item.product_id.image_1920 else - base64.b64encode(item.product_id.image_1920).decode('utf-8'), - } - try: - if item.product_id.industry_code: - val['industry_code'] = item.product_id.industry_code - ret = requests.post(strurl, json={}, data=val, headers=headers) - ret = ret.json() - if ret['status'] == 200: - if not item.product_id.industry_code: - item.product_id.write({'register_state': '已注册', 'industry_code': ret['industry_code']}) - else: - item.product_id.write({'register_state': '已注册'}) - else: - item.product_id.write({'register_state': '注册失败'}) - except Exception as e: - raise UserError("注册刀具到云端失败,请联系管理员!") + def print_serial_numbers(self): + if not self.next_serial: + raise UserError(_("请先分配序列号再进行打印")) + label_data = [] + for item in self.move_line_ids: + label_data.append({ + 'item_id': item.id, + }) + if label_data: + report_template = self.env.ref('stock.label_package_template') + res = report_template.report_action(label_data) + res['id'] = report_template.id + return res + else: + raise UserError(_("没有可打印的标签数据")) class ReStockQuant(models.Model): diff --git a/sf_manufacturing/security/ir.model.access.csv b/sf_manufacturing/security/ir.model.access.csv index 52545bcf..2e62b610 100644 --- a/sf_manufacturing/security/ir.model.access.csv +++ b/sf_manufacturing/security/ir.model.access.csv @@ -25,6 +25,8 @@ access_mrp_workcenter_productivity_manager,mrp_workcenter_productivity,model_mrp access_sf_workpiece_delivery,sf_workpiece_delivery,model_sf_workpiece_delivery,sf_base.group_sf_mrp_user,1,0,0,0 access_sf_workpiece_delivery_manager,sf_workpiece_delivery,model_sf_workpiece_delivery,sf_base.group_sf_mrp_manager,1,1,1,0 +access_sf_workpiece_delivery_admin,sf_workpiece_delivery_admin,model_sf_workpiece_delivery,base.group_system,1,1,1,0 + access_mrp_workcenter_productivity_loss_manager,mrp.workcenter.productivity.loss,mrp.model_mrp_workcenter_productivity_loss,sf_base.group_sf_mrp_user,1,1,1,0 access_mrp_workcenter_productivity_loss,mrp.workcenter.productivity.loss,mrp.model_mrp_workcenter_productivity_loss,sf_base.group_sf_mrp_user,1,0,0,0 diff --git a/sf_manufacturing/views/mrp_production_addional_change.xml b/sf_manufacturing/views/mrp_production_addional_change.xml index ccf6c19c..b93ad455 100644 --- a/sf_manufacturing/views/mrp_production_addional_change.xml +++ b/sf_manufacturing/views/mrp_production_addional_change.xml @@ -18,19 +18,21 @@ - + - + - + - - - + + + @@ -39,44 +41,54 @@ + attrs="{'invisible': [('state', 'not in', ['confirmed', 'progress'])]}" + optional="hide" + decoration-success="reservation_state == 'assigned' or components_availability_state == 'available'" + decoration-warning="reservation_state != 'assigned' and components_availability_state in ('expected', 'available')" + decoration-danger="reservation_state != 'assigned' and components_availability_state == 'late'"/> - - - - + + + + - - + + custom.mrp.production.form mrp.production - draft,confirmed,progress,pending_processing,completed,done + draft,confirmed,progress,pending_processing,completed,done + - + - + + + + -
- -
- - -
-
+ + + - - stock.barcode.quant.kanban - stock.quant - 1000 - - - - - - -
- -
-
- - - + + stock.barcode.quant.kanban + stock.quant + 1000 + + + + + + +
+ + + +
+
+ + + +
-
- - - - - + + + + + - - stock.quant.kanban.barcode - stock.quant - 1000 - - - - -
-
- + + stock.quant.kanban.barcode + stock.quant + 1000 + + + + +
+
+ + + +
+
+ + + + + +
+
+ + +
+
+ + +
-
- - - - -
-
- -
-
- -
-
- - - - - + + + + + - - stock_barcode.quant.tree.inherit - stock.quant - - primary - - - UoM - show - - - hide - - - hide - - - + + stock_barcode.quant.tree.inherit + stock.quant + + primary + + + UoM + show + + + hide + + + hide + + + diff --git a/stock_barcode/views/stock_picking_views.xml b/stock_barcode/views/stock_picking_views.xml index d61de200..d516844c 100644 --- a/stock_barcode/views/stock_picking_views.xml +++ b/stock_barcode/views/stock_picking_views.xml @@ -1,181 +1,174 @@ - - - stock.move.line.operations.tree.inherit - stock.move.line - - - - - - - - {'barcode_events': True} - field_float_scannable - - - + + + + stock.move.line.kanban.inherited + stock.move.line + + + + + + + + + + - - stock.move.line.kanban.inherited - stock.move.line - - - - - - - - - - - - - stock.picking.form.view.barcode - stock.picking - 1000 - -
- - - -
- -
-
+ + + + + + +
+
+ +
+ - - Open picking form - stock.picking - form - { - 'res_id': active_id, - } - - + + Open picking form + stock.picking + form + { + 'res_id': active_id, + } + + - - stock.picking.view.kanban.barcode - stock.picking - - + + stock.picking.view.kanban.barcode + stock.picking + + - - - - - - + + + + + + - - Operation Types - stock.picking.type - - - - - - - + + Operation Types + stock.picking.type + + + + + + + - - Operation Types - stock.picking.type - - - - - - - - - - - - - - - - - - - - + Operation Types + stock.picking.type + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + +