added associated equipment to combinedequipmentenergyitem report in API

Merge branch 'PR23' into develop
pull/25/head
13621160019@163.com 2021-03-26 10:31:16 +08:00
commit 9e32d75470
2 changed files with 127 additions and 11 deletions

View File

@ -4,7 +4,6 @@ import os
from openpyxl.chart import ( from openpyxl.chart import (
PieChart, PieChart,
LineChart, LineChart,
BarChart,
Reference, Reference,
) )
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
@ -432,6 +431,63 @@ def generate_excel(report,
chart_start_row_number += 6 chart_start_row_number += 6
ws.add_chart(line, chart_cell) ws.add_chart(line, chart_cell)
#####################################
has_associated_equipment_flag = True
if "associated_equipment" not in report.keys() or \
"energy_item_names" not in report['associated_equipment'].keys() or \
len(report['associated_equipment']["energy_item_names"]) == 0 \
or 'associated_equipment_names_array' not in report['associated_equipment'].keys() \
or report['associated_equipment']['associated_equipment_names_array'] is None \
or len(report['associated_equipment']['associated_equipment_names_array']) == 0 \
or len(report['associated_equipment']['associated_equipment_names_array'][0]) == 0:
has_associated_equipment_flag = False
if has_associated_equipment_flag:
associated_equipment = report['associated_equipment']
ws['B' + str(current_row_number)].font = title_font
ws['B' + str(current_row_number)] = name + ' 相关设备数据'
current_row_number += 1
table_start_row_number = current_row_number
ws.row_dimensions[current_row_number].height = 60
ws['B' + str(current_row_number)].fill = table_fill
ws['B' + str(current_row_number)].font = name_font
ws['B' + str(current_row_number)].alignment = c_c_alignment
ws['B' + str(current_row_number)].border = f_border
ws['B' + str(current_row_number)] = '相关设备'
ca_len = len(associated_equipment['energy_item_names'])
for i in range(0, ca_len):
row = chr(ord('C') + i)
ws[row + str(current_row_number)].fill = table_fill
ws[row + str(current_row_number)].font = name_font
ws[row + str(current_row_number)].alignment = c_c_alignment
ws[row + str(current_row_number)].border = f_border
ws[row + str(current_row_number)] = \
reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
associated_equipment_len = len(associated_equipment['associated_equipment_names_array'][0])
for i in range(0, associated_equipment_len):
current_row_number += 1
row = str(current_row_number)
ws['B' + row].font = title_font
ws['B' + row].alignment = c_c_alignment
ws['B' + row] = associated_equipment['associated_equipment_names_array'][0][i]
ws['B' + row].border = f_border
for j in range(0, ca_len):
col = chr(ord('C') + j)
ws[col + row].font = name_font
ws[col + row].alignment = c_c_alignment
ws[col + row] = round(associated_equipment['subtotals_array'][j][i], 2)
ws[col + row].border = f_border
filename = str(uuid.uuid4()) + '.xlsx' filename = str(uuid.uuid4()) + '.xlsx'
wb.save(filename) wb.save(filename)

View File

@ -23,11 +23,13 @@ class Reporting:
# Step 2: query the combined equipment # Step 2: query the combined equipment
# Step 3: query energy items # Step 3: query energy items
# Step 4: query associated points # Step 4: query associated points
# Step 5: query base period energy input # Step 5: query associated equipments
# Step 6: query reporting period energy input # Step 6: query base period energy input
# Step 7: query tariff data # Step 7: query reporting period energy input
# Step 8: query associated points data # Step 8: query tariff data
# Step 9: construct the report # Step 9: query associated points data
# Step 10: query associated equipments energy input
# Step 11: construct the report
#################################################################################################################### ####################################################################################################################
@staticmethod @staticmethod
def on_get(req, resp): def on_get(req, resp):
@ -239,7 +241,21 @@ class Reporting:
point_list.append({"id": row[0], "name": row[1], "units": row[2], "object_type": row[3]}) point_list.append({"id": row[0], "name": row[1], "units": row[2], "object_type": row[3]})
################################################################################################################ ################################################################################################################
# Step 5: query base period energy input # Step 5: query associated equipments
################################################################################################################
associated_equipment_list = list()
cursor_system.execute(" SELECT e.id, e.name "
" FROM tbl_equipments e,tbl_combined_equipments_equipments ee"
" WHERE ee.combined_equipment_id = %s AND e.id = ee.equipment_id"
" ORDER BY e.id ", (combined_equipment['id'],))
rows_associated_equipments = cursor_system.fetchall()
if rows_associated_equipments is not None and len(rows_associated_equipments) > 0:
for row in rows_associated_equipments:
associated_equipment_list.append({"id": row[0], "name": row[1]})
print(associated_equipment_list)
################################################################################################################
# Step 6: query base period energy input
################################################################################################################ ################################################################################################################
base = dict() base = dict()
if energy_item_set is not None and len(energy_item_set) > 0: if energy_item_set is not None and len(energy_item_set) > 0:
@ -286,7 +302,7 @@ class Reporting:
base[energy_item_id]['subtotal'] += actual_value base[energy_item_id]['subtotal'] += actual_value
################################################################################################################ ################################################################################################################
# Step 6: query reporting period energy input # Step 7: query reporting period energy input
################################################################################################################ ################################################################################################################
reporting = dict() reporting = dict()
if energy_item_set is not None and len(energy_item_set) > 0: if energy_item_set is not None and len(energy_item_set) > 0:
@ -353,7 +369,7 @@ class Reporting:
reporting[energy_item_id]['offpeak'] += row[1] reporting[energy_item_id]['offpeak'] += row[1]
################################################################################################################ ################################################################################################################
# Step 7: query tariff data # Step 8: query tariff data
################################################################################################################ ################################################################################################################
parameters_data = dict() parameters_data = dict()
parameters_data['names'] = list() parameters_data['names'] = list()
@ -379,7 +395,7 @@ class Reporting:
parameters_data['values'].append(tariff_value_list) parameters_data['values'].append(tariff_value_list)
################################################################################################################ ################################################################################################################
# Step 8: query associated points data # Step 9: query associated points data
################################################################################################################ ################################################################################################################
for point in point_list: for point in point_list:
point_values = [] point_values = []
@ -444,7 +460,37 @@ class Reporting:
parameters_data['values'].append(point_values) parameters_data['values'].append(point_values)
################################################################################################################ ################################################################################################################
# Step 9: construct the report # Step 10: query associated equipments energy input
################################################################################################################
associated_equipment_data = dict()
if energy_item_set is not None and len(energy_item_set) > 0:
for energy_item_id in energy_item_set:
associated_equipment_data[energy_item_id] = dict()
associated_equipment_data[energy_item_id]['associated_equipment_names'] = list()
associated_equipment_data[energy_item_id]['subtotals'] = list()
for associated_equipment in associated_equipment_list:
associated_equipment_data[energy_item_id]['associated_equipment_names'].append(
associated_equipment['name'])
cursor_energy.execute(" SELECT SUM(actual_value) "
" FROM tbl_equipment_input_item_hourly "
" WHERE equipment_id = %s "
" AND energy_item_id = %s "
" AND start_datetime_utc >= %s "
" AND start_datetime_utc < %s "
" ORDER BY start_datetime_utc ",
(associated_equipment['id'],
energy_item_id,
reporting_start_datetime_utc,
reporting_end_datetime_utc))
row_subtotal = cursor_energy.fetchone()
subtotal = Decimal(0.0) if (row_subtotal is None or row_subtotal[0] is None) else row_subtotal[0]
associated_equipment_data[energy_item_id]['subtotals'].append(subtotal)
################################################################################################################
# Step 11: construct the report
################################################################################################################ ################################################################################################################
if cursor_system: if cursor_system:
cursor_system.close() cursor_system.close()
@ -522,6 +568,20 @@ class Reporting:
"values": parameters_data['values'] "values": parameters_data['values']
} }
result['associated_equipment'] = dict()
result['associated_equipment']['energy_item_names'] = list()
result['associated_equipment']['units'] = list()
result['associated_equipment']['associated_equipment_names_array'] = list()
result['associated_equipment']['subtotals_array'] = list()
if energy_item_set is not None and len(energy_item_set) > 0:
for energy_item_id in energy_item_set:
result['associated_equipment']['energy_item_names'].append(energy_item_dict[energy_item_id]['name'])
result['associated_equipment']['units'].append(energy_item_dict[energy_item_id]['unit_of_measure'])
result['associated_equipment']['associated_equipment_names_array'].append(
associated_equipment_data[energy_item_id]['associated_equipment_names'])
result['associated_equipment']['subtotals_array'].append(
associated_equipment_data[energy_item_id]['subtotals'])
# export result to Excel file and then encode the file to base64 string # export result to Excel file and then encode the file to base64 string
result['excel_bytes_base64'] = excelexporters.combinedequipmentenergyitem.export(result, result['excel_bytes_base64'] = excelexporters.combinedequipmentenergyitem.export(result,
combined_equipment['name'], combined_equipment['name'],