256 lines
11 KiB
Python
256 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
import json
|
|
import datetime
|
|
import requests
|
|
from odoo import api, fields, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class SfMaintenanceEquipmentOEE(models.Model):
|
|
_name = 'maintenance.equipment.oee'
|
|
_description = '设备OEE'
|
|
|
|
name = fields.Char('设备oee')
|
|
equipment_id = fields.Many2one('maintenance.equipment', '机台号',
|
|
domain="[('category_id.equipment_type', '=', '机床'),('state_zc', '=', '已注册')]")
|
|
|
|
equipment_code = fields.Char('设备编码', related='equipment_id.code', store=True)
|
|
|
|
type_id = fields.Many2one('sf.machine_tool.type', '型号', related='equipment_id.type_id')
|
|
machine_tool_picture = fields.Binary('设备图片', related='equipment_id.machine_tool_picture')
|
|
state = fields.Selection(
|
|
[("正常", "正常"), ("故障停机", "故障停机"), ("计划维保", "计划维保"), ("空闲", "空闲"),
|
|
("封存(报废)", "封存(报废)")],
|
|
default='正常', string="机床状态", related='equipment_id.state')
|
|
run_time = fields.Float('加工时长(h)')
|
|
equipment_time = fields.Float('开机时长(h)')
|
|
done_nums = fields.Integer('加工件数')
|
|
utilization_rate = fields.Char('可用率')
|
|
fault_time = fields.Float('故障时长')
|
|
fault_nums = fields.Integer('故障次数')
|
|
# 故障率
|
|
fault_rate = fields.Char('故障率')
|
|
# 设备故障日志
|
|
sf_maintenance_logs_ids = fields.One2many('sf.maintenance.logs', 'maintenance_equipment_oee_id', '设备故障日志',
|
|
related='equipment_id.sf_maintenance_logs_ids')
|
|
oee_logs = fields.One2many('maintenance.equipment.oee.logs', 'equipment_oee_id', string='运行日志')
|
|
|
|
day_logs_detail = fields.Html('日运行日志详情')
|
|
history_logs_detail = fields.Html('历史运行日志详情')
|
|
begin_time = fields.Date('开始时间')
|
|
end_time = fields.Date('结束时间')
|
|
|
|
# 获取日志详情
|
|
def get_day_logs(self):
|
|
config = self.env['ir.config_parameter'].sudo()
|
|
url = 'http://172.16.10.112:8069/api/logs/list'
|
|
machine_list = [self.equipment_code]
|
|
begin_time = datetime.datetime.now().strftime('%Y-%m-%d') + ' 00:00:00'
|
|
end_time = datetime.datetime.now().strftime('%Y-%m-%d') + ' 23:59:59'
|
|
|
|
# 请求的数据
|
|
data = {
|
|
"machine_list": str(machine_list),
|
|
"begin_time": begin_time,
|
|
"end_time": end_time
|
|
}
|
|
|
|
print(data)
|
|
|
|
# 发送POST请求
|
|
response = requests.post(url, json={}, data=data)
|
|
print(response.json()) # 输出服务器返回的响应
|
|
if response.status_code == 200:
|
|
result = response.json()
|
|
print('============', result)
|
|
if result['status'] == 1:
|
|
logs_list = result['data'][self.equipment_code]
|
|
logs_detail = ''
|
|
log_state = ''
|
|
for log in logs_list:
|
|
if log['state'] != log_state:
|
|
print('loooooooooooooooooooogs', log)
|
|
production_name = log['production_name'] if log['production_name'] else ' '
|
|
logs_detail += '<tr><td>' + log['time'] + '</td><td>' + log[
|
|
'state'] + '</td><td>' + production_name + '</td></tr>'
|
|
log_state = log['state']
|
|
# self.day_logs_detail = '<table><tr><th>时间</th><th>事件/状态</th><th>加工工单</th></tr>' + logs_detail + '</table>'
|
|
self.day_logs_detail = '''
|
|
<table border="1" style="border-collapse: collapse; width: 100%; text-align: center;">
|
|
<tr style="background-color: #f2f2f2;">
|
|
<th style="padding: 8px; border: 1px solid #ddd;">时间</th>
|
|
<th style="padding: 8px; border: 1px solid #ddd;">事件/状态</th>
|
|
<th style="padding: 8px; border: 1px solid #ddd;">加工工单</th>
|
|
</tr>
|
|
{logs_detail}
|
|
</table>
|
|
'''.format(logs_detail=logs_detail)
|
|
|
|
else:
|
|
self.day_logs_detail = '获取日志失败'
|
|
else:
|
|
self.day_logs_detail = '获取日志失败'
|
|
|
|
# 获取历史日志详情
|
|
def get_history_logs(self):
|
|
config = self.env['ir.config_parameter'].sudo()
|
|
url = 'http://172.16.10.112:8069/api/logs/list'
|
|
machine_list = [self.equipment_code]
|
|
if not self.begin_time:
|
|
raise UserError('请选择开始时间')
|
|
if not self.end_time:
|
|
raise UserError('请选择结束时间')
|
|
|
|
begin_time = self.begin_time.strftime('%Y-%m-%d') + ' 00:00:00'
|
|
end_time = self.end_time.strftime('%Y-%m-%d') + ' 23:59:59'
|
|
|
|
# 请求的数据
|
|
data = {
|
|
"machine_list": str(machine_list),
|
|
"begin_time": begin_time,
|
|
"end_time": end_time
|
|
}
|
|
|
|
print(data)
|
|
|
|
# 发送POST请求
|
|
response = requests.post(url, json={}, data=data)
|
|
print(response.json()) # 输出服务器返回的响应
|
|
if response.status_code == 200:
|
|
result = response.json()
|
|
print('============', result)
|
|
if result['status'] == 1:
|
|
logs_list = result['data'][self.equipment_code]
|
|
logs_detail = ''
|
|
log_state = ''
|
|
for log in logs_list:
|
|
if log['state'] != log_state:
|
|
production_name = log['production_name'] if log['production_name'] else ' '
|
|
logs_detail += '<tr><td>' + log['time'] + '</td><td>' + log[
|
|
'state'] + '</td><td>' + production_name + '</td></tr>'
|
|
log_state = log['state']
|
|
# self.day_logs_detail = '<table><tr><th>时间</th><th>事件/状态</th><th>加工工单</th></tr>' + logs_detail + '</table>'
|
|
self.history_logs_detail = '''
|
|
<table border="1" style="border-collapse: collapse; width: 100%; text-align: center;">
|
|
<tr style="background-color: #f2f2f2;">
|
|
<th style="padding: 8px; border: 1px solid #ddd;">时间</th>
|
|
<th style="padding: 8px; border: 1px solid #ddd;">事件/状态</th>
|
|
<th style="padding: 8px; border: 1px solid #ddd;">加工工单</th>
|
|
</tr>
|
|
{logs_detail}
|
|
</table>
|
|
'''.format(logs_detail=logs_detail)
|
|
|
|
else:
|
|
self.history_logs_detail = '获取日志失败'
|
|
else:
|
|
self.history_logs_detail = '获取日志失败'
|
|
|
|
# 下载历史日志
|
|
def download_history_logs(self):
|
|
config = self.env['ir.config_parameter'].sudo()
|
|
url = 'http://172.16.10.112:8069/api/logs/list'
|
|
machine_list = [self.equipment_code]
|
|
if not self.begin_time:
|
|
raise UserError('请选择开始时间')
|
|
if not self.end_time:
|
|
raise UserError('请选择结束时间')
|
|
|
|
begin_time = self.begin_time.strftime('%Y-%m-%d') + ' 00:00:00'
|
|
end_time = self.end_time.strftime('%Y-%m-%d') + ' 23:59:59'
|
|
|
|
# 请求的数据
|
|
data = {
|
|
"machine_list": str(machine_list),
|
|
"begin_time": begin_time,
|
|
"end_time": end_time
|
|
}
|
|
|
|
print(data)
|
|
|
|
# 发送POST请求
|
|
response = requests.post(url, json={}, data=data)
|
|
print(response.json()) # 输出服务器返回的响应
|
|
if response.status_code == 200:
|
|
result = response.json()
|
|
print('============', result)
|
|
if result['status'] == 1:
|
|
logs_list = result['data'][self.equipment_code]
|
|
logs_detail = ''
|
|
for log in logs_list:
|
|
production_name = log['production_name'] if log['production_name'] else ' '
|
|
# todo 下载日志
|
|
|
|
else:
|
|
self.history_logs_detail = '下载日志失败'
|
|
else:
|
|
self.history_logs_detail = '下载日志失败'
|
|
|
|
def name_get(self):
|
|
result = []
|
|
for parameter in self:
|
|
if parameter.equipment_id:
|
|
name = parameter.equipment_id.name
|
|
result.append((parameter.id, name))
|
|
return result
|
|
|
|
|
|
class SfMaintenanceEquipmentOEELog(models.Model):
|
|
_name = 'maintenance.equipment.oee.logs'
|
|
_description = '设备运行日志'
|
|
|
|
equipment_id = fields.Many2one('maintenance.equipment', '机台号', readonly='True')
|
|
equipment_code = fields.Char('设备编码', readonly='True')
|
|
name = fields.Char('设备名称', readonly='True')
|
|
function_type = fields.Selection(
|
|
[("ZXJGZX", "钻铣加工中心"), ("CXJGZX", "车削加工中心"), ("FHJGZX", "复合加工中心")],
|
|
default="", string="功能类型")
|
|
machine_tool_picture = fields.Binary('设备图片')
|
|
type_id = fields.Many2one('sf.machine_tool.type', '品牌型号', reaonly='True')
|
|
state = fields.Selection([("加工", "加工"), ("关机", "关机"), ("待机", "待机"), ("故障", "故障"),
|
|
("检修", "检修"), ("保养", "保养")], default="", string="实时状态")
|
|
online_time = fields.Char('开机时长', reaonly='True')
|
|
|
|
offline_time = fields.Char('关机时长', reaonly='True')
|
|
offline_nums = fields.Integer('关机次数', reaonly='True')
|
|
# 待机时长
|
|
|
|
idle_time = fields.Char('待机时长', reaonly='True')
|
|
|
|
# 待机率
|
|
idle_rate = fields.Char('待机率', reaonly='True')
|
|
|
|
work_time = fields.Char('加工时长', reaonly='True')
|
|
work_rate = fields.Char('可用率', reaonly='True')
|
|
fault_time = fields.Char('故障时长', reaonly='True')
|
|
fault_rate = fields.Char('故障率', reaonly='True')
|
|
fault_nums = fields.Integer('故障次数', reaonly='True')
|
|
|
|
detail_ids = fields.One2many('maintenance.equipment.oee.log.detail', 'log_id', string='日志详情')
|
|
|
|
# maintenance_time = fields.Char('维保时长')
|
|
# work_nums = fields.Integer('加工件数')
|
|
equipment_oee_id = fields.Many2one('maintenance.equipment.oee', '设备OEE')
|
|
|
|
@api.onchange('equipment_id')
|
|
def get_name(self):
|
|
self.name = self.equipment_id.name
|
|
self.equipment_code = self.equipment_id.code
|
|
|
|
|
|
# 设备运行日志详情
|
|
class SfMaintenanceEquipmentOEELogDetail(models.Model):
|
|
_name = 'maintenance.equipment.oee.log.detail'
|
|
_description = '设备运行日志详情'
|
|
_order = 'time desc'
|
|
|
|
# sequence = fields.Integer('序号', related='id')
|
|
time = fields.Datetime('时间')
|
|
state = fields.Selection([("加工", "加工"), ("关机", "关机"), ("待机", "待机"), ("故障", "故障"),
|
|
("检修", "检修"), ("保养", "保养")], default="", string="事件/状态")
|
|
production_name = fields.Char('加工工单')
|
|
|
|
log_id = fields.Many2one('maintenance.equipment.oee.logs', '日志')
|
|
# equipment_code = fields.Char('设备编码', related='log_id.equipment_code')
|
|
equipment_code = fields.Char('设备编码', readonly='True')
|