diff --git a/CHANGELOG.md b/CHANGELOG.md
index d42ff0b3..92893e3b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,32 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [Unreleased]
### Added
+- added excel exporter of equipmentincome report
+- added excel exporter of shopfloorsaving report
+- added excel exporter of equipmentload report
+
+### Changed
+- None.
+
+### Fixed
+- None.
+
+### Removed
+- None.
+
+## [v1.0.7] - 2021-03-07
+### Added
+- added excel exporter of storeload report
+- added excel exporter of spaceincome report
+- added excel exporter of equipmentsaving report
+- added excel exporter of combinedequipmentsaving report
+- added excel exporter of combinedequipmentload report
+- added excel exporter of spaceoutput report
+- added excel exporter of combinedequipmentoutput
+- added excel exporter of combinedequipmentcost report
+- added excel exporter of shopfloorcost report
+- added excel exporter of shopfloorload report
+- added excel exporter of combinedequipmentenergycategory report
- added excel exporter of combinedequipmentitem report.
- added excel exporter of equipmentenergyitem report.
- added excel exporter of equipmentenergycategory report.
@@ -53,7 +79,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Removed
- None.
-[Unreleased]: https://github.com/MyEMS/myems/compare/v1.0.5...HEAD
+[Unreleased]: https://github.com/MyEMS/myems/compare/v1.0.7...HEAD
+[v1.0.7]: https://github.com/MyEMS/myems/compare/v1.0.6...v1.0.7
[v1.0.6]: https://github.com/MyEMS/myems/compare/v1.0.5...v1.0.6
[v1.0.5]: https://github.com/MyEMS/myems/releases/tag/v1.0.5
diff --git a/README.md b/README.md
index db649e9c..864b4435 100644
--- a/README.md
+++ b/README.md
@@ -19,15 +19,15 @@ MyEMS是行业领先的开源能源管理系统,利用云计算、物联网、
## MyEMS架构

