Merge remote-tracking branch 'origin/feature/接口及CAM用刀' into feature/CAM用刀优化及添加接口
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import json
|
||||||
|
import requests
|
||||||
from odoo import fields, models, api
|
from odoo import fields, models, api
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
from odoo.addons.sf_base.commons.common import Common
|
||||||
|
|
||||||
|
|
||||||
class CuttingToolMaterial(models.Model):
|
class CuttingToolMaterial(models.Model):
|
||||||
@@ -249,3 +253,37 @@ class ToolGroups(models.Model):
|
|||||||
name = fields.Char('名称')
|
name = fields.Char('名称')
|
||||||
equipment_ids = fields.Many2many('maintenance.equipment', 'ref_maintenance_equipment', string='机台号')
|
equipment_ids = fields.Many2many('maintenance.equipment', 'ref_maintenance_equipment', string='机台号')
|
||||||
remark = fields.Char('备注', size=50)
|
remark = fields.Char('备注', size=50)
|
||||||
|
|
||||||
|
# ==========机床刀具组接口==========
|
||||||
|
def _register_tool_groups(self, obj):
|
||||||
|
create_url = '/AutoDeviceApi/FeedBackOut'
|
||||||
|
sf_sync_config = self.env['res.config.settings'].get_values()
|
||||||
|
token = sf_sync_config['token']
|
||||||
|
sf_secret_key = sf_sync_config['sf_secret_key']
|
||||||
|
headers = Common.get_headers(obj, token, sf_secret_key)
|
||||||
|
strurl = sf_sync_config['sf_url'] + create_url
|
||||||
|
device_id = ''
|
||||||
|
for equipment_id in obj.equipment_ids:
|
||||||
|
device_id = '%s,%s' % (device_id, equipment_id.name)
|
||||||
|
val = {
|
||||||
|
'DeviceId': device_id,
|
||||||
|
'GroupName': obj.name,
|
||||||
|
}
|
||||||
|
kw = json.dumps(val, ensure_ascii=False)
|
||||||
|
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
|
||||||
|
ret = r.json()
|
||||||
|
if r == 200:
|
||||||
|
return "机床刀具组发送成功"
|
||||||
|
else:
|
||||||
|
raise ValidationError("机床刀具组发送失败")
|
||||||
|
|
||||||
|
def write(self, vals):
|
||||||
|
obj = super().write(vals)
|
||||||
|
self._register_tool_groups(obj)
|
||||||
|
return obj
|
||||||
|
|
||||||
|
@api.model_create_multi
|
||||||
|
def create(self, vals_list):
|
||||||
|
records = super(ToolGroups, self).create(vals_list)
|
||||||
|
self._register_tool_groups(records)
|
||||||
|
return records
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
<field name="sequence_number"/>
|
<field name="sequence_number"/>
|
||||||
<field name="program_name"/>
|
<field name="program_name"/>
|
||||||
<field name="cnc_id" string="文件"/>
|
<field name="cnc_id" string="文件"/>
|
||||||
|
<field name="functional_tool_type_id"/>
|
||||||
<field name="cutting_tool_name"/>
|
<field name="cutting_tool_name"/>
|
||||||
<field name="cutting_tool_no"/>
|
<field name="cutting_tool_no"/>
|
||||||
<field name="processing_type"/>
|
<field name="processing_type"/>
|
||||||
|
|||||||
@@ -597,6 +597,7 @@ class CNCprocessing(models.Model):
|
|||||||
cnc_id = fields.Many2one('ir.attachment')
|
cnc_id = fields.Many2one('ir.attachment')
|
||||||
sequence_number = fields.Char('序号')
|
sequence_number = fields.Char('序号')
|
||||||
program_name = fields.Char('程序名')
|
program_name = fields.Char('程序名')
|
||||||
|
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
|
||||||
cutting_tool_name = fields.Char('刀具名称')
|
cutting_tool_name = fields.Char('刀具名称')
|
||||||
cutting_tool_no = fields.Char('刀号')
|
cutting_tool_no = fields.Char('刀号')
|
||||||
processing_type = fields.Char('加工类型')
|
processing_type = fields.Char('加工类型')
|
||||||
|
|||||||
@@ -870,21 +870,9 @@ class SfMaintenanceEquipmentTool(models.Model):
|
|||||||
_description = '机床刀位'
|
_description = '机床刀位'
|
||||||
|
|
||||||
equipment_id = fields.Many2one('maintenance.equipment', string='设备')
|
equipment_id = fields.Many2one('maintenance.equipment', string='设备')
|
||||||
product_template_id = fields.Many2one('product.template', string='功能刀具名称',
|
|
||||||
domain="[('categ_type', '=', '刀具')]")
|
|
||||||
image_1920 = fields.Binary('图片', related='product_template_id.image_1920')
|
|
||||||
categ_type = fields.Char(string='功能刀具类型')
|
|
||||||
diameter = fields.Char('直径')
|
|
||||||
precision = fields.Char('粗\中\精')
|
|
||||||
tool_code = fields.Char('功能刀具编码')
|
|
||||||
hilt_name = fields.Char('刀柄名称')
|
|
||||||
hilt_code = fields.Char('刀柄编码')
|
|
||||||
life_value_max = fields.Char('最大寿命值')
|
|
||||||
alarm_value = fields.Char('报警值')
|
|
||||||
used_value = fields.Char('已使用值')
|
|
||||||
code = fields.Char('机床刀位号')
|
|
||||||
|
|
||||||
name = fields.Char('', compute='_compute_name')
|
code = fields.Char('机床刀位号')
|
||||||
|
name = fields.Char('刀位号', compute='_compute_name')
|
||||||
|
|
||||||
@api.depends('code')
|
@api.depends('code')
|
||||||
def _compute_name(self):
|
def _compute_name(self):
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
|
|
||||||
<!-- 设备增加刀具库位table-->
|
设备增加刀具库位table
|
||||||
<record id="sf_manufacturing_hr_equipment_view_form" model="ir.ui.view">
|
<record id="sf_manufacturing_hr_equipment_view_form" model="ir.ui.view">
|
||||||
<field name="name">sf_manufacturing_equipment.form</field>
|
<field name="name">sf_manufacturing_equipment.form</field>
|
||||||
<field name="model">maintenance.equipment</field>
|
<field name="model">maintenance.equipment</field>
|
||||||
@@ -13,17 +13,6 @@
|
|||||||
<field name = 'product_template_ids' >
|
<field name = 'product_template_ids' >
|
||||||
<tree editable='bottom'>
|
<tree editable='bottom'>
|
||||||
<field name="code"/>
|
<field name="code"/>
|
||||||
<field name="product_template_id"/>
|
|
||||||
<field name="image_1920" widget="image"/>
|
|
||||||
<field name="categ_type"/>
|
|
||||||
<field name="diameter"/>
|
|
||||||
<field name="precision"/>
|
|
||||||
<field name="tool_code"/>
|
|
||||||
<field name="hilt_name"/>
|
|
||||||
<field name="hilt_code"/>
|
|
||||||
<field name="life_value_max"/>
|
|
||||||
<field name="alarm_value"/>
|
|
||||||
<field name="used_value"/>
|
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</page>
|
</page>
|
||||||
|
|||||||
@@ -2,3 +2,4 @@
|
|||||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||||
|
|
||||||
from . import custom_quality
|
from . import custom_quality
|
||||||
|
from . import quality
|
||||||
|
|||||||
34
sf_quality/models/quality.py
Normal file
34
sf_quality/models/quality.py
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
import json
|
||||||
|
import requests
|
||||||
|
from odoo import fields, models, api
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
from odoo.addons.sf_base.commons.common import Common
|
||||||
|
|
||||||
|
|
||||||
|
class QualityCheck(models.Model):
|
||||||
|
_inherit = "quality.check"
|
||||||
|
_description = '零件特采'
|
||||||
|
|
||||||
|
# ==========零件特采接口==========
|
||||||
|
def _register_tool_groups(self):
|
||||||
|
create_url = '/AutoDeviceApi/FeedBackOut'
|
||||||
|
sf_sync_config = self.env['res.config.settings'].get_values()
|
||||||
|
token = sf_sync_config['token']
|
||||||
|
sf_secret_key = sf_sync_config['sf_secret_key']
|
||||||
|
headers = Common.get_headers(self, token, sf_secret_key)
|
||||||
|
strurl = sf_sync_config['sf_url'] + create_url
|
||||||
|
val = {
|
||||||
|
'RfidCode': None,
|
||||||
|
}
|
||||||
|
kw = json.dumps(val, ensure_ascii=False)
|
||||||
|
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
|
||||||
|
ret = r.json()
|
||||||
|
if r == 200:
|
||||||
|
return "零件特采发送成功"
|
||||||
|
else:
|
||||||
|
raise ValidationError("零件特采发送失败")
|
||||||
|
|
||||||
|
@api.onchange('quality_state')
|
||||||
|
def _onchange_quality_state(self):
|
||||||
|
if self.quality_state in ['pass', 'fail']:
|
||||||
|
self._register_tool_groups()
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
# -*-coding:utf-8-*-
|
# -*-coding:utf-8-*-
|
||||||
from . import models
|
from . import models
|
||||||
from . import wizard
|
from . import wizard
|
||||||
|
from . import controllers
|
||||||
from odoo import api, SUPERUSER_ID
|
from odoo import api, SUPERUSER_ID
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
'wizard/wizard_view.xml',
|
'wizard/wizard_view.xml',
|
||||||
'views/tool_base_views.xml',
|
'views/tool_base_views.xml',
|
||||||
|
'views/sf_maintenance_equipment.xml',
|
||||||
'views/menu_view.xml',
|
'views/menu_view.xml',
|
||||||
'views/tool_material_search.xml',
|
'views/tool_material_search.xml',
|
||||||
],
|
],
|
||||||
|
|||||||
1
sf_tool_management/controllers/__init__.py
Normal file
1
sf_tool_management/controllers/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import controllers
|
||||||
56
sf_tool_management/controllers/controllers.py
Normal file
56
sf_tool_management/controllers/controllers.py
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import logging
|
||||||
|
import json
|
||||||
|
import base64
|
||||||
|
from odoo import http
|
||||||
|
from odoo.http import request
|
||||||
|
|
||||||
|
|
||||||
|
class Manufacturing_Connect(http.Controller):
|
||||||
|
|
||||||
|
@http.route('/AutoDeviceApi/FeedBackOut', type='json', auth='sf_token', methods=['GET', 'POST'], csrf=False,
|
||||||
|
cors="*")
|
||||||
|
def get_equipment_tool_Info(self, **kw):
|
||||||
|
"""
|
||||||
|
机床当前刀库实时信息
|
||||||
|
:param kw:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
logging.info('get_equipment_tool_Info:%s' % kw)
|
||||||
|
try:
|
||||||
|
datas = request.httprequest.data
|
||||||
|
ret = json.loads(datas)
|
||||||
|
ret = json.loads(ret['result'])
|
||||||
|
logging.info('DeviceId:%s' % ret)
|
||||||
|
equipment = request.env['maintenance.equipment'].sudo().search([('name', '=', ret['DeviceId'])])
|
||||||
|
|
||||||
|
res = {'Succeed': True, 'Datas': []}
|
||||||
|
if equipment:
|
||||||
|
for item in equipment:
|
||||||
|
data = []
|
||||||
|
for equipment_tool_id in item.product_template_ids:
|
||||||
|
functional_tool_id = self.env['sf.functional.cutting.tool.entity'].sudo().search(
|
||||||
|
[('code', '=', equipment_tool_id.tool_code)])
|
||||||
|
alarm_time = None
|
||||||
|
if functional_tool_id.functional_tool_status == '报警':
|
||||||
|
alarm_time = self.env['sf.functional.tool.warning'].sudo().search(
|
||||||
|
[('code', '=', equipment_tool_id.tool_code)]).alarm_time
|
||||||
|
equipment_tool = {
|
||||||
|
'RfidCode': None,
|
||||||
|
'ToolId': equipment_tool_id.code,
|
||||||
|
'ToolName': equipment_tool_id.functional_tool_name_id.name,
|
||||||
|
'MaxLife': equipment_tool_id.life_value_max,
|
||||||
|
'UseLife': equipment_tool_id.used_value,
|
||||||
|
'AddDatetime': equipment_tool_id.tool_install_time,
|
||||||
|
'State': functional_tool_id.functional_tool_status,
|
||||||
|
'WarnDate': alarm_time if alarm_time else False
|
||||||
|
}
|
||||||
|
data.append(equipment_tool)
|
||||||
|
res['Datas'].append({
|
||||||
|
'DeviceId': item.name,
|
||||||
|
'Data': data
|
||||||
|
})
|
||||||
|
except Exception as e:
|
||||||
|
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||||
|
logging.info('get_equipment_tool_Info error:%s' % e)
|
||||||
|
return json.JSONEncoder().encode(res)
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import re
|
import re
|
||||||
|
import json
|
||||||
|
import requests
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from odoo import fields, models, api
|
|
||||||
from odoo import SUPERUSER_ID
|
from odoo import SUPERUSER_ID
|
||||||
|
from odoo import fields, models, api
|
||||||
from odoo.exceptions import ValidationError
|
from odoo.exceptions import ValidationError
|
||||||
|
from odoo.addons.sf_base.commons.common import Common
|
||||||
|
|
||||||
|
|
||||||
class FunctionalCuttingToolEntity(models.Model):
|
class FunctionalCuttingToolEntity(models.Model):
|
||||||
@@ -174,6 +177,34 @@ class FunctionalCuttingToolEntity(models.Model):
|
|||||||
('coarse_middle_thin', '=', self.coarse_middle_thin)]
|
('coarse_middle_thin', '=', self.coarse_middle_thin)]
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
# ==========刀具组接口==========
|
||||||
|
def _register_functional_tool_groups(self, obj):
|
||||||
|
create_url = '/AutoDeviceApi/FeedBackOut'
|
||||||
|
sf_sync_config = self.env['res.config.settings'].get_values()
|
||||||
|
token = sf_sync_config['token']
|
||||||
|
sf_secret_key = sf_sync_config['sf_secret_key']
|
||||||
|
headers = Common.get_headers(obj, token, sf_secret_key)
|
||||||
|
strurl = sf_sync_config['sf_url'] + create_url
|
||||||
|
val = {
|
||||||
|
'ToolName': obj.name,
|
||||||
|
'GroupName': obj.tool_groups_id.name,
|
||||||
|
'ToolId': obj.code
|
||||||
|
}
|
||||||
|
kw = json.dumps(val, ensure_ascii=False)
|
||||||
|
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
|
||||||
|
ret = r.json()
|
||||||
|
if r == 200:
|
||||||
|
return "刀具组发送成功"
|
||||||
|
else:
|
||||||
|
raise ValidationError("刀具组发送失败")
|
||||||
|
|
||||||
|
@api.model_create_multi
|
||||||
|
def create(self, vals):
|
||||||
|
obj = super(FunctionalCuttingToolEntity, self).create(vals)
|
||||||
|
# 调用刀具组接口
|
||||||
|
self._register_functional_tool_groups(obj)
|
||||||
|
return obj
|
||||||
|
|
||||||
|
|
||||||
class FunctionalToolWarning(models.Model):
|
class FunctionalToolWarning(models.Model):
|
||||||
_name = 'sf.functional.tool.warning'
|
_name = 'sf.functional.tool.warning'
|
||||||
@@ -240,7 +271,7 @@ class FunctionalToolWarning(models.Model):
|
|||||||
class StockMoveLine(models.Model):
|
class StockMoveLine(models.Model):
|
||||||
_inherit = 'stock.move.line'
|
_inherit = 'stock.move.line'
|
||||||
_description = '功能刀具出入库记录'
|
_description = '功能刀具出入库记录'
|
||||||
# _order = 'install_tool_time desc'
|
_order = 'date desc'
|
||||||
|
|
||||||
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
|
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
|
||||||
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', store=True,
|
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', store=True,
|
||||||
@@ -594,16 +625,16 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
|||||||
_name = 'sf.cam.work.order.program.knife.plan'
|
_name = 'sf.cam.work.order.program.knife.plan'
|
||||||
_description = 'CAM工单程序用刀计划'
|
_description = 'CAM工单程序用刀计划'
|
||||||
|
|
||||||
name = fields.Char(string='工单任务编号', readonly=False)
|
name = fields.Char('工单任务编号')
|
||||||
cam_procedure_code = fields.Char(string='CAM程序编号', readonly=False)
|
cam_procedure_code = fields.Char('程序名')
|
||||||
cam_cutter_spacing_code = fields.Char(string='CAM刀位号', readonly=False)
|
filename = fields.Char('文件')
|
||||||
|
cam_cutter_spacing_code = fields.Char('刀号')
|
||||||
tool_position_interface_type = fields.Selection(
|
tool_position_interface_type = fields.Selection(
|
||||||
[('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'),
|
[('BT刀柄式', 'BT刀柄式'), ('SK刀柄式', 'SK刀柄式'), ('HSK刀柄式', 'HSK刀柄式'),
|
||||||
('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'),
|
('CAT刀柄式', 'CAT刀柄式'), ('ISO刀盘式', 'ISO刀盘式'), ('DIN刀盘式', 'DIN刀盘式'),
|
||||||
('直装固定式', '直装固定式')], string='刀位接口型号')
|
('直装固定式', '直装固定式')], string='刀位接口型号')
|
||||||
production_line_id = fields.Many2one('sf.production.line', string='生产线', readonly=False,
|
production_line_id = fields.Many2one('sf.production.line', string='生产线', group_expand='_read_group_names')
|
||||||
group_expand='_read_group_names')
|
machine_table_name_id = fields.Many2one('maintenance.equipment', string='机床名称',
|
||||||
machine_table_name_id = fields.Many2one('maintenance.equipment', string='机床名称', readonly=False,
|
|
||||||
domain="[('production_line_id', '=', production_line_id)]")
|
domain="[('production_line_id', '=', production_line_id)]")
|
||||||
machine_table_name = fields.Char(string='机台号', readonly=True, related='machine_table_name_id.name')
|
machine_table_name = fields.Char(string='机台号', readonly=True, related='machine_table_name_id.name')
|
||||||
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', required=True,
|
cutter_spacing_code_id = fields.Many2one('maintenance.equipment.tool', string='刀位号', required=True,
|
||||||
@@ -616,8 +647,9 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
|||||||
|
|
||||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号',
|
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号',
|
||||||
domain=[('product_id.name', '=', '功能刀具')])
|
domain=[('product_id.name', '=', '功能刀具')])
|
||||||
functional_tool_name = fields.Char(string='功能刀具名称', required=True)
|
functional_tool_name = fields.Char(string='功能刀具名称', compute='_compute_functional_tool_name')
|
||||||
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=False)
|
functional_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型', readonly=False)
|
||||||
|
tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组')
|
||||||
diameter = fields.Integer(string='刀具直径(mm)', readonly=False)
|
diameter = fields.Integer(string='刀具直径(mm)', readonly=False)
|
||||||
tool_included_angle = fields.Float(string='刀尖R角(mm)', readonly=False)
|
tool_included_angle = fields.Float(string='刀尖R角(mm)', readonly=False)
|
||||||
tool_loading_length = fields.Float(string='总长度(mm)', readonly=False)
|
tool_loading_length = fields.Float(string='总长度(mm)', readonly=False)
|
||||||
@@ -629,12 +661,28 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
|||||||
L_D = fields.Float(string='L/D值', readonly=False)
|
L_D = fields.Float(string='L/D值', readonly=False)
|
||||||
clearance_length = fields.Float(string='避空长(mm)', readonly=False)
|
clearance_length = fields.Float(string='避空长(mm)', readonly=False)
|
||||||
required_cutting_time = fields.Integer(string='需切削时长', readonly=False)
|
required_cutting_time = fields.Integer(string='需切削时长', readonly=False)
|
||||||
|
process_type = fields.Char('加工类型')
|
||||||
|
margin_x_y = fields.Float('余量_X/Y')
|
||||||
|
margin_z = fields.Float('余量_Z')
|
||||||
|
finish_depth = fields.Float('加工深度')
|
||||||
|
shank_model = fields.Char('刀柄型号')
|
||||||
|
estimated_processing_time = fields.Char('预计加工时间')
|
||||||
|
|
||||||
plan_execute_status = fields.Selection([('0', '待下发'), ('1', '执行中'), ('2', '已完成')],
|
plan_execute_status = fields.Selection([('0', '待下发'), ('1', '执行中'), ('2', '已完成')],
|
||||||
string='计划执行状态', default='0', readonly=False)
|
string='计划执行状态', default='0', readonly=False)
|
||||||
|
|
||||||
sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True)
|
sf_functional_tool_assembly_id = fields.Many2one('sf.functional.tool.assembly', '功能刀具组装', readonly=True)
|
||||||
|
|
||||||
|
@api.depends('diameter', 'tool_included_angle', 'tool_groups_id')
|
||||||
|
def _compute_functional_tool_name(self):
|
||||||
|
for obj in self:
|
||||||
|
if obj.tool_groups_id:
|
||||||
|
obj.functional_tool_name = '%s-D%sR%s' % (
|
||||||
|
obj.tool_groups_id.name, obj.diameter,
|
||||||
|
obj.tool_included_angle)
|
||||||
|
else:
|
||||||
|
obj.functional_tool_name = None
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _read_group_names(self, categories, domain, order):
|
def _read_group_names(self, categories, domain, order):
|
||||||
names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
names = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
||||||
@@ -646,27 +694,34 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
|||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
record = self.env['sf.functional.tool.assembly'].create({
|
record = self.env['sf.functional.tool.assembly'].create({
|
||||||
'barcode_id': self.barcode_id.id,
|
'functional_tool_name': self.functional_tool_name,
|
||||||
'functional_tool_name_id': self.functional_tool_name_id.id,
|
|
||||||
'functional_tool_type_id': self.functional_tool_type_id.id,
|
'functional_tool_type_id': self.functional_tool_type_id.id,
|
||||||
|
'tool_groups_id': self.tool_groups_id.id,
|
||||||
'functional_tool_diameter': self.diameter,
|
'functional_tool_diameter': self.diameter,
|
||||||
'functional_tool_length': self.tool_loading_length,
|
'knife_tip_r_angle': self.tool_included_angle,
|
||||||
'loading_task_source': '0',
|
'tool_loading_length': self.tool_loading_length,
|
||||||
'coarse_middle_thin': None,
|
'functional_tool_length': self.extension_length,
|
||||||
'tool_loading_length': None,
|
'effective_length': self.effective_length,
|
||||||
'applicant': self.env.user.name,
|
'whether_standard_knife': self.whether_standard_knife,
|
||||||
'reason_for_applying': self.reason_for_applying,
|
'coarse_middle_thin': self.coarse_middle_thin,
|
||||||
'use_tool_time': self.need_knife_time,
|
'new_former': self.new_former,
|
||||||
|
'production_line_name_id': self.production_line_id.id,
|
||||||
'machine_tool_name_id': self.machine_table_name_id.id,
|
'machine_tool_name_id': self.machine_table_name_id.id,
|
||||||
'machine_tool_code': self.cam_procedure_code,
|
'cutter_spacing_code_id': self.env['maintenance.equipment.tool'].sudo().search(
|
||||||
'cutter_spacing_code': self.cam_cutter_spacing_code,
|
[('code', '=', self.cam_cutter_spacing_code), ('equipment_id', '=', self.machine_table_name_id.id)]).id,
|
||||||
|
|
||||||
|
'loading_task_source': '0',
|
||||||
|
'applicant': self.env.user.name,
|
||||||
|
'use_tool_time': self.need_knife_time,
|
||||||
|
'reason_for_applying': '工单用刀',
|
||||||
|
|
||||||
'sf_cam_work_order_program_knife_plan_id': self.id
|
'sf_cam_work_order_program_knife_plan_id': self.id
|
||||||
})
|
})
|
||||||
self.sf_functional_tool_assembly_id = record.id
|
self.sf_functional_tool_assembly_id = record.id
|
||||||
|
|
||||||
# 将计划执行状态改为执行中
|
# 将计划执行状态改为执行中
|
||||||
self.env['sf.cam.work.order.program.knife.plan'].search(
|
self.env['sf.cam.work.order.program.knife.plan'].search(
|
||||||
[('barcode_id', '=', self.barcode_id.id)]).write(
|
[('name', '=', self.name), ('functional_tool_name', '=', self.functional_tool_name)]).write(
|
||||||
{'plan_execute_status': '1',
|
{'plan_execute_status': '1',
|
||||||
'applicant': self.env.user.name})
|
'applicant': self.env.user.name})
|
||||||
|
|
||||||
@@ -676,16 +731,50 @@ class CAMWorkOrderProgramKnifePlan(models.Model):
|
|||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
self.env['sf.functional.tool.assembly'].search(
|
self.env['sf.functional.tool.assembly'].search(
|
||||||
[('barcode_id', '=', self.barcode_id.id),
|
[('assembly_order_code', '=', self.sf_functional_tool_assembly_id.assembly_order_code),
|
||||||
('loading_task_source', '=', '0')]).unlink()
|
('loading_task_source', '=', '0')]).unlink()
|
||||||
|
|
||||||
# 将计划执行状态改为待执行,同时清除申请人、功能刀具组装字段数据
|
# 将计划执行状态改为待执行,同时清除申请人、功能刀具组装字段数据
|
||||||
self.env['sf.cam.work.order.program.knife.plan'].search(
|
self.env['sf.cam.work.order.program.knife.plan'].search(
|
||||||
[('barcode_id', '=', self.barcode_id.id)]).write(
|
[('name', '=', self.name), ('functional_tool_name', '=', self.functional_tool_name)]).write(
|
||||||
{'plan_execute_status': '0',
|
{'plan_execute_status': '0',
|
||||||
'applicant': None,
|
'applicant': None,
|
||||||
'sf_functional_tool_assembly_id': None})
|
'sf_functional_tool_assembly_id': None})
|
||||||
|
|
||||||
|
def create_cam_work_plan(self, cnc_processing):
|
||||||
|
"""
|
||||||
|
根据传入的工单信息,查询是否有需要的功能刀具,如果没有则生成CAM工单程序用刀计划
|
||||||
|
"""
|
||||||
|
status = False
|
||||||
|
if cnc_processing.functional_tool_type_id and cnc_processing.cutting_tool_name:
|
||||||
|
functional_tools = self.env['sf.real.time.distribution.of.functional.tools'].sudo().search(
|
||||||
|
[('sf_cutting_tool_type_id', '=', cnc_processing.functional_tool_type_id.id),
|
||||||
|
('name', '=', cnc_processing.cutting_tool_name)])
|
||||||
|
if functional_tools:
|
||||||
|
for functional_tool in functional_tools:
|
||||||
|
if functional_tool.on_tool_stock_num == 0:
|
||||||
|
self.env['sf.cnc.processing'].register_cnc_processing(cnc_processing)
|
||||||
|
if functional_tool.tool_stock_num == 0 and functional_tool.side_shelf_num == 0:
|
||||||
|
status = True
|
||||||
|
else:
|
||||||
|
status = True
|
||||||
|
if status:
|
||||||
|
self.env['sf.cam.work.order.program.knife.plan'].sudo().create({
|
||||||
|
'name': cnc_processing.workorder_id.production_id.name,
|
||||||
|
'cam_procedure_code': cnc_processing.program_name,
|
||||||
|
'filename': cnc_processing.cnc_id.name,
|
||||||
|
'functional_tool_type_id': cnc_processing.functional_tool_type_id.id,
|
||||||
|
'functional_tool_name': cnc_processing.cutting_tool_name,
|
||||||
|
'cam_cutter_spacing_code': cnc_processing.cutting_tool_no,
|
||||||
|
'process_type': cnc_processing.processing_type,
|
||||||
|
'margin_x_y': float(cnc_processing.margin_x_y),
|
||||||
|
'margin_z': float(cnc_processing.margin_z),
|
||||||
|
'finish_depth': float(cnc_processing.depth_of_processing_z),
|
||||||
|
'extension_length': float(cnc_processing.cutting_tool_extension_length),
|
||||||
|
'shank_model': cnc_processing.cutting_tool_handle_type,
|
||||||
|
'estimated_processing_time': cnc_processing.estimated_processing_time,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
class FunctionalToolAssembly(models.Model):
|
class FunctionalToolAssembly(models.Model):
|
||||||
_name = 'sf.functional.tool.assembly'
|
_name = 'sf.functional.tool.assembly'
|
||||||
|
|||||||
@@ -1,9 +1,22 @@
|
|||||||
from odoo import models, api
|
from odoo import models, api, fields
|
||||||
|
|
||||||
|
|
||||||
class SfMaintenanceEquipmentTool(models.Model):
|
class SfMaintenanceEquipmentTool(models.Model):
|
||||||
_inherit = 'maintenance.equipment.tool'
|
_inherit = 'maintenance.equipment.tool'
|
||||||
|
|
||||||
|
functional_tool_name_id = fields.Many2one('sf.functional.cutting.tool.entity', '功能刀具名称')
|
||||||
|
|
||||||
|
image = fields.Binary('图片', related='functional_tool_name_id.image')
|
||||||
|
tool_code = fields.Char('功能刀具编码', related='functional_tool_name_id.code')
|
||||||
|
functional_tool_type = fields.Char('功能刀具类型', related='functional_tool_name_id.sf_cutting_tool_type_id.name')
|
||||||
|
tool_groups = fields.Char('刀具组', related='functional_tool_name_id.tool_groups_id.name')
|
||||||
|
diameter = fields.Integer('直径(mm)', related='functional_tool_name_id.functional_tool_diameter')
|
||||||
|
knife_tip_r_angle = fields.Float('刀尖R角(mm)', related='functional_tool_name_id.knife_tip_r_angle')
|
||||||
|
life_value_max = fields.Integer('最大寿命值(min)', related='functional_tool_name_id.max_lifetime_value')
|
||||||
|
alarm_value = fields.Integer('报警值(min)', related='functional_tool_name_id.alarm_value')
|
||||||
|
used_value = fields.Integer('已使用值(min)', related='functional_tool_name_id.used_value')
|
||||||
|
tool_install_time = fields.Datetime('机内装刀时间')
|
||||||
|
|
||||||
@api.model_create_multi
|
@api.model_create_multi
|
||||||
def create(self, vals_list):
|
def create(self, vals_list):
|
||||||
tools = super().create(vals_list)
|
tools = super().create(vals_list)
|
||||||
|
|||||||
38
sf_tool_management/models/mrp_workorder.py
Normal file
38
sf_tool_management/models/mrp_workorder.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import json
|
||||||
|
import requests
|
||||||
|
from odoo import fields, models, api
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
from odoo.addons.sf_base.commons.common import Common
|
||||||
|
|
||||||
|
|
||||||
|
class CNCprocessing(models.Model):
|
||||||
|
_inherit = 'sf.cnc.processing'
|
||||||
|
_description = 'CNC加工用刀检测'
|
||||||
|
|
||||||
|
# ==========MES装刀指令接口==========
|
||||||
|
def register_cnc_processing(self, cnc_processing):
|
||||||
|
create_url = '/AutoDeviceApi/FeedBackOut'
|
||||||
|
sf_sync_config = self.env['res.config.settings'].get_values()
|
||||||
|
token = sf_sync_config['token']
|
||||||
|
sf_secret_key = sf_sync_config['sf_secret_key']
|
||||||
|
headers = Common.get_headers(self, token, sf_secret_key)
|
||||||
|
strurl = sf_sync_config['sf_url'] + create_url
|
||||||
|
val = {
|
||||||
|
'DeviceId': cnc_processing.workorder_id.machine_tool_name,
|
||||||
|
'RfidCode': None,
|
||||||
|
'ToolId': cnc_processing.cutting_tool_no
|
||||||
|
}
|
||||||
|
kw = json.dumps(val, ensure_ascii=False)
|
||||||
|
r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
|
||||||
|
ret = r.json()
|
||||||
|
if r == 200:
|
||||||
|
return "MES装刀指令发送成功"
|
||||||
|
else:
|
||||||
|
raise ValidationError("MES装刀指令发送失败")
|
||||||
|
|
||||||
|
@api.model_create_multi
|
||||||
|
def create(self, vals):
|
||||||
|
obj = super(CNCprocessing, self).create(vals)
|
||||||
|
# 调用CAM工单程序用刀计划创建方法
|
||||||
|
self.env['sf.cam.work.order.program.knife.plan'].create_cam_work_plan(obj)
|
||||||
|
return obj
|
||||||
32
sf_tool_management/views/sf_maintenance_equipment.xml
Normal file
32
sf_tool_management/views/sf_maintenance_equipment.xml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<!-- 设备增加刀具库位table-->
|
||||||
|
<record id="sf_maintenance_equipment_tool_view_form" model="ir.ui.view">
|
||||||
|
<field name="name">sf_manufacturing_equipment.form</field>
|
||||||
|
<field name="model">maintenance.equipment</field>
|
||||||
|
<field name="inherit_id" ref="sf_manufacturing.sf_manufacturing_hr_equipment_view_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//page[@name='sf_equipment_product_template']" position="replace">
|
||||||
|
<page string="标准刀库" name="sf_equipment_product_template"
|
||||||
|
attrs="{'invisible': [('equipment_type', '!=', '机床')]}">
|
||||||
|
<field name='product_template_ids'>
|
||||||
|
<tree editable='bottom'>
|
||||||
|
<field name="code"/>
|
||||||
|
<field name="tool_code"/>
|
||||||
|
<field name="functional_tool_type"/>
|
||||||
|
<field name="functional_tool_name_id"/>
|
||||||
|
<field name="image" widget="image"/>
|
||||||
|
<field name="tool_groups"/>
|
||||||
|
<field name="diameter"/>
|
||||||
|
<field name="knife_tip_r_angle"/>
|
||||||
|
<field name="life_value_max"/>
|
||||||
|
<field name="alarm_value"/>
|
||||||
|
<field name="used_value"/>
|
||||||
|
<field name="tool_install_time"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</page>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
@@ -756,21 +756,29 @@
|
|||||||
<tree>
|
<tree>
|
||||||
<field name="name" string="工单编码"/>
|
<field name="name" string="工单编码"/>
|
||||||
<field name="cam_procedure_code"/>
|
<field name="cam_procedure_code"/>
|
||||||
|
<field name="filename"/>
|
||||||
|
<field name="functional_tool_name" string="刀具名称"/>
|
||||||
<field name="cam_cutter_spacing_code"/>
|
<field name="cam_cutter_spacing_code"/>
|
||||||
|
<field name="diameter" optional="hide"/>
|
||||||
|
<field name="tool_included_angle" optional="hide"/>
|
||||||
|
<field name="process_type"/>
|
||||||
|
<field name="margin_x_y"/>
|
||||||
|
<field name="margin_z"/>
|
||||||
|
<field name="finish_depth"/>
|
||||||
|
<field name="extension_length" string="刀具伸出长度(mm)"/>
|
||||||
|
<field name="shank_model"/>
|
||||||
|
<field name="estimated_processing_time"/>
|
||||||
|
<field name="need_knife_time"/>
|
||||||
|
<field name="applicant_time"/>
|
||||||
|
<field name="plan_execute_status"/>
|
||||||
|
|
||||||
<field name="production_line_id" invisible="1"/>
|
<field name="production_line_id" invisible="1"/>
|
||||||
<field name="machine_table_name_id" invisible="1"/>
|
<field name="machine_table_name_id" invisible="1"/>
|
||||||
<field name="machine_table_name"/>
|
<field name="machine_table_name" invisible="1"/>
|
||||||
<field name="functional_tool_name"/>
|
<button string="申请装刀" name="apply_for_tooling" type="object" class="btn-primary"
|
||||||
<field name="diameter"/>
|
attrs="{'invisible': [('plan_execute_status', '!=', '0')]}" confirm="是否确认申请装刀"/>
|
||||||
<field name="tool_included_angle"/>
|
<button string="撤回" name="revocation" type="object" class="btn-primary"
|
||||||
<field name="need_knife_time"/>
|
attrs="{'invisible': [('plan_execute_status', '!=', '1')]}" confirm="是否确认撤回装刀"/>
|
||||||
<field name="applicant"/>
|
|
||||||
<field name="applicant_time"/>
|
|
||||||
<field name="plan_execute_status" invisible="0"/>
|
|
||||||
<!-- <button string="申请装刀" name="apply_for_tooling" type="object" class="btn-primary"-->
|
|
||||||
<!-- attrs="{'invisible': [('plan_execute_status', '!=', '0')]}" confirm="是否确认申请装刀"/>-->
|
|
||||||
<!-- <button string="撤回" name="revocation" type="object" class="btn-primary"-->
|
|
||||||
<!-- attrs="{'invisible': [('plan_execute_status', '!=', '1')]}" confirm="是否确认撤回装刀"/>-->
|
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -780,13 +788,13 @@
|
|||||||
<field name="model">sf.cam.work.order.program.knife.plan</field>
|
<field name="model">sf.cam.work.order.program.knife.plan</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
<!-- <header>-->
|
<header>
|
||||||
<!-- <button string="申请装刀" name="apply_for_tooling" type="object" class="btn-primary"-->
|
<button string="申请装刀" name="apply_for_tooling" type="object" class="btn-primary"
|
||||||
<!-- attrs="{'invisible': [('plan_execute_status', '!=', '0')]}" confirm="是否确认申请装刀"/>-->
|
attrs="{'invisible': [('plan_execute_status', '!=', '0')]}" confirm="是否确认申请装刀"/>
|
||||||
<!-- <button string="撤回" name="revocation" type="object" class="btn-primary"-->
|
<button string="撤回" name="revocation" type="object" class="btn-primary"
|
||||||
<!-- attrs="{'invisible': [('plan_execute_status', '!=', '1')]}" confirm="是否确认撤回装刀"/>-->
|
attrs="{'invisible': [('plan_execute_status', '!=', '1')]}" confirm="是否确认撤回装刀"/>
|
||||||
<!-- <field name="plan_execute_status" widget="statusbar" statusbar_visible="0,1,2"/>-->
|
<field name="plan_execute_status" widget="statusbar" statusbar_visible="0,1,2"/>
|
||||||
<!-- </header>-->
|
</header>
|
||||||
|
|
||||||
<sheet>
|
<sheet>
|
||||||
<div class="oe_title">
|
<div class="oe_title">
|
||||||
@@ -797,35 +805,48 @@
|
|||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="cam_procedure_code"/>
|
<field name="cam_procedure_code"/>
|
||||||
|
<field name="filename"/>
|
||||||
|
<field name="production_line_id"/>
|
||||||
|
<field name="machine_table_name_id" string="机台号"/>
|
||||||
<field name="cam_cutter_spacing_code"/>
|
<field name="cam_cutter_spacing_code"/>
|
||||||
<field name="tool_position_interface_type" placeholder="请选择"/>
|
<field name="tool_position_interface_type"/>
|
||||||
<field name="production_line_id" placeholder="请选择"/>
|
|
||||||
<field name="machine_table_name_id" placeholder="请选择"/>
|
|
||||||
<field name="machine_table_name"/>
|
|
||||||
<field name="cutter_spacing_code_id" placeholder="请选择"/>
|
|
||||||
<field name="whether_standard_knife"/>
|
|
||||||
<field name="need_knife_time"/>
|
|
||||||
<field name="applicant"/>
|
|
||||||
<field name="applicant_time"/>
|
|
||||||
<field name="reason_for_applying"/>
|
|
||||||
<field name="sf_functional_tool_assembly_id" string="组装单"/>
|
<field name="sf_functional_tool_assembly_id" string="组装单"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="barcode_id" invisible="1"/>
|
<field name="process_type"/>
|
||||||
|
<field name="margin_x_y"/>
|
||||||
|
<field name="margin_z"/>
|
||||||
|
<field name="finish_depth"/>
|
||||||
|
<field name="estimated_processing_time"/>
|
||||||
|
<field name="need_knife_time"/>
|
||||||
|
<field name="applicant_time"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
<notebook>
|
||||||
|
<page string="刀具信息">
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
<field name="functional_tool_name"/>
|
<field name="functional_tool_name"/>
|
||||||
<field name="functional_tool_type_id" placeholder="请选择"/>
|
<field name="functional_tool_type_id"/>
|
||||||
|
<field name="tool_groups_id"/>
|
||||||
<field name="diameter"/>
|
<field name="diameter"/>
|
||||||
<field name="tool_included_angle"/>
|
<field name="tool_included_angle"/>
|
||||||
|
<field name="new_former"/>
|
||||||
|
<field name="coarse_middle_thin"/>
|
||||||
|
<field name="whether_standard_knife"/>
|
||||||
|
</group>
|
||||||
|
<group>
|
||||||
|
<field name="shank_model"/>
|
||||||
<field name="tool_loading_length"/>
|
<field name="tool_loading_length"/>
|
||||||
<field name="extension_length"/>
|
<field name="extension_length"/>
|
||||||
<field name="effective_length"/>
|
<field name="effective_length"/>
|
||||||
<field name="new_former"/>
|
<field name="required_cutting_time"/>
|
||||||
<field name="coarse_middle_thin"/>
|
|
||||||
<field name="L_D"/>
|
<field name="L_D"/>
|
||||||
<field name="clearance_length"/>
|
<field name="clearance_length"/>
|
||||||
<field name="required_cutting_time"/>
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
|
</page>
|
||||||
|
</notebook>
|
||||||
</sheet>
|
</sheet>
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
@@ -837,20 +858,25 @@
|
|||||||
<search>
|
<search>
|
||||||
<field name="name" string="工单编码"/>
|
<field name="name" string="工单编码"/>
|
||||||
<field name="cam_procedure_code"/>
|
<field name="cam_procedure_code"/>
|
||||||
|
<field name="filename"/>
|
||||||
|
<field name="functional_tool_name" string="刀具名称"/>
|
||||||
<field name="cam_cutter_spacing_code"/>
|
<field name="cam_cutter_spacing_code"/>
|
||||||
<field name="machine_table_name_id" invisible="1"/>
|
<field name="diameter" optional="hide"/>
|
||||||
<field name="production_line_id" invisible="1"/>
|
<field name="tool_included_angle" optional="hide"/>
|
||||||
<field name="machine_table_name"/>
|
<field name="process_type"/>
|
||||||
<field name="functional_tool_name"/>
|
<field name="margin_x_y"/>
|
||||||
<field name="diameter"/>
|
<field name="margin_z"/>
|
||||||
<field name="tool_included_angle"/>
|
<field name="finish_depth"/>
|
||||||
|
<field name="extension_length" string="刀具伸出长度(mm)"/>
|
||||||
|
<field name="shank_model"/>
|
||||||
|
<field name="estimated_processing_time"/>
|
||||||
<field name="need_knife_time"/>
|
<field name="need_knife_time"/>
|
||||||
<field name="applicant"/>
|
|
||||||
<field name="applicant_time"/>
|
<field name="applicant_time"/>
|
||||||
<field name="plan_execute_status" invisible="0"/>
|
<field name="plan_execute_status"/>
|
||||||
<searchpanel>
|
<searchpanel>
|
||||||
<field name="production_line_id" string="生产线" enable_counters="1" icon="fa-filter"/>
|
<field name="production_line_id" string="生产线" enable_counters="1" icon="fa-filter"/>
|
||||||
<field name="machine_table_name_id" string="CNC机床" enable_counters="1" icon="fa-filter"/>
|
<field name="functional_tool_type_id" string="功能刀具类型" enable_counters="1"
|
||||||
|
icon="fa-filter"/>
|
||||||
</searchpanel>
|
</searchpanel>
|
||||||
</search>
|
</search>
|
||||||
</field>
|
</field>
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class ToolChangeRequirementInformation(models.TransientModel):
|
|||||||
replacement_tool_setting_length = fields.Float(string='待换刀具总长度(mm)', required=True)
|
replacement_tool_setting_length = fields.Float(string='待换刀具总长度(mm)', required=True)
|
||||||
replacement_extension_length = fields.Float(string='待换刀具伸出长(mm)')
|
replacement_extension_length = fields.Float(string='待换刀具伸出长(mm)')
|
||||||
replacement_effective_length = fields.Float(string='待换刀具有效长(mm)')
|
replacement_effective_length = fields.Float(string='待换刀具有效长(mm)')
|
||||||
replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], requirded=True,
|
replacement_tool_coarse_middle_thin = fields.Selection([("1", "粗"), ('2', '中'), ('3', '精')], required=True,
|
||||||
string='待换刀具粗/中/精', default='3')
|
string='待换刀具粗/中/精', default='3')
|
||||||
|
|
||||||
replacement_max_lifetime_value = fields.Integer(string='待换刀具最大寿命值(min)')
|
replacement_max_lifetime_value = fields.Integer(string='待换刀具最大寿命值(min)')
|
||||||
|
|||||||
Reference in New Issue
Block a user