added associated equipment data to combinedequipmentcost report in API

pull/26/head
13621160019@163.com 2021-03-31 15:20:32 +08:00
parent 8ae8d33618
commit d5261e8e01
2 changed files with 176 additions and 35 deletions

View File

@ -1,17 +1,20 @@
import base64 import base64
import uuid import uuid
import os import os
from decimal import Decimal
from openpyxl.chart import ( from openpyxl.chart import (
PieChart, PieChart,
LineChart, LineChart,
BarChart, BarChart,
Reference, Reference,
) )
from openpyxl.styles import PatternFill, Border, Side, Alignment, Font from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
from openpyxl.drawing.image import Image from openpyxl.drawing.image import Image
from openpyxl import Workbook from openpyxl import Workbook
from openpyxl.chart.label import DataLabelList from openpyxl.chart.label import DataLabelList
#################################################################################################################### ####################################################################################################################
# PROCEDURES # PROCEDURES
# Step 1: Validate the report data # Step 1: Validate the report data
@ -66,7 +69,6 @@ def generate_excel(report,
reporting_start_datetime_local, reporting_start_datetime_local,
reporting_end_datetime_local, reporting_end_datetime_local,
period_type): period_type):
wb = Workbook() wb = Workbook()
ws = wb.active ws = wb.active
@ -182,7 +184,7 @@ def generate_excel(report,
if has_energy_data_flag: if has_energy_data_flag:
ws['B6'].font = title_font ws['B6'].font = title_font
ws['B6'] = name+' 报告期成本' ws['B6'] = name + ' 报告期成本'
category = reporting_period_data['names'] category = reporting_period_data['names']
ca_len = len(category) ca_len = len(category)
@ -222,7 +224,7 @@ def generate_excel(report,
if reporting_period_data['increment_rates'][i] is not None else "-" if reporting_period_data['increment_rates'][i] is not None else "-"
ws[col + '9'].border = f_border ws[col + '9'].border = f_border
end_col = chr(ord(col)+1) end_col = chr(ord(col) + 1)
ws[end_col + '7'].fill = table_fill ws[end_col + '7'].fill = table_fill
ws[end_col + '7'].font = name_font ws[end_col + '7'].font = name_font
ws[end_col + '7'].alignment = c_c_alignment ws[end_col + '7'].alignment = c_c_alignment
@ -254,7 +256,7 @@ def generate_excel(report,
if has_ele_peak_flag: if has_ele_peak_flag:
ws['B12'].font = title_font ws['B12'].font = title_font
ws['B12'] = name+'分时用电成本' ws['B12'] = name + '分时用电成本'
ws['B13'].fill = table_fill ws['B13'].fill = table_fill
ws['B13'].font = name_font ws['B13'].font = name_font
@ -273,8 +275,8 @@ def generate_excel(report,
ws['D13'].border = f_border ws['D13'].border = f_border
ws['D13'] = '分时用电成本占比' ws['D13'] = '分时用电成本占比'
wssum = round(reporting_period_data['toppeaks'][0], 2)+round(reporting_period_data['onpeaks'][0], 2)\ wssum = round(reporting_period_data['toppeaks'][0], 2) + round(reporting_period_data['onpeaks'][0], 2) + \
+ round(reporting_period_data['midpeaks'][0], 2)+round(reporting_period_data['offpeaks'][0], 2) round(reporting_period_data['midpeaks'][0], 2) + round(reporting_period_data['offpeaks'][0], 2)
ws['B14'].font = title_font ws['B14'].font = title_font
ws['B14'].alignment = c_c_alignment ws['B14'].alignment = c_c_alignment
@ -289,7 +291,8 @@ def generate_excel(report,
ws['D14'].font = title_font ws['D14'].font = title_font
ws['D14'].alignment = c_c_alignment ws['D14'].alignment = c_c_alignment
ws['D14'].border = f_border ws['D14'].border = f_border
ws['D14'] = '{:.2%}'.format(round(reporting_period_data['toppeaks'][0], 2)/wssum) ws['D14'] = '{:.2%}'.format(round(reporting_period_data['toppeaks'][0], 2) / wssum) \
if wssum is not None and wssum != Decimal(0.0) else " "
ws['B15'].font = title_font ws['B15'].font = title_font
ws['B15'].alignment = c_c_alignment ws['B15'].alignment = c_c_alignment
@ -304,7 +307,8 @@ def generate_excel(report,
ws['D15'].font = title_font ws['D15'].font = title_font
ws['D15'].alignment = c_c_alignment ws['D15'].alignment = c_c_alignment
ws['D15'].border = f_border ws['D15'].border = f_border
ws['D15'] = '{:.2%}'.format(round(reporting_period_data['onpeaks'][0], 2)/wssum) ws['D15'] = '{:.2%}'.format(round(reporting_period_data['onpeaks'][0], 2) / wssum) \
if wssum is not None and wssum != Decimal(0.0) else " "
ws['B16'].font = title_font ws['B16'].font = title_font
ws['B16'].alignment = c_c_alignment ws['B16'].alignment = c_c_alignment
@ -319,7 +323,8 @@ def generate_excel(report,
ws['D16'].font = title_font ws['D16'].font = title_font
ws['D16'].alignment = c_c_alignment ws['D16'].alignment = c_c_alignment
ws['D16'].border = f_border ws['D16'].border = f_border
ws['D16'] = '{:.2%}'.format(round(reporting_period_data['midpeaks'][0], 2)/wssum) ws['D16'] = '{:.2%}'.format(round(reporting_period_data['midpeaks'][0], 2) / wssum) \
if wssum is not None and wssum != Decimal(0.0) else " "
ws['B17'].font = title_font ws['B17'].font = title_font
ws['B17'].alignment = c_c_alignment ws['B17'].alignment = c_c_alignment
@ -334,10 +339,11 @@ def generate_excel(report,
ws['D17'].font = title_font ws['D17'].font = title_font
ws['D17'].alignment = c_c_alignment ws['D17'].alignment = c_c_alignment
ws['D17'].border = f_border ws['D17'].border = f_border
ws['D17'] = '{:.2%}'.format(round(reporting_period_data['offpeaks'][0], 2)/wssum) ws['D17'] = '{:.2%}'.format(round(reporting_period_data['offpeaks'][0], 2) / wssum) \
if wssum is not None and wssum != Decimal(0.0) else " "
pie = PieChart() pie = PieChart()
pie.title = name+'分时用电成本' pie.title = name + '分时用电成本'
labels = Reference(ws, min_col=2, min_row=14, max_row=17) labels = Reference(ws, min_col=2, min_row=14, max_row=17)
pie_data = Reference(ws, min_col=3, min_row=13, max_row=17) pie_data = Reference(ws, min_col=3, min_row=13, max_row=17)
pie.add_data(pie_data, titles_from_data=True) pie.add_data(pie_data, titles_from_data=True)
@ -393,7 +399,7 @@ def generate_excel(report,
current_row_number += 1 current_row_number += 1
ca_len = len(reporting_period_data['names']) ca_len = len(reporting_period_data['names'])
wssum = 0 wssum = Decimal(0.0)
for i in range(0, ca_len): for i in range(0, ca_len):
wssum = round(reporting_period_data['subtotals'][i], 2) + wssum wssum = round(reporting_period_data['subtotals'][i], 2) + wssum
for i in range(0, ca_len): for i in range(0, ca_len):
@ -410,8 +416,9 @@ def generate_excel(report,
ws['D' + str(current_row_number)].font = title_font ws['D' + str(current_row_number)].font = title_font
ws['D' + str(current_row_number)].alignment = c_c_alignment ws['D' + str(current_row_number)].alignment = c_c_alignment
ws['D' + str(current_row_number)].border = f_border ws['D' + str(current_row_number)].border = f_border
ws['D' + str(current_row_number)] = '{:.2%}'.format(round(reporting_period_data['subtotals'][i], 2) / wssum) ws['D' + str(current_row_number)] = '{:.2%}'.format(round(
reporting_period_data['subtotals'][i], 2) / wssum) if wssum is not None and wssum != Decimal(0.0) \
else " "
current_row_number += 1 current_row_number += 1
table_end_row_number = current_row_number - 1 table_end_row_number = current_row_number - 1
@ -459,7 +466,7 @@ def generate_excel(report,
ca_len = len(report['reporting_period']['names']) ca_len = len(report['reporting_period']['names'])
ws['B' + str(current_row_number)].font = title_font ws['B' + str(current_row_number)].font = title_font
ws['B' + str(current_row_number)] = name+' 详细数据' ws['B' + str(current_row_number)] = name + ' 详细数据'
table_start_row_number = (current_row_number + 1) + ca_len * 6 table_start_row_number = (current_row_number + 1) + ca_len * 6
current_row_number = table_start_row_number current_row_number = table_start_row_number
@ -487,8 +494,8 @@ def generate_excel(report,
ws[col + str(current_row_number)].fill = table_fill ws[col + str(current_row_number)].fill = table_fill
ws[col + str(current_row_number)].font = title_font ws[col + str(current_row_number)].font = title_font
ws[col + str(current_row_number)].alignment = c_c_alignment ws[col + str(current_row_number)].alignment = c_c_alignment
ws[col + str(current_row_number)] = reporting_period_data['names'][i] + \ ws[col + str(current_row_number)] = \
" (" + reporting_period_data['units'][i] + ")" reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
ws[col + str(current_row_number)].border = f_border ws[col + str(current_row_number)].border = f_border
end_col = chr(ord(col) + 1) end_col = chr(ord(col) + 1)
@ -509,7 +516,7 @@ def generate_excel(report,
col = 'B' col = 'B'
every_day_total = 0 every_day_total = Decimal(0.0)
for j in range(0, ca_len): for j in range(0, ca_len):
col = chr(ord('C') + j) col = chr(ord('C') + j)
@ -547,7 +554,7 @@ def generate_excel(report,
# line # line
line = LineChart() line = LineChart()
line.title = '报告期成本 - ' + ws.cell(column=3+i, row=table_start_row_number).value line.title = '报告期成本 - ' + ws.cell(column=3 + i, row=table_start_row_number).value
labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number) labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number) line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number)
line.add_data(line_data, titles_from_data=True) line.add_data(line_data, titles_from_data=True)
@ -579,6 +586,78 @@ def generate_excel(report,
current_row_number = 70 current_row_number = 70
ws.row_dimensions[i].height = 0.1 ws.row_dimensions[i].height = 0.1
#####################################
has_associated_equipment_flag = True
if "associated_equipment" not in report.keys() or \
"energy_category_names" not in report['associated_equipment'].keys() or \
len(report['associated_equipment']["energy_category_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']
current_row_number += 1
ws['B' + str(current_row_number)].font = title_font
ws['B' + str(current_row_number)] = name + ' 相关设备数据'
current_row_number += 1
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_category_names'])
for i in range(0, ca_len):
col = chr(ord('C') + i)
ws[col + str(current_row_number)].fill = table_fill
ws[col + str(current_row_number)].font = name_font
ws[col + str(current_row_number)].alignment = c_c_alignment
ws[col + str(current_row_number)].border = f_border
ws[col + str(current_row_number)] = \
reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
end_col = chr(ord('B') + ca_len + 1)
ws[end_col + str(current_row_number)].fill = table_fill
ws[end_col + str(current_row_number)].font = name_font
ws[end_col + str(current_row_number)].alignment = c_c_alignment
ws[end_col + str(current_row_number)].border = f_border
ws[end_col + str(current_row_number)] = "总计" + " (" + 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)
value = Decimal(0.0)
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 = title_font
ws[col + row].alignment = c_c_alignment
ws[col + row] = round(associated_equipment['subtotals_array'][j][i], 2)
value += round(associated_equipment['subtotals_array'][j][i], 2)
ws[col + row].border = f_border
end_col = chr(ord(col) + 1)
ws[end_col + row].font = title_font
ws[end_col + row].alignment = c_c_alignment
ws[end_col + row] = round(value, 2)
ws[end_col + row].border = f_border
filename = str(uuid.uuid4()) + '.xlsx' filename = str(uuid.uuid4()) + '.xlsx'
wb.save(filename) wb.save(filename)

View File

@ -21,13 +21,15 @@ class Reporting:
# PROCEDURES # PROCEDURES
# Step 1: valid parameters # Step 1: valid parameters
# Step 2: query the combined equipment # Step 2: query the combined equipment
# Step 3: query energy categories # Step 3: query energy items
# Step 4: query associated points # Step 4: query associated points
# Step 5: query base period energy cost # Step 5: query associated equipments
# Step 6: query reporting period energy cost # Step 6: query base period energy cost
# Step 7: query tariff data # Step 7: query reporting period energy cost
# 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 cost
# Step 11: construct the report
#################################################################################################################### ####################################################################################################################
@staticmethod @staticmethod
def on_get(req, resp): def on_get(req, resp):
@ -235,7 +237,20 @@ 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 cost # 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 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]})
################################################################################################################
# Step 6: query base period energy cost
################################################################################################################ ################################################################################################################
base = dict() base = dict()
if energy_category_set is not None and len(energy_category_set) > 0: if energy_category_set is not None and len(energy_category_set) > 0:
@ -282,7 +297,7 @@ class Reporting:
base[energy_category_id]['subtotal'] += actual_value base[energy_category_id]['subtotal'] += actual_value
################################################################################################################ ################################################################################################################
# Step 6: query reporting period energy cost # Step 7: query reporting period energy cost
################################################################################################################ ################################################################################################################
reporting = dict() reporting = dict()
if energy_category_set is not None and len(energy_category_set) > 0: if energy_category_set is not None and len(energy_category_set) > 0:
@ -349,7 +364,7 @@ class Reporting:
reporting[energy_category_id]['offpeak'] += row[1] reporting[energy_category_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()
@ -375,7 +390,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 = []
@ -440,7 +455,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 cost
################################################################################################################
associated_equipment_data = dict()
if energy_category_set is not None and len(energy_category_set) > 0:
for energy_category_id in energy_category_set:
associated_equipment_data[energy_category_id] = dict()
associated_equipment_data[energy_category_id]['associated_equipment_names'] = list()
associated_equipment_data[energy_category_id]['subtotals'] = list()
for associated_equipment in associated_equipment_list:
associated_equipment_data[energy_category_id]['associated_equipment_names'].append(
associated_equipment['name'])
cursor_billing.execute(" SELECT SUM(actual_value) "
" FROM tbl_equipment_input_category_hourly "
" WHERE equipment_id = %s "
" AND energy_category_id = %s "
" AND start_datetime_utc >= %s "
" AND start_datetime_utc < %s "
" ORDER BY start_datetime_utc ",
(associated_equipment['id'],
energy_category_id,
reporting_start_datetime_utc,
reporting_end_datetime_utc))
row_subtotal = cursor_billing.fetchone()
subtotal = Decimal(0.0) if (row_subtotal is None or row_subtotal[0] is None) else row_subtotal[0]
associated_equipment_data[energy_category_id]['subtotals'].append(subtotal)
################################################################################################################
# Step 11: construct the report
################################################################################################################ ################################################################################################################
if cursor_system: if cursor_system:
cursor_system.close() cursor_system.close()
@ -522,6 +567,23 @@ class Reporting:
"timestamps": parameters_data['timestamps'], "timestamps": parameters_data['timestamps'],
"values": parameters_data['values'] "values": parameters_data['values']
} }
result['associated_equipment'] = dict()
result['associated_equipment']['energy_category_names'] = list()
result['associated_equipment']['units'] = list()
result['associated_equipment']['associated_equipment_names_array'] = list()
result['associated_equipment']['subtotals_array'] = list()
if energy_category_set is not None and len(energy_category_set) > 0:
for energy_category_id in energy_category_set:
result['associated_equipment']['energy_category_names'].append(
energy_category_dict[energy_category_id]['name'])
result['associated_equipment']['units'].append(
energy_category_dict[energy_category_id]['unit_of_measure'])
result['associated_equipment']['associated_equipment_names_array'].append(
associated_equipment_data[energy_category_id]['associated_equipment_names'])
result['associated_equipment']['subtotals_array'].append(
associated_equipment_data[energy_category_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.combinedequipmentcost.export(result, result['excel_bytes_base64'] = excelexporters.combinedequipmentcost.export(result,
combined_equipment['name'], combined_equipment['name'],