From d488824e3d57c6697710d87ab0822d7d9917260c Mon Sep 17 00:00:00 2001
From: mgw <1392924357@qq.com>
Date: Wed, 25 Sep 2024 13:50:50 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=86=E9=A1=B5=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3=EF=BC=9B=E5=90=88=E5=B9=B6=E6=97=A5=E5=BF=97=E7=8A=B6?=
=?UTF-8?q?=E6=80=81=E7=9B=B8=E5=90=8C=E6=95=B0=E6=8D=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
sf_machine_connect/controllers/controllers.py | 150 +++++++++++++-----
sf_maintenance/models/sf_maintenance_oee.py | 20 ++-
.../views/maintenance_equipment_oee_views.xml | 26 ++-
3 files changed, 146 insertions(+), 50 deletions(-)
diff --git a/sf_machine_connect/controllers/controllers.py b/sf_machine_connect/controllers/controllers.py
index fb783666..b8f2dca6 100644
--- a/sf_machine_connect/controllers/controllers.py
+++ b/sf_machine_connect/controllers/controllers.py
@@ -231,6 +231,95 @@ class Sf_Dashboard_Connect(http.Controller):
res['message'] = '前端请求日志数据失败,原因:%s' % e
return json.dumps(res)
+ @http.route('/api/logs/page_data', type='http', auth='public', methods=['GET', 'POST'],
+ csrf=False, cors="*")
+ def logs_page_data(self, **kw):
+ """
+ 拿到日志数据返回给大屏展示(支持时间戳分页)
+ :param kw:
+ :return:
+ """
+ res = {'status': 1, 'message': '成功', 'data': {}}
+ logging.info('前端请求日志数据的参数为:%s' % kw)
+
+ try:
+ # 连接数据库
+ conn = psycopg2.connect(**db_config)
+ cur = conn.cursor()
+
+ # 获取并解析传递的参数
+ machine_list = ast.literal_eval(kw.get('machine_list', '[]'))
+ begin_time_str = kw.get('begin_time', '').strip('"')
+ end_time_str = kw.get('end_time', '').strip('"')
+ page = int(kw.get('page', 1)) # 默认页码为1
+ page_size = int(kw.get('page_size', 80)) # 默认每页条数为10
+
+ begin_time = datetime.strptime(begin_time_str, '%Y-%m-%d %H:%M:%S')
+ end_time = datetime.strptime(end_time_str, '%Y-%m-%d %H:%M:%S')
+
+ # 计算分页的 offset
+ offset = (page - 1) * page_size
+
+ # 先查询符合条件的总记录数
+ total_records = 0
+ for item in machine_list:
+ count_sql = '''
+ SELECT COUNT(*)
+ FROM device_data
+ WHERE device_name = %s AND time >= %s AND time <= %s;
+ '''
+ # 执行总记录数查询
+ cur.execute(count_sql, (item, begin_time, end_time))
+ record_count = cur.fetchone()[0] # 获取总记录数
+ total_records += record_count
+
+ # 计算总页数
+ if total_records > 0:
+ total_pages = (total_records + page_size - 1) // page_size # 向上取整
+ else:
+ total_pages = 0
+
+ # 将总页数和总记录数返回到响应中
+ res['total_records'] = total_records
+ res['total_pages'] = total_pages
+
+ for item in machine_list:
+ sql = '''
+ SELECT time, device_state, program_name
+ FROM device_data
+ WHERE device_name = %s AND time >= %s AND time <= %s
+ ORDER BY time DESC
+ LIMIT %s OFFSET %s;
+ '''
+ # 执行SQL命令,使用参数绑定
+ cur.execute(sql, (item, begin_time, end_time, page_size, offset))
+ results = cur.fetchall()
+
+ # 将数据按照 equipment_code 进行分组
+ if item not in res['data']:
+ res['data'][item] = []
+
+ for result in results:
+ res['data'][item].append({
+ 'time': result[0].strftime('%Y-%m-%d %H:%M:%S'),
+ 'state': result[1],
+ 'production_name': result[2],
+ })
+
+ return json.dumps(res) # 返回分页数据
+
+ except Exception as e:
+ logging.info('前端请求日志数据失败,原因:%s' % e)
+ res['status'] = -1
+ res['message'] = '前端请求日志数据失败,原因:%s' % e
+ return json.dumps(res)
+
+ finally:
+ if cur:
+ cur.close()
+ if conn:
+ conn.close()
+
# 返回CNC机床列表
@http.route('/api/CNCList', type='http', auth='public', methods=['GET', 'POST'], csrf=False,
cors="*")
@@ -718,7 +807,8 @@ class Sf_Dashboard_Connect(http.Controller):
'material': material,
'dimensions': dimensions,
'order_qty': finish_order.product_qty,
- 'finish_time': finish_order.actual_end_time.strftime('%Y-%m-%d %H:%M:%S') if finish_order.actual_end_time else ' '
+ 'finish_time': finish_order.actual_end_time.strftime(
+ '%Y-%m-%d %H:%M:%S') if finish_order.actual_end_time else ' '
}
done_data.append(line_dict)
@@ -802,54 +892,30 @@ class Sf_Dashboard_Connect(http.Controller):
"""
查询设备的异常情况
"""
- res = {'status': 1, 'message': '成功', 'data': {}}
+ res = {'status': 1, 'message': '成功', 'data': []}
logging.info('前端请求机床数据的参数为:%s' % kw)
- # 连接数据库
- conn = psycopg2.connect(**db_config)
- cur = conn.cursor()
try:
- # 获取请求的机床数据
+ maintenance_logs_obj = request.env['sf.maintenance.logs'].sudo()
+ # # 获取请求的机床数据
# machine_list = ast.literal_eval(kw['machine_list'])
- # idle_times = []
- # idle_dict = {}
-
# for item in machine_list:
- sql = '''
- SELECT DISTINCT ON (alarm_time) alarm_time, alarm_message, system_date, system_time, alarm_repair_time
- FROM device_data
- WHERE alarm_time IS NOT NULL
- ORDER BY alarm_time, time;
+ # machine_data = equipment_obj.search([('code', '=', item)])
+ for log in maintenance_logs_obj.search([]):
+ res['data'].append({
+ 'name': log.name,
+ 'alarm_time': log.alarm_time.strftime('%Y-%m-%d %H:%M:%S'),
+ 'fault_alarm_info': log.fault_alarm_info,
+ 'status': log.status,
+ 'note': log.note,
+ 'alarm_level': log.alarm_level
+ })
- '''
- # 执行SQL命令
- cur.execute(sql)
- result = cur.fetchall()
- # print('result', result)
-
- # 将查询结果转换为字典列表
- data = []
- for row in result:
- record = {
- 'alarm_time': row[0],
- 'alarm_message': row[1],
- 'system_date': row[2],
- 'system_time': row[3],
- 'alarm_repair_time': row[4]
- }
- data.append(record)
-
- # 将数据填充到返回结果中
- res['data'] = data
-
- # 返回统计结果
- return json.dumps(res, ensure_ascii=False)
except Exception as e:
- print(f"An error occurred: {e}")
- return json.dumps(res)
- finally:
- cur.close()
- conn.close()
+ logging.error(f"An error occurred: {e}")
+
+ return json.dumps(res)
+
# 设备oee
@http.route('/api/OEE', type='http', auth='public', methods=['GET', 'POST'], csrf=False, cors="*")
diff --git a/sf_maintenance/models/sf_maintenance_oee.py b/sf_maintenance/models/sf_maintenance_oee.py
index 1a2e4f10..ee2c209c 100644
--- a/sf_maintenance/models/sf_maintenance_oee.py
+++ b/sf_maintenance/models/sf_maintenance_oee.py
@@ -66,11 +66,14 @@ class SfMaintenanceEquipmentOEE(models.Model):
if result['status'] == 1:
logs_list = result['data'][self.equipment_code]
logs_detail = ''
+ log_state = ''
for log in logs_list:
- print('loooooooooooooooooooogs', log)
- production_name = log['production_name'] if log['production_name'] else ' '
- logs_detail += '
| ' + log['time'] + ' | ' + log[
- 'state'] + ' | ' + production_name + ' |
'
+ if log['state'] != log_state:
+ print('loooooooooooooooooooogs', log)
+ production_name = log['production_name'] if log['production_name'] else ' '
+ logs_detail += '| ' + log['time'] + ' | ' + log[
+ 'state'] + ' | ' + production_name + ' |
'
+ log_state = log['state']
# self.day_logs_detail = '| 时间 | 事件/状态 | 加工工单 |
' + logs_detail + '
'
self.day_logs_detail = '''
@@ -119,10 +122,13 @@ class SfMaintenanceEquipmentOEE(models.Model):
if result['status'] == 1:
logs_list = result['data'][self.equipment_code]
logs_detail = ''
+ log_state = ''
for log in logs_list:
- production_name = log['production_name'] if log['production_name'] else ' '
- logs_detail += '| ' + log['time'] + ' | ' + log[
- 'state'] + ' | ' + production_name + ' |
'
+ if log['state'] != log_state:
+ production_name = log['production_name'] if log['production_name'] else ' '
+ logs_detail += '| ' + log['time'] + ' | ' + log[
+ 'state'] + ' | ' + production_name + ' |
'
+ log_state = log['state']
# self.day_logs_detail = '| 时间 | 事件/状态 | 加工工单 |
' + logs_detail + '
'
self.history_logs_detail = '''
diff --git a/sf_maintenance/views/maintenance_equipment_oee_views.xml b/sf_maintenance/views/maintenance_equipment_oee_views.xml
index 33749809..b798b0ab 100644
--- a/sf_maintenance/views/maintenance_equipment_oee_views.xml
+++ b/sf_maintenance/views/maintenance_equipment_oee_views.xml
@@ -55,7 +55,31 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+