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 += '' + if log['state'] != log_state: + production_name = log['production_name'] if log['production_name'] else ' ' + logs_detail += '' + log_state = log['state'] # self.day_logs_detail = '
' + log['time'] + '' + log[ - 'state'] + '' + production_name + '
' + log['time'] + '' + log[ + 'state'] + '' + production_name + '
' + 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 @@