Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/工作日历及其设置

This commit is contained in:
mgw
2023-07-13 19:20:05 +08:00
20 changed files with 383 additions and 100 deletions

View File

@@ -156,30 +156,27 @@ if env.user.has_group('mrp.group_mrp_workorder_dependencies'):
</field> </field>
</record> </record>
<record model="ir.actions.act_window" id="mrp_workorder_action_tablet"> <!-- <record model="ir.actions.act_window" id="mrp_workorder_action_tablet">-->
<field name="name">Work Orders</field> <!-- <field name="name">Work Orders</field>-->
<field name="type">ir.actions.act_window</field> <!-- <field name="type">ir.actions.act_window</field>-->
<field name="res_model">mrp.workorder</field> <!-- <field name="res_model">mrp.workorder</field>-->
<field name="view_mode">kanban,tree,form</field>
<field name="view_ids" eval="[(5, 0, 0), <!-- <field name="target">fullscreen</field>-->
(0, 0, {'view_mode': 'kanban', 'view_id': ref('mrp.workcenter_line_kanban')}), <!-- <field name="domain">[('state', 'not in', ['done', 'cancel'])]</field>-->
(0, 0, {'view_mode': 'tree', 'view_id': ref('mrp.mrp_production_workorder_tree_editable_view')}) ]"/> <!-- <field name="context">{'search_default_workcenter_id': active_id}</field>-->
<field name="target">fullscreen</field> <!-- <field name="help" type="html">-->
<field name="domain">[('state', 'not in', ['done', 'cancel'])]</field> <!-- <p class="o_view_nocontent_workorder">-->
<field name="context">{'search_default_workcenter_id': active_id}</field> <!-- No work orders to do!-->
<field name="help" type="html"> <!-- </p><p>-->
<p class="o_view_nocontent_workorder"> <!-- Work orders are operations to do as part of a manufacturing order.-->
No work orders to do! <!-- Operations are defined in the bill of materials or added in the manufacturing order directly.-->
</p><p> <!-- </p><p>-->
Work orders are operations to do as part of a manufacturing order. <!-- Use the table work center control panel to register operations in the shop floor directly.-->
Operations are defined in the bill of materials or added in the manufacturing order directly. <!-- The tablet provides worksheets for your workers and allow them to scrap products, track time,-->
</p><p> <!-- launch a maintenance request, perform quality tests, etc.-->
Use the table work center control panel to register operations in the shop floor directly. <!-- </p>-->
The tablet provides worksheets for your workers and allow them to scrap products, track time, <!-- </field>-->
launch a maintenance request, perform quality tests, etc. <!-- </record>-->
</p>
</field>
</record>
<!-- override to change the no content image --> <!-- override to change the no content image -->
<record model="ir.actions.act_window" id="mrp.mrp_workorder_todo"> <record model="ir.actions.act_window" id="mrp.mrp_workorder_todo">

View File

@@ -1,2 +1,4 @@
from . import models from . import models
from . import commons from . import commons
from . import wizard

View File

@@ -18,6 +18,8 @@
'views/common_view.xml', 'views/common_view.xml',
'views/fixture_view.xml', 'views/fixture_view.xml',
'views/functional_fixture_view.xml', 'views/functional_fixture_view.xml',
'wizard/workpiece_clamping_wizard_view.xml',
'wizard/stock_removal_wizard_view.xml',
'views/menu_view.xml', 'views/menu_view.xml',
"views/tool_views.xml", "views/tool_views.xml",
"views/tool_menu.xml", "views/tool_menu.xml",

View File

@@ -16,7 +16,7 @@ class FunctionalFixture(models.Model):
code = fields.Char(string='编码', readonly=True) code = fields.Char(string='编码', readonly=True)
name = fields.Char(string="名称", size=15, required=True) name = fields.Char(string="名称", size=15, required=True)
functional_fixture_type_id = fields.Many2one('sf.functional.fixture.type', string="功能夹具类型", required=True) type_id = fields.Many2one('sf.functional.fixture.type', string="功能夹具类型", required=True)
zero_chuck_model_ids = fields.Many2many('sf.fixture.model', 'rel_fixture_model_zero_chuck', string="零点卡盘型号", zero_chuck_model_ids = fields.Many2many('sf.fixture.model', 'rel_fixture_model_zero_chuck', string="零点卡盘型号",
required=True, required=True,
domain=[('fixture_material_type', '=', '零点卡盘')]) domain=[('fixture_material_type', '=', '零点卡盘')])

View File

@@ -14,20 +14,20 @@ access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,
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_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_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_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_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_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,base.group_user,1,1,1,1
access_sf_cutting_tool_model,sf_cutting_tool_model,model_sf_cutting_tool_model,base.group_user,1,1,1,1 access_sf_cutting_tool_model,sf_cutting_tool_model,model_sf_cutting_tool_model,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,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_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_material,sf_fixture_material,model_sf_fixture_material,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_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_fixture_model,sf_fixture_model,model_sf_fixture_model,base.group_user,1,1,1,1
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_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_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,base.group_user,1,1,1,1
access_sf_workpiece_clamping_wizard,sf_workpiece_clamping_wizard,model_sf_workpiece_clamping_wizard,base.group_user,1,1,1,1
access_sf_stock_removal_wizard,sf_stock_removal_wizard,model_sf_stock_removal_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
14 access_sf_production_process_parameter sf_production_process_parameter model_sf_production_process_parameter base.group_user 1 1 1 1
15 access_sf_production_process_category sf_production_process_category model_sf_production_process_category base.group_user 1 1 1 1
16 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
17 access_sf_cutting_tool_type access_sf_cutting_tool_material sf_cutting_tool_type sf_cutting_tool_material model_sf_cutting_tool_type model_sf_cutting_tool_material base.group_user 1 1 1 1
18 access_sf_cutting_tool_model access_sf_cutting_tool_type sf_cutting_tool_model sf_cutting_tool_type model_sf_cutting_tool_model model_sf_cutting_tool_type base.group_user 1 1 1 1
19 access_sf_functional_cutting_tool access_sf_cutting_tool_model sf_functional_cutting_tool sf_cutting_tool_model model_sf_functional_cutting_tool model_sf_cutting_tool_model base.group_user 1 1 1 1
20 access_sf_functional_cutting_tool_model access_sf_functional_cutting_tool sf_functional_cutting_tool_model sf_functional_cutting_tool model_sf_functional_cutting_tool_model model_sf_functional_cutting_tool base.group_user 1 1 1 1
21 access_sf_fixture_material access_sf_functional_cutting_tool_model sf_fixture_material sf_functional_cutting_tool_model model_sf_fixture_material model_sf_functional_cutting_tool_model 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_functional_fixture_type sf_functional_fixture_type model_sf_functional_fixture_type base.group_user 1 1 1 1
22 access_sf_functional_fixture access_sf_fixture_material sf_functional_fixture sf_fixture_material model_sf_functional_fixture model_sf_fixture_material base.group_user 1 1 1 1
23 access_sf_multi_mounting_type sf_multi_mounting_type model_sf_multi_mounting_type base.group_user 1 1 1 1
24 access_sf_fixture_model sf_fixture_model model_sf_fixture_model base.group_user 1 1 1 1
25 access_sf_functional_fixture_type sf_functional_fixture_type model_sf_functional_fixture_type base.group_user 1 1 1 1
26 access_sf_functional_fixture sf_functional_fixture model_sf_functional_fixture base.group_user 1 1 1 1
27 access_sf_workpiece_clamping_wizard sf_workpiece_clamping_wizard model_sf_workpiece_clamping_wizard base.group_user 1 1 1 1
28 access_sf_stock_removal_wizard sf_stock_removal_wizard model_sf_stock_removal_wizard base.group_user 1 1 1 1
29
30
31
32
33

View File

@@ -82,7 +82,7 @@
<tree string="功能夹具"> <tree string="功能夹具">
<field name="code"/> <field name="code"/>
<field name="name"/> <field name="name"/>
<field name="functional_fixture_type_id"/> <field name="type_id"/>
<field name="zero_chuck_model_ids" widget="many2many_tags"/> <field name="zero_chuck_model_ids" widget="many2many_tags"/>
</tree> </tree>
</field> </field>
@@ -98,7 +98,7 @@
<group> <group>
<field name="code" force_save="1"/> <field name="code" force_save="1"/>
<field name="name"/> <field name="name"/>
<field name="functional_fixture_type_id"/> <field name="type_id"/>
<field name="zero_chuck_model_ids" widget="many2many_tags"/> <field name="zero_chuck_model_ids" widget="many2many_tags"/>
<field name="transfer_tray_model_ids" widget="many2many_tags"/> <field name="transfer_tray_model_ids" widget="many2many_tags"/>
<field name="pneumatic_tray_model_ids" widget="many2many_tags"/> <field name="pneumatic_tray_model_ids" widget="many2many_tags"/>

View File

@@ -0,0 +1,4 @@
# -*- coding: utf-8 -*-
from . import workpiece_clamping_wizard
from . import stock_removal_wizard

View File

@@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
import logging
_logger = logging.getLogger(__name__)
class StockRemovalWizard(models.Model):
_name = 'sf.stock.removal.wizard'
_description = "出库"
code = fields.Char(string="功能夹具编码", size=25, required=True)
name = fields.Char(string="功能夹具名称", size=25, required=True)
type = fields.Char(string="功能夹具类型", required=True)
production_line = fields.Char(string="生产线", required=True)
machine_tool = fields.Many2one('sf.machine_tool', string="机床", required=True)
def submit(self):
return 1

View File

@@ -0,0 +1,36 @@
<openerp>
<data>
<record model="ir.ui.view" id="stock_removal_wizard_form_view">
<field name="name">sf.stock.removal.wizard.form.view</field>
<field name="model">sf.stock.removal.wizard</field>
<field name="arch" type="xml">
<form string="装夹">
<sheet>
<group>
<group>
<field name="code" string="功能夹具编码"></field>
<field name="type" string="类型"></field>
<field name="machine_tool" string="机台"></field>
</group>
<group>
<field name="name" string="功能夹具名称"></field>
<field name="production_line"></field>
</group>
</group>
<footer>
<button string="确定" name="submit" type="object" class="oe_highlight"/>
<button string="取消" class="btn btn-secondary" special="cancel"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="action_stock_removal_wizard" model="ir.actions.act_window">
<field name="name">出库</field>
<field name="res_model">sf.stock.removal.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</openerp>

View File

@@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
import logging
_logger = logging.getLogger(__name__)
class WorkpieceClampingWizard(models.Model):
_name = 'sf.workpiece.clamping.wizard'
_description = "工件装夹"
# 以下为坯料(工件)申请信息
apply_code = fields.Char(string="申请坯料编码", size=25, required=True)
apply_name = fields.Char(string="申请坯料名称", size=25, required=True)
material_id = fields.Many2one('sf.production.materials', string="坯料材料", required=True)
apply_width = fields.Float(string="申请宽度", required=True)
apply_length = fields.Float(string="申请长度", required=True)
apply_height = fields.Float(string="申请高度", required=True)
apply_weight = fields.Float(string="申请重量", required=True)
apply_diameter = fields.Float(string="申请直径", required=True)
surface_accuracy = fields.Char(string="表面精度", required=True)
# 以下为坯料(工件)装夹信息
chuck_name = fields.Char(string="卡盘名称", required=True)
chuck_brand_id = fields.Many2one('sf.machine.brand', string="卡盘品牌", required=True)
chuck_type_id = fields.Char(string="卡盘类型", required=True)
chuck_model_id = fields.Char(string="卡盘型号", required=True)
tray_name = fields.Char(string="托盘名称", required=True)
tray_brand_id = fields.Many2one('sf.machine.brand', string="托盘品牌", required=True)
tray_type_id = fields.Char(string="托盘类型", required=True)
tray_model_id = fields.Char(string="托盘型号", required=True)
real_code = fields.Char(string="真实坯料编码", size=25, required=True)
real_name = fields.Char(string="真实坯料名称", size=25, required=True)
real_width = fields.Float(string="真实宽度", required=True)
real_length = fields.Float(string="真实长度", required=True)
real_height = fields.Float(string="真实高度", required=True)
real_diameter = fields.Float(string="真实直径", required=True)
# 以下为坯料(工件)预调信息
# hole_site = fields.Char(string="孔位", required=True)
# curve = fields.Char(string="曲线", required=True)
# straight_line = fields.Char(string="直线", required=True)
# x_axis = fields.Float(string="X轴", required=True)
# y_axis = fields.Float(string="Y轴", required=True)
# z_axis = fields.Float(string="Z轴", required=True)
# tool_radius = fields.Float(string="刀具半径", required=True)
# tool_length = fields.Float(string="刀具长度", required=True)
# tool_offset_point = fields.Float(string="刀具偏移点", required=True)
# tool_compensation_value = fields.Float(string="刀具补偿值", required=True)
# cutting_spindle_speed = fields.Float(string="切削主轴转速", required=True)
# cutting_feed_rate = fields.Float(string="切削进给速度", required=True)
# depth_of_cutting = fields.Float(string="切削深度", required=True)
# cutting_direction = fields.Char(string="切削方向", required=True)
preset_program_information = fields.Char(string="预调程序信息", required=True)
def submit(self):
return 1

View File

@@ -0,0 +1,87 @@
<openerp>
<data>
<record model="ir.ui.view" id="workpiece_clamping_wizard_form_view">
<field name="name">sf.workpiece.clamping.wizard.form.view</field>
<field name="model">sf.workpiece.clamping.wizard</field>
<field name="arch" type="xml">
<form string="装夹">
<sheet>
<group string="坯料(工件)申请信息">
<group>
<field name="apply_code" string="坯料编码"></field>
<field name="material_id" string="坯料材质"></field>
</group>
<group>
<field name="apply_name" string="坯料名称"></field>
<label for="apply_length" string="尺寸[mm]"/>
<div class="o_address_format">
<label for="apply_length" string="长"/>
<field name="apply_length" class="o_address_zip"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="apply_width" string="宽"/>
<field name="apply_width" class="o_address_zip"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="apply_height" string="高"/>
<field name="apply_height" class="o_address_zip"
options="{'format': false}"/>
</div>
<field name="apply_diameter" string="直径[mm]"></field>
</group>
</group>
<group string="坯料(工件)装夹信息">
<group string="卡盘">
<field name="chuck_type_id"></field>
<field name="chuck_name"></field>
<field name="chuck_brand_id"></field>
<field name="chuck_model_id"></field>
</group>
<group string="托盘">
<field name="tray_type_id"></field>
<field name="tray_name"></field>
<field name="tray_brand_id"></field>
<field name="tray_model_id"></field>
</group>
<group string="坯料">
<field name="real_code" string="坯料编码"></field>
<field name="real_name" string="坯料名称"></field>
<label for="real_length" string="尺寸[mm]"/>
<div class="o_address_format">
<label for="real_length" string="长"/>
<field name="real_length" class="o_address_zip"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="real_width" string="宽"/>
<field name="real_width" class="o_address_zip"
options="{'format': false}"/>
<span>&amp;nbsp;</span>
<label for="real_height" string="高"/>
<field name="real_height" class="o_address_zip"
options="{'format': false}"/>
</div>
<field name="real_diameter" string="直径[mm]"></field>
</group>
</group>
<group>
<group>
<field name="preset_program_information"></field>
</group>
</group>
<footer>
<button string="确定" name="submit" type="object" class="oe_highlight"/>
<button string="取消" class="btn btn-secondary" special="cancel"/>
</footer>
</sheet>
</form>
</field>
</record>
<record id="action_workpiece_clamping_wizard" model="ir.actions.act_window">
<field name="name">装夹</field>
<field name="res_model">sf.workpiece.clamping.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</data>
</openerp>

View File

@@ -33,8 +33,8 @@ class StatusChange(models.Model):
'process_start_time': process_start_time, 'process_start_time': process_start_time,
}, },
} }
url1 = config['bfm_url'] + '/api/get/state/get_order' # url1 = config['bfm_url'] + '/api/get/state/get_order'
requests.post(url1, json=json1, data=None) # requests.post(url1, json=json1, data=None)
logging.info('接口已经执行=============') logging.info('接口已经执行=============')
return res return res
@@ -57,8 +57,8 @@ class StatusChange(models.Model):
'state': '待派单', 'state': '待派单',
}, },
} }
url1 = config['bfm_url'] + '/api/get/state/cancel_order' # url1 = config['bfm_url'] + '/api/get/state/cancel_order'
requests.post(url1, json=json1, data=None) # requests.post(url1, json=json1, data=None)
return res return res

View File

@@ -66,7 +66,7 @@ class SfMaintenanceEquipment(models.Model):
MTcode = fields.Char("编码", default=get_no) MTcode = fields.Char("编码", default=get_no)
created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user) created_user = fields.Many2one('res.users', string='创建人', default=lambda self: self.env.user)
equipment_type = fields.Selection([('机床', '机床')], related='category_id.equipment_type') equipment_type = fields.Selection([('机床', '机床')], related='category_id.equipment_type')
code = fields.Char('行业编码') code = fields.Char('机台号')
name = fields.Char('名称') name = fields.Char('名称')
knife_type = fields.Selection( knife_type = fields.Selection(
[("BT40", "BT40"), ("BT30", "BT30")], [("BT40", "BT40"), ("BT30", "BT30")],
@@ -144,7 +144,16 @@ class SfMaintenanceEquipment(models.Model):
control_system_id = fields.Many2one('sf.machine.control_system', control_system_id = fields.Many2one('sf.machine.control_system',
string="控制系统") string="控制系统")
active = fields.Boolean('有效', default=True) active = fields.Boolean('有效', default=True)
code = fields.Char('编码')
def name_get(self):
result = []
for parameter in self:
if parameter.code:
name = parameter.name + '-' + parameter.code
else:
name = parameter.name
result.append((parameter.id, name))
return result
@api.constrains('rotate_speed') @api.constrains('rotate_speed')
def _check_rotate_speed(self): def _check_rotate_speed(self):

View File

@@ -6,11 +6,14 @@ from odoo import api, fields, models, _
class MrpProduction(models.Model): class MrpProduction(models.Model):
_inherit = 'mrp.production' _inherit = 'mrp.production'
_description = "制造订单" _description = "制造订单"
_order = 'create_date desc'
tray_ids = fields.One2many('sf.tray', 'production_id', string="托盘") tray_ids = fields.One2many('sf.tray', 'production_id', string="托盘")
maintenance_count = fields.Integer(compute='_compute_maintenance_count', string="Number of maintenance requests") maintenance_count = fields.Integer(compute='_compute_maintenance_count', string="Number of maintenance requests")
request_ids = fields.One2many('maintenance.request', 'production_id') request_ids = fields.One2many('maintenance.request', 'production_id')
model_file = fields.Binary('模型文件', related='product_id.model_file') model_file = fields.Binary('模型文件', related='product_id.model_file')
schedule_state = fields.Selection([('未排', '未排'), ('已排', '已排')],
string='排程状态', default='未排')
@api.depends('request_ids') @api.depends('request_ids')
def _compute_maintenance_count(self): def _compute_maintenance_count(self):
@@ -336,7 +339,7 @@ class MrpProduction(models.Model):
current_sequence += 1 current_sequence += 1
if work.name == '获取CNC加工程序': if work.name == '获取CNC加工程序':
work.button_start() work.button_start()
work.fetchCNC() #work.fetchCNC()
# 创建工单并进行排序 # 创建工单并进行排序
def _create_workorder(self): def _create_workorder(self):

View File

@@ -6,7 +6,9 @@ from odoo.addons.resource.models.resource import Intervals
class ResWorkcenter(models.Model): class ResWorkcenter(models.Model):
_inherit = "mrp.workcenter" _inherit = "mrp.workcenter"
machine_tool_id = fields.Many2one('sf.machine_tool', '机床') equipment_id = fields.Many2one('maintenance.equipment', string='设备')
machine_tool_id = fields.Many2one('sf.machine_tool', string='机床')
production_line_id = fields.Many2one('sf.production.line', string='生产线')
is_process_outsourcing = fields.Boolean('工艺外协') is_process_outsourcing = fields.Boolean('工艺外协')
users_ids = fields.Many2many("res.users", 'users_workcenter') users_ids = fields.Many2many("res.users", 'users_workcenter')

View File

@@ -16,7 +16,7 @@ from odoo.addons.sf_mrs_connect.models.ftp_operate import FtpController
class ResMrpWorkOrder(models.Model): class ResMrpWorkOrder(models.Model):
_inherit = 'mrp.workorder' _inherit = 'mrp.workorder'
_order = 'sequence' _order = 'sequence asc,create_date desc'
product_tmpl_id_length = fields.Float(related='production_id.product_tmpl_id.length', readonly=True, store=True, product_tmpl_id_length = fields.Float(related='production_id.product_tmpl_id.length', readonly=True, store=True,
check_company=True, string="坯料长度(mm)") check_company=True, string="坯料长度(mm)")
@@ -28,7 +28,7 @@ class ResMrpWorkOrder(models.Model):
store=True, check_company=True, string="材料") store=True, check_company=True, string="材料")
product_tmpl_id_materials_type_id = fields.Many2one(related='production_id.product_tmpl_id.materials_type_id', product_tmpl_id_materials_type_id = fields.Many2one(related='production_id.product_tmpl_id.materials_type_id',
readonly=True, store=True, check_company=True, string="型号") readonly=True, store=True, check_company=True, string="型号")
workcenter_id = fields.Many2one('mrp.workcenter', required=False) workcenter_id = fields.Many2one('mrp.workcenter', string='工作中心', required=False)
users_ids = fields.Many2many("res.users", 'users_workorder', related="workcenter_id.users_ids") users_ids = fields.Many2many("res.users", 'users_workorder', related="workcenter_id.users_ids")
processing_panel = fields.Char('加工面') processing_panel = fields.Char('加工面')
sequence = fields.Integer(string='工序') sequence = fields.Integer(string='工序')
@@ -106,6 +106,35 @@ class ResMrpWorkOrder(models.Model):
picking_in_id = fields.Many2one('stock.picking', string='外协入库单') picking_in_id = fields.Many2one('stock.picking', string='外协入库单')
picking_out_id = fields.Many2one('stock.picking', string='外协出库单') picking_out_id = fields.Many2one('stock.picking', string='外协出库单')
supplier_id = fields.Many2one('res.partner', string='外协供应商') supplier_id = fields.Many2one('res.partner', string='外协供应商')
equipment_id = fields.Many2one('maintenance.equipment', string='加工设备')
schedule_state = fields.Selection(related='production_id.schedule_state', store=True)
# 工件装夹信息
functional_fixture_code = fields.Char(string="功能夹具编码", readonly=True)
functional_fixture_serial_number = fields.Char(string="功能夹具序列号", readonly=True)
functional_fixture_id = fields.Many2one('sf.functional.fixture', string="功能夹具")
functional_fixture_type_id = fields.Many2one('sf.functional.fixture.type', string="功能夹具类型", readonly=True)
chuck_serial_number = fields.Char(string="卡盘序列号")
chuck_name = fields.Char(string="卡盘名称")
chuck_brand_id = fields.Many2one('sf.machine.brand', string="卡盘品牌")
chuck_type_id = fields.Char(string="卡盘类型")
chuck_model_id = fields.Char(string="卡盘型号")
tray_serial_number = fields.Char(string="卡盘序列号")
tray_name = fields.Char(string="托盘名称")
tray_brand_id = fields.Many2one('sf.machine.brand', string="托盘品牌")
tray_type_id = fields.Char(string="托盘类型")
tray_model_id = fields.Char(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="预调程序信息")
@api.onchange('functional_fixture_id')
def _onchange_functional_fixture_id(self):
if self.functional_fixture_id:
self.functional_fixture_code = self.functional_fixture_id.code
self.functional_fixture_type_id = self.functional_fixture_id.type_id.id
def get_no_data(self, production_id): def get_no_data(self, production_id):
process_parameter_workorder = self.search( process_parameter_workorder = self.search(
@@ -165,7 +194,7 @@ class ResMrpWorkOrder(models.Model):
'operation_id': False, 'operation_id': False,
'name': route.route_workcenter_id.name, 'name': route.route_workcenter_id.name,
'processing_panel': k, 'processing_panel': k,
'quality_point_ids':route.route_workcenter_id.quality_point_ids, 'quality_point_ids': route.route_workcenter_id.quality_point_ids,
'routing_type': route.routing_type, 'routing_type': route.routing_type,
'work_state': '' if not route.routing_type == '获取CNC加工程序' else '待发起', 'work_state': '' if not route.routing_type == '获取CNC加工程序' else '待发起',
'workcenter_id': self.env['mrp.routing.workcenter'].get_workcenter(route.workcenter_ids.ids, 'workcenter_id': self.env['mrp.routing.workcenter'].get_workcenter(route.workcenter_ids.ids,

View File

@@ -231,18 +231,8 @@ class ProductionLot(models.Model):
1] 1]
now = datetime.now().strftime("%Y-%m-%d") now = datetime.now().strftime("%Y-%m-%d")
# formatted_date = now.strftime("%Y-%m-%d") # formatted_date = now.strftime("%Y-%m-%d")
if product.integral_cutting_tool_type_id: if product.cutting_tool_model_id:
return "%s-%s-%03d" % (product.integral_cutting_tool_type_id.code, now, 1) return "%s-%s-%03d" % (product.cutting_tool_model_id.code, now, 1)
if product.blade_type_id:
return "%s-%s-%03d" % (product.blade_type_id.code, now, 1)
if product.cutter_bar_type_id:
return "%s-%s-%03d" % (product.cutter_bar_type_id.code, now, 1)
if product.cutter_pad_type_id:
return "%s-%s-%03d" % (product.cutter_pad_type_id.code, now, 1)
if product.handle_type_id:
return "%s-%s-%03d" % (product.handle_type_id.code, now, 1)
if product.chuck_type_id:
return "%s-%s-%03d" % (product.chuck_type_id.code, now, 1)
return "%s-%03d" % (product.name, 1) return "%s-%03d" % (product.name, 1)

View File

@@ -105,9 +105,9 @@
<xpath expr="//field[@name='company_id']" position="after"> <xpath expr="//field[@name='company_id']" position="after">
<field name="users_ids" widget="many2many_tags" string="可操作用户"/> <field name="users_ids" widget="many2many_tags" string="可操作用户"/>
</xpath> </xpath>
<xpath expr="//field[@name='alternative_workcenter_ids']" position="after"> <xpath expr="//field[@name='alternative_workcenter_ids']" position="after">
<field name="machine_tool_id" domain="[('is_binding','=',False)]"/> <field name="production_line_id"/>
<field name="equipment_id"/>
</xpath> </xpath>
<xpath expr="//field[@name='resource_calendar_id']" position="after"> <xpath expr="//field[@name='resource_calendar_id']" position="after">
<field name="is_process_outsourcing"/> <field name="is_process_outsourcing"/>

View File

@@ -7,6 +7,7 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<field name="name" position="replace"> <field name="name" position="replace">
<field name="is_subcontract" invisible="1"/> <field name="is_subcontract" invisible="1"/>
<field name="name" decoration-success="is_subcontract" decoration-bf="is_subcontract"/> <field name="name" decoration-success="is_subcontract" decoration-bf="is_subcontract"/>
</field> </field>
<field name="name" position="before"> <field name="name" position="before">
@@ -19,6 +20,9 @@
<field name="state" position="after"> <field name="state" position="after">
<field name="work_state" optional="hide"/> <field name="work_state" optional="hide"/>
</field> </field>
<field name="product_id" position="after">
<field name="equipment_id" optional="hide"/>
</field>
<xpath expr="//field[@name='date_planned_start']" position="replace"> <xpath expr="//field[@name='date_planned_start']" position="replace">
<field name="date_planned_start" string="计划开始日期" optional="show"/> <field name="date_planned_start" string="计划开始日期" optional="show"/>
</xpath> </xpath>
@@ -73,7 +77,7 @@
(0, 0, {'view_mode': 'kanban', 'view_id': ref('mrp.workcenter_line_kanban')}) ]"/> (0, 0, {'view_mode': 'kanban', 'view_id': ref('mrp.workcenter_line_kanban')}) ]"/>
<!-- <field name="target">fullscreen</field>--> <!-- <field name="target">fullscreen</field>-->
<field name="target">current</field> <field name="target">current</field>
<field name="domain">[('state', '!=', 'cancel')]</field> <field name="domain">[('state', '!=', 'cancel'),('schedule_state', '=', '已排')]</field>
<field name="context">{'search_default_workcenter_id': active_id}</field> <field name="context">{'search_default_workcenter_id': active_id}</field>
<field name="help" type="html"> <field name="help" type="html">
<p class="o_view_nocontent_workorder"> <p class="o_view_nocontent_workorder">
@@ -91,17 +95,6 @@
</field> </field>
</record> </record>
<!-- <record model="ir.ui.view" id="view_mrp_production_workorder_form_inherit_sf">-->
<!-- <field name="name">mrp.production.workorder.form.inherit.sf</field>-->
<!-- <field name="model">mrp.workorder</field>-->
<!-- <field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>-->
<!-- <field name="arch" type="xml">-->
<!-- <field name="production_id" position="after">-->
<!-- <field name="processing_panel" readonly="1"/>-->
<!-- </field>-->
<!-- </field>-->
<!-- </record>-->
<record id="view_mrp_production_workorder_tray_form_inherit_sf" model="ir.ui.view"> <record id="view_mrp_production_workorder_tray_form_inherit_sf" model="ir.ui.view">
<field name="name">mrp.production.workorder.tray.form.inherit.sf</field> <field name="name">mrp.production.workorder.tray.form.inherit.sf</field>
<field name="model">mrp.workorder</field> <field name="model">mrp.workorder</field>
@@ -111,13 +104,15 @@
<field name='user_permissions' invisible="1"/> <field name='user_permissions' invisible="1"/>
<field name='name' invisible="1"/> <field name='name' invisible="1"/>
<field name='routing_type' invisible="1"/>
<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加工程序')]}"/>
<button name="button_pending" type="object" string="暂停" class="btn-warning" <button name="button_pending" type="object" string="暂停" class="btn-warning"
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"
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"
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加工程序')]}"/>
@@ -125,12 +120,15 @@
context="{'default_workcenter_id': workcenter_id}" class="btn-danger" context="{'default_workcenter_id': workcenter_id}" class="btn-danger"
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[@name='components']" position="attributes">-->
<!-- <attribute name="invisible">1</attribute>-->
<!-- </xpath>-->
<!-- 隐藏物料清单-->
<!-- 隐藏物料清单-->
<!-- <xpath expr="//page[@name='components']" position="attributes">-->
<!-- <attribute name="invisible">1</attribute>-->
<!-- </xpath>-->
<!-- 隐藏物料清单-->
<xpath expr="//page[@name='components']" position="attributes">
<attribute name="string">物料</attribute>
</xpath>
<field name="production_id" position="after" invisible="0"> <field name="production_id" position="after" invisible="0">
<group> <group>
<field name="date_planned_start" invisible="1"/> <field name="date_planned_start" invisible="1"/>
@@ -141,6 +139,14 @@
sum="real duration"/> sum="real duration"/>
<field name="processing_panel" readonly="1" <field name="processing_panel" readonly="1"
attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/> attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/>
<field name="equipment_id"
attrs='{"invisible": [("routing_type","in",("获取CNC加工程序","切割"))]}'/>
<field name="functional_fixture_id"
attrs='{"invisible": [("routing_type","!=","装夹")]}'/>
<field name="functional_fixture_code" force_save="1"
attrs='{"invisible": [("routing_type","!=","装夹")]}'/>
<field name="functional_fixture_type_id" force_save="1"
attrs='{"invisible": [("routing_type","!=","装夹")]}'/>
</group> </group>
<group attrs='{"invisible": [("routing_type","=","获取CNC加工程序")]}'> <group attrs='{"invisible": [("routing_type","=","获取CNC加工程序")]}'>
<div> <div>
@@ -165,36 +171,55 @@
<group> <group>
<div class="col-12 col-lg-6 o_setting_box" style="white-space: nowrap"> <div class="col-12 col-lg-6 o_setting_box" style="white-space: nowrap">
<button type="object" class="oe_highlight" name="fetchCNC" string="获取CNC程序代码" <button type="object" class="oe_highlight" name="fetchCNC" string="获取CNC程序代码"
/> />
</div> </div>
</group> </group>
</page> </page>
</xpath> </xpath>
<!-- <page string="Components" name="components">--> <!-- <page string="Components" name="components">-->
<xpath expr="//page[1]" position="before"> <xpath expr="//page[1]" position="before">
<page string="装夹托盘" attrs='{"invisible": [("routing_type","!=","装夹")]}'> <!-- <page string="装夹托盘" attrs='{"invisible": [("routing_type","!=","装夹")]}'>-->
<group> <!-- <group>-->
<field name="routing_type" invisible="1"/> <!-- <field name="routing_type" invisible="1"/>-->
<field name="tray_code"/> <!-- <field name="tray_code"/>-->
<field name="tray_id" readonly="1"/> <!-- <field name="tray_id" readonly="1"/>-->
</group> <!-- </group>-->
<group> <!-- <group>-->
<field name="pro_code" readonly="1" attrs='{"invisible": [("pro_code_ok","=",False)]}' <!-- <field name="pro_code" readonly="1" attrs='{"invisible": [("pro_code_ok","=",False)]}'-->
style="color:green"/> <!-- style="color:green"/>-->
<field name="pro_code" readonly="1" attrs='{"invisible": [("pro_code_ok","!=",False)]}'/> <!-- <field name="pro_code" readonly="1" attrs='{"invisible": [("pro_code_ok","!=",False)]}'/>-->
<div> <!-- <div>-->
<field name="pro_code_ok" invisible="1"/> <!-- <field name="pro_code_ok" invisible="1"/>-->
</div> <!-- </div>-->
</group> <!-- </group>-->
<div class="col-12 col-lg-6 o_setting_box"> <!-- <div class="col-12 col-lg-6 o_setting_box">-->
<button type="object" class="oe_highlight" name="gettray" string="绑定托盘" <!-- <button type="object" class="oe_highlight" name="gettray" string="绑定托盘"-->
attrs='{"invisible": ["|","|",("tray_id","!=",False),("state","!=","progress"),("production_id","=",False)]}'/> <!-- attrs='{"invisible": ["|","|",("tray_id","!=",False),("state","!=","progress"),("production_id","=",False)]}'/>-->
</div> <!-- </div>-->
<!-- </page>-->
<page string="工件装夹" attrs='{"invisible": [("routing_type","!=","装夹")]}'>
<group>
<group string="卡盘">
<field name="chuck_serial_number"/>
<field name="chuck_name"/>
<field name="chuck_brand_id"/>
<field name="chuck_type_id"/>
<field name="chuck_model_id"/>
</group>
<group string="托盘">
<field name="tray_serial_number"/>
<field name="tray_name"/>
<field name="tray_brand_id"/>
<field name="tray_type_id"/>
<field name="tray_model_id"/>
</group>
</group>
<group string="预调程序信息">
<field name="preset_program_information" colspan="2" nolabel="1"
placeholder="如有预调程序信息请在此处输入....."/>
</group>
</page> </page>
</xpath> </xpath>
@@ -410,5 +435,25 @@
</xpath> </xpath>
</field> </field>
</record> </record>
<record id="mrp_workorder_action_schedule" model="ir.actions.act_window">
<field name="name">工单</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">mrp.workorder</field>
<field name="view_mode">tree,kanban,form</field>
<field name="view_id" ref="mrp.mrp_production_workorder_tree_editable_view"/>
<field name="search_view_id" ref="mrp.view_mrp_production_work_order_search"/>
<field name="domain">[('schedule_state', '=', '已排')]</field>
</record>
<menuitem id="menu_mrp_workorder_schedule_todo"
name="工单"
action="mrp_workorder_action_schedule"
parent="mrp.menu_mrp_manufacturing"
sequence="15"/>
<record id="mrp.menu_mrp_workorder_todo" model="ir.ui.menu">
<field name="active" eval="False"/>
</record>
</odoo> </odoo>

View File

@@ -1771,7 +1771,7 @@ class SyncFunctionalFixture(models.Model):
self.env['sf.functional.fixture'].create({ self.env['sf.functional.fixture'].create({
"name": item['name'], "name": item['name'],
"code": item['code'], "code": item['code'],
"functional_fixture_type_id": self.env['sf.functional.fixture.type'].search( "type_id": self.env['sf.functional.fixture.type'].search(
[("code", '=', item['functional_fixture_type_code'])]).id, [("code", '=', item['functional_fixture_type_code'])]).id,
"zero_chuck_model_ids": self._get_fixture_model_ids(item['zero_chuck_model_codes']), "zero_chuck_model_ids": self._get_fixture_model_ids(item['zero_chuck_model_codes']),
"transfer_tray_model_ids": self._get_fixture_model_ids( "transfer_tray_model_ids": self._get_fixture_model_ids(
@@ -1785,7 +1785,7 @@ class SyncFunctionalFixture(models.Model):
else: else:
functional_fixture.write({ functional_fixture.write({
"name": item['name'], "name": item['name'],
"functional_fixture_type_id": self.env['sf.functional.fixture.type'].search( "type_id": self.env['sf.functional.fixture.type'].search(
[("code", '=', item['functional_fixture_type_code'])]).id, [("code", '=', item['functional_fixture_type_code'])]).id,
"zero_chuck_model_ids": self._get_fixture_model_ids(item['zero_chuck_model_codes']), "zero_chuck_model_ids": self._get_fixture_model_ids(item['zero_chuck_model_codes']),
"transfer_tray_model_ids": self._get_fixture_model_ids( "transfer_tray_model_ids": self._get_fixture_model_ids(
@@ -1820,7 +1820,7 @@ class SyncFunctionalFixture(models.Model):
self.env['sf.functional.fixture'].create({ self.env['sf.functional.fixture'].create({
"name": item['name'], "name": item['name'],
"code": item['code'], "code": item['code'],
"functional_fixture_type_id": self.env['sf.functional.fixture.type'].search( "type_id": self.env['sf.functional.fixture.type'].search(
[("code", '=', item['functional_fixture_type_code'])]).id, [("code", '=', item['functional_fixture_type_code'])]).id,
"zero_chuck_model_ids": self._get_fixture_model_ids(item['zero_chuck_model_codes']), "zero_chuck_model_ids": self._get_fixture_model_ids(item['zero_chuck_model_codes']),
"transfer_tray_model_ids": self._get_fixture_model_ids( "transfer_tray_model_ids": self._get_fixture_model_ids(
@@ -1834,7 +1834,7 @@ class SyncFunctionalFixture(models.Model):
else: else:
functional_fixture.write({ functional_fixture.write({
"name": item['name'], "name": item['name'],
"functional_fixture_type_id": self.env['sf.functional.fixture.type'].search( "type_id": self.env['sf.functional.fixture.type'].search(
[("code", '=', item['functional_fixture_type_code'])]).id, [("code", '=', item['functional_fixture_type_code'])]).id,
"zero_chuck_model_ids": self._get_fixture_model_ids(item['zero_chuck_model_codes']), "zero_chuck_model_ids": self._get_fixture_model_ids(item['zero_chuck_model_codes']),
"transfer_tray_model_ids": self._get_fixture_model_ids( "transfer_tray_model_ids": self._get_fixture_model_ids(