1、库位变更接口、库位信息接口优化;2、功能刀具预警模型优化;
This commit is contained in:
@@ -396,34 +396,66 @@ class Manufacturing_Connect(http.Controller):
|
||||
OldDeciveStart = ret['OldDeciveStart']
|
||||
OldDeciveEnd = ret['OldDeciveEnd']
|
||||
|
||||
temp_val_sn_id = None
|
||||
old_localtion = None
|
||||
# if ChangeType == 'Part' or ChangeType == 'Tool':
|
||||
stock_lot_obj = request.env['stock.lot'].sudo().search(
|
||||
[('rfid', '=', RfidCode)], limit=1)
|
||||
logging.info('stock_lot_obj===========:%s' % stock_lot_obj)
|
||||
if not stock_lot_obj:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未根据RfidCode找到该产品'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if OldPosition:
|
||||
old_localtion = request.env['sf.shelf.location'].sudo().search(
|
||||
[('barcode', '=', OldPosition)], limit=1)
|
||||
logging.info('old_localtion===========:%s' % old_localtion)
|
||||
new_localtion = request.env['sf.shelf.location'].sudo().search(
|
||||
[('barcode', '=', NewPosition)], limit=1)
|
||||
logging.info('new_localtion===========:%s' % new_localtion)
|
||||
if not new_localtion:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有该目标位置'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if old_localtion:
|
||||
temp_val_sn_id = old_localtion.product_sn_id
|
||||
logging.info('temp_val_sn_id===========:%s' % temp_val_sn_id)
|
||||
old_localtion.product_sn_id = None
|
||||
new_localtion.product_sn_id = temp_val_sn_id
|
||||
logging.info('====1======')
|
||||
else:
|
||||
new_localtion.product_sn_id = stock_lot_obj.id
|
||||
logging.info('=====2======')
|
||||
if ChangeType == 'Part':
|
||||
temp_val_sn_id = None
|
||||
old_localtion = None
|
||||
# if ChangeType == 'Part' or ChangeType == 'Tool':
|
||||
stock_lot_obj = request.env['stock.lot'].sudo().search(
|
||||
[('rfid', '=', RfidCode)], limit=1)
|
||||
logging.info('stock_lot_obj===========:%s' % stock_lot_obj)
|
||||
if not stock_lot_obj:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '未根据RfidCode找到该产品'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if OldPosition:
|
||||
old_localtion = request.env['sf.shelf.location'].sudo().search(
|
||||
[('barcode', '=', OldPosition)], limit=1)
|
||||
logging.info('old_localtion===========:%s' % old_localtion)
|
||||
new_localtion = request.env['sf.shelf.location'].sudo().search(
|
||||
[('barcode', '=', NewPosition)], limit=1)
|
||||
logging.info('new_localtion===========:%s' % new_localtion)
|
||||
if not new_localtion:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': '没有该目标位置'}
|
||||
return json.JSONEncoder().encode(res)
|
||||
if old_localtion:
|
||||
temp_val_sn_id = old_localtion.product_sn_id
|
||||
logging.info('temp_val_sn_id===========:%s' % temp_val_sn_id)
|
||||
old_localtion.product_sn_id = None
|
||||
new_localtion.product_sn_id = temp_val_sn_id
|
||||
logging.info('====1======')
|
||||
else:
|
||||
new_localtion.product_sn_id = stock_lot_obj.id
|
||||
logging.info('=====2======')
|
||||
elif ChangeType == 'Tool':
|
||||
# 对功能刀具库位变更信息进行更改
|
||||
def write_tool(DeciveId):
|
||||
if 'Tool' in DeciveId:
|
||||
shelfinfo = self.env['sf.shelf.location'].get_sf_shelf_location_info(DeciveId)
|
||||
for item in shelfinfo:
|
||||
shelf_barcode = self.env['sf.shelf.location.datasync'].find_our_code(item['Postion'])
|
||||
location_id = self.env['sf.shelf.location'].search([('barcode', '=', shelf_barcode)],
|
||||
limit=1)
|
||||
if location_id:
|
||||
# 如果是线边刀库信息,则对功能刀具移动生成记录
|
||||
if 'Tool' in item['Postion']:
|
||||
tool = self.env['sf.functional.cutting.tool.entity'].sudo().search(
|
||||
[('rfid', '=', item['RfidCode']), ('functional_tool_status', '!=', '已拆除')])
|
||||
tool.tool_in_out_stock_location(location_id)
|
||||
if tool:
|
||||
location_id.product_sn_id = tool.barcode_id.id
|
||||
else:
|
||||
location_id.product_sn_id = False
|
||||
else:
|
||||
equipment_id = self.env['maintenance.equipment'].search([('name', '=', DeciveId)])
|
||||
if equipment_id:
|
||||
equipment_id.register_equipment_tool()
|
||||
else:
|
||||
res_1 = {'Succeed': False, 'ErrorCode': 202, 'Error': f'设备【{DeciveId}】不存在'}
|
||||
return json.JSONEncoder().encode(res_1)
|
||||
|
||||
if OldDeciveId:
|
||||
write_tool(OldDeciveId)
|
||||
elif NewDeciveId:
|
||||
write_tool(NewDeciveId)
|
||||
except Exception as e:
|
||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
||||
logging.info('LocationChange error:%s' % e)
|
||||
|
||||
@@ -94,47 +94,47 @@ class MachineTableToolChangingApply(models.Model):
|
||||
if len(records) > 1:
|
||||
raise ValidationError('该刀位号已存在,请重新选择!!!')
|
||||
|
||||
@api.constrains('functional_tool_status')
|
||||
def automation_apply_for_tool_change(self):
|
||||
"""
|
||||
自动申请换刀
|
||||
:return:
|
||||
"""
|
||||
# 更新数据到机台换刀申请界面
|
||||
if self.functional_tool_status == '报警' and not self.sf_functional_tool_assembly_id:
|
||||
machine_table_tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search(
|
||||
[('maintenance_equipment_id', '=', self.maintenance_equipment_id.id),
|
||||
('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id)
|
||||
])
|
||||
|
||||
# 创建功能刀具预警记录
|
||||
self.env['sf.functional.tool.warning'].create_tool_warning_record({'tool_changing_apply_id': self})
|
||||
|
||||
# 新建组装任务
|
||||
sf_functional_tool_assembly = self.env['sf.functional.tool.assembly'].create({
|
||||
'functional_tool_name': self.functional_tool_name,
|
||||
'functional_tool_type_id': self.functional_tool_type_id.id,
|
||||
'functional_tool_diameter': self.diameter,
|
||||
'knife_tip_r_angle': self.knife_tip_r_angle,
|
||||
'coarse_middle_thin': '3',
|
||||
'new_former': '0',
|
||||
'functional_tool_length': self.extension_length,
|
||||
'effective_length': self.effective_length,
|
||||
'loading_task_source': '1',
|
||||
'use_tool_time': fields.Datetime.now() + timedelta(hours=4),
|
||||
'production_line_name_id': self.production_line_id.id,
|
||||
'machine_tool_name_id': self.maintenance_equipment_id.id,
|
||||
'applicant': '系统自动',
|
||||
'apply_time': fields.Datetime.now(),
|
||||
'cutter_spacing_code_id': self.cutter_spacing_code_id.id,
|
||||
'whether_standard_knife': self.whether_standard_knife,
|
||||
'reason_for_applying': '机台报警自动换刀',
|
||||
'sf_machine_table_tool_changing_apply_id': self.id
|
||||
})
|
||||
|
||||
machine_table_tool_changing_apply.write(
|
||||
{'status': '1',
|
||||
'sf_functional_tool_assembly_id': sf_functional_tool_assembly.id})
|
||||
# @api.constrains('functional_tool_status')
|
||||
# def automation_apply_for_tool_change(self):
|
||||
# """
|
||||
# 自动申请换刀
|
||||
# :return:
|
||||
# """
|
||||
# # 更新数据到机台换刀申请界面
|
||||
# if self.functional_tool_status == '报警' and not self.sf_functional_tool_assembly_id:
|
||||
# machine_table_tool_changing_apply = self.env['sf.machine.table.tool.changing.apply'].search(
|
||||
# [('maintenance_equipment_id', '=', self.maintenance_equipment_id.id),
|
||||
# ('cutter_spacing_code_id', '=', self.cutter_spacing_code_id.id)
|
||||
# ])
|
||||
#
|
||||
# # 创建功能刀具预警记录
|
||||
# self.env['sf.functional.tool.warning'].create_tool_warning_record({'tool_changing_apply_id': self})
|
||||
#
|
||||
# # 新建组装任务
|
||||
# sf_functional_tool_assembly = self.env['sf.functional.tool.assembly'].create({
|
||||
# 'functional_tool_name': self.functional_tool_name,
|
||||
# 'functional_tool_type_id': self.functional_tool_type_id.id,
|
||||
# 'functional_tool_diameter': self.diameter,
|
||||
# 'knife_tip_r_angle': self.knife_tip_r_angle,
|
||||
# 'coarse_middle_thin': '3',
|
||||
# 'new_former': '0',
|
||||
# 'functional_tool_length': self.extension_length,
|
||||
# 'effective_length': self.effective_length,
|
||||
# 'loading_task_source': '1',
|
||||
# 'use_tool_time': fields.Datetime.now() + timedelta(hours=4),
|
||||
# 'production_line_name_id': self.production_line_id.id,
|
||||
# 'machine_tool_name_id': self.maintenance_equipment_id.id,
|
||||
# 'applicant': '系统自动',
|
||||
# 'apply_time': fields.Datetime.now(),
|
||||
# 'cutter_spacing_code_id': self.cutter_spacing_code_id.id,
|
||||
# 'whether_standard_knife': self.whether_standard_knife,
|
||||
# 'reason_for_applying': '机台报警自动换刀',
|
||||
# 'sf_machine_table_tool_changing_apply_id': self.id
|
||||
# })
|
||||
#
|
||||
# machine_table_tool_changing_apply.write(
|
||||
# {'status': '1',
|
||||
# 'sf_functional_tool_assembly_id': sf_functional_tool_assembly.id})
|
||||
|
||||
def revocation_1(self):
|
||||
"""
|
||||
|
||||
@@ -53,6 +53,21 @@ class FunctionalCuttingToolEntity(models.Model):
|
||||
safe_inventory_id = fields.Many2one('sf.real.time.distribution.of.functional.tools',
|
||||
string='功能刀具安全库存', readonly=True)
|
||||
|
||||
@api.onchange('functional_tool_status')
|
||||
def _onchange_functional_tool_status(self):
|
||||
for item in self:
|
||||
if item:
|
||||
if item.functional_tool_status == '报警':
|
||||
# 创建报警刀具拆解单
|
||||
self.env['sf.functional.tool.dismantle'].sudo().create({
|
||||
'functional_tool_id': item.id,
|
||||
'dismantle_cause': '寿命到期报废'
|
||||
})
|
||||
# 创建刀具报警记录
|
||||
# self.env['sf.functional.tool.warning'].sudo().create({
|
||||
# ''
|
||||
# })
|
||||
|
||||
@api.depends('barcode_id.quant_ids', 'barcode_id.quant_ids.location_id', 'functional_tool_status',
|
||||
'current_shelf_location_id')
|
||||
def _compute_current_location_id(self):
|
||||
@@ -324,7 +339,7 @@ class FunctionalToolWarning(models.Model):
|
||||
_description = '功能刀具预警'
|
||||
|
||||
code = fields.Char('编码', related='functional_tool_name_id.code')
|
||||
rfid = fields.Char('Rfid', related='functional_tool_name_id.rfid')
|
||||
rfid = fields.Char('Rfid')
|
||||
tool_groups_id = fields.Many2one('sf.tool.groups', '刀具组', related='functional_tool_name_id.tool_groups_id')
|
||||
name = fields.Char('名称', invisible=True, readonly=True, related='functional_tool_name_id.name')
|
||||
# 机床信息
|
||||
@@ -338,7 +353,7 @@ class FunctionalToolWarning(models.Model):
|
||||
domain="[('equipment_id', '=', maintenance_equipment_id)]")
|
||||
# 功能刀具信息
|
||||
functional_tool_name_id = fields.Many2one('sf.functional.tool.assembly', string='功能刀具名称')
|
||||
barcode_id = fields.Many2one('stock.lot', string='功能刀具序列号', related='functional_tool_name_id.barcode_id')
|
||||
barcode_id = fields.Many2one('stock.lot', string='序列号', related='functional_tool_name_id.barcode_id')
|
||||
mrs_cutting_tool_type_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
|
||||
diameter = fields.Float(string='刀具直径(mm)')
|
||||
knife_tip_r_angle = fields.Float(string='刀尖R角(mm)')
|
||||
@@ -361,28 +376,28 @@ class FunctionalToolWarning(models.Model):
|
||||
machine_table_name_ids = categories._search([], order=order, access_rights_uid=SUPERUSER_ID)
|
||||
return categories.browse(machine_table_name_ids)
|
||||
|
||||
def create_tool_warning_record(self, obj):
|
||||
"""
|
||||
机台换刀申请报警状态时,创建功能刀具预警记录
|
||||
"""
|
||||
if obj:
|
||||
for tool in obj.get('tool_changing_apply_id'):
|
||||
self.env['sf.functional.tool.warning'].create({
|
||||
'production_line_id': tool.production_line_id.id,
|
||||
'maintenance_equipment_id': tool.maintenance_equipment_id.id,
|
||||
'machine_tool_code': tool.machine_tool_code,
|
||||
'machine_table_type_id': tool.machine_table_type_id.id,
|
||||
'cutter_spacing_code_id': tool.cutter_spacing_code_id.id,
|
||||
'functional_tool_name_id': tool.functional_tool_name_id.id,
|
||||
'barcode_id': tool.barcode_id.id,
|
||||
'diameter': tool.diameter,
|
||||
'knife_tip_r_angle': tool.knife_tip_r_angle,
|
||||
'max_lifetime_value': tool.max_lifetime_value,
|
||||
'alarm_value': tool.alarm_value,
|
||||
'used_value': tool.used_value,
|
||||
'functional_tool_status': tool.functional_tool_status,
|
||||
'alarm_time': fields.Datetime.now(),
|
||||
})
|
||||
# def create_tool_warning_record(self, obj):
|
||||
# """
|
||||
# 机台换刀申请报警状态时,创建功能刀具预警记录
|
||||
# """
|
||||
# if obj:
|
||||
# for tool in obj.get('tool_changing_apply_id'):
|
||||
# self.env['sf.functional.tool.warning'].create({
|
||||
# 'production_line_id': tool.production_line_id.id,
|
||||
# 'maintenance_equipment_id': tool.maintenance_equipment_id.id,
|
||||
# 'machine_tool_code': tool.machine_tool_code,
|
||||
# 'machine_table_type_id': tool.machine_table_type_id.id,
|
||||
# 'cutter_spacing_code_id': tool.cutter_spacing_code_id.id,
|
||||
# 'functional_tool_name_id': tool.functional_tool_name_id.id,
|
||||
# 'barcode_id': tool.barcode_id.id,
|
||||
# 'diameter': tool.diameter,
|
||||
# 'knife_tip_r_angle': tool.knife_tip_r_angle,
|
||||
# 'max_lifetime_value': tool.max_lifetime_value,
|
||||
# 'alarm_value': tool.alarm_value,
|
||||
# 'used_value': tool.used_value,
|
||||
# 'functional_tool_status': tool.functional_tool_status,
|
||||
# 'alarm_time': fields.Datetime.now(),
|
||||
# })
|
||||
|
||||
|
||||
class StockMoveLine(models.Model):
|
||||
|
||||
@@ -236,25 +236,26 @@
|
||||
<field name="model">sf.functional.tool.warning</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="功能刀具预警" create="0" edit="0" delete="0" editable="bottom">
|
||||
<field name="production_line_id" optional="hide"/>
|
||||
<field name="maintenance_equipment_id" optional="hide"/>
|
||||
<field name="machine_tool_code"/>
|
||||
<field name="cutter_spacing_code_id"/>
|
||||
<field name="barcode_id" invisible="1"/>
|
||||
<field name="production_line_id" invisible="1"/>
|
||||
<field name="maintenance_equipment_id" invisible="1"/>
|
||||
<field name="machine_tool_code" invisible="1"/>
|
||||
<field name="cutter_spacing_code_id" invisible="1"/>
|
||||
<field name="on_board_time" invisible="1"/>
|
||||
<field name="functional_tool_status" invisible="1"/>
|
||||
|
||||
<field name="rfid"/>
|
||||
<field name="functional_tool_name_id"/>
|
||||
<field name="diameter"/>
|
||||
<field name="knife_tip_r_angle"/>
|
||||
<field name="barcode_id" optional="hide"/>
|
||||
<field name="diameter" optional="hide"/>
|
||||
<field name="knife_tip_r_angle" optional="hide"/>
|
||||
<field name="install_tool_time" optional="hide"/>
|
||||
<field name="on_board_time" optional="hide"/>
|
||||
<field name="max_lifetime_value"/>
|
||||
<field name="alarm_value"/>
|
||||
<field name="used_value"/>
|
||||
<field name="functional_tool_status"/>
|
||||
<field name="alarm_time"/>
|
||||
<field name="dispose_user"/>
|
||||
<field name="dispose_time"/>
|
||||
<field name="dispose_func"/>
|
||||
<field name="dispose_func" optional="hide"/>
|
||||
<!-- <button name="enroll_functional_tool_warning" string="刀具预警注册" type="object"-->
|
||||
<!-- class="btn-primary"/>-->
|
||||
</tree>
|
||||
@@ -266,31 +267,19 @@
|
||||
<field name="model">sf.functional.tool.warning</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="功能刀具预警">
|
||||
<field name="machine_tool_code"/>
|
||||
<field name="cutter_spacing_code_id"/>
|
||||
<field name="barcode_id"/>
|
||||
<field name="rfid"/>
|
||||
<field name="functional_tool_name_id"/>
|
||||
<field name="diameter"/>
|
||||
<field name="knife_tip_r_angle"/>
|
||||
<field name="install_tool_time" optional="hide"/>
|
||||
<field name="on_board_time" optional="hide"/>
|
||||
<field name="max_lifetime_value"/>
|
||||
<field name="alarm_value"/>
|
||||
<field name="used_value"/>
|
||||
<field name="functional_tool_status"/>
|
||||
<field name="alarm_time"/>
|
||||
<field name="dispose_user"/>
|
||||
<field name="dispose_time"/>
|
||||
<field name="dispose_func"/>
|
||||
<field name="production_line_id" invisible="True"/>
|
||||
<filter string="已归档" name="inactive" domain="[('active', '=', False)]"/>
|
||||
<searchpanel>
|
||||
<field name="production_line_id" icon="fa-building" enable_counters="1"/>
|
||||
<field name="maintenance_equipment_id" icon="fa-building" enable_counters="1"/>
|
||||
<field name="cutter_spacing_code_id" icon="fa-building" enable_counters="1"/>
|
||||
<field name="functional_tool_status" icon="fa-building" enable_counters="1"/>
|
||||
</searchpanel>
|
||||
<group expand="0">
|
||||
<filter string="报警时间" name="alarm_time" domain="[]"
|
||||
context="{'group_by': 'alarm_time'}"/>
|
||||
</group>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -507,13 +507,13 @@ class ShelfLocation(models.Model):
|
||||
print('eeeeeee空闲', e)
|
||||
|
||||
# 调取获取货位信息接口
|
||||
def get_sf_shelf_location_info(self):
|
||||
def get_sf_shelf_location_info(self, device_id='Cabinet-AL'):
|
||||
|
||||
config = self.env['res.config.settings'].get_values()
|
||||
headers = {'Authorization': config['center_control_Authorization']}
|
||||
crea_url = config['center_control_url'] + "/AutoDeviceApi/GetLocationInfos"
|
||||
|
||||
params = {'DeviceId': 'Cabinet-AL'}
|
||||
params = {'DeviceId': device_id}
|
||||
r = requests.get(crea_url, params=params, headers=headers)
|
||||
|
||||
ret = r.json()
|
||||
|
||||
@@ -13,13 +13,14 @@ class MrsShelfLocationDataSync(models.Model):
|
||||
_name = 'sf.shelf.location.datasync'
|
||||
_description = '同步库存信息'
|
||||
|
||||
def _cron_shelf_location_datasync(self):
|
||||
try:
|
||||
# 建立对应关系的函数
|
||||
def align_data(my_data, their_data):
|
||||
paired_data = list(zip(my_data, their_data))
|
||||
return paired_data
|
||||
def find_our_code(self, their_code):
|
||||
|
||||
# 建立对应关系的函数
|
||||
def align_data(my_data, their_data):
|
||||
paired_data = list(zip(my_data, their_data))
|
||||
return paired_data
|
||||
|
||||
def get_total_data():
|
||||
shelf_1_obj = self.env['sf.shelf'].search([('name', '=', '一号产线-一号线边刀架')], limit=1)
|
||||
tool_location_objs_1 = self.env['sf.shelf.location'].search([('shelf_id', '=', shelf_1_obj.id)], order='id')
|
||||
|
||||
@@ -82,19 +83,21 @@ class MrsShelfLocationDataSync(models.Model):
|
||||
total_data = aligned_data_1 + aligned_data_2 + aligned_data_3 + aligned_data_4 + aligned_data_5
|
||||
print(total_data)
|
||||
logging.info(f"total_data: {total_data}")
|
||||
return total_data
|
||||
|
||||
for code_pair in get_total_data():
|
||||
if code_pair[1] == their_code:
|
||||
return code_pair[0]
|
||||
return None # 如果没有找到对应的值,返回None或适当的默认值
|
||||
|
||||
def _cron_shelf_location_datasync(self):
|
||||
try:
|
||||
def find_their_code(my_code, aligned_data):
|
||||
for code_pair in aligned_data:
|
||||
if code_pair[0] == my_code:
|
||||
return code_pair[1]
|
||||
return None # 如果没有找到对应的值,返回None或适当的默认值
|
||||
|
||||
def find_our_code(their_code, aligned_data):
|
||||
for code_pair in aligned_data:
|
||||
if code_pair[1] == their_code:
|
||||
return code_pair[0]
|
||||
return None # 如果没有找到对应的值,返回None或适当的默认值
|
||||
|
||||
# 定时更新所有设备机床刀库信息
|
||||
equipment_ids = self.env['maintenance.equipment'].search(
|
||||
[('equipment_type', '=', '机床'), ('function_type', '!=', False)])
|
||||
@@ -105,7 +108,7 @@ class MrsShelfLocationDataSync(models.Model):
|
||||
shelfinfo = self.env['sf.shelf.location'].get_sf_shelf_location_info()
|
||||
print('shelfinfo:', shelfinfo)
|
||||
for item in shelfinfo:
|
||||
shelf_barcode = find_our_code(item['Postion'], total_data)
|
||||
shelf_barcode = self.find_our_code(item['Postion'])
|
||||
location_id = self.env['sf.shelf.location'].search([('barcode', '=', shelf_barcode)], limit=1)
|
||||
if location_id:
|
||||
# 如果是线边刀库信息,则对功能刀具移动生成记录
|
||||
|
||||
Reference in New Issue
Block a user