-## MyEMS组件(社区版 )
+## MyEMS组件(社区版)
MyEMS项目由下列组件构成:
-### MyEMS Web APP
+### MyEMS Web UI
参考[web](./web/README.md) 获取更多信息。
-### MyEMS 管理面板
+### MyEMS 管理 UI
参考[admin](./admin/README.md) 获取更多信息。
@@ -188,3 +188,5 @@ MyEMS项目由下列组件构成:
[3]. http://bitbucket.org/myems/myems
+[4]. https://gitlab.com/myems/myems
+
diff --git a/README_DE.md b/README_DE.md
index 784a6d70..bf670b57 100644
--- a/README_DE.md
+++ b/README_DE.md
@@ -23,11 +23,11 @@ MyEMS wird von einem erfahrenen Entwicklungsteam entwickelt und gewartet, und de
Dieses Projekt besteht aus folgenden Komponenten:
-### MyEMS Web APP
+### MyEMS Web UI
Weitere Informationen finden Sie [web](./web/README.md).
-### MyEMS Admin Panel
+### MyEMS Admin UI
Weitere Informationen finden Sie im [admin](./admin/README.md).
@@ -190,3 +190,4 @@ Weitere Informationen finden Sie im [myems-modbus-tcp](./myems-modbus-tcp/README
[3]. http://bitbucket.org/myems/myems
+[4]. https://gitlab.com/myems/myems
diff --git a/README_EN.md b/README_EN.md
index c72f261d..aa108d00 100644
--- a/README_EN.md
+++ b/README_EN.md
@@ -23,11 +23,11 @@ MyEMS is being developed and maintained by an experienced development team, and
This project is compose of following components:
-### MyEMS Web APP
+### MyEMS Web UI
See the repository [web](./web/README.md) for more information.
-### MyEMS Admin Panel
+### MyEMS Admin UI
See [admin](./admin/README.md) for more information.
@@ -190,3 +190,5 @@ See [myems-modbus-tcp](./myems-modbus-tcp/README.md) for more information.
[3]. http://bitbucket.org/myems/myems
+[4]. https://gitlab.com/myems/myems
+
diff --git a/admin/views/common/footer-login.html b/admin/views/common/footer-login.html
index bf7d36fa..3ceedced 100644
--- a/admin/views/common/footer-login.html
+++ b/admin/views/common/footer-login.html
@@ -1,5 +1,5 @@
diff --git a/admin/views/common/footer.html b/admin/views/common/footer.html
index 249a0ba3..d5534c93 100644
--- a/admin/views/common/footer.html
+++ b/admin/views/common/footer.html
@@ -3,6 +3,6 @@
https://myems.io
- {{'MY_EMS_NAME' | translate}} V1.0.5
+ {{'MY_EMS_NAME' | translate}} V1.0.7
diff --git a/database/upgrade1.0.7.sql b/database/upgrade1.0.7.sql
new file mode 100644
index 00000000..9778bd4e
--- /dev/null
+++ b/database/upgrade1.0.7.sql
@@ -0,0 +1,3 @@
+
+-- UPDATE VERSION NUMBER
+UPDATE myems_system_db.tbl_versions SET version='1.0.7', release_date='2021-03-07' WHERE id=1;
diff --git a/myems-api/core/version.py b/myems-api/core/version.py
index 080efd2a..041ded6e 100644
--- a/myems-api/core/version.py
+++ b/myems-api/core/version.py
@@ -14,8 +14,8 @@ class VersionItem:
@staticmethod
def on_get(req, resp):
- result = {"version": 'MyEMS 1.0.6 (Community Edition)',
- "release-date": '20210227',
+ result = {"version": 'MyEMS 1.0.7 (Community Edition)',
+ "release-date": '20210307',
"website": "https://myems.io"}
resp.body = json.dumps(result)
diff --git a/myems-api/excelexporters/equipmentload.py b/myems-api/excelexporters/equipmentload.py
new file mode 100644
index 00000000..75ddd9eb
--- /dev/null
+++ b/myems-api/excelexporters/equipmentload.py
@@ -0,0 +1,379 @@
+import base64
+import uuid
+import os
+from openpyxl.chart import (
+ LineChart,
+ Reference,
+)
+from openpyxl.chart.label import DataLabelList
+from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
+from openpyxl.drawing.image import Image
+from openpyxl import Workbook
+
+
+####################################################################################################################
+# PROCEDURES
+# Step 1: Validate the report data
+# Step 2: Generate excel file
+# Step 3: Encode the excel file bytes to Base64
+####################################################################################################################
+
+
+def export(report,
+ name,
+ reporting_start_datetime_local,
+ reporting_end_datetime_local,
+ period_type):
+ ####################################################################################################################
+ # Step 1: Validate the report data
+ ####################################################################################################################
+ if report is None:
+ return None
+
+ ####################################################################################################################
+ # Step 2: Generate excel file from the report data
+ ####################################################################################################################
+ filename = generate_excel(report,
+ name,
+ reporting_start_datetime_local,
+ reporting_end_datetime_local,
+ period_type)
+ ####################################################################################################################
+ # Step 3: Encode the excel file to Base64
+ ####################################################################################################################
+ try:
+ with open(filename, 'rb') as binary_file:
+ binary_file_data = binary_file.read()
+ except IOError as ex:
+ pass
+
+ # Base64 encode the bytes
+ base64_encoded_data = base64.b64encode(binary_file_data)
+ # get the Base64 encoded data using human-readable characters.
+ base64_message = base64_encoded_data.decode('utf-8')
+ # delete the file from server
+ try:
+ os.remove(filename)
+ except NotImplementedError as ex:
+ pass
+ return base64_message
+
+
+def generate_excel(report,
+ name,
+ reporting_start_datetime_local,
+ reporting_end_datetime_local,
+ period_type):
+ wb = Workbook()
+ ws = wb.active
+
+ # Row height
+ ws.row_dimensions[1].height = 102
+
+ for i in range(2, 2000 + 1):
+ ws.row_dimensions[i].height = 42
+
+ # Col width
+ ws.column_dimensions['A'].width = 1.5
+ ws.column_dimensions['B'].width = 25.0
+
+ for i in range(ord('C'), ord('L')):
+ ws.column_dimensions[chr(i)].width = 15.0
+
+ # Font
+ name_font = Font(name='Constantia', size=15, bold=True)
+ title_font = Font(name='宋体', size=15, bold=True)
+ # data_font = Font(name='Franklin Gothic Book', size=11)
+
+ table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
+ f_border = Border(left=Side(border_style='medium', color='00000000'),
+ right=Side(border_style='medium', color='00000000'),
+ bottom=Side(border_style='medium', color='00000000'),
+ top=Side(border_style='medium', color='00000000')
+ )
+ b_border = Border(
+ bottom=Side(border_style='medium', color='00000000'),
+ )
+
+ b_c_alignment = Alignment(vertical='bottom',
+ horizontal='center',
+ text_rotation=0,
+ wrap_text=False,
+ shrink_to_fit=False,
+ indent=0)
+ c_c_alignment = Alignment(vertical='center',
+ horizontal='center',
+ text_rotation=0,
+ wrap_text=True,
+ shrink_to_fit=False,
+ indent=0)
+ b_r_alignment = Alignment(vertical='bottom',
+ horizontal='right',
+ text_rotation=0,
+ wrap_text=False,
+ shrink_to_fit=False,
+ indent=0)
+ # c_r_alignment = Alignment(vertical='bottom',
+ # horizontal='center',
+ # text_rotation=0,
+ # wrap_text=False,
+ # shrink_to_fit=False,
+ # indent=0)
+
+ # Img
+ img = Image("excelexporters/myems.png")
+ # img = Image("myems.png")
+ img.width = img.width * 1.06
+ img.height = img.height * 1.06
+ ws.add_image(img, 'B1')
+
+ # Title
+ ws['B3'].font = name_font
+ ws['B3'].alignment = b_r_alignment
+ ws['B3'] = 'Name:'
+ ws['C3'].border = b_border
+ ws['C3'].alignment = b_c_alignment
+ ws['C3'].font = name_font
+ ws['C3'] = name
+
+ ws['D3'].font = name_font
+ ws['D3'].alignment = b_r_alignment
+ ws['D3'] = 'Period:'
+ ws['E3'].border = b_border
+ ws['E3'].alignment = b_c_alignment
+ ws['E3'].font = name_font
+ ws['E3'] = period_type
+
+ ws['F3'].font = name_font
+ ws['F3'].alignment = b_r_alignment
+ ws['F3'] = 'Date:'
+ ws['G3'].border = b_border
+ ws['G3'].alignment = b_c_alignment
+ ws['G3'].font = name_font
+ ws['G3'] = reporting_start_datetime_local[:10] + "__" + reporting_end_datetime_local[:10]
+ ws.merge_cells("G3:H3")
+
+ if "reporting_period" not in report.keys() or \
+ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
+ filename = str(uuid.uuid4()) + '.xlsx'
+ wb.save(filename)
+
+ return filename
+ #################################################
+ # First: 统计分析
+ # 6: title
+ # 7: table title
+ # 8~2*ca_len table_data
+ #################################################
+ reporting_period_data = report['reporting_period']
+
+ has_energy_data_flag = True
+
+ if "names" not in reporting_period_data.keys() or \
+ reporting_period_data['names'] is None or \
+ len(reporting_period_data['names']) == 0:
+ has_energy_data_flag = False
+
+ filename = str(uuid.uuid4()) + '.xlsx'
+ wb.save(filename)
+
+ return filename
+
+ if has_energy_data_flag:
+ ws['B6'].font = title_font
+ ws['B6'] = name + ' 统计分析'
+
+ category = reporting_period_data['names']
+
+ # table_title
+ ws['B7'].fill = table_fill
+ ws['B7'].font = title_font
+ ws['B7'].alignment = c_c_alignment
+ ws['B7'] = '报告期'
+ ws['B7'].border = f_border
+
+ ws['C7'].font = title_font
+ ws['C7'].alignment = c_c_alignment
+ ws['C7'] = '平均负荷'
+ ws['C7'].border = f_border
+
+ ws['D7'].font = title_font
+ ws['D7'].alignment = c_c_alignment
+ ws['D7'] = '最大负荷'
+ ws['D7'].border = f_border
+
+ ws['E7'].font = title_font
+ ws['E7'].alignment = c_c_alignment
+ ws['E7'] = '负荷系数'
+ ws['E7'].border = f_border
+
+ # table_data
+
+ for i, value in enumerate(category):
+ row = i * 2 + 8
+ ws['B' + str(row)].font = name_font
+ ws['B' + str(row)].alignment = c_c_alignment
+ ws['B' + str(row)] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + "/H )"
+ ws['B' + str(row)].border = f_border
+
+ ws['B' + str(row + 1)].font = name_font
+ ws['B' + str(row + 1)].alignment = c_c_alignment
+ ws['B' + str(row + 1)] = "环比"
+ ws['B' + str(row + 1)].border = f_border
+
+ ws['C' + str(row)].font = name_font
+ ws['C' + str(row)].alignment = c_c_alignment
+ ws['C' + str(row)] = round(reporting_period_data['averages'][i], 2) \
+ if reporting_period_data['averages'][i] is not None else ''
+ ws['C' + str(row)].border = f_border
+ ws['C' + str(row)].number_format = '0.00'
+
+ ws['C' + str(row + 1)].font = name_font
+ ws['C' + str(row + 1)].alignment = c_c_alignment
+ ws['C' + str(row + 1)] = str(round(reporting_period_data['averages_increment_rate'][i] * 100, 2)) + "%" \
+ if reporting_period_data['averages_increment_rate'][i] is not None else '0.00%'
+ ws['C' + str(row + 1)].border = f_border
+
+ ws['D' + str(row)].font = name_font
+ ws['D' + str(row)].alignment = c_c_alignment
+ ws['D' + str(row)] = round(reporting_period_data['maximums'][i], 2) \
+ if reporting_period_data['maximums'][i] is not None else ''
+ ws['D' + str(row)].border = f_border
+ ws['D' + str(row)].number_format = '0.00'
+
+ ws['D' + str(row + 1)].font = name_font
+ ws['D' + str(row + 1)].alignment = c_c_alignment
+ ws['D' + str(row + 1)] = str(round(reporting_period_data['maximums_increment_rate'][i] * 100, 2)) + "%" \
+ if reporting_period_data['maximums_increment_rate'][i] is not None else '0.00%'
+ ws['D' + str(row + 1)].border = f_border
+
+ ws['E' + str(row)].font = name_font
+ ws['E' + str(row)].alignment = c_c_alignment
+ ws['E' + str(row)] = round(reporting_period_data['factors'][i], 2) \
+ if reporting_period_data['factors'][i] is not None else ''
+ ws['E' + str(row)].border = f_border
+ ws['E' + str(row)].number_format = '0.00'
+
+ ws['E' + str(row + 1)].font = name_font
+ ws['E' + str(row + 1)].alignment = c_c_alignment
+ ws['E' + str(row + 1)] = str(round(reporting_period_data['factors_increment_rate'][i] * 100, 2)) + "%" \
+ if reporting_period_data['factors_increment_rate'][i] is not None else '0.00%'
+ ws['E' + str(row + 1)].border = f_border
+
+ ########################################################
+ # Third: 详细数据
+ # row_sat~ row_sat + 6*cal_len: line
+ # row_da: table title
+ # row_da + 1~: table_data
+ ########################################################
+ has_timestamps_flag = True
+ if "timestamps" not in reporting_period_data.keys() or \
+ reporting_period_data['timestamps'] is None or \
+ len(reporting_period_data['timestamps']) == 0:
+ has_timestamps_flag = False
+
+ if has_timestamps_flag:
+ timestamps = reporting_period_data['timestamps'][0]
+ names = reporting_period_data['names']
+ ca_len = len(names)
+ time_len = len(timestamps)
+ # row_lines == the number of rows of lines
+ row_lines = 6 * ca_len
+ # row_sat == the number of rows of statistical analysis table
+ row_sat = 9 + 2 * ca_len
+ # row_da == the number of rows of Detailed data
+ row_da = row_sat + row_lines + 1
+
+ ws['B' + str(row_da)].font = title_font
+ ws['B' + str(row_da)] = name + ' 详细数据'
+ # table_title
+ ws['B' + str(row_da + 1)].fill = table_fill
+ ws['B' + str(row_da + 1)].font = name_font
+ ws['B' + str(row_da + 1)].alignment = c_c_alignment
+ ws['B' + str(row_da + 1)] = "日期时间"
+ ws['B' + str(row_da + 1)].border = f_border
+
+ for i in range(0, ca_len):
+ col_average = chr(ord('C') + 2 * i)
+ col_maximum = chr(ord('D') + 2 * i)
+
+ ws[col_average + str(row_da + 1)].font = name_font
+ ws[col_average + str(row_da + 1)].alignment = c_c_alignment
+ ws[col_average + str(row_da + 1)] = names[i] + " 平均负荷(" + reporting_period_data['units'][
+ i] + "/H)"
+ ws[col_average + str(row_da + 1)].border = f_border
+
+ ws[col_maximum + str(row_da + 1)].font = name_font
+ ws[col_maximum + str(row_da + 1)].alignment = c_c_alignment
+ ws[col_maximum + str(row_da + 1)] = names[i] + " 最大负荷(" + reporting_period_data['units'][
+ i] + "/H)"
+ ws[col_maximum + str(row_da + 1)].border = f_border
+ # table_date
+ for i in range(0, time_len):
+ rows = i + row_da + 2
+
+ ws['B' + str(rows)].font = name_font
+ ws['B' + str(rows)].alignment = c_c_alignment
+ ws['B' + str(rows)] = timestamps[i]
+ ws['B' + str(rows)].border = f_border
+
+ for index in range(0, ca_len):
+ col_average = chr(ord('C') + 2 * index)
+ col_maximum = chr(ord('D') + 2 * index)
+
+ ws[col_average + str(rows)].font = name_font
+ ws[col_average + str(rows)].alignment = c_c_alignment
+ ws[col_average + str(rows)] = reporting_period_data['sub_averages'][index][i] \
+ if reporting_period_data['sub_maximums'][index] is not None else ''
+ ws[col_average + str(rows)].number_format = '0.00'
+ ws[col_average + str(rows)].border = f_border
+
+ ws[col_maximum + str(rows)].font = name_font
+ ws[col_maximum + str(rows)].alignment = c_c_alignment
+ ws[col_maximum + str(rows)] = reporting_period_data['sub_maximums'][index][i] \
+ if reporting_period_data['sub_maximums'][index] is not None else ''
+ ws[col_maximum + str(rows)].number_format = '0.00'
+ ws[col_maximum + str(rows)].border = f_border
+ current_row_number = row_da + 1 + time_len
+
+ # ws['B' + str(current_row_number)].font = title_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)] = '小计'
+ # LineChart
+ for i in range(0, ca_len):
+ # col = chr(ord('C') + i)
+ # 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)].border = f_border
+ # ws[col + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 2)
+
+ lc = LineChart()
+ lc.title = "报告期 最大负荷"
+ lc.style = 10
+ lc.x_axis.majorTickMark = 'in'
+ lc.y_axis.majorTickMark = 'in'
+ lc.smooth = True
+ lc.x_axis.crosses = 'min'
+ lc.height = 8.25
+ lc.width = 24
+ lc.dLbls = DataLabelList()
+ lc.dLbls.dLblPos = 't'
+ lc.dLbls.showVal = True
+ times = Reference(ws, min_col=2, min_row=row_da + 2,
+ max_row=row_da + 2 + time_len)
+ lc_data = Reference(ws, min_col=2 + 2 * (i+1), min_row=row_da + 1,
+ max_row=row_da + 1 + time_len)
+ lc.add_data(lc_data, titles_from_data=True)
+ lc.set_categories(times)
+ ser = lc.series[0]
+ ser.marker.symbol = "diamond"
+ ser.marker.size = 5
+ chart_col = 'B'
+ chart_cell = str(row_sat + 6 * i)
+ ws.add_chart(lc, chart_col + chart_cell)
+
+ filename = str(uuid.uuid4()) + '.xlsx'
+ wb.save(filename)
+
+ return filename
diff --git a/myems-api/excelexporters/shopfloorsaving.py b/myems-api/excelexporters/shopfloorsaving.py
new file mode 100644
index 00000000..abfcdf5f
--- /dev/null
+++ b/myems-api/excelexporters/shopfloorsaving.py
@@ -0,0 +1,572 @@
+import base64
+import uuid
+import os
+from openpyxl.chart import (
+ PieChart,
+ LineChart,
+ BarChart,
+ Reference,
+)
+from openpyxl.styles import PatternFill, Border, Side, Alignment, Font
+from openpyxl.drawing.image import Image
+from openpyxl import Workbook
+from openpyxl.chart.label import DataLabelList
+
+####################################################################################################################
+# PROCEDURES
+# Step 1: Validate the report data
+# Step 2: Generate excel file
+# Step 3: Encode the excel file bytes to Base64
+####################################################################################################################
+
+
+def export(report,
+ name,
+ reporting_start_datetime_local,
+ reporting_end_datetime_local,
+ period_type):
+ ####################################################################################################################
+ # Step 1: Validate the report data
+ ####################################################################################################################
+ if report is None:
+ return None
+ print(report)
+
+ ####################################################################################################################
+ # Step 2: Generate excel file from the report data
+ ####################################################################################################################
+ filename = generate_excel(report,
+ name,
+ reporting_start_datetime_local,
+ reporting_end_datetime_local,
+ period_type)
+ ####################################################################################################################
+ # Step 3: Encode the excel file to Base64
+ ####################################################################################################################
+ try:
+ with open(filename, 'rb') as binary_file:
+ binary_file_data = binary_file.read()
+ except IOError as ex:
+ pass
+
+ # Base64 encode the bytes
+ base64_encoded_data = base64.b64encode(binary_file_data)
+ # get the Base64 encoded data using human-readable characters.
+ base64_message = base64_encoded_data.decode('utf-8')
+ # delete the file from server
+ try:
+ os.remove(filename)
+ except NotImplementedError as ex:
+ pass
+ return base64_message
+
+
+def generate_excel(report,
+ name,
+ reporting_start_datetime_local,
+ reporting_end_datetime_local,
+ period_type):
+ wb = Workbook()
+ ws = wb.active
+
+ # Row height
+ ws.row_dimensions[1].height = 102
+ for i in range(2, 2000 + 1):
+ ws.row_dimensions[i].height = 42
+
+ # Col width
+ ws.column_dimensions['A'].width = 1.5
+
+ ws.column_dimensions['B'].width = 25.0
+
+ for i in range(ord('C'), ord('L')):
+ ws.column_dimensions[chr(i)].width = 15.0
+
+ # Font
+ name_font = Font(name='Constantia', size=15, bold=True)
+ title_font = Font(name='宋体', size=15, bold=True)
+ data_font = Font(name='Franklin Gothic Book', size=11)
+
+ table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
+ f_border = Border(left=Side(border_style='medium', color='00000000'),
+ right=Side(border_style='medium', color='00000000'),
+ bottom=Side(border_style='medium', color='00000000'),
+ top=Side(border_style='medium', color='00000000')
+ )
+ b_border = Border(
+ bottom=Side(border_style='medium', color='00000000'),
+ )
+
+ b_c_alignment = Alignment(vertical='bottom',
+ horizontal='center',
+ text_rotation=0,
+ wrap_text=True,
+ shrink_to_fit=False,
+ indent=0)
+ c_c_alignment = Alignment(vertical='center',
+ horizontal='center',
+ text_rotation=0,
+ wrap_text=True,
+ shrink_to_fit=False,
+ indent=0)
+ b_r_alignment = Alignment(vertical='bottom',
+ horizontal='right',
+ text_rotation=0,
+ wrap_text=True,
+ shrink_to_fit=False,
+ indent=0)
+ c_r_alignment = Alignment(vertical='bottom',
+ horizontal='center',
+ text_rotation=0,
+ wrap_text=True,
+ shrink_to_fit=False,
+ indent=0)
+
+ # Img
+ img = Image("excelexporters/myems.png")
+ img.width = img.width * 0.85
+ img.height = img.height * 0.85
+ # img = Image("myems.png")
+ ws.add_image(img, 'B1')
+
+ # Title
+ ws.row_dimensions[3].height = 60
+
+ ws['B3'].font = name_font
+ ws['B3'].alignment = b_r_alignment
+ ws['B3'] = 'Name:'
+ ws['C3'].border = b_border
+ ws['C3'].alignment = b_c_alignment
+ ws['C3'].font = name_font
+ ws['C3'] = name
+
+ ws['D3'].font = name_font
+ ws['D3'].alignment = b_r_alignment
+ ws['D3'] = 'Period:'
+ ws['E3'].border = b_border
+ ws['E3'].alignment = b_c_alignment
+ ws['E3'].font = name_font
+ ws['E3'] = period_type
+
+ ws['F3'].font = name_font
+ ws['F3'].alignment = b_r_alignment
+ ws['F3'] = 'Date:'
+ ws['G3'].alignment = b_c_alignment
+ ws['G3'].font = name_font
+ ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
+ ws['G3'].border = b_border
+ ws.merge_cells("G3:H3")
+
+ if "reporting_period" not in report.keys() or \
+ "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
+ filename = str(uuid.uuid4()) + '.xlsx'
+ wb.save(filename)
+
+ return filename
+
+ ##################################
+
+ current_row_number = 6
+
+ reporting_period_data = report['reporting_period']
+
+ has_names_data_flag = True
+
+ if "names" not in reporting_period_data.keys() or \
+ reporting_period_data['names'] is None or \
+ len(reporting_period_data['names']) == 0:
+ has_names_data_flag = False
+
+ if has_names_data_flag:
+ ws['B' + str(current_row_number)].font = title_font
+ ws['B' + str(current_row_number)] = name + ' 报告期节约'
+
+ current_row_number += 1
+
+ category = reporting_period_data['names']
+ ca_len = len(category)
+
+ ws.row_dimensions[current_row_number].height = 75
+ ws['B' + str(current_row_number)].fill = table_fill
+ ws['B' + str(current_row_number)].border = f_border
+
+ col = 'C'
+
+ for i in range(0, ca_len):
+ 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] + ")"
+
+ col = chr(ord(col) + 1)
+
+ 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)] = '吨标准煤 (基线-实际) (TCE)'
+
+ col = chr(ord(col) + 1)
+
+ 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)] = '吨二氧化碳排放 (基线-实际) (TCO2E)'
+
+ col = chr(ord(col) + 1)
+
+ current_row_number += 1
+
+ ws['B' + str(current_row_number)].font = title_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)] = '节约'
+
+ col = 'C'
+
+ for i in range(0, ca_len):
+ 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)] = round(reporting_period_data['subtotals_saving'][i], 2)
+
+ col = chr(ord(col) + 1)
+
+ 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)] = round(reporting_period_data['total_in_kgce_saving'] / 1000, 2)
+
+ col = chr(ord(col) + 1)
+
+ 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)] = round(reporting_period_data['total_in_kgco2e_saving'] / 1000, 2)
+
+ col = chr(ord(col) + 1)
+
+ current_row_number += 1
+
+ ws['B' + str(current_row_number)].font = title_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)] = '环比'
+
+ col = 'C'
+
+ for i in range(0, ca_len):
+ 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)] = str(
+ round(reporting_period_data['increment_rates_saving'][i] * 100, 2)) + '%' \
+ if reporting_period_data['increment_rates_saving'][i] is not None else '-'
+
+ col = chr(ord(col) + 1)
+
+ 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)] = str(
+ round(reporting_period_data['increment_rate_in_kgce_saving'] * 100, 2)) + '%' \
+ if reporting_period_data['increment_rate_in_kgce_saving'] is not None else '-'
+
+ col = chr(ord(col) + 1)
+
+ 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)] = str(
+ round(reporting_period_data['increment_rate_in_kgco2e_saving'] * 100, 2)) + '%' \
+ if reporting_period_data['increment_rate_in_kgco2e_saving'] is not None else '-'
+
+ col = chr(ord(col) + 1)
+
+ current_row_number += 2
+
+ ws['B' + str(current_row_number)].font = title_font
+ ws['B' + str(current_row_number)] = name + ' 吨标准煤(TCE)占比'
+
+ current_row_number += 1
+ table_start_row_number = current_row_number
+ chart_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)].border = f_border
+
+ ws['C' + str(current_row_number)].fill = table_fill
+ ws['C' + str(current_row_number)].font = name_font
+ ws['C' + str(current_row_number)].alignment = c_c_alignment
+ ws['C' + str(current_row_number)].border = f_border
+ ws['C' + str(current_row_number)] = '节约'
+
+ ws['D' + str(current_row_number)].fill = table_fill
+ ws['D' + str(current_row_number)].font = name_font
+ 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)] = '吨标准煤(TCE) 节约占比'
+
+ current_row_number += 1
+
+ subtotals_in_kgce_saving_sum = sum_list(reporting_period_data['subtotals_in_kgce_saving'])
+
+ for i in range(0, ca_len):
+ ws['B' + str(current_row_number)].font = title_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)] = reporting_period_data['names'][i]
+
+ ws['C' + str(current_row_number)].font = name_font
+ ws['C' + str(current_row_number)].alignment = c_c_alignment
+ ws['C' + str(current_row_number)].border = f_border
+ ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgce_saving'][i] / 1000, 3)
+
+ ws['D' + str(current_row_number)].font = name_font
+ 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)] = str(round(reporting_period_data['subtotals_in_kgce_saving'][i] /
+ subtotals_in_kgce_saving_sum * 100, 2)) + '%'\
+ if abs(subtotals_in_kgce_saving_sum) > 0 else '-'
+
+ current_row_number += 1
+
+ table_end_row_number = current_row_number - 1
+
+ if ca_len < 4:
+ current_row_number = current_row_number - ca_len + 4
+
+ current_row_number += 1
+
+ pie = PieChart()
+ pie.title = name + ' 吨标准煤(TCE)占比'
+ labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
+ pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number)
+ pie.add_data(pie_data, titles_from_data=True)
+ pie.set_categories(labels)
+ pie.height = 7.25
+ pie.width = 9
+ s1 = pie.series[0]
+ s1.dLbls = DataLabelList()
+ s1.dLbls.showCatName = False
+ s1.dLbls.showVal = True
+ s1.dLbls.showPercent = True
+ ws.add_chart(pie, 'E' + str(chart_start_row_number))
+
+ ws['B' + str(current_row_number)].font = title_font
+ ws['B' + str(current_row_number)] = name + ' 吨二氧化碳排放(TCO2E)占比'
+
+ current_row_number += 1
+ table_start_row_number = current_row_number
+ chart_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)].border = f_border
+
+ ws['C' + str(current_row_number)].fill = table_fill
+ ws['C' + str(current_row_number)].font = name_font
+ ws['C' + str(current_row_number)].alignment = c_c_alignment
+ ws['C' + str(current_row_number)].border = f_border
+ ws['C' + str(current_row_number)] = '节约'
+
+ ws['D' + str(current_row_number)].fill = table_fill
+ ws['D' + str(current_row_number)].font = name_font
+ 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)] = '吨二氧化碳排放(TCO2E) 节约占比'
+
+ current_row_number += 1
+
+ subtotals_in_kgco2e_saving_sum = sum_list(reporting_period_data['subtotals_in_kgco2e_saving'])
+
+ for i in range(0, ca_len):
+ ws['B' + str(current_row_number)].font = title_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)] = reporting_period_data['names'][i]
+
+ ws['C' + str(current_row_number)].font = name_font
+ ws['C' + str(current_row_number)].alignment = c_c_alignment
+ ws['C' + str(current_row_number)].border = f_border
+ ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals_in_kgco2e_saving'][i] / 1000, 3)
+
+ ws['D' + str(current_row_number)].font = name_font
+ 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)] = str(round(reporting_period_data['subtotals_in_kgco2e_saving'][i] /
+ subtotals_in_kgco2e_saving_sum * 100, 2)) + '%'\
+ if abs(subtotals_in_kgco2e_saving_sum) > 0 else '-'
+
+ current_row_number += 1
+
+ table_end_row_number = current_row_number - 1
+
+ if ca_len < 4:
+ current_row_number = current_row_number - ca_len + 4
+
+ current_row_number += 1
+
+ pie = PieChart()
+ pie.title = name + ' 吨二氧化碳排放(TCO2E)占比'
+ labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
+ pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number)
+ pie.add_data(pie_data, titles_from_data=True)
+ pie.set_categories(labels)
+ pie.height = 7.25
+ pie.width = 9
+ s1 = pie.series[0]
+ s1.dLbls = DataLabelList()
+ s1.dLbls.showCatName = False
+ s1.dLbls.showVal = True
+ s1.dLbls.showPercent = True
+ ws.add_chart(pie, 'E' + str(chart_start_row_number))
+
+ #############################################
+
+ has_values_saving_data = True
+ has_timestamps_data = True
+
+ if 'values_saving' not in reporting_period_data.keys() or \
+ reporting_period_data['values_saving'] is None or \
+ len(reporting_period_data['values_saving']) == 0:
+ has_values_saving_data = False
+
+ if 'timestamps' not in reporting_period_data.keys() or \
+ reporting_period_data['timestamps'] is None or \
+ len(reporting_period_data['timestamps']) == 0 or \
+ len(reporting_period_data['timestamps'][0]) == 0:
+ has_timestamps_data = False
+
+ if has_values_saving_data and has_timestamps_data:
+ ca_len = len(reporting_period_data['names'])
+ time = reporting_period_data['timestamps'][0]
+
+ ws['B' + str(current_row_number)].font = title_font
+ ws['B' + str(current_row_number)] = name + ' 详细数据'
+
+ current_row_number += 1
+
+ chart_start_row_number = current_row_number
+
+ current_row_number += ca_len * 6
+ 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 = title_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)] = '日期时间'
+
+ col = 'C'
+
+ for i in range(0, ca_len):
+ ws[col + str(current_row_number)].fill = table_fill
+ 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)].border = f_border
+ ws[col + str(current_row_number)] = \
+ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
+ col = chr(ord(col) + 1)
+
+ current_row_number += 1
+
+ for i in range(0, len(time)):
+ ws['B' + str(current_row_number)].font = title_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)] = time[i]
+
+ col = 'C'
+ for j in range(0, ca_len):
+ 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)].border = f_border
+ ws[col + str(current_row_number)] = round(reporting_period_data['values_saving'][j][i], 2) \
+ if reporting_period_data['values_saving'][j][i] is not None else 0.00
+ col = chr(ord(col) + 1)
+
+ current_row_number += 1
+
+ table_end_row_number = current_row_number - 1
+
+ ws['B' + str(current_row_number)].font = title_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)] = '小计'
+
+ col = 'C'
+
+ for i in range(0, ca_len):
+ 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)].border = f_border
+ ws[col + str(current_row_number)] = round(reporting_period_data['subtotals_saving'][i], 2)
+ col = chr(ord(col) + 1)
+
+ current_row_number += 2
+
+ format_time_width_number = 1.0
+ min_len_number = 1.0
+ min_width_number = 11.0 # format_time_width_number * min_len_number + 4 and min_width_number > 11.0
+
+ if period_type == 'hourly':
+ format_time_width_number = 4.0
+ min_len_number = 2
+ min_width_number = 12.0
+ elif period_type == 'daily':
+ format_time_width_number = 2.5
+ min_len_number = 4
+ min_width_number = 14.0
+ elif period_type == 'monthly':
+ format_time_width_number = 2.1
+ min_len_number = 4
+ min_width_number = 12.4
+ elif period_type == 'yearly':
+ format_time_width_number = 1.5
+ min_len_number = 5
+ min_width_number = 11.5
+
+ for i in range(0, ca_len):
+ line = LineChart()
+ line.title = '报告期节约 - ' + \
+ reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
+ 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.add_data(line_data, titles_from_data=True)
+ line.set_categories(labels)
+ line_data = line.series[0]
+ line_data.marker.symbol = "circle"
+ line_data.smooth = True
+ line.height = 8.25
+ line.width = format_time_width_number * len(time) if len(time) > min_len_number else min_width_number
+ if line.width > 24:
+ line.width = 24
+ line.x_axis.crosses = 'min'
+ line.dLbls = DataLabelList()
+ line.dLbls.dLblPos = 't'
+ line.dLbls.showVal = True
+ line.dLbls.showPercent = False
+ chart_col = 'B'
+ chart_cell = chart_col + str(chart_start_row_number)
+ chart_start_row_number += 6
+ ws.add_chart(line, chart_cell)
+
+ filename = str(uuid.uuid4()) + '.xlsx'
+ wb.save(filename)
+
+ return filename
+
+
+def sum_list(lists):
+ total = 0
+
+ for i in range(0, len(lists)):
+ total += lists[i]
+
+ return total
diff --git a/myems-api/reports/equipmentload.py b/myems-api/reports/equipmentload.py
index 09369776..2c61cf54 100644
--- a/myems-api/reports/equipmentload.py
+++ b/myems-api/reports/equipmentload.py
@@ -5,6 +5,7 @@ import config
from datetime import datetime, timedelta, timezone
from core import utilities
from decimal import Decimal
+import excelexporters.equipmentload
class Reporting:
@@ -516,4 +517,10 @@ class Reporting:
"values": parameters_data['values']
}
+ # export result to Excel file and then encode the file to base64 string
+ result['excel_bytes_base64'] = excelexporters.equipmentload.export(result,
+ equipment['name'],
+ reporting_start_datetime_local,
+ reporting_end_datetime_local,
+ period_type)
resp.body = json.dumps(result)
diff --git a/myems-api/reports/shopfloorsaving.py b/myems-api/reports/shopfloorsaving.py
index 2d27780e..1438f7d6 100644
--- a/myems-api/reports/shopfloorsaving.py
+++ b/myems-api/reports/shopfloorsaving.py
@@ -5,6 +5,7 @@ import config
from datetime import datetime, timedelta, timezone
from core import utilities
from decimal import Decimal
+import excelexporters.shopfloorsaving
class Reporting:
@@ -682,4 +683,10 @@ class Reporting:
"values": parameters_data['values']
}
+ result['excel_bytes_base64'] = excelexporters.shopfloorsaving.export(result,
+ shopfloor['name'],
+ reporting_start_datetime_local,
+ reporting_end_datetime_local,
+ period_type)
+
resp.body = json.dumps(result)
diff --git a/web/package.json b/web/package.json
index e788e57e..d195882f 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,6 +1,6 @@
{
"name": "myems",
- "version": "1.0.5",
+ "version": "1.0.7",
"private": true,
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^1.2.28",
diff --git a/web/src/components/MyEMS/dashboard/Dashboard.js b/web/src/components/MyEMS/dashboard/Dashboard.js
index 95c81b15..08b5f17b 100644
--- a/web/src/components/MyEMS/dashboard/Dashboard.js
+++ b/web/src/components/MyEMS/dashboard/Dashboard.js
@@ -40,17 +40,17 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
const [spaceCostLineChartLabels, setSpaceCostLineChartLabels] = useState([]);
const [spaceCostLineChartData, setSpaceCostLineChartData] = useState({});
const [spaceCostLineChartOptions, setSpaceCostLineChartOptions] = useState([]);
-
+
const [parameterLineChartLabels, setParameterLineChartLabels] = useState([]);
const [parameterLineChartData, setParameterLineChartData] = useState({});
const [parameterLineChartOptions, setParameterLineChartOptions] = useState([]);
-
+
const [detailedDataTableData, setDetailedDataTableData] = useState([]);
const [detailedDataTableColumns, setDetailedDataTableColumns] = useState([{dataField: 'startdatetime', text: t('Datetime'), sort: true}]);
-
+
const [childSpacesTableData, setChildSpacesTableData] = useState([]);
const [childSpacesTableColumns, setChildSpacesTableColumns] = useState([{dataField: 'name', text: t('Child Spaces'), sort: true }]);
-
+
useEffect(() => {
let is_logged_in = getCookieValue('is_logged_in');
@@ -71,14 +71,14 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
createCookie('token', token, 1000 * 60 * 60 * 8);
let isResponseOK = false;
- if (!fetchSuccess) {
+ if (!fetchSuccess) {
toast(
{t("Welcome to MyEMS")}!
{t("An Industry Leading Open Source Energy Management System")}
);
-
+
fetch(APIBaseURL + '/reports/dashboard?' +
'useruuid=' + user_uuid +
'&periodtype=' + periodType +
@@ -137,7 +137,7 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
timeOfUseItem['value'] = json['reporting_period_input']['toppeaks'][index];
timeOfUseItem['color'] = "#"+((1<<24)*Math.random()|0).toString(16);
timeOfUseArray.push(timeOfUseItem);
-
+
timeOfUseItem = {}
timeOfUseItem['id'] = 2;
timeOfUseItem['name'] = t('On-Peak');
@@ -161,7 +161,7 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
}
});
setTimeOfUseShareData(timeOfUseArray);
- let totalInTCE = {};
+ let totalInTCE = {};
totalInTCE['value'] = json['reporting_period_input']['total_in_kgce'] / 1000; // convert from kg to t
totalInTCE['increment_rate'] = parseFloat(json['reporting_period_input']['increment_rate_in_kgce'] * 100).toFixed(2) + "%";
totalInTCE['value_per_unit_area'] = json['reporting_period_input']['total_in_kgce_per_unit_area'] / 1000; // convert from kg to t
@@ -178,7 +178,7 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
});
setCostShareData(costDataArray);
- let totalInTCO2E = {};
+ let totalInTCO2E = {};
totalInTCO2E['value'] = json['reporting_period_input']['total_in_kgco2e'] / 1000; // convert from kg to t
totalInTCO2E['increment_rate'] = parseFloat(json['reporting_period_input']['increment_rate_in_kgco2e'] * 100).toFixed(2) + "%";
totalInTCO2E['value_per_unit_area'] = json['reporting_period_input']['total_in_kgco2e_per_unit_area'] / 1000; // convert from kg to t
@@ -211,13 +211,13 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
timestamps['a' + index] = currentValue;
});
setSpaceInputLineChartLabels(timestamps);
-
+
let values = {}
json['reporting_period_input']['values'].forEach((currentValue, index) => {
values['a' + index] = currentValue;
});
setSpaceInputLineChartData(values);
-
+
let names = Array();
json['reporting_period_input']['names'].forEach((currentValue, index) => {
let unit = json['reporting_period_input']['units'][index];
@@ -230,13 +230,13 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
timestamps['a' + index] = currentValue;
});
setSpaceCostLineChartLabels(timestamps);
-
+
values = {}
json['reporting_period_cost']['values'].forEach((currentValue, index) => {
values['a' + index] = currentValue;
});
setSpaceCostLineChartData(values);
-
+
names = Array();
json['reporting_period_cost']['names'].forEach((currentValue, index) => {
let unit = json['reporting_period_cost']['units'][index];
@@ -255,17 +255,17 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
values['a' + index] = currentValue;
});
setParameterLineChartData(values);
-
+
names = Array();
json['parameters']['names'].forEach((currentValue, index) => {
if (currentValue.startsWith('TARIFF-')) {
currentValue = t('Tariff') + currentValue.replace('TARIFF-', '-');
}
-
+
names.push({ 'value': 'a' + index, 'label': currentValue });
});
setParameterLineChartOptions(names);
-
+
let detailed_value_list = [];
if (json['reporting_period_input']['timestamps'].length > 0 ) {
json['reporting_period_input']['timestamps'][0].forEach((currentTimestamp, timestampIndex) => {
@@ -287,7 +287,7 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
});
detailed_value_list.push(detailed_value);
setDetailedDataTableData(detailed_value_list);
-
+
let detailed_column_list = [];
detailed_column_list.push({
dataField: 'startdatetime',
@@ -350,7 +350,7 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
};
}, );
-
+
return (
@@ -359,39 +359,39 @@ const Dashboard = ({ setRedirect, setRedirectUrl, t }) => {
- {cardSummaryItem['subtotal'] && }
+ {cardSummaryItem['subtotal'] && }
))}
{costCardSummaryList.map(cardSummaryItem => (
- {cardSummaryItem['subtotal'] && }
+ {cardSummaryItem['subtotal'] && }
))}
-
{totalInTCE['value'] && }
-
{totalInTCO2E['value'] && }
diff --git a/web/src/config.js b/web/src/config.js
index 065bd6c3..7105d065 100644
--- a/web/src/config.js
+++ b/web/src/config.js
@@ -1,4 +1,4 @@
-export const version = '1.0.5';
+export const version = '1.0.7';
export const navbarBreakPoint = 'xl'; // Vertical navbar breakpoint
export const topNavbarBreakpoint = 'lg';
export const APIBaseURL = 'http://127.0.0.1:8000